Compare commits

...
Author SHA1 Message Date
François-X. T. 72e528b33f Revert "Changelog"
This reverts commit 0c1c7e2fe8.
2026-03-24 16:36:42 -04:00
François-X. T. 0c1c7e2fe8 Changelog 2026-03-24 16:33:09 -04:00
François-X. T. cf16939519 Add Java 25, handle new version format 2026-03-24 16:28:37 -04:00
Modrinth BotandGitHub f9004dc2f6 New translations from Crowdin (main) (#5638) 2026-03-23 23:44:53 +00:00
Calum H.andGitHub cf7c77700a fix: bugs with changelog collect (#5648) 2026-03-23 20:39:40 +00:00
Calum H.andGitHub c09f7fd5e6 devex: changelog system (#5309)
* devex: changelog system

* feat: changelog CIs

* feat: web alias for platform + hosting

* feat: upload binaries to gh release

* feat: improve copy text

* fix: release workflow

* fix: changelog CIs + PR health check comment

* fix: action

* fix: comment style

* fix: comment

* fix: remove health

* fix: deploy use Modrinth bot machine account

* feat: new system

* fix: pr comment structure
2026-03-23 17:45:43 +00:00
Truman GaoandGitHub 67fd759d9b fix: add poster attribute to configuredXss (#5646) 2026-03-23 17:27:59 +00:00
Calum H.andGitHub a3eb981058 fix: env filters + properties (#5642)
* fix: env filters

* fix: server

* fix: lint

* fix: properties
2026-03-23 16:47:51 +00:00
Calum H.andGitHub 92eddbe832 feat: move switch version inline like update btn for content tab (#5631)
* fix: switch version inline same as update btn

* fix: lint
2026-03-21 18:06:03 +00:00
Calum H.andGitHub 9e6a6cd385 fix: withdraw flow bug (zero bal) (#5629) 2026-03-21 18:04:55 +00:00
aecsocketandGitHub 3c5bd0756d Index search by original and split title (#5589)
* Index search by original and split title

* better normalization of title/author names for indexing

* replace println with warn

* fix test
2026-03-20 04:01:19 +00:00
Calum H.andGitHub 00e81adbbd fix: reinstall soft_override: true (#5623) 2026-03-19 20:53:58 +00:00
Truman GaoandGitHub 2128fa7ade refactor: TabbedModal to use NewModal and DI (#5612)
* refactor: tabbed modal to use NewModal

* refactor: use DI for instance settings modal instead of passing down props

* pnpm prepr
2026-03-19 16:53:53 +00:00
Calum H.andGitHub 93c81631a9 fix: NaN cmp-info (#5619)
* fix: NaN cmp-info

* fix: ssr

* fix: lint
2026-03-19 15:26:15 +00:00
aecsocketandGitHub 3b604cfdc0 Get AutoMod to ignore .rpo files (#5616) 2026-03-19 00:16:30 +00:00
Truman GaoandGitHub 922b72d1a4 fix: new PAT not in list and cmp revenue (#5614)
* fix cmp info revenue not showing #5610

* fix use head referencing undefined

* fix new PAT not pushed to list and use new modal

* remove flex wrap in header nav
2026-03-19 00:06:35 +00:00
Calum H.andGitHub 1d10af09f5 fix: final content tab qa (#5611)
* fix: queued admonition always showing

* fix: dont apply grayscale to checkbox in content card item

* fix: actual stable id for disable/enable/bulk state

* fix: vue-router resolve workaround

* fix: show disable/enable btns same time

* fix: remove mr-2 on toggle

* fix: type errors + add ModpackAlreadyInstalledModal

* fix: bulk actions + overflow menu hitting ad container

* fix: responsiveness of ContentSelectionBar

* feat: better backup naming for inline backups + sorting fixes

* fix: lint

* fix: typo
2026-03-18 18:03:55 +00:00
xinyihlandGitHub cf1b5f5e2d Make settings page localizable (#5294)
* make settings localizable

* move plan names to common messages

* unknown -> plan-unknown

* prepr:frontend
2026-03-18 16:16:04 +00:00
Prospector 61754efca4 Fix changelog prerender issue 2026-03-17 19:26:40 -07:00
Prospector 235934abd7 changelog 2026-03-17 18:56:10 -07:00
ProspectorandGitHub 22d1b900f6 Fix environment tag missing from app (#5607) 2026-03-18 00:23:42 +00:00
Calum H.andGitHub 1cfbefff02 fix: various fixes related to content tab on app and panel (#5605)
* fix: content filtering client only

* fix: browse content bug

Fixes #5570

* fix: Applying Mods & Updates filters at the same time doesn't work

Fixes #5602

* fix: Browsing content: going back resets filters and installed state

Fixes #5598

* fix: Mod tile background flickers when toggling enabled/disabled state

Fixes #5600

* fix: Overhaul of "Content" tab on instances broke a lot
Fixes #5567

* fix: Latest App update replacing all mods icons with a datapack/rescourcepack
Fixes #5556

* fix: billing page api-client ditch useBaseFetch

* fix: remove org icon from project card items

* fix: lint
2026-03-17 21:49:46 +00:00
7852529915 Fix developer mode secret toggle not requiring the right amount of clicks (#5437)
* the world is right again

* Move increment to top of function

Signed-off-by: Prospector <6166773+Prospector@users.noreply.github.com>

---------

Signed-off-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-03-17 20:08:06 +00:00
c556624d0e Add GitHub Pages content in Markdown support (#5522)
* add `allowedHostnameSuffixes` with `.github.io` support

* apply `prettier`

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-03-17 20:07:25 +00:00
Calum H.andGitHub 87c86c7d0d refactor: remove useBaseFetch for @modrinth/api-client (#5596)
* Reapply "fix: start swapping useBaseFetch usages to api-client"

This reverts commit f4f33db701.

* fix: bugs

* fix: analytics

* fix: lint
2026-03-17 20:06:19 +00:00
JerozgenandGitHub 58c1e225c8 Sort filters and add translations for servers (#5493)
* Translate and sort server filters

* Set team_members to unknown[]

* Additional fixes after merge

* Additional translations

* Replace "IP" with "server address"

* Prioritize English and user language
2026-03-17 19:56:01 +00:00
Calum H.andGitHub 900a4df1b7 fix: error on admin billing (#5603) 2026-03-17 12:40:07 -07:00
Prospector 5b968a1486 update blog + changelog 2026-03-17 12:37:38 -07:00
ProspectorandGitHub 3a917631d5 Fix PATs page (#5599) 2026-03-17 12:37:28 -07:00
Calum H.andGitHub 63ea8230ba feat: content tab QA fixes for panel pre-release (#5588)
* feat: use new_filters + other qa fixes

* fix: double admons + lint
2026-03-17 17:47:58 +00:00
Truman GaoandGitHub 496bbae8a0 fix: server search (#5591)
* fix: server search regression

* fix badly passed props
2026-03-16 22:11:30 +00:00
1848ba3b29 fix: server-only project middleware (#5538)
* fix(navigation): use replaceState for project filters to prevent history pollution

* fix: add replace prop to NavTabs and enable it on project and discover pages

* style: run pnpm run fix on affected files

* enable NavTabs replace prop on collection, user, and org pages

* fix: guard project middleware on client

* fix: lint

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
2026-03-16 22:09:43 +00:00
681ae5d1d8 refactor: removing useAsyncData for tanstack query (#5262)
* refactor: most places with useAsyncData replaced with tanstack query

* refactor report list and report view

* refactor organization page to use tanstack query

* fix types

* refactor collection page and include proper loading state

* fix followed projects proper loading state

* fix 404 handling

* fix organization loading and 404 states

* pnpm prepr

* refactor: remove useAsyncData on newsletter button

* refactor: remove useAsyncData on auth globals fetch

* refactor: settings/billing/index.vue to useQuery instead of useAsyncData

* refactor: user page to remove useAsyncData

* pnpm prepr

* fix reports pages

* fix notifications page

* fix billing page cannot read properties of null and prop warnings

* fix refresh causing 404 by removing useBaseFetch and use api-client

* fix stale data after removing organization from project

* pnpm prepr

* fix news erroring in build

* fix: project page loads header only after content

* fix: user page tanstack problems (start on migrating away from useBaseFetch)

* fix: start swapping useBaseFetch usages to api-client

* Revert "fix: start swapping useBaseFetch usages to api-client"

This reverts commit 3df3fab11d.

* fix: remove debug logging

* fix: lint

---------

Co-authored-by: Calum H. <calum@modrinth.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-03-16 19:10:29 +00:00
Calum H.andGitHub d0c7575a23 feat: move notion docs to standards folder (#5590)
* feat: move notion docs to standards folder

* fix: remove skills mention (automatic now)
2026-03-16 17:30:05 +00:00
d9c7608ade fix: deeplink modal use new modal & DI stability (#5577)
* fix: deeplink

* feat: DI stability

* fix: lint

* fix: play server project deep link

* switch toggle icons

* pnpm prepr

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-03-16 17:10:55 +00:00
Truman GaoandGitHub 7d3935a38d fix: misc fixes (#5584)
* fix: PATs editing bug #4908

* fix: gallery edit do not do falsy check on title and description

* feat: add aspect ratio on gallery images

* change aspect ratio to 16:9

* fix: mobile nav bar #5580

* use css::after instead for navbar fix

* adjust after content to fix thin line

* add save area inset for transform
2026-03-16 15:32:07 +00:00
Truman GaoandGitHub a67f596524 feat: remove project editing has moved helper banner (#5583)
* feat: remove project editing moved helper banner

* pnpm prepr
2026-03-16 12:52:32 +00:00
Truman GaoandGitHub 7fa0a277c6 feat: handle geyser extension (#5582)
* feat: add geyser extension detection

* feat: only show geyser if inferred
2026-03-16 12:52:16 +00:00
Truman GaoandGitHub 01c9dee612 refactor: no more vue multiselect (#5523)
* start multiselect component

* update styles

* small fix

* fix padding and styles

* add border bottom on sticky items

* add border bottom to search as well

* fix select all showing line

* use multi-select component for languages field

* add no options story for empty state

* refactor: remove vue-multiselect, replace with either our own combobox and multiselect

* pnpm prepr

* pnpm prepr

* fix combobox in transfer organization
2026-03-16 12:46:48 +00:00
Modrinth BotandGitHub d50a8efb26 New translations from Crowdin (main) (#5585) 2026-03-16 09:20:59 +00:00
Calum H.andGitHub be5ebacd84 fix: switching vers fix (#5574) 2026-03-15 12:58:10 +00:00
Calum H.andGitHub 989f282de3 fixes: post content tab release issues (#5566)
* fix: migrate old cache entries for CachedFileUpdate

* feat: toggle goofy fix + switch version reimpl in app and panel

* fix: multimc detection

* fix: add tie breaker for sorting

* feat: toggle hover state

* fix: lint
2026-03-14 22:43:59 +00:00
Calum H.andGitHub 8a2125ef16 feat: backups alignment with Figma (#5559)
* feat: backup admonitions

* feat: align modals + fix backupitem

* fix: body needs opac 80

* fix: lint
2026-03-13 22:27:06 +00:00
aecsocketandGitHub 31b541007d Revert "Unify server pinging implementations between app and backend (#5510)" (#5558) 2026-03-13 13:58:57 -07:00
Calum H.andGitHub 4792985e52 fix: search v3 proj type frontend (#5557) 2026-03-13 20:34:26 +00:00
Calum H.andGitHub 86c0937616 fix: app problems post release qa (#5554)
* fix: app problems post release qa

* fix: lint

* fix: dont prefill

* fix: toggle gap

* feat: macs thing

* fix: lint
2026-03-13 13:18:11 -07:00
Truman GaoandGitHub 51deba8cd1 feat: multi-select component (#5486)
* start multiselect component

* update styles

* small fix

* fix padding and styles

* add border bottom on sticky items

* add border bottom to search as well

* fix select all showing line

* use multi-select component for languages field

* add no options story for empty state

* fix height
2026-03-13 18:59:37 +00:00
Truman GaoandGitHub b2d40af9cd feat: confirm transfer project/org modals (#5532)
* feat: implement confirm transfer project/org modals

* pnpm prepr

* update warning banner copy

* update warning banner again
2026-03-13 18:56:32 +00:00
Prospector fc382e957b add basic changelog 2026-03-13 12:20:52 -07:00
ProspectorandGitHub c9547bb988 Added content tab blog post (#5540)
* Added content tab blog post

* dont know why this change was in here

* update date
2026-03-13 12:18:16 -07:00
Prospector adef71b89a 0.12.2 changelog
(cherry picked from commit 4439c25b8d1d7894a81a25d8d67c9f9334a11273)
2026-03-13 12:12:28 -07:00
Calum H.andGitHub c44cc38b3a fix: backups resilience improvements (#5555)
* fix: backups

* fix: stability
2026-03-13 12:10:13 -07:00
aecsocketandGitHub 455a4f527d Add title stemming to typesense (#5553) 2026-03-13 17:03:54 +00:00
f918df2d7a feat(app): add more free official Java Edition skin packs as default skins (#5529)
Signed-off-by: Pendonym <265675176+Pendonym@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: Calum H. <calum@modrinth.com>
2026-03-13 17:00:12 +00:00
aecsocketandGitHub c8279481f8 Revert last canary flag PR and use a better method (#5535)
* Revert "Implement Labrinth Canary API flag (#5531)"

This reverts commit 3b21944a75.

* Use Labrinth-Canary header instead of cookie for API canary

* prepr

* fix rebase
2026-03-13 16:29:08 +00:00
aecsocketandGitHub d14360aba5 Unify server pinging implementations between app and backend (#5510)
* Improve ping impl to bring parity to app lib impl

* Fix issue with new impl

* fix labrinth compile

* wip: why do servers not provide server info..

* Fix ping impl overriding port

* fix theseus_gui

* remove unneeded recursion lmit
2026-03-13 16:21:09 +00:00
aecsocketandGitHub 991b4d8c13 Fix Typesense tests (#5541)
* Fix Typesense tests

* fix

* add back author

* Split project title and authors by words and index on that

* clippy
2026-03-13 13:34:51 +00:00
Truman GaoandGitHub cc9059fb4a fix: search pagination (#5548) 2026-03-12 23:27:09 -07:00
Calum H.andGitHub 32d76b8025 fix: lint (#5544) 2026-03-13 00:09:26 +01:00
Calum H.andGitHub ba06c89a0e fix: content tab fixes (#5543)
* fix: search again

* fix: navigation bug

* fix: switch to stable key for toggle disable

* feat: inline backup slow warning icon

* fix: qa

* feat: fix installation state
2026-03-12 23:52:55 +01:00
Prospector 52d46b8aaa App 0.12.0 changelog 2026-03-12 13:59:19 -07:00
Truman GaoandGitHub bdc204eebd fix: misc server projects fixes (#5537)
* fix: add server to instance modal opens slow

* fix: creators section org doesnt display for project pages in app

* feat: separate modpacks and servers tabs in instances library
2026-03-12 13:26:14 -07:00
7d92e4ec7f feat: content tab rewrite for worlds (#5136)
* feat: base content card component

* fix: tooltips + colors

* feat: fix orgs

* feat: base content tab internals rewrite

* feat: fix invalidmodal

* feat: add ContentModpackCard

* fix: extract types

* draft: layout

* feat: unlink modal

* feat: impl content tab

* fix: lint

* fix: toggling

* temp: disable updating stuff

* feat: selection v-model

* feat: bulk selection

* feat: mods tab rough draft

* feat: use fuse.js

* feat: add project combobox

* clean up project combobox

* feat: start install to play modal

* fix: events

* feat: use v-on

* feat: bulk actions + fix floating action bar width

* feat: figma alignments

* feat: migrate toggle to tailwind

* fix: row borders

* feat: disabled state

* feat: virtual list impl for card table based on window scroll

* fix: lint

* feat: virtualization + smaller contentcard items

* feat: use ContentCardTable + ContentCardItems

* feat: fix gap + border issues on last elm

* feat: cleanup + use proper searching

* fix: use TeleportOverflowMenu

* fix: fallback to svg if src is invalid on avatar component

* fix: storybook

* feat: start on updater modal

* feat: finish content updater modal

* feat: i18n pass

* feat: impl modal

* feat(app): backend changes for content tab refactor (#5237)

* feat: include_changelog=false for updater modal

* fix: hash overrides

* feat: update checking for modpack

* feat: qa

* feat: modpack content modal

* fix: padding in table to match modals + tightness

* fix: lint

* feat: delete modal

* feat: fix toggle bugs

* fix: prepr

* fix: duplicate messages

* qa: full width search

* qa: use bg-surface-1.5

* qa: animation for filter pills

* qa: standardize hover colors

* fix: border-[1px] is border

* qa: mass de-select actually mass selecting

* qa: match figma designs for floating action bar

* qa: modal fixes

* q: modal fixes x2

* fix: table border

* qa: confirm modals

* qa: modal alignment

* qa: re-add stuck heading + dedupe logic

* qa: dedupe virtual scrolling + remove dead components

* qa: responsiveness for content table + link fixes

* qa: version column link, tooltips + lint fixes

* qa: instance busy protections

* fix: installation freeze bug

* chore: remove old mods page

* refactor: deduplicate layout

* chore: delete old content page(s)

* qa

* qa

* qa

* feat: sort btn - to iterate

* fix: ml

* feat: date added

* fix: lint

* fix: formatting.ts removal

* feat: get_dependencies_as_content_items

* qa: final QA changes

* refactor: deduplicate + polish content.rs

* feat: hook up content.vue with v1

* feat: hide v1 content api behind frontend feature flag

* fix: query keys + copy on empty state

* chore: i18n pass

* feat: reimpl unlink + upload endpoint

* feat: use bulk endpoints v1

* fix: lint

* fix: flags

* fix: responsiveness via container queries

* fix: lint

* qa: 1

* qa: fixes

* qa: fix ssr issues with browse content

* qa: header page divider

* qa: modals

* fix: prepr

* fix: issues

* fix: lint

* fix: toggle v1 ff

* qa: 5

* qa: delete modal copy

* feat: creation flow modals (#5383)

* refactor: delete content v0 usages + impl

* feat: qa + fixes

* feat: installing banner using state event

* feat: fix modpack card bugs + filtering issues

* refactor: delete backups v0 api module

* feat: v1 servers GET endpoint

* fix: backups

* feat: swap to kyros upload v1 addon

* fix: use tanstack for loader.vue

* feat: finish install from discovery modal

* qa: bug fixes

* feat: set up installation settings

* fix: lint

* fix: typos

* fix: bugs

* fix: disable inline content

* feat: content tab improvements — upload UX, installation settings, and client-only indicators

   Upload cancellation and navigation guard:
   - Add ConfirmLeaveModal that prompts when navigating away during upload
   - Cancel in-flight XHR uploads when user confirms leaving the page
   - Add beforeunload handler to warn on browser/tab close during upload
   - Track uploadedBytes/totalBytes in UploadState for progress display
   - Replace Collapsible with Transition for upload progress admonition
   - Show byte progress and percentage in upload banner
   - Clamp upload progress to prevent exceeding 100%

   Installation settings (server.properties):
   - Add KnownPropertiesFields and PropertiesFields types to Archon types
   - Add buildProperties() to creation flow context to collect gamemode,
     difficulty, seed, world type, structures, and generator settings
   - Pass properties through installContent on onboarding, discovery, and
     ServerSetupModal flows

   Server setup and discovery flow improvements:
   - Migrate ServerSetupModal from servers_v0.reinstall to content_v1.installContent
   - Replace loaderApiNames lookup with toApiLoader() helper
   - Remove eraseDataOnInstall toggle — always use soft_override: false
   - Simplify modpack install on discovery page to use first available version
     and route through creation flow modal for both onboarding and non-onboarding
   - Differentiate post-install navigation: content page for onboarding,
     loader options for existing servers

   Modpack update flow:
   - Replace updateModpack() call with installContent() using soft_override: true
     to support version selection in the content updater modal

   Client-only mod indicators:
   - Add environment field to AddonVersion (reuses Labrinth.Projects.v3.Environment)
   - Add environment to ContentItem and isClientOnly to ContentCardTableItem
   - Show orange TriangleAlertIcon with tooltip on client-only mods in content table
   - Add "Client-only" filter pill to content filtering (controlled via
     showClientOnlyFilter on ContentManagerContext)
   - Apply client-only indicators in both ContentPageLayout and ModpackContentModal

   Misc:
   - Add CLAUDE.md note about using prepr commands for lint checks
   - Export ConfirmLeaveModal from instances barrel

* fix: piping

* fix: switch content disable for linked server instances

* feat: client only filter

* fix: prepr

* feat: hasUpdate shape update

* feat: bulk update endpoint impl for content in panel

* feat: websocket state impl again with new phases

* fix: ws

* fix: use timeout fn for sync admon + fix content card layout scroll for browsers with overflow anchor bug

* fix: qa bugs

* fix: lint, a11y and i18n

* refactor: set up layouts folder properly

* fix: linked data cache stuff + lint

* feat: move installationsettings to shared layout

* fix: lint

* fix: issues

* feat: temp fuck staging up

* fix: lockfile

* fix: data sync issues on loader.vue

* fix: lint

* Hide shader configuration files from content list (#5499)

* feat: workaround search problem + split out reset

* fix: qa

* fix: changelog not showing on first open

* fix: qa + optimistic updating improvements

* fix: prepr+lint

* fix: qa

* feat: qa

* fix: lint

* fix: lint

* fix: build

* fix: build

* fix: type errors

* fix: fade and JAVA_HOME passthrough

* feat: qa

* feat: impl diff shit

* fix: qa

* fix: app qa

* feat: update diff modal

* fix: endpoint

* fix: qa

* fix: qa

* fix: use bulk in modpack modal

* feat: abort signal impl + fix issues

* fix: diff modal trunc

* feat: qa

* fix: qa

* feat: tooltip content tab

* fix: prepr

* fix: dismiss on settings btn

* feat: qa

* feat: dont clear handlers on disconnect

* fix: lint

* fix: wrangler + introduce staging-archon env file

---------

Signed-off-by: Calum H. <calum@modrinth.com>
Co-authored-by: tdgao <mr.trumgao@gmail.com>
Co-authored-by: Artyom Ezri <61311568+Artezon@users.noreply.github.com>
2026-03-12 13:24:32 -07:00
aecsocketandGitHub f0224dfff7 Search backend refactor with typesense impl (#5528)
* initial elasticsearch impl

* working elastic cluster

* replace SearchError with ApiError for preparation of search backend

* start factoring meili out to trait

* move meili to backend

* update routes to use search backend trait

* wip

* Update projects.rs

* search backend is only init'd once in config

* wip

* wip: backend agnostic

* change search internal routes to delegate to backend

* initial elasticsearch impl

* fix filtering

* elastic impl

* refactor indexing into its own module

* clean up elastic code

* fix ci

* fix tests

* fix elastic health check

* fix up env rebase

* fix compile

* dummy commit to update github pr

* Fix rebase

* Elastic basic https auth

* Fix duplicate projects showing up

* Fix up tests

* Replace search `ApiErrors` with `eyre::Reports`, propagate background task errors

* clean up agents files

* make index chunk size configurable

* make `match_phrase` in elastic case-insensitive

* use current/next indices and swap between them

* test case for error body

* Fix failing case

* da merge

* factor out common stuff from search backends

* allow fetching hit metadata from search results

* allow customising elasticsearch search config

* bit of docs

* add mappings to indices for elastic

* Implement Typesense

* wip

* fix up some sort fields stuff

* use different approach to filterable field sets

* remove a bunch of search fields which weren't used for filtering

* bucket text matches

* Bucketing by text_match for typesense

* fix tombi lint

* fix some sentry errors and dont prioritise 2+ term matches

* tweak ts query settings

* expose some more search settings

* query sort changes

* small fixes

* should fix pagination stuff

* fix healthcheck maybe

* ragebait ci

* tests

* tests

* revert environment
2026-03-12 18:58:55 +01:00
aecsocketandGitHub 1c1683adb6 Fix various user/project deletion queries (#5511) 2026-03-12 12:46:39 +00:00
aecsocketandGitHub 407e6217f5 Fix permissions on project component edits (#5526) 2026-03-11 19:09:44 +00:00
Truman GaoandGitHub 83ea7f684b fix: permissions for server compatibility (#5525)
* disable buttons for server compatibility settings

* update permissions checkboxes
2026-03-11 18:45:06 +00:00
aecsocketandGitHub 3b21944a75 Implement Labrinth Canary API flag (#5531) 2026-03-11 15:28:09 +00:00
Emma F.andGitHub 086508be23 Replace admin/jai emails for security policy with support email (#5524) 2026-03-11 11:55:11 +00:00
coolbotandGitHub 8b04303eca Moderation: server languages and description stage tweaks (#5515)
* Description button tweaks

* server languages

* pretty
2026-03-10 22:08:15 +00:00
aecsocketandGitHub 2b8175ad66 Daedalus doesn't instantly fail when upstream loses versions (#5518)
* Daedalus doesn't instantly fail when upstream loses versions

* fix shear

* Revert DashMap changes for try_join_all
2026-03-10 18:59:47 +00:00
aecsocketandGitHub 0c98f6bf45 Update changelog for app 0.11.4 (#5519)
* Update changelog

* fix up
2026-03-10 16:59:41 +00:00
Truman GaoandGitHub 9a8712c76e fix: misc issues in app & website (#5512)
* fix: debug info copy button overflowing badly

* fix: updating instance's disabled mods re-enables them

* fix: modpack update enables previous disabled mods

* fix: add more languages #5508
2026-03-09 22:10:32 +00:00
f62c60a681 Impove Intl formatting (#5372)
* Improve Intl formatting

* Additional fixes

* Fixed formatters were not updated on locale change

* Fixed formatNumber was not updated on locale change

* Additional formatting and fixes after merge

* Run prepr:frontend

* Remove `'` in icon map

* Run `pnpm install`

* fix: lint + import

* Additional fixes

---------

Co-authored-by: Calum H. <calum@modrinth.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-03-09 21:29:32 +00:00
LynxandGitHub 9b2f0c88cd Update "Launch SFTP" button to a plain hyperlink (#5356)
* Update "Launch SFTP" button to use a hyperlink instead of a button

* fix: use computed ref to construct url
2026-03-09 20:35:46 +00:00
01b8ee6909 feat: fixed the collections page sorting logic and add URL persistence (#5375)
* "feat(collections): fix sorting logic and add URL persistence"

* fix(navigation): use replaceState for project filters to prevent history pollution

* Revert "fix(navigation): use replaceState for project filters to prevent history pollution"

This reverts commit 3924855faf.

* fix: lint + devin

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-03-09 20:12:44 +00:00
5a51a755eb feat: use router.replace for project filters to prevent history pollution (#5378)
* fix(navigation): use replaceState for project filters to prevent history pollution

* fix: add replace prop to NavTabs and enable it on project and discover pages

* style: run pnpm run fix on affected files

* enable NavTabs replace prop on collection, user, and org pages

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-03-09 20:09:44 +00:00
4cfac2c8a2 Various typo fixes and clearups (#5350)
* Various typo fixes and clearups

As reported on Crowdin.

* touch up wording on the environments

* lint

* roll back describes + lint

* fix extra "usd" in some languages in the hosting marketing page

* fix: lint + devin pass

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-03-09 19:53:39 +00:00
Calum H.andGitHub f6fcdd336f feat: implement image uploading for mdeditor in modrt. checklist (#5361)
* feat: implement image uploading for markdowneditor in checklist

* fix: lint
2026-03-09 19:32:44 +00:00
5594771ad8 Fix misc ui overflow issues (#5357)
Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-03-09 19:25:15 +00:00
ProspectorandGitHub 5d04992a28 Add server project follower count to details (#5502) 2026-03-09 19:22:40 +00:00
ProspectorandGitHub c9c8079853 Merge server project header into project header (#5500) 2026-03-09 19:19:55 +00:00
97051cc64d fix: email banner type warning (#5435)
* fix email banner type warning

* Update apps/frontend/src/layouts/default.vue

Signed-off-by: Calum H. <hendersoncal117@gmail.com>

---------

Signed-off-by: Calum H. <hendersoncal117@gmail.com>
Co-authored-by: Calum H. <hendersoncal117@gmail.com>
2026-03-09 19:19:27 +00:00
ProspectorandGitHub 0a04478149 small fix to spacing in server cards (#5501)
* small fix to spacing in server cards

* prepr
2026-03-09 19:18:10 +00:00
François-Xavier TalbotandGitHub 789ec8966c Add refresh button in files tab behind feature flag (#5431) 2026-03-09 19:16:01 +00:00
Modrinth BotandGitHub 51a83b4536 New translations from Crowdin (main) (#5417) 2026-03-09 19:15:11 +00:00
73abe272d1 Harden minecraft-server-play analytics (#5484)
* Harden minecraft-server-play analytics

* Verify based on mc token

* Fail for non-server projects

* Nitpicks and factor out HTTP client

* Allow passing old minecraft_uuid field for clients

* Remove server play analytics test since it relies on auth against Minecraft API which I don't want to mock :(

* Switch to using hasJoined for uuid validation

* Fix formatting

* Fix sessionserver status code

* Ensure profile name and queried username matches

* replace some wrap_request_errs with internal errs

* add HTTP client into web::Data

* short timeout on client-side session join query

* further fixes

* sqlx prepare

* fix clippy

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
Co-authored-by: aecsocket <aecsocket@tutanota.com>
2026-03-09 16:26:15 +00:00
aecsocketandGitHub 4a0c610fc5 Fix search sorting (#5509)
* Ensure newest published versions get sorted at the top

* fix issue with querying

* sort by correct fields depending on server/not server project

* sqlx prepare
2026-03-09 15:46:38 +00:00
JerozgenandGitHub 913dee9090 Improve language selector (#5487)
* Improve language selector

* Add Germany to German

* Run prepr:frontend

* Remove `'` in icon map

* Add Italy to Italian
2026-03-08 21:33:41 +00:00
Calum H.andGitHub 43eb53eda5 fix: posthog discrepancies linked server instances + other (#5504) 2026-03-08 21:30:30 +00:00
coolbotandGitHub c381adff85 fix moderation for projects with no type (#5503) 2026-03-08 20:25:56 +00:00
aecsocketandGitHub ace2659861 Server projects post launch fixes (#5481)
* Vendor async-minecraft-ping and fix servers returning protocol version -1

* Don't have automod reject server projects

* fmt

* Add region to search facets

* remove AMP .github
2026-03-08 00:17:38 +00:00
NitrrineandGitHub 507d03eeba fix: servers tab is breaking legacy navbar (#5496) 2026-03-07 14:52:29 +00:00
d4932d3089 Add UI module translations to Modrinth App (#5489)
* Add UI module translations to Modrinth App

* Replace `await` with `eager: true`

---------

Co-authored-by: Calum H. <calum@modrinth.com>
2026-03-07 10:13:24 +00:00
Prospector 4b6de7526c 0.11.3 changelog 2026-03-06 19:07:30 -08:00
Prospector b95e4ced22 moved app stuff to new changelog entry 2026-03-06 18:35:49 -08:00
Prospector 200b4f56c6 changelog 2026-03-06 18:34:20 -08:00
Truman GaoandGitHub 83d53dafe7 fix: servers misc fixes (#5475)
* fix: tags in project settings to have icons and ordered correctly

* fix copy in project list layout settings

* fix tag item in header navigation

* adjust ping ranges

* add handle click tag

* fix: dont show offline in project page for draft status

* move tags above creators in app

* preload server project page on load and optimize queries

* add server project card to organization page

* fix minecraft_java_server label

* pnpm prepr

* have user option in project create modal be circle

* feat: implement better mobile project page view

* disable summary line clamp for servers

* fix: unlink instance doesnt update instance

* increase icon upload size

* small fix on button size

* improve how server ping info loads

* remove unnecessary pings for instance page

* fix order of computing dependency diff

* remove linked_project_id from world, use name+address to match for managed world instead

* pnpm prepr

* hide duplicate worlds with same domain name in worlds list

* add install content warning for server instance

* increase summary max width

* add handling for server projects for bulk editing links

* implement include user unlisted projects in published modpack select

* pnpm prepr

* filter to only user unlisted status

* add bad link warnings

* fix modpack tags appearing in server

* cargo fmt
2026-03-07 02:11:45 +00:00
98175a58a6 Moderation improvements post server projects launch (#5485)
* identical links nag + use V3 more

* updater status alerts

* identity verification msg for servers

* private use msg for server projects

* fix newlines in some messages

* Tweak + add description messages

* tweak status alerts

* flinks for summary messages

* Rule 4 msgs for servers

* account for some jank

* fixes

* Project Type placeholder

* update locales

* add button for rejecting pay to play servers

* update country to region

* add lowercase option for project type placeholders

* update link of article to the published url

* prepr

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-03-07 01:58:28 +00:00
JerozgenandGitHub 20cbe1ad8f Set team_members to unknown[] (#5490) 2026-03-06 14:13:42 +00:00
NitrrineandGitHub 9d5d34fde8 feat: backport servers tab to legacy navbar (#5471)
* feat: backport servers tab to legacy navbar

* style: make gap between projects types tighter
2026-03-04 22:51:58 +00:00
Prospector 2d5c26896f fix blog date + app changelog 2026-03-04 14:41:52 -08:00
ea3bb334a8 Fix muralpay pix payouts in backend (#5463)
* Fix fields for pix payout

* Fix muralpay pix backend

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-03-04 13:10:31 +00:00
024e079a7d chore: the blog (#5453)
* feat: start on blogpost

* feat: images for post

* fix: grammar + prerender news + changelog

* feat: add discovery in app vid

* fix lint

* rename new blog md to match title

* fix assets directories

* remove left over compiled files

* update thumbnail

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-03-04 02:18:08 +01:00
aecsocketandGitHub d902b281f7 comment out impl (#5468) 2026-03-04 01:03:20 +01:00
Truman GaoandGitHub c4a0008708 fix: invalid args path (#5467)
* fix port in server address

* fix: invalid args for path

* fix page loading

* hide labels
2026-03-04 01:03:12 +01:00
Truman GaoandGitHub 835f80ee50 fix port in server address (#5466) 2026-03-04 00:20:52 +01:00
155f4091a6 Tweak search sorting (#5464)
* Tweak search sorting

* Tweak search sorting

* fix ping impl

* remove port field, add server regions

* fix compile

* fix tests

* update frontend banner upload size limit

* feat: use server project region instead of country

* remove java and bedrock port in frontend

* add helper text

* allow filtering by if server is online

* add server status online offline filter

* use region in instance

* pre-collapse status in app discovery

* pnpm prepr

* remove server discovery flag

* add servers into mobile nav tabs

* parse port from address if present

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-03-03 23:20:48 +01:00
Truman GaoandGitHub e1ee9c364b disable update modpack for server project (#5465) 2026-03-03 20:24:53 +00:00
0029a22569 fix: app cache and other issues (#5460)
* fixes

* #[serde(untagged)] my BEHATED (still kinda broken)

* remove unused hasContent ref

* clean up code in fetch instance

* ping 3 times for average latency

* fix: pinging to be more accurate

TCP_NODELAY — Set on the TCP stream right after connect, preventing Nagle's algorithm from buffering the small ping packet (could save up to ~40ms)

Instant over Utc::now() — Switched to monotonic std::time::Instant for timing, which is more precise and designed for measuring elapsed time (still using chrono just for the ping magic value)

* delete useFetch util and just use native fetch

* rename worlds until functions for more clarity

* fix lint

* fix cache.rs logic

* make backend ping use both impls

* Add optional timeout to server ping

* fix gallery appearing in nav with no items

* remove EU countries and add EU option for server country

* add uk to europe

---------

Co-authored-by: aecsocket <aecsocket@tutanota.com>
2026-03-03 18:41:12 +00:00
211ec20970 fix: remove tax compliance env var (#5445)
* fix: remove tax compliance env var

* improve tax compliance year logic

* bit more tests

---------

Co-authored-by: aecsocket <aecsocket@tutanota.com>
2026-03-03 17:45:28 +00:00
aecsocketandGitHub 34997bada5 Rescan tech review reports when a new version of Delphi is ran (#5433)
* Delphi rescan when version changes

* Fix inserting duplicate reports when rescanning

* upsert report issue details instead of deleting

* fix up rescan stuff
2026-03-03 17:44:30 +00:00
aecsocketandGitHub 63daac917b Fix Mural API response schema (#5454)
* Fix Mural API response schema

* Fix clippy

* fix compile

* fix compile
2026-03-03 17:17:44 +00:00
51ceb9d851 feat: linked server instances (#5221)
* ping queue with tests

* mc ping server info + timeout

* sqlx prepare

* tombi fmt

* tombi fmt

* allow querying server ping data

* fix shear

* wip: resolve comments with pings

* Switch to Redis for server pings

* tombi fmt

* fix compile error

* clear cache on project ping, add server store link

* Schema changes

* Improve server messages for app pinging

* synthetic server project version for search indexing

* wip: clean up server ping, background tasks

* fix migration to sync with main, propagate background task errors

* wip: server modpack content query, components in search

* wip: massive component query refactor

* fix more defaults stuff

* sqlx

* fix serde deser flatten

* fix search indexing not showing fields

* remove leftover prompt

* fix import

* add diff detection for version dependencies without version_id/project_id

* move servers tab to end

* hide app nav tabs if only one tab

* fix undefined property

* on click link for server side bar info

* show recommended & supported versions for vanilla

* fix how install.js installs instance with modpack content title instead of server project title and dont fetch icon when installing to existing instance

* use large play button instance

* show update success instead of launching right into the game

* add global installing server project state

* add comment

* small change: open discover to modpack

* implement ping server projects for latency in app

* add projectV3 to nag context for moderation package

* fix play server project button when instance is launched

* add ping to project header

* wip: server verified plays

* server verified plays compiling

* queue up server plays in batches

* report server plays improved in frontend

* fixes to tracking server joins

* fix: server project detection to do loose null check

* fix server projects showing license

* fix empty server info card

* fix server projects links title

* Fix backend impl for server player count analytics

* fix: allow for links to be set to empty

* hook up server recent plays

* cargo sqlx prepare

* add project sidebar stories

* feat: update project sidebar server info card to new design

* update server project header and project card

* feat: add hide label for project cards

* feat: add tags sidebar card

* small fix to keep color consistent

* fix: remove required content tab from server project page

* many small fixes

* handle locking server instance content

* fix hiding modal after saving server compatibility version

* copy content card item and table from content tab update branch

* fix nav tabs active tag

* fix switching between server instance vs regular instance persisted invalid state

* fix a lot of the bugginess of navtabs when theres hidden/shown tabs between instances. match frontend nav tabs

* hook up backend searchfor frontend in websiet

* fix: server project card tags

* hook up search v3 in app backend for app frontend

* Don't return missing components in project query

* Add game versions to server filters

* move reporting server joins to backend

* send account UUID along with server play analytics

* update java server ping schema

* feat: implement use server search for search sorting and filter facets

* pnpm prepr

* fix game version filter facet

* fix: allow java and bedrock addresses to be deleted

* feat: hook up languages

* Default deserialize `ProjectSerial`

* feat: show server project tags

* small fix on languages multi select

* also default java server content

* fix: update compatibility modal not closing after successful upload

* remove play button in website discovery for servers

* reenable fence in app backend

* update online/offline tag

* add online status indicator pulsing

* revert pulsing

* disable link for custom modpack project and show tooltip

* change modpack to modded type

* update ip address entire button to be clickable

* polish server info card styles

* make offline tag red and properly hook up online tag

* move server related settings into own tab

* fix setting project compatibility resets unsaved changes

* fix javaServerPatchaData wiping content field

* updates to compatibility card, add download button and display supported versions better

* fix unsaved changes popup for tags

* remove console.log

* fix incorrect project type in projects in dashboard

* fix: savable.ts to reset currentValues to data() after save

* upload server banner as gallery image with title == "__mc_server_banner__" and filter it from frontend gallery

* fix error handling and helper text copy

* ensure gallery banners are filtered in app backend gallery display

* add grouped filters for search

* add query params for server search

* feat: deep linking to open server project page then open install to play

* fix search in app frontend

* fix: server project showing offline

* fix: profile create error app backend

Here's what was happening and the fix:

Root cause: In create.rs:107, profile_create assumed the icon_path parameter was always a local filename relative to the caches directory. It did caches_dir().join(icon) which produced a path like ...\caches\https://staging-cdn.modrinth.com/... — the colons in https:// are illegal in Windows paths (OS error 123).

The frontend's installServerProject and createVanillaInstance in install.js:290 both pass project.icon_url (a full URL) directly as the icon parameter.

Fix: Modified profile_create to detect when the icon parameter is a URL (starts with http:// or https://). When it is, it downloads the icon via fetch(), extracts the filename from the URL path, and passes the downloaded bytes and filename to set_icon() which hashes and caches it properly. The existing local-file path continues to work as before.

* pass undefined instead of unknown for modpack content modal

* fix: wrong way to determine offline status

* delete required content page placeholder

* fix: redirect running function instead of passing function

* add in wiki page

* fix diffs which have unknown project/filename

* pnpm prepr

* feat: add handling for "stop" instance state for server project card and page play button

* fix updating modpack shouldn't launch right into game

* small fix on external icon

* fix refresh search causing infinite rerender i.e. maximum call stack size exceeded

watch(route) → watch(() => [route.query.i, route.query.ai, route.path]) (line 102): The deep watch on the entire Vue Router route object was the most likely cause of the stack overflow. Vue Router's route object contains matched records with component definitions and other deeply nested structures. Deep-watching it triggers recursive traversal on every route change (including those from router.replace() inside refreshSearch()). Now it only watches the specific properties that updateInstanceContext() actually needs.

ref → shallowRef for serverHits and serverPings (line 189-190): The v3 search results can be deeply nested objects (minecraft_java_server.ping.data, content, etc.). Using shallowRef prevents Vue from creating deep reactive proxies on these objects, which is consistent with how results already uses shallowRef on line 295.

Re-entrance guard + try/catch on refreshSearch() (line 310): The watcher calls refreshSearch() without awaiting, so state changes during the async execution could trigger the watcher again, causing concurrent calls. The guard prevents overlapping calls, and the try/catch ensures loading.value = false is always reached (fixing the infinite loading).

* don't require auth token for logging server play

* fetch latest server player count from redis instead of search doc

* remove components. in search facet

* Category and search sort fixes

* add logging for refreshSearch in browse.vue

* fix: use windows.history.replace instead of router.replace due to vue production bug and remove logs

* fix: server refresh search reactivity

* fix: type errors

* conquer the type errors in Browse.vue

* update search input background

* fix tags location

* slight change to color

* feat: add linked to modpack project for regular modpack instances

* feat: installation tab updates

* fix: copy ip missing hover effect

* feat: implement category and countries negative filters

* fix servers tab label in profile page

* implement add server to instance

* feat: implement allow editing server instances

* update installation settings to handle vanilla server instance case

* hide servers tab when installing content to instance

* add sorting for user installed content to be top of list in content

* update categories filters from one group filter card to separate filters cards

* add active scale

* fix offline server showing online

* update language display

* update tooltip

* hide navtabs if theres only one tab

* fix: modpack content name truncate in project card

* feat: add server projects to moderation queue

* update redirect middleware no longer needs projectV3

* update comment

* fix: server tags labels

* feat: add the mf icons finally

* Revert "update redirect middleware no longer needs projectV3"

This reverts commit 1289cb5286.

* fix open in browser

* revert any handling for handling base linked modpack content for content tab

* update instance online players to be client ping

* fix showing modpack/loader version for server instance in installation settings

* server projects are not marked as modpacks

* skip license check for server projects

* feat: add the concept of linked worlds for server instances and keep in sync with server project

* fix: router.push doesn't add history state, use nagivateTo instead

* fix: get server modpack content wrong link

* update some categories to default collapse

* small fixes

* optional languages & bedrock

* move creator below tags

* sort linked worlds to be first

* add red orange and green ping variants

* bring back content tab

* add download button in required content in app

* fix: server info card loading

* fix: brief flash of normal project before server project stuff loads in

* misc fixes

* invalidate project v3

* fix unused imports

* Quick pass for moderation related changes (#5429)

* filter certain nags out from server projects.

* move add-links nag to links.ts

* first few server related nags

* moderation checklist groundwork

* Prevent undefined stage from appearing on servers.

* add projectV3 to shouldShow callback

* Filter buttons by server project type

* fix, revert private use msg, adjust server & link nags

* starting tags + servers msg

* fix no projectV3

* fix: router.push doesn't add history state, use nagivateTo instead

* Tags nag works with servers now

* support servers' v3 exclusive links

* reupload, and status messages + nag tweaks.

* fixes

* Update tags.vue warning for server projects.

* don't suggest adding a bedrock IP

* Tweak phrasing on servers alert msg

---------

Signed-off-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
Co-authored-by: tdgao <mr.trumgao@gmail.com>
Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com>

* only show unique tags in project card

* add projectV3 to cache purge

* fix type: add projectV3 to cache purge

* update caching behaviour for installing

* max 3 plays per user

* accept date_modified and date_created for sorting

* add locking environment filter for server instance and update copy

* custom pack button only shows when needed (#5444)

* expose server pinging route to frontend

* feat: add server field validation with pinging on unfocus

* improve pinging logs

* try another pinging crate

* small fixes

* prefill published project id for updating published project

* fix running app bar for mac

* cargo sqlx prepare

* fix app login avatar

* pnpm prepr

* fix download menu for mac

* FIX CI

* fix lint errors

* cargo fmt

* fix toml

* fix more lint

* add server copy

* more lint

* fix any types

* also ping unlisted and private servers

* fix lint

* remove option for showTypeSelector

* fix cannot read user from undefined

* pnpm prepr

* update pinging to make it better

* update copy

* fix login cache issue

* add project select default icon

* fix: minecraft_java_server not redirecting

* pnpm prepr

* fix required content card in project page for custom modpack

* fix app project cards custom modpacks

* update pre-collapsed for app frontend

* don't send server projects to discord webhook

* add lock icon to linked world managed by server project

* pnpm prepr

* make automod msgs on server projects private

* fix pagination for server projects tab

* fix recent plays copy

* fix sync linked world with server project

* pnpm prepr

* add 0.11.0 changelog

* update date

---------

Signed-off-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
Co-authored-by: aecsocket <aecsocket@tutanota.com>
Co-authored-by: coolbot <76798835+coolbot100s@users.noreply.github.com>
2026-03-02 23:38:09 +00:00
Calum H.andGitHub 51066c476a devex: fix claude.md (#5439)
* feat: start on agents.md/claude.md

* feat: set up

* feat: api-client claude + skills

* feat: apps/frontend

* feat: skills list

* fix: lint issues
2026-02-27 17:21:35 +00:00
aecsocketandGitHub 47ef7ee42e When deleting a project, retain the thread's project ID (#5418) 2026-02-27 01:03:08 +00:00
XanderandGitHub 6fba33d443 Fix payouts notifications not delivering (#5430)
* fix FK violation when inserting rows into `notifications_deliveries`

* add test for FK violation when inserting into notifications_deliveries

* sqlx prepare

* add migration to prevent stale notifications from being dequeued all at once upon fix

* Revert "add migration to prevent stale notifications from being dequeued all at once upon fix"

This reverts commit 446f398752.
2026-02-26 19:42:25 +00:00
XanderandGitHub 017f6a5afb fix: session refresh works as intended now (#5330)
* fix: session refresh works as intended now

* use code-defined defaults for expires and session_expires

* fix sqlx

* database migration drop defaults

* run fmt

* remove comment in migration

Signed-off-by: Xander <xander@isxander.dev>

---------

Signed-off-by: Xander <xander@isxander.dev>
2026-02-26 17:33:09 +00:00
1ab722411a Ignore old migrations from prettier formatting (#5408)
* Ignore old migrations from prettier formatting

* Simplify ignore syntax

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-02-26 11:44:59 +00:00
45387e5fb6 Fix fields for pix payout (#5428)
Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-02-25 21:30:31 +00:00
e362de45fb Fix library routerview race condition (#5412)
Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-02-24 16:52:50 +00:00
Truman GaoandGitHub bacc10d2f5 feat: better auth error handling (#5403)
* add log

* add log

* Revert "add log"

This reverts commit 2412a3de5f.

* add new minecraft auth error modal

* add other auth errors

* polish the styles

* update link text

* add unknown error state

* pnpm prepr

* fix link

* fix lint
2026-02-21 01:39:27 +00:00
aecsocketandGitHub 5b49af1fe8 Fix creating projects from mod install flow (#5402)
* Explicitly state if a mod is incompatible when installing

* wip: debug create instance modal

* Fix mod install createInstance
2026-02-21 00:22:06 +00:00
f052ecd702 Batch of tech review backend fixes (#5398)
* Don't enter project into tech review if no new traces

* Send tech review exited message if files are deleted

* change PATCH /issue-detail/{id} to batch update details

* Fix sorting

* store delphi jar in backend

* show jar in tech review card

* improve jar display in frontend

* Fix live/in review label for tech review cards

* sqlx prepare

* polish: decode segments + code qual fix

* fix: skip first seg

* fix: only slice if needed

* Fix tech rev card styling

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-02-20 12:54:36 +00:00
Truman GaoandGitHub 33ff2a0759 fix: trying to get formatMessage with no current platform (#5397) 2026-02-19 17:40:53 +00:00
aecsocketandGitHub ec81bcb13c Improve environment variable handling and reading (#5389)
* wip: better env var reading

* move most env vars to env.rs

* migrate more env vars

* more migration

* more migrations

* More migration

* 🦀 dotenvy is gone (almost)

* 🦀 dotenvy is gone 🦀

* Fix mural source account env var handling

* Remove defaults from admin key vars

* dummy commit to update github pr

* fix ci
2026-02-19 17:33:41 +00:00
aecsocketandGitHub b6b4bc21f1 Cherry-pick migrations from server projects into main (#5395)
* Cherry-pick migrations from server projects into main

* Fix up project types and seed data

* fix tag test
2026-02-19 17:32:58 +00:00
9a83db2e67 fix: ensure NavTabs slider aligns correctly with dynamic tabs (#5377)
* fix(ui): ensure NavTabs slider aligns correctly with dynamic tabs

* fix: lint

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-02-19 16:57:17 +00:00
30c48718e2 fix: single loader projects download button not showing (#5391)
* fix: single loader projects downlaod button not showing

* pnpm prepr

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-02-18 19:45:28 +00:00
Calum H.andGitHub 8328a0d61a fix: gdpr issue posthog + type improvements (#5392) 2026-02-18 18:21:21 +00:00
Truman GaoandGitHub b62bc6f3b8 fix cannot read "body" from undefined (#5387) 2026-02-18 17:43:14 +00:00
Truman GaoandGitHub 0e752ab415 feat: handling mrpack with no loaders (#5363)
* handle modpack upload with no loaders

* restrict loaders for modpack

* actually, dont allow modpack loaders to be editable

* revert loader picker changes
2026-02-18 17:43:07 +00:00
aecsocketandGitHub 9f558404bd Improve error logging in project delete route (#5388)
* Improve error logging in project delete route

* remove_documents more error logging

* fix ci

* try fix ci? idk man
2026-02-18 05:06:50 +00:00
1176 changed files with 109931 additions and 32393 deletions
+18
View File
@@ -0,0 +1,18 @@
---
name: api-module
description: Add a new API endpoint module to packages/api-client from an OpenAPI schema. Use when adding new backend endpoints, creating API client modules, or when an openapi.yml is provided.
argument-hint: <path-to-openapi.yml>
---
Refer to the standard: @standards/frontend/ADDING_API_MODULES.md
## Steps
1. **Read the OpenAPI schema** at `$ARGUMENTS` — identify the endpoints, request/response shapes, and path parameters.
2. **Read the standard above** for naming conventions, type rules, and the module registration pattern.
3. **Determine the service and version** — the URL path prefix tells you which service directory and version namespace to use (e.g. `/v3/projects``labrinth/v3/`).
4. **Define types in `types.ts`** — types must match the API response 1:1. Use the OpenAPI schema as the source of truth. Do not reshape or rename fields.
5. **Create the module class** — extend `BaseModule`, implement each endpoint as a method. Use the correct HTTP verb and request options pattern from the standard.
6. **Register in `MODULE_REGISTRY`** — add the module entry so it's auto-instantiated on the client.
7. **Export types** from the service's barrel `index.ts`.
8. **Verify** — check that the module compiles and the types are accessible from `@modrinth/api-client`.
@@ -0,0 +1,25 @@
---
name: cross-platform-pages
description: Convert a page to the cross-platform page system so it works in both the website and the desktop app. Use when moving a page into packages/ui/src/layouts/, creating shared or wrapped layouts, or setting up DI contracts for platform abstraction.
argument-hint: <path-to-page>
---
Refer to the standards: @standards/frontend/CROSS_PLATFORM_PAGES.md and @standards/frontend/DEPENDENCY_INJECTION.md
## Steps
1. **Read the target page** at `$ARGUMENTS` and understand its data sources, mutations, and navigation.
2. **Read the standards above** to understand the shared vs wrapped distinction and the DI pattern.
3. **Decide the category:**
- **Wrapped** (`layouts/wrapped/`) — if the page uses the same API source on both platforms (e.g. web requests, not Tauri plugins). Just move the page component into `packages/ui` and import it from both frontends.
- **Shared** (`layouts/shared/`) — if the page has different data-fetching logic per platform (e.g. website uses `api-client`, app uses Tauri `invoke`). Requires a DI contract.
4. **For shared layouts:**
- Define a DI contract interface in `providers/` capturing all platform-specific operations.
- Create the layout component that injects the context and handles all UI logic.
- Extract reusable stateful logic (search, filtering, selection) into `composables/`.
- Implement the contract separately in each frontend (`apps/frontend/`, `apps/app-frontend/`).
5. **For wrapped pages:**
- Move the page component into `packages/ui/src/layouts/wrapped/` matching the route structure.
- Replace any platform-specific imports with shared utilities.
- Import and render the wrapped page from both frontends as a simple component.
6. **Verify** the page renders correctly by checking for missing imports and that all DI contracts are satisfied.
+22
View File
@@ -0,0 +1,22 @@
---
name: figma-mcp
description: Use the Figma MCP server to translate a Figma design into a Vue page or component layout. Use when the user provides a Figma URL, asks to implement a design, or wants to draft a page layout from Figma.
argument-hint: <figma-url>
---
Refer to the standard: @standards/frontend/FIGMA_MCP_USAGE.md
Also read @packages/ui/CLAUDE.md for color token mapping and component conventions.
## Steps
1. **Parse the Figma URL** from `$ARGUMENTS` — extract the `fileKey` and `nodeId`. Convert `-` to `:` in the node ID.
2. **Read the standards above** for the available tools, adaptation rules, and color usage.
3. **Call `get_design_context`** with the extracted `nodeId` and `fileKey`, using `clientLanguages: "typescript,html,css"` and `clientFrameworks: "vue"`. This is always the first tool to call.
5. **Adapt the output to the Modrinth codebase:**
- Map Figma color variables to `surface-*` / `text-*` tokens — never use Figma's aliased names directly.
- Check `packages/ui/src/components/` for existing components that match elements in the design (buttons, cards, modals, inputs, etc.).
- Check `packages/assets/styles/variables.scss` for tokens not exposed in Figma.
- Match spacing values exactly from the design.
6. **Use `get_screenshot`** if you need a closer visual reference of specific nodes.
7. **Use `get_variable_defs`** to verify which design tokens are applied to ambiguous elements.
8. **Build the component** as a Vue SFC using Tailwind classes and the project's existing component library.
+24
View File
@@ -0,0 +1,24 @@
---
name: i18n-pass
description: Perform an i18n localization pass on changed files or a pull request, converting hard-coded English strings to the @modrinth/ui i18n system. Use when internationalizing a set of changes, reviewing a PR for untranslated strings, or converting a specific component.
argument-hint: [file-path-or-pr-number]
---
Refer to the standard: @standards/frontend/INTERNATIONALIZATION.md
## Steps
1. **Identify the scope of changes:**
- If `$ARGUMENTS` is a PR number, run `gh pr diff $ARGUMENTS` to get the changed files.
- If `$ARGUMENTS` is a file path, use that directly.
- If no argument, check `git diff` for uncommitted changes.
2. **Read the standard above** for the message definition pattern, ICU format rules, and `IntlFormatted` usage.
3. **Filter to Vue SFCs** — only `.vue` files need i18n passes. Skip non-component files.
4. **For each file, scan for hard-coded strings:**
- `<template>`: inner text, `alt`, `placeholder`, `aria-label`, button labels, tooltip text.
- `<script>`: string literals passed to user-visible UI (notification messages, dropdown labels, error messages).
- Skip: dynamic expressions, HTML tag names, CSS classes, internal identifiers, log messages.
5. **Define messages** with `defineMessages` — use descriptive, stable `id`s based on the component's domain (e.g. `project.settings.title`).
6. **Replace strings in templates** with `formatMessage()` calls, or `<IntlFormatted>` for strings containing links or markup.
7. **Handle ICU edge cases** — add a space before `}}` if an ICU placeholder ends at a Vue template delimiter boundary.
8. **Verify** no hard-coded English strings remain in the changed templates. Do not alter logic, layout, or reactivity.
+27
View File
@@ -0,0 +1,27 @@
---
name: tanstack-query
description: Convert a page or component from useAsyncData/manual ref patterns to TanStack Query for server state management. Use when migrating data fetching to useQuery/useMutation, adding cache invalidation, or replacing useAsyncData with TanStack Query.
argument-hint: <path-to-file>
---
Refer to the standard: @standards/frontend/FETCHING_DATA.md
## Steps
1. **Read the target file** at `$ARGUMENTS` and identify all data-fetching patterns: `useAsyncData`, `useFetch`, manual `ref()` + `await`, or `onMounted` fetch calls.
2. **Read the standard above** for the query/mutation patterns, query key conventions, and optimistic update approach.
3. **Convert queries:**
- Replace `useAsyncData` / `useFetch` / manual fetches with `useQuery`.
- Use the `api-client` via `injectModrinthClient()` for the `queryFn`.
- Design query keys with the `['resource', 'version', ...params]` convention.
- Use `computed` query keys for reactive parameters.
- Use the `enabled` option for conditional queries that depend on other data.
4. **Convert mutations:**
- Replace manual `try/catch` + `ref` patterns with `useMutation`.
- Add `onSuccess` handlers that invalidate or update related query caches.
- Consider optimistic updates for UI-critical mutations (follow the pattern in the standard).
5. **Clean up:**
- Remove manual loading/error `ref()`s that are now handled by TanStack Query's return values (`isPending`, `isError`, `error`).
- Remove manual `onMounted` fetch calls.
- Ensure SSR compatibility — queries in Nuxt pages are automatically awaited during SSR.
6. **Verify** the page still renders correctly and that cache invalidation triggers re-fetches where expected.
+121
View File
@@ -0,0 +1,121 @@
name: Changelog Comment
on:
pull_request:
types: [opened, reopened]
workflow_dispatch:
inputs:
pr_number:
description: 'PR number to post the changelog comment on (for testing)'
required: true
type: number
jobs:
comment:
name: Post changelog comment
runs-on: ubuntu-latest
steps:
- name: 💬 Post or update changelog comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.CROWDIN_GH_TOKEN }}
script: |
const marker = '<!-- changelog -->';
const mergedMarker = '<!-- changelog-merged -->';
const sections = ['### Added', '', '### Changed', '', '### Deprecated', '', '### Removed', '', '### Fixed', '', '### Security'].join('\n');
const productBlock = (name) => `<details>\n<summary>${name}</summary>\n\n${sections}\n\n</details>`;
const template = [
marker,
'## Pull request changelog',
'',
'<!-- Fill in the changelog under each product area this PR affects.',
' Empty sections are ignored. Leave a product collapsed/empty',
' if it doesn\'t apply. -->',
'',
productBlock('App'),
'',
productBlock('Website'),
'',
productBlock('Hosting'),
].join('\n');
// Resolve PR number from event or workflow_dispatch input
const prNumber = context.payload.pull_request?.number
?? parseInt('${{ github.event.inputs.pr_number }}', 10);
if (!prNumber || isNaN(prNumber)) {
core.setFailed('Could not determine PR number');
return;
}
// Get PR details (need base ref for child PR detection)
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber,
});
// Check if bot comment already exists
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
const existingComment = comments.find(c => c.body.includes(marker));
if (existingComment) {
core.info('Changelog comment already exists, skipping');
return;
}
// Post the template comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
body: template,
});
core.info(`Posted changelog comment on PR #${prNumber}`);
// Detect child PR: check if this PR's base branch is another open PR's head branch
const baseRef = pr.base.ref;
if (baseRef === 'main' || baseRef === 'prod') {
return;
}
// Look for a parent PR whose head branch matches our base branch
const { data: candidatePRs } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
head: `${context.repo.owner}:${baseRef}`,
});
if (candidatePRs.length === 0) {
return;
}
const parentPR = candidatePRs[0];
core.info(`Detected parent PR #${parentPR.number} for child PR #${prNumber}`);
// Add admonition to child PR's changelog comment
const { data: childComments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
});
const childChangelogComment = childComments.find(c => c.body.includes(marker));
if (childChangelogComment && !childChangelogComment.body.includes(mergedMarker)) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: childChangelogComment.id,
body: `${mergedMarker}\n> [!NOTE]\n> This changelog has been merged into the changelog for #${parentPR.number}\n\n${childChangelogComment.body}`,
});
}
+2 -1
View File
@@ -50,14 +50,15 @@ jobs:
uses: peter-evans/find-comment@v3
id: fc
with:
token: ${{ secrets.CROWDIN_GH_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Frontend previews
- name: Comment deploy URL on PR
if: github.event_name == 'pull_request'
uses: peter-evans/create-or-update-comment@v5
with:
token: ${{ secrets.CROWDIN_GH_TOKEN }}
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.fc.outputs.comment-id }}
body: |
+11 -1
View File
@@ -21,6 +21,14 @@ on:
type: boolean
default: false
required: false
environment:
description: Environment
type: choice
options:
- prod
- staging
default: prod
required: false
jobs:
build:
@@ -94,12 +102,14 @@ jobs:
shell: bash
run: |
APP_VERSION="$(git describe --tags --always | sed -E 's/-([0-9]+)-(g[0-9a-fA-F]+)$/-canary+\1.\2/')"
BUILD_ENVIRONMENT="${{ inputs.environment || 'prod' }}"
echo "Setting application version to $APP_VERSION"
echo "Using environment $BUILD_ENVIRONMENT"
dasel put -f apps/app/Cargo.toml -t string -v "${APP_VERSION#v}" 'package.version'
dasel put -f packages/app-lib/Cargo.toml -t string -v "${APP_VERSION#v}" 'package.version'
dasel put -f apps/app-frontend/package.json -t string -v "${APP_VERSION#v}" 'version'
cp packages/app-lib/.env.prod packages/app-lib/.env
cp "packages/app-lib/.env.${BUILD_ENVIRONMENT}" packages/app-lib/.env
- name: Setup Turbo cache
uses: rharkor/caching-for-turbo@v1.8
+27 -17
View File
@@ -1,47 +1,43 @@
name: Modrinth App release
on:
workflow_dispatch:
inputs:
version-tag:
description: Version tag to release to the wide public
type: string
required: true
release-notes:
description: Release notes to include in the Tauri version manifest
default: A new release of the Modrinth App is available!
type: string
required: true
workflow_run:
workflows: ['Modrinth App build']
types: [completed]
jobs:
release:
name: Release Modrinth App
if: >-
github.event.workflow_run.conclusion == 'success' &&
startsWith(github.event.workflow_run.head_branch, 'v')
runs-on: ubuntu-latest
env:
VERSION_TAG: ${{ github.event.workflow_run.head_branch }}
LINUX_X64_BUNDLE_ARTIFACT_NAME: App bundle (x86_64-unknown-linux-gnu)
WINDOWS_X64_BUNDLE_ARTIFACT_NAME: App bundle (x86_64-pc-windows-msvc)
MACOS_UNIVERSAL_BUNDLE_ARTIFACT_NAME: App bundle (universal-apple-darwin)
LAUNCHER_FILES_BUCKET_BASE_URL: https://launcher-files.modrinth.com
steps:
- name: 📥 Check out code
uses: actions/checkout@v4
- name: 📥 Download Modrinth App artifacts
uses: dawidd6/action-download-artifact@v11
with:
workflow: theseus-build.yml
workflow_conclusion: success
event: push
branch: ${{ inputs.version-tag }}
branch: ${{ env.VERSION_TAG }}
use_unzip: true
- name: 🛠️ Generate version manifest
env:
VERSION_TAG: ${{ inputs.version-tag }}
RELEASE_NOTES: ${{ inputs.release-notes }}
run: |
# Reference: https://tauri.app/plugin/updater/#server-support
jq -nc \
--arg versionTag "${VERSION_TAG#v}" \
--arg releaseNotes "$RELEASE_NOTES" \
--arg releaseNotes "See the full changelog at https://modrinth.com/news/changelog" \
--rawfile macOsAarch64UpdateArtifactSignature "${MACOS_UNIVERSAL_BUNDLE_ARTIFACT_NAME}/universal-apple-darwin/release/bundle/macos/Modrinth App.app.tar.gz.sig" \
--rawfile macOsX64UpdateArtifactSignature "${MACOS_UNIVERSAL_BUNDLE_ARTIFACT_NAME}/universal-apple-darwin/release/bundle/macos/Modrinth App.app.tar.gz.sig" \
--rawfile linuxX64UpdateArtifactSignature "${LINUX_X64_BUNDLE_ARTIFACT_NAME}/release/bundle/appimage/Modrinth App_${VERSION_TAG#v}_amd64.AppImage.tar.gz.sig" \
@@ -83,7 +79,6 @@ jobs:
- name: 📤 Upload release artifacts
env:
VERSION_TAG: ${{ inputs.version-tag }}
AWS_ACCESS_KEY_ID: ${{ secrets.LAUNCHER_FILES_BUCKET_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.LAUNCHER_FILES_BUCKET_SECRET_ACCESS_KEY }}
AWS_BUCKET: ${{ secrets.LAUNCHER_FILES_BUCKET_NAME }}
@@ -116,3 +111,18 @@ jobs:
done
aws s3 cp updates.json "s3://${AWS_BUCKET}"
- name: 🏷️ Create GitHub release
env:
GH_TOKEN: ${{ github.token }}
run: |
VERSION="${VERSION_TAG#v}"
gh release create "$VERSION_TAG" \
--title "Modrinth App ${VERSION}" \
--notes "See the full changelog at https://modrinth.com/news/changelog" \
"${WINDOWS_X64_BUNDLE_ARTIFACT_NAME}/release/bundle/nsis/Modrinth App_${VERSION}_x64-setup.exe" \
"${MACOS_UNIVERSAL_BUNDLE_ARTIFACT_NAME}/universal-apple-darwin/release/bundle/dmg/Modrinth App_${VERSION}_universal.dmg" \
"${LINUX_X64_BUNDLE_ARTIFACT_NAME}/release/bundle/appimage/Modrinth App_${VERSION}_amd64.AppImage" \
"${LINUX_X64_BUNDLE_ARTIFACT_NAME}/release/bundle/deb/Modrinth App_${VERSION}_amd64.deb" \
"${LINUX_X64_BUNDLE_ARTIFACT_NAME}/release/bundle/rpm/Modrinth App-${VERSION}-1.x86_64.rpm"
+2 -1
View File
@@ -64,7 +64,8 @@ generated
app-playground-data/*
.astro
.claude
.claude/*
!.claude/skills/
.letta
# labrinth demo fixtures
+1
View File
@@ -0,0 +1 @@
See [CLAUDE.md](./CLAUDE.md) for all project instructions and guidelines.
+80 -34
View File
@@ -1,63 +1,109 @@
# Architecture
# Modrinth Monorepo
Use TAB instead of spaces.
This is the Modrinth monorepo — it contains all Modrinth projects, both frontend and backend. When entering a project, either to edit or analyse, you should read it's CLAUDE.md.
## Frontend
## Architecture
There are two similar frontends in the Modrinth monorepo, the website (apps/frontend) and the app frontend (apps/app-frontend).
- **Monorepo tooling:** [Turborepo](https://turbo.build/) (`turbo.jsonc`) + [pnpm workspaces](https://pnpm.io/workspaces) (`pnpm-workspace.yaml`)
- **Frontend:** Vue 3 / Nuxt 3, Tailwind CSS v3
- **Backend:** Rust (Labrinth API), Postgres, Clickhouse
- **Indentation:** Use TAB everywhere, never spaces
Both use Tailwind v3, and their respective configs can be seen at `tailwind.config.ts` and `tailwind.config.js` respectively.
### Apps (`apps/`)
Both utilize shared and common components from `@modrinth/ui` which can be found at `packages/ui`, and stylings from `@modrinth/assets` which can be found at `packages/assets`.
| App | Description |
| ----------------- | ------------------------------ |
| `frontend` | Main Modrinth website (Nuxt 3) |
| `app-frontend` | Desktop/app frontend (Vue 3) |
| `app` | Desktop/app shell (Tauri) |
| `app-playground` | Testing playground for app |
| `labrinth` | Backend API service |
| `daedalus_client` | Daedalus client implementation |
| `docs` | Documentation site (Astro) |
Both can utilize icons from `@modrinth/assets`, which are automatically generated based on what's available within the `icons` folder of the `packages/assets` directory. You can see the generated icons list in `generated-icons.ts`.
### Packages (`packages/`)
Both have access to our dependency injection framework, examples as seen in `packages/ui/src/providers/`. Ideally any state which is shared between a page and it's subpages should be shared using this dependency injection framework.
| Package | Description |
| ------------------ | ----------------------------------------------------- |
| `ui` | Shared Vue component library (`@modrinth/ui`) |
| `assets` | Styling and auto-generated icons (`@modrinth/assets`) |
| `api-client` | API client for Nuxt, Tauri, and Node/browser |
| `app-lib` | Shared app library |
| `blog` | Blog system and changelog data |
| `utils` | Shared utility functions (mostly deprecated) |
| `moderation` | Moderation utilities |
| `daedalus` | Daedalus protocol |
| `tooling-config` | ESLint, Prettier, TypeScript configs |
| `ariadne` | Analytics library |
| `modrinth-log` | Logging utilities |
| `modrinth-maxmind` | MaxMind GeoIP |
| `modrinth-util` | General utilities |
| `muralpay` | Payment processing |
| `path-util` | Path utilities |
| `sqlx-tracing` | SQLx query tracing |
### Website (apps/frontend)
## Pre-PR Commands
Before a pull request can be opened for the website, run `pnpm prepr:frontend:web` from the root folder, otherwise CI will fail.
Run these from the **root** folder before opening a pull request - do not run these after each prompt the user gives you, only run when asked, ask the user a question if they want to run it if the user indicates that they are about to create a pull request.
To run a development version of the frontend, you must first copy over the relevant `.env` template file (prod, staging or local, usually prod) within the `apps/frontend` folder into `apps/frontend/.env`. Then you can run the frontend by running `pnpm web:dev` in the root folder.
- **Website:** `pnpm prepr:frontend:web`
- **App frontend:** `pnpm prepr:frontend:app`
- **Frontend libs:** `pnpm prepr:frontend:lib`
- **All frontend (app+web):** `pnpm prepr`
- **Labrinth (backend):** See `apps/labrinth/CLAUDE.md`
### App Frontend (apps/app-frontend)
The website and app `prepr` commands
Before a pull request can be opened for the app frontend, run `pnpm prepr:frontend:app` from the root folder, otherwise CI will fail.
## Dev Commands
To run a development version of the app frontend, you must first copy over the relevant `.env` template file (prod, staging or local, usually prod) within `packages/app-lib` into `packages/app-lib/.env`. Then you must run the app itself by running `pnpm app:dev` in the root folder.
- **Website:** `pnpm web:dev` (copy `.env` template in `apps/frontend/` first)
- **App:** `pnpm app:dev` (copy `.env` template in `packages/app-lib/` first)
- **Storybook (packages/ui):** `pnpm storybook`
### Localization
## Project-Specific Instructions
Refer to `.github/instructions/i18n-convert.instructions.md` if the user asks you to perform any i18n conversion work on a component, set of components, pages or sets of pages.
Each project may have its own `CLAUDE.md` with detailed instructions:
## Labrinth
- [`apps/labrinth/CLAUDE.md`](apps/labrinth/CLAUDE.md) — Backend API
- [`apps/frontend/CLAUDE.md`](apps/frontend/CLAUDE.md) - Frontend Website
Labrinth is the backend API service for Modrinth.
## Code Guidelines
### Testing
### Comments
- DO NOT use "heading" comments like: `=== Helper methods ===`.
- Use doc comments, but avoid inline comments unless ABSOLUTELY necessary for clarity. Code should aim to be self documenting!
Before a pull request can be opened, run `cargo clippy -p labrinth --all-targets` and make sure there are ZERO warnings, otherwise CI will fail.
## Bash Guidelines
Use `cargo test -p labrinth --all-targets` to test your changes. All tests must pass, otherwise CI will fail.
### Output handling
- DO NOT pipe output through `head`, `tail`, `less`, or `more`
- NEVER use `| head -n X` or `| tail -n X` to truncate output
- IMPORTANT: Run commands directly without pipes when possible
- IMPORTANT: If you need to limit output, use command-specific flags (e.g. `git log -n 10` instead of `git log | head -10`)
- ALWAYS read the full output — never pipe through filters
To prepare the sqlx cache, cd into `apps/labrinth` and run `cargo sqlx prepare`. Make sure to NEVER run `cargo sqlx prepare --workspace`.
### General
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to
- For Frontend, when doing lint checks, only use the `prepr` commands, do not use `typecheck` or `tsc` etc.
- Types in `@modrinth/utils` are considered highly outdated, if a component needs them, check if you can switch said component to use types from `packages/api-client`
Read the root `docker-compose.yml` to see what running services are available while developing. Use `docker exec` to access these services.
## Edit Tool - Whitespace Handling (CLAUDE ONLY)
When the user refers to "performing pre-PR checks", do the following:
The Read tool uses `→` to mark where line numbers end and file content begins.
- Run clippy as described above
- DO NOT run tests unless explicitly requested (they take a long time)
- Prepare the sqlx cache
**Rule:** Copy the EXACT whitespace that appears after the `→` marker.
- Whatever appears between `→` and the code text is what's actually in the file
- That whitespace must be used EXACTLY in Edit tool's old_string
- Don't count arrows, don't interpret - just copy what's after the `→`
### Clickhouse
**Example:**
14→ private byte tag;
For Edit, use: ` private byte tag;` (copy everything after →, including the two tabs)
Use `docker exec labrinth-clickhouse clickhouse-client` to access the Clickhouse instance. We use the `staging_ariadne` database to store data in testing.
**If Edit fails:** Stop and explain the problem. Do not attempt sed/awk/bash workarounds.
### Postgres
**IMPORTANT**: Trust the Read tool output. Copy what's after `→` into Edit immediately. DO NOT verify with sed/od/grep first - that's wasting time and the instructions already tell you to stop if Edit fails, not to pre-verify.
Use `docker exec labrinth-postgres psql -U labrinth -d labrinth -c "SELECT 1"` to access the PostgreSQL instance, replacing the `SELECT 1` with your query.
## Standards
# Guidelines
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to.
Standards available at the @standards/ folder.
Generated
+363 -87
View File
@@ -378,6 +378,15 @@ dependencies = [
"libc",
]
[[package]]
name = "ansi_term"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
dependencies = [
"winapi",
]
[[package]]
name = "anstream"
version = "0.6.21"
@@ -640,6 +649,20 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "async-minecraft-ping"
version = "0.8.0"
dependencies = [
"anyhow",
"async-trait",
"hickory-resolver 0.24.4",
"serde",
"serde_json",
"structopt",
"thiserror 1.0.69",
"tokio",
]
[[package]]
name = "async-process"
version = "2.5.0"
@@ -851,6 +874,17 @@ dependencies = [
"webpki-roots 1.0.3",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi 0.1.19",
"libc",
"winapi",
]
[[package]]
name = "autocfg"
version = "1.5.0"
@@ -1568,6 +1602,21 @@ dependencies = [
"libloading 0.8.8",
]
[[package]]
name = "clap"
version = "2.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
dependencies = [
"ansi_term",
"atty",
"bitflags 1.3.2",
"strsim 0.8.0",
"textwrap",
"unicode-width 0.1.14",
"vec_map",
]
[[package]]
name = "clap"
version = "4.5.48"
@@ -1587,7 +1636,7 @@ dependencies = [
"anstream",
"anstyle",
"clap_lex",
"strsim",
"strsim 0.11.1",
]
[[package]]
@@ -2134,7 +2183,7 @@ dependencies = [
"futures",
"indexmap 2.11.4",
"itertools 0.14.0",
"reqwest",
"reqwest 0.12.24",
"rust-s3",
"serde",
"serde-xml-rs",
@@ -2167,6 +2216,16 @@ dependencies = [
"darling_macro 0.21.3",
]
[[package]]
name = "darling"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d"
dependencies = [
"darling_core 0.23.0",
"darling_macro 0.23.0",
]
[[package]]
name = "darling_core"
version = "0.20.11"
@@ -2177,7 +2236,7 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim",
"strsim 0.11.1",
"syn 2.0.106",
]
@@ -2191,7 +2250,20 @@ dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim",
"strsim 0.11.1",
"syn 2.0.106",
]
[[package]]
name = "darling_core"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0"
dependencies = [
"ident_case",
"proc-macro2",
"quote",
"strsim 0.11.1",
"syn 2.0.106",
]
@@ -2217,6 +2289,17 @@ dependencies = [
"syn 2.0.106",
]
[[package]]
name = "darling_macro"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d"
dependencies = [
"darling_core 0.23.0",
"quote",
"syn 2.0.106",
]
[[package]]
name = "dashmap"
version = "6.1.0"
@@ -2631,6 +2714,29 @@ dependencies = [
"serde",
]
[[package]]
name = "elasticsearch"
version = "9.1.0-alpha.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12bb303aa6e1d28c0c86b6fbfe484fd0fd3f512629aeed1ac4f6b85f81d9834a"
dependencies = [
"base64 0.22.1",
"bytes",
"dyn-clone",
"flate2",
"lazy_static",
"parking_lot",
"percent-encoding",
"reqwest 0.12.24",
"rustc_version",
"serde",
"serde_json",
"serde_with",
"tokio",
"url",
"void",
]
[[package]]
name = "elliptic-curve"
version = "0.13.8"
@@ -3717,6 +3823,15 @@ dependencies = [
"hashbrown 0.15.5",
]
[[package]]
name = "heck"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "heck"
version = "0.4.1"
@@ -3729,6 +3844,15 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
dependencies = [
"libc",
]
[[package]]
name = "hermit-abi"
version = "0.5.2"
@@ -3741,6 +3865,30 @@ version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "hickory-proto"
version = "0.24.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248"
dependencies = [
"async-trait",
"cfg-if",
"data-encoding",
"enum-as-inner",
"futures-channel",
"futures-io",
"futures-util",
"idna",
"ipnet",
"once_cell",
"rand 0.8.5",
"thiserror 1.0.69",
"tinyvec",
"tokio",
"tracing",
"url",
]
[[package]]
name = "hickory-proto"
version = "0.25.2"
@@ -3766,6 +3914,27 @@ dependencies = [
"url",
]
[[package]]
name = "hickory-resolver"
version = "0.24.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e"
dependencies = [
"cfg-if",
"futures-util",
"hickory-proto 0.24.4",
"ipconfig",
"lru-cache",
"once_cell",
"parking_lot",
"rand 0.8.5",
"resolv-conf",
"smallvec",
"thiserror 1.0.69",
"tokio",
"tracing",
]
[[package]]
name = "hickory-resolver"
version = "0.25.2"
@@ -3774,7 +3943,7 @@ checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a"
dependencies = [
"cfg-if",
"futures-util",
"hickory-proto",
"hickory-proto 0.25.2",
"ipconfig",
"moka",
"once_cell",
@@ -4124,9 +4293,9 @@ dependencies = [
[[package]]
name = "ico"
version = "0.4.0"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98"
checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371"
dependencies = [
"byteorder",
"png 0.17.16",
@@ -4355,7 +4524,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e96d2465363ed2d81857759fc864cf6bb7997f79327aec028d65bd7989393685"
dependencies = [
"ahash 0.8.12",
"clap",
"clap 4.5.48",
"crossbeam-channel",
"crossbeam-utils",
"dashmap",
@@ -4470,7 +4639,7 @@ version = "0.4.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [
"hermit-abi",
"hermit-abi 0.5.2",
"libc",
"windows-sys 0.59.0",
]
@@ -4607,9 +4776,9 @@ dependencies = [
[[package]]
name = "js-sys"
version = "0.3.81"
version = "0.3.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -4730,6 +4899,7 @@ dependencies = [
"arc-swap",
"argon2",
"ariadne",
"async-minecraft-ping",
"async-stripe",
"async-trait",
"base64 0.22.1",
@@ -4737,7 +4907,7 @@ dependencies = [
"bytes",
"censor",
"chrono",
"clap",
"clap 4.5.48",
"clickhouse",
"color-eyre",
"color-thief",
@@ -4748,9 +4918,11 @@ dependencies = [
"dotenv-build",
"dotenvy",
"either",
"elasticsearch",
"eyre",
"futures",
"futures-util",
"heck 0.5.0",
"hex",
"hmac",
"hyper-rustls 0.27.7",
@@ -4773,7 +4945,7 @@ dependencies = [
"rand_chacha 0.3.1",
"redis",
"regex",
"reqwest",
"reqwest 0.12.24",
"rust-s3",
"rust_decimal",
"rust_iso3166",
@@ -4811,6 +4983,16 @@ dependencies = [
"zxcvbn",
]
[[package]]
name = "labrinth-derive"
version = "0.0.0"
dependencies = [
"darling 0.23.0",
"proc-macro2",
"quote",
"syn 2.0.106",
]
[[package]]
name = "language-tags"
version = "0.3.2"
@@ -4974,6 +5156,12 @@ dependencies = [
"zlib-rs",
]
[[package]]
name = "linked-hash-map"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
version = "0.4.15"
@@ -5039,6 +5227,15 @@ dependencies = [
"imgref",
]
[[package]]
name = "lru-cache"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c"
dependencies = [
"linked-hash-map",
]
[[package]]
name = "lru-slab"
version = "0.1.2"
@@ -5197,7 +5394,7 @@ dependencies = [
"log",
"meilisearch-index-setting-macro",
"pin-project-lite",
"reqwest",
"reqwest 0.12.24",
"serde",
"serde_json",
"thiserror 2.0.17",
@@ -5300,13 +5497,13 @@ name = "modrinth-maxmind"
version = "0.0.0"
dependencies = [
"bytes",
"clap",
"clap 4.5.48",
"directories",
"eyre",
"flate2",
"maxminddb",
"modrinth-util",
"reqwest",
"reqwest 0.12.24",
"tar",
"tokio",
"tracing",
@@ -5385,7 +5582,7 @@ dependencies = [
"bytes",
"chrono",
"derive_more 2.0.1",
"reqwest",
"reqwest 0.12.24",
"rust_decimal",
"rust_iso3166",
"secrecy",
@@ -5708,7 +5905,7 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
"hermit-abi",
"hermit-abi 0.5.2",
"libc",
]
@@ -6139,7 +6336,7 @@ dependencies = [
"bytes",
"http 1.3.1",
"opentelemetry",
"reqwest",
"reqwest 0.12.24",
]
[[package]]
@@ -6154,7 +6351,7 @@ dependencies = [
"opentelemetry-proto",
"opentelemetry_sdk",
"prost 0.13.5",
"reqwest",
"reqwest 0.12.24",
"thiserror 2.0.17",
"tokio",
"tonic 0.13.1",
@@ -6716,7 +6913,7 @@ checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218"
dependencies = [
"cfg-if",
"concurrent-queue",
"hermit-abi",
"hermit-abi 0.5.2",
"pin-project-lite",
"rustix 1.1.2",
"windows-sys 0.61.2",
@@ -7595,11 +7792,45 @@ dependencies = [
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams",
"wasm-streams 0.4.2",
"web-sys",
"webpki-roots 1.0.3",
]
[[package]]
name = "reqwest"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801"
dependencies = [
"base64 0.22.1",
"bytes",
"futures-core",
"futures-util",
"http 1.3.1",
"http-body 1.0.1",
"http-body-util",
"hyper 1.7.0",
"hyper-util",
"js-sys",
"log",
"percent-encoding",
"pin-project-lite",
"serde",
"serde_json",
"sync_wrapper",
"tokio",
"tokio-util",
"tower",
"tower-http",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"wasm-streams 0.5.0",
"web-sys",
]
[[package]]
name = "resolv-conf"
version = "0.7.5"
@@ -7785,7 +8016,7 @@ dependencies = [
"minidom",
"percent-encoding",
"quick-xml 0.38.3",
"reqwest",
"reqwest 0.12.24",
"serde",
"serde_derive",
"serde_json",
@@ -8253,7 +8484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48b85e25e8a1fc13928885e8bf13abe8a09e15c46993aed05d6405f7755d6e20"
dependencies = [
"httpdate",
"reqwest",
"reqwest 0.12.24",
"rustls 0.23.32",
"sentry-backtrace",
"sentry-contexts",
@@ -9160,6 +9391,12 @@ dependencies = [
"unicode-properties",
]
[[package]]
name = "strsim"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "strsim"
version = "0.11.1"
@@ -9189,6 +9426,30 @@ dependencies = [
"syn 2.0.106",
]
[[package]]
name = "structopt"
version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10"
dependencies = [
"clap 2.34.0",
"lazy_static",
"structopt-derive",
]
[[package]]
name = "structopt-derive"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0"
dependencies = [
"heck 0.3.3",
"proc-macro-error",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "strum"
version = "0.27.2"
@@ -9334,9 +9595,9 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
[[package]]
name = "tao"
version = "0.34.3"
version = "0.34.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7"
checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7"
dependencies = [
"bitflags 2.9.4",
"block2 0.6.2",
@@ -9408,9 +9669,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
[[package]]
name = "tauri"
version = "2.8.5"
version = "2.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c"
checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129"
dependencies = [
"anyhow",
"bytes",
@@ -9437,7 +9698,7 @@ dependencies = [
"percent-encoding",
"plist",
"raw-window-handle",
"reqwest",
"reqwest 0.13.2",
"serde",
"serde_json",
"serde_repr",
@@ -9452,7 +9713,6 @@ dependencies = [
"tokio",
"tray-icon",
"url",
"urlpattern",
"webkit2gtk",
"webview2-com",
"window-vibrancy",
@@ -9461,9 +9721,9 @@ dependencies = [
[[package]]
name = "tauri-build"
version = "2.4.1"
version = "2.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f"
checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74"
dependencies = [
"anyhow",
"cargo_toml",
@@ -9485,9 +9745,9 @@ dependencies = [
[[package]]
name = "tauri-codegen"
version = "2.4.0"
version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a"
checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3"
dependencies = [
"base64 0.22.1",
"brotli",
@@ -9512,9 +9772,9 @@ dependencies = [
[[package]]
name = "tauri-macros"
version = "2.4.0"
version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e"
checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59"
dependencies = [
"heck 0.5.0",
"proc-macro2",
@@ -9526,9 +9786,9 @@ dependencies = [
[[package]]
name = "tauri-plugin"
version = "2.4.0"
version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9946a3cede302eac0c6eb6c6070ac47b1768e326092d32efbb91f21ed58d978f"
checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f"
dependencies = [
"anyhow",
"glob",
@@ -9582,9 +9842,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
version = "2.4.2"
version = "2.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7"
checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804"
dependencies = [
"anyhow",
"dunce",
@@ -9604,16 +9864,16 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
version = "2.5.2"
version = "2.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "938a3d7051c9a82b431e3a0f3468f85715b3442b3c3a3913095e9fa509e2652c"
checksum = "d8f069451c4e87e7e2636b7f065a4c52866c4ce5e60e2d53fa1038edb6d184dc"
dependencies = [
"bytes",
"cookie_store",
"data-url",
"http 1.3.1",
"regex",
"reqwest",
"reqwest 0.12.24",
"schemars 0.8.22",
"serde",
"serde_json",
@@ -9697,7 +9957,7 @@ dependencies = [
"minisign-verify",
"osakit",
"percent-encoding",
"reqwest",
"reqwest 0.12.24",
"semver",
"serde",
"serde_json",
@@ -9730,9 +9990,9 @@ dependencies = [
[[package]]
name = "tauri-runtime"
version = "2.8.0"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846"
checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651"
dependencies = [
"cookie 0.18.1",
"dpi",
@@ -9755,9 +10015,9 @@ dependencies = [
[[package]]
name = "tauri-runtime-wry"
version = "2.8.1"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807"
checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314"
dependencies = [
"gtk",
"http 1.3.1",
@@ -9782,9 +10042,9 @@ dependencies = [
[[package]]
name = "tauri-utils"
version = "2.7.0"
version = "2.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212"
checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e"
dependencies = [
"anyhow",
"brotli",
@@ -9892,12 +10152,22 @@ dependencies = [
"url",
]
[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
dependencies = [
"unicode-width 0.1.14",
]
[[package]]
name = "theseus"
version = "1.0.0-local"
dependencies = [
"ariadne",
"async-compression",
"async-minecraft-ping",
"async-recursion",
"async-tungstenite",
"async-walkdir",
@@ -9923,7 +10193,7 @@ dependencies = [
"fs4",
"futures",
"heck 0.5.0",
"hickory-resolver",
"hickory-resolver 0.25.2",
"indicatif",
"itertools 0.14.0",
"notify",
@@ -9938,7 +10208,7 @@ dependencies = [
"quick-xml 0.38.3",
"rand 0.8.5",
"regex",
"reqwest",
"reqwest 0.12.24",
"rgb",
"serde",
"serde_ini",
@@ -10459,9 +10729,9 @@ dependencies = [
[[package]]
name = "tower-http"
version = "0.6.6"
version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2"
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
dependencies = [
"bitflags 2.9.4",
"bytes",
@@ -11032,6 +11302,12 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "vec_map"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]]
name = "version-compare"
version = "0.2.0"
@@ -11143,9 +11419,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
[[package]]
name = "wasm-bindgen"
version = "0.2.104"
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e"
dependencies = [
"cfg-if",
"once_cell",
@@ -11154,27 +11430,14 @@ dependencies = [
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn 2.0.106",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
version = "0.4.54"
version = "0.4.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c"
checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8"
dependencies = [
"cfg-if",
"futures-util",
"js-sys",
"once_cell",
"wasm-bindgen",
@@ -11183,9 +11446,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.104"
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -11193,22 +11456,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.104"
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn 2.0.106",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.104"
version = "0.2.114"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16"
dependencies = [
"unicode-ident",
]
@@ -11226,6 +11489,19 @@ dependencies = [
"web-sys",
]
[[package]]
name = "wasm-streams"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
dependencies = [
"futures-util",
"js-sys",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
]
[[package]]
name = "wayland-backend"
version = "0.3.11"
@@ -11288,9 +11564,9 @@ dependencies = [
[[package]]
name = "web-sys"
version = "0.3.81"
version = "0.3.91"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120"
checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -11308,9 +11584,9 @@ dependencies = [
[[package]]
name = "webkit2gtk"
version = "2.0.1"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a"
checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793"
dependencies = [
"bitflags 1.3.2",
"cairo-rs",
@@ -11332,9 +11608,9 @@ dependencies = [
[[package]]
name = "webkit2gtk-sys"
version = "2.0.1"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c"
checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5"
dependencies = [
"bitflags 1.3.2",
"cairo-sys-rs",
@@ -12037,9 +12313,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
[[package]]
name = "wry"
version = "0.53.4"
version = "0.54.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d78ec082b80fa088569a970d043bb3050abaabf4454101d44514ee8d9a8c9f6"
checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a"
dependencies = [
"base64 0.22.1",
"block2 0.6.2",
+8 -1
View File
@@ -8,6 +8,7 @@ members = [
"packages/app-lib",
"packages/ariadne",
"packages/daedalus",
"packages/labrinth-derive",
"packages/modrinth-log",
"packages/modrinth-maxmind",
"packages/modrinth-util",
@@ -32,6 +33,7 @@ arc-swap = "1.7.1"
argon2 = { version = "0.5.3", features = ["std"] }
ariadne = { path = "packages/ariadne" }
async-compression = { version = "0.4.32", default-features = false }
async-minecraft-ping = { path = "packages/async-minecraft-ping" }
async-recursion = "1.1.1"
async-stripe = { version = "0.41.0", default-features = false, features = [
"runtime-tokio-hyper-rustls",
@@ -58,6 +60,7 @@ color-eyre = "0.6.5"
color-thief = "0.2.2"
const_format = "0.2.34"
daedalus = { path = "packages/daedalus" }
darling = { version = "0.23" }
dashmap = "6.1.0"
data-url = "0.3.2"
deadpool-redis = { git = "https://github.com/modrinth/deadpool", rev = "db5fb00b036ecc8fe5f18853c559b745ffe47bde", version = "0.22.1" }
@@ -69,6 +72,7 @@ dotenv-build = "0.1.1"
dotenvy = "0.15.7"
dunce = "1.0.5"
either = "1.15.0"
elasticsearch = "9.1.0-alpha.1"
encoding_rs = "0.8.35"
enumset = "1.1.10"
eyre = "0.6.12"
@@ -121,9 +125,11 @@ paste = "1.0.15"
path-util = { path = "packages/path-util" }
phf = { version = "0.13.1", features = ["macros"] }
png = "0.18.0"
proc-macro2 = { version = "1.0" }
prometheus = "0.14.0"
quartz_nbt = "0.2.9"
quick-xml = "0.38.3"
quote = { version = "1.0" }
rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9
rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9
redis = "0.32.7"
@@ -166,13 +172,14 @@ spdx = "0.12.0"
sqlx = { version = "0.8.6", default-features = false }
sqlx-tracing = { path = "packages/sqlx-tracing" }
strum = "0.27.2"
syn = { version = "2.0" }
sysinfo = { version = "0.37.2", default-features = false }
tar = "0.4.44"
tauri = "2.8.5"
tauri-build = "2.4.1"
tauri-plugin-deep-link = "2.4.3"
tauri-plugin-dialog = "2.4.0"
tauri-plugin-http = "2.5.2"
tauri-plugin-http = "2.5.7"
tauri-plugin-opener = "2.5.0"
tauri-plugin-os = "2.3.1"
tauri-plugin-single-instance = "2.3.4"
+4 -4
View File
@@ -22,24 +22,24 @@
"@tanstack/vue-query": "^5.90.7",
"@tauri-apps/api": "^2.5.0",
"@tauri-apps/plugin-dialog": "^2.2.1",
"@tauri-apps/plugin-http": "^2.5.0",
"@tauri-apps/plugin-http": "~2.5.7",
"@tauri-apps/plugin-opener": "^2.2.6",
"@tauri-apps/plugin-os": "^2.2.1",
"@tauri-apps/plugin-updater": "^2.7.1",
"@tauri-apps/plugin-window-state": "^2.2.2",
"@types/three": "^0.172.0",
"intl-messageformat": "^10.7.7",
"vue-i18n": "^10.0.0",
"@vueuse/core": "^11.1.0",
"dayjs": "^1.11.10",
"floating-vue": "^5.2.2",
"fuse.js": "^6.6.2",
"intl-messageformat": "^10.7.7",
"ofetch": "^1.3.4",
"pinia": "^3.0.0",
"posthog-js": "^1.158.2",
"three": "^0.172.0",
"vite-svg-loader": "^5.1.0",
"vue": "^3.5.13",
"vue-multiselect": "3.0.0",
"vue-i18n": "^10.0.0",
"vue-router": "^4.6.0",
"vue-virtual-scroller": "v2.0.0-beta.8"
},
+273 -116
View File
@@ -31,19 +31,24 @@ import {
Button,
ButtonStyled,
commonMessages,
ContentInstallModal,
CreationFlowModal,
defineMessages,
I18nDebugPanel,
NewsArticleCard,
NotificationPanel,
OverflowMenu,
PopupNotificationPanel,
ProgressSpinner,
provideModalBehavior,
provideModrinthClient,
provideNotificationManager,
providePageContext,
providePopupNotificationManager,
useDebugLogger,
useVIntl,
} from '@modrinth/ui'
import { renderString } from '@modrinth/utils'
import { formatBytes, renderString } from '@modrinth/utils'
import { useQuery } from '@tanstack/vue-query'
import { getVersion } from '@tauri-apps/api/app'
import { invoke } from '@tauri-apps/api/core'
@@ -61,28 +66,27 @@ import AccountsCard from '@/components/ui/AccountsCard.vue'
import Breadcrumbs from '@/components/ui/Breadcrumbs.vue'
import ErrorModal from '@/components/ui/ErrorModal.vue'
import FriendsList from '@/components/ui/friends/FriendsList.vue'
import AddServerToInstanceModal from '@/components/ui/install_flow/AddServerToInstanceModal.vue'
import IncompatibilityWarningModal from '@/components/ui/install_flow/IncompatibilityWarningModal.vue'
import InstallConfirmModal from '@/components/ui/install_flow/InstallConfirmModal.vue'
import ModInstallModal from '@/components/ui/install_flow/ModInstallModal.vue'
import InstanceCreationModal from '@/components/ui/InstanceCreationModal.vue'
import MinecraftAuthErrorModal from '@/components/ui/minecraft-auth-error-modal/MinecraftAuthErrorModal.vue'
import AppSettingsModal from '@/components/ui/modal/AppSettingsModal.vue'
import AuthGrantFlowWaitModal from '@/components/ui/modal/AuthGrantFlowWaitModal.vue'
import InstallToPlayModal from '@/components/ui/modal/InstallToPlayModal.vue'
import ModpackAlreadyInstalledModal from '@/components/ui/modal/ModpackAlreadyInstalledModal.vue'
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
import NavButton from '@/components/ui/NavButton.vue'
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
import RunningAppBar from '@/components/ui/RunningAppBar.vue'
import SplashScreen from '@/components/ui/SplashScreen.vue'
import UpdateAvailableToast from '@/components/ui/UpdateAvailableToast.vue'
import UpdateToast from '@/components/ui/UpdateToast.vue'
import URLConfirmModal from '@/components/ui/URLConfirmModal.vue'
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
import { debugAnalytics, initAnalytics, optOutAnalytics, trackEvent } from '@/helpers/analytics'
import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics'
import { check_reachable } from '@/helpers/auth.js'
import { get_user } from '@/helpers/cache.js'
import { get_user, get_version } from '@/helpers/cache.js'
import { command_listener, warning_listener } from '@/helpers/events.js'
import { useFetch } from '@/helpers/fetch.js'
import { cancelLogin, get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
import { create_profile_and_install_from_file } from '@/helpers/pack'
import { list } from '@/helpers/profile.js'
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
import { get_opening_command, initialize_state } from '@/helpers/state'
@@ -95,18 +99,20 @@ import {
isNetworkMetered,
} from '@/helpers/utils.js'
import i18n from '@/i18n.config'
import { createContentInstall, provideContentInstall } from '@/providers/content-install'
import {
provideAppUpdateDownloadProgress,
subscribeToDownloadProgress,
} from '@/providers/download-progress.ts'
import { createServerInstall, provideServerInstall } from '@/providers/server-install'
import { setupProviders } from '@/providers/setup'
import { useError } from '@/store/error.js'
import { useInstall } from '@/store/install.js'
import { useLoading, useTheming } from '@/store/state'
import { create_profile_and_install_from_file } from './helpers/pack'
import { generateSkinPreviews } from './helpers/rendering/batch-skin-renderer'
import { get_available_capes, get_available_skins } from './helpers/skins'
import { AppNotificationManager } from './providers/app-notifications'
import { AppPopupNotificationManager } from './providers/app-popup-notifications'
const themeStore = useTheming()
@@ -114,6 +120,10 @@ const notificationManager = new AppNotificationManager()
provideNotificationManager(notificationManager)
const { handleError, addNotification } = notificationManager
const popupNotificationManager = new AppPopupNotificationManager()
providePopupNotificationManager(popupNotificationManager)
const { addPopupNotification } = popupNotificationManager
const tauriApiClient = new TauriModrinthClient({
userAgent: `modrinth/theseus/${getVersion()} (support@modrinth.com)`,
features: [
@@ -128,11 +138,27 @@ providePageContext({
hierarchicalSidebarAvailable: ref(true),
showAds: ref(false),
})
provideModalBehavior({
noblur: computed(() => !themeStore.advancedRendering),
onShow: () => hide_ads_window(),
onHide: () => show_ads_window(),
})
const {
installationModal,
fetchExistingInstanceNames,
handleCreate,
handleBrowseModpacks,
searchModpacks,
getProjectVersions,
setModpackAlreadyInstalledModal,
handleModpackDuplicateCreateAnyway,
handleModpackDuplicateGoToInstance,
} = setupProviders(notificationManager)
const news = ref([])
const availableSurvey = ref(false)
const urlModal = ref(null)
const offline = ref(!navigator.onLine)
window.addEventListener('offline', () => {
offline.value = true
@@ -271,12 +297,11 @@ async function setupApp() {
isMaximized.value = await getCurrentWindow().isMaximized()
})
initAnalytics()
if (!telemetry) {
optOutAnalytics()
if (telemetry) {
initAnalytics()
if (dev) debugAnalytics()
trackEvent('Launched', { version, dev, onboarded })
}
if (dev) debugAnalytics()
trackEvent('Launched', { version, dev, onboarded })
if (!dev) document.addEventListener('contextmenu', (event) => event.preventDefault())
@@ -295,11 +320,7 @@ async function setupApp() {
}),
)
useFetch(
`https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`,
'criticalAnnouncements',
true,
)
fetch(`https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`)
.then((response) => response.json())
.then((res) => {
if (res && res.header && res.body) {
@@ -312,23 +333,21 @@ async function setupApp() {
)
})
useFetch(`https://modrinth.com/news/feed/articles.json`, 'news', true)
fetch(`https://modrinth.com/news/feed/articles.json`)
.then((response) => response.json())
.then((res) => {
if (res && res.articles) {
// Format expected by NewsArticleCard component.
news.value = res.articles
.map((article) => ({
...article,
path: article.link,
thumbnail: article.thumbnail,
title: article.title,
summary: article.summary,
date: article.date,
}))
.slice(0, 4)
}
})
.catch((error) => {
console.error('Failed to fetch news articles', error)
})
get_opening_command().then(handleCommand)
fetchCredentials()
@@ -389,11 +408,47 @@ loading.setEnabled(false)
const error = useError()
const errorModal = ref()
const minecraftAuthErrorModal = ref()
const contentInstall = createContentInstall({ router, handleError })
provideContentInstall(contentInstall)
const {
instances: contentInstallInstances,
compatibleLoaders: contentInstallLoaders,
gameVersions: contentInstallGameVersions,
loading: contentInstallLoading,
defaultTab: contentInstallDefaultTab,
preferredLoader: contentInstallPreferredLoader,
preferredGameVersion: contentInstallPreferredGameVersion,
releaseGameVersions: contentInstallReleaseGameVersions,
projectInfo: contentInstallProjectInfo,
handleInstallToInstance,
handleCreateAndInstall,
handleNavigate: handleContentInstallNavigate,
handleCancel: handleContentInstallCancel,
setContentInstallModal,
setModpackAlreadyInstalledModal: setContentInstallModpackAlreadyInstalledModal,
handleModpackDuplicateCreateAnyway: handleContentInstallModpackDuplicateCreateAnyway,
handleModpackDuplicateGoToInstance: handleContentInstallModpackDuplicateGoToInstance,
setIncompatibilityWarningModal: setContentIncompatibilityWarningModal,
} = contentInstall
const serverInstall = createServerInstall({ router, handleError, popupNotificationManager })
provideServerInstall(serverInstall)
const {
setInstallToPlayModal: setServerInstallToPlayModal,
setUpdateToPlayModal: setServerUpdateToPlayModal,
setAddServerToInstanceModal: setServerAddServerToInstanceModal,
playServerProject,
} = serverInstall
const install = useInstall()
const modInstallModal = ref()
const installConfirmModal = ref()
const modpackAlreadyInstalledModal = ref()
const contentInstallModpackAlreadyInstalledModal = ref()
const addServerToInstanceModal = ref()
const incompatibilityWarningModal = ref()
const installToPlayModal = ref()
const updateToPlayModal = ref()
const credentials = ref()
@@ -402,7 +457,7 @@ const modrinthLoginFlowWaitModal = ref()
async function fetchCredentials() {
const creds = await getCreds().catch(handleError)
if (creds && creds.user_id) {
creds.user = await get_user(creds.user_id).catch(handleError)
creds.user = await get_user(creds.user_id, 'bypass').catch(handleError)
}
credentials.value = creds ?? null
}
@@ -467,10 +522,15 @@ onMounted(() => {
invoke('show_window')
error.setErrorModal(errorModal.value)
error.setMinecraftAuthErrorModal(minecraftAuthErrorModal.value)
install.setIncompatibilityWarningModal(incompatibilityWarningModal)
install.setInstallConfirmModal(installConfirmModal)
install.setModInstallModal(modInstallModal)
setContentIncompatibilityWarningModal(incompatibilityWarningModal.value)
setContentInstallModal(modInstallModal.value)
setContentInstallModpackAlreadyInstalledModal(contentInstallModpackAlreadyInstalledModal.value)
setModpackAlreadyInstalledModal(modpackAlreadyInstalledModal.value)
setServerAddServerToInstanceModal(addServerToInstanceModal.value)
setServerInstallToPlayModal(installToPlayModal.value)
setServerUpdateToPlayModal(updateToPlayModal.value)
})
const accounts = ref(null)
@@ -488,9 +548,22 @@ async function handleCommand(e) {
source: 'CreationModalFileDrop',
})
}
} else if (e.event === 'InstallServer') {
await router.push(`/project/${e.id}`)
await playServerProject(e.id).catch(handleError)
} else if (e.event === 'InstallVersion') {
const version = await get_version(e.id, 'must_revalidate').catch(handleError)
if (version) {
await contentInstall
.install(version.project_id, version.id, null, 'URLConfirmModal', undefined, undefined, {
showProjectInfo: true,
})
.catch(handleError)
}
} else {
// Other commands are URL-based (deep linking)
urlModal.value.show(e)
await contentInstall
.install(e.id, null, null, 'URLConfirmModal', undefined, undefined, { showProjectInfo: true })
.catch(handleError)
}
}
@@ -506,14 +579,60 @@ const downloadPercent = computed(() => Math.trunc(appUpdateDownload.progress.val
const metered = ref(true)
const finishedDownloading = ref(false)
const restarting = ref(false)
const updateToastDismissed = ref(false)
const availableUpdate = ref(null)
const updateSize = ref(null)
const updatesEnabled = ref(true)
const updatePopupMessages = defineMessages({
updateAvailable: {
id: 'app.update-popup.title',
defaultMessage: 'Update available',
},
downloadComplete: {
id: 'app.update-popup.download-complete',
defaultMessage: 'Download complete',
},
body: {
id: 'app.update-popup.body',
defaultMessage:
'Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App.',
},
meteredBody: {
id: 'app.update-popup.body.metered',
defaultMessage: `Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it.`,
},
downloadedBody: {
id: 'app.update-popup.body.download-complete',
defaultMessage: `Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App.`,
},
linuxBody: {
id: 'app.update-popup.body.linux',
defaultMessage:
'Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!',
},
reload: {
id: 'app.update-popup.reload',
defaultMessage: 'Reload',
},
download: {
id: 'app.update-popup.download',
defaultMessage: 'Download ({size})',
},
changelog: {
id: 'app.update-popup.changelog',
defaultMessage: 'Changelog',
},
})
async function checkUpdates() {
if (!(await areUpdatesEnabled())) {
console.log('Skipping update check as updates are disabled in this build or environment')
updatesEnabled.value = false
if (os.value === 'Linux' && !isDevEnvironment.value) {
checkLinuxUpdates()
setInterval(checkLinuxUpdates, 5 * 60 * 1000)
}
return
}
@@ -533,7 +652,6 @@ async function checkUpdates() {
appUpdateDownload.progress.value = 0
finishedDownloading.value = false
updateToastDismissed.value = false
console.log(`Update ${update.version} is available.`)
@@ -543,6 +661,28 @@ async function checkUpdates() {
downloadUpdate(update)
} else {
console.log(`Metered connection detected, not auto-downloading update.`)
getUpdateSize(update.rid).then((size) => {
updateSize.value = size
addPopupNotification({
title: formatMessage(updatePopupMessages.updateAvailable),
text: formatMessage(updatePopupMessages.meteredBody, { version: update.version }),
type: 'info',
autoCloseMs: null,
buttons: [
{
label: formatMessage(updatePopupMessages.download, {
size: formatBytes(updateSize.value ?? 0),
}),
action: () => downloadAvailableUpdate(),
color: 'brand',
},
{
label: formatMessage(updatePopupMessages.changelog),
action: () => openUrl('https://modrinth.com/news/changelog?filter=app'),
},
],
})
})
}
getUpdateSize(update.rid).then((size) => (updateSize.value = size))
@@ -559,8 +699,26 @@ async function checkUpdates() {
)
}
async function showUpdateToast() {
updateToastDismissed.value = false
async function checkLinuxUpdates() {
try {
const [response, currentVersion] = await Promise.all([
fetch('https://launcher-files.modrinth.com/updates.json'),
getVersion(),
])
const updates = await response.json()
const latestVersion = updates?.version
if (latestVersion && latestVersion !== currentVersion) {
addPopupNotification({
title: formatMessage(updatePopupMessages.updateAvailable),
text: formatMessage(updatePopupMessages.linuxBody, { version: latestVersion }),
type: 'info',
autoCloseMs: null,
})
}
} catch (e) {
console.error('Failed to check for updates:', e)
}
}
async function downloadAvailableUpdate() {
@@ -586,6 +744,26 @@ async function downloadUpdate(versionToDownload) {
unlistenUpdateDownload = null
})
console.log('Finished downloading!')
addPopupNotification({
title: formatMessage(updatePopupMessages.downloadComplete),
text: formatMessage(updatePopupMessages.downloadedBody, {
version: versionToDownload.version,
}),
type: 'success',
autoCloseMs: null,
buttons: [
{
label: formatMessage(updatePopupMessages.reload),
action: () => installUpdate(),
color: 'brand',
},
{
label: formatMessage(updatePopupMessages.changelog),
action: () => openUrl('https://modrinth.com/news/changelog?filter=app'),
},
],
})
})
unlistenUpdateDownload = await subscribeToDownloadProgress(
appUpdateDownload,
@@ -759,25 +937,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
class="app-grid-layout experimental-styles-within relative"
:class="{ 'disable-advanced-rendering': !themeStore.advancedRendering }"
>
<Suspense>
<Transition name="toast">
<UpdateToast
v-if="
!!availableUpdate &&
!updateToastDismissed &&
!restarting &&
(finishedDownloading || metered)
"
:version="availableUpdate.version"
:size="updateSize"
:metered="metered"
@close="updateToastDismissed = true"
@restart="installUpdate"
@download="downloadAvailableUpdate"
/>
<UpdateAvailableToast v-else-if="!updatesEnabled && os === 'Linux' && !isDevEnvironment" />
</Transition>
</Suspense>
<Transition name="fade">
<div
v-if="restarting"
@@ -799,9 +958,16 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
<Suspense>
<AuthGrantFlowWaitModal ref="modrinthLoginFlowWaitModal" @flow-cancel="cancelLogin" />
</Suspense>
<Suspense>
<InstanceCreationModal ref="installationModal" />
</Suspense>
<CreationFlowModal
ref="installationModal"
type="instance"
show-snapshot-toggle
:fetch-existing-instance-names="fetchExistingInstanceNames"
:search-modpacks="searchModpacks"
:get-project-versions="getProjectVersions"
@create="handleCreate"
@browse-modpacks="handleBrowseModpacks"
/>
<div
class="app-grid-navbar bg-bg-raised flex flex-col p-[0.5rem] pt-0 gap-[0.5rem] w-[--left-bar-width]"
>
@@ -847,21 +1013,14 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
</suspense>
<NavButton
v-tooltip.right="'Create new instance'"
:to="() => $refs.installationModal.show()"
:to="() => installationModal?.show()"
:disabled="offline"
>
<PlusIcon />
</NavButton>
<div class="flex flex-grow"></div>
<Transition name="nav-button-animated">
<div
v-if="
availableUpdate &&
updateToastDismissed &&
!restarting &&
(finishedDownloading || metered)
"
>
<div v-if="availableUpdate && !restarting && (finishedDownloading || metered)">
<NavButton
v-tooltip.right="
formatMessage(
@@ -875,13 +1034,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
},
)
"
:to="
finishedDownloading
? installUpdate
: downloadProgress > 0 && downloadProgress < 1
? showUpdateToast
: downloadAvailableUpdate
"
:to="finishedDownloading ? installUpdate : downloadAvailableUpdate"
>
<ProgressSpinner
v-if="downloadProgress > 0 && downloadProgress < 1"
@@ -900,7 +1053,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
<SettingsIcon />
</NavButton>
<OverflowMenu
v-if="credentials"
v-if="credentials?.user"
v-tooltip.right="`Modrinth account`"
class="w-12 h-12 text-primary rounded-full flex items-center justify-center text-2xl transition-all bg-transparent hover:bg-button-bg hover:text-contrast border-0 cursor-pointer"
:options="[
@@ -916,14 +1069,14 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
]"
placement="right-end"
>
<Avatar :src="credentials.user.avatar_url" alt="" size="32px" circle />
<Avatar :src="credentials?.user?.avatar_url" alt="" size="32px" circle />
<template #view-profile>
<UserIcon />
<span class="inline-flex items-center gap-1">
Signed in as
<span class="inline-flex items-center gap-1 text-contrast font-semibold">
<Avatar :src="credentials.user.avatar_url" alt="" size="20px" circle />
{{ credentials.user.username }}
<Avatar :src="credentials?.user?.avatar_url" alt="" size="20px" circle />
{{ credentials?.user?.username }}
</span>
</span>
<ExternalIcon />
@@ -935,9 +1088,9 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
</NavButton>
</div>
<div data-tauri-drag-region class="app-grid-statusbar bg-bg-raised h-[--top-bar-height] flex">
<div data-tauri-drag-region class="flex p-3">
<ModrinthAppLogo class="h-full w-auto text-contrast pointer-events-none" />
<div data-tauri-drag-region class="flex items-center gap-1 ml-3">
<div data-tauri-drag-region class="flex min-w-0 flex-1 overflow-hidden p-3">
<ModrinthAppLogo class="h-full w-auto shrink-0 text-contrast pointer-events-none" />
<div data-tauri-drag-region class="flex shrink-0 items-center gap-1 ml-3">
<button
class="cursor-pointer p-0 m-0 text-contrast border-none outline-none bg-button-bg rounded-full flex items-center justify-center w-6 h-6 hover:brightness-75 transition-all"
@click="router.back()"
@@ -953,7 +1106,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
</div>
<Breadcrumbs class="pt-[2px]" />
</div>
<section data-tauri-drag-region class="flex ml-auto items-center">
<section data-tauri-drag-region class="flex shrink-0 ml-auto items-center">
<ButtonStyled
v-if="!forceSidebar && themeStore.toggleSidebar"
:type="sidebarToggled ? 'standard' : 'transparent'"
@@ -1128,13 +1281,41 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
</template>
</div>
</div>
<URLConfirmModal ref="urlModal" />
<I18nDebugPanel />
<NotificationPanel has-sidebar />
<PopupNotificationPanel has-sidebar />
<ErrorModal ref="errorModal" />
<ModInstallModal ref="modInstallModal" />
<MinecraftAuthErrorModal ref="minecraftAuthErrorModal" />
<ContentInstallModal
ref="modInstallModal"
:instances="contentInstallInstances"
:compatible-loaders="contentInstallLoaders"
:game-versions="contentInstallGameVersions"
:loading="contentInstallLoading"
:default-tab="contentInstallDefaultTab"
:preferred-loader="contentInstallPreferredLoader"
:preferred-game-version="contentInstallPreferredGameVersion"
:release-game-versions="contentInstallReleaseGameVersions"
:project-info="contentInstallProjectInfo"
@install="handleInstallToInstance"
@create-and-install="handleCreateAndInstall"
@navigate="handleContentInstallNavigate"
@cancel="handleContentInstallCancel"
/>
<ModpackAlreadyInstalledModal
ref="modpackAlreadyInstalledModal"
@create-anyway="handleModpackDuplicateCreateAnyway"
@go-to-instance="handleModpackDuplicateGoToInstance"
/>
<AddServerToInstanceModal ref="addServerToInstanceModal" />
<IncompatibilityWarningModal ref="incompatibilityWarningModal" />
<InstallConfirmModal ref="installConfirmModal" />
<ModpackAlreadyInstalledModal
ref="contentInstallModpackAlreadyInstalledModal"
@create-anyway="handleContentInstallModpackDuplicateCreateAnyway"
@go-to-instance="handleContentInstallModpackDuplicateGoToInstance"
/>
<InstallToPlayModal ref="installToPlayModal" />
<UpdateToPlayModal ref="updateToPlayModal" />
</template>
<style lang="scss" scoped>
@@ -1363,38 +1544,15 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
transform: translateY(10rem) scale(0.8) scaleY(1.6);
}
.toast-enter-active {
transition: opacity 0.25s linear;
}
.toast-enter-from,
.toast-leave-to {
opacity: 0;
}
@media (prefers-reduced-motion: no-preference) {
.toast-enter-active,
.nav-button-animated-enter-active {
transition: all 0.5s cubic-bezier(0.15, 1.4, 0.64, 0.96);
}
.toast-leave-active,
.nav-button-animated-leave-active {
transition: all 0.25s ease;
}
.toast-enter-from {
scale: 0.5;
translate: 0 -10rem;
opacity: 0;
}
.toast-leave-to {
scale: 0.96;
translate: 20rem 0;
opacity: 0;
}
.nav-button-animated-enter-active {
position: relative;
}
@@ -1458,7 +1616,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
}
.info-card {
right: 8rem;
right: 22rem;
}
.profile-card {
@@ -1466,4 +1624,3 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
}
}
</style>
<style src="vue-multiselect/dist/vue-multiselect.css"></style>
@@ -155,4 +155,23 @@ img {
box-shadow: var(--shadow-card);
}
// From the Bootstrap project
// The MIT License (MIT)
// Copyright (c) 2011-2023 The Bootstrap Authors
// https://github.com/twbs/bootstrap/blob/2f617215755b066904248525a8c56ea425dde871/scss/mixins/_visually-hidden.scss#L8
.visually-hidden {
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
&:not(caption) {
position: absolute !important;
}
}
@import '@modrinth/assets/omorphia.scss';
@@ -22,7 +22,7 @@ import { computed, ref } from 'vue'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import Instance from '@/components/ui/Instance.vue'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
import ConfirmDeleteInstanceModal from '@/components/ui/modal/ConfirmDeleteInstanceModal.vue'
import { duplicate, remove } from '@/helpers/profile.js'
const { handleError } = injectNotificationManager()
@@ -302,14 +302,7 @@ const filteredResults = computed(() => {
/>
</section>
</div>
<ConfirmModalWrapper
ref="confirmModal"
title="Are you sure you want to delete this instance?"
description="If you proceed, all data for your instance will be removed. You will not be able to recover it."
:has-to-type="false"
proceed-label="Delete"
@proceed="deleteProfile"
/>
<ConfirmDeleteInstanceModal ref="confirmModal" @delete="deleteProfile" />
<ContextMenu ref="instanceOptions" @option-clicked="handleOptionsClick">
<template #play> <PlayIcon /> Play </template>
<template #stop> <StopCircleIcon /> Stop </template>
@@ -19,15 +19,16 @@ import { useRouter } from 'vue-router'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import Instance from '@/components/ui/Instance.vue'
import LegacyProjectCard from '@/components/ui/LegacyProjectCard.vue'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
import ConfirmDeleteInstanceModal from '@/components/ui/modal/ConfirmDeleteInstanceModal.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_by_profile_path } from '@/helpers/process.js'
import { duplicate, kill, remove, run } from '@/helpers/profile.js'
import { showProfileInFolder } from '@/helpers/utils.js'
import { injectContentInstall } from '@/providers/content-install'
import { handleSevereError } from '@/store/error.js'
import { install as installVersion } from '@/store/install.js'
const { handleError } = injectNotificationManager()
const { install: installVersion } = injectContentInstall()
const router = useRouter()
@@ -238,14 +239,7 @@ onUnmounted(() => {
</script>
<template>
<ConfirmModalWrapper
ref="deleteConfirmModal"
title="Are you sure you want to delete this instance?"
description="If you proceed, all data for your instance will be removed. You will not be able to recover it."
:has-to-type="false"
proceed-label="Delete"
@proceed="deleteProfile"
/>
<ConfirmDeleteInstanceModal ref="deleteConfirmModal" @delete="deleteProfile" />
<div ref="rowContainer" class="flex flex-col gap-4">
<div v-for="row in actualInstances" ref="rows" :key="row.label" class="row">
<HeadingLink class="mt-1" :to="row.route">
@@ -1,64 +1,147 @@
<template>
<div data-tauri-drag-region class="flex items-center gap-1 pl-3">
<Button v-if="false" class="breadcrumbs__back transparent" icon-only @click="$router.back()">
<ChevronLeftIcon />
</Button>
<Button
v-if="false"
class="breadcrumbs__forward transparent"
icon-only
@click="$router.forward()"
<div
ref="outerRef"
data-tauri-drag-region
class="min-w-0 overflow-hidden pl-3"
:style="isOverflowing ? { '--scroll-distance': `-${overflowAmount}px` } : undefined"
@mouseenter="onMouseEnter"
@mouseleave="onMouseLeave"
>
<div
ref="innerRef"
data-tauri-drag-region
class="flex w-fit items-center gap-1"
:class="{ 'breadcrumbs-scroll': isAnimating }"
@animationiteration="onAnimationIteration"
>
<ChevronRightIcon />
</Button>
{{ breadcrumbData.resetToNames(breadcrumbs) }}
<template v-for="breadcrumb in breadcrumbs" :key="breadcrumb.name">
<router-link
v-if="breadcrumb.link"
:to="{
path: breadcrumb.link.replace('{id}', encodeURIComponent($route.params.id)),
query: breadcrumb.query,
}"
class="text-primary"
>{{
breadcrumb.name.charAt(0) === '?'
? breadcrumbData.getName(breadcrumb.name.slice(1))
: breadcrumb.name
}}
</router-link>
<span
v-else
data-tauri-drag-region
class="text-contrast font-semibold cursor-default select-none"
>{{
breadcrumb.name.charAt(0) === '?'
? breadcrumbData.getName(breadcrumb.name.slice(1))
: breadcrumb.name
}}</span
>
<ChevronRightIcon v-if="breadcrumb.link" data-tauri-drag-region class="w-5 h-5" />
</template>
{{ breadcrumbData.resetToNames(breadcrumbs) }}
<template v-for="breadcrumb in breadcrumbs" :key="breadcrumb.name">
<router-link
v-if="breadcrumb.link"
:to="{
path: breadcrumb.link.replace('{id}', encodeURIComponent($route.params.id as string)),
query: breadcrumb.query,
}"
class="shrink-0 whitespace-nowrap text-primary"
>
{{ resolveLabel(breadcrumb.name) }}
</router-link>
<span
v-else
data-tauri-drag-region
class="shrink-0 whitespace-nowrap text-contrast font-semibold cursor-default select-none"
>
{{ resolveLabel(breadcrumb.name) }}
</span>
<ChevronRightIcon v-if="breadcrumb.link" data-tauri-drag-region class="w-5 h-5 shrink-0" />
</template>
</div>
</div>
</template>
<script setup>
import { ChevronLeftIcon, ChevronRightIcon } from '@modrinth/assets'
import { Button } from '@modrinth/ui'
import { computed } from 'vue'
<script setup lang="ts">
import { ChevronRightIcon } from '@modrinth/assets'
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { useBreadcrumbs } from '@/store/breadcrumbs'
const route = useRoute()
interface Breadcrumb {
name: string
link?: string
query?: Record<string, string>
}
const route = useRoute()
const breadcrumbData = useBreadcrumbs()
const breadcrumbs = computed(() => {
const breadcrumbs = computed<Breadcrumb[]>(() => {
const additionalContext =
route.meta.useContext === true
? breadcrumbData.context
: route.meta.useRootContext === true
? breadcrumbData.rootContext
: null
return additionalContext ? [additionalContext, ...route.meta.breadcrumb] : route.meta.breadcrumb
const crumbs = (route.meta.breadcrumb ?? []) as Breadcrumb[]
return additionalContext ? [additionalContext as Breadcrumb, ...crumbs] : crumbs
})
function resolveLabel(name: string): string {
return name.charAt(0) === '?' ? breadcrumbData.getName(name.slice(1)) : name
}
// Overflow detection
const outerRef = ref<HTMLDivElement | null>(null)
const innerRef = ref<HTMLDivElement | null>(null)
const isOverflowing = ref(false)
const isAnimating = ref(false)
const overflowAmount = ref(0)
let hovered = false
let stopping = false
function checkOverflow() {
if (!outerRef.value || !innerRef.value) return
const overflow = innerRef.value.scrollWidth - outerRef.value.clientWidth
isOverflowing.value = overflow > 0
overflowAmount.value = overflow + 12
}
function onMouseEnter() {
hovered = true
stopping = false
if (isOverflowing.value) {
isAnimating.value = true
}
}
function onMouseLeave() {
hovered = false
if (isAnimating.value) {
stopping = true
}
}
function onAnimationIteration() {
if (stopping && !hovered) {
isAnimating.value = false
stopping = false
}
}
let resizeObserver: ResizeObserver | null = null
onMounted(() => {
checkOverflow()
resizeObserver = new ResizeObserver(checkOverflow)
if (outerRef.value) resizeObserver.observe(outerRef.value)
if (innerRef.value) resizeObserver.observe(innerRef.value)
})
onBeforeUnmount(() => {
resizeObserver?.disconnect()
})
watch(breadcrumbs, () => {
requestAnimationFrame(checkOverflow)
})
</script>
<style scoped>
.breadcrumbs-scroll {
animation: breadcrumb-scroll 10s ease-in-out infinite;
}
@keyframes breadcrumb-scroll {
0% {
transform: translateX(0);
}
35%,
65% {
transform: translateX(var(--scroll-distance));
}
100% {
transform: translateX(0);
}
}
</style>
@@ -33,6 +33,7 @@ const metadata = ref({})
defineExpose({
async show(errorVal, context, canClose = true, source = null) {
console.log(errorVal, context, canClose, source)
closable.value = canClose
if (errorVal.message && errorVal.message.includes('Minecraft authentication error:')) {
@@ -1,6 +1,14 @@
<script setup>
import { PlusIcon, XIcon } from '@modrinth/assets'
import { Button, Checkbox, injectNotificationManager, StyledInput } from '@modrinth/ui'
import {
Button,
Checkbox,
commonMessages,
defineMessages,
injectNotificationManager,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { ref } from 'vue'
@@ -9,6 +17,33 @@ import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { export_profile_mrpack, get_pack_export_candidates } from '@/helpers/profile.js'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const messages = defineMessages({
header: { id: 'app.export-modal.header', defaultMessage: 'Export modpack' },
modpackNameLabel: { id: 'app.export-modal.modpack-name-label', defaultMessage: 'Modpack Name' },
modpackNamePlaceholder: {
id: 'app.export-modal.modpack-name-placeholder',
defaultMessage: 'Modpack name',
},
versionNumberLabel: {
id: 'app.export-modal.version-number-label',
defaultMessage: 'Version number',
},
versionNumberPlaceholder: {
id: 'app.export-modal.version-number-placeholder',
defaultMessage: '1.0.0',
},
descriptionPlaceholder: {
id: 'app.export-modal.description-placeholder',
defaultMessage: 'Enter modpack description...',
},
selectFilesLabel: {
id: 'app.export-modal.select-files-label',
defaultMessage: 'Select files and folders to include in pack',
},
exportButton: { id: 'app.export-modal.export-button', defaultMessage: 'Export' },
})
const props = defineProps({
instance: {
@@ -106,36 +141,36 @@ const exportPack = async () => {
</script>
<template>
<ModalWrapper ref="exportModal" header="Export modpack">
<ModalWrapper ref="exportModal" :header="formatMessage(messages.header)">
<div class="modal-body">
<div class="labeled_input">
<p>Modpack Name</p>
<p>{{ formatMessage(messages.modpackNameLabel) }}</p>
<StyledInput
v-model="nameInput"
:icon="PackageIcon"
type="text"
placeholder="Modpack name"
:placeholder="formatMessage(messages.modpackNamePlaceholder)"
clearable
/>
</div>
<div class="labeled_input">
<p>Version number</p>
<p>{{ formatMessage(messages.versionNumberLabel) }}</p>
<StyledInput
v-model="versionInput"
:icon="VersionIcon"
type="text"
placeholder="1.0.0"
:placeholder="formatMessage(messages.versionNumberPlaceholder)"
clearable
/>
</div>
<div class="adjacent-input">
<div class="labeled_input">
<p>Description</p>
<p>{{ formatMessage(commonMessages.descriptionLabel) }}</p>
<StyledInput
v-model="exportDescription"
multiline
placeholder="Enter modpack description..."
:placeholder="formatMessage(messages.descriptionPlaceholder)"
/>
</div>
</div>
@@ -143,7 +178,7 @@ const exportPack = async () => {
<div class="table">
<div class="table-head">
<div class="table-cell row-wise">
Select files and folders to include in pack
{{ formatMessage(messages.selectFilesLabel) }}
<Button
class="sleek-primary collapsed-button"
icon-only
@@ -202,11 +237,11 @@ const exportPack = async () => {
<div class="button-row push-right">
<Button @click="exportModal.hide">
<XIcon />
Cancel
{{ formatMessage(commonMessages.cancelButton) }}
</Button>
<Button color="primary" @click="exportPack">
<PackageIcon />
Export
{{ formatMessage(messages.exportButton) }}
</Button>
</div>
</div>
@@ -69,7 +69,7 @@ const play = async (e, context) => {
await run(props.instance.path)
.catch((err) => handleSevereError(err, { profilePath: props.instance.path }))
.finally(() => {
trackEvent('InstancePlay', {
trackEvent('InstanceStart', {
loader: props.instance.loader,
game_version: props.instance.game_version,
source: context,
@@ -1,662 +0,0 @@
<template>
<ModalWrapper ref="modal" header="Creating an instance">
<div class="modal-header">
<Chips v-model="creationType" :items="['custom', 'from file', 'import from launcher']" />
</div>
<hr class="card-divider" />
<div v-if="creationType === 'custom'" class="modal-body">
<div class="image-upload">
<Avatar :src="display_icon" size="md" :rounded="true" />
<div class="image-input">
<Button @click="upload_icon()">
<UploadIcon />
Select icon
</Button>
<Button :disabled="!display_icon" @click="reset_icon">
<XIcon />
Remove icon
</Button>
</div>
</div>
<div class="input-row">
<p class="input-label">Name</p>
<StyledInput
v-model="profile_name"
autocomplete="off"
type="text"
placeholder="Enter a name for your instance..."
:maxlength="100"
wrapper-class="w-full"
/>
</div>
<div class="input-row">
<p class="input-label">Loader</p>
<Chips v-model="loader" :items="loaders" />
</div>
<div class="input-row">
<p class="input-label">Game version</p>
<div class="flex gap-4 items-center">
<multiselect
v-model="game_version"
class="selector"
:options="game_versions"
:multiple="false"
:searchable="true"
placeholder="Select game version"
open-direction="top"
:show-labels="false"
/>
<Checkbox v-model="showSnapshots" class="shrink-0" label="Show all versions" />
</div>
</div>
<div v-if="loader !== 'vanilla'" class="input-row">
<p class="input-label">Loader version</p>
<Chips v-model="loader_version" :items="['stable', 'latest', 'other']" />
</div>
<div v-if="loader_version === 'other' && loader !== 'vanilla'">
<div v-if="game_version" class="input-row">
<p class="input-label">Select version</p>
<multiselect
v-model="specified_loader_version"
class="selector"
:options="selectable_versions"
:searchable="true"
placeholder="Select loader version"
open-direction="top"
:show-labels="false"
/>
</div>
<div v-else class="input-row">
<p class="warning">Select a game version before you select a loader version</p>
</div>
</div>
<div class="input-group push-right">
<Button @click="hide()">
<XIcon />
Cancel
</Button>
<Button color="primary" :disabled="!check_valid || creating" @click="create_instance()">
<PlusIcon v-if="!creating" />
{{ creating ? 'Creating...' : 'Create' }}
</Button>
</div>
</div>
<div v-else-if="creationType === 'from file'" class="modal-body">
<Button @click="openFile"> <FolderOpenIcon /> Import from file </Button>
<div class="info"><InfoIcon /> Or drag and drop your .mrpack file</div>
</div>
<div v-else class="modal-body">
<Chips
v-model="selectedProfileType"
:items="profileOptions"
:format-label="(profile) => profile?.name"
/>
<div class="path-selection">
<h3>{{ selectedProfileType.name }} path</h3>
<div class="path-input">
<StyledInput
v-model="selectedProfileType.path"
:icon="FolderOpenIcon"
type="text"
placeholder="Path to launcher"
clearable
@change="setPath"
/>
<Button icon-only @click="selectLauncherPath">
<FolderSearchIcon />
</Button>
<Button icon-only @click="reload">
<UpdatedIcon />
</Button>
</div>
</div>
<div class="table">
<div class="table-head table-row">
<div class="toggle-all table-cell">
<Checkbox
class="select-checkbox"
:model-value="
profiles.get(selectedProfileType.name)?.every((child) => child.selected)
"
@update:model-value="
(newValue) =>
profiles
.get(selectedProfileType.name)
?.forEach((child) => (child.selected = newValue))
"
/>
</div>
<div class="name-cell table-cell">Profile name</div>
</div>
<div
v-if="
profiles.get(selectedProfileType.name) &&
profiles.get(selectedProfileType.name).length > 0
"
class="table-content"
>
<div
v-for="(profile, index) in profiles.get(selectedProfileType.name)"
:key="index"
class="table-row"
>
<div class="checkbox-cell table-cell">
<Checkbox v-model="profile.selected" class="select-checkbox" />
</div>
<div class="name-cell table-cell">
{{ profile.name }}
</div>
</div>
</div>
<div v-else class="table-content empty">No profiles found</div>
</div>
<div class="button-row">
<Button
:disabled="
loading ||
!Array.from(profiles.values())
.flatMap((e) => e)
.some((e) => e.selected)
"
color="primary"
@click="next"
>
{{
loading
? 'Importing...'
: Array.from(profiles.values())
.flatMap((e) => e)
.some((e) => e.selected)
? `Import ${
Array.from(profiles.values())
.flatMap((e) => e)
.filter((e) => e.selected).length
} profiles`
: 'Select profiles to import'
}}
</Button>
<ProgressBar
v-if="loading"
:progress="(importedProfiles / (totalProfiles + 0.0001)) * 100"
/>
</div>
</div>
</ModalWrapper>
</template>
<script setup>
import {
FolderOpenIcon,
FolderSearchIcon,
InfoIcon,
PlusIcon,
UpdatedIcon,
UploadIcon,
XIcon,
} from '@modrinth/assets'
import {
Avatar,
Button,
Checkbox,
Chips,
injectNotificationManager,
StyledInput,
} from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { getCurrentWebview } from '@tauri-apps/api/webview'
import { open } from '@tauri-apps/plugin-dialog'
import { computed, onUnmounted, ref, shallowRef } from 'vue'
import Multiselect from 'vue-multiselect'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import ProgressBar from '@/components/ui/ProgressBar.vue'
import { trackEvent } from '@/helpers/analytics'
import {
get_default_launcher_path,
get_importable_instances,
import_instance,
} from '@/helpers/import.js'
import { get_game_versions, get_loader_versions } from '@/helpers/metadata'
import { create_profile_and_install_from_file } from '@/helpers/pack.js'
import { create } from '@/helpers/profile'
import { get_loaders } from '@/helpers/tags'
const { handleError } = injectNotificationManager()
const profile_name = ref('')
const game_version = ref('')
const loader = ref('vanilla')
const loader_version = ref('stable')
const specified_loader_version = ref('')
const icon = ref(null)
const display_icon = ref(null)
const creating = ref(false)
const showSnapshots = ref(false)
const creationType = ref('custom')
const isShowing = ref(false)
defineExpose({
show: async () => {
game_version.value = ''
specified_loader_version.value = ''
profile_name.value = ''
creating.value = false
showSnapshots.value = false
loader.value = 'vanilla'
loader_version.value = 'stable'
icon.value = null
display_icon.value = null
isShowing.value = true
modal.value.show()
unlistener.value = await getCurrentWebview().onDragDropEvent(async (event) => {
// Only if modal is showing
if (!isShowing.value) return
if (event.payload.type !== 'drop') return
if (creationType.value !== 'from file') return
hide()
const { paths } = event.payload
if (paths && paths.length > 0 && paths[0].endsWith('.mrpack')) {
await create_profile_and_install_from_file(paths[0]).catch(handleError)
trackEvent('InstanceCreate', {
source: 'CreationModalFileDrop',
})
}
})
trackEvent('InstanceCreateStart', { source: 'CreationModal' })
},
})
const unlistener = ref(null)
const hide = () => {
isShowing.value = false
modal.value.hide()
if (unlistener.value) {
unlistener.value()
unlistener.value = null
}
}
onUnmounted(() => {
if (unlistener.value) {
unlistener.value()
unlistener.value = null
}
})
const [
fabric_versions,
forge_versions,
quilt_versions,
neoforge_versions,
all_game_versions,
loaders,
] = await Promise.all([
get_loader_versions('fabric').then(shallowRef).catch(handleError),
get_loader_versions('forge').then(shallowRef).catch(handleError),
get_loader_versions('quilt').then(shallowRef).catch(handleError),
get_loader_versions('neo').then(shallowRef).catch(handleError),
get_game_versions().then(shallowRef).catch(handleError),
get_loaders()
.then((value) =>
ref(
value
.filter((item) => item.supported_project_types.includes('modpack'))
.map((item) => item.name.toLowerCase()),
),
)
.catch((err) => {
handleError(err)
return ref([])
}),
])
loaders.value.unshift('vanilla')
const game_versions = computed(() => {
return all_game_versions.value.versions
.filter((item) => {
let defaultVal = item.type === 'release' || showSnapshots.value
if (loader.value === 'fabric') {
defaultVal &= fabric_versions.value.gameVersions.some((x) => item.id === x.id)
} else if (loader.value === 'forge') {
defaultVal &= forge_versions.value.gameVersions.some((x) => item.id === x.id)
} else if (loader.value === 'quilt') {
defaultVal &= quilt_versions.value.gameVersions.some((x) => item.id === x.id)
} else if (loader.value === 'neoforge') {
defaultVal &= neoforge_versions.value.gameVersions.some((x) => item.id === x.id)
}
return defaultVal
})
.map((item) => item.id)
})
const modal = ref(null)
const check_valid = computed(() => {
return (
profile_name.value.trim() &&
game_version.value &&
game_versions.value.includes(game_version.value)
)
})
const create_instance = async () => {
creating.value = true
const loader_version_value =
loader_version.value === 'other' ? specified_loader_version.value : loader_version.value
const loaderVersion = loader.value === 'vanilla' ? null : (loader_version_value ?? 'stable')
hide()
creating.value = false
await create(
profile_name.value,
game_version.value,
loader.value,
loader.value === 'vanilla' ? null : (loader_version_value ?? 'stable'),
icon.value,
).catch(handleError)
trackEvent('InstanceCreate', {
profile_name: profile_name.value,
game_version: game_version.value,
loader: loader.value,
loader_version: loaderVersion,
has_icon: !!icon.value,
source: 'CreationModal',
})
}
const upload_icon = async () => {
const res = await open({
multiple: false,
filters: [
{
name: 'Image',
extensions: ['png', 'jpeg', 'svg', 'webp', 'gif', 'jpg'],
},
],
})
icon.value = res.path ?? res
if (!icon.value) return
display_icon.value = convertFileSrc(icon.value)
}
const reset_icon = () => {
icon.value = null
display_icon.value = null
}
const selectable_versions = computed(() => {
if (game_version.value) {
if (loader.value === 'fabric') {
return fabric_versions.value.gameVersions[0].loaders.map((item) => item.id)
} else if (loader.value === 'forge') {
return forge_versions.value.gameVersions
.find((item) => item.id === game_version.value)
.loaders.map((item) => item.id)
} else if (loader.value === 'quilt') {
return quilt_versions.value.gameVersions[0].loaders.map((item) => item.id)
} else if (loader.value === 'neoforge') {
return neoforge_versions.value.gameVersions
.find((item) => item.id === game_version.value)
.loaders.map((item) => item.id)
}
}
return []
})
const openFile = async () => {
const newProject = await open({ multiple: false })
if (!newProject) return
hide()
await create_profile_and_install_from_file(newProject.path ?? newProject).catch(handleError)
trackEvent('InstanceCreate', {
source: 'CreationModalFileOpen',
})
}
const profiles = ref(
new Map([
['MultiMC', []],
['GDLauncher', []],
['ATLauncher', []],
['Curseforge', []],
['PrismLauncher', []],
]),
)
const loading = ref(false)
const importedProfiles = ref(0)
const totalProfiles = ref(0)
const selectedProfileType = ref('MultiMC')
const profileOptions = ref([
{ name: 'MultiMC', path: '' },
{ name: 'GDLauncher', path: '' },
{ name: 'ATLauncher', path: '' },
{ name: 'Curseforge', path: '' },
{ name: 'PrismLauncher', path: '' },
])
// Attempt to get import profiles on default paths
const promises = profileOptions.value.map(async (option) => {
const path = await get_default_launcher_path(option.name).catch(handleError)
if (!path || path === '') return
// Try catch to allow failure and simply ignore default path attempt
try {
const instances = await get_importable_instances(option.name, path)
if (!instances) return
profileOptions.value.find((profile) => profile.name === option.name).path = path
profiles.value.set(
option.name,
instances.map((name) => ({ name, selected: false })),
)
} catch {
// Allow failure silently
}
})
await Promise.all(promises)
const selectLauncherPath = async () => {
selectedProfileType.value.path = await open({ multiple: false, directory: true })
if (selectedProfileType.value.path) {
await reload()
}
}
const reload = async () => {
const instances = await get_importable_instances(
selectedProfileType.value.name,
selectedProfileType.value.path,
).catch(handleError)
if (instances) {
profiles.value.set(
selectedProfileType.value.name,
instances.map((name) => ({ name, selected: false })),
)
} else {
profiles.value.set(selectedProfileType.value.name, [])
}
}
const setPath = () => {
profileOptions.value.find((profile) => profile.name === selectedProfileType.value.name).path =
selectedProfileType.value.path
}
const next = async () => {
importedProfiles.value = 0
totalProfiles.value = Array.from(profiles.value.values())
.map((profiles) => profiles.filter((profile) => profile.selected).length)
.reduce((a, b) => a + b, 0)
loading.value = true
for (const launcher of Array.from(profiles.value.entries()).map(([launcher, profiles]) => ({
launcher,
path: profileOptions.value.find((option) => option.name === launcher).path,
profiles,
}))) {
for (const profile of launcher.profiles.filter((profile) => profile.selected)) {
await import_instance(launcher.launcher, launcher.path, profile.name)
.catch(handleError)
.then(() => console.log(`Successfully Imported ${profile.name} from ${launcher.launcher}`))
profile.selected = false
importedProfiles.value++
}
}
loading.value = false
}
</script>
<style lang="scss" scoped>
.modal-body {
display: flex;
flex-direction: column;
gap: var(--gap-md);
margin-top: var(--gap-lg);
}
.input-label {
font-size: 1rem;
font-weight: bolder;
color: var(--color-contrast);
margin-bottom: 0.5rem;
}
.text-input {
width: 20rem;
}
.image-upload {
display: flex;
gap: 1rem;
}
.image-input {
display: flex;
flex-direction: column;
gap: 0.5rem;
justify-content: center;
}
.warning {
font-style: italic;
}
:deep(button.checkbox) {
border: none;
}
.selector {
max-width: 20rem;
}
.labeled-divider {
text-align: center;
}
.labeled-divider:after {
background-color: var(--color-raised-bg);
content: 'Or';
color: var(--color-base);
padding: var(--gap-sm);
position: relative;
top: -0.5rem;
}
.info {
display: flex;
flex-direction: row;
gap: 0.5rem;
align-items: center;
}
.modal-header {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding-bottom: 0;
}
.path-selection {
padding: var(--gap-xl);
background-color: var(--color-bg);
border-radius: var(--radius-lg);
display: flex;
flex-direction: column;
gap: var(--gap-md);
h3 {
margin: 0;
}
.path-input {
display: flex;
align-items: center;
width: 100%;
flex-direction: row;
gap: var(--gap-sm);
.iconified-input {
flex-grow: 1;
:deep(input) {
width: 100%;
flex-basis: auto;
}
}
}
}
.table {
border: 1px solid var(--color-bg);
}
.table-row {
grid-template-columns: min-content auto;
}
.table-content {
max-height: calc(5 * (18px + 2rem));
height: calc(5 * (18px + 2rem));
overflow-y: auto;
}
.select-checkbox {
button.checkbox {
border: none;
}
}
.button-row {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: var(--gap-md);
.transparent {
padding: var(--gap-sm) 0;
}
}
.empty {
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
font-weight: bolder;
color: var(--color-contrast);
}
.card-divider {
margin: var(--gap-md) var(--gap-lg) 0 var(--gap-lg);
}
</style>
@@ -1,7 +1,6 @@
<script setup>
import { DownloadIcon, HeartIcon, TagIcon } from '@modrinth/assets'
import { Avatar, FormattedTag, TagItem } from '@modrinth/ui'
import { formatNumber } from '@modrinth/utils'
import { Avatar, FormattedTag, TagItem, useCompactNumber } from '@modrinth/ui'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import { computed } from 'vue'
@@ -11,6 +10,8 @@ dayjs.extend(relativeTime)
const router = useRouter()
const { formatCompactNumber } = useCompactNumber()
const props = defineProps({
project: {
type: Object,
@@ -96,13 +97,13 @@ const toTransparent = computed(() => {
class="flex items-center gap-1 pr-2 border-0 border-r-[1px] border-solid border-button-border"
>
<DownloadIcon />
{{ formatNumber(project.downloads) }}
{{ formatCompactNumber(project.downloads) }}
</div>
<div
class="flex items-center gap-1 pr-2 border-0 border-r-[1px] border-solid border-button-border"
>
<HeartIcon />
{{ formatNumber(project.follows) }}
{{ formatCompactNumber(project.follows) }}
</div>
<div class="flex items-center gap-1 pr-2">
<TagIcon />
+64 -39
View File
@@ -1,5 +1,7 @@
<template>
<nav
v-if="filteredLinks.length > 1"
ref="scrollContainer"
class="card-shadow experimental-styles-within relative flex w-fit overflow-clip rounded-full bg-bg-raised p-1 text-sm font-bold"
>
<RouterLink
@@ -14,13 +16,17 @@
<span class="text-nowrap">{{ link.label }}</span>
</RouterLink>
<div
:class="`navtabs-transition pointer-events-none absolute h-[calc(100%-0.5rem)] overflow-hidden rounded-full p-1 ${subpageSelected ? 'bg-button-bg' : 'bg-button-bgSelected'}`"
:class="[
'pointer-events-none absolute h-[calc(100%-0.5rem)] overflow-hidden rounded-full p-1',
subpageSelected ? 'bg-button-bg' : 'bg-button-bgSelected',
{ 'navtabs-transition': transitionsEnabled },
]"
:style="{
left: sliderLeftPx,
top: sliderTopPx,
right: sliderRightPx,
bottom: sliderBottomPx,
opacity: sliderLeft === 4 && sliderLeft === sliderRight ? 0 : activeIndex === -1 ? 0 : 1,
opacity: sliderReady && activeIndex !== -1 ? 1 : 0,
}"
aria-hidden="true"
></div>
@@ -28,7 +34,7 @@
</template>
<script setup lang="ts">
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import type { RouteLocationRaw } from 'vue-router'
import { RouterLink, useRoute } from 'vue-router'
@@ -47,13 +53,16 @@ const props = defineProps<{
query?: string
}>()
const scrollContainer = ref<HTMLElement | null>(null)
const sliderLeft = ref(4)
const sliderTop = ref(4)
const sliderRight = ref(4)
const sliderBottom = ref(4)
const activeIndex = ref(-1)
const oldIndex = ref(-1)
const subpageSelected = ref(false)
const sliderReady = ref(false)
const transitionsEnabled = ref(false)
const sliderDelays = ref({ left: '0ms', top: '0ms', right: '0ms', bottom: '0ms' })
const filteredLinks = computed(() =>
props.links.filter((x) => (x.shown === undefined ? true : x.shown)),
@@ -63,6 +72,11 @@ const sliderTopPx = computed(() => `${sliderTop.value}px`)
const sliderRightPx = computed(() => `${sliderRight.value}px`)
const sliderBottomPx = computed(() => `${sliderBottom.value}px`)
const leftDelay = computed(() => sliderDelays.value.left)
const rightDelay = computed(() => sliderDelays.value.right)
const topDelay = computed(() => sliderDelays.value.top)
const bottomDelay = computed(() => sliderDelays.value.bottom)
function pickLink() {
let index = -1
subpageSelected.value = false
@@ -83,62 +97,60 @@ function pickLink() {
if (activeIndex.value !== -1) {
startAnimation()
} else {
oldIndex.value = -1
sliderLeft.value = 0
sliderRight.value = 0
}
}
const tabLinkElements = ref()
function getTabElement(index: number): HTMLElement | null {
if (index === -1) return null
const container = scrollContainer.value
if (!container) return null
const tabs = container.querySelectorAll('.button-animation')
return (tabs[index] as HTMLElement) ?? null
}
function startAnimation() {
const el = tabLinkElements.value[activeIndex.value].$el
if (!el || !el.offsetParent) return
const el = getTabElement(activeIndex.value)
if (!el?.offsetParent) return
const parent = el.offsetParent as HTMLElement
const newValues = {
left: el.offsetLeft,
top: el.offsetTop,
right: el.offsetParent.offsetWidth - el.offsetLeft - el.offsetWidth,
bottom: el.offsetParent.offsetHeight - el.offsetTop - el.offsetHeight,
right: parent.offsetWidth - el.offsetLeft - el.offsetWidth,
bottom: parent.offsetHeight - el.offsetTop - el.offsetHeight,
}
if (sliderLeft.value === 4 && sliderRight.value === 4) {
const isInitialPosition = sliderLeft.value === 4 && sliderRight.value === 4
if (isInitialPosition) {
sliderLeft.value = newValues.left
sliderRight.value = newValues.right
sliderTop.value = newValues.top
sliderBottom.value = newValues.bottom
sliderReady.value = true
requestAnimationFrame(() => {
transitionsEnabled.value = true
})
} else {
const delay = 200
if (newValues.left < sliderLeft.value) {
sliderLeft.value = newValues.left
setTimeout(() => {
sliderRight.value = newValues.right
}, delay)
} else {
sliderRight.value = newValues.right
setTimeout(() => {
sliderLeft.value = newValues.left
}, delay)
}
if (newValues.top < sliderTop.value) {
sliderTop.value = newValues.top
setTimeout(() => {
sliderBottom.value = newValues.bottom
}, delay)
} else {
sliderBottom.value = newValues.bottom
setTimeout(() => {
sliderTop.value = newValues.top
}, delay)
const STAGGER_DELAY = '200ms'
sliderDelays.value = {
left: newValues.left < sliderLeft.value ? '0ms' : STAGGER_DELAY,
right: newValues.left < sliderLeft.value ? STAGGER_DELAY : '0ms',
top: newValues.top < sliderTop.value ? '0ms' : STAGGER_DELAY,
bottom: newValues.top < sliderTop.value ? STAGGER_DELAY : '0ms',
}
sliderLeft.value = newValues.left
sliderRight.value = newValues.right
sliderTop.value = newValues.top
sliderBottom.value = newValues.bottom
}
}
onMounted(() => {
onMounted(async () => {
window.addEventListener('resize', pickLink)
await nextTick()
pickLink()
})
@@ -146,7 +158,17 @@ onUnmounted(() => {
window.removeEventListener('resize', pickLink)
})
watch(route, () => {
watch(
filteredLinks,
async () => {
await nextTick()
pickLink()
},
{ deep: true },
)
watch(route, async () => {
await nextTick()
pickLink()
})
</script>
@@ -154,7 +176,10 @@ watch(route, () => {
.navtabs-transition {
/* Delay on opacity is to hide any jankiness as the page loads */
transition:
all 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s,
left 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(leftDelay),
right 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(rightDelay),
top 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(topDelay),
bottom 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(bottomDelay),
opacity 250ms cubic-bezier(0.5, 0, 0.2, 1) 50ms;
}
</style>
@@ -49,27 +49,26 @@ onUnmounted(() => {
</script>
<template>
<NavButton
v-for="instance in recentInstances"
:key="instance.id"
v-tooltip.right="instance.name"
:to="`/instance/${encodeURIComponent(instance.path)}`"
class="relative"
>
<Avatar
:src="instance.icon_path ? convertFileSrc(instance.icon_path) : null"
size="28px"
:tint-by="instance.path"
:class="`transition-all ${instance.install_stage !== 'installed' ? `brightness-[0.25] scale-[0.85]` : `group-hover:brightness-75`}`"
/>
<div
v-if="instance.install_stage !== 'installed'"
class="absolute inset-0 flex items-center justify-center z-10"
>
<SpinnerIcon class="animate-spin w-4 h-4" />
</div>
</NavButton>
<div v-if="recentInstances.length > 0" class="h-px w-6 mx-auto my-2 bg-divider"></div>
<div v-for="instance in recentInstances" :key="instance.id" v-tooltip.right="instance.name">
<NavButton :to="`/instance/${encodeURIComponent(instance.path)}`" class="relative">
<Avatar
:src="instance.icon_path ? convertFileSrc(instance.icon_path) : null"
size="28px"
:tint-by="instance.path"
:class="`transition-all ${instance.install_stage !== 'installed' ? `brightness-[0.25] scale-[0.85]` : `group-hover:brightness-75`}`"
/>
<div
v-if="instance.install_stage !== 'installed'"
class="absolute inset-0 flex items-center justify-center z-10 pointer-events-none"
>
<SpinnerIcon class="animate-spin w-4 h-4" />
</div>
</NavButton>
</div>
<div
v-if="instances && recentInstances.length > 0"
class="h-px w-6 mx-auto my-2 bg-divider"
></div>
</template>
<style scoped lang="scss"></style>
@@ -52,10 +52,12 @@
<h3 class="info-title">
{{ loadingBar.title }}
</h3>
<ProgressBar :progress="Math.floor((100 * loadingBar.current) / loadingBar.total)" />
<div class="row">
{{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
{{ loadingBar.message }}
<div class="flex flex-col gap-2 w-full">
<ProgressBar :progress="Math.floor((100 * loadingBar.current) / loadingBar.total)" />
<div class="row">
{{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
{{ loadingBar.message }}
</div>
</div>
</div>
</Card>
@@ -346,7 +348,7 @@ onBeforeUnmount(() => {
.info-card {
position: absolute;
top: 3.5rem;
right: 0.5rem;
right: 2rem;
z-index: 9;
width: 20rem;
background-color: var(--color-raised-bg);
@@ -420,7 +422,7 @@ onBeforeUnmount(() => {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.5rem;
gap: 0.75rem;
margin: 0;
padding: 0;
}
@@ -1,6 +1,6 @@
<template>
<ProjectCard
:title="project.title"
:title="project.name"
:link="
() => {
emit('open')
@@ -12,7 +12,7 @@
"
:author="{ name: project.author, link: `https://modrinth.com/user/${project.author}` }"
:icon-url="project.icon_url"
:summary="project.description"
:summary="project.summary"
:tags="project.display_categories"
:all-tags="project.categories"
:downloads="project.downloads"
@@ -21,13 +21,11 @@
:banner="project.featured_gallery ?? undefined"
:color="project.color ?? undefined"
:environment="
projectType
? ['mod', 'modpack'].includes(projectType)
? {
clientSide: project.client_side,
serverSide: project.server_side,
}
: undefined
['mod', 'modpack'].includes(projectType)
? {
clientSide: project.client_side?.[0],
serverSide: project.server_side?.[0],
}
: undefined
"
layout="list"
@@ -39,7 +37,8 @@
class="shrink-0 no-wrap"
@click.stop="install()"
>
<template v-if="!installed">
<SpinnerIcon v-if="installing" class="animate-spin" />
<template v-else-if="!installed">
<DownloadIcon v-if="modpack || instance" />
<PlusIcon v-else />
</template>
@@ -60,14 +59,17 @@
</template>
<script setup>
import { CheckIcon, DownloadIcon, PlusIcon } from '@modrinth/assets'
import { CheckIcon, DownloadIcon, PlusIcon, SpinnerIcon } from '@modrinth/assets'
import { ButtonStyled, injectNotificationManager, ProjectCard } from '@modrinth/ui'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import { computed, ref } from 'vue'
import { useRouter } from 'vue-router'
import { install as installVersion } from '@/store/install.js'
import { injectContentInstall } from '@/providers/content-install'
const { install: installVersion } = injectContentInstall()
dayjs.extend(relativeTime)
const { handleError } = injectNotificationManager()
@@ -99,6 +101,14 @@ const props = defineProps({
type: String,
default: undefined,
},
activeLoader: {
type: String,
default: null,
},
activeGameVersion: {
type: String,
default: null,
},
})
const emit = defineEmits(['open', 'install'])
@@ -112,15 +122,21 @@ async function install() {
null,
props.instance ? props.instance.path : null,
'SearchCard',
() => {
(versionId) => {
installing.value = false
emit('install', props.project.project_id ?? props.project.id)
if (versionId) {
emit('install', props.project.project_id ?? props.project.id)
}
},
(profile) => {
router.push(`/instance/${profile}`)
},
{
preferredLoader: props.activeLoader ?? undefined,
preferredGameVersion: props.activeGameVersion ?? undefined,
},
).catch(handleError)
}
const modpack = computed(() => props.project.project_type === 'modpack')
const modpack = computed(() => props.project.project_types?.includes('modpack'))
</script>
@@ -6,9 +6,10 @@ import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import SearchCard from '@/components/ui/SearchCard.vue'
import { get_project, get_version } from '@/helpers/cache.js'
import { get_categories } from '@/helpers/tags.js'
import { install as installVersion } from '@/store/install.js'
import { injectContentInstall } from '@/providers/content-install'
const { handleError } = injectNotificationManager()
const { install: installVersion } = injectContentInstall()
const confirmModal = ref(null)
const project = ref(null)
@@ -1,84 +0,0 @@
<script setup lang="ts">
import { XIcon } from '@modrinth/assets'
import { ButtonStyled, commonMessages, defineMessages, useVIntl } from '@modrinth/ui'
import { getVersion } from '@tauri-apps/api/app'
import { onMounted, onUnmounted, ref } from 'vue'
const { formatMessage } = useVIntl()
const dismissed = ref(false)
const availableUpdate = ref<{ version: string } | null>(null)
let checkInterval: ReturnType<typeof setInterval> | null = null
async function checkForUpdate() {
try {
const [response, currentVersion] = await Promise.all([
fetch('https://launcher-files.modrinth.com/updates.json'),
getVersion(),
])
const updates = await response.json()
const latestVersion = updates?.version
if (latestVersion && latestVersion !== currentVersion) {
if (latestVersion !== availableUpdate.value?.version) {
availableUpdate.value = { version: latestVersion }
dismissed.value = false
}
}
} catch (e) {
console.error('Failed to check for updates:', e)
}
}
function dismiss() {
dismissed.value = true
}
onMounted(() => {
checkForUpdate()
checkInterval = setInterval(checkForUpdate, 5 * 60 * 1000)
})
onUnmounted(() => {
if (checkInterval) {
clearInterval(checkInterval)
}
})
const messages = defineMessages({
title: {
id: 'app.update-toast.title',
defaultMessage: 'Update available',
},
body: {
id: 'app.update-toast.body.linux',
defaultMessage:
'Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!',
},
download: {
id: 'app.update-toast.download-page',
defaultMessage: 'Download',
},
})
</script>
<template>
<div
v-if="availableUpdate && !dismissed"
class="grid grid-cols-[min-content] fixed card-shadow rounded-2xl top-[--top-bar-height] mt-6 right-6 p-4 z-10 bg-bg-raised border-surface-5 border-solid border-[2px]"
>
<div class="flex min-w-[25rem] gap-4">
<h2 class="whitespace-nowrap text-base text-contrast font-semibold m-0 grow">
{{ formatMessage(messages.title) }}
</h2>
<ButtonStyled size="small" circular>
<button v-tooltip="formatMessage(commonMessages.closeButton)" @click="dismiss">
<XIcon />
</button>
</ButtonStyled>
</div>
<p class="text-sm mt-2 mb-0">
{{ formatMessage(messages.body, { version: availableUpdate.version }) }}
</p>
</div>
</template>
@@ -1,130 +0,0 @@
<script setup lang="ts">
import { DownloadIcon, ExternalIcon, RefreshCwIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, commonMessages, defineMessages, ProgressBar, useVIntl } from '@modrinth/ui'
import { formatBytes } from '@modrinth/utils'
import { ref } from 'vue'
import { injectAppUpdateDownloadProgress } from '@/providers/download-progress.ts'
const { formatMessage } = useVIntl()
const emit = defineEmits<{
(e: 'close' | 'restart' | 'download'): void
}>()
defineProps<{
version: string
size: number | null
metered: boolean
}>()
const downloading = ref(false)
const { progress } = injectAppUpdateDownloadProgress()
function download() {
emit('download')
downloading.value = true
}
const messages = defineMessages({
title: {
id: 'app.update-toast.title',
defaultMessage: 'Update available',
},
body: {
id: 'app.update-toast.body',
defaultMessage:
'Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App.',
},
reload: {
id: 'app.update-toast.reload',
defaultMessage: 'Reload',
},
download: {
id: 'app.update-toast.download',
defaultMessage: 'Download ({size})',
},
downloading: {
id: 'app.update-toast.downloading',
defaultMessage: 'Downloading...',
},
changelog: {
id: 'app.update-toast.changelog',
defaultMessage: 'Changelog',
},
meteredBody: {
id: 'app.update-toast.body.metered',
defaultMessage: `Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it.`,
},
downloadCompleteTitle: {
id: 'app.update-toast.title.download-complete',
defaultMessage: 'Download complete',
},
downloadedBody: {
id: 'app.update-toast.body.download-complete',
defaultMessage: `Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App.`,
},
})
</script>
<template>
<div
class="grid grid-cols-[min-content] fixed card-shadow rounded-2xl top-[--top-bar-height] mt-6 right-6 p-4 z-10 bg-bg-raised border-surface-5 border-solid border-[2px]"
:class="{
'download-complete': progress === 1,
}"
>
<div class="flex min-w-[25rem] gap-4">
<h2 class="whitespace-nowrap text-base text-contrast font-semibold m-0 grow">
{{
formatMessage(metered && progress === 1 ? messages.downloadCompleteTitle : messages.title)
}}
</h2>
<ButtonStyled size="small" circular>
<button v-tooltip="formatMessage(commonMessages.closeButton)" @click="emit('close')">
<XIcon />
</button>
</ButtonStyled>
</div>
<p class="text-sm mt-2 mb-0">
{{
formatMessage(
metered
? progress === 1
? messages.downloadedBody
: messages.meteredBody
: messages.body,
{ version },
)
}}
</p>
<p
v-if="metered && progress < 1"
class="text-sm text-secondary mt-2 mb-0 flex items-center gap-1"
>
<template v-if="progress > 0">
<ProgressBar :progress="progress" class="max-w-[unset]" />
</template>
</p>
<div class="flex gap-2 mt-4">
<ButtonStyled color="brand">
<button v-if="metered && progress < 1" :disabled="downloading" @click="download">
<SpinnerIcon v-if="downloading" class="animate-spin" />
<DownloadIcon v-else />
{{
formatMessage(downloading ? messages.downloading : messages.download, {
size: formatBytes(size ?? 0),
})
}}
</button>
<button v-else @click="emit('restart')">
<RefreshCwIcon /> {{ formatMessage(messages.reload) }}
</button>
</ButtonStyled>
<ButtonStyled>
<a href="https://modrinth.com/news/changelog?filter=app">
{{ formatMessage(messages.changelog) }} <ExternalIcon />
</a>
</ButtonStyled>
</div>
</div>
</template>
@@ -0,0 +1,125 @@
<script setup>
import { CheckIcon, PlusIcon, SearchIcon } from '@modrinth/assets'
import {
Admonition,
Avatar,
ButtonStyled,
injectNotificationManager,
StyledInput,
} from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { computed, ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
import { list } from '@/helpers/profile'
import { add_server_to_profile, get_profile_worlds } from '@/helpers/worlds.ts'
const { handleError } = injectNotificationManager()
const modal = ref()
const searchFilter = ref('')
const profiles = ref([])
const serverName = ref('')
const serverAddress = ref('')
const shownProfiles = computed(() =>
profiles.value.filter((profile) => {
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
}),
)
defineExpose({
show: async (name, address) => {
serverName.value = name
serverAddress.value = address
searchFilter.value = ''
const profilesVal = await list().catch(handleError)
await Promise.allSettled(
profilesVal.map(async (profile) => {
profile.adding = false
profile.added = false
try {
const worlds = await get_profile_worlds(profile.path)
profile.added = worlds.some(
(w) => w.type === 'server' && w.address === serverAddress.value,
)
} catch {
// Ignore - will show as not added
}
}),
)
profiles.value = profilesVal
modal.value.show()
trackEvent('AddServerToInstanceStart', { source: 'AddServerToInstanceModal' })
},
})
async function addServer(profile) {
profile.adding = true
try {
await add_server_to_profile(profile.path, serverName.value, serverAddress.value, 'prompt')
profile.added = true
trackEvent('AddServerToInstance', {
server_name: serverName.value,
instance_name: profile.name,
source: 'AddServerToInstanceModal',
})
} catch (err) {
handleError(err)
}
profile.adding = false
}
</script>
<template>
<ModalWrapper ref="modal" header="Add server to instance">
<div class="flex flex-col gap-4 min-w-[350px]">
<Admonition type="warning" body="This server may not be compatible with all instances." />
<StyledInput
v-model="searchFilter"
:icon="SearchIcon"
type="search"
placeholder="Search for an instance"
autocomplete="off"
/>
<div class="max-h-[21rem] overflow-y-auto">
<div
v-for="profile in shownProfiles"
:key="profile.path"
class="flex w-full items-center justify-between gap-2 bg-bg-raised text-icon shadow-none"
>
<router-link
class="btn btn-transparent p-2 text-left"
:to="`/instance/${encodeURIComponent(profile.path)}`"
@click="modal.hide()"
>
<Avatar
:src="profile.icon_path ? convertFileSrc(profile.icon_path) : null"
class="mr-2 [--size:2rem]"
/>
{{ profile.name }}
</router-link>
<ButtonStyled>
<button :disabled="profile.added || profile.adding" @click="addServer(profile)">
<PlusIcon v-if="!profile.added && !profile.adding" />
<CheckIcon v-else-if="profile.added" />
{{ profile.adding ? 'Adding...' : profile.added ? 'Added' : 'Add' }}
</button>
</ButtonStyled>
</div>
</div>
<div class="input-group push-right">
<ButtonStyled>
<button @click="modal.hide()">Cancel</button>
</ButtonStyled>
</div>
</div>
</ModalWrapper>
</template>
@@ -17,31 +17,17 @@
<tr class="content">
<td class="data">{{ instance?.loader }} {{ instance?.game_version }}</td>
<td>
<multiselect
<Combobox
v-if="versions?.length > 1"
v-model="selectedVersion"
:options="versions"
v-model="selectedVersionId"
:options="versionOptions"
:searchable="true"
placeholder="Select version"
open-direction="top"
:show-labels="false"
:custom-label="
(version) =>
`${version?.name} (${version?.loaders
.map((name) => formatLoader(formatMessage, name))
.join(', ')} - ${version?.game_versions.join(', ')})`
"
force-direction="up"
:max-height="150"
/>
<span v-else>
<span>
{{ selectedVersion?.name }} ({{
selectedVersion?.loaders
.map((name) => formatLoader(formatMessage, name))
.join(', ')
}}
- {{ selectedVersion?.game_versions.join(', ') }})
</span>
<span>{{ selectedVersionLabel }}</span>
</span>
</td>
</tr>
@@ -59,9 +45,8 @@
<script setup>
import { DownloadIcon, XIcon } from '@modrinth/assets'
import { Button, formatLoader, injectNotificationManager, useVIntl } from '@modrinth/ui'
import { ref } from 'vue'
import Multiselect from 'vue-multiselect'
import { Button, Combobox, formatLoader, injectNotificationManager, useVIntl } from '@modrinth/ui'
import { computed, ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
@@ -79,11 +64,35 @@ const installing = ref(false)
const onInstall = ref(() => {})
const selectedVersionLabel = computed(() => {
if (!selectedVersion.value) return ''
return `${selectedVersion.value.name} (${selectedVersion.value.loaders
.map((name) => formatLoader(formatMessage, name))
.join(', ')} - ${selectedVersion.value.game_versions.join(', ')})`
})
const versionOptions = computed(() =>
(versions.value ?? []).map((version) => ({
value: version.id,
label: `${version.name} (${version.loaders
.map((name) => formatLoader(formatMessage, name))
.join(', ')} - ${version.game_versions.join(', ')})`,
})),
)
const selectedVersionId = computed({
get: () => selectedVersion.value?.id ?? null,
set: (value) => {
if (!value) return
selectedVersion.value = (versions.value ?? []).find((version) => version.id === value) ?? null
},
})
defineExpose({
show: (instanceVal, projectVal, projectVersions, selected, callback) => {
instance.value = instanceVal
versions.value = projectVersions
selectedVersion.value = selected ?? projectVersions[0]
versions.value = projectVersions ?? []
selectedVersion.value = selected ?? projectVersions?.[0] ?? null
project.value = projectVal
@@ -162,9 +171,5 @@ td:first-child {
display: flex;
flex-direction: column;
gap: 1rem;
:deep(.animated-dropdown .options) {
max-height: 13.375rem;
}
}
</style>
@@ -1,77 +0,0 @@
<script setup>
import { DownloadIcon, XIcon } from '@modrinth/assets'
import { Button, injectNotificationManager } from '@modrinth/ui'
import { ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
import { create_profile_and_install as pack_install } from '@/helpers/pack'
const { handleError } = injectNotificationManager()
const versionId = ref()
const project = ref()
const confirmModal = ref(null)
const installing = ref(false)
const onInstall = ref(() => {})
const onCreateInstance = ref(() => {})
defineExpose({
show: (projectVal, versionIdVal, callback, createInstanceCallback) => {
project.value = projectVal
versionId.value = versionIdVal
installing.value = false
confirmModal.value.show()
onInstall.value = callback
onCreateInstance.value = createInstanceCallback
trackEvent('PackInstallStart')
},
})
async function install() {
installing.value = true
confirmModal.value.hide()
await pack_install(
project.value.id,
versionId.value,
project.value.title,
project.value.icon_url,
onCreateInstance.value,
).catch(handleError)
trackEvent('PackInstall', {
id: project.value.id,
version_id: versionId.value,
title: project.value.title,
source: 'ConfirmModal',
})
onInstall.value(versionId.value)
installing.value = false
}
</script>
<template>
<ModalWrapper ref="confirmModal" header="Are you sure?" :on-hide="onInstall">
<div class="modal-body">
<p>You already have this modpack installed. Are you sure you want to install it again?</p>
<div class="input-group push-right">
<Button @click="() => $refs.confirmModal.hide()"><XIcon />Cancel</Button>
<Button color="primary" :disabled="installing" @click="install()"
><DownloadIcon /> {{ installing ? 'Installing' : 'Install' }}</Button
>
</div>
</div>
</ModalWrapper>
</template>
<style lang="scss" scoped>
.modal-body {
display: flex;
flex-direction: column;
gap: 1rem;
}
</style>
@@ -16,6 +16,7 @@ import { useRouter } from 'vue-router'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_project_v3_many } from '@/helpers/cache.js'
import {
add_project_from_version as installMod,
check_installed,
@@ -49,19 +50,14 @@ const creatingInstance = ref(false)
const profiles = ref([])
const shownProfiles = computed(() =>
profiles.value
.filter((profile) => {
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
})
.filter((profile) => {
const version = {
game_versions: versions.value.flatMap((v) => v.game_versions),
loaders: versions.value.flatMap((v) => v.loaders),
}
return isVersionCompatible(version, project.value, profile)
}),
profiles.value.filter((profile) => {
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
}),
)
const isProfileCompatible = (profile) =>
versions.value?.some((version) => isVersionCompatible(version, project.value, profile))
const onInstall = ref(() => {})
defineExpose({
@@ -86,6 +82,22 @@ defineExpose({
handleError,
)
}
const linkedProjectIds = profilesVal
.filter((p) => p.linked_data?.project_id)
.map((p) => p.linked_data.project_id)
if (linkedProjectIds.length > 0) {
const linkedProjects = await get_project_v3_many(linkedProjectIds, 'must_revalidate').catch(
() => [],
)
const serverProjectIds = new Set(
linkedProjects.filter((p) => p?.minecraft_server != null).map((p) => p.id),
)
for (const profile of profilesVal) {
profile.isServerInstance = serverProjectIds.has(profile.linked_data?.project_id)
}
}
profiles.value = profilesVal
installModal.value.show()
@@ -164,13 +176,13 @@ const createInstance = async () => {
const gameVersion = gameVersions[0]
const loaders = versions.value[0].loaders
const loader = loaders.contains('fabric')
const loader = loaders.includes('fabric')
? 'fabric'
: loaders.contains('neoforge')
: loaders.includes('neoforge')
? 'neoforge'
: loaders.contains('forge')
: loaders.includes('forge')
? 'forge'
: loaders.contains('quilt')
: loaders.includes('quilt')
? 'quilt'
: 'vanilla'
@@ -240,17 +252,23 @@ const createInstance = async () => {
"
>
<Button
:disabled="profile.installedMod || profile.installing"
:disabled="
!isProfileCompatible(profile) || profile.installedMod || profile.installing
"
@click="install(profile)"
>
<DownloadIcon v-if="!profile.installedMod && !profile.installing" />
<DownloadIcon
v-if="isProfileCompatible(profile) && !profile.installedMod && !profile.installing"
/>
<CheckIcon v-else-if="profile.installedMod" />
{{
profile.installing
? 'Installing...'
: profile.installedMod
? 'Installed'
: 'Install'
: !isProfileCompatible(profile)
? 'Incompatible'
: 'Install'
}}
</Button>
</div>
@@ -15,11 +15,12 @@ import { open } from '@tauri-apps/plugin-dialog'
import { computed, type Ref, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
import ConfirmDeleteInstanceModal from '@/components/ui/modal/ConfirmDeleteInstanceModal.vue'
import { trackEvent } from '@/helpers/analytics'
import { duplicate, edit, edit_icon, list, remove } from '@/helpers/profile'
import { injectInstanceSettings } from '@/providers/instance-settings'
import type { GameInstance, InstanceSettingsTabProps } from '../../../helpers/types'
import type { GameInstance } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
@@ -27,21 +28,21 @@ const router = useRouter()
const deleteConfirmModal = ref()
const props = defineProps<InstanceSettingsTabProps>()
const { instance } = injectInstanceSettings()
const title = ref(props.instance.name)
const icon: Ref<string | undefined> = ref(props.instance.icon_path)
const groups = ref(props.instance.groups)
const title = ref(instance.name)
const icon: Ref<string | undefined> = ref(instance.icon_path)
const groups = ref(instance.groups)
const newCategoryInput = ref('')
const installing = computed(() => props.instance.install_stage !== 'installed')
const installing = computed(() => instance.install_stage !== 'installed')
async function duplicateProfile() {
await duplicate(props.instance.path).catch(handleError)
await duplicate(instance.path).catch(handleError)
trackEvent('InstanceDuplicate', {
loader: props.instance.loader,
game_version: props.instance.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
}
@@ -52,7 +53,7 @@ const availableGroups = computed(() => [
async function resetIcon() {
icon.value = undefined
await edit_icon(props.instance.path, null).catch(handleError)
await edit_icon(instance.path, null).catch(handleError)
trackEvent('InstanceRemoveIcon')
}
@@ -70,7 +71,7 @@ async function setIcon() {
if (!value) return
icon.value = value
await edit_icon(props.instance.path, icon.value).catch(handleError)
await edit_icon(instance.path, icon.value).catch(handleError)
trackEvent('InstanceSetIcon')
}
@@ -100,7 +101,8 @@ const addCategory = () => {
watch(
[title, groups, groups],
async () => {
await edit(props.instance.path, editProfileObject.value)
if (removing.value) return
await edit(instance.path, editProfileObject.value).catch(handleError)
},
{ deep: true },
)
@@ -108,15 +110,15 @@ watch(
const removing = ref(false)
async function removeProfile() {
removing.value = true
await remove(props.instance.path).catch(handleError)
removing.value = false
const path = instance.path
trackEvent('InstanceRemove', {
loader: props.instance.loader,
game_version: props.instance.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
await router.push({ path: '/' })
await remove(path).catch(handleError)
}
const messages = defineMessages({
@@ -194,15 +196,7 @@ const messages = defineMessages({
</script>
<template>
<ConfirmModalWrapper
ref="deleteConfirmModal"
title="Are you sure you want to delete this instance?"
description="If you proceed, all data for your instance will be permanently erased, including your worlds. You will not be able to recover it."
:has-to-type="false"
proceed-label="Delete"
:show-ad-on-close="false"
@proceed="removeProfile"
/>
<ConfirmDeleteInstanceModal ref="deleteConfirmModal" @delete="removeProfile" />
<div class="block">
<div class="float-end ml-4 relative group">
<OverflowMenu
@@ -225,7 +219,7 @@ const messages = defineMessages({
:src="icon ? convertFileSrc(icon) : icon"
size="108px"
class="!border-4 group-hover:brightness-75"
:tint-by="props.instance.path"
:tint-by="instance.path"
no-shadow
/>
<div class="absolute top-0 right-0 m-2">
@@ -10,22 +10,21 @@ import { computed, ref, watch } from 'vue'
import { edit } from '@/helpers/profile'
import { get } from '@/helpers/settings.ts'
import { injectInstanceSettings } from '@/providers/instance-settings'
import type { AppSettings, Hooks, InstanceSettingsTabProps } from '../../../helpers/types'
import type { AppSettings, Hooks } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const props = defineProps<InstanceSettingsTabProps>()
const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as AppSettings
const overrideHooks = ref(
!!props.instance.hooks.pre_launch ||
!!props.instance.hooks.wrapper ||
!!props.instance.hooks.post_exit,
!!instance.hooks.pre_launch || !!instance.hooks.wrapper || !!instance.hooks.post_exit,
)
const hooks = ref(props.instance.hooks ?? globalSettings.hooks)
const hooks = ref(instance.hooks ?? globalSettings.hooks)
const editProfileObject = computed(() => {
const editProfile: {
@@ -41,7 +40,7 @@ const editProfileObject = computed(() => {
watch(
[overrideHooks, hooks],
async () => {
await edit(props.instance.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -1,59 +1,41 @@
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
DownloadIcon,
getLoaderIcon,
HammerIcon,
IssuesIcon,
SpinnerIcon,
TransferIcon,
UndoIcon,
UnlinkIcon,
UnplugIcon,
WrenchIcon,
} from '@modrinth/assets'
import {
Avatar,
ButtonStyled,
Checkbox,
Chips,
Combobox,
commonMessages,
defineMessages,
formatLoader,
formatLoaderLabel,
injectNotificationManager,
InstallationSettingsLayout,
provideAppBackup,
provideInstallationSettings,
useVIntl,
} from '@modrinth/ui'
import type { GameVersionTag, PlatformTag, Project, Version } from '@modrinth/utils'
import dayjs from 'dayjs'
import { computed, type ComputedRef, type Ref, ref, shallowRef, watch } from 'vue'
import type { GameVersionTag, PlatformTag } from '@modrinth/utils'
import { useQuery, useQueryClient } from '@tanstack/vue-query'
import { computed, ref, shallowRef } from 'vue'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
import ModpackVersionModal from '@/components/ui/ModpackVersionModal.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_project, get_version_many } from '@/helpers/cache'
import { get_project_versions, get_version } from '@/helpers/cache'
import { get_loader_versions } from '@/helpers/metadata'
import { edit, install, update_repair_modrinth } from '@/helpers/profile'
import {
duplicate,
edit,
get_linked_modpack_info,
install,
list,
update_managed_modrinth_version,
update_repair_modrinth,
} from '@/helpers/profile'
import { get_game_versions, get_loaders } from '@/helpers/tags'
import { injectInstanceSettings } from '@/providers/instance-settings'
import type {
InstanceSettingsTabProps,
Manifest,
ManifestLoaderVersion,
} from '../../../helpers/types'
import type { Manifest } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const queryClient = useQueryClient()
const repairConfirmModal = ref()
const modpackVersionModal = ref()
const modalConfirmUnpair = ref()
const modalConfirmReinstall = ref()
const props = defineProps<InstanceSettingsTabProps>()
const loader = ref(props.instance.loader)
const gameVersion = ref(props.instance.game_version)
const showSnapshots = ref(false)
const { instance, offline, isMinecraftServer, onUnlinked } = injectInstanceSettings()
const [
fabric_versions,
@@ -90,730 +72,208 @@ const [
.catch(handleError),
])
const modpackProject: Ref<Project | null> = ref(null)
const modpackVersion: Ref<Version | null> = ref(null)
const modpackVersions: Ref<Version[] | null> = ref(null)
const fetching = ref(true)
if (props.instance.linked_data && props.instance.linked_data.project_id && !props.offline) {
get_project(props.instance.linked_data.project_id, 'must_revalidate')
.then((project) => {
modpackProject.value = project
if (project && project.versions) {
get_version_many(project.versions, 'must_revalidate')
.then((versions: Version[]) => {
modpackVersions.value = versions.sort((a, b) =>
dayjs(b.date_published).diff(dayjs(a.date_published)),
)
modpackVersion.value =
versions.find(
(version: Version) => version.id === props.instance.linked_data?.version_id,
) ?? null
})
.catch(handleError)
.finally(() => {
fetching.value = false
})
}
})
.catch((err) => {
handleError(err)
fetching.value = false
})
} else {
fetching.value = false
}
const currentLoaderIcon = computed(() => getLoaderIcon(props.instance.loader))
const gameVersionsForLoader = computed(() => {
return all_game_versions?.value.filter((item) => {
if (loader.value === 'fabric') {
return !!fabric_versions?.value.gameVersions.some((x) => item.version === x.id)
} else if (loader.value === 'forge') {
return !!forge_versions?.value.gameVersions.some((x) => item.version === x.id)
} else if (loader.value === 'quilt') {
return !!quilt_versions?.value.gameVersions.some((x) => item.version === x.id)
} else if (loader.value === 'neoforge') {
return !!neoforge_versions?.value.gameVersions.some((x) => item.version === x.id)
}
return []
})
const { data: modpackInfo } = useQuery({
queryKey: computed(() => ['linkedModpackInfo', instance.path]),
queryFn: () => get_linked_modpack_info(instance.path, 'must_revalidate'),
enabled: computed(() => !!instance.linked_data?.project_id && !offline),
})
const hasSnapshots = computed(() =>
gameVersionsForLoader.value?.some((x) => x.version_type !== 'release'),
)
const selectableGameVersionNumbers = computed(() => {
return gameVersionsForLoader.value
?.filter((x) => x.version_type === 'release' || showSnapshots.value)
.map((x) => x.version)
})
const gameVersionOptions = computed(() =>
(selectableGameVersionNumbers.value ?? []).map((v) => ({ value: v, label: v })),
)
const loaderVersionOptions = computed(() =>
(selectableLoaderVersions.value ?? []).map((opt, index) => ({ value: index, label: opt.id })),
)
const loaderVersionLabel = computed(() => {
const idx = loaderVersionIndex.value
return idx >= 0 && selectableLoaderVersions.value
? selectableLoaderVersions.value[idx]?.id
: 'Select version'
})
const selectableLoaderVersions: ComputedRef<ManifestLoaderVersion[] | undefined> = computed(() => {
if (gameVersion.value) {
if (loader.value === 'fabric') {
return fabric_versions?.value.gameVersions[0].loaders
} else if (loader.value === 'forge') {
return forge_versions?.value?.gameVersions?.find((item) => item.id === gameVersion.value)
?.loaders
} else if (loader.value === 'quilt') {
return quilt_versions?.value.gameVersions[0].loaders
} else if (loader.value === 'neoforge') {
return neoforge_versions?.value?.gameVersions?.find((item) => item.id === gameVersion.value)
?.loaders
}
}
return []
})
const loaderVersionIndex: Ref<number> = ref(-1)
resetLoaderVersionIndex()
function resetLoaderVersionIndex() {
loaderVersionIndex.value =
selectableLoaderVersions.value?.findIndex((x) => x.id === props.instance.loader_version) ?? -1
}
const isValid = computed(() => {
return (
selectableGameVersionNumbers.value?.includes(gameVersion.value) &&
((loaderVersionIndex.value !== undefined && loaderVersionIndex.value >= 0) ||
loader.value === 'vanilla')
)
})
const isChanged = computed(() => {
return (
loader.value !== props.instance.loader ||
gameVersion.value !== props.instance.game_version ||
(loader.value !== 'vanilla' &&
loaderVersionIndex.value !== undefined &&
loaderVersionIndex.value >= 0 &&
selectableLoaderVersions.value?.[loaderVersionIndex.value].id !==
props.instance.loader_version)
)
})
watch(loader, () => {
loaderVersionIndex.value = 0
})
const editing = ref(false)
async function saveGvLoaderEdits() {
editing.value = true
const editProfile: { loader?: string; game_version?: string; loader_version?: string } = {}
editProfile.loader = loader.value
editProfile.game_version = gameVersion.value
if (loader.value !== 'vanilla' && loaderVersionIndex.value !== undefined) {
editProfile.loader_version = selectableLoaderVersions.value?.[loaderVersionIndex.value].id
} else {
loaderVersionIndex.value = -1
}
console.log('Editing:')
console.log(loader.value)
await edit(props.instance.path, editProfile).catch(handleError)
await repairProfile(false)
editing.value = false
}
const installing = computed(() => props.instance.install_stage !== 'installed')
const repairing = ref(false)
const reinstalling = ref(false)
const changingVersion = ref(false)
async function repairProfile(force: boolean) {
if (force) {
repairing.value = true
}
await install(props.instance.path, force).catch(handleError)
if (force) {
repairing.value = false
}
trackEvent('InstanceRepair', {
loader: props.instance.loader,
game_version: props.instance.game_version,
})
}
async function unpairProfile() {
await edit(props.instance.path, {
linked_data: null,
})
modpackProject.value = null
modpackVersion.value = null
modpackVersions.value = null
modalConfirmUnpair.value.hide()
}
async function repairModpack() {
reinstalling.value = true
await update_repair_modrinth(props.instance.path).catch(handleError)
reinstalling.value = false
trackEvent('InstanceRepair', {
loader: props.instance.loader,
game_version: props.instance.game_version,
})
}
const messages = defineMessages({
cannotWhileInstalling: {
id: 'instance.settings.tabs.installation.tooltip.cannot-while-installing',
defaultMessage: 'Cannot {action} while installing',
},
cannotWhileOffline: {
id: 'instance.settings.tabs.installation.tooltip.cannot-while-offline',
defaultMessage: 'Cannot {action} while offline',
},
cannotWhileRepairing: {
id: 'instance.settings.tabs.installation.tooltip.cannot-while-repairing',
defaultMessage: 'Cannot {action} while repairing',
},
currentlyInstalled: {
id: 'instance.settings.tabs.installation.currently-installed',
defaultMessage: 'Currently installed',
},
platform: {
id: 'instance.settings.tabs.installation.platform',
defaultMessage: 'Platform',
},
gameVersion: {
id: 'instance.settings.tabs.installation.game-version',
defaultMessage: 'Game version',
},
loaderVersion: {
id: 'instance.settings.tabs.installation.loader-version',
defaultMessage: '{loader} version',
},
showAllVersions: {
id: 'instance.settings.tabs.installation.show-all-versions',
defaultMessage: 'Show all versions',
})
function getManifest(loader: string) {
const map: Record<string, typeof fabric_versions> = {
fabric: fabric_versions,
forge: forge_versions,
quilt: quilt_versions,
neoforge: neoforge_versions,
}
return map[loader]
}
provideAppBackup({
async createBackup() {
const allProfiles = await list()
const prefix = `${instance.name} - Backup #`
const existingNums = allProfiles
.filter((p) => p.name.startsWith(prefix))
.map((p) => parseInt(p.name.slice(prefix.length), 10))
.filter((n) => !isNaN(n))
const nextNum = existingNums.length > 0 ? Math.max(...existingNums) + 1 : 1
const newPath = await duplicate(instance.path)
await edit(newPath, { name: `${prefix}${nextNum}` })
},
install: {
id: 'instance.settings.tabs.installation.install',
defaultMessage: 'Install',
})
provideInstallationSettings({
loading: ref(false),
installationInfo: computed(() => {
const rows = [
{
label: formatMessage(commonMessages.platformLabel),
value: formatLoaderLabel(instance.loader),
},
{
label: formatMessage(commonMessages.gameVersionLabel),
value: instance.game_version,
},
]
if (instance.loader !== 'vanilla' && instance.loader_version) {
rows.push({
label: formatMessage(messages.loaderVersion, {
loader: formatLoaderLabel(instance.loader),
}),
value: instance.loader_version,
})
}
return rows
}),
isLinked: computed(() => !!instance.linked_data?.locked),
isBusy: computed(
() =>
instance.install_stage !== 'installed' || repairing.value || reinstalling.value || !!offline,
),
modpack: computed(() => {
if (!modpackInfo.value) return null
return {
iconUrl: modpackInfo.value.project.icon_url,
title: modpackInfo.value.project.title,
link: `/project/${modpackInfo.value.project.slug ?? modpackInfo.value.project.id}`,
versionNumber: modpackInfo.value.version?.version_number,
}
}),
currentPlatform: computed(() => instance.loader),
currentGameVersion: computed(() => instance.game_version),
currentLoaderVersion: computed(() => instance.loader_version ?? ''),
availablePlatforms: loaders?.value?.map((x) => x.name) ?? [],
resolveGameVersions(loader, showSnapshots) {
const versions = all_game_versions?.value ?? []
const filtered = versions.filter((item) => {
if (loader === 'vanilla') return true
const manifest = getManifest(loader)
return !!manifest?.value?.gameVersions?.some((x) => item.version === x.id)
})
return (showSnapshots ? filtered : filtered.filter((x) => x.version_type === 'release')).map(
(x) => ({ value: x.version, label: x.version }),
)
},
resetSelections: {
id: 'instance.settings.tabs.installation.reset-selections',
defaultMessage: 'Reset to current',
resolveLoaderVersions(loader, gameVersion) {
if (loader === 'vanilla' || !gameVersion) return []
const manifest = getManifest(loader)
if (!manifest?.value) return []
if (loader === 'fabric' || loader === 'quilt') {
return manifest.value.gameVersions[0]?.loaders ?? []
}
return manifest.value.gameVersions?.find((item) => item.id === gameVersion)?.loaders ?? []
},
unknownVersion: {
id: 'instance.settings.tabs.installation.unknown-version',
defaultMessage: '(unknown version)',
resolveHasSnapshots(loader) {
const versions = all_game_versions?.value ?? []
if (loader === 'vanilla') return versions.some((x) => x.version_type !== 'release')
const manifest = getManifest(loader)
const supported = versions.filter(
(item) => !!manifest?.value?.gameVersions?.some((x) => item.version === x.id),
)
return supported.some((x) => x.version_type !== 'release')
},
repairConfirmTitle: {
id: 'instance.settings.tabs.installation.repair.confirm.title',
defaultMessage: 'Repair instance?',
async save(platform, gameVersion, loaderVersionId) {
const editProfile: Record<string, string | undefined> = {
loader: platform,
game_version: gameVersion,
}
if (platform !== 'vanilla' && loaderVersionId) {
editProfile.loader_version = loaderVersionId
}
await edit(instance.path, editProfile).catch(handleError)
},
repairConfirmDescription: {
id: 'instance.settings.tabs.installation.repair.confirm.description',
defaultMessage:
'Repairing reinstalls Minecraft dependencies and checks for corruption. This may resolve issues if your game is not launching due to launcher-related errors, but will not resolve issues or crashes related to installed mods.',
afterSave: async () => {
await install(instance.path, false).catch(handleError)
trackEvent('InstanceRepair', {
loader: instance.loader,
game_version: instance.game_version,
})
},
repairButton: {
id: 'instance.settings.tabs.installation.repair.button',
defaultMessage: 'Repair',
async repair() {
repairing.value = true
await install(instance.path, true).catch(handleError)
repairing.value = false
trackEvent('InstanceRepair', {
loader: instance.loader,
game_version: instance.game_version,
})
},
repairingButton: {
id: 'instance.settings.tabs.installation.repair.button.repairing',
defaultMessage: 'Repairing',
async reinstallModpack() {
reinstalling.value = true
await update_repair_modrinth(instance.path).catch(handleError)
reinstalling.value = false
trackEvent('InstanceRepair', {
loader: instance.loader,
game_version: instance.game_version,
})
},
repairInProgress: {
id: 'instance.settings.tabs.installation.repair.in-progress',
defaultMessage: 'Repair in progress',
async unlinkModpack() {
await edit(instance.path, {
linked_data: null as unknown as undefined,
})
await queryClient.invalidateQueries({
queryKey: ['linkedModpackInfo', instance.path],
})
onUnlinked()
},
repairAction: {
id: 'instance.settings.tabs.installation.tooltip.action.repair',
defaultMessage: 'repair',
getCachedModpackVersions: () => null,
async fetchModpackVersions() {
const versions = await get_project_versions(instance.linked_data!.project_id!).catch(
handleError,
)
return (versions ?? []) as Labrinth.Versions.v2.Version[]
},
changeVersionCannotWhileFetching: {
id: 'instance.settings.tabs.installation.change-version.cannot-while-fetching',
defaultMessage: 'Fetching modpack versions',
async getVersionChangelog(versionId: string) {
return (await get_version(versionId, 'must_revalidate').catch(
() => null,
)) as Labrinth.Versions.v2.Version | null
},
changeVersionButton: {
id: 'instance.settings.tabs.installation.change-version.button',
defaultMessage: 'Change version',
},
changeVersionAction: {
id: 'instance.settings.tabs.installation.tooltip.action.change-version',
defaultMessage: 'change version',
},
installingButton: {
id: 'instance.settings.tabs.installation.change-version.button.installing',
defaultMessage: 'Installing',
},
installInProgress: {
id: 'instance.settings.tabs.installation.install.in-progress',
defaultMessage: 'Installation in progress',
},
installButton: {
id: 'instance.settings.tabs.installation.change-version.button.install',
defaultMessage: 'Install',
},
alreadyInstalledVanilla: {
id: 'instance.settings.tabs.installation.change-version.already-installed.vanilla',
defaultMessage: 'Vanilla {game_version} already installed',
},
alreadyInstalledModded: {
id: 'instance.settings.tabs.installation.change-version.already-installed.modded',
defaultMessage: '{platform} {version} for Minecraft {game_version} already installed',
},
installAction: {
id: 'instance.settings.tabs.installation.tooltip.action.install',
defaultMessage: 'install',
},
installingNewVersion: {
id: 'instance.settings.tabs.installation.change-version.in-progress',
defaultMessage: 'Installing new version',
},
minecraftVersion: {
id: 'instance.settings.tabs.installation.minecraft-version',
defaultMessage: 'Minecraft {version}',
},
noLoaderVersions: {
id: 'instance.settings.tabs.installation.no-loader-versions',
defaultMessage: '{loader} is not available for Minecraft {version}. Try another mod loader.',
},
noConnection: {
id: 'instance.settings.tabs.installation.no-connection',
defaultMessage: 'Cannot fetch linked modpack details. Please check your internet connection.',
},
noModpackFound: {
id: 'instance.settings.tabs.installation.no-modpack-found',
defaultMessage:
'This instance is linked to a modpack, but the modpack could not be found on Modrinth.',
},
debugInformation: {
id: 'instance.settings.tabs.installation.debug-information',
defaultMessage: 'Debug information:',
},
fetchingModpackDetails: {
id: 'instance.settings.tabs.installation.fetching-modpack-details',
defaultMessage: 'Fetching modpack details',
},
unlinkInstanceTitle: {
id: 'instance.settings.tabs.installation.unlink.title',
defaultMessage: 'Unlink from modpack',
},
unlinkInstanceDescription: {
id: 'instance.settings.tabs.installation.unlink.description',
defaultMessage: `This instance is linked to a modpack, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the modpack.`,
},
unlinkInstanceButton: {
id: 'instance.settings.tabs.installation.unlink.button',
defaultMessage: 'Unlink instance',
},
unlinkInstanceConfirmTitle: {
id: 'instance.settings.tabs.installation.unlink.confirm.title',
defaultMessage: 'Are you sure you want to unlink this instance?',
},
unlinkInstanceConfirmDescription: {
id: 'instance.settings.tabs.installation.unlink.confirm.description',
defaultMessage:
'If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal.',
},
reinstallModpackConfirmTitle: {
id: 'instance.settings.tabs.installation.reinstall.confirm.title',
defaultMessage: 'Are you sure you want to reinstall this instance?',
},
reinstallModpackConfirmDescription: {
id: 'instance.settings.tabs.installation.reinstall.confirm.description',
defaultMessage: `Reinstalling will reset all installed or modified content to what is provided by the modpack, removing any mods or content you have added on top of the original installation. This may fix unexpected behavior if changes have been made to the instance, but if your worlds now depend on additional installed content, it may break existing worlds.`,
},
reinstallModpackTitle: {
id: 'instance.settings.tabs.installation.reinstall.title',
defaultMessage: 'Reinstall modpack',
},
reinstallModpackDescription: {
id: 'instance.settings.tabs.installation.reinstall.description',
defaultMessage: `Resets the instance's content to its original state, removing any mods or content you have added on top of the original modpack.`,
},
reinstallModpackButton: {
id: 'instance.settings.tabs.installation.reinstall.button',
defaultMessage: 'Reinstall modpack',
},
reinstallingModpackButton: {
id: 'instance.settings.tabs.installation.reinstall.button.reinstalling',
defaultMessage: 'Reinstalling modpack',
},
reinstallAction: {
id: 'instance.settings.tabs.installation.tooltip.action.reinstall',
defaultMessage: 'reinstall',
async onModpackVersionConfirm(version) {
await update_managed_modrinth_version(instance.path, version.id)
await queryClient.invalidateQueries({
queryKey: ['linkedModpackInfo', instance.path],
})
},
updaterModalProps: computed(() => ({
isApp: true,
currentVersionId:
modpackInfo.value?.update_version_id ?? instance.linked_data?.version_id ?? '',
projectIconUrl: modpackInfo.value?.project?.icon_url,
projectName: modpackInfo.value?.project?.title ?? 'Modpack',
currentGameVersion: instance.game_version,
currentLoader: instance.loader,
})),
isServer: false,
isApp: true,
showModpackVersionActions: !isMinecraftServer.value,
repairing,
reinstalling,
})
</script>
<template>
<ConfirmModalWrapper
ref="repairConfirmModal"
:title="formatMessage(messages.repairConfirmTitle)"
:description="formatMessage(messages.repairConfirmDescription)"
:proceed-icon="HammerIcon"
:proceed-label="formatMessage(messages.repairButton)"
:danger="false"
:show-ad-on-close="false"
@proceed="() => repairProfile(true)"
/>
<ModpackVersionModal
v-if="instance.linked_data && modpackVersions"
ref="modpackVersionModal"
:instance="instance"
:versions="modpackVersions"
@finish-install="
() => {
changingVersion = false
modpackVersion =
modpackVersions?.find(
(version: Version) => version.id === props.instance.linked_data?.version_id,
) ?? null
}
"
/>
<ConfirmModalWrapper
ref="modalConfirmUnpair"
:title="formatMessage(messages.unlinkInstanceConfirmTitle)"
:description="formatMessage(messages.unlinkInstanceConfirmDescription)"
:proceed-icon="UnlinkIcon"
:proceed-label="formatMessage(messages.unlinkInstanceButton)"
:show-ad-on-close="false"
@proceed="() => unpairProfile()"
/>
<ConfirmModalWrapper
ref="modalConfirmReinstall"
:title="formatMessage(messages.reinstallModpackConfirmTitle)"
:description="formatMessage(messages.reinstallModpackConfirmDescription)"
:proceed-icon="DownloadIcon"
:proceed-label="formatMessage(messages.reinstallModpackButton)"
:show-ad-on-close="false"
@proceed="() => repairModpack()"
/>
<div>
<h2 id="project-name" class="m-0 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.currentlyInstalled) }}
</h2>
<div
v-if="!modpackProject && instance.linked_data && offline && !fetching"
class="text-secondary font-medium mb-2"
>
<UnplugIcon class="top-[3px] relative" /> {{ formatMessage(messages.noConnection) }}
</div>
<div v-else-if="!modpackProject && instance.linked_data && !fetching" class="mb-2">
<p class="text-brand-red font-medium mt-0">
<IssuesIcon class="top-[3px] relative" />
{{ formatMessage(messages.noModpackFound) }}
</p>
<p>{{ formatMessage(messages.debugInformation) }}</p>
<div class="bg-bg p-6 rounded-2xl mt-2 text-sm text-secondary">
{{ instance.linked_data }}
</div>
</div>
<div class="flex gap-4 items-center justify-between p-4 bg-bg rounded-2xl">
<div v-if="fetching" class="flex items-center gap-2 h-10">
<SpinnerIcon class="animate-spin" />
{{ formatMessage(messages.fetchingModpackDetails) }}
</div>
<template v-else>
<div class="flex gap-2 items-center">
<Avatar v-if="modpackProject" :src="modpackProject?.icon_url" size="40px" />
<div
v-else
class="w-10 h-10 flex items-center justify-center rounded-full bg-button-bg border-solid border-[1px] border-button-border p-2 [&_svg]:h-full [&_svg]:w-full"
>
<component :is="currentLoaderIcon" v-if="currentLoaderIcon" />
<WrenchIcon v-else />
</div>
<div class="flex flex-col gap-2 justify-center">
<span class="font-semibold leading-none">
{{
modpackProject
? modpackProject.title
: formatMessage(messages.minecraftVersion, {
version: instance.game_version,
})
}}
</span>
<span class="text-sm text-secondary leading-none">
{{
modpackProject
? modpackVersion
? modpackVersion?.version_number
: 'Unknown version'
: formatLoader(formatMessage, instance.loader)
}}
<template v-if="instance.loader !== 'vanilla' && !modpackProject">
{{ instance.loader_version || formatMessage(messages.unknownVersion) }}
</template>
</span>
</div>
</div>
<div class="flex gap-1">
<ButtonStyled color="orange" type="transparent" hover-color-fill="background">
<button
v-tooltip="
repairing
? formatMessage(messages.repairInProgress)
: installing || reinstalling
? formatMessage(messages.cannotWhileInstalling, {
action: formatMessage(messages.repairAction),
})
: offline
? formatMessage(messages.cannotWhileOffline, {
action: formatMessage(messages.repairAction),
})
: null
"
:disabled="installing || repairing || reinstalling || offline"
@click="repairConfirmModal.show()"
>
<SpinnerIcon v-if="repairing" class="animate-spin" />
<HammerIcon v-else />
{{
repairing
? formatMessage(messages.repairingButton)
: formatMessage(messages.repairButton)
}}
</button>
</ButtonStyled>
<ButtonStyled v-if="modpackProject" hover-color-fill="background">
<button
v-tooltip="
changingVersion
? formatMessage(messages.installingNewVersion)
: repairing
? formatMessage(messages.cannotWhileRepairing, {
action: formatMessage(messages.changeVersionAction),
})
: installing || reinstalling
? formatMessage(messages.cannotWhileInstalling, {
action: formatMessage(messages.changeVersionAction),
})
: fetching && !modpackVersions
? formatMessage(messages.changeVersionCannotWhileFetching)
: offline
? formatMessage(messages.cannotWhileOffline, {
action: formatMessage(messages.changeVersionAction),
})
: null
"
:disabled="
changingVersion ||
repairing ||
installing ||
reinstalling ||
offline ||
fetching ||
!modpackVersions
"
@click="
() => {
changingVersion = true
modpackVersionModal.show()
}
"
>
<SpinnerIcon v-if="changingVersion" class="animate-spin" />
<TransferIcon v-else />
{{
changingVersion
? formatMessage(messages.installingButton)
: formatMessage(messages.changeVersionButton)
}}
</button>
</ButtonStyled>
</div>
</template>
</div>
<template v-if="!instance.linked_data || !instance.linked_data.locked">
<h2 class="m-0 mt-4 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.platform) }}
</h2>
<Chips v-if="loaders" v-model="loader" :items="loaders.map((x) => x.name)" class="mt-2" />
<h2 class="m-0 mt-4 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.gameVersion) }}
</h2>
<div class="flex flex-wrap mt-2 gap-2">
<Combobox
v-if="selectableGameVersionNumbers !== undefined"
v-model="gameVersion"
:options="gameVersionOptions"
:display-value="gameVersion || formatMessage(messages.unknownVersion)"
/>
<Checkbox
v-if="hasSnapshots"
v-model="showSnapshots"
:label="formatMessage(messages.showAllVersions)"
/>
</div>
<template v-if="loader !== 'vanilla'">
<h2 class="m-0 mt-4 text-lg font-extrabold text-contrast block">
{{
formatMessage(messages.loaderVersion, {
loader: formatLoader(formatMessage, loader),
})
}}
</h2>
<Combobox
v-if="selectableLoaderVersions"
v-model="loaderVersionIndex"
:options="loaderVersionOptions"
:display-value="loaderVersionLabel"
name="Version selector"
class="mt-2"
/>
<div v-else class="mt-2 text-brand-red flex gap-2 items-center">
<IssuesIcon />
{{
formatMessage(messages.noLoaderVersions, {
loader: loader,
version: gameVersion,
})
}}
</div>
</template>
<div class="mt-4 flex flex-wrap gap-2">
<ButtonStyled color="brand">
<button
v-tooltip="
installing || reinstalling
? formatMessage(messages.installInProgress)
: !isChanged
? formatMessage(
loader === 'vanilla'
? messages.alreadyInstalledVanilla
: messages.alreadyInstalledModded,
{
platform: formatLoader(formatMessage, loader),
version: instance.loader_version,
game_version: gameVersion,
},
)
: repairing
? formatMessage(messages.cannotWhileRepairing, {
action: formatMessage(messages.installAction),
})
: offline
? formatMessage(messages.cannotWhileOffline, {
action: formatMessage(messages.installAction),
})
: null
"
:disabled="!isValid || !isChanged || editing || offline || repairing"
@click="saveGvLoaderEdits()"
>
<SpinnerIcon v-if="editing" class="animate-spin" />
<DownloadIcon v-else />
{{
editing
? formatMessage(messages.installingButton)
: formatMessage(messages.installButton)
}}
</button>
</ButtonStyled>
<ButtonStyled>
<button
:disabled="!isChanged"
@click="
() => {
loader = instance.loader
gameVersion = instance.game_version
resetLoaderVersionIndex()
}
"
>
<UndoIcon />
{{ formatMessage(messages.resetSelections) }}
</button>
</ButtonStyled>
</div>
</template>
<template v-else>
<template v-if="instance.linked_data && instance.linked_data.locked">
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.unlinkInstanceTitle) }}
</h2>
<p class="m-0">
{{ formatMessage(messages.unlinkInstanceDescription) }}
</p>
<ButtonStyled>
<button class="mt-2" @click="modalConfirmUnpair.show()">
<UnlinkIcon /> {{ formatMessage(messages.unlinkInstanceButton) }}
</button>
</ButtonStyled>
<template v-if="modpackProject">
<div>
<h2 class="m-0 mb-1 text-lg font-extrabold text-contrast block mt-4">
{{ formatMessage(messages.reinstallModpackTitle) }}
</h2>
<p class="m-0">
{{ formatMessage(messages.reinstallModpackDescription) }}
</p>
</div>
<ButtonStyled color="red" type="outlined">
<button
v-tooltip="
reinstalling
? formatMessage(messages.reinstallingModpackButton)
: repairing
? formatMessage(messages.cannotWhileRepairing, {
action: formatMessage(messages.reinstallAction),
})
: installing
? formatMessage(messages.cannotWhileInstalling, {
action: formatMessage(messages.reinstallAction),
})
: offline
? formatMessage(messages.cannotWhileOffline, {
action: formatMessage(messages.reinstallAction),
})
: null
"
class="mt-2"
:disabled="
changingVersion ||
repairing ||
installing ||
offline ||
fetching ||
!modpackVersions
"
@click="modalConfirmReinstall.show()"
>
<SpinnerIcon v-if="reinstalling" class="animate-spin" />
<DownloadIcon v-else />
{{
reinstalling
? formatMessage(messages.reinstallingModpackButton)
: formatMessage(messages.reinstallModpackButton)
}}
</button>
</ButtonStyled>
</template>
</template>
</template>
</div>
<InstallationSettingsLayout />
</template>
@@ -14,34 +14,31 @@ import JavaSelector from '@/components/ui/JavaSelector.vue'
import useMemorySlider from '@/composables/useMemorySlider'
import { edit, get_optimal_jre_key } from '@/helpers/profile'
import { get } from '@/helpers/settings.ts'
import { injectInstanceSettings } from '@/providers/instance-settings'
import type { AppSettings, InstanceSettingsTabProps } from '../../../helpers/types'
import type { AppSettings } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const props = defineProps<InstanceSettingsTabProps>()
const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as unknown as AppSettings
const overrideJavaInstall = ref(!!props.instance.java_path)
const optimalJava = readonly(await get_optimal_jre_key(props.instance.path).catch(handleError))
const javaInstall = ref({ path: optimalJava.path ?? props.instance.java_path })
const overrideJavaInstall = ref(!!instance.java_path)
const optimalJava = readonly(await get_optimal_jre_key(instance.path).catch(handleError))
const javaInstall = ref({ path: optimalJava.path ?? instance.java_path })
const overrideJavaArgs = ref((props.instance.extra_launch_args?.length ?? 0) > 0)
const javaArgs = ref(
(props.instance.extra_launch_args ?? globalSettings.extra_launch_args).join(' '),
)
const overrideJavaArgs = ref((instance.extra_launch_args?.length ?? 0) > 0)
const javaArgs = ref((instance.extra_launch_args ?? globalSettings.extra_launch_args).join(' '))
const overrideEnvVars = ref((props.instance.custom_env_vars?.length ?? 0) > 0)
const overrideEnvVars = ref((instance.custom_env_vars?.length ?? 0) > 0)
const envVars = ref(
(props.instance.custom_env_vars ?? globalSettings.custom_env_vars)
.map((x) => x.join('='))
.join(' '),
(instance.custom_env_vars ?? globalSettings.custom_env_vars).map((x) => x.join('=')).join(' '),
)
const overrideMemorySettings = ref(!!props.instance.memory)
const memory = ref(props.instance.memory ?? globalSettings.memory)
const overrideMemorySettings = ref(!!instance.memory)
const memory = ref(instance.memory ?? globalSettings.memory)
const { maxMemory, snapPoints } = (await useMemorySlider().catch(handleError)) as unknown as {
maxMemory: number
snapPoints: number[]
@@ -79,7 +76,7 @@ watch(
memory,
],
async () => {
await edit(props.instance.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -11,24 +11,23 @@ import { computed, type Ref, ref, watch } from 'vue'
import { edit } from '@/helpers/profile'
import { get } from '@/helpers/settings.ts'
import { injectInstanceSettings } from '@/providers/instance-settings'
import type { AppSettings, InstanceSettingsTabProps } from '../../../helpers/types'
import type { AppSettings } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const props = defineProps<InstanceSettingsTabProps>()
const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as AppSettings
const overrideWindowSettings = ref(
!!props.instance.game_resolution || !!props.instance.force_fullscreen,
)
const overrideWindowSettings = ref(!!instance.game_resolution || !!instance.force_fullscreen)
const resolution: Ref<[number, number]> = ref(
props.instance.game_resolution ?? (globalSettings.game_resolution.slice() as [number, number]),
instance.game_resolution ?? (globalSettings.game_resolution.slice() as [number, number]),
)
const fullscreenSetting: Ref<boolean> = ref(
props.instance.force_fullscreen ?? globalSettings.force_fullscreen,
instance.force_fullscreen ?? globalSettings.force_fullscreen,
)
const editProfileObject = computed(() => {
@@ -47,7 +46,7 @@ const editProfileObject = computed(() => {
watch(
[overrideWindowSettings, resolution, fullscreenSetting],
async () => {
await edit(props.instance.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -0,0 +1,195 @@
<script setup lang="ts">
import {
CheckIcon,
CopyIcon,
DropdownIcon,
LogInIcon,
MessagesSquareIcon,
WrenchIcon,
} from '@modrinth/assets'
import { Admonition, ButtonStyled, Collapsible, NewModal } from '@modrinth/ui'
import { computed, ref } from 'vue'
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
import { login as login_flow, set_default_user } from '@/helpers/auth.js'
import { handleSevereError } from '@/store/error.js'
import { type MinecraftAuthError, minecraftAuthErrors } from './minecraft-auth-errors'
const modal = ref<InstanceType<typeof NewModal>>()
const rawError = ref<string>('')
const matchedError = ref<MinecraftAuthError | null>(null)
const debugCollapsed = ref(true)
const copied = ref(false)
const loadingSignIn = ref(false)
function show(errorVal: { message?: string }) {
rawError.value = errorVal?.message ?? String(errorVal)
matchedError.value = minecraftAuthErrors.find((e) => rawError.value.includes(e.errorCode)) ?? null
debugCollapsed.value = true
hide_ads_window()
modal.value?.show()
}
function hide() {
onModalHide()
modal.value?.hide()
}
function onModalHide() {
show_ads_window()
}
defineExpose({
show,
hide,
})
async function signInAgain() {
try {
loadingSignIn.value = true
const loggedIn = await login_flow()
if (loggedIn) {
await set_default_user(loggedIn.profile.id)
}
loadingSignIn.value = false
modal.value?.hide()
} catch (err) {
loadingSignIn.value = false
handleSevereError(err)
}
}
const debugInfo = computed(() => rawError.value || 'No error message.')
async function copyToClipboard(text: string) {
await navigator.clipboard.writeText(text)
copied.value = true
setTimeout(() => {
copied.value = false
}, 3000)
}
</script>
<template>
<NewModal ref="modal" header="Sign in Failed" :max-width="'548px'" @hide="onModalHide">
<div class="flex flex-col gap-6">
<Admonition
type="warning"
body=" We couldn't sign you into your Microsoft account. This may be due to account restrictions or
regional limitations."
>
</Admonition>
<!-- Matched error details -->
<div class="bg-surface-2 rounded-2xl p-4 px-5 flex flex-col gap-3">
<template v-if="matchedError">
<div class="flex flex-col gap-1.5">
<h3 class="text-base font-bold m-0">What we think happened</h3>
<p class="text-sm text-secondary m-0">
{{ matchedError.whatHappened }}
</p>
</div>
<div class="flex flex-col gap-1.5">
<h3 class="text-base font-bold m-0">How to fix it</h3>
<ol class="list-none flex flex-col gap-2 m-0 pl-0">
<li
v-for="(step, index) in matchedError.stepsToFix"
:key="index"
class="flex items-baseline gap-2"
>
<span
class="inline-flex items-center justify-center shrink-0 w-5 h-5 rounded-full bg-surface-4 border border-solid border-surface-5 text-xs font-medium"
>
{{ index + 1 }}
</span>
<!-- eslint-disable-next-line vue/no-v-html -->
<span
class="text-sm [&_a]:text-info [&_a]:font-medium [&_a]:underline"
v-html="step"
/>
</li>
</ol>
</div>
</template>
<template v-else>
<div class="flex flex-col gap-1.5">
<h3 class="text-base font-bold m-0">Unknown error</h3>
<p class="text-sm text-secondary m-0">
We dont recognize this error and cant recommend specific steps to resolve it.
</p>
<p class="text-sm text-secondary m-0">
Try visiting
<a
class="text-info font-medium underline hover:underline"
href="https://www.minecraft.net/en-us/login"
>Minecraft Login</a
>
and signing in, as it may prompt you with the necessary steps. You can also contact
support and we can look into it further.
</p>
</div>
</template>
</div>
<!-- Action buttons -->
<div class="flex items-center gap-2">
<ButtonStyled>
<a href="https://support.modrinth.com" class="!w-full" @click="modal?.hide()">
<MessagesSquareIcon /> Contact support
</a>
</ButtonStyled>
<ButtonStyled color="brand">
<button :disabled="loadingSignIn" class="!w-full" @click="signInAgain">
<LogInIcon /> Sign in again
</button>
</ButtonStyled>
</div>
<div class="flex flex-col gap-2">
<div class="w-full h-[1px] bg-surface-5"></div>
<!-- Debug info -->
<div class="overflow-clip">
<button
class="flex items-center justify-between w-full bg-transparent border-0 py-4 cursor-pointer"
@click="debugCollapsed = !debugCollapsed"
>
<span class="flex items-center gap-2 text-contrast font-extrabold m-0">
<WrenchIcon class="h-4 w-4" />
Debug information
</span>
<DropdownIcon
class="h-5 w-5 text-secondary transition-transform"
:class="{ 'rotate-180': !debugCollapsed }"
/>
</button>
<Collapsible :collapsed="debugCollapsed">
<div
class="p-3 bg-surface-2 rounded-2xl text-xs grid grid-cols-[1fr_auto] max-w-full items-start"
>
<div
class="m-0 p-0 rounded-none bg-transparent text-sm font-mono break-words overflow-auto"
>
{{ debugInfo }}
</div>
<ButtonStyled circular>
<button
v-tooltip="'Copy debug info'"
:disabled="copied"
@click="copyToClipboard(debugInfo)"
>
<template v-if="copied"> <CheckIcon class="text-green" /> </template>
<template v-else> <CopyIcon /> </template>
</button>
</ButtonStyled>
</div>
</Collapsible>
</div>
</div>
</div>
</NewModal>
</template>
@@ -0,0 +1,90 @@
export interface MinecraftAuthError {
errorCode: string
whatHappened: string
stepsToFix: string[]
}
export const minecraftAuthErrors: MinecraftAuthError[] = [
{
errorCode: '2148916222',
whatHappened:
'Your Minecraft/Xbox Live account requires age verification to comply with UK regulations. You must complete this before signing in.',
stepsToFix: [
'Go to the <a href="https://www.minecraft.net/en-us/login">Minecraft Login</a> page and sign in',
'Follow the instructions to verify your age',
'Once verified, try signing in again',
'For additional help, visit <a href="https://support.xbox.com/en-GB/help/family-online-safety/online-safety/UK-age-verification">UK age verification on Xbox</a>',
],
},
{
errorCode: '2148916233',
whatHappened: "This account doesn't have an Xbox profile set up or doesn't own Minecraft.",
stepsToFix: [
'Make sure Minecraft is purchased on this account',
'Visit <a href="https://www.minecraft.net/en-us/login">Minecraft Login</a> and sign in',
'Complete Xbox profile setup if prompted',
'Once finished, try signing in again',
],
},
{
errorCode: '2148916235',
whatHappened: "Xbox Live isn't available in your region, so sign-in is blocked.",
stepsToFix: [
'Xbox services must be supported in your country before you can sign in',
'Check <a href="https://www.xbox.com/en-US/regions">Xbox Availability</a> for supported regions',
],
},
{
errorCode: '2148916236',
whatHappened: 'This account requires adult verification under South Korean regulations.',
stepsToFix: [
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
'Complete the identity verification process',
'Once finished, try signing in again',
],
},
{
errorCode: '2148916237',
whatHappened: 'This account requires adult verification under South Korean regulations.',
stepsToFix: [
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
'Complete the identity verification process',
'Once finished, try signing in again',
],
},
{
errorCode: '2148916238',
whatHappened: 'This account is underage and not linked to a Microsoft family group.',
stepsToFix: [
'Review the <a href="https://help.minecraft.net/hc/en-us/articles/4408968616077">Family Setup Guide</a>',
'Join or create a family group as instructed',
'Once finished, try signing in again',
],
},
{
errorCode: '2148916227',
whatHappened: 'This account was suspended for violating Xbox Community Standards.',
stepsToFix: [
'Visit <a href="https://support.xbox.com">Xbox Support</a> and review the enforcement details',
'Submit an appeal if one is available',
],
},
{
errorCode: '2148916229',
whatHappened: "This account is restricted and doesn't have permission to play online.",
stepsToFix: [
'Have a guardian sign in to <a href="https://account.microsoft.com/family/">Microsoft Family</a>',
'Update online play permissions',
'Once finished, try signing in again',
],
},
{
errorCode: '2148916234',
whatHappened: "This account hasn't accepted Xbox's Terms of Service.",
stepsToFix: [
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
'Accept the Terms if prompted',
'Once finished, try signing in again',
],
},
]
@@ -20,9 +20,8 @@ import {
} from '@modrinth/ui'
import { getVersion } from '@tauri-apps/api/app'
import { platform as getOsPlatform, version as getOsVersion } from '@tauri-apps/plugin-os'
import { computed, ref, watch } from 'vue'
import { ref, watch } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import AppearanceSettings from '@/components/ui/settings/AppearanceSettings.vue'
import DefaultInstanceSettings from '@/components/ui/settings/DefaultInstanceSettings.vue'
import FeatureFlagSettings from '@/components/ui/settings/FeatureFlagSettings.vue'
@@ -106,15 +105,13 @@ const tabs = [
},
]
const modal = ref()
const modal = ref<InstanceType<typeof TabbedModal> | null>(null)
function show() {
modal.value.show()
modal.value?.show()
}
const isOpen = computed(() => modal.value?.isOpen)
defineExpose({ show, isOpen })
defineExpose({ show })
const { progress, version: downloadingVersion } = injectAppUpdateDownloadProgress()
@@ -138,8 +135,8 @@ function devModeCount() {
settings.value.developer_mode = !!themeStore.devMode
devModeCounter.value = 0
if (!themeStore.devMode && tabs[modal.value.selectedTab].developerOnly) {
modal.value.setTab(0)
if (!themeStore.devMode && tabs[modal.value!.selectedTab].developerOnly) {
modal.value!.setTab(0)
}
}
}
@@ -152,49 +149,46 @@ const messages = defineMessages({
})
</script>
<template>
<ModalWrapper ref="modal">
<TabbedModal ref="modal" :tabs="tabs.filter((t) => !t.developerOnly || themeStore.devMode)">
<template #title>
<span class="flex items-center gap-2 text-lg font-extrabold text-contrast">
<SettingsIcon /> Settings
</span>
</template>
<TabbedModal :tabs="tabs.filter((t) => !t.developerOnly || themeStore.devMode)">
<template #footer>
<div class="mt-auto text-secondary text-sm">
<div class="mb-3">
<template v-if="progress > 0 && progress < 1">
<p class="m-0 mb-2">
{{ formatMessage(messages.downloading, { version: downloadingVersion }) }}
</p>
<ProgressBar :progress="progress" />
</template>
</div>
<p v-if="themeStore.devMode" class="text-brand font-semibold m-0 mb-2">
{{ formatMessage(developerModeEnabled) }}
</p>
<div class="flex items-center gap-3">
<button
class="p-0 m-0 bg-transparent border-none cursor-pointer button-animation"
:class="{
'text-brand': themeStore.devMode,
'text-secondary': !themeStore.devMode,
}"
@click="devModeCount"
>
<ModrinthIcon class="w-6 h-6" />
</button>
<div>
<p class="m-0">Modrinth App {{ version }}</p>
<p class="m-0">
<span v-if="osPlatform === 'macos'">macOS</span>
<span v-else class="capitalize">{{ osPlatform }}</span>
{{ osVersion }}
</p>
</div>
<template #footer>
<div class="mt-auto text-secondary text-sm">
<div class="mb-3">
<template v-if="progress > 0 && progress < 1">
<p class="m-0 mb-2">
{{ formatMessage(messages.downloading, { version: downloadingVersion }) }}
</p>
<ProgressBar :progress="progress" />
</template>
</div>
<p v-if="themeStore.devMode" class="text-brand font-semibold m-0 mb-2">
{{ formatMessage(developerModeEnabled) }}
</p>
<div class="flex items-center gap-3">
<button
class="p-0 m-0 bg-transparent border-none cursor-pointer button-animation"
:class="{
'text-brand': themeStore.devMode,
'text-secondary': !themeStore.devMode,
}"
@click="devModeCount"
>
<ModrinthIcon class="w-6 h-6" />
</button>
<div>
<p class="m-0">Modrinth App {{ version }}</p>
<p class="m-0">
<span v-if="osPlatform === 'macos'">macOS</span>
<span v-else class="capitalize">{{ osPlatform }}</span>
{{ osVersion }}
</p>
</div>
</div>
</template>
</TabbedModal>
</ModalWrapper>
</div>
</template>
</TabbedModal>
</template>
@@ -0,0 +1,78 @@
<template>
<NewModal ref="modal" :header="formatMessage(messages.header)" fade="danger" max-width="500px">
<Admonition type="critical" :header="formatMessage(messages.admonitionHeader)">
{{ formatMessage(messages.admonitionBody) }}
</Admonition>
<template #actions>
<div class="flex gap-2 justify-end">
<ButtonStyled type="outlined">
<button class="!border !border-surface-4" @click="modal?.hide()">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled color="red">
<button @click="confirm">
<TrashIcon />
{{ formatMessage(messages.deleteButton) }}
</button>
</ButtonStyled>
</div>
</template>
</NewModal>
</template>
<script setup lang="ts">
import { TrashIcon, XIcon } from '@modrinth/assets'
import {
Admonition,
ButtonStyled,
commonMessages,
defineMessages,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { ref } from 'vue'
const { formatMessage } = useVIntl()
const messages = defineMessages({
header: {
id: 'app.instance.confirm-delete.header',
defaultMessage: 'Delete instance',
},
admonitionHeader: {
id: 'app.instance.confirm-delete.admonition-header',
defaultMessage: 'This action cannot be undone',
},
admonitionBody: {
id: 'app.instance.confirm-delete.admonition-body',
defaultMessage:
'All data for your instance will be permanently deleted, including your worlds, configs, and all installed content.',
},
deleteButton: {
id: 'app.instance.confirm-delete.delete-button',
defaultMessage: 'Delete instance',
},
})
const emit = defineEmits<{
(e: 'delete'): void
}>()
const modal = ref<InstanceType<typeof NewModal>>()
function show() {
modal.value?.show()
}
function confirm() {
modal.value?.hide()
emit('delete')
}
defineExpose({
show,
})
</script>
@@ -1,13 +1,9 @@
<!-- @deprecated Use ConfirmModal from @modrinth/ui directly. Ads/noblur now handled by injectModalBehavior. -->
<script setup lang="ts">
import { ConfirmModal } from '@modrinth/ui'
import { ref } from 'vue'
import { useTemplateRef } from 'vue'
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.ts'
const themeStore = useTheming()
const props = defineProps({
defineProps({
confirmationText: {
type: String,
default: '',
@@ -38,6 +34,7 @@ const props = defineProps({
type: Boolean,
default: true,
},
/** @deprecated No longer used — ads are handled by provideModalBehavior */
showAdOnClose: {
type: Boolean,
default: true,
@@ -49,25 +46,17 @@ const props = defineProps({
})
const emit = defineEmits(['proceed'])
const modal = ref(null)
const modal = useTemplateRef('modal')
defineExpose({
show: () => {
hide_ads_window()
modal.value.show()
modal.value?.show()
},
hide: () => {
onModalHide()
modal.value.hide()
modal.value?.hide()
},
})
function onModalHide() {
if (props.showAdOnClose) {
show_ads_window()
}
}
function proceed() {
emit('proceed')
}
@@ -82,8 +71,6 @@ function proceed() {
:description="description"
:proceed-icon="proceedIcon"
:proceed-label="proceedLabel"
:on-hide="onModalHide"
:noblur="!themeStore.advancedRendering"
:danger="danger"
:markdown="markdown"
@proceed="proceed"
@@ -1,36 +1,41 @@
<template>
<NewModal ref="modal" :header="formatMessage(messages.installToPlay)" :closable="true">
<div class="flex flex-col gap-6 max-w-[500px]">
<Admonition type="info" :header="formatMessage(messages.sharedServerInstance)">
<div v-if="requiredContentProject" class="flex flex-col gap-6 max-w-[500px]">
<Admonition type="info" :header="formatMessage(messages.contentRequired)">
{{ formatMessage(messages.serverRequiresMods) }}
</Admonition>
<div v-if="sharedBy?.name" class="flex items-center gap-2 text-sm text-secondary">
<Avatar
v-if="sharedBy?.icon_url"
:src="sharedBy.icon_url"
:alt="sharedBy.name"
size="24px"
/>
<span>
<IntlFormatted :message-id="messages.sharedByToday">
<template #~name>
<span class="font-semibold text-contrast">{{ sharedBy.name }}</span>
</template>
</IntlFormatted>
</span>
</div>
<div class="flex flex-col gap-1">
<div class="flex justify-between items-center">
<span class="font-semibold text-contrast">{{
formatMessage(messages.requiredModpack)
}}</span>
<div class="flex flex-col gap-2">
<span class="font-semibold text-contrast">
{{ formatMessage(messages.sharedInstance) }}
</span>
<div class="flex items-center gap-3 rounded-xl bg-surface-4 p-3">
<Avatar :src="project.icon_url" :alt="project.title" size="48px" />
<ButtonStyled type="transparent">
<button @click="openViewContents">
<EyeIcon />
{{ formatMessage(messages.viewContents) }}
</button>
</ButtonStyled>
</div>
<div class="flex items-center gap-3 rounded-xl bg-surface-2 p-3">
<Avatar
:src="requiredContentProject.icon_url"
:alt="requiredContentProject.title"
size="48px"
/>
<div class="flex flex-col gap-0.5">
<span class="font-semibold text-contrast">{{ project.title }}</span>
<span class="font-semibold text-contrast">
<template v-if="usingCustomModpack && modpackVersion">
{{ modpackVersion.name }}
</template>
<template v-else>
{{ requiredContentProject.title }}
</template>
</span>
<span class="text-sm text-secondary">
{{ loaderDisplay }} {{ project.game_versions?.[0] }}
{{ loaderDisplay }} {{ requiredContentProject.game_versions?.[0] }}
<template v-if="modCount">
· {{ formatMessage(messages.modCount, { count: modCount }) }}
</template>
@@ -57,11 +62,18 @@
</div>
</template>
</NewModal>
<ModpackContentModal
ref="modpackContentModal"
:modpack-name="project?.name ?? ''"
:modpack-icon-url="project?.icon_url ?? undefined"
/>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import { DownloadIcon, XIcon } from '@modrinth/assets'
import { DownloadIcon, EyeIcon, XIcon } from '@modrinth/assets'
import type { ContentItem } from '@modrinth/ui'
import {
Admonition,
Avatar,
@@ -69,75 +81,57 @@ import {
commonMessages,
defineMessages,
formatLoader,
IntlFormatted,
ModpackContentModal,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { useQuery } from '@tanstack/vue-query'
import { computed, ref } from 'vue'
import { get_organization, get_team, get_version } from '@/helpers/cache.js'
import { install } from '@/store/install.js'
const props = defineProps<{
project: Labrinth.Projects.v2.Project
}>()
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
import { get_project, get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
import { injectServerInstall } from '@/providers/server-install'
const modal = ref<InstanceType<typeof NewModal>>()
const modpackVersionId = ref<string | null>(null)
const modpackVersion = ref<Labrinth.Versions.v2.Version | null>(null)
const project = ref<Labrinth.Projects.v3.Project | null>(null)
const requiredContentProject = ref<Labrinth.Projects.v2.Project | null>(null)
const onInstallComplete = ref<() => void>(() => {})
const { formatMessage } = useVIntl()
const { installServerProject, startInstallingServer, stopInstallingServer } = injectServerInstall()
const { data: organization } = useQuery({
queryKey: computed(() => ['organization', props.project.organization]),
queryFn: () => get_organization(props.project.organization!, 'must_revalidate'),
enabled: computed(() => !!props.project.organization),
})
const { data: teamMembers } = useQuery({
queryKey: computed(() => ['team', props.project.team]),
queryFn: () => get_team(props.project.team, 'must_revalidate'),
enabled: computed(() => !!props.project.team && !props.project.organization),
})
const sharedBy = computed(() => {
if (organization.value) {
return {
name: organization.value.name,
icon_url: organization.value.icon_url,
}
}
if (teamMembers.value) {
const owner = teamMembers.value.find((member: { is_owner: boolean }) => member.is_owner)
if (owner) {
return {
name: owner.user.username,
icon_url: owner.user.avatar_url,
}
}
}
return null
const usingCustomModpack = computed(() => {
return requiredContentProject.value?.id === project.value?.id
})
const loaderDisplay = computed(() => {
const loader = props.project.loaders?.[0]
const loader = requiredContentProject.value?.loaders?.[0]
if (!loader) return ''
return formatLoader(formatMessage, loader)
})
// Fetch the most recent version to get mod count from dependencies
const latestVersionId = computed(() => props.project.versions?.[0] ?? null)
const { data: latestVersion } = useQuery({
queryKey: computed(() => ['version', latestVersionId.value]),
queryFn: () => get_version(latestVersionId.value, 'must_revalidate'),
enabled: computed(() => !!latestVersionId.value),
})
const modCount = computed(() => latestVersion.value?.dependencies?.length)
const modCount = computed(() => modpackVersion.value?.dependencies?.length)
async function fetchData(versionId: string) {
// cache is making version null for some reason so bypassing for now
modpackVersion.value = await get_version(versionId, 'bypass')
if (modpackVersion.value?.project_id) {
requiredContentProject.value = await get_project(modpackVersion.value.project_id, 'bypass')
}
}
async function handleAccept() {
hide()
const serverProjectId = project.value?.id
startInstallingServer(serverProjectId)
try {
await install(props.project.id, null, null, 'ProjectPageInstallToPlayModal')
await installServerProject(serverProjectId)
onInstallComplete.value()
} catch (error) {
console.error('Failed to install project from InstallToPlayModal:', error)
console.error('Failed to install server project from InstallToPlayModal:', error)
} finally {
stopInstallingServer(serverProjectId)
}
}
@@ -145,12 +139,95 @@ function handleDecline() {
hide()
}
function show(e?: MouseEvent) {
const modpackContentModal = ref<InstanceType<typeof ModpackContentModal>>()
async function openViewContents() {
modpackContentModal.value?.showLoading()
try {
// Ensure version data is available — the useQuery may not have resolved yet
const versionId = modpackVersionId.value
const version =
modpackVersion.value ?? (versionId ? await get_version(versionId, 'must_revalidate') : null)
const deps = version?.dependencies ?? []
const projectIds = deps
.map((d: { project_id?: string }) => d.project_id)
.filter((id: string | undefined): id is string => !!id)
const versionIds = deps
.map((d: { version_id?: string }) => d.version_id)
.filter((id: string | undefined): id is string => !!id)
const projects: Labrinth.Projects.v2.Project[] =
projectIds.length > 0 ? await get_project_many(projectIds, 'must_revalidate') : []
const versions: Labrinth.Versions.v2.Version[] =
versionIds.length > 0 ? await get_version_many(versionIds, 'must_revalidate') : []
const projectMap = new Map(projects.map((p: Labrinth.Projects.v2.Project) => [p.id, p]))
const contentItems: ContentItem[] = deps.map(
(dep: Labrinth.Versions.v2.Dependency): ContentItem => {
const depProject = dep.project_id ? projectMap.get(dep.project_id) : null
// @ts-expect-error - version_id is missing from the type for some reason
const depVersion = dep.version_id
? // @ts-expect-error - version_id is missing from the type for some reason
versions.find((v: Labrinth.Versions.v2.Version) => v.id === dep.version_id)
: null
return {
file_name: dep.file_name ?? depProject?.title ?? 'Unknown',
project_type: depProject?.project_type ?? 'mod',
has_update: false,
update_version_id: null,
project: {
id: depProject?.id ?? dep.project_id ?? dep.file_name ?? 'unknown',
slug: depProject?.slug ?? dep.project_id ?? 'unknown',
title: depProject?.title ?? dep.file_name ?? 'Unknown',
icon_url: depProject?.icon_url ?? undefined,
},
...(depVersion
? {
version: {
id: depVersion.id,
file_name: depVersion.files?.[0]?.filename ?? dep.file_name,
version_number: depVersion.version_number ?? undefined,
date_published: depVersion.date_published ?? undefined,
},
}
: {}),
}
},
)
modpackContentModal.value?.show(contentItems)
} catch (err) {
console.error('Failed to load modpack contents:', err)
modpackContentModal.value?.show([])
}
}
async function show(
projectVal: Labrinth.Projects.v3.Project,
modpackVersionIdVal: string | null = null,
callback: () => void = () => {},
e?: MouseEvent,
) {
project.value = projectVal
modpackVersionId.value = modpackVersionIdVal
modpackVersion.value = null
requiredContentProject.value = null
onInstallComplete.value = callback
if (modpackVersionIdVal) await fetchData(modpackVersionIdVal)
hide_ads_window()
modal.value?.show(e)
}
function hide() {
modal.value?.hide()
show_ads_window()
}
const messages = defineMessages({
@@ -162,14 +239,18 @@ const messages = defineMessages({
id: 'app.modal.install-to-play.shared-server-instance',
defaultMessage: 'Shared server instance',
},
contentRequired: {
id: 'app.modal.install-to-play.content-required',
defaultMessage: 'Content required',
},
serverRequiresMods: {
id: 'app.modal.install-to-play.server-requires-mods',
defaultMessage:
'This server requires mods to play. Click install to set up the required files from Modrinth.',
'This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server.',
},
sharedByToday: {
id: 'app.modal.install-to-play.shared-by-today',
defaultMessage: '{name} shared this instance with you today.',
requiredModpack: {
id: 'app.modal.install-to-play.required-modpack',
defaultMessage: 'Required modpack',
},
sharedInstance: {
id: 'app.modal.install-to-play.shared-instance',
@@ -183,6 +264,10 @@ const messages = defineMessages({
id: 'app.modal.install-to-play.install-button',
defaultMessage: 'Install',
},
viewContents: {
id: 'app.modal.install-to-play.view-contents',
defaultMessage: 'View contents',
},
})
defineExpose({ show, hide })
@@ -1,4 +1,5 @@
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
ChevronRightIcon,
CodeIcon,
@@ -15,23 +16,59 @@ import {
type TabbedModalTab,
useVIntl,
} from '@modrinth/ui'
import { useQueryClient } from '@tanstack/vue-query'
import { convertFileSrc } from '@tauri-apps/api/core'
import { ref } from 'vue'
import { computed, nextTick, ref, watch } from 'vue'
import GeneralSettings from '@/components/ui/instance_settings/GeneralSettings.vue'
import HooksSettings from '@/components/ui/instance_settings/HooksSettings.vue'
import InstallationSettings from '@/components/ui/instance_settings/InstallationSettings.vue'
import JavaSettings from '@/components/ui/instance_settings/JavaSettings.vue'
import WindowSettings from '@/components/ui/instance_settings/WindowSettings.vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import { get_project_v3 } from '@/helpers/cache'
import { get_linked_modpack_info } from '@/helpers/profile'
import { provideInstanceSettings } from '@/providers/instance-settings'
import type { InstanceSettingsTabProps } from '../../../helpers/types'
import type { GameInstance } from '../../../helpers/types'
const { formatMessage } = useVIntl()
const props = defineProps<InstanceSettingsTabProps>()
const props = defineProps<{
instance: GameInstance
offline?: boolean
}>()
const emit = defineEmits<{
unlinked: []
}>()
const tabs: TabbedModalTab<InstanceSettingsTabProps>[] = [
const isMinecraftServer = ref(false)
const handleUnlinked = () => emit('unlinked')
provideInstanceSettings({
instance: props.instance,
offline: props.offline,
isMinecraftServer,
onUnlinked: handleUnlinked,
})
watch(
() => props.instance,
(instance) => {
isMinecraftServer.value = false
if (instance.linked_data?.project_id) {
get_project_v3(instance.linked_data.project_id, 'must_revalidate')
.then((project: Labrinth.Projects.v3.Project | undefined) => {
if (project?.minecraft_server != null) {
isMinecraftServer.value = true
}
})
.catch(() => {})
}
},
{ immediate: true },
)
const tabs = computed<TabbedModalTab[]>(() => [
{
name: defineMessage({
id: 'instance.settings.tabs.general',
@@ -72,18 +109,33 @@ const tabs: TabbedModalTab<InstanceSettingsTabProps>[] = [
icon: CodeIcon,
content: HooksSettings,
},
]
])
const modal = ref()
const queryClient = useQueryClient()
const tabbedModal = ref<InstanceType<typeof TabbedModal> | null>(null)
function show() {
modal.value.show()
function show(tabIndex?: number) {
if (props.instance.linked_data?.project_id) {
queryClient.prefetchQuery({
queryKey: ['linkedModpackInfo', props.instance.path],
queryFn: () => get_linked_modpack_info(props.instance.path, 'stale_while_revalidate'),
})
}
tabbedModal.value?.show()
if (tabIndex !== undefined) {
nextTick(() => tabbedModal.value?.setTab(tabIndex))
}
}
defineExpose({ show })
</script>
<template>
<ModalWrapper ref="modal">
<TabbedModal
ref="tabbedModal"
:tabs="tabs"
:max-width="'min(928px, calc(95vw - 10rem))'"
:width="'min(928px, calc(95vw - 10rem))'"
>
<template #title>
<span class="flex items-center gap-2 text-lg font-semibold text-primary">
<Avatar
@@ -97,7 +149,5 @@ defineExpose({ show })
}}</span>
</span>
</template>
<TabbedModal :tabs="tabs.map((tab) => ({ ...tab, props }))" />
</ModalWrapper>
</TabbedModal>
</template>
@@ -1,12 +1,8 @@
<!-- @deprecated Use NewModal from @modrinth/ui directly. Ads/noblur now handled by injectModalBehavior. -->
<script setup lang="ts">
import { NewModal as Modal } from '@modrinth/ui'
import { useTemplateRef } from 'vue'
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.ts'
const themeStore = useTheming()
const props = defineProps({
header: {
type: String,
@@ -26,6 +22,7 @@ const props = defineProps({
return () => {}
},
},
/** @deprecated No longer used — ads are handled by provideModalBehavior */
showAdOnClose: {
type: Boolean,
default: true,
@@ -35,31 +32,21 @@ const modal = useTemplateRef('modal')
defineExpose({
show: (e: MouseEvent) => {
hide_ads_window()
modal.value?.show(e)
},
hide: () => {
onModalHide()
modal.value?.hide()
},
})
function onModalHide() {
if (props.showAdOnClose) {
show_ads_window()
}
props.onHide?.()
}
</script>
<template>
<Modal
ref="modal"
:header="header"
:noblur="!themeStore.advancedRendering"
:closable="closable"
:hide-header="hideHeader"
@hide="onModalHide"
:on-hide="() => props.onHide?.()"
>
<template #title>
<slot name="title" />
@@ -0,0 +1,84 @@
<template>
<NewModal ref="modal" :header="formatMessage(messages.header)" fade="warning" max-width="500px">
<Admonition type="warning" :header="formatMessage(messages.admonitionHeader)">
{{ formatMessage(messages.admonitionBody, { instanceName }) }}
</Admonition>
<template #actions>
<div class="flex gap-2 justify-end">
<ButtonStyled type="outlined">
<button class="!border !border-surface-4" @click="handleGoToInstance">
<ExternalIcon />
{{ formatMessage(messages.goToInstance) }}
</button>
</ButtonStyled>
<ButtonStyled color="orange">
<button @click="handleCreateAnyway">
<PlusIcon />
{{ formatMessage(messages.createAnyway) }}
</button>
</ButtonStyled>
</div>
</template>
</NewModal>
</template>
<script setup lang="ts">
import { ExternalIcon, PlusIcon } from '@modrinth/assets'
import { Admonition, ButtonStyled, defineMessages, NewModal, useVIntl } from '@modrinth/ui'
import { ref } from 'vue'
const { formatMessage } = useVIntl()
const messages = defineMessages({
header: {
id: 'app.instance.modpack-already-installed.header',
defaultMessage: 'Modpack already installed',
},
admonitionHeader: {
id: 'app.instance.modpack-already-installed.admonition-header',
defaultMessage: 'Duplicate modpack',
},
admonitionBody: {
id: 'app.instance.modpack-already-installed.admonition-body',
defaultMessage: 'This modpack is already installed in the "{instanceName}" instance.',
},
goToInstance: {
id: 'app.instance.modpack-already-installed.go-to-instance',
defaultMessage: 'Go to instance',
},
createAnyway: {
id: 'app.instance.modpack-already-installed.create-anyway',
defaultMessage: 'Create anyway',
},
})
const emit = defineEmits<{
(e: 'go-to-instance', instancePath: string): void
(e: 'create-anyway'): void
}>()
const modal = ref<InstanceType<typeof NewModal>>()
const instanceName = ref('')
const instancePath = ref('')
function show(name: string, path: string) {
instanceName.value = name
instancePath.value = path
modal.value?.show()
}
function handleGoToInstance() {
modal.value?.hide()
emit('go-to-instance', instancePath.value)
}
function handleCreateAnyway() {
modal.value?.hide()
emit('create-anyway')
}
defineExpose({
show,
})
</script>
@@ -1,12 +1,8 @@
<!-- @deprecated Use ShareModal from @modrinth/ui directly. Ads/noblur now handled by injectModalBehavior. -->
<script setup lang="ts">
import { ShareModal } from '@modrinth/ui'
import { ref } from 'vue'
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.ts'
const themeStore = useTheming()
defineProps({
header: {
type: String,
@@ -34,18 +30,12 @@ const modal = ref(null)
defineExpose({
show: (passedContent) => {
hide_ads_window()
modal.value.show(passedContent)
},
hide: () => {
onModalHide()
modal.value.hide()
},
})
function onModalHide() {
show_ads_window()
}
</script>
<template>
@@ -56,7 +46,5 @@ function onModalHide() {
:share-text="shareText"
:link="link"
:open-in-new-tab="openInNewTab"
:on-hide="onModalHide"
:noblur="!themeStore.advancedRendering"
/>
</template>
@@ -1,119 +1,39 @@
<template>
<NewModal ref="modal" :header="formatMessage(messages.updateToPlay)" :closable="true" no-padding>
<div class="max-w-[500px]">
<div class="flex flex-col gap-4 p-4">
<Admonition type="warning" :header="formatMessage(messages.updateRequired)">
{{ formatMessage(messages.updateRequiredDescription, { name: instance.name }) }}
</Admonition>
<div v-if="diffs.length" class="flex flex-col gap-2">
<span v-if="publishedDate" class="text-contrast font-semibold">{{
formatMessage(messages.publishedDate, { date: publishedDate })
}}</span>
<div class="flex gap-2">
<div v-if="removedCount" class="flex gap-1 items-center">
<MinusIcon />
{{ formatMessage(messages.removedCount, { count: removedCount }) }}
</div>
<div v-if="addedCount" class="flex gap-1 items-center">
<PlusIcon />
{{ formatMessage(messages.addedCount, { count: addedCount }) }}
</div>
<div v-if="updatedCount" class="flex gap-1 items-center">
<RefreshCwIcon />
{{ formatMessage(messages.updatedCount, { count: updatedCount }) }}
</div>
</div>
</div>
</div>
<div v-if="diffs.length" class="flex flex-col bg-surface-2 p-4 max-h-[272px] overflow-y-auto">
<div
v-for="diff in diffs"
:key="diff.project_id"
class="grid grid-cols-[auto_1fr_1fr_1fr] items-center min-h-10 h-10 gap-2"
>
<div class="flex flex-col justify-between items-center">
<div class="w-[1px] h-2"></div>
<PlusIcon v-if="diff.type === 'added'" />
<MinusIcon v-else-if="diff.type === 'removed'" />
<RefreshCwIcon v-else />
<div class="bg-surface-5 w-[1px] h-2 relative top-1"></div>
</div>
<div class="flex gap-1 col-span-2">
<span class="text-sm">{{ formatMessage(diffTypeMessages[diff.type]) }}</span>
<span
v-if="diff.project"
v-tooltip="diff.project.title"
class="text-sm text-contrast font-medium truncate"
>
{{ diff.project.title }}
</span>
</div>
<span
v-if="getFilename(diff.newVersion) || getFilename(diff.currentVersion)"
v-tooltip="getFilename(diff.newVersion) || getFilename(diff.currentVersion)"
class="text-xs truncate text-right"
>
{{ getFilename(diff.newVersion) || getFilename(diff.currentVersion) }}
</span>
</div>
</div>
</div>
<template #actions>
<div class="flex justify-between gap-2">
<ButtonStyled color="red" type="transparent">
<button @click="handleReport">
<ReportIcon />
{{ formatMessage(commonMessages.reportButton) }}
</button>
</ButtonStyled>
<div class="flex gap-2">
<ButtonStyled>
<button @click="handleDecline">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button @click="handleUpdate">
<DownloadIcon />
{{ formatMessage(commonMessages.updateButton) }}
</button>
</ButtonStyled>
</div>
</div>
</template>
</NewModal>
<ContentDiffModal
ref="diffModal"
:header="formatMessage(messages.updateToPlay)"
:admonition-header="formatMessage(messages.updateRequired)"
:description="
instance ? formatMessage(messages.updateRequiredDescription, { name: instance.name }) : ''
"
:diffs="normalizedDiffs"
:confirm-label="formatMessage(commonMessages.updateButton)"
:confirm-icon="DownloadIcon"
:show-report-button="true"
@confirm="handleUpdate"
@cancel="handleDecline"
@report="handleReport"
/>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import { DownloadIcon } from '@modrinth/assets'
import {
DownloadIcon,
MinusIcon,
PlusIcon,
RefreshCwIcon,
ReportIcon,
XIcon,
} from '@modrinth/assets'
import {
Admonition,
ButtonStyled,
commonMessages,
type ContentDiffItem,
ContentDiffModal,
defineMessages,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { openUrl } from '@tauri-apps/plugin-opener'
import dayjs from 'dayjs'
import { computed, ref, watch } from 'vue'
import { get_project, get_project_many, get_version_many } from '@/helpers/cache.js'
import { get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
import { update_managed_modrinth_version } from '@/helpers/profile'
import type { GameInstance } from '@/helpers/types'
import { injectServerInstall } from '@/providers/server-install'
type Dependency = Labrinth.Versions.v3.Dependency
type Version = Labrinth.Versions.v2.Version
@@ -129,6 +49,7 @@ interface BaseDiff {
newVersionId?: string
currentVersion?: Version
newVersion?: Version
fileName?: string
}
interface AddedDiff extends BaseDiff {
type: 'added'
@@ -151,44 +72,52 @@ type ProjectInfo = {
slug: string
}
const { instance } = defineProps<{
instance: GameInstance
}>()
const { formatMessage } = useVIntl()
const { startInstallingServer, stopInstallingServer } = injectServerInstall()
type UpdateCompleteCallback = () => void | Promise<void>
const modal = ref<InstanceType<typeof NewModal>>()
const diffModal = ref<InstanceType<typeof ContentDiffModal>>()
const instance = ref<GameInstance | null>(null)
const onUpdateComplete = ref<UpdateCompleteCallback>(() => {})
const diffs = ref<DependencyDiff[]>([])
const latestVersionId = ref<string | null>(null)
const latestVersion = ref<Version | null>(null)
const modpackVersionId = ref<string | null>(null)
const modpackVersion = ref<Version | null>(null)
const removedCount = computed(() => diffs.value.filter((d) => d.type === 'removed').length)
const addedCount = computed(() => diffs.value.filter((d) => d.type === 'added').length)
const updatedCount = computed(() => diffs.value.filter((d) => d.type === 'updated').length)
const publishedDate = computed(() =>
latestVersion.value?.date_published ? new Date(latestVersion.value.date_published) : null,
const normalizedDiffs = computed<ContentDiffItem[]>(() =>
diffs.value.map((diff) => ({
type: diff.type,
projectName: diff.project?.title,
fileName: diff.fileName,
currentVersionName: diff.currentVersion?.version_number,
newVersionName: diff.newVersion?.version_number,
})),
)
function getFilename(version?: Version): string | undefined {
return version?.files.find((f) => f.primary)?.filename
}
async function computeDependencyDiffs(
currentDeps: Dependency[],
latestDeps: Dependency[],
): Promise<DependencyDiff[]> {
console.log('Computing dependency diffs', { currentDeps, latestDeps })
// Separate deps with project_id from file_name-only deps
const currentWithProject = currentDeps.filter((d) => d.project_id)
const latestWithProject = latestDeps.filter((d) => d.project_id)
const currentFileOnly = currentDeps.filter((d) => !d.project_id && d.file_name)
const latestFileOnly = latestDeps.filter((d) => !d.project_id && d.file_name)
const currentByProject = new Map<string, Dependency>(
currentDeps.map((d) => [d.project_id || '', d]),
currentWithProject.map((d) => [d.project_id!, d]),
)
const latestByProject = new Map<string, Dependency>(
latestDeps.map((d) => [d.project_id || '', d]),
latestWithProject.map((d) => [d.project_id!, d]),
)
const currentFilenames = new Set(currentFileOnly.map((d) => d.file_name!))
const latestFilenames = new Set(latestFileOnly.map((d) => d.file_name!))
const diffs: DependencyDiff[] = []
// Find added and updated dependencies
// Find added and updated dependencies (by project_id)
latestByProject.forEach((latestDep, projectId) => {
if (!projectId) return
const currentDep = currentByProject.get(projectId)
if (!currentDep && latestDep.version_id) {
diffs.push({ type: 'added', project_id: projectId, newVersionId: latestDep.version_id })
@@ -206,9 +135,8 @@ async function computeDependencyDiffs(
}
})
// Find removed dependencies
// Find removed dependencies (by project_id)
currentByProject.forEach((currentDep, projectId) => {
if (!projectId) return
if (!latestByProject.has(projectId)) {
diffs.push({
type: 'removed',
@@ -218,6 +146,19 @@ async function computeDependencyDiffs(
}
})
// Find added/removed file_name-only dependencies
// ideally in future, this should use the hash of the file instead of filename, but since version dependencies don't include file hashes, we'll use filename as a best effort approach
for (const fileName of latestFilenames) {
if (!currentFilenames.has(fileName)) {
diffs.push({ type: 'added', project_id: '', newVersionId: '' as string, fileName })
}
}
for (const fileName of currentFilenames) {
if (!latestFilenames.has(fileName)) {
diffs.push({ type: 'removed', project_id: '', fileName })
}
}
// Fetch projects and versions of diffs
const allProjectIds = [...new Set(diffs.map((d) => d.project_id).filter(Boolean))]
const allVersionIds = [
@@ -228,14 +169,14 @@ async function computeDependencyDiffs(
),
] as string[]
const [projects, versions] = await Promise.all([
get_project_many(allProjectIds, 'must_revalidate'),
get_version_many(allVersionIds, 'must_revalidate'),
get_project_many(allProjectIds, 'bypass'),
get_version_many(allVersionIds, 'bypass'),
])
const projectMap = new Map<string, ProjectInfo>(projects.map((p: ProjectInfo) => [p.id, p]))
const versionMap = new Map<string, Version>(versions.map((v: Version) => [v.id, v]))
return diffs
const mappedDiffs = diffs
.map((diff) => {
const project = projectMap.get(diff.project_id)
return {
@@ -248,7 +189,7 @@ async function computeDependencyDiffs(
}
})
.sort((a, b) => {
const typeOrder = { removed: 0, added: 1, updated: 2 }
const typeOrder = { added: 0, updated: 1, removed: 2 }
const typeCompare = typeOrder[a.type] - typeOrder[b.type]
if (typeCompare !== 0) return typeCompare
@@ -256,34 +197,26 @@ async function computeDependencyDiffs(
const bDate = b.newVersion?.date_published || b.currentVersion?.date_published || ''
return dayjs(bDate).valueOf() - dayjs(aDate).valueOf()
})
.filter((d) => d.project || d.fileName) // filter out any diffs that couldn't be matched to a project or file
return mappedDiffs
}
async function checkUpdateAvailable(instance: GameInstance): Promise<DependencyDiff[] | null> {
if (!instance.linked_data) return null
async function checkUpdateAvailable(inst: GameInstance): Promise<DependencyDiff[] | null> {
if (!inst.linked_data) return null
if (!modpackVersionId.value || !inst.linked_data.version_id) return null
try {
const project = await get_project(instance.linked_data.project_id, 'must_revalidate')
if (!project || !project.versions || project.versions.length === 0) {
return null
}
const versions = await get_version_many(project.versions, 'must_revalidate')
const sortedVersions = versions.sort(
(a: { date_published: string }, b: { date_published: string }) =>
dayjs(b.date_published).valueOf() - dayjs(a.date_published).valueOf(),
)
latestVersion.value = sortedVersions[0]
latestVersionId.value = latestVersion.value?.id || null
const currentVersionId = instance.linked_data.version_id
const currentVersion = versions.find((v: { id: string }) => v.id === currentVersionId)
// For server projects, linked_data.project_id is the server project but
// linked_data.version_id references a content modpack version from a different project.
// Detect this by comparing the version's project_id with linked_data.project_id.
modpackVersion.value = await get_version(modpackVersionId.value, 'bypass')
const instanceModpackVersion = await get_version(inst.linked_data.version_id, 'bypass')
// Compute dependency diffs between current and latest version
if (currentVersion && latestVersion.value) {
if (instanceModpackVersion && modpackVersion.value) {
return await computeDependencyDiffs(
currentVersion.dependencies || [],
latestVersion.value.dependencies || [],
instanceModpackVersion.dependencies || [],
modpackVersion.value.dependencies || [],
)
}
} catch (error) {
@@ -294,9 +227,10 @@ async function checkUpdateAvailable(instance: GameInstance): Promise<DependencyD
}
watch(
() => instance,
async () => {
const result = await checkUpdateAvailable(instance)
() => instance.value,
async (newInstance) => {
if (!newInstance) return
const result = await checkUpdateAvailable(newInstance)
diffs.value = result || []
},
{ immediate: true, deep: true },
@@ -304,18 +238,25 @@ watch(
async function handleUpdate() {
hide()
const serverProjectId = instance.value?.linked_data?.project_id
if (serverProjectId) startInstallingServer(serverProjectId)
try {
if (latestVersionId.value) {
await update_managed_modrinth_version(instance.path, latestVersionId.value)
if (modpackVersionId.value && instance.value) {
await update_managed_modrinth_version(instance.value.path, modpackVersionId.value)
await onUpdateComplete.value()
}
} catch (error) {
console.error('Error updating instance:', error)
} finally {
if (serverProjectId) stopInstallingServer(serverProjectId)
}
}
function handleReport() {
if (instance.linked_data?.project_id) {
openUrl(`https://modrinth.com/report?item=project&itemID=${instance.linked_data.project_id}`)
if (instance.value?.linked_data?.project_id) {
openUrl(
`https://modrinth.com/report?item=project&itemID=${instance.value.linked_data.project_id}`,
)
}
}
@@ -323,12 +264,20 @@ function handleDecline() {
hide()
}
function show(e?: MouseEvent) {
modal.value?.show(e)
function show(
instanceVal: GameInstance,
modpackVersionIdVal: string | null = null,
callback: UpdateCompleteCallback = () => {},
e?: MouseEvent,
) {
instance.value = instanceVal
modpackVersionId.value = modpackVersionIdVal
onUpdateComplete.value = callback
diffModal.value?.show(e)
}
function hide() {
modal.value?.hide()
diffModal.value?.hide()
}
const messages = defineMessages({
@@ -345,38 +294,15 @@ const messages = defineMessages({
defaultMessage:
'An update is required to play {name}. Please update to the latest version to launch the game.',
},
publishedDate: {
id: 'app.modal.update-to-play.published-date',
defaultMessage: '{date, date, long}',
},
removedCount: {
id: 'app.modal.update-to-play.removed-count',
defaultMessage: '{count} removed',
},
addedCount: {
id: 'app.modal.update-to-play.added-count',
defaultMessage: '{count} added',
},
updatedCount: {
id: 'app.modal.update-to-play.updated-count',
defaultMessage: '{count} updated',
},
})
const diffTypeMessages = defineMessages({
added: {
id: 'app.modal.update-to-play.diff-type.added',
defaultMessage: 'Added',
},
removed: {
id: 'app.modal.update-to-play.diff-type.removed',
defaultMessage: 'Removed',
},
updated: {
id: 'app.modal.update-to-play.diff-type.updated',
defaultMessage: 'Updated',
},
const hasUpdate = computed(() => {
if (!instance.value?.linked_data) return false
return (
modpackVersionId.value != null &&
modpackVersionId.value !== instance.value.linked_data.version_id
)
})
defineExpose({ show, hide })
defineExpose({ show, hide, hasUpdate })
</script>
@@ -8,14 +8,14 @@ import {
LOCALES,
useVIntl,
} from '@modrinth/ui'
import { ref, watch } from 'vue'
import { computed, ref, watch } from 'vue'
import { get, set } from '@/helpers/settings.ts'
import i18n from '@/i18n.config'
const { formatMessage } = useVIntl()
const platform = formatMessage(languageSelectorMessages.platformApp)
const platform = computed(() => formatMessage(languageSelectorMessages.platformApp))
const settings = ref(await get())
@@ -28,10 +28,12 @@ watch(
async function purgeCache() {
await purge_cache_types([
'project',
'project_v3',
'version',
'user',
'team',
'organization',
'file',
'loader_manifest',
'minecraft_manifest',
'categories',
@@ -39,8 +41,10 @@ async function purgeCache() {
'loaders',
'game_versions',
'donation_platforms',
'file_hash',
'file_update',
'search_results',
'search_results_v3',
]).catch(handleError)
}
@@ -14,13 +14,13 @@ import {
injectNotificationManager,
OverflowMenu,
SmartClickable,
useFormatDateTime,
useRelativeTime,
useVIntl,
} from '@modrinth/ui'
import { capitalizeString } from '@modrinth/utils'
import { convertFileSrc } from '@tauri-apps/api/core'
import type { Dayjs } from 'dayjs'
import dayjs from 'dayjs'
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
import { useRouter } from 'vue-router'
@@ -36,6 +36,10 @@ import { handleSevereError } from '@/store/error'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const formatRelativeTime = useRelativeTime()
const formatDateTime = useFormatDateTime({
timeStyle: 'short',
dateStyle: 'long',
})
const router = useRouter()
@@ -80,7 +84,7 @@ const play = async (event: MouseEvent) => {
await run(props.instance.path)
.catch((err) => handleSevereError(err, { profilePath: props.instance.path }))
.finally(() => {
trackEvent('InstancePlay', {
trackEvent('InstanceStart', {
loader: props.instance.loader,
game_version: props.instance.game_version,
source: 'InstanceItem',
@@ -145,18 +149,14 @@ onUnmounted(() => {
</div>
<div class="flex items-center gap-2 text-sm text-secondary">
<div
v-tooltip="
instance.last_played
? dayjs(instance.last_played).format('MMMM D, YYYY [at] h:mm A')
: null
"
v-tooltip="instance.last_played ? formatDateTime(instance.last_played) : null"
class="w-fit shrink-0"
:class="{ 'cursor-help smart-clickable:allow-pointer-events': last_played }"
>
<template v-if="last_played">
{{
formatMessage(commonMessages.playedLabel, {
time: formatRelativeTime(last_played.toISOString?.()),
ago: formatRelativeTime(last_played.toISOString?.()),
})
}}
</template>
@@ -175,10 +175,17 @@ function refreshServer(address: string, instancePath: string) {
refreshServerData(serverData.value[address], protocolVersions.value[instancePath], address)
}
async function joinWorld(world: WorldWithProfile) {
async function joinWorld(world: WorldWithProfile, instance?: GameInstance) {
console.log(`Joining world ${getWorldIdentifier(world)}`)
if (world.type === 'server') {
await start_join_server(world.profile, world.address).catch(handleError)
if (instance) {
trackEvent('InstanceStart', {
loader: instance.loader,
game_version: instance.game_version,
source: 'WorldItem',
})
}
} else if (world.type === 'singleplayer') {
await start_join_singleplayer_world(world.profile, world.path).catch(handleError)
}
@@ -188,7 +195,7 @@ async function playInstance(instance: GameInstance) {
await run(instance.path)
.catch((err) => handleSevereError(err, { profilePath: instance.path }))
.finally(() => {
trackEvent('InstancePlay', {
trackEvent('InstanceStart', {
loader: instance.loader,
game_version: instance.game_version,
source: 'WorldItem',
@@ -317,7 +324,7 @@ onUnmounted(() => {
() => {
currentProfile = item.instance.path
currentWorld = getWorldIdentifier(item.world)
joinWorld(item.world)
joinWorld(item.world, item.instance)
}
"
@play-instance="
@@ -25,10 +25,13 @@ import {
defineMessages,
OverflowMenu,
SmartClickable,
TagItem,
useFormatDateTime,
useFormatNumber,
useRelativeTime,
useVIntl,
} from '@modrinth/ui'
import { formatNumber, getPingLevel } from '@modrinth/utils'
import { getPingLevel } from '@modrinth/utils'
import { convertFileSrc } from '@tauri-apps/api/core'
import dayjs from 'dayjs'
import { Tooltip } from 'floating-vue'
@@ -46,8 +49,15 @@ import type {
} from '@/helpers/worlds.ts'
import { getWorldIdentifier, set_world_display_status } from '@/helpers/worlds.ts'
import { LockIcon } from '../../../../../../packages/assets/generated-icons'
const { formatMessage } = useVIntl()
const formatRelativeTime = useRelativeTime()
const formatNumber = useFormatNumber()
const formatDateTime = useFormatDateTime({
timeStyle: 'short',
dateStyle: 'long',
})
const router = useRouter()
@@ -78,6 +88,8 @@ const props = withDefaults(
message: MessageDescriptor
}
managed?: boolean
// Instance
instancePath?: string
instanceName?: string
@@ -96,6 +108,7 @@ const props = withDefaults(
renderedMotd: undefined,
gameMode: undefined,
managed: false,
instancePath: undefined,
instanceName: undefined,
@@ -117,6 +130,7 @@ const serverIncompatible = computed(
)
const locked = computed(() => props.world.type === 'singleplayer' && props.world.locked)
const managed = computed(() => props.managed)
const messages = defineMessages({
hardcore: {
@@ -171,6 +185,10 @@ const messages = defineMessages({
id: 'instance.worlds.dont_show_on_home',
defaultMessage: `Don't show on Home`,
},
linkedServer: {
id: 'instance.worlds.linked_server',
defaultMessage: 'Managed by server project',
},
})
</script>
<template>
@@ -200,6 +218,14 @@ const messages = defineMessages({
<div class="text-lg text-contrast font-bold truncate smart-clickable:underline-on-hover">
{{ world.name }}
</div>
<TagItem
v-if="managed"
v-tooltip="formatMessage(messages.linkedServer)"
class="border !border-solid border-blue bg-highlight-blue text-xs"
:style="`--_color: var(--color-blue)`"
>
<LockIcon aria-hidden="true" class="h-5 w-5" />
</TagItem>
<div
v-if="world.type === 'singleplayer'"
class="text-sm text-secondary flex items-center gap-1 font-semibold"
@@ -239,7 +265,7 @@ const messages = defineMessages({
/>
<Tooltip :disabled="!hasPlayersTooltip">
<span :class="{ 'cursor-help': hasPlayersTooltip }">
{{ formatNumber(serverStatus.players?.online, false) }}
{{ formatNumber(serverStatus.players?.online) }}
online
</span>
<template #popper>
@@ -260,9 +286,7 @@ const messages = defineMessages({
</div>
<div class="flex items-center gap-2 text-sm text-secondary">
<div
v-tooltip="
world.last_played ? dayjs(world.last_played).format('MMMM D, YYYY [at] h:mm A') : null
"
v-tooltip="world.last_played ? formatDateTime(world.last_played) : null"
class="w-fit shrink-0"
:class="{
'cursor-help smart-clickable:allow-pointer-events': world.last_played,
@@ -271,7 +295,7 @@ const messages = defineMessages({
<template v-if="world.last_played">
{{
formatMessage(commonMessages.playedLabel, {
time: formatRelativeTime(dayjs(world.last_played).toISOString()),
ago: formatRelativeTime(dayjs(world.last_played).toISOString()),
})
}}
</template>
@@ -396,8 +420,12 @@ const messages = defineMessages({
id: 'edit',
action: () => emit('edit'),
shown: !instancePath,
disabled: locked,
tooltip: locked ? formatMessage(messages.worldInUse) : undefined,
disabled: locked || managed,
tooltip: locked
? formatMessage(messages.worldInUse)
: managed
? formatMessage(messages.linkedServer)
: undefined,
},
{
id: 'open-folder',
@@ -432,8 +460,12 @@ const messages = defineMessages({
hoverFilled: true,
action: () => emit('delete'),
shown: !instancePath,
disabled: locked,
tooltip: locked ? formatMessage(messages.worldInUse) : undefined,
disabled: locked || managed,
tooltip: locked
? formatMessage(messages.worldInUse)
: managed
? formatMessage(messages.linkedServer)
: undefined,
},
]"
>
@@ -1,24 +0,0 @@
import { posthog } from 'posthog-js'
export const initAnalytics = () => {
posthog.init('phc_9Iqi6lFs9sr5BSqh9RRNRSJ0mATS9PSgirDiX3iOYJ', {
persistence: 'localStorage',
api_host: 'https://posthog.modrinth.com',
})
}
export const debugAnalytics = () => {
posthog.debug()
}
export const optOutAnalytics = () => {
posthog.opt_out_capturing()
}
export const optInAnalytics = () => {
posthog.opt_in_capturing()
}
export const trackEvent = (eventName, properties) => {
posthog.capture(eventName, properties)
}
@@ -0,0 +1,80 @@
import { posthog } from 'posthog-js'
interface InstanceProperties {
loader: string
game_version: string
}
interface ProjectProperties extends InstanceProperties {
id: string
project_type: string
}
type AnalyticsEventMap = {
Launched: { version: string; dev: boolean; onboarded: boolean }
PageView: { path: string; fromPath: string; failed: unknown }
InstanceCreate: { source: string }
InstanceCreateStart: { source: string }
InstanceStart: InstanceProperties & { source: string }
InstanceStop: Partial<InstanceProperties> & { source?: string }
InstanceDuplicate: InstanceProperties
InstanceRepair: InstanceProperties
InstanceSetIcon: Record<string, never>
InstanceRemoveIcon: Record<string, never>
InstanceUpdateAll: InstanceProperties & { count: number; selected: boolean }
InstanceProjectUpdate: InstanceProperties & { id: string; name: string; project_type: string }
InstanceProjectDisable: InstanceProperties & {
id: string
name: string
project_type: string
disabled: boolean
}
InstanceProjectRemove: InstanceProperties & { id: string; name: string; project_type: string }
ProjectInstall: ProjectProperties & { version_id: string; title: string; source: string }
ProjectInstallStart: { source: string }
PackInstall: { id: string; version_id: string; title: string; source: string }
PackInstallStart: Record<string, never>
AccountLogIn: { source?: string }
AccountLogOut: Record<string, never>
JavaTest: { path: string; success: boolean }
JavaManualSelect: { version: string }
JavaAutoDetect: { path: string; version: string }
}
export type AnalyticsEvent = keyof AnalyticsEventMap
let initialized = false
export const initAnalytics = () => {
if (initialized) return
posthog.init('phc_9Iqi6lFs9sr5BSqh9RRNRSJ0mATS9PSgirDiX3iOYJ', {
persistence: 'localStorage',
api_host: 'https://posthog.modrinth.com',
})
initialized = true
}
export const debugAnalytics = () => {
if (!initialized) return
posthog.debug()
}
export const optOutAnalytics = () => {
if (!initialized) return
posthog.opt_out_capturing()
}
export const optInAnalytics = () => {
initAnalytics()
posthog.opt_in_capturing()
}
type OptionalArgs<T> = Record<string, never> extends T ? [properties?: T] : [properties: T]
export const trackEvent = <E extends AnalyticsEvent>(
eventName: E,
...args: OptionalArgs<AnalyticsEventMap[E]>
) => {
if (!initialized) return
posthog.capture(eventName, args[0])
}
+30
View File
@@ -8,6 +8,14 @@ export async function get_project_many(ids, cacheBehaviour) {
return await invoke('plugin:cache|get_project_many', { ids, cacheBehaviour })
}
export async function get_project_v3(id, cacheBehaviour) {
return await invoke('plugin:cache|get_project_v3', { id, cacheBehaviour })
}
export async function get_project_v3_many(ids, cacheBehaviour) {
return await invoke('plugin:cache|get_project_v3_many', { ids, cacheBehaviour })
}
export async function get_version(id, cacheBehaviour) {
return await invoke('plugin:cache|get_version', { id, cacheBehaviour })
}
@@ -48,6 +56,28 @@ export async function get_search_results_many(ids, cacheBehaviour) {
return await invoke('plugin:cache|get_search_results_many', { ids, cacheBehaviour })
}
export async function get_search_results_v3(id, cacheBehaviour) {
return await invoke('plugin:cache|get_search_results_v3', { id, cacheBehaviour })
}
export async function get_search_results_v3_many(ids, cacheBehaviour) {
return await invoke('plugin:cache|get_search_results_v3_many', { ids, cacheBehaviour })
}
export async function purge_cache_types(cacheTypes) {
return await invoke('plugin:cache|purge_cache_types', { cacheTypes })
}
/**
* Get versions for a project (without changelogs for fast loading).
* Uses the cache system - versions are cached for 30 minutes.
* @param {string} projectId - The project ID
* @param {string} [cacheBehaviour] - Cache behaviour ('must_revalidate', etc.)
* @returns {Promise<Array|null>} Array of version objects (without changelogs) or null
*/
export async function get_project_versions(projectId, cacheBehaviour) {
return await invoke('plugin:cache|get_project_versions', {
projectId,
cacheBehaviour,
})
}
-18
View File
@@ -1,18 +0,0 @@
import { getVersion } from '@tauri-apps/api/app'
import { fetch } from '@tauri-apps/plugin-http'
export const useFetch = async (url, item, isSilent) => {
try {
const version = await getVersion()
return await fetch(url, {
method: 'GET',
headers: { 'User-Agent': `modrinth/theseus/${version} (support@modrinth.com)` },
})
} catch (err) {
if (!isSilent) {
throw err
} else {
console.error(err)
}
}
}
-65
View File
@@ -1,65 +0,0 @@
/**
* All theseus API calls return serialized values (both return values and errors);
* So, for example, addDefaultInstance creates a blank Profile object, where the Rust struct is serialized,
* and deserialized into a usable JS object.
*/
import { invoke } from '@tauri-apps/api/core'
import { create } from './profile'
// Installs pack from a version ID
export async function create_profile_and_install(
projectId,
versionId,
packTitle,
iconUrl,
createInstanceCallback = () => {},
) {
const location = {
type: 'fromVersionId',
project_id: projectId,
version_id: versionId,
title: packTitle,
icon_url: iconUrl,
}
const profile_creator = await invoke('plugin:pack|pack_get_profile_from_pack', { location })
const profile = await create(
profile_creator.name,
profile_creator.gameVersion,
profile_creator.modloader,
profile_creator.loaderVersion,
null,
true,
)
createInstanceCallback(profile)
return await invoke('plugin:pack|pack_install', { location, profile })
}
export async function install_to_existing_profile(projectId, versionId, title, profilePath) {
const location = {
type: 'fromVersionId',
project_id: projectId,
version_id: versionId,
title,
}
return await invoke('plugin:pack|pack_install', { location, profile: profilePath })
}
// Installs pack from a path
export async function create_profile_and_install_from_file(path) {
const location = {
type: 'fromFile',
path: path,
}
const profile_creator = await invoke('plugin:pack|pack_get_profile_from_pack', { location })
const profile = await create(
profile_creator.name,
profile_creator.gameVersion,
profile_creator.modloader,
profile_creator.loaderVersion,
null,
true,
)
return await invoke('plugin:pack|pack_install', { location, profile })
}
+90
View File
@@ -0,0 +1,90 @@
import { invoke } from '@tauri-apps/api/core'
import { create } from './profile'
import type { InstanceLoader } from './types'
interface PackProfileCreator {
name: string
gameVersion: string
modloader: InstanceLoader
loaderVersion: string | null
}
interface PackLocationVersionId {
type: 'fromVersionId'
project_id: string
version_id: string
title: string
icon_url?: string
}
interface PackLocationFile {
type: 'fromFile'
path: string
}
export async function create_profile_and_install(
projectId: string,
versionId: string,
packTitle: string,
iconUrl?: string,
createInstanceCallback: (profile: string) => void = () => {},
): Promise<void> {
const location: PackLocationVersionId = {
type: 'fromVersionId',
project_id: projectId,
version_id: versionId,
title: packTitle,
icon_url: iconUrl,
}
const profile_creator = await invoke<PackProfileCreator>(
'plugin:pack|pack_get_profile_from_pack',
{ location },
)
const profile = await create(
profile_creator.name,
profile_creator.gameVersion,
profile_creator.modloader,
profile_creator.loaderVersion,
null,
true,
)
createInstanceCallback(profile)
return await invoke('plugin:pack|pack_install', { location, profile })
}
export async function install_to_existing_profile(
projectId: string,
versionId: string,
title: string,
profilePath: string,
): Promise<void> {
const location: PackLocationVersionId = {
type: 'fromVersionId',
project_id: projectId,
version_id: versionId,
title,
}
return await invoke('plugin:pack|pack_install', { location, profile: profilePath })
}
export async function create_profile_and_install_from_file(path: string): Promise<void> {
const location: PackLocationFile = {
type: 'fromFile',
path,
}
const profile_creator = await invoke<PackProfileCreator>(
'plugin:pack|pack_get_profile_from_pack',
{ location },
)
const profile = await create(
profile_creator.name,
profile_creator.gameVersion,
profile_creator.modloader,
profile_creator.loaderVersion,
null,
true,
)
return await invoke('plugin:pack|pack_install', { location, profile })
}
-207
View File
@@ -1,207 +0,0 @@
/**
* All theseus API calls return serialized values (both return values and errors);
* So, for example, addDefaultInstance creates a blank Profile object, where the Rust struct is serialized,
* and deserialized into a usable JS object.
*/
import { invoke } from '@tauri-apps/api/core'
import { install_to_existing_profile } from '@/helpers/pack.js'
/// Add instance
/*
name: String, // the name of the profile, and relative path to create
game_version: String, // the game version of the profile
modloader: ModLoader, // the modloader to use
- ModLoader is an enum, with the following variants: Vanilla, Forge, Fabric, Quilt
loader_version: String, // the modloader version to use, set to "latest", "stable", or the ID of your chosen loader
icon: Path, // the icon for the profile
- icon is a path to an image file, which will be copied into the profile directory
*/
export async function create(name, gameVersion, modloader, loaderVersion, icon, skipInstall) {
//Trim string name to avoid "Unable to find directory"
name = name.trim()
return await invoke('plugin:profile-create|profile_create', {
name,
gameVersion,
modloader,
loaderVersion,
icon,
skipInstall,
})
}
// duplicate a profile
export async function duplicate(path) {
return await invoke('plugin:profile-create|profile_duplicate', { path })
}
// Remove a profile
export async function remove(path) {
return await invoke('plugin:profile|profile_remove', { path })
}
// Get a profile by path
// Returns a Profile
export async function get(path) {
return await invoke('plugin:profile|profile_get', { path })
}
export async function get_many(paths) {
return await invoke('plugin:profile|profile_get_many', { paths })
}
// Get a profile's projects
// Returns a map of a path to profile file
export async function get_projects(path, cacheBehaviour) {
return await invoke('plugin:profile|profile_get_projects', { path, cacheBehaviour })
}
// Get a profile's full fs path
// Returns a path
export async function get_full_path(path) {
return await invoke('plugin:profile|profile_get_full_path', { path })
}
// Get's a mod's full fs path
// Returns a path
export async function get_mod_full_path(path, projectPath) {
return await invoke('plugin:profile|profile_get_mod_full_path', { path, projectPath })
}
// Get optimal java version from profile
// Returns a java version
export async function get_optimal_jre_key(path) {
return await invoke('plugin:profile|profile_get_optimal_jre_key', { path })
}
// Get a copy of the profile set
// Returns hashmap of path -> Profile
export async function list() {
return await invoke('plugin:profile|profile_list')
}
export async function check_installed(path, projectId) {
return await invoke('plugin:profile|profile_check_installed', { path, projectId })
}
// Installs/Repairs a profile
export async function install(path, force) {
return await invoke('plugin:profile|profile_install', { path, force })
}
// Updates all of a profile's projects
export async function update_all(path) {
return await invoke('plugin:profile|profile_update_all', { path })
}
// Updates a specified project
export async function update_project(path, projectPath) {
return await invoke('plugin:profile|profile_update_project', { path, projectPath })
}
// Add a project to a profile from a version
// Returns a path to the new project file
export async function add_project_from_version(path, versionId) {
return await invoke('plugin:profile|profile_add_project_from_version', { path, versionId })
}
// Add a project to a profile from a path + project_type
// Returns a path to the new project file
export async function add_project_from_path(path, projectPath, projectType) {
return await invoke('plugin:profile|profile_add_project_from_path', {
path,
projectPath,
projectType,
})
}
// Toggle disabling a project
export async function toggle_disable_project(path, projectPath) {
return await invoke('plugin:profile|profile_toggle_disable_project', { path, projectPath })
}
// Remove a project
export async function remove_project(path, projectPath) {
return await invoke('plugin:profile|profile_remove_project', { path, projectPath })
}
// Update a managed Modrinth profile to a specific version
export async function update_managed_modrinth_version(path, versionId) {
return await invoke('plugin:profile|profile_update_managed_modrinth_version', {
path,
versionId,
})
}
// Repair a managed Modrinth profile
export async function update_repair_modrinth(path) {
return await invoke('plugin:profile|profile_repair_managed_modrinth', { path })
}
// Export a profile to .mrpack
/// included_overrides is an array of paths to override folders to include (ie: 'mods', 'resource_packs')
// Version id is optional (ie: 1.1.5)
export async function export_profile_mrpack(
path,
exportLocation,
includedOverrides,
versionId,
description,
name,
) {
return await invoke('plugin:profile|profile_export_mrpack', {
path,
exportLocation,
includedOverrides,
versionId,
description,
name,
})
}
// Given a folder path, populate an array of all the subfolders
// Intended to be used for finding potential override folders
// profile
// -- mods
// -- resourcepacks
// -- file1
// => [mods, resourcepacks]
// allows selection for 'included_overrides' in export_profile_mrpack
export async function get_pack_export_candidates(profilePath) {
return await invoke('plugin:profile|profile_get_pack_export_candidates', { profilePath })
}
// Run Minecraft using a pathed profile
// Returns PID of child
export async function run(path) {
return await invoke('plugin:profile|profile_run', { path })
}
export async function kill(path) {
return await invoke('plugin:profile|profile_kill', { path })
}
// Edits a profile
export async function edit(path, editProfile) {
return await invoke('plugin:profile|profile_edit', { path, editProfile })
}
// Edits a profile's icon
export async function edit_icon(path, iconPath) {
return await invoke('plugin:profile|profile_edit_icon', { path, iconPath })
}
export async function finish_install(instance) {
if (instance.install_stage !== 'pack_installed') {
let linkedData = instance.linked_data
await install_to_existing_profile(
linkedData.project_id,
linkedData.version_id,
instance.name,
instance.path,
)
} else {
await install(instance.path, false)
}
}
+298
View File
@@ -0,0 +1,298 @@
/**
* All theseus API calls return serialized values (both return values and errors);
* So, for example, addDefaultInstance creates a blank Profile object, where the Rust struct is serialized,
* and deserialized into a usable JS object.
*/
import type { Labrinth } from '@modrinth/api-client'
import type { ContentItem, ContentOwner } from '@modrinth/ui'
import { invoke } from '@tauri-apps/api/core'
import { install_to_existing_profile } from '@/helpers/pack'
import type {
CacheBehaviour,
ContentFile,
ContentFileProjectType,
GameInstance,
InstanceLoader,
} from './types'
// Add instance
/*
name: String, // the name of the profile, and relative path to create
game_version: String, // the game version of the profile
modloader: ModLoader, // the modloader to use
- ModLoader is an enum, with the following variants: Vanilla, Forge, Fabric, Quilt
loader_version: String, // the modloader version to use, set to "latest", "stable", or the ID of your chosen loader
icon: Path, // the icon for the profile
- icon is a path to an image file, which will be copied into the profile directory
*/
export async function create(
name: string,
gameVersion: string,
modloader: InstanceLoader,
loaderVersion: string | null,
icon: string | null,
skipInstall: boolean,
linkedData?: { project_id: string; version_id: string; locked: boolean } | null,
): Promise<string> {
// Trim string name to avoid "Unable to find directory"
name = name.trim()
return await invoke('plugin:profile-create|profile_create', {
name,
gameVersion,
modloader,
loaderVersion,
icon,
skipInstall,
linkedData,
})
}
// duplicate a profile
export async function duplicate(path: string): Promise<string> {
return await invoke('plugin:profile-create|profile_duplicate', { path })
}
// Remove a profile
export async function remove(path: string): Promise<void> {
return await invoke('plugin:profile|profile_remove', { path })
}
// Get a profile by path
// Returns a Profile
export async function get(path: string): Promise<GameInstance | null> {
return await invoke('plugin:profile|profile_get', { path })
}
export async function get_many(paths: string[]): Promise<GameInstance[]> {
return await invoke('plugin:profile|profile_get_many', { paths })
}
// Get a profile's projects
// Returns a map of a path to profile file
export async function get_projects(
path: string,
cacheBehaviour?: CacheBehaviour,
): Promise<Record<string, ContentFile>> {
return await invoke('plugin:profile|profile_get_projects', { path, cacheBehaviour })
}
// Get just the installed project IDs for a profile (lightweight, skips update checks)
export async function get_installed_project_ids(path: string): Promise<string[]> {
return await invoke('plugin:profile|profile_get_installed_project_ids', { path })
}
// Get content items with rich metadata for a profile
// Returns content items filtered to exclude modpack files (if linked),
// sorted alphabetically by project name
export async function get_content_items(
path: string,
cacheBehaviour?: CacheBehaviour,
): Promise<ContentItem[]> {
return await invoke('plugin:profile|profile_get_content_items', { path, cacheBehaviour })
}
// Linked modpack info returned from backend
export interface LinkedModpackInfo {
project: Labrinth.Projects.v2.Project
version: Labrinth.Versions.v2.Version
owner: ContentOwner | null
has_update: boolean
update_version_id: string | null
update_version: Labrinth.Versions.v2.Version | null
}
// Get linked modpack info for a profile
// Returns project, version, and owner information for the linked modpack,
// or null if the profile is not linked to a modpack
export async function get_linked_modpack_info(
path: string,
cacheBehaviour?: CacheBehaviour,
): Promise<LinkedModpackInfo | null> {
return await invoke('plugin:profile|profile_get_linked_modpack_info', { path, cacheBehaviour })
}
// Get content items that are part of the linked modpack
// Returns the modpack's dependencies as ContentItem list
// Returns empty array if the profile is not linked to a modpack
export async function get_linked_modpack_content(
path: string,
cacheBehaviour?: CacheBehaviour,
): Promise<ContentItem[]> {
return await invoke('plugin:profile|profile_get_linked_modpack_content', { path, cacheBehaviour })
}
// Convert a list of dependencies into ContentItems with rich metadata
export async function get_dependencies_as_content_items(
dependencies: Labrinth.Versions.v3.Dependency[],
cacheBehaviour?: CacheBehaviour,
): Promise<ContentItem[]> {
return await invoke('plugin:profile|profile_get_dependencies_as_content_items', {
dependencies,
cacheBehaviour,
})
}
// Get a profile's full fs path
// Returns a path
export async function get_full_path(path: string): Promise<string> {
return await invoke('plugin:profile|profile_get_full_path', { path })
}
// Get's a mod's full fs path
// Returns a path
export async function get_mod_full_path(path: string, projectPath: string): Promise<string> {
return await invoke('plugin:profile|profile_get_mod_full_path', { path, projectPath })
}
// Get optimal java version from profile
// Returns a java version
export async function get_optimal_jre_key(path: string): Promise<string | null> {
return await invoke('plugin:profile|profile_get_optimal_jre_key', { path })
}
// Get a copy of the profile set
// Returns hashmap of path -> Profile
export async function list(): Promise<GameInstance[]> {
return await invoke('plugin:profile|profile_list')
}
export async function check_installed(path: string, projectId: string): Promise<boolean> {
return await invoke('plugin:profile|profile_check_installed', { path, projectId })
}
export async function check_installed_batch(projectId: string): Promise<Record<string, boolean>> {
return await invoke('plugin:profile|profile_check_installed_batch', { projectId })
}
// Installs/Repairs a profile
export async function install(path: string, force: boolean): Promise<void> {
return await invoke('plugin:profile|profile_install', { path, force })
}
// Updates all of a profile's projects
export async function update_all(path: string): Promise<Record<string, string>> {
return await invoke('plugin:profile|profile_update_all', { path })
}
// Updates a specified project
export async function update_project(path: string, projectPath: string): Promise<string> {
return await invoke('plugin:profile|profile_update_project', { path, projectPath })
}
// Add a project to a profile from a version
// Returns a path to the new project file
export async function add_project_from_version(path: string, versionId: string): Promise<string> {
return await invoke('plugin:profile|profile_add_project_from_version', { path, versionId })
}
// Add a project to a profile from a path + project_type
// Returns a path to the new project file
export async function add_project_from_path(
path: string,
projectPath: string,
projectType?: ContentFileProjectType,
): Promise<string> {
return await invoke('plugin:profile|profile_add_project_from_path', {
path,
projectPath,
projectType,
})
}
// Toggle disabling a project
export async function toggle_disable_project(path: string, projectPath: string): Promise<string> {
return await invoke('plugin:profile|profile_toggle_disable_project', { path, projectPath })
}
// Remove a project
export async function remove_project(path: string, projectPath: string): Promise<void> {
return await invoke('plugin:profile|profile_remove_project', { path, projectPath })
}
// Update a managed Modrinth profile to a specific version
export async function update_managed_modrinth_version(
path: string,
versionId: string,
): Promise<void> {
return await invoke('plugin:profile|profile_update_managed_modrinth_version', {
path,
versionId,
})
}
// Repair a managed Modrinth profile
export async function update_repair_modrinth(path: string): Promise<void> {
return await invoke('plugin:profile|profile_repair_managed_modrinth', { path })
}
// Export a profile to .mrpack
// included_overrides is an array of paths to override folders to include (ie: 'mods', 'resource_packs')
// Version id is optional (ie: 1.1.5)
export async function export_profile_mrpack(
path: string,
exportLocation: string,
includedOverrides: string[],
versionId?: string,
description?: string,
name?: string,
): Promise<void> {
return await invoke('plugin:profile|profile_export_mrpack', {
path,
exportLocation,
includedOverrides,
versionId,
description,
name,
})
}
// Given a folder path, populate an array of all the subfolders
// Intended to be used for finding potential override folders
// profile
// -- mods
// -- resourcepacks
// -- file1
// => [mods, resourcepacks]
// allows selection for 'included_overrides' in export_profile_mrpack
export async function get_pack_export_candidates(profilePath: string): Promise<string[]> {
return await invoke('plugin:profile|profile_get_pack_export_candidates', { profilePath })
}
// Run Minecraft using a pathed profile
// Returns PID of child
export async function run(path: string, serverAddress: string | null = null): Promise<unknown> {
return await invoke('plugin:profile|profile_run', { path, serverAddress })
}
export async function kill(path: string): Promise<void> {
return await invoke('plugin:profile|profile_kill', { path })
}
// Edits a profile
export async function edit(path: string, editProfile: Partial<GameInstance>): Promise<void> {
return await invoke('plugin:profile|profile_edit', { path, editProfile })
}
// Edits a profile's icon
export async function edit_icon(path: string, iconPath: string | null): Promise<void> {
return await invoke('plugin:profile|profile_edit_icon', { path, iconPath })
}
export async function finish_install(instance: GameInstance): Promise<void> {
if (instance.install_stage !== 'pack_installed') {
const linkedData = instance.linked_data
if (linkedData) {
await install_to_existing_profile(
linkedData.project_id,
linkedData.version_id,
instance.name,
instance.path,
)
}
} else {
await install(instance.path, false)
}
}
+6 -18
View File
@@ -1,6 +1,6 @@
import type { ModrinthId } from '@modrinth/utils'
type GameInstance = {
export type GameInstance = {
path: string
install_stage: InstallStage
@@ -46,20 +46,13 @@ type LinkedData = {
locked: boolean
}
type InstanceLoader = 'vanilla' | 'forge' | 'fabric' | 'quilt' | 'neoforge'
export type InstanceLoader = 'vanilla' | 'forge' | 'fabric' | 'quilt' | 'neoforge'
type ContentFile = {
hash: string
file_name: string
size: number
metadata?: FileMetadata
update_version_id?: string
project_type: ContentFileProjectType
}
type FileMetadata = {
project_id: string
version_id: string
metadata?: {
project_id: string
version_id: string
}
}
type ContentFileProjectType = 'mod' | 'datapack' | 'resourcepack' | 'shaderpack'
@@ -135,8 +128,3 @@ type AppSettings = {
prev_custom_dir?: string
migrated: boolean
}
export type InstanceSettingsTabProps = {
instance: GameInstance
offline?: boolean
}
+150 -1
View File
@@ -141,7 +141,12 @@ export async function add_server_to_profile(
address: string,
packStatus: ServerPackStatus,
): Promise<number> {
return await invoke('plugin:worlds|add_server_to_profile', { path, name, address, packStatus })
return await invoke('plugin:worlds|add_server_to_profile', {
path,
name,
address,
packStatus,
})
}
export async function edit_server_in_profile(
@@ -212,6 +217,150 @@ export function isServerWorld(world: World): world is ServerWorld {
return world.type === 'server'
}
const DEFAULT_MINECRAFT_SERVER_PORT = 25565
function parseServerPort(port: string): number | null {
const parsed = Number.parseInt(port, 10)
return Number.isInteger(parsed) && parsed > 0 && parsed <= 65535 ? parsed : null
}
function parseServerHost(address: string): string {
const trimmedAddress = address.trim()
if (!trimmedAddress) return ''
if (trimmedAddress.startsWith('[')) {
const closingBracket = trimmedAddress.indexOf(']')
if (closingBracket > 0) {
return trimmedAddress.slice(1, closingBracket).trim().toLowerCase()
}
}
const firstColon = trimmedAddress.indexOf(':')
const lastColon = trimmedAddress.lastIndexOf(':')
if (firstColon !== -1 && firstColon === lastColon) {
return trimmedAddress.slice(0, firstColon).trim().toLowerCase()
}
return trimmedAddress.toLowerCase()
}
function isIPv4Host(host: string): boolean {
const segments = host.split('.')
if (segments.length !== 4) return false
return segments.every((segment) => {
if (!/^\d+$/.test(segment)) return false
const value = Number.parseInt(segment, 10)
return value >= 0 && value <= 255
})
}
/**
* Normalization converts addresses to a canonical form (lowercase-host:port, default port 25565)
*/
export function normalizeServerAddress(address: string): string {
const trimmedAddress = address.trim()
const host = parseServerHost(trimmedAddress)
if (!host) return ''
let port = DEFAULT_MINECRAFT_SERVER_PORT
// ipv6 address
if (trimmedAddress.startsWith('[')) {
const closingBracket = trimmedAddress.indexOf(']')
if (closingBracket > 0) {
const suffix = trimmedAddress.slice(closingBracket + 1)
if (suffix.startsWith(':')) {
const parsedPort = parseServerPort(suffix.slice(1))
if (parsedPort != null) {
port = parsedPort
}
}
}
// ipv4 address or hostname
} else {
const firstColon = trimmedAddress.indexOf(':')
const lastColon = trimmedAddress.lastIndexOf(':')
if (firstColon !== -1 && firstColon === lastColon) {
const parsedPort = parseServerPort(trimmedAddress.slice(firstColon + 1))
if (parsedPort != null) {
port = parsedPort
}
}
}
return `${host}:${port}`
}
/**
* Domain key used for deduping server entries by removing a single leading subdomain.
* Example: test.cobblemon.gg and cobblemon.gg map to cobblemon.gg
*/
export function getServerDomainKey(address: string): string {
const normalizedAddress = normalizeServerAddress(address)
if (!normalizedAddress) return ''
const separator = normalizedAddress.lastIndexOf(':')
if (separator <= 0 || separator === normalizedAddress.length - 1) return normalizedAddress
const host = normalizedAddress.slice(0, separator).replace(/\.+$/, '')
if (!host) return normalizedAddress
if (host.includes(':') || isIPv4Host(host)) return normalizedAddress
const segments = host.split('.').filter(Boolean)
if (segments.length <= 2) return host
return segments.slice(1).join('.')
}
export function resolveManagedServerWorld(
worlds: World[],
managedName: string | null | undefined,
managedAddress: string | null | undefined,
): ServerWorld | null {
if (!managedName || !managedAddress) return null
const normalizedManagedAddress = normalizeServerAddress(managedAddress)
if (!normalizedManagedAddress) return null
const servers = worlds
.filter(isServerWorld)
.slice()
.sort((a, b) => a.index - b.index)
const exactMatch = servers.find(
(server) =>
server.name === managedName &&
normalizeServerAddress(server.address) === normalizedManagedAddress,
)
if (exactMatch) return exactMatch
return (
servers.find((server) => normalizeServerAddress(server.address) === normalizedManagedAddress) ??
null
)
}
export async function getServerLatency(
address: string,
protocolVersion: ProtocolVersion | null = null,
): Promise<number | undefined> {
const pings: number[] = []
for (let i = 0; i < 3; i++) {
try {
const status = await get_server_status(address, protocolVersion)
if (status.ping != null) {
pings.push(status.ping)
}
} catch {
// Ignore individual ping failures
}
}
if (pings.length === 0) return undefined
return Math.round(pings.reduce((sum, p) => sum + p, 0) / pings.length)
}
export async function refreshServerData(
serverData: ServerData,
protocolVersion: ProtocolVersion | null,
+2 -1
View File
@@ -1,4 +1,5 @@
import { buildLocaleMessages, createMessageCompiler, type CrowdinMessages } from '@modrinth/ui'
import { uiLocaleModulesEager } from '@modrinth/ui/src/locales.eager.ts'
import { createI18n } from 'vue-i18n'
const localeModules = import.meta.glob<{ default: CrowdinMessages }>('./locales/*/index.json', {
@@ -12,7 +13,7 @@ const i18n = createI18n({
messageCompiler: createMessageCompiler(),
missingWarn: false,
fallbackWarn: false,
messages: buildLocaleMessages(localeModules),
messages: buildLocaleMessages(localeModules, uiLocaleModulesEager),
})
export default i18n
+137 -161
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "تعذر الوصول إلى خوادم المصادقة"
},
"app.export-modal.description-placeholder": {
"message": "ادخل وصف التعديل..."
},
"app.export-modal.export-button": {
"message": "تصدير"
},
"app.export-modal.header": {
"message": "تصدير حزمة التعديل"
},
"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": "رقم الإصدار"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "سيتم حذف جميع البيانات الخاصة بمثيلك نهائيًا، بما في ذلك عوالمك والتكوينات وكل المحتوى المثبت."
},
"app.instance.confirm-delete.admonition-header": {
"message": "لا يمكن التراجع عن هذا الإجراء"
},
"app.instance.confirm-delete.delete-button": {
"message": "حذف المثيل"
},
"app.instance.confirm-delete.header": {
"message": "حذف المثيل"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "تم تثبيت حزمة التعديل هذه بالفعل في مثيل \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "حزمة تعديل مكررة"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "إنشاء على أي حال"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "انتقل إلى المثال"
},
"app.instance.modpack-already-installed.header": {
"message": "تم تثبيت حزمة التعديل بالفعل"
},
"app.instance.mods.content-type-project": {
"message": "مشروع"
},
"app.instance.mods.copy-link": {
"message": "نسخ الرابط"
},
"app.instance.mods.installing": {
"message": "جاري التثبيت..."
},
"app.instance.mods.modpack-fallback": {
"message": "حزمة التعديل"
},
"app.instance.mods.project-was-added": {
"message": "تمت إضافة \"{name}\"."
},
"app.instance.mods.projects-were-added": {
"message": "تمت إضافة {count} من المشاريع"
},
"app.instance.mods.share-text": {
"message": "تحقق من المشاريع التي أستخدمها في حزمة التعديل الخاص بي!"
},
"app.instance.mods.share-title": {
"message": "مشاركة محتوى حزمة التعديل"
},
"app.instance.mods.show-file": {
"message": "عرض الملف"
},
"app.instance.mods.successfully-uploaded": {
"message": "تم الرفع بنجاح"
},
"app.instance.mods.unknown-version": {
"message": "غير معروف"
},
"app.instance.mods.updating": {
"message": "جارٍ التحديث..."
},
"app.modal.install-to-play.content-required": {
"message": "المحتوى مطلوب"
},
"app.modal.install-to-play.header": {
"message": "نزل للعب"
},
@@ -14,14 +104,20 @@
"app.modal.install-to-play.mod-count": {
"message": ""
},
"app.modal.update-to-play.diff-type.added": {
"message": "تم إضافة"
"app.modal.install-to-play.required-modpack": {
"message": "حزمة التعديل مطلوبة"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "تم إزالة"
"app.modal.install-to-play.server-requires-mods": {
"message": "يتطلب هذا الخادم تعديلات للعب. انقر فوق \"تثبيت\" لإعداد الملفات المطلوبة من Modrinth، ثم قم بتشغيله مباشرة إلى الخادم."
},
"app.modal.update-to-play.diff-type.updated": {
"message": "تم تحديث"
"app.modal.install-to-play.shared-instance": {
"message": "حُزْمَة مشاركة"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "حُزْمَة خادم مشاركة"
},
"app.modal.install-to-play.view-contents": {
"message": "عرض المحتويات"
},
"app.modal.update-to-play.header": {
"message": "حدث للعب"
@@ -29,6 +125,9 @@
"app.modal.update-to-play.update-required": {
"message": "يلزم التحديث"
},
"app.modal.update-to-play.update-required-description": {
"message": "هناك تحديث لازم للعب بـ {name}. الرجاء التحديث إلى آخر اصدار لتشغيل اللعبة."
},
"app.settings.developer-mode-enabled": {
"message": "تم تفعيل وضع المطوّر."
},
@@ -56,33 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "إدارة الموارد"
},
"app.update-toast.body": {
"message": "تطبيق Modrinth الإصدار {version} جاهز للتثبيت!\nأعد التحميل لتحديث التطبيق الآن، أو سيتم التحديث تلقائيًا عند إغلاق تطبيق Modrinth."
"app.update-popup.body": {
"message": "تطبيق Modrinth v{version} جاهز للتثبيت! أعد التحميل للتحديث الآن، أو تلقائيًا عند إغلاق تطبيق Modrinth."
},
"app.update-toast.body.download-complete": {
"message": "تطبيق Modrinth الإصدار {version} جاهز للتثبيت!\nأعد التحميل لتحديث التطبيق الآن، أو سيتم التحديث تلقائيًا عند إغلاق تطبيق Modrinth."
"app.update-popup.body.download-complete": {
"message": "انتهى تنزيل تطبيق Modrinth v{version}. أعد التحميل للتحديث الآن، أو تلقائيًا عند إغلاق تطبيق Modrinth."
},
"app.update-toast.body.metered": {
"message": "تطبيق Modrinth الإصدار {version} متاح الآن!\nنظرًا لأنك تستخدم شبكة محدودة البيانات، لم نقم بتنزيل التحديث تلقائيًا.\n"
"app.update-popup.body.linux": {
"message": "تطبيق Modrinth v {version} متاح. استخدم مدير الحزم الخاص بك للتحديث للحصول على أحدث الميزات والإصلاحات!"
},
"app.update-toast.changelog": {
"message": "سجلّ التغييرات"
"app.update-popup.body.metered": {
"message": "تطبيق Modrinth v{version} متاح الآن! وبما أنك متصل بشبكة مقيّدة، لم نقم بتنزيله تلقائيًا."
},
"app.update-toast.download": {
"app.update-popup.changelog": {
"message": "سجل التغيير"
},
"app.update-popup.download": {
"message": "تنزيل ({size})"
},
"app.update-toast.downloading": {
"message": "جار التنزيل..."
"app.update-popup.download-complete": {
"message": "اكتمل التنزيل"
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "إعادة تحميل"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "تحديث متاح"
},
"app.update-toast.title.download-complete": {
"message": "اكتمل التنزيل"
},
"app.update.complete-toast.text": {
"message": "انقر هنا لعرض سجلّ التغييرات."
},
@@ -197,12 +296,6 @@
"instance.edit-world.title": {
"message": "تعديل العالم"
},
"instance.filter.disabled": {
"message": "المشاريع المعطَّلة"
},
"instance.filter.updates-available": {
"message": "توجد تحديثات متاحة"
},
"instance.server-modal.address": {
"message": "العنوان"
},
@@ -210,7 +303,7 @@
"message": "الاسم"
},
"instance.server-modal.placeholder-name": {
"message": "خادم ماينكرافت"
"message": "خادم Minecraft"
},
"instance.server-modal.resource-pack": {
"message": "حزمة الموارد"
@@ -311,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "تثبيت"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} لماينكرافت {game_version} مثبت بالفعل"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "فانيلا {game_version} مُثبّتة بالفعل"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "تغيير الإصدار"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "تثبيت"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "جاري التثبيت"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "جاري جلب إصدارات حزمة المودات"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "جاري تثبيت الإصدار الجديد"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "المثبت حاليًا"
},
"instance.settings.tabs.installation.debug-information": {
"message": "معلومات التصحيح:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "جاري جلب تفاصيل حزمة المودات"
},
"instance.settings.tabs.installation.game-version": {
"message": "إصدار اللعبة"
},
"instance.settings.tabs.installation.install": {
"message": "تثبيت"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "التثبيت قيد التنفيذ"
},
"instance.settings.tabs.installation.loader-version": {
"message": "إصدار {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "ماين كرافت {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "تعذّر جلب تفاصيل حزمة المودات المرتبطة. يرجى التحقق من اتصالك بالإنترنت."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} غير متاح لماين كرافت {version}. جرّب محمّل مودات آخر."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "هذه النسخة مرتبطة بحزمة مودات، لكن لم يتم العثور على الحزمة على مودرنث."
},
"instance.settings.tabs.installation.platform": {
"message": "منصّة"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "إعادة تثبيت حزمة المودات"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "جاري إعادة تثبيت حزمة المودات"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "إعادة التثبيت ستُعيد جميع الملفات المثبتة أو المعدلة إلى ما توفره حُزْمة المودات، مع إزالة أي مودات أو محتوى أضفته بعد التثبيت الأصلي. قد يساعد ذلك في حل السلوك غير المتوقع إذا تم تعديل النسخة، لكن إذا كانت عوالمك تعتمد على محتويات إضافية، فقد يتسبب ذلك في تعطلها."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "هل أنت متأكد أنك تريد إعادة تثبيت هذه النسخة؟"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "يعيد محتوى النسخة إلى حالته الأصلية، مع إزالة جميع المودات أو المحتوى الذي أُضيف فوق حزمة المودات الأصلية."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "إعادة تثبيت حزمة المودات"
},
"instance.settings.tabs.installation.repair.button": {
"message": "إصلاح"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "جاري الإصلاح"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "الإصلاح يعيد تثبيت مكوّنات ماين كرافت ويتحقق من التلف. قد يساعد ذلك في حل المشكلات إذا كانت لعبتك لا تعمل بسبب أخطاء متعلقة ببرنامج التشغيل، لكنه لن يحل المشكلات أو الأعطال الناتجة عن المودات المثبّتة."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "إصلاح النسخة؟"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "الإصلاح قيد التنفيذ"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "إعادة التعيين إلى الحالة الحالية"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "عرض جميع الإصدارات"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "تغيير الإصدار"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "تثبيت"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "إعادة التثبيت"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "إصلاح"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "لا يمكن {action} أثناء التثبيت"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "لا يمكن {action} أثناء عدم الاتصال بالإنترنت"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "لا يمكن {action} أثناء الإصلاح"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(إصدار غير معروف)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "إلغاء ربط النسخة"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "إذا تابعت، فلن تتمكّن من إعادة ربطها إلا بإنشاء نسخة جديدة بالكامل. لن تتلقى بعد ذلك تحديثات حزمة المودات، وستصبح نسخة عادية."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "هل أنت متأكد أنك تريد إلغاء ربط هذه النسخة؟"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "هذه النسخة مرتبطة بحزمة مودات، مما يعني أنه لا يمكن تحديث المودات أو تغيير محمّل المودات أو إصدار ماين كرافت. سيؤدي إلغاء الربط إلى فصل هذه النسخة نهائيًا عن حزمة المودات."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "إلغاء الربط من حزمة المودات"
},
"instance.settings.tabs.java": {
"message": "جافا والذاكرة"
},
@@ -518,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "الخادم غير متوافق"
},
"instance.worlds.linked_server": {
"message": "تدار بواسطة مشروع الخادم"
},
"instance.worlds.no_contact": {
"message": "تعذّر الاتصال بالخادم"
},
@@ -553,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "مزامنة مع النسخة"
},
"search.filter.locked.server": {
"message": "يقدمها الخادم"
},
"search.filter.locked.server-environment.title": {
"message": "يمكن إضافة التعديلات من جانب العميل فقط إلى مثيل الخادم"
},
"search.filter.locked.server-game-version.title": {
"message": "يتم توفير نسخة اللعبة من قبل الخادم"
},
"search.filter.locked.server-loader.title": {
"message": "يتم توفير المحمّل من قبل الخادم"
}
}
+18 -198
View File
@@ -5,6 +5,12 @@
"app.auth-servers.unreachable.header": {
"message": "Připojení k autorizačním serverům se nezdařilo"
},
"app.export-modal.description-placeholder": {
"message": "Přidej popis modpacku..."
},
"app.instance.confirm-delete.admonition-body": {
"message": "Všechna data z instance budou navždy smazána, včetně světů, nastavení a všeho ostatního."
},
"app.modal.install-to-play.header": {
"message": "Nainstaluj ke hraní"
},
@@ -14,48 +20,21 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural,one {#mód} other {#módy}}"
},
"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-by-today": {
"message": "{name} dnes s vámi sdílel tuto instanci."
},
"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.update-to-play.added-count": {
"message": "{count} přidáno"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Přidáno"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Odebráno"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Aktualizováno"
},
"app.modal.update-to-play.header": {
"message": "Updatuj ke hraní"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} odstraněno"
},
"app.modal.update-to-play.update-required": {
"message": "Je vyžadována aktualizace"
},
"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.modal.update-to-play.updated-count": {
"message": "{count} aktualizováno"
},
"app.settings.developer-mode-enabled": {
"message": "Vývojářský režim povolen."
},
@@ -83,38 +62,8 @@
"app.settings.tabs.resource-management": {
"message": "Správa zdrojů"
},
"app.update-toast.body": {
"message": "Aplikace Modrinth v{version} je připravena k instalaci! Nainstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
},
"app.update-toast.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-toast.body.linux": {
"message": "Modrinth App v{version} je k dispozici. Aktualizujte pomocí svého správce balíčků, abyste získali nejnovější funkce a opravy!"
},
"app.update-toast.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-toast.changelog": {
"message": "Seznam změn"
},
"app.update-toast.download": {
"message": "Stahování ({size})"
},
"app.update-toast.download-page": {
"message": "Stáhnout"
},
"app.update-toast.downloading": {
"message": "Stahování..."
},
"app.update-toast.reload": {
"message": "Načíst znovu"
},
"app.update-toast.title": {
"message": "Aktualizace je k dispozici"
},
"app.update-toast.title.download-complete": {
"message": "Stahování bylo dokončeno"
"app.update-popup.download": {
"message": "Stáhnout ({size})"
},
"app.update.complete-toast.text": {
"message": "Kliknutím sem zobrazíte seznam změn."
@@ -230,12 +179,6 @@
"instance.edit-world.title": {
"message": "Upravit svět"
},
"instance.filter.disabled": {
"message": "Vypnuté projekty"
},
"instance.filter.updates-available": {
"message": "K dispozice jsou aktualizace"
},
"instance.server-modal.address": {
"message": "Adresa"
},
@@ -344,141 +287,9 @@
"instance.settings.tabs.installation": {
"message": "Instalace"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} pro Minecraft {game_version} již je nainstalována"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} již je nainstalována"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Změnit verzi"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalovat"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalování"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Načítání verzí modpacku"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalace nové verze"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Aktuálně nainstalováno"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Debugové informace:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Načítání detailů modpacku"
},
"instance.settings.tabs.installation.game-version": {
"message": "Verze hry"
},
"instance.settings.tabs.installation.install": {
"message": "Instalovat"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Probíhá instalace"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} verze"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Nelze načíst podrobnosti o modpacku. Prosím, zkontrolujte své připojení k internetu."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} není dostupný pro Minecraft {version}. Zkuste jiný mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Tato instalace je připojená k modpacku, který ake nebyl najit na Modrinthu."
},
"instance.settings.tabs.installation.platform": {
"message": "Platforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Přeinstalovat modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Přeinstalovávání modpacku"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Přeinstalace resetuje veškerý nainstalovaný nebo upravený obsah kromě toho, co poskytuje modpack, a odstraní všechny módy nebo obsah, které jste přidali do původní instalace. To může opravit neočekávané chyby, ale pokud vaše světy závisejí na doinstalovaném obsahu, možná budou poškozeny."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Opravdu si přejete přeinstalovat tuto instalaci?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Obnoví obsah instance do původního stavu a odstraní všechny mody nebo obsah, které jste přidali nad původní modpack."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Přeinstalovat modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Opravit"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Opravováno"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Oprava přeinstaluje závislosti Minecraftu a zkontroluje poškození. To může vyřešit problémy, pokud se hra nespustí kvůli chybám souvisejícím s launcherem, ale nevyřeší to problémy nebo pády související s nainstalovanými mody."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Opravit instanci?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Probíhá oprava"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Resetovat na aktuální"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Ukázat všechny verze"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "změnit verzi"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "Instalovat"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "přeinstalovat"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "opravit"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Nelze {action} při instalaci"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Nelze {action} když offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Nelze {action} při opravě"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(neznámá verze)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Odpojit instanci"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Pokud budete pokračovat, nebudete ji moci znovu propojit bez vytvoření zcela nové instance. Již nebudete dostávat aktualizace modpacku a stane se z něj běžná instance."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Opravdu si přejete odpojit tuto instanci?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Tato instance je připojena k modpacku, což znamená, že módy nemohou být aktualizované a nelze změnit mod loader ani verze minecraftu. Odpojení permanentně rozváže tuto instanci od modpacku."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Odpojit od modpacku"
},
"instance.settings.tabs.java": {
"message": "Java a pamět"
},
@@ -582,9 +393,18 @@
"message": "Verze hry je poskytnut instanci"
},
"search.filter.locked.instance-loader.title": {
"message": "Spouštěč je poskytnut instanci"
"message": "Spouštěč je poskytnut instancí"
},
"search.filter.locked.instance.sync": {
"message": "Synchronizováno z instancí"
},
"search.filter.locked.server-environment.title": {
"message": "Jen klientské mody mohou být přidány na server"
},
"search.filter.locked.server-game-version.title": {
"message": "Verzi hry poskytuje server"
},
"search.filter.locked.server-loader.title": {
"message": "Loader zprostředkovává server"
}
}
+111 -171
View File
@@ -5,6 +5,81 @@
"app.auth-servers.unreachable.header": {
"message": "Kan ikke nå autentificeringsservere"
},
"app.export-modal.description-placeholder": {
"message": "Indtast modpack beskrivelse..."
},
"app.export-modal.export-button": {
"message": "Eksporter"
},
"app.export-modal.header": {
"message": "Eksporter modpack"
},
"app.export-modal.modpack-name-label": {
"message": "Modpack Navn"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpack navn"
},
"app.export-modal.select-files-label": {
"message": "Vælg filer og mapper til at inkludere i pakken"
},
"app.export-modal.version-number-label": {
"message": "Versionsnummer"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Al' data for din instance vil blive permanent slettet, dette inkludere dine verdener, konfigurationer, og alt installeret indhold."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Denne handling kan ikke fortrydes"
},
"app.instance.confirm-delete.delete-button": {
"message": "Slet instance"
},
"app.instance.confirm-delete.header": {
"message": "Slet instance"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopier link"
},
"app.instance.mods.installing": {
"message": "Installer..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" blev tilføjet"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projekter blev tilføjet"
},
"app.instance.mods.share-text": {
"message": "Tjek ud disse projekter jeg bruger i min modpack!"
},
"app.instance.mods.share-title": {
"message": "Deler modpack indhold"
},
"app.instance.mods.show-file": {
"message": "Vis filer"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uploadet"
},
"app.instance.mods.unknown-version": {
"message": "Ukendt"
},
"app.instance.mods.updating": {
"message": "Opdatere..."
},
"app.modal.install-to-play.content-required": {
"message": "Indhold krævet"
},
"app.modal.install-to-play.header": {
"message": "Installer for at spille"
},
@@ -14,36 +89,30 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Modpack krævet"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Denne server kræver mods for at spille. Klik installer for at sætte op filerne som er krævet fra Modrinth."
"message": "Denne server kræver mods for at spille. Tryk på installer for at sætte de krævet filler fra modrinth op, så lancer direkte til serveren."
},
"app.modal.update-to-play.added-count": {
"message": "{count} tilføjet"
"app.modal.install-to-play.shared-instance": {
"message": "Delt instance"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Tilføjet"
"app.modal.install-to-play.shared-server-instance": {
"message": "Delt server instance"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Fjernet"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Opdateret"
"app.modal.install-to-play.view-contents": {
"message": "Vis indhold"
},
"app.modal.update-to-play.header": {
"message": "Opdater for at spille"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} fjernet"
},
"app.modal.update-to-play.update-required": {
"message": "Opdatering krævet"
},
"app.modal.update-to-play.update-required-description": {
"message": "En opdatering er krævet for at spille {name}. Venligst opdater til den seneste version for at køre spillet."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} opdateret"
},
"app.settings.developer-mode-enabled": {
"message": "Udvikler-tilstand aktiveret."
},
@@ -71,39 +140,33 @@
"app.settings.tabs.resource-management": {
"message": "Ressourcestyring"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} er allerede installeret! Genindlæs for at opdatere nu, eller automatisk når du lukker Modrinth App."
"app.update-popup.body": {
"message": "Modrinth App v{version} er klar til at blive installeret! Genindlæs for at opdatere nu, eller automatisk når du lukker Modrinth App."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} er færdig med at download. Genindlæs for at opdatere nu, eller automatisk når du lukker Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} er nu tilgængelig. Brug din pakke-manager til at opdatere for de nyeste features og fejlrettelser!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} er nu tilgængelig! Siden du er på et begrænset netværk, vi downloadede den ikke automatisk."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Ændringslog"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Download ({size})"
},
"app.update-toast.download-page": {
"message": "Download"
"app.update-popup.download-complete": {
"message": "Download færdiggjort"
},
"app.update-toast.downloading": {
"message": "Downloader..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Geninlæs"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Opdatering tilgængelig"
},
"app.update-toast.title.download-complete": {
"message": "Download færdiggjort"
},
"app.update.complete-toast.text": {
"message": "Klik her for at vise ændringslog."
},
@@ -218,12 +281,6 @@
"instance.edit-world.title": {
"message": "Rediger verden"
},
"instance.filter.disabled": {
"message": "Deaktiverede projekter"
},
"instance.filter.updates-available": {
"message": "Tilgængelige opdateringer"
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -332,141 +389,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} for Minecraft {game_version} er allerede installeret"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} er allerede installeret"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Skift version"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installer"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Får modpack versioner"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installere ny version"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Lige nu installeret"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Debug information:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Får modpack detaljer"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spil version"
},
"instance.settings.tabs.installation.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installation igangværende"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} version"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kan ikke få forbundet modpack detaljer. Venligst tjek din internet forbindelse."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} er ikke mulig at bruge for Minecraft {version}. Prøv en anden mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Denne instance er koblet til en modpack, men modpacken kunne ikke blive fundet på Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Geninstaller modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Geninstallere modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Geninstallering vil nulstille alt installeret eller modificeret indhold givet af modpacken, fjerne alle mods eller indhold du har tilføjet ovenpå den originale installation. Dette vil måske fikse uforventet adfærd hvis ændringer er blevet lavet til den instance, men hvis din verdener nu afhænger af ektra tilføjet indhold, dette vil måske ødelægge eksisterende verdener."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Er du sikker på du vil geninstallere denne instance?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Nulstiller instanceens indhold til dens oprindelige tilstand, fjerne alle mods eller indhold du har tilføjet ovenpå den oprindelige modpack."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Geninstaller modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparer"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparere"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparering geninstaller Minecraft afhængigheder og tjekker for korruption. Dette vil måske fikse fejl hvis dit spil ikke køre på grund af launcher relateret fejl, men vil ikke fikse fejl eller crashes relateret til installerede mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Reparer instance?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparation i gang"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Nulstil til nuværende"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Vis alle versioner"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "Ændre version"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "Geninstaller"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "Reparer"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Kan ikke {action} under installation"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Kan ikke {action} uden internet"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Kan ikke {action} under reparation"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(Ukendt version)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Frakoble instance"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Hvis du forsætter, du vil ikke have mulighed for at koble sammen igen uden at lave en helt ny instance. Du vil ikke længere modtage modpack opdateringer og vil blive en normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Er du sikker på du vil frakoble denne instance?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Denne instance er forbundet til en modpack, hvilket betyder mods kan ikke blive opdateret og du kan ikke ændre mod loaderen eller Minecraft version. Frakobling vil permanent frakoble denne instance fra modpacken."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Frakoble fra modpack"
},
"instance.settings.tabs.java": {
"message": "Java og hukommelse"
},
@@ -539,6 +464,9 @@
"instance.worlds.incompatible_server": {
"message": "Serveren er uforenelig"
},
"instance.worlds.linked_server": {
"message": "Styret af server projektet"
},
"instance.worlds.no_contact": {
"message": "Serveren kunne ikke blive kontaktet"
},
@@ -574,5 +502,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Synkroniser med instance"
},
"search.filter.locked.server": {
"message": "Givet af serveren"
},
"search.filter.locked.server-environment.title": {
"message": "Kun klient-sided mods kan blive tilføjet til denne server instance"
},
"search.filter.locked.server-game-version.title": {
"message": "Spille version er givet af serveren"
},
"search.filter.locked.server-loader.title": {
"message": "Loader er givet af serveren"
}
}
+139 -196
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.export-modal.description-placeholder": {
"message": "Modpaketbeschreibung eingeben..."
},
"app.export-modal.export-button": {
"message": "Exportieren"
},
"app.export-modal.header": {
"message": "Modpack exportieren"
},
"app.export-modal.modpack-name-label": {
"message": "Modpaketname"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpaketname"
},
"app.export-modal.select-files-label": {
"message": "Wähle Dateien und Ordner zum hinzufügen im Paket aus"
},
"app.export-modal.version-number-label": {
"message": "Versionsnummer"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Alle Daten deiner Instanz werden permanent gelöscht, inlusive deiner Welten, Konfigurationen und allen installierten Inhalten."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Diese Aktion kann nicht rückgängig gemacht werden"
},
"app.instance.confirm-delete.delete-button": {
"message": "Instanz löschen"
},
"app.instance.confirm-delete.header": {
"message": "Instanz löschen"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Dieses Modpack ist bereits in der Instanz „{instanceName}“ installiert."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplizieren"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Trotzdem erstellen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Gehe zu Instanz"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack bereits installiert"
},
"app.instance.mods.content-type-project": {
"message": "Projekt"
},
"app.instance.mods.copy-link": {
"message": "Link kopieren"
},
"app.instance.mods.installing": {
"message": "Wird installiert..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaket"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" wurde hinzugefügt"
},
"app.instance.mods.projects-were-added": {
"message": "{count} Projekte wurden hinzugefügt"
},
"app.instance.mods.share-text": {
"message": "Schau dir die Projekte, welche ich in meinem Modpaket nutze an!"
},
"app.instance.mods.share-title": {
"message": "Modpaketinhalte teilen"
},
"app.instance.mods.show-file": {
"message": "Datei anzeigen"
},
"app.instance.mods.successfully-uploaded": {
"message": "Erfolgreich hochgeladen"
},
"app.instance.mods.unknown-version": {
"message": "Unbekannt"
},
"app.instance.mods.updating": {
"message": "Wird aktualisiert..."
},
"app.modal.install-to-play.content-required": {
"message": "Inhalte benötigt"
},
"app.modal.install-to-play.header": {
"message": "Installieren zum Spielen"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# Mod} other {# Mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Dieser Server benötigt Mods zum spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth einzurichten."
"app.modal.install-to-play.required-modpack": {
"message": "Benötigtes Modpack"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} hat diese Instanz heute mit dir geteilt."
"app.modal.install-to-play.server-requires-mods": {
"message": "Dieser Server benötigt Mods zum spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und dannach direkt dem Server beizutreten."
},
"app.modal.install-to-play.shared-instance": {
"message": "Geteilte Instanz"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Geteilte Server Instanz"
},
"app.modal.update-to-play.added-count": {
"message": "{count} hinzugefügt"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Hinzugefügt"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Entfernt"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Aktualisiert"
"app.modal.install-to-play.view-contents": {
"message": "Inhalte ansehen"
},
"app.modal.update-to-play.header": {
"message": "Aktualisieren zum Spielen"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} entfernt"
},
"app.modal.update-to-play.update-required": {
"message": "Aktualisierung benötigt"
},
"app.modal.update-to-play.update-required-description": {
"message": "Eine aktualisierung zum spielen von {name} ist benötigt. Bitte aktualisiere auf die neuste Version um das Spiel zu starten."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} aktualisiert"
},
"app.settings.developer-mode-enabled": {
"message": "Entwicklermodus aktiviert."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Ressourcenmanagement"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} ist bereit zur Installation! Lade die App neu, oder schliesse sie, um zu aktualisieren."
"app.update-popup.body": {
"message": "Modrinth App v{version} ist bereit zur Installation! Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu, oder schliesse sie, um zu aktualisieren."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} ist verfügbar. Benutze deinen Paketmanager zum aktualisieren um die neusten Features und Bugfixes zu erhalten!"
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} ist verfügbar. Benutze deinen Paketmanager zum aktualisieren, um die neusten Features und Bugfixes zu erhalten!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} ist jetzt verfügbar! Da du in einem begrenzten Netzwerk bist, haben wir es nicht automatisch heruntergeladen."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Änderungen"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Herunterladen ({size})"
},
"app.update-toast.download-page": {
"message": "Herunterladen"
"app.update-popup.download-complete": {
"message": "Download abgeschlossen"
},
"app.update-toast.downloading": {
"message": "Lade herunter..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Neu Laden"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Aktualisierung verfügbar"
},
"app.update-toast.title.download-complete": {
"message": "Download abgeschlossen"
},
"app.update.complete-toast.text": {
"message": "Klicke Hier um die Änderungen zu sehen."
},
@@ -150,10 +216,10 @@
"message": "Modrinth Nutzernamen eingeben..."
},
"friends.add-friend.username.title": {
"message": "Was ist der Modrinth Nutzername deines Freundes?"
"message": "Was ist der Modrinth-Nutzername deines Freundes?"
},
"friends.add-friends-to-share": {
"message": "<link>Füge Freunde hinzu</link> um zu sehen, was sie spielen!"
"message": "<link>Füge Freunde hinzu</link>, um zu sehen, was sie spielen!"
},
"friends.friend.cancel-request": {
"message": "Anfrage abbrechen"
@@ -192,7 +258,7 @@
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Logge dich in ein Modrinth Konto ein</link> um Freunde hinzuzufügen und zu sehen, was sie spielen!"
"message": "<link>Logge dich in ein Modrinth Konto ein</link>, um Freunde hinzuzufügen und zu sehen, was sie spielen!"
},
"instance.add-server.add-and-play": {
"message": "Ersteue u starte"
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Welt bearbeiten"
},
"instance.filter.disabled": {
"message": "Deaktivierte Projekte"
},
"instance.filter.updates-available": {
"message": "Updates verfügbar"
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -312,13 +372,13 @@
"message": "Hooks ermöglichen es erfahrenen Benutzern, bestimmte Systembefehle vor und nach dem Start des Spiels auszuführen."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Nach dem Schliessen des Spiels"
"message": "Nach dem Schließen des Spiels"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Wird nach dem Beenden des Spiels ausgeführt."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Ausgeführter Befehl nach dem Beenden des Spiels eingeben..."
"message": "Nach dem Beenden des Spiels auszuführenden Befehl eingeben..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Vor Start des Spiels"
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} für Minecraft {game_version} ist bereits installiert"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} ist bereits installiert"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Version ändern"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Wird installiert"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Sammle Modpack-Versionen"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Neue Version wird installiert"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Aktuell installiert"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informationen zur Fehlerbehebung:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Sammle Modpack-Details"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spielversion"
},
"instance.settings.tabs.installation.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Wird installiert"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} Version"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kann Details für verknüpftes Modpack nicht abrufen. Bitte überprüfe deine Internerverbindung."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} ist nicht verfügbar für Minecraft {version}. Versuch einen anderen Modloader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Diese Instanz ist mit einem Modpack verknüpft, aber das Modpack konnte nicht auf Modrinth gefunden werden."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Modpack neu installieren"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Modpack wird neu installiert"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Durch die Neuinstallation werden alle installierten oder geänderten Inhalte auf die vom Modpack bereitgestellten Inhalte zurückgesetzt, wobei alle Mods oder Inhalte entfernt werden, die zusätzlich zur ursprünglichen Installation hinzugefügt wurden. Dies kann unerwartetes Verhalten beheben, wenn Änderungen an der Instanz vorgenommen wurden. Wenn deine Welten jedoch von zusätzlich installierten Inhalten abhängig sind, kann dies zu Fehlern in bestehenden Welten führen."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Bist du sicher, dass du diese Instanz neu installieren willst?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Setzt den Inhalt der Instanz auf seinen ursprünglichen Zustand zurück und entfernt all Mods oder Inhalte, welche zusätzlich zum ursprünglichen Modpack hinzugefügt wurden."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Modpack neu installieren"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparieren"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Wird repariert"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Das reparieren installier Minecraft-Abhängigkeiten neu und überprüft für Beschädigungen. Dies kann Probleme beheben, sofern dein Spiel aufgrund von Launcher-relevanten Problemen nicht startet, aber es kann nicht Fehler und Abstpürze in Zusammenhang mit installierten Mods beheben."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Instanz reparieren?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Wird repariert"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Auf aktuellen Wert zurücksetzen"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Alle Versionen anzeigen"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "Version ändern"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "Neuinstallieren"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "Reparieren"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "{action} während der Installation nicht möglich"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "{action} nicht möglich ohne Internetverbindung"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "{action} während reparatur nicht möglich"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(unbekannte Version)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Verlinking der Instanz trennen"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Wenn du fortfährst, kann die Instanz nicht erneut verknüpft werden, ohne eine komplett neue Instanz zu ersztellen. Du erhälst keine Modpack-Updates mehr und es wird zu einer normalen Instanz."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Bist du sicher, dass du die Verknüpfung dieser Instanz trennen willst?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Diese Instanz ist mit einem Modpack verknüpft. Dies bedeutet, dass Mods nicht aktualisiert werden können, und dass du den Modloader oder die Minecraft Versionen nicht ändern kannst. Durch das trennen der Verknüpfung wird die Instanz permanent vom Modpack getrennt."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Verknüpfung vom Modpack trennen"
},
"instance.settings.tabs.java": {
"message": "Java und Arbeitsspeicher"
},
@@ -507,13 +435,13 @@
"message": "Vollbild"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "Startet das Spiel im Vollbildmodus (durch verwenden von options.txt)."
"message": "Startet das Spiel im Vollbildmodus (mithilfe von options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "Höhe"
},
"instance.settings.tabs.window.height.description": {
"message": "Die höhe des Spielfensters beim Start."
"message": "Die Höhe des Spielfensters beim Start."
},
"instance.settings.tabs.window.height.enter": {
"message": "Höhe eingeben..."
@@ -528,7 +456,7 @@
"message": "Breite eingeben..."
},
"instance.worlds.a_minecraft_server": {
"message": "Ä Minecraft-Server"
"message": "Ein Minecraft-Server"
},
"instance.worlds.cant_connect": {
"message": "Verbindung mit Server nicht möglich"
@@ -549,16 +477,19 @@
"message": "Hardcore-Modus"
},
"instance.worlds.incompatible_server": {
"message": "Server ist inkompatibel"
"message": "Server ist nicht kompatibel"
},
"instance.worlds.linked_server": {
"message": "Von Serverprojekt verwaltet"
},
"instance.worlds.no_contact": {
"message": "Server konnte nicht erreicht werden"
},
"instance.worlds.no_server_quick_play": {
"message": "Du kannst nur in Minecraft Alpha 1.0.5 und neuer direkt einem Server beitreten"
"message": "Du kannst nur mit Minecraft Alpha 1.0.5 und neuer einem Server direkt beitreten"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Du kannst nur in Minecraft 1.20 und neuer einer Einzelspieler-Welt beitreten"
"message": "Du kannst nur mit Minecraft 1.20 und neuer einer Einzelspieler-Welt direkt beitreten"
},
"instance.worlds.play_instance": {
"message": "Instanz Spielen"
@@ -573,18 +504,30 @@
"message": "Instanz anzeigen"
},
"instance.worlds.world_in_use": {
"message": "Welt bereits in benutzung"
"message": "Welt bereits in Benutzung"
},
"search.filter.locked.instance": {
"message": "Von der Instanz bereitgestellt"
"message": "Von der Instanz vorgegeben"
},
"search.filter.locked.instance-game-version.title": {
"message": "Spielversion ist von der Instanz bereitgestellt"
"message": "Spielversion ist von der Instanz vorgegeben"
},
"search.filter.locked.instance-loader.title": {
"message": "Loader ist von der Instanz bereitgestellt"
"message": "Loader ist von der Instanz vorgegeben"
},
"search.filter.locked.instance.sync": {
"message": "Mit Instanz synchronisieren"
},
"search.filter.locked.server": {
"message": "Vom Server bereitgestellt"
},
"search.filter.locked.server-environment.title": {
"message": "Nur Clientseitige Mods können der Serverinstanz hinzugefügt werden"
},
"search.filter.locked.server-game-version.title": {
"message": "Spielversion wird vom Server bereitgestellt"
},
"search.filter.locked.server-loader.title": {
"message": "Loader wird vom Server bereitgestellt"
}
}
+124 -181
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.export-modal.description-placeholder": {
"message": "Beschreibung des Modpacks eingeben..."
},
"app.export-modal.export-button": {
"message": "Exportieren"
},
"app.export-modal.header": {
"message": "Modpack exportieren"
},
"app.export-modal.modpack-name-label": {
"message": "Modpackname"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpackname"
},
"app.export-modal.select-files-label": {
"message": "Wähle Dateien und Ordner aus, die in das Paket sollen"
},
"app.export-modal.version-number-label": {
"message": "Versionsnummer"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Alle Daten für deine Instanz werden permanent gelöscht, einschließlich deiner Welten, Konfigurationen und allen installierten Inhalten."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Diese Aktion kann nicht rückgängig gemacht werden"
},
"app.instance.confirm-delete.delete-button": {
"message": "Instanz löschen"
},
"app.instance.confirm-delete.header": {
"message": "Instanz löschen"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Dieses Modpack ist bereits in der Instanz „{instanceName}“ installiert."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplizieren"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Trotzdem erstellen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Gehe zu Instanz"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack bereits installiert"
},
"app.instance.mods.content-type-project": {
"message": "Projekt"
},
"app.instance.mods.copy-link": {
"message": "Link kopieren"
},
"app.instance.mods.installing": {
"message": "Wird installiert..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" wurde hinzugefügt"
},
"app.instance.mods.projects-were-added": {
"message": "{count} Projekte wurden hinzugefügt"
},
"app.instance.mods.share-text": {
"message": "Schau dir die Projekte an, die ich in meinem Modpack verwende!"
},
"app.instance.mods.share-title": {
"message": "Modpackinhalte teilen"
},
"app.instance.mods.show-file": {
"message": "Datei anzeigen"
},
"app.instance.mods.successfully-uploaded": {
"message": "Erfolgreich hochgeladen"
},
"app.instance.mods.unknown-version": {
"message": "Unbekannt"
},
"app.instance.mods.updating": {
"message": "Wird aktualisiert..."
},
"app.modal.install-to-play.content-required": {
"message": "Inhalte benötigt"
},
"app.modal.install-to-play.header": {
"message": "Installieren zum Spielen"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# Mod} other {# Mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Dieser Server benötigt Mods zum Spielen. Klick auf „Installieren“ um die erforderlichen Dateien von Modrinth zu installieren."
"app.modal.install-to-play.required-modpack": {
"message": "Benötigtes Modpack"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} hat diese Instanz heute mit dir geteilt."
"app.modal.install-to-play.server-requires-mods": {
"message": "Dieser Server benötigt Mods zum Spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und danach direkt dem Server beizutreten."
},
"app.modal.install-to-play.shared-instance": {
"message": "Geteilte Instanz"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Geteilte Serverinstanz"
},
"app.modal.update-to-play.added-count": {
"message": "{count} hinzugefügt"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Hinzugefügt"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Entfernt"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Aktualisiert"
"app.modal.install-to-play.view-contents": {
"message": "Inhalte ansehen"
},
"app.modal.update-to-play.header": {
"message": "Aktualisieren zum Spielen"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} entfernt"
},
"app.modal.update-to-play.update-required": {
"message": "Aktualisierung erforderlich"
},
"app.modal.update-to-play.update-required-description": {
"message": "Zum Spielen von {name} ist eine Aktualisierung erforderlich. Bitte aktualisiere auf die neueste Version, um das Spiel zu starten."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} aktualisiert"
},
"app.settings.developer-mode-enabled": {
"message": "Entwicklermodus aktiviert."
},
@@ -83,38 +155,32 @@
"app.settings.tabs.resource-management": {
"message": "Ressourcenmanagement"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} ist bereit zur Installation! Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} wurde heruntergeladen. Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} wurde heruntergeladen. Neu laden, um jetzt zu aktualisieren, oder automatisch aktualisieren, wenn du die Modrinth App schließt."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} ist verfügbar. Verwende deinen Paketmanager, um die neuesten Funktionen und Fehlerbehebungen zu installieren!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} ist jetzt verfügbar! Da du ein getaktetes Netzwerk nutzt, haben wir den Download nicht automatisch gestartet."
},
"app.update-toast.changelog": {
"message": "Änderungsverlauf"
"app.update-popup.changelog": {
"message": "Änderungen"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Herunterladen ({size})"
},
"app.update-toast.download-page": {
"message": "Herunterladen"
"app.update-popup.download-complete": {
"message": "Download abgeschlossen"
},
"app.update-toast.downloading": {
"message": "Wird Heruntergeladen..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Neu laden"
},
"app.update-toast.title": {
"message": "Update verfügbar"
},
"app.update-toast.title.download-complete": {
"message": "Download abgeschlossen"
"app.update-popup.title": {
"message": "Aktualisierung verfügbar"
},
"app.update.complete-toast.text": {
"message": "Hier klicken, um das Änderungsprotokoll anzuzeigen."
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Welt bearbeiten"
},
"instance.filter.disabled": {
"message": "Deaktivierte Projekte"
},
"instance.filter.updates-available": {
"message": "Updates verfügbar"
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} für Minecraft {game_version} bereits installiert"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} ist bereits installiert"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Version ändern"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Wird installiert"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Modpack-Versionen werden abgerufen"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Neue Version wird installiert"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Derzeit installiert"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informationen für die Fehlerbehebung:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Modpack-Details werden abgerufen"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spielversion"
},
"instance.settings.tabs.installation.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installation im Gange"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} Version"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Die Details des verknüpften Modpacks können nicht abgerufen werden. Bitte überprüfe deine Internetverbindung."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} ist nicht für Minecraft {version} verfügbar. Versuche einen anderen Modloader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Diese Instanz ist mit einem Modpack verknüpft, aber das Modpack konnte auf Modrinth nicht gefunden werden."
},
"instance.settings.tabs.installation.platform": {
"message": "Plattform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Modpack neu installieren"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Modpack wird neu installiert"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Eine Neuinstallation setzt alle installierten oder geänderten Inhalte auf den Zustand zurück, der vom Modpack bereitgestellt wird, und entfernt alle Mods oder Inhalte, die du zusätzlich zur ursprünglichen Installation hinzugefügt hast.\nDies kann unerwartetes Verhalten beheben, falls Änderungen an der Instanz vorgenommen wurden. Wenn deine Welten jedoch von zusätzlich installierten Inhalten abhängen, kann dies bestehende Welten beschädigen."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Bist du dir sicher, dass du diese Instanz neu installieren willst?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Setzt den Inhalt der Instanz auf den ursprünglichen Zustand zurück und entfernt alle Mods oder Inhalte, die du zusätzlich zum ursprünglichen Modpack hinzugefügt hast."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Modpack neu installieren"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparieren"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Wird repariert"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Durch die Reparatur werden die Abhängigkeiten von Minecraft neu installiert und auf Beschädigungen überprüft. Dies kann Probleme beheben, wenn Minecraft aufgrund von Fehlern im Launcher nicht startet, löst jedoch keine Probleme oder Abstürze im Zusammenhang mit installierten Mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Instanz reparieren?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparatur im Gange"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Auf aktuellen Stand zurücksetzen"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Alle Versionen anzeigen"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "Version ändern"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "Installieren"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "Neuinstallieren"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "Reparieren"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "{action} während der Installation nicht möglich"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "{action} offline nicht möglich"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "{action} während der Reparation nicht möglich"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(unbekannte Version)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Verknüpfung der Instanz trennen"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Wenn du fortfährst, kannst du sie nicht erneut verknüpfen, ohne eine völlig neue Instanz zu erstellen. Du wirst keine Modpack-Updates mehr erhalten, und sie wird zu einer normalen Instanz."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Möchtest du die Verknüpfungen dieser Instanz wirklich trennen?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Diese Instanz ist mit einem Modpack verknüpft. Das bedeutet, dass Mods nicht aktualisiert werden können und der Mod-Loader oder die Minecraft-Version nicht geändert werden können. Durch das Aufheben der Verknüpfung wird die Instanz dauerhaft vom Modpack getrennt."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Verknüpfung vom Modpack trennen"
},
"instance.settings.tabs.java": {
"message": "Java und Arbeitsspeicher"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Server ist nicht kompatibel"
},
"instance.worlds.linked_server": {
"message": "Von Serverprojekt verwaltet"
},
"instance.worlds.no_contact": {
"message": "Server konnte nicht erreicht werden"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Mit Instanz synchronisieren"
},
"search.filter.locked.server": {
"message": "Vom Server vorgegeben"
},
"search.filter.locked.server-environment.title": {
"message": "Nur clientseitige Mods können der Serverinstanz hinzugefügt werden"
},
"search.filter.locked.server-game-version.title": {
"message": "Spielversion vom Server vorgegeben"
},
"search.filter.locked.server-loader.title": {
"message": "Loader vom Server vorgegeben"
}
}
+121 -178
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Cannot reach authentication servers"
},
"app.export-modal.description-placeholder": {
"message": "Enter modpack description..."
},
"app.export-modal.export-button": {
"message": "Export"
},
"app.export-modal.header": {
"message": "Export modpack"
},
"app.export-modal.modpack-name-label": {
"message": "Modpack Name"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpack name"
},
"app.export-modal.select-files-label": {
"message": "Select files and folders to include in pack"
},
"app.export-modal.version-number-label": {
"message": "Version number"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "All data for your instance will be permanently deleted, including your worlds, configs, and all installed content."
},
"app.instance.confirm-delete.admonition-header": {
"message": "This action cannot be undone"
},
"app.instance.confirm-delete.delete-button": {
"message": "Delete instance"
},
"app.instance.confirm-delete.header": {
"message": "Delete instance"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "This modpack is already installed in the \"{instanceName}\" instance."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Duplicate modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Create anyway"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Go to instance"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack already installed"
},
"app.instance.mods.content-type-project": {
"message": "project"
},
"app.instance.mods.copy-link": {
"message": "Copy link"
},
"app.instance.mods.installing": {
"message": "Installing..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" was added"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projects were added"
},
"app.instance.mods.share-text": {
"message": "Check out the projects I'm using in my modpack!"
},
"app.instance.mods.share-title": {
"message": "Sharing modpack content"
},
"app.instance.mods.show-file": {
"message": "Show file"
},
"app.instance.mods.successfully-uploaded": {
"message": "Successfully uploaded"
},
"app.instance.mods.unknown-version": {
"message": "Unknown"
},
"app.instance.mods.updating": {
"message": "Updating..."
},
"app.modal.install-to-play.content-required": {
"message": "Content required"
},
"app.modal.install-to-play.header": {
"message": "Install to play"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "This server requires mods to play. Click install to set up the required files from Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Required modpack"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} shared this instance with you today."
"app.modal.install-to-play.server-requires-mods": {
"message": "This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server."
},
"app.modal.install-to-play.shared-instance": {
"message": "Shared instance"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Shared server instance"
},
"app.modal.update-to-play.added-count": {
"message": "{count} added"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Added"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Removed"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Updated"
"app.modal.install-to-play.view-contents": {
"message": "View contents"
},
"app.modal.update-to-play.header": {
"message": "Update to play"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} removed"
},
"app.modal.update-to-play.update-required": {
"message": "Update required"
},
"app.modal.update-to-play.update-required-description": {
"message": "An update is required to play {name}. Please update to the latest version to launch the game."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} updated"
},
"app.settings.developer-mode-enabled": {
"message": "Developer mode enabled."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Resource management"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Changelog"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Download ({size})"
},
"app.update-toast.download-page": {
"message": "Download"
"app.update-popup.download-complete": {
"message": "Download complete"
},
"app.update-toast.downloading": {
"message": "Downloading..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Reload"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Update available"
},
"app.update-toast.title.download-complete": {
"message": "Download complete"
},
"app.update.complete-toast.text": {
"message": "Click here to view the changelog."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Edit world"
},
"instance.filter.disabled": {
"message": "Disabled projects"
},
"instance.filter.updates-available": {
"message": "Updates available"
},
"instance.server-modal.address": {
"message": "Address"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} for Minecraft {game_version} already installed"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} already installed"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Change version"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Install"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installing"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Fetching modpack versions"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installing new version"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Currently installed"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Debug information:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Fetching modpack details"
},
"instance.settings.tabs.installation.game-version": {
"message": "Game version"
},
"instance.settings.tabs.installation.install": {
"message": "Install"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installation in progress"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} version"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Cannot fetch linked modpack details. Please check your internet connection."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} is not available for Minecraft {version}. Try another mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "This instance is linked to a modpack, but the modpack could not be found on Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstall modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalling modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstalling will reset all installed or modified content to what is provided by the modpack, removing any mods or content you have added on top of the original installation. This may fix unexpected behavior if changes have been made to the instance, but if your worlds now depend on additional installed content, it may break existing worlds."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Are you sure you want to reinstall this instance?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Resets the instance's content to its original state, removing any mods or content you have added on top of the original modpack."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstall modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Repair"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Repairing"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Repairing reinstalls Minecraft dependencies and checks for corruption. This may resolve issues if your game is not launching due to launcher-related errors, but will not resolve issues or crashes related to installed mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Repair instance?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Repair in progress"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Reset to current"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Show all versions"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "change version"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "install"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstall"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "repair"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Cannot {action} while installing"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Cannot {action} while offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Cannot {action} while repairing"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(unknown version)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Unlink instance"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Are you sure you want to unlink this instance?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "This instance is linked to a modpack, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the modpack."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Unlink from modpack"
},
"instance.settings.tabs.java": {
"message": "Java and memory"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Server is incompatible"
},
"instance.worlds.linked_server": {
"message": "Managed by server project"
},
"instance.worlds.no_contact": {
"message": "Server couldn't be contacted"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sync with instance"
},
"search.filter.locked.server": {
"message": "Provided by the server"
},
"search.filter.locked.server-environment.title": {
"message": "Only client-side mods can be added to the server instance"
},
"search.filter.locked.server-game-version.title": {
"message": "Game version is provided by the server"
},
"search.filter.locked.server-loader.title": {
"message": "Loader is provided by the server"
}
}
+127 -184
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede acceder a los servidores de autenticación"
},
"app.export-modal.description-placeholder": {
"message": "Escribe la descripción del modpack..."
},
"app.export-modal.export-button": {
"message": "Exportar"
},
"app.export-modal.header": {
"message": "Exportar modpack"
},
"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": "Seleccione archivos y carpetas para incluir en el paquete"
},
"app.export-modal.version-number-label": {
"message": "Número de versión"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Todos los datos de su instancia se eliminarán permanentemente, incluidos sus mundos, configuraciones y todo el contenido instalado."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Esta acción no se puede deshacer"
},
"app.instance.confirm-delete.delete-button": {
"message": "Eliminar instancia"
},
"app.instance.confirm-delete.header": {
"message": "Eliminar instancia"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este modpack ya está instalado en la instancia \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea de todos modos"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir a la instancia"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack ya está instalado"
},
"app.instance.mods.content-type-project": {
"message": "proyecto"
},
"app.instance.mods.copy-link": {
"message": "Copiar enlace"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "Se ha añadido \"{name}\""
},
"app.instance.mods.projects-were-added": {
"message": "Se han añadido {count} proyectos"
},
"app.instance.mods.share-text": {
"message": "¡Echa un vistazo a los proyectos que utilizo en mi modpack!"
},
"app.instance.mods.share-title": {
"message": "Compartir contenido del modpack"
},
"app.instance.mods.show-file": {
"message": "Mostrar archivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Se ha subido correctamente"
},
"app.instance.mods.unknown-version": {
"message": "Desconocido"
},
"app.instance.mods.updating": {
"message": "Actualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenido requerido"
},
"app.modal.install-to-play.header": {
"message": "Instala para jugar"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requiere mods para jugar. Haz clic en instalar para configurar los archivos necesarios desde Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Modpack requerido"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} compartió esta instancia contigo hoy."
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requiere mods para poder jugar. Haz click en Instalar para configurar los archivos requeridos desde Modrinth, después se ejecutará para entrar directamente al servidor."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instancia compartida"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Instancia de servidor compartida"
},
"app.modal.update-to-play.added-count": {
"message": "{count} agregados"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Se agregó"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Se eliminó"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Actualizado"
"app.modal.install-to-play.view-contents": {
"message": "Ver contenidos"
},
"app.modal.update-to-play.header": {
"message": "Actualiza para jugar"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} eliminados"
},
"app.modal.update-to-play.update-required": {
"message": "Actualización requerida"
},
"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.modal.update-to-play.updated-count": {
"message": "{count} actualizados"
},
"app.settings.developer-mode-enabled": {
"message": "Modo desarrollador activado."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Gestión de recursos"
},
"app.update-toast.body": {
"message": "¡Modrinth App v{version} lista para instalar! Actualiza ahora o automáticamente al cerrar la aplicación."
"app.update-popup.body": {
"message": "¡Modrinth App v{version} está lista para instalarse! Actualiza ahora o automáticamente al cerrar la Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "La descarga de la Modrinth App v{version} ha finalizado. Actualiza ahora o automáticamente al cerrar la aplicación Modrinth."
"app.update-popup.body.download-complete": {
"message": "La descarga de la Modrinth App v{version} ha finalizado. Actualiza ahora o automáticamente al cerrar la Modrinth App."
},
"app.update-toast.body.linux": {
"message": "La aplicación Modrinth v{version} ya está disponible. ¡Utiliza tu gestor de paquetes para actualizarla y disfrutar de las últimas funciones y correcciones!"
"app.update-popup.body.linux": {
"message": "La Modrinth App v{version} está disponible. ¡Usa tu gestor de paquetes para actualizarla y tener las últimas funciones y corrección de errores!"
},
"app.update-toast.body.metered": {
"message": "¡Modrinth App v{version} ya está disponible! Como estás en una red con límite de datos, no se descargó automáticamente."
"app.update-popup.body.metered": {
"message": La Modrinth App v{version} ya está disponible! Al estar usando una red de datos límitada, no la hemos descargado automáticamente."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Registro de cambios"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Descargar ({size})"
},
"app.update-toast.download-page": {
"message": "Descargar"
"app.update-popup.download-complete": {
"message": "Descarga completada"
},
"app.update-toast.downloading": {
"message": "Descargando..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Recargar"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Actualización disponible"
},
"app.update-toast.title.download-complete": {
"message": "Descarga completada"
},
"app.update.complete-toast.text": {
"message": "Haz clic aquí para ver el registro de cambios."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.filter.disabled": {
"message": "Proyectos desactivados"
},
"instance.filter.updates-available": {
"message": "Actualizaciones disponibles"
},
"instance.server-modal.address": {
"message": "Dirección IP"
},
@@ -297,7 +357,7 @@
"message": "Los grupos de la librería te ayudan a organizar tus instancias en diferentes secciones en tu librería."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Ingresa el nombre del grupo"
"message": "Escribe nombre del grupo"
},
"instance.settings.tabs.general.name": {
"message": "Nombre"
@@ -306,7 +366,7 @@
"message": "Hooks de inicio"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Hooks de inicio personalizados"
"message": "Hooks personalizados"
},
"instance.settings.tabs.hooks.description": {
"message": "Los hooks permiten que usuarios avanzados ejecuten comandos del sistema antes y despues de lanzar el juego."
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Instalación"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} ya está instalado para Minecraft {game_version}"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} ya está instalada"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Cambiar versión"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Obteniendo versiones del modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalando nueva versión"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Actualmente instalado"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Información de depuración:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Obteniendo detalles del modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versión del juego"
},
"instance.settings.tabs.installation.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalación en progreso"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versión de {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "No se pueden obtener los detalles del modpack vinculado. Por favor, verifica tu conexión a internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} no está disponible para Minecraft {version}. Prueba con otro mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Esta instancia está vinculada a un modpack, pero no se pudo encontrar el modpack en Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plataforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalando modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "La reinstalación restablecerá todo el contenido instalado o modificado a lo que proporciona el modpack, eliminando cualquier mod o contenido que hayas agregado sobre la instalación original. Esto puede solucionar comportamientos inesperados si se han hecho cambios en la instancia, pero si tus mundos dependen de contenido adicional instalado, podría romper los mundos existentes."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "¿Estás seguro de que quieres reinstalar esta instancia?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Restablece el contenido de la instancia a su estado original, eliminando cualquier mod o contenido que hayas agregado sobre el modpack original."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparar"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparar reinstala las dependencias de Minecraft y verifica la integridad de los archivos. Esto puede solucionar problemas si tu juego no se inicia por errores relacionados con el launcher, pero no resolverá problemas debidos a mods instalados."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "¿Reparar instancia?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparación en proceso..."
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Restablecer al actual"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Mostrar todas las versiones"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "cambiar versión"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instalar"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalar"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparar"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "No se puede {action} mientras se está instalando"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "No se puede {action} mientras estés desconectado"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "No se puede {action} mientras se está reparando"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versión desconocida)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Desvincular instancia"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Si continúas, no podrás volver a vincularla sin crear una nueva instancia. Ya no recibirás actualizaciones del modpack y pasará a ser una instancia normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "¿Estás seguro de que quieres desvincular esta instancia?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Esta instancia está vinculada a un modpack, lo que significa que los mods no pueden actualizarse y no puedes cambiar el mod loader ni la versión de Minecraft. Desvincularla la desconectará permanentemente del modpack."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Desvincular del modpack"
},
"instance.settings.tabs.java": {
"message": "Java y memoria"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "El servidor es incompatible"
},
"instance.worlds.linked_server": {
"message": "Gestionado por el proyecto del servidor"
},
"instance.worlds.no_contact": {
"message": "No se pudo conectar al servidor"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sincronizar con la instancia"
},
"search.filter.locked.server": {
"message": "Proporcionado por el servidor"
},
"search.filter.locked.server-environment.title": {
"message": "Solo se puede añadir mods que sean del lado del cliente a la instancia del servidor"
},
"search.filter.locked.server-game-version.title": {
"message": "La versión del juego es proporcionada por el servidor"
},
"search.filter.locked.server-loader.title": {
"message": "El loader es proporcionado por el servidor"
}
}
+127 -184
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede conectar con los servidores de autenticación"
},
"app.export-modal.description-placeholder": {
"message": "Escribe la descripción del modpack..."
},
"app.export-modal.export-button": {
"message": "Exportar"
},
"app.export-modal.header": {
"message": "Exportar modpack"
},
"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": "Seleccione archivos y carpetas para incluir en el paquete"
},
"app.export-modal.version-number-label": {
"message": "Número de versión"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Todos los datos de su instancia se eliminarán permanentemente, incluidos sus mundos, configuraciones y todo el contenido instalado."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Esta acción no se puede deshacer"
},
"app.instance.confirm-delete.delete-button": {
"message": "Eliminar instancia"
},
"app.instance.confirm-delete.header": {
"message": "Eliminar instancia"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este modpack ya está instalado en la instancia \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea de todos modos"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir a la instancia"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack ya está instalado"
},
"app.instance.mods.content-type-project": {
"message": "proyecto"
},
"app.instance.mods.copy-link": {
"message": "Copiar enlace"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "Se ha añadido \"{name}\""
},
"app.instance.mods.projects-were-added": {
"message": "Se han añadido {count} proyectos"
},
"app.instance.mods.share-text": {
"message": "¡Echa un vistazo a los proyectos que utilizo en mi modpack!"
},
"app.instance.mods.share-title": {
"message": "Compartir contenido del modpack"
},
"app.instance.mods.show-file": {
"message": "Mostrar archivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Se ha subido correctamente"
},
"app.instance.mods.unknown-version": {
"message": "Desconocido"
},
"app.instance.mods.updating": {
"message": "Actualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenido obligatorio"
},
"app.modal.install-to-play.header": {
"message": "Instala para jugar"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requiere mods para jugar. Haz clic en instalar para configurar los archivos necesarios de Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Modpack requerido"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} ha compartido contigo hoy esta instancia."
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requiere ciertos mods. Pulsa Instalar para instalar los archivos requeridos de Modrinth y luego el Launcher te enviara directo al servidor."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instancia compartida"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Instancia de servidor compartida"
},
"app.modal.update-to-play.added-count": {
"message": "{count} añadidos"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Añadido"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Eliminado"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Actualizado"
"app.modal.install-to-play.view-contents": {
"message": "Ver contenido"
},
"app.modal.update-to-play.header": {
"message": "Actualiza para jugar"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} eliminados"
},
"app.modal.update-to-play.update-required": {
"message": "Actualización requerida"
},
"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.modal.update-to-play.updated-count": {
"message": "{count} actualizados"
},
"app.settings.developer-mode-enabled": {
"message": "Modo desarrollador activado."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Gestión de recursos"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "¡La versión v{version} de Modrinth está lista para instalarse! Actualiza ahora o automáticamente al cerrar la aplicación."
},
"app.update-toast.body.download-complete": {
"message": "La descarga de la versión v{version} de Modrinth ha finalizado. Actualice ahora o automáticamente al cerrar la aplicación."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} se ha descargado. Actualiza la página ahora o espera a que se actualice automáticamente al cerrar Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} está disponible. ¡Usa tu gestor de paquetes para actualizar a la última versión con nuevas funciones y correcciones!"
"app.update-popup.body.linux": {
"message": "Ya está disponible Modrinth App v{version}. ¡Utiliza tu gestor de paquetes para actualizarla y disfrutar de las últimas funciones y correcciones!"
},
"app.update-toast.body.metered": {
"message": La versión v{version} de Modrinth App ya está disponible! Como estás conectado a una red con límite de datos, no la hemos descargado automáticamente."
"app.update-popup.body.metered": {
"message": "¡Modrinth App v{version} ya está disponible! Como estás conectado a una red con tarifa por datos, no la hemos descargado automáticamente."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Registro de cambios"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Descarga ({size})"
},
"app.update-toast.download-page": {
"message": "Descargar"
},
"app.update-toast.downloading": {
"message": "Descargando..."
},
"app.update-toast.reload": {
"message": "Recarga"
},
"app.update-toast.title": {
"message": "Actualización disponible"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "Descarga completada"
},
"app.update-popup.reload": {
"message": "Recargar"
},
"app.update-popup.title": {
"message": "Actualización disponible"
},
"app.update.complete-toast.text": {
"message": "Haga clic aquí para ver el registro de cambios."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.filter.disabled": {
"message": "Desactivar proyectos"
},
"instance.filter.updates-available": {
"message": "Actualizaciones disponibles"
},
"instance.server-modal.address": {
"message": "Dirección IP"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Instancia"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} para Minecraft {game_version} ya está instalada"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "La versión vanilla {game_version} ya está instalada"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Cambiar versión"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Buscando versiones del modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalando versión nueva"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Instalado actualmente"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Información de debug:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Buscando detalles del modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versión del juego"
},
"instance.settings.tabs.installation.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalación en progreso"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} versión"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "No se puede buscar los detalles del modpack enlazado. Por favor revise su conexión a internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} no está disponible para Minecraft {version}. Prueba con otro cargador."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "La instancia está enlazada a un modpack, pero el modpack no se ha podido encontrar en Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plataforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalando modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstalar reiniciará todo el contenido instalado o modificado a lo que el modpack proporcione, quitando cualquier mod o contenido que hayas añadido por encima de la instalación original. Esto puede arreglar actividad inesperada, pero si los mundos dependen del contendio adicional instalado, puede romperlos. "
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "¿Estás seguro de que quieres reinstalar esta instancia?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Reinicia el contenido de la instancia a su estado original, quitando cualquier mod o contenido que hayas añadido por encima del modpack original."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparar"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparando reinstalaciones Minecraft dependencias y buscando corrupciones. Esto podría solucionar problemas si tu juego no se está abriendo debido a errores relacionados con el launcher, pero no solucionará problemas o crashes relacionados con mods instalados."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "¿Reparar instancia?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparación en progreso"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Reiniciar a actual"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Mostrar todas las versiones"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "cambiar versión"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instalar"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalar"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparar"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "No se puede {action} mientras se está instalando."
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "No se puede {action} sin conexión"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "No se puede {action} reparando"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versión desconocida)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Desvincular instancia"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Si procedes, no podrás re-vincular sin crear una nueva instancia. No recibirás actualizaciones del modpack y se convertira en uno normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "¿Estás seguro de que quieres desvincular esta instancia?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "La instancia está vinculada a un modpack, lo que significa que los mods no pueden ser actualizados y no puedes cambiar el mod loader o la versión de Minecraft. Desvincular desconectará permanentemente esta instancia del modpack."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Desvincular del modpack"
},
"instance.settings.tabs.java": {
"message": "Java y memoria"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Servidor es incompatible"
},
"instance.worlds.linked_server": {
"message": "Gestionado por el proyecto del servidor"
},
"instance.worlds.no_contact": {
"message": "No se pudo contactar con el servidor"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sincronizar con la instancia"
},
"search.filter.locked.server": {
"message": "Proporcionado por el servidor"
},
"search.filter.locked.server-environment.title": {
"message": "Solo se pueden añadir a la instancia del servidor modificaciones del lado del cliente"
},
"search.filter.locked.server-game-version.title": {
"message": "La versión del juego es proporcionada por el servidor"
},
"search.filter.locked.server-loader.title": {
"message": "El cargador lo proporciona el servidor"
}
}
+89 -161
View File
@@ -5,6 +5,60 @@
"app.auth-servers.unreachable.header": {
"message": "Todennuspalvelimiin ei saada yhteyttä"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpack nimi"
},
"app.export-modal.select-files-label": {
"message": "Valitse tiedostot ja kansiot pakettiin"
},
"app.export-modal.version-number-label": {
"message": "Versio numero"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" lisättiin"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projektia lisättiin"
},
"app.modal.install-to-play.content-required": {
"message": "Sisältö vaaditaan"
},
"app.modal.install-to-play.header": {
"message": "Asenna pelataksesi"
},
"app.modal.install-to-play.install-button": {
"message": "Asenna"
},
"app.modal.install-to-play.mod-count": {
"message": "one {{count, plural, one {# mod} other {# modia}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Vaadittu modipaketti"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Tämä palvelin vaatii modeja toimiakseen. Klikkaa Asenna ladataksesi vaaditut tiedostot Modrinthista, ja käynnistä peli suoraan palvelimelle."
},
"app.modal.install-to-play.shared-instance": {
"message": "Jaettu instanssi"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Jaettu palvelininstanssi"
},
"app.modal.install-to-play.view-contents": {
"message": "Tarkastele sisältöä"
},
"app.modal.update-to-play.header": {
"message": "Päivitä pelataksesi"
},
"app.modal.update-to-play.update-required": {
"message": "Päivitys vaaditaan"
},
"app.modal.update-to-play.update-required-description": {
"message": "Pävitys vaaditaan pelataksesi {name}. Päivitä viimeisimpään versioon pelataksesi."
},
"app.settings.developer-mode-enabled": {
"message": "Kehittäjätila käytössä."
},
@@ -32,36 +86,33 @@
"app.settings.tabs.resource-management": {
"message": "Resurssien hallinta"
},
"app.update-toast.body": {
"message": "Modrinth-sovellus v{version} on valmis asennettavaksi! Lataa sovellus uudelleen päivittääksesi sen nyt tai automaattisesti, kun suljet Modrinth-sovelluksen."
"app.update-popup.body": {
"message": "Modrinth App versio {version} on valmis asennettavaksi. Voit käynnistää sovelluksen uudelleen päivittääksesi heti tai antaa päivityksen asentua automaattisesti, kun suljet Modrinth Appin."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth-sovellus v{version} on ladattu. Lataa sovellus uudelleen päivittääksesi sen nyt tai automaattisesti, kun suljet Modrinth-sovelluksen."
"app.update-popup.body.download-complete": {
"message": "Modrinth App versio {version} on ladattu. Voit käynnistää sovelluksen uudelleen päivittääksesi heti tai antaa päivityksen asentua automaattisesti, kun suljet Modrinth Appin."
},
"app.update-toast.body.metered": {
"message": "Modrinth-sovellus v{version} on nyt saatavilla! Koska käytät käyttömaksullista verkkoa, emme ladanneet sitä automaattisesti."
"app.update-popup.body.linux": {
"message": "Modrinth App versio {version} on saatavilla. Käytä paketinhallintasi ja päivitä käyttääksesi uusimpia ominaisuuksia ja korjauksia!"
},
"app.update-toast.changelog": {
"app.update-popup.body.metered": {
"message": "Modrinth App versio {version} on nyt saatavilla! Koska käytät käytön mukaan laskutettavaa verkkoa, emme ladannut sitä automaattisesti."
},
"app.update-popup.changelog": {
"message": "Muutosloki"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Lataa ({size})"
},
"app.update-toast.download-page": {
"message": "Lataa"
},
"app.update-toast.downloading": {
"message": "Ladataan..."
},
"app.update-toast.reload": {
"message": "Uudelleen lataa"
},
"app.update-toast.title": {
"message": "Päivitys saatavilla"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "Lataus valmis"
},
"app.update-popup.reload": {
"message": "Lataa uudelleen"
},
"app.update-popup.title": {
"message": "Päivitys saatavilla"
},
"app.update.complete-toast.text": {
"message": "Klikkaa tästä nähdäksesi muutoslokin."
},
@@ -176,12 +227,6 @@
"instance.edit-world.title": {
"message": "Muokkaa maailmaa"
},
"instance.filter.disabled": {
"message": "Käytöstä poistetut projektit"
},
"instance.filter.updates-available": {
"message": "Päivityksia saatavilla"
},
"instance.server-modal.address": {
"message": "Osoite"
},
@@ -216,7 +261,7 @@
"message": "Ei pystytä monistamaan asennettaessa."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Monista instanssi"
"message": "Monista asennus"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Luo kopion tästä instanssista sekä kaikista sen maailmoista, asetuksista, modeista yms."
@@ -290,141 +335,9 @@
"instance.settings.tabs.installation": {
"message": "Asennus"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} Minecraft versiolle {game_version} on jo asennettu"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} on jo asennettu"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Vaihda versiota"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Asenna"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Asennetaan"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Noudetaan modipaketin versioita"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Asennetaan uutta versiota"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Asennettuna"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Virheenkorjaus informaatio:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Noudetaan modipaketin tietoja"
},
"instance.settings.tabs.installation.game-version": {
"message": "Peli versio"
},
"instance.settings.tabs.installation.install": {
"message": "Asenna"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Asennus käynnissä"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} versio"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Ei voida noutaa linkatun modipaketin tietoja. Tarkista internet yhteytesi."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} ei ole saatavilla Minecraft versiolle {version}. Kokeile toista modi lataajaa."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Tämä instanssi on linkitetty modipakettiin, mutta modipakettia ei löydetty Modrinthista."
},
"instance.settings.tabs.installation.platform": {
"message": "Alusta"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Asenna modipaketti uudelleen"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Asennetaan modipakettia uudelleen"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Uudelleen asentaminen palauttaa kaiken asennetun tai muokatun sisällön siihen muotoon missä se on modipaketissa poistaen kaikki modit ja muun sisällön mitä olet lisännyt alkuperäisen asennuksen päälle. Tämä saattaa korjata odottamatonta käytöstä mikäli instanssia on muokattu mutta jos maailmasi ovat nyt riippuvaisia lisätystä sisällöstä se saattaa rikkoa olemassa olevia maailmoja."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Haluatko varmasti asentaa tämän instanssin uudelleen?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Palauttaa instanssin sisällön alkuperäiseen muotoonsa poistaen kaikki modit tai muun sisällön mitä olet lisännyt alkuperäisen modipaketin päälle."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Asenna modipaketti uudelleen"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Korjaa"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Korjataan"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Korjaaminen uudelleen asentaa Minecraftin riippuvuuksia ja tarkistaa korruptiota varten. Tämä saattaa ratkaista ongelmia jos pelisi ei käynnisty launcheriin liittyvien virheiden takia mutta ei ratkaise ongelmia tai kaatumisia liittyen ladattuihin modeihin."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Korjaa instanssi?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Korjaus käynnissä"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Palauta nykyiseen"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Näytä kaikki versiot"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "vaihda versiota"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "asenna"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "asenna uudelleen"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "korjaa"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Et voi {action} asentaessa"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Toimintoa {action} ei voida suorittaa offline tilassa"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Et voi {action} korjatessa"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(tuntematon versio)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Poista instanssin linkitys"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Jos jatkat et voi uudelleen linkata sitä ilman että luot täysin uuden instanssin. Et vastaanota enää modipaketti päivityksiä ja siitä tulee normaali."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Oletko varma että haluat poistaa tämän instanssin linkityksen?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Tämä instanssi on linkitetty modipakettin joka tarkoittaa että modeja ei voida päivittää etkä voi vaihtaa lataaja tai Minecraft versiota. Linkityksen poistaminen katkaisee pysyvästi yhteyden instanssin ja modipaketin välillä."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Poista linkitys modipakettiin"
},
"instance.settings.tabs.java": {
"message": "Java ja muisti"
},
@@ -497,6 +410,9 @@
"instance.worlds.incompatible_server": {
"message": "Palvelin on yhteensopimaton"
},
"instance.worlds.linked_server": {
"message": "Palvelimen projektin hallinnoima"
},
"instance.worlds.no_contact": {
"message": "Palvelimeen ei saatu yhteyttä"
},
@@ -531,6 +447,18 @@
"message": "Lataajan antaa instanssi"
},
"search.filter.locked.instance.sync": {
"message": "Synkkaa instanssin kanssa"
"message": "Synkronoi instanssin kanssa"
},
"search.filter.locked.server": {
"message": "Palvelimen tarjoama"
},
"search.filter.locked.server-environment.title": {
"message": "Voit lisätä vain paikallisia modeja palvelinasennukseen"
},
"search.filter.locked.server-game-version.title": {
"message": "Peliversio on palvelimen tarjoama"
},
"search.filter.locked.server-loader.title": {
"message": "Modialusta on palvelimen tarjoama"
}
}
+68 -179
View File
@@ -5,6 +5,42 @@
"app.auth-servers.unreachable.header": {
"message": "Hindi maabot ang mga authentication server"
},
"app.export-modal.description-placeholder": {
"message": "Ilagay ang paglalarawan ng modpack..."
},
"app.export-modal.export-button": {
"message": "Iluwas"
},
"app.export-modal.modpack-name-label": {
"message": "Pangalan ng Modpack"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Pangalan ng modpack"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Ang lahat ng data ng iyong instansiya ay tuluyang mawawala, kabilang na ang iyong mga mundo, kumpigurasyon, at lahat ng na-install na kontento."
},
"app.instance.mods.content-type-project": {
"message": "proyekto"
},
"app.instance.mods.copy-link": {
"message": "Kopyahin ang link"
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "Ang \"{name}\" ay nadagdag"
},
"app.instance.mods.unknown-version": {
"message": "Hindi kilala"
},
"app.modal.install-to-play.content-required": {
"message": "Nangangailangan ng kontento"
},
"app.modal.install-to-play.header": {
"message": "Mag-install upang malaro"
},
@@ -14,11 +50,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# na mod}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Ang server na ito ay nangangailangan ng mga mod upang malaro. Pindutin ang install upang mahanda ang mga kinakailangang file galing sa Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Kinailangan na modpack"
},
"app.modal.install-to-play.shared-by-today": {
"message": "Ibinahagi ngayong araw ni {name} ang instansiyang ito sa iyo."
"app.modal.install-to-play.server-requires-mods": {
"message": "Ang server rna ito ay nangangailangan ng mga mod upang makalaro. Pindutin ang install upang maihanda ang mga kinakailangang file galing sa Modrinth, matapos ay ilunsad nang diretso sa server."
},
"app.modal.install-to-play.shared-instance": {
"message": "Binahaging instansiya"
@@ -26,36 +62,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Binahaging instansiyang pang-server"
},
"app.modal.update-to-play.added-count": {
"message": "{count} nadagdag"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Dinagdag"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Tinanggal"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Na-update"
"app.modal.install-to-play.view-contents": {
"message": "Tingnan ang mga kontento"
},
"app.modal.update-to-play.header": {
"message": "Mag-update upang malaro"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} tinanggal"
},
"app.modal.update-to-play.update-required": {
"message": "Kailangang mag-update"
},
"app.modal.update-to-play.update-required-description": {
"message": "Kailangang mag-update upang malaro ang {name}. Mangyaring mag-update sa pinakabagong bersiyon upang ma-launch ang laro."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} na-update"
},
"app.settings.developer-mode-enabled": {
"message": "Nakabukas ang moda ng nagdidibelop."
},
@@ -83,39 +101,33 @@
"app.settings.tabs.resource-management": {
"message": "Pamamahala ng paglalaan"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Ang Modrinth App v{version} ay handa nang ma-install. Mag-reload upang ma-update ngayon, o awtomatiko sa pagsara ng Modrinth App."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Tapos nang ma-download ang Modrinth App v{version}. Mag-reload upang ma-update ngayon, o awtomatiko sa pagsara ng Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Magagamit na ngayon ang Modrinth App v{version}. Gamitin ang iyong package manager upang i-update sa pinabagong tampok at pag-aayos!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Magagamit na ngayon ang Modrinth App v{version}! Hindi namin dinanload kaagad dahil naka-metro ang inyong network."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Changelog"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "I-download ({size})"
},
"app.update-toast.download-page": {
"message": "I-download"
"app.update-popup.download-complete": {
"message": "Nakumpleto ang pagdownload"
},
"app.update-toast.downloading": {
"message": "Nagda-download..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Mag-reload"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "May bagong update"
},
"app.update-toast.title.download-complete": {
"message": "Nakumpleto ang pagdownload"
},
"app.update.complete-toast.text": {
"message": "Dito pumindot upang matingnan ang changelog."
},
@@ -230,12 +242,6 @@
"instance.edit-world.title": {
"message": "Baguhin ang mundo"
},
"instance.filter.disabled": {
"message": "Mga hindi pinapagang proyekto"
},
"instance.filter.updates-available": {
"message": "May bagong mga update"
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -309,7 +315,7 @@
"message": "Mga custom na launch hook"
},
"instance.settings.tabs.hooks.description": {
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga system command bago at pagkatapos ma-launch ang laro."
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga pansistemang utos o system command bago at pagkatapos ma-launch ang laro."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Post-exist"
@@ -344,141 +350,9 @@
"instance.settings.tabs.installation": {
"message": "Instalasyon"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Naka-install naman ang {platform} {version} para sa Minecraft {game_version}"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Naka-install naman ang Vanilla {game_version}"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Palitan ang bersiyon"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "I-install"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Ini-install"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Nagfe-fetch ng mga bersiyon ng modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Ini-install ang bagong bersiyon"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Kasalukuyang naka-install"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Impormasyon sa pagdebug:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Nagfe-fetch ng mga detalye ng modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Bersiyon ng laro"
},
"instance.settings.tabs.installation.install": {
"message": "I-install"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Nag-i-install ngayon"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Bersiyon ng {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Hindi maka-fetch ng mga detalye ng linked modpack. Mangyaring tingnan ang iyong internet connection."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "Hindi magagamit ang {loader} sa Minecraft {version}. Sumubok ng ibang mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Naka-link itong instansiya sa isang modpack, pero ang modpack na ito ay hindi makikita sa Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plataporma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "I-reinstall ang modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Ini-re-reinstall ang modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Ang pagrere-install ay maaaring ma-reset ang lahat ng na-install at binago na kontento sa kung anong hinahandog ng modpack, tatanggalin ang mga mods at kontentong idinagdag mo sa orihinal na modpack. Maaari nitong masiayos ang mga hindi inaasahang pag-uugali kung may pagbabagong naganap sa instansiya, ngunit kung dumedepende na ang iyong mundo sa karagdagang kontento, maaari nitong masira ang mga umiiral na mundo."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Sigurado ka bang gusto mong i-reinstall ang instansiyang ito?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Mare-reset ang mga kontento ng instansiya sa orihinal niyang estado, tatanggalin ang mga mods at kontentong idinagdag mo sa orihinal na modpack."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "I-reinstall ang modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Ayusin"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Inaayos"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Sa pagre-repair, mare-reinstall ang mga dependency ng Minecraft at maghahanap ng mga kurapsiyon. Maaaring maresolbe nito ang mga isyu kung hindi malu-launch ang laro dahil sa mga launcher-related error, ngunit hindi nito mareresolbe ang mga isyu at pag-crash na dulot ng mga na-install na mod."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Ayusin ang instansiya?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Inaayos ngayon"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Sa kasalukuyan i-reset"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Ipakita ang lahat ng bersiyon"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "palitan ang bersiyon"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "i-install"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "i-reinstall"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "ayusin"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Hindi makaka-{action} habang nag-i-install"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Hindi makaka-{action} habang nasa offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Hindi makaka-{action} habang nag-aayos"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(hindi kilalang bersiyon)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "I-unlink sa instansiya"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Kapag ipagpatuloy mo, hindi mo na itong mai-link muli ng hindi gagawa ng bagong instansiya. Hindi ka makakatanggap ng mga update ng modpack at magiging normal na itong."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Sigurado ka bang gusto mong i-unlik ang instansiyang ito?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Ang instansiyang ito ay naka-link sa isang modpack, ibig sabihin ang mga mod ay hindi mai-update at hindi mo mapapalitan ang mod loader at ang bersiyon ng Minecraft. Permanenteng madi-diskonekta ang instansiyang ito sa modpack kung mag-unlink."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "I-unlink sa modpack"
},
"instance.settings.tabs.java": {
"message": "Java at memorya"
},
@@ -551,6 +425,9 @@
"instance.worlds.incompatible_server": {
"message": "Hindi magkatugma sa server"
},
"instance.worlds.linked_server": {
"message": "Pinamamahala ng proyektong server"
},
"instance.worlds.no_contact": {
"message": "Hindi makontak ang server"
},
@@ -586,5 +463,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Maki-sync sa instansiya"
},
"search.filter.locked.server": {
"message": "Handog ng server"
},
"search.filter.locked.server-environment.title": {
"message": "Mga mod sa panig ng client lamang ang maidadaragdag sa instansiyang server"
},
"search.filter.locked.server-game-version.title": {
"message": "Ang bersiyon ng laro ay handog ng server"
},
"search.filter.locked.server-loader.title": {
"message": "Ang loader ay handog na ng server"
}
}
+126 -183
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Impossible de contacter les serveurs d'authentification"
},
"app.export-modal.description-placeholder": {
"message": "Saisir la description du modpack..."
},
"app.export-modal.export-button": {
"message": "Exporter"
},
"app.export-modal.header": {
"message": "Exporter le modpack"
},
"app.export-modal.modpack-name-label": {
"message": "Nom du modpack"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nom du modpack"
},
"app.export-modal.select-files-label": {
"message": "Sélectionnez des fichiers et des dossiers à inclure dans le pack"
},
"app.export-modal.version-number-label": {
"message": "Numéro de version"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Toutes les données pour votre instance seront supprimée à jamais, y comprit vos mondes, configurations, et contenu supprimé."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Cette action est irréversible"
},
"app.instance.confirm-delete.delete-button": {
"message": "Supprimer l'instance"
},
"app.instance.confirm-delete.header": {
"message": "Supprimer l'instance"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ce modpack est déjà installé dans linstance « {instanceName} »."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Dupliquer le modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Créer quand même"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Aller à linstance"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack déjà installé"
},
"app.instance.mods.content-type-project": {
"message": "projet"
},
"app.instance.mods.copy-link": {
"message": "Copier le lien"
},
"app.instance.mods.installing": {
"message": "Installation..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "« {name} » a été ajouté"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projets ont été ajoutés"
},
"app.instance.mods.share-text": {
"message": "Jette un coup d'œil aux projets que j'utilise dans mon modpack !"
},
"app.instance.mods.share-title": {
"message": "Partagez le contenu de votre modpack"
},
"app.instance.mods.show-file": {
"message": "Montrer le fichier"
},
"app.instance.mods.successfully-uploaded": {
"message": "Mis en ligne avec succès"
},
"app.instance.mods.unknown-version": {
"message": "Inconnu"
},
"app.instance.mods.updating": {
"message": "Mise à jour..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenu requis"
},
"app.modal.install-to-play.header": {
"message": "Installer pour jouer"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Ce serveur nécessite des mods pour pouvoir y jouer. Cliquez sur installer pour mettre les fichiers de Modrinth en place."
"app.modal.install-to-play.required-modpack": {
"message": "Modpack requis"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} a partagé cette instance avec vous aujourd'hui."
"app.modal.install-to-play.server-requires-mods": {
"message": "Ce serveur a besoin de mods pour jouer. Cliquez sur Installer pour mettre en place les fichiers requis depuis Modrinth, puis lancez directement dans le serveur."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instance partagée"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Instance serveur partagée"
},
"app.modal.update-to-play.added-count": {
"message": "{count} {count, plural, one {# ajouté} other {# ajoutés}}"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Ajouté"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Retiré"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Mis à jour"
"app.modal.install-to-play.view-contents": {
"message": "Voir le contenu"
},
"app.modal.update-to-play.header": {
"message": "Mettre à jour pour jouer"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} {count, plural, one {# retiré} other {# retirés}}"
},
"app.modal.update-to-play.update-required": {
"message": "Mise à jour requise"
},
"app.modal.update-to-play.update-required-description": {
"message": "Une mise à jour est requise pour jouer à {name}. Veuillez mettre à jour à la dernière version pour lancer le jeu."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} mis à jour"
},
"app.settings.developer-mode-enabled": {
"message": "Mode développeur activé."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Gestion des ressources"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} est prête à être installée ! Relancez l'application pour faire la mise à jour maintenant, ou automatiquement à la fermeture de Modrinth App."
"app.update-popup.body": {
"message": "Modrinth App v{version} est prête à être installée ! Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Le téléchargement de Modrinth App v{version} est terminé ! Relancez l'application pour mettre à jour maintenant, ou automatiquement à la fermeture de Modrinth App."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} a finie d'être téléchargée. Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Modrith App v{version} est disponible. Utilisez votre gestionnaire de paquets pour obtenir les derniers changements et corrections de bugs !"
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} est disponible. Utilisez votre gestionnaire de paquets pour mettre à jour les dernières fonctionnalités et corrections de bogues !"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} est disponible dès maintenant ! Lorsque vous êtes sur un réseau limité ou en données mobiles, nous ne téléchargerons pas les mises à jour automatiquement."
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} est disponible maintenant ! Puisque vous êtes sur un réseau métré, nous ne l'avons pas téléchargé automatiquement."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Journal des modifications"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Télécharger ({size})"
},
"app.update-toast.download-page": {
"message": "Télécharger"
"app.update-popup.download-complete": {
"message": "Téléchargement terminé"
},
"app.update-toast.downloading": {
"message": "Téléchargement..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Recharger"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Mise à jour disponible"
},
"app.update-toast.title.download-complete": {
"message": "Téléchargement terminé"
},
"app.update.complete-toast.text": {
"message": "Cliquez ici pour voir les changements récents."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Modifier le monde"
},
"instance.filter.disabled": {
"message": "Projets désactivés"
},
"instance.filter.updates-available": {
"message": "Mises à jour disponibles"
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} pour Minecraft {game_version} est déjà installé"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} est déjà installé"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Changer de version"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Récupération des versions de modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installation d'une nouvelle version"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Actuellement installé"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informations de débogage :"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Récupération des détails de modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Version du jeu"
},
"instance.settings.tabs.installation.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installation en cours"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Version de {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Impossible de récupérer les détails du modpack lié. Veuillez vérifier votre connexion Internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} n'est pas disponible pour Minecraft {version}. Essayez avec un autre chargeur de mods."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Cette instance est liée à un modpack, mais le modpack n'a pas pu être trouvé sur Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plateforme"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Réinstaller le modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Réinstallation du modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "La réinstallation réinitialisera tout le contenu installé ou modifié à celui fourni par le modpack, supprimant ainsi tous les mods ou contenus ajoutés à l'installation d'origine. Cela peut corriger un comportement inattendu si des modifications ont été apportées à l'instance, mais si vos mondes dépendent désormais de contenu supplémentaire installé, cela peut endommager les mondes existants."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Êtes-vous sûr de vouloir réinstaller cette instance ?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Réinitialise le contenu de l'instance à son état d'origine, en supprimant tous les mods ou contenus que vous avez ajoutés au modpack d'origine."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Réinstaller le modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Réparer"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Réparation"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "La réparation réinstalle les dépendances de Minecraft et vérifie la corruption. Cela peut résoudre les problèmes de lancement du jeu en raison d'erreurs liées au launcher, mais ne résoudra pas les problèmes ou plantages liés aux mods installés."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Réparer l'instance ?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Réparation en cours"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Restaurer à l’état actuel"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Voir toutes les versions"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "changer la version"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "installer"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "réinstaller"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "réparer"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Impossible de {action} pendant l'installation"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Impossible de {action} hors ligne"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Impossible de {action} pendant la réparation"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(version inconnue)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Délier l'instance"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Si vous continuez, vous ne pourrez pas la relier de nouveau sans créer une toute nouvelle instance. Vous ne recevrez plus de mises à jour du modpack et elle deviendra une instance normale."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Êtes-vous sûr de vouloir délier cette instance ?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Cette instance est liée à un modpack, ce qui veut dire que les mods ne peuvent être mis à jour et vous ne pouvez pas changer le modloader ou la version de Minecraft. La délier va déconnecter l'instance du modpack de façon permanente."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Délier du modpack"
},
"instance.settings.tabs.java": {
"message": "Java et mémoire"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Le serveur est incompatible"
},
"instance.worlds.linked_server": {
"message": "Géré par le projet du serveur"
},
"instance.worlds.no_contact": {
"message": "Le serveur n'a pas pu être contacté"
},
@@ -558,7 +489,7 @@
"message": "Vous pouvez seulement entrer directement dans les serveurs sur Minecraft Alpha 1.0.5+"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Vous pouvez seulement entrer directement dans les mondes solo sur Minecraft Alpha 1.20+"
"message": "Vous pouvez seulement entrer directement dans les mondes solo sur Minecraft 1.20+"
},
"instance.worlds.play_instance": {
"message": "Jouer à l'instance"
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Synchroniser avec l'instance"
},
"search.filter.locked.server": {
"message": "Fournis par le serveur"
},
"search.filter.locked.server-environment.title": {
"message": "Seuls les mods client peuvent être ajoutés à l'instance du serveur"
},
"search.filter.locked.server-game-version.title": {
"message": "Version du jeu est procurée par le serveur"
},
"search.filter.locked.server-loader.title": {
"message": "Le loader est procuré par le serveur"
}
}
+107 -179
View File
@@ -5,6 +5,81 @@
"app.auth-servers.unreachable.header": {
"message": "לא ניתן לגשת לשרתי האימות"
},
"app.export-modal.description-placeholder": {
"message": "הזן את תיאור חבילת המודים..."
},
"app.export-modal.export-button": {
"message": "יצוא"
},
"app.export-modal.header": {
"message": "יצוא חבילת מודים"
},
"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": "מספר גרסה"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "כל הנתונים של ההתקנה שלך ימחקו לתמיד, זה כולל את העולמות שלך, ההגדרות וכל התוכן שהתקנת."
},
"app.instance.confirm-delete.admonition-header": {
"message": "הפעולה הזו לא ניתנת לביטול"
},
"app.instance.confirm-delete.delete-button": {
"message": "מחק התקנה"
},
"app.instance.confirm-delete.header": {
"message": "מחיקת התקנה"
},
"app.instance.mods.content-type-project": {
"message": "פרויקט"
},
"app.instance.mods.copy-link": {
"message": "העתק קישור"
},
"app.instance.mods.installing": {
"message": "מתקין..."
},
"app.instance.mods.modpack-fallback": {
"message": "חבילת מודים"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" נוסף"
},
"app.instance.mods.projects-were-added": {
"message": "{count} פרויקטים נוספו"
},
"app.instance.mods.share-text": {
"message": "בדוק את הפרויקטים שאני משתמש בהם בחבילת המודים שלי!"
},
"app.instance.mods.share-title": {
"message": "משתף את התוכן של חבילת המודים"
},
"app.instance.mods.show-file": {
"message": "מצא קובץ"
},
"app.instance.mods.successfully-uploaded": {
"message": "הועלה בהצלחה"
},
"app.instance.mods.unknown-version": {
"message": "לא ידוע"
},
"app.instance.mods.updating": {
"message": "מעדכן..."
},
"app.modal.install-to-play.content-required": {
"message": "תוכן נדרש"
},
"app.modal.install-to-play.header": {
"message": "צריך להתקין כדי לשחק"
},
@@ -14,11 +89,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {מוד אחד} other {# מודים}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "השרת דורש מודים כדי לשחק. התקנה מגדירה את הקבצים הדרושים מModrinth."
"app.modal.install-to-play.required-modpack": {
"message": "חבילת מודים נדרשת"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} שיתף איתך את ההתקנה הזאת היום."
"app.modal.install-to-play.server-requires-mods": {
"message": "שרת זה דורש מודים כדי לשחק. לחץ על \"התקן\" כדי להגדיר את הקבצים הנדרשים מ-Modrinth, ולאחר מכן הפעל ישירות לשרת."
},
"app.modal.install-to-play.shared-instance": {
"message": "התקנה משותפת"
@@ -26,36 +101,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "התקנת שרת משותפת"
},
"app.modal.update-to-play.added-count": {
"message": "{count} נוספו"
},
"app.modal.update-to-play.diff-type.added": {
"message": "נוסף"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "הוסר"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "עודכן"
"app.modal.install-to-play.view-contents": {
"message": "הצג תוכן"
},
"app.modal.update-to-play.header": {
"message": "צריך לעדכן כדי לשחק"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} הוסרו"
},
"app.modal.update-to-play.update-required": {
"message": "עדכון נדרש"
},
"app.modal.update-to-play.update-required-description": {
"message": "עדכון נדרש כדי לשחק ב{name}. ניתן להתחיל את המשחק רק לאחר עדכון לגרסה החדשה."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} עודכנו"
},
"app.settings.developer-mode-enabled": {
"message": "מצב מפתח מופעל."
},
@@ -83,38 +140,32 @@
"app.settings.tabs.resource-management": {
"message": "ניהול משאבים"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} מוכנה להורדה!\nיש לרענן כדי לעדכן עכשיו, או באופן אוטומטי בעת סגירת האפליקציה."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} סיימה את תהליך ההורדה. יש לרענן כדי לעדכן עכשיו, או באופן אוטומטי בעת סגירת האפליקציה."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} זמין. יש להשתמש במנהל חבילות שלך כדי לעדכן בשביל התכונות החדשות ותיקונים!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} זמינה עכשיו! בגלל החיבור לפי שימוש, לא הורדנו אותה אוטומטית."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "יומן שינויים"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "הורדה ({size})"
},
"app.update-toast.download-page": {
"message": "הורד"
"app.update-popup.download-complete": {
"message": "הורדה הושלמה"
},
"app.update-toast.downloading": {
"message": "מוריד..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "רענן"
},
"app.update-toast.title": {
"message": "עדכונים זמינים"
},
"app.update-toast.title.download-complete": {
"message": "הורדה הושלמה"
"app.update-popup.title": {
"message": "עדכון זמין"
},
"app.update.complete-toast.text": {
"message": "לחיצה כדי לראות את יומן השינויים."
@@ -230,12 +281,6 @@
"instance.edit-world.title": {
"message": "ערוך עולם"
},
"instance.filter.disabled": {
"message": "פרויקטים מושבתים"
},
"instance.filter.updates-available": {
"message": "עדכונים זמינים"
},
"instance.server-modal.address": {
"message": "כתובת"
},
@@ -344,141 +389,9 @@
"instance.settings.tabs.installation": {
"message": "התקנה"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} בשביל Minecraft {game_version} כבר מותקן"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "וונילה {game_version} כבר מותקן"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "שינוי גרסה"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "התקן"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "מתקין"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "מאחזר גרסאות חבילת מודים"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "מתקין גרסה חדשה"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "מותקן כעת"
},
"instance.settings.tabs.installation.debug-information": {
"message": "מידע ניפוי שגיאות:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "מאחזר פרטי חבילת מודים"
},
"instance.settings.tabs.installation.game-version": {
"message": "גרסת משחק"
},
"instance.settings.tabs.installation.install": {
"message": "התקן"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "ההתקנה בתהליך"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} גרסה"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "לא ניתן לאחזר את פרטי חבילת המודים המקושרת. יש לבדוק את חיבור האינטרנט שלך."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} אינו זמין עבור Minecraft {version}. אנא נסה טוען מודים אחר."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "התקנה זאת מקושרת לחבילת מודים, אך חבילת המודים לא נמצאה בModrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "פלטפורמה"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "התקן מחדש את חבילת המודים"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "מתקין מחדש את חבילת המודים"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "התקנה מחדש תאפס את כל התוכן המותקן או ששונה, ותחזיר אותו למצב שסופק על ידי חבילת המודים, תוך הסרת כל מוד או תוכן שהוספתם מעבר להתקנה המקורית. פעולה זו עשויה לתקן תקלות שנגרמו משינויים בהתקנה, אך אם העולמות שלכם תלויים בתוכן נוסף שהותקן, היא עלולה לשבש אותם."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "האם אתה בטוח שברצונך להתקין מחדש instance זה?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "מאפס את התוכן שנמצא בהתקנה למצבו המקורי, תוך הסרת כל מוד או תוכן ששונה מעבר לחבילת המודים המקורית."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "התקן מחדש חבילת מודים"
},
"instance.settings.tabs.installation.repair.button": {
"message": "תיקון"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "מתקן"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "התיקון מתקין מחדש את התלויות של מיינקראפט ובודק דברים מקולקלים. פעולה זו עשויה לפתור בעיות שמונעות את הפעלת המשחק עקב שגיאות הקשורות למשגר, אך לא תפתור בעיות או קריסות הקשורות למודים המותקנים."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "לתקן את המכונה?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "תיקון בתהליך"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "אפס לגרסה הנוכחית"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "הצג את כל הגרסאות"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "שנה גרסה"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "התקן"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "התקן מחדש"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "תקן"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "לא ניתן לבצע {action} בזמן ההתקנה"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "לא ניתן לבצע {action} במצב לא מקוון"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "לא יכול {action} בזמן תיקון"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(גרסה לא ידועה)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "לבטל את הקישור של ההתקנה הזו"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "אם תמשיך, לא תוכל לקשר אותה מחדש מבלי ליצור התקנה חדשה לחלוטין. לא תקבל עוד עדכונים לחבילת המודים, והיא תהפוך להתקנה רגילה."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "האם אתה בטוח שברצונך לנתק את הקישור ל-instance הזה?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "התקנה זאת מקושרת לחבילת מודים, מה שאומר שלא ניתן לעדכן מודים ולא ניתן לשנות את טוען המודים או את גרסת המיינקראפט. הניתוק יבטל לצמיתות את הקישור של התקנה זאת לחבילת המודים."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "נתק קישור מחבילת מודים"
},
"instance.settings.tabs.java": {
"message": "ג'אווה וזיכרון"
},
@@ -551,6 +464,9 @@
"instance.worlds.incompatible_server": {
"message": "שרת לא מתאים"
},
"instance.worlds.linked_server": {
"message": "מנוהל על ידי פרויקט שרת"
},
"instance.worlds.no_contact": {
"message": "לא ניתן ליצור קשר עם השרת"
},
@@ -586,5 +502,17 @@
},
"search.filter.locked.instance.sync": {
"message": "סנכרן עם התקנה"
},
"search.filter.locked.server": {
"message": "מסופק על ידי השרת"
},
"search.filter.locked.server-environment.title": {
"message": "ניתן להוסיף רק מודים בצד הלקוח לשרת"
},
"search.filter.locked.server-game-version.title": {
"message": "גרסת המשחק מסופקת על ידי השרת"
},
"search.filter.locked.server-loader.title": {
"message": "הטוען מסופק על ידי השרת"
}
}
+130 -187
View File
@@ -5,20 +5,110 @@
"app.auth-servers.unreachable.header": {
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
},
"app.export-modal.description-placeholder": {
"message": "Írd be a modcsomag leírását..."
},
"app.export-modal.export-button": {
"message": "Exportálás"
},
"app.export-modal.header": {
"message": "Modcsomag exportálása"
},
"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": "Válaszd ki a csomagba felveendő fájlokat és mappákat"
},
"app.export-modal.version-number-label": {
"message": "Verziószám"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Az profilodhoz tartozó összes adat véglegesen törlődik, beleértve a világokat, a beállításokat és az összes telepített tartalmat."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Ezt a műveletet nem lehet visszavonni"
},
"app.instance.confirm-delete.delete-button": {
"message": "Profil törlése"
},
"app.instance.confirm-delete.header": {
"message": "Profil törlése"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ez a modcsomag már telepítve van a „{instanceName}” profilban."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modcsomag duplikálása"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Létrehozás mindenképpen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Profil megnyitása"
},
"app.instance.modpack-already-installed.header": {
"message": "A modcsomag már telepítve van"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Link másolása"
},
"app.instance.mods.installing": {
"message": "Telepítés..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modcsomag"
},
"app.instance.mods.project-was-added": {
"message": " „{name}” hozzá lett adva"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projekt került hozzáadásra"
},
"app.instance.mods.share-text": {
"message": "Nézd meg, milyen projekteket használok a modcsomagomban!"
},
"app.instance.mods.share-title": {
"message": "Modcsomag-tartalmak megosztása"
},
"app.instance.mods.show-file": {
"message": "Fájl megjelenítése"
},
"app.instance.mods.successfully-uploaded": {
"message": "Sikeresen feltöltve"
},
"app.instance.mods.unknown-version": {
"message": "Ismeretlen"
},
"app.instance.mods.updating": {
"message": "Frissítés..."
},
"app.modal.install-to-play.content-required": {
"message": "Szükséges tartalom"
},
"app.modal.install-to-play.header": {
"message": "Töltsd le a játékhoz"
"message": "Telepítés a játékhoz"
},
"app.modal.install-to-play.install-button": {
"message": "Telepítés"
},
"app.modal.install-to-play.mod-count": {
"message": "# mod"
"message": "{count, plural,one {# mod}other {# modok}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Szükséges modcsomag"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Ehhez a szerverhez modok szükségesek a játékhoz. Kattints a telepítés gombra, hogy beállítsd a szükséges fájlokat a Modrinthból."
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} ma megosztotta veled ezt a profilt."
"message": "Ehhez a szerverhez modok szükségesek a játékhoz. Kattints a Telepítés gombra, hogy telepítsd a szükséges fájlokat a Modrinth-ról, majd indítsd el közvetlenül a szervert."
},
"app.modal.install-to-play.shared-instance": {
"message": "Megosztott profil"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Megosztott szerverprofil"
},
"app.modal.update-to-play.added-count": {
"message": "{count} hozzáadva"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Hozzáadva:"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Eltávolítva:"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Frissítve"
"app.modal.install-to-play.view-contents": {
"message": "Tartalom megtekintése"
},
"app.modal.update-to-play.header": {
"message": "Frissítsd a játékhoz"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} eltávolítva"
},
"app.modal.update-to-play.update-required": {
"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érjük, frissíts a legújabb verzióra a játék elindításához"
},
"app.modal.update-to-play.updated-count": {
"message": "{count} frissítve"
},
"app.settings.developer-mode-enabled": {
"message": "Fejlesztői mód bekapcsolva."
},
@@ -83,38 +155,32 @@
"app.settings.tabs.resource-management": {
"message": "Erőforráskezelés"
},
"app.update-toast.body": {
"message": "A Modrinth App v{version} telepítésre kész! Frissítéshez indítsa újra a programot, vagy zárja be a Modrinth App alkalmazást, és a frissítés automatikusan megtörténik."
"app.update-popup.body": {
"message": "A Modrinth App v{version} telepítésre kész! Frissítéshez Töltsd újra az oldalt, vagy a Modrinth App bezárásakor automatikusan frissül."
},
"app.update-toast.body.download-complete": {
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez indítsa újra az alkalmazást, vagy zárja be a Modrinth App alkalmazást, és a frissítés automatikusan megtörténik."
"app.update-popup.body.download-complete": {
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez Töltsd újra az oldalt, vagy a Modrinth App bezárásakor automatikusan frissül."
},
"app.update-toast.body.linux": {
"message": "A Modrinth alkalmazás v{version} elérhető. Használd a csomagkezelődet a legújabb funkciók és hibajavítások telepítéséhez!"
"app.update-popup.body.linux": {
"message": "A Modrinth App v{version} elérhető. Használd a csomagkezelőt a legújabb funkciók és javítások frissítéséhez!"
},
"app.update-toast.body.metered": {
"message": "A Modrinth App v{version} már elérhető! Mivel díjköteles hálózaton vagy, így nem töltöttük le automatikusan."
"app.update-popup.body.metered": {
"message": "A Modrinth App v{version} már elérhető! Mivel mérhető hálózaton vagy, nem töltöttük le automatikusan."
},
"app.update-toast.changelog": {
"message": "Változtatások"
"app.update-popup.changelog": {
"message": "Változásnapló"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Letöltés ({size})"
},
"app.update-toast.download-page": {
"message": "Letöltés"
"app.update-popup.download-complete": {
"message": "Letöltés sikeres"
},
"app.update-toast.downloading": {
"message": "Letöltés..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Újratöltés"
},
"app.update-toast.title": {
"message": "Frissítések elérhetőek"
},
"app.update-toast.title.download-complete": {
"message": "Letöltés befejezve"
"app.update-popup.title": {
"message": "Frissítés elérhető"
},
"app.update.complete-toast.text": {
"message": "Kattints ide a változások megtekintéséhez."
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Világ szerkesztése"
},
"instance.filter.disabled": {
"message": "Letiltott projektek"
},
"instance.filter.updates-available": {
"message": "Frissítések elérhetőek"
},
"instance.server-modal.address": {
"message": "Cím"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Telepítés"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} a Minecraft {game_version} verziójához már telepítve van"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "A vanilla {game_version} már telepítve van"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Verzióváltás"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Telepítés"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Telepítés folyamatban"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Modpack verzióinak lekérése"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Új verzió telepítése"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Jelenleg telepítve"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Debug információ:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Modpack részleteinek lekérése"
},
"instance.settings.tabs.installation.game-version": {
"message": "Játék verziója"
},
"instance.settings.tabs.installation.install": {
"message": "Telepítés"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Telepítés folyamatban"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} verzió"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Nem lehetséges a csatolt modpack részleteit lekérdezni. Kérlek nézd meg az internetkapcsolatod."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} nem elérhető a Minecraft {version} verziójához. Próbálj meg egy másik modbetöltőt."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "A profilod linkelve van egy Modrinth modcsomaghoz, de a modcsomag nem található Modrinth-on."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Modpack újratelepítése"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Modpack újratelepítése"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Az újratelepítés visszaállítja az összes telepített vagy módosított tartalmat a modcsomag által biztosított állapotra, eltávolítva az eredeti telepítéshez hozzáadott modokat vagy tartalmakat. Ez megoldhatja a váratlan hibákat, de fontos tudni hogyha használsz világokat amelyekben utólagosan hozzáadott tartalom van, azok a világok elromolhatnak."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Biztosan szeretnéd újratelepíteni ezt a profilt?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Visszaállítja a profilod tartalmát az eredeti állapotába, eltávolítva az eredeti modpackhez hozzáadott összes modot és tartalmat."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Modpack újratelepítése"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Javítás"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Javítás folyamatban"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "A javítás újratelepíti a Minecraft alapját és ellenőrzi, hogy nincs-e sérülés. Ez megoldhatja a problémákat, ha a játék nem az indítóval kapcsolatos hibák miatt nem indul el, de nem oldja meg a telepített modokkal kapcsolatos problémákat vagy összeomlásokat."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Profil javítása?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Javítás folyamatban"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Visszaállítás az aktuális állapotra"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Összes verzió mutatása"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "verzió váltás"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "telepítés"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "újratelepítés"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "javítás"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Nem lehet {action}-t végrehajtani telepítés közben"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Offline állapotban nem lehet {action}-t végrehajtani"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Nem lehet {action}-t végrehajtani javítás közben"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(ismeretlen verzió)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Profil leválasztása"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Ha folytatod, akkor nem tudod újra összekapcsolni anélkül, hogy egy teljesen új profilt hoznál létre. Többé nem fogja megkapni a modcsomag frissítéseit, és normál állapotba kerül."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Biztosan le szeretnéd választani ezt a profilt?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Ez az profil egy modcsomaghoz van kapcsolva, ami azt jelenti, hogy a modok nem frissíthetőek, és nem lehet megváltoztatni a modbetöltőt vagy a Minecraft verziót. A kapcsolódás megszüntetése véglegesen leválasztja ezt a profilt a modcsomagról."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Modpack-ről való leválasztás"
},
"instance.settings.tabs.java": {
"message": "Java és memória"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "A Szerver nem kompatibilis"
},
"instance.worlds.linked_server": {
"message": "Szerverprojekt által kezelt"
},
"instance.worlds.no_contact": {
"message": "Nem lehet kapcsolatot létesíteni a szerverrel"
},
@@ -567,7 +498,7 @@
"message": "Szerver"
},
"instance.worlds.type.singleplayer": {
"message": "Egyjátékosmód"
"message": "Egyjátékos"
},
"instance.worlds.view_instance": {
"message": "Profil megtekintése"
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Profil szinkronizálása"
},
"search.filter.locked.server": {
"message": "A szerver biztosítja"
},
"search.filter.locked.server-environment.title": {
"message": "Csak kliensoldali modok adhatók hozzá a szerverprofilhoz"
},
"search.filter.locked.server-game-version.title": {
"message": "A játékverziót a szerver biztosítja"
},
"search.filter.locked.server-loader.title": {
"message": "A betöltőt a szerver biztosítja"
}
}
+121 -178
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Tidak dapat terhubung ke server autentikasi"
},
"app.export-modal.description-placeholder": {
"message": "Masukkan deskripsi paket mod..."
},
"app.export-modal.export-button": {
"message": "Ekspor"
},
"app.export-modal.header": {
"message": "Ekspor paket mod"
},
"app.export-modal.modpack-name-label": {
"message": "Nama Paket Mod"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nama paket mod"
},
"app.export-modal.select-files-label": {
"message": "Pilih berkas dan folder yang ingin dimasukkan ke paket"
},
"app.export-modal.version-number-label": {
"message": "Nomor versi"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Semua data dari instans Anda akan dihapus secara permanen, termasuk dunia, konfigurasi, dan konten terpasang Anda."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Tindakan ini tidak dapat dibatalkan"
},
"app.instance.confirm-delete.delete-button": {
"message": "Hapus instans"
},
"app.instance.confirm-delete.header": {
"message": "Hapus instans"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Paket mod ini telah terpasang pada instans \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Gandakan paket mod"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Tetap buat"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Pergi ke instans"
},
"app.instance.modpack-already-installed.header": {
"message": "Paket mod telah terpasang"
},
"app.instance.mods.content-type-project": {
"message": "proyek"
},
"app.instance.mods.copy-link": {
"message": "Salin tautan"
},
"app.instance.mods.installing": {
"message": "Memasang..."
},
"app.instance.mods.modpack-fallback": {
"message": "Paket Mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" telah ditambahkan"
},
"app.instance.mods.projects-were-added": {
"message": "{count} proyek telah ditambahkan"
},
"app.instance.mods.share-text": {
"message": "Lihat proyek-proyek yang saya pakai di paket mod saya!"
},
"app.instance.mods.share-title": {
"message": "Membagi konten paket mod"
},
"app.instance.mods.show-file": {
"message": "Tampilkan berkas"
},
"app.instance.mods.successfully-uploaded": {
"message": "Berhasil diunggah"
},
"app.instance.mods.unknown-version": {
"message": "Tidak diketahui"
},
"app.instance.mods.updating": {
"message": "Memperbarui..."
},
"app.modal.install-to-play.content-required": {
"message": "Konten diperlukan"
},
"app.modal.install-to-play.header": {
"message": "Pasang untuk memainkan"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, other {# mod}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Server ini memerlukan mod untuk dimainkan. Klik pasang untuk menyiapkan berkas-berkas yang diperlukan dari Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Paket mod yang diperlukan"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} membagikan instans ini dengan Anda hari ini."
"app.modal.install-to-play.server-requires-mods": {
"message": "Mod diperlukan untuk bermain di server ini. Klik pasang untuk menyiapkan berkas-berkas yang diperlukan dari Modrinth, kemudian luncurkan langsung sari server."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instans terbagi"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Instans server terbagi"
},
"app.modal.update-to-play.added-count": {
"message": "{count} ditambahkan"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Ditambahkan"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Dihapus"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Diperbarui"
"app.modal.install-to-play.view-contents": {
"message": "Lihat konten"
},
"app.modal.update-to-play.header": {
"message": "Perbarui untuk memainkan"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} dihapus"
},
"app.modal.update-to-play.update-required": {
"message": "Perlu diperbarui"
},
"app.modal.update-to-play.update-required-description": {
"message": "{name} perlu diperbarui sebelum dimainkan. Mohon perbarui ke versi terkini untuk meluncurkan permainan."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} diperbarui"
},
"app.settings.developer-mode-enabled": {
"message": "Mode pengembang dihidupkan."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Manajemen sumber"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} siap dipasang! Muat ulang untuk memperbarui sekarang, atau secara otomatis saat Anda menutup Modrinth App."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} telah selesai mengunduh. Muat ulang untuk memperbarui sekarang, atau secara otomatis saat Anda menutup Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} tersedia. Gunakan pengelola paket Anda untuk memperbarui dan mendapatkan fitur-fitur dan perbaikan terbaru!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} sudah tersedia! Karena Anda saat ini sedang berada dalam jaringan terukur, kami tidak mengunduhnya secara otomatis."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Catatan perubahan"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Unduh ({size})"
},
"app.update-toast.download-page": {
"message": "Unduh"
"app.update-popup.download-complete": {
"message": "Selesai mengunduh"
},
"app.update-toast.downloading": {
"message": "Mengunduh..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Muat ulang"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Pembaruan tersedia"
},
"app.update-toast.title.download-complete": {
"message": "Selesai mengunduh"
},
"app.update.complete-toast.text": {
"message": "Klik di sini untuk melihat catatan perubahan."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Sunting dunia"
},
"instance.filter.disabled": {
"message": "Proyek takaktif"
},
"instance.filter.updates-available": {
"message": "Pembaruan tersedia"
},
"instance.server-modal.address": {
"message": "Alamat"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Pemasangan"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} untuk Minecraft {game_version} sudah terpasang"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "{game_version} murni sudah terpasang"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Ubah versi"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Pasang"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Memasang"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Memperoleh versi paket mod"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Memasang versi baru"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Saat ini terpasang"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informasi awakutu:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Memperoleh perincian paket mod"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versi permainan"
},
"instance.settings.tabs.installation.install": {
"message": "Pasang"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Pemasangan sedang berjalan"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versi {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Tidak dapat memperoleh perincian paket mod terkait. Mohon periksa sambungan internet Anda."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} tidak tersedia untuk Minecraft {version}. Mohon coba peluncur mod yang lain."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Instans ini berkaitan dengan paket mod, tetapi paket mod tersebut tidak dapat ditemukan pada Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Pasang ulang paket mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Memasang ulang paket mod"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Memasang ulang akan mengatur ulang semua konten yang terpasang atau termodifikasi pada apa yang telah disediakan oleh paket mod, menghapus mod atau konten apa pun yang telah Anda tambahkan di atas pemasangan awal. Hal ini dapat memperbaiki perilaku tidak terduga bila ada perubahan pada instans, tetapi bila dunia Anda sekarang bergantung pada konten terpasang tambahan, hal ini dapat merusak dunia yang ada."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Apakah Anda yakin ingin memasang ulang instans ini?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Mengatur ulang konten instans menjadi keadaan awal, menghapus mod atau konten apa pun yang telah Anda tambahkan di atas pemasangan awal."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Pasang ulang paket mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Perbaiki"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Memperbaiki"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Memperbaiki akan memasangkan ulang pustaka dependen dan memeriksa kerusakan. Ini dapat memecahkan masalah bila permainan Anda tidak memulai sebab kesalahan pada peluncur, tetapi tidak akan memecahkan masalah atau kemogokan yang disebabkan oleh mod terpasang."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Perbaiki instans?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Perbaikan sedang berlangsung"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Atur ulang ke saat ini"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Tampilkan semua versi"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "mengubah versi"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "memasang"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "memasang ulang"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "memperbaiki"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Tidak dapat {action} saat memasang"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Tidak dapat {action} saat luring"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Tidak dapat {action} saat memperbaiki"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versi tidak dikenal)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Lepas kaitan instans"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Bila Anda melanjutkan, Anda tidak akan dapat mengaitkannya lagi tanpa membuat instans baru. Anda tidak akan mendapatkan pembaruan paket mod dan menjadi instans normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Apakah Anda yakin ingin melepas kaitan instans ini?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Instans ini berkaitan dengan paket mod, yang berarti mod tidak dapat diperbarui dan Anda tidak dapat mengubah versi peluncur mod atau Minecraft. Melepas kaitan akan memutuskan instans ini dari paket mod secara permanen."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Lepas kaitan dari paket mod"
},
"instance.settings.tabs.java": {
"message": "Java dan memori"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Server tidak cocok"
},
"instance.worlds.linked_server": {
"message": "Dikelola oleh proyek server"
},
"instance.worlds.no_contact": {
"message": "Server tidak dapat dihubungi"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sinkronkan dengan instans"
},
"search.filter.locked.server": {
"message": "Disediakan oleh server"
},
"search.filter.locked.server-environment.title": {
"message": "Anda hanya dapat menambahkan mod sisi klien pada instans server"
},
"search.filter.locked.server-game-version.title": {
"message": "Versi permainan disediakan oleh server"
},
"search.filter.locked.server-loader.title": {
"message": "Pemuat disediakan oleh server"
}
}
+128 -185
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Impossibile raggiungere i server di autenticazione"
},
"app.export-modal.description-placeholder": {
"message": "Inserisci descrizione del pacchetto..."
},
"app.export-modal.export-button": {
"message": "Esporta"
},
"app.export-modal.header": {
"message": "Esporta pacchetto"
},
"app.export-modal.modpack-name-label": {
"message": "Nome del pacchetto"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nome del pacchetto"
},
"app.export-modal.select-files-label": {
"message": "Seleziona i file e le cartelle da includere nel pacchetto"
},
"app.export-modal.version-number-label": {
"message": "Numero di versione"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Tutti i dati della tua istanza verranno eliminati permanentemente, inclusi i tuoi mondi, configurazioni e tutti i contenuti installati."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Questa azione non può essere annullata"
},
"app.instance.confirm-delete.delete-button": {
"message": "Elimina istanza"
},
"app.instance.confirm-delete.header": {
"message": "Elimina istanza"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Questo pacchetto è già stato installato nell'istanza \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Pacchetto duplicato"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea comunque"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Vai all'istanza"
},
"app.instance.modpack-already-installed.header": {
"message": "Pacchetto già installato"
},
"app.instance.mods.content-type-project": {
"message": "progetto"
},
"app.instance.mods.copy-link": {
"message": "Copia link"
},
"app.instance.mods.installing": {
"message": "Installando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pacchetto di mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" è stato aggiunto"
},
"app.instance.mods.projects-were-added": {
"message": "{count} progetti aggiunti"
},
"app.instance.mods.share-text": {
"message": "Guarda le mod che uso nel mio pacchetto!"
},
"app.instance.mods.share-title": {
"message": "Condivisione del pacchetto"
},
"app.instance.mods.show-file": {
"message": "Mostra file"
},
"app.instance.mods.successfully-uploaded": {
"message": "Caricato con successo"
},
"app.instance.mods.unknown-version": {
"message": "Sconosciuta"
},
"app.instance.mods.updating": {
"message": "Aggiornando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenuto richiesto"
},
"app.modal.install-to-play.header": {
"message": "Installa per continuare"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count} mod"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Questo server necessita di alcune mod. Clicca installa per scaricarle direttamente da Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Pacchetto di mod richiesto"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} ha condiviso questa istanza con te oggi."
"app.modal.install-to-play.server-requires-mods": {
"message": "Questo server richiede alcune mod. Clicca Installa per scaricarle direttamente da Modrinth, poi sarai pronto a giocare."
},
"app.modal.install-to-play.shared-instance": {
"message": "Istanza condivisa"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Istanza del server condivisa"
},
"app.modal.update-to-play.added-count": {
"message": "{count, plural, one {# aggiunta} other {# aggiunte}}"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Aggiunta"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Rimossa"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Aggiornata"
"app.modal.install-to-play.view-contents": {
"message": "Mostra contenuti"
},
"app.modal.update-to-play.header": {
"message": "Aggiorna per continuare"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count, plural, one {# rimozione} other {# rimozioni}}"
},
"app.modal.update-to-play.update-required": {
"message": "Aggiornamento richiesto"
},
"app.modal.update-to-play.update-required-description": {
"message": "{name} richiede degli aggiornamenti. Installa l'ultima versione per poter giocare."
},
"app.modal.update-to-play.updated-count": {
"message": "{count, plural, one {# aggiornamento} other {# aggiornamenti}}"
},
"app.settings.developer-mode-enabled": {
"message": "Modalità sviluppatore attiva."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Gestione delle risorse"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} è pronta per essere installata! Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} è disponibile. Usa il tuo gestore di pacchetti per aggiornare e ricevere le novità più recenti!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} è ora disponibile! Poiché sei su una rete a consumo, non l'abbiamo scaricata automaticamente."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Novità"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Scarica ({size})"
},
"app.update-toast.download-page": {
"message": "Scarica"
"app.update-popup.download-complete": {
"message": "Download completato"
},
"app.update-toast.downloading": {
"message": "Scaricando..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Ricarica"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Aggiornamento disponibile"
},
"app.update-toast.title.download-complete": {
"message": "Download completato"
},
"app.update.complete-toast.text": {
"message": "Consulta qui le ultime novità in inglese."
},
@@ -180,7 +246,7 @@
"message": "Online"
},
"friends.heading.pending": {
"message": "In sospeso"
"message": "In attesa"
},
"friends.no-friends-match": {
"message": "Nessuna amicizia corrisponde a ''{query}''"
@@ -195,7 +261,7 @@
"message": "<link>Accedi a un account Modrinth</link> per stringere amicizie e sapere a cosa stanno giocando!"
},
"instance.add-server.add-and-play": {
"message": "Aggiungi e gioca"
"message": "Aggiungi e avvia"
},
"instance.add-server.add-server": {
"message": "Aggiungi server"
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Modifica mondo"
},
"instance.filter.disabled": {
"message": "Progetti disattivati"
},
"instance.filter.updates-available": {
"message": "Aggiornamenti disponibili"
},
"instance.server-modal.address": {
"message": "Indirizzo"
},
@@ -321,7 +381,7 @@
"message": "Inserisci comando post-uscita..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Pre-lancio"
"message": "Pre-avvio"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Eseguito prima dell'avvio dell'istanza."
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installazione"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} per Minecraft {game_version} è già installato"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} è già installata"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Cambia versione"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installa"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Ottenendo versioni del pacchetto di mod"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installando nuova versione"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Installazione corrente"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informazioni per il debug:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Ottenendo dettagli del pacchetto di mod"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versione del gioco"
},
"instance.settings.tabs.installation.install": {
"message": "Installa"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installazione in corso"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versione di {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Impossibile ottenere i dettagli del pacchetto di mod collegato. Si prega di controllare la connessione a Internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} non è disponibile per Minecraft {version}. Prova un altro loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "L'istanza è collegata a un pacchetto di mod, ma non è stato possibile trovarlo su Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Piattaforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalla pacchetto di mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstallando pacchetto di mod"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "La reinstallazione resetterà tutto il contenuto installato o modificato a ciò che è fornito dal pacchetto di mod, rimuovendo ogni mod o contenuto che tu abbia aggiunto all'installazione originale. Questo potrebbe risolvere comportamenti inaspettati se ci sono state modifiche all'istanza, ma se ora i tuoi mondi dipendessero da contenuto aggiuntivo installato, essi verrebbero corrotti."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Vuoi davvero reinstallare questa istanza?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Resetta il contenuto dell'istanza al suo stato originale, rimuovendo ogni mod o contenuto che tu abbia aggiunto al pacchetto di mod originale."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalla pacchetto di mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Ripara"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Riparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "La riparazione reinstalla le dipendenze di Minecraft e verifica eventuali corruzioni. Questo potrebbe risolvere problemi di avvio del gioco se dovuti a errori legati al launcher, ma non risolverà problemi o crash legati alle mod installate."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Riparare l'istanza?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Riparazione in corso"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Resetta ad attuale"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Mostra tutte le versioni"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "cambia versione"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "installa"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalla"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "ripara"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Impossibile {action} durante l'installazione"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Impossibile {action} senza connessione"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Impossibile {action} durante la riparazione"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versione sconosciuta)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Scollega istanza"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Procedendo non potrai più ricollegarla se non creando una nuova istanza da zero. Diventerà una normale installazione, per cui non riceverai più aggiornamenti dal pacchetto di mod."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Vuoi davvero scollegare questa istanza?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Questa istanza è collegata a un pacchetto di mod, cioè le mod non possono essere aggiornate manualmente, e non puoi cambiare loader di mod né versione di Minecraft. Lo scollegamento disconnetterà definitivamente questa istanza dal pacchetto di mod."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Scollega dal pacchetto di mod"
},
"instance.settings.tabs.java": {
"message": "Java e memoria"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Server non è compatibile"
},
"instance.worlds.linked_server": {
"message": "Gestito dal server"
},
"instance.worlds.no_contact": {
"message": "Impossibile contattare il server"
},
@@ -561,7 +492,7 @@
"message": "È possibile avviare direttamente un mondo in giocatore singolo solo su Minecraft 1.20+"
},
"instance.worlds.play_instance": {
"message": "Gioca istanza"
"message": "Avvia istanza"
},
"instance.worlds.type.server": {
"message": "Server"
@@ -576,15 +507,27 @@
"message": "Mondo già in uso"
},
"search.filter.locked.instance": {
"message": "Fornito dall'istanza"
"message": "Determinato dall'istanza"
},
"search.filter.locked.instance-game-version.title": {
"message": "La versione del gioco è fornita dall'istanza"
"message": "La versione del gioco è determinata dall'istanza"
},
"search.filter.locked.instance-loader.title": {
"message": "Il loader è fornito dall'istanza"
"message": "Il loader è determinato dall'istanza"
},
"search.filter.locked.instance.sync": {
"message": "Sincronizza con l'istanza"
},
"search.filter.locked.server": {
"message": "Determinato dal server"
},
"search.filter.locked.server-environment.title": {
"message": "Solo mod lato client possono essere aggiunte all'istanza del server"
},
"search.filter.locked.server-game-version.title": {
"message": "La versione del gioco è determinata dal server"
},
"search.filter.locked.server-loader.title": {
"message": "Il loader è determinato dal server"
}
}
+140 -197
View File
@@ -1,10 +1,100 @@
{
"app.auth-servers.unreachable.body": {
"message": "Minecraft の認証サーバーは現在停止している可能性があります。インターネット接続を確認し、しばらくしてからもう一度お試しください。"
"message": "Minecraftの認証サーバーは現在停止している可能性があります。インターネット接続を確認し、しばらくしてからもう一度お試しください。"
},
"app.auth-servers.unreachable.header": {
"message": "認証サーバーにアクセスできません"
},
"app.export-modal.description-placeholder": {
"message": "Modパックの説明を入力…"
},
"app.export-modal.export-button": {
"message": "書き出し"
},
"app.export-modal.header": {
"message": "Modパックを書き出す"
},
"app.export-modal.modpack-name-label": {
"message": "Modパック名"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modパック名"
},
"app.export-modal.select-files-label": {
"message": "パックに含めるファイルとフォルダーを選択"
},
"app.export-modal.version-number-label": {
"message": "バージョン番号"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "インスタンス内のすべてのデータは、ワールド、設定、インストール済みのコンテンツを含め、完全に削除されます。"
},
"app.instance.confirm-delete.admonition-header": {
"message": "この操作は取り消せません"
},
"app.instance.confirm-delete.delete-button": {
"message": "インスタンスを削除"
},
"app.instance.confirm-delete.header": {
"message": "インスタンスを削除"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "このModパックは「{instanceName}」インスタンスにすでにインストールされています。"
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "重複したModパック"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "とにかく作成する"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "インスタンスに移動"
},
"app.instance.modpack-already-installed.header": {
"message": "Modパックはすでにインストール済み"
},
"app.instance.mods.content-type-project": {
"message": "プロジェクト"
},
"app.instance.mods.copy-link": {
"message": "リンクをコピー"
},
"app.instance.mods.installing": {
"message": "インストール中…"
},
"app.instance.mods.modpack-fallback": {
"message": "Modパック"
},
"app.instance.mods.project-was-added": {
"message": "「{name}」が追加されました"
},
"app.instance.mods.projects-were-added": {
"message": "{count}件のプロジェクトが追加されました"
},
"app.instance.mods.share-text": {
"message": "私のModパックで使われているプロジェクトをチェック!"
},
"app.instance.mods.share-title": {
"message": "Modパックのコンテンツを共有"
},
"app.instance.mods.show-file": {
"message": "ファイルを表示"
},
"app.instance.mods.successfully-uploaded": {
"message": "アップロードに成功しました"
},
"app.instance.mods.unknown-version": {
"message": "不明"
},
"app.instance.mods.updating": {
"message": "アップデート中…"
},
"app.modal.install-to-play.content-required": {
"message": "必須コンテンツ"
},
"app.modal.install-to-play.header": {
"message": "インストールしてプレイ"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, other {#個のMod}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "このサーバーをプレイするにはMODが必要です。インストールをクリックしてModrinthから必要なファイルを設定してください。"
"app.modal.install-to-play.required-modpack": {
"message": "必須のModパック"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} が本日この事例を共有しました。"
"app.modal.install-to-play.server-requires-mods": {
"message": "このサーバーをプレイするにはModが必要です。インストールをクリックしてModrinthから必要なファイルを設定し、サーバーに接続してください。"
},
"app.modal.install-to-play.shared-instance": {
"message": "共有インスタンス"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "共有サーバーインスタンス"
},
"app.modal.update-to-play.added-count": {
"message": "{count}追加"
},
"app.modal.update-to-play.diff-type.added": {
"message": "追加"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "削除済み"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "更新済み"
"app.modal.install-to-play.view-contents": {
"message": "コンテンツを見る"
},
"app.modal.update-to-play.header": {
"message": "更新してプレイ"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count}件削除されました"
},
"app.modal.update-to-play.update-required": {
"message": "更新が必要です"
},
"app.modal.update-to-play.update-required-description": {
"message": "{name}をプレイするには更新が必要です。ゲームを起動するには最新版に更新してください。"
},
"app.modal.update-to-play.updated-count": {
"message": "{count} 更新されました"
},
"app.settings.developer-mode-enabled": {
"message": "開発者モードがオンになっています。"
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "リソース管理"
},
"app.update-toast.body": {
"message": "Modrinth App v{version}のインストール準備ができました。再起動して今すぐ更新するか、アプリを閉じ際に自動更新されます。"
"app.update-popup.body": {
"message": "Modrinth App v{version} のインストール準備が整いました今すぐ更新するには再読み込みするか、Modrinth Appを閉じ際に自動更新されます。"
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version}のダウンロードが完了しました。再起動して今すぐ更新するか、アプリを閉じ際に自動更新されます。"
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} のダウンロードが完了しました。今すぐ更新するには再読み込みするか、Modrinth Appを閉じ際に自動更新されます。"
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} が利用可能です。最新の機能と修正プログラムを入手するには、パッケージマネージャーを使用して更新してください!"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version}は今すぐダウンロードできます。従量課金制ネットワークを使用しているため自動ダウンロードはされていません。"
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} が利用可能になりました!お使いのネットワークが従量制のため自動ダウンロードは行っておりません。"
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "更新履歴"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "ダウンロード ({size})"
},
"app.update-toast.download-page": {
"message": "ダウンロード"
},
"app.update-toast.downloading": {
"message": "ダウンロード中..."
},
"app.update-toast.reload": {
"message": "再起動"
},
"app.update-toast.title": {
"message": "アップデートが利用可能です"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "ダウンロード完了"
},
"app.update-popup.reload": {
"message": "再読み込み"
},
"app.update-popup.title": {
"message": "アップデートが利用可能です"
},
"app.update.complete-toast.text": {
"message": "クリックすると更新履歴を表示できます。"
},
@@ -183,7 +249,7 @@
"message": "保留中"
},
"friends.no-friends-match": {
"message": "フレンド\"{query}\"は見つかりませんでした"
"message": "フレンド{query}は見つかりませんでした"
},
"friends.search-friends-placeholder": {
"message": "フレンドを検索…"
@@ -222,7 +288,7 @@
"message": "名前"
},
"instance.edit-world.placeholder-name": {
"message": "Mincraft ワールド"
"message": "Mincraftワールド"
},
"instance.edit-world.reset-icon": {
"message": "アイコンをリセット"
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "ワールドを編集"
},
"instance.filter.disabled": {
"message": "無効なプロジェクト"
},
"instance.filter.updates-available": {
"message": "アップデートが可能"
},
"instance.server-modal.address": {
"message": "アドレス"
},
@@ -258,7 +318,7 @@
"message": "インスタンスを削除"
},
"instance.settings.tabs.general.delete.description": {
"message": "デバイスからインスタンスを削除します。これらには、ワールド、設定、他、全てのインストール済みのファイルが含まれます。インスタンスを削除すると復元することはできません。"
"message": "デバイスからインスタンスを削除します。これらには、ワールド、設定などのすべてのインストール済みのファイルが含まれます。インスタンスを削除すると復元することはできません。"
},
"instance.settings.tabs.general.deleting.button": {
"message": "削除中…"
@@ -318,7 +378,7 @@
"message": "ゲームが閉じられた後に実行されます。"
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "終了後のコマンドを入力"
"message": "終了後のコマンドを入力"
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "起動前"
@@ -327,7 +387,7 @@
"message": "ゲームが起動する前に実行されます。"
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "起動前のコマンドを入力"
"message": "起動前のコマンドを入力"
},
"instance.settings.tabs.hooks.title": {
"message": "ゲーム起動フック"
@@ -336,7 +396,7 @@
"message": "ラッパー"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Minecraftを起動のラッパーコマンド。"
"message": "Minecraftを起動するためのラッパーコマンド。"
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "ラッパーのコマンドを入力…"
@@ -344,140 +404,8 @@
"instance.settings.tabs.installation": {
"message": "インストール"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Minecraft {game_version} の {platform} {version} はすでにインストールされています"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} はすでにインストールされています"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "バージョンを変更"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "インストール"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "インストール中"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "ModPackのバージョンを取得しています"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "新しいバージョンをインストール中"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "インストール済"
},
"instance.settings.tabs.installation.debug-information": {
"message": "デバッグ情報:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "ModPackの情報を取得しています"
},
"instance.settings.tabs.installation.game-version": {
"message": "ゲームバージョン"
},
"instance.settings.tabs.installation.install": {
"message": "インストール"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "インストール中"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} バージョン"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "リンクされたModpackの情報が取得できませんでした。インターネット接続を確認してください。"
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader}はMinecraft {version}で使用できません。別のローダーを選択してください。"
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "このインスタンスはModpackにリンクされていますが、ModrinthではModpackが見つかりません。"
},
"instance.settings.tabs.installation.platform": {
"message": "プラットフォーム"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Modpackを再インストール"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Modpackを再インストール中"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "再インストールすると、全てのコンテンツがModpackで提供される内容にリセットされ、元のコンテンツに追加されたMod等やコンテンツは全て削除されます。インスタンスに変更を加えていた場合、予期せぬ動作が修正がされる場合がありますが、ワールドが追加でインストールされたコンテンツに依存している場合、既存のワールドで動かなくなる可能性があります。"
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "本当にインスタンスを再インストールしますか?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "インスタンスの状態をもとの状態にリセットし、元のModpackに追加されたModやコンテンツ等を削除します。"
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Modpackを再インストール"
},
"instance.settings.tabs.installation.repair.button": {
"message": "修復"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "修復中"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "修復を行うと、Minecraftの依存関係が再インストールされ、破損がないかのチェックが行われます。ランチャー関連の問題の場合は、修復によって解決する可能性がありますが、インストール済みのModに関する問題は解決されません。"
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "インスタンスを修復しますか?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "修復中"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "現在の状態にリセット"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "全てのバージョンを表示"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "バージョンを変更"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "インストール"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "再インストール"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "修復"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "インストール中に{action}することはできません"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "オフラインの時に{action}することはできません"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "修復中に{action}することはできません"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(不明なバージョン)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "インスタンスのリンク解除"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "この操作を行うと、新しいインスタンスを作らなければ再びリンクすることはできなくなります。通常のインスタンスになるので、modpackのバージョンアップは利用できなくなります。"
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "本当にインスタンスのリンクを解除しますか?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "このインスタンスはmodpackにリンクされているので、modやmodローダー、Minecraftのバージョンを変更することはできません。リンクを解除するとこのインスタンスとmodpackは永久に分離されます。"
},
"instance.settings.tabs.installation.unlink.title": {
"message": "modpackとのリンクを解除する"
"message": "{loader}バージョン"
},
"instance.settings.tabs.java": {
"message": "Javaとメモリ"
@@ -489,13 +417,13 @@
"message": "フック"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Java コマンドライン引数"
"message": "Javaコマンドライン引数"
},
"instance.settings.tabs.java.java-installation": {
"message": "Javaのインストール"
},
"instance.settings.tabs.java.java-memory": {
"message": "メモリ割り当て"
"message": "メモリ割り当て"
},
"instance.settings.tabs.window": {
"message": "ウィンドウ"
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "サーバーに互換性がありません"
},
"instance.worlds.linked_server": {
"message": "サーバープロジェクトによる管理"
},
"instance.worlds.no_contact": {
"message": "サーバーに接続できませんでした"
},
@@ -576,15 +507,27 @@
"message": "ワールドは使用中"
},
"search.filter.locked.instance": {
"message": "インスタンスより提供"
"message": "インスタンスによる条件"
},
"search.filter.locked.instance-game-version.title": {
"message": "ゲームバージョンはインスタンスより提供"
"message": "ゲームバージョンはインスタンスによる条件です"
},
"search.filter.locked.instance-loader.title": {
"message": "ローダーはインスタンスにより提供"
"message": "ローダーはインスタンスによる条件です"
},
"search.filter.locked.instance.sync": {
"message": "インスタンスと同期"
},
"search.filter.locked.server": {
"message": "サーバーによる条件"
},
"search.filter.locked.server-environment.title": {
"message": "サーバーインスタンスにはクライアント側Modのみ追加可能"
},
"search.filter.locked.server-game-version.title": {
"message": "ゲームバージョンはサーバーによる条件です"
},
"search.filter.locked.server-loader.title": {
"message": "ローダーはサーバーによる条件です"
}
}
+37 -178
View File
@@ -5,6 +5,12 @@
"app.auth-servers.unreachable.header": {
"message": "인증 서버에 연결할 수 없습니다"
},
"app.instance.mods.updating": {
"message": "업데이트 중..."
},
"app.modal.install-to-play.content-required": {
"message": "콘텐츠 설치 필요"
},
"app.modal.install-to-play.header": {
"message": "설치하고 플레이"
},
@@ -14,11 +20,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {모드 #개} other {모드 #개}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "이 서버에서 플레이하려면 모드가 필요합니다. 설치를 눌러 Modrinth에서 필요한 파일을 설정하세요."
"app.modal.install-to-play.required-modpack": {
"message": "필요한 모드팩"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name}이(가) 오늘 이 인스턴스를 공유했습니다."
"app.modal.install-to-play.server-requires-mods": {
"message": "이 서버를 플레이하려면 모드가 필요합니다. '설치'를 클릭하여 Modrinth에서 필수 파일을 내려받은 후, 서버에 바로 접속하세요."
},
"app.modal.install-to-play.shared-instance": {
"message": "인스턴스 공유됨"
@@ -26,36 +32,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "서버 인스턴스 공유됨"
},
"app.modal.update-to-play.added-count": {
"message": "{count} 추가됨"
},
"app.modal.update-to-play.diff-type.added": {
"message": "추가됨"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "삭제됨"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "업데이트됨"
"app.modal.install-to-play.view-contents": {
"message": "구성 요소 보기"
},
"app.modal.update-to-play.header": {
"message": "업데이트하고 플레이"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} 삭제됨"
},
"app.modal.update-to-play.update-required": {
"message": "업데이트 필요"
},
"app.modal.update-to-play.update-required-description": {
"message": "{name}을(를) 플레이하려면 업데이트가 필요합니다. 게임을 실행하려면 최신 버전으로 업데이트해 주세요."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} 업데이트됨"
},
"app.settings.developer-mode-enabled": {
"message": "개발자 모드가 활성화되었습니다."
},
@@ -83,39 +71,33 @@
"app.settings.tabs.resource-management": {
"message": "리소스 관리"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version}을 설치할 준비가 완료되었습니다! 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} 버전을 사용할 수 있습니다. 최신 기능과 오류 수정을 적용하려면 패키지 관리자를 통해 업데이트하세요!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version}을 지금 사용할 수 있습니다! 데이터 통신 연결을 사용 중이므로, 자동으로 다운로드하지 않았습니다."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "변경 내역"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "({size}) 다운로드"
},
"app.update-toast.download-page": {
"message": "다운로드"
"app.update-popup.download-complete": {
"message": "다운로드 완료"
},
"app.update-toast.downloading": {
"message": "다운로드 중..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "새로고침"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "업데이트 가능"
},
"app.update-toast.title.download-complete": {
"message": "다운로드 완료"
},
"app.update.complete-toast.text": {
"message": "변경 내역을 보려면 클릭하세요."
},
@@ -230,12 +212,6 @@
"instance.edit-world.title": {
"message": "세계 편집"
},
"instance.filter.disabled": {
"message": "비활성화된 프로젝트"
},
"instance.filter.updates-available": {
"message": "업데이트 가능"
},
"instance.server-modal.address": {
"message": "주소"
},
@@ -344,141 +320,9 @@
"instance.settings.tabs.installation": {
"message": "설치"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Minecraft {game_version} {platform} {version} 설치됨"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "바닐라 {game_version} 설치됨"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "버전 변경"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "설치"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "설치 중"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "모드팩 버전을 가져오는 중"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "새 버전을 설치하는 중"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "현재 설치됨"
},
"instance.settings.tabs.installation.debug-information": {
"message": "디버그 정보:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "모드팩 세부 정보를 가져오는 중"
},
"instance.settings.tabs.installation.game-version": {
"message": "게임 버전"
},
"instance.settings.tabs.installation.install": {
"message": "설치"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "설치 진행 중"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} 버전"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "연결된 모드팩의 세부 정보를 가져올 수 없습니다. 인터넷 연결 상태를 확인하세요."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader}(은)는 Minecraft {version}에서 사용할 수 없습니다. 다른 모드 로더를 사용하세요."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "이 인스턴스는 모드팩과 연결되어 있지만, Modrinth에서 모드팩을 찾을 수 없습니다."
},
"instance.settings.tabs.installation.platform": {
"message": "플랫폼"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "모드팩 재설치"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "모드팩 재설치 중"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "재설치하면 설치 또는 수정된 모든 콘텐츠가 모드팩에서 제공하는 콘텐츠로 초기화되며, 기존 팩에 추가한 모드나 콘텐츠는 모두 제거됩니다. 인스턴스에 변경 사항이 있는 경우 예상치 못한 동작은 해결할 수 있지만, 현재 세계가 추가로 설치된 콘텐츠에 의존하고 있다면 기존 세계가 손상될 수 있습니다."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "정말로 이 인스턴스를 다시 설치하시겠습니까?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "인스턴스를 초기 상태로 복원하고, 원본 모드팩에 추가된 모드나 콘텐츠를 모두 제거합니다."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "모드팩 재설치"
},
"instance.settings.tabs.installation.repair.button": {
"message": "복구"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "복구 중"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "복구 시 Minecraft 의존성을 재설치하고 무결성을 검사합니다. 런처 오류로 인해 게임이 실행되지 않을 경우 문제 해결에 도움이 될 수 있지만, 설치된 모드로 인한 오류나 충돌은 해결되지 않습니다."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "인스턴스를 복구하시겠습니까?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "복구 진행 중"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "현재 상태로 되돌리기"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "모든 버전 보이기"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "버전 변경"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "설치"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "재설치"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "복구"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "설치 중에는 {action} 할 수 없음"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "오프라인 상태에서는 {action} 할 수 없음"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "복구 중에는 {action} 할 수 없음"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(알 수 없는 버전)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "인스턴스 연결 해제"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "계속 진행하면 새 인스턴스를 만들지 않는 한 다시 연결할 수 없습니다. 또한 모드팩 업데이트를 더 이상 받을 수 없으며, 일반 인스턴스로 전환됩니다."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "정말로 이 인스턴스의 연결을 해제하시겠습니까?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "이 인스턴스는 모드팩에 연결되어 있으므로, 모드를 개별적으로 업데이트하거나 모드 로더 및 Minecraft 버전을 변경할 수 없습니다. 연결을 해제하면 이 인스턴스는 모드팩과 영구적으로 분리됩니다."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "모드팩에서 연결 해제"
},
"instance.settings.tabs.java": {
"message": "Java 및 메모리"
},
@@ -551,6 +395,9 @@
"instance.worlds.incompatible_server": {
"message": "호환되지 않는 서버"
},
"instance.worlds.linked_server": {
"message": "서버 설정에 의해 관리됨"
},
"instance.worlds.no_contact": {
"message": "서버가 응답하지 않음"
},
@@ -586,5 +433,17 @@
},
"search.filter.locked.instance.sync": {
"message": "인스턴스와 동기화"
},
"search.filter.locked.server": {
"message": "서버에 의해 관리됨"
},
"search.filter.locked.server-environment.title": {
"message": "서버 인스턴스에는 클라이언트 전용 모드만 추가할 수 있습니다"
},
"search.filter.locked.server-game-version.title": {
"message": "게임 버전이 서버에 의해 제공됩니다"
},
"search.filter.locked.server-loader.title": {
"message": "로더가 서버에 의해 제공됩니다"
}
}
+117 -180
View File
@@ -1,10 +1,94 @@
{
"app.auth-servers.unreachable.body": {
"message": "Pelayan pengesahan Minecraft mungkin sedang tergendala sekarang. Periksa sambungan internet anda dan cuba lagi nanti."
"message": "Pelayan pengesahan Minecraft mungkin sedang tergendala sekarang. Periksa sambungan internet anda dan cuba lagi kemudian."
},
"app.auth-servers.unreachable.header": {
"message": "Tidak dapat mencapai pelayan pengesahan"
},
"app.export-modal.description-placeholder": {
"message": "Masukkan keterangan pek mod..."
},
"app.export-modal.export-button": {
"message": "Eksport"
},
"app.export-modal.header": {
"message": "Eksport pek mod"
},
"app.export-modal.modpack-name-label": {
"message": "Nama Pek Mod"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nama pek mod"
},
"app.export-modal.select-files-label": {
"message": "Pilih fail dan folder untuk disertakan dalam pek mod"
},
"app.export-modal.version-number-label": {
"message": "Nombor versi"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Semua data untuk pemasangan anda akan dipadamkan secara kekal, termasuk dunia, konfigurasi dan semua kandungan yang dipasang."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Tindakan ini tidak boleh dibatalkan"
},
"app.instance.confirm-delete.delete-button": {
"message": "Padam pemasangan"
},
"app.instance.confirm-delete.header": {
"message": "Padam pemasangan"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Pek mod ini sudah pun dipasang di dalam pemasangan \"{instanceName}\"."
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Pergi ke pemasangan"
},
"app.instance.modpack-already-installed.header": {
"message": "Pek mod sudah dipasang"
},
"app.instance.mods.content-type-project": {
"message": "projek"
},
"app.instance.mods.copy-link": {
"message": "Salin pautan"
},
"app.instance.mods.installing": {
"message": "Sedang memasang..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pek Mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" telah ditambahkan"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projek telah ditambahkan"
},
"app.instance.mods.share-text": {
"message": "Lihat projek-projek yang saya gunakan dalam pek mod saya!"
},
"app.instance.mods.share-title": {
"message": "Berkongsi kandungan pek mod"
},
"app.instance.mods.show-file": {
"message": "Tunjukkan fail"
},
"app.instance.mods.successfully-uploaded": {
"message": "Berjaya dimuat naik"
},
"app.instance.mods.unknown-version": {
"message": "Tidak Diketahui"
},
"app.instance.mods.updating": {
"message": "Sedang mengemas kini..."
},
"app.modal.install-to-play.content-required": {
"message": "Kandungan yang diperlukan"
},
"app.modal.install-to-play.header": {
"message": "Pasang untuk mainkan"
},
@@ -14,11 +98,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, other {# mod}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Pelayan ini memerlukan mod untuk dimainkan. Klik pasang untuk menyediakan fail yang diperlukan daripada Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Pek mod yang diperlukan"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} berkongsi pemasangan ini dengan anda hari ini."
"app.modal.install-to-play.server-requires-mods": {
"message": "Pelayan ini memerlukan mod untuk dimainkan. Klik Pasang untuk menyediakan fail yang diperlukan daripada Modrinth, kemudian lancarkan permainan terus ke dalam pelayan."
},
"app.modal.install-to-play.shared-instance": {
"message": "Pemasangan yang dikongsi"
@@ -26,36 +110,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Pemasangan pelayan yang dikongsi"
},
"app.modal.update-to-play.added-count": {
"message": "{count} ditambah"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Ditambah"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Dialih keluar"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Dikemas kini"
"app.modal.install-to-play.view-contents": {
"message": "Lihat kandungan"
},
"app.modal.update-to-play.header": {
"message": "Kemas kini untuk mainkan"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} dialih keluar"
},
"app.modal.update-to-play.update-required": {
"message": "Kemas kini diperlukan"
},
"app.modal.update-to-play.update-required-description": {
"message": "Kemas kini diperlukan untuk memainkan {name}. Sila kemas kini kepada versi terkini untuk melancarkan permainan."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} dikemas kini"
},
"app.settings.developer-mode-enabled": {
"message": "Mod pembangun didayakan."
},
@@ -83,39 +149,33 @@
"app.settings.tabs.resource-management": {
"message": "Pengurusan sumber"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} sudah bersedia untuk dipasang! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} sudah selesai dipasang! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} sudah selesai dimuat turun! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} tersedia. Gunakan pengurus pakej anda untuk mengemas kini dan mendapatkan ciri-ciri dan pembetulan terkini!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} kini tersedia! Memandangkan anda sedang menggunakan rangkaian bermeter, kami tidak memuat turunnya secara automatik."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Log perubahan"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Muat turun ({size})"
},
"app.update-toast.download-page": {
"message": "Muat turun"
"app.update-popup.download-complete": {
"message": "Muat turun selesai"
},
"app.update-toast.downloading": {
"message": "Sedang memuat turun..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Muat semula"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Kemas kini tersedia"
},
"app.update-toast.title.download-complete": {
"message": "Muat turun selesai"
},
"app.update.complete-toast.text": {
"message": "Klik di sini untuk melihat log perubahan."
},
@@ -230,12 +290,6 @@
"instance.edit-world.title": {
"message": "Sunting dunia"
},
"instance.filter.disabled": {
"message": "Projek yang dinyahdayakan"
},
"instance.filter.updates-available": {
"message": "Kemas kini tersedia"
},
"instance.server-modal.address": {
"message": "Alamat"
},
@@ -344,141 +398,9 @@
"instance.settings.tabs.installation": {
"message": "Pemasangan"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} untuk Minecraft {game_version} sudah pun dipasang"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "{game_version} vanila sudah pun dipasang"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Tukar versi"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Pasang"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Sedang memasang"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Sedang mengambil versi pek mod"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Sedang memasang versi baharu"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Dipasang pada masa ini"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Maklumat nyahpepijat:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Sedang mengambil maklumat pek mod"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versi permainan"
},
"instance.settings.tabs.installation.install": {
"message": "Pasang"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Pemasangan sedang dijalankan"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versi {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Tidak dapat mengambil butiran pek mod yang terpaut. Sila semak sambungan internet anda."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} tidak tersedia untuk Minecraft {version}. Cuba pemuat mod yang lain."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Pemasangan ini dipautkan kepada sebuah pek mod, tetapi pek mod tersebut tidak dapat dijumpai pada Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Pasang semula pek mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Sedang memasang semula pek mod"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Pemasangan semula akan menetapkan semula semua kandungan yang dipasang atau diubah suai kepada apa yang disediakan oleh pek mod, mengalih keluar sebarang mod atau kandungan yang telah anda tambahkan di atas pemasangan asal. Ini mungkin dapat membetulkan tingkah laku yang tidak dijangka jika perubahan telah dibuat pada pemasangan, tetapi jika dunia anda kini bergantung pada kandungan tambahan yang dipasang, ia mungkin akan merosakkan dunia sedia ada."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Adakah anda pasti mahu memasang semula pemasangan ini?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Menetapkan semula kandungan pemasangan kepada keadaan asalnya, mengalih keluar sebarang mod atau kandungan yang telah anda tambahkan di atas pek mod asal."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Pasang semula pek mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Perbaiki"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Sedang memperbaiki"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Pembaikan ini akan memasang semula kebergantungan Minecraft dan memeriksa kerosakan. Ini mungkin dapat menyelesaikan isu jika permainan anda tidak dilancarkan kerana ralat berkaitan pelancar, tetapi tidak akan menyelesaikan isu atau ranap yang berkaitan dengan mod yang dipasang."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Perbaiki pemasangan?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Pembaikan sedang dijalankan"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Tetap semula kepada semasa"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Tunjukkan semua versi"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "mengubah versi"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "memasang"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "memasang semula"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "memperbaiki"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Tidak boleh {action} semasa memasang"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Tidak boleh {action} semasa berada di luar talian"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Tidak boleh {action} semasa memperbaiki"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versi tidak diketahui)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Nyahpautkan pemasangan"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Jika anda meneruskan, anda tidak akan dapat memautkannya semula tanpa membuat pemasangan yang baharu sepenuhnya. Anda tidak akan menerima kemas kini pek mod lagi dan ia akan menjadi pemasangan biasa."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Adakah anda pasti mahu menyahpautkan pemasangan ini?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Pemasangan ini dipautkan kepada pek mod, yang bermaksud mod tidak boleh dikemas kini dan anda tidak boleh menukar pemuat mod atau versi Minecraft. Menyahpaut pemasangan ini akan memutuskan sambungan pemasangan ini secara kekal daripada pek mod."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Nyahpaut daripada pek mod"
},
"instance.settings.tabs.java": {
"message": "Java dan ingatan"
},
@@ -551,6 +473,9 @@
"instance.worlds.incompatible_server": {
"message": "Pelayan tidak serasi"
},
"instance.worlds.linked_server": {
"message": "Diurus oleh projek pelayan"
},
"instance.worlds.no_contact": {
"message": "Pelayan tidak dapat dihubungi"
},
@@ -586,5 +511,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Selaraskan dengan pemasangan"
},
"search.filter.locked.server": {
"message": "Disediakan oleh pelayan"
},
"search.filter.locked.server-environment.title": {
"message": "Hanya mod bahagian pelanggan sahaja yang boleh ditambah pada pemasangan pelayan"
},
"search.filter.locked.server-game-version.title": {
"message": "Versi permainan adalah disediakan oleh pelayan"
},
"search.filter.locked.server-loader.title": {
"message": "Pemuat adalah disediakan oleh pelayan"
}
}
+152 -152
View File
@@ -1,10 +1,133 @@
{
"app.auth-servers.unreachable.body": {
"message": "Minecraft verificatie servers zijn mogelijk offline. Check je internetverbinding en probeer opnieuw later."
"message": "Minecraft authenticatie servers zijn mogelijk offline. Controleer je internetverbinding en probeer opnieuw later."
},
"app.auth-servers.unreachable.header": {
"message": "Authenticatieservers kunnen niet worden bereikt"
},
"app.export-modal.description-placeholder": {
"message": "Voeg modpack beschrijving in..."
},
"app.export-modal.export-button": {
"message": "Exporteer"
},
"app.export-modal.header": {
"message": "Exporteer modpack"
},
"app.export-modal.modpack-name-label": {
"message": "Modpack Naam"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpack naam"
},
"app.export-modal.select-files-label": {
"message": "Selecteer bestanden en mappen om toe te voegen aan pack"
},
"app.export-modal.version-number-label": {
"message": "Versie nummer"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Alle data van je instantie zal permanent verwijderd worden, inclusief al je werelden, voorkeuren, en alle geïnstalleerde content."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Deze actie kan niet ongedaan gemaakt worden"
},
"app.instance.confirm-delete.delete-button": {
"message": "Verwijder instantie"
},
"app.instance.confirm-delete.header": {
"message": "Verwijder instantie"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Deze modpack is al geïnstalleerd in de \"{instanceName}\" instantie."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Dupliceer modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Maak toch"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ga naar instantie"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack is al geïnstalleerd"
},
"app.instance.mods.content-type-project": {
"message": "project"
},
"app.instance.mods.copy-link": {
"message": "Kopieer link"
},
"app.instance.mods.installing": {
"message": "Aan het installeren..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" was toegevoegd"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projecten waren toegevoegd"
},
"app.instance.mods.share-text": {
"message": "Bekijk de projecten die ik in mijn modpack gebruik!"
},
"app.instance.mods.share-title": {
"message": "Modpack-inhoud delen"
},
"app.instance.mods.show-file": {
"message": "Bestand weergeven"
},
"app.instance.mods.successfully-uploaded": {
"message": "Succesvol geüpload"
},
"app.instance.mods.unknown-version": {
"message": "Onbekend"
},
"app.instance.mods.updating": {
"message": "Aan het updaten..."
},
"app.modal.install-to-play.content-required": {
"message": "Content vereist"
},
"app.modal.install-to-play.header": {
"message": "Installeer om te spelen"
},
"app.modal.install-to-play.install-button": {
"message": "Installeer"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural,one {# mod}other {# mods}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Vereist modpack"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Deze server vereist mods om te spelen. Klik op Installeer om de vereiste bestanden van Modrinth in te stellen, en start direct in de server."
},
"app.modal.install-to-play.shared-instance": {
"message": "Gedeelde instantie"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Gedeelde server instantie"
},
"app.modal.install-to-play.view-contents": {
"message": "Toon content"
},
"app.modal.update-to-play.header": {
"message": "Update om te spelen"
},
"app.modal.update-to-play.update-required": {
"message": "Update vereist"
},
"app.modal.update-to-play.update-required-description": {
"message": "Een update is vereist om {name} te spelen. Update naar de laatste versie om het spel te starten."
},
"app.settings.developer-mode-enabled": {
"message": "Ontwikkelaarsmodus ingeschakeld."
},
@@ -32,33 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Bronnenbeheer"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} is klaar om geïnstalleerd te worden! Herlaad om nu te updaten, of automatisch wanneer je de Modrinth App afsluit."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} is klaar met downloaden. Herlaad om nu te updaten, of automatisch wanneer je de Modrinth App afsluit."
},
"app.update-toast.body.metered": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} is beschikbaar. Gebruik je pakketbeheerder om te updaten voor de laatste functies en oplossingen!"
},
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} is nu beschikbaar! Omdat je nu op een netwerk met datalimiet zit, is de download niet automatisch gestart."
},
"app.update-toast.changelog": {
"message": "Wijzigingenlogboek"
"app.update-popup.changelog": {
"message": "Wijzigingen"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Download ({size})"
},
"app.update-toast.downloading": {
"message": "Aan het downloaden..."
"app.update-popup.download-complete": {
"message": "Downloaden voltooid"
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Herlaad"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Update beschikbaar"
},
"app.update-toast.title.download-complete": {
"message": "Downloaden voltooid"
},
"app.update.complete-toast.text": {
"message": "Klik hier om het wijzigingenlogboek te bekijken."
},
@@ -173,12 +296,6 @@
"instance.edit-world.title": {
"message": "Wereld bewerken"
},
"instance.filter.disabled": {
"message": "Uitgeschakelde projecten"
},
"instance.filter.updates-available": {
"message": "Updates beschikbaar"
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -287,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Installatie"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} voor Minecraft {game_version} is al geïnstalleerd"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} is al geïnstalleerd"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Verander versie"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installeer"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Aan het installeren"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Modpack versies ophalen"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Nieuwe versie aan het installeren"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Huidig geïnstalleerd"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Fout opsporingsinformatie:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Modpack details ophalen"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spel versie"
},
"instance.settings.tabs.installation.install": {
"message": "Installeer"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Bezig met installeren"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versie {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft versie {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kan de gekoppelde modpack details niet ophalen. Controleer je internetverbinding."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} is niet beschikbaar voor Minecraft {version}. Probeer een andere mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Deze instantie is gekoppeld aan een modpack, maar de modpack kon niet worden gevonden op Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Herinstalleer modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Modpack aan het herinstalleren"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Het opnieuw installeren zal alle geïnstalleerde of gewijzigde inhoud resetten naar de inhoud die door de modpack wordt geleverd, en alle mods of inhoud die je bovenop de oorspronkelijke installatie hebt toegevoegd, verwijderen. Dit kan onverwacht gedrag oplossen als er wijzigingen zijn aangebracht in de instantie, maar als je werelden nu afhankelijk zijn van extra geïnstalleerde inhoud, kan dit bestaande werelden beschadigen."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Ben je zeker dat je deze instantie wilt herinstalleren?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Herstelt de inhoud van het exemplaar naar zijn oorspronkelijke staat. Mods en inhoud die bovenop het oorspronkelijke modpack zijn toegevoegd worden verwijderd."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Modpack opnieuw installeren"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Repareer"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Repareren"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Repareren installeert Minecraft-dependencies opnieuw en controleert op corruptie. Dit kan problemen oplossen als uw spel niet start vanwege problemen met de launcher, maar niet problemen of crashes oplossen die te maken hebben met geïnstalleerde mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Exemplaar repareren?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparatie in behandeling"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Herstel naar huidige"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Toon alle versies"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "verander versie"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "installeer"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "herinstalleer"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "repareer"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Kan niet {action} tijdens installatie"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Kan niet {action} terwijl u offline bent"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Kan niet {action} tijdens reparatie"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(Onherkende versie)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Ontkoppel exemplaar"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Als u doorgaat, kunt u het niet opnieuw koppelen zonder een compleet nieuwe exemplaar aan te maken. U ontvangt geen modpack updates meer en het wordt een normaal exemplaar."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Weet u zeker dat u dit exemplaar wilt ontkoppelen?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Dit exemplaar is gekoppeld aan een modpack, wat betekent dat mods niet bijgewerkt kunnen worden en de mod loader of Minecraft versie kan niet gewijzigd worden."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Ontkoppel van modpack"
},
"instance.settings.tabs.java": {
"message": "Java en geheugen"
},
@@ -494,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Server is niet compatibel"
},
"instance.worlds.linked_server": {
"message": "Beheerd door serverproject"
},
"instance.worlds.no_contact": {
"message": "Server kon niet worden bereikt"
},
@@ -529,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Synchroniseer installatie"
},
"search.filter.locked.server": {
"message": "Aangeleverd door de server"
},
"search.filter.locked.server-environment.title": {
"message": "Alleen client-side mods kunnen toegevoegd worden aan de server instantie"
},
"search.filter.locked.server-game-version.title": {
"message": "Spel versie is gegeven door de server"
},
"search.filter.locked.server-loader.title": {
"message": "Loader is gegeven door de server"
}
}
+24 -165
View File
@@ -5,6 +5,30 @@
"app.auth-servers.unreachable.header": {
"message": "Kan ikke nå autentiseringsservere"
},
"app.modal.install-to-play.header": {
"message": "Installer for å spille"
},
"app.modal.install-to-play.install-button": {
"message": "Installer"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {#mod} other {# mods}}"
},
"app.modal.install-to-play.shared-instance": {
"message": "Delt instans"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Delt serverinstans"
},
"app.modal.update-to-play.header": {
"message": "Oppdater for å spille"
},
"app.modal.update-to-play.update-required": {
"message": "Krever oppdatering"
},
"app.modal.update-to-play.update-required-description": {
"message": "Ei oppdatering er påkrevd for å spille {name}. Vær så snill å oppdater til den siste versjonen av spillet for å spille det."
},
"app.settings.developer-mode-enabled": {
"message": "Utviklermodus aktivert."
},
@@ -32,33 +56,6 @@
"app.settings.tabs.resource-management": {
"message": "Ressursforvaltning"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} er klar for installering! Last inn på nytt for å oppdatere nå, eller automatisk når du lukker Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} er ferdig lastet ned. Last in på nytt for å oppdatere nå, eller automatisk når du lukker Modrinth App."
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} er tilgjengelig nå! Siden du er på en forbruksmålt tilkobling, lastet vi den ikke ned automatisk."
},
"app.update-toast.changelog": {
"message": "Endringslogg"
},
"app.update-toast.download": {
"message": "Last ned ({size})"
},
"app.update-toast.downloading": {
"message": "Laster ned..."
},
"app.update-toast.reload": {
"message": "Last inn på nytt"
},
"app.update-toast.title": {
"message": "Oppdatering tilgjengelig"
},
"app.update-toast.title.download-complete": {
"message": "Ferdig lastet ned"
},
"app.update.complete-toast.text": {
"message": "Klikk her for å se endringsloggen."
},
@@ -173,12 +170,6 @@
"instance.edit-world.title": {
"message": "Rediger verden"
},
"instance.filter.disabled": {
"message": "Deaktiverte prosjekt"
},
"instance.filter.updates-available": {
"message": "Oppdateringer tiljengelige"
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -287,141 +278,9 @@
"instance.settings.tabs.installation": {
"message": "Installasjon"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} for Minecraft {game_version} er allerede installert"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} er allerede installert"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Endre versjon"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installerer"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Henter modpakkeversjoner"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installerer ny versjon"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "For tiden installert"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Feilsøkingsinformasjon:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Henter modpakkedetaljer"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spillversjon"
},
"instance.settings.tabs.installation.install": {
"message": "Installer"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installasjon pågår"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} versjon"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kan ikke hente detaljer for tilknyttet modpakke."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} er ikke tilgjengelig for Minecraft {version}. Prøv en annen mod laster."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Denne instansen er tilknyttet til en modpakke, men modpakken er ikke funnet på Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Re-installer modpakke"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Re-installerer modpakke"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstallering vil tilbakestille alt installert eller endret innhold til det som tilbys av modpakken, og fjerne alle mods eller innhold du har lagt til i tillegg til den opprinnelige installasjonen. Dette kan løse uventet oppførsel hvis det er gjort endringer i instansen, men hvis verdenene dine nå er avhengige av ekstra installert innhold, kan det ødelegge eksisterende verdener."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Er du sikker på at du vil reinstallere denne instansen?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Resetter innholdet til instansen til sin opprinnelige tilstand, som fjerner alle mods eller innhold som du har lagd til på toppen av originalpakken."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstaller modpakke"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparer"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparerer"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparasjon reinstallerer Minecraft-avhengigheter og sjekker for korrupsjon. Dette kan fikse problemer hvis spillet ikke starter grunnet launcher-relaterte feil, men vil ikke løse problemer eller krasj relatert til installerte mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Reparer instanse?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparasjon pågår"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Reset til nåværende"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Vis alle versjoner"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "endre versjon"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "installer"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstaller"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparer"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Kan ikke {action} mens en installasjon pågår"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Kan ikke {action} når man er offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Kan ikke {action} mens en reparasjon pågår"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(ukjent versjon)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Koble fra instanse"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Hvis du fortsetter, vil du ikke kunne koble det på nytt uten å lage en helt ny instans. Du vil ikke kunne få oppdateringer for modpakker lenger og det vil bli til en normal instans."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Er du sikker på at du vil koble fra denne instansen?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Denne instansen er koblet til en modpakke, som betyr at mods ikke kan bli oppdatert og at du ikke kan endre modloaderen eller Minecraft-versjonen. Å avlenke vil permanent koble fra instansen fra modpakken."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Koble fra modpakke"
},
"instance.settings.tabs.java": {
"message": "Java og minne"
},
+110 -182
View File
@@ -5,6 +5,81 @@
"app.auth-servers.unreachable.header": {
"message": "Nie udało się połączyć się z serwerami uwierzytelniania"
},
"app.export-modal.export-button": {
"message": "Eksportuj"
},
"app.export-modal.header": {
"message": "Eksportuj paczkę modów"
},
"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": "Wybierz pliki i foldery, które mają znaleźć się w paczce"
},
"app.export-modal.version-number-label": {
"message": "Numer wersji"
},
"app.export-modal.version-number-placeholder": {
"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."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Tej akcji nie można odwrócić"
},
"app.instance.confirm-delete.delete-button": {
"message": "Usuń instancję"
},
"app.instance.confirm-delete.header": {
"message": "Usuń instancję"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ta paczka modów jest już zainstalowana w instancji \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Duplikat paczki modów"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Utwórz mimo to"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Przejdź do instancji"
},
"app.instance.modpack-already-installed.header": {
"message": "Paczka modów jest już zainstalowana"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopiuj łącze"
},
"app.instance.mods.installing": {
"message": "Instalowanie..."
},
"app.instance.mods.modpack-fallback": {
"message": "Paczka modów"
},
"app.instance.mods.project-was-added": {
"message": "Dodano \"{name}\""
},
"app.instance.mods.projects-were-added": {
"message": "Dodano {count} {count, plural, one {projekt} few {projekty} other {projektów}}"
},
"app.instance.mods.show-file": {
"message": "Pokaż plik"
},
"app.instance.mods.successfully-uploaded": {
"message": "Przesyłanie powiodło się"
},
"app.modal.install-to-play.content-required": {
"message": "Wymagane treści"
},
"app.modal.install-to-play.header": {
"message": "Zainstaluj, aby grać"
},
@@ -14,11 +89,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} few {# mody} other {# modów}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Ten serwer potrzebuje modów, aby grać. Kliknij, instaluj, aby ustawić potrzebne pliki z Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Wymagana paczka modów"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} dziś udostępnił/-a Ci tę instancję."
"app.modal.install-to-play.server-requires-mods": {
"message": "Ten serwer wymaga modów, aby na nim grać. Kliknij \"Zainstaluj\" aby otrzymać potrzebne pliki z Modrinth, a potem dołącz bezpośrednio do serwera."
},
"app.modal.install-to-play.shared-instance": {
"message": "Wspólna instancja"
@@ -26,36 +101,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Wspólna instancja serwera"
},
"app.modal.update-to-play.added-count": {
"message": "Dodano {count}"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Dodano"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Usunięto"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Zaktualizowano"
"app.modal.install-to-play.view-contents": {
"message": "Pokaż zawartość"
},
"app.modal.update-to-play.header": {
"message": "Zaktualizuj, by grać"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "Usunięto {count}"
},
"app.modal.update-to-play.update-required": {
"message": "Wymagana jest aktualizacja"
},
"app.modal.update-to-play.update-required-description": {
"message": "Aktualizacja jest wymagana, aby grać w {name}. Proszę zaktualizować do najnowszej wersji, aby uruchomić grę."
},
"app.modal.update-to-play.updated-count": {
"message": "Zaktualizowano {count}"
},
"app.settings.developer-mode-enabled": {
"message": "Tryb dewelopera włączony."
},
@@ -83,39 +140,33 @@
"app.settings.tabs.resource-management": {
"message": "Zarządzanie zasobami"
},
"app.update-toast.body": {
"message": "Wersja Modrinth App v{version} jest gotowa do zainstalowania! Odśwież, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz aplikacje Modrinth."
"app.update-popup.body": {
"message": "Wersja Modrinth App v{version} jest gotowa do zainstalowania! Załaduj ponownie, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Wersja Modrinth App v{version} została pobrana. Odśwież, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
"app.update-popup.body.download-complete": {
"message": "Wersja Modrinth App v{version} została pobrana. Załaduj ponownie, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} jest dostępna. Użyj menedżera pakietów, aby zaktualizować i uzyskać najnowsze funkcje i poprawki!"
"app.update-popup.body.linux": {
"message": "Wersja Modrinth App v{version} jest dostępna. Pobierz aktualizację poprzez menedżer pakietów, by uzyskać najnowsze funkcje i poprawki!"
},
"app.update-toast.body.metered": {
"message": "Wersja v{version} Modrinth App jest dostępna! Skoro korzystasz z sieci taryfowej, nie pobraliśmy jej automatycznie."
"app.update-popup.body.metered": {
"message": "Wersja Modrinth App v{version} jest dostępna! Skoro korzystasz z sieci taryfowej, nie pobraliśmy jej automatycznie."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Dziennik zmian"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Pobierz ({size})"
},
"app.update-toast.download-page": {
"message": "Pobierz"
"app.update-popup.download-complete": {
"message": "Pobieranie ukończone"
},
"app.update-toast.downloading": {
"message": "Pobieranie..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Załaduj ponownie"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Dostępna aktualizacja"
},
"app.update-toast.title.download-complete": {
"message": "Pobieranie ukończone"
},
"app.update.complete-toast.text": {
"message": "Kliknij, by pokazać dziennik zmian."
},
@@ -230,12 +281,6 @@
"instance.edit-world.title": {
"message": "Edytuj świat"
},
"instance.filter.disabled": {
"message": "Wyłączone projekty"
},
"instance.filter.updates-available": {
"message": "Dostępne aktualizacje"
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -344,141 +389,9 @@
"instance.settings.tabs.installation": {
"message": "Instalacja"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} dla Minecraft {game_version} jest już zainstalowana"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} jest już zainstalowana"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Zmień wersję"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Zainstaluj"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalowanie"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Pobieranie wersji paczki modów"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalowanie nowej wersji"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Obecnie zainstalowane"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informacje dotyczące debugowania:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Pobieranie szczegółów paczki modów"
},
"instance.settings.tabs.installation.game-version": {
"message": "Wersja gry"
},
"instance.settings.tabs.installation.install": {
"message": "Zainstaluj"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Trwa instalowanie"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Wersja {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Nie można pobrać powiązanych szczegółów paczki modów. Sprawdź swoje połączenie internetowe."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} nie jest dostępny dla Minecraft {version}. Spróbuj inny."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Ta instancja jest połączona z paczką modów, ale nie udało się znaleźć tej paczki modów na Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Zainstaluj paczkę modów ponownie"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Ponowne instalowanie paczki modów"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Ponowne instalowanie zresetuje całą zainstalowaną lub zmodyfikowaną zawartość do stanu podanego przez paczkę modów, usuwając jakiekolwiek mody lub zawartość, którą dodałeś(-aś) ponad oryginalną instalację. Może to naprawić nieoczekiwane zachowanie, jeśli instancja została zmieniona, ale jeśli Twoje istniejące światy polegają na dodatkowej zawartości, którą zainstalowałeś, może to je zepsuć."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Czy jesteś pewien, że chcesz ponownie zainstalować tę instancję?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Resetuje zawartość instancji do jej oryginalnego stanu, usuwając jakiekolwiek modyfikacje lub zawartość którą dodano do paczki modów."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Ponownie zainstaluj paczkę modów"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Napraw"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Naprawianie"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Naprawa ponownie instaluje zależności Minecraft i sprawdza, czy nie są one uszkodzone. Może to rozwiązać problemy, jeśli gra nie uruchomi się z powodu błędów związanych z launcherem, ale nie rozwiąże problemów związanych z zainstalowanymi modami."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Naprawić instancję?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Trwa naprawianie"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Resetuj do aktualnego"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Pokaż wszystkie wersje"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "zmień wersję"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "zainstaluj"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "zainstaluj ponownie"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "napraw"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Podczas instalowania nie można wykonać: {action}"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Nie możesz {action} podczas bycia offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Podczas naprawiania nie można wykonać: {action}"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(nieznana wersja)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Rozłącz instancję"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Jeśli przejdziesz dalej, nie będziesz mógł jej ponownie złączyć, bez tworzenia kompletnie nowej instancji. Nie będziesz otrzymywał aktualizacji paczki modów i zamieni się w normalną instancję."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Czy jesteś pewien, że chcesz rozłączyć tę instancję?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Ta instancja jest powiązana z paczką modów, co oznacza, że mody nie mogą być aktualizowane i nie można zmienić silnika gry ani wersji Minecrafta. Odłączenie spowoduje trwałe odłączenie tej instancji od paczki modów."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Rozłącz od paczki modów"
},
"instance.settings.tabs.java": {
"message": "Java i pamięć"
},
@@ -551,6 +464,9 @@
"instance.worlds.incompatible_server": {
"message": "Serwer jest nie kompatybilny"
},
"instance.worlds.linked_server": {
"message": "Zarządzane przez serwer"
},
"instance.worlds.no_contact": {
"message": "Nie można nawiązać połączenia z serwerem"
},
@@ -586,5 +502,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Synchronizuj z instancją"
},
"search.filter.locked.server": {
"message": "Dostarczone przez serwer"
},
"search.filter.locked.server-environment.title": {
"message": "Tylko mody po stronie klienta mogą być dodane do instancji serwera"
},
"search.filter.locked.server-game-version.title": {
"message": "Wersja gry jest dostarczona przez serwer"
},
"search.filter.locked.server-loader.title": {
"message": "Loader jest dostarczony przez serwer"
}
}
+126 -183
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Não foi possível acessar os servidores de autenticação"
},
"app.export-modal.description-placeholder": {
"message": "Insira a descrição do pacote de mods..."
},
"app.export-modal.export-button": {
"message": "Exportar"
},
"app.export-modal.header": {
"message": "Exportar pacote de mods"
},
"app.export-modal.modpack-name-label": {
"message": "Nome do pacote de mods"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nome do pacote de mods"
},
"app.export-modal.select-files-label": {
"message": "Selecione arquivos e pastas para incluir no pacote"
},
"app.export-modal.version-number-label": {
"message": "Número da versão"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Todos os dados da sua instância serão permanentemente excluídos, incluindo seus mundos, configurações e todo o conteúdo instalado."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Esta ação não pode ser desfeita"
},
"app.instance.confirm-delete.delete-button": {
"message": "Excluir instância"
},
"app.instance.confirm-delete.header": {
"message": "Excluir instância"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este pacote de mods já está instalado na instância \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Pacote de mods duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Criar mesmo assim"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir para a instância"
},
"app.instance.modpack-already-installed.header": {
"message": "O pacote de mods já está instalado"
},
"app.instance.mods.content-type-project": {
"message": "projeto"
},
"app.instance.mods.copy-link": {
"message": "Copiar link"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pacote de mods"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" foi adicionado"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projetos foram adicionados"
},
"app.instance.mods.share-text": {
"message": "Confira os projetos que estou usando no meu pacote de mods!"
},
"app.instance.mods.share-title": {
"message": "Compartilhando conteúdo do pacote de mods\n\n\n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t\t\t\t\t\t"
},
"app.instance.mods.show-file": {
"message": "Mostrar arquivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Enviado com sucesso"
},
"app.instance.mods.unknown-version": {
"message": "Desconhecido"
},
"app.instance.mods.updating": {
"message": "Atualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Conteúdo necessário"
},
"app.modal.install-to-play.header": {
"message": "Instale para jogar"
},
@@ -12,13 +102,13 @@
"message": "Instalar"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, =0 {Nenhum mod} one {# mod} other {# mods}}\n"
"message": "{count, plural, =0 {Nenhum mod} one {# mod} other {# mods}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Pacote de mods necessário"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requer mods para jogar. Clique em Instalar para configurar os arquivos necessários a partir do Modrinth."
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} compartilhou esta instância com você hoje."
"message": "Este servidor requer mods para jogar. Clique em Instalar para configurar os arquivos necessários a partir do Modrinth, e iniciar diretamente no servidor."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instância compartilhada"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Instância de servidor compartilhada"
},
"app.modal.update-to-play.added-count": {
"message": "{count} adicionado"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Adicionado"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Removido"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Atualizado"
"app.modal.install-to-play.view-contents": {
"message": "Ver conteúdos"
},
"app.modal.update-to-play.header": {
"message": "Atualize para jogar"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} removido"
},
"app.modal.update-to-play.update-required": {
"message": "Atualização necessária"
},
"app.modal.update-to-play.update-required-description": {
"message": "É necessária uma atualização para jogar {name}. Atualize para a versão mais recente para iniciar o jogo."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} atualizado"
},
"app.settings.developer-mode-enabled": {
"message": "Modo de desenvolvedor ativado."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Gerenciamento de recursos"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "O Modrinth App v{version} está pronto para ser instalado! Você pode recarregar para atualizar agora ou a atualização será feita automaticamente ao fechar o Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "O Modrinth App v{version} baixado. Recarregue para atualizar agora ou a atualização será aplicada automaticamente ao fechar o Modrinth App."
"app.update-popup.body.download-complete": {
"message": "O Modrinth App v{version} foi baixado. Recarregue para atualizar agora ou a atualização será aplicada automaticamente ao fechar o Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "O Modrinth App v{version} está disponível. Use seu gerenciador de pacotes para atualizar e obter os recursos e correções mais recentes!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "O Modrinth App v{version} já está disponível! Como você está em uma rede limitada, não o baixamos automaticamente."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Mudanças"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Baixar ({size})"
},
"app.update-toast.download-page": {
"message": "Baixar"
},
"app.update-toast.downloading": {
"message": "Baixando..."
},
"app.update-toast.reload": {
"message": "Atualizar"
},
"app.update-toast.title": {
"message": "Atualização disponível"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "Download concluído"
},
"app.update-popup.reload": {
"message": "Recarregar"
},
"app.update-popup.title": {
"message": "Atualização disponível"
},
"app.update.complete-toast.text": {
"message": "Clique aqui para ver as mudanças."
},
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.filter.disabled": {
"message": "Projetos desativados"
},
"instance.filter.updates-available": {
"message": "Atualizações disponíveis"
},
"instance.server-modal.address": {
"message": "Endereço"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Instalação"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} para o Minecraft {game_version} já está instalada"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "A versão padrão {game_version} já está instalada"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Alterar versão"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Buscando versões do pacote de mods"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalando nova versão"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Versão instalada"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informação de depuração:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Buscando detalhes do pacote de mods"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versão do jogo"
},
"instance.settings.tabs.installation.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalação em progresso"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versão do {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Não foi possível carregar detalhes do pacote de mods. Verifique sua conexão com a internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} não está disponível para o Minecraft {version}. Tente outro carregador de mods."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Esta instância está vinculada a um pacote de mods, mas o pacote não foi encontrado no Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plataforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalar pacote de mods"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalando pacote de mods"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "A reinstalação redefinirá todo o conteúdo instalado ou modificado para o fornecido pelo pacote de mods, removendo quaisquer mods ou conteúdo que você tenha adicionado sobre a instalação original. Isso pode corrigir comportamentos inesperados se alterações tiverem sido feitas na instância, mas se seus mundos agora dependem do conteúdo adicional instalado, isso pode danificar mundos existentes."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Tem certeza de que deseja reinstalar esta instância?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Volta ao estado original da instância, removendo quaisquer mods ou conteúdo que você tenha adicionado além do que já havia no pacote de mods original."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalar pacote de mods"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparar"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "O reparo reinstala as dependências do Minecraft e verifica se há corrupção. Isso pode resolver problemas se o seu jogo não estiver iniciando devido a erros relacionados ao launcher, mas não resolverá problemas ou travamentos relacionados a mods instalados."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Reparar instância?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparação em progresso"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Retornar ao padrão"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Exibir todas as versões"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "mudar a versão"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instalar"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalar"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparar"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Não é possível {action} durante a instalação"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Não é possível {action} enquanto estiver offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Não é possível {action} enquanto repara"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versão desconhecida)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Desvincular instância"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Ao prosseguir, não será possível vincular novamente sem criar uma instância totalmente nova. Você não receberá mais atualizações do pacote de mods e ela se tornará uma instância normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Tem certeza de que deseja desvincular esta instância?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Esta instância está vinculada a um pacote de mods, o que significa que mods não podem ser atualizados e você não pode alterar o carregador de mods ou a versão do Minecraft. Desvincular desconectará permanentemente esta instância do pacote de mods."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Desvincular do pacote de mods"
},
"instance.settings.tabs.java": {
"message": "Java e memória"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Servidor incompatível"
},
"instance.worlds.linked_server": {
"message": "Gerenciado pelo projeto de servidor"
},
"instance.worlds.no_contact": {
"message": "Não foi possível conectar-se ao servidor"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sincronizar com a instância"
},
"search.filter.locked.server": {
"message": "Fornecido pelo servidor"
},
"search.filter.locked.server-environment.title": {
"message": "Apenas mods do lado do cliente podem ser adicionados à instância do servidor"
},
"search.filter.locked.server-game-version.title": {
"message": "A versão do jogo é fornecida pelo servidor"
},
"search.filter.locked.server-loader.title": {
"message": "O carregador é fornecido pelo servidor"
}
}
+1 -199
View File
@@ -14,48 +14,21 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {mod} other {mods}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requer mods para jogares. Clica instalar para transferir os ficheiros necessários do Modrinth."
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} partilhou esta instância contigo hoje."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instância partilhada"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Instância de servidor partilhada"
},
"app.modal.update-to-play.added-count": {
"message": "{count} adicionados"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Adicionado"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Removido"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Atualizado"
},
"app.modal.update-to-play.header": {
"message": "Atualiza para jogar"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} removidos"
},
"app.modal.update-to-play.update-required": {
"message": "Atualização necessitada"
"message": "Atualização necessária"
},
"app.modal.update-to-play.update-required-description": {
"message": "Uma atualização é necessária para jogar {name}. Por favor atualiza para a versão mais recente para iniciar o jogo."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} atualizados"
},
"app.settings.developer-mode-enabled": {
"message": "Modo de desenvolvedor ativado."
},
@@ -83,39 +56,6 @@
"app.settings.tabs.resource-management": {
"message": "Gestão de recursos"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} está pronta para ser instalada! Recarrega para atualizar agora, ou automaticamente quando fechares a Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} acabou de ser transferida. Recarrega para atualizar agora, ou automaticamente quando fechares a Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} está disponível. Usa o teu gestor de pacotes para atualizar e receber as correções e recursos mais recentes!"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} está disponível! Como estás numa rede com tráfego limitado, não a transferimos automaticamente."
},
"app.update-toast.changelog": {
"message": "Lista de alterações"
},
"app.update-toast.download": {
"message": "Transferir ({size})"
},
"app.update-toast.download-page": {
"message": "Transferir"
},
"app.update-toast.downloading": {
"message": "A transferir..."
},
"app.update-toast.reload": {
"message": "Recarregar"
},
"app.update-toast.title": {
"message": "Atualização disponível"
},
"app.update-toast.title.download-complete": {
"message": "Transferência concluída"
},
"app.update.complete-toast.text": {
"message": "Clica aqui para ver a lista de alterações."
},
@@ -230,12 +170,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.filter.disabled": {
"message": "Projetos desativados"
},
"instance.filter.updates-available": {
"message": "Atualizações disponíveis"
},
"instance.server-modal.address": {
"message": "Endereço"
},
@@ -344,141 +278,9 @@
"instance.settings.tabs.installation": {
"message": "Instalação"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} para Minecraft {game_version} já está instalado"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} já está instalado"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Alterar versão"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "A obter versões do modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalando a nova versão"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Atualmente instalado"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informação de depuração:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "A obter detalhes do modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versão do Jogo"
},
"instance.settings.tabs.installation.install": {
"message": "Instalar"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalação em curso"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versão {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Não foi possível obter os detalhes do modpack associado. Por favor verifica a tua ligação à internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} não está disponivel para Minecraft {version}. Tenta outro carregador de mods."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Esta instância está associada a um modpack, mas não foi possível encontrar o modpack no Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plataforma"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalando modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstalar vai redefinir todo o conteúdo instalado ou modificado para o que é fornecido pelo modpack, removendo quaisquer mods ou conteúdo que tenhas adicionado à instalação original. Isto pode corrigir comportamentos inesperados se alterações foram feitas à instância, mas se os teus mundos dependerem de conteúdo adicional que instalaste, podem ficar corrompidos."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Tens a certeza que queres reinstalar esta instância?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Redefine o conteúdo da instância para o seu estado original, removendo quaisquer mods ou conteúdo que tenhas adicionado ao modpack original."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalar modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparar"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparar reinstala as dependências do Minecraft e verifica por corrupção. Isto pode resolver problemas se o teu jogo não estiver a abrir devido a erros relacionados ao launcher, mas não vai resolver problemas ou crashes relacionados a mods instalados."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Reparar instância?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparação em curso"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Redefinir para atuais"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Mostrar todas as versões"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "Alterar versão"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instalar"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalar"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparar"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Não é possível {action} durante uma instalação em curso"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Não é possível {action} enquanto offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Não é possível {action} durante uma reparação em curso"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versão desconhecida)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Desassociar instância"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Se procederes, não vais poder reassociá-la sem criar uma instância completamente nova. Não vais receber mais atualizações do modpack e a instância vai se tornar uma instância normal."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Tens a certeza que queres desassociar esta instância?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Esta instância está associada a um modpack, o que significa que mods não podem ser atualizados e não podes alterar o carregador de mods ou a versão do Minecraft. Desassociar vai desconectar permanentemente esta instância do modpack."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Desassociar do modpack"
},
"instance.settings.tabs.java": {
"message": "Java e memória"
},
+78 -156
View File
@@ -5,6 +5,45 @@
"app.auth-servers.unreachable.header": {
"message": "Nu se pot accesa serverele de autentificare"
},
"app.instance.mods.copy-link": {
"message": "Copiază linkul"
},
"app.modal.install-to-play.content-required": {
"message": "Conținut necesar"
},
"app.modal.install-to-play.header": {
"message": "Instalați pentru a juca"
},
"app.modal.install-to-play.install-button": {
"message": "Instalează"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural,one {#mod} other {# moduri}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Pachet de mod necesar"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Acest server necesită modificări pentru a juca. Faceți clic pe Instalare pentru a configura fișierele necesare din Modrinth, apoi lansați direct pe server."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instanță comună"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Instanță de server partajată"
},
"app.modal.install-to-play.view-contents": {
"message": "Vizualizați conținutul"
},
"app.modal.update-to-play.header": {
"message": "Actualizați pentru a juca"
},
"app.modal.update-to-play.update-required": {
"message": "Actualizare necesară"
},
"app.modal.update-to-play.update-required-description": {
"message": "Este necesară o actualizare pentru a juca {name}. Vă rugăm să actualizați la cea mai recentă versiune pentru a lansa jocul."
},
"app.settings.developer-mode-enabled": {
"message": "Modul dezvoltator activat."
},
@@ -32,33 +71,33 @@
"app.settings.tabs.resource-management": {
"message": "Administrare resurse"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} este gata de instalare! Reîncarcă pentru a actualiza acum, sau automat când închizi Modrinth App."
"app.update-popup.body": {
"message": "Aplicația Modrinth v{version} este gata de instalat! Reîncărcați pentru a actualiza acum sau automat când închideți aplicația Modrinth."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} a terminat descărcarea. Reîncarcă pentru a actualiza acum, sau automat când închizi Modrinth App."
"app.update-popup.body.download-complete": {
"message": "Aplicația Modrinth v{version} a terminat descărcarea. Reîncărcați pentru a actualiza acum sau automat când închideți aplicația Modrinth."
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} este disponibilă acum! Deoarece ești pe o rețea cu trafic limitat, nu am descărcat-o automat."
"app.update-popup.body.linux": {
"message": "Aplicația Modrinth v{version} este disponibil. Utilizați managerul de pachete pentru a actualiza pentru cele mai recente funcții și remedieri!"
},
"app.update-toast.changelog": {
"message": "Istoric modificări"
"app.update-popup.body.metered": {
"message": "Aplicația Modrinth v{version} este disponibil acum! Deoarece sunteți într-o rețea cu contorizare, nu am descărcat-o automat."
},
"app.update-toast.download": {
"message": "Descarcă ({size})"
"app.update-popup.changelog": {
"message": "Jurnalul modificărilor"
},
"app.update-toast.downloading": {
"message": "Se descarcă..."
"app.update-popup.download": {
"message": "Descărcați ({size})"
},
"app.update-toast.reload": {
"message": "Reîncarcă"
"app.update-popup.download-complete": {
"message": "Descărcare finalizată"
},
"app.update-toast.title": {
"app.update-popup.reload": {
"message": "Reîncărcați"
},
"app.update-popup.title": {
"message": "Actualizare disponibilă"
},
"app.update-toast.title.download-complete": {
"message": "Descărcare completă"
},
"app.update.complete-toast.text": {
"message": "Apasă aici pentru a vedea istoricul de modificări."
},
@@ -77,6 +116,9 @@
"friends.action.add-friend": {
"message": "Adaugă un prieten"
},
"friends.action.view-friend-requests": {
"message": "{count} prieten {count, plural,one {cerere} other {cerere}}"
},
"friends.add-friend.submit": {
"message": "Trimite cerere de prietenie"
},
@@ -128,6 +170,9 @@
"friends.search-friends-placeholder": {
"message": "Caută prieteni..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Conectează-te la un cont Modrinth</link> pentru a adăuga prieteni și a vedea ce joacă!"
},
@@ -167,12 +212,6 @@
"instance.edit-world.title": {
"message": "Editează lumea"
},
"instance.filter.disabled": {
"message": "Proiecte dezactivate"
},
"instance.filter.updates-available": {
"message": "Actualizări disponibile"
},
"instance.server-modal.address": {
"message": "Adresă"
},
@@ -281,141 +320,9 @@
"instance.settings.tabs.installation": {
"message": "Instalare"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Versiunea {version} a platformei {platform} pentru Minecraft {game_version} este deja instalată"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Versiunea Vanilla {game_version} este deja instalată"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Schimbă versiunea"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalează"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Se instalează"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Se obțin versiunile pachetului de moduri"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Se instalează noua versiune"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Instalat în prezent"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Informații de depanare:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Se obțin detaliile pachetului de moduri"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versiune joc"
},
"instance.settings.tabs.installation.install": {
"message": "Instalează"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalare în progres"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versiune {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Nu s-au putut obține detaliile pachetului de moduri. Te tog verifică-ți conexiunea la internet."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} nu este valabil pentru Minecraft {version}. Te rog încercă alt loader de moduri."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Instanța este legată de un pachet de moduri, dar pachetul de moduri nu a putut fi găsit pe Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Platformă"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstalează pachetul de moduri"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Se reinstalează pachetul de moduri"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstalarea va reseta tot conținutul instalat sau modificat la starea inițială a pachetului de moduri, eliminând orice moduri sau conținut pe care le-ai adăugat tu. Acest lucru poate rezolva un comportament neașteptat dacă s-au făcut modificări instanței, dar dacă lumile tale depind acum de conținut suplimentar instalat, este posibil ca ele să nu mai funcționeze corect."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Ești sigur că dorești să reinstalezi această instanță?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Resetează conținutul instanței la starea sa inițială, eliminând orice moduri sau conținut pe care le-ai adăugat peste pachetul de moduri original."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalează pachetul de moduri"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Repară"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Se repară"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Repararea reinstalează dependențele Minecraft și verifică dacă există corupție. Acest lucru poate rezolva problemele în cazul în care jocul tău nu pornește din cauza erorilor legate de lansator, dar nu va rezolva problemele sau blocările legate de modurile instalate."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Repară instanța?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Repararea în progres"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Resetează la starea actuală"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Afișează toate versiunile"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "schimbă versiunea"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instalează"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstalează"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "repară"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Nu poți {action} în timp ce se instalează"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Nu poți {action} în timp ce ești neconectat"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Nu poți {action} în timp ce se repară"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versiune necunoscută)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Dezleagă instanța"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Dacă continui, nu o vei mai putea lega din nou fără a crea o instanță complet nouă. Nu vei mai primi actualizări ale pachetului de moduri, iar acesta va deveni o instanță normală."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Ești sigur că dorești să dezlegi această instanță?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Această instanță este legată de un pachet de moduri, ceea ce înseamnă că modurile nu pot fi actualizate și nu poți schimba loader-ul de moduri sau versiunea de Minecraft. Dezlegarea va deconecta permanent această instanță de pachetul de moduri."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Dezleagă de pachetul de moduri"
},
"instance.settings.tabs.java": {
"message": "Java și memorie"
},
@@ -488,6 +395,9 @@
"instance.worlds.incompatible_server": {
"message": "Serverul este incompatibil"
},
"instance.worlds.linked_server": {
"message": "Gestionat de proiect server"
},
"instance.worlds.no_contact": {
"message": "Serverul nu a putut fi contactat"
},
@@ -523,5 +433,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Sincronizează cu instanța"
},
"search.filter.locked.server": {
"message": "Furnizat de server"
},
"search.filter.locked.server-environment.title": {
"message": "Numai modurile de pe partea clientului pot fi adăugate la instanța serverului"
},
"search.filter.locked.server-game-version.title": {
"message": "Versiunea jocului este furnizată de server"
},
"search.filter.locked.server-loader.title": {
"message": "Încărcătorul este furnizat de server"
}
}
+126 -183
View File
@@ -5,8 +5,98 @@
"app.auth-servers.unreachable.header": {
"message": "Нет связи с серверами аутентификации"
},
"app.export-modal.description-placeholder": {
"message": "Введите описание сборки..."
},
"app.export-modal.export-button": {
"message": "Экспортировать"
},
"app.export-modal.header": {
"message": "Экспорт модпака"
},
"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": "Номер версии"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Все данные вашей инстанции будут окончательно удалены, включая ваши миры, настройки и весь установленный контент."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Это действие нельзя обратить"
},
"app.instance.confirm-delete.delete-button": {
"message": "Удалить сборку"
},
"app.instance.confirm-delete.header": {
"message": "Удаление сборки"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Этот модпак уже установлен в инстанции \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Дублировать модпак"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Всё равно создать"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "К инстанции"
},
"app.instance.modpack-already-installed.header": {
"message": "Модпак уже установлен"
},
"app.instance.mods.content-type-project": {
"message": "проект"
},
"app.instance.mods.copy-link": {
"message": "Копировать ссылку"
},
"app.instance.mods.installing": {
"message": "Установка..."
},
"app.instance.mods.modpack-fallback": {
"message": "Сборка"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" был добавлен"
},
"app.instance.mods.projects-were-added": {
"message": "Проектов добавлено: {count}"
},
"app.instance.mods.share-text": {
"message": "Посмотрите проекты, в моём модпаке!"
},
"app.instance.mods.share-title": {
"message": "Содержимое сборки"
},
"app.instance.mods.show-file": {
"message": "Показать в папке"
},
"app.instance.mods.successfully-uploaded": {
"message": "Успешно загружено"
},
"app.instance.mods.unknown-version": {
"message": "Неизвестно"
},
"app.instance.mods.updating": {
"message": "Обновление..."
},
"app.modal.install-to-play.content-required": {
"message": "Требуется дополнительный контент"
},
"app.modal.install-to-play.header": {
"message": "Установите, чтобы играть"
"message": "Установка перед запуском"
},
"app.modal.install-to-play.install-button": {
"message": "Установить"
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# мод} few {# мода} other {# модов}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Для игры на сервере требуются моды. Установите необходимые файлы с Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Необходимая сборка"
},
"app.modal.install-to-play.shared-by-today": {
"message": "Сегодня {name} делится с вами этой сборкой."
"app.modal.install-to-play.server-requires-mods": {
"message": "Для игры на сервере требуются моды. Установите необходимые файлы с Modrinth, чтобы подключиться."
},
"app.modal.install-to-play.shared-instance": {
"message": "Сборка"
@@ -26,26 +116,11 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Общая сборка сервера"
},
"app.modal.update-to-play.added-count": {
"message": "{count, plural, one {# добавление} few {# добавления} other {# добавлений}}"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Добавлен"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Удалён"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Обновлён"
"app.modal.install-to-play.view-contents": {
"message": "Посмотреть"
},
"app.modal.update-to-play.header": {
"message": "Обновите перед запуском"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count, plural, one {# удаление} few {# удаления} other {# удалений}}"
"message": "Обновление перед запуском"
},
"app.modal.update-to-play.update-required": {
"message": "Требуется обновление"
@@ -53,9 +128,6 @@
"app.modal.update-to-play.update-required-description": {
"message": "Обновите {name} до последней версии, чтобы запустить игру."
},
"app.modal.update-to-play.updated-count": {
"message": "{count, plural, one {# обновление} few {# обновления} other {# обновлений}}"
},
"app.settings.developer-mode-enabled": {
"message": "Режим разработчика включён."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Управление ресурсами"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Версия Modrinth App {version} готова к установке! Перезапустите приложение, чтобы обновить его, или оно обновится автоматически после закрытия."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Скачивание версии Modrinth App {version} завершено. Перезапустите приложение, чтобы обновить его, или оно обновится автоматически после закрытия."
},
"app.update-toast.body.linux": {
"message": "Доступна версия Modrinth App {version}. Обновите приложение через менеджер пакетов и получите последние улучшения и исправления!"
"app.update-popup.body.linux": {
"message": "Доступна версия Modrinth App {version}. Обновите приложение через менеджер пакетов, чтобы получить последние улучшения и исправления!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Версия Modrinth App {version} доступна для скачивания! Используется сеть с лимитным тарифным планом, поэтому скачивание не началось автоматически."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Список изменений"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Скачать ({size})"
},
"app.update-toast.download-page": {
"message": "Скачать"
"app.update-popup.download-complete": {
"message": "Скачивание завершено"
},
"app.update-toast.downloading": {
"message": "Скачивание..."
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "Перезапустить"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Доступно обновление"
},
"app.update-toast.title.download-complete": {
"message": "Скачивание завершено"
},
"app.update.complete-toast.text": {
"message": "Нажмите здесь, чтобы посмотреть изменения."
},
@@ -153,7 +219,7 @@
"message": "Какое имя у друга на Modrinth?"
},
"friends.add-friends-to-share": {
"message": "<link>Добавьте друзей</link>, чтобы видеть их статус игры!"
"message": "<link>Добавьте друзей</link>, чтобы видеть, во что они играют!"
},
"friends.friend.cancel-request": {
"message": "Отменить запрос"
@@ -192,7 +258,7 @@
"message": "{title} — {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Войдите в Modrinth</link>, чтобы добавлять друзей и знать, во что они играют!"
"message": "<link>Войдите в аккаунт Modrinth</link>, вы сможете добавлять друзей и видеть их статус!"
},
"instance.add-server.add-and-play": {
"message": "Добавить и играть"
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Настройка мира"
},
"instance.filter.disabled": {
"message": "Отключённые проекты"
},
"instance.filter.updates-available": {
"message": "Доступны обновления"
},
"instance.server-modal.address": {
"message": "Адрес"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Установка"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} для Minecraft {game_version} уже установлен"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Ванильный Minecraft {game_version} уже установлен"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Сменить версию"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Установить"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Установка"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Получение версий сборки"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Установка новой версии"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Установлено"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Отладочная информация:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Получение сведений о сборке"
},
"instance.settings.tabs.installation.game-version": {
"message": "Версия игры"
},
"instance.settings.tabs.installation.install": {
"message": "Установить"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Выполняется установка"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Версия {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Не удалось получить сведения о сборке. Проверьте подключение к интернету."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} недоступен для Minecraft {version}. Выберите другой загрузчик."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Не удалось найти сборку на Modrinth, с которой связано установленное содержимое."
},
"instance.settings.tabs.installation.platform": {
"message": "Платформа"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Переустановить сборку"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Переустановка сборки"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Установленное содержимое будет сброшено к исходному состоянию сборки, а внесённые в её состав изменения будут удалены. Это может исправить возникшие после изменений проблемы с игрой, но зависящие от добавленного содержимого миры могут перестать корректно работать."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Вы действительно хотите переустановить сборку?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Возвращает содержимое сборки к исходному состоянию и удаляет все моды или контент, добавленные поверх оригинальной сборки."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Переустановка сборки"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Исправить"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Исправление"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Будут переустановлены зависимости Minecraft, а также определены и восстановлены повреждённые файлы. Это может помочь с проблемами запуска игры на стороне лаунчера, но не исправит проблемы и вылеты из-за ошибок в имеющихся модах."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Исправить сборку?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Выполняется исправление"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Сбросить выбор"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Показывать все версии"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "сменить версию"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "установить"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "переустановить"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "исправить"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Невозможно {action} во время установки"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Невозможно {action} без подключения к сети"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Невозможно {action} во время исправления"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(неизвестная версия)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Отвязать сборку"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Если продолжить, восстановить связь будет невозможно без создания новой сборки. Сборка утратит возможность получать обновления и станет локальной."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Вы действительно хотите отвязать сборку?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Эта сборка связана с модпаком, что означает, что моды не могут быть обновлены, и вы не можете изменить загрузчик или версию Minecraft. Отвязка приведет к постоянному отключению этой сборки от модпака."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Отвязка сборки"
},
"instance.settings.tabs.java": {
"message": "Java и память"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Сервер несовместим"
},
"instance.worlds.linked_server": {
"message": "Управляется серверным проектом"
},
"instance.worlds.no_contact": {
"message": "Не удалось связаться с сервером"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Использовать из сборки"
},
"search.filter.locked.server": {
"message": "Управляется сервером"
},
"search.filter.locked.server-environment.title": {
"message": "В серверную сборку можно добавлять только моды для клиента"
},
"search.filter.locked.server-game-version.title": {
"message": "Версия игры управляется сервером"
},
"search.filter.locked.server-loader.title": {
"message": "Загрузчик управляется сервером"
}
}
+86 -1
View File
@@ -1 +1,86 @@
{}
{
"app.export-modal.export-button": {
"message": "Izvoz"
},
"app.export-modal.version-number-label": {
"message": "Broj verzije"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.mods.copy-link": {
"message": "Kopiraj link"
},
"app.instance.mods.installing": {
"message": "Instaliranje..."
},
"app.instance.mods.show-file": {
"message": "Prikaži datoteku"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uspešno otpremljeno"
},
"app.instance.mods.unknown-version": {
"message": "Nepoznato"
},
"app.instance.mods.updating": {
"message": "Ažuriranje..."
},
"app.settings.tabs.appearance": {
"message": "Izgled"
},
"app.settings.tabs.java-installations": {
"message": "Java instalacije"
},
"app.settings.tabs.language": {
"message": "Jezik"
},
"app.settings.tabs.privacy": {
"message": "Privatnost"
},
"friends.friend.cancel-request": {
"message": "Otkaži zahtev"
},
"friends.friend.remove-friend": {
"message": "Ukloni prijatelja"
},
"friends.friend.request-sent": {
"message": "Zahtev za prijateljstvo poslat"
},
"friends.friend.view-profile": {
"message": "Pogledaj profil"
},
"friends.heading": {
"message": "Prijatelji"
},
"instance.add-server.title": {
"message": "Dodaj server"
},
"instance.edit-server.title": {
"message": "Izmeni server"
},
"instance.edit-world.hide-from-home": {
"message": "Sakrij sa početne stranice"
},
"instance.edit-world.name": {
"message": "Ime"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft svet"
},
"instance.edit-world.title": {
"message": "Izmeni svet"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft Server"
},
"instance.settings.tabs.general.deleting.button": {
"message": "Brisanje..."
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Kreiraj novu grupu"
},
"instance.settings.tabs.general.name": {
"message": "Ime"
}
}
+113 -182
View File
@@ -5,6 +5,84 @@
"app.auth-servers.unreachable.header": {
"message": "Kan ej nå autentiseringsservrarna"
},
"app.export-modal.description-placeholder": {
"message": "Ange modpaketets beskrivning..."
},
"app.export-modal.export-button": {
"message": "Exportera"
},
"app.export-modal.header": {
"message": "Exportera modpaket"
},
"app.export-modal.modpack-name-label": {
"message": "Modpaketets namn"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpaketets namn"
},
"app.export-modal.select-files-label": {
"message": "Välj filer och mappar att inkludera i paketet"
},
"app.export-modal.version-number-label": {
"message": "Versionsnummer"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "All data från din instans kommer att raderas permanent, inklusive dina världar, konfigurationer och allt installerat innehåll."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Detta kan inte ogöras"
},
"app.instance.confirm-delete.delete-button": {
"message": "Radera instans"
},
"app.instance.confirm-delete.header": {
"message": "Radera instans"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Skapa ändå"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopiera länk"
},
"app.instance.mods.installing": {
"message": "Installerar..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaket"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" lades till"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projekt lades till"
},
"app.instance.mods.share-text": {
"message": "Kolla in projekten jag använder i mitt modpaket!"
},
"app.instance.mods.share-title": {
"message": "Delar innehåll från modpaket"
},
"app.instance.mods.show-file": {
"message": "Visa fil"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uppladdning lyckades"
},
"app.instance.mods.unknown-version": {
"message": "Okänt"
},
"app.instance.mods.updating": {
"message": "Uppdaterar..."
},
"app.modal.install-to-play.content-required": {
"message": "Innehåll krävs"
},
"app.modal.install-to-play.header": {
"message": "Installera för att spela"
},
@@ -14,11 +92,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# moddar}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Servern kräver moddar för att du ska kunna spela. Tryck på installera för att sätta upp dem nödvändiga filerna från Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Modpaket som krävs"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} delade denna instans med dig idag."
"app.modal.install-to-play.server-requires-mods": {
"message": "Servern kräver moddar för att du ska kunna spela. Klicka på Installera för att sätta upp dem nödvändiga filerna från Modrinth, och starta sedan på servern direkt."
},
"app.modal.install-to-play.shared-instance": {
"message": "Delad instans"
@@ -26,36 +104,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Delad serverinstans"
},
"app.modal.update-to-play.added-count": {
"message": "{count} tillagda"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Tillagd"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Borttaget"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Uppdaterad"
"app.modal.install-to-play.view-contents": {
"message": "Visa innehåll"
},
"app.modal.update-to-play.header": {
"message": "Uppdatera för att spela"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} borttaget"
},
"app.modal.update-to-play.update-required": {
"message": "Uppdatering krävs"
},
"app.modal.update-to-play.update-required-description": {
"message": "En uppdatering krävs för att spela {name}. Vänligen uppdatera till senaste version för att starta spelet."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} uppdaterade"
},
"app.settings.developer-mode-enabled": {
"message": "Utvecklarläge aktiverat."
},
@@ -83,39 +143,33 @@
"app.settings.tabs.resource-management": {
"message": "Resurshantering"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} är redo att laddas ner! Ladda om för att uppdatera nu, eller automatiskt när du stänger Modrinth App."
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} har laddats ner. Ladda om för att uppdatera nu, eller automatiskt när du stänger Modrinth App."
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} är tillgänglig. Använd din pakethanterare för att uppdatera och få tillgång till de senaste funktionerna och buggfixarna!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} är nu tillgänglig! Eftersom du använder ett nätverk med datatrafikbegränsningar har vi inte laddat ner det automatiskt."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Ändringslogg"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Ladda ner ({size})"
},
"app.update-toast.download-page": {
"message": "Ladda ner"
},
"app.update-toast.downloading": {
"message": "Laddar ner..."
},
"app.update-toast.reload": {
"message": "Ladda om"
},
"app.update-toast.title": {
"message": "Uppdatering tillgänglig"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "Nedladdning slutförd"
},
"app.update-popup.reload": {
"message": "Kolla efter uppdateringar"
},
"app.update-popup.title": {
"message": "Uppdatering tillgänglig"
},
"app.update.complete-toast.text": {
"message": "Tryck här för att visa ändringsloggen."
},
@@ -230,12 +284,6 @@
"instance.edit-world.title": {
"message": "Redigera värld"
},
"instance.filter.disabled": {
"message": "Avaktiverade projekt"
},
"instance.filter.updates-available": {
"message": "Uppdateringar tillgängliga"
},
"instance.server-modal.address": {
"message": "Adress"
},
@@ -243,7 +291,7 @@
"message": "Namn"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft Server"
"message": "Minecraft-server"
},
"instance.server-modal.resource-pack": {
"message": "Resurs pack"
@@ -344,141 +392,9 @@
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} för Minecraft {game_version} är redan installerat"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} är redan installerad"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Ändra version"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installera"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installerar"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Hämtar modpack-versioner"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installerar ny version"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "För närvarande installerat"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Felsökningsinformation:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Hämtar modpack-detaljer"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spelversion"
},
"instance.settings.tabs.installation.install": {
"message": "Installera"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installation pågår"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} version"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kan inte hämta länkade modpack-detaljer. Vänligen kontrollera din internetanslutning."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} är inte tillgänglig för Minecraft {version}. Prova en annan modloader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Denna instans är länkad till ett modpack, men modpacket kunde inte hittas på Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Plattform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Ominstallera modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Ominstallerar modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Ominstallation kommer att återställa allt installerat eller modifierat innehåll till det som tillhandahålls av modpaketet och ta bort eventuella moddar eller innehåll som du har lagt till ovanpå den ursprungliga installationen. Detta kan åtgärda oväntat beteende om ändringar har gjorts i instansen, men om dina världar nu är beroende av ytterligare installerat innehåll kan det skada befintliga världar."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Är du säker att du vill ominstallera denna instans?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Återställer instansens innehåll till dess ursprungliga tillstånd och tar bort eventuella moddar eller innehåll som du har lagt till ovanpå det ursprungliga modpaketet."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Ominstallera modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparera"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Reparerar"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparation installerar om Minecraft-beroenden och kontrollerar efter korruption. Detta kan åtgärda problem om spelet inte startar på grund av launcher-relaterade fel, men löser inte problem eller krascher som är relaterade till installerade mods."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Reparera instans?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Reparation pågår"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Återställ till nuvarande"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Visa alla versioner"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "ändra version"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "installera"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "ominstallera"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparera"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Kan inte {action} medans installationen pågår"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Kan inte {action} medans offline"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Kan inte {action} medans reparationen pågår"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(okänd version)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Ta bort koppling till instans"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Om du fortsätter kommer du inte kunna länka om den utan att skapa en helt ny instans. Du kommer inte längre att ta emot uppdateringar för modpacket och det kommer att bli en vanlig instans."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Är du säker att du vill ta bort koppling till denna instans?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Denna instans är kopplad till ett modpaket, vilket innebär att moddar inte kan uppdateras och mod-loader eller Minecraft version inte kan ändras. Att ta bort kopplingen kommer permanent att koppla bort denna instans från modpaketet."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Ta bort koppling från modpack"
},
"instance.settings.tabs.java": {
"message": "Java och minne"
},
@@ -551,6 +467,9 @@
"instance.worlds.incompatible_server": {
"message": "Servern är inkompatibel"
},
"instance.worlds.linked_server": {
"message": "Hanteras av serverprojekt"
},
"instance.worlds.no_contact": {
"message": "Servern kunde inte kontaktas"
},
@@ -586,5 +505,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Synkronisera med instansen"
},
"search.filter.locked.server": {
"message": "Tillhandahållet av servern"
},
"search.filter.locked.server-environment.title": {
"message": "Endast klient-sido moddar kan läggas till i serverinstansen"
},
"search.filter.locked.server-game-version.title": {
"message": "Spelversion tillhandahålls av servern"
},
"search.filter.locked.server-loader.title": {
"message": "Loader tillhandahålls av servern"
}
}
@@ -5,33 +5,15 @@
"app.modal.install-to-play.install-button": {
"message": "ติดตั้ง"
},
"app.modal.update-to-play.added-count": {
"message": "{count}เพิ่มแล้ว"
},
"app.modal.update-to-play.diff-type.added": {
"message": "เพิ่มแล้ว"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "ลบทิ้งแล้ว"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "อัปเดตแล้ว"
},
"app.modal.update-to-play.header": {
"message": "อัปเดตเพื่อเล่น"
},
"app.modal.update-to-play.removed-count": {
"message": "{count}ลบออกแล้ว"
},
"app.modal.update-to-play.update-required": {
"message": "ต้องมีการอัปเดต"
},
"app.modal.update-to-play.update-required-description": {
"message": "ต้องอัปเดตอย่างหนึ่งเพื่อเล่น {name}. โปรดอัปเดตให้เป็นเวอร์ชั่นล่าสุดเพื่อเปิดเกมใ"
},
"app.modal.update-to-play.updated-count": {
"message": "{count}อัปเดตแล้ว"
},
"app.settings.developer-mode-enabled": {
"message": "กำลังอยู่ในโหมดผู้พัฒนา"
},
@@ -59,39 +41,6 @@
"app.settings.tabs.resource-management": {
"message": "การจัดการทรัพยากร"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} พร้อมติดตั้งแล้ว! รีโหลดเพื่ออัปเดตทันที หรือจะอัปเดตอัตโนมัติเมื่อคุณปิดแอป"
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} ดาวน์โหลดเสร็จแล้ว! รีโหลดเพื่ออัปเดตทันที หรือจะอัปเดตอัตโนมัติเมื่อคุณปิดแอป"
},
"app.update-toast.body.linux": {
"message": "แอป Modrinth v{version} มีให้อัปเดตแล้ว. ใช้ Package Manager ของคุณเพื่ออัปเดตให้มีฟีเจอร์ใหม่และแก้ไข!"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} พร้อมให้ดาวน์โหลดแล้ว! เนื่องจากคุณกำลังใช้งานเครือข่ายที่มีการคิดค่าใช้จ่ายตามปริมาณข้อมูล ระบบจึงไม่ได้ดาวน์โหลดอัตโนมัติ"
},
"app.update-toast.changelog": {
"message": "บันทึกการเปลี่ยนแปลง"
},
"app.update-toast.download": {
"message": "ดาวน์โหลด ({size})"
},
"app.update-toast.download-page": {
"message": "ดาวน์โหลด"
},
"app.update-toast.downloading": {
"message": "กำลังดาวน์โหลด...."
},
"app.update-toast.reload": {
"message": "รีโหลด"
},
"app.update-toast.title": {
"message": "อัพเดตพร้อมแล้ว"
},
"app.update-toast.title.download-complete": {
"message": "ดาวน์โหลดเรียบร้อยแล้ว"
},
"app.update.complete-toast.text": {
"message": "คลิกที่นี่เพื่อดูบันทึกการเปลี่ยนแปลง"
},
@@ -200,12 +149,6 @@
"instance.edit-world.title": {
"message": "แก้ไขโลก"
},
"instance.filter.disabled": {
"message": "ปิดโปรเจ็ค"
},
"instance.filter.updates-available": {
"message": "พบอัพเดท"
},
"instance.server-modal.address": {
"message": "ที่อยู่เซิร์ฟเวอร์"
},
@@ -278,46 +221,7 @@
"instance.settings.tabs.installation": {
"message": "การติดตั้ง"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} สำหรับ Minecraft {game_version} ติดตั้งไว้อยู่แล้ว"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "เปลี่ยนเวอร์ชั่น"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "ติดตั้ง"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "กำลังติดตั้ง"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "กำลังติดตั้งเวอร์ชั่นใหม่"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "ติดตั้งอยู่"
},
"instance.settings.tabs.installation.game-version": {
"message": "เวอร์ชันของเกม"
},
"instance.settings.tabs.installation.install": {
"message": "ติดตั้ง"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "กำลังคิดตั้งอยู่"
},
"instance.settings.tabs.installation.loader-version": {
"message": "เวอร์ชั่น {loader}"
},
"instance.settings.tabs.installation.repair.button": {
"message": "ซ่อมแซม"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "กำลังซ่อมแซม"
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "ซ่อมแซมหรือไม่?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "กำลังซ่อมแซมอยู่ในขณะนี้"
}
}
+114 -195
View File
@@ -5,6 +5,72 @@
"app.auth-servers.unreachable.header": {
"message": "Doğrulama sunucularına erişilemedi"
},
"app.export-modal.description-placeholder": {
"message": "Mod paketi açıklaması yazın..."
},
"app.export-modal.export-button": {
"message": "Çıkart"
},
"app.export-modal.header": {
"message": "Modpaketi çıkart"
},
"app.export-modal.modpack-name-label": {
"message": "Modpaketi adı"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Modpaketi adı"
},
"app.export-modal.version-number-label": {
"message": "Sürüm numarası"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-header": {
"message": "Bu eylem geri alınamaz"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Yinede oluştur"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpaketi zaten kurulu"
},
"app.instance.mods.content-type-project": {
"message": "proje"
},
"app.instance.mods.copy-link": {
"message": "Bağlantıyı kopyala"
},
"app.instance.mods.installing": {
"message": "Kuruluyor..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaketi"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" eklendi"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projeler eklendi"
},
"app.instance.mods.share-text": {
"message": "Modpaketimde kullandığım projelere göz at!"
},
"app.instance.mods.show-file": {
"message": "Dosya göster"
},
"app.instance.mods.successfully-uploaded": {
"message": "Başarı ile yüklendi"
},
"app.instance.mods.unknown-version": {
"message": "Bilinmeyen"
},
"app.instance.mods.updating": {
"message": "Güncelleniyor..."
},
"app.modal.install-to-play.content-required": {
"message": "İçerik gerekli"
},
"app.modal.install-to-play.header": {
"message": "Yükleyip oynayın"
},
@@ -14,11 +80,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural,one {#mod}other {#modlar}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Bu sunucuda oynamak için modlar gerekiyor. İndir'e basarak gerekli dosyaları Modrinth üzerinden kurabilirsin."
"app.modal.install-to-play.required-modpack": {
"message": "Gerekli mod paketi"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} bugün senle bu Kurulumu paylaştı."
"app.modal.install-to-play.server-requires-mods": {
"message": "Bu sunucuya girebilmek için modlar gereklidir. Gerekli dosyaları Modrinth üzerinden kurmak için Yükle butonuna tıkla, ardından doğrudan sunucuya başlat."
},
"app.modal.install-to-play.shared-instance": {
"message": "Paylaşılan Kurulum"
@@ -26,26 +92,11 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Paylaşılan Sunucu Kurulumu"
},
"app.modal.update-to-play.added-count": {
"message": "{count} eklendi"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Eklendi"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Kaldırıldı"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Güncellendi"
"app.modal.install-to-play.view-contents": {
"message": "İçeriği görüntüle"
},
"app.modal.update-to-play.header": {
"message": "Oynamak için güncelleyin"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "{count} kaldırıldı"
"message": "Oynamak için güncelle"
},
"app.modal.update-to-play.update-required": {
"message": "Güncelleme gerekli"
@@ -53,9 +104,6 @@
"app.modal.update-to-play.update-required-description": {
"message": "{name} oyununu oynamak için güncelleme gereklidir. Oyunu başlatmak için lütfen en son sürüme güncelleyin."
},
"app.modal.update-to-play.updated-count": {
"message": "{count} güncellendi"
},
"app.settings.developer-mode-enabled": {
"message": "Geliştirici modu açıldı."
},
@@ -83,41 +131,35 @@
"app.settings.tabs.resource-management": {
"message": "Kaynak yönetimi"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} indirilmeye hazır! Şimdi güncellemek için uygulamayı yeniden yükleyin ya da veya Modrinth App'i kapattığınızda otomatik olarak güncellensin."
"app.update-popup.body": {
"message": "Modrinth App v{version} güncellemesi hazır! Hemen güncellemek için yeniden yükle veya Modrinth Appi kapattığında otomatik olarak güncellenecek."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} indirildi. Şimdi güncellemek için uygulamayı yeniden yükleyin ya da Modrinth App'i kapattığınızda otomatik olarak güncellensin."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} indirildi. Güncellemek için sayfayı yeniden yükle veya Modrinth Appi kapattığında otomatik olarak güncellenecek."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} sürümü kullanılabilir. En yeni özellikler ve düzeltmeler için paket yöneticinizi kullanarak güncelleyin!"
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} yayımlandı. En yeni özellikler ve hata düzeltmeleri için paket yöneticin üzerinden güncelle!"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} artık mevcut! Ölçülü ağda olduğunuzdan otomatik olarak indirmedik."
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} artık mevcut! Ölçüllü blantıda olduğunuzdan otomatik olarak indirmedik."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Değişiklikler"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "İndir ({size})"
},
"app.update-toast.download-page": {
"message": "İndir"
"app.update-popup.download-complete": {
"message": "İndirme tamamlandı"
},
"app.update-toast.downloading": {
"message": "İndiriliyor..."
"app.update-popup.reload": {
"message": "Yeniden yükle"
},
"app.update-toast.reload": {
"message": "Yeniden Yükle"
},
"app.update-toast.title": {
"app.update-popup.title": {
"message": "Güncelleme mevcut"
},
"app.update-toast.title.download-complete": {
"message": "Yükleme tamamlandı"
},
"app.update.complete-toast.text": {
"message": "Değişiklik günlüğünü görüntülemek için buraya tıklayın."
"message": "Değişiklikleri görüntülemek için buraya tıklayın."
},
"app.update.complete-toast.title": {
"message": "{version} sürümü başarıyla kuruldu!"
@@ -230,12 +272,6 @@
"instance.edit-world.title": {
"message": "Dünyayı düzenle"
},
"instance.filter.disabled": {
"message": "Devre dışı projeler"
},
"instance.filter.updates-available": {
"message": "Güncelleme var"
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -258,7 +294,7 @@
"message": "Profili sil"
},
"instance.settings.tabs.general.delete.description": {
"message": "Profili, içindeki dünyaları, ayarları ve indirilen şeyleri cihazından sonsuza kadar siler. Bir profil silindikten sonra geri dönüşü yok. Dikkatli ol."
"message": "Profili, içindeki dünyaları, ayarları ve indirilen şeyleri cihazınızdan sonsuza kadar siler. Dikkatli olun, bir profil silindikten sonra geri alınamaz."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Siliniyor..."
@@ -288,7 +324,7 @@
"message": "Simge seç"
},
"instance.settings.tabs.general.library-groups": {
"message": "Gruplar"
"message": "Kütüphane grupları"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Yeni grup oluştur"
@@ -312,173 +348,41 @@
"message": "Kancalar gelişmiş kullanıcıların oyunu başlattıktan önce ve sonra belirli sistem komutları çalıştırmasını sağlar."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Çıkış-sonrası"
"message": "Çıkış sonrası"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Oyun kapandıktan sonra çalışır."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Çıkış-sonrası komutu gir..."
"message": "Çıkış sonrası komutu girin..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Başlatma-öncesi"
"message": "Başlatma öncesi"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Oyunu başlatmadan önce çalıştırır."
"message": "Oyun başlatılmadan önce çalıştırılır."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Başlatma-öncesi komutu gir..."
"message": "Başlatma öncesi komutu girin..."
},
"instance.settings.tabs.hooks.title": {
"message": "Oyun başlatma kancaları"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Örtü"
"message": "Sarmalayıcı"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Minecraft başlatmak için örtü komutu."
"message": "Minecraft'ı başlatmak için sarmalayıcı komutu."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Örtü komutunu girin..."
"message": "Sarmalayıcı komutu girin..."
},
"instance.settings.tabs.installation": {
"message": "Kurulum"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Minecraft {game_version} için {platform} {version} zaten kurulmuş"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} zaten kurulu"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Sürüm değiştir"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Kur"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Kuruluyor"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Mod paketi sürümleri çekiliyor"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Yeni sürüm kuruluyor"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Şu an kurulu"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Ayıklama bilgisi:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Mod paketi detayları çekiliyor"
},
"instance.settings.tabs.installation.game-version": {
"message": "Oyun sürümü"
},
"instance.settings.tabs.installation.install": {
"message": "Kur"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Kurulum üzerinde çalışılıyor"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} sürümü"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Bağlı mod paketi detayları çekilemiyor. Lütfen internet bağlantınızı kontrol edin."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader}, Minecraft {version} için mevcut değil. Başka bir mod yükleyici deneyin."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Bu profil bir mod paketine bağlı ama o mod paketi Modrinth'te bulunamıyor."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Mod paketini yeniden kur"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Mod paketi yeniden kuruluyor"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Yeniden kurmak mod paketindeki indirilmiş veya değiştirilmiş her şeyi mod paketinin sağladıklarına sıfırlar, senin mod paketinin üstüne eklediğin modları ve içerikleri siler. Bu değişiklik kaynaklı beklenmedik durumları düzeltebilir, ama dünyaların ek kurulmuş içeriğe bağımlıysa o dünyaları bozabilir."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Bu kurulumu tekrar kurmak istediğine emin misin?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Kurulumun içeriğini ilk hâline geri döndürür, orijinal mod paketinin üstüne eklediğin modları ve içerikleri siler."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Mod paketini yeniden kur"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Tamir Et"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Tamir Ediliyor"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Tamir etmek Minecraft dosyalarını tekrar indirir ve bozulma varmı diye kontrol eder. Bu oyunun başlatıcısı ile ilgili bazı sorunları çözebilir ama indirilen modlar ile alakalı sorunları çözemez."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Tamir Edilsinmi?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Tamir ediliyor"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Mevcut olana sıfırla"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Bütün sürümleri göster"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "sürümü değiştir"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "indirilemez"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "yeniden kur"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "tamir edilemez"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "İndirirken {action}"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Çevrimdışı iken {action}"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Tamir edilirken {action}"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(bilinmeyen sürüm)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Kurulum bağlantısını kes"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Devam edersen bu kurulumu geri bağlayamazsın. Mod paketi güncellemeleri almazsın ve bu kurulum normal kuruluma dönüşür."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Bu kurulumun bağını koparmak istediğine eminmisin?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Bu kurulum bir mod paketine bağlı, bu nedenle modlar güncellenemez ve mod yükleyicisini veya Minecraft sürümünü değiştiremezsin. Kurulumdan mod paketini koparmak kalıcıdır."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Mod paketi bağını kopar"
},
"instance.settings.tabs.java": {
"message": "Java ve bellek"
},
@@ -551,6 +455,9 @@
"instance.worlds.incompatible_server": {
"message": "Sunucu uyumlu değil"
},
"instance.worlds.linked_server": {
"message": "Sunucu projesi tarafından yönetilmektedir"
},
"instance.worlds.no_contact": {
"message": "Sunucuya erişilemedi"
},
@@ -586,5 +493,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Kurulumla senkronize et"
},
"search.filter.locked.server": {
"message": "Sunucu tarafından sağlanmıştır"
},
"search.filter.locked.server-environment.title": {
"message": "Sunucu örneğine yalnızca istemci tarafında çalışan modlar eklenebilir"
},
"search.filter.locked.server-game-version.title": {
"message": "Oyun sürümü sunucu tarafından sağlanıyor"
},
"search.filter.locked.server-loader.title": {
"message": "Yükleyici sunucu tarafından sağlanıyor"
}
}
+129 -186
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "Не вдається зв’язатися зі серверами автентифікації"
},
"app.export-modal.description-placeholder": {
"message": "Уведіть опис збірки…"
},
"app.export-modal.export-button": {
"message": "Експортувати"
},
"app.export-modal.header": {
"message": "Експортувати збірку"
},
"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": "Номер версії"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Усі дані вашого профілю будуть видалені назавжди, включно з вашими світами, конфігураціями та усім встановленим контентом."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Ця дія є незворотною"
},
"app.instance.confirm-delete.delete-button": {
"message": "Видалити профіль"
},
"app.instance.confirm-delete.header": {
"message": "Видалити профіль"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Цю збірку вже встановлено в профілі «{instanceName}»."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Дублікат збірки"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Все одно створити"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Перейти до профілю"
},
"app.instance.modpack-already-installed.header": {
"message": "Збірку вже встановлено"
},
"app.instance.mods.content-type-project": {
"message": "проєкт"
},
"app.instance.mods.copy-link": {
"message": "Копіювати посилання"
},
"app.instance.mods.installing": {
"message": "Установлення…"
},
"app.instance.mods.modpack-fallback": {
"message": "Збірка"
},
"app.instance.mods.project-was-added": {
"message": "«{name}» було додано"
},
"app.instance.mods.projects-were-added": {
"message": "{count} проєктів було додано"
},
"app.instance.mods.share-text": {
"message": "Погляньте на проєкти, які я використовую у своїй збірці!"
},
"app.instance.mods.share-title": {
"message": "Поширення вмісту збірки"
},
"app.instance.mods.show-file": {
"message": "Показати файл"
},
"app.instance.mods.successfully-uploaded": {
"message": "Успішно вивантажено"
},
"app.instance.mods.unknown-version": {
"message": "Невідомо"
},
"app.instance.mods.updating": {
"message": "Оновлення…"
},
"app.modal.install-to-play.content-required": {
"message": "Потрібний уміст"
},
"app.modal.install-to-play.header": {
"message": "Установлення для гри"
},
@@ -14,11 +104,11 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# мод} few {# мода} other {# модів}}"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Для гри на цьому сервері потрібні моди. Натисніть «Установити», щоб завантажити необхідні файли з Modrinth."
"app.modal.install-to-play.required-modpack": {
"message": "Потрібна збірка"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} ділиться цим профілем з вами."
"app.modal.install-to-play.server-requires-mods": {
"message": "Для гри на цьому сервері потрібні моди. Натисніть «Установити», щоб налаштувати необхідні файли з Modrinth, а потім запустіть безпосередньо на сервері."
},
"app.modal.install-to-play.shared-instance": {
"message": "Профіль"
@@ -26,36 +116,18 @@
"app.modal.install-to-play.shared-server-instance": {
"message": "Серверний профіль"
},
"app.modal.update-to-play.added-count": {
"message": одано {count}"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Додано"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Видалено"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Оновлено"
"app.modal.install-to-play.view-contents": {
"message": ивитися вміст"
},
"app.modal.update-to-play.header": {
"message": "Оновлення перед грою"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "Видалено {count}"
},
"app.modal.update-to-play.update-required": {
"message": "Необхідне оновлення"
},
"app.modal.update-to-play.update-required-description": {
"message": "«{name}» потребує оновлення, щоб грати. Будь ласка, оновіть гру до останньої версії, щоб запустити її."
},
"app.modal.update-to-play.updated-count": {
"message": "Оновлено {count}"
},
"app.settings.developer-mode-enabled": {
"message": "Увімкнено режим розробника."
},
@@ -83,39 +155,33 @@
"app.settings.tabs.resource-management": {
"message": "Керування ресурсами"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} готовий до встановлення! Перезапустіть, щоб оновити зараз. Або, оновлення буде здійснено автоматично, коли закриєте Modrinth App."
"app.update-popup.body": {
"message": "Modrinth App v{version} готовий до встановлення! Перезапустіть, щоб оновити зараз. Або, оновлення буде здійснено автоматично, коли закриєте застосунок Modrinth."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} завантажено. Перезапустіть зараз, щоб оновити застосунок, або оновлення відбудеться автоматично після закриття Modrinth App."
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} завантажено. Перезапустіть зараз, щоб оновити його, або це відбудеться автоматично після закриття Modrinth App."
},
"app.update-toast.body.linux": {
"message": "Доступна версія Modrinth App {version}. Скористайтеся вашим менеджером пакетів, щоб отримати найновіші функції та виправлення!"
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} вже доступно. Скористайтеся вашим менеджером пакетів, щоб отримати найновіші функції та виправлення!"
},
"app.update-toast.body.metered": {
"message": "Версія {version} Modrinth App доступна для завантаження! Оскільки ви на лімітному з’єднанні, ми не завантажили її автоматично."
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} доступний для завантаження! Оскільки ви на лімітному з’єднанні, ми не завантажили його автоматично."
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "Журнал змін"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Завантажити ({size})"
},
"app.update-toast.download-page": {
"message": "Завантажити"
},
"app.update-toast.downloading": {
"message": "Завантаження…"
},
"app.update-toast.reload": {
"message": "Перезапустити"
},
"app.update-toast.title": {
"message": "Доступне оновлення"
},
"app.update-toast.title.download-complete": {
"app.update-popup.download-complete": {
"message": "Завантаження завершено"
},
"app.update-popup.reload": {
"message": "Перезавантажити"
},
"app.update-popup.title": {
"message": "Доступне оновлення"
},
"app.update.complete-toast.text": {
"message": "Натисніть тут, щоб переглянути журнал змін."
},
@@ -129,7 +195,7 @@
"message": "Завантаження оновлення ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Перезапустіть, аби встановити оновлення"
"message": "Перезавантажте, щоб установити оновлення"
},
"friends.action.add-friend": {
"message": "Додати друга"
@@ -230,12 +296,6 @@
"instance.edit-world.title": {
"message": "Редагувати світ"
},
"instance.filter.disabled": {
"message": "Вимкнені проєкти"
},
"instance.filter.updates-available": {
"message": "Оновлення доступні"
},
"instance.server-modal.address": {
"message": "Адреса"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Інсталяція"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} для Minecraft {game_version} вже встановлено"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Ванільна {game_version} вже встановлена"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Змінити версію"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Установити"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Установлення"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Отримання версій збірки"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Установлення нової версії"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Наразі встановлено"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Інформація налагодження:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Отримання деталей збірки"
},
"instance.settings.tabs.installation.game-version": {
"message": "Версія гри"
},
"instance.settings.tabs.installation.install": {
"message": "Установити"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Установлення триває"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Версія {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Не вдається отримати деталі пов’язаної збірки. Будь ласка, перевірте ваше з’єднання з інтернетом."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} недоступний для Minecraft {version}. Спробуйте інший завантажувач модів."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Цей профіль пов’язаний зі збіркою, проте саму збірку не вдалося знайти на Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Платформа"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Перевстановити збірку"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Перевстановлення збірки"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Перевстановлення скине ввесь доданий або модифікований уміст до наданого збіркою, прибираючи будь-які додатково встановлені вами моди чи вміст. Якщо ви змінювали профіль, це може виправити непередбачувану поведінку, однак, якщо ваші світи залежать від додаткового вмісту, світи можуть пошкодитися."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Ви впевнені, що хочете перевстановити цей профіль?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Скидає вміст профілю до початкового стану, прибираючи будь-які моди чи вміст, що було додано поверх оригінальної збірки."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Перевстановити збірку"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Полагодити"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Лагодження"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Відновлення перевстановлює залежності Minecraft та перевіряє їх на наявність пошкоджень. Це може розв’язати проблеми, якщо ваша гра не запускається через помилки запускача, але не розв’яже проблеми або збої, пов’язані зі встановленими модами."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Відновити профіль?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Лагодження триває"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Скинути до поточного"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Показати всі версії"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "змінити версію"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "установити"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "перевстановити"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "полагодити"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Неможливо {action} під час установлення"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Неможливо {action} без з’єднання з інтернетом"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Неможливо {action} під час лагодження"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(невідома версія)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Відв’язати профіль"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Якщо ви продовжите, ви не зможете повторно підв’язати його без створення повністю нового профілю. Ви більше не будете отримувати оновлення збірки та цей профіль стане звичайним."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Ви впевнені, що хочете відв’язати цей профіль?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Цей профіль пов’язаний зі збіркою, тобто, не можна оновлювати моди та не можна змінювати завантажувач чи версію Minecraft. Відв’язання призведе до остаточного від’єднання цього профілю від збірки."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Відв’язати від збірки"
},
"instance.settings.tabs.java": {
"message": "Java та пам’ять"
},
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Сервер несумісний"
},
"instance.worlds.linked_server": {
"message": "Керується серверним проєктом"
},
"instance.worlds.no_contact": {
"message": "Не вдалося зв’язатися зі сервером"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "Синхронізувати з профілем"
},
"search.filter.locked.server": {
"message": "Надано сервером"
},
"search.filter.locked.server-environment.title": {
"message": "До профілю сервера можна додавати лише клієнтські моди"
},
"search.filter.locked.server-game-version.title": {
"message": "Версія гри надана сервером"
},
"search.filter.locked.server-loader.title": {
"message": "Завантажувач наданий сервером"
}
}
+174 -171
View File
@@ -5,6 +5,129 @@
"app.auth-servers.unreachable.header": {
"message": "Không thể kết nối đến máy chủ xác thực"
},
"app.export-modal.description-placeholder": {
"message": "Thêm miêu tả cho gói modpack..."
},
"app.export-modal.export-button": {
"message": "Xuất"
},
"app.export-modal.header": {
"message": "Xuất modpack"
},
"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": "Chọn tệp và gói để thêm vào gói tài nguyên"
},
"app.export-modal.version-number-label": {
"message": "Phiên bản"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Tất cả dữ liệu trong gói hồ sơ này sẽ bị xoá, bao gồm thế giới của bạn, cấu hình, và tất cả nội dung đã được tải xuống."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Hành động này sẽ không thể huỷ bỏ"
},
"app.instance.confirm-delete.delete-button": {
"message": "Xoá hồ sơ"
},
"app.instance.confirm-delete.header": {
"message": "Xoá hồ sơ"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Modpack này đã được cài đặt trong phiên chơi \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Nhân bản modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Vẫn tiếp tục tạo"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Đi đến phiên chơi"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack đã được cài đặt"
},
"app.instance.mods.content-type-project": {
"message": "Dự án"
},
"app.instance.mods.copy-link": {
"message": "Sao chép liên kết"
},
"app.instance.mods.installing": {
"message": "Đang tải xuống..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" đã được thêm"
},
"app.instance.mods.projects-were-added": {
"message": "{count} dự án đã được thêm"
},
"app.instance.mods.share-text": {
"message": "Kiểm tra dự án tôi đang sử dụng trong modpack của mình!"
},
"app.instance.mods.share-title": {
"message": "Chia sẻ hồ sơ modpack"
},
"app.instance.mods.show-file": {
"message": "Hiện tệp"
},
"app.instance.mods.successfully-uploaded": {
"message": "Tải lên thành công"
},
"app.instance.mods.unknown-version": {
"message": "Không rõ"
},
"app.instance.mods.updating": {
"message": "Đang cập nhật..."
},
"app.modal.install-to-play.content-required": {
"message": "Nội dung bắt buộc"
},
"app.modal.install-to-play.header": {
"message": "Tải xuống để chơi"
},
"app.modal.install-to-play.install-button": {
"message": "Tải xuống"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# mod} other {# mods}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Yêu cầu modpack"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Máy chủ này yêu cầu mod để có thể chơi. Vui lòng ấn vào tải xuống và tải các tệp bắt buộc từ Modrinth và khởi chạy trực tiếp để tham gia máy chủ."
},
"app.modal.install-to-play.shared-instance": {
"message": "Chia sẻ hồ sơ"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Chia sẻ hồ sơ máy chủ"
},
"app.modal.install-to-play.view-contents": {
"message": "Xem nội dung"
},
"app.modal.update-to-play.header": {
"message": "Cập nhật và bắt đầu chơi"
},
"app.modal.update-to-play.update-required": {
"message": "Yêu cầu cập nhật"
},
"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.settings.developer-mode-enabled": {
"message": "Chế độ nhà phát triển đã được bật."
},
@@ -15,7 +138,7 @@
"message": "Giao diện"
},
"app.settings.tabs.default-instance-options": {
"message": "Tuỳ chọn bản hiện thể mặc định"
"message": "Tuỳ chọn hồ sơ khởi chạy mặc định"
},
"app.settings.tabs.feature-flags": {
"message": "Các cờ tính năng"
@@ -32,35 +155,35 @@
"app.settings.tabs.resource-management": {
"message": "Quản lý tài nguyên"
},
"app.update-toast.body": {
"message": "Modrinth phiên bản v{version} đã sẵn sằng! Chạy lại để cập nhật ngay bây giờ, hoặc cập nhật tự động khi bạn đóng Modrinth."
"app.update-popup.body": {
"message": "Phiên bản v{version} của Modrinth đã được chuẩn bị để cài đặt! Khởi động lại ứng dụng để cập nhật ngay bây giờ, hoặc cập nhật tự động khi bạn đóng Modrinth."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth phiên bản v{version} đã tải xuống hoàn tất. Chạy lại để cập nhật ngay bây giờ, hoặc tự động cập nhật khi bạn thoát Modrinth."
"app.update-popup.body.download-complete": {
"message": "Phiên bản v{version} của Modrinth đã sẵn sàng để có thể cài đặt. Khởi động lại ứng dụng để cập nhật ngay bây giờ, hoặc tự động cập nhật sau khi bạn tt Modrinth."
},
"app.update-toast.body.metered": {
"message": "Modrinth phiên bản v{version} đang có sẵn! Do mạng của bạn đang tính phí theo dung lượng và có định mức, chúng tôi không tải phiên bản này tự động."
"app.update-popup.body.linux": {
"message": "Phiên bản v{version} của Modrinth hiện đang khả dụng. Hãy sử dụng tnh quản lý gói của bạn để cập nhật các tính năng và bản vá lỗi mới nhất!"
},
"app.update-toast.changelog": {
"app.update-popup.body.metered": {
"message": "Phiên bản v{version} của Modrinth hiện đang khả dụng ngay bây giờ! Vì bạn đang sử dụng mạng có tính phí theo dung lượng nên chúng tôi không tự động tải xuống."
},
"app.update-popup.changelog": {
"message": "Nhật ký thay đổi"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "Tải xuống ({size})"
},
"app.update-toast.downloading": {
"message": "Đang tải xuống..."
"app.update-popup.download-complete": {
"message": "Cài đặt thành công"
},
"app.update-toast.reload": {
"message": "Tải lại"
"app.update-popup.reload": {
"message": "Khởi động lại"
},
"app.update-toast.title": {
"message": "Có bản cập nhật mới"
},
"app.update-toast.title.download-complete": {
"message": "Đã tải xuống xong"
"app.update-popup.title": {
"message": "Cập nhật mới hiện đang khả dụng"
},
"app.update.complete-toast.text": {
"message": "Nháy vào đây để xem nhật kí thay đổi."
"message": "Nhấn vào đây để xem nhật kí thay đổi."
},
"app.update.complete-toast.title": {
"message": "Phiên bản {version} đã được cài đặt thành công!"
@@ -72,7 +195,7 @@
"message": "Đang tải xuống bản cập nhật ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Hãy tải lại để cài đặt bản cập nhật"
"message": "Hãy khởi động lại để cài đặt bản cập nhật"
},
"friends.action.add-friend": {
"message": "Thêm một người bạn"
@@ -96,19 +219,19 @@
"message": "Tên người dùng Modrinth của bạn của bạn là gì?"
},
"friends.add-friends-to-share": {
"message": "Hãy <link>Thêm bạn bè</link> để biết họ đang chơi gì!"
"message": "Hãy <link>thêm bạn bè</link> để biết họ đang chơi gì!"
},
"friends.friend.cancel-request": {
"message": "Huỷ yêu cầu"
},
"friends.friend.remove-friend": {
"message": "Loại bỏ bạn bè"
"message": "Xoá bạn bè"
},
"friends.friend.request-sent": {
"message": "Đã gửi yêu cầu kết bạn"
},
"friends.friend.view-profile": {
"message": "Xem hồ sơ"
"message": "Xem thông tin"
},
"friends.heading": {
"message": "Bạn bè"
@@ -171,13 +294,7 @@
"message": "Đặt lại biểu tượng"
},
"instance.edit-world.title": {
"message": "Sửa th giới"
},
"instance.filter.disabled": {
"message": "Các dự án bị tắt"
},
"instance.filter.updates-available": {
"message": "Có bản cập nhật mới"
"message": "Chỉnh sửa thế giới"
},
"instance.server-modal.address": {
"message": "Địa chỉ"
@@ -195,28 +312,28 @@
"message": "Tổng quát"
},
"instance.settings.tabs.general.delete": {
"message": "Xoá hiện thể"
"message": "Xoá hồ sơ"
},
"instance.settings.tabs.general.delete.button": {
"message": "Xoá hiện thể"
"message": "Xoá hồ sơ"
},
"instance.settings.tabs.general.delete.description": {
"message": "Xoá vĩnh viễn bản này khỏi thiết bị, bao gồm thế giới, cài đặt, và các nội dung được cài đặt khác. Hãy cân nhắc vì bạn không thể khôi phục sau khi xoá."
"message": "Xoá vĩnh viễn sẽ xoá toàn bộ thế giới, cài đặt, và các nội dung được cài đặt khỏi thiết bị của bạn. Hãy cân nhắc và chắc chắn vì bạn không thể khôi phục các tệp dữ liệt sau khi xoá."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Đang xoá..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Nhân đôi"
"message": "Nhân bản"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Không thể nhân đôi trong khi đang cài đặt."
"message": "Không thể nhân bản trong khi đang cài đặt."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Sao đôi hiện thể"
"message": "Nhân bản hồ sơ"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Tạo ra một bản sao của hiện thể này, bao gồm các thế giới, cấu hình, mod, v.v.."
"message": "Tạo ra một bản sao của hồ sơ này, bao gồm các thế giới, cấu hình, mod, v.v."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Sửa biểu tượng"
@@ -287,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "Cài đặt"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} cho Minecraft {game_version} đã được cài đặt"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} đã được cài đặt"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Thay đổi phiên bản"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Cài đặt"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Đang cài đặt"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Đang tìm phiên bản modpack"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Cài đặt phiên bản mới"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Đã cài đặt"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Thông tin gỡ lỗi:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Đang tìm chi tiết của modpack"
},
"instance.settings.tabs.installation.game-version": {
"message": "Phiên bản trò chơi"
},
"instance.settings.tabs.installation.install": {
"message": "Cài đặt"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Đang cài đặt"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Phiên bản {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Không thể hiện chi tiết modpack đã liên kết. Vui lòng kiểm tra kết nối mạng."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} không khả dụng cho Minecraft {version}. Hãy thử mod loader khác."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Phiên bản này đã được liên kết với modpack, nhưng không thể tìm thấy modpack trên Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Nền tảng"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Cài lại gói mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Đang cài lại gói mod"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Cài đặt lại sẽ reset tất cả nội dung đã cài đặt hoặc thay đổi được cung cấp bởi modpack đó, đồng thời xóa các mods hoặc nội dung mà bạn đã thêm vào sau khi cài đặt lúc ban đầu. Thao tác này có thể khắc phục các lỗi phát sinh nếu phiên bản bị thay đổi, nhưng thế giới của bạn có thể bị lỗi nếu chúng phụ thuộc vào nội dung bạn đã tải."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Bạn có chắc là bạn muốn tải lại phiên bản này không?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Đặt lại bản cài đặt này về phiên bản ban đầu, xoá các mod và nội dung bạn đã cài đặt đè lên modpack gốc."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Cài lại gói mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Sửa chửa"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Đang sửa chữa"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Trình Sửa lỗi sẽ cài đặt lại các tệp phụ thuộc của Minecraft và kiểm tra các lỗi hư hại dữ liệu. Hành động này có thể khắc phục sự cố nếu trò chơi không khởi chạy được do lỗi trình khởi động, nhưng sẽ không giải quyết được các vấn đề hoặc sự cố sập game liên quan đến các bản mod đã cài đặt."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Sửa chữa phiên bản?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Đang sửa chữa"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Cài đặt lại về trạng thái ban đầu"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Hiện tất cả phiên bản"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "thay đổi phiên bản"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "cài đặt"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "cài lại"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "sửa chửa"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Không thể {action} trong khi đang cài đặt"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Không thể {action} khi không có mạng"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Không thể {action} khi đang sửa chữa"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(phiên bản không rõ)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Xóa liên kết phiên bản"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Nếu tiếp tục, bạn sẽ không thể liên kết nó lại mà phải tạo một bản mới. Bạn sẽ không nhận được các bản cập nhật của modpack và nó sẽ trở lại bình thường."
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "Bạn có chắc là bạn muốn xóa liên kết phiên bản này không?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Phiên bản này được liên kết với một modpack, nghĩa là bạn không thể cập nhật mod cũng như thay đổi mod loader hoặc phiên bản Minecraft. Nếu hủy liên kết, phiên bản này sẽ bị ngắt kết nối vĩnh viễn khỏi modpack."
},
"instance.settings.tabs.installation.unlink.title": {
"message": "Hủy liên kết khỏi modpack"
},
"instance.settings.tabs.java": {
"message": "Java và bộ nhớ"
},
@@ -438,7 +423,7 @@
"message": "Bản cài đặt Java"
},
"instance.settings.tabs.java.java-memory": {
"message": "Bộ nhớ cấp phát"
"message": "Bộ nhớ phân bổ"
},
"instance.settings.tabs.window": {
"message": "Cửa sổ"
@@ -494,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "Máy chủ không tương thích"
},
"instance.worlds.linked_server": {
"message": "Quản lý dự án máy chủ"
},
"instance.worlds.no_contact": {
"message": "Không thể liên lạc với máy chủ"
},
@@ -522,9 +510,24 @@
"message": "Được cung cấp bởi phiên bản"
},
"search.filter.locked.instance-game-version.title": {
"message": "Phiên bản trò chơi được cung cấp bởi instance này"
"message": "Phiên bản trò chơi được cung cấp bởi hồ sơ này"
},
"search.filter.locked.instance-loader.title": {
"message": "Loader được cung cấp bởi hồ sơ"
},
"search.filter.locked.instance.sync": {
"message": "Đồng bộ với phiên bản"
},
"search.filter.locked.server": {
"message": "Do máy chủ cung cấp"
},
"search.filter.locked.server-environment.title": {
"message": "Chỉ các mod chạy phía client mới có thể thêm hồ sơ máy chủ"
},
"search.filter.locked.server-game-version.title": {
"message": "Phiên bản trò chơi được cung cấp bởi máy chủ"
},
"search.filter.locked.server-loader.title": {
"message": "Loader được cung cấp bởi máy chủ"
}
}
+127 -184
View File
@@ -5,6 +5,96 @@
"app.auth-servers.unreachable.header": {
"message": "无法连接到身份验证服务器"
},
"app.export-modal.description-placeholder": {
"message": "输入整合包描述……"
},
"app.export-modal.export-button": {
"message": "导出"
},
"app.export-modal.header": {
"message": "导出整合包"
},
"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": "版本号"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "你实例的所有数据将被永久删除,包括你的世界、配置和所有已安装的内容。"
},
"app.instance.confirm-delete.admonition-header": {
"message": "此操作无法撤销"
},
"app.instance.confirm-delete.delete-button": {
"message": "删除实例"
},
"app.instance.confirm-delete.header": {
"message": "删除实例"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "这个整合包已经安装在\"{instanceName}\"实例中了。"
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "重复的整合包"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "在任何地方创建"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "前往实例"
},
"app.instance.modpack-already-installed.header": {
"message": "整合包已安装"
},
"app.instance.mods.content-type-project": {
"message": "项目"
},
"app.instance.mods.copy-link": {
"message": "复制链接"
},
"app.instance.mods.installing": {
"message": "正在安装……"
},
"app.instance.mods.modpack-fallback": {
"message": "整合包"
},
"app.instance.mods.project-was-added": {
"message": "已添加“{name}”"
},
"app.instance.mods.projects-were-added": {
"message": "已添加 {count} 个项目"
},
"app.instance.mods.share-text": {
"message": "查看在我整合包中使用的项目!"
},
"app.instance.mods.share-title": {
"message": "分享整合包内容"
},
"app.instance.mods.show-file": {
"message": "显示文件"
},
"app.instance.mods.successfully-uploaded": {
"message": "上传成功"
},
"app.instance.mods.unknown-version": {
"message": "未知"
},
"app.instance.mods.updating": {
"message": "更新中……"
},
"app.modal.install-to-play.content-required": {
"message": "内容需求"
},
"app.modal.install-to-play.header": {
"message": "安装以游玩"
},
@@ -14,48 +104,30 @@
"app.modal.install-to-play.mod-count": {
"message": "{count} 个模组"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "此服务器需要安装模组才能游玩。点击安装,从 Modrinth 下载所需文件。"
"app.modal.install-to-play.required-modpack": {
"message": "整合包需求"
},
"app.modal.install-to-play.shared-by-today": {
"message": "{name} 今天与你分享了这个实例。"
"app.modal.install-to-play.server-requires-mods": {
"message": "此服务器需要安装模组才能游玩。点击安装,从 Modrinth 下载所需文件,然后直接进入服务器。"
},
"app.modal.install-to-play.shared-instance": {
"message": "共享实例"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "共享服务端实例"
"message": "共享服务端实例"
},
"app.modal.update-to-play.added-count": {
"message": "添加了 {count} 项"
},
"app.modal.update-to-play.diff-type.added": {
"message": "已添加"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "已移除"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "已更新"
"app.modal.install-to-play.view-contents": {
"message": "查看内容"
},
"app.modal.update-to-play.header": {
"message": "更新以游玩"
},
"app.modal.update-to-play.published-date": {
"message": "{date, date, long}"
},
"app.modal.update-to-play.removed-count": {
"message": "移除了 {count} 项"
},
"app.modal.update-to-play.update-required": {
"message": "需要更新"
},
"app.modal.update-to-play.update-required-description": {
"message": "需要更新至最新版本才能运行 {name}。请更新后启动游戏。"
},
"app.modal.update-to-play.updated-count": {
"message": "更新了 {count} 项"
},
"app.settings.developer-mode-enabled": {
"message": "开发者模式已启用。"
},
@@ -83,38 +155,32 @@
"app.settings.tabs.resource-management": {
"message": "资源管理"
},
"app.update-toast.body": {
"app.update-popup.body": {
"message": "Modrinth App v{version} 更新已就绪!立即重启更新,或退出时自动安装。"
},
"app.update-toast.body.download-complete": {
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} 更新已下载完成!立即重启更新,或退出时自动安装。"
},
"app.update-toast.body.linux": {
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} 现已发布。请使用你的软件包管理器进行更新,获取最新功能与修复!"
},
"app.update-toast.body.metered": {
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} 现已发布!由于你正在使用按流量计费的网络,该更新未自动下载。"
},
"app.update-toast.changelog": {
"app.update-popup.changelog": {
"message": "更新日志"
},
"app.update-toast.download": {
"app.update-popup.download": {
"message": "下载({size}"
},
"app.update-toast.download-page": {
"message": "下载"
"app.update-popup.download-complete": {
"message": "下载完成"
},
"app.update-toast.downloading": {
"message": "下载中…"
},
"app.update-toast.reload": {
"app.update-popup.reload": {
"message": "重新启动"
},
"app.update-toast.title": {
"message": "有可用更新"
},
"app.update-toast.title.download-complete": {
"message": "下载完成"
"app.update-popup.title": {
"message": "有可用更新"
},
"app.update.complete-toast.text": {
"message": "点击此处查看更新日志。"
@@ -162,7 +228,7 @@
"message": "删除好友"
},
"friends.friend.request-sent": {
"message": "已发送好友请"
"message": "已发送好友请"
},
"friends.friend.view-profile": {
"message": "查看个人资料"
@@ -222,20 +288,14 @@
"message": "名称"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft 世界"
"message": "Minecraft 存档"
},
"instance.edit-world.reset-icon": {
"message": "重图标"
"message": "重图标"
},
"instance.edit-world.title": {
"message": "编辑存档"
},
"instance.filter.disabled": {
"message": "已禁用的项目"
},
"instance.filter.updates-available": {
"message": "有可用的更新"
},
"instance.server-modal.address": {
"message": "地址"
},
@@ -344,141 +404,9 @@
"instance.settings.tabs.installation": {
"message": "安装"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "适用于 Minecraft {game_version} 的 {platform} {version} 已安装"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "原版 {game_version} 已安装"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "切换版本"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "安装"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "安装中"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "正在获取整合包版本"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "正在安装新版本"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "当前已安装"
},
"instance.settings.tabs.installation.debug-information": {
"message": "调试信息:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "正在获取整合包详情"
},
"instance.settings.tabs.installation.game-version": {
"message": "游戏版本"
},
"instance.settings.tabs.installation.install": {
"message": "安装"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "正在安装"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} 版本"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "无法获取整合包详细信息。请检查网络连接。"
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} 不支持 Minecraft {version}。请尝试其他模组加载器。"
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "此实例与一个整合包相关联,但在 Modrinth 上无法找到该整合包。"
},
"instance.settings.tabs.installation.platform": {
"message": "平台"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "重新安装整合包"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "正在重新安装整合包"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "重新安装实例将重置所有已安装或修改的内容,并恢复整合包到初始状态,移除另外添加的所有内容。这样有可能修复因实例更改导致的异常,但如果你的世界依赖另外添加的内容,此举可能会损坏现有世界。"
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "你确定要重新安装该实例吗?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "将实例的内容重置为原始状态,移除你在原始整合包基础上添加的任何修改或内容。"
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "重新安装整合包"
},
"instance.settings.tabs.installation.repair.button": {
"message": "修复"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "修复中"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "修复会重新安装 Minecraft 依赖项并检查是否有损坏。如果你的游戏因启动器相关错误无法启动,这可能会解决问题,但不会解决与已安装模组相关的问题或崩溃。"
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "确定要修复该实例吗?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "正在修复"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "重置为当前版本"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "显示所有版本"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "切换版本"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "安装"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "重新安装"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "修复"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "安装时无法{action}"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "离线时无法{action}"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "修复时无法{action}"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(未知版本)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "取消实例关联"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "若继续操作,该实例将无法重新关联至原整合包,除非创建全新的实例。此后,不再接收整合包的任何更新,该实例变为普通实例。"
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "你确定要取消关联此版本吗?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "该实例已关联至整合包,因此无法单独更新模组,也无法更改模组加载器和 Minecraft 版本。解除关联后,该实例将无法重新关联至整合包。"
},
"instance.settings.tabs.installation.unlink.title": {
"message": "取消整合包关联"
},
"instance.settings.tabs.java": {
"message": "Java 及内存"
},
@@ -486,7 +414,7 @@
"message": "环境变量"
},
"instance.settings.tabs.java.hooks": {
"message": "钩子"
"message": "Hooks"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Java 参数"
@@ -551,6 +479,9 @@
"instance.worlds.incompatible_server": {
"message": "服务器不兼容"
},
"instance.worlds.linked_server": {
"message": "由服务器项目管理"
},
"instance.worlds.no_contact": {
"message": "无法连接服务器"
},
@@ -586,5 +517,17 @@
},
"search.filter.locked.instance.sync": {
"message": "与实例同步"
},
"search.filter.locked.server": {
"message": "由该服务器提供"
},
"search.filter.locked.server-environment.title": {
"message": "只能将客户端模组添加到服务器实例中"
},
"search.filter.locked.server-game-version.title": {
"message": "游戏版本由服务器提供"
},
"search.filter.locked.server-loader.title": {
"message": "加载器由服务器提供"
}
}

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