Compare commits

...
Author SHA1 Message Date
aecsocket 199b2b1fcf try fix ci? idk man 2026-02-18 04:52:17 +00:00
aecsocket 9849ffaa1f fix ci 2026-02-18 03:14:28 +00:00
aecsocket 43a7688b53 remove_documents more error logging 2026-02-18 02:45:49 +00:00
aecsocket 399529fdd8 Improve error logging in project delete route 2026-02-18 02:36:15 +00:00
Calum H.andGitHub 4be2f77bb0 feat: reimpl (#5386) 2026-02-17 18:51:30 +00:00
Prospector b3fbd884e0 changelog 2026-02-16 12:33:46 -08:00
Prospector 8c0edf669d new cpmstar ads.txt 2026-02-16 12:31:07 -08:00
f01c901445 Collection descriptions can get out of the collection's box (#5380)
* Collection descriptions can get out of the collection's box
Fixes #2281

* Update apps/frontend/src/pages/dashboard/collections.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-02-16 17:15:05 +00:00
Modrinth BotandGitHub 2a91fc31f1 New translations from Crowdin (main) (#5382) 2026-02-16 09:35:41 +00:00
Truman GaoandGitHub d1e4c1039f fix: project version page dependencies showing "unknown project" unless refresh (#5366)
* fix not updating stale dependencies

* remove console log

* fix wragnler json formatting

* add proper loading dependencies

* pnpm prepr

* move v-if
2026-02-14 00:31:17 +00:00
Michael H. 9432d6d5e8 deploy(ui): fix storybook routes 2026-02-13 01:24:42 +01:00
Michael H. c053c00bd7 deploy(ui): remove custom domain 2026-02-13 01:22:06 +01:00
Michael H. 9d0df74475 deploy(ui): add wrangler 2026-02-13 01:19:35 +01:00
Michael H. 09e989a4c4 deploy(ui): add wrangler config 2026-02-13 01:15:06 +01:00
Calum H.andGitHub d4ef5f36c3 devex: storybook build (#5364) 2026-02-13 01:06:33 +01:00
Calum H.andGitHub a9e0655859 fixes: withdraw flow tax check fix + checklist fix (#5360)
* fix: action bar overlap on checklist

* fix: tax form uses local currency not net usd
2026-02-12 13:29:21 +00:00
aecsocketandGitHub e7eb4899a1 Fix user deletion to update more tables (#5351)
* wip: fix user delete

* add wrap_errs

* delete more rows in user deletion

* sqlx prepare
2026-02-12 11:37:40 +00:00
76ba11d966 Settings ui fixes (#5352)
* Fix tabbed modal icon size

* Fix slider input being unstyled

* Refactor slider component to use ui components and tailwind

* Pnpm fix my beloved

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
2026-02-10 23:36:36 +00:00
Prospector f22e49e4f5 v 2026-02-09 16:23:27 -08:00
Prospector 3c1bd86dcc changelog 2026-02-09 16:22:55 -08:00
Prospector 4adbd0b843 changelog 2026-02-09 16:19:10 -08:00
Truman GaoandGitHub cec35dcb60 fix: project card preload on hover (#5348) 2026-02-09 23:37:58 +00:00
Calum H.andGitHub a536d795f3 devex: dead locales cleanup + i18n inspect tool (#5313)
* chore: remove old locales + just enable all locales now

* feat: debug panel for i18n + tooltips

* feat: dedupe

* fix: debugger for app

* fix: crowdin code mismatches

* fix: lint
2026-02-09 16:00:46 +00:00
Daniel (rotgruengelb)andGitHub e3e04931cf fix: collections-grid on profile page applied margin -bottom instead of -top. (#5346) 2026-02-09 15:56:52 +00:00
Prospector 3e505e0d96 changelog 2026-02-09 07:37:11 -08:00
Calum H.andGitHub dd4b054d95 fix: replace legacy timeouts with v-bind in navtab component (#5343)
* fix: dont use timeouts for navtabs

* fix: remove nexttick
2026-02-09 15:24:39 +00:00
e80d7730ca fix: preserve allowed iframe query parameters (#5295)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-02-09 15:17:37 +00:00
Prospector 0facf26b04 changelog 2026-02-09 07:13:34 -08:00
Calum H.andGitHub 37eac92329 refactor: migrate all input fields to StyledInput (#5306)
* feat: StyledInput component

* migrate: auth pages to styledInput

* migrate: search/filter inputs

* migrate: dashboard inputs

* migrate: app frontend

* migrate: search related inputs

* migrate: all of app-frontend

* fix: missing inputs on app-frontend

* migrate: frontend

* feat: multiline

* migrate: textareas

* fix: storybook use text-primary

* fix: lint

* fix: merge conflict

* feat: cleanup
2026-02-09 14:57:31 +00:00
Calum H.andGitHub 90438a1ad5 fix: invalidate tanstack caches on user auth (#5341)
* fix: invalidate tanstack caches on user auth

* refactor: clean up invalidate flow

* fix: lint
2026-02-09 14:43:33 +00:00
Calum H.andGitHub e962521492 feat: dynamic tax thresholds from backend (#5342)
* feat: dynamic tax thresholds from backend

* fix: lint & i18n
2026-02-09 14:42:38 +00:00
Calum H.andGitHub 45a397d52b fix: action button positioning on mobile (#5344) 2026-02-09 14:37:01 +00:00
d9d7750781 fix #5243: detect file data on multi-part uploads (#5331)
* fix modrinth/code#5243: detect file data on multi-part uploads

* fix return early not making handlingNewFiles = false

---------

Co-authored-by: Calum H. <calum@modrinth.com>
2026-02-09 12:55:39 +00:00
Modrinth BotandGitHub 1101e71fdd New translations from Crowdin (main) (#5339) 2026-02-09 10:19:58 +00:00
Prospector 34b4ae283e changelog 2026-02-08 17:19:42 -08:00
JerozgenandGitHub a8c5e036d0 Sort categories by translated name (#5307)
* Sort categories by translated name

* Use locale and numeric

* Remove @modrinth/ui import
2026-02-08 17:19:04 -08:00
ProspectorandGitHub 4eb0f0c206 Fix author name underline + fix gallery preference being broken (#5337) 2026-02-08 17:01:23 -08:00
Truman GaoandGitHub a3bc35c303 fix:icon too bright (#5335) 2026-02-08 16:59:00 -08:00
Prospector 57e012f9b7 Revert "Fix author name underline + hover icon brightness"
This reverts commit 8ab1895d8a.
2026-02-07 14:05:35 -08:00
Prospector 8ab1895d8a Fix author name underline + hover icon brightness 2026-02-07 13:51:18 -08:00
Prospector 13e5529f00 add project status to grid cards 2026-02-07 12:28:06 -08:00
Prospector 428efde36d proj card fixes 2026-02-07 12:05:59 -08:00
Prospector a978873bff changelog 2026-02-07 11:36:52 -08:00
b005c1f522 New project cards (#5298)
* New project card

* no shadow on icons

* Remove updated label

* reduce tag count to 5

* improve envs

* fix: project card bottom row not growing

* move actions in grid mode

* focus changes + new project list component

* Allow more tags in grid mode, deprioritize non-loader tags

* fix prod deploy robots.txt

* remove unused id

* App cards

* prepr

* publish date + fix router links

* fix author hover underline in firefox

* perf: preload on search item hover

* remove unused filter

* remove option for old grid view

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-02-07 11:18:59 -08:00
Prospector b6c22d6ca6 changelog 2026-02-07 10:28:59 -08:00
Calum H.andGitHub 50064c4ed6 qa: tech review 3 (#5250)
* fix: only collapse if pending -> pass/fail, not pass <-> fail

* feat: wrap in full details block

* feat: left badge

* feat: in mod queue -> in project queue

* fix: hash on malic modal

* feat: remove return to queue on indiv page

* fix: truncate in middle

* feat: bulk actions

* fix: reactivity problem

* feat: project page dropdown option

* feat: show metadata if exists

* fix: lint

* fix: qa problems

* feat: debug logging for malicious summary modal

* fix: lint

* qa: go back on bulk

* fix: reactive sets/maps -> refs

* fix: lint
2026-02-07 18:10:58 +00:00
ProspectorandGitHub 48248eafdc Fix app releases not being signed (#5317) 2026-02-06 23:19:40 +00:00
b34564a770 Fix editing project team member permissions (#5315)
* Fix editing project team member permissions

* prepare

* add success notifications

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-02-06 14:56:36 -08:00
ProspectorandGitHub d713cea180 fix instance page in app (#5316) 2026-02-06 14:53:57 -08:00
JerozgenandGitHub 695233e736 Add ICU select to report strings (#5312) 2026-02-06 18:27:55 +00:00
Calum H.andGitHub 8789d7b057 fix: 5258 (#5310)
* fix: 5258

* fix: lint
2026-02-06 18:21:41 +00:00
lumiscosityandGitHub 510ea6cde4 Enable support for Filipino, Indonesian, Korean, Dutch, and Vietnamese (#5305)
All five of these have now crossed 80% translation completion!

Signed-off-by: lumiscosity <averyrudelphe@gmail.com>
2026-02-05 14:52:38 +00:00
aecsocketandGitHub b1954be2c7 Ref-count Redis pool internals, fix project creation slug/ID collision (#5302)
* Ref-count Redis pool internals, fix project creation slug/ID collision

* cargo sqlx prepare
2026-02-05 05:18:33 +00:00
Prospector 9105a68923 changelog 2026-02-04 15:54:16 -08:00
Prospector 06e2f59a94 changelog 2026-02-04 14:54:17 -08:00
ProspectorandGitHub ddb013e024 translatable category headers (#5301) 2026-02-04 14:47:35 -08:00
aecsocketandGitHub 3f5e3b1d8b Disable login captcha if backend has no captcha secret (#5288)
* Add /_internal/globals route

* Don't show login captcha if backend claims it's disabled

* try to re-add tombi

* typos

* Assume captcha enabled if globals route is unreachable

* Prepare frontend fixes
2026-02-04 18:08:14 +00:00
323090966b feat: app server projects modals + modal borders (#5256)
* feat: add modals

* NewModal add stroke

* update diff type sorting

* update icon to match figma

* fix lint ci issues

* remove formatCategory

* feature flag on buttons

* prepr

* consistent modal borders

* intl

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-02-04 07:27:25 -08:00
Calum H.andGitHub 16204d30f8 fix: withdraw flow fixes (#5296)
* fix: dev-741 currency exchanging bug

* fix: remove redundant balance available check

* fix: lint/fmt

* fix: #5245

* fix: hide max if it's less than min
2026-02-04 14:56:14 +00:00
JerozgenandGitHub 34cbc7e0c1 Use numeric: always for Italian and Russian (#5293)
* Use `numeric: always` for Italian and Russian

* Use RelativeTimeFormatNumeric type
2026-02-04 13:49:21 +00:00
aecsocketandGitHub 5d6593a9da Add more Prometheus metrics for memory and Tokio tasks (#5282)
* Add more Prometheus metrics for memory and Tokio tasks

* pr comments
2026-02-03 19:05:34 +00:00
Prospector ab753a82bc changelog 2026-02-03 09:11:50 -08:00
Truman GaoandGitHub 880e759336 fix: ensure legacy texture pack is checking .zip file extension (#5284) 2026-02-03 04:38:56 +00:00
Prospector 84b386141c Fix formatLoader 2026-02-02 16:57:15 -08:00
Prospector e9a4cc60ca update ads.txt 2026-02-02 16:55:44 -08:00
aecsocketandGitHub d5869c514e Use deadpool fork with tracing (#5276)
* Use deadpool fork with tracing

* Implement minimum Redis connections

* fix typos maybe

* address pr comments
2026-02-02 23:24:55 +00:00
Prospector de0a03b2e9 changelog 2026-02-02 13:17:22 -08:00
3f6c79b00d Application & pat ui improvements (#5271)
* Add categories, make localizable

* Run fix

* Run prepr

* Improve pat modal ui

* Fix pat token actions

* Make scope category localization shared

* Fix casing

* Fix casing

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-02-02 18:20:28 +00:00
ProspectorandGitHub 56c8bb1950 Remove legacy formatCategory (#5280)
* Remove legacy formatCategory

* prepr
2026-02-02 18:20:23 +00:00
François-Xavier TalbotandGitHub f81f951814 Don't persist read search client across reqs (#5277) 2026-02-02 14:09:00 +00:00
François-Xavier TalbotandGitHub 345ada27c0 Increase/make configurable search timeouts (#5261)
* Increase default operation timeout, make it configurable via SEARCH_OPERATION_TIMEOUT

* Don't update index settings when unneeded

* Add to env local
2026-02-02 13:27:29 +00:00
François-Xavier TalbotandGitHub e3395a7366 Development app builds (#5255)
* Workflow changes

* Propagate app_identifier via State

* Remove old updater stuff

* Remove patch file

* Remove unused binding

* Fix application loading

* Don't sign windows binaries by default

* Remove the damn emojis

* Figure out where windows artifacts are

* Fix windows artifacts
2026-02-02 13:10:23 +00:00
Modrinth BotandGitHub 3552c8280b New translations from Crowdin (main) (#5274) 2026-02-02 09:49:27 +00:00
ProspectorandGitHub 11f00be606 Clean up formatters from prev PR (#5254) 2026-02-02 09:38:36 +00:00
aecsocketandGitHub a207daef0d Update charges rows on user deletion (#5269) 2026-02-01 19:14:38 +00:00
aecsocketandGitHub ddd395ed4f Fix FX conversion for Tremendous methods (#5268) 2026-02-01 19:05:32 +00:00
Prospector 04a7ae55e7 prepr 2026-01-30 15:18:38 -08:00
Prospector 5a33d462f6 changelog 2026-01-30 13:05:32 -08:00
ProspectorandGitHub cefa7b90ed Add noindex to pages that should be private (#5257)
* Add noindex to pages that should be private

* fix unused
2026-01-30 13:04:19 -08:00
NotchArrowandGitHub 0875a8a0bc Fixed Payout Source Code Link (#5251) 2026-01-30 16:51:20 +00:00
Calum H.andGitHub 5624e86c2b fix: stale cache handling (#5253)
* fix: allow stale cache

* fix: cache amnt

* fix: other one asw
2026-01-30 16:41:03 +00:00
Prospector c622a9281f changelog 2026-01-30 07:51:57 -08:00
Prospector 937d385241 Revert "remove imgur from proxy whitelist (#5239)"
This reverts commit deaa57fa15.
2026-01-30 07:50:38 -08:00
Calum H.andGitHub 3ec9bcf7e7 fix: caching problems frontend for version upload (#5252) 2026-01-30 14:50:57 +00:00
Prospector 3dd5314062 Add loading state to envs 2026-01-28 17:52:32 -08:00
Prospector d77823c5f4 Fix reference to props on members page 2026-01-28 17:19:51 -08:00
Prospector 41b48bd353 changelog 2026-01-28 16:42:42 -08:00
6225ece6be Add Tangled to common source links (#5236)
* Add Tangled to common source links

* prepr

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-28 16:41:31 -08:00
ProspectorandGitHub 3f8805b953 fix some issues with latest PRs (#5242) 2026-01-28 16:41:17 -08:00
ProspectorandGitHub 6d68c0983f fix quilt svg (#5241) 2026-01-28 16:35:28 -08:00
Prospector 3ac0eb896c changelog 2026-01-28 13:54:54 -08:00
Truman GaoandGitHub 9c309e6da2 fix: various fixes for versions (#5238)
* fix: environment not showing when has mod loaders

* fix: weird snapshot format by only grouping consecutive tags with 3 or more

* fix: 26.1 snapshots not grouped properly in mc version picker

* remove debug console.log
2026-01-28 13:46:07 -08:00
ProspectorandGitHub deaa57fa15 remove imgur from proxy whitelist (#5239) 2026-01-28 13:45:37 -08:00
ProspectorandGitHub 8053fec29f Fix iris logo color (#5240) 2026-01-28 13:45:24 -08:00
78aca7e5c0 feat: shared components for worlds + p2p instances (#5135)
* feat: base content card component

* fix: tooltips + colors

* feat: fix orgs

* feat: add ContentModpackCard

* fix: extract types

* feat: selection v-model

* add show icon in selected for combobox with stories

* feat: add project combobox

* clean up project combobox

* feat: start install to play modal

* fix: events

* 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: fix gap + border issues on last elm

* fix: use TeleportOverflowMenu

* fix: hasUpdate type

* 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

* remove install to play modal from ui package

* pnpm prepr

* feat: reusable table component

* feat: add column width prop for table and fix stories

* feat: add table overflow menu story example

* feat: add surface-1.5 and use in table

* chore: export table in index

* fix: allow more loose typing on columns

* feat: update table component to derive key from column instead of data

* feat: surface 1.5 for oled + refactor story for contentcardtable + yeet sorting funcs

* fix: lint

* feat: add no padding story for new modal

---------

Signed-off-by: Calum H. <contact@cal.engineer>
Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-01-28 20:09:24 +00:00
ProspectorandGitHub 728f8db7b9 Add game version warning for shaders (#5227) 2026-01-28 19:43:58 +00:00
Calum H.andGitHub 4c14339b4b fix: locale loading for ui + moderation nags (#5235)
* fix: locale loading

* fix: locale problems

* fix: lint
2026-01-28 19:41:03 +00:00
ProspectorandGitHub 16ac2aae6b Make tags translatable, move icons to frontend, a few other things (#5229)
* Make tags translatable, move icons to frontend, a few other things

* Migrate more things

* fix import

* more import fixes

* export tag-messages

* lint
2026-01-28 19:01:56 +00:00
6d68d50699 Deduplicate common strings in translation (#5085)
* deduplicate common strings, part 1

* deduplicate common strings, part 2

* typo and general import mess fixes

* detail common string

* fix lint

* fix lint TWO

* adress review concerns + lint

* app lint too

* actually leave privateLabel untouched

* lint fix THREE

* fix: broken msg

* fix: lint

---------

Co-authored-by: Calum H. <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-28 18:10:50 +00:00
Calum H.andGitHub 400c571fe6 refactor: project saving logic (#5225)
* fix: project data saving not visually shown immediately

* feat: useSavable improvements

* feat: migrate where possible to useSavable

* fix: gitignore

* feat: use es-toolkit
2026-01-28 16:46:14 +00:00
aecsocketandGitHub e57c15b3ce Add SQLx operation tracing (#5223)
* wip: vendor sqlx-tracing

* (compiles) standardize pg types used

* more standardization

* general log message improvements

* wip: improve sqlx-tracing architecture

* unify sqlx::Executor type

* wip: try fix sqlx tracing

* wip: sqlx-tracing compiles

* so close

* it compiles

* fix ci
2026-01-28 13:38:57 +00:00
Prospector 7cb7e881fa Revert "changelog"
This reverts commit 638bb55649.
2026-01-27 16:31:20 -08:00
Prospector 2cf82349a5 Revert "feat: badge for tax 2025 bug (#5230)"
This reverts commit 6d1b0eef15.
2026-01-27 16:31:15 -08:00
Prospector 638bb55649 changelog 2026-01-27 14:09:10 -08:00
Calum H.andGitHub 6d1b0eef15 feat: badge for tax 2025 bug (#5230) 2026-01-27 19:03:54 +00:00
03658b6a62 feat: show update available notif for modrinth app in linux (#5181)
* feat: show update available notif for modrinth app in linux

* remove changelog button

* update copy

* pnpm prepr

* add restart app changelog

* pnpm prepr

* use env var to check for updates are disabled

* update copy

* pnpm prepr

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-27 14:20:11 +00:00
François-Xavier TalbotandGitHub f998a8dca5 Allow node transfer field to recv more than 1 node (#5220) 2026-01-26 22:49:21 +00:00
Modrinth BotandGitHub 0d6bee3a5b New translations from Crowdin (main) (#5217) 2026-01-26 07:47:29 +00:00
Prospector 7ce334aeb2 changelog 2026-01-25 13:22:14 -08:00
ProspectorandGitHub fe3a1b2058 Fix versions not loading in settings page (#5214)
* Fix versions not loading in settings page

* prepr
2026-01-25 13:21:25 -08:00
662b73211a Fix CSP issue when changing capes (#5177)
* Update tauri.conf.json

Signed-off-by: Felix <60808107+ItsFelix5@users.noreply.github.com>

* feat: add https for futureproofing asw

---------

Signed-off-by: Felix <60808107+ItsFelix5@users.noreply.github.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-25 20:59:06 +00:00
c453a03a02 fix: dont await lock releasing (#5161)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-25 20:57:43 +00:00
aecsocketandGitHub 05f8113bd0 Fix CI on main (#5213) 2026-01-25 12:40:22 -08:00
Prospector 63dfc3f636 changelog 2026-01-25 12:31:44 -08:00
Calum H.andGitHub c96a303d8a fix: optimistically updating on moderation mutations (#5200)
* fix: moderation optimistically update

* fix: gallery settings
2026-01-25 12:27:45 -08:00
François-Xavier TalbotandGitHub 2d7e87a4cb Local cache lock (#5193) 2026-01-24 00:35:46 +01:00
Prospector fa421b4b83 changelog 2026-01-23 12:59:29 -08:00
François-Xavier TalbotandGitHub 79217e78b4 Theseus circuit breaker (#5196)
* Impl request fence

* Reduce max FETCH_ATTEMPTS

* Tweak fail threshold & window

* Check block status every retry iteration

* Fix fmt

* Fix fmt 2
2026-01-23 20:28:50 +00:00
Prospector bdd808c279 changelog 2026-01-23 12:17:44 -08:00
986a7e6216 feat: ssr fixes + switch project page to tanstack (#5192)
* feat: ssr fixes

* feat: lazy load non-core data

* feat: ssr timing debugging

* feat: go back to all parallel

* feat: migrate to DI + set up mutators

* feat: remove double get versions request, only call v3

* refactor: [version].vue page to use composition API and typescript

* feat: gallery.vue start

* fix: remove left behind console log

* fix: type issues + gallery

* fix: versionsummary modal + version page direct join

* fix: projectRaw guard

* fix: currentMember val fix

* fix: actualProjectType

* fix: vers summary link same page

* fix: lint

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-01-23 12:12:50 -08:00
lumiscosityandGitHub b54fcaa0b1 feat: Make hosting marketing page translatable (#5145)
* feat: make hosting marketing page translatable, part 1

* format what we've got so far

* lint and fix locale setting

* the rest of the owl, almost

still one more message in MedalPlanPromotion that's a bit annoying because of all the inline styles

* finishing touches

some things just shouldn't be questioned, i guess. that's two for two on issues that occur even though i seem to have done everything right. i give up

* whoops, that's literal

* get back in the span, you

* fix typo + lint

* and now it works

* one more fix
2026-01-23 19:54:24 +00:00
Michael H. 1cf782c298 Revert "Implement redis clustering (#5189)"
This reverts commit fb1050e409.
2026-01-23 16:08:07 +01:00
fb1050e409 Implement redis clustering (#5189)
Co-authored-by: Jai Agrawal <geometrically@Jais-MacBook-Pro.local>
2026-01-23 13:51:17 +01:00
François-Xavier TalbotandGitHub 5c29a8c7dd Batched search indexing (#5191)
* Use RO pool for search indexing

* Batched search indexing that actually works

* Query cache
2026-01-23 12:32:02 +00:00
Prospector 09dead50d2 changelog 2026-01-22 11:40:47 -08:00
ProspectorandGitHub 772e0ee220 Update app download page to use flathub (#5188) 2026-01-22 11:36:56 -08:00
ProspectorandGitHub 86b0de3cee Update linux icon (#5186) 2026-01-22 19:02:12 +00:00
ProspectorandGitHub d174d96b74 Add flathub verification token (#5184) 2026-01-22 09:47:04 -08:00
aecsocketandGitHub 1d193ed01b More tracing spans for Labrinth Redis (#5182)
* more tracing in redis ops

* Improve Redis tracing

* improve messages

* make lpush and brpop use traced cmds
2026-01-22 17:46:37 +01:00
Prospector adf365d99d changelog 2026-01-21 14:50:48 -08:00
ProspectorandGitHub f3f48c3c6f Fix .some error (#5180) 2026-01-21 14:48:47 -08:00
aecsocketandGitHub e072f2237b Improve Labrinth Sentry integration (#5174)
* Improve Sentry integration

* remove debug routes

* fix ci

* sentry tracing stuff

* Add spans to Sentry logging

* Fix CI

* Redis op instrumentation

* pr comments
2026-01-21 18:59:05 +00:00
aecsocketandGitHub 306eee3a21 Fix changing Delphi report issue detail verdict if already exists (#5172)
* Fix changing Delphi report issue detail verdict if already exists

* cargo sqlx prepare
2026-01-21 16:12:21 +00:00
François-Xavier TalbotandGitHub ca1d66d070 Increase index swap timeout, better index swap task o11y (#5171) 2026-01-21 15:54:34 +00:00
Truman GaoandGitHub 7e1400d111 feat: use tanstack query for changelog tab (#5175)
* use tanstack query for changelog tab

* fix query key
2026-01-21 09:10:05 +00:00
Truman GaoandGitHub 7595e77170 fix: showing dependencies stage for modpack (#5176) 2026-01-21 09:08:54 +00:00
08fcc61d35 Make Maven file resolution case-insensitive (#4917)
* Make Maven file resolution case-insensitive

* fix string reference

* fixed formatting

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: aecsocket <aecsocket@tutanota.com>
2026-01-21 01:15:33 +00:00
ProspectorandGitHub b36801c5ed Reduce some more sentry errors (#5173)
* short-circuit user menu options if no user

* misc null checks
2026-01-20 15:58:45 -08:00
ProspectorandGitHub 4ed1a1ae7f attempt to safeguard some potential errors on user and collection pages (#5169)
* attempt to safeguard some potential errors on user and collection pages

* prepr
2026-01-20 13:51:25 -08:00
ProspectorandGitHub 04db01cb55 Fix settings page error for non-members (#5168)
* Fix settings page error for non-members

* prepr
2026-01-20 13:51:12 -08:00
ProspectorandGitHub 8f5185de1c Error on state fail in prod and log endpoint errors (#5167)
* Error on state fail in prod and log endpoint errors

* brint back eslint suppress

* lint
2026-01-20 21:16:25 +00:00
ProspectorandGitHub 9f6db31785 update Modrinth Hosting issue template + misc comments (#5166) 2026-01-20 12:40:11 -08:00
a869086ce9 polish(frontend): technical review QA (#5097)
* feat: filtering + sorting alignment

* polish: malicious summary modal changes

* feat: better filter row using floating panel

* fix: re-enable request

* fix: lint

* polish: jump back to files tab qol

* feat: scroll to top of next card when done

* fix: show lock icon on preview msg

* feat: download no _blank

* feat: show also marked in notif

* feat: auto expand if only one class in the file

* feat: proper page titles

* fix: text-contrast typo

* fix: lint

* feat: QA changes

* feat: individual report page + more qa

* fix: back btn

* fix: broken import

* feat: quick reply msgs

* fix: in other queue filter

* fix: caching threads wrongly

* fix: flag filter

* feat: toggle enabled by default

* fix: dont make btns opacity 50

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-20 19:56:24 +00:00
Michael H. 2af6a1b36f Fix wrangler formatting 2026-01-20 20:56:56 +01:00
ProspectorandGitHub d4381f513f Add 10 second timeout to requests made server-side (#5164)
* add worker timeout for get requests

* make it timeout only on server-side
2026-01-20 20:52:34 +01:00
Michael H. a281f13f15 Enable smart placement 2026-01-20 20:52:20 +01:00
a9641dadff Meilisearch task management, improved task o11y, timeout & batch size adjustments (#5158)
* Better observability

* Search management routes

* Probably fluke

* Use utoipa routes

* Update apps/labrinth/src/routes/internal/search.rs

Co-authored-by: aecsocket <aecsocket@tutanota.com>
Signed-off-by: François-Xavier Talbot <108630700+fetchfern@users.noreply.github.com>

* Update apps/labrinth/src/search/indexing/mod.rs

Co-authored-by: aecsocket <aecsocket@tutanota.com>
Signed-off-by: François-Xavier Talbot <108630700+fetchfern@users.noreply.github.com>

* Update apps/labrinth/src/routes/internal/search.rs

Co-authored-by: aecsocket <aecsocket@tutanota.com>
Signed-off-by: François-Xavier Talbot <108630700+fetchfern@users.noreply.github.com>

* Fix

---------

Signed-off-by: François-Xavier Talbot <108630700+fetchfern@users.noreply.github.com>
Co-authored-by: aecsocket <aecsocket@tutanota.com>
2026-01-20 19:06:37 +00:00
aecsocketandGitHub c94dde9b47 Fix updating mod version if file hash is the same (#5138)
* Start fixing infinite update glitch

* adjust app cache logic

* more cache logic

* cleanup

* add v2 redirect

* add v2 version file route to config
2026-01-19 21:40:44 +00:00
Calum H.andGitHub 976644d1e6 fix: conditionally fetch (#5157)
* fix: conditionally fetch

* fix: yeet
2026-01-19 13:57:49 -08:00
Michael H. 11fe90a69b deploy: nerf cpu time to 5s 2026-01-19 22:27:38 +01:00
Michael H. 1108086854 Revert "Remove dev check in payload/pojo debugger (#5152)"
This reverts commit 3f3e6f5199.
2026-01-19 22:27:15 +01:00
Michael H. 5aea892a39 deploy: raise cpu limit to 10s 2026-01-19 22:12:31 +01:00
Calum H.andGitHub 3f3e6f5199 Remove dev check in payload/pojo debugger (#5152)
* Remove dev dcheck in payload/pojo debugger

Signed-off-by: Calum H. <contact@cal.engineer>

* feat: better payload debugger

---------

Signed-off-by: Calum H. <contact@cal.engineer>
2026-01-19 10:28:25 -08:00
Modrinth BotandGitHub 2efcd383bb New translations from Crowdin (main) (#5154) 2026-01-19 07:35:48 +00:00
Prospector faec9c2965 changelog 2026-01-18 11:28:51 -08:00
Calum H.andGitHub a0e8c7f924 feat: more o11y for i18n pojo (#5148) 2026-01-18 11:18:07 -08:00
Emma AlexiaandGitHub 6efdfdf17e chore: 100k Modrinth projects 🎉 (#5150)
Signed-off-by: Emma Alexia <emma@modrinth.com>
2026-01-18 19:10:47 +00:00
Truman GaoandGitHub aec268c6e9 fix: duplicate changelogs not grouping (#5146)
* fix: changelogs not grouping

* fix changelog check
2026-01-17 23:42:59 +00:00
François-Xavier TalbotandGitHub 2c096a85d6 Better observability for search indexing, fix remove_documents (#5143)
* Better observability for search timeout, fix remove_documents

* Log client idx
2026-01-16 21:51:51 +00:00
240e5455cc Auto create NeoForge instance from mod version (#5142)
* Auto create NeoForge instance from mod version

* prioritise fabric over nf

* pnpm prepr

---------

Co-authored-by: tdgao <mr.trumgao@gmail.com>
2026-01-16 21:21:14 +00:00
Prospector c538a9ec6d changelog 2026-01-16 11:58:48 -08:00
Calum H.andGitHub 72458f5c41 feat: non-POJO check in rendered hook (#5137)
* feat: non-POJO check in rendered hook

Signed-off-by: Calum H. <contact@cal.engineer>

* fix: lint

* move to plugin

---------

Signed-off-by: Calum H. <contact@cal.engineer>
2026-01-16 11:56:46 -08:00
Calum H.andGitHub 82e4eb7b40 feat: light mode fixes for navtab + files tab (#5134) 2026-01-16 18:23:43 +00:00
Calum H.andGitHub c9bfc4e9b6 fix: analytics.js using old i18n impl (#5132)
* fix i18n

* fix: lint
2026-01-16 09:07:40 +00:00
Calum H.andGitHub 1ea96df00e fix: broken infinite query on files.vue (#5133) 2026-01-16 09:03:56 +00:00
Calum H.andGitHub 75c5316dc3 fix: PAT range error guard (#5098) 2026-01-16 03:30:00 +00:00
4ee7623837 build: deploy on both environments (#5129)
* build: deploy on both environments

* build: missing whitespace

* build: add path filter

* build: add sentry env

* build: inherit secrets

* remove if check

* Revert "remove if check"

This reverts commit b2ffe1d611.

* remove if check 2

* Fix Wrangler env

* Fix Wrangler env but for real this time

* Alternative method of getting URLs

* Check for environment instead

* Fix comment

* Clickable commit

* Set PREVIEW build var

* Fix commit shown in comment

* Fix linting errors

* )

* add preview banner

* prepr

* prepr again

* ..

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-16 01:40:10 +00:00
ProspectorandGitHub f65479ee15 ignore robots.txt (#5130) 2026-01-15 17:15:24 -08:00
a903e46be9 feat: remove nuxt i18n for in house i18n for web (#5131)
* feat: remove nuxt i18n for in house

* cleanup: remove old nuxt/i18n patch

* prepr

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-15 23:49:38 +00:00
Prospector 4497131206 changelog 2026-01-15 15:15:32 -08:00
Truman GaoandGitHub 4871abfb3a fix: worker exceeding resources bug caused by large changelogs (#5121)
* fetch changelog only where actually used

* use query parameter properly

* remove todos

* pnpm prepr
2026-01-15 22:58:06 +00:00
b0ed808745 Fix Discover URL filter parsing, improve search sidebar (#5104)
* fix category parsing on discover

* Make categories (loader, platform, etc) colored in discover, also add i18n

* fix formatting

* add localized strings

---------

Co-authored-by: Creeperkatze <178587183+Creeperkatze@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-15 15:01:09 -08:00
ProspectorandGitHub 169224560b Include changelog query docs (#5128)
* Include changelog query docs

* example -> default
2026-01-15 14:50:15 -08:00
Prospector 106edc3a51 app 0.10.26 changelog 2026-01-15 14:43:26 -08:00
Truman GaoandGitHub ede405c650 fix: open path util freezing app (#5111)
* fix open path util crashing app

* use spawn blocking instead

* fmt
2026-01-15 20:43:52 +00:00
François-Xavier TalbotandGitHub 1dd1629884 Server transfer admin UI (#5116)
* Initial frontend

* doc for opus (TO REMOVE)

* Make better

* Clarified language

* Remove agent docs

* No scss

* Fmt

* Remove i18n

* Fmt

* Add transferred node tagging
2026-01-15 20:43:37 +00:00
Calum H.andGitHub 0070c9877b fix: re-enable async context (#5126) 2026-01-15 21:41:01 +01:00
Calum H.andGitHub eb208eed8b fix: try nodejs_compat_v2 (#5125) 2026-01-15 14:16:47 +01:00
aecsocketandGitHub c37bf75853 Implement replied/unreplied filter for tech review (#5006)
* Implement replied/unreplied filter for tech review

* project status filter

* wip: issue type filter

* correct filter field

* wip: break up tech review query

* Improve tech review query

* Get tech review working more properly

* Add get single project reports endpoint
2026-01-15 11:54:20 +00:00
Calum H.andGitHub 7838008396 feat: test fix 2 (#5123) 2026-01-15 02:44:26 +01:00
Calum H.andGitHub 454c708fd6 fix: error "27" (#5122)
* fix: error 27

* fix: sentry only in prod

* fix: sentry env

* Revert "fix: error 27"

This reverts commit 66ee482a05.

* feat: attempt to fix error 27
2026-01-15 01:38:23 +01:00
François-Xavier TalbotandGitHub 3ffa78aa07 Allow many Meilisearch write addrs (#5102)
* Write to many Meilisearch write addrs

* Keep client results ordered

* Attach Read Meilisearch client to actix data

* Load balanced meilisearch Compose profile

* Nginx config (round_robin)

* Fix nginx

* Meilisearch + nginx in same net

* Fix env vars example

* Fix env example again

* Fix env again

* Use try_collect with FuturesOrdered

* maybe fix remove_documents

* Clippy
2026-01-15 01:38:09 +01:00
Michael H. 7dba9cbe54 deploy: match sentry sample rate with wrangler observability 2026-01-14 19:00:08 +01:00
716c4e9a21 deploy: add sentry to frontend server (#5118)
* deploy: add sentry to frontend server

* build: add sentry auth token to env

* fix: use sentry CLI for sourcemap upload instead

* feat: comment deploy

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-01-14 17:46:55 +00:00
aecsocketandGitHub f85a2d3ec1 Make changelog in version response optional (#5115)
* Make changelog on version routes optional

* fix clippy

* fix ci
2026-01-14 10:55:20 +00:00
d055dc68dc Payout flows in backend - fix Tremendous forex cards (#5001)
* wip: payouts flow api

* working

* Finish up flow migration

* vibe-coded frontend changes

* fix typos and vue

* fix: types

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-01-14 10:53:35 +00:00
Emma AlexiaandGitHub 50a87ba933 Fix user deletion (again) (again) (notifications_deliveries) (#5112)
Doesn't seem to work fully with notification IDs, not sure why.
2026-01-13 22:25:00 +00:00
Truman GaoandGitHub 6030cb560c fix: auto close version modal after create (#5108)
* fix: auto closing version modal

* hide on next tick
2026-01-13 20:50:33 +00:00
Prospector c498230ebf changelog 2026-01-12 16:28:40 -08:00
4bbc5905e4 fix: dont remount components for project page every time route changes (#5105)
* fix: dont remount components for project page every time route changes

* remove ts from macro

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-13 00:13:21 +00:00
Truman GaoandGitHub 40f5db64d8 fix: versions v2 fixes (#5106)
* update dependencies step to show when cannot detect suggested dependencies

* rollback environment to previous copy

* implement disable close when uploading in modal

* pnpm prepr
2026-01-13 00:12:10 +00:00
Calum H.andGitHub 8d72a42be5 fix: checklist fixes (#5103)
* fix: page switching only when stage actually changes

* feat: preload improvements

* fix: dont skip own locks
2026-01-12 13:30:36 -08:00
61c8cd75cd feat: manage project versions v2 (#5049)
* update add files copy and go to next step on just one file

* rename and reorder stages

* add metadata stage and update details stage

* implement files inside metadata stage

* use regular prettier instead of prettier eslint

* remove changelog stage config

* save button on details stage

* update edit buttons in versions table

* add collapse environment selector

* implement dependencies list in metadata step

* move dependencies into provider

* add suggested dependencies to metadata stage

* pnpm prepr

* fix unused var

* Revert "add collapse environment selector"

This reverts commit f90fabc7a5.

* hide resource pack loader only when its the only loader

* fix no dependencies for modpack

* add breadcrumbs with hide breadcrumb option

* wider stages

* add proper horizonal scroll breadcrumbs

* fix titles

* handle save version in version page

* remove box shadow

* add notification provider to storybook

* add drop area for versions to drop file right into page

* fix mobile versions table buttons overflowing

* pnpm prepr

* fix drop file opening modal in wrong stage

* implement invalid file for dropping files

* allow horizontal scroll on breadcrumbs

* update infer.js as best as possible

* add create version button uploading version state

* add extractVersionFromFilename for resource pack and datapack

* allow jars for datapack project

* detect multiple loaders when possible

* iris means compatible with optifine too

* infer environment on loader change as well

* add tooltip

* prevent navigate forward when cannot go to next step

* larger breadcrumb click targets

* hide loaders and mc versions stage until files added

* fix max width in header

* fix add files from metadata step jumping steps

* define width in NewModal instead

* disable remove dependency in metadata stage

* switch metadata and details buttons positions

* fix remove button spacing

* do not allow duplicate suggested dependencies

* fix version detection for fabric minecraft version semvar

* better verion number detection based on filename

* show resource pack loader but uneditable

* remove vanilla shader detection

* refactor: break up large infer.js into ts and modules

* remove duplicated types

* add fill missing from file name step

* pnpm prepr

* fix neoforge loader parse failing and not adding neoforge loader

* add missing pack formats

* handle new pack format

* pnpm prepr

* add another regex where it is version in anywhere in filename

* only show resource pack or data pack options for filetype on datapack project

* add redundant zip folder check

* reject RP and DP if has redundant folder

* fix hide stage in breadcrumb

* add snapshot group key in case no release version. brings out 26.1 snapshots

* pnpm prepr

* open in group if has something selected

* fix resource pack loader uneditable if accidentally selected on different project type

* add new environment tags

* add unknown and not applicable environment tags

* pnpm prepr

* use shared constant on labels

* use ref for timeout

* remove console logs

* remove box shadow only for cm-content

* feat: xhr upload + fix wrangler prettierignore

* fix: upload content type fix

* fix dependencies version width

* fix already added dependencies logic

* add changelog minheight

* set progress percentage on button

* add legacy fabric detection logic

* lint

* small update on create version button label

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-12 19:41:14 +00:00
Calum H.andGitHub b46f6d0141 feat: moderation locking (#5070)
* feat: base locking impl

* feat: lock logic in place in rev endpoint + fetch rev

* feat: frontend impl and finalize

* feat: auto skip if using the moderation queue page

* fix: qa issues

* fix: async state + locking fix

* fix: lint

* fix: fmt

* fix: qa issue

* fix: qa + redirect bug

* fix: lint

* feat: delete all locks endpoint for admins

* fix: dedupe

* fix: fmt

* fix: project redirect move to middleware

* fix: lint
2026-01-12 17:08:30 +00:00
915d8c68bf Fix theme store race condition (#4885)
Co-authored-by: Calum H. <contact@cal.engineer>
2026-01-12 12:15:34 +00:00
ProspectorandGitHub 21045142cd Disallow all in robots.txt unless prod (#5078) 2026-01-12 11:54:21 +00:00
Modrinth BotandGitHub f171752109 New translations from Crowdin (main) (#5095) 2026-01-12 10:26:48 +00:00
Calum H.andGitHub 82f00f961e feat: switch to api-client to prevent rate limit errors on game-versions (#5089)
* feat: switch to api-client to prevent rate limit errors on game-versions

* feat: sentry temp

* Revert "feat: sentry temp"

This reverts commit aaa21a3f80.
2026-01-11 19:55:07 +00:00
Calum H.andGitHub b55b7fdc1c feat: enable async context + patch i18n to be more resilient (#5084)
* feat: enable async context

* feat: improve handling of $i18n defining (patch)
2026-01-10 17:43:21 +00:00
Michael H.andGitHub 0b60060f65 fix: vite dev server cf workers compatibility (#5080) 2026-01-10 14:11:00 +00:00
Calum H.andGitHub b0f1266a8b feat: normalize paths + add share for crash reports (#5071) 2026-01-09 17:02:42 +00:00
Prospector 863ff2e228 fix date 2026-01-08 14:27:58 -08:00
Prospector 579aa5967f app changelog 2026-01-08 14:26:56 -08:00
François-Xavier TalbotandGitHub 3bf5a6ebec Allow projects in tech review to still show up in moderation queue (#5068)
* Don't prevent projects from appearing in moderation queue if there are pending delphi reports

* Update query cache
2026-01-08 20:47:32 +01:00
François-Xavier TalbotandGitHub ff222aa168 PG/RedisPool configuration/o11y improvements (#5032)
* Don't retain Redis connections while doing database queries

* Optional REDIS_WAIT_TIMEOUT_MS

* Attach more data to CacheTimeout errrors

* Fix locks_released

* Fmt

* Set default REDIS_WAIT_TIMEOUT_MS to 15s

* Fix lint

* Close Redis connections idle for > 5 minutes

* Exponential backoff on cache spin lock
2026-01-08 20:47:13 +01:00
Michael H. ea17534f77 deploy(frontend): reduce sampling rate 2026-01-08 20:07:58 +01:00
Michael H. b91d581928 deploy(frontend): add production route 2026-01-08 19:55:52 +01:00
Michael H. 4f6cb7f26c deploy(frontend): don't wrap quotes around value 2026-01-08 18:37:49 +01:00
Michael H. c1da3e7e95 deploy(frontend): actions is stupid 2026-01-08 18:35:18 +01:00
Michael H. 040c568fdb deploy(frontend): debug variables 2026-01-08 18:31:54 +01:00
Michael H. 7a78565c97 deploy(frontend): merge variable injection & build step 2026-01-08 18:14:04 +01:00
62e56eb27e Worker migration (#5072)
* Worker migration

* Deploy on pnpm changes

* Specify package manager

* Manually bump Wrangler to 4.54

* Get rid of useless Wranglers worker

* I take it back

* Set account ID

* Fix preview alias

* feat: use workers api key

* feat: try fix

* fix: missing imports

* fix: again

* fix: only run push workflow on main or prod

* feat: remove store id?

* Populate secret store IDs

* Use correct key name

* Fix setting PREVIEW variable

* Inject variables from wrangler into shell

* Inject variables from wrangler into shell

* Add git- prefix to preview-alias

* No need to use environments now

* fix: remove test as it's covered by staging deploy

---------

Co-authored-by: Michael H. <michael@iptables.sh>
2026-01-08 16:25:45 +00:00
ProspectorandGitHub 8175120c4c Add fallback for checkbox aria-labels if description is not provided (#5066) 2026-01-08 15:47:32 +00:00
François-Xavier TalbotandGitHub 6221fe5e08 Fix build with updater feature (#5067) 2026-01-08 02:38:02 +00:00
François-Xavier TalbotandGitHub 4a8f882063 Fix underflow in QuickPlay compat check (#5065) 2026-01-08 02:14:05 +00:00
François-Xavier TalbotandGitHub 17db55a0bc Include OS in theseus User-Agent (#5046) 2026-01-08 02:11:18 +00:00
François-Xavier TalbotandGitHub a1d9268d00 Fix daedalus (#5064)
* Support default-user-jvm arguments type

* Use this branch's container

* Allow no rules in Ruled argument variant

* Run main
2026-01-08 01:43:47 +00:00
François-Xavier TalbotandGitHub 14d227a1a3 Revert "Use backup physical_id for progress updates matching" (#5060)
* Revert "Use backup physical_id for progress updates matching"

This reverts commit de2f6275b9.

* Fix page crash on backups page reload
2026-01-07 22:28:57 +00:00
François-Xavier TalbotandGitHub 3fd6ce1b6d Use fill v3 API for fetching paper build versions (#5063) 2026-01-07 22:27:46 +00:00
François-Xavier TalbotandGitHub 7eb1b38cc7 Support updated servers backup route schema, remove backup locking (#5053)
* Use backup physical_id for progress updates matching

* Remove locking

* Fmt
2026-01-06 01:03:46 +00:00
Prospector 2e9730ea1f changelog 2026-01-05 16:58:15 -08:00
a6cd4dfc0f feat: improve error handling for withdraw modal (#5054)
* feat: improve error handling for withdraw modal

* fix: add headers to error info

* prepr

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-06 00:46:34 +00:00
Modrinth BotandGitHub 0cf28c6392 New translations from Crowdin (main) (#5048) 2026-01-06 00:44:05 +00:00
Calum H.andGitHub 7c2327ce16 fix: broken analytics pages (#5052) 2026-01-06 00:42:13 +00:00
099011a177 feat: modrinth hosting - files tab refactor (#4912)
* feat: api-client module for content v0

* feat: delete unused components + modules + setting

* feat: xhr uploading

* feat: fs module -> api-client

* feat: migrate files.vue to use tanstack

* fix: mem leak + other issues

* fix: build

* feat: switch to monaco

* fix: go back to using ace, but improve preloading + theme

* fix: styling + dead attrs

* feat: match figma

* fix: padding

* feat: files-new for ui page structure

* feat: finalize files.vue

* fix: lint

* fix: qa

* fix: dep

* fix: lint

* fix: lockfile merge

* feat: icons on navtab

* fix: surface alternating on table

* fix: hover surface color

---------

Signed-off-by: Calum H. <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-06 00:35:51 +00:00
Calum H.andGitHub 61d4a34f0f devex: skip services + env + db steps in CI if not needed (#4965) 2026-01-06 00:23:22 +00:00
ProspectorandGitHub 5b890dcd8a This fixes it and i don't know why because it still redirects O_O (#5051) 2026-01-05 14:16:00 -08:00
Prospector c2bd88377b changelog 2026-01-05 12:27:14 -08:00
Truman GaoandGitHub efcc0d87b5 fix server upgrade button open modal (#5043) 2026-01-04 21:25:40 +00:00
ProspectorandGitHub f3033956cf Clean up licensing ambiguities (#4979) 2026-01-03 15:16:17 -08:00
ProspectorandGitHub e26291943c fix hydration error in moderation queue (#5038)
* fix hydration error in moderation queue

* disabled moderation button when no projects

* fix circular prop type issue

* Make moderation checklist clientonly
2026-01-03 12:49:32 -08:00
Truman GaoandGitHub 3fc18feacf fix: markdown editor scroll issues with max-height (#5031)
* add markdown editor stories to show scrolling bug

* add story

* update story content

* fix markdown editor scroll

* fix space

* lint
2026-01-03 03:33:20 +00:00
Truman GaoandGitHub 09a0b34df3 link with slug if exists (#5029) 2026-01-02 22:14:53 +00:00
Prospector 937be840c4 changelog 2026-01-01 17:20:58 -08:00
fef6df1321 fix: throw error on fail so it doesnt cache (#5023)
* fix: throw error on fail so it doesnt cache

* lint

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-02 00:39:13 +00:00
daf804947c devex: storybook for UI Package (#4984)
* add storybook

* clean up stories

* small fix

* add stories for all components

* add vintl

* default to dark mode

* fix  teleport

* add theme addon

* add new modal story

* delete broken stories

* move all stories to central stories folder

* fix paths

* add pnpm run storybook

* remove chromatic

* add add-stories.md

* fix types

* fix unncessary args field

* cover more addordion states

* pt2

* remove old vintl

* fix: missing style + ctx

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2026-01-02 00:32:58 +00:00
Truman GaoandGitHub 477d77cdc1 fix: balance displaying NaN (#5024)
* convert string to num

* another potentional string addition

* remove return statement

* fix formatting
2026-01-02 00:27:53 +00:00
Calum H.andGitHub 9bb012a439 fix: direct page visit breaking when labrinth goes down (#5022) 2026-01-01 21:21:39 +01:00
Calum H.andGitHub d1650bb3c4 fix: fouc (#5012)
* fix: fouc

* feat: lazy load locales

* switch test to use build
2026-01-01 14:08:05 +00:00
ProspectorandGitHub 2ce22c18bf Simplify default layout template by moving banners to components (#5010) 2026-01-01 02:28:10 +00:00
Truman GaoandGitHub b48443c65b fix: not checking file extension in loader detection (#5013) 2026-01-01 02:27:28 +00:00
b7e7e5e603 Change input mode for sign-in form (#5000)
* Change input mode and types and modes for sign-in form

-Added the inputmode of "email" to tell mobile browsers to change to the email keyboard for username/email input

-Added the inputmode of "numeric" to tell mobile browsers to change to the numeric keyboard for 2fa input (https://www.w3schools.com/TAgs/att_inputmode.asp)

-Changed two-factor code input type to "numeric" to provide a greater hint to autofill that this is where they should fill in 2fa codes

Signed-off-by: MIfoodie <94649676+MIfoodie@users.noreply.github.com>

* Clean up whitespace in sign-in.vue that I accidently added :)

Removed extra whitespace before the Google authentication link.

Signed-off-by: MIfoodie <94649676+MIfoodie@users.noreply.github.com>

* Change input type from 'number' to 'text'

Signed-off-by: MIfoodie <94649676+MIfoodie@users.noreply.github.com>

---------

Signed-off-by: MIfoodie <94649676+MIfoodie@users.noreply.github.com>
Co-authored-by: Calum H. <contact@cal.engineer>
2025-12-31 17:54:19 +00:00
Prospector fca5b7b544 unparsable 2025-12-31 10:27:07 -08:00
Prospector 3a40ee8713 changelog 2025-12-31 10:17:55 -08:00
Calum H.andGitHub 9e4317a262 fix: use ast not regex (#5007)
* fix: use ast not regex

* packages/ui incl
2025-12-31 17:48:27 +00:00
Truman GaoandGitHub 7fb6401613 fix: server ping spam (#4983)
* add a throttle on populate jump back in list

* Revert "add a throttle on populate jump back in list"

This reverts commit b3e7f51b34.

* only allow populate jump back in list to run 3x on linux

* add temp debug logs

* Revert "add temp debug logs"

This reverts commit 8c5ec42fa3.

* only allow 3x refresh limit for worlds list as well
2025-12-31 11:04:14 +00:00
Truman GaoandGitHub d332032e53 fix large projects list query with fetch segmented (#5004) 2025-12-31 11:03:40 +00:00
Calum H.andGitHub 560f21c0fe fix: various fixes (#4998)
* feat: check imports using ast

* fix: lint

* fix: loadericon

* fix: lint

* feat: remove usd warning

* fix: error.vue

* fix: lint
2025-12-30 21:47:11 +00:00
Calum H.andGitHub 2f99628d94 fix: downgrade to rolldown-vite 7.2.11 (#4999) 2025-12-30 20:53:36 +00:00
aecsocketandGitHub ad3edf541b Replace MaxMind with CloudFlare headers (#4934)
* Replace MaxMind with CloudFlare headers

* Remove MaxMind env vars

* Fix test harness
2025-12-30 16:49:49 +00:00
Calum H.andGitHub b07a1659b4 chore: update to nuxt 3.20 (#4992)
* feat: nuxt 3.14 → 3.15.4

* feat: nuxt 3.15.4 → 3.16.2 (vite 6)

* feat: bump nuxt-i18n

* feat: nuxt 3.20

* fix: lint

* feat: use rolldown-vite

* fix: shut the fuck up

* fix: silence for app as well

* fix: vue-router mismatch

---------

Signed-off-by: Calum H. <contact@cal.engineer>
2025-12-30 15:06:52 +00:00
Calum H.andGitHub 1a16d61511 fix: rev page broken (#4994)
* fix: i18n

* fix: lint
2025-12-30 00:40:56 +01:00
Prospector 366a0a6366 changelog 2025-12-29 14:33:57 -08:00
91b08e7380 Versions environments updates (#4949)
* add environment to version page metadata card

* remove environment migration warnings

* show settings/environments in nav only for staff

* use v2 versions route due to regressions

* add modpack incorrect loaders migration

* remove modpack migration step

* remove unused var

* run pnpm intl:extract

* componentize environment migration page

* rename environment selector

* rename environment selector pt2

* add migration modal to admonition

* hide environments in settings and show message

* show environment in project versions table

* pnpm fix

* pnpm fix on ui package

* intl:extract

* fix: .value

* lower case file

* add icon to environment tags and use i18n

* Update apps/frontend/src/pages/[type]/[id].vue

Co-authored-by: Calum H. <contact@cal.engineer>
Signed-off-by: Truman Gao <106889354+tdgao@users.noreply.github.com>

* open migration modal from warning icon in project dashboard

* fix settings side nav icon

* use useRoute composable

* pnpm fix

* intl:extract

* fix import

* fix import again

* run pnpm prepr

* fix designMessage import

* fix environment fetch

* fix environment fetch properly without key conflict

* fix environment refetching

* fix not using current versions in table to check different environments

* fix download tooltip

---------

Signed-off-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2025-12-29 21:58:17 +00:00
François-Xavier TalbotandGitHub 9924faab84 Fix tech rev rejection query (#4963) 2025-12-29 21:06:47 +00:00
Calum H.andGitHub 9f356beec3 feat: bank acct owner (#4993) 2025-12-29 20:44:18 +00:00
Calum H.andGitHub afe5f773e0 devex: i18n coverage (#4991)
* devex: i18n coverage

* feat: chalk usage

* feat: exclude legal
2025-12-29 20:41:40 +00:00
Calum H.andGitHub 3e246f12de fix: scopes i18n + authorization page temp warning (#4989) 2025-12-29 19:49:54 +00:00
Calum H.andGitHub 042451bad6 feat: i18n switcher in app-frontend (#4990)
* feat: app i18n stuff

* feat: locale switching on load

* feat: db migration

* feat: polish + fade indicator impl onto TabbedModal

* fix: prepr checks

* fix: remove staging lock for language switching

* fix: lint
2025-12-29 19:41:39 +00:00
30106d5f82 Provide more specific payout method names on frontend (#4977)
* Provide more specific payout method names on frontend

Been getting a lot of confused tickets recently of people withdrawing to PayPal but then not recognizing what "Tremendous" means. This should clarify things.

* feat: improve icons + names for withdrawals

* Update apps/frontend/src/components/ui/dashboard/RevenueTransaction.vue

Co-authored-by: Emma Alexia <emma@modrinth.com>
Signed-off-by: Calum H. <hendersoncal117@gmail.com>

* fix: icons

* fix: object cover

* feat: icons for crypto + bank

* fix: remove empty null

* fix: qa

---------

Signed-off-by: Calum H. <hendersoncal117@gmail.com>
Co-authored-by: Calum H. <contact@cal.engineer>
2025-12-29 13:08:33 +00:00
Modrinth BotandGitHub e0d159c010 New translations from Crowdin (main) (#4910) 2025-12-29 12:59:14 +00:00
ProspectorandGitHub 061c52c274 Updated DMCA agent info (#4981) 2025-12-28 00:17:55 +00:00
1bbb01bd42 devex: migrate to vue-i18n (#4966)
* sample languages refactor

* feat: consistency + dedupe impl of i18n

* fix: broken imports

* fix: intl formatted component

* fix: use relative imports

* fix: imports

* fix: comment out incomplete locales + fix imports

* feat: cleanup

* fix: ui imports

* fix: lint

* fix: admonition import

* make footer a component, fix language reactivity

* make copyright notice untranslatable

---------

Co-authored-by: Calum H. <contact@cal.engineer>
2025-12-27 21:37:37 +00:00
Calum H.andGitHub 3cabc3b967 fix: make icons + blog generators not break with eslint (presort) (#4980) 2025-12-27 20:50:08 +00:00
Calum H.andGitHub 7de4e55bad feat: fix report msgs not showing (#4974) 2025-12-27 00:24:08 +00:00
Calum H.andGitHub 1f21d66140 devex: add icon cmd (#4958)
* feat: icons add cmd

* fix: dep

* Update packages/assets/build/add-icons.ts

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

* fix: lint

---------

Signed-off-by: Calum H. <hendersoncal117@gmail.com>
Signed-off-by: Calum H. <contact@cal.engineer>
2025-12-24 22:30:46 +00:00
Calum H.andGitHub 3adee66899 devex: prepr:web and app with proper caching (#4957)
* devex: prepr:web and app with proper caching

* fix: add tooling config to turbo global deps

* fix: exclude turbo + node modules for tooling-config

* feat: prepr:frontend

* fix: ci issue
2025-12-24 21:39:59 +00:00
Truman GaoandGitHub 67a6cd24cc devex: use tailwind preset for website, app, and ui package (#4964)
* use tailwind preset for website, app, and ui package

* fix preset import
2025-12-24 21:24:05 +00:00
Michael H. a952318c77 Revert "feat: downtime banner (#4955)"
This reverts commit 336832ec40.
2025-12-23 16:55:47 +01:00
Calum H.andGitHub 336832ec40 feat: downtime banner (#4955) 2025-12-23 16:40:42 +01:00
543bd5acf7 Coolbot/moderation updates for versions changes (#4942)
* update reports message to the correct support bubble color

* update checklist to direct to new settings pages and use v3 env info

* fix: project v2 + v3 in moderation checklist funcs

* Split environment stage if project uses mixed environments.

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2025-12-22 23:37:44 +00:00
Calum H.andGitHub 6a0bf5858e fix: panel breaking with advancedDebugInfo (#4952) 2025-12-22 22:45:13 +00:00
Prospector 11a75e7657 changelog 2025-12-22 14:15:25 -08:00
Calum H.andGitHub 88635d8da8 fix: auto-icon utility import (#4950) 2025-12-22 22:03:44 +00:00
Prospector 934936eba8 changelog 2025-12-22 12:48:17 -08:00
Truman GaoandGitHub 53ec2c5306 Handle project type on per version basis for multi-type projects (#4945)
* infer project type by draft version loader

* fix detecting modpack project type when editing

* fix no loaders check

* pnpm run fix
2025-12-21 22:13:41 +01:00
aecsocketandGitHub cace1a54cd Fix tech review query routes (#4946) 2025-12-21 09:23:21 +00:00
803c17de31 Fix modpack exports in the app being broken due to new file types (#4944)
* Fix modpack exports in the app being broken due to new file types

* pnpm fix to fix CI

---------

Co-authored-by: aecsocket <aecsocket@tutanota.com>
2025-12-21 08:49:53 +00:00
Calum H.andGitHub 537eadef0c fix: issues with files tab + tech rev cards (#4941) 2025-12-20 22:58:14 +01:00
39f2b0ecb6 Technical review queue (#4775)
* chore: fix typo in status message

* feat(labrinth): overhaul malware scanner report storage and routes

* chore: address some review comments

* feat: add Delphi to Docker Compose `with-delphi` profile

* chore: fix unused import Clippy lint

* feat(labrinth/delphi): use PAT token authorization with project read scopes

* chore: expose file IDs in version queries

* fix: accept null decompiled source payloads from Delphi

* tweak(labrinth): expose base62 file IDs more consistently for Delphi

* feat(labrinth/delphi): support new Delphi report severity field

* chore(labrinth): run `cargo sqlx prepare` to fix Docker build errors

* tweak: add route for fetching Delphi issue type schema, abstract Labrinth away from issue types

* chore: run `cargo sqlx prepare`

* chore: fix typo on frontend generated state file message

* feat: update to use new Delphi issue schema

* wip: tech review endpoints

* wip: add ToSchema for dependent types

* wip: report issues return

* wip

* wip: returning more data

* wip

* Fix up db query

* Delphi configuration to talk to Labrinth

* Get Delphi working with Labrinth

* Add Delphi dummy fixture

* Better Delphi logging

* Improve utoipa for tech review routes

* Add more sorting options for tech review queue

* Oops join

* New routes for fetching issues and reports

* Fix which kind of ID is returned in tech review endpoints

* Deduplicate tech review report rows

* Reduce info sent for projects

* Fetch more thread info

* Address PR comments

* fix ci

* fix postgres version mismatch

* fix version creation

* Implement routes

* fix up tech review

* Allow adding a moderation comment to Delphi rejections

* fix up rebase

* exclude rejected projects from tech review

* add status change msg to tech review thread

* cargo sqlx prepare

* also ignore withheld projects

* More filtering on issue search

* wip: report routes

* Fix up for build

* cargo sqlx prepare

* fix thread message privacy

* New tech review search route

* submit route

* details have statuses now

* add default to drid status

* dedup issue details

* fix sqlx query on empty files

* fixes

* Dedupe issue detail statuses and message on entering tech rev

* Fix qa issues

* Fix qa issues

* fix review comments

* typos

* fix ci

* feat: tech review frontend (#4781)

* chore: fix typo in status message

* feat(labrinth): overhaul malware scanner report storage and routes

* chore: address some review comments

* feat: add Delphi to Docker Compose `with-delphi` profile

* chore: fix unused import Clippy lint

* feat(labrinth/delphi): use PAT token authorization with project read scopes

* chore: expose file IDs in version queries

* fix: accept null decompiled source payloads from Delphi

* tweak(labrinth): expose base62 file IDs more consistently for Delphi

* feat(labrinth/delphi): support new Delphi report severity field

* chore(labrinth): run `cargo sqlx prepare` to fix Docker build errors

* tweak: add route for fetching Delphi issue type schema, abstract Labrinth away from issue types

* chore: run `cargo sqlx prepare`

* chore: fix typo on frontend generated state file message

* feat: update to use new Delphi issue schema

* wip: tech review endpoints

* wip: add ToSchema for dependent types

* wip: report issues return

* wip

* wip: returning more data

* wip

* Fix up db query

* Delphi configuration to talk to Labrinth

* Get Delphi working with Labrinth

* Add Delphi dummy fixture

* Better Delphi logging

* Improve utoipa for tech review routes

* Add more sorting options for tech review queue

* Oops join

* New routes for fetching issues and reports

* Fix which kind of ID is returned in tech review endpoints

* Deduplicate tech review report rows

* Reduce info sent for projects

* Fetch more thread info

* Address PR comments

* fix ci

* fix ci

* fix postgres version mismatch

* fix version creation

* Implement routes

* feat: batch scan alert

* feat: layout

* feat: introduce surface variables

* fix: theme selector

* feat: rough draft of tech review card

* feat: tab switcher

* feat: batch scan btn

* feat: api-client module for tech review

* draft: impl

* feat: auto icons

* fix: layout issues

* feat: fixes to code blocks + flag labels

* feat: temp remove mock data

* fix: search sort types

* fix: intl & lint

* chore: re-enable mock data

* fix: flag badges + auto open first issue in file tab

* feat: update for new routes

* fix: more qa issues

* feat: lazy load sources

* fix: re-enable auth middleware

* feat: impl threads

* fix: lint & severity

* feat: download btn + switch to using NavTabs with new local mode option

* feat: re-add toplevel btns

* feat: reports page consistency

* fix: consistency on project queue

* fix: icons + sizing

* fix: colors and gaps

* fix: impl endpoints

* feat: load all flags on file tab

* feat: thread generics changes

* feat: more qa

* feat: fix collapse

* fix: qa

* feat: msg modal

* fix: ISO import

* feat: qa fixes

* fix: empty state basic

* fix: collapsible region

* fix: collapse thread by default

* feat: rough draft of new process/flow

* fix labrinth build

* fix thread message privacy

* New tech review search route

* feat: qa fixes

* feat: QA changes

* fix: verdict on detail not whole issue

* fix: lint + intl

* fix: lint

* fix: thread message for tech rev verdict

* feat: use anim frames

* fix: exports + typecheck

* polish: qa changes

* feat: qa

* feat: qa polish

* feat: fix malic modal

* fix: lint

* fix: qa + lint

* fix: pagination

* fix: lint

* fix: qa

* intl extract

* fix ci

---------

Signed-off-by: Calum H. <contact@cal.engineer>
Co-authored-by: Alejandro González <me@alegon.dev>
Co-authored-by: aecsocket <aecsocket@tutanota.com>

---------

Signed-off-by: Calum H. <contact@cal.engineer>
Co-authored-by: Alejandro González <me@alegon.dev>
Co-authored-by: Calum H. <contact@cal.engineer>
2025-12-20 11:43:04 +00:00
Truman GaoandGitHub 1e9e13aebb Proper handling of modpack loaders (#4940)
* fix handling modpack loader

* fix order

* increase timeout

* fix search erroring on non alphanumeric input for searching project id
2025-12-19 23:24:40 +00:00
Prospector 67835b04a8 changelog 2025-12-19 13:40:32 -08:00
Truman GaoandGitHub 3f93041ca2 Improve editing project versions (#4933)
* add edit versions dropdown menu

* implement improved edit version with individual edit stages

* make changelog bigger

* update button styles

* remove hover button when hover on row

* bring editing versions back to project settings

* bring back gallery edit and upload in project page

* fix progress value

* fix admonition import

* fix v3 upload for modpacks

* fix modpack loader display for editing version and better open edit/create modal handling

* fix currentMember prop

* fix modpack loader displaying incorrectly

* fix max length

* fix version url after making an edit to version and fix delete

* small max height fix

* hide edit dependencies for modpack

* pnpm run fix

* fix import

* add tooltip

* update icons

* update copy and create version button style
2025-12-19 21:24:14 +00:00
Julian VennenandGitHub 0663b8adb0 Add missing file type enum values to openapi spec (#4936) 2025-12-19 21:11:47 +00:00
Truman GaoandGitHub 1f48f5b5af Fix project dependencies search (#4932)
* add search on all project types except mod packs

* add search by ID

* fix placeholder

* rename to dependency select
2025-12-19 20:27:17 +00:00
Truman GaoandGitHub 0268600044 Provide default when modpack doesn't specify loader (#4930)
* fix no modpack loader, default to minecraft loader

* use v2 create then modify with v3 for environment
2025-12-19 00:54:00 +01:00
François-Xavier TalbotandGitHub 8fb38ba0f2 Remove tag="type" on PaymentRequestMetadata (#4931)
This would conflict with the flattened kind: PaymentRequestMetadataKind
enum, which itself is internally tagged with "type", leading to two
"type" fields being serialized, confusing the deserializer.

Deserialization would fail, be silenced in the stripe webhook and lead
to the incorrect region being assigned to a server.
2025-12-19 00:52:43 +01:00
Prospector 85c65e697d changelog 2025-12-18 13:37:51 -08:00
Truman GaoandGitHub 563997e060 Project versions hot fixes (#4928)
* Fix everyone seeing managing gallery/version has moved alert

* fix loader picker disappear
2025-12-18 13:35:57 -08:00
Calum H.andGitHub 2d5568ecec polish: qa changes for non-usd cards (#4926)
* polish: qa changes for non-usd cards

* fix: always show worth

* fix: padding
2025-12-18 21:29:32 +00:00
Prospector a64c4201bb changelog 2025-12-18 12:41:08 -08:00
ProspectorandGitHub 51d5ed771c Add new versions blog post (#4925) 2025-12-18 12:39:18 -08:00
Prospector 539132a527 changelog 2025-12-18 12:24:35 -08:00
9958600121 feat: managing project versions (#4811)
* start modal, working show modal

* add stages and implement MultiModalStage component

* add project versions context and add file button

* implement add files stage

* export interfaces

* move MultiStageModal to /base

* small update to file input

* add version types to api-client

* wrap version namespace under v3

* implement add details stage fields and loaders component

* start create MC versions stage

* implement changelog stage and bring width into a per stage concern

* implement loader picker with grouping

* improve grouping and sorting for loader picker

* use chips component

* small updaets

* fix loader icon color

* componentize mc version picker

* initial version of shift click to select range

* use newModal for markdown editor

* start add dependencies stage with search

* implement showing mod options in search

* componentize modselect and add version/dependency relation select

* hide version and dependency relation when no project selected

* fix project facet search

* implement api-client versions requests

* fix search api request facet type to be string

* fix new modal outer container scroll

* implement add dependency stage

* fix parse error

* add placeholders

* fix types

* update dependency row styles

* small change

* fix the types on manage versions to be correct with labrinth request bodies

* fix create version file parts

* use draft version ref in flow and implement proper file handlling

* use draft version ref for mc versions select

* implement reactive modal state and conditionally disabled next buttons

* ensure all data is using draftVersion ref

* remove shift click to select range since it sucks

* fix up add dependencies stage state/types

* small fixes

* implement adding dependencies connected to api calls and make adding dependencies work

* add final create version button config

* start create version backend call and bring versions table to project settings

* set add files stage width

* remove version file upload in project page

* small fix

* fix create version api call

* implement error handling

* implement mc versions search

* implement showing all mc versions

* small fix

* implement prefill data

* add success notification

* add cancel button

* add new dropzone file input

* run pnpm run fix

* add tailwind preset in ui package

* polish file version row

* fix modal widths

* hide added versions when no versions added

* implement add loaders stage

* implement small chips and small fixes

* implement grouping for all releases

* implement new all releases grouping

* implement better shift click for version select

* small fixes

* fix search input style

* delete versions provider and start project type inferring

* implement getting project type

* add versions empty state, add folder up icon and pnpm run fix

* implement create version in project versions table

* update side nav

* implement dynamic create version flow depending on project type and detected data

* add id to stages and fix calling setStage not working

* move added loaded out of loader picker

* remove selected and detected MC versions

* add loading message to dependency search and fix dependency type always being "required"

* fix components in ref

* fix width on dropdown

* implement toggle all mc versions based on state of last in range

* fix mc version text colour

* do proper clean up

* update loaders to use tag item

* update UI to use TagItem and better match styles

* handle detected data when setting primary file

* add progress bar

* hide progress bar for non-progress stage

* add loading state on submit

* properly cache dependencies projects/versions

* pnpm run fix

* add dragover show purple border on dropzone file input

* better handle added dependencies

* move versions in side nav

* implement adding file type

* fix api body format for file type

* implement working edit existing version
- working add/remove file
- working edit version details

* a step towards proper versions refresh

* add gallery to project settings

* actually figured out refresh versions

* move checklist into settings page

* remove editing version from version page and add button to versions table in project settings

* remove edit and delete buttons from gallery in project page

* add empty state messages for project page

* add default scroll bar styles

* implement support for new file types

* remove edit from dropdown in project page versions table

* redirect to settings page

* move changelog to row with actions

* fix overflow on added dependencies

* fix redirect

* update scroll styles

* implement add environment stage (create and modify version not persisting environment to backend)

* small style fixes

* small spacing fix

* small style fixes

* add a flag for loading dependency projects

* address PR comments

* fix modrinth ui imports

* use magic keys instead of window.addeventlistener

* add spacing in bottom of settings page

* useDebounceFn from vue

* fix inconsistent stroke

* persist scroll through

* fix remove button

* fix api fields

* fix version file dropdown: hide primary option in edit mode and fix setting initial value

* fix links in nags

* implement skipped field for skipping steps instead of mutating stages array's elements

* implement suggested dependencies components

* implement suggested dependencies api call

* refactor cached get project and get version calls

* always hide environments

* update links

* set scroll in 10ms

* update links

* fix links pt2

* fix shadow

* fix progress bar

* dont include mc versions in suggested versions finder

* fix text overflow styles

* use tooltip

* fix change version name api

* implement set environment api call

* delete unused vue pages

* implement detected environment, edit environment step, and fix showing loaders in details for no loader projects

* small fix

* no loaders project wrong check

* fix not having 'minecraft' loader for resource pack

* implement updating existing files file type

* move add minecraft loader outside try catch

* add datapack to have environment

* fix being able to select duplicate MC versions

* remove datapack project from environment

* fix version fetch

* fix having detected environment not properly skipping step

* only add detected data when primary file changes

* fix unknown environemtn

* implement gallery and versions have moved admonition

* update project page for creator view

* small copy update

* merge fixes

* pnpm run fix

* fix checkmark squished

* fix version type can be deselected

* refactor: DI context + better typed MultistageModal

* fix type import

* Misc QA fixes

* fix allowed file types with no project type

* implement new add files stage

* fix versiosn header with new pagination

* hide buttons when no files for add file stage

* use prettier formatter

* allow signature file types

* add detecting primary file

* fix progress bar in firefox

* fix environment not correctly being hidden/shown

* remove environment missing nag

* temp bring back environment page

* remove delete version action from project page

* replace "continue" next button label with actual next step

* fix types

* pnpm run fix

* move supplementary files alert up and update border radius style on dropzone

* copy updates

* small update on version num placeholder

* update placeholder

* make timeout on upload routes 2 minutes

* fix lint issues

* run pnpm intl:extract

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2025-12-18 19:56:15 +00:00
aecsocketandGitHub 9ad01723a2 Fix optional file type upload validation (#4924) 2025-12-18 19:18:05 +00:00
Prospector 8448bacae7 Update changelog 2025-12-18 11:16:36 -08:00
Prospector c21e98a2a8 Update changelog 2025-12-18 11:15:06 -08:00
ProspectorandGitHub 5bbc3872f3 Revert "Use alt CDN URL when request header is passed (#4921)" (#4923)
This reverts commit 609e3896eb.
2025-12-18 18:40:27 +00:00
aecsocketandGitHub 8d894541e8 Add affiliate code revenue analytics (#4883)
* Add affiliate code revenue analytics

* clean up some error handling

* Add conversions to affiliate code analytics

* Only include affiliate subscriptions which have an associated successful charge

* wip: affiliate code clicks

* affiliate code click ingest route

* Add affiliate code clicks to analytics

* add new cols
2025-12-18 18:02:49 +00:00
dc16a65b62 Improve support for non-USD Tremendous gift cards (#4887)
* Improve support for non-USD Tremendous gift cards

* add forex info to tremendous payout methods

* fix: partially fix DEV-535

* feat: wip

* eur/usd to usd/eur

* feat: better denom picking

* feat: qa changes

* fix: intl

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-12-18 18:02:29 +00:00
Calum H.andGitHub 514c6f6e34 fix: muralpay iso mismatch (#4871)
* fix: deduplicate and use full code

* fix: subdivisions match muralpay
2025-12-18 02:08:47 +00:00
aecsocketandGitHub 609e3896eb Use alt CDN URL when request header is passed (#4921)
* Use alt CDN URL when request header is passed

* Modify version routes to use alt CDN
2025-12-17 18:12:29 +00:00
Prospector fd08dff1e7 Update changelog 2025-12-16 12:59:17 -08:00
Prospector 6425ab8c57 Add Java 25 setting 2025-12-16 12:47:05 -08:00
aecsocketandGitHub e123e51c66 Fix how processor arguments are generated in app (#4919) 2025-12-16 20:03:37 +00:00
ProspectorandGitHub 21fad12a21 Fix collection pages requiring auth (#4915) 2025-12-16 14:14:52 +00:00
Calum H.andGitHub 924a77eb3f fix: temporarily disable vintl for all langs apart from en-US (#4911)
* fix: temporarily disable vintl apart from en_us

* fix: lint
2025-12-15 19:04:19 +00:00
aecsocketandGitHub 7aaf99a0c8 Split logging utils into its own crate (#4852)
* Split logging utils into its own crate

* fix review comments

* remove anyhow from root

* make meilisearch less verbose
2025-12-12 02:09:57 +00:00
Prospector 91accd5578 Update app changelog + fix accordion issue 2025-12-11 16:19:51 -08:00
Prospector 147f19f11e lint 2025-12-11 16:09:20 -08:00
Prospector 73ff6df73c update changelog 2025-12-11 16:08:35 -08:00
ProspectorandGitHub 0de780b7c9 Make game versions update every 10 minutes via server-side route (#4892) 2025-12-11 16:05:31 -08:00
ProspectorandGitHub f49f889536 Fix news row width (#4894)
* fix news row width

* lint
2025-12-11 16:05:19 -08:00
ProspectorandGitHub b3f598aa1d Fix server content search (#4891)
* fix server content search

* wtf
2025-12-11 16:04:54 -08:00
Prospector cd1b5dcd3d update changelog 2025-12-11 16:00:12 -08:00
ProspectorandGitHub 79b7d269b0 Throttle search to not spam requests (#4893)
* Throttle search to not spam requests

* lint
2025-12-11 21:03:10 +00:00
ProspectorandGitHub 40ac726930 Exclude node_modules from tailwind pattern to improve build time (#4890) 2025-12-11 19:04:28 +00:00
aecsocketandGitHub ddcc14d99f Add details to Mural API errors (#4886) 2025-12-11 12:49:59 +00:00
Prospector 3dd2de5f18 changelog 2025-12-09 18:18:26 -08:00
ProspectorandGitHub 0a8f489234 NormalPage component w/ Collections refactor (#4873)
* Refactor search page, migrate to /discover/

* Add NormalPage component for common layouts, refactor Collections page as an example, misc ui pkg cleanup

* intl:extract

* lint

* lint

* remove old components

* Refactor search page, migrate to /discover/

* Add NormalPage component for common layouts, refactor Collections page as an example, misc ui pkg cleanup

* intl:extract

* lint

* lint

* remove old components
2025-12-09 22:44:10 +00:00
ProspectorandGitHub 1d64b2e22a Refactor search page, migrate to /discover/ (#4862) 2025-12-09 14:25:45 -08:00
Calum H.andGitHub 251e89fe5a fix: notice btns not matching colour of notice + gap issue (#4823)
* feat: improve notices

* fix: bottom gap for notices

* fix: lint

* fix: lint
2025-12-09 09:14:59 +00:00
Calum H.andGitHub 4fbbc2b1cf feat: use utc during balance bar calcs (#4875) 2025-12-09 08:44:04 +00:00
Calum H.andGitHub d5b7ac3542 fix: setting states not persisting (#4872)
Closes: 4867
2025-12-08 23:29:52 +00:00
ProspectorandGitHub fec395a4cf Revert "New translations from Crowdin (main) (#4815)" (#4878)
This reverts commit 16c0dadc4a.
2025-12-08 15:29:05 -08:00
Modrinth BotandGitHub 16c0dadc4a New translations from Crowdin (main) (#4815) 2025-12-08 21:53:44 +00:00
Calum H.andGitHub 779092c0b7 feat: user details modal for moderators (#4764)
* feat: user details modal for moderators

* fix: casing
2025-12-08 21:50:38 +00:00
aecsocketandGitHub 9aa06fbc26 Fix Mural payout status syncing (#4853)
* Fix Mural payout status syncing

* Make Mural payout code more resilient

* prepare sqlx

* fix test
2025-12-08 20:34:41 +00:00
Calum H.andGitHub cfd2977c21 feat: stable key for mods list (#4876) 2025-12-08 18:50:55 +00:00
Prospector 27fc0796a4 changelog 2025-12-08 10:24:47 -08:00
Calum H.andGitHub b1438bd460 fix: blocking await for jump back in (#4870)
* fix: loading state for jump back in

* fix: lint
2025-12-08 18:03:08 +00:00
Calum H.andGitHub 267e0cb636 fix: license url not being removed when saving (#4874)
Closes: #4848
2025-12-08 17:55:29 +00:00
coolbotandGitHub d471ef6763 Update support contact bubble color in utils.ts (#4868)
Signed-off-by: coolbot <76798835+coolbot100s@users.noreply.github.com>
2025-12-08 06:51:11 +00:00
cea5cfa4ab Add new optional file types (#4854)
* Add new optional file types

* Fix build

* Add signature file type

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-12-06 23:45:10 +00:00
Prospector 56356e8260 changelog 2025-12-05 11:56:19 -08:00
41e4086973 feat: qa improvements for backups page (#4857)
* feat: fix backup action disabling logic

* feat: allow actions when backup is being created

* feat: qa fixes

* feat: backups empty state

* fix: lint

* intl:extract

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-12-05 01:48:34 +00:00
Calum H.andGitHub 0f1f27d450 feat: dev-541 (#4858) 2025-12-05 01:34:05 +00:00
Calum H.andGitHub a558064f9d fix: add x-panel-version header (#4855) 2025-12-04 15:15:03 +01:00
Prospector c421249767 changelog 2025-12-03 18:32:43 -08:00
8eff939039 feat: ws client & new backups frontend (#4813)
* feat: ws client

* feat: v1 backups endpoints

* feat: migrate backups page to api-client and new DI ctx

* feat: switch to ws client via api-client

* fix: disgust

* fix: stats

* fix: console

* feat: v0 backups api

* feat: migrate backups.vue to page system w/ components to ui pkgs

* feat: polish backups frontend

* feat: pending refactor for ws handling of backups

* fix: vue shit

* fix: cancel logic fix

* fix: qa issues

* fix: alignment issues for backups page

* fix: bar positioning

* feat: finish QA

* fix: icons

* fix: lint & i18n

* fix: clear comment

* lint

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-12-03 18:32:03 -08:00
Prospector e3444a3456 changelog 2025-12-03 14:39:02 -08:00
ProspectorandGitHub 16a6f7b352 Modrinth Hosting rebrand (#4846)
* Modrinth Hosting rebranding

* fix capitalization issue

* fix issues
2025-12-03 22:15:36 +00:00
aecsocketandGitHub 79c2633011 Fix slug/project ID collisions (#4844)
* wip: tool to create project with id

* fix

* fix id/slug collision for orgs
2025-12-03 00:30:18 +00:00
aecsocketandGitHub 783aaa6553 Add revenue split to affiliate codes v2 (#4672)
* wip: affiliate payouts again

* Implement affiliate payout queue

* Deactivate subscription affiliations on cancellation

* Remove a test that never compiled in the first place

* Update sqlx cache

* address some PR comments

* more comments

* wip: handle refund charges

* cargo sqlx prepare

* Address PR comments

* cargo sqlx prepare
2025-12-02 00:01:24 +00:00
Prospector 60e0953616 stringify errors 2025-11-28 12:11:39 -08:00
Prospector f7c86f9fc9 update changelog 2025-11-28 11:39:32 -08:00
aecsocketandGitHub fe684ab903 Change auth servers reachable check URL (#4830) 2025-11-27 19:38:26 +00:00
Calum H.andGitHub 8592761493 fix: stale modpack permissions data on re-review (#4822) 2025-11-27 17:15:10 +00:00
aecsocketandGitHub dfe087df20 Enforce 2dp on payout withdrawals (#4829)
* fix mural withdraw amount

* Enforce 2dp on all payout logic
2025-11-27 10:03:34 +00:00
aecsocketandGitHub be3208c5a1 Fix Docker Compose to match staging/prod environments (#4828) 2025-11-26 23:54:03 +00:00
Calum H.andGitHub b56f39ce07 fix: edit server icon issues (#4821) 2025-11-26 23:29:29 +00:00
aecsocketandGitHub 0178fddc38 Install mod update dependencies automatically (#4800)
* Redownload version dependencies when updating a mod

* Fix update all button as well
2025-11-24 13:35:14 +00:00
aecsocketandGitHub 31417a2aa1 more logging on sync payouts task (#4814) 2025-11-23 21:48:15 +01:00
f333a75221 fix empty state for projects in "All" tab (#4801)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-11-23 02:38:13 +00:00
aecsocketandGitHub bcf14a4c51 Fix downloading libraries for Forge 1.7.2 (#4808)
* wip: fix Forge 1.7.2 downloads

* Bump recursion limit
2025-11-21 22:45:34 +00:00
aecsocketandGitHub 130c2863ab Fix exposing Docker Compose ports to broadcast addr (#4805) 2025-11-21 11:13:11 +00:00
Prospector e59664426b changelog 2025-11-19 15:17:01 -08:00
aecsocketandGitHub 2f0ef07944 Add logging and change limit of Mural payouts task (#4798) 2025-11-19 12:38:30 +00:00
Truman GaoandGitHub 9af19d01e5 Fix modrinth+ firing ad requests on load (#4792) 2025-11-18 18:05:24 +00:00
François-Xavier TalbotandGitHub e837d9fa30 Add route to reprocess a refund charge's tax record (#4791) 2025-11-18 11:36:55 +00:00
93b79759c7 Add auth servers unreachable warning to app (#4774)
* Add auth servers unreachable warning to app

* Check auth status every 5 minutes

* Use admonition in auth server warning

* feat: tanstack

* Fix auth server reachability query

* Format

* intl extract

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
2025-11-17 18:41:52 +00:00
Modrinth BotandGitHub 4becb2a822 New translations from Crowdin (main) (#4787) 2025-11-17 07:45:40 +00:00
Calum H.andGitHub 134a621d0d fix: use ref rather than direct val (#4785) 2025-11-16 22:36:11 +00:00
aecsocketandGitHub 089cca60ce Fix PayPal SSO OAuth callback (#4758)
* Maybe fix PayPal SSO

* cargo sqlx prepare

* maybe works

* Attempt 2 of fixing

* Fix vue

* Try adding more logging to flow
2025-11-16 21:49:48 +00:00
Prospector 20484ed7aa fix timezone 2025-11-14 12:10:58 -08:00
Prospector 763a38812f changelog 2025-11-14 11:58:48 -08:00
7ccc32675b feat: start of cross platform page system (#4731)
* feat: abstract api-client DI into ui package

* feat: cross platform page system

* feat: tanstack as cross platform useAsyncData

* feat: archon servers routes + labrinth billing routes

* fix: dont use partial

* feat: migrate server list page to tanstack + api-client + re-enabled broken features!

* feat: migrate servers manage page to api-client before page system

* feat: migrate manage page to page system

* fix: type issues

* fix: upgrade wrapper bugs

* refactor: move state types into api-client

* feat: disable financial stuff on app frontend

* feat: finalize cross platform page system for now

* fix: lint

* fix: build issues

* feat: remove papaparse

* fix: lint

* fix: interface error

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-11-14 17:15:09 +00:00
26feaf753a Fixes #4348 (#4773)
* also fixes spacing issue in collections card small width

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-11-13 23:51:08 +00:00
ProspectorandGitHub 94c0003c19 Fix a number of light mode issues and get rid of scrollbar jumping on menus (#4760)
* Fix DEV-466, Fixes #4692 as well as a bunch of other poor contrast and inconsistency issues in light mode. Adds shadows to buttons and makes scrollbar gutter stable.

* lintttt & only do scrollbar gutter on website

* try to fix following hydration issue

* try another clientonly approach

* fix home page link animation

* lint

* remove dropdown style from checkbox & improve shadow consistency

* liiiint
2025-11-13 23:21:43 +00:00
aecsocketandGitHub c27f787c91 Task to retroactively update Mural statuses (#4769)
* Task to retroactively update Mural statuses

* cargo sqlx prepare

* wip: add tests

* Prepare

* Fix up test

* start on muralpay mock

* Move mocking to muralpay crate
2025-11-13 18:16:41 +00:00
70e2138248 feat: base api-client impl (#4694)
* feat: base api-client impl

* fix: doc

* feat: start work on module stuff

* feat: migrate v2/v3 projects into module system

* fix: lint & README.md contributing

* refactor: remove utils old api client prototype

* fix: lint

* fix: api url issues

* fix: baseurl in error.vue

* fix: readme

* fix typo in readme

* Update apps/frontend/src/providers/api-client.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Calum H. <hendersoncal117@gmail.com>

* Update packages/api-client/src/features/verbose-logging.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Calum H. <hendersoncal117@gmail.com>

* Update packages/api-client/src/features/retry.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Calum H. <hendersoncal117@gmail.com>

---------

Signed-off-by: Calum H. <hendersoncal117@gmail.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 20:29:12 +00:00
Calum H.andGitHub 590ba3ce55 fix: original startup settings values not being updated with new state we send to server (#4761) 2025-11-12 19:45:51 +00:00
29671347a0 fix: correct parameter name for create function in profile helper (#4744)
Co-authored-by: Panyu <48863527+PanyuDev@users.noreply.github.com>
2025-11-12 05:43:10 +00:00
Calum H.andGitHub 386e6e50da refactor: move batch credit modal into default layout (#4767)
* refactor: move batch credit modal into default layout

* fix: spacing + spans rather than p
2025-11-12 04:14:11 +00:00
Calum H.andGitHub 880ed21bcd fix: incorrect autocomplete for pardon_ip and ban_ip (#4763) 2025-11-12 04:01:25 +00:00
bbc31ef077 fix: z index issues for mobile nav (#4766)
* fix: z index issues for mobile nav

Closes: #4722

* fix: below modals

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2025-11-12 04:00:46 +00:00
Calum H.andGitHub 9a13e977a0 fix: crash on charges.vue (#4765) 2025-11-12 04:00:39 +00:00
Modrinth BotandGitHub a5602ff18c New translations from Crowdin (main) (#4749) 2025-11-11 23:11:36 +00:00
Prospector 5901c5a535 update changelog 2025-11-11 12:28:24 -08:00
Jonathan RomanoandGitHub cca1dd7e37 Update openapi spec to fix invalid json (#4756)
Signed-off-by: Jonathan Romano <jonathan@luxaritas.com>
2025-11-11 02:00:26 +00:00
Prospector 127e01cc96 changelog 2025-11-10 11:58:39 -08:00
aecsocketandGitHub 1dcb38cb57 Fix dependency installation not respecting mod loader (#4751)
* Fix dependency installation not respecting mod loader

* fix
2025-11-10 16:48:11 +00:00
1536 changed files with 148157 additions and 68048 deletions
@@ -1,6 +1,6 @@
name: 👥 Bug with Modrinth Servers
description: For issues with a Modrinth Servers product.
labels: [servers]
name: 👥 Bug with Modrinth Hosting
description: For issues with a Modrinth Hosting product.
labels: [hosting]
type: 'bug'
body:
- type: checkboxes
+1 -1
View File
@@ -19,7 +19,7 @@ body:
options:
- Modrinth App
- Modrinth.com website
- Modrinth Servers
- Modrinth Hosting
- Modrinth API for developers
- type: textarea
attributes:
@@ -2,7 +2,7 @@
applyTo: '**/*.vue'
---
You are given a Nuxt/Vue single-file component (.vue). Your task is to convert every hard-coded natural-language string in the <template> into our localization system using @vintl/vintl-nuxt (which wraps FormatJS).
You are given a Nuxt/Vue single-file component (.vue). Your task is to convert every hard-coded natural-language string in the <template> into our localization system using vue-i18n with utilities from `@modrinth/ui`.
Please follow these rules precisely:
@@ -13,40 +13,53 @@ Please follow these rules precisely:
2. Create message definitions
- In the <script setup> block, import `defineMessage` or `defineMessages` from `@vintl/vintl`.
- In the <script setup> block, import `defineMessage` or `defineMessages` from `@modrinth/ui`.
- For each extracted string, define a message with a unique `id` (use a descriptive prefix based on the component path, e.g. `auth.welcome.long-title`) and a `defaultMessage` equal to the original English string.
Example:
const messages = defineMessages({
welcomeTitle: { id: 'auth.welcome.title', defaultMessage: 'Welcome' },
welcomeDescription: { id: 'auth.welcome.description', defaultMessage: 'Youre now part of the community…' },
welcomeDescription: { id: 'auth.welcome.description', defaultMessage: 'You're now part of the community…' },
})
3. Handle variables and ICU formats
- Replace dynamic parts with ICU placeholders: "Hello, ${user.name}!" → `{name}` and defaultMessage: 'Hello, {name}!'
- For numbers/dates/times, use ICU/FormatJS options (e.g., currency): `{price, number, ::currency/USD}`
- For numbers/dates/times, use ICU options (e.g., currency): `{price, number, ::currency/USD}`
- For plurals/selects, use ICU: `'{count, plural, one {# message} other {# messages}}'`
4. Rich-text messages (links/markup)
- In `defaultMessage`, wrap link/markup ranges with tags, e.g.:
"By creating an account, you agree to our <terms-link>Terms</terms-link> and <privacy-link>Privacy Policy</privacy-link>."
- Render rich-text messages with `<IntlFormatted>` from `@vintl/vintl/components` and map tags via `values`:
<IntlFormatted
:message="messages.tosLabel"
:values="{
'terms-link': (chunks) => <NuxtLink to='/terms'>{chunks}</NuxtLink>,
'privacy-link': (chunks) => <NuxtLink to='/privacy'>{chunks}</NuxtLink>,
}"
/>
- For simple emphasis: `'Welcome to <strong>Modrinth</strong>!'` and map `'strong': (c) => <strong>{c}</strong>`
- Render rich-text messages with `<IntlFormatted>` from `@modrinth/ui` using named slots:
<IntlFormatted :message-id="messages.tosLabel">
<template #terms-link="{ children }">
<NuxtLink to="/terms">
<component :is="() => children" />
</NuxtLink>
</template>
<template #privacy-link="{ children }">
<NuxtLink to="/privacy">
<component :is="() => children" />
</NuxtLink>
</template>
</IntlFormatted>
- For simple emphasis: `'Welcome to <strong>Modrinth</strong>!'` with a slot:
<template #strong="{ children }">
<strong><component :is="() => children" /></strong>
</template>
- For more complex child handling, use `normalizeChildren` from `@modrinth/ui`:
<template #bold="{ children }">
<strong><component :is="() => normalizeChildren(children)" /></strong>
</template>
5. Formatting in templates
- Import and use `useVIntl()`; prefer `formatMessage` for simple strings:
- Import and use `useVIntl()` from `@modrinth/ui`; prefer `formatMessage` for simple strings:
`const { formatMessage } = useVIntl()`
`<button>{{ formatMessage(messages.welcomeTitle) }}</button>`
- Vue methods like `$formatMessage`, `$formatNumber`, `$formatDate` are also available if needed.
- Pass variables as a second argument:
`{{ formatMessage(messages.greeting, { name: user.name }) }}`
6. Naming conventions and id stability
@@ -58,7 +71,8 @@ Please follow these rules precisely:
8. Update imports and remove literals
- Ensure imports for `defineMessage`/`defineMessages`, `useVIntl`, and `<IntlFormatted>` are present. Replace all hard-coded strings with `formatMessage(...)` or `<IntlFormatted>` and remove the literals.
- Ensure imports from `@modrinth/ui` are present: `defineMessage`/`defineMessages`, `useVIntl`, `IntlFormatted`, and optionally `normalizeChildren`.
- Replace all hard-coded strings with `formatMessage(...)` or `<IntlFormatted>` and remove the literals.
9. Preserve functionality
+3
View File
@@ -0,0 +1,3 @@
# Copying
Modrinth's Github workflows are licensed under the MIT License, which is provided in the file [LICENSE](./LICENSE).
+7
View File
@@ -0,0 +1,7 @@
Copyright 2025 Rinth, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+11 -9
View File
@@ -13,13 +13,15 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@master
- uses: crate-ci/typos@v1.43.1
# broken: <https://github.com/SchemaStore/schemastore/issues/5108>
# tombi:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v4
# - uses: tombi-toml/setup-tombi@v1
# - run: tombi lint
# - run: tombi fmt --check
# see <https://github.com/influxdata/datafusion-udf-wasm/pull/275>
tombi:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: taiki-e/install-action@v2
with:
tool: tombi
- run: tombi lint
- run: tombi fmt --check
+143
View File
@@ -0,0 +1,143 @@
name: Deploy frontend
on:
push:
branches:
- main
- prod
paths:
- 'apps/frontend/**/*'
- 'packages/ui/**/*'
- 'packages/utils/**/*'
- 'packages/assets/**/*'
- '**/wrangler.jsonc'
- '**/pnpm-*.yaml'
- '.github/workflows/frontend-deploy.yml'
workflow_dispatch:
workflow_call:
inputs:
environment:
required: true
type: string
description: 'The environment to deploy to (staging-preview or production-preview)'
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Configure environment
id: meta
run: |
echo "cmd=deploy" >> $GITHUB_OUTPUT
ENV_INPUT="${{ inputs.environment }}"
REF="${{ github.ref }}"
SHA_SHORT="${GITHUB_SHA::8}"
if [ "$ENV_INPUT" = "staging-preview" ]; then
echo "env=staging" >> $GITHUB_OUTPUT
echo "url=https://git-$SHA_SHORT-frontend-staging.modrinth.workers.dev" >> $GITHUB_OUTPUT
echo "cmd=versions upload --preview-alias git-$SHA_SHORT --var PREVIEW:true" >> $GITHUB_OUTPUT
elif [ "$ENV_INPUT" = "production-preview" ]; then
echo "env=production" >> $GITHUB_OUTPUT
echo "url=https://git-$SHA_SHORT-frontend.modrinth.workers.dev" >> $GITHUB_OUTPUT
echo "cmd=versions upload --preview-alias git-$SHA_SHORT --var PREVIEW:true" >> $GITHUB_OUTPUT
elif [ "$REF" = "refs/heads/main" ]; then
echo "env=staging" >> $GITHUB_OUTPUT
echo "url=https://staging.modrinth.com" >> $GITHUB_OUTPUT
else
# Production env (no preview)
echo "env=production" >> $GITHUB_OUTPUT
echo "url=https://modrinth.com" >> $GITHUB_OUTPUT
fi
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: pnpm
- name: Inject build variables
working-directory: ./apps/frontend
run: |
if [ "${{ steps.meta.outputs.env }}" == "staging" ]; then
echo "Injecting staging variables from wrangler.jsonc..."
jq -r '.env.staging.vars | to_entries[] | "\(.key)=\(.value)"' wrangler.jsonc >> $GITHUB_ENV
else
echo "Injecting production variables from wrangler.jsonc..."
jq -r '.vars | to_entries[] | "\(.key)=\(.value)"' wrangler.jsonc >> $GITHUB_ENV
fi
- name: Install dependencies
working-directory: ./apps/frontend
run: pnpm install
- name: Build frontend
working-directory: ./apps/frontend
run: pnpm build
env:
CF_PAGES_BRANCH: ${{ github.ref_name }}
CF_PAGES_COMMIT_SHA: ${{ github.sha }}
CF_PAGES_URL: ${{ steps.meta.outputs.url }}
BUILD_ENV: ${{ steps.meta.outputs.env }}
PREVIEW: ${{ inputs.environment != '' && 'true' || 'false' }}
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
- name: Create Sentry release and upload sourcemaps
uses: getsentry/action-release@v3
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: modrinth
SENTRY_PROJECT: knossos-server
with:
environment: ${{ steps.meta.outputs.env }}
sourcemaps: ./apps/frontend/.output/server
url_prefix: '~/'
- name: Deploy Cloudflare Worker
id: wrangler
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: ${{ secrets.CF_ACCOUNT_ID }}
environment: ${{ steps.meta.outputs.env != 'production' && steps.meta.outputs.env || '' }}
workingDirectory: ./apps/frontend
packageManager: pnpm
wranglerVersion: '4.54.0'
command: ${{ steps.meta.outputs.cmd }}
- name: Purge cache
if: github.ref == 'refs/heads/prod'
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
-H "Content-Type: application/json" \
--data '{"hosts": ["modrinth.com", "www.modrinth.com", "staging.modrinth.com"]}' \
https://api.cloudflare.com/client/v4/zones/e39df17b9c4ef44cbce2646346ee6d33/purge_cache
- name: Write deployment URL to file
if: ${{ inputs.environment != '' }}
run: |
echo "${{ steps.meta.outputs.url }}" > deployment-url-${{ inputs.environment }}.txt
- name: Upload deployment URL
if: ${{ inputs.environment != '' }}
uses: actions/upload-artifact@v6
with:
name: deployment-url-${{ inputs.environment }}
path: deployment-url-${{ inputs.environment }}.txt
-30
View File
@@ -1,30 +0,0 @@
name: Clear pages cache
on:
push:
branches:
- prod
jobs:
wait:
if: github.repository_owner == 'modrinth'
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
steps:
- name: Cloudflare Pages deployment
uses: WalshyDev/cf-pages-await@v1
with:
apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: '9ddae624c98677d68d93df6e524a6061'
project: 'frontend'
commitHash: ${{ steps.push-changes.outputs.commit-hash }}
- name: Purge cache
if: github.ref == 'refs/heads/prod'
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
-H "Content-Type: application/json" \
--data '{"hosts": ["modrinth.com", "www.modrinth.com"]}' \
https://api.cloudflare.com/client/v4/zones/e39df17b9c4ef44cbce2646346ee6d33/purge_cache
+72
View File
@@ -0,0 +1,72 @@
name: Deploy frontend preview
on:
pull_request:
paths:
- 'apps/frontend/**/*'
- 'packages/ui/**/*'
- 'packages/utils/**/*'
- 'packages/assets/**/*'
- '**/wrangler.jsonc'
- '**/pnpm-*.yaml'
- '.github/workflows/frontend-preview.yml'
jobs:
deploy:
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
uses: ./.github/workflows/frontend-deploy.yml
secrets: inherit
strategy:
matrix:
environment: [staging-preview, production-preview]
with:
environment: ${{ matrix.environment }}
comment:
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
needs: deploy
steps:
- name: Download deployment URLs
uses: actions/download-artifact@v7
with:
pattern: deployment-url-*
merge-multiple: true
- name: Read deployment URLs
id: urls
run: |
STAGING_PREVIEW_URL=$(cat deployment-url-staging-preview.txt)
PRODUCTION_PREVIEW_URL=$(cat deployment-url-production-preview.txt)
echo "Production preview URL: $PRODUCTION_PREVIEW_URL"
echo "Staging preview URL: $STAGING_PREVIEW_URL"
echo "staging-preview-url=$STAGING_PREVIEW_URL" >> $GITHUB_OUTPUT
echo "production-preview-url=$PRODUCTION_PREVIEW_URL" >> $GITHUB_OUTPUT
- name: Find comment
if: github.event_name == 'pull_request'
uses: peter-evans/find-comment@v3
id: fc
with:
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:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.fc.outputs.comment-id }}
body: |
## Frontend previews
Last deployed commit is [${{ github.sha }}](${{ github.event.pull_request.head.repo.html_url }}/commit/${{ github.sha }})
| Environment | URL |
|-------------|-----|
| staging | ${{ steps.urls.outputs.staging-preview-url }} |
| production | ${{ steps.urls.outputs.production-preview-url }} |
edit-mode: replace
+39 -18
View File
@@ -19,7 +19,7 @@ on:
sign-windows-binaries:
description: Sign Windows binaries
type: boolean
default: true
default: false
required: false
jobs:
@@ -40,33 +40,48 @@ jobs:
runs-on: ${{ matrix.platform }}
steps:
- name: 📥 Check out code
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 🧰 Setup Rust toolchain
- name: Setup Rust toolchain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
rustflags: ''
target: ${{ startsWith(matrix.platform, 'macos') && 'x86_64-apple-darwin' || '' }}
- name: 🧰 Install pnpm
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: 🧰 Setup Node.js
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: pnpm
- name: 🧰 Install Linux build dependencies
- name: Generate tauri-dev.conf.json
shell: bash
run: |
GIT_HASH=$(git rev-parse --short HEAD)
cat > apps/app/tauri-dev.conf.json <<EOF
{
"productName": "Modrinth App (dev-${GIT_HASH})",
"mainBinaryName": "Modrinth App (dev-${GIT_HASH})",
"identifier": "ModrinthApp-dev-${GIT_HASH}",
"bundle": {
"fileAssociations": []
}
}
EOF
- name: Install Linux build dependencies
if: startsWith(matrix.platform, 'ubuntu')
run: |
sudo apt-get update
sudo apt-get install -yq libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
- name: 🧰 Setup Dasel
- name: Setup Dasel
uses: jaxxstorm/action-install-gh-release@v2.1.0
with:
repo: TomWright/dasel
@@ -75,7 +90,7 @@ jobs:
rename-to: ${{ startsWith(matrix.platform, 'windows') && 'dasel.exe' || 'dasel' }}
chmod: 0755
- name: ⚙️ Set application version and environment
- name: Set application version and environment
shell: bash
run: |
APP_VERSION="$(git describe --tags --always | sed -E 's/-([0-9]+)-(g[0-9a-fA-F]+)$/-canary+\1.\2/')"
@@ -86,13 +101,13 @@ jobs:
cp packages/app-lib/.env.prod packages/app-lib/.env
- name: 💨 Setup Turbo cache
- name: Setup Turbo cache
uses: rharkor/caching-for-turbo@v1.8
- name: 🧰 Install dependencies
- name: Install dependencies
run: pnpm install
- name: ✍️ Set up Windows code signing
- name: Set up Windows code signing
if: startsWith(matrix.platform, 'windows')
shell: bash
run: |
@@ -102,8 +117,8 @@ jobs:
dasel delete -f apps/app/tauri-release.conf.json 'bundle.windows.signCommand'
fi
- name: 🔨 Build macOS app
run: pnpm --filter=@modrinth/app run tauri build --target universal-apple-darwin --config tauri-release.conf.json
- name: Build macOS app
run: ${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && 'pnpm --filter=@modrinth/app run tauri build --target universal-apple-darwin --config tauri-release.conf.json' || 'pnpm --filter=@modrinth/app run tauri build --target universal-apple-darwin --config tauri-dev.conf.json' }}
if: startsWith(matrix.platform, 'macos')
env:
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
@@ -116,19 +131,19 @@ jobs:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
- name: 🔨 Build Linux app
run: pnpm --filter=@modrinth/app run tauri build --config tauri-release.conf.json
- name: Build Linux app
run: ${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && 'pnpm --filter=@modrinth/app run tauri build --config tauri-release.conf.json' || 'pnpm --filter=@modrinth/app run tauri build --config tauri-dev.conf.json' }}
if: startsWith(matrix.platform, 'ubuntu')
env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
- name: 🔨 Build Windows app
- name: Build Windows app
run: |
[System.Convert]::FromBase64String("$env:DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_BASE64") | Set-Content -Path signer-client-cert.p12 -AsByteStream
$env:DIGICERT_ONE_SIGNER_CREDENTIALS = "$env:DIGICERT_ONE_SIGNER_API_KEY|$PWD\signer-client-cert.p12|$env:DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_PASSWORD"
$env:JAVA_HOME = "$env:JAVA_HOME_17_X64"
pnpm --filter=@modrinth/app run tauri build --config tauri-release.conf.json --verbose --bundles 'nsis,updater'
${{ (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) && 'pnpm --filter=@modrinth/app run tauri build --config tauri-release.conf.json --verbose --bundles "nsis,updater"' || 'pnpm --filter=@modrinth/app run tauri build --config tauri-dev.conf.json --verbose --bundles "nsis,updater"' }}
Remove-Item -Path signer-client-cert.p12 -ErrorAction SilentlyContinue
if: startsWith(matrix.platform, 'windows')
env:
@@ -138,7 +153,7 @@ jobs:
DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_BASE64: ${{ secrets.DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_BASE64 }}
DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_PASSWORD: ${{ secrets.DIGICERT_ONE_SIGNER_CLIENT_CERTIFICATE_PASSWORD }}
- name: 📤 Upload app bundles
- name: Upload app bundles
uses: actions/upload-artifact@v4
with:
name: App bundle (${{ matrix.artifact-target-name }})
@@ -146,7 +161,13 @@ jobs:
target/release/bundle/appimage/Modrinth App_*.AppImage*
target/release/bundle/deb/Modrinth App_*.deb*
target/release/bundle/rpm/Modrinth App-*.rpm*
target/release/bundle/appimage/Modrinth App (dev-*)_*.AppImage*
target/release/bundle/deb/Modrinth App (dev-*)_*.deb*
target/release/bundle/rpm/Modrinth App (dev-*)-*.rpm*
target/universal-apple-darwin/release/bundle/macos/Modrinth App.app.tar.gz*
target/universal-apple-darwin/release/bundle/macos/Modrinth App (dev-*)*.app.tar.gz
target/universal-apple-darwin/release/bundle/dmg/Modrinth App (dev-*)*.dmg
target/universal-apple-darwin/release/bundle/dmg/Modrinth App_*.dmg*
target/release/bundle/nsis/Modrinth App_*-setup.exe*
target/release/bundle/nsis/Modrinth App (dev-*)_*-setup.exe*
target/release/bundle/nsis/Modrinth App_*-setup.nsis.zip*
+19 -5
View File
@@ -70,23 +70,37 @@ jobs:
- name: 🧰 Install dependencies
run: pnpm install
- name: ⚙️ Set app environment
working-directory: packages/app-lib
run: cp .env.staging .env
# check if labrinth tests will actually run (cache miss)
- name: 🔍 Check if labrinth tests need to run
id: check-labrinth
run: |
LABRINTH_TEST_STATUS=$(pnpm turbo run test --filter=@modrinth/labrinth --dry-run=json | jq -r '.tasks[] | select(.task == "test") | .cache.status')
echo "Labrinth test cache status: $LABRINTH_TEST_STATUS"
if [ "$LABRINTH_TEST_STATUS" = "HIT" ]; then
echo "needs_services=false" >> $GITHUB_OUTPUT
else
echo "needs_services=true" >> $GITHUB_OUTPUT
fi
- name: ⚙️ Start services
if: steps.check-labrinth.outputs.needs_services == 'true'
run: docker compose up --wait
- name: ⚙️ Setup labrinth environment and database
if: steps.check-labrinth.outputs.needs_services == 'true'
working-directory: apps/labrinth
run: |
cp .env.local .env
sqlx database setup
- name: ⚙️ Set app environment
working-directory: packages/app-lib
run: cp .env.staging .env
- name: 🔍 Lint and test
run: pnpm run ci
- name: 🔍 Verify intl:extract has been run
run: |
pnpm intl:extract
pnpm turbo run intl:extract --force
git diff --exit-code --color */*/src/locales/en-US/index.json
+9
View File
@@ -65,6 +65,15 @@ app-playground-data/*
.astro
.claude
.letta
# labrinth demo fixtures
apps/labrinth/fixtures/demo
*storybook.log
storybook-static
.wrangler/
# frontend robots.txt
apps/frontend/src/public/robots.txt
+5
View File
@@ -12,6 +12,11 @@
<sourceFolder url="file://$MODULE_DIR$/packages/app-lib/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/ariadne/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/path-util/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/modrinth-log/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/modrinth-maxmind/examples" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/modrinth-maxmind/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/modrinth-util/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/packages/muralpay/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
+3 -3
View File
@@ -16,13 +16,13 @@ Both have access to our dependency injection framework, examples as seen in `pac
### Website (apps/frontend)
Before a pull request can be opened for the website, `pnpm web:fix` and `pnpm web:intl:extract` must be run, otherwise CI will fail.
Before a pull request can be opened for the website, run `pnpm prepr:frontend:web` from the root folder, otherwise CI will fail.
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.
### App Frontend (apps/app-frontend)
Before a pull request can be opened for the website, you must CD into the `app-frontend` folder; `pnpm fix` and `pnpm intl:extract` must be run, otherwise CI will fail.
Before a pull request can be opened for the app frontend, run `pnpm prepr:frontend:app` from the root folder, otherwise CI will fail.
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.
@@ -56,7 +56,7 @@ Use `docker exec labrinth-clickhouse clickhouse-client` to access the Clickhouse
### Postgres
Use `docker exec labrinth-postgres psql -U postgres` to access the PostgreSQL instance.
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.
# Guidelines
+5 -1
View File
@@ -8,10 +8,14 @@ For detailed information, consult each package's COPYING.md, LICENSE.txt, or LIC
The use of Modrinth branding elements, including but not limited to the wrench-in-labyrinth logo, the landing image, and any variations thereof, is strictly prohibited without explicit written permission from Rinth, Inc. This includes trademarks, logos, or other branding elements.
> All rights reserved. © 2020-2024 Rinth, Inc.
> All rights reserved. © 2020-2025 Rinth, Inc.
This includes, but may not be limited to, the following files:
- .idea/icon.svg
- .github/api_cover.png
- .github/app_cover.png
- .github/monorepo_cover.png
- .github/web_cover.png
If you fork this repository, you must remove all Modrinth branding assets from your fork.
Generated
+617 -36
View File
@@ -521,6 +521,22 @@ dependencies = [
"zbus",
]
[[package]]
name = "astral-tokio-tar"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec179a06c1769b1e42e1e2cbe74c7dcdb3d6383c838454d063eaac5bbb7ebbe5"
dependencies = [
"filetime",
"futures-core",
"libc",
"portable-atomic",
"rustc-hash",
"tokio",
"tokio-stream",
"xattr",
]
[[package]]
name = "async-broadcast"
version = "0.7.2"
@@ -671,6 +687,28 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "async-stream"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
dependencies = [
"async-stream-impl",
"futures-core",
"pin-project-lite",
]
[[package]]
name = "async-stream-impl"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.106",
]
[[package]]
name = "async-stripe"
version = "0.41.0"
@@ -892,6 +930,49 @@ dependencies = [
"thiserror 2.0.17",
]
[[package]]
name = "axum"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8"
dependencies = [
"axum-core",
"bytes",
"futures-util",
"http 1.3.1",
"http-body 1.0.1",
"http-body-util",
"itoa",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"serde_core",
"sync_wrapper",
"tower",
"tower-layer",
"tower-service",
]
[[package]]
name = "axum-core"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
dependencies = [
"bytes",
"futures-core",
"http 1.3.1",
"http-body 1.0.1",
"http-body-util",
"mime",
"pin-project-lite",
"sync_wrapper",
"tower-layer",
"tower-service",
]
[[package]]
name = "backtrace"
version = "0.3.76"
@@ -1066,6 +1147,83 @@ dependencies = [
"piper",
]
[[package]]
name = "bollard"
version = "0.19.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87a52479c9237eb04047ddb94788c41ca0d26eaff8b697ecfbb4c32f7fdc3b1b"
dependencies = [
"async-stream",
"base64 0.22.1",
"bitflags 2.9.4",
"bollard-buildkit-proto",
"bollard-stubs",
"bytes",
"chrono",
"futures-core",
"futures-util",
"hex",
"home",
"http 1.3.1",
"http-body-util",
"hyper 1.7.0",
"hyper-named-pipe",
"hyper-rustls 0.27.7",
"hyper-util",
"hyperlocal",
"log",
"num",
"pin-project-lite",
"rand 0.9.2",
"rustls 0.23.32",
"rustls-native-certs 0.8.1",
"rustls-pemfile 2.2.0",
"rustls-pki-types",
"serde",
"serde_derive",
"serde_json",
"serde_repr",
"serde_urlencoded",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
"tokio-util",
"tonic 0.14.2",
"tower-service",
"url",
"winapi",
]
[[package]]
name = "bollard-buildkit-proto"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85a885520bf6249ab931a764ffdb87b0ceef48e6e7d807cfdb21b751e086e1ad"
dependencies = [
"prost 0.14.3",
"prost-types",
"tonic 0.14.2",
"tonic-prost",
"ureq",
]
[[package]]
name = "bollard-stubs"
version = "1.49.1-rc.28.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5731fe885755e92beff1950774068e0cae67ea6ec7587381536fca84f1779623"
dependencies = [
"base64 0.22.1",
"bollard-buildkit-proto",
"bytes",
"chrono",
"prost 0.14.3",
"serde",
"serde_json",
"serde_repr",
"serde_with",
]
[[package]]
name = "borsh"
version = "1.5.7"
@@ -2089,30 +2247,28 @@ checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376"
[[package]]
name = "deadpool"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0be2b1d1d6ec8d846f05e137292d0b89133caf95ef33695424c09568bdd39b1b"
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
dependencies = [
"deadpool-runtime",
"lazy_static",
"num_cpus",
"tokio",
"tracing",
]
[[package]]
name = "deadpool-redis"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0965b977f1244bc3783bb27cd79cfcff335a8341da18f79232d00504b18eb1a"
version = "0.22.1"
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
dependencies = [
"deadpool",
"redis",
"tracing",
]
[[package]]
name = "deadpool-runtime"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b"
version = "0.1.5"
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
dependencies = [
"tokio",
]
@@ -2378,6 +2534,17 @@ dependencies = [
"const-random",
]
[[package]]
name = "docker_credential"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d89dfcba45b4afad7450a99b39e751590463e45c04728cf555d36bb66940de8"
dependencies = [
"base64 0.21.7",
"serde",
"serde_json",
]
[[package]]
name = "document-features"
version = "0.2.11"
@@ -2679,6 +2846,17 @@ dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "etcetera"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26c7b13d0780cb82722fd59f6f57f925e143427e4a75313a6c77243bf5326ae6"
dependencies = [
"cfg-if",
"home",
"windows-sys 0.59.0",
]
[[package]]
name = "event-listener"
version = "2.5.3"
@@ -3801,6 +3979,21 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-named-pipe"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278"
dependencies = [
"hex",
"hyper 1.7.0",
"hyper-util",
"pin-project-lite",
"tokio",
"tower-service",
"winapi",
]
[[package]]
name = "hyper-rustls"
version = "0.24.2"
@@ -3835,6 +4028,19 @@ dependencies = [
"webpki-roots 1.0.3",
]
[[package]]
name = "hyper-timeout"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0"
dependencies = [
"hyper 1.7.0",
"hyper-util",
"pin-project-lite",
"tokio",
"tower-service",
]
[[package]]
name = "hyper-tls"
version = "0.6.0"
@@ -3877,6 +4083,21 @@ dependencies = [
"windows-registry",
]
[[package]]
name = "hyperlocal"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7"
dependencies = [
"hex",
"http-body-util",
"hyper 1.7.0",
"hyper-util",
"pin-project-lite",
"tokio",
"tower-service",
]
[[package]]
name = "iana-time-zone"
version = "0.1.64"
@@ -4523,6 +4744,7 @@ dependencies = [
"const_format",
"dashmap",
"deadpool-redis",
"derive_more 2.0.1",
"dotenv-build",
"dotenvy",
"either",
@@ -4541,7 +4763,6 @@ dependencies = [
"labrinth",
"lettre",
"meilisearch-sdk",
"modrinth-maxmind",
"modrinth-util",
"muralpay",
"murmur2",
@@ -4559,7 +4780,6 @@ dependencies = [
"rustls 0.23.32",
"rusty-money",
"sentry",
"sentry-actix",
"serde",
"serde_json",
"serde_with",
@@ -4567,6 +4787,7 @@ dependencies = [
"sha2",
"spdx",
"sqlx",
"sqlx-tracing",
"strum",
"thiserror 2.0.17",
"tikv-jemalloc-ctl",
@@ -4889,6 +5110,12 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
[[package]]
name = "matchit"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
[[package]]
name = "maxminddb"
version = "0.26.0"
@@ -5056,6 +5283,18 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "modrinth-log"
version = "0.0.0"
dependencies = [
"dotenvy",
"eyre",
"sentry",
"tracing",
"tracing-ecs",
"tracing-subscriber",
]
[[package]]
name = "modrinth-maxmind"
version = "0.0.0"
@@ -5082,10 +5321,11 @@ dependencies = [
"derive_more 2.0.1",
"dotenvy",
"eyre",
"modrinth-log",
"rust_decimal",
"serde",
"tracing",
"tracing-ecs",
"tracing-subscriber",
"serde_json",
"utoipa",
]
[[package]]
@@ -5141,13 +5381,10 @@ dependencies = [
name = "muralpay"
version = "0.1.0"
dependencies = [
"arc-swap",
"bytes",
"chrono",
"clap",
"color-eyre",
"derive_more 2.0.1",
"dotenvy",
"eyre",
"reqwest",
"rust_decimal",
"rust_iso3166",
@@ -5156,8 +5393,6 @@ dependencies = [
"serde_json",
"serde_with",
"strum",
"tokio",
"tracing-subscriber",
"utoipa",
"uuid 1.18.1",
]
@@ -5866,6 +6101,124 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "opentelemetry"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6"
dependencies = [
"futures-core",
"futures-sink",
"js-sys",
"pin-project-lite",
"thiserror 2.0.17",
"tracing",
]
[[package]]
name = "opentelemetry-appender-tracing"
version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e68f63eca5fad47e570e00e893094fc17be959c80c79a7d6ec1abdd5ae6ffc16"
dependencies = [
"opentelemetry",
"tracing",
"tracing-core",
"tracing-log",
"tracing-opentelemetry",
"tracing-subscriber",
]
[[package]]
name = "opentelemetry-http"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d"
dependencies = [
"async-trait",
"bytes",
"http 1.3.1",
"opentelemetry",
"reqwest",
]
[[package]]
name = "opentelemetry-otlp"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b"
dependencies = [
"http 1.3.1",
"opentelemetry",
"opentelemetry-http",
"opentelemetry-proto",
"opentelemetry_sdk",
"prost 0.13.5",
"reqwest",
"thiserror 2.0.17",
"tokio",
"tonic 0.13.1",
"tracing",
]
[[package]]
name = "opentelemetry-proto"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc"
dependencies = [
"opentelemetry",
"opentelemetry_sdk",
"prost 0.13.5",
"tonic 0.13.1",
]
[[package]]
name = "opentelemetry-semantic-conventions"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83d059a296a47436748557a353c5e6c5705b9470ef6c95cfc52c21a8814ddac2"
[[package]]
name = "opentelemetry-testing"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "562407eb254fea88076c8a410a733a8ee2075fd9c7fbde3da2a03d29e2cef104"
dependencies = [
"anyhow",
"opentelemetry",
"opentelemetry-appender-tracing",
"opentelemetry-otlp",
"opentelemetry-semantic-conventions",
"opentelemetry_sdk",
"serde",
"serde_json",
"serial_test",
"tempfile",
"testcontainers",
"tokio",
"tracing-opentelemetry",
"tracing-subscriber",
]
[[package]]
name = "opentelemetry_sdk"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b"
dependencies = [
"futures-channel",
"futures-executor",
"futures-util",
"opentelemetry",
"percent-encoding",
"rand 0.9.2",
"serde_json",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
]
[[package]]
name = "option-ext"
version = "0.2.0"
@@ -5990,6 +6343,31 @@ dependencies = [
"windows-link 0.2.1",
]
[[package]]
name = "parse-display"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a"
dependencies = [
"parse-display-derive",
"regex",
"regex-syntax",
]
[[package]]
name = "parse-display-derive"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281"
dependencies = [
"proc-macro2",
"quote",
"regex",
"regex-syntax",
"structmeta",
"syn 2.0.106",
]
[[package]]
name = "parse-size"
version = "1.1.0"
@@ -6377,7 +6755,7 @@ dependencies = [
"inferno",
"num",
"paste",
"prost",
"prost 0.13.5",
]
[[package]]
@@ -6583,7 +6961,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"
dependencies = [
"bytes",
"prost-derive",
"prost-derive 0.13.5",
]
[[package]]
name = "prost"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
dependencies = [
"bytes",
"prost-derive 0.14.3",
]
[[package]]
@@ -6599,6 +6987,28 @@ dependencies = [
"syn 2.0.106",
]
[[package]]
name = "prost-derive"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
dependencies = [
"anyhow",
"itertools 0.14.0",
"proc-macro2",
"quote",
"syn 2.0.106",
]
[[package]]
name = "prost-types"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7"
dependencies = [
"prost 0.14.3",
]
[[package]]
name = "protobuf"
version = "3.7.2"
@@ -7626,6 +8036,15 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "scc"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc"
dependencies = [
"sdd",
]
[[package]]
name = "schannel"
version = "0.1.28"
@@ -7717,6 +8136,12 @@ dependencies = [
"untrusted",
]
[[package]]
name = "sdd"
version = "3.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca"
[[package]]
name = "seahash"
version = "4.1.0"
@@ -7840,19 +8265,6 @@ dependencies = [
"ureq",
]
[[package]]
name = "sentry-actix"
version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc694e6ffc8d5d7fdb2a33923b0358f6ad41c0b428ced034b349b9e2b08260bc"
dependencies = [
"actix-http",
"actix-web",
"bytes",
"futures-util",
"sentry-core",
]
[[package]]
name = "sentry-backtrace"
version = "0.45.0"
@@ -8176,6 +8588,32 @@ dependencies = [
"syn 2.0.106",
]
[[package]]
name = "serial_test"
version = "3.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d0b343e184fc3b7bb44dff0705fffcf4b3756ba6aff420dddd8b24ca145e555"
dependencies = [
"futures-executor",
"futures-util",
"log",
"once_cell",
"parking_lot",
"scc",
"serial_test_derive",
]
[[package]]
name = "serial_test_derive"
version = "3.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.106",
]
[[package]]
name = "serialize-to-javascript"
version = "0.1.2"
@@ -8582,7 +9020,7 @@ dependencies = [
"chrono",
"crc",
"dotenvy",
"etcetera",
"etcetera 0.8.0",
"futures-channel",
"futures-core",
"futures-util",
@@ -8635,6 +9073,20 @@ dependencies = [
"uuid 1.18.1",
]
[[package]]
name = "sqlx-tracing"
version = "0.2.0"
dependencies = [
"derive_more 2.0.1",
"futures",
"opentelemetry",
"opentelemetry-testing",
"sqlx",
"testcontainers",
"tokio",
"tracing",
]
[[package]]
name = "stable_deref_trait"
version = "1.2.1"
@@ -9411,6 +9863,35 @@ dependencies = [
"winapi",
]
[[package]]
name = "testcontainers"
version = "0.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f3ac71069f20ecfa60c396316c283fbf35e6833a53dff551a31b5458da05edc"
dependencies = [
"astral-tokio-tar",
"async-trait",
"bollard",
"bytes",
"docker_credential",
"either",
"etcetera 0.10.0",
"futures",
"log",
"memchr",
"parse-display",
"pin-project-lite",
"serde",
"serde_json",
"serde_with",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
"tokio-util",
"ulid",
"url",
]
[[package]]
name = "theseus"
version = "1.0.0-local"
@@ -9448,6 +9929,7 @@ dependencies = [
"notify",
"notify-debouncer-mini",
"p256",
"parking_lot",
"paste",
"path-util",
"phf 0.13.1",
@@ -9876,6 +10358,72 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2"
[[package]]
name = "tonic"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9"
dependencies = [
"async-trait",
"base64 0.22.1",
"bytes",
"http 1.3.1",
"http-body 1.0.1",
"http-body-util",
"hyper 1.7.0",
"hyper-timeout",
"hyper-util",
"percent-encoding",
"pin-project",
"prost 0.13.5",
"tokio",
"tokio-stream",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tonic"
version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203"
dependencies = [
"async-trait",
"axum",
"base64 0.22.1",
"bytes",
"h2 0.4.12",
"http 1.3.1",
"http-body 1.0.1",
"http-body-util",
"hyper 1.7.0",
"hyper-timeout",
"hyper-util",
"percent-encoding",
"pin-project",
"socket2 0.6.1",
"sync_wrapper",
"tokio",
"tokio-stream",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tonic-prost"
version = "0.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67"
dependencies = [
"bytes",
"prost 0.14.3",
"tonic 0.14.2",
]
[[package]]
name = "totp-rs"
version = "5.7.0"
@@ -9898,11 +10446,15 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
dependencies = [
"futures-core",
"futures-util",
"indexmap 2.11.4",
"pin-project-lite",
"slab",
"sync_wrapper",
"tokio",
"tokio-util",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
@@ -10018,6 +10570,24 @@ dependencies = [
"tracing-core",
]
[[package]]
name = "tracing-opentelemetry"
version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c"
dependencies = [
"js-sys",
"once_cell",
"opentelemetry",
"opentelemetry_sdk",
"smallvec",
"tracing",
"tracing-core",
"tracing-log",
"tracing-subscriber",
"web-time",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.20"
@@ -10113,6 +10683,16 @@ dependencies = [
"winapi",
]
[[package]]
name = "ulid"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe"
dependencies = [
"rand 0.9.2",
"web-time",
]
[[package]]
name = "uname"
version = "0.1.1"
@@ -10342,6 +10922,7 @@ dependencies = [
"quote",
"regex",
"syn 2.0.106",
"url",
"uuid 1.18.1",
]
+7 -4
View File
@@ -8,6 +8,7 @@ members = [
"packages/app-lib",
"packages/ariadne",
"packages/daedalus",
"packages/modrinth-log",
"packages/modrinth-maxmind",
"packages/modrinth-util",
"packages/path-util",
@@ -59,7 +60,7 @@ const_format = "0.2.34"
daedalus = { path = "packages/daedalus" }
dashmap = "6.1.0"
data-url = "0.3.2"
deadpool-redis = "0.22.0"
deadpool-redis = { git = "https://github.com/modrinth/deadpool", rev = "db5fb00b036ecc8fe5f18853c559b745ffe47bde", version = "0.22.1" }
derive_more = "2.0.1"
directories = "6.0.0"
dirs = "6.0.0"
@@ -107,7 +108,7 @@ lettre = { version = "0.11.19", default-features = false, features = [
] }
maxminddb = "0.26.0"
meilisearch-sdk = { version = "0.30.0", default-features = false }
modrinth-maxmind = { path = "packages/modrinth-maxmind" }
modrinth-log = { path = "packages/modrinth-log" }
modrinth-util = { path = "packages/modrinth-util" }
muralpay = { path = "packages/muralpay" }
murmur2 = "0.1.0"
@@ -115,6 +116,7 @@ native-dialog = "0.9.2"
notify = { version = "8.2.0", default-features = false }
notify-debouncer-mini = { version = "0.7.0", default-features = false }
p256 = "0.13.2"
parking_lot = "0.12.5"
paste = "1.0.15"
path-util = { path = "packages/path-util" }
phf = { version = "0.13.1", features = ["macros"] }
@@ -149,7 +151,6 @@ sentry = { version = "0.45.0", default-features = false, features = [
"reqwest",
"rustls",
] }
sentry-actix = "0.45.0"
serde = "1.0.228"
serde_bytes = "0.11.19"
serde_cbor = "0.11.2"
@@ -163,6 +164,7 @@ sha2 = "0.10.9"
shlex = "1.3.0"
spdx = "0.12.0"
sqlx = { version = "0.8.6", default-features = false }
sqlx-tracing = { path = "packages/sqlx-tracing" }
strum = "0.27.2"
sysinfo = { version = "0.37.2", default-features = false }
tar = "0.4.44"
@@ -238,7 +240,7 @@ manual_assert = "warn"
manual_instant_elapsed = "warn"
manual_is_variant_and = "warn"
manual_let_else = "warn"
map_unwrap_or = "warn"
map_unwrap_or = "allow"
match_bool = "warn"
needless_collect = "warn"
negative_feature_names = "warn"
@@ -268,4 +270,5 @@ codegen-units = 1 # Compile crates one after another so the compiler can optimi
# Specific profile for labrinth production builds
[profile.release-labrinth]
inherits = "release"
strip = false # Keep debug symbols for Sentry
panic = "unwind" # Don't exit the whole app on panic in production
+4
View File
@@ -17,3 +17,7 @@ extend-exclude = [
tou = "tou"
# Google Ad Manager
gam = "gam"
# short for "constants"
consts = "consts"
# short for "Copy"
Cpy = "Cpy"
+2 -6
View File
@@ -1,13 +1,9 @@
# Copying
The source code of the theseus repository is licensed under the GNU General Public License, Version 3 only, which is provided in the file [LICENSE](./LICENSE). However, some files listed below are licensed under a different license.
The source code of Modrinth App's frontend is licensed under the GNU General Public License, Version 3 only, which is provided in the file [LICENSE](./LICENSE). However, some files listed below are licensed under a different license.
## Modrinth logo
The use of Modrinth branding elements, including but not limited to the wrench-in-labyrinth logo, the landing image, and any variations thereof, is strictly prohibited without explicit written permission from Rinth, Inc. This includes trademarks, logos, or other branding elements.
> All rights reserved. © 2020-2023 Rinth, Inc.
This includes, but may not be limited to, the following files:
- theseus_gui/src-tauri/icons/\*
> All rights reserved. © 2020-2025 Rinth, Inc.
+11 -7
View File
@@ -13,11 +13,13 @@
"test": "vue-tsc --noEmit"
},
"dependencies": {
"@sfirew/minecraft-motd-parser": "^1.1.6",
"@modrinth/api-client": "workspace:^",
"@modrinth/assets": "workspace:*",
"@modrinth/ui": "workspace:*",
"@modrinth/utils": "workspace:*",
"@sentry/vue": "^8.27.0",
"@sfirew/minecraft-motd-parser": "^1.1.6",
"@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",
@@ -26,27 +28,28 @@
"@tauri-apps/plugin-updater": "^2.7.1",
"@tauri-apps/plugin-window-state": "^2.2.2",
"@types/three": "^0.172.0",
"@vintl/vintl": "^4.4.1",
"intl-messageformat": "^10.7.7",
"vue-i18n": "^10.0.0",
"@vueuse/core": "^11.1.0",
"dayjs": "^1.11.10",
"floating-vue": "^5.2.2",
"ofetch": "^1.3.4",
"pinia": "^2.1.7",
"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-router": "4.3.0",
"vue-router": "^4.6.0",
"vue-virtual-scroller": "v2.0.0-beta.8"
},
"devDependencies": {
"@modrinth/tooling-config": "workspace:*",
"@eslint/compat": "^1.1.1",
"@formatjs/cli": "^6.2.12",
"@modrinth/tooling-config": "workspace:*",
"@nuxt/eslint-config": "^0.5.6",
"@taijased/vue-render-tracker": "^1.0.7",
"@vitejs/plugin-vue": "^5.0.4",
"@vitejs/plugin-vue": "^6.0.3",
"autoprefixer": "^10.4.19",
"eslint": "^9.9.1",
"eslint-plugin-turbo": "^2.5.4",
@@ -55,7 +58,8 @@
"sass": "^1.74.1",
"tailwindcss": "^3.4.4",
"typescript": "^5.5.4",
"vite": "^5.4.6",
"vite": "^6.0.0",
"vue-component-type-helpers": "^3.1.8",
"vue-tsc": "^2.1.6"
},
"packageManager": "pnpm@9.4.0",
+110 -24
View File
@@ -1,4 +1,5 @@
<script setup>
import { AuthFeature, PanelVersionFeature, TauriModrinthClient } from '@modrinth/api-client'
import {
ArrowBigUpDashIcon,
ChangeSkinIcon,
@@ -18,30 +19,38 @@ import {
RefreshCwIcon,
RestoreIcon,
RightArrowIcon,
ServerIcon,
SettingsIcon,
UserIcon,
WorldIcon,
XIcon,
} from '@modrinth/assets'
import {
Admonition,
Avatar,
Button,
ButtonStyled,
commonMessages,
defineMessages,
I18nDebugPanel,
NewsArticleCard,
NotificationPanel,
OverflowMenu,
ProgressSpinner,
provideModrinthClient,
provideNotificationManager,
providePageContext,
useDebugLogger,
useVIntl,
} from '@modrinth/ui'
import { renderString } from '@modrinth/utils'
import { useQuery } from '@tanstack/vue-query'
import { getVersion } from '@tauri-apps/api/app'
import { invoke } from '@tauri-apps/api/core'
import { getCurrentWindow } from '@tauri-apps/api/window'
import { openUrl } from '@tauri-apps/plugin-opener'
import { type } from '@tauri-apps/plugin-os'
import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state'
import { defineMessages, useVIntl } from '@vintl/vintl'
import { $fetch } from 'ofetch'
import { computed, onMounted, onUnmounted, provide, ref, watch } from 'vue'
import { RouterView, useRoute, useRouter } from 'vue-router'
@@ -63,11 +72,13 @@ 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 { check_reachable } from '@/helpers/auth.js'
import { get_user } from '@/helpers/cache.js'
import { command_listener, warning_listener } from '@/helpers/events.js'
import { useFetch } from '@/helpers/fetch.js'
@@ -83,6 +94,7 @@ import {
isDev,
isNetworkMetered,
} from '@/helpers/utils.js'
import i18n from '@/i18n.config'
import {
provideAppUpdateDownloadProgress,
subscribeToDownloadProgress,
@@ -102,6 +114,20 @@ const notificationManager = new AppNotificationManager()
provideNotificationManager(notificationManager)
const { handleError, addNotification } = notificationManager
const tauriApiClient = new TauriModrinthClient({
userAgent: `modrinth/theseus/${getVersion()} (support@modrinth.com)`,
features: [
new AuthFeature({
token: async () => (await getCreds()).session,
}),
new PanelVersionFeature(),
],
})
provideModrinthClient(tauriApiClient)
providePageContext({
hierarchicalSidebarAvailable: ref(true),
showAds: ref(false),
})
const news = ref([])
const availableSurvey = ref(false)
@@ -119,6 +145,7 @@ const showOnboarding = ref(false)
const nativeDecorations = ref(false)
const os = ref('')
const isDevEnvironment = ref(false)
const stateInitialized = ref(false)
@@ -126,6 +153,27 @@ const criticalErrorMessage = ref()
const isMaximized = ref(false)
const authUnreachableDebug = useDebugLogger('AuthReachableChecker')
const authServerQuery = useQuery({
queryKey: ['authServerReachability'],
queryFn: async () => {
await check_reachable()
authUnreachableDebug('Auth servers are reachable')
return true
},
refetchInterval: 5 * 60 * 1000, // 5 minutes
retry: false,
refetchOnWindowFocus: false,
})
const authUnreachable = computed(() => {
if (authServerQuery.isError.value && !authServerQuery.isLoading.value) {
console.warn('Failed to reach auth servers', authServerQuery.error.value)
return true
}
return false
})
onMounted(async () => {
await useCheckDisableMouseover()
@@ -164,13 +212,22 @@ const messages = defineMessages({
id: 'app.update.downloading-update',
defaultMessage: 'Downloading update ({percent}%)',
},
authUnreachableHeader: {
id: 'app.auth-servers.unreachable.header',
defaultMessage: 'Cannot reach authentication servers',
},
authUnreachableBody: {
id: 'app.auth-servers.unreachable.body',
defaultMessage:
'Minecraft authentication servers may be down right now. Check your internet connection and try again later.',
},
})
async function setupApp() {
stateInitialized.value = true
const {
native_decorations,
theme,
locale,
telemetry,
collapsed_navigation,
advanced_rendering,
@@ -182,12 +239,18 @@ async function setupApp() {
pending_update_toast_for_version,
} = await getSettings()
// Initialize locale from saved settings
if (locale) {
i18n.global.locale.value = locale
}
if (default_page === 'Library') {
await router.push('/library')
}
os.value = await getOS()
const dev = await isDev()
isDevEnvironment.value = dev
const version = await getVersion()
showOnboarding.value = !onboarded
@@ -200,6 +263,7 @@ async function setupApp() {
themeStore.toggleSidebar = toggle_sidebar
themeStore.devMode = developer_mode
themeStore.featureFlags = feature_flags
stateInitialized.value = true
isMaximized.value = await getCurrentWindow().isMaximized()
@@ -312,7 +376,11 @@ const handleClose = async () => {
const router = useRouter()
router.afterEach((to, from, failure) => {
trackEvent('PageView', { path: to.path, fromPath: from.path, failed: failure })
trackEvent('PageView', {
path: to.path,
fromPath: from.path,
failed: failure,
})
})
const route = useRoute()
@@ -336,7 +404,7 @@ async function fetchCredentials() {
if (creds && creds.user_id) {
creds.user = await get_user(creds.user_id).catch(handleError)
}
credentials.value = creds
credentials.value = creds ?? null
}
async function signIn() {
@@ -383,20 +451,18 @@ const forceSidebar = computed(
() => route.path.startsWith('/browse') || route.path.startsWith('/project'),
)
const sidebarVisible = computed(() => sidebarToggled.value || forceSidebar.value)
const showAd = computed(() => !(!sidebarVisible.value || hasPlus.value))
watch(
showAd,
() => {
if (!showAd.value) {
hide_ads_window(true)
} else {
init_ads_window(true)
}
},
{ immediate: true },
const showAd = computed(
() => sidebarVisible.value && !hasPlus.value && credentials.value !== undefined,
)
watch(showAd, () => {
if (!showAd.value) {
hide_ads_window(true)
} else {
init_ads_window(true)
}
})
onMounted(() => {
invoke('show_window')
@@ -443,21 +509,23 @@ const restarting = ref(false)
const updateToastDismissed = ref(false)
const availableUpdate = ref(null)
const updateSize = ref(null)
const updatesEnabled = ref(true)
async function checkUpdates() {
if (!(await areUpdatesEnabled())) {
console.log('Skipping update check as updates are disabled in this build or environment')
updatesEnabled.value = false
return
}
async function performCheck() {
const update = await invoke('plugin:updater|check')
const isExistingUpdate = update.version === availableUpdate.value?.version
if (!update) {
console.log('No update available')
return
}
const isExistingUpdate = update.version === availableUpdate.value?.version
if (isExistingUpdate) {
console.log('Update is already known')
return
@@ -707,6 +775,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
@restart="installUpdate"
@download="downloadAvailableUpdate"
/>
<UpdateAvailableToast v-else-if="!updatesEnabled && os === 'Linux' && !isDevEnvironment" />
</Transition>
</Suspense>
<Transition name="fade">
@@ -742,6 +811,13 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
<NavButton v-if="themeStore.featureFlags.worlds_tab" v-tooltip.right="'Worlds'" to="/worlds">
<WorldIcon />
</NavButton>
<NavButton
v-if="themeStore.featureFlags.servers_in_app"
v-tooltip.right="'Servers'"
to="/hosting/manage"
>
<ServerIcon />
</NavButton>
<NavButton
v-tooltip.right="'Discover content'"
to="/browse/modpack"
@@ -765,7 +841,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
>
<LibraryIcon />
</NavButton>
<div class="h-px w-6 mx-auto my-2 bg-button-bg"></div>
<div class="h-px w-6 mx-auto my-2 bg-surface-5"></div>
<suspense>
<QuickInstanceSwitcher />
</suspense>
@@ -927,7 +1003,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
<transition name="popup-survey">
<div
v-if="availableSurvey"
class="w-[400px] z-20 fixed -bottom-12 pb-16 right-[--right-bar-width] mr-4 rounded-t-2xl card-shadow bg-bg-raised border-divider border-[1px] border-solid border-b-0 p-4"
class="w-[400px] z-20 fixed -bottom-12 pb-16 right-[--right-bar-width] mr-4 rounded-t-2xl card-shadow bg-bg-raised border-surface-5 border-[1px] border-solid border-b-0 p-4"
>
<h2 class="text-lg font-extrabold mt-0 mb-2">Hey there Modrinth user!</h2>
<p class="m-0 leading-tight">
@@ -969,16 +1045,25 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
width: 'calc(100% - var(--right-bar-width))',
}"
></div>
<div
<Admonition
v-if="criticalErrorMessage"
class="m-6 mb-0 flex flex-col border-red bg-bg-red rounded-2xl border-2 border-solid p-4 gap-1 font-semibold text-contrast"
type="critical"
:header="criticalErrorMessage.header"
class="m-6 mb-0"
>
<h1 class="m-0 text-lg font-extrabold">{{ criticalErrorMessage.header }}</h1>
<div
class="markdown-body text-primary"
v-html="renderString(criticalErrorMessage.body ?? '')"
></div>
</div>
</Admonition>
<Admonition
v-if="authUnreachable"
type="warning"
:header="formatMessage(messages.authUnreachableHeader)"
class="m-6 mb-0"
>
{{ formatMessage(messages.authUnreachableBody) }}
</Admonition>
<RouterView v-slot="{ Component }">
<template v-if="Component">
<Suspense @pending="loading.startLoading()" @resolve="loading.stopLoading()">
@@ -1044,6 +1129,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
</div>
</div>
<URLConfirmModal ref="urlModal" />
<I18nDebugPanel />
<NotificationPanel has-sidebar />
<ErrorModal ref="errorModal" />
<ModInstallModal ref="modInstallModal" />
@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:serif="http://www.serif.com/" version="1.1" viewBox="0 0 1793 199">
<g>
<g id="Layer_1">
<g id="green" fill="var(--color-brand)">
<path d="M1184.1,166.6c-8,0-15.6-1-22.9-3.1s-13.1-4.6-17.4-7.6l8.5-16.9c4.3,2.7,9.4,5,15.3,6.8,5.9,1.8,11.9,2.7,17.8,2.7s12.1-.9,15.2-2.8c3.1-1.9,4.7-4.5,4.7-7.7s-1.1-4.6-3.2-6c-2.1-1.4-4.9-2.4-8.4-3.1-3.4-.7-7.3-1.4-11.5-2-4.2-.6-8.4-1.4-12.6-2.4-4.2-1-8-2.5-11.5-4.5-3.4-2-6.2-4.6-8.4-7.9-2.1-3.3-3.2-7.7-3.2-13.2s1.7-11.3,5.2-15.8c3.4-4.5,8.3-7.9,14.5-10.3,6.2-2.4,13.6-3.7,22.2-3.7s12.9.7,19.4,2.1c6.5,1.4,11.9,3.4,16.2,6.1l-8.5,16.9c-4.5-2.7-9.1-4.6-13.6-5.6-4.6-1-9.1-1.5-13.6-1.5-6.8,0-11.8,1-15,3-3.3,2-4.9,4.6-4.9,7.7s1.1,5,3.2,6.4c2.1,1.4,4.9,2.6,8.4,3.4,3.4.8,7.3,1.5,11.5,2,4.2.5,8.4,1.3,12.6,2.4,4.2,1.1,8,2.5,11.5,4.4,3.5,1.8,6.3,4.4,8.5,7.7,2.1,3.3,3.2,7.7,3.2,13s-1.8,11.1-5.3,15.5c-3.5,4.4-8.5,7.8-14.9,10.2-6.4,2.4-14.1,3.7-23,3.7Z"/>
<path d="M1291.1,166.6c-10.6,0-19.8-2.1-27.7-6.3-7.9-4.2-14-10-18.3-17.4-4.3-7.4-6.5-15.7-6.5-25.1s2.1-17.9,6.3-25.2c4.2-7.3,10-13,17.5-17.2,7.4-4.2,15.9-6.2,25.4-6.2s17.5,2,24.8,6.1c7.2,4,12.9,9.7,17.1,17.1,4.2,7.4,6.2,16,6.2,26s0,2,0,3.2c0,1.2-.2,2.3-.3,3.4h-79.3v-14.8h67.5l-8.7,4.6c.1-5.5-1-10.3-3.4-14.4-2.4-4.2-5.6-7.4-9.7-9.8-4.1-2.4-8.8-3.6-14.2-3.6s-10.2,1.2-14.3,3.6c-4.1,2.4-7.3,5.7-9.6,9.9-2.3,4.2-3.5,9.2-3.5,14.9v3.6c0,5.7,1.3,10.7,3.9,15.1,2.6,4.4,6.3,7.8,11,10.2,4.7,2.4,10.2,3.6,16.4,3.6s10.2-.8,14.4-2.5c4.3-1.7,8.1-4.3,11.4-7.8l11.9,13.7c-4.3,5-9.6,8.8-16.1,11.5-6.5,2.7-13.9,4-22.2,4Z"/>
<path d="M1357.2,165.3v-95.1h21.2v26.2l-2.5-7.7c2.8-6.4,7.3-11.3,13.4-14.6,6.1-3.3,13.7-5,22.9-5v21.2c-1-.2-1.8-.4-2.7-.4-.8,0-1.7,0-2.5,0-8.4,0-15.1,2.5-20.1,7.4-5,4.9-7.5,12.3-7.5,22v46.1h-22.3Z"/>
<path d="M1460,165.3l-40.8-95.1h23.2l35.1,83.9h-11.4l36.3-83.9h21.4l-40.8,95.1h-23Z"/>
<path d="M1579.6,166.6c-10.6,0-19.8-2.1-27.7-6.3-7.9-4.2-14-10-18.3-17.4-4.3-7.4-6.5-15.7-6.5-25.1s2.1-17.9,6.3-25.2c4.2-7.3,10-13,17.5-17.2,7.4-4.2,15.9-6.2,25.4-6.2s17.5,2,24.8,6.1c7.2,4,12.9,9.7,17.1,17.1,4.2,7.4,6.2,16,6.2,26s0,2,0,3.2c0,1.2-.2,2.3-.3,3.4h-79.3v-14.8h67.5l-8.7,4.6c.1-5.5-1-10.3-3.4-14.4-2.4-4.2-5.6-7.4-9.7-9.8-4.1-2.4-8.8-3.6-14.2-3.6s-10.2,1.2-14.3,3.6c-4.1,2.4-7.3,5.7-9.6,9.9-2.3,4.2-3.5,9.2-3.5,14.9v3.6c0,5.7,1.3,10.7,3.9,15.1,2.6,4.4,6.3,7.8,11,10.2,4.7,2.4,10.2,3.6,16.4,3.6s10.2-.8,14.4-2.5c4.3-1.7,8.1-4.3,11.4-7.8l11.9,13.7c-4.3,5-9.6,8.8-16.1,11.5-6.5,2.7-13.9,4-22.2,4Z"/>
<path d="M1645.7,165.3v-95.1h21.2v26.2l-2.5-7.7c2.8-6.4,7.3-11.3,13.4-14.6,6.1-3.3,13.7-5,22.9-5v21.2c-1-.2-1.8-.4-2.7-.4-.8,0-1.7,0-2.5,0-8.4,0-15.1,2.5-20.1,7.4-5,4.9-7.5,12.3-7.5,22v46.1h-22.3Z"/>
<path d="M1749.9,166.6c-8,0-15.6-1-22.9-3.1s-13.1-4.6-17.4-7.6l8.5-16.9c4.3,2.7,9.4,5,15.3,6.8,5.9,1.8,11.9,2.7,17.8,2.7s12.1-.9,15.2-2.8c3.1-1.9,4.7-4.5,4.7-7.7s-1.1-4.6-3.2-6c-2.1-1.4-4.9-2.4-8.4-3.1-3.4-.7-7.3-1.4-11.5-2-4.2-.6-8.4-1.4-12.6-2.4-4.2-1-8-2.5-11.5-4.5-3.4-2-6.2-4.6-8.4-7.9-2.1-3.3-3.2-7.7-3.2-13.2s1.7-11.3,5.2-15.8c3.4-4.5,8.3-7.9,14.5-10.3,6.2-2.4,13.6-3.7,22.2-3.7s12.9.7,19.4,2.1c6.5,1.4,11.9,3.4,16.2,6.1l-8.5,16.9c-4.5-2.7-9.1-4.6-13.6-5.6-4.6-1-9.1-1.5-13.6-1.5-6.8,0-11.8,1-15,3-3.3,2-4.9,4.6-4.9,7.7s1.1,5,3.2,6.4c2.1,1.4,4.9,2.6,8.4,3.4,3.4.8,7.3,1.5,11.5,2,4.2.5,8.4,1.3,12.6,2.4,4.2,1.1,8,2.5,11.5,4.4,3.5,1.8,6.3,4.4,8.5,7.7,2.1,3.3,3.2,7.7,3.2,13s-1.8,11.1-5.3,15.5c-3.5,4.4-8.5,7.8-14.9,10.2-6.4,2.4-14.1,3.7-23,3.7Z"/>
<g>
<path d="M9.8,143l63.4-38.1-5.8-15.3,18.1-18.6,22.9-4.9,6.6,8.2-10.6,10.7-9.2,2.9-6.6,6.8,3.2,9,6.5,6.9,9.2-2.5,6.6-7.2,14.3-4.5,4.3,9.6-14.8,18.1-24.8,7.8-11.1-12.4-63.6,38.2c-3-3.9-6.5-9.4-8.8-14.7ZM192.8,65.4l-50.4,13.6c2.8,7.4,3.7,11.7,4.5,16.5l50.3-13.6c-.8-5.4-2.2-10.8-4.4-16.5Z" fill-rule="evenodd"/>
<path d="M17.3,106.5c3.6,42.1,38.9,75.2,82,75.2s60.7-18.9,74-46.3l16.4,5.7c-15.8,34.1-50.3,57.9-90.4,57.9S3.6,158.2,0,106.5h17.3ZM.3,89.4C5.3,39.2,47.8,0,99.3,0s99.5,44.6,99.5,99.5-1.1,17.4-3.3,25.5l-16.3-5.7c1.6-6.5,2.4-13.1,2.4-19.8,0-45.4-36.9-82.3-82.3-82.3S22.6,48.7,17.6,89.4H.3Z" fill-rule="evenodd"/>
<path d="M99,51.6c-26.4,0-47.9,21.5-47.9,48s21.5,48,48,48,2.7,0,4-.2l4.8,16.8c-2.9.4-5.8.6-8.8.6-36,0-65.2-29.2-65.2-65.2S63.1,34.4,99,34.4s1.8,0,2.7,0l-2.7,17.1ZM118.6,37.4c26.4,8.3,45.6,33,45.6,62.2s-16.4,50.2-39.8,60l-4.8-16.7c16.2-7.7,27.4-24.2,27.4-43.3s-13-38.1-31.1-44.9l2.7-17.2Z" fill-rule="evenodd"/>
</g>
</g>
<g id="black" fill="currentColor">
<path d="M354.8,69.2c12,0,21.7,3.4,28.6,10.4,7,7.2,10.6,17.5,10.6,31.5v54.8h-22.4v-51.9c0-8.4-1.8-14.7-5.5-19-3.8-4.1-8.9-6.3-15.9-6.3s-13.6,2.5-18.1,7.3c-4.5,5-6.8,12.2-6.8,21.3v48.5h-22.4v-51.9c0-8.4-1.8-14.7-5.5-19-3.8-4.1-8.9-6.3-15.9-6.3s-13.6,2.5-18.1,7.3c-4.5,4.8-6.8,12-6.8,21.3v48.5h-22.4v-95.6h21.3v12.2c3.6-4.3,8.1-7.5,13.4-9.8,5.4-2.3,11.3-3.4,17.9-3.4s13.6,1.3,19.2,3.9c5.5,2.9,9.8,6.8,13.1,12,3.9-5,8.9-8.9,15.2-11.8,6.3-2.7,13.1-4.1,20.6-4.1ZM466,167.2c-9.7,0-18.4-2.1-26.1-6.3-7.6-4-13.8-10.1-18.1-17.5-4.5-7.3-6.6-15.7-6.6-25.2s2.1-17.9,6.6-25.2c4.3-7.4,10.6-13.4,18.1-17.4,7.7-4.1,16.5-6.3,26.1-6.3s18.6,2.1,26.3,6.3c7.7,4.1,13.8,10,18.3,17.4,4.3,7.3,6.4,15.7,6.4,25.2s-2.1,17.9-6.4,25.2c-4.5,7.5-10.6,13.4-18.3,17.5-7.7,4.1-16.5,6.3-26.3,6.3h0ZM466,148c8.2,0,15-2.7,20.4-8.2,5.4-5.5,8.1-12.7,8.1-21.7s-2.7-16.1-8.1-21.7c-5.4-5.5-12.2-8.2-20.4-8.2s-15,2.7-20.2,8.2c-5.4,5.5-8.1,12.7-8.1,21.7s2.7,16.1,8.1,21.7c5.2,5.5,12,8.2,20.2,8.2ZM631.5,33.1v132.8h-21.5v-12.3c-3.7,4.4-8.3,7.9-13.6,10.2-5.5,2.3-11.5,3.4-18.1,3.4s-17.4-2-24.7-6.1c-7.3-4.1-13.2-9.8-17.4-17.4-4.1-7.3-6.3-15.9-6.3-25.6s2.1-18.3,6.3-25.6c4.1-7.3,10-13.1,17.4-17.2,7.3-4.1,15.6-6.1,24.7-6.1s12.2,1.1,17.4,3.2c5.2,2.1,9.8,5.4,13.4,9.7v-49h22.4ZM581.1,148c5.4,0,10.2-1.3,14.5-3.8,4.3-2.3,7.7-5.9,10.2-10.4,2.5-4.5,3.8-9.8,3.8-15.7s-1.3-11.3-3.8-15.7c-2.5-4.5-5.9-8.1-10.2-10.6-4.3-2.3-9.1-3.6-14.5-3.6s-10.2,1.3-14.5,3.6c-4.3,2.5-7.7,6.1-10.2,10.6-2.5,4.5-3.8,9.8-3.8,15.7s1.3,11.3,3.8,15.7c2.5,4.5,5.9,8.1,10.2,10.4,4.3,2.5,9.1,3.8,14.5,3.8ZM681.6,84.3c6.4-10,17.7-15,34-15v21.3c-1.7-.3-3.4-.5-5.2-.5-8.8,0-15.6,2.5-20.4,7.5-4.8,5.2-7.3,12.5-7.3,22v46.4h-22.4v-95.6h21.3v14h0ZM734.1,70.3h22.4v95.6h-22.4v-95.6ZM745.4,54.6c-4.1,0-7.5-1.3-10.2-3.9-2.7-2.4-4.2-5.9-4.1-9.5,0-3.8,1.4-7,4.1-9.7,2.7-2.5,6.1-3.8,10.2-3.8s7.5,1.3,10.2,3.6c2.7,2.5,4.1,5.5,4.1,9.3s-1.3,7.2-3.9,9.8c-2.7,2.7-6.3,4.1-10.4,4.1ZM839.5,69.2c12,0,21.7,3.6,29,10.6,7.3,7,10.9,17.5,10.9,31.3v54.8h-22.4v-51.9c0-8.4-2-14.7-5.9-19-3.9-4.1-9.5-6.3-16.8-6.3s-14.7,2.5-19.5,7.3c-4.8,5-7.2,12.2-7.2,21.5v48.3h-22.4v-95.6h21.3v12.3c3.8-4.5,8.4-7.7,14-10,5.5-2.3,12-3.4,19-3.4ZM964.8,160.7c-2.8,2.2-6,3.9-9.5,4.8-3.9,1.1-7.9,1.6-12,1.6-10.6,0-18.6-2.7-24.3-8.2-5.7-5.5-8.6-13.4-8.6-24v-46h-15.7v-17.9h15.7v-21.8h22.4v21.8h25.6v17.9h-25.6v45.5c0,4.7,1.1,8.2,3.4,10.6,2.3,2.5,5.5,3.8,9.8,3.8s9.1-1.3,12.5-3.9l6.3,15.9ZM1036.9,69.2c12,0,21.7,3.6,29,10.6,7.3,7,10.9,17.5,10.9,31.3v54.8h-22.4v-51.9c0-8.4-2-14.7-5.9-19-3.9-4.1-9.5-6.3-16.8-6.3s-14.7,2.5-19.5,7.3c-4.8,5-7.2,12.2-7.2,21.5v48.3h-22.4V33.1h22.4v48.3c3.8-3.9,8.2-7,13.8-9.1,5.4-2,11.5-3,18.1-3Z"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.0 KiB

@@ -2,6 +2,8 @@
@tailwind components;
@tailwind utilities;
@import '@modrinth/ui/src/styles/tailwind-utilities.css';
@font-face {
font-family: 'bundled-minecraft-font-mrapp';
font-style: normal;
@@ -83,10 +85,6 @@ a {
}
}
input {
border: none !important;
}
.badge {
display: flex;
border-radius: var(--radius-md);
@@ -8,10 +8,14 @@ import {
SearchIcon,
StopCircleIcon,
TrashIcon,
XIcon,
} from '@modrinth/assets'
import { Button, DropdownSelect, injectNotificationManager } from '@modrinth/ui'
import { formatCategoryHeader } from '@modrinth/utils'
import {
DropdownSelect,
formatLoader,
injectNotificationManager,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { useStorage } from '@vueuse/core'
import dayjs from 'dayjs'
import { computed, ref } from 'vue'
@@ -23,6 +27,8 @@ import { duplicate, remove } from '@/helpers/profile.js'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const props = defineProps({
instances: {
type: Array,
@@ -175,7 +181,7 @@ const filteredResults = computed(() => {
if (group === 'Loader') {
instances.forEach((instance) => {
const loader = formatCategoryHeader(instance.loader)
const loader = formatLoader(formatMessage, instance.loader)
if (!instanceMap.has(loader)) {
instanceMap.set(loader, [])
}
@@ -243,13 +249,14 @@ const filteredResults = computed(() => {
</script>
<template>
<div class="flex gap-2">
<div class="iconified-input flex-1">
<SearchIcon />
<input v-model="search" type="text" placeholder="Search" />
<Button class="r-btn" @click="() => (search = '')">
<XIcon />
</Button>
</div>
<StyledInput
v-model="search"
:icon="SearchIcon"
type="text"
placeholder="Search"
clearable
wrapper-class="flex-1"
/>
<DropdownSelect
v-slot="{ selected }"
v-model="state.sortBy"
@@ -18,8 +18,8 @@ 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 ProjectCard from '@/components/ui/ProjectCard.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_by_profile_path } from '@/helpers/process.js'
import { duplicate, kill, remove, run } from '@/helpers/profile.js'
@@ -270,7 +270,7 @@ onUnmounted(() => {
/>
</section>
<section v-else ref="modsRow" class="projects">
<ProjectCard
<LegacyProjectCard
v-for="project in row.instances.slice(0, maxProjectsPerRow)"
:key="project?.project_id"
ref="instanceComponents"
@@ -284,7 +284,7 @@ onUnmounted(() => {
z-index: 11;
gap: 0.5rem;
padding: 1rem;
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
width: max-content;
user-select: none;
-ms-user-select: none;
@@ -380,7 +380,7 @@ onUnmounted(() => {
text-align: left;
&.expanded {
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
padding: 1rem;
}
}
@@ -119,7 +119,7 @@ onBeforeUnmount(() => {
background-color: var(--color-raised-bg);
border-radius: var(--radius-md);
box-shadow: var(--shadow-floating);
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
margin: 0;
position: fixed;
z-index: 1000000;
@@ -163,7 +163,7 @@ onBeforeUnmount(() => {
}
.divider {
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
margin: var(--gap-sm);
pointer-events: none;
}
@@ -1,6 +1,6 @@
<script setup>
import { PlusIcon, XIcon } from '@modrinth/assets'
import { Button, Checkbox, injectNotificationManager } from '@modrinth/ui'
import { Button, Checkbox, injectNotificationManager, StyledInput } from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { ref } from 'vue'
@@ -110,31 +110,33 @@ const exportPack = async () => {
<div class="modal-body">
<div class="labeled_input">
<p>Modpack Name</p>
<div class="iconified-input">
<PackageIcon />
<input v-model="nameInput" type="text" placeholder="Modpack name" class="input" />
<Button class="r-btn" @click="nameInput = ''">
<XIcon />
</Button>
</div>
<StyledInput
v-model="nameInput"
:icon="PackageIcon"
type="text"
placeholder="Modpack name"
clearable
/>
</div>
<div class="labeled_input">
<p>Version number</p>
<div class="iconified-input">
<VersionIcon />
<input v-model="versionInput" type="text" placeholder="1.0.0" class="input" />
<Button class="r-btn" @click="versionInput = ''">
<XIcon />
</Button>
</div>
<StyledInput
v-model="versionInput"
:icon="VersionIcon"
type="text"
placeholder="1.0.0"
clearable
/>
</div>
<div class="adjacent-input">
<div class="labeled_input">
<p>Description</p>
<div class="textarea-wrapper">
<textarea v-model="exportDescription" placeholder="Enter modpack description..." />
</div>
<StyledInput
v-model="exportDescription"
multiline
placeholder="Enter modpack description..."
/>
</div>
</div>
@@ -289,17 +291,4 @@ const exportPack = async () => {
align-items: center;
gap: 1rem;
}
.textarea-wrapper {
// margin-top: 1rem;
height: 12rem;
textarea {
max-height: 12rem;
}
.preview {
overflow-y: auto;
}
}
</style>
@@ -20,12 +20,13 @@
</div>
<div class="input-row">
<p class="input-label">Name</p>
<input
<StyledInput
v-model="profile_name"
autocomplete="off"
class="text-input"
type="text"
maxlength="100"
placeholder="Enter a name for your instance..."
:maxlength="100"
wrapper-class="w-full"
/>
</div>
<div class="input-row">
@@ -34,7 +35,7 @@
</div>
<div class="input-row">
<p class="input-label">Game version</p>
<div class="versions">
<div class="flex gap-4 items-center">
<multiselect
v-model="game_version"
class="selector"
@@ -45,7 +46,7 @@
open-direction="top"
:show-labels="false"
/>
<Checkbox v-model="showSnapshots" class="filter-checkbox" label="Show all versions" />
<Checkbox v-model="showSnapshots" class="shrink-0" label="Show all versions" />
</div>
</div>
<div v-if="loader !== 'vanilla'" class="input-row">
@@ -93,18 +94,14 @@
<div class="path-selection">
<h3>{{ selectedProfileType.name }} path</h3>
<div class="path-input">
<div class="iconified-input">
<FolderOpenIcon />
<input
v-model="selectedProfileType.path"
type="text"
placeholder="Path to launcher"
@change="setPath"
/>
<Button class="r-btn" @click="() => (selectedProfileType.path = '')">
<XIcon />
</Button>
</div>
<StyledInput
v-model="selectedProfileType.path"
:icon="FolderOpenIcon"
type="text"
placeholder="Path to launcher"
clearable
@change="setPath"
/>
<Button icon-only @click="selectLauncherPath">
<FolderSearchIcon />
</Button>
@@ -197,7 +194,14 @@ import {
UploadIcon,
XIcon,
} from '@modrinth/assets'
import { Avatar, Button, Checkbox, Chips, injectNotificationManager } from '@modrinth/ui'
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'
@@ -341,7 +345,7 @@ 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'
const loaderVersion = loader.value === 'vanilla' ? null : (loader_version_value ?? 'stable')
hide()
creating.value = false
@@ -350,7 +354,7 @@ const create_instance = async () => {
profile_name.value,
game_version.value,
loader.value,
loader.value === 'vanilla' ? null : loader_version_value ?? 'stable',
loader.value === 'vanilla' ? null : (loader_version_value ?? 'stable'),
icon.value,
).catch(handleError)
@@ -546,12 +550,6 @@ const next = async () => {
font-style: italic;
}
.versions {
display: flex;
flex-direction: row;
gap: 1rem;
}
:deep(button.checkbox) {
border: none;
}
@@ -1,7 +1,6 @@
<script setup lang="ts">
import { GameIcon, LeftArrowIcon } from '@modrinth/assets'
import { Avatar, ButtonStyled } from '@modrinth/ui'
import { formatCategory } from '@modrinth/utils'
import { Avatar, ButtonStyled, FormattedTag } from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
type Instance = {
@@ -37,7 +36,8 @@ defineProps<{
</span>
<span class="text-secondary flex items-center gap-2 font-semibold">
<GameIcon class="h-5 w-5 text-secondary" />
{{ formatCategory(instance.loader) }} {{ instance.game_version }}
<FormattedTag :tag="instance.loader" enforce-type="loader" />
{{ instance.game_version }}
</span>
</span>
</span>
@@ -1,18 +1,17 @@
<template>
<JavaDetectionModal ref="detectJavaModal" @submit="(val) => emit('update:modelValue', val)" />
<div class="toggle-setting" :class="{ compact }">
<input
<StyledInput
autocomplete="off"
:disabled="props.disabled"
:value="props.modelValue ? props.modelValue.path : ''"
type="text"
class="installation-input"
:model-value="props.modelValue ? props.modelValue.path : ''"
:placeholder="placeholder ?? '/path/to/java'"
@input="
wrapper-class="installation-input"
@update:model-value="
(val) => {
emit('update:modelValue', {
...props.modelValue,
path: val.target.value,
path: val,
})
}
"
@@ -60,7 +59,7 @@ import {
SearchIcon,
XIcon,
} from '@modrinth/assets'
import { Button, injectNotificationManager } from '@modrinth/ui'
import { Button, injectNotificationManager, StyledInput } from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { ref } from 'vue'
@@ -1,7 +1,7 @@
<script setup>
import { DownloadIcon, HeartIcon, TagIcon } from '@modrinth/assets'
import { Avatar, TagItem } from '@modrinth/ui'
import { formatCategory, formatNumber } from '@modrinth/utils'
import { Avatar, FormattedTag, TagItem } from '@modrinth/ui'
import { formatNumber } from '@modrinth/utils'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import { computed } from 'vue'
@@ -63,7 +63,7 @@ const toTransparent = computed(() => {
<div
class="w-full aspect-[2/1] bg-cover bg-center bg-no-repeat"
:style="{
'background-color': project.featured_gallery ?? project.gallery[0] ? null : toColor,
'background-color': (project.featured_gallery ?? project.gallery[0]) ? null : toColor,
'background-image': `url(${
project.featured_gallery ??
project.gallery[0] ??
@@ -107,7 +107,7 @@ const toTransparent = computed(() => {
<div class="flex items-center gap-1 pr-2">
<TagIcon />
<TagItem>
{{ formatCategory(featuredCategory) }}
<FormattedTag :tag="featuredCategory" />
</TagItem>
</div>
</div>
@@ -34,18 +34,18 @@ function updateAdPosition() {
<template>
<div ref="adsWrapper" class="ad-parent relative flex w-full justify-center cursor-pointer bg-bg">
<a
href="https://modrinth.gg/medal?from=app-placeholder"
href="https://modrinth.host/medal?from=app-placeholder"
target="_blank"
class="flex max-h-[250px] min-h-[250px] min-w-[300px] max-w-[300px] flex-col gap-4 rounded-[inherit]"
>
<img
src="https://cdn-raw.modrinth.com/medal-modrinth-servers-light-new.webp"
alt="Host your next server with Modrinth Servers"
src="https://cdn-raw.modrinth.com/modrinth-hosting-medal-light.webp"
alt="Host your next server with Modrinth Hosting"
class="hidden light-image rounded-[inherit]"
/>
<img
src="https://cdn-raw.modrinth.com/medal-modrinth-servers-dark-new.webp"
alt="Host your next server with Modrinth Servers"
src="https://cdn-raw.modrinth.com/modrinth-hosting-medal-dark.webp"
alt="Host your next server with Modrinth Hosting"
class="dark-image rounded-[inherit]"
/>
</a>
@@ -69,7 +69,7 @@ onUnmounted(() => {
<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-button-bg"></div>
<div v-if="recentInstances.length > 0" class="h-px w-6 mx-auto my-2 bg-divider"></div>
</template>
<style scoped lang="scss"></style>
@@ -293,7 +293,7 @@ onBeforeUnmount(() => {
align-items: center;
gap: 0.5rem;
border-radius: var(--radius-md);
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
padding: var(--gap-sm) var(--gap-lg);
}
@@ -356,7 +356,7 @@ onBeforeUnmount(() => {
gap: 1rem;
overflow: auto;
transition: all 0.2s ease-in-out;
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
&.hidden {
transform: translateY(-100%);
@@ -454,7 +454,7 @@ onBeforeUnmount(() => {
flex-direction: column;
overflow: auto;
transition: all 0.2s ease-in-out;
border: 1px solid var(--color-button-bg);
border: 1px solid var(--color-divider);
padding: var(--gap-md);
&.hidden {
@@ -1,7 +1,7 @@
<template>
<div
class="card-shadow p-4 bg-bg-raised rounded-xl flex gap-3 group cursor-pointer hover:brightness-90 transition-all"
@click="
<ProjectCard
:title="project.title"
:link="
() => {
emit('open')
$router.push({
@@ -10,116 +10,58 @@
})
}
"
:author="{ name: project.author, link: `https://modrinth.com/user/${project.author}` }"
:icon-url="project.icon_url"
:summary="project.description"
:tags="project.display_categories"
:all-tags="project.categories"
:downloads="project.downloads"
:followers="project.follows"
:date-updated="project.date_modified"
:banner="project.featured_gallery ?? undefined"
:color="project.color ?? undefined"
:environment="
projectType
? ['mod', 'modpack'].includes(projectType)
? {
clientSide: project.client_side,
serverSide: project.server_side,
}
: undefined
: undefined
"
layout="list"
>
<div class="icon w-[96px] h-[96px] relative">
<Avatar :src="project.icon_url" size="96px" class="search-icon origin-top transition-all" />
</div>
<div class="flex flex-col gap-2 overflow-hidden">
<div class="gap-2 overflow-hidden no-wrap text-ellipsis">
<span class="text-lg font-extrabold text-contrast m-0 leading-none">
{{ project.title }}
</span>
<span v-if="project.author" class="text-secondary"> by {{ project.author }}</span>
</div>
<div class="m-0 line-clamp-2">
{{ project.description }}
</div>
<div v-if="categories.length > 0" class="mt-auto flex items-center gap-1 no-wrap">
<TagsIcon class="h-4 w-4 shrink-0" />
<div
v-if="project.project_type === 'mod' || project.project_type === 'modpack'"
class="text-sm font-semibold text-secondary flex gap-1 px-[0.375rem] py-0.5 bg-button-bg rounded-full"
<template #actions>
<ButtonStyled color="brand" type="outlined">
<button
:disabled="installed || installing"
class="shrink-0 no-wrap"
@click.stop="install()"
>
<template v-if="project.client_side === 'optional' && project.server_side === 'optional'">
Client or server
<template v-if="!installed">
<DownloadIcon v-if="modpack || instance" />
<PlusIcon v-else />
</template>
<template
v-else-if="
(project.client_side === 'optional' || project.client_side === 'required') &&
(project.server_side === 'optional' || project.server_side === 'unsupported')
"
>
Client
</template>
<template
v-else-if="
(project.server_side === 'optional' || project.server_side === 'required') &&
(project.client_side === 'optional' || project.client_side === 'unsupported')
"
>
Server
</template>
<template
v-else-if="
project.client_side === 'unsupported' && project.server_side === 'unsupported'
"
>
Unsupported
</template>
<template
v-else-if="project.client_side === 'required' && project.server_side === 'required'"
>
Client and server
</template>
</div>
<div
v-for="tag in categories"
:key="tag"
class="text-sm font-semibold text-secondary flex gap-1 px-[0.375rem] py-0.5 bg-button-bg rounded-full"
>
{{ formatCategory(tag.name) }}
</div>
</div>
</div>
<div class="flex flex-col gap-2 items-end shrink-0 ml-auto">
<div class="flex items-center gap-2">
<DownloadIcon class="shrink-0" />
<span>
{{ formatNumber(project.downloads) }}
<span class="text-secondary">downloads</span>
</span>
</div>
<div class="flex items-center gap-2">
<HeartIcon class="shrink-0" />
<span>
{{ formatNumber(project.follows ?? project.followers) }}
<span class="text-secondary">followers</span>
</span>
</div>
<div class="mt-auto relative">
<div class="absolute bottom-0 right-0 w-fit">
<ButtonStyled color="brand" type="outlined">
<button
:disabled="installed || installing"
class="shrink-0 no-wrap"
@click.stop="install()"
>
<template v-if="!installed">
<DownloadIcon v-if="modpack || instance" />
<PlusIcon v-else />
</template>
<CheckIcon v-else />
{{
installing
? 'Installing'
: installed
? 'Installed'
: modpack || instance
? 'Install'
: 'Add to an instance'
}}
</button>
</ButtonStyled>
</div>
</div>
</div>
</div>
<CheckIcon v-else />
{{
installing
? 'Installing'
: installed
? 'Installed'
: modpack || instance
? 'Install'
: 'Add to an instance'
}}
</button>
</ButtonStyled>
</template>
</ProjectCard>
</template>
<script setup>
import { CheckIcon, DownloadIcon, HeartIcon, PlusIcon, TagsIcon } from '@modrinth/assets'
import { Avatar, ButtonStyled, injectNotificationManager } from '@modrinth/ui'
import { formatCategory, formatNumber } from '@modrinth/utils'
import { CheckIcon, DownloadIcon, PlusIcon } 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'
@@ -141,10 +83,6 @@ const props = defineProps({
type: Object,
required: true,
},
categories: {
type: Array,
required: true,
},
instance: {
type: Object,
default: null,
@@ -157,6 +95,10 @@ const props = defineProps({
type: Boolean,
default: false,
},
projectType: {
type: String,
default: undefined,
},
})
const emit = defineEmits(['open', 'install'])
@@ -191,7 +191,8 @@ const handleClose = async () => {
position: absolute;
height: 100vh;
width: 100vw;
background: linear-gradient(180deg, rgba(66, 131, 92, 0.275) 0%, rgba(17, 35, 43, 0.5) 97.29%),
background:
linear-gradient(180deg, rgba(66, 131, 92, 0.275) 0%, rgba(17, 35, 43, 0.5) 97.29%),
linear-gradient(0deg, rgba(22, 24, 28, 0.64), rgba(22, 24, 28, 0.64));
z-index: 9997;
}
@@ -0,0 +1,84 @@
<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,8 +1,7 @@
<script setup lang="ts">
import { DownloadIcon, ExternalIcon, RefreshCwIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, commonMessages, ProgressBar } from '@modrinth/ui'
import { ButtonStyled, commonMessages, defineMessages, ProgressBar, useVIntl } from '@modrinth/ui'
import { formatBytes } from '@modrinth/utils'
import { defineMessages, useVIntl } from '@vintl/vintl'
import { ref } from 'vue'
import { injectAppUpdateDownloadProgress } from '@/providers/download-progress.ts'
@@ -69,7 +68,7 @@ const messages = defineMessages({
</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-divider border-solid border-[2px]"
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,
}"
@@ -3,12 +3,13 @@ import { MailIcon, SendIcon, UserIcon, UserPlusIcon, XIcon } from '@modrinth/ass
import {
Avatar,
ButtonStyled,
commonMessages,
defineMessages,
injectNotificationManager,
IntlFormatted,
StyledInput,
useRelativeTime,
useVIntl,
} from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import { IntlFormatted } from '@vintl/vintl/components'
import { computed, onUnmounted, ref, watch } from 'vue'
import FriendsSection from '@/components/ui/friends/FriendsSection.vue'
@@ -270,15 +271,14 @@ const messages = defineMessages({
{{ formatMessage(messages.usernameDescription) }}
</p>
<div class="flex items-center gap-2 mt-4">
<div class="iconified-input flex-1">
<UserIcon aria-hidden="true" />
<input
v-model="username"
type="text"
:placeholder="formatMessage(messages.usernamePlaceholder)"
@keyup.enter="addFriendFromModal"
/>
</div>
<StyledInput
v-model="username"
:icon="UserIcon"
type="text"
:placeholder="formatMessage(messages.usernamePlaceholder)"
wrapper-class="flex-1"
@keyup.enter="addFriendFromModal"
/>
<ButtonStyled color="brand">
<button :disabled="username.length === 0" @click="addFriendFromModal">
<SendIcon />
@@ -299,23 +299,15 @@ const messages = defineMessages({
<UserPlusIcon />
</button>
</ButtonStyled>
<div class="iconified-input flex-1">
<input
v-model="search"
type="text"
class="friends-search-bar flex w-full"
:placeholder="formatMessage(messages.searchFriends)"
@keyup.esc="search = ''"
/>
<button
v-if="search"
v-tooltip="formatMessage(commonMessages.clearButton)"
class="r-btn flex items-center justify-center bg-transparent button-animation p-2 cursor-pointer appearance-none border-none"
@click="search = ''"
>
<XIcon />
</button>
</div>
<StyledInput
v-model="search"
type="text"
:placeholder="formatMessage(messages.searchFriends)"
clearable
variant="outlined"
wrapper-class="flex-1"
@keyup.esc="search = ''"
/>
</template>
<h3 v-else class="ml-2 w-full text-base text-primary font-medium m-0">
{{ formatMessage(messages.friends) }}
@@ -412,16 +404,3 @@ const messages = defineMessages({
</template>
</div>
</template>
<style scoped>
.friends-search-bar {
background: none;
border: 2px solid var(--color-button-bg) !important;
padding: 8px;
border-radius: 12px;
height: 36px;
}
.friends-search-bar::placeholder {
@apply text-sm font-normal;
}
</style>
@@ -1,8 +1,14 @@
<script setup lang="ts">
import { MoreVerticalIcon, TrashIcon, UserIcon, XIcon } from '@modrinth/assets'
import { Accordion, Avatar, ButtonStyled, OverflowMenu } from '@modrinth/ui'
import {
Accordion,
Avatar,
ButtonStyled,
defineMessages,
OverflowMenu,
useVIntl,
} from '@modrinth/ui'
import { openUrl } from '@tauri-apps/plugin-opener'
import { defineMessages, useVIntl } from '@vintl/vintl'
import { useTemplateRef } from 'vue'
import ContextMenu from '@/components/ui/ContextMenu.vue'
@@ -28,7 +28,7 @@
:custom-label="
(version) =>
`${version?.name} (${version?.loaders
.map((name) => formatCategory(name))
.map((name) => formatLoader(formatMessage, name))
.join(', ')} - ${version?.game_versions.join(', ')})`
"
:max-height="150"
@@ -36,7 +36,9 @@
<span v-else>
<span>
{{ selectedVersion?.name }} ({{
selectedVersion?.loaders.map((name) => formatCategory(name)).join(', ')
selectedVersion?.loaders
.map((name) => formatLoader(formatMessage, name))
.join(', ')
}}
- {{ selectedVersion?.game_versions.join(', ') }})
</span>
@@ -57,8 +59,7 @@
<script setup>
import { DownloadIcon, XIcon } from '@modrinth/assets'
import { Button, injectNotificationManager } from '@modrinth/ui'
import { formatCategory } from '@modrinth/utils'
import { Button, formatLoader, injectNotificationManager, useVIntl } from '@modrinth/ui'
import { ref } from 'vue'
import Multiselect from 'vue-multiselect'
@@ -67,6 +68,7 @@ import { trackEvent } from '@/helpers/analytics'
import { add_project_from_version as installMod } from '@/helpers/profile'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
const instance = ref(null)
const project = ref(null)
@@ -4,10 +4,11 @@ import {
DownloadIcon,
PlusIcon,
RightArrowIcon,
SearchIcon,
UploadIcon,
XIcon,
} from '@modrinth/assets'
import { Avatar, Button, Card, injectNotificationManager } from '@modrinth/ui'
import { Avatar, Button, Card, injectNotificationManager, StyledInput } from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { open } from '@tauri-apps/plugin-dialog'
import { computed, ref } from 'vue'
@@ -159,20 +160,21 @@ const reset_icon = () => {
const createInstance = async () => {
creatingInstance.value = true
const loader =
versions.value[0].loaders[0] !== 'forge' &&
versions.value[0].loaders[0] !== 'fabric' &&
versions.value[0].loaders[0] !== 'quilt'
? 'vanilla'
: versions.value[0].loaders[0]
const gameVersions = versions.value[0].game_versions
const gameVersion = gameVersions[0]
const id = await create(
name.value,
versions.value[0].game_versions[0],
loader,
'latest',
icon.value,
).catch(handleError)
const loaders = versions.value[0].loaders
const loader = loaders.contains('fabric')
? 'fabric'
: loaders.contains('neoforge')
? 'neoforge'
: loaders.contains('forge')
? 'forge'
: loaders.contains('quilt')
? 'quilt'
: 'vanilla'
const id = await create(name.value, gameVersion, loader, 'latest', icon.value).catch(handleError)
await installMod(id, versions.value[0].id).catch(handleError)
@@ -210,12 +212,12 @@ const createInstance = async () => {
<template>
<ModalWrapper ref="installModal" header="Install project to instance" :on-hide="onInstall">
<div class="modal-body">
<input
<StyledInput
v-model="searchFilter"
autocomplete="off"
type="text"
class="search"
:icon="SearchIcon"
type="search"
placeholder="Search for an instance"
autocomplete="off"
/>
<div class="profiles" :class="{ 'hide-creation': !showCreation }">
<div v-for="profile in shownProfiles" :key="profile.name" class="option">
@@ -270,7 +272,7 @@ const createInstance = async () => {
</div>
</div>
<div class="creation-settings">
<input
<StyledInput
v-model="name"
autocomplete="off"
type="text"
@@ -4,12 +4,14 @@ import {
Avatar,
ButtonStyled,
Checkbox,
defineMessages,
injectNotificationManager,
OverflowMenu,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { open } from '@tauri-apps/plugin-dialog'
import { defineMessages, useVIntl } from '@vintl/vintl'
import { computed, type Ref, ref, watch } from 'vue'
import { useRouter } from 'vue-router'
@@ -244,13 +246,12 @@ const messages = defineMessages({
{{ formatMessage(messages.name) }}
</label>
<div class="flex">
<input
<StyledInput
id="instance-name"
v-model="title"
autocomplete="off"
maxlength="80"
class="flex-grow"
type="text"
:maxlength="80"
wrapper-class="flex-grow"
/>
</div>
<template v-if="instance.install_stage == 'installed'">
@@ -291,9 +292,8 @@ const messages = defineMessages({
@click="toggleGroup(group)"
/>
<div class="flex gap-2 items-center">
<input
<StyledInput
v-model="newCategoryInput"
type="text"
:placeholder="formatMessage(messages.libraryGroupsEnterName)"
@submit="() => addCategory"
/>
@@ -1,6 +1,11 @@
<script setup lang="ts">
import { Checkbox, injectNotificationManager } from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import {
Checkbox,
defineMessages,
injectNotificationManager,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { computed, ref, watch } from 'vue'
import { edit } from '@/helpers/profile'
@@ -109,14 +114,13 @@ const messages = defineMessages({
<p class="m-0">
{{ formatMessage(messages.preLaunchDescription) }}
</p>
<input
<StyledInput
id="pre-launch"
v-model="hooks.pre_launch"
autocomplete="off"
:disabled="!overrideHooks"
type="text"
:placeholder="formatMessage(messages.preLaunchEnter)"
class="w-full mt-2"
wrapper-class="w-full mt-2"
/>
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast">
@@ -125,14 +129,13 @@ const messages = defineMessages({
<p class="m-0">
{{ formatMessage(messages.wrapperDescription) }}
</p>
<input
<StyledInput
id="wrapper"
v-model="hooks.wrapper"
autocomplete="off"
:disabled="!overrideHooks"
type="text"
:placeholder="formatMessage(messages.wrapperEnter)"
class="w-full mt-2"
wrapper-class="w-full mt-2"
/>
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast">
@@ -141,14 +144,13 @@ const messages = defineMessages({
<p class="m-0">
{{ formatMessage(messages.postExitDescription) }}
</p>
<input
<StyledInput
id="post-exit"
v-model="hooks.post_exit"
autocomplete="off"
:disabled="!overrideHooks"
type="text"
:placeholder="formatMessage(messages.postExitEnter)"
class="w-full mt-2"
wrapper-class="w-full mt-2"
/>
</div>
</template>
@@ -1,6 +1,7 @@
<script setup lang="ts">
import {
DownloadIcon,
getLoaderIcon,
HammerIcon,
IssuesIcon,
SpinnerIcon,
@@ -16,16 +17,12 @@ import {
Checkbox,
Chips,
Combobox,
defineMessages,
formatLoader,
injectNotificationManager,
useVIntl,
} from '@modrinth/ui'
import {
formatCategory,
type GameVersionTag,
type PlatformTag,
type Project,
type Version,
} from '@modrinth/utils'
import { defineMessages, useVIntl } from '@vintl/vintl'
import type { GameVersionTag, PlatformTag, Project, Version } from '@modrinth/utils'
import dayjs from 'dayjs'
import { computed, type ComputedRef, type Ref, ref, shallowRef, watch } from 'vue'
@@ -128,9 +125,7 @@ if (props.instance.linked_data && props.instance.linked_data.project_id && !prop
fetching.value = false
}
const currentLoaderIcon = computed(
() => loaders?.value.find((x) => x.name === props.instance.loader)?.icon,
)
const currentLoaderIcon = computed(() => getLoaderIcon(props.instance.loader))
const gameVersionsForLoader = computed(() => {
return all_game_versions?.value.filter((item) => {
@@ -549,7 +544,7 @@ const messages = defineMessages({
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"
>
<div v-if="!!currentLoaderIcon" class="contents" v-html="currentLoaderIcon" />
<component :is="currentLoaderIcon" v-if="currentLoaderIcon" />
<WrenchIcon v-else />
</div>
<div class="flex flex-col gap-2 justify-center">
@@ -568,7 +563,7 @@ const messages = defineMessages({
? modpackVersion
? modpackVersion?.version_number
: 'Unknown version'
: formatCategory(instance.loader)
: formatLoader(formatMessage, instance.loader)
}}
<template v-if="instance.loader !== 'vanilla' && !modpackProject">
{{ instance.loader_version || formatMessage(messages.unknownVersion) }}
@@ -676,7 +671,11 @@ const messages = defineMessages({
</div>
<template v-if="loader !== 'vanilla'">
<h2 class="m-0 mt-4 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.loaderVersion, { loader: formatCategory(loader) }) }}
{{
formatMessage(messages.loaderVersion, {
loader: formatLoader(formatMessage, loader),
})
}}
</h2>
<Combobox
v-if="selectableLoaderVersions"
@@ -708,7 +707,7 @@ const messages = defineMessages({
? messages.alreadyInstalledVanilla
: messages.alreadyInstalledModded,
{
platform: formatCategory(loader),
platform: formatLoader(formatMessage, loader),
version: instance.loader_version,
game_version: gameVersion,
},
@@ -1,7 +1,13 @@
<script setup lang="ts">
import { CheckCircleIcon, XCircleIcon } from '@modrinth/assets'
import { Checkbox, injectNotificationManager, Slider } from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import {
Checkbox,
defineMessages,
injectNotificationManager,
Slider,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { computed, readonly, ref, watch } from 'vue'
import JavaSelector from '@/components/ui/JavaSelector.vue'
@@ -9,7 +15,7 @@ import useMemorySlider from '@/composables/useMemorySlider'
import { edit, get_optimal_jre_key } from '@/helpers/profile'
import { get } from '@/helpers/settings.ts'
import type { AppSettings, InstanceSettingsTabProps, MemorySettings } from '../../../helpers/types'
import type { AppSettings, InstanceSettingsTabProps } from '../../../helpers/types'
const { handleError } = injectNotificationManager()
const { formatMessage } = useVIntl()
@@ -22,12 +28,12 @@ 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 overrideJavaArgs = ref(props.instance.extra_launch_args?.length !== undefined)
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 overrideEnvVars = ref(props.instance.custom_env_vars?.length !== undefined)
const overrideEnvVars = ref((props.instance.custom_env_vars?.length ?? 0) > 0)
const envVars = ref(
(props.instance.custom_env_vars ?? globalSettings.custom_env_vars)
.map((x) => x.join('='))
@@ -42,36 +48,23 @@ const { maxMemory, snapPoints } = (await useMemorySlider().catch(handleError)) a
}
const editProfileObject = computed(() => {
const editProfile: {
java_path?: string
extra_launch_args?: string[]
custom_env_vars?: string[][]
memory?: MemorySettings
} = {}
if (overrideJavaInstall.value) {
if (javaInstall.value.path !== '') {
editProfile.java_path = javaInstall.value.path.replace('java.exe', 'javaw.exe')
}
return {
java_path:
overrideJavaInstall.value && javaInstall.value.path !== ''
? javaInstall.value.path.replace('java.exe', 'javaw.exe')
: null,
extra_launch_args: overrideJavaArgs.value
? javaArgs.value.trim().split(/\s+/).filter(Boolean)
: null,
custom_env_vars: overrideEnvVars.value
? envVars.value
.trim()
.split(/\s+/)
.filter(Boolean)
.map((x) => x.split('=').filter(Boolean))
: null,
memory: overrideMemorySettings.value ? memory.value : null,
}
if (overrideJavaArgs.value) {
editProfile.extra_launch_args = javaArgs.value.trim().split(/\s+/).filter(Boolean)
}
if (overrideEnvVars.value) {
editProfile.custom_env_vars = envVars.value
.trim()
.split(/\s+/)
.filter(Boolean)
.map((x) => x.split('=').filter(Boolean))
}
if (overrideMemorySettings.value) {
editProfile.memory = memory.value
}
return editProfile
})
watch(
@@ -169,27 +162,25 @@ const messages = defineMessages({
{{ formatMessage(messages.javaArguments) }}
</h2>
<Checkbox v-model="overrideJavaArgs" label="Custom java arguments" class="my-2" />
<input
<StyledInput
id="java-args"
v-model="javaArgs"
autocomplete="off"
:disabled="!overrideJavaArgs"
type="text"
class="w-full"
placeholder="Enter java arguments..."
wrapper-class="w-full"
/>
<h2 id="project-name" class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
{{ formatMessage(messages.javaEnvironmentVariables) }}
</h2>
<Checkbox v-model="overrideEnvVars" label="Custom environment variables" class="mb-2" />
<input
<StyledInput
id="env-vars"
v-model="envVars"
autocomplete="off"
:disabled="!overrideEnvVars"
type="text"
class="w-full"
placeholder="Enter environmental variables..."
wrapper-class="w-full"
/>
</div>
</template>
@@ -1,6 +1,12 @@
<script setup lang="ts">
import { Checkbox, injectNotificationManager, Toggle } from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import {
Checkbox,
defineMessages,
injectNotificationManager,
StyledInput,
Toggle,
useVIntl,
} from '@modrinth/ui'
import { computed, type Ref, ref, watch } from 'vue'
import { edit } from '@/helpers/profile'
@@ -26,20 +32,16 @@ const fullscreenSetting: Ref<boolean> = ref(
)
const editProfileObject = computed(() => {
const editProfile: {
force_fullscreen?: boolean
game_resolution?: [number, number]
} = {}
if (overrideWindowSettings.value) {
editProfile.force_fullscreen = fullscreenSetting.value
if (!fullscreenSetting.value) {
editProfile.game_resolution = resolution.value
if (!overrideWindowSettings.value) {
return {
force_fullscreen: null,
game_resolution: null,
}
}
return editProfile
return {
force_fullscreen: fullscreenSetting.value,
game_resolution: fullscreenSetting.value ? null : resolution.value,
}
})
watch(
@@ -95,14 +97,6 @@ const messages = defineMessages({
<Checkbox
v-model="overrideWindowSettings"
:label="formatMessage(messages.customWindowSettings)"
@update:model-value="
(value) => {
if (!value) {
resolution = globalSettings.game_resolution
fullscreenSetting = globalSettings.force_fullscreen
}
}
"
/>
<div class="mt-2 flex items-center gap-4 justify-between">
<div>
@@ -134,7 +128,7 @@ const messages = defineMessages({
{{ formatMessage(messages.widthDescription) }}
</p>
</div>
<input
<StyledInput
id="width"
v-model="resolution[0]"
autocomplete="off"
@@ -153,7 +147,7 @@ const messages = defineMessages({
{{ formatMessage(messages.heightDescription) }}
</p>
</div>
<input
<StyledInput
id="height"
v-model="resolution[1]"
autocomplete="off"
@@ -3,16 +3,23 @@ import {
CoffeeIcon,
GameIcon,
GaugeIcon,
LanguagesIcon,
ModrinthIcon,
PaintbrushIcon,
ReportIcon,
SettingsIcon,
ShieldIcon,
} from '@modrinth/assets'
import { ProgressBar, TabbedModal } from '@modrinth/ui'
import {
commonMessages,
defineMessage,
defineMessages,
ProgressBar,
TabbedModal,
useVIntl,
} from '@modrinth/ui'
import { getVersion } from '@tauri-apps/api/app'
import { platform as getOsPlatform, version as getOsVersion } from '@tauri-apps/plugin-os'
import { defineMessage, defineMessages, useVIntl } from '@vintl/vintl'
import { computed, ref, watch } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
@@ -20,6 +27,7 @@ import AppearanceSettings from '@/components/ui/settings/AppearanceSettings.vue'
import DefaultInstanceSettings from '@/components/ui/settings/DefaultInstanceSettings.vue'
import FeatureFlagSettings from '@/components/ui/settings/FeatureFlagSettings.vue'
import JavaSettings from '@/components/ui/settings/JavaSettings.vue'
import LanguageSettings from '@/components/ui/settings/LanguageSettings.vue'
import PrivacySettings from '@/components/ui/settings/PrivacySettings.vue'
import ResourceManagementSettings from '@/components/ui/settings/ResourceManagementSettings.vue'
import { get, set } from '@/helpers/settings.ts'
@@ -46,6 +54,15 @@ const tabs = [
icon: PaintbrushIcon,
content: AppearanceSettings,
},
{
name: defineMessage({
id: 'app.settings.tabs.language',
defaultMessage: 'Language',
}),
icon: LanguagesIcon,
content: LanguageSettings,
badge: commonMessages.beta,
},
{
name: defineMessage({
id: 'app.settings.tabs.privacy',
@@ -0,0 +1,189 @@
<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)">
{{ 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-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" />
<div class="flex flex-col gap-0.5">
<span class="font-semibold text-contrast">{{ project.title }}</span>
<span class="text-sm text-secondary">
{{ loaderDisplay }} {{ project.game_versions?.[0] }}
<template v-if="modCount">
· {{ formatMessage(messages.modCount, { count: modCount }) }}
</template>
</span>
</div>
</div>
</div>
</div>
<template #actions>
<div class="flex justify-end gap-2">
<ButtonStyled>
<button @click="handleDecline">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button @click="handleAccept">
<DownloadIcon />
{{ formatMessage(messages.installButton) }}
</button>
</ButtonStyled>
</div>
</template>
</NewModal>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import { DownloadIcon, XIcon } from '@modrinth/assets'
import {
Admonition,
Avatar,
ButtonStyled,
commonMessages,
defineMessages,
formatLoader,
IntlFormatted,
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
}>()
const modal = ref<InstanceType<typeof NewModal>>()
const { formatMessage } = useVIntl()
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 loaderDisplay = computed(() => {
const loader = props.project.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)
async function handleAccept() {
hide()
try {
await install(props.project.id, null, null, 'ProjectPageInstallToPlayModal')
} catch (error) {
console.error('Failed to install project from InstallToPlayModal:', error)
}
}
function handleDecline() {
hide()
}
function show(e?: MouseEvent) {
modal.value?.show(e)
}
function hide() {
modal.value?.hide()
}
const messages = defineMessages({
installToPlay: {
id: 'app.modal.install-to-play.header',
defaultMessage: 'Install to play',
},
sharedServerInstance: {
id: 'app.modal.install-to-play.shared-server-instance',
defaultMessage: 'Shared server instance',
},
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.',
},
sharedByToday: {
id: 'app.modal.install-to-play.shared-by-today',
defaultMessage: '{name} shared this instance with you today.',
},
sharedInstance: {
id: 'app.modal.install-to-play.shared-instance',
defaultMessage: 'Shared instance',
},
modCount: {
id: 'app.modal.install-to-play.mod-count',
defaultMessage: '{count, plural, one {# mod} other {# mods}}',
},
installButton: {
id: 'app.modal.install-to-play.install-button',
defaultMessage: 'Install',
},
})
defineExpose({ show, hide })
</script>
@@ -7,9 +7,15 @@ import {
MonitorIcon,
WrenchIcon,
} from '@modrinth/assets'
import { Avatar, TabbedModal, type TabbedModalTab } from '@modrinth/ui'
import {
Avatar,
commonMessages,
defineMessage,
TabbedModal,
type TabbedModalTab,
useVIntl,
} from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { defineMessage, useVIntl } from '@vintl/vintl'
import { ref } from 'vue'
import GeneralSettings from '@/components/ui/instance_settings/GeneralSettings.vue'
@@ -75,11 +81,6 @@ function show() {
}
defineExpose({ show })
const titleMessage = defineMessage({
id: 'instance.settings.title',
defaultMessage: 'Settings',
})
</script>
<template>
<ModalWrapper ref="modal">
@@ -91,7 +92,9 @@ const titleMessage = defineMessage({
:tint-by="props.instance.path"
/>
{{ instance.name }} <ChevronRightIcon />
<span class="font-extrabold text-contrast">{{ formatMessage(titleMessage) }}</span>
<span class="font-extrabold text-contrast">{{
formatMessage(commonMessages.settingsLabel)
}}</span>
</span>
</template>
@@ -0,0 +1,382 @@
<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>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
DownloadIcon,
MinusIcon,
PlusIcon,
RefreshCwIcon,
ReportIcon,
XIcon,
} from '@modrinth/assets'
import {
Admonition,
ButtonStyled,
commonMessages,
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 { update_managed_modrinth_version } from '@/helpers/profile'
import type { GameInstance } from '@/helpers/types'
type Dependency = Labrinth.Versions.v3.Dependency
type Version = Labrinth.Versions.v2.Version
interface BaseDiff {
project_id: string
project?: {
title: string
icon_url?: string
slug: string
}
currentVersionId?: string
newVersionId?: string
currentVersion?: Version
newVersion?: Version
}
interface AddedDiff extends BaseDiff {
type: 'added'
newVersionId: string
}
interface RemovedDiff extends BaseDiff {
type: 'removed'
}
interface UpdatedDiff extends BaseDiff {
type: 'updated'
currentVersionId: string
newVersionId: string
}
type DependencyDiff = AddedDiff | RemovedDiff | UpdatedDiff
type ProjectInfo = {
id: string
title: string
icon_url?: string
slug: string
}
const { instance } = defineProps<{
instance: GameInstance
}>()
const { formatMessage } = useVIntl()
const modal = ref<InstanceType<typeof NewModal>>()
const diffs = ref<DependencyDiff[]>([])
const latestVersionId = ref<string | null>(null)
const latestVersion = 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,
)
function getFilename(version?: Version): string | undefined {
return version?.files.find((f) => f.primary)?.filename
}
async function computeDependencyDiffs(
currentDeps: Dependency[],
latestDeps: Dependency[],
): Promise<DependencyDiff[]> {
const currentByProject = new Map<string, Dependency>(
currentDeps.map((d) => [d.project_id || '', d]),
)
const latestByProject = new Map<string, Dependency>(
latestDeps.map((d) => [d.project_id || '', d]),
)
const diffs: DependencyDiff[] = []
// Find added and updated dependencies
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 })
} else if (
currentDep?.version_id &&
latestDep?.version_id &&
currentDep?.version_id !== latestDep.version_id
) {
diffs.push({
type: 'updated',
project_id: projectId,
currentVersionId: currentDep.version_id,
newVersionId: latestDep.version_id,
})
}
})
// Find removed dependencies
currentByProject.forEach((currentDep, projectId) => {
if (!projectId) return
if (!latestByProject.has(projectId)) {
diffs.push({
type: 'removed',
project_id: projectId,
currentVersionId: currentDep.version_id,
})
}
})
// Fetch projects and versions of diffs
const allProjectIds = [...new Set(diffs.map((d) => d.project_id).filter(Boolean))]
const allVersionIds = [
...new Set(
[...diffs.map((d) => d.newVersionId), ...diffs.map((d) => d.currentVersionId)].filter(
Boolean,
),
),
] as string[]
const [projects, versions] = await Promise.all([
get_project_many(allProjectIds, 'must_revalidate'),
get_version_many(allVersionIds, 'must_revalidate'),
])
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
.map((diff) => {
const project = projectMap.get(diff.project_id)
return {
...diff,
project: project
? { title: project.title, icon_url: project.icon_url, slug: project.slug }
: undefined,
currentVersion: diff.currentVersionId ? versionMap.get(diff.currentVersionId) : undefined,
newVersion: diff.newVersionId ? versionMap.get(diff.newVersionId) : undefined,
}
})
.sort((a, b) => {
const typeOrder = { removed: 0, added: 1, updated: 2 }
const typeCompare = typeOrder[a.type] - typeOrder[b.type]
if (typeCompare !== 0) return typeCompare
const aDate = a.newVersion?.date_published || a.currentVersion?.date_published || ''
const bDate = b.newVersion?.date_published || b.currentVersion?.date_published || ''
return dayjs(bDate).valueOf() - dayjs(aDate).valueOf()
})
}
async function checkUpdateAvailable(instance: GameInstance): Promise<DependencyDiff[] | null> {
if (!instance.linked_data) 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)
// Compute dependency diffs between current and latest version
if (currentVersion && latestVersion.value) {
return await computeDependencyDiffs(
currentVersion.dependencies || [],
latestVersion.value.dependencies || [],
)
}
} catch (error) {
console.error('Error checking for updates:', error)
return null
}
return null
}
watch(
() => instance,
async () => {
const result = await checkUpdateAvailable(instance)
diffs.value = result || []
},
{ immediate: true, deep: true },
)
async function handleUpdate() {
hide()
try {
if (latestVersionId.value) {
await update_managed_modrinth_version(instance.path, latestVersionId.value)
}
} catch (error) {
console.error('Error updating instance:', error)
}
}
function handleReport() {
if (instance.linked_data?.project_id) {
openUrl(`https://modrinth.com/report?item=project&itemID=${instance.linked_data.project_id}`)
}
}
function handleDecline() {
hide()
}
function show(e?: MouseEvent) {
modal.value?.show(e)
}
function hide() {
modal.value?.hide()
}
const messages = defineMessages({
updateToPlay: {
id: 'app.modal.update-to-play.header',
defaultMessage: 'Update to play',
},
updateRequired: {
id: 'app.modal.update-to-play.update-required',
defaultMessage: 'Update required',
},
updateRequiredDescription: {
id: 'app.modal.update-to-play.update-required-description',
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',
},
})
defineExpose({ show, hide })
</script>
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { injectNotificationManager, Slider, Toggle } from '@modrinth/ui'
import { injectNotificationManager, Slider, StyledInput, Toggle } from '@modrinth/ui'
import { ref, watch } from 'vue'
import useMemorySlider from '@/composables/useMemorySlider'
@@ -73,7 +73,7 @@ watch(
</p>
</div>
<input
<StyledInput
id="width"
v-model="settings.game_resolution[0]"
:disabled="settings.force_fullscreen"
@@ -91,13 +91,12 @@ watch(
</p>
</div>
<input
<StyledInput
id="height"
v-model="settings.game_resolution[1]"
:disabled="settings.force_fullscreen"
autocomplete="off"
type="number"
class="input"
placeholder="Enter height..."
/>
</div>
@@ -118,23 +117,23 @@ watch(
/>
<h2 class="mt-4 mb-2 text-lg font-extrabold text-contrast">Java arguments</h2>
<input
<StyledInput
id="java-args"
v-model="settings.launchArgs"
autocomplete="off"
type="text"
placeholder="Enter java arguments..."
class="w-full"
wrapper-class="w-full"
/>
<h2 class="mt-4 mb-2 text-lg font-extrabold text-contrast">Environmental variables</h2>
<input
<StyledInput
id="env-vars"
v-model="settings.envVars"
autocomplete="off"
type="text"
placeholder="Enter environmental variables..."
class="w-full"
wrapper-class="w-full"
/>
<hr class="mt-4 bg-button-border border-none h-[1px]" />
@@ -143,37 +142,37 @@ watch(
<h3 class="mt-2 m-0 text-base font-extrabold text-primary">Pre launch</h3>
<p class="m-0 mt-1 mb-2 leading-tight text-secondary">Ran before the instance is launched.</p>
<input
<StyledInput
id="pre-launch"
v-model="settings.hooks.pre_launch"
autocomplete="off"
type="text"
placeholder="Enter pre-launch command..."
class="w-full"
wrapper-class="w-full"
/>
<h3 class="mt-2 m-0 text-base font-extrabold text-primary">Wrapper</h3>
<p class="m-0 mt-1 mb-2 leading-tight text-secondary">
Wrapper command for launching Minecraft.
</p>
<input
<StyledInput
id="wrapper"
v-model="settings.hooks.wrapper"
autocomplete="off"
type="text"
placeholder="Enter wrapper command..."
class="w-full"
wrapper-class="w-full"
/>
<h3 class="mt-2 m-0 text-base font-extrabold text-primary">Post exit</h3>
<p class="m-0 mt-1 mb-2 leading-tight text-secondary">Ran after the game closes.</p>
<input
<StyledInput
id="post-exit"
v-model="settings.hooks.post_exit"
autocomplete="off"
type="text"
placeholder="Enter post-exit command..."
class="w-full"
wrapper-class="w-full"
/>
</div>
</template>
@@ -21,7 +21,7 @@ async function updateJavaVersion(version) {
}
</script>
<template>
<div v-for="(javaVersion, index) in [21, 17, 8]" :key="`java-${javaVersion}`">
<div v-for="(javaVersion, index) in [25, 21, 17, 8]" :key="`java-${javaVersion}`">
<h2 class="m-0 text-lg font-extrabold text-contrast" :class="{ 'mt-4': index !== 0 }">
Java {{ javaVersion }} location
</h2>
@@ -0,0 +1,71 @@
<script setup lang="ts">
import {
Admonition,
AutoLink,
IntlFormatted,
LanguageSelector,
languageSelectorMessages,
LOCALES,
useVIntl,
} from '@modrinth/ui'
import { 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 settings = ref(await get())
watch(
settings,
async () => {
await set(settings.value)
},
{ deep: true },
)
const $isChanging = ref(false)
async function onLocaleChange(newLocale: string) {
if (settings.value.locale === newLocale) return
$isChanging.value = true
try {
i18n.global.locale.value = newLocale
settings.value.locale = newLocale
} finally {
$isChanging.value = false
}
}
</script>
<template>
<h2 class="m-0 text-lg font-extrabold text-contrast">Language</h2>
<Admonition type="warning" class="mt-2 mb-4">
{{ formatMessage(languageSelectorMessages.languageWarning, { platform }) }}
</Admonition>
<p class="m-0 mb-4">
<IntlFormatted
:message-id="languageSelectorMessages.languagesDescription"
:values="{ platform }"
>
<template #~crowdin-link="{ children }">
<AutoLink to="https://translate.modrinth.com">
<component :is="() => children" />
</AutoLink>
</template>
</IntlFormatted>
</p>
<LanguageSelector
:current-locale="settings.locale"
:locales="LOCALES"
:on-locale-change="onLocaleChange"
:is-changing="$isChanging"
/>
</template>
@@ -1,6 +1,6 @@
<script setup>
import { BoxIcon, FolderSearchIcon, TrashIcon } from '@modrinth/assets'
import { Button, injectNotificationManager, Slider } from '@modrinth/ui'
import { Button, injectNotificationManager, Slider, StyledInput } from '@modrinth/ui'
import { open } from '@tauri-apps/plugin-dialog'
import { ref, watch } from 'vue'
@@ -65,13 +65,19 @@ async function findLauncherDir() {
</p>
<div class="m-1 my-2">
<div class="iconified-input w-full">
<BoxIcon />
<input id="appDir" v-model="settings.custom_dir" type="text" class="input" />
<Button class="r-btn" @click="findLauncherDir">
<FolderSearchIcon />
</Button>
</div>
<StyledInput
id="appDir"
v-model="settings.custom_dir"
:icon="BoxIcon"
type="text"
wrapper-class="w-full"
>
<template #right>
<Button class="r-btn" @click="findLauncherDir">
<FolderSearchIcon />
</Button>
</template>
</StyledInput>
</div>
<div>
@@ -15,10 +15,10 @@ import {
OverflowMenu,
SmartClickable,
useRelativeTime,
useVIntl,
} from '@modrinth/ui'
import { capitalizeString } from '@modrinth/utils'
import { convertFileSrc } from '@tauri-apps/api/core'
import { useVIntl } from '@vintl/vintl'
import type { Dayjs } from 'dayjs'
import dayjs from 'dayjs'
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
@@ -130,7 +130,7 @@ onUnmounted(() => {
/>
</template>
<div
class="grid grid-cols-[auto_minmax(0,3fr)_minmax(0,4fr)_auto] items-center gap-2 p-3 bg-bg-raised rounded-xl smart-clickable:highlight-on-hover"
class="grid grid-cols-[auto_minmax(0,3fr)_minmax(0,4fr)_auto] items-center gap-2 p-3 bg-bg-raised card-shadow rounded-xl smart-clickable:highlight-on-hover"
>
<Avatar
:src="instanceIcon ? convertFileSrc(instanceIcon) : undefined"
@@ -1,6 +1,8 @@
<script setup lang="ts">
import { LoaderCircleIcon } from '@modrinth/assets'
import type { GameVersion } from '@modrinth/ui'
import { GAME_MODES, HeadingLink, injectNotificationManager } from '@modrinth/ui'
import { platform } from '@tauri-apps/plugin-os'
import type { Dayjs } from 'dayjs'
import dayjs from 'dayjs'
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
@@ -39,6 +41,7 @@ const props = defineProps<{
const theme = useTheming()
const jumpBackInItems = ref<JumpBackInItem[]>([])
const loading = ref(true)
const serverData = ref<Record<string, ServerData>>({})
const protocolVersions = ref<Record<string, ProtocolVersion | null>>({})
const gameVersions = ref<GameVersion[]>(await get_game_versions().catch(() => []))
@@ -46,6 +49,11 @@ const gameVersions = ref<GameVersion[]>(await get_game_versions().catch(() => []
const MIN_JUMP_BACK_IN = 3
const MAX_JUMP_BACK_IN = 6
const TWO_WEEKS_AGO = dayjs().subtract(14, 'day')
const MAX_LINUX_POPULATES = 3
// Track populate calls on Linux to prevent server ping spam
const isLinux = platform() === 'linux'
const linuxPopulateCount = ref(0)
type BaseJumpBackInItem = {
last_played: Dayjs
@@ -71,11 +79,19 @@ watch([() => props.recentInstances, () => showWorlds.value], async () => {
})
})
await populateJumpBackIn().catch(() => {
console.error('Failed to populate jump back in')
})
populateJumpBackIn()
.catch(() => {
console.error('Failed to populate jump back in')
})
.finally(() => {
loading.value = false
})
async function populateJumpBackIn() {
// On Linux, limit automatic populates to prevent server ping spam
if (isLinux && linuxPopulateCount.value >= MAX_LINUX_POPULATES) return
if (isLinux) linuxPopulateCount.value++
console.info('Repopulating jump back in...')
const worldItems: WorldJumpBackInItem[] = []
@@ -224,6 +240,7 @@ const checkProcesses = async () => {
onMounted(() => {
checkProcesses()
linuxPopulateCount.value = 0
})
onUnmounted(() => {
@@ -233,7 +250,15 @@ onUnmounted(() => {
</script>
<template>
<div v-if="jumpBackInItems.length > 0" class="flex flex-col gap-2">
<div v-if="loading" class="flex flex-col gap-2">
<span class="flex mt-1 mb-3 leading-none items-center gap-1 text-primary text-lg font-bold">
Jump back in
</span>
<div class="text-center py-4">
<LoaderCircleIcon class="mx-auto size-8 animate-spin text-contrast" />
</div>
</div>
<div v-else-if="jumpBackInItems.length > 0" class="flex flex-col gap-2">
<HeadingLink v-if="theme.getFeatureFlag('worlds_tab')" to="/worlds" class="mt-1">
Jump back in
</HeadingLink>
@@ -17,18 +17,19 @@ import {
UserIcon,
XIcon,
} from '@modrinth/assets'
import type { MessageDescriptor } from '@modrinth/ui'
import {
Avatar,
ButtonStyled,
commonMessages,
defineMessages,
OverflowMenu,
SmartClickable,
useRelativeTime,
useVIntl,
} from '@modrinth/ui'
import { formatNumber, getPingLevel } from '@modrinth/utils'
import { convertFileSrc } from '@tauri-apps/api/core'
import type { MessageDescriptor } from '@vintl/vintl'
import { defineMessages, useVIntl } from '@vintl/vintl'
import dayjs from 'dayjs'
import { Tooltip } from 'floating-vue'
import type { Component } from 'vue'
@@ -181,14 +182,16 @@ const messages = defineMessages({
/>
</template>
<div
class="grid grid-cols-[auto_minmax(0,3fr)_minmax(0,4fr)_auto] items-center gap-2 p-3 bg-bg-raised smart-clickable:highlight-on-hover rounded-xl"
class="grid grid-cols-[auto_minmax(0,3fr)_minmax(0,4fr)_auto] items-center gap-2 p-3 bg-bg-raised card-shadow smart-clickable:highlight-on-hover rounded-xl"
:class="{
'world-item-highlighted': highlighted,
}"
>
<Avatar
:src="
world.type === 'server' && serverStatus ? serverStatus.favicon ?? world.icon : world.icon
world.type === 'server' && serverStatus
? (serverStatus.favicon ?? world.icon)
: world.icon
"
size="48px"
/>
@@ -1,7 +1,12 @@
<script setup lang="ts">
import { PlayIcon, PlusIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, commonMessages, injectNotificationManager } from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import {
ButtonStyled,
commonMessages,
defineMessages,
injectNotificationManager,
useVIntl,
} from '@modrinth/ui'
import { ref } from 'vue'
import InstanceModalTitlePrefix from '@/components/ui/modal/InstanceModalTitlePrefix.vue'
@@ -1,7 +1,12 @@
<script setup lang="ts">
import { SaveIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, commonMessages, injectNotificationManager } from '@modrinth/ui'
import { defineMessage, useVIntl } from '@vintl/vintl'
import {
ButtonStyled,
commonMessages,
defineMessage,
injectNotificationManager,
useVIntl,
} from '@modrinth/ui'
import { computed, ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
@@ -1,7 +1,14 @@
<script setup lang="ts">
import { ChevronRightIcon, SaveIcon, UndoIcon, XIcon } from '@modrinth/assets'
import { Avatar, ButtonStyled, commonMessages, injectNotificationManager } from '@modrinth/ui'
import { defineMessages, useVIntl } from '@vintl/vintl'
import {
Avatar,
ButtonStyled,
commonMessages,
defineMessages,
injectNotificationManager,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { computed, ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
@@ -97,12 +104,11 @@ const messages = defineMessages({
<h2 class="text-lg font-extrabold text-contrast mt-0 mb-1">
{{ formatMessage(messages.name) }}
</h2>
<input
<StyledInput
v-model="name"
type="text"
:placeholder="formatMessage(messages.placeholderName)"
class="w-full"
autocomplete="off"
wrapper-class="w-full"
/>
<HideFromHomeOption v-model="hideFromHome" class="mt-3" />
</div>
@@ -1,6 +1,5 @@
<script setup lang="ts">
import { Checkbox } from '@modrinth/ui'
import { defineMessage, useVIntl } from '@vintl/vintl'
import { Checkbox, defineMessage, useVIntl } from '@modrinth/ui'
import { computed } from 'vue'
const { formatMessage } = useVIntl()
@@ -1,6 +1,11 @@
<script setup lang="ts">
import { Combobox } from '@modrinth/ui'
import { defineMessages, type MessageDescriptor, useVIntl } from '@vintl/vintl'
import {
Combobox,
defineMessages,
type MessageDescriptor,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import type { ServerPackStatus } from '@/helpers/worlds.ts'
@@ -53,22 +58,20 @@ defineExpose({ resourcePackOptions })
<h2 class="text-lg font-extrabold text-contrast mt-0 mb-1">
{{ formatMessage(messages.name) }}
</h2>
<input
<StyledInput
v-model="name"
type="text"
:placeholder="formatMessage(messages.placeholderName)"
class="w-full"
autocomplete="off"
wrapper-class="w-full"
/>
<h2 class="text-lg font-extrabold text-contrast mt-3 mb-1">
{{ formatMessage(messages.address) }}
</h2>
<input
<StyledInput
v-model="address"
type="text"
placeholder="example.modrinth.gg"
class="w-full"
autocomplete="off"
wrapper-class="w-full"
/>
<h2 class="text-lg font-extrabold text-contrast mt-3 mb-1">
{{ formatMessage(messages.resourcePack) }}
+8
View File
@@ -13,6 +13,14 @@ import { invoke } from '@tauri-apps/api/core'
// await authenticate_await_completion()
// }
/**
* Check if the authentication servers are reachable, throwing an exception if
* not reachable.
*/
export async function check_reachable() {
await invoke('plugin:auth|check_reachable')
}
/**
* Authenticate a user with Hydra - part 1.
* This begins the authentication flow quasi-synchronously.
+2 -2
View File
@@ -18,7 +18,7 @@ import { install_to_existing_profile } from '@/helpers/pack.js'
- icon is a path to an image file, which will be copied into the profile directory
*/
export async function create(name, gameVersion, modloader, loaderVersion, iconPath, skipInstall) {
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', {
@@ -26,7 +26,7 @@ export async function create(name, gameVersion, modloader, loaderVersion, iconPa
gameVersion,
modloader,
loaderVersion,
iconPath,
icon,
skipInstall,
})
}
@@ -36,6 +36,7 @@ export type AppSettings = {
max_concurrent_writes: number
theme: ColorTheme
locale: string
default_page: 'home' | 'library'
collapsed_navigation: boolean
hide_nametag_skins_page: boolean
+18
View File
@@ -0,0 +1,18 @@
import { buildLocaleMessages, createMessageCompiler, type CrowdinMessages } from '@modrinth/ui'
import { createI18n } from 'vue-i18n'
const localeModules = import.meta.glob<{ default: CrowdinMessages }>('./locales/*/index.json', {
eager: true,
})
const i18n = createI18n({
legacy: false,
locale: 'en-US',
fallbackLocale: 'en-US',
messageCompiler: createMessageCompiler(),
missingWarn: false,
fallbackWarn: false,
messages: buildLocaleMessages(localeModules),
})
export default i18n
@@ -1,305 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Ontwikkelaarmodus geaktiveer."
},
"app.settings.downloading": {
"message": "Aflaai v{version}"
},
"app.settings.tabs.appearance": {
"message": "Voorkoms"
},
"app.settings.tabs.default-instance-options": {
"message": "Verstek instansie opsies"
},
"app.settings.tabs.feature-flags": {
"message": "Kenmerk vlae"
},
"app.settings.tabs.java-installations": {
"message": "Java installasies"
},
"app.settings.tabs.privacy": {
"message": "Privaatheid"
},
"app.settings.tabs.resource-management": {
"message": "Hulpbronbestuur"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} is gereed om te installeer! Herlaai nou werk, of outomaties wanneer jy naby Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App v{version} klaar afgelaai. Herlaai nou werk, of outomaties wanneer jy naby Modrinth App."
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} is nou beskikbaar! Aangesien jy op'n gemeterde netwerk, ons het nie outomaties laai dit."
},
"app.update-toast.changelog": {
"message": "Alle veranderinge"
},
"app.update-toast.download": {
"message": "Laai ({size})"
},
"app.update-toast.downloading": {
"message": "Aflaai..."
},
"app.update-toast.reload": {
"message": "Herlaai"
},
"app.update-toast.title": {
"message": "Die opdatering is beskikbaar"
},
"app.update-toast.title.download-complete": {
"message": "Aflaai voltooi"
},
"app.update.complete-toast.text": {
"message": "Klik hier om die veranderinge te sien."
},
"app.update.complete-toast.title": {
"message": "Weergawe {version} is suksesvol geïnstalleer!"
},
"app.update.download-update": {
"message": "Laai die opdatering af"
},
"app.update.downloading-update": {
"message": "Laai tans opdatering af ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Herlaai om opdatering te installeer"
},
"instance.add-server.add-and-play": {
"message": "voeg by en speel"
},
"instance.add-server.add-server": {
"message": "bediener byvoeg"
},
"instance.add-server.resource-pack.disabled": {
"message": "Gestrem"
},
"instance.add-server.resource-pack.enabled": {
"message": "aangeskakel"
},
"instance.add-server.resource-pack.prompt": {
"message": "spoed"
},
"instance.add-server.title": {
"message": "voeg 'n bediener by"
},
"instance.edit-server.title": {
"message": "wysig bediener"
},
"instance.edit-world.hide-from-home": {
"message": "versteek van die tuisblad"
},
"instance.edit-world.name": {
"message": "Naam"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft Wêreld"
},
"instance.edit-world.reset-icon": {
"message": "herstel ikoon"
},
"instance.edit-world.title": {
"message": "wêreld wysig"
},
"instance.filter.disabled": {
"message": "gestremde projekte"
},
"instance.filter.updates-available": {
"message": "opdaterings beskikbaar"
},
"instance.server-modal.address": {
"message": "adres"
},
"instance.server-modal.name": {
"message": "Naam"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft-bediener"
},
"instance.server-modal.resource-pack": {
"message": "Hulpbronpakket"
},
"instance.settings.tabs.general": {
"message": "Algemeen"
},
"instance.settings.tabs.general.delete": {
"message": "verwyder instansie"
},
"instance.settings.tabs.general.delete.button": {
"message": "verwyder instansie"
},
"instance.settings.tabs.general.delete.description": {
"message": "Vee 'n instansie permanent van jou toestel uit, insluitend jou wêrelde, konfigurasies en alle geïnstalleerde inhoud. Wees versigtig, want sodra jy 'n instansie verwyder het, is daar geen manier om dit te herstel nie."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Vee tans uit …"
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Duplikaat"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Kan nie dupliseer tydens installasie nie."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Duplikaat instansie"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Skep 'n kopie van hierdie instansie, insluitend wêrelde, konfigurasies, mods, ens."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Wwysig ikoon"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Verwyder ikoon"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Vervang ikoon"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Kies ikoon"
},
"instance.settings.tabs.general.library-groups": {
"message": "Biblioteekgroepe"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Skep nuwe groep"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Biblioteekgroepe laat jou toe om jou instansies in verskillende afdelings in jou biblioteek te organiseer."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Voer groepnaam in"
},
"instance.settings.tabs.general.name": {
"message": "Naam"
},
"instance.settings.tabs.hooks": {
"message": "Lanseerhake"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Pasgemaakte lanseerhake"
},
"instance.settings.tabs.hooks.description": {
"message": "Hooks laat gevorderde gebruikers toe om sekere stelselopdragte uit te voer voor en na die bekendstelling van die spel."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Na-uitgang"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Het gehardloop nadat die wedstryd geëindig het."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Voer die na-uitgang-opdrag in..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Voorbekendstelling"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Het gehardloop voordat die instansie geloods is."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Voer pre-lanceringsopdrag in..."
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Verpakking"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Verpakking opdrag vir die bekendstelling Van Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Voer die Verpakking-opdrag in..."
},
"instance.settings.tabs.installation": {
"message": "Installation"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} vir Minecraft {game_version} reeds geïnstalleer"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Vanilla {game_version} reeds geïnstalleer"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Verander weergawe"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Installeer"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Installasie"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Haal modpack weergawes"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Installeer nuwe weergawe"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Huidiglik geïnstalleer"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Ontfoutinligting:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Haal modpack besonderhede"
},
"instance.settings.tabs.installation.game-version": {
"message": "Spel weergawe"
},
"instance.settings.tabs.installation.install": {
"message": "Installeer"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Installasie aan die gang"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} weergawe"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Kan nie gekoppelde modpack-besonderhede haal nie. Kontroleer asseblief u internetverbinding."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} is nie beskikbaar Vir Minecraft {version} nie. Probeer'n ander mod loader."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Hierdie geval is gekoppel aan'n modpack, maar die modpack kon nie gevind word op Modrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "Basis"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Herinstalleer modpack"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Herinstalleer modpack weer"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Herinstalleer sal alle geïnstalleerde of gewysigde inhoud terugstel na wat deur die modpack verskaf word, en enige mods of inhoud wat jy bo-op die oorspronklike installasie bygevoeg het, verwyder. Dit kan onverwagte gedrag regstel as veranderinge aan die instansie aangebring is, maar as jou wêrelde nou afhanklik is van addisionele geïnstalleerde inhoud, kan dit bestaande wêrelde breek."
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Wil u definitief hierdie instansie herinstalleer?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Stel die inhoud van die instansie terug na sy oorspronklike toestand, en verwyder enige mods of inhoud wat u bo-op die oorspronklike modpack bygevoeg het."
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Herinstalleer modpack"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Herstel"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Herstel"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Herstel herinstalleer Minecraft afhanklikhede en tjeks vir korrupsie. Dit kan probleme oplos as u speletjie nie begin nie weens foute wat verband hou met die lanseerder, maar dit sal nie probleme of ineenstortings wat verband hou met geïnstalleerde mods oplos nie."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Herstel geval?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Herstelwerk aan die gang"
}
}
@@ -1,419 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "وضع المطوّر مُفعَّل."
},
"app.settings.tabs.appearance": {
"message": "المظهر"
},
"app.settings.tabs.default-instance-options": {
"message": "خيارات النسخة الافتراضية"
},
"app.settings.tabs.feature-flags": {
"message": "إعدادات المميزات"
},
"app.settings.tabs.java-installations": {
"message": "تثبيتات جافا"
},
"app.settings.tabs.privacy": {
"message": "الخصوصية"
},
"app.settings.tabs.resource-management": {
"message": "إدارة الموارد"
},
"instance.add-server.add-and-play": {
"message": "إضافة واللعب"
},
"instance.add-server.add-server": {
"message": "إضافة الخادم"
},
"instance.add-server.resource-pack.disabled": {
"message": "معطَّل"
},
"instance.add-server.resource-pack.enabled": {
"message": "مفعَّل"
},
"instance.add-server.resource-pack.prompt": {
"message": "موجه الأوامر"
},
"instance.add-server.title": {
"message": "إضافة خادم"
},
"instance.edit-server.title": {
"message": "تعديل خادم"
},
"instance.edit-world.hide-from-home": {
"message": "إخفاء من الصفحة الرئيسية"
},
"instance.edit-world.name": {
"message": "الاسم"
},
"instance.edit-world.placeholder-name": {
"message": "عالم ماينكرافت"
},
"instance.edit-world.reset-icon": {
"message": "إعادة تعيين الأيقونة"
},
"instance.edit-world.title": {
"message": "تعديل العالم"
},
"instance.filter.disabled": {
"message": "المشاريع المعطَّلة"
},
"instance.filter.updates-available": {
"message": "توجد تحديثات متاحة"
},
"instance.server-modal.address": {
"message": "العنوان"
},
"instance.server-modal.name": {
"message": "الاسم"
},
"instance.server-modal.placeholder-name": {
"message": "خادم ماين كرافت"
},
"instance.server-modal.resource-pack": {
"message": "حزمة الموارد"
},
"instance.settings.tabs.general": {
"message": "عام"
},
"instance.settings.tabs.general.delete": {
"message": "حذف النسخة"
},
"instance.settings.tabs.general.delete.button": {
"message": "حذف النسخة"
},
"instance.settings.tabs.general.delete.description": {
"message": "يحذف النسخة نهائيًا من جهازك، بما في ذلك عوالمك، إعداداتك، وجميع المحتويات المثبّتة. كن حذرًا، فبمجرد حذف النسخة لن تكون هناك أي طريقة لاستعادتها."
},
"instance.settings.tabs.general.deleting.button": {
"message": "جاري الحذف..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "نسخ"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "لا يمكن النسخ أثناء التثبيت."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "نسخة النسخة"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "إنشاء."
},
"instance.settings.tabs.general.edit-icon": {
"message": "تعديل الأيقونة"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "أزل الأيقونة"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "استبدل الأيقونة"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "اختر الأيقونة"
},
"instance.settings.tabs.general.library-groups": {
"message": "مجموعات المكتبة"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "إنشاء مجموعة جديدة"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "مجموعات المكتبة تساعدك على ترتيب حالاتك على أقسام مختلفة في مكتبتك."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "إدخال اسم المجموعة"
},
"instance.settings.tabs.general.name": {
"message": "الاسم"
},
"instance.settings.tabs.hooks": {
"message": "إجراءات تشغيل إضافية"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "إجراءات تشغيل إضافية مخصصة"
},
"instance.settings.tabs.hooks.description": {
"message": "إجراءات التشغيل المضافة تسمح للمستخدمين المتقدمين بإنشاء أوامر نظامية محددة قبل و عند تشغيل اللعبة."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "ما بعد الخروج"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "يتم تشغيله بعد إغلاق اللعبة."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "أدخل أمر ما بعد الخروج..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "ما قبل الإطلاق"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "يتم تشغيله قبل بَدْء تشغيل النسخة."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "أدخل أمر ما قبل الإطلاق..."
},
"instance.settings.tabs.hooks.title": {
"message": "خطافات تشغيل اللعبة"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "مُغلِّف"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "أمر غلاف لتشغيل ماين كرافت."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "أدخل أمر الغلاف..."
},
"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": "جافا والذاكرة"
},
"instance.settings.tabs.java.environment-variables": {
"message": "المتغيرات البيئية"
},
"instance.settings.tabs.java.hooks": {
"message": "الخطافات"
},
"instance.settings.tabs.java.java-arguments": {
"message": "وسائط جافا"
},
"instance.settings.tabs.java.java-installation": {
"message": "تثبيت جافا"
},
"instance.settings.tabs.java.java-memory": {
"message": "الذاكرة المخصَّصة"
},
"instance.settings.tabs.window": {
"message": "النافذة"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "إعدادات نافذة مخصّصة"
},
"instance.settings.tabs.window.fullscreen": {
"message": "ملء الشاشة"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "جعل اللعبة تبدأ في وضع ملء الشاشة عند التشغيل (باستخدام options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "الارتفاع"
},
"instance.settings.tabs.window.height.description": {
"message": "ارتفاع نافذة اللعبة عند التشغيل."
},
"instance.settings.tabs.window.height.enter": {
"message": "أدخل الارتفاع..."
},
"instance.settings.tabs.window.width": {
"message": "العرض"
},
"instance.settings.tabs.window.width.description": {
"message": "عرض نافذة اللعبة عند التشغيل."
},
"instance.settings.tabs.window.width.enter": {
"message": "أدخل العرض..."
},
"instance.settings.title": {
"message": "الإعدادات"
},
"instance.worlds.a_minecraft_server": {
"message": "خادم ماين كرافت"
},
"instance.worlds.cant_connect": {
"message": "لا يمكن الاتصال بالخادم"
},
"instance.worlds.copy_address": {
"message": "نسخ العنوان"
},
"instance.worlds.dont_show_on_home": {
"message": "عدم العرض في الصفحة الرئيسية"
},
"instance.worlds.filter.available": {
"message": "متاح"
},
"instance.worlds.game_already_open": {
"message": "النسخة مفتوحة بالفعل"
},
"instance.worlds.hardcore": {
"message": "وضع الهاردكور"
},
"instance.worlds.incompatible_server": {
"message": "الخادم غير متوافق"
},
"instance.worlds.no_contact": {
"message": "تعذّر الاتصال بالخادم"
},
"instance.worlds.no_server_quick_play": {
"message": "يمكنك الدخول مباشرة إلى الخوادم فقط على ماين كرافت Alpha 1.0.5+"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "يمكنك الدخول مباشرة إلى عوالم اللعب الفردي فقط على ماين كرافت ‎1.20+‎"
},
"instance.worlds.play_instance": {
"message": "تشغيل النسخة"
},
"instance.worlds.type.server": {
"message": "الخادم"
},
"instance.worlds.type.singleplayer": {
"message": "لعب فردي"
},
"instance.worlds.view_instance": {
"message": "عرض النسخة"
},
"instance.worlds.world_in_use": {
"message": "العالم قيد الاستخدام"
},
"search.filter.locked.instance": {
"message": "مقدَّم من النسخة"
},
"search.filter.locked.instance-game-version.title": {
"message": "إصدار اللعبة مقدَّم من النسخة"
},
"search.filter.locked.instance-loader.title": {
"message": "المحمّل مقدَّم من النسخة"
},
"search.filter.locked.instance.sync": {
"message": "مزامنة مع النسخة"
}
}
+38 -8
View File
@@ -1,4 +1,34 @@
{
"app.auth-servers.unreachable.body": {
"message": "قد تكون خوادم مصادقة ماينكرافت معطلة حاليًا. تحقق من اتصالك بالإنترنت وحاول مرة أخرى لاحقًا."
},
"app.auth-servers.unreachable.header": {
"message": "تعذر الوصول إلى خوادم المصادقة"
},
"app.modal.install-to-play.header": {
"message": "نزل للعب"
},
"app.modal.install-to-play.install-button": {
"message": "تثبيت"
},
"app.modal.install-to-play.mod-count": {
"message": ""
},
"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.update-required": {
"message": "يلزم التحديث"
},
"app.settings.developer-mode-enabled": {
"message": "تم تفعيل وضع المطوّر."
},
@@ -17,6 +47,9 @@
"app.settings.tabs.java-installations": {
"message": "تثبيتات جافا"
},
"app.settings.tabs.language": {
"message": "اللغة"
},
"app.settings.tabs.privacy": {
"message": "الخصوصية"
},
@@ -78,7 +111,7 @@
"message": "جار إضافة صديق"
},
"friends.add-friend.username.description": {
"message": "قد يختلف عن اسم المستخدم الخاص بهم في Minecraft!"
"message": "قد يختلف عن اسم المستخدم الخاص بهم في ماينكرافت!"
},
"friends.add-friend.username.placeholder": {
"message": "أدخل اسم مستخدم Modrinth..."
@@ -132,7 +165,7 @@
"message": "إضافة واللعب"
},
"instance.add-server.add-server": {
"message": "إضافة الخادم"
"message": "إضافة خادم"
},
"instance.add-server.resource-pack.disabled": {
"message": "معطَّل"
@@ -177,7 +210,7 @@
"message": "الاسم"
},
"instance.server-modal.placeholder-name": {
"message": "خادم ماين كرافت"
"message": "خادم ماينكرافت"
},
"instance.server-modal.resource-pack": {
"message": "حزمة الموارد"
@@ -270,7 +303,7 @@
"message": "مُغلِّف"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "أمر غلاف لتشغيل ماين كرافت."
"message": "أمر غلاف لتشغيل ماينكرافت."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "أدخل أمر الغلاف..."
@@ -279,7 +312,7 @@
"message": "تثبيت"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} لماين كرافت {game_version} مثبت بالفعل"
"message": "{platform} {version} لماينكرافت {game_version} مثبت بالفعل"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "فانيلا {game_version} مُثبّتة بالفعل"
@@ -461,9 +494,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "أدخل العرض..."
},
"instance.settings.title": {
"message": "الإعدادات"
},
"instance.worlds.a_minecraft_server": {
"message": "خادم ماين كرافت"
},
@@ -1,8 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": ""
},
"app.settings.downloading": {
"message": ""
}
}
@@ -1 +0,0 @@
{}
@@ -1,131 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Режим за разработчици активиран."
},
"app.settings.tabs.appearance": {
"message": "Външен вид"
},
"app.settings.tabs.default-instance-options": {
"message": "Опции по подразбиране"
},
"app.settings.tabs.java-installations": {
"message": "Java инсталации"
},
"app.settings.tabs.privacy": {
"message": "Поверителност"
},
"app.settings.tabs.resource-management": {
"message": "Контрол на ресурси"
},
"instance.add-server.add-and-play": {
"message": "Добави и играй"
},
"instance.add-server.add-server": {
"message": "Добави сървър"
},
"instance.add-server.resource-pack.disabled": {
"message": "Деактивирано"
},
"instance.add-server.resource-pack.enabled": {
"message": "Активирано"
},
"instance.add-server.title": {
"message": "Добавяне на сървър"
},
"instance.edit-server.title": {
"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.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}. Моля пробвайте друг mod loader."
},
"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.title": {
"message": "Сигурни ли сте, че искате да преинсталирате това?"
},
"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.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.window": {
"message": "Прозорец"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Различни настройки на прозорец"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Пълен екран"
}
}
@@ -1 +0,0 @@
{}
@@ -1,179 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Mode de desenvolupament activat."
},
"app.settings.tabs.appearance": {
"message": "Aparença"
},
"app.settings.tabs.default-instance-options": {
"message": "Opcions d'instància per defecte"
},
"app.settings.tabs.java-installations": {
"message": "Instal·lacions de Java"
},
"app.settings.tabs.privacy": {
"message": "Privacitat"
},
"instance.add-server.add-and-play": {
"message": "Afegir i jugar"
},
"instance.add-server.add-server": {
"message": "Afegir servidor"
},
"instance.add-server.resource-pack.disabled": {
"message": "Desactivat"
},
"instance.add-server.resource-pack.enabled": {
"message": "Activat"
},
"instance.add-server.resource-pack.prompt": {
"message": "Preguntar"
},
"instance.add-server.title": {
"message": "Afegir un servidor"
},
"instance.edit-server.title": {
"message": "Editar servidor"
},
"instance.edit-world.hide-from-home": {
"message": "Amagar de l'inici"
},
"instance.edit-world.name": {
"message": "Nom"
},
"instance.edit-world.placeholder-name": {
"message": "Món de Minecraft"
},
"instance.edit-world.reset-icon": {
"message": "Reinicia l'icona"
},
"instance.edit-world.title": {
"message": "Edita el món"
},
"instance.filter.disabled": {
"message": "Projectes desactivats"
},
"instance.filter.updates-available": {
"message": "Actualitzacions disponibles"
},
"instance.server-modal.address": {
"message": "Adreça web"
},
"instance.server-modal.name": {
"message": "Nom"
},
"instance.server-modal.placeholder-name": {
"message": "Servidor de Minecraft"
},
"instance.server-modal.resource-pack": {
"message": "Paquet de recursos"
},
"instance.settings.tabs.general": {
"message": "General"
},
"instance.settings.tabs.general.delete": {
"message": "Suprimeix la instància"
},
"instance.settings.tabs.general.delete.button": {
"message": "Suprimir instància"
},
"instance.settings.tabs.general.delete.description": {
"message": "Suprimeix permanentment una instància del dispositiu, inclosos els vostres mons, configuracions i tot el contingut instal·lat. Aneu amb compte, ja que un cop suprimiu una instància no hi ha manera de recuperar-la."
},
"instance.settings.tabs.general.deleting.button": {
"message": "S'està suprimint..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Duplicar"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "No es pot duplicar durant la instal·lació."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Duplica la instància"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Crea una còpia d'aquesta instància, incloent-hi mons, configuracions, mods, etc."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Edita la icona"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Treu icona"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Substitueix icona"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Selecciona icona"
},
"instance.settings.tabs.general.library-groups": {
"message": "Grup de llibreries"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Crear nou grup"
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Introdueix nom del grup"
},
"instance.settings.tabs.general.name": {
"message": "Nom"
},
"instance.settings.tabs.installation": {
"message": "Instal·lació"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Canviar versió"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instal·lar"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instal·lant"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versió del joc"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.platform": {
"message": "Plataforma"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Reparar"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "canviar versió"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "reparar"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(versió desconeguda)"
},
"instance.settings.tabs.java": {
"message": "Java i memòria"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Pantalla completa"
},
"instance.settings.tabs.window.height": {
"message": "Altura"
},
"instance.settings.tabs.window.width": {
"message": "Amplada"
},
"instance.settings.title": {
"message": "Configuració"
},
"instance.worlds.filter.available": {
"message": "Disponible"
},
"instance.worlds.play_instance": {
"message": "Jugar instància"
},
"instance.worlds.type.server": {
"message": "Servidor"
}
}
@@ -1,410 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Gipaandar ang paagi sa tigpalambo."
},
"app.settings.downloading": {
"message": "Gakarganug sa v{version}"
},
"app.settings.tabs.appearance": {
"message": "Panagway"
},
"app.settings.tabs.default-instance-options": {
"message": "Mga kapilian sa sukaranan nga pananglitan"
},
"app.settings.tabs.feature-flags": {
"message": "Bandera sa mga panagway"
},
"app.settings.tabs.java-installations": {
"message": "Mga pagtaod sa Java"
},
"app.settings.tabs.privacy": {
"message": "Pribasiya"
},
"app.settings.tabs.resource-management": {
"message": "Pagdumala sa kahinguhaan"
},
"app.update-toast.body": {
"message": "Andam na mataud ang Modrinth App v{version}! Pagkarga kausab aron mapasibo, o kinaugalingon pagtak-op sa Modrinth App."
},
"app.update-toast.body.download-complete": {
"message": "Nahuman ang pagkarganug sa Modrinth App v{version}. Pagkarga kausab aron mapasibo, o kinaugalingon pagtak-op sa Modrinth App."
},
"app.update-toast.body.metered": {
"message": "Magamit na karon ang Modrinth App! Wala namo karganugi daan kay inihap man ang imong pum-ot."
},
"app.update-toast.changelog": {
"message": "Talaan sa Kausaban"
},
"app.update-toast.download": {
"message": "Karganugi ({size})"
},
"app.update-toast.downloading": {
"message": "Gakarganug..."
},
"app.update-toast.reload": {
"message": "Kargaha pag-usab"
},
"app.update-toast.title": {
"message": "Naay bag-o nga pagpasibo"
},
"app.update-toast.title.download-complete": {
"message": "Nahuman ang pagkarganug"
},
"app.update.complete-toast.text": {
"message": "Panuplok diri aron malantaw ang talaan sa kausaban."
},
"app.update.complete-toast.title": {
"message": "Malampusong nataud ang bersiyon nga {version}!"
},
"app.update.download-update": {
"message": "Karganugi ang kausaban"
},
"app.update.downloading-update": {
"message": "Gakarganug sa pagpasibo ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Andam mataud ang pagpasibo"
},
"friends.action.add-friend": {
"message": "Pagdugang og higala"
},
"friends.action.view-friend-requests": {
"message": "{count} ka hangyo sa pakighigala"
},
"friends.add-friend.submit": {
"message": "Pagpadala og hangyo sa pakighigala"
},
"friends.add-friend.title": {
"message": "Pagdugang og higala"
},
"friends.add-friend.username.description": {
"message": "Mahimong galahi sa ngalan nila sa Minecraft!"
},
"friends.add-friend.username.placeholder": {
"message": "Ibutang ang ngalan sa tiggamit sa Modrinth..."
},
"friends.add-friend.username.title": {
"message": "Unsa man ang ngalan sa imong higala sa Modrinth?"
},
"friends.add-friends-to-share": {
"message": "<link>Pagdugang og mga higala</link> aron makit-an ang ilang ginadula!"
},
"friends.friend.cancel-request": {
"message": "Bawia ang hangyo"
},
"friends.friend.remove-friend": {
"message": "Tangtangi ang higala"
},
"friends.friend.request-sent": {
"message": "Gipadala na ang hangyo sa pakighigala"
},
"friends.friend.view-profile": {
"message": "Tan-awa ang propayl"
},
"friends.heading": {
"message": "Mga higala"
},
"friends.heading.active": {
"message": "Malihokon"
},
"friends.heading.offline": {
"message": "Sira"
},
"friends.heading.online": {
"message": "Buka"
},
"friends.heading.pending": {
"message": "Gahulat"
},
"friends.no-friends-match": {
"message": "Walay higala nga motukma sa \"{query}\""
},
"friends.search-friends-placeholder": {
"message": "Mangita sa mga higala..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"instance.add-server.add-and-play": {
"message": "Idugang ug dulaa"
},
"instance.add-server.add-server": {
"message": "Idugang ang magsisilbi"
},
"instance.add-server.resource-pack.disabled": {
"message": "Dili motugot"
},
"instance.add-server.resource-pack.enabled": {
"message": "Gitugotan"
},
"instance.add-server.resource-pack.prompt": {
"message": "Magpatugot"
},
"instance.add-server.title": {
"message": "Pagdugang og magsisilbi"
},
"instance.edit-server.title": {
"message": "Usba ang magsisilbi"
},
"instance.edit-world.hide-from-home": {
"message": "Ayaw ipakita sa Puluy-anang panid"
},
"instance.edit-world.name": {
"message": "Ngalan"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft nga Kalibutan"
},
"instance.edit-world.reset-icon": {
"message": "Walaa ang amoy"
},
"instance.edit-world.title": {
"message": "Usba ang kalibutan"
},
"instance.filter.disabled": {
"message": "Di-paganhong mga proyekto"
},
"instance.filter.updates-available": {
"message": "Naay bag-ong mga kausaban"
},
"instance.server-modal.address": {
"message": "Padad-anan"
},
"instance.server-modal.name": {
"message": "Ngalan"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft nga Magsisilbi"
},
"instance.server-modal.resource-pack": {
"message": "Putos sa kahinguhaan"
},
"instance.settings.tabs.general": {
"message": "Tinanan"
},
"instance.settings.tabs.general.delete": {
"message": "Panas-i kining pananglitan"
},
"instance.settings.tabs.general.delete.button": {
"message": "Panas-i kining pananglitan"
},
"instance.settings.tabs.general.delete.description": {
"message": "Malungtarong mopanas ang pananglitan sa imong himan, apil na ang imong mga kalibutan, paghan-ay, ug tanang gitaod nga sulod. Pag-amping, dili na mabawi kung gipanas na nimo ang pananglitan."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Gapanas..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Paghulad"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Dili makahulad samtang nga gataud."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Paghulad sa pananglitan"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Buhatan og awat kining pananglitan, apil na ang imong mga kalibutan, paghan-ay, kausaban, ug uban pa."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Usba ang amoy"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Tangtangi ang amoy"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Pulihan ang amoy"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Pamili og amoy"
},
"instance.settings.tabs.general.library-groups": {
"message": "Mga pundok sa librarya"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Pagbuhat og bag-o nga pundok"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Gitugotan sa mga pundok sa librarya nga imong mahan-ay ang imong mga pananglitan sa nagkalain-lain nga bahin sa imong librarya."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Ibutang ang ngalan sa pundok"
},
"instance.settings.tabs.general.name": {
"message": "Ngalan"
},
"instance.settings.tabs.hooks": {
"message": "Mga kaw-it sa paglansad"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Mga pinatuyo nga kaw-it sa paglansad"
},
"instance.settings.tabs.hooks.description": {
"message": "Gitugotan sa mga kaw-it ang mga eksperto nga mga tiggamit nga makapadagan og mga sistema nga sugo ayha ug paghuman malansad ang dula."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Human-matak-op"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Ipadagan paghuman matak-op ang dula."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Ibutang ang human-matak-op nga sugo..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Ayha-malansad"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Ipadagan ayha malansad ang pananglitan."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Ibutang ang ayha-malansad nga sugo..."
},
"instance.settings.tabs.hooks.title": {
"message": "Mga kaw-it sa paglansad sa dula"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Pamutos"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Pamutos nga sugo sa paglansad sa Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Ibutang ang pamutos nga sugo..."
},
"instance.settings.tabs.installation": {
"message": "Pagtaud"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "Nataud naman ang {platform} {version} alang sa Minecraft {game_version}"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Nataud naman ang Banilya nga {game_version}"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Pulihan og bersiyon"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Itaud"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Gataud"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Gapangita og mga bersiyon sa mga putos sa kausaban"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Gataud sa bag-o nga bersiyon"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Pagkakarong taud"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Kasayoran sa pagputli:"
},
"instance.settings.tabs.installation.game-version": {
"message": "Bersiyon sa dula"
},
"instance.settings.tabs.installation.install": {
"message": "Itaud"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Bersiyon sa {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "Dili magamit ang {loader} sa Minecraft {version}. Sulayi ang ubang tigkarga sa kausaban."
},
"instance.settings.tabs.installation.platform": {
"message": "Pantawan"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Mahimo nga mobalik sa sinugdan ang tanang gitaod o giusab nga sulod sa unsay ihatag sa putos sa kausaban, tangtangon ang mga kausaban o sulod nga imong gidugang apil na ang lintunganay nga putos sa kausaban. Mahimo nga maayo ang mga tuhaw nga batasan kon naay pagbag-o sa pananglitan, apan kon gasalig na ang imong kalibutan sa dinugang nga sulod, mahimo nga madaut ani ang daan nga mga kalibutan."
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Ibalik ang mga sulod sa pananglitan sa unang kahimtang, tangtangon ang mga kausaban o sulod nga imong gidugang apil na ang lintunganay nga putos sa kausaban."
},
"instance.settings.tabs.installation.repair.button": {
"message": "Ayohon"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Gaayo"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Sa pag-ayo, mataud pagbalik ang mga sinaligan sa Minecraft ug mangita og mga kadunot. Mahimo nga masulbad niini ang mga isyu kun dili malunsad ang dula tungod sa mga kasaypan matud sa tiglansad, apan dili ni masulbad ang mga isyu o pagdusmog matud sa mga gitaud nga kausaban."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Ayohon ang pananglitan?"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Ipakita ang tanang bersiyon"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "pulihan og bersiyon"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "itaud"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "itaud pag-usab"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "ayohon"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Dili maka-{action} samtang nga gataud"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Dili maka-{action} samtang binugto"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Dili maka-{action} samtang nag-ayo"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(diinilang bersiyon)"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Kun imong ipadayon, dili na nimo makatay pagbalik nga wala mohimo og bag-o nga pananglitan. Dili na ka makadawat og pagpasibo sa putos sa kausaban ug mahimo kining naandan nga."
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Nakakatay kining pananglitan sa usa ka putos sa kausaban, pasabot ani nga dili mapasibo ang mga kausaban og dili nimo mausab ang tigkarga sa kausaban o ang bersiyon sa Minecraft. Kanunay nga mabugto kining pananglitan og putos sa kausabon kun tangtangon ang katay."
},
"instance.settings.tabs.java.hooks": {
"message": "Mga kaw-it"
},
"instance.settings.tabs.java.java-installation": {
"message": "Pagtaud sa Java"
},
"instance.settings.tabs.window": {
"message": "Tamboanan"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Mga himutangan sa pinatuyo nga tamboanan"
},
"instance.settings.tabs.window.height": {
"message": "Gitas-on"
},
"instance.settings.tabs.window.width": {
"message": "Gilapdon"
},
"instance.settings.title": {
"message": "Mga Himutangan"
},
"instance.worlds.a_minecraft_server": {
"message": "Usa ka Minecraft nga Magsisilbi"
},
"instance.worlds.copy_address": {
"message": "Awata ang padad-anan"
},
"instance.worlds.type.server": {
"message": "Magsisilbi"
},
"instance.worlds.type.singleplayer": {
"message": "Inusara nga dula"
},
"instance.worlds.view_instance": {
"message": "Tan-awa ang pananglitan"
}
}
+166 -40
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Autořizační servery Minecraftu aktuálně nejsou k dispozici. Zkontrolujte si své připojení k internetu a zkuste to znovu později."
},
"app.auth-servers.unreachable.header": {
"message": "Připojení k autorizačním serverům se nezdařilo"
},
"app.modal.install-to-play.header": {
"message": "Nainstaluj ke hraní"
},
"app.modal.install-to-play.install-button": {
"message": "Instalovat"
},
"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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Instalace Javy"
},
"app.settings.tabs.language": {
"message": "Jazyk"
},
"app.settings.tabs.privacy": {
"message": "Soukromí"
},
@@ -24,19 +84,25 @@
"message": "Správa zdrojů"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} je připravena k instalaci! Znovu načtěte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
"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": "Modrinth App v{version} byla dokončena ke stažení. Znovu načtěte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
"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": "Modrinth App v{version} je nyní k dispozici! Protože jste v síti s měřením, nebyla stažena automaticky."
"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": "Stáhnout ({size})"
"message": "Stahování ({size})"
},
"app.update-toast.download-page": {
"message": "Stáhnout"
},
"app.update-toast.downloading": {
"message": "Stahování..."
@@ -45,10 +111,10 @@
"message": "Načíst znovu"
},
"app.update-toast.title": {
"message": "K dispozici je aktualizace"
"message": "Aktualizace je k dispozici"
},
"app.update-toast.title.download-complete": {
"message": "Stahování dokončeno"
"message": "Stahování bylo dokončeno"
},
"app.update.complete-toast.text": {
"message": "Kliknutím sem zobrazíte seznam změn."
@@ -63,7 +129,70 @@
"message": "Stahování aktualizace ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Znovu načíst pro nainstalování aktualizace"
"message": "Restartovat aplikaci pro nainstalování aktualizace"
},
"friends.action.add-friend": {
"message": "Přidat přítele"
},
"friends.action.view-friend-requests": {
"message": "{count} {count, plural, one {žádost} few {žádosti} other {žádostí}} o přátelství"
},
"friends.add-friend.submit": {
"message": "Poslat žádost o přátelství"
},
"friends.add-friend.title": {
"message": "Přidávání kamaráda"
},
"friends.add-friend.username.description": {
"message": "Může být jiné než jejich Minecraft jméno!"
},
"friends.add-friend.username.placeholder": {
"message": "Zadejte uživatelské jméno Modrinth..."
},
"friends.add-friend.username.title": {
"message": "Jak se váš kamarád jmenuje na Modrinthu?"
},
"friends.add-friends-to-share": {
"message": "<link>Přidejte si přátelé</link> a podívejte se, co hrají!"
},
"friends.friend.cancel-request": {
"message": "Zrušit žádost"
},
"friends.friend.remove-friend": {
"message": "Odebrat přítele"
},
"friends.friend.request-sent": {
"message": "Žádost o přátelství odeslána"
},
"friends.friend.view-profile": {
"message": "Zobrazit profil"
},
"friends.heading": {
"message": "Kamarádi"
},
"friends.heading.active": {
"message": "Aktivní"
},
"friends.heading.offline": {
"message": "Offline"
},
"friends.heading.online": {
"message": "Online"
},
"friends.heading.pending": {
"message": "Čeká na vyřízení"
},
"friends.no-friends-match": {
"message": "Žádní přátelé neodpovídají '{query}''"
},
"friends.search-friends-placeholder": {
"message": "Hledat přátele..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Přihlašte se ke svému Modrinth účtu</link>, abyste jsi přidali přátele a uviděli co hrají!"
},
"instance.add-server.add-and-play": {
"message": "Přidat a hrát"
@@ -78,7 +207,7 @@
"message": "Zapnuto"
},
"instance.add-server.resource-pack.prompt": {
"message": "Na dotaz"
"message": "Ptát se"
},
"instance.add-server.title": {
"message": "Přidat server"
@@ -87,7 +216,7 @@
"message": "Upravit server"
},
"instance.edit-world.hide-from-home": {
"message": "Schovat z domovské stránky"
"message": "Skrýt z domovské obrazovky"
},
"instance.edit-world.name": {
"message": "Název"
@@ -96,16 +225,16 @@
"message": "Minecraft svět"
},
"instance.edit-world.reset-icon": {
"message": "Reset ikony"
"message": "Resetovat ikonu"
},
"instance.edit-world.title": {
"message": "Upravit svět"
},
"instance.filter.disabled": {
"message": "Vypnout projekty"
"message": "Vypnuté projekty"
},
"instance.filter.updates-available": {
"message": "Aktualizace jsou dostupné"
"message": "K dispozice jsou aktualizace"
},
"instance.server-modal.address": {
"message": "Adresa"
@@ -117,19 +246,19 @@
"message": "Minecraft Server"
},
"instance.server-modal.resource-pack": {
"message": "Balíček textur"
"message": "Balíčky textur"
},
"instance.settings.tabs.general": {
"message": "Obecné"
},
"instance.settings.tabs.general.delete": {
"message": "Smazat instanci"
"message": "Odstranit instalaci"
},
"instance.settings.tabs.general.delete.button": {
"message": "Smazat instanci"
"message": "Odstranit instalaci"
},
"instance.settings.tabs.general.delete.description": {
"message": "Trvale smaže instanci z vašeho zařízení, včetně vašich světů, konfigurací a veškerého nainstalovaného obsahu. Buďte opatrní, protože jakmile instanci smažete, ne možné ji obnovit."
"message": "Trvale smaže instalaci z vašeho zařízení, včetně vašich světů, konfigurací a veškerého nainstalovaného obsahu. Buďte opatrní, protože jakmile instalaci smažete, nebude možné ji obnovit."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Mazání..."
@@ -141,34 +270,34 @@
"message": "Nelze duplikovat při instalaci."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Duplikovat instanci"
"message": "Duplikovat instalaci"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Vytvoří kopii této instance, včetně světů, konfigurací, modů atd."
"message": "Vytvoří kopii této instalace, včetně světů, konfigurací, modů atd."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Upravit ikonu"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Icona odstranit"
"message": "Odstranit ikonu"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Ikona replikace"
"message": "Změnit ikonu"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Výber ikona"
"message": "Vybrat ikonu"
},
"instance.settings.tabs.general.library-groups": {
"message": "Skupina knihoven"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Vytvoří novou skupinu"
"message": "Vytvořit novou skupinu"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Skupiny knihoven vám umožňují uspořádat instance do různých sekcí v knihovně."
"message": "Skupiny knihoven vám umožňují uspořádat instalace do různých sekcí."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Zadej název skupiny"
"message": "Zadejte název skupiny"
},
"instance.settings.tabs.general.name": {
"message": "Název"
@@ -195,7 +324,7 @@
"message": "Před spuštěním"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Spouštějí se před spuštěním instance."
"message": "Spouštějí se před spuštěním instalace."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Zadejte příkaz k provedení před spuštěním..."
@@ -216,28 +345,28 @@
"message": "Instalace"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} pro Minecraft {game_version} již nainstalována"
"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ž nainstalována"
"message": "Vanilla {game_version} již je nainstalována"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Změnit instalaci"
"message": "Změnit verzi"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instalovat"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalace"
"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ých verzí"
"message": "Instalace nové verze"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Aktuální instalace"
"message": "Aktuálně nainstalováno"
},
"instance.settings.tabs.installation.debug-information": {
"message": "Debugové informace:"
@@ -252,7 +381,7 @@
"message": "Instalovat"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Probíhající instalace"
"message": "Probíhá instalace"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} verze"
@@ -261,13 +390,13 @@
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Nelze načíst podrobnosti o modpacku. Zkontrolujte připojení k internetu."
"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, ale modpack nebyl najit na Modrinthu."
"message": "Tato instalace je připojená k modpacku, který ake nebyl najit na Modrinthu."
},
"instance.settings.tabs.installation.platform": {
"message": "Platforma"
@@ -279,7 +408,7 @@
"message": "Přeinstalovávání modpacku"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Přeinstalace resetuje veškerý nainstalovaný nebo upravený obsah na to, co poskytuje modpack, a odstraní všechny mody nebo obsah, které jste přidali do původní instalaci. To může opravit neočekávané chyby, ale pokud vaše světy závisejí na nově instalovaném obsahu, možná budou poškozeny."
"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?"
@@ -312,7 +441,7 @@
"message": "Ukázat všechny verze"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "Změnit verzi"
"message": "změnit verzi"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "Instalovat"
@@ -398,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Zadejte šířku..."
},
"instance.settings.title": {
"message": "Nastavení"
},
"instance.worlds.a_minecraft_server": {
"message": "Minecraft Server"
},
@@ -432,7 +558,7 @@
"message": "Můžeš rovnou skočit na server pouze v Minecraftu Alpha 1.0.5+"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Můžeš rovnou skočit do světa jednoho hráče pouze v Minecraftu 1.20+"
"message": "Můžeš se rovnou připojit do světa jednoho hráče pouze v Minecraftu 1.20+"
},
"instance.worlds.play_instance": {
"message": "Hrát instanci"
+155 -8
View File
@@ -1,4 +1,49 @@
{
"app.auth-servers.unreachable.body": {
"message": "Minecraft authentication servere kan måske være nede lige nu. Tjek din internet forbindelse og prøv igen senere."
},
"app.auth-servers.unreachable.header": {
"message": "Kan ikke nå autentificeringsservere"
},
"app.modal.install-to-play.header": {
"message": "Installer for at 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.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."
},
"app.modal.update-to-play.added-count": {
"message": "{count} tilføjet"
},
"app.modal.update-to-play.diff-type.added": {
"message": "Tilføjet"
},
"app.modal.update-to-play.diff-type.removed": {
"message": "Fjernet"
},
"app.modal.update-to-play.diff-type.updated": {
"message": "Opdateret"
},
"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."
},
@@ -17,6 +62,9 @@
"app.settings.tabs.java-installations": {
"message": "Javainstallationer"
},
"app.settings.tabs.language": {
"message": "Sprog"
},
"app.settings.tabs.privacy": {
"message": "Privatliv"
},
@@ -29,9 +77,111 @@
"app.update-toast.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": {
"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": {
"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": {
"message": "Ændringslog"
},
"app.update-toast.download": {
"message": "Download ({size})"
},
"app.update-toast.download-page": {
"message": "Download"
},
"app.update-toast.downloading": {
"message": "Downloader..."
},
"app.update-toast.reload": {
"message": "Geninlæs"
},
"app.update-toast.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."
},
"app.update.complete-toast.title": {
"message": "Version {version} var installeret med succes!"
},
"app.update.download-update": {
"message": "Download opdatering"
},
"app.update.downloading-update": {
"message": "Downloader opdatering ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Genindlæs for at installere opdatering"
},
"friends.action.add-friend": {
"message": "Tilføj en ven"
},
"friends.action.view-friend-requests": {
"message": "{count} venne{count, plural, one {anmodning} other {anmodninger}}"
},
"friends.add-friend.submit": {
"message": "Send en venneanmodning"
},
"friends.add-friend.title": {
"message": "Tilføjer en ven"
},
"friends.add-friend.username.description": {
"message": "Det er muligvis anderledes end deres Minecraft brugernavn!"
},
"friends.add-friend.username.placeholder": {
"message": "Indskriv Modrinth brugernavn..."
},
"friends.add-friend.username.title": {
"message": "Hvad er din vens Modrinth brugernavn?"
},
"friends.add-friends-to-share": {
"message": "<link>Tilføj venner</link> for at se hvad de spiller!"
},
"friends.friend.cancel-request": {
"message": "Annuller anmodning"
},
"friends.friend.remove-friend": {
"message": "Fjern ven"
},
"friends.friend.request-sent": {
"message": "Venneanmodning sendt"
},
"friends.friend.view-profile": {
"message": "Vis profil"
},
"friends.heading": {
"message": "Venner"
},
"friends.heading.active": {
"message": "Aktiv"
},
"friends.heading.offline": {
"message": "Offline"
},
"friends.heading.online": {
"message": "Online"
},
"friends.heading.pending": {
"message": "Afventer"
},
"friends.no-friends-match": {
"message": "Ingen venner som matcher \"{query}\""
},
"friends.search-friends-placeholder": {
"message": "Søg venner..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Log ind på en Modrinth konto</link> for at tilføje venner og se hvad de spiller!"
},
"instance.add-server.add-and-play": {
"message": "Tilføj og spil"
},
@@ -156,7 +306,7 @@
"message": "Kørte efter spillet lukkes."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Indskriv post-exit kommando..."
"message": "Indtast post-exit kommando..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Pre-launch"
@@ -165,7 +315,7 @@
"message": "Kørt før en instance bliver kørt."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Indskriv pre-launch kommando..."
"message": "Indtast pre-launch kommando..."
},
"instance.settings.tabs.hooks.title": {
"message": "Spille lunch hooks"
@@ -177,7 +327,7 @@
"message": "Wrapper kommando for at køre Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Indskriv wrapper kommando..."
"message": "Indtast wrapper kommando..."
},
"instance.settings.tabs.installation": {
"message": "Installation"
@@ -354,7 +504,7 @@
"message": "Højden af spillevinduet når kørt."
},
"instance.settings.tabs.window.height.enter": {
"message": "Indskriv højde..."
"message": "Indtast højde..."
},
"instance.settings.tabs.window.width": {
"message": "Bredde"
@@ -363,10 +513,7 @@
"message": "Bredden på spille vinduet når kørt."
},
"instance.settings.tabs.window.width.enter": {
"message": "Indskriv bredde..."
},
"instance.settings.title": {
"message": "Indstillinger"
"message": "Indtast bredde..."
},
"instance.worlds.a_minecraft_server": {
"message": "En Minecraft server"
+66 -3
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Die Authentifizierungsserver von Minecraft sind eventuell momentan nicht erreichbar. Überprüfe deine Internetverbindung und versuche es später erneut."
},
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.modal.install-to-play.header": {
"message": "Installieren zum Spielen"
},
"app.modal.install-to-play.install-button": {
"message": "Installieren"
},
"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.shared-by-today": {
"message": "{name} hat diese Instanz heute mit dir geteilt."
},
"app.modal.install-to-play.shared-instance": {
"message": "Geteilte Instanz"
},
"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.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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Java Installationen"
},
"app.settings.tabs.language": {
"message": "Sprache"
},
"app.settings.tabs.privacy": {
"message": "Datenschutz"
},
@@ -29,6 +89,9 @@
"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-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-toast.body.metered": {
"message": "Modrinth App v{version} ist jetzt verfügbar! Da du in einem begrenzten Netzwerk bist, haben wir es nicht automatisch heruntergeladen."
},
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Herunterladen ({size})"
},
"app.update-toast.download-page": {
"message": "Herunterladen"
},
"app.update-toast.downloading": {
"message": "Lade herunter..."
},
@@ -461,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Breite eingeben..."
},
"instance.settings.title": {
"message": "Einstellungen"
},
"instance.worlds.a_minecraft_server": {
"message": "Ä Minecraft-Server"
},
+112 -43
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Die Authentifizierungsserver von Minecraft sind eventuell momentan nicht erreichbar. Überprüfe deine Internetverbindung und versuche es später erneut."
},
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.modal.install-to-play.header": {
"message": "Installieren zum Spielen"
},
"app.modal.install-to-play.install-button": {
"message": "Installieren"
},
"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.shared-by-today": {
"message": "{name} hat diese Instanz heute mit dir geteilt."
},
"app.modal.install-to-play.shared-instance": {
"message": "Geteilte Instanz"
},
"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.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."
},
@@ -12,10 +69,13 @@
"message": "Standard Instanz-Einstellungen"
},
"app.settings.tabs.feature-flags": {
"message": "Funktionsflaggen"
"message": "Funktionsflags"
},
"app.settings.tabs.java-installations": {
"message": "Java Installationen"
"message": "Java-Installationen"
},
"app.settings.tabs.language": {
"message": "Sprache"
},
"app.settings.tabs.privacy": {
"message": "Datenschutz"
@@ -24,13 +84,16 @@
"message": "Ressourcenmanagement"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} ist bereit zum Installieren! Lade neu um es jetzt zu updaten, oder automatisch wenn du die Modrinth App schließt."
"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} ist heruntergeladen. Lade neu um es jetzt zu updaten, oder wenn du die Modrinth App schließt."
"message": "Modrinth App v{version} wurde heruntergeladen. Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
},
"app.update-toast.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": {
"message": "Die Modrinth App v{version} ist jetzt verfügbar! Da Sie sich in einem getakteten Netzwerk befinden, haben wir es nicht automatisch heruntergeladen."
"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"
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Herunterladen ({size})"
},
"app.update-toast.download-page": {
"message": "Herunterladen"
},
"app.update-toast.downloading": {
"message": "Wird Heruntergeladen..."
},
@@ -51,19 +117,19 @@
"message": "Download abgeschlossen"
},
"app.update.complete-toast.text": {
"message": "Drücke hier, um den Änderungsverlauf zu sehen."
"message": "Hier klicken, um das Änderungsprotokoll anzuzeigen."
},
"app.update.complete-toast.title": {
"message": "Version {version} wurde erfolgreich installiert!"
},
"app.update.download-update": {
"message": "Lade Update herunter"
"message": "Update herunterladen"
},
"app.update.downloading-update": {
"message": "Lade Update Herunter ({percent}%)"
"message": "Update wird heruntergeladen ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Neu laden um Update zu installieren"
"message": "Neu laden, um das Update zu installieren"
},
"friends.action.add-friend": {
"message": "Freund hinzufügen"
@@ -72,19 +138,22 @@
"message": "{count} {count, plural, one {Freundesanfrage} other {Freundesanfragen}}"
},
"friends.add-friend.submit": {
"message": "Sende Freundesanfrage"
"message": "Freundschaftsanfrage senden"
},
"friends.add-friend.title": {
"message": "Einen Freund hinzufügen"
},
"friends.add-friend.username.description": {
"message": "Es kann vom Minecraft Nutzernamen abweichen!"
"message": "Er kann vom Minecraft-Nutzernamen abweichen!"
},
"friends.add-friend.username.placeholder": {
"message": "Gebe den Modrinth Nutzername ein..."
"message": "Modrinth-Benutzernamen eingeben..."
},
"friends.add-friend.username.title": {
"message": "Was ist der Modrinth Nutzername deines Freundes?"
"message": "Wie lautet der Modrinth-Benutzername deines Freundes?"
},
"friends.add-friends-to-share": {
"message": "<link>Freunde hinzufügen</link>, um zu sehen, was sie spielen!"
},
"friends.friend.cancel-request": {
"message": "Anfrage abbrechen"
@@ -93,7 +162,7 @@
"message": "Freund entfernen"
},
"friends.friend.request-sent": {
"message": "Freundesanfrage gesendet"
"message": "Freundschaftsanfrage gesendet"
},
"friends.friend.view-profile": {
"message": "Profil anzeigen"
@@ -117,11 +186,14 @@
"message": "Keine Freunde die \"{query}\" entsprechen"
},
"friends.search-friends-placeholder": {
"message": "Suche nach Freunden..."
"message": "Freunde durchsuchen..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Melde dich bei einem Modrinth-Konto an</link>, um Freunde hinzuzufügen und zu sehen, was sie gerade spielen!"
},
"instance.add-server.add-and-play": {
"message": "Hinzufügen und spielen"
},
@@ -144,13 +216,13 @@
"message": "Server bearbeiten"
},
"instance.edit-world.hide-from-home": {
"message": "Von Startseite verbergen"
"message": "Von der Startseite verbergen"
},
"instance.edit-world.name": {
"message": "Name"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft Welt"
"message": "Minecraft-Welt"
},
"instance.edit-world.reset-icon": {
"message": "Icon zurücksetzen"
@@ -171,7 +243,7 @@
"message": "Name"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft Server"
"message": "Minecraft-Server"
},
"instance.server-modal.resource-pack": {
"message": "Ressourcenpaket"
@@ -192,7 +264,7 @@
"message": "Wird gelöscht..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Duplizieren"
"message": "Kopieren"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Kann während der Installation nicht dupliziert werden."
@@ -201,7 +273,7 @@
"message": "Instanz duplizieren"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Erstellt eine Kopie dieser Instanz, inklusive aller Welten, Einstellungen, Modifikationen, usw."
"message": "Erstellt eine Kopie dieser Instanz, inklusive aller Welten, Einstellungen, Mods, usw."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Icon bearbeiten"
@@ -222,7 +294,7 @@
"message": "Neue Gruppe erstellen"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Bibliotheksgruppen ermöglichen es dir, deine Instanzen in verschiedene Abteile deiner Bibliothek einzuteilen."
"message": "Bibliotheksgruppen ermöglichen es dir, deine Instanzen in verschiedene Abschnitte deiner Bibliothek zu organisieren."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Gruppenname eingeben"
@@ -231,34 +303,34 @@
"message": "Name"
},
"instance.settings.tabs.hooks": {
"message": "Start Hooks"
"message": "Startargumente"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Benutzerdefinierte Start Hooks"
"message": "Benutzerdefinierte Startargumente"
},
"instance.settings.tabs.hooks.description": {
"message": "Hooks ermöglichen es fortgeschrittenen Benutzern, bestimmte Systembefehle vor und nach dem Spielstart auszuführen."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Nach dem Schließen des Spiels"
"message": "Nach dem Beenden"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Wird ausgeführt nach dem Beenden des Spiels."
"message": "Wird nach dem Beenden des Spiels ausgeführt."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Nach Spielbeendigung auszuführender Befehl eingeben..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Vor dem Starten des Spiels"
"message": "Vor dem Start"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Wird vor dem Starten des Spiels ausgeführt."
"message": "Wird vor dem Starten der Instanz ausgeführt."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Vor Spielstart auszuführender Befehl eingeben..."
"message": "Vor Spielstart auszuführenden Befehl eingeben..."
},
"instance.settings.tabs.hooks.title": {
"message": "Start Hooks"
"message": "Start-Hooks"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Wrapper"
@@ -309,7 +381,7 @@
"message": "Installieren"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Wird installiert"
"message": "Installation im Gange"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} Version"
@@ -336,13 +408,13 @@
"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 Ihre Welten jedoch von zusätzlich installierten Inhalten abhängig sind, kann dies zu Fehlern in bestehenden Welten führen."
"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 seinen ursprünglichen Zustand zurück und entfernt alle Mods oder Inhalte, die zusätzlich zum ursprünglichen Modpack hinzugefügt wurden."
"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"
@@ -363,7 +435,7 @@
"message": "Reparatur im Gange"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Auf aktuellen Wert zurücksetzen"
"message": "Auf aktuellen Stand zurücksetzen"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Alle Versionen anzeigen"
@@ -396,7 +468,7 @@
"message": "Verknüpfung 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 völlig neue Instanz zu erstellen. Du erhältst keine Modpack-Updates mehr und es wird zu einer normalen Instanz."
"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?"
@@ -426,10 +498,10 @@
"message": "Zugewiesener Arbeitsspeicher"
},
"instance.settings.tabs.window": {
"message": "Spielfenster"
"message": "Fenster"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Benutzerdefinierte Spielfenstereinstellungen"
"message": "Benutzerdefinierte Fenstereinstellungen"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Vollbild"
@@ -455,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Breite eingeben..."
},
"instance.settings.title": {
"message": "Einstellungen"
},
"instance.worlds.a_minecraft_server": {
"message": "Ein Minecraft-Server"
},
@@ -501,19 +570,19 @@
"message": "Einzelspieler"
},
"instance.worlds.view_instance": {
"message": "Instanzen anzeigen"
"message": "Instanz anzeigen"
},
"instance.worlds.world_in_use": {
"message": "Welt ist aktuell in Benutzung"
"message": "Welt wird aktuell benutzt"
},
"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 vorgegeben"
},
"search.filter.locked.instance-loader.title": {
"message": "Der Loader wird von der Instanz bereitgestellt"
"message": "Der Loader ist von der Instanz vorgegeben"
},
"search.filter.locked.instance.sync": {
"message": "Mit Instanz synchronisieren"
@@ -1,155 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Λειτουργία προγραμματιστή ενεργό."
},
"app.settings.tabs.appearance": {
"message": "Εμφάνιση"
},
"app.settings.tabs.default-instance-options": {
"message": "Προεπιλεγμένες επιλογές στιγμιότυπου"
},
"app.settings.tabs.feature-flags": {
"message": "Σημαίες χαρακτηριστικών"
},
"app.settings.tabs.java-installations": {
"message": "Εγκαταστάσεις Java"
},
"app.settings.tabs.privacy": {
"message": "Απόρρητο"
},
"app.settings.tabs.resource-management": {
"message": "Διαχείριση πόρων"
},
"instance.add-server.add-and-play": {
"message": "Προσθήκη και παίξε"
},
"instance.add-server.add-server": {
"message": "Προσθήκη διακομιστή"
},
"instance.add-server.resource-pack.disabled": {
"message": "Ανενεργό"
},
"instance.add-server.resource-pack.enabled": {
"message": "Ενεργό"
},
"instance.add-server.resource-pack.prompt": {
"message": "Ειδοποίηση"
},
"instance.add-server.title": {
"message": "Προσθήκη διακομιστή"
},
"instance.edit-server.title": {
"message": "Επεξεργασία διακομιστή"
},
"instance.edit-world.hide-from-home": {
"message": "Απόκρυψη από την Αρχική σελίδα"
},
"instance.edit-world.name": {
"message": "Όνομα"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft Κόσμος"
},
"instance.edit-world.reset-icon": {
"message": "Επαναφορά εικονιδίου"
},
"instance.edit-world.title": {
"message": "Επεξεργασία κόσμου"
},
"instance.filter.disabled": {
"message": "Ανενεργά έργα"
},
"instance.filter.updates-available": {
"message": "Διαθέσιμη ενημέρωση"
},
"instance.server-modal.address": {
"message": "Διεύθυνση"
},
"instance.server-modal.name": {
"message": "Όνομα"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft Διακομιστής"
},
"instance.server-modal.resource-pack": {
"message": "Πακέτο πόρων"
},
"instance.settings.tabs.general": {
"message": "Γενικά"
},
"instance.settings.tabs.general.delete": {
"message": "Διαγραφή στιγμιότυπου"
},
"instance.settings.tabs.general.delete.button": {
"message": "Διαγραφή στιγμιότυπου"
},
"instance.settings.tabs.general.delete.description": {
"message": "Διαγράφει οριστικά ένα στιγμιότυπο από τη συσκευή σας, συμπεριλαμβανομένων των κόσμων, των ρυθμίσεων και όλου του εγκατεστημένου περιεχομένου. Να είστε προσεκτικοί, καθώς μόλις διαγράψετε μια παρουσία, δεν υπάρχει τρόπος να την ανακτήσετε."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Διαγραφή..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Διπλότυπο"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Δεν είναι δυνατή η δημιουργία αντιγράφων κατά την εγκατάσταση."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Διπλότυπο στιγμιότυπο"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Δημιουργεί ένα αντίγραφο αυτού του στιγμιότυπου, συμπεριλαμβάνοντας κόσμους, ρυθμίσεις, mods, κτλ."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Επεξεργασία εικονιδίου"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Αφαίρεση εικονιδίου"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Αντικατάσταση εικονιδίου"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Επιλογή εικονιδίου"
},
"instance.settings.tabs.general.library-groups": {
"message": "Ομάδες βιβλιοθηκών"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Δημιουργία νέας ομάδας"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Οι ομάδες βιβλιοθήκης σάς επιτρέπουν να οργανώσετε τα στιγμιότυπα σας σε διαφορετικές ενότητες στη βιβλιοθήκη σας."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Εισάγετε το όνομα της ομάδας"
},
"instance.settings.tabs.general.name": {
"message": "Όνομα"
},
"instance.settings.tabs.hooks": {
"message": "Άγκιστρα εκκίνησης"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Προσαρμοσμένα άγκιστρα εκκίνησης"
},
"instance.settings.tabs.hooks.description": {
"message": "Τα άγκιστρα επιτρέπουν στους προχωρημένους χρήστες να εκτελούν ορισμένες εντολές συστήματος πριν και μετά την εκκίνηση του παιχνιδιού."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Μετά την έξοδο"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Εκτελέστηκε αφού έκλεισε το παιχνίδι."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Εισαγάγετε την εντολή μετά την έξοδο..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Πριν την εκκίνηση"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Εκτελέστηκε πριν από την εκκίνηση του στιγμιότυπου."
}
}
@@ -1,71 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "In ye captain's boots."
},
"app.settings.tabs.appearance": {
"message": "How ye be looking"
},
"app.settings.tabs.privacy": {
"message": "Keepin' ye gold under lock and key"
},
"instance.add-server.add-server": {
"message": "Plundered"
},
"instance.add-server.resource-pack.disabled": {
"message": "Unable"
},
"instance.add-server.resource-pack.enabled": {
"message": "Able"
},
"instance.add-server.resource-pack.prompt": {
"message": "Can"
},
"instance.add-server.title": {
"message": "Plundered"
},
"instance.edit-server.title": {
"message": "Change yer island"
},
"instance.edit-world.name": {
"message": "What'n yer world be called"
},
"instance.server-modal.address": {
"message": "Whar ye' reside"
},
"instance.server-modal.resource-pack": {
"message": "Picture pack"
},
"instance.settings.tabs.general.delete": {
"message": "Mutiny instance"
},
"instance.settings.tabs.general.delete.button": {
"message": "Mutiny instance"
},
"instance.settings.tabs.general.delete.description": {
"message": "Forces yer intstance to be walk'n the plank an' to see Davy Jones' locker, never to be seen nor heard from ever again. Ya hear?"
},
"instance.settings.tabs.general.deleting.button": {
"message": "Shoving..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Ship o' Theseus your instance"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Replaces all o' the planks on yer instance wit' new ones - be it even the same anymore?"
},
"instance.settings.tabs.general.edit-icon": {
"message": "Change yer picture"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Scrub ye deck of old paint"
},
"instance.settings.tabs.installation.game-version": {
"message": "Ye model of sloop"
},
"instance.worlds.type.server": {
"message": "Island"
},
"instance.worlds.type.singleplayer": {
"message": "Lonely Voyage"
}
}
@@ -1,419 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "˙pǝlqɐuǝ ǝpoɯ ɹǝdolǝʌǝᗡ"
},
"app.settings.tabs.appearance": {
"message": "ǝɔuɐɹɐǝddⱯ"
},
"app.settings.tabs.default-instance-options": {
"message": "suoᴉʇdo ǝɔuɐʇsuᴉ ʇlnɐɟǝᗡ"
},
"app.settings.tabs.feature-flags": {
"message": "sɓɐlɟ ǝɹnʇɐǝℲ"
},
"app.settings.tabs.java-installations": {
"message": "suoᴉʇɐllɐʇsuᴉ ɐʌɐſ"
},
"app.settings.tabs.privacy": {
"message": "ʎɔɐʌᴉɹԀ"
},
"app.settings.tabs.resource-management": {
"message": "ʇuǝɯǝɓɐuɐɯ ǝɔɹnosǝᴚ"
},
"instance.add-server.add-and-play": {
"message": "ʎɐld puɐ ppⱯ"
},
"instance.add-server.add-server": {
"message": "ɹǝʌɹǝs ppⱯ"
},
"instance.add-server.resource-pack.disabled": {
"message": "pǝlqɐsᴉᗡ"
},
"instance.add-server.resource-pack.enabled": {
"message": "pǝlqɐuƎ"
},
"instance.add-server.resource-pack.prompt": {
"message": "ʇdɯoɹԀ"
},
"instance.add-server.title": {
"message": "ɹǝʌɹǝs ɐ ppⱯ"
},
"instance.edit-server.title": {
"message": "ɹǝʌɹǝs ʇᴉpƎ"
},
"instance.edit-world.hide-from-home": {
"message": "ǝɓɐd ǝɯoH ǝɥʇ ɯoɹɟ ǝpᴉH"
},
"instance.edit-world.name": {
"message": "ǝɯɐN"
},
"instance.edit-world.placeholder-name": {
"message": "plɹoM ʇɟɐɹɔǝuᴉW"
},
"instance.edit-world.reset-icon": {
"message": "uoɔᴉ ʇǝsǝᴚ"
},
"instance.edit-world.title": {
"message": "plɹoʍ ʇᴉpƎ"
},
"instance.filter.disabled": {
"message": "sʇɔǝſoɹd pǝlqɐsᴉᗡ"
},
"instance.filter.updates-available": {
"message": "ǝlqɐlᴉɐʌɐ sǝʇɐpd∩"
},
"instance.server-modal.address": {
"message": "ssǝɹppⱯ"
},
"instance.server-modal.name": {
"message": "ǝɯɐN"
},
"instance.server-modal.placeholder-name": {
"message": "ɹǝʌɹǝS ʇɟɐɹɔǝuᴉW"
},
"instance.server-modal.resource-pack": {
"message": "ʞɔɐd ǝɔɹnosǝᴚ"
},
"instance.settings.tabs.general": {
"message": "lɐɹǝuǝ⅁"
},
"instance.settings.tabs.general.delete": {
"message": "ǝɔuɐʇsuᴉ ǝʇǝlǝᗡ"
},
"instance.settings.tabs.general.delete.button": {
"message": "ǝɔuɐʇsuᴉ ǝʇǝlǝᗡ"
},
"instance.settings.tabs.general.delete.description": {
"message": "˙ʇᴉ ɹǝʌoɔǝɹ oʇ ʎɐʍ ou sᴉ ǝɹǝɥʇ ǝɔuɐʇsuᴉ ɐ ǝʇǝlǝp noʎ ǝɔuo sɐ ˋlnɟǝɹɐɔ ǝᗺ ˙ʇuǝʇuoɔ pǝllɐʇsuᴉ llɐ puɐ ˋsɓᴉɟuoɔ ˋsplɹoʍ ɹnoʎ ɓuᴉpnlɔuᴉ ˋǝɔᴉʌǝp ɹnoʎ ɯoɹɟ ǝɔuɐʇsuᴉ uɐ sǝʇǝlǝp ʎlʇuǝuɐɯɹǝԀ"
},
"instance.settings.tabs.general.deleting.button": {
"message": "˙˙˙ɓuᴉʇǝlǝᗡ"
},
"instance.settings.tabs.general.duplicate-button": {
"message": "ǝʇɐɔᴉldnᗡ"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "˙ɓuᴉllɐʇsuᴉ ǝlᴉɥʍ ǝʇɐɔᴉldnp ʇouuɐƆ"
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "ǝɔuɐʇsuᴉ ǝʇɐɔᴉldnᗡ"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "˙ɔʇǝ ˋspoɯ ˋsɓᴉɟuoɔ ˋsplɹoʍ ɓuᴉpnlɔuᴉ ˋǝɔuɐʇsuᴉ sᴉɥʇ ɟo ʎdoɔ ɐ sǝʇɐǝɹƆ"
},
"instance.settings.tabs.general.edit-icon": {
"message": "uoɔᴉ ʇᴉpƎ"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "uoɔᴉ ǝʌoɯǝᴚ"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "uoɔᴉ ǝɔɐldǝᴚ"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "uoɔᴉ ʇɔǝlǝS"
},
"instance.settings.tabs.general.library-groups": {
"message": "Sǝlǝɔʇ ᴉɔon"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "dnoɹɓ ʍǝu ǝʇɐǝɹƆ"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "˙ʎɹɐɹqᴉl ɹnoʎ uᴉ suoᴉʇɔǝs ʇuǝɹǝɟɟᴉp oʇuᴉ sǝɔuɐʇsuᴉ ɹnoʎ ǝzᴉuɐɓɹo oʇ noʎ ʍollɐ sdnoɹɓ ʎɹɐɹqᴉꞀ"
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "ǝɯɐu dnoɹɓ ɹǝʇuƎ"
},
"instance.settings.tabs.general.name": {
"message": "ǝɯɐN"
},
"instance.settings.tabs.hooks": {
"message": "sʞooɥ ɥɔunɐꞀ"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "sʞooɥ ɥɔunɐl ɯoʇsnƆ"
},
"instance.settings.tabs.hooks.description": {
"message": "˙ǝɯɐɓ ǝɥʇ ɓuᴉɥɔunɐl ɹǝʇɟɐ puɐ ǝɹoɟǝq spuɐɯɯoɔ ɯǝʇsʎs uᴉɐʇɹǝɔ unɹ oʇ sɹǝsn pǝɔuɐʌpɐ ʍollɐ sʞooH"
},
"instance.settings.tabs.hooks.post-exit": {
"message": "ʇᴉxǝ-ʇsoԀ"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "˙sǝsolɔ ǝɯɐɓ ǝɥʇ ɹǝʇɟɐ uɐᴚ"
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "˙˙˙puɐɯɯoɔ ʇᴉxǝ-ʇsod ɹǝʇuƎ"
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "ɥɔunɐl-ǝɹԀ"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "˙pǝɥɔunɐl sᴉ ǝɔuɐʇsuᴉ ǝɥʇ ǝɹoɟǝq uɐᴚ"
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "˙˙˙puɐɯɯoɔ ɥɔunɐl-ǝɹd ɹǝʇuƎ"
},
"instance.settings.tabs.hooks.title": {
"message": "sʞooɥ ɥɔunɐl ǝɯɐ⅁"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "ɹǝddɐɹM"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "˙ʇɟɐɹɔǝuᴉW ɓuᴉɥɔunɐl ɹoɟ puɐɯɯoɔ ɹǝddɐɹM"
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "˙˙˙puɐɯɯoɔ ɹǝddɐɹʍ ɹǝʇuƎ"
},
"instance.settings.tabs.installation": {
"message": "uoᴉʇɐllɐʇsuI"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "pǝllɐʇsuᴉ ʎpɐǝɹlɐ {game_version} ʇɟɐɹɔǝuᴉW ɹoɟ {version} {platform}"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "pǝllɐʇsuᴉ ʎpɐǝɹlɐ {game_version} ɐllᴉuɐΛ"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "uoᴉsɹǝʌ ǝɓuɐɥƆ"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "llɐʇsuI"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "ɓuᴉllɐʇsuI"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "suoᴉsɹǝʌ ʞɔɐdpoɯ ɓuᴉɥɔʇǝℲ"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "uoᴉsɹǝʌ ʍǝu ɓuᴉllɐʇsuI"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "pǝllɐʇsuᴉ ʎlʇuǝɹɹnƆ"
},
"instance.settings.tabs.installation.debug-information": {
"message": ":uoᴉʇɐɯɹoɟuᴉ ɓnqǝᗡ"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "slᴉɐʇǝp ʞɔɐdpoɯ ɓuᴉɥɔʇǝℲ"
},
"instance.settings.tabs.installation.game-version": {
"message": "uoᴉsɹǝʌ ǝɯɐ⅁"
},
"instance.settings.tabs.installation.install": {
"message": "llɐʇsuI"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "ssǝɹɓoɹd uᴉ uoᴉʇɐllɐʇsuI"
},
"instance.settings.tabs.installation.loader-version": {
"message": "uoᴉsɹǝʌ {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "{version} ʇɟɐɹɔǝuᴉW"
},
"instance.settings.tabs.installation.no-connection": {
"message": "˙uoᴉʇɔǝuuoɔ ʇǝuɹǝʇuᴉ ɹnoʎ ʞɔǝɥɔ ǝsɐǝlԀ ˙slᴉɐʇǝp ʞɔɐdpoɯ pǝʞuᴉl ɥɔʇǝɟ ʇouuɐƆ"
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "˙ɹǝpɐol poɯ ɹǝɥʇouɐ ʎɹ⟘ ˙{version} ʇɟɐɹɔǝuᴉW ɹoɟ ǝlqɐlᴉɐʌɐ ʇou sᴉ {loader}"
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "˙ɥʇuᴉɹpoW uo punoɟ ǝq ʇou plnoɔ ʞɔɐdpoɯ ǝɥʇ ʇnq ˋʞɔɐdpoɯ ɐ oʇ pǝʞuᴉl sᴉ ǝɔuɐʇsuᴉ sᴉɥ⟘"
},
"instance.settings.tabs.installation.platform": {
"message": "ɯɹoɟʇɐlԀ"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "ʞɔɐdpoɯ llɐʇsuᴉǝᴚ"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "ʞɔɐdpoɯ ɓuᴉllɐʇsuᴉǝᴚ"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "˙splɹoʍ ɓuᴉʇsᴉxǝ ʞɐǝɹq ʎɐɯ ʇᴉ ˋʇuǝʇuoɔ pǝllɐʇsuᴉ lɐuoᴉʇᴉppɐ uo puǝdǝp ʍou splɹoʍ ɹnoʎ ɟᴉ ʇnq ˋǝɔuɐʇsuᴉ ǝɥʇ oʇ ǝpɐɯ uǝǝq ǝʌɐɥ sǝɓuɐɥɔ ɟᴉ ɹoᴉʌɐɥǝq pǝʇɔǝdxǝun xᴉɟ ʎɐɯ sᴉɥ⟘ ˙uoᴉʇɐllɐʇsuᴉ lɐuᴉɓᴉɹo ǝɥʇ ɟo doʇ uo pǝppɐ ǝʌɐɥ noʎ ʇuǝʇuoɔ ɹo spoɯ ʎuɐ ɓuᴉʌoɯǝɹ ˋʞɔɐdpoɯ ǝɥʇ ʎq pǝpᴉʌoɹd sᴉ ʇɐɥʍ oʇ ʇuǝʇuoɔ pǝᴉɟᴉpoɯ ɹo pǝllɐʇsuᴉ llɐ ʇǝsǝɹ llᴉʍ ɓuᴉllɐʇsuᴉǝᴚ"
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "¿ǝɔuɐʇsuᴉ sᴉɥʇ llɐʇsuᴉǝɹ oʇ ʇuɐʍ noʎ ǝɹns noʎ ǝɹⱯ"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "˙ʞɔɐdpoɯ lɐuᴉɓᴉɹo ǝɥʇ ɟo doʇ uo pǝppɐ ǝʌɐɥ noʎ ʇuǝʇuoɔ ɹo spoɯ ʎuɐ ɓuᴉʌoɯǝɹ ˋǝʇɐʇs lɐuᴉɓᴉɹo sʇᴉ oʇ ʇuǝʇuoɔ s,ǝɔuɐʇsuᴉ ǝɥʇ sʇǝsǝᴚ"
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "ʞɔɐdpoɯ llɐʇsuᴉǝᴚ"
},
"instance.settings.tabs.installation.repair.button": {
"message": "ɹᴉɐdǝᴚ"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "ɓuᴉɹᴉɐdǝᴚ"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "˙spoɯ pǝllɐʇsuᴉ oʇ pǝʇɐlǝɹ sǝɥsɐɹɔ ɹo sǝnssᴉ ǝʌlosǝɹ ʇou llᴉʍ ʇnq ˋsɹoɹɹǝ pǝʇɐlǝɹ-ɹǝɥɔunɐl oʇ ǝnp ɓuᴉɥɔunɐl ʇou sᴉ ǝɯɐɓ ɹnoʎ ɟᴉ sǝnssᴉ ǝʌlosǝɹ ʎɐɯ sᴉɥ⟘ ˙uoᴉʇdnɹɹoɔ ɹoɟ sʞɔǝɥɔ puɐ sǝᴉɔuǝpuǝdǝp ʇɟɐɹɔǝuᴉW sllɐʇsuᴉǝɹ ɓuᴉɹᴉɐdǝᴚ"
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "¿ǝɔuɐʇsuᴉ ɹᴉɐdǝᴚ"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "ssǝɹɓoɹd uᴉ ɹᴉɐdǝᴚ"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "ʇuǝɹɹnɔ oʇ ʇǝsǝᴚ"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "suoᴉsɹǝʌ llɐ ʍoɥS"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "uoᴉsɹǝʌ ǝɓuɐɥɔ"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "llɐʇsuᴉ"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "llɐʇsuᴉǝɹ"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "ɹᴉɐdǝɹ"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "ɓuᴉllɐʇsuᴉ ǝlᴉɥʍ {action} ʇouuɐƆ"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "ǝuᴉlɟɟo ǝlᴉɥʍ {action} ʇouuɐƆ"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "ɓuᴉɹᴉɐdǝɹ ǝlᴉɥʍ {action} ʇouuɐƆ"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(uoᴉsɹǝʌ uʍouʞun)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "ǝɔuɐʇsuᴉ ʞuᴉlu∩"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "˙lɐɯɹou ɐ ǝɯoɔǝq llᴉʍ ʇᴉ puɐ sǝʇɐpdn ʞɔɐdpoɯ ǝʌᴉǝɔǝɹ ɹǝɓuol ou llᴉʍ no⅄ ˙ǝɔuɐʇsuᴉ ʍǝu ʎlǝɹᴉʇuǝ uɐ ɓuᴉʇɐǝɹɔ ʇnoɥʇᴉʍ ʇᴉ ʞuᴉl-ǝɹ oʇ ǝlqɐ ǝq ʇou llᴉʍ noʎ ˋpǝǝɔoɹd noʎ ɟI"
},
"instance.settings.tabs.installation.unlink.confirm.title": {
"message": "¿ǝɔuɐʇsuᴉ sᴉɥʇ ʞuᴉlun oʇ ʇuɐʍ noʎ ǝɹns noʎ ǝɹⱯ"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "˙ʞɔɐdpoɯ ǝɥʇ ɯoɹɟ ǝɔuɐʇsuᴉ sᴉɥʇ ʇɔǝuuoɔsᴉp ʎlʇuǝuɐɯɹǝd llᴉʍ ɓuᴉʞuᴉlu∩ ˙uoᴉsɹǝʌ ʇɟɐɹɔǝuᴉW ɹo ɹǝpɐol poɯ ǝɥʇ ǝɓuɐɥɔ ʇ,uɐɔ noʎ puɐ pǝʇɐpdn ǝq ʇ,uɐɔ spoɯ suɐǝɯ ɥɔᴉɥʍ ˋʞɔɐdpoɯ ɐ oʇ pǝʞuᴉl sᴉ ǝɔuɐʇsuᴉ sᴉɥ⟘"
},
"instance.settings.tabs.installation.unlink.title": {
"message": "ʞɔɐdpoɯ ɯoɹɟ ʞuᴉlu∩"
},
"instance.settings.tabs.java": {
"message": "ʎɹoɯǝɯ puɐ ɐʌɐſ"
},
"instance.settings.tabs.java.environment-variables": {
"message": "sǝlqɐᴉɹɐʌ ʇuǝɯuoɹᴉʌuƎ"
},
"instance.settings.tabs.java.hooks": {
"message": "sʞooH"
},
"instance.settings.tabs.java.java-arguments": {
"message": "sʇuǝɯnɓɹɐ ɐʌɐſ"
},
"instance.settings.tabs.java.java-installation": {
"message": "uoᴉʇɐllɐʇsuᴉ ɐʌɐſ"
},
"instance.settings.tabs.java.java-memory": {
"message": "pǝʇɐɔollɐ ʎɹoɯǝW"
},
"instance.settings.tabs.window": {
"message": "ʍopuᴉM"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "sɓuᴉʇʇǝs ʍopuᴉʍ ɯoʇsnƆ"
},
"instance.settings.tabs.window.fullscreen": {
"message": "uǝǝɹɔsllnℲ"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "˙(ʇxʇ˙suoᴉʇdo ɓuᴉsn) pǝɥɔunɐl uǝɥʍ uǝǝɹɔs llnɟ uᴉ ʇɹɐʇs ǝɯɐɓ ǝɥʇ ǝʞɐW"
},
"instance.settings.tabs.window.height": {
"message": "ʇɥɓᴉǝH"
},
"instance.settings.tabs.window.height.description": {
"message": "˙pǝɥɔunɐl uǝɥʍ ʍopuᴉʍ ǝɯɐɓ ǝɥʇ ɟo ʇɥɓᴉǝɥ ǝɥ⟘"
},
"instance.settings.tabs.window.height.enter": {
"message": "˙˙˙ʇɥɓᴉǝɥ ɹǝʇuƎ"
},
"instance.settings.tabs.window.width": {
"message": "ɥʇpᴉM"
},
"instance.settings.tabs.window.width.description": {
"message": "˙pǝɥɔunɐl uǝɥʍ ʍopuᴉʍ ǝɯɐɓ ǝɥʇ ɟo ɥʇpᴉʍ ǝɥ⟘"
},
"instance.settings.tabs.window.width.enter": {
"message": "˙˙˙ɥʇpᴉʍ ɹǝʇuƎ"
},
"instance.settings.title": {
"message": "sɓuᴉʇʇǝS"
},
"instance.worlds.a_minecraft_server": {
"message": "ɹǝʌɹǝS ʇɟɐɹɔǝuᴉW Ɐ"
},
"instance.worlds.cant_connect": {
"message": "ɹǝʌɹǝs oʇ ʇɔǝuuoɔ ʇ,uɐƆ"
},
"instance.worlds.copy_address": {
"message": "ssǝɹppɐ ʎdoƆ"
},
"instance.worlds.dont_show_on_home": {
"message": "ǝɯoH uo ʍoɥs ʇ,uoᗡ"
},
"instance.worlds.filter.available": {
"message": "ǝlqɐlᴉɐʌⱯ"
},
"instance.worlds.game_already_open": {
"message": "uǝdo ʎpɐǝɹlɐ sᴉ ǝɔuɐʇsuI"
},
"instance.worlds.hardcore": {
"message": "ǝpoɯ ǝɹoɔpɹɐH"
},
"instance.worlds.incompatible_server": {
"message": "ǝlqᴉʇɐdɯoɔuᴉ sᴉ ɹǝʌɹǝS"
},
"instance.worlds.no_contact": {
"message": "pǝʇɔɐʇuoɔ ǝq ʇ,uplnoɔ ɹǝʌɹǝS"
},
"instance.worlds.no_server_quick_play": {
"message": "+૨˙0˙⇂ ɐɥdlⱯ ʇɟɐɹɔǝuᴉW uo sɹǝʌɹǝs oʇuᴉ ʇɥɓᴉɐɹʇs dɯnſ ʎluo uɐɔ no⅄"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "+0ᘕ˙⇂ ʇɟɐɹɔǝuᴉW uo splɹoʍ ɹǝʎɐldǝlɓuᴉs oʇuᴉ ʇɥɓᴉɐɹʇs dɯnſ ʎluo uɐɔ no⅄"
},
"instance.worlds.play_instance": {
"message": "ǝɔuɐʇsuᴉ ʎɐlԀ"
},
"instance.worlds.type.server": {
"message": "ɹǝʌɹǝS"
},
"instance.worlds.type.singleplayer": {
"message": "ɹǝʎɐldǝlɓuᴉS"
},
"instance.worlds.view_instance": {
"message": "ǝɔuɐʇsuᴉ ʍǝᴉΛ"
},
"instance.worlds.world_in_use": {
"message": "ǝsn uᴉ sᴉ plɹoM"
},
"search.filter.locked.instance": {
"message": "ǝɔuɐʇsuᴉ ǝɥʇ ʎq pǝpᴉʌoɹԀ"
},
"search.filter.locked.instance-game-version.title": {
"message": "ǝɔuɐʇsuᴉ ǝɥʇ ʎq pǝpᴉʌoɹd sᴉ uoᴉsɹǝʌ ǝɯɐ⅁"
},
"search.filter.locked.instance-loader.title": {
"message": "ǝɔuɐʇsuᴉ ǝɥʇ ʎq pǝpᴉʌoɹd sᴉ ɹǝpɐoꞀ"
},
"search.filter.locked.instance.sync": {
"message": "ǝɔuɐʇsuᴉ ɥʇᴉʍ ɔuʎS"
}
}
+66 -3
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Minecraft authentication servers may be down right now. Check your internet connection and try again later."
},
"app.auth-servers.unreachable.header": {
"message": "Cannot reach authentication servers"
},
"app.modal.install-to-play.header": {
"message": "Install to play"
},
"app.modal.install-to-play.install-button": {
"message": "Install"
},
"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.shared-by-today": {
"message": "{name} shared this instance with you today."
},
"app.modal.install-to-play.shared-instance": {
"message": "Shared instance"
},
"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.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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Java installations"
},
"app.settings.tabs.language": {
"message": "Language"
},
"app.settings.tabs.privacy": {
"message": "Privacy"
},
@@ -29,6 +89,9 @@
"app.update-toast.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": {
"message": "Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!"
},
"app.update-toast.body.metered": {
"message": "Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it."
},
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Download ({size})"
},
"app.update-toast.download-page": {
"message": "Download"
},
"app.update-toast.downloading": {
"message": "Downloading..."
},
@@ -461,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Enter width..."
},
"instance.settings.title": {
"message": "Settings"
},
"instance.worlds.a_minecraft_server": {
"message": "A Minecraft Server"
},
@@ -1,341 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Programista modo ebligita."
},
"app.settings.tabs.appearance": {
"message": "Aspekto"
},
"app.settings.tabs.default-instance-options": {
"message": "Defaŭltaj agordoj de aperoj"
},
"app.settings.tabs.feature-flags": {
"message": "Trajtoflagoj"
},
"app.settings.tabs.java-installations": {
"message": "Instaloj de Java"
},
"app.settings.tabs.privacy": {
"message": "Privateco"
},
"instance.add-server.add-and-play": {
"message": "Aldoni kaj ludi"
},
"instance.add-server.add-server": {
"message": "Aldoni servilon"
},
"instance.add-server.resource-pack.disabled": {
"message": "Neebligita"
},
"instance.add-server.resource-pack.enabled": {
"message": "Ebligita"
},
"instance.add-server.resource-pack.prompt": {
"message": "Petu"
},
"instance.add-server.title": {
"message": "Aldoni servilon"
},
"instance.edit-server.title": {
"message": "Redakti servilon"
},
"instance.edit-world.hide-from-home": {
"message": "Kaŝi el la Hejma paĝo"
},
"instance.edit-world.name": {
"message": "Nomo"
},
"instance.edit-world.placeholder-name": {
"message": "Mondo de Minecraft"
},
"instance.edit-world.reset-icon": {
"message": "Restarigi simbolon"
},
"instance.edit-world.title": {
"message": "Redakti mondon"
},
"instance.filter.disabled": {
"message": "Neebligitaj projektoj"
},
"instance.filter.updates-available": {
"message": "Ĝisdatigoj disponeblas"
},
"instance.server-modal.address": {
"message": "Adreso"
},
"instance.server-modal.name": {
"message": "Nomo"
},
"instance.server-modal.placeholder-name": {
"message": "Servilo de Minecraft"
},
"instance.server-modal.resource-pack": {
"message": "Rimedo-pako"
},
"instance.settings.tabs.general": {
"message": "Ĝeneralo"
},
"instance.settings.tabs.general.delete": {
"message": "Forigo de apero"
},
"instance.settings.tabs.general.delete.button": {
"message": "Forigi aperon"
},
"instance.settings.tabs.general.delete.description": {
"message": "Porĉiame forigas aperon de via aparato, inkluzivo de mondoj, kaj ĉiu instaligita enhavon. Estu zorgema ĉar kiam oni forigus aperon, ĝi ne estus restaŭrebla."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Forigado..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Duobligi"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Ne povas duobligi dum instalado."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Duobligo de apero"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Kopias la aperon, inkluzivo de mondoj, agordoj, modifoj, ktp."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Redakti simbolon"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Forigi simbolon"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Ŝanĝi simbolon"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Elekti simbolon"
},
"instance.settings.tabs.general.library-groups": {
"message": "Grupoj de la biblioteko"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Krei novan grupon"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Grupoj de la biblioteko ebligas vin organizi la aperojn en fakojn en la biblioteko."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Entajpu nomon de grupo"
},
"instance.settings.tabs.general.name": {
"message": "Nomo"
},
"instance.settings.tabs.hooks": {
"message": "Lanĉaj hokoj"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Propraj lanĉaj hokoj"
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Post fermo"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Plenumata post kiam ludo fermas."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Entajpu komandon de post fermo..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "Antaŭ malfermo"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Plenumata antaŭ kiam ludo malfermas."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Entajpu komandon de antaŭ malfermo..."
},
"instance.settings.tabs.hooks.title": {
"message": "Hokoj de luda lanĉo"
},
"instance.settings.tabs.installation": {
"message": "Instalo"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Ŝanĝi version"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "Instali"
},
"instance.settings.tabs.installation.change-version.button.installing": {
"message": "Instalado"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Elŝutado de modifo-pakaĵaj versioj"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Instalado de nova versio"
},
"instance.settings.tabs.installation.currently-installed": {
"message": "Nune instalata"
},
"instance.settings.tabs.installation.game-version": {
"message": "Luda versio"
},
"instance.settings.tabs.installation.install": {
"message": "Instali"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "Instalado okazas"
},
"instance.settings.tabs.installation.loader-version": {
"message": "Versio de {loader}"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Ne povas elŝuti detalojn de ligita modifo-pakaĵo. Bonvolu kontroli la konekton de interreto."
},
"instance.settings.tabs.installation.platform": {
"message": "Platformo"
},
"instance.settings.tabs.installation.reinstall.button": {
"message": "Reinstali modifo-pakaĵon"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstalado de modifo-pakaĵo"
},
"instance.settings.tabs.installation.reinstall.confirm.title": {
"message": "Ĉu vi certas, ke vi volas reinstali la aperon?"
},
"instance.settings.tabs.installation.reinstall.title": {
"message": "Reinstalo de modifo-pakaĵo"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Ripari"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Riparado"
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "Ĉu riparu aperon?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Riparo okazas"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Restarigi al nuna"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Montri ĉiun version"
},
"instance.settings.tabs.installation.tooltip.action.change-version": {
"message": "ŝanĝi version"
},
"instance.settings.tabs.installation.tooltip.action.install": {
"message": "instali"
},
"instance.settings.tabs.installation.tooltip.action.reinstall": {
"message": "reinstali"
},
"instance.settings.tabs.installation.tooltip.action.repair": {
"message": "ripari"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Ne povas {action} dum instalado"
},
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
"message": "Ne povas {action} kiam neenreta"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Ne povas {action} dum riparado"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(nekonata versio)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Malligi aperon"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Se vi daŭrus, vi ne povus re-ligi ĝin sen kreado de nova aperon. Vi ne daŭre ricevos ĝisdatigojn de modifo-pakaĵoj kaj ĝi normaliĝos."
},
"instance.settings.tabs.java": {
"message": "Java kaj memoro"
},
"instance.settings.tabs.java.hooks": {
"message": "Hokoj"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Argumentoj de Java"
},
"instance.settings.tabs.java.java-installation": {
"message": "Instalo de Java"
},
"instance.settings.tabs.java.java-memory": {
"message": "Asigno de memoro"
},
"instance.settings.tabs.window": {
"message": "Fenestro"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Propraj agordoj de fenestro"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Tutekrano"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "Ludo lanĉiĝos tutekrane (uzante na options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "Alto"
},
"instance.settings.tabs.window.height.description": {
"message": "Alto de la luda fenestro kiam lanĉata."
},
"instance.settings.tabs.window.height.enter": {
"message": "Entajpu alton..."
},
"instance.settings.tabs.window.width": {
"message": "Larĝo"
},
"instance.settings.tabs.window.width.description": {
"message": "Larĝo de la luda fenestro kiam lanĉata."
},
"instance.settings.tabs.window.width.enter": {
"message": "Entajpu larĝon..."
},
"instance.settings.title": {
"message": "Agordoj"
},
"instance.worlds.a_minecraft_server": {
"message": "Servilo de Minecraft"
},
"instance.worlds.cant_connect": {
"message": "Ne povas konektiĝi kun servilo"
},
"instance.worlds.copy_address": {
"message": "Kopii adreson"
},
"instance.worlds.dont_show_on_home": {
"message": "Ne montri en Hejmo"
},
"instance.worlds.filter.available": {
"message": "Disponeblaj"
},
"instance.worlds.game_already_open": {
"message": "Apero jam estas malferma"
},
"instance.worlds.play_instance": {
"message": "Ludi en apero"
},
"instance.worlds.type.server": {
"message": "Servilo"
},
"instance.worlds.type.singleplayer": {
"message": "Unu ludanto"
},
"instance.worlds.view_instance": {
"message": "Vidi aperon"
},
"instance.worlds.world_in_use": {
"message": "Mondo nune uzata"
},
"search.filter.locked.instance.sync": {
"message": "Sinkroni kun apero"
}
}
+109 -40
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Los servidores de autenticación de Minecraft pueden no estar funcionando en este momento. Verifica tu conexión a internet e inténtalo de nuevo más tarde."
},
"app.auth-servers.unreachable.header": {
"message": "No se puede acceder a los servidores de autenticación"
},
"app.modal.install-to-play.header": {
"message": "Instala para jugar"
},
"app.modal.install-to-play.install-button": {
"message": "Instalar"
},
"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.shared-by-today": {
"message": "{name} compartió esta instancia contigo hoy."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instancia compartida"
},
"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.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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Instalaciones de Java"
},
"app.settings.tabs.language": {
"message": "Idioma"
},
"app.settings.tabs.privacy": {
"message": "Privacidad"
},
@@ -24,13 +84,16 @@
"message": "Gestión de recursos"
},
"app.update-toast.body": {
"message": La aplicación Modrinth v{version} está lista para instalarse! Actualiza ahora o automáticamente al cerrar la aplicación Modrinth."
"message": "¡Modrinth App v{version} lista para instalar! Actualiza ahora o automáticamente al cerrar la aplicación."
},
"app.update-toast.body.download-complete": {
"message": "La descarga de la aplicación Modrinth v{version} ha finalizado. Actualice ahora o automáticamente al cerrar la aplicación Modrinth."
"message": "La descarga de la Modrinth App v{version} ha finalizado. Actualiza ahora o automáticamente al cerrar la aplicación Modrinth."
},
"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-toast.body.metered": {
"message": La aplicación Modrinth v{version} ya está disponible! Como estás conectado a una red con límite de datos, no la hemos descargado automáticamente."
"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-toast.changelog": {
"message": "Registro de cambios"
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Descargar ({size})"
},
"app.update-toast.download-page": {
"message": "Descargar"
},
"app.update-toast.downloading": {
"message": "Descargando..."
},
@@ -51,7 +117,7 @@
"message": "Descarga completada"
},
"app.update.complete-toast.text": {
"message": "Haga clic aquí para ver el registro de cambios."
"message": "Haz clic aquí para ver el registro de cambios."
},
"app.update.complete-toast.title": {
"message": "¡La versión {version} se ha instalado correctamente!"
@@ -66,34 +132,37 @@
"message": "Recarga para instalar la actualización"
},
"friends.action.add-friend": {
"message": "Agrega a un amigo"
"message": "Añadir un amigo"
},
"friends.action.view-friend-requests": {
"message": "{count} {count, plural, one {petición} other {peticiones}} de amistad"
"message": "{count} {count, plural, one {solicitud} other {solicitudes}} de amistad"
},
"friends.add-friend.submit": {
"message": "Envía una petición de amistad"
"message": "Enviar solicitud de amistad"
},
"friends.add-friend.title": {
"message": "Agrega a un amigo"
"message": "Añadiendo un amigo"
},
"friends.add-friend.username.description": {
"message": "¡Puede ser diferente de su apodo en Minecraft!"
"message": "¡Podría ser distinto a su nombre de usuario de Minecraft!"
},
"friends.add-friend.username.placeholder": {
"message": "Escribe su apodo en Modrinth..."
"message": "Ingresa tu nombre de usuario de Modrinth..."
},
"friends.add-friend.username.title": {
"message": "¿Cuál es el apodo de tu amigo en Modrinth?"
"message": "¿Cuál es el nombre de usuario de Modrinth de tu amigo?"
},
"friends.add-friends-to-share": {
"message": "<link>¡Añade amigos</link> para ver qué están jugando!"
},
"friends.friend.cancel-request": {
"message": "Cancelar petición"
"message": "Cancelar solicitud"
},
"friends.friend.remove-friend": {
"message": "Eliminar amigo"
},
"friends.friend.request-sent": {
"message": "Petición de amistad enviada"
"message": "Solicitud de amistad enviada"
},
"friends.friend.view-profile": {
"message": "Ver perfil"
@@ -111,16 +180,19 @@
"message": "Conectados"
},
"friends.heading.pending": {
"message": "Pendientes"
"message": "Pendiente"
},
"friends.no-friends-match": {
"message": "Ningún apodo concuerda con ''{query}''"
"message": "Ningún amigo coincide con \"{query}\""
},
"friends.search-friends-placeholder": {
"message": "Buscando amigos..."
"message": "Buscar amigos..."
},
"friends.section.heading": {
"message": "{title}: {count}"
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>¡Inicia sesión en una cuenta de Modrinth</link> para añadir amigos y ver qué están jugando!"
},
"instance.add-server.add-and-play": {
"message": "Añadir y jugar"
@@ -153,7 +225,7 @@
"message": "Mundo de Minecraft"
},
"instance.edit-world.reset-icon": {
"message": "Resetear ícono"
"message": "Restablecer ícono"
},
"instance.edit-world.title": {
"message": "Editar mundo"
@@ -186,7 +258,7 @@
"message": "Eliminar instancia"
},
"instance.settings.tabs.general.delete.description": {
"message": "Elimina permanentemente una instancia de tu dispositivo, incluyendo tus mundos, configuraciones y todo el contenido instalado. Ten cuidado, ya que una vez que elimines una instancia no hay forma de recuperarla."
"message": "Elimina permanentemente una instancia de tu dispositivo, incluidos tus mundos, configuraciones y todo el contenido instalado. Ten cuidado, una vez eliminada, no hay forma de recuperarla."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Eliminando..."
@@ -207,7 +279,7 @@
"message": "Editar ícono"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Remover ícono"
"message": "Eliminar ícono"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Reemplazar ícono"
@@ -225,16 +297,16 @@
"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": "Escribe el nombre del grupo"
"message": "Ingresa el nombre del grupo"
},
"instance.settings.tabs.general.name": {
"message": "Nombre"
},
"instance.settings.tabs.hooks": {
"message": "Lanzar hooks"
"message": "Hooks de inicio"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Hooks personalizados"
"message": "Hooks de inicio personalizados"
},
"instance.settings.tabs.hooks.description": {
"message": "Los hooks permiten que usuarios avanzados ejecuten comandos del sistema antes y despues de lanzar el juego."
@@ -243,7 +315,7 @@
"message": "Post-cierre"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Ejecutados luego de que el juego se cierra."
"message": "Ejecutados después de que el juego se cierre."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Introduce el comando post-cierre..."
@@ -255,19 +327,19 @@
"message": "Ejecutados antes de que la instancia inicie."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Introducir comando pre-inicio..."
"message": "Introduce el comando pre-inicio..."
},
"instance.settings.tabs.hooks.title": {
"message": "Hooks de inicio de juego"
"message": "Hooks de inicio del juego"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Wrapper"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Comando de capa para lanzar Minecraft."
"message": "Comando Wrapper para iniciar Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Introduce el comando capa..."
"message": "Introduce el comando Wrapper..."
},
"instance.settings.tabs.installation": {
"message": "Instalación"
@@ -276,7 +348,7 @@
"message": "{platform} {version} ya está instalado para Minecraft {game_version}"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "{game_version} vanilla ya está instalado"
"message": "Vanilla {game_version} ya está instalada"
},
"instance.settings.tabs.installation.change-version.button": {
"message": "Cambiar versión"
@@ -321,7 +393,7 @@
"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 esta disponible para Minecraft {version}. Prueba con otro mod loader."
"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."
@@ -336,13 +408,13 @@
"message": "Reinstalando modpack"
},
"instance.settings.tabs.installation.reinstall.confirm.description": {
"message": "Reinstalar restablecerá todo el contenido instalado o modificado a lo que proporciona el modpack, eliminando cualquier mod o contenido que hayas agregado encima de 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 afectar los mundos existentes."
"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 encima del modpack original."
"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"
@@ -354,7 +426,7 @@
"message": "Reparando"
},
"instance.settings.tabs.installation.repair.confirm.description": {
"message": "Reparar reinstala las dependencias de Minecraft y verifica si hay archivos dañados. Esto puede solucionar problemas si tu juego no se inicia por errores relacionados con el launcher, pero no resolverá problemas causados por mods instalados."
"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?"
@@ -396,13 +468,13 @@
"message": "Desvincular instancia"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Si continúas, no podrás volver a vincularla sin crear una instancia completamente nueva. Ya no recibirás actualizaciones del modpack y se convertirá en una instancia normal."
"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 se pueden actualizar y no puedes cambiar el mod loader ni la versión de Minecraft. Desvincularla desconectará permanentemente esta instancia del modpack."
"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"
@@ -429,13 +501,13 @@
"message": "Ventana"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Opciones personalizadas de ventana"
"message": "Configuración de ventana personalizada"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Pantalla completa"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "Inicia el juego en pantalla completa al ejecutarlo (usando options.txt)."
"message": "Inicia el juego en pantalla completa al iniciarlo (usando options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "Altura"
@@ -455,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Ingresa el ancho..."
},
"instance.settings.title": {
"message": "Configuración"
},
"instance.worlds.a_minecraft_server": {
"message": "Un servidor de Minecraft"
},
+76 -7
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Los servidores de autenticación de Minecraft pueden no estar funcionando en este momento. Verifica tu conexión a internet e inténtalo de nuevo más tarde."
},
"app.auth-servers.unreachable.header": {
"message": "No se puede conectar con los servidores de autenticación"
},
"app.modal.install-to-play.header": {
"message": "Instala para jugar"
},
"app.modal.install-to-play.install-button": {
"message": "Instalar"
},
"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.shared-by-today": {
"message": "{name} ha compartido contigo hoy esta instancia."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instancia compartida"
},
"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.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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Instalaciones de Java"
},
"app.settings.tabs.language": {
"message": "Idioma"
},
"app.settings.tabs.privacy": {
"message": "Privacidad"
},
@@ -29,8 +89,11 @@
"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-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-toast.body.metered": {
"message": "¡La versión v{version} de Modrinth ya está disponible! Como estás conectado a una red con límite de datos, no la hemos descargado automáticamente."
"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-toast.changelog": {
"message": "Registro de cambios"
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Descarga ({size})"
},
"app.update-toast.download-page": {
"message": "Descargar"
},
"app.update-toast.downloading": {
"message": "Descargando..."
},
@@ -86,6 +152,9 @@
"friends.add-friend.username.title": {
"message": "¿Cuál es el apodo de tu amigo en Modrinth?"
},
"friends.add-friends-to-share": {
"message": "<link>Añade amigos</link> para ver a qué están jugando!"
},
"friends.friend.cancel-request": {
"message": "Cancelar petición"
},
@@ -122,6 +191,9 @@
"friends.section.heading": {
"message": "{title}: {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Inicia sesión en una cuenta Modrinth</link> para añadir amigos y ver a qué están jugando!"
},
"instance.add-server.add-and-play": {
"message": "Añadir y jugar"
},
@@ -198,7 +270,7 @@
"message": "No puedes duplicar mientras se instala."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Duplicar instancia."
"message": "Duplicar instancia"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Crea una copia de esta instancia, incluyendo mundos, configuraciones, mods, etc."
@@ -264,7 +336,7 @@
"message": "Wrapper"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": ".."
"message": "comando Wrapper para lanzar Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Introducir comando para el wrapper..."
@@ -273,7 +345,7 @@
"message": "Instancia"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} para Minecraft {game_version} ya esta instalada"
"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"
@@ -455,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Introduzca el ancho..."
},
"instance.settings.title": {
"message": "Ajustes"
},
"instance.worlds.a_minecraft_server": {
"message": "Un Servidor de Minecraft"
},
@@ -1,107 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Arendajarežiim sisse lülitatud."
},
"app.settings.tabs.appearance": {
"message": "Välimus"
},
"app.settings.tabs.default-instance-options": {
"message": "Vaikimisi instantsi valikud"
},
"app.settings.tabs.feature-flags": {
"message": "Funktsioonimärgid"
},
"app.settings.tabs.java-installations": {
"message": "Java installatsioonid"
},
"app.settings.tabs.privacy": {
"message": "Privaatsus"
},
"app.settings.tabs.resource-management": {
"message": "Ressursside haldus"
},
"instance.add-server.add-and-play": {
"message": "Lisa ja mängi"
},
"instance.add-server.add-server": {
"message": "Lisa server"
},
"instance.add-server.resource-pack.disabled": {
"message": "Väljas"
},
"instance.add-server.resource-pack.enabled": {
"message": "Sees"
},
"instance.add-server.resource-pack.prompt": {
"message": "Küsi"
},
"instance.add-server.title": {
"message": "Lisa server"
},
"instance.edit-server.title": {
"message": "Muuda server"
},
"instance.edit-world.hide-from-home": {
"message": "Peida koduleheküljelt"
},
"instance.edit-world.name": {
"message": "Nimi"
},
"instance.edit-world.placeholder-name": {
"message": "Minecrafti maailm"
},
"instance.edit-world.reset-icon": {
"message": "Lähtesta ikoon"
},
"instance.edit-world.title": {
"message": "Muuda maailm"
},
"instance.filter.disabled": {
"message": "Suletud projektid"
},
"instance.filter.updates-available": {
"message": "Uuendused on saadaval"
},
"instance.server-modal.address": {
"message": "Aadress"
},
"instance.server-modal.name": {
"message": "Nimi"
},
"instance.server-modal.placeholder-name": {
"message": "Minecrafti server"
},
"instance.server-modal.resource-pack": {
"message": "Ressursipakk"
},
"instance.settings.tabs.general": {
"message": "Üldised"
},
"instance.settings.tabs.general.delete": {
"message": "Kustuta instants"
},
"instance.settings.tabs.general.delete.button": {
"message": "Kustuta instants"
},
"instance.settings.tabs.general.delete.description": {
"message": "Kustutab instantsi seadmest alatiselt, sealhulgas maailmad, konfiguratsioonid ja kogu paigaldatud sisu. Ole ettevaatlik, kuna instantsi kustutamisel ei ole seda enam võimalik taastada."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Kustutab..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Dubleeri"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "Pole võimalik dubleerida paigaldamisel."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Dubleeri instants"
},
"instance.settings.tabs.general.name": {
"message": "Nimi"
},
"instance.settings.title": {
"message": "Sätted"
}
}
@@ -1,419 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "حالت برنامه‌نویس روشن شد."
},
"app.settings.tabs.appearance": {
"message": "ظاهر"
},
"app.settings.tabs.default-instance-options": {
"message": "گزینه‌های پیش‌فرض اینستنس (نسخهٔ جدا)"
},
"app.settings.tabs.feature-flags": {
"message": "سوییچ قابلیت‌ها"
},
"app.settings.tabs.java-installations": {
"message": "جاواهای نصب‌شده"
},
"app.settings.tabs.privacy": {
"message": "حریم خصوصی"
},
"app.settings.tabs.resource-management": {
"message": "مدیریت منابع"
},
"instance.add-server.add-and-play": {
"message": "اضافه کردن و پلی دادن"
},
"instance.add-server.add-server": {
"message": "اضافه کردن سرور"
},
"instance.add-server.resource-pack.disabled": {
"message": "غیرفعال"
},
"instance.add-server.resource-pack.enabled": {
"message": "فعال"
},
"instance.add-server.resource-pack.prompt": {
"message": "درخواست از سرور"
},
"instance.add-server.title": {
"message": "اضافه کردن سرور"
},
"instance.edit-server.title": {
"message": "ویرایش سرور"
},
"instance.edit-world.hide-from-home": {
"message": "مخفی کردن از صفحه ی اصلی"
},
"instance.edit-world.name": {
"message": "نام"
},
"instance.edit-world.placeholder-name": {
"message": "جهان ماینکرفت"
},
"instance.edit-world.reset-icon": {
"message": "ریست کردن آیکن"
},
"instance.edit-world.title": {
"message": "ویرایش جهان"
},
"instance.filter.disabled": {
"message": "پروزه های غیر فعال"
},
"instance.filter.updates-available": {
"message": "آپدیت موجوده"
},
"instance.server-modal.address": {
"message": "آدرس"
},
"instance.server-modal.name": {
"message": "نام"
},
"instance.server-modal.placeholder-name": {
"message": "سرور ماینکرفت"
},
"instance.server-modal.resource-pack": {
"message": "رسورس پک"
},
"instance.settings.tabs.general": {
"message": "تنظیمات کلی"
},
"instance.settings.tabs.general.delete": {
"message": "حذف اینستنس (نسخهٔ جدا)"
},
"instance.settings.tabs.general.delete.button": {
"message": "حذف اینستنس (نسخهٔ جدا)"
},
"instance.settings.tabs.general.delete.description": {
"message": "این کار یه اینستنس (نسخهٔ جدا) رو به‌طور کامل از دستگاهت پاک می‌کنه، شامل دنیاها، تنظیمات و همه محتوای نصب‌شده. مراقب باش، چون بعد از حذف، هیچ راهی برای بازیابی‌ش نیست."
},
"instance.settings.tabs.general.deleting.button": {
"message": "در حال حذف..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "دوپلیکیت"
},
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
"message": "نمیشه هنگام نصب دوپلیکیت کرد."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "دوپلیکیت کردن اینستنس (نسخهٔ جدا)"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "یه کپی از این اینستنس (نسخهٔ جدا) می‌سازه، شامل دنیاها، تنظیمات، مودها و بقیه چیزا."
},
"instance.settings.tabs.general.edit-icon": {
"message": "ویرایش آیکن"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "حذف آیکن"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "جایگزین آیکن"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "انتخاب آیکن"
},
"instance.settings.tabs.general.library-groups": {
"message": "گروه های کتابخانه"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "ساخت گروه کتابخانه ی جدید"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "گروه‌های کتابخانه به شما امکان می‌دهند اینستنس‌های خود را در بخش‌های مختلف کتابخانه مرتب کنید."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "نام گروه رو بنویس"
},
"instance.settings.tabs.general.name": {
"message": "نام"
},
"instance.settings.tabs.hooks": {
"message": "اجرای پیشرفته"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "شخصی سازی اجرا"
},
"instance.settings.tabs.hooks.description": {
"message": "اجرای پیشرفته به کاربران حرفه‌ای اجازه می‌ده قبل و بعد از اجرای بازی، بعضی کامند های سیستمی رو اجرا کنن."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "پس از خروج"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "پس از بسته شدن بازی اجرا شد."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "کامند بعد خروج رو بنویس..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "قبل از اجرا"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "قبل از اجرا شدن بازی ران میشه."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "کامند قبل اجرا رو بنویس..."
},
"instance.settings.tabs.hooks.title": {
"message": "شخصی سازی اجرای بازی"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "دستور میانجی"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "دستور میانجی برای اجرای ماینکرفت."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "کامند میانجی را وارد کنید..."
},
"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": "این اینستنس (نسخهٔ جدا) به یه مودپک لینک شده، ولی مودپک تو 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": "ترمیم کردن، وابستگی‌های ماینکرفت رو دوباره نصب می‌کنه و سالم بودنشون رو بررسی می‌کنه. این ممکنه مشکلاتی که باعث اجرا نشدن بازی رو حل کنه، ولی مشکلات یا کرش‌های مربوط به مودهای نصب‌شده رو درست نمی‌کنه."
},
"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": "جاوا و مقدار رم"
},
"instance.settings.tabs.java.environment-variables": {
"message": "متغیرهای محیطی"
},
"instance.settings.tabs.java.hooks": {
"message": "اجرای پیشرفته"
},
"instance.settings.tabs.java.java-arguments": {
"message": "پارامتر های جاوا"
},
"instance.settings.tabs.java.java-installation": {
"message": "جاوا های نصب شده"
},
"instance.settings.tabs.java.java-memory": {
"message": "رم گرفته شده"
},
"instance.settings.tabs.window": {
"message": "پنجره"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "شخصی سازی پنجره"
},
"instance.settings.tabs.window.fullscreen": {
"message": "تمام صفحه"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "بازی وقتی اجرا می‌شه به‌صورت تمام‌صفحه باز بشه (با استفاده از options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "ارتفاع"
},
"instance.settings.tabs.window.height.description": {
"message": "ارتفاع پنجره‌ی بازی وقتی اجرا می‌شه."
},
"instance.settings.tabs.window.height.enter": {
"message": "ارتفاع رو وارد کن..."
},
"instance.settings.tabs.window.width": {
"message": "عرض"
},
"instance.settings.tabs.window.width.description": {
"message": "عرض پنجره ی بازی هنگام اجرا شدن."
},
"instance.settings.tabs.window.width.enter": {
"message": "عرض رو وارد کن..."
},
"instance.settings.title": {
"message": "تنظیمات"
},
"instance.worlds.a_minecraft_server": {
"message": "سرور ماینکرفت"
},
"instance.worlds.cant_connect": {
"message": "نمیشه به سرور متصل شد"
},
"instance.worlds.copy_address": {
"message": "کپی کردن آدرس"
},
"instance.worlds.dont_show_on_home": {
"message": "نشون ندادن روی صفحه ی اصلی"
},
"instance.worlds.filter.available": {
"message": "در درسترس"
},
"instance.worlds.game_already_open": {
"message": "این اینستنس (نسخهٔ جدا) در حال اجراست"
},
"instance.worlds.hardcore": {
"message": "حالت هاردکور"
},
"instance.worlds.incompatible_server": {
"message": "سرور ناسازگاره"
},
"instance.worlds.no_contact": {
"message": "سرور در دسترس نیست"
},
"instance.worlds.no_server_quick_play": {
"message": "می‌تونی فقط از نسخه‌ی ماینکرفت آلفای 1.0.5 به بعد مستقیم وارد سرورها بشی"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "می‌تونی فقط از نسخه‌ی ماینکرفت 1.20 به بعد مستقیم وارد جهان ماینکرفت بشی"
},
"instance.worlds.play_instance": {
"message": "اجرای اینستنس (نسخهٔ جدا)"
},
"instance.worlds.type.server": {
"message": "سرور"
},
"instance.worlds.type.singleplayer": {
"message": "سینگل پلیر"
},
"instance.worlds.view_instance": {
"message": "دیدن اینستنس (نسخهٔ جدا)"
},
"instance.worlds.world_in_use": {
"message": "جهان در حال استفادست"
},
"search.filter.locked.instance": {
"message": "ارائه‌شده توسط اینستنس (نسخهٔ جدا)"
},
"search.filter.locked.instance-game-version.title": {
"message": "ورژن بازی توسط اینستنس (نسخهٔ جدا) ارائه شده"
},
"search.filter.locked.instance-loader.title": {
"message": "لودر توسط اینستنس (نسخهٔ جدا) ارائه شده"
},
"search.filter.locked.instance.sync": {
"message": "سینک کردن با اینستنس"
}
}
+121 -4
View File
@@ -1,7 +1,16 @@
{
"app.auth-servers.unreachable.body": {
"message": "Minecraftin todennuspalvelimet eivät ehkä ole tällä hetkellä tavoitettavissa. Tarkista internetyhteytesi ja yritä myöhemmin uudelleen."
},
"app.auth-servers.unreachable.header": {
"message": "Todennuspalvelimiin ei saada yhteyttä"
},
"app.settings.developer-mode-enabled": {
"message": "Kehittäjätila käytössä."
},
"app.settings.downloading": {
"message": "Ladataan v{version}"
},
"app.settings.tabs.appearance": {
"message": "Ulkonäkö"
},
@@ -14,12 +23,123 @@
"app.settings.tabs.java-installations": {
"message": "Java asennukset"
},
"app.settings.tabs.language": {
"message": "Kieli"
},
"app.settings.tabs.privacy": {
"message": "Yksityisyys"
},
"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-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-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-toast.changelog": {
"message": "Muutosloki"
},
"app.update-toast.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": {
"message": "Lataus valmis"
},
"app.update.complete-toast.text": {
"message": "Klikkaa tästä nähdäksesi muutoslokin."
},
"app.update.complete-toast.title": {
"message": "Versio {version} asennettiin onnistuneesti!"
},
"app.update.download-update": {
"message": "Lataa päivitys"
},
"app.update.downloading-update": {
"message": "Ladataan päivitystä ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Lataa uudelleen asentaaksesi päivityksen"
},
"friends.action.add-friend": {
"message": "Lisää ystävä"
},
"friends.action.view-friend-requests": {
"message": "{count} ystävä{count, plural, one {pyyntö} other {pyyntöä}}"
},
"friends.add-friend.submit": {
"message": "Lähetä kaveripyyntö"
},
"friends.add-friend.title": {
"message": "Lisätään kaveria"
},
"friends.add-friend.username.description": {
"message": "Se ei voi olla eri kuin heidän Minecraft-käyttäjänimi!"
},
"friends.add-friend.username.placeholder": {
"message": "Syötä Modrinth-käyttäjätunnus..."
},
"friends.add-friend.username.title": {
"message": "Mikä on ystäväsi Modrinth-käyttäjänimi?"
},
"friends.add-friends-to-share": {
"message": "<link>Lisää kavereita</link> nähdäksesi mitä he pelaavat!"
},
"friends.friend.cancel-request": {
"message": "Peruuta pyyntö"
},
"friends.friend.remove-friend": {
"message": "Poista ystävä"
},
"friends.friend.request-sent": {
"message": "Ystäväpyyntö lähetetty"
},
"friends.friend.view-profile": {
"message": "Näytä profiili"
},
"friends.heading": {
"message": "Ystävät"
},
"friends.heading.active": {
"message": "Aktiiviset"
},
"friends.heading.offline": {
"message": "Offline-tilassa"
},
"friends.heading.online": {
"message": "Online-tilassa"
},
"friends.heading.pending": {
"message": "Odotetaan"
},
"friends.no-friends-match": {
"message": "Ei ystäviä, jotka vastaavat ''{query}''"
},
"friends.search-friends-placeholder": {
"message": "Hae ystäviä..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Kirjaudu Modrinth-tilille</link> lisätäksesi ystäviä ja nähdäksesi mitä he pelaavat!"
},
"instance.add-server.add-and-play": {
"message": "Lisää ja pelaa"
},
@@ -30,7 +150,7 @@
"message": "Poistettu käytöstä"
},
"instance.add-server.resource-pack.enabled": {
"message": "Päällä"
"message": "Käytössä"
},
"instance.add-server.resource-pack.prompt": {
"message": "Kehote"
@@ -353,9 +473,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Syötä leveys..."
},
"instance.settings.title": {
"message": "Asetukset"
},
"instance.worlds.a_minecraft_server": {
"message": "Minecraft palvelin"
},
+198 -18
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Maaaring hindi maaabot ang mga authentication server ng Minecraft sa ngayon. Tingnan mo ang iyong internet connection at muling subukan mamaya."
},
"app.auth-servers.unreachable.header": {
"message": "Hindi maabot ang mga authentication server"
},
"app.modal.install-to-play.header": {
"message": "Mag-install upang malaro"
},
"app.modal.install-to-play.install-button": {
"message": "I-install"
},
"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.shared-by-today": {
"message": "Ibinahagi ngayong araw ni {name} ang instansiyang ito sa iyo."
},
"app.modal.install-to-play.shared-instance": {
"message": "Binahaging instansiya"
},
"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.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."
},
@@ -12,22 +69,28 @@
"message": "Mga pagpipilian sa default na instansiya"
},
"app.settings.tabs.feature-flags": {
"message": "Mga feature flag"
"message": "Mga hudyat ng tampok"
},
"app.settings.tabs.java-installations": {
"message": "Mga instalasyon ng Java"
},
"app.settings.tabs.language": {
"message": "Wika"
},
"app.settings.tabs.privacy": {
"message": "Pribasiya"
},
"app.settings.tabs.resource-management": {
"message": "Pamamahala ng resource"
"message": "Pamamahala ng paglalaan"
},
"app.update-toast.body": {
"message": "Ang Modrinth App v{version} ay handa nang ma-install. Mag-reload upang ma-update ngayon, o awtomatiko pagsara ng Modrinth App."
"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": {
"message": "Tapos nang ma-download ang Modrinth App v{version}. Mag-reload upang ma-update ngayon, o awtomatiko pagsara ng Modrinth App."
"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": {
"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": {
"message": "Magagamit na ngayon ang Modrinth App v{version}! Hindi namin dinanload kaagad dahil naka-metro ang inyong network."
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "I-download ({size})"
},
"app.update-toast.download-page": {
"message": "I-download"
},
"app.update-toast.downloading": {
"message": "Nagda-download..."
},
@@ -51,7 +117,7 @@
"message": "Nakumpleto ang pagdownload"
},
"app.update.complete-toast.text": {
"message": "Magpindot rito upang matingnan ang changelog."
"message": "Dito pumindot upang matingnan ang changelog."
},
"app.update.complete-toast.title": {
"message": "Tagumpay na na-install ang bersiyong {version}!"
@@ -125,6 +191,9 @@
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Mag-sign in sa Modrinth account</link> upang maidagdag ang mga kaibigan at malaman ang kanilang nilalaro!"
},
"instance.add-server.add-and-play": {
"message": "Idagdag at laruin"
},
@@ -156,7 +225,7 @@
"message": "Minecraft na Mundo"
},
"instance.edit-world.reset-icon": {
"message": "Walain ang ikono"
"message": "I-reset ang ikono"
},
"instance.edit-world.title": {
"message": "Baguhin ang mundo"
@@ -183,13 +252,13 @@
"message": "General"
},
"instance.settings.tabs.general.delete": {
"message": "I-delete ang instansiya"
"message": "Tanggalin ang instansiya"
},
"instance.settings.tabs.general.delete.button": {
"message": "I-delete ang instansiya"
"message": "Tanggalin ang instansiya"
},
"instance.settings.tabs.general.delete.description": {
"message": "Permanenteng matatanggal ang instansiya sa iyong device, kasali na ang iyong mga mundo, konpigurasyon, at lahat ng nakainstall na kontento. Mag-ingat, kapag magtanggal ka ng instansiya ay hindi na ito mababawi."
"message": "Habambuhay na matatanggal ang instansiya sa iyong device, kasama ang iyong mga mundo, kompigurasyon, at lahat ng naka-install na kontento. Mag-ingat, kapag nagtanggal ka ng instansiya ay hindi na ito mababawi."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Nagde-delete..."
@@ -204,7 +273,7 @@
"message": "I-duplicate ang instansiya"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Gagawan ng kopya ng instansiyang ito, kasali na ang mga mundo, konpigurasyon, mods, at iba pa."
"message": "Lilikhaan ng kopya ang instansiyang ito, kasama ang mga mundo, kumpigurasyon, mod, at iba pa."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Baguhin ang ikono"
@@ -222,7 +291,7 @@
"message": "Mga grupo ng librerya"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Gumawa ng bagong grupo"
"message": "Lumikha ng bagong grupo"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Binibigyan ng mga grupo ng librerya na iyong maayos ang iyong mga instansiya sa iba't-ibang pangkat in iyong librerya."
@@ -240,7 +309,7 @@
"message": "Mga custom na launch hook"
},
"instance.settings.tabs.hooks.description": {
"message": "Binibigyan-daan ng mga hook ang mga ekspertong user 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 system command bago at pagkatapos ma-launch ang laro."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Post-exist"
@@ -302,29 +371,53 @@
"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 mare-reset ang lahat ng na-install o binago na kontento sa kung anong ibibigay ng modpack, tatanggalin ang mga mods o kontentong idinagdag mo lalo na ang mga 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."
"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": "I-reset ang mga kontento ng instansiya sa orihinal niyang estado, tatanggalin ang mga mods o kontentong idinagdag mo lalo na ang mga orihinal na modpack."
"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"
@@ -333,11 +426,17 @@
"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 o pag-crash na dulot nga mga na-install na mod."
"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"
},
@@ -365,39 +464,105 @@
"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 o ang bersiyon ng Minecraft."
"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"
},
"instance.settings.tabs.java.environment-variables": {
"message": "Environment variables"
},
"instance.settings.tabs.java.hooks": {
"message": "Mga hook"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Mga java argument"
},
"instance.settings.tabs.java.java-installation": {
"message": "Instalasyon ng Java"
},
"instance.settings.tabs.java.java-memory": {
"message": "Memoryang inilaan"
},
"instance.settings.tabs.window": {
"message": "Window"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Mga setting sa custom na window"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Fullscreen"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "Gagawing magsisimulang naka-fullscreen ang laro pag-launch (gamit ang options.txt)."
},
"instance.settings.tabs.window.height": {
"message": "Taas"
},
"instance.settings.tabs.window.height.description": {
"message": "Ang taas ng game window kung na-launch."
},
"instance.settings.tabs.window.height.enter": {
"message": "Ilagay ang taas..."
},
"instance.settings.tabs.window.width": {
"message": "Lapad"
},
"instance.settings.title": {
"message": "Mga Setting"
"instance.settings.tabs.window.width.description": {
"message": "Ang lapad ng game window kung na-launch."
},
"instance.settings.tabs.window.width.enter": {
"message": "Ilagay ang lapad..."
},
"instance.worlds.a_minecraft_server": {
"message": "Isang Minecraft Server"
},
"instance.worlds.cant_connect": {
"message": "Hndi makakonekta sa server"
},
"instance.worlds.copy_address": {
"message": "Kopyahin ang adres"
},
"instance.worlds.dont_show_on_home": {
"message": "Huwag ipakita sa Home"
},
"instance.worlds.filter.available": {
"message": "Magagamit"
},
"instance.worlds.game_already_open": {
"message": "Bukas naman ang instansiya"
},
"instance.worlds.hardcore": {
"message": "Modong eksperto"
},
"instance.worlds.incompatible_server": {
"message": "Hindi magkatugma sa server"
},
"instance.worlds.no_contact": {
"message": "Hindi makontak ang server"
},
"instance.worlds.no_server_quick_play": {
"message": "Deretso kang makakalukso lamang sa mga server na nasa Minecraft Alpha 1.0.5+"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Deretso kang makakalukso lamang sa mga pang-isahang larong mundo na nasa Minecraft 1.20+"
},
"instance.worlds.play_instance": {
"message": "Laruin ang instansiya"
},
"instance.worlds.type.server": {
"message": "Server"
},
@@ -406,5 +571,20 @@
},
"instance.worlds.view_instance": {
"message": "Tingnan ang instansiya"
},
"instance.worlds.world_in_use": {
"message": "Ginagamit ang mundo"
},
"search.filter.locked.instance": {
"message": "Sagot na ng instansiya"
},
"search.filter.locked.instance-game-version.title": {
"message": "Sagot na ng instansiya ang bersiyon ng laro"
},
"search.filter.locked.instance-loader.title": {
"message": "Sagot na ng instansiya ang loader ng laro"
},
"search.filter.locked.instance.sync": {
"message": "Maki-sync sa instansiya"
}
}
+79 -16
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Les serveurs d'authentification de Minecraft sont peut-être actuellement hors ligne. Vérifiez votre connexion Internet et essayez à nouveau dans quelques instants."
},
"app.auth-servers.unreachable.header": {
"message": "Impossible de contacter les serveurs d'authentification"
},
"app.modal.install-to-play.header": {
"message": "Installer pour jouer"
},
"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.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.shared-by-today": {
"message": "{name} a partagé cette instance avec vous aujourd'hui."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instance partagée"
},
"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.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é."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Installations de Java"
},
"app.settings.tabs.language": {
"message": "Langue"
},
"app.settings.tabs.privacy": {
"message": "Confidentialité"
},
@@ -24,25 +84,31 @@
"message": "Gestion des ressources"
},
"app.update-toast.body": {
"message": "L'application Modrinth v{version} est prêtes à être installé ! Relancez l'application pour faire la mise à jour maintenant ou la mise à jour se fera automatiquement lorsque vous fermerez l'application Modrinth."
"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-toast.body.download-complete": {
"message": "L'application Modrinth v{version} a finis d'être téléchargé ! Relancez l'application pour faire la mise à jour maintenant ou la mise à jour se fera automatiquement lorsque vous fermerez l'application Modrinth."
"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-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-toast.body.metered": {
"message": "L'application Modrinth v{version} est disponible dès maintenant ! Lorsque vous êtes sur un réseau limité ou en donnée mobile, nous ne téléchargerons pas les mises à jour automatiquement."
"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-toast.changelog": {
"message": "Notes de changement"
"message": "Journal des modifications"
},
"app.update-toast.download": {
"message": "Télécharger ({size})"
},
"app.update-toast.download-page": {
"message": "Télécharger"
},
"app.update-toast.downloading": {
"message": "Téléchargement..."
},
"app.update-toast.reload": {
"message": "Rechargement"
"message": "Recharger"
},
"app.update-toast.title": {
"message": "Mise à jour disponible"
@@ -69,7 +135,7 @@
"message": "Ajouter un ami"
},
"friends.action.view-friend-requests": {
"message": "{count} {count, plural,one {demande}other {demandes}} d'ami"
"message": "{count} {count, plural, one {demande} other {demandes}} d'ami"
},
"friends.add-friend.submit": {
"message": "Envoyer une demande d'ami"
@@ -78,7 +144,7 @@
"message": "Ajouter un ami"
},
"friends.add-friend.username.description": {
"message": "Ça peut être différent de son pseudo Minecraft !"
"message": "Peut être différent de leur pseudo Minecraft !"
},
"friends.add-friend.username.placeholder": {
"message": "Entrez un pseudo Modrinth..."
@@ -87,7 +153,7 @@
"message": "Quel est le pseudo Modrinth de votre ami ?"
},
"friends.add-friends-to-share": {
"message": "<link>Ajouter des amis</link> pour voir à quoi ils jouent !"
"message": "<link>Ajoutez des amis</link> pour voir à quoi ils jouent !"
},
"friends.friend.cancel-request": {
"message": "Annuler la demande"
@@ -117,7 +183,7 @@
"message": "En attente"
},
"friends.no-friends-match": {
"message": "Aucuns amis ne correspondent à \"{query}\""
"message": "Aucuns amis ne correspondent à « {query} »"
},
"friends.search-friends-placeholder": {
"message": "Chercher des amis..."
@@ -240,7 +306,7 @@
"message": "Crochets de lancement"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Crochets de lancement custom"
"message": "Crochets de lancement personnalisés"
},
"instance.settings.tabs.hooks.description": {
"message": "Les crochets permettent aux usagers avancés d'exécuter certaines commandes systèmes avant et après le lancement du jeu."
@@ -249,7 +315,7 @@
"message": "Post-fermeture"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Exécuté après fermeture."
"message": "Exécuté après la fermeture du jeu."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Entrer commande de post-fermeture..."
@@ -360,7 +426,7 @@
"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 lanceur, mais ne résoudra pas les problèmes ou plantages liés aux mods installés."
"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 ?"
@@ -461,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "Entrer la largeur..."
},
"instance.settings.title": {
"message": "Paramètres"
},
"instance.worlds.a_minecraft_server": {
"message": "Un Serveur Minecraft"
},
@@ -477,7 +540,7 @@
"message": "Ne pas montrer dans l'Accueil"
},
"instance.worlds.filter.available": {
"message": "Libre"
"message": "Disponible"
},
"instance.worlds.game_already_open": {
"message": "L'instance est déjà ouverte"
+144 -27
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "ייתכן ששרתי האימות של Minecraft מושבתים כרגע. יש לבדוק את חיבור האינטרנט שלך ולנסות שוב מאוחר יותר."
},
"app.auth-servers.unreachable.header": {
"message": "לא ניתן לגשת לשרתי האימות"
},
"app.modal.install-to-play.header": {
"message": "צריך להתקין כדי לשחק"
},
"app.modal.install-to-play.install-button": {
"message": "התקנה"
},
"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.shared-by-today": {
"message": "{name} שיתף איתך את ההתקנה הזאת היום."
},
"app.modal.install-to-play.shared-instance": {
"message": "התקנה משותפת"
},
"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.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": "מצב מפתח מופעל."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "התקנות ג'אווה"
},
"app.settings.tabs.language": {
"message": "שפה"
},
"app.settings.tabs.privacy": {
"message": "פרטיות"
},
@@ -24,19 +84,25 @@
"message": "ניהול משאבים"
},
"app.update-toast.body": {
"message": "Modrinth App גרסה: {version} מוכנה להורדה!\nרענן כדי להוריד עכשיו, או באופן אוטומטי כאשר תסגור את האפליקציה."
"message": "Modrinth App v{version} מוכנה להורדה!\nיש לרענן כדי לעדכן עכשיו, או באופן אוטומטי בעת סגירת האפליקציה."
},
"app.update-toast.body.download-complete": {
"message": "Modrinth App גרסה {version} סיימה את תהליך ההורדה. רענן כדי לעדכן עכשיו, או באופן אוטומטי כאשר תסגור את האפליקציה."
"message": "Modrinth App v{version} סיימה את תהליך ההורדה. יש לרענן כדי לעדכן עכשיו, או באופן אוטומטי בעת סגירת האפליקציה."
},
"app.update-toast.body.linux": {
"message": "Modrinth App v{version} זמין. יש להשתמש במנהל חבילות שלך כדי לעדכן בשביל התכונות החדשות ותיקונים!"
},
"app.update-toast.body.metered": {
"message": "אפליקצית מודרינת' גרסה {version} זמינה עכשיו! מכיוון שאתה על נתונים, אנחנו לא הורדנו אותה אוטומטית."
"message": "Modrinth App v{version} זמינה עכשיו! בגלל החיבור לפי שימוש, לא הורדנו אותה אוטומטית."
},
"app.update-toast.changelog": {
"message": "יומן שינויים"
},
"app.update-toast.download": {
"message": "הורד ({size})"
"message": "הורדה ({size})"
},
"app.update-toast.download-page": {
"message": "הורד"
},
"app.update-toast.downloading": {
"message": "מוריד..."
@@ -51,29 +117,83 @@
"message": "הורדה הושלמה"
},
"app.update.complete-toast.text": {
"message": "לחץ כאן כדי לראות את יומן השינויים."
"message": "לחיצה כדי לראות את יומן השינויים."
},
"app.update.complete-toast.title": {
"message": "גרסה {version} הותקנה בהצלחה!"
},
"app.update.download-update": {
"message": "הורד עדכון"
"message": "הורדת עדכון"
},
"app.update.downloading-update": {
"message": "מוריד עדכון ({percent}%)"
},
"app.update.reload-to-update": {
"message": "רענן בכדי להתקין את העדכונים"
"message": "צריך לרענן כדי להתקין את העדכון"
},
"friends.action.add-friend": {
"message": "הוספת חבר"
},
"friends.action.view-friend-requests": {
"message": "{count, plural, one {בקשת חברות אחת} other {# בקשות חברות}}"
},
"friends.add-friend.submit": {
"message": "שליחת בקשת חברות"
},
"friends.add-friend.title": {
"message": "הוספת חבר"
},
"friends.add-friend.username.description": {
"message": "זה יכול להיות שונה מהמשתמש Minecraft!"
},
"friends.add-friend.username.placeholder": {
"message": "שם משתמש Modrinth..."
},
"friends.add-friend.username.title": {
"message": "מה השם משתמש של החבר שלך בModrinth?"
},
"friends.add-friends-to-share": {
"message": "<link>הוסף חברים</link> כדי לראות במה הם משחקים!"
"message": "ניתן <link>להוסיף חברים</link> כדי לראות במה הם משחקים!"
},
"friends.friend.cancel-request": {
"message": "ביטול בקשה"
},
"friends.friend.remove-friend": {
"message": "הסרת חבר"
},
"friends.friend.request-sent": {
"message": "בקשת חברות נשלחה"
},
"friends.friend.view-profile": {
"message": "הצגת פרופיל"
},
"friends.heading": {
"message": "חברים"
},
"friends.heading.active": {
"message": "פעיל"
},
"friends.heading.offline": {
"message": "לא מקוון"
},
"friends.heading.online": {
"message": "מחובר"
},
"friends.heading.pending": {
"message": "ממתין"
},
"friends.no-friends-match": {
"message": "אין חברים התואמים ל \"{query}\""
},
"friends.search-friends-placeholder": {
"message": "חיפוש חברים..."
},
"friends.section.heading": {
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "אפשר <link>להתחבר לחשבון Modrinth</link> כדי להוסיף חברים ולראות במה הם משחקים!"
},
"instance.add-server.add-and-play": {
"message": "הוסף ושחק"
},
@@ -90,7 +210,7 @@
"message": "שאל"
},
"instance.add-server.title": {
"message": "הוסף שרת"
"message": "הוספת שרת"
},
"instance.edit-server.title": {
"message": "ערוך שרת"
@@ -102,7 +222,7 @@
"message": "שם"
},
"instance.edit-world.placeholder-name": {
"message": "עולם מיינקראפט"
"message": "עולם Minecraft"
},
"instance.edit-world.reset-icon": {
"message": "אפס סמל"
@@ -156,28 +276,28 @@
"message": "יוצר עותק של התקנה זו, כולל עולמות, הגדרות, מודים, וכדומה."
},
"instance.settings.tabs.general.edit-icon": {
"message": "ערוך סמל"
"message": "עריכת סמל"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "הסר סמל"
"message": "הסרת סמל"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "החלף סמל"
"message": "החלפת סמל"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "בחר סמל"
"message": "בחירת סמל"
},
"instance.settings.tabs.general.library-groups": {
"message": "קבוצות ספרייה"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "צור קבוצה חדשה"
"message": "יצירת קבוצה חדשה"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "קבוצות ספרייה מאפשרות לך לארגן את ההתקנות שלך לחלקים שונים בספרייה שלך."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "הכנס שם קבוצה"
"message": "שם קבוצה"
},
"instance.settings.tabs.general.name": {
"message": "שם"
@@ -216,7 +336,7 @@
"message": "מעטפת"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "פקודת מעטפת להפעלת מיינקראפט."
"message": "פקודת מעטפת להפעלת Minecraft."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "הכנס פקודת מעטפת..."
@@ -225,13 +345,13 @@
"message": "התקנה"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} בשביל מיינקראפט {game_version} כבר מותקן"
"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": נה גרסה"
"message": ינוי גרסה"
},
"instance.settings.tabs.installation.change-version.button.install": {
"message": "התקן"
@@ -267,16 +387,16 @@
"message": "{loader} גרסה"
},
"instance.settings.tabs.installation.minecraft-version": {
"message": "מיינקראפט {version}"
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "לא ניתן לאחזר את פרטי חבילת המודים המקושרת. אנא בדוק את חיבור האינטרנט שלך."
"message": "לא ניתן לאחזר את פרטי חבילת המודים המקושרת. יש לבדוק את חיבור האינטרנט שלך."
},
"instance.settings.tabs.installation.no-loader-versions": {
"message": "{loader} אינו זמין עבור מיינקראפט {version}. אנא נסה טוען מודים אחר."
"message": "{loader} אינו זמין עבור Minecraft {version}. אנא נסה טוען מודים אחר."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "התקנה זאת מקושרת לחבילת מודים, אך חבילת המודים לא נמצאה במודרינת'."
"message": "התקנה זאת מקושרת לחבילת מודים, אך חבילת המודים לא נמצאה בModrinth."
},
"instance.settings.tabs.installation.platform": {
"message": "פלטפורמה"
@@ -309,7 +429,7 @@
"message": "התיקון מתקין מחדש את התלויות של מיינקראפט ובודק דברים מקולקלים. פעולה זו עשויה לפתור בעיות שמונעות את הפעלת המשחק עקב שגיאות הקשורות למשגר, אך לא תפתור בעיות או קריסות הקשורות למודים המותקנים."
},
"instance.settings.tabs.installation.repair.confirm.title": {
"message": "תקן"
"message": "לתקן את המכונה?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "תיקון בתהליך"
@@ -407,9 +527,6 @@
"instance.settings.tabs.window.width.enter": {
"message": "הכנס רוחב..."
},
"instance.settings.title": {
"message": "הגדרות"
},
"instance.worlds.a_minecraft_server": {
"message": "שרת מיינקראפט"
},
@@ -1,95 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "विकासकर्ता विधि सक्रिय की गई।"
},
"app.settings.tabs.appearance": {
"message": "स्वरूप"
},
"app.settings.tabs.default-instance-options": {
"message": "पूर्वनिर्धारित प्रतिरूप विकल्प"
},
"app.settings.tabs.feature-flags": {
"message": "विशेषता ध्वज"
},
"app.settings.tabs.java-installations": {
"message": "जावा संस्थापना"
},
"app.settings.tabs.privacy": {
"message": "गोपनीयता"
},
"app.settings.tabs.resource-management": {
"message": "संसाधन प्रबंधन"
},
"instance.add-server.add-and-play": {
"message": "जोड़ें एवं चलाएँ"
},
"instance.add-server.add-server": {
"message": "सेवक जोड़ें"
},
"instance.add-server.resource-pack.disabled": {
"message": "निष्क्रिय"
},
"instance.add-server.resource-pack.enabled": {
"message": "सक्रिय"
},
"instance.add-server.resource-pack.prompt": {
"message": "प्रेरणा"
},
"instance.add-server.title": {
"message": "एक सेवक जोड़ें"
},
"instance.edit-server.title": {
"message": "सेवक का सम्पादन करें"
},
"instance.edit-world.name": {
"message": "Nam"
},
"instance.edit-world.placeholder-name": {
"message": "Minecraft ki dunia"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "चिह्न हटाएँ"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "चिह्न संपादित करें"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "चिह्न चुनें"
},
"instance.settings.tabs.general.library-groups": {
"message": "पुस्तकालय समूह"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "नया समूह बनाएं"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "लाइब्रेरी समूह आपको अपने इंस्टैंस को अपनी लाइब्रेरी में विभिन्न अनुभाग में व्यवस्थित करने की अनुमति देते हैं।"
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "समूह का नाम दर्ज करें"
},
"instance.settings.tabs.general.name": {
"message": "नाम"
},
"instance.settings.tabs.hooks": {
"message": "हुक लॉन्च करें"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "कस्टम लाँच हुक्स"
},
"instance.settings.tabs.hooks.description": {
"message": "हुक्स उन्नत उपयोगकर्ताओं को गेम लॉन्च करने से पहले और बाद में कुछ सिस्टम कमांड चलाने की अनुमति देते हैं।"
},
"instance.settings.tabs.hooks.post-exit": {
"message": "पोस्ट-एक्ज़िट"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "खेल समाप्त होने के बाद चला।"
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "पोस्ट-एग्जिट कमांड दर्ज करें..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "पूर्व-लाँच"
}
}
@@ -1 +0,0 @@
{}
+111 -48
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "A Minecraft hitelesítő szerverek lehet, hogy nem üzemelnek. Bizonyosodj meg róla, hogy van internetkapcsolatod és próbáld meg újra."
},
"app.auth-servers.unreachable.header": {
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
},
"app.modal.install-to-play.header": {
"message": "Töltsd le a játékhoz"
},
"app.modal.install-to-play.install-button": {
"message": "Telepítés"
},
"app.modal.install-to-play.mod-count": {
"message": "# mod"
},
"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."
},
"app.modal.install-to-play.shared-instance": {
"message": "Megosztott profil"
},
"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.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."
},
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Telepített Java példányok"
},
"app.settings.tabs.language": {
"message": "Nyelv"
},
"app.settings.tabs.privacy": {
"message": "Adatvédelem"
},
@@ -29,6 +89,9 @@
"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-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-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."
},
@@ -38,6 +101,9 @@
"app.update-toast.download": {
"message": "Letöltés ({size})"
},
"app.update-toast.download-page": {
"message": "Letöltés"
},
"app.update-toast.downloading": {
"message": "Letöltés..."
},
@@ -126,10 +192,10 @@
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Lépj be Modrinth fiókba</link>, hogy felvehess barátokat és lásd mivel játszanak!"
"message": "<link>Lépj be Modrinth fiókodba</link>, hogy felvehess barátokat és lásd mivel játszanak!"
},
"instance.add-server.add-and-play": {
"message": "Hozzáadás és játék"
"message": "Hozzáadás és csatlakozás"
},
"instance.add-server.add-server": {
"message": "Szerver hozzáadása"
@@ -141,7 +207,7 @@
"message": "Engedélyezve"
},
"instance.add-server.resource-pack.prompt": {
"message": "Kérdezzen"
"message": "Mindig kérdezzen"
},
"instance.add-server.title": {
"message": "Adjon hozzá egy szervert"
@@ -186,13 +252,13 @@
"message": "Általános"
},
"instance.settings.tabs.general.delete": {
"message": "Példány törlése"
"message": "Profil törlése"
},
"instance.settings.tabs.general.delete.button": {
"message": "Példány törlése"
"message": "Profil törlése"
},
"instance.settings.tabs.general.delete.description": {
"message": "Örökké eltávolít egy példányt az eszközről, beleértve a világait, beállításait és minden telepített tartalmat. Legyen óvatos, mert ha egyszer kitöröl egy példányt azt többé nem lehet visszaállítani."
"message": "Örökké eltávolít egy profilt az eszközről, beleértve a világait, beállításait és minden telepített tartalmat. Legyen óvatos, mert ha egyszer kitöröl egy profilt, azt többé nem lehet visszaállítani."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Törlés..."
@@ -204,10 +270,10 @@
"message": "Telepítés közben nem lehet duplikálni."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Példány duplikálása"
"message": "Profil duplikálása"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Készít egy másolatot erről a példányról, beleértve a világokat, beállításokat, modokat, stb."
"message": "Készít egy másolatot erről a profilról, beleértve a világokat, beállításokat, modokat, stb."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Ikon szerkesztése"
@@ -225,10 +291,10 @@
"message": "Könyvtár gyűjtemények"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Új gyűjtemény létrehozása"
"message": "Új csoport létrehozása"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "A könyvtár gyűjtemények segítenek külön kategóriákba rendszerezni a profiljait."
"message": "A könyvtárgyűjtemények segítenek külön kategóriákba rendszerezni a profiljait."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Adja meg a gyűjtemény nevét"
@@ -249,7 +315,7 @@
"message": "Kilépés után"
},
"instance.settings.tabs.hooks.post-exit.description": {
"message": "Játék bezárása után fut."
"message": "A játék bezárása után fut."
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "Írjon be kilépés utáni parancsokat..."
@@ -258,28 +324,28 @@
"message": "Indítás előtt"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Futtatás a példány futtatása előtt."
"message": "Futtatás a profil futtatása előtt."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Írjon be indítás előtti parancsokat..."
},
"instance.settings.tabs.hooks.title": {
"message": "Játék indítási parancsok"
"message": "Játék indítási horgok"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Indítóparancs"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "Wrapper kommand a Minecraft elindításához."
"message": "Indítóparancs a Minecraft elindításához."
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "Írd ide a wrapper kommandot..."
"message": "Írjon ide indítóparancsot..."
},
"instance.settings.tabs.installation": {
"message": "Telepítés"
},
"instance.settings.tabs.installation.change-version.already-installed.modded": {
"message": "{platform} {version} a Minecraft-hoz {game_version} már telepítve van"
"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"
@@ -315,7 +381,7 @@
"message": "Telepítés"
},
"instance.settings.tabs.installation.install.in-progress": {
"message": "A telepítés folyamatban"
"message": "Telepítés folyamatban"
},
"instance.settings.tabs.installation.loader-version": {
"message": "{loader} verzió"
@@ -327,10 +393,10 @@
"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 loader-t."
"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 \"Példányod\" linkelve van egy Modrinth modpack-hoz, de a modpack nem található online."
"message": "A profilod linkelve van egy Modrinth modcsomaghoz, de a modcsomag nem található Modrinth-on."
},
"instance.settings.tabs.installation.platform": {
"message": "Platform"
@@ -342,13 +408,13 @@
"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 modpack á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 korruptálódhatnak."
"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 példányt?"
"message": "Biztosan szeretnéd újratelepíteni ezt a profilt?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Visszaállítja a Példányod tartalmát az eredeti állapotába, eltávolítva az eredeti modpackhoz hozzáadott összes modot és tartalmat."
"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"
@@ -357,13 +423,13 @@
"message": "Javítás"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Javítás"
"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 launcherrel kapcsolatos hibák miatt nem indul el, de nem oldja meg a telepített modokkal kapcsolatos problémákat vagy összeomlásokat."
"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": "Példány javítása?"
"message": "Profil javítása?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Javítás folyamatban"
@@ -387,28 +453,28 @@
"message": "javítás"
},
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
"message": "Nem lehet {action} telepítés közben"
"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} végrehajtani"
"message": "Offline állapotban nem lehet {action}-t végrehajtani"
},
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
"message": "Nem lehet {action} javítás közben"
"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": "Példány leválasztása"
"message": "Profil leválasztása"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": ""
"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 szeretné ezt az példányt leválasztani?"
"message": "Biztosan le szeretnéd választani ezt a profilt?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Ez az példány egy modpackhoz van kapcsolva, ami azt jelenti, hogy a modok nem frissíthetőek, és nem lehet megváltoztatni a mod betöltőt vagy a Minecraft verziót. A kapcsolódás megszüntetése véglegesen leválasztja ezt a példányt a modpackről."
"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"
@@ -420,7 +486,7 @@
"message": "Környezeti változók"
},
"instance.settings.tabs.java.hooks": {
"message": "Hookok"
"message": "Horgok"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Java argumentumok"
@@ -438,7 +504,7 @@
"message": "Egyedi ablak beállítások"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Teljesképernyő"
"message": "Teljes képernyő"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "A játék indításakor teljes képernyős módban indítsa el (az options.txt fájl segítségével)."
@@ -459,10 +525,7 @@
"message": "A játék ablakának szélessége indításkor."
},
"instance.settings.tabs.window.width.enter": {
"message": "Hosszúság megadása..."
},
"instance.settings.title": {
"message": "Beállítások"
"message": "Szélesség megadása..."
},
"instance.worlds.a_minecraft_server": {
"message": "Egy Minecraft szerver"
@@ -480,7 +543,7 @@
"message": "Elérhető"
},
"instance.worlds.game_already_open": {
"message": "Példány már megnyitva"
"message": "A profil már meg van nyitva"
},
"instance.worlds.hardcore": {
"message": "Hardcore mód"
@@ -489,22 +552,22 @@
"message": "A Szerver nem kompatibilis"
},
"instance.worlds.no_contact": {
"message": "A szerverrel nem lehet kapcsolatott létesíteni"
"message": "Nem lehet kapcsolatot létesíteni a szerverrel"
},
"instance.worlds.no_server_quick_play": {
"message": "Csak Minecraft Alpha 1.0.5+ tól tudsz egyből szerverhez csatlakozni"
"message": "Csak Minecraft Alpha 1.0.5+-tól tudsz egyből szerverhez csatlakozni"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Csak Minecraft 1.20+ tól tudsz egyből egyjátékos világba belépni"
"message": "Csak Minecraft 1.20+-tól tudsz egyből egyjátékos világba belépni"
},
"instance.worlds.play_instance": {
"message": "Példány "
"message": "Játék a profillal"
},
"instance.worlds.type.server": {
"message": "Szerver"
},
"instance.worlds.type.singleplayer": {
"message": "Egyjátékos"
"message": "Egyjátékosmód"
},
"instance.worlds.view_instance": {
"message": "Profil megtekintése"
@@ -513,15 +576,15 @@
"message": "A világ használatban van"
},
"search.filter.locked.instance": {
"message": "Profil által van megadva"
"message": "A profil által van megadva"
},
"search.filter.locked.instance-game-version.title": {
"message": "A játék verzió a profil által van megadva"
"message": "A játékverzió a profil által van megadva"
},
"search.filter.locked.instance-loader.title": {
"message": "A betöltő a profil által van megadva"
"message": "A modbetöltő a profil által van megadva"
},
"search.filter.locked.instance.sync": {
"message": "Profil Szinkronizálása"
"message": "Profil szinkronizálása"
}
}
+114 -51
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "Server autentikasi Minecraft mungkin sedang tidak tersedia saat ini. Periksa koneksi internet Anda dan coba lagi nanti."
},
"app.auth-servers.unreachable.header": {
"message": "Tidak dapat terhubung ke server autentikasi"
},
"app.modal.install-to-play.header": {
"message": "Pasang untuk memainkan"
},
"app.modal.install-to-play.install-button": {
"message": "Pasang"
},
"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.shared-by-today": {
"message": "{name} membagikan instans ini dengan Anda hari ini."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instans terbagi"
},
"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.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."
},
@@ -9,7 +66,7 @@
"message": "Tampilan"
},
"app.settings.tabs.default-instance-options": {
"message": "Pilihan wujud asali"
"message": "Pilihan instans bawaan"
},
"app.settings.tabs.feature-flags": {
"message": "Bendera fitur"
@@ -17,6 +74,9 @@
"app.settings.tabs.java-installations": {
"message": "Pemasangan Java"
},
"app.settings.tabs.language": {
"message": "Bahasa"
},
"app.settings.tabs.privacy": {
"message": "Privasi"
},
@@ -29,15 +89,21 @@
"app.update-toast.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": {
"message": "Modrinth App v{version} tersedia. Gunakan pengelola paket Anda untuk memperbarui dan mendapatkan fitur-fitur dan perbaikan terbaru!"
},
"app.update-toast.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": {
"message": "Log perubahan"
"message": "Catatan perubahan"
},
"app.update-toast.download": {
"message": "Unduh ({size})"
},
"app.update-toast.download-page": {
"message": "Unduh"
},
"app.update-toast.downloading": {
"message": "Mengunduh..."
},
@@ -51,7 +117,7 @@
"message": "Selesai mengunduh"
},
"app.update.complete-toast.text": {
"message": "Klik di sini untuk melihat log perubahan."
"message": "Klik di sini untuk melihat catatan perubahan."
},
"app.update.complete-toast.title": {
"message": "Versi {version} berhasil dipasang!"
@@ -84,7 +150,7 @@
"message": "Masukkan nama pengguna Modrinth..."
},
"friends.add-friend.username.title": {
"message": "Apakah nama pengguna Modrinth teman Anda?"
"message": "Apa nama pengguna Modrinth teman Anda?"
},
"friends.add-friends-to-share": {
"message": "<link>Tambah teman</link> untuk melihat apa yang mereka mainkan!"
@@ -132,7 +198,7 @@
"message": "Tambah dan mainkan"
},
"instance.add-server.add-server": {
"message": "Tambah peladen"
"message": "Tambah server"
},
"instance.add-server.resource-pack.disabled": {
"message": "Dimatikan"
@@ -144,10 +210,10 @@
"message": "Konfirmasi"
},
"instance.add-server.title": {
"message": "Tambah peladen"
"message": "Tambah server"
},
"instance.edit-server.title": {
"message": "Sunting peladen"
"message": "Sunting server"
},
"instance.edit-world.hide-from-home": {
"message": "Sembunyikan dari Beranda"
@@ -177,7 +243,7 @@
"message": "Nama"
},
"instance.server-modal.placeholder-name": {
"message": "Peladen Minecraft"
"message": "Server Minecraft"
},
"instance.server-modal.resource-pack": {
"message": "Paket sumber"
@@ -186,13 +252,13 @@
"message": "Umum"
},
"instance.settings.tabs.general.delete": {
"message": "Hapus wujud"
"message": "Hapus instans"
},
"instance.settings.tabs.general.delete.button": {
"message": "Hapus wujud"
"message": "Hapus instans"
},
"instance.settings.tabs.general.delete.description": {
"message": "Menghapus wujud secara permanen dari perangkat Anda, termasuk dunia, konfigurasi, dan konten terpasang Anda. Berhati-hatilah, karena Anda tidak dapat memulihkan wujud yang telah dihapus."
"message": "Menghapus instans secara permanen dari perangkat Anda, termasuk dunia, konfigurasi, dan konten terpasang Anda. Berhati-hatilah, karena Anda tidak dapat memulihkan instans yang telah dihapus."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Menghapus..."
@@ -204,10 +270,10 @@
"message": "Tidak dapat menggandakan saat memasang."
},
"instance.settings.tabs.general.duplicate-instance": {
"message": "Gandakan wujud"
"message": "Gandakan instans"
},
"instance.settings.tabs.general.duplicate-instance.description": {
"message": "Membuat salinan dari wujud ini, termasuk dunia, konfig, modifikasi, dsb."
"message": "Membuat salinan dari instans ini, termasuk dunia, konfigurasi, mod, dsb."
},
"instance.settings.tabs.general.edit-icon": {
"message": "Sunting ikon"
@@ -228,7 +294,7 @@
"message": "Buat kelompok baru"
},
"instance.settings.tabs.general.library-groups.description": {
"message": "Pengelompokan koleksi membolehkan Anda mengorganisasi wujud ke dalam bagian-bagian berbeda dalam koleksi Anda."
"message": "Pengelompokan koleksi membolehkan Anda mengorganisasi instans ke dalam bagian-bagian berbeda dalam koleksi Anda."
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Masukkan nama kelompok"
@@ -240,7 +306,7 @@
"message": "Luncurkan kait"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Luncurkan kait ubah suaian"
"message": "Luncurkan kait tersuai"
},
"instance.settings.tabs.hooks.description": {
"message": "Kait membolehkan pengguna ahli untuk menjalankan beberapa perintah sistem sebelum dan setelah meluncurkan permainan."
@@ -258,7 +324,7 @@
"message": "Praluncur"
},
"instance.settings.tabs.hooks.pre-launch.description": {
"message": "Berjalan sebelum wujud diluncurkan."
"message": "Berjalan sebelum instans diluncurkan."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Masukkan perintah praluncur..."
@@ -294,7 +360,7 @@
"message": "Memasang"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Memperoleh versi paket modifikasi"
"message": "Memperoleh versi paket mod"
},
"instance.settings.tabs.installation.change-version.in-progress": {
"message": "Memasang versi baru"
@@ -306,7 +372,7 @@
"message": "Informasi awakutu:"
},
"instance.settings.tabs.installation.fetching-modpack-details": {
"message": "Memperoleh perincian paket modifikasi"
"message": "Memperoleh perincian paket mod"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versi permainan"
@@ -324,34 +390,34 @@
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Tidak dapat memperoleh perincian paket modifikasi terkait. Mohon periksa sambungan internet Anda."
"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 modifikasi yang lain."
"message": "{loader} tidak tersedia untuk Minecraft {version}. Mohon coba peluncur mod yang lain."
},
"instance.settings.tabs.installation.no-modpack-found": {
"message": "Wujud ini berkaitan dengan paket modifikasi, tetapi paket modifikasi tersebut tidak dapat ditemukan pada Modrinth."
"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 modifikasi"
"message": "Pasang ulang paket mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Memasang ulang paket modifikasi"
"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 modifikasi, menghapus modifikasi atau konten apa pun yang telah Anda tambahkan di atas pemasangan awal. Hal ini dapat memperbaiki perilaku tidak terduga bila ada perubahan pada wujud, tetapi bila dunia Anda sekarang bergantung pada konten terpasang tambahan, hal ini dapat merusak dunia yang ada."
"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 wujud ini?"
"message": "Apakah Anda yakin ingin memasang ulang instans ini?"
},
"instance.settings.tabs.installation.reinstall.description": {
"message": "Mengatur ulang konten wujud menjadi keadaan awal, menghapus modifikasi atau konten apa pun yang telah Anda tambahkan di atas pemasangan awal."
"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 modifikasi"
"message": "Pasang ulang paket mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Perbaiki"
@@ -360,10 +426,10 @@
"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 modifikasi terpasang."
"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 wujud?"
"message": "Perbaiki instans?"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Perbaikan sedang berlangsung"
@@ -399,19 +465,19 @@
"message": "(versi tidak dikenal)"
},
"instance.settings.tabs.installation.unlink.button": {
"message": "Lepas kaitan wujud"
"message": "Lepas kaitan instans"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Bila Anda melanjutkan, Anda tidak akan dapat mengaitkannya lagi tanpa membuat wujud baru. Anda tidak akan mendapatkan pembaruan paket modifikasi dan menjadi wujud normal."
"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 wujud ini?"
"message": "Apakah Anda yakin ingin melepas kaitan instans ini?"
},
"instance.settings.tabs.installation.unlink.description": {
"message": "Wujud ini berkaitan dengan paket modifikasi, yang berarti modifikasi tidak dapat diperbarui dan Anda tidak dapat mengubah versi peluncur modifikasi atau Minecraft. Melepas kaitan akan memutuskan wujud ini dari paket modifikasi secara permanen."
"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 modifikasi"
"message": "Lepas kaitan dari paket mod"
},
"instance.settings.tabs.java": {
"message": "Java dan memori"
@@ -435,7 +501,7 @@
"message": "Jendela"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Pengaturan jendela ubah suaian"
"message": "Pengaturan jendela tersuai"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Layar penuh"
@@ -461,14 +527,11 @@
"instance.settings.tabs.window.width.enter": {
"message": "Masukkan lebar..."
},
"instance.settings.title": {
"message": "Pengaturan"
},
"instance.worlds.a_minecraft_server": {
"message": "Peladen Minecraft"
"message": "Server Minecraft"
},
"instance.worlds.cant_connect": {
"message": "Tidak dapat menghubungkan ke peladen"
"message": "Tidak dapat menghubungkan ke server"
},
"instance.worlds.copy_address": {
"message": "Salin alamat"
@@ -480,48 +543,48 @@
"message": "Tersedia"
},
"instance.worlds.game_already_open": {
"message": "Wujud telah dibuka"
"message": "Instans telah dibuka"
},
"instance.worlds.hardcore": {
"message": "Mode Menantang"
},
"instance.worlds.incompatible_server": {
"message": "Peladen tidak cocok"
"message": "Server tidak cocok"
},
"instance.worlds.no_contact": {
"message": "Peladen tidak dapat dihubungi"
"message": "Server tidak dapat dihubungi"
},
"instance.worlds.no_server_quick_play": {
"message": "Anda hanya dapat memasuki peladen secara langsung pada Minecraft versi Alpha 1.0.5 ke atas"
"message": "Anda hanya dapat memasuki server secara langsung pada Minecraft versi Alpha 1.0.5 ke atas"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "Anda hanya dapat memasuki dunia bermain sendiri secara langsung pada Minecraft versi Alpha 1.20 ke atas"
},
"instance.worlds.play_instance": {
"message": "Mainkan wujud"
"message": "Mainkan instans"
},
"instance.worlds.type.server": {
"message": "Peladen"
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Bermain sendiri"
},
"instance.worlds.view_instance": {
"message": "Lihat wujud"
"message": "Lihat instans"
},
"instance.worlds.world_in_use": {
"message": "Dunia sedang dimainkan"
},
"search.filter.locked.instance": {
"message": "Disediakan oleh wujud"
"message": "Disediakan oleh instans"
},
"search.filter.locked.instance-game-version.title": {
"message": "Versi permainan disediakan oleh wujud"
"message": "Versi permainan disediakan oleh instans"
},
"search.filter.locked.instance-loader.title": {
"message": "Pemuat disediakan oleh wujud"
"message": "Pemuat disediakan oleh instans"
},
"search.filter.locked.instance.sync": {
"message": "Sinkronkan dengan wujud"
"message": "Sinkronkan dengan instans"
}
}
@@ -1,170 +0,0 @@
{
"app.settings.developer-mode-enabled": {
"message": "Kveikt er á forritaraham."
},
"app.settings.tabs.appearance": {
"message": "Útlit"
},
"app.settings.tabs.feature-flags": {
"message": "Virknirofar"
},
"app.settings.tabs.java-installations": {
"message": "Java uppsetningar"
},
"app.settings.tabs.privacy": {
"message": "Persónuvernd"
},
"instance.add-server.add-and-play": {
"message": "Bæta við og spila"
},
"instance.add-server.add-server": {
"message": "Bæta við þjóni"
},
"instance.add-server.resource-pack.disabled": {
"message": "Óvirkt"
},
"instance.add-server.resource-pack.enabled": {
"message": "Virkt"
},
"instance.add-server.resource-pack.prompt": {
"message": "Spyrja"
},
"instance.add-server.title": {
"message": "Bæta við þjóni"
},
"instance.edit-server.title": {
"message": "Breyta þjóni"
},
"instance.edit-world.hide-from-home": {
"message": "Fela frá Heimasíðu"
},
"instance.edit-world.name": {
"message": "Nafn"
},
"instance.edit-world.placeholder-name": {
"message": "Nýr Heimur"
},
"instance.edit-world.reset-icon": {
"message": "Endursetja táknmynd"
},
"instance.edit-world.title": {
"message": "Breyta heim"
},
"instance.filter.updates-available": {
"message": "Uppfærslur mögulegar"
},
"instance.server-modal.address": {
"message": "Vistfang þjóns"
},
"instance.server-modal.name": {
"message": "Nafn þjóns"
},
"instance.server-modal.placeholder-name": {
"message": "Minecraft Netþjónn"
},
"instance.settings.tabs.general.deleting.button": {
"message": "Eyðir..."
},
"instance.settings.tabs.general.duplicate-button": {
"message": "Tvöfalda"
},
"instance.settings.tabs.general.edit-icon": {
"message": "Breyta táknmynd"
},
"instance.settings.tabs.general.edit-icon.remove": {
"message": "Fjarlægja táknmynd"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "Skipta út táknmynd"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "Velja táknmynd"
},
"instance.settings.tabs.general.library-groups.create": {
"message": "Búa til nýjan hóp"
},
"instance.settings.tabs.general.library-groups.enter-name": {
"message": "Sláðu inn hópnafn"
},
"instance.settings.tabs.general.name": {
"message": "Nafn"
},
"instance.settings.tabs.hooks": {
"message": "Ræsikrókar"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Sérsniðnir ræsikrókar"
},
"instance.settings.tabs.installation": {
"message": "Uppsetning"
},
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
"message": "Minecraft Vanilla {game_version} er nú þegar sett upp"
},
"instance.settings.tabs.installation.game-version": {
"message": "Leikjaútgafa"
},
"instance.settings.tabs.installation.install": {
"message": "Setja upp"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Gera við"
},
"instance.settings.tabs.installation.repair.button.repairing": {
"message": "Gerir við"
},
"instance.settings.tabs.installation.repair.in-progress": {
"message": "Verið er að gera við"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Endursetja til núverandi"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Sýna allar útgáfur"
},
"instance.settings.tabs.installation.unknown-version": {
"message": "(Óþekkt útgáfa)"
},
"instance.settings.tabs.java": {
"message": "Java og vinnsluminni"
},
"instance.settings.tabs.java.hooks": {
"message": "Krókar"
},
"instance.settings.tabs.java.java-installation": {
"message": "Java uppsetning"
},
"instance.settings.tabs.java.java-memory": {
"message": "Vinnsluminni gefið"
},
"instance.settings.tabs.window": {
"message": "Gluggi"
},
"instance.settings.tabs.window.custom-window-settings": {
"message": "Sérsniðnar gluggastillingar"
},
"instance.settings.tabs.window.fullscreen": {
"message": "Fullur skjár"
},
"instance.settings.tabs.window.height": {
"message": "Hæð"
},
"instance.settings.tabs.window.height.enter": {
"message": "Sláðu inn hæð..."
},
"instance.settings.tabs.window.width": {
"message": "Breidd"
},
"instance.settings.tabs.window.width.enter": {
"message": "Sláðu inn breidd..."
},
"instance.settings.title": {
"message": "Stillingar"
},
"instance.worlds.a_minecraft_server": {
"message": "Minecraft Netþjónn"
},
"instance.worlds.dont_show_on_home": {
"message": "Ekki sýna á heimasíðu"
}
}
+108 -45
View File
@@ -1,4 +1,61 @@
{
"app.auth-servers.unreachable.body": {
"message": "I server di autenticazione di Minecraft stanno riscontrando problemi. Controlla la tua connessione a Internet e riprova più tardi."
},
"app.auth-servers.unreachable.header": {
"message": "Impossibile raggiungere i server di autenticazione"
},
"app.modal.install-to-play.header": {
"message": "Installa per continuare"
},
"app.modal.install-to-play.install-button": {
"message": "Installa"
},
"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.shared-by-today": {
"message": "{name} ha condiviso questa istanza con te oggi."
},
"app.modal.install-to-play.shared-instance": {
"message": "Istanza condivisa"
},
"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.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."
},
@@ -9,35 +66,44 @@
"message": "Aspetto"
},
"app.settings.tabs.default-instance-options": {
"message": "Opzioni istanza predefinite"
"message": "Opzioni d'istanza predefinite"
},
"app.settings.tabs.feature-flags": {
"message": "Flag delle funzionalità"
"message": "Flag di funzionalità"
},
"app.settings.tabs.java-installations": {
"message": "Installazioni Java"
},
"app.settings.tabs.language": {
"message": "Lingua"
},
"app.settings.tabs.privacy": {
"message": "Privacy"
},
"app.settings.tabs.resource-management": {
"message": "Gestione risorse"
"message": "Gestione delle risorse"
},
"app.update-toast.body": {
"message": "Modrinth App v{version} è pronta per essere installata! Ricarica per aggiornare ora, altrimenti ciò avverrà in automatico alla chiusura di Modrinth App."
"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": {
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, altrimenti ciò avverrà in automatico alla chiusura di Modrinth App."
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
},
"app.update-toast.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": {
"message": "Modrinth App v{version} è ora disponibile! Poiché sei su una rete a consumo, non l'abbiamo scaricata automaticamente."
},
"app.update-toast.changelog": {
"message": "Changelog"
"message": "Novità"
},
"app.update-toast.download": {
"message": "Scarica ({size})"
},
"app.update-toast.download-page": {
"message": "Scarica"
},
"app.update-toast.downloading": {
"message": "Scaricando..."
},
@@ -51,7 +117,7 @@
"message": "Download completato"
},
"app.update.complete-toast.text": {
"message": "Clicca qui per leggere il changelog."
"message": "Consulta qui le ultime novità in inglese."
},
"app.update.complete-toast.title": {
"message": "La versione {version} è stata installata con successo!"
@@ -63,19 +129,19 @@
"message": "Scaricando aggiornamento ({percent}%)"
},
"app.update.reload-to-update": {
"message": "Ricarica per installare aggiornamento"
"message": "Ricarica per installare l'aggiornamento"
},
"friends.action.add-friend": {
"message": "Stringi un'amicizia"
},
"friends.action.view-friend-requests": {
"message": "{count} {count, plural, one {richiesta} other {richieste}} d'amicizia"
"message": "{count} {count, plural, one {richiesta} other {richieste}} d''amicizia"
},
"friends.add-friend.submit": {
"message": "Invia richiesta d'amicizia"
},
"friends.add-friend.title": {
"message": "Stringendo l'amicizia"
"message": "Stringere un'amicizia"
},
"friends.add-friend.username.description": {
"message": "Potrebbe essere diverso dal nome utente di Minecraft!"
@@ -87,7 +153,7 @@
"message": "Con quale utente Modrinth vuoi stringere l'amicizia?"
},
"friends.add-friends-to-share": {
"message": "<link>Stringi un'amicizia</link> per sapere a cosa stanno giocando!"
"message": "<link>Stringi un''amicizia</link> per sapere a cosa stanno giocando!"
},
"friends.friend.cancel-request": {
"message": "Annulla richiesta"
@@ -105,7 +171,7 @@
"message": "Amicizie"
},
"friends.heading.active": {
"message": "Attivo"
"message": "Presenti"
},
"friends.heading.offline": {
"message": "Offline"
@@ -117,7 +183,7 @@
"message": "In sospeso"
},
"friends.no-friends-match": {
"message": "Nessuna amicizia pertinente a ''{query}''"
"message": "Nessuna amicizia corrisponde a ''{query}''"
},
"friends.search-friends-placeholder": {
"message": "Cerca amicizie..."
@@ -126,7 +192,7 @@
"message": "{title} - {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Accedi all'account Modrinth</link> per stringere amicizie e sapere a cosa stanno giocando!"
"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"
@@ -150,7 +216,7 @@
"message": "Modifica server"
},
"instance.edit-world.hide-from-home": {
"message": "Nascondi dalla pagina Home"
"message": "Nascondi dalla pagina home"
},
"instance.edit-world.name": {
"message": "Nome"
@@ -180,7 +246,7 @@
"message": "Server di Minecraft"
},
"instance.server-modal.resource-pack": {
"message": "Pacchetto risorse"
"message": "Pacchetto di risorse"
},
"instance.settings.tabs.general": {
"message": "Generale"
@@ -192,7 +258,7 @@
"message": "Elimina istanza"
},
"instance.settings.tabs.general.delete.description": {
"message": "Elimina permanentemente un'istanza dal tuo dispositivo, compresi i tuoi mondi, file di configurazione, e tutto il contenuto installato. Fai attenzione: eliminata un'istanza non c'è modo di recuperarla."
"message": "Elimina permanentemente un'istanza dal tuo dispositivo, compresi i tuoi mondi, file di configurazione e tutto il contenuto installato. Fai attenzione: eliminata un'istanza non c'è modo di recuperarla."
},
"instance.settings.tabs.general.deleting.button": {
"message": "Eliminando..."
@@ -237,13 +303,13 @@
"message": "Nome"
},
"instance.settings.tabs.hooks": {
"message": "Appigli di lancio"
"message": "Hook di avvio"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "Appigli di lancio personalizzati"
"message": "Hook di avvio personalizzati"
},
"instance.settings.tabs.hooks.description": {
"message": "Gli appigli, o hook, permettono a utenti avanzati di eseguire comandi di sistema prima e dopo il lancio del gioco."
"message": "I hook permettono a utenti avanzati di eseguire comandi di sistema prima e dopo l'avvio del gioco."
},
"instance.settings.tabs.hooks.post-exit": {
"message": "Post-uscita"
@@ -261,10 +327,10 @@
"message": "Eseguito prima dell'avvio dell'istanza."
},
"instance.settings.tabs.hooks.pre-launch.enter": {
"message": "Inserisci comando pre-lancio..."
"message": "Inserisci comando pre-avvio..."
},
"instance.settings.tabs.hooks.title": {
"message": "Appigli all'avvio del gioco"
"message": "Hook all'avvio del gioco"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "Wrapper"
@@ -294,19 +360,19 @@
"message": "Installando"
},
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
"message": "Ottenendo versioni del modpack"
"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": "Già installato"
"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 modpack"
"message": "Ottenendo dettagli del pacchetto di mod"
},
"instance.settings.tabs.installation.game-version": {
"message": "Versione del gioco"
@@ -324,34 +390,34 @@
"message": "Minecraft {version}"
},
"instance.settings.tabs.installation.no-connection": {
"message": "Non è stato possibile ottenere i dettagli del modpack collegato. Si prega di verificare la connessione a internet."
"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 modpack, ma non è stato possibile trovarlo su Modrinth."
"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 modpack"
"message": "Reinstalla pacchetto di mod"
},
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
"message": "Reinstallando modpack"
"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 modpack, 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."
"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 modpack originale."
"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 modpack"
"message": "Reinstalla pacchetto di mod"
},
"instance.settings.tabs.installation.repair.button": {
"message": "Ripara"
@@ -369,7 +435,7 @@
"message": "Riparazione in corso"
},
"instance.settings.tabs.installation.reset-selections": {
"message": "Resetta a corrente"
"message": "Resetta ad attuale"
},
"instance.settings.tabs.installation.show-all-versions": {
"message": "Mostra tutte le versioni"
@@ -402,16 +468,16 @@
"message": "Scollega istanza"
},
"instance.settings.tabs.installation.unlink.confirm.description": {
"message": "Se procedi, non potrai ricollegarla senza creare una nuova istanza da zero. Non riceverai più aggiornamenti dal modpack e diventerà una normale installazione."
"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 modpack, 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 modpack."
"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 modpack"
"message": "Scollega dal pacchetto di mod"
},
"instance.settings.tabs.java": {
"message": "Java e memoria"
@@ -420,7 +486,7 @@
"message": "Variabili d'ambiente"
},
"instance.settings.tabs.java.hooks": {
"message": "Appigli"
"message": "Hook"
},
"instance.settings.tabs.java.java-arguments": {
"message": "Argomenti Java"
@@ -461,11 +527,8 @@
"instance.settings.tabs.window.width.enter": {
"message": "Inserisci larghezza..."
},
"instance.settings.title": {
"message": "Impostazioni"
},
"instance.worlds.a_minecraft_server": {
"message": "Un Server Minecraft"
"message": "Un server Minecraft"
},
"instance.worlds.cant_connect": {
"message": "Impossibile connettersi al server"
@@ -474,7 +537,7 @@
"message": "Copia indirizzo"
},
"instance.worlds.dont_show_on_home": {
"message": "Non mostrare nella Home"
"message": "Non mostrare nella home"
},
"instance.worlds.filter.available": {
"message": "Disponibile"
@@ -492,10 +555,10 @@
"message": "Impossibile contattare il server"
},
"instance.worlds.no_server_quick_play": {
"message": "È possibile avviare direttamente un server solo su Minecraft Alpha 1.0.5+"
"message": "È possibile avviare un server direttamente solo su Minecraft Alpha 1.0.5+"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "È possibile avviare direttamente un mondo in Giocatore Singolo solo su Minecraft 1.20+"
"message": "È possibile avviare direttamente un mondo in giocatore singolo solo su Minecraft 1.20+"
},
"instance.worlds.play_instance": {
"message": "Gioca istanza"
@@ -504,7 +567,7 @@
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Giocatore Singolo"
"message": "Giocatore singolo"
},
"instance.worlds.view_instance": {
"message": "Mostra istanza"

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