mirror of
https://github.com/modrinth/code.git
synced 2026-07-31 21:26:40 +00:00
Compare commits
227
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16fcd67029 | ||
|
|
086508be23 | ||
|
|
8b04303eca | ||
|
|
2b8175ad66 | ||
|
|
0c98f6bf45 | ||
|
|
9a8712c76e | ||
|
|
f62c60a681 | ||
|
|
9b2f0c88cd | ||
|
|
01b8ee6909 | ||
|
|
5a51a755eb | ||
|
|
4cfac2c8a2 | ||
|
|
f6fcdd336f | ||
|
|
5594771ad8 | ||
|
|
5d04992a28 | ||
|
|
c9c8079853 | ||
|
|
97051cc64d | ||
|
|
0a04478149 | ||
|
|
789ec8966c | ||
|
|
51a83b4536 | ||
|
|
73abe272d1 | ||
|
|
4a0c610fc5 | ||
|
|
913dee9090 | ||
|
|
43eb53eda5 | ||
|
|
c381adff85 | ||
|
|
ace2659861 | ||
|
|
507d03eeba | ||
|
|
d4932d3089 | ||
|
|
4b6de7526c | ||
|
|
b95e4ced22 | ||
|
|
200b4f56c6 | ||
|
|
83d53dafe7 | ||
|
|
98175a58a6 | ||
|
|
20cbe1ad8f | ||
|
|
9d5d34fde8 | ||
|
|
2d5c26896f | ||
|
|
ea3bb334a8 | ||
|
|
024e079a7d | ||
|
|
d902b281f7 | ||
|
|
c4a0008708 | ||
|
|
835f80ee50 | ||
|
|
155f4091a6 | ||
|
|
e1ee9c364b | ||
|
|
0029a22569 | ||
|
|
211ec20970 | ||
|
|
34997bada5 | ||
|
|
63daac917b | ||
|
|
51ceb9d851 | ||
|
|
51066c476a | ||
|
|
47ef7ee42e | ||
|
|
6fba33d443 | ||
|
|
017f6a5afb | ||
|
|
1ab722411a | ||
|
|
45387e5fb6 | ||
|
|
e362de45fb | ||
|
|
bacc10d2f5 | ||
|
|
5b49af1fe8 | ||
|
|
f052ecd702 | ||
|
|
33ff2a0759 | ||
|
|
ec81bcb13c | ||
|
|
b6b4bc21f1 | ||
|
|
9a83db2e67 | ||
|
|
30c48718e2 | ||
|
|
8328a0d61a | ||
|
|
b62bc6f3b8 | ||
|
|
0e752ab415 | ||
|
|
9f558404bd | ||
|
|
4be2f77bb0 | ||
|
|
b3fbd884e0 | ||
|
|
8c0edf669d | ||
|
|
f01c901445 | ||
|
|
2a91fc31f1 | ||
|
|
d1e4c1039f | ||
|
|
9432d6d5e8 | ||
|
|
c053c00bd7 | ||
|
|
9d0df74475 | ||
|
|
09e989a4c4 | ||
|
|
d4ef5f36c3 | ||
|
|
a9e0655859 | ||
|
|
e7eb4899a1 | ||
|
|
76ba11d966 | ||
|
|
f22e49e4f5 | ||
|
|
3c1bd86dcc | ||
|
|
4adbd0b843 | ||
|
|
cec35dcb60 | ||
|
|
a536d795f3 | ||
|
|
e3e04931cf | ||
|
|
3e505e0d96 | ||
|
|
dd4b054d95 | ||
|
|
e80d7730ca | ||
|
|
0facf26b04 | ||
|
|
37eac92329 | ||
|
|
90438a1ad5 | ||
|
|
e962521492 | ||
|
|
45a397d52b | ||
|
|
d9d7750781 | ||
|
|
1101e71fdd | ||
|
|
34b4ae283e | ||
|
|
a8c5e036d0 | ||
|
|
4eb0f0c206 | ||
|
|
a3bc35c303 | ||
|
|
57e012f9b7 | ||
|
|
8ab1895d8a | ||
|
|
13e5529f00 | ||
|
|
428efde36d | ||
|
|
a978873bff | ||
|
|
b005c1f522 | ||
|
|
b6c22d6ca6 | ||
|
|
50064c4ed6 | ||
|
|
48248eafdc | ||
|
|
b34564a770 | ||
|
|
d713cea180 | ||
|
|
695233e736 | ||
|
|
8789d7b057 | ||
|
|
510ea6cde4 | ||
|
|
b1954be2c7 | ||
|
|
9105a68923 | ||
|
|
06e2f59a94 | ||
|
|
ddb013e024 | ||
|
|
3f5e3b1d8b | ||
|
|
323090966b | ||
|
|
16204d30f8 | ||
|
|
34cbc7e0c1 | ||
|
|
5d6593a9da | ||
|
|
ab753a82bc | ||
|
|
880e759336 | ||
|
|
84b386141c | ||
|
|
e9a4cc60ca | ||
|
|
d5869c514e | ||
|
|
de0a03b2e9 | ||
|
|
3f6c79b00d | ||
|
|
56c8bb1950 | ||
|
|
f81f951814 | ||
|
|
345ada27c0 | ||
|
|
e3395a7366 | ||
|
|
3552c8280b | ||
|
|
11f00be606 | ||
|
|
a207daef0d | ||
|
|
ddd395ed4f | ||
|
|
04a7ae55e7 | ||
|
|
5a33d462f6 | ||
|
|
cefa7b90ed | ||
|
|
0875a8a0bc | ||
|
|
5624e86c2b | ||
|
|
c622a9281f | ||
|
|
937d385241 | ||
|
|
3ec9bcf7e7 | ||
|
|
3dd5314062 | ||
|
|
d77823c5f4 | ||
|
|
41b48bd353 | ||
|
|
6225ece6be | ||
|
|
3f8805b953 | ||
|
|
6d68c0983f | ||
|
|
3ac0eb896c | ||
|
|
9c309e6da2 | ||
|
|
deaa57fa15 | ||
|
|
8053fec29f | ||
|
|
78aca7e5c0 | ||
|
|
728f8db7b9 | ||
|
|
4c14339b4b | ||
|
|
16ac2aae6b | ||
|
|
6d68d50699 | ||
|
|
400c571fe6 | ||
|
|
e57c15b3ce | ||
|
|
7cb7e881fa | ||
|
|
2cf82349a5 | ||
|
|
638bb55649 | ||
|
|
6d1b0eef15 | ||
|
|
03658b6a62 | ||
|
|
f998a8dca5 | ||
|
|
0d6bee3a5b | ||
|
|
7ce334aeb2 | ||
|
|
fe3a1b2058 | ||
|
|
662b73211a | ||
|
|
c453a03a02 | ||
|
|
05f8113bd0 | ||
|
|
63dfc3f636 | ||
|
|
c96a303d8a | ||
|
|
2d7e87a4cb | ||
|
|
fa421b4b83 | ||
|
|
79217e78b4 | ||
|
|
bdd808c279 | ||
|
|
986a7e6216 | ||
|
|
b54fcaa0b1 | ||
|
|
1cf782c298 | ||
|
|
fb1050e409 | ||
|
|
5c29a8c7dd | ||
|
|
09dead50d2 | ||
|
|
772e0ee220 | ||
|
|
86b0de3cee | ||
|
|
d174d96b74 | ||
|
|
1d193ed01b | ||
|
|
adf365d99d | ||
|
|
f3f48c3c6f | ||
|
|
e072f2237b | ||
|
|
306eee3a21 | ||
|
|
ca1d66d070 | ||
|
|
7e1400d111 | ||
|
|
7595e77170 | ||
|
|
08fcc61d35 | ||
|
|
b36801c5ed | ||
|
|
4ed1a1ae7f | ||
|
|
04db01cb55 | ||
|
|
8f5185de1c | ||
|
|
9f6db31785 | ||
|
|
a869086ce9 | ||
|
|
2af6a1b36f | ||
|
|
d4381f513f | ||
|
|
a281f13f15 | ||
|
|
a9641dadff | ||
|
|
c94dde9b47 | ||
|
|
976644d1e6 | ||
|
|
11fe90a69b | ||
|
|
1108086854 | ||
|
|
5aea892a39 | ||
|
|
3f3e6f5199 | ||
|
|
2efcd383bb | ||
|
|
faec9c2965 | ||
|
|
a0e8c7f924 | ||
|
|
6efdfdf17e | ||
|
|
aec268c6e9 | ||
|
|
2c096a85d6 | ||
|
|
240e5455cc | ||
|
|
c538a9ec6d | ||
|
|
72458f5c41 | ||
|
|
82e4eb7b40 | ||
|
|
c9bfc4e9b6 | ||
|
|
1ea96df00e |
@@ -0,0 +1,156 @@
|
||||
# Adding a New API Module
|
||||
|
||||
How to add a new API endpoint module to `packages/api-client`.
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Define types in the module's `types.ts`
|
||||
|
||||
Types must match 1:1 with the backend API response. Do not reshape, rename, or omit fields.
|
||||
|
||||
Add to an existing namespace or create a new one:
|
||||
|
||||
```ts
|
||||
// modules/labrinth/types.ts (existing namespace)
|
||||
export namespace Labrinth {
|
||||
export namespace MyDomain {
|
||||
export namespace v3 {
|
||||
export type Thing = {
|
||||
id: string
|
||||
name: string
|
||||
created: string
|
||||
// ... matches API response exactly
|
||||
}
|
||||
|
||||
export type CreateThingRequest = {
|
||||
name: string
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
For a new API service, create `modules/<service>/types.ts` with a new top-level namespace and re-export it from `modules/types.ts`.
|
||||
|
||||
### 2. Create the module class
|
||||
|
||||
Create `modules/<api>/<domain>/v<N>.ts`:
|
||||
|
||||
```ts
|
||||
// modules/labrinth/things/v3.ts
|
||||
import { AbstractModule } from '../../../core/abstract-module'
|
||||
import type { Labrinth } from '../types'
|
||||
|
||||
export class LabrinthThingsV3Module extends AbstractModule {
|
||||
public getModuleID(): string {
|
||||
return 'labrinth_things_v3'
|
||||
}
|
||||
|
||||
public async get(id: string): Promise<Labrinth.MyDomain.v3.Thing> {
|
||||
return this.client.request<Labrinth.MyDomain.v3.Thing>(`/thing/${id}`, {
|
||||
api: 'labrinth',
|
||||
version: 3,
|
||||
method: 'GET',
|
||||
})
|
||||
}
|
||||
|
||||
public async create(data: Labrinth.MyDomain.v3.CreateThingRequest): Promise<Labrinth.MyDomain.v3.Thing> {
|
||||
return this.client.request<Labrinth.MyDomain.v3.Thing>(`/thing`, {
|
||||
api: 'labrinth',
|
||||
version: 3,
|
||||
method: 'POST',
|
||||
body: data,
|
||||
})
|
||||
}
|
||||
|
||||
public async delete(id: string): Promise<void> {
|
||||
return this.client.request(`/thing/${id}`, {
|
||||
api: 'labrinth',
|
||||
version: 3,
|
||||
method: 'DELETE',
|
||||
})
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Request options
|
||||
|
||||
| Field | Values | Purpose |
|
||||
|-------|--------|---------|
|
||||
| `api` | `'labrinth'`, `'archon'`, or a full URL | Which base URL to use |
|
||||
| `version` | `2`, `3`, `'internal'`, `'modrinth/v0'`, etc. | URL version segment |
|
||||
| `method` | `'GET'`, `'POST'`, `'PUT'`, `'PATCH'`, `'DELETE'` | HTTP method |
|
||||
| `body` | object | JSON request body |
|
||||
| `params` | `Record<string, string>` | Query parameters |
|
||||
| `skipAuth` | `boolean` | Skip auth feature for this request |
|
||||
| `useNodeAuth` | `boolean` | Use node-level auth (kyros) |
|
||||
| `timeout` | `number` | Request timeout in ms |
|
||||
| `retry` | `boolean \| number` | Override retry behavior |
|
||||
|
||||
#### For uploads
|
||||
|
||||
Return an `UploadHandle` instead of a `Promise`:
|
||||
|
||||
```ts
|
||||
public uploadThing(id: string, file: File): UploadHandle<void> {
|
||||
return this.client.upload<void>(`/thing/${id}/file`, {
|
||||
api: 'labrinth',
|
||||
version: 3,
|
||||
file,
|
||||
})
|
||||
}
|
||||
|
||||
// Or with FormData for multipart:
|
||||
public createWithFiles(data: CreateRequest, files: File[]): UploadHandle<Thing> {
|
||||
const formData = new FormData()
|
||||
formData.append('data', JSON.stringify(data))
|
||||
files.forEach((f, i) => formData.append(`file-${i}`, f, f.name))
|
||||
|
||||
return this.client.upload<Thing>(`/thing`, {
|
||||
api: 'labrinth',
|
||||
version: 3,
|
||||
formData,
|
||||
timeout: 60 * 5 * 1000, // longer timeout for uploads
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Register in the MODULE_REGISTRY
|
||||
|
||||
Add to `modules/index.ts`:
|
||||
|
||||
```ts
|
||||
import { LabrinthThingsV3Module } from './labrinth/things/v3'
|
||||
|
||||
export const MODULE_REGISTRY = {
|
||||
// ... existing modules
|
||||
labrinth_things_v3: LabrinthThingsV3Module,
|
||||
} as const
|
||||
```
|
||||
|
||||
The naming convention is `<api>_<domain>_<version>`. This flat key gets transformed into nested access: `client.labrinth.things_v3`.
|
||||
|
||||
### 4. Export types
|
||||
|
||||
If you added to an existing namespace, types are already re-exported. If you created a new `types.ts`, add it to `modules/types.ts`:
|
||||
|
||||
```ts
|
||||
export * from './<service>/types'
|
||||
```
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
| Convention | Example |
|
||||
|-----------|---------|
|
||||
| Module class | `LabrinthThingsV3Module` — `{Api}{Domain}V{N}Module` |
|
||||
| Module ID | `labrinth_things_v3` — `{api}_{domain}_v{n}` |
|
||||
| Type namespace | `Labrinth.MyDomain.v3.Thing` |
|
||||
| File path | `modules/labrinth/things/v3.ts` |
|
||||
|
||||
## Key Files
|
||||
|
||||
- `src/core/abstract-module.ts` — base class all modules extend
|
||||
- `src/core/abstract-client.ts` — `request()` and `upload()` methods
|
||||
- `src/modules/index.ts` — `MODULE_REGISTRY` and `buildModuleStructure()`
|
||||
- `src/modules/<api>/types.ts` — type definitions per API
|
||||
- `src/types/upload.ts` — `UploadHandle`, `UploadProgress`, `UploadRequestOptions`
|
||||
@@ -0,0 +1,144 @@
|
||||
# Cross-Platform Page System
|
||||
|
||||
When a page needs to exist in both the Modrinth App (`apps/app-frontend`) and the Modrinth Website (`apps/frontend`), use the cross-platform page system.
|
||||
|
||||
## How It Works
|
||||
|
||||
1. **Pages live as Vue SFCs in `packages/ui`** — either in `src/pages/` or `src/layout/` (if `src/pages/` doesn't exist, it's been renamed to `src/layout/`).
|
||||
2. **Platform-dependent data flows via DI** — the app uses Tauri `invoke` commands, the website uses `api-client` or the legacy `useBaseFetch` composable. The shared page never knows which. See the `dependency-injection` skill for full DI docs.
|
||||
3. **Non-platform-dependent data flows via props** — if data doesn't change based on _how_ it's fetched, just pass it as a prop.
|
||||
|
||||
## Example: Content Page
|
||||
|
||||
`ContentPageLayout` demonstrates the full pattern.
|
||||
|
||||
### 1. Define a DI contract in `packages/ui/src/providers/`
|
||||
|
||||
The provider interface abstracts all platform-specific operations:
|
||||
|
||||
```ts
|
||||
// packages/ui/src/providers/content-manager.ts
|
||||
export interface ContentManagerContext {
|
||||
items: Ref<ContentItem[]>
|
||||
loading: Ref<boolean>
|
||||
error: Ref<Error | null>
|
||||
contentTypeLabel: Ref<string>
|
||||
|
||||
// These are the platform-abstracted operations:
|
||||
// App uses invoke(), website uses api-client
|
||||
toggleEnabled: (item: ContentItem) => Promise<void>
|
||||
deleteItem: (item: ContentItem) => Promise<void>
|
||||
refresh: () => Promise<void>
|
||||
browse: () => void
|
||||
uploadFiles: () => void
|
||||
|
||||
// Optional capabilities — not every platform supports everything
|
||||
hasUpdateSupport: boolean
|
||||
updateItem?: (item: ContentItem) => Promise<void>
|
||||
bulkUpdateItem?: (items: ContentItem[]) => Promise<void>
|
||||
|
||||
mapToTableItem: (item: ContentItem) => ContentCardTableItem
|
||||
}
|
||||
|
||||
export const [injectContentManager, provideContentManager] =
|
||||
createContext<ContentManagerContext>('ContentManager')
|
||||
```
|
||||
|
||||
### 2. Build the shared page in `packages/ui`
|
||||
|
||||
The page component injects the context and handles all UI logic (search, filtering, selection, bulk operations, empty states, modals) without knowing the platform:
|
||||
|
||||
```vue
|
||||
<!-- packages/ui/src/components/instances/ContentPageLayout.vue -->
|
||||
<script setup lang="ts">
|
||||
import { injectContentManager } from '../../providers/content-manager'
|
||||
|
||||
const { items, loading, toggleEnabled, deleteItem, refresh, mapToTableItem } =
|
||||
injectContentManager()
|
||||
|
||||
// All UI logic lives here — search, filters, sort, bulk ops, etc.
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ContentCardTable :items="filteredItems" />
|
||||
</template>
|
||||
```
|
||||
|
||||
### 3. Each platform provides its implementation
|
||||
|
||||
**Website (Nuxt)** — uses `api-client` or `useBaseFetch`:
|
||||
|
||||
```vue
|
||||
<!-- apps/frontend/src/pages/hosting/manage/[id]/content.vue -->
|
||||
<script setup lang="ts">
|
||||
import { provideContentManager, ContentPageLayout } from '@modrinth/ui'
|
||||
const { labrinth } = injectModrinthClient()
|
||||
|
||||
const { data: items } = useQuery({
|
||||
queryKey: ['content', serverId],
|
||||
queryFn: () => labrinth.servers_v0.getAddons(serverId),
|
||||
})
|
||||
|
||||
provideContentManager({
|
||||
items: computed(() => items.value?.map(addonToContentItem) ?? []),
|
||||
deleteItem: async (item) => {
|
||||
await labrinth.servers_v0.deleteAddon(serverId, item.id)
|
||||
},
|
||||
// ... rest of the contract
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ContentPageLayout />
|
||||
</template>
|
||||
```
|
||||
|
||||
**App (Tauri)** — uses `invoke`:
|
||||
|
||||
```vue
|
||||
<!-- apps/app-frontend/src/pages/instance/Content.vue -->
|
||||
<script setup lang="ts">
|
||||
import { provideContentManager, ContentPageLayout } from '@modrinth/ui'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
|
||||
const items = ref<ContentItem[]>([])
|
||||
await invoke('get_instance_content', { instanceId }).then(/* map to ContentItem[] */)
|
||||
|
||||
provideContentManager({
|
||||
items,
|
||||
deleteItem: async (item) => {
|
||||
await invoke('delete_content', { instanceId, path: item.file_path })
|
||||
},
|
||||
// ... rest of the contract
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ContentPageLayout />
|
||||
</template>
|
||||
```
|
||||
|
||||
## When to Use Props vs DI
|
||||
|
||||
| Use | When |
|
||||
| --------- | -------------------------------------------------------------------------------------------------------- |
|
||||
| **DI** | The data depends on _how_ it's fetched (different per platform) — API calls, file operations, navigation |
|
||||
| **Props** | The data is the same regardless of platform — configuration flags, display options |
|
||||
|
||||
## Composables for Shared Logic
|
||||
|
||||
Extract reusable stateful logic into composables in `packages/ui/src/composables/`. The shared page orchestrates them internally:
|
||||
|
||||
- Search (Fuse.js fuzzy search over items)
|
||||
- Filtering (dynamic filter pills)
|
||||
- Selection (multi-select with bulk operations)
|
||||
- Bulk operations (sequential execution with progress tracking)
|
||||
|
||||
## Key Files
|
||||
|
||||
- `packages/ui/src/pages/` (or `src/layout/`) — shared page components
|
||||
- `packages/ui/src/providers/` — DI contracts
|
||||
- `packages/ui/src/composables/` — shared stateful logic
|
||||
- `apps/frontend/src/app.vue` — website root provider setup
|
||||
- `apps/app-frontend/src/App.vue` — app root provider setup
|
||||
- `apps/app-frontend/src/routes.js` — app route definitions
|
||||
@@ -0,0 +1,174 @@
|
||||
# Dependency Injection
|
||||
|
||||
Modrinth uses a lightweight DI layer built on Vue's `provide`/`inject` for sharing platform-specific capabilities and page-level state across shared UI components.
|
||||
|
||||
## The `createContext` Factory
|
||||
|
||||
All providers are defined using `createContext` from `packages/ui/src/providers/index.ts` (adapted from Reka UI). It produces a typed `[inject, provide]` tuple:
|
||||
|
||||
```ts
|
||||
import { createContext } from '@modrinth/ui'
|
||||
|
||||
interface MyContext {
|
||||
someValue: Ref<string>
|
||||
doSomething: () => void
|
||||
}
|
||||
|
||||
export const [injectMyContext, provideMyContext] = createContext<MyContext>('MyComponent')
|
||||
```
|
||||
|
||||
- **`provideMyContext(value)`** — call in a parent component's `setup()`.
|
||||
- **`injectMyContext()`** — call in any descendant's `setup()`. Throws if never provided.
|
||||
- **`injectMyContext(null)`** — returns `null` instead of throwing (for optional contexts).
|
||||
|
||||
## When to Use DI
|
||||
|
||||
Use DI when:
|
||||
- **The same interface needs different implementations** depending on the platform (web vs desktop app).
|
||||
- **Deeply nested components** need access to shared page-level state without prop drilling through 3+ levels.
|
||||
|
||||
### Platform Abstraction (Primary Use Case)
|
||||
|
||||
`packages/ui` components need capabilities that each frontend fulfils differently:
|
||||
|
||||
| Provider | App Frontend | Website Frontend |
|
||||
|----------|-------------|-----------------|
|
||||
| API client | Tauri IPC client | REST fetch client |
|
||||
| Notifications | `ref()` state + app window mgmt | `useState()` for SSR hydration |
|
||||
| File picker | Native Tauri dialogs | Browser file inputs |
|
||||
| Tags | Tauri commands | Nuxt server state |
|
||||
| Page context | `sidebar: true`, ad window hooks | `sidebar: false`, no ads |
|
||||
|
||||
### Page-Level Context
|
||||
|
||||
Sharing data between a page and deeply nested children — e.g. project page data consumed by sidebar, header, and version components.
|
||||
|
||||
## Creating a New Provider
|
||||
|
||||
### 1. Define the interface in `packages/ui/src/providers/`
|
||||
|
||||
```ts
|
||||
// packages/ui/src/providers/my-feature.ts
|
||||
import type { Ref } from 'vue'
|
||||
import { createContext } from '.'
|
||||
|
||||
export interface MyFeatureContext {
|
||||
items: Ref<Item[]>
|
||||
addItem: (item: Item) => Promise<void>
|
||||
removeItem: (id: string) => Promise<void>
|
||||
}
|
||||
|
||||
export const [injectMyFeature, provideMyFeature] = createContext<MyFeatureContext>('MyFeature')
|
||||
```
|
||||
|
||||
Re-export from the barrel file (`packages/ui/src/providers/index.ts`).
|
||||
|
||||
### 2. For complex platform-specific logic, use an abstract class
|
||||
|
||||
```ts
|
||||
export abstract class AbstractMyFeatureManager {
|
||||
abstract items: Ref<Item[]>
|
||||
abstract addItem(item: Item): Promise<void>
|
||||
|
||||
// Shared logic lives on the base class
|
||||
handleError(err: unknown) {
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
|
||||
export const [injectMyFeature, provideMyFeature] =
|
||||
createContext<AbstractMyFeatureManager>('MyFeature')
|
||||
```
|
||||
|
||||
See `AbstractWebNotificationManager` in `packages/ui/src/providers/web-notifications.ts` for a real example.
|
||||
|
||||
## Wiring Up Providers
|
||||
|
||||
### App Frontend (Tauri)
|
||||
|
||||
Create a setup function in `apps/app-frontend/src/providers/setup/`:
|
||||
|
||||
```ts
|
||||
// apps/app-frontend/src/providers/setup/my-feature.ts
|
||||
import { ref } from 'vue'
|
||||
import { provideMyFeature } from '@modrinth/ui'
|
||||
|
||||
export function setupMyFeatureProvider() {
|
||||
const items = ref<Item[]>([])
|
||||
|
||||
provideMyFeature({
|
||||
items,
|
||||
addItem: async (item) => {
|
||||
await invoke('add_item', { item })
|
||||
items.value.push(item)
|
||||
},
|
||||
removeItem: async (id) => {
|
||||
await invoke('remove_item', { id })
|
||||
items.value = items.value.filter(i => i.id !== id)
|
||||
},
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
Register it in `apps/app-frontend/src/providers/setup.ts`, which is called from `App.vue`'s `setup()`.
|
||||
|
||||
### Website Frontend (Nuxt)
|
||||
|
||||
Provide directly in `apps/frontend/src/app.vue`, using Nuxt's `useState()` where SSR hydration is needed:
|
||||
|
||||
```ts
|
||||
provideMyFeature({
|
||||
items: useState<Item[]>('my-feature-items', () => []),
|
||||
addItem: async (item) => {
|
||||
await $fetch('/api/items', { method: 'POST', body: item })
|
||||
},
|
||||
removeItem: async (id) => {
|
||||
await $fetch(`/api/items/${id}`, { method: 'DELETE' })
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Consuming Providers
|
||||
|
||||
In any component across `packages/ui`, `apps/frontend`, or `apps/app-frontend`:
|
||||
|
||||
```vue
|
||||
<script setup lang="ts">
|
||||
import { injectMyFeature } from '@modrinth/ui'
|
||||
|
||||
const { items, addItem } = injectMyFeature()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-for="item in items" :key="item.id">{{ item.name }}</div>
|
||||
<button @click="addItem({ id: '1', name: 'New' })">Add</button>
|
||||
</template>
|
||||
```
|
||||
|
||||
## When NOT to Use DI
|
||||
|
||||
Default to props and emits. DI adds indirection — only use it with a concrete reason.
|
||||
|
||||
- **Parent to direct child** — use props.
|
||||
- **Data only exists in one frontend** — keep context local to that app, not in `packages/ui`.
|
||||
- **Shallow prop drilling (1–2 levels)** — passing through one intermediate is fine.
|
||||
- **Component-local state** — use `ref()` / `reactive()` locally.
|
||||
|
||||
## Existing Providers
|
||||
|
||||
| Provider | File | Purpose |
|
||||
|----------|------|---------|
|
||||
| `provideModrinthClient` | `providers/api-client.ts` | API client instance |
|
||||
| `provideNotificationManager` | `providers/web-notifications.ts` | Notification management |
|
||||
| `providePageContext` | `providers/page-context.ts` | Page config (sidebar, ads) |
|
||||
| `provideProjectPageContext` | `providers/project-page.ts` | Project page state + mutations |
|
||||
| `provideServerContext` | `providers/server-context.ts` | Server hosting state |
|
||||
| `provideUserPageContext` | `providers/user-page.ts` | User page state |
|
||||
|
||||
## Key Files
|
||||
|
||||
- `packages/ui/src/providers/index.ts` — `createContext` factory + barrel exports
|
||||
- `packages/ui/src/providers/*.ts` — Provider definitions
|
||||
- `apps/frontend/src/app.vue` — Nuxt root provider setup
|
||||
- `apps/app-frontend/src/App.vue` — Tauri root provider setup
|
||||
- `apps/app-frontend/src/providers/setup/` — App provider setup functions
|
||||
@@ -0,0 +1,45 @@
|
||||
# Figma MCP Usage
|
||||
|
||||
When the Figma MCP server is connected, use it to translate Figma designs into production-ready Vue components for this monorepo.
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Get the design context
|
||||
|
||||
Use `get_design_context` with the node ID from a Figma URL. If the URL is `https://figma.com/design/:fileKey/:fileName?node-id=1-2`, the node ID is `1:2`.
|
||||
|
||||
```
|
||||
get_design_context(nodeId: "1:2", clientLanguages: "typescript,html,css", clientFrameworks: "vue")
|
||||
```
|
||||
|
||||
This returns reference code, a screenshot, and metadata. Always start here.
|
||||
|
||||
### 2. Get a screenshot for visual reference
|
||||
|
||||
Use `get_screenshot` if you need to see the design without full code context:
|
||||
|
||||
```
|
||||
get_screenshot(nodeId: "1:2")
|
||||
```
|
||||
|
||||
### 3. Get variable definitions
|
||||
|
||||
Use `get_variable_defs` to see what design tokens are applied to a node:
|
||||
|
||||
```
|
||||
get_variable_defs(nodeId: "1:2")
|
||||
```
|
||||
|
||||
### 4. Get metadata for structure overview
|
||||
|
||||
Use `get_metadata` to get an XML overview of node IDs, layer types, names, positions and sizes — useful for understanding the structure of a complex frame before diving into individual nodes.
|
||||
|
||||
## Adapting Figma Output
|
||||
|
||||
The Figma MCP returns generic reference code. Adapt it to match the Modrinth codebase:
|
||||
|
||||
1. **Read `packages/ui/CLAUDE.md`** for color usage rules, surface token mapping, and component patterns.
|
||||
2. **Map Figma color variables to `surface-*` tokens** — never use Figma's aliased names like `bg/default` or `bg/raised` directly. The CLAUDE.md has the full mapping table.
|
||||
3. **Check `packages/assets/styles/variables.scss`** for tokens not exposed in Figma (brand highlights, semantic backgrounds, shadows).
|
||||
4. **Check for existing components** in `packages/ui/src/components/` before building from scratch.
|
||||
5. **Match spacing exactly** — do not approximate values from the design.
|
||||
@@ -0,0 +1,105 @@
|
||||
# i18n String Conversion
|
||||
|
||||
Convert hard-coded natural-language strings in Vue SFCs into the localization system using utilities from `@modrinth/ui`.
|
||||
|
||||
## Rules
|
||||
|
||||
### 1. Identify translatable strings
|
||||
|
||||
- Scan `<template>` for all user-visible strings: inner text, alt attributes, placeholders, button labels, etc.
|
||||
- Check `<script>` too: dropdown option labels, notification messages, etc.
|
||||
- Do NOT extract dynamic expressions (`{{ user.name }}`) or HTML tags — only static human-readable text.
|
||||
|
||||
### 2. Create message definitions
|
||||
|
||||
Import `defineMessage` or `defineMessages` from `@modrinth/ui` in `<script setup>`. Define messages with a unique `id` (descriptive prefix based on component path) and `defaultMessage` equal to the original English string:
|
||||
|
||||
```ts
|
||||
const messages = defineMessages({
|
||||
welcomeTitle: { id: 'auth.welcome.title', defaultMessage: 'Welcome' },
|
||||
welcomeDescription: { id: 'auth.welcome.description', defaultMessage: "You're now part of the community…" },
|
||||
})
|
||||
```
|
||||
|
||||
### 3. Handle variables and ICU formats
|
||||
|
||||
- Dynamic parts become ICU placeholders: `"Hello, ${user.name}!"` → `defaultMessage: 'Hello, {name}!'`
|
||||
- Numbers/dates/times use ICU options: `{price, number, ::currency/USD}`
|
||||
- Plurals/selects use ICU: `'{count, plural, one {# message} other {# messages}}'`
|
||||
|
||||
### 4. Rich-text messages (links/markup)
|
||||
|
||||
Wrap link/markup ranges with tags in `defaultMessage`:
|
||||
|
||||
```
|
||||
"By creating an account, you agree to our <terms-link>Terms</terms-link> and <privacy-link>Privacy Policy</privacy-link>."
|
||||
```
|
||||
|
||||
Render with `<IntlFormatted>` from `@modrinth/ui` using named slots:
|
||||
|
||||
```vue
|
||||
<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:
|
||||
|
||||
```vue
|
||||
<template #strong="{ children }">
|
||||
<strong><component :is="() => children" /></strong>
|
||||
</template>
|
||||
```
|
||||
|
||||
For complex child handling, use `normalizeChildren` from `@modrinth/ui`:
|
||||
|
||||
```vue
|
||||
<template #bold="{ children }">
|
||||
<strong><component :is="() => normalizeChildren(children)" /></strong>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 5. Formatting in templates
|
||||
|
||||
Use `useVIntl()` from `@modrinth/ui`; prefer `formatMessage` for simple strings:
|
||||
|
||||
```ts
|
||||
const { formatMessage } = useVIntl()
|
||||
```
|
||||
|
||||
```vue
|
||||
<button>{{ formatMessage(messages.welcomeTitle) }}</button>
|
||||
{{ formatMessage(messages.greeting, { name: user.name }) }}
|
||||
```
|
||||
|
||||
### 6. Naming conventions
|
||||
|
||||
Make `id`s descriptive and stable (e.g., `error.generic.default.title`). Group related messages with `defineMessages`.
|
||||
|
||||
### 7. Avoid Vue/ICU delimiter collisions
|
||||
|
||||
If an ICU placeholder ends right before `}}` in a Vue template, insert a space: `} }` to avoid parsing issues.
|
||||
|
||||
### 8. Imports
|
||||
|
||||
Ensure these are imported from `@modrinth/ui` as needed: `defineMessage`/`defineMessages`, `useVIntl`, `IntlFormatted`, `normalizeChildren`.
|
||||
|
||||
### 9. Preserve functionality
|
||||
|
||||
Do not change logic, layout, reactivity, or bindings — only refactor strings into i18n.
|
||||
|
||||
## Reference Examples
|
||||
|
||||
- Variables/plurals: `apps/frontend/src/pages/frog.vue`
|
||||
- Rich-text link tags: `apps/frontend/src/pages/auth/welcome.vue` and `apps/frontend/src/error.vue`
|
||||
|
||||
When finished, there should be no hard-coded English strings left in the template — everything comes from `formatMessage` or `<IntlFormatted>`.
|
||||
@@ -0,0 +1,215 @@
|
||||
# Multistage Modals
|
||||
|
||||
The `MultiStageModal` component (`packages/ui/src/components/base/MultiStageModal.vue`) provides a wizard-like modal with progress tracking, conditional stages, and per-stage button configuration.
|
||||
|
||||
## Architecture
|
||||
|
||||
A multistage modal has three parts:
|
||||
|
||||
1. **Context** — A DI provider that holds all state, business logic, and stage configs
|
||||
2. **Stage configs** — Data objects describing each stage (title, component, buttons, skip conditions)
|
||||
3. **Stage components** — Vue components rendered inside the modal, consuming the context
|
||||
|
||||
## Building a Multistage Modal
|
||||
|
||||
### 1. Define the context
|
||||
|
||||
Create a DI provider with all the state your wizard needs. Include the modal ref and stage configs.
|
||||
|
||||
```ts
|
||||
// providers/my-feature/my-modal.ts
|
||||
import type { ShallowRef } from 'vue'
|
||||
import type { ComponentExposed } from 'vue-component-type-helpers'
|
||||
import type { MultiStageModal, StageConfigInput } from '@modrinth/ui'
|
||||
import { createContext } from '@modrinth/ui'
|
||||
|
||||
export interface MyModalContext {
|
||||
// State
|
||||
formData: Ref<MyFormData>
|
||||
isSubmitting: Ref<boolean>
|
||||
|
||||
// Modal control
|
||||
modal: ShallowRef<ComponentExposed<typeof MultiStageModal> | null>
|
||||
stageConfigs: StageConfigInput<MyModalContext>[]
|
||||
|
||||
// Business logic
|
||||
handleSubmit: () => Promise<void>
|
||||
}
|
||||
|
||||
export const [injectMyModalContext, provideMyModalContext] =
|
||||
createContext<MyModalContext>('MyModal')
|
||||
|
||||
export function createMyModalContext(
|
||||
modal: ShallowRef<ComponentExposed<typeof MultiStageModal> | null>,
|
||||
): MyModalContext {
|
||||
const formData = ref<MyFormData>({ ... })
|
||||
const isSubmitting = ref(false)
|
||||
|
||||
async function handleSubmit() {
|
||||
isSubmitting.value = true
|
||||
try {
|
||||
await saveData(formData.value)
|
||||
modal.value?.hide()
|
||||
} finally {
|
||||
isSubmitting.value = false
|
||||
}
|
||||
}
|
||||
|
||||
return { formData, isSubmitting, modal, stageConfigs, handleSubmit }
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Define stage configs
|
||||
|
||||
Each stage is a `StageConfigInput<T>` where `T` is your context type. Most fields accept either a static value or a function receiving the context (`MaybeCtxFn<T, R>`).
|
||||
|
||||
```ts
|
||||
// providers/my-feature/stages/details-stage.ts
|
||||
import { markRaw } from 'vue'
|
||||
import type { StageConfigInput } from '@modrinth/ui'
|
||||
import type { MyModalContext } from '../my-modal'
|
||||
import DetailsStage from './DetailsStage.vue'
|
||||
import { RightArrowIcon, SaveIcon } from '@modrinth/assets'
|
||||
|
||||
export const detailsStageConfig: StageConfigInput<MyModalContext> = {
|
||||
id: 'details',
|
||||
stageContent: markRaw(DetailsStage),
|
||||
title: 'Details',
|
||||
|
||||
// Conditional behavior based on context
|
||||
skip: (ctx) => ctx.shouldSkipDetails.value,
|
||||
cannotNavigateForward: (ctx) => !ctx.formData.value.name,
|
||||
disableClose: (ctx) => ctx.isSubmitting.value,
|
||||
|
||||
leftButtonConfig: (ctx) => ({
|
||||
label: 'Cancel',
|
||||
onClick: () => ctx.modal.value?.hide(),
|
||||
}),
|
||||
|
||||
rightButtonConfig: (ctx) => ({
|
||||
label: 'Next',
|
||||
icon: RightArrowIcon,
|
||||
iconPosition: 'after',
|
||||
disabled: !ctx.formData.value.name,
|
||||
onClick: () => ctx.modal.value?.nextStage(),
|
||||
}),
|
||||
}
|
||||
```
|
||||
|
||||
**Stage config fields:**
|
||||
|
||||
| Field | Type | Purpose |
|
||||
|-------|------|---------|
|
||||
| `id` | `string` | Unique stage identifier (used with `setStage()`) |
|
||||
| `stageContent` | `Component` | Vue component to render (wrap with `markRaw()`) |
|
||||
| `title` | `MaybeCtxFn<T, string>` | Stage title in breadcrumbs |
|
||||
| `skip` | `MaybeCtxFn<T, boolean>` | Skip this stage conditionally |
|
||||
| `nonProgressStage` | `MaybeCtxFn<T, boolean>` | Exclude from progress bar (for edit sub-flows) |
|
||||
| `hideStageInBreadcrumb` | `MaybeCtxFn<T, boolean>` | Hide from breadcrumb nav |
|
||||
| `cannotNavigateForward` | `MaybeCtxFn<T, boolean>` | Block forward navigation (validation) |
|
||||
| `disableClose` | `MaybeCtxFn<T, boolean>` | Disable closing the modal |
|
||||
| `leftButtonConfig` | `MaybeCtxFn<T, StageButtonConfig \| null>` | Left action button |
|
||||
| `rightButtonConfig` | `MaybeCtxFn<T, StageButtonConfig \| null>` | Right action button |
|
||||
| `maxWidth` | `MaybeCtxFn<T, string>` | Per-stage max width (default `560px`) |
|
||||
|
||||
**Button config fields:**
|
||||
|
||||
| Field | Purpose |
|
||||
|-------|---------|
|
||||
| `label` | Button text |
|
||||
| `icon` | Icon component |
|
||||
| `iconPosition` | `'before'` or `'after'` |
|
||||
| `color` | ButtonStyled color prop |
|
||||
| `disabled` | Disable the button |
|
||||
| `onClick` | Click handler |
|
||||
|
||||
### 3. Create stage components
|
||||
|
||||
Stage components inject the context and render their UI:
|
||||
|
||||
```vue
|
||||
<!-- providers/my-feature/stages/DetailsStage.vue -->
|
||||
<script setup lang="ts">
|
||||
import { injectMyModalContext } from '../my-modal'
|
||||
|
||||
const { formData } = injectMyModalContext()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="flex flex-col gap-4">
|
||||
<StyledInput v-model="formData.name" label="Name" />
|
||||
<StyledInput v-model="formData.description" label="Description" />
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 4. Create the wrapper component
|
||||
|
||||
The wrapper provides context and renders `MultiStageModal`:
|
||||
|
||||
```vue
|
||||
<!-- components/MyModalWrapper.vue -->
|
||||
<script setup lang="ts">
|
||||
import { shallowRef } from 'vue'
|
||||
import { MultiStageModal } from '@modrinth/ui'
|
||||
import { createMyModalContext, provideMyModalContext } from '../providers/my-feature/my-modal'
|
||||
|
||||
const modal = shallowRef<InstanceType<typeof MultiStageModal> | null>(null)
|
||||
const ctx = createMyModalContext(modal)
|
||||
provideMyModalContext(ctx)
|
||||
|
||||
defineExpose({ show: () => modal.value?.show() })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<MultiStageModal ref="modal" :stages="ctx.stageConfigs" :context="ctx" />
|
||||
</template>
|
||||
```
|
||||
|
||||
## Modal API
|
||||
|
||||
`MultiStageModal` exposes via ref:
|
||||
|
||||
| Method/Property | Description |
|
||||
|----------------|-------------|
|
||||
| `show()` | Open the modal |
|
||||
| `hide()` | Close the modal |
|
||||
| `setStage(indexOrId)` | Jump to stage by index or string id |
|
||||
| `nextStage()` | Advance to next non-skipped stage |
|
||||
| `prevStage()` | Go back to previous stage |
|
||||
| `currentStageIndex` | Ref to current stage index |
|
||||
|
||||
## Non-Progress Stages (Edit Sub-Flows)
|
||||
|
||||
For stages that shouldn't appear in the progress bar (e.g. editing a specific field from a summary page):
|
||||
|
||||
```ts
|
||||
export const editLoadersStageConfig: StageConfigInput<MyContext> = {
|
||||
id: 'edit-loaders',
|
||||
nonProgressStage: true,
|
||||
stageContent: markRaw(EditLoadersStage),
|
||||
title: 'Edit loaders',
|
||||
leftButtonConfig: (ctx) => ({
|
||||
label: 'Back',
|
||||
onClick: () => ctx.modal.value?.setStage('summary'),
|
||||
}),
|
||||
rightButtonConfig: (ctx) => ({
|
||||
...ctx.saveButtonConfig(),
|
||||
label: 'Save',
|
||||
}),
|
||||
}
|
||||
```
|
||||
|
||||
Navigate to it with `modal.value?.setStage('edit-loaders')` — it won't affect the progress indicator.
|
||||
|
||||
## Reference Implementation
|
||||
|
||||
The version creation/edit modal is the most complete example:
|
||||
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `apps/frontend/src/providers/version/manage-version-modal.ts` | Context creation + business logic |
|
||||
| `apps/frontend/src/providers/version/stages/index.ts` | Stage config barrel export |
|
||||
| `apps/frontend/src/providers/version/stages/*-stage.ts` | Individual stage configs |
|
||||
|
||||
The context includes computed properties for conditional UI, watchers for auto-fetching dependencies, loading states for granular button disabling, and both "create" and "edit" flows sharing the same stages with different button configs.
|
||||
@@ -0,0 +1,154 @@
|
||||
# TanStack Query
|
||||
|
||||
TanStack Query (`@tanstack/vue-query` v5) is used for server state management — caching, background refetching, and cache invalidation. Use it instead of manual `ref()` + `await` patterns for any data that comes from an API.
|
||||
|
||||
A TanStack MCP server is available — use `tanstack_doc` and `tanstack_search_docs` tools to look up API details when needed.
|
||||
|
||||
## Setup
|
||||
|
||||
TanStack Query is configured in `apps/frontend/src/plugins/tanstack.ts` as a Nuxt plugin with SSR hydration support. Default stale time is 5 seconds. The `QueryClient` is available via `useQueryClient()` or `useAppQueryClient()` (which also works in middleware).
|
||||
|
||||
## Queries
|
||||
|
||||
Use `useQuery` with the api-client for data fetching:
|
||||
|
||||
```ts
|
||||
const client = injectModrinthClient()
|
||||
|
||||
const { data, isPending, isError, error } = useQuery({
|
||||
queryKey: ['project', 'v3', projectId],
|
||||
queryFn: () => client.labrinth.projects_v3.get(projectId),
|
||||
staleTime: 1000 * 60 * 5,
|
||||
})
|
||||
```
|
||||
|
||||
In templates:
|
||||
|
||||
```vue
|
||||
<span v-if="isPending">Loading...</span>
|
||||
<span v-else-if="isError">Error: {{ error.message }}</span>
|
||||
<div v-else>{{ data.title }}</div>
|
||||
```
|
||||
|
||||
### Query Option Factories
|
||||
|
||||
For queries used across multiple components, define reusable query option factories in `packages/ui/src/queries/`:
|
||||
|
||||
```ts
|
||||
// composables/queries/project.ts
|
||||
export const STALE_TIME = 1000 * 60 * 5
|
||||
export const STALE_TIME_LONG = 1000 * 60 * 10
|
||||
|
||||
export const projectQueryOptions = {
|
||||
v3: (projectId: string, client: AbstractModrinthClient) => ({
|
||||
queryKey: ['project', 'v3', projectId] as const,
|
||||
queryFn: () => client.labrinth.projects_v3.get(projectId),
|
||||
staleTime: STALE_TIME,
|
||||
}),
|
||||
|
||||
members: (projectId: string, client: AbstractModrinthClient) => ({
|
||||
queryKey: ['project', projectId, 'members'] as const,
|
||||
queryFn: () => client.labrinth.projects_v3.getMembers(projectId),
|
||||
staleTime: STALE_TIME,
|
||||
}),
|
||||
}
|
||||
```
|
||||
|
||||
Then use them:
|
||||
|
||||
```ts
|
||||
const { data } = useQuery(projectQueryOptions.v3(projectId, client))
|
||||
```
|
||||
|
||||
### Conditional Queries
|
||||
|
||||
Use `enabled` as a computed for queries that depend on other data:
|
||||
|
||||
```ts
|
||||
const { data: members } = useQuery({
|
||||
queryKey: ['project', projectId, 'members'],
|
||||
queryFn: () => client.labrinth.projects_v3.getMembers(projectId),
|
||||
enabled: computed(() => !!projectId.value),
|
||||
})
|
||||
```
|
||||
|
||||
## Mutations
|
||||
|
||||
Use `useMutation` for create/update/delete operations. Invalidate related queries on success:
|
||||
|
||||
```ts
|
||||
const queryClient = useQueryClient()
|
||||
const client = injectModrinthClient()
|
||||
|
||||
const createMutation = useMutation({
|
||||
mutationFn: (name: string) => client.archon.backups_v0.create(serverId, { name }),
|
||||
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['backups', 'list', serverId] }),
|
||||
})
|
||||
```
|
||||
|
||||
Use `createMutation.isPending.value` to disable buttons during submission.
|
||||
|
||||
### Optimistic Updates
|
||||
|
||||
For mutations where responsiveness matters, use optimistic updates with rollback:
|
||||
|
||||
```ts
|
||||
const patchMutation = useMutation({
|
||||
mutationFn: async ({ projectId, data }) => {
|
||||
await client.labrinth.projects_v3.patch(projectId, data)
|
||||
return data
|
||||
},
|
||||
|
||||
onMutate: async ({ projectId, data }) => {
|
||||
await queryClient.cancelQueries({ queryKey: ['project', 'v3', projectId] })
|
||||
const previous = queryClient.getQueryData(['project', 'v3', projectId])
|
||||
|
||||
queryClient.setQueryData(['project', 'v3', projectId], (old) => {
|
||||
if (!old) return old
|
||||
return { ...old, ...data }
|
||||
})
|
||||
|
||||
return { previous }
|
||||
},
|
||||
|
||||
onError: (_err, _variables, context) => {
|
||||
if (context?.previous) {
|
||||
queryClient.setQueryData(['project', 'v3', projectId], context.previous)
|
||||
}
|
||||
},
|
||||
|
||||
onSettled: () => {
|
||||
queryClient.invalidateQueries({ queryKey: ['project', 'v3', projectId] })
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Query Keys
|
||||
|
||||
Keys use a hierarchical array pattern:
|
||||
|
||||
```ts
|
||||
// Resource type → version/qualifier → ID
|
||||
['project', 'v3', projectId]
|
||||
|
||||
// Resource type → ID → sub-resource
|
||||
['project', projectId, 'members']
|
||||
['project', projectId, 'versions', 'v3']
|
||||
|
||||
// Domain → action → ID
|
||||
['backups', 'list', serverId]
|
||||
['tech-reviews']
|
||||
```
|
||||
|
||||
Use `as const` for type safety. Put the resource ID last when possible — this makes partial key matching work for invalidation:
|
||||
|
||||
```ts
|
||||
// Invalidates all project queries for this ID
|
||||
queryClient.invalidateQueries({ queryKey: ['project', projectId] })
|
||||
```
|
||||
|
||||
## Key Files
|
||||
|
||||
- `apps/frontend/src/plugins/tanstack.ts` — QueryClient setup + SSR hydration
|
||||
- `apps/frontend/src/composables/query-client.ts` — `useAppQueryClient()` helper
|
||||
- `apps/frontend/src/composables/queries/` — reusable query option factories
|
||||
@@ -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
|
||||
@@ -19,7 +19,7 @@ body:
|
||||
options:
|
||||
- Modrinth App
|
||||
- Modrinth.com website
|
||||
- Modrinth Servers
|
||||
- Modrinth Hosting
|
||||
- Modrinth API for developers
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -19,7 +19,15 @@ on:
|
||||
sign-windows-binaries:
|
||||
description: Sign Windows binaries
|
||||
type: boolean
|
||||
default: true
|
||||
default: false
|
||||
required: false
|
||||
environment:
|
||||
description: Environment
|
||||
type: choice
|
||||
options:
|
||||
- prod
|
||||
- staging
|
||||
default: prod
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
@@ -40,33 +48,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,24 +98,26 @@ 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/')"
|
||||
BUILD_ENVIRONMENT="${{ inputs.environment || 'prod' }}"
|
||||
echo "Setting application version to $APP_VERSION"
|
||||
echo "Using environment $BUILD_ENVIRONMENT"
|
||||
dasel put -f apps/app/Cargo.toml -t string -v "${APP_VERSION#v}" 'package.version'
|
||||
dasel put -f packages/app-lib/Cargo.toml -t string -v "${APP_VERSION#v}" 'package.version'
|
||||
dasel put -f apps/app-frontend/package.json -t string -v "${APP_VERSION#v}" 'version'
|
||||
|
||||
cp packages/app-lib/.env.prod packages/app-lib/.env
|
||||
cp "packages/app-lib/.env.${BUILD_ENVIRONMENT}" packages/app-lib/.env
|
||||
|
||||
- name: 💨 Setup Turbo cache
|
||||
- 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 +127,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 +141,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 +163,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 +171,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*
|
||||
|
||||
+3
-1
@@ -64,7 +64,9 @@ generated
|
||||
app-playground-data/*
|
||||
|
||||
.astro
|
||||
.claude
|
||||
.claude/*
|
||||
!.claude/skills/
|
||||
.letta
|
||||
|
||||
# labrinth demo fixtures
|
||||
apps/labrinth/fixtures/demo
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
See [CLAUDE.md](./CLAUDE.md) for all project instructions and guidelines.
|
||||
@@ -1,63 +1,98 @@
|
||||
# Architecture
|
||||
# Modrinth Monorepo
|
||||
|
||||
Use TAB instead of spaces.
|
||||
This is the Modrinth monorepo — it contains all Modrinth projects, both frontend and backend. When entering a project, either to edit or analyse, you should read it's CLAUDE.md.
|
||||
|
||||
## Frontend
|
||||
## Architecture
|
||||
|
||||
There are two similar frontends in the Modrinth monorepo, the website (apps/frontend) and the app frontend (apps/app-frontend).
|
||||
- **Monorepo tooling:** [Turborepo](https://turbo.build/) (`turbo.jsonc`) + [pnpm workspaces](https://pnpm.io/workspaces) (`pnpm-workspace.yaml`)
|
||||
- **Frontend:** Vue 3 / Nuxt 3, Tailwind CSS v3
|
||||
- **Backend:** Rust (Labrinth API), Postgres, Clickhouse
|
||||
- **Indentation:** Use TAB everywhere, never spaces
|
||||
|
||||
Both use Tailwind v3, and their respective configs can be seen at `tailwind.config.ts` and `tailwind.config.js` respectively.
|
||||
### Apps (`apps/`)
|
||||
|
||||
Both utilize shared and common components from `@modrinth/ui` which can be found at `packages/ui`, and stylings from `@modrinth/assets` which can be found at `packages/assets`.
|
||||
| App | Description |
|
||||
| ----------------- | ------------------------------ |
|
||||
| `frontend` | Main Modrinth website (Nuxt 3) |
|
||||
| `app-frontend` | Desktop/app frontend (Vue 3) |
|
||||
| `app` | Desktop/app shell (Tauri) |
|
||||
| `app-playground` | Testing playground for app |
|
||||
| `labrinth` | Backend API service |
|
||||
| `daedalus_client` | Daedalus client implementation |
|
||||
| `docs` | Documentation site (Astro) |
|
||||
|
||||
Both can utilize icons from `@modrinth/assets`, which are automatically generated based on what's available within the `icons` folder of the `packages/assets` directory. You can see the generated icons list in `generated-icons.ts`.
|
||||
### Packages (`packages/`)
|
||||
|
||||
Both have access to our dependency injection framework, examples as seen in `packages/ui/src/providers/`. Ideally any state which is shared between a page and it's subpages should be shared using this dependency injection framework.
|
||||
| Package | Description |
|
||||
| ------------------ | ----------------------------------------------------- |
|
||||
| `ui` | Shared Vue component library (`@modrinth/ui`) |
|
||||
| `assets` | Styling and auto-generated icons (`@modrinth/assets`) |
|
||||
| `api-client` | API client for Nuxt, Tauri, and Node/browser |
|
||||
| `app-lib` | Shared app library |
|
||||
| `blog` | Blog system and changelog data |
|
||||
| `utils` | Shared utility functions |
|
||||
| `moderation` | Moderation utilities |
|
||||
| `daedalus` | Daedalus protocol |
|
||||
| `tooling-config` | ESLint, Prettier, TypeScript configs |
|
||||
| `ariadne` | Analytics library |
|
||||
| `modrinth-log` | Logging utilities |
|
||||
| `modrinth-maxmind` | MaxMind GeoIP |
|
||||
| `modrinth-util` | General utilities |
|
||||
| `muralpay` | Payment processing |
|
||||
| `path-util` | Path utilities |
|
||||
| `sqlx-tracing` | SQLx query tracing |
|
||||
|
||||
### Website (apps/frontend)
|
||||
## Pre-PR Commands
|
||||
|
||||
Before a pull request can be opened for the website, run `pnpm prepr:frontend:web` from the root folder, otherwise CI will fail.
|
||||
Run these from the **root** folder before opening a pull request - do not run these after each prompt the user gives you, only run when asked, ask the user a question if they want to run it if the user indicates that they are about to create a pull request.
|
||||
|
||||
To run a development version of the frontend, you must first copy over the relevant `.env` template file (prod, staging or local, usually prod) within the `apps/frontend` folder into `apps/frontend/.env`. Then you can run the frontend by running `pnpm web:dev` in the root folder.
|
||||
- **Website:** `pnpm prepr:frontend:web`
|
||||
- **App frontend:** `pnpm prepr:frontend:app`
|
||||
- **Frontend libs:** `pnpm prepr:frontend:lib`
|
||||
- **All frontend (app+web):** `pnpm prepr`
|
||||
- **Labrinth (backend):** See `apps/labrinth/CLAUDE.md`
|
||||
|
||||
### App Frontend (apps/app-frontend)
|
||||
The website and app `prepr` commands
|
||||
|
||||
Before a pull request can be opened for the app frontend, run `pnpm prepr:frontend:app` from the root folder, otherwise CI will fail.
|
||||
## Dev Commands
|
||||
|
||||
To run a development version of the app frontend, you must first copy over the relevant `.env` template file (prod, staging or local, usually prod) within `packages/app-lib` into `packages/app-lib/.env`. Then you must run the app itself by running `pnpm app:dev` in the root folder.
|
||||
- **Website:** `pnpm web:dev` (copy `.env` template in `apps/frontend/` first)
|
||||
- **App:** `pnpm app:dev` (copy `.env` template in `packages/app-lib/` first)
|
||||
- **Storybook (packages/ui):** `pnpm storybook`
|
||||
|
||||
### Localization
|
||||
## Project-Specific Instructions
|
||||
|
||||
Refer to `.github/instructions/i18n-convert.instructions.md` if the user asks you to perform any i18n conversion work on a component, set of components, pages or sets of pages.
|
||||
Each project may have its own `CLAUDE.md` with detailed instructions:
|
||||
|
||||
## Labrinth
|
||||
- [`apps/labrinth/CLAUDE.md`](apps/labrinth/CLAUDE.md) — Backend API
|
||||
- [`apps/frontend/CLAUDE.md`](apps/frontend/CLAUDE.md) - Frontend Website
|
||||
|
||||
Labrinth is the backend API service for Modrinth.
|
||||
## Code Guidelines
|
||||
|
||||
### Testing
|
||||
### Comments
|
||||
- DO NOT use "heading" comments like: // === Helper methods === .
|
||||
- Use doc comments, but avoid inline comments unless ABSOLUTELY necessary for clarity. Code should aim to be self documenting!
|
||||
|
||||
Before a pull request can be opened, run `cargo clippy -p labrinth --all-targets` and make sure there are ZERO warnings, otherwise CI will fail.
|
||||
## Bash Guidelines
|
||||
|
||||
Use `cargo test -p labrinth --all-targets` to test your changes. All tests must pass, otherwise CI will fail.
|
||||
### Output handling
|
||||
- DO NOT pipe output through `head`, `tail`, `less`, or `more`
|
||||
- NEVER use `| head -n X` or `| tail -n X` to truncate output
|
||||
- Run commands directly without pipes when possible
|
||||
- If you need to limit output, use command-specific flags (e.g. `git log -n 10` instead of `git log | head -10`)
|
||||
- ALWAYS read the full output — never pipe through filters
|
||||
|
||||
To prepare the sqlx cache, cd into `apps/labrinth` and run `cargo sqlx prepare`. Make sure to NEVER run `cargo sqlx prepare --workspace`.
|
||||
### General
|
||||
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to
|
||||
|
||||
Read the root `docker-compose.yml` to see what running services are available while developing. Use `docker exec` to access these services.
|
||||
## Skills
|
||||
|
||||
When the user refers to "performing pre-PR checks", do the following:
|
||||
Project-specific skills (patterns, conventions, and implementation guides) are located in [`.claude/skills/`](./.claude/skills/). Each skill has a `SKILL.md` describing the pattern:
|
||||
|
||||
- Run clippy as described above
|
||||
- DO NOT run tests unless explicitly requested (they take a long time)
|
||||
- Prepare the sqlx cache
|
||||
|
||||
### Clickhouse
|
||||
|
||||
Use `docker exec labrinth-clickhouse clickhouse-client` to access the Clickhouse instance. We use the `staging_ariadne` database to store data in testing.
|
||||
|
||||
### Postgres
|
||||
|
||||
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
|
||||
|
||||
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to.
|
||||
- **[Dependency Injection](./.claude/skills/dependency-injection/SKILL.md)** — Vue provide/inject DI layer using `createContext`
|
||||
- **[Cross-Platform Pages](./.claude/skills/cross-platform-pages/SKILL.md)** — Shared component architecture across Nuxt and Tauri frontends
|
||||
- **[Multistage Modals](./.claude/skills/multistage-modals/SKILL.md)** — Wizard-like modal flows with `MultiStageModal`
|
||||
- **[Figma MCP](./.claude/skills/figma-mcp/SKILL.md)** — Translating Figma designs to Modrinth Vue components
|
||||
- **[i18n Convert](./.claude/skills/i18n-convert/SKILL.md)** — Converting hard-coded strings to vue-i18n localization
|
||||
- **[API Module](./.claude/skills/api-module/SKILL.md)** — Adding new endpoint modules to `@modrinth/api-client`
|
||||
- **[TanStack Query](./.claude/skills/tanstack-query/SKILL.md)** — Server state management with `@tanstack/vue-query` v5
|
||||
|
||||
Generated
+936
-111
File diff suppressed because it is too large
Load Diff
+12
-4
@@ -8,6 +8,7 @@ members = [
|
||||
"packages/app-lib",
|
||||
"packages/ariadne",
|
||||
"packages/daedalus",
|
||||
"packages/labrinth-derive",
|
||||
"packages/modrinth-log",
|
||||
"packages/modrinth-maxmind",
|
||||
"packages/modrinth-util",
|
||||
@@ -32,6 +33,7 @@ arc-swap = "1.7.1"
|
||||
argon2 = { version = "0.5.3", features = ["std"] }
|
||||
ariadne = { path = "packages/ariadne" }
|
||||
async-compression = { version = "0.4.32", default-features = false }
|
||||
async-minecraft-ping = { path = "packages/async-minecraft-ping" }
|
||||
async-recursion = "1.1.1"
|
||||
async-stripe = { version = "0.41.0", default-features = false, features = [
|
||||
"runtime-tokio-hyper-rustls",
|
||||
@@ -58,9 +60,10 @@ color-eyre = "0.6.5"
|
||||
color-thief = "0.2.2"
|
||||
const_format = "0.2.34"
|
||||
daedalus = { path = "packages/daedalus" }
|
||||
darling = { version = "0.23" }
|
||||
dashmap = "6.1.0"
|
||||
data-url = "0.3.2"
|
||||
deadpool-redis = "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"
|
||||
@@ -116,13 +119,16 @@ 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"] }
|
||||
png = "0.18.0"
|
||||
proc-macro2 = { version = "1.0" }
|
||||
prometheus = "0.14.0"
|
||||
quartz_nbt = "0.2.9"
|
||||
quick-xml = "0.38.3"
|
||||
quote = { version = "1.0" }
|
||||
rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9
|
||||
rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9
|
||||
redis = "0.32.7"
|
||||
@@ -150,7 +156,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"
|
||||
@@ -164,14 +169,16 @@ 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"
|
||||
syn = { version = "2.0" }
|
||||
sysinfo = { version = "0.37.2", default-features = false }
|
||||
tar = "0.4.44"
|
||||
tauri = "2.8.5"
|
||||
tauri-build = "2.4.1"
|
||||
tauri-plugin-deep-link = "2.4.3"
|
||||
tauri-plugin-dialog = "2.4.0"
|
||||
tauri-plugin-http = "2.5.2"
|
||||
tauri-plugin-http = "2.5.7"
|
||||
tauri-plugin-opener = "2.5.0"
|
||||
tauri-plugin-os = "2.3.1"
|
||||
tauri-plugin-single-instance = "2.3.4"
|
||||
@@ -239,7 +246,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"
|
||||
@@ -269,4 +276,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
|
||||
|
||||
@@ -17,3 +17,7 @@ extend-exclude = [
|
||||
tou = "tou"
|
||||
# Google Ad Manager
|
||||
gam = "gam"
|
||||
# short for "constants"
|
||||
consts = "consts"
|
||||
# short for "Copy"
|
||||
Cpy = "Cpy"
|
||||
|
||||
+166
-90
@@ -32,17 +32,20 @@ import {
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
I18nDebugPanel,
|
||||
NewsArticleCard,
|
||||
NotificationPanel,
|
||||
OverflowMenu,
|
||||
PopupNotificationPanel,
|
||||
ProgressSpinner,
|
||||
provideModrinthClient,
|
||||
provideNotificationManager,
|
||||
providePageContext,
|
||||
providePopupNotificationManager,
|
||||
useDebugLogger,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { renderString } from '@modrinth/utils'
|
||||
import { formatBytes, renderString } from '@modrinth/utils'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { getVersion } from '@tauri-apps/api/app'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
@@ -60,26 +63,28 @@ import AccountsCard from '@/components/ui/AccountsCard.vue'
|
||||
import Breadcrumbs from '@/components/ui/Breadcrumbs.vue'
|
||||
import ErrorModal from '@/components/ui/ErrorModal.vue'
|
||||
import FriendsList from '@/components/ui/friends/FriendsList.vue'
|
||||
import AddServerToInstanceModal from '@/components/ui/install_flow/AddServerToInstanceModal.vue'
|
||||
import IncompatibilityWarningModal from '@/components/ui/install_flow/IncompatibilityWarningModal.vue'
|
||||
import InstallConfirmModal from '@/components/ui/install_flow/InstallConfirmModal.vue'
|
||||
import ModInstallModal from '@/components/ui/install_flow/ModInstallModal.vue'
|
||||
import InstanceCreationModal from '@/components/ui/InstanceCreationModal.vue'
|
||||
import MinecraftAuthErrorModal from '@/components/ui/minecraft-auth-error-modal/MinecraftAuthErrorModal.vue'
|
||||
import AppSettingsModal from '@/components/ui/modal/AppSettingsModal.vue'
|
||||
import AuthGrantFlowWaitModal from '@/components/ui/modal/AuthGrantFlowWaitModal.vue'
|
||||
import InstallToPlayModal from '@/components/ui/modal/InstallToPlayModal.vue'
|
||||
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
|
||||
import NavButton from '@/components/ui/NavButton.vue'
|
||||
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
||||
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
||||
import RunningAppBar from '@/components/ui/RunningAppBar.vue'
|
||||
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
||||
import UpdateToast from '@/components/ui/UpdateToast.vue'
|
||||
import URLConfirmModal from '@/components/ui/URLConfirmModal.vue'
|
||||
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
||||
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
|
||||
import { debugAnalytics, initAnalytics, optOutAnalytics, trackEvent } from '@/helpers/analytics'
|
||||
import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics'
|
||||
import { check_reachable } from '@/helpers/auth.js'
|
||||
import { get_user } from '@/helpers/cache.js'
|
||||
import { command_listener, warning_listener } from '@/helpers/events.js'
|
||||
import { useFetch } from '@/helpers/fetch.js'
|
||||
import { cancelLogin, get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
|
||||
import { list } from '@/helpers/profile.js'
|
||||
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
||||
@@ -98,13 +103,14 @@ import {
|
||||
subscribeToDownloadProgress,
|
||||
} from '@/providers/download-progress.ts'
|
||||
import { useError } from '@/store/error.js'
|
||||
import { useInstall } from '@/store/install.js'
|
||||
import { playServerProject, useInstall } from '@/store/install.js'
|
||||
import { useLoading, useTheming } from '@/store/state'
|
||||
|
||||
import { create_profile_and_install_from_file } from './helpers/pack'
|
||||
import { generateSkinPreviews } from './helpers/rendering/batch-skin-renderer'
|
||||
import { get_available_capes, get_available_skins } from './helpers/skins'
|
||||
import { AppNotificationManager } from './providers/app-notifications'
|
||||
import { AppPopupNotificationManager } from './providers/app-popup-notifications'
|
||||
|
||||
const themeStore = useTheming()
|
||||
|
||||
@@ -112,6 +118,10 @@ const notificationManager = new AppNotificationManager()
|
||||
provideNotificationManager(notificationManager)
|
||||
const { handleError, addNotification } = notificationManager
|
||||
|
||||
const popupNotificationManager = new AppPopupNotificationManager()
|
||||
providePopupNotificationManager(popupNotificationManager)
|
||||
const { addPopupNotification } = popupNotificationManager
|
||||
|
||||
const tauriApiClient = new TauriModrinthClient({
|
||||
userAgent: `modrinth/theseus/${getVersion()} (support@modrinth.com)`,
|
||||
features: [
|
||||
@@ -143,6 +153,7 @@ const showOnboarding = ref(false)
|
||||
const nativeDecorations = ref(false)
|
||||
|
||||
const os = ref('')
|
||||
const isDevEnvironment = ref(false)
|
||||
|
||||
const stateInitialized = ref(false)
|
||||
|
||||
@@ -247,6 +258,7 @@ async function setupApp() {
|
||||
|
||||
os.value = await getOS()
|
||||
const dev = await isDev()
|
||||
isDevEnvironment.value = dev
|
||||
const version = await getVersion()
|
||||
showOnboarding.value = !onboarded
|
||||
|
||||
@@ -267,12 +279,11 @@ async function setupApp() {
|
||||
isMaximized.value = await getCurrentWindow().isMaximized()
|
||||
})
|
||||
|
||||
initAnalytics()
|
||||
if (!telemetry) {
|
||||
optOutAnalytics()
|
||||
if (telemetry) {
|
||||
initAnalytics()
|
||||
if (dev) debugAnalytics()
|
||||
trackEvent('Launched', { version, dev, onboarded })
|
||||
}
|
||||
if (dev) debugAnalytics()
|
||||
trackEvent('Launched', { version, dev, onboarded })
|
||||
|
||||
if (!dev) document.addEventListener('contextmenu', (event) => event.preventDefault())
|
||||
|
||||
@@ -291,11 +302,7 @@ async function setupApp() {
|
||||
}),
|
||||
)
|
||||
|
||||
useFetch(
|
||||
`https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`,
|
||||
'criticalAnnouncements',
|
||||
true,
|
||||
)
|
||||
fetch(`https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`)
|
||||
.then((response) => response.json())
|
||||
.then((res) => {
|
||||
if (res && res.header && res.body) {
|
||||
@@ -308,23 +315,21 @@ async function setupApp() {
|
||||
)
|
||||
})
|
||||
|
||||
useFetch(`https://modrinth.com/news/feed/articles.json`, 'news', true)
|
||||
fetch(`https://modrinth.com/news/feed/articles.json`)
|
||||
.then((response) => response.json())
|
||||
.then((res) => {
|
||||
if (res && res.articles) {
|
||||
// Format expected by NewsArticleCard component.
|
||||
news.value = res.articles
|
||||
.map((article) => ({
|
||||
...article,
|
||||
path: article.link,
|
||||
thumbnail: article.thumbnail,
|
||||
title: article.title,
|
||||
summary: article.summary,
|
||||
date: article.date,
|
||||
}))
|
||||
.slice(0, 4)
|
||||
}
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Failed to fetch news articles', error)
|
||||
})
|
||||
|
||||
get_opening_command().then(handleCommand)
|
||||
fetchCredentials()
|
||||
@@ -385,11 +390,15 @@ loading.setEnabled(false)
|
||||
|
||||
const error = useError()
|
||||
const errorModal = ref()
|
||||
const minecraftAuthErrorModal = ref()
|
||||
|
||||
const install = useInstall()
|
||||
const modInstallModal = ref()
|
||||
const addServerToInstanceModal = ref()
|
||||
const installConfirmModal = ref()
|
||||
const incompatibilityWarningModal = ref()
|
||||
const installToPlayModal = ref()
|
||||
const updateToPlayModal = ref()
|
||||
|
||||
const credentials = ref()
|
||||
|
||||
@@ -398,7 +407,7 @@ const modrinthLoginFlowWaitModal = ref()
|
||||
async function fetchCredentials() {
|
||||
const creds = await getCreds().catch(handleError)
|
||||
if (creds && creds.user_id) {
|
||||
creds.user = await get_user(creds.user_id).catch(handleError)
|
||||
creds.user = await get_user(creds.user_id, 'bypass').catch(handleError)
|
||||
}
|
||||
credentials.value = creds ?? null
|
||||
}
|
||||
@@ -463,10 +472,15 @@ onMounted(() => {
|
||||
invoke('show_window')
|
||||
|
||||
error.setErrorModal(errorModal.value)
|
||||
error.setMinecraftAuthErrorModal(minecraftAuthErrorModal.value)
|
||||
|
||||
install.setIncompatibilityWarningModal(incompatibilityWarningModal)
|
||||
install.setInstallConfirmModal(installConfirmModal)
|
||||
install.setModInstallModal(modInstallModal)
|
||||
install.setAddServerToInstanceModal(addServerToInstanceModal)
|
||||
install.setInstallToPlayModal(installToPlayModal)
|
||||
install.setUpdateToPlayModal(updateToPlayModal)
|
||||
install.setPopupNotificationManager(popupNotificationManager)
|
||||
})
|
||||
|
||||
const accounts = ref(null)
|
||||
@@ -484,6 +498,9 @@ async function handleCommand(e) {
|
||||
source: 'CreationModalFileDrop',
|
||||
})
|
||||
}
|
||||
} else if (e.event === 'InstallServer') {
|
||||
await router.push(`/project/${e.id}`)
|
||||
await playServerProject(e.id).catch(handleError)
|
||||
} else {
|
||||
// Other commands are URL-based (deep linking)
|
||||
urlModal.value.show(e)
|
||||
@@ -502,24 +519,72 @@ const downloadPercent = computed(() => Math.trunc(appUpdateDownload.progress.val
|
||||
const metered = ref(true)
|
||||
const finishedDownloading = ref(false)
|
||||
const restarting = ref(false)
|
||||
const updateToastDismissed = ref(false)
|
||||
const availableUpdate = ref(null)
|
||||
const updateSize = ref(null)
|
||||
const updatesEnabled = ref(true)
|
||||
|
||||
const updatePopupMessages = defineMessages({
|
||||
updateAvailable: {
|
||||
id: 'app.update-popup.title',
|
||||
defaultMessage: 'Update available',
|
||||
},
|
||||
downloadComplete: {
|
||||
id: 'app.update-popup.download-complete',
|
||||
defaultMessage: 'Download complete',
|
||||
},
|
||||
body: {
|
||||
id: 'app.update-popup.body',
|
||||
defaultMessage:
|
||||
'Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App.',
|
||||
},
|
||||
meteredBody: {
|
||||
id: 'app.update-popup.body.metered',
|
||||
defaultMessage: `Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it.`,
|
||||
},
|
||||
downloadedBody: {
|
||||
id: 'app.update-popup.body.download-complete',
|
||||
defaultMessage: `Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App.`,
|
||||
},
|
||||
linuxBody: {
|
||||
id: 'app.update-popup.body.linux',
|
||||
defaultMessage:
|
||||
'Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!',
|
||||
},
|
||||
reload: {
|
||||
id: 'app.update-popup.reload',
|
||||
defaultMessage: 'Reload',
|
||||
},
|
||||
download: {
|
||||
id: 'app.update-popup.download',
|
||||
defaultMessage: 'Download ({size})',
|
||||
},
|
||||
changelog: {
|
||||
id: 'app.update-popup.changelog',
|
||||
defaultMessage: 'Changelog',
|
||||
},
|
||||
})
|
||||
|
||||
async function checkUpdates() {
|
||||
if (!(await areUpdatesEnabled())) {
|
||||
console.log('Skipping update check as updates are disabled in this build or environment')
|
||||
updatesEnabled.value = false
|
||||
|
||||
if (os.value === 'Linux' && !isDevEnvironment.value) {
|
||||
checkLinuxUpdates()
|
||||
setInterval(checkLinuxUpdates, 5 * 60 * 1000)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
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
|
||||
@@ -527,7 +592,6 @@ async function checkUpdates() {
|
||||
|
||||
appUpdateDownload.progress.value = 0
|
||||
finishedDownloading.value = false
|
||||
updateToastDismissed.value = false
|
||||
|
||||
console.log(`Update ${update.version} is available.`)
|
||||
|
||||
@@ -537,6 +601,28 @@ async function checkUpdates() {
|
||||
downloadUpdate(update)
|
||||
} else {
|
||||
console.log(`Metered connection detected, not auto-downloading update.`)
|
||||
getUpdateSize(update.rid).then((size) => {
|
||||
updateSize.value = size
|
||||
addPopupNotification({
|
||||
title: formatMessage(updatePopupMessages.updateAvailable),
|
||||
text: formatMessage(updatePopupMessages.meteredBody, { version: update.version }),
|
||||
type: 'info',
|
||||
autoCloseMs: null,
|
||||
buttons: [
|
||||
{
|
||||
label: formatMessage(updatePopupMessages.download, {
|
||||
size: formatBytes(updateSize.value ?? 0),
|
||||
}),
|
||||
action: () => downloadAvailableUpdate(),
|
||||
color: 'brand',
|
||||
},
|
||||
{
|
||||
label: formatMessage(updatePopupMessages.changelog),
|
||||
action: () => openUrl('https://modrinth.com/news/changelog?filter=app'),
|
||||
},
|
||||
],
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
getUpdateSize(update.rid).then((size) => (updateSize.value = size))
|
||||
@@ -553,8 +639,26 @@ async function checkUpdates() {
|
||||
)
|
||||
}
|
||||
|
||||
async function showUpdateToast() {
|
||||
updateToastDismissed.value = false
|
||||
async function checkLinuxUpdates() {
|
||||
try {
|
||||
const [response, currentVersion] = await Promise.all([
|
||||
fetch('https://launcher-files.modrinth.com/updates.json'),
|
||||
getVersion(),
|
||||
])
|
||||
const updates = await response.json()
|
||||
const latestVersion = updates?.version
|
||||
|
||||
if (latestVersion && latestVersion !== currentVersion) {
|
||||
addPopupNotification({
|
||||
title: formatMessage(updatePopupMessages.updateAvailable),
|
||||
text: formatMessage(updatePopupMessages.linuxBody, { version: latestVersion }),
|
||||
type: 'info',
|
||||
autoCloseMs: null,
|
||||
})
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to check for updates:', e)
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadAvailableUpdate() {
|
||||
@@ -580,6 +684,26 @@ async function downloadUpdate(versionToDownload) {
|
||||
unlistenUpdateDownload = null
|
||||
})
|
||||
console.log('Finished downloading!')
|
||||
|
||||
addPopupNotification({
|
||||
title: formatMessage(updatePopupMessages.downloadComplete),
|
||||
text: formatMessage(updatePopupMessages.downloadedBody, {
|
||||
version: versionToDownload.version,
|
||||
}),
|
||||
type: 'success',
|
||||
autoCloseMs: null,
|
||||
buttons: [
|
||||
{
|
||||
label: formatMessage(updatePopupMessages.reload),
|
||||
action: () => installUpdate(),
|
||||
color: 'brand',
|
||||
},
|
||||
{
|
||||
label: formatMessage(updatePopupMessages.changelog),
|
||||
action: () => openUrl('https://modrinth.com/news/changelog?filter=app'),
|
||||
},
|
||||
],
|
||||
})
|
||||
})
|
||||
unlistenUpdateDownload = await subscribeToDownloadProgress(
|
||||
appUpdateDownload,
|
||||
@@ -753,24 +877,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
class="app-grid-layout experimental-styles-within relative"
|
||||
:class="{ 'disable-advanced-rendering': !themeStore.advancedRendering }"
|
||||
>
|
||||
<Suspense>
|
||||
<Transition name="toast">
|
||||
<UpdateToast
|
||||
v-if="
|
||||
!!availableUpdate &&
|
||||
!updateToastDismissed &&
|
||||
!restarting &&
|
||||
(finishedDownloading || metered)
|
||||
"
|
||||
:version="availableUpdate.version"
|
||||
:size="updateSize"
|
||||
:metered="metered"
|
||||
@close="updateToastDismissed = true"
|
||||
@restart="installUpdate"
|
||||
@download="downloadAvailableUpdate"
|
||||
/>
|
||||
</Transition>
|
||||
</Suspense>
|
||||
<Transition name="fade">
|
||||
<div
|
||||
v-if="restarting"
|
||||
@@ -847,14 +953,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
</NavButton>
|
||||
<div class="flex flex-grow"></div>
|
||||
<Transition name="nav-button-animated">
|
||||
<div
|
||||
v-if="
|
||||
availableUpdate &&
|
||||
updateToastDismissed &&
|
||||
!restarting &&
|
||||
(finishedDownloading || metered)
|
||||
"
|
||||
>
|
||||
<div v-if="availableUpdate && !restarting && (finishedDownloading || metered)">
|
||||
<NavButton
|
||||
v-tooltip.right="
|
||||
formatMessage(
|
||||
@@ -868,13 +967,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
},
|
||||
)
|
||||
"
|
||||
:to="
|
||||
finishedDownloading
|
||||
? installUpdate
|
||||
: downloadProgress > 0 && downloadProgress < 1
|
||||
? showUpdateToast
|
||||
: downloadAvailableUpdate
|
||||
"
|
||||
:to="finishedDownloading ? installUpdate : downloadAvailableUpdate"
|
||||
>
|
||||
<ProgressSpinner
|
||||
v-if="downloadProgress > 0 && downloadProgress < 1"
|
||||
@@ -893,7 +986,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
<SettingsIcon />
|
||||
</NavButton>
|
||||
<OverflowMenu
|
||||
v-if="credentials"
|
||||
v-if="credentials?.user"
|
||||
v-tooltip.right="`Modrinth account`"
|
||||
class="w-12 h-12 text-primary rounded-full flex items-center justify-center text-2xl transition-all bg-transparent hover:bg-button-bg hover:text-contrast border-0 cursor-pointer"
|
||||
:options="[
|
||||
@@ -909,14 +1002,14 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
]"
|
||||
placement="right-end"
|
||||
>
|
||||
<Avatar :src="credentials.user.avatar_url" alt="" size="32px" circle />
|
||||
<Avatar :src="credentials?.user?.avatar_url" alt="" size="32px" circle />
|
||||
<template #view-profile>
|
||||
<UserIcon />
|
||||
<span class="inline-flex items-center gap-1">
|
||||
Signed in as
|
||||
<span class="inline-flex items-center gap-1 text-contrast font-semibold">
|
||||
<Avatar :src="credentials.user.avatar_url" alt="" size="20px" circle />
|
||||
{{ credentials.user.username }}
|
||||
<Avatar :src="credentials?.user?.avatar_url" alt="" size="20px" circle />
|
||||
{{ credentials?.user?.username }}
|
||||
</span>
|
||||
</span>
|
||||
<ExternalIcon />
|
||||
@@ -996,7 +1089,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">
|
||||
@@ -1122,11 +1215,17 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
</div>
|
||||
</div>
|
||||
<URLConfirmModal ref="urlModal" />
|
||||
<I18nDebugPanel />
|
||||
<NotificationPanel has-sidebar />
|
||||
<PopupNotificationPanel has-sidebar />
|
||||
<ErrorModal ref="errorModal" />
|
||||
<MinecraftAuthErrorModal ref="minecraftAuthErrorModal" />
|
||||
<ModInstallModal ref="modInstallModal" />
|
||||
<AddServerToInstanceModal ref="addServerToInstanceModal" />
|
||||
<IncompatibilityWarningModal ref="incompatibilityWarningModal" />
|
||||
<InstallConfirmModal ref="installConfirmModal" />
|
||||
<InstallToPlayModal ref="installToPlayModal" />
|
||||
<UpdateToPlayModal ref="updateToPlayModal" />
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@@ -1355,38 +1454,15 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
transform: translateY(10rem) scale(0.8) scaleY(1.6);
|
||||
}
|
||||
|
||||
.toast-enter-active {
|
||||
transition: opacity 0.25s linear;
|
||||
}
|
||||
|
||||
.toast-enter-from,
|
||||
.toast-leave-to {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.toast-enter-active,
|
||||
.nav-button-animated-enter-active {
|
||||
transition: all 0.5s cubic-bezier(0.15, 1.4, 0.64, 0.96);
|
||||
}
|
||||
|
||||
.toast-leave-active,
|
||||
.nav-button-animated-leave-active {
|
||||
transition: all 0.25s ease;
|
||||
}
|
||||
|
||||
.toast-enter-from {
|
||||
scale: 0.5;
|
||||
translate: 0 -10rem;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.toast-leave-to {
|
||||
scale: 0.96;
|
||||
translate: 20rem 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.nav-button-animated-enter-active {
|
||||
position: relative;
|
||||
}
|
||||
@@ -1450,7 +1526,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
}
|
||||
|
||||
.info-card {
|
||||
right: 8rem;
|
||||
right: 22rem;
|
||||
}
|
||||
|
||||
.profile-card {
|
||||
|
||||
@@ -85,10 +85,6 @@ a {
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.badge {
|
||||
display: flex;
|
||||
border-radius: var(--radius-md);
|
||||
@@ -159,4 +155,23 @@ img {
|
||||
box-shadow: var(--shadow-card);
|
||||
}
|
||||
|
||||
// From the Bootstrap project
|
||||
// The MIT License (MIT)
|
||||
// Copyright (c) 2011-2023 The Bootstrap Authors
|
||||
// https://github.com/twbs/bootstrap/blob/2f617215755b066904248525a8c56ea425dde871/scss/mixins/_visually-hidden.scss#L8
|
||||
.visually-hidden {
|
||||
width: 1px !important;
|
||||
height: 1px !important;
|
||||
padding: 0 !important;
|
||||
margin: -1px !important;
|
||||
overflow: hidden !important;
|
||||
clip: rect(0, 0, 0, 0) !important;
|
||||
white-space: nowrap !important;
|
||||
border: 0 !important;
|
||||
|
||||
&:not(caption) {
|
||||
position: absolute !important;
|
||||
}
|
||||
}
|
||||
|
||||
@import '@modrinth/assets/omorphia.scss';
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -33,6 +33,7 @@ const metadata = ref({})
|
||||
|
||||
defineExpose({
|
||||
async show(errorVal, context, canClose = true, source = null) {
|
||||
console.log(errorVal, context, canClose, source)
|
||||
closable.value = canClose
|
||||
|
||||
if (errorVal.message && errorVal.message.includes('Minecraft authentication error:')) {
|
||||
|
||||
@@ -1,6 +1,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>
|
||||
|
||||
@@ -69,7 +69,7 @@ const play = async (e, context) => {
|
||||
await run(props.instance.path)
|
||||
.catch((err) => handleSevereError(err, { profilePath: props.instance.path }))
|
||||
.finally(() => {
|
||||
trackEvent('InstancePlay', {
|
||||
trackEvent('InstanceStart', {
|
||||
loader: props.instance.loader,
|
||||
game_version: props.instance.game_version,
|
||||
source: context,
|
||||
|
||||
@@ -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">
|
||||
@@ -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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
+6
-5
@@ -1,7 +1,6 @@
|
||||
<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, useCompactNumber } from '@modrinth/ui'
|
||||
import dayjs from 'dayjs'
|
||||
import relativeTime from 'dayjs/plugin/relativeTime'
|
||||
import { computed } from 'vue'
|
||||
@@ -11,6 +10,8 @@ dayjs.extend(relativeTime)
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
const { formatCompactNumber } = useCompactNumber()
|
||||
|
||||
const props = defineProps({
|
||||
project: {
|
||||
type: Object,
|
||||
@@ -96,18 +97,18 @@ const toTransparent = computed(() => {
|
||||
class="flex items-center gap-1 pr-2 border-0 border-r-[1px] border-solid border-button-border"
|
||||
>
|
||||
<DownloadIcon />
|
||||
{{ formatNumber(project.downloads) }}
|
||||
{{ formatCompactNumber(project.downloads) }}
|
||||
</div>
|
||||
<div
|
||||
class="flex items-center gap-1 pr-2 border-0 border-r-[1px] border-solid border-button-border"
|
||||
>
|
||||
<HeartIcon />
|
||||
{{ formatNumber(project.follows) }}
|
||||
{{ formatCompactNumber(project.follows) }}
|
||||
</div>
|
||||
<div class="flex items-center gap-1 pr-2">
|
||||
<TagIcon />
|
||||
<TagItem>
|
||||
{{ formatCategory(featuredCategory) }}
|
||||
<FormattedTag :tag="featuredCategory" />
|
||||
</TagItem>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,5 +1,7 @@
|
||||
<template>
|
||||
<nav
|
||||
v-if="filteredLinks.length > 1"
|
||||
ref="scrollContainer"
|
||||
class="card-shadow experimental-styles-within relative flex w-fit overflow-clip rounded-full bg-bg-raised p-1 text-sm font-bold"
|
||||
>
|
||||
<RouterLink
|
||||
@@ -14,13 +16,17 @@
|
||||
<span class="text-nowrap">{{ link.label }}</span>
|
||||
</RouterLink>
|
||||
<div
|
||||
:class="`navtabs-transition pointer-events-none absolute h-[calc(100%-0.5rem)] overflow-hidden rounded-full p-1 ${subpageSelected ? 'bg-button-bg' : 'bg-button-bgSelected'}`"
|
||||
:class="[
|
||||
'pointer-events-none absolute h-[calc(100%-0.5rem)] overflow-hidden rounded-full p-1',
|
||||
subpageSelected ? 'bg-button-bg' : 'bg-button-bgSelected',
|
||||
{ 'navtabs-transition': transitionsEnabled },
|
||||
]"
|
||||
:style="{
|
||||
left: sliderLeftPx,
|
||||
top: sliderTopPx,
|
||||
right: sliderRightPx,
|
||||
bottom: sliderBottomPx,
|
||||
opacity: sliderLeft === 4 && sliderLeft === sliderRight ? 0 : activeIndex === -1 ? 0 : 1,
|
||||
opacity: sliderReady && activeIndex !== -1 ? 1 : 0,
|
||||
}"
|
||||
aria-hidden="true"
|
||||
></div>
|
||||
@@ -28,7 +34,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
|
||||
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
|
||||
import type { RouteLocationRaw } from 'vue-router'
|
||||
import { RouterLink, useRoute } from 'vue-router'
|
||||
|
||||
@@ -47,13 +53,16 @@ const props = defineProps<{
|
||||
query?: string
|
||||
}>()
|
||||
|
||||
const scrollContainer = ref<HTMLElement | null>(null)
|
||||
const sliderLeft = ref(4)
|
||||
const sliderTop = ref(4)
|
||||
const sliderRight = ref(4)
|
||||
const sliderBottom = ref(4)
|
||||
const activeIndex = ref(-1)
|
||||
const oldIndex = ref(-1)
|
||||
const subpageSelected = ref(false)
|
||||
const sliderReady = ref(false)
|
||||
const transitionsEnabled = ref(false)
|
||||
const sliderDelays = ref({ left: '0ms', top: '0ms', right: '0ms', bottom: '0ms' })
|
||||
|
||||
const filteredLinks = computed(() =>
|
||||
props.links.filter((x) => (x.shown === undefined ? true : x.shown)),
|
||||
@@ -63,6 +72,11 @@ const sliderTopPx = computed(() => `${sliderTop.value}px`)
|
||||
const sliderRightPx = computed(() => `${sliderRight.value}px`)
|
||||
const sliderBottomPx = computed(() => `${sliderBottom.value}px`)
|
||||
|
||||
const leftDelay = computed(() => sliderDelays.value.left)
|
||||
const rightDelay = computed(() => sliderDelays.value.right)
|
||||
const topDelay = computed(() => sliderDelays.value.top)
|
||||
const bottomDelay = computed(() => sliderDelays.value.bottom)
|
||||
|
||||
function pickLink() {
|
||||
let index = -1
|
||||
subpageSelected.value = false
|
||||
@@ -83,57 +97,54 @@ function pickLink() {
|
||||
if (activeIndex.value !== -1) {
|
||||
startAnimation()
|
||||
} else {
|
||||
oldIndex.value = -1
|
||||
sliderLeft.value = 0
|
||||
sliderRight.value = 0
|
||||
}
|
||||
}
|
||||
|
||||
const tabLinkElements = ref()
|
||||
function getTabElement(index: number): HTMLElement | null {
|
||||
if (index === -1) return null
|
||||
const container = scrollContainer.value
|
||||
if (!container) return null
|
||||
const tabs = container.querySelectorAll('.button-animation')
|
||||
return (tabs[index] as HTMLElement) ?? null
|
||||
}
|
||||
|
||||
function startAnimation() {
|
||||
const el = tabLinkElements.value[activeIndex.value].$el
|
||||
|
||||
if (!el || !el.offsetParent) return
|
||||
const el = getTabElement(activeIndex.value)
|
||||
if (!el?.offsetParent) return
|
||||
|
||||
const parent = el.offsetParent as HTMLElement
|
||||
const newValues = {
|
||||
left: el.offsetLeft,
|
||||
top: el.offsetTop,
|
||||
right: el.offsetParent.offsetWidth - el.offsetLeft - el.offsetWidth,
|
||||
bottom: el.offsetParent.offsetHeight - el.offsetTop - el.offsetHeight,
|
||||
right: parent.offsetWidth - el.offsetLeft - el.offsetWidth,
|
||||
bottom: parent.offsetHeight - el.offsetTop - el.offsetHeight,
|
||||
}
|
||||
|
||||
if (sliderLeft.value === 4 && sliderRight.value === 4) {
|
||||
const isInitialPosition = sliderLeft.value === 4 && sliderRight.value === 4
|
||||
|
||||
if (isInitialPosition) {
|
||||
sliderLeft.value = newValues.left
|
||||
sliderRight.value = newValues.right
|
||||
sliderTop.value = newValues.top
|
||||
sliderBottom.value = newValues.bottom
|
||||
sliderReady.value = true
|
||||
requestAnimationFrame(() => {
|
||||
transitionsEnabled.value = true
|
||||
})
|
||||
} else {
|
||||
const delay = 200
|
||||
|
||||
if (newValues.left < sliderLeft.value) {
|
||||
sliderLeft.value = newValues.left
|
||||
setTimeout(() => {
|
||||
sliderRight.value = newValues.right
|
||||
}, delay)
|
||||
} else {
|
||||
sliderRight.value = newValues.right
|
||||
setTimeout(() => {
|
||||
sliderLeft.value = newValues.left
|
||||
}, delay)
|
||||
}
|
||||
|
||||
if (newValues.top < sliderTop.value) {
|
||||
sliderTop.value = newValues.top
|
||||
setTimeout(() => {
|
||||
sliderBottom.value = newValues.bottom
|
||||
}, delay)
|
||||
} else {
|
||||
sliderBottom.value = newValues.bottom
|
||||
setTimeout(() => {
|
||||
sliderTop.value = newValues.top
|
||||
}, delay)
|
||||
const STAGGER_DELAY = '200ms'
|
||||
sliderDelays.value = {
|
||||
left: newValues.left < sliderLeft.value ? '0ms' : STAGGER_DELAY,
|
||||
right: newValues.left < sliderLeft.value ? STAGGER_DELAY : '0ms',
|
||||
top: newValues.top < sliderTop.value ? '0ms' : STAGGER_DELAY,
|
||||
bottom: newValues.top < sliderTop.value ? STAGGER_DELAY : '0ms',
|
||||
}
|
||||
sliderLeft.value = newValues.left
|
||||
sliderRight.value = newValues.right
|
||||
sliderTop.value = newValues.top
|
||||
sliderBottom.value = newValues.bottom
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,7 +157,17 @@ onUnmounted(() => {
|
||||
window.removeEventListener('resize', pickLink)
|
||||
})
|
||||
|
||||
watch(route, () => {
|
||||
watch(
|
||||
filteredLinks,
|
||||
async () => {
|
||||
await nextTick()
|
||||
pickLink()
|
||||
},
|
||||
{ deep: true },
|
||||
)
|
||||
|
||||
watch(route, async () => {
|
||||
await nextTick()
|
||||
pickLink()
|
||||
})
|
||||
</script>
|
||||
@@ -154,7 +175,10 @@ watch(route, () => {
|
||||
.navtabs-transition {
|
||||
/* Delay on opacity is to hide any jankiness as the page loads */
|
||||
transition:
|
||||
all 150ms cubic-bezier(0.4, 0, 0.2, 1) 0s,
|
||||
left 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(leftDelay),
|
||||
right 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(rightDelay),
|
||||
top 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(topDelay),
|
||||
bottom 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(bottomDelay),
|
||||
opacity 250ms cubic-bezier(0.5, 0, 0.2, 1) 50ms;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -69,7 +69,10 @@ 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-divider"></div>
|
||||
<div
|
||||
v-if="instances && recentInstances.length > 0"
|
||||
class="h-px w-6 mx-auto my-2 bg-divider"
|
||||
></div>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
|
||||
@@ -52,10 +52,12 @@
|
||||
<h3 class="info-title">
|
||||
{{ loadingBar.title }}
|
||||
</h3>
|
||||
<ProgressBar :progress="Math.floor((100 * loadingBar.current) / loadingBar.total)" />
|
||||
<div class="row">
|
||||
{{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
|
||||
{{ loadingBar.message }}
|
||||
<div class="flex flex-col gap-2 w-full">
|
||||
<ProgressBar :progress="Math.floor((100 * loadingBar.current) / loadingBar.total)" />
|
||||
<div class="row">
|
||||
{{ Math.floor((100 * loadingBar.current) / loadingBar.total) }}%
|
||||
{{ loadingBar.message }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Card>
|
||||
@@ -346,7 +348,7 @@ onBeforeUnmount(() => {
|
||||
.info-card {
|
||||
position: absolute;
|
||||
top: 3.5rem;
|
||||
right: 0.5rem;
|
||||
right: 2rem;
|
||||
z-index: 9;
|
||||
width: 20rem;
|
||||
background-color: var(--color-raised-bg);
|
||||
@@ -420,7 +422,7 @@ onBeforeUnmount(() => {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 0.5rem;
|
||||
gap: 0.75rem;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@@ -1,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'])
|
||||
|
||||
@@ -1,130 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { DownloadIcon, ExternalIcon, RefreshCwIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
|
||||
import { ButtonStyled, commonMessages, defineMessages, ProgressBar, useVIntl } from '@modrinth/ui'
|
||||
import { formatBytes } from '@modrinth/utils'
|
||||
import { ref } from 'vue'
|
||||
|
||||
import { injectAppUpdateDownloadProgress } from '@/providers/download-progress.ts'
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'close' | 'restart' | 'download'): void
|
||||
}>()
|
||||
|
||||
defineProps<{
|
||||
version: string
|
||||
size: number | null
|
||||
metered: boolean
|
||||
}>()
|
||||
|
||||
const downloading = ref(false)
|
||||
const { progress } = injectAppUpdateDownloadProgress()
|
||||
|
||||
function download() {
|
||||
emit('download')
|
||||
downloading.value = true
|
||||
}
|
||||
|
||||
const messages = defineMessages({
|
||||
title: {
|
||||
id: 'app.update-toast.title',
|
||||
defaultMessage: 'Update available',
|
||||
},
|
||||
body: {
|
||||
id: 'app.update-toast.body',
|
||||
defaultMessage:
|
||||
'Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App.',
|
||||
},
|
||||
reload: {
|
||||
id: 'app.update-toast.reload',
|
||||
defaultMessage: 'Reload',
|
||||
},
|
||||
download: {
|
||||
id: 'app.update-toast.download',
|
||||
defaultMessage: 'Download ({size})',
|
||||
},
|
||||
downloading: {
|
||||
id: 'app.update-toast.downloading',
|
||||
defaultMessage: 'Downloading...',
|
||||
},
|
||||
changelog: {
|
||||
id: 'app.update-toast.changelog',
|
||||
defaultMessage: 'Changelog',
|
||||
},
|
||||
meteredBody: {
|
||||
id: 'app.update-toast.body.metered',
|
||||
defaultMessage: `Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it.`,
|
||||
},
|
||||
downloadCompleteTitle: {
|
||||
id: 'app.update-toast.title.download-complete',
|
||||
defaultMessage: 'Download complete',
|
||||
},
|
||||
downloadedBody: {
|
||||
id: 'app.update-toast.body.download-complete',
|
||||
defaultMessage: `Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App.`,
|
||||
},
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<div
|
||||
class="grid grid-cols-[min-content] fixed card-shadow rounded-2xl top-[--top-bar-height] mt-6 right-6 p-4 z-10 bg-bg-raised border-divider border-solid border-[2px]"
|
||||
:class="{
|
||||
'download-complete': progress === 1,
|
||||
}"
|
||||
>
|
||||
<div class="flex min-w-[25rem] gap-4">
|
||||
<h2 class="whitespace-nowrap text-base text-contrast font-semibold m-0 grow">
|
||||
{{
|
||||
formatMessage(metered && progress === 1 ? messages.downloadCompleteTitle : messages.title)
|
||||
}}
|
||||
</h2>
|
||||
<ButtonStyled size="small" circular>
|
||||
<button v-tooltip="formatMessage(commonMessages.closeButton)" @click="emit('close')">
|
||||
<XIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<p class="text-sm mt-2 mb-0">
|
||||
{{
|
||||
formatMessage(
|
||||
metered
|
||||
? progress === 1
|
||||
? messages.downloadedBody
|
||||
: messages.meteredBody
|
||||
: messages.body,
|
||||
{ version },
|
||||
)
|
||||
}}
|
||||
</p>
|
||||
<p
|
||||
v-if="metered && progress < 1"
|
||||
class="text-sm text-secondary mt-2 mb-0 flex items-center gap-1"
|
||||
>
|
||||
<template v-if="progress > 0">
|
||||
<ProgressBar :progress="progress" class="max-w-[unset]" />
|
||||
</template>
|
||||
</p>
|
||||
<div class="flex gap-2 mt-4">
|
||||
<ButtonStyled color="brand">
|
||||
<button v-if="metered && progress < 1" :disabled="downloading" @click="download">
|
||||
<SpinnerIcon v-if="downloading" class="animate-spin" />
|
||||
<DownloadIcon v-else />
|
||||
{{
|
||||
formatMessage(downloading ? messages.downloading : messages.download, {
|
||||
size: formatBytes(size ?? 0),
|
||||
})
|
||||
}}
|
||||
</button>
|
||||
<button v-else @click="emit('restart')">
|
||||
<RefreshCwIcon /> {{ formatMessage(messages.reload) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled>
|
||||
<a href="https://modrinth.com/news/changelog?filter=app">
|
||||
{{ formatMessage(messages.changelog) }} <ExternalIcon />
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -3,10 +3,10 @@ import { MailIcon, SendIcon, UserIcon, UserPlusIcon, XIcon } from '@modrinth/ass
|
||||
import {
|
||||
Avatar,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
IntlFormatted,
|
||||
StyledInput,
|
||||
useRelativeTime,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
@@ -271,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 />
|
||||
@@ -300,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) }}
|
||||
@@ -413,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>
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
<script setup>
|
||||
import { CheckIcon, PlusIcon, SearchIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
Avatar,
|
||||
ButtonStyled,
|
||||
injectNotificationManager,
|
||||
StyledInput,
|
||||
} from '@modrinth/ui'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
||||
import { trackEvent } from '@/helpers/analytics'
|
||||
import { list } from '@/helpers/profile'
|
||||
import { add_server_to_profile, get_profile_worlds } from '@/helpers/worlds.ts'
|
||||
|
||||
const { handleError } = injectNotificationManager()
|
||||
|
||||
const modal = ref()
|
||||
const searchFilter = ref('')
|
||||
const profiles = ref([])
|
||||
|
||||
const serverName = ref('')
|
||||
const serverAddress = ref('')
|
||||
|
||||
const shownProfiles = computed(() =>
|
||||
profiles.value.filter((profile) => {
|
||||
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
|
||||
}),
|
||||
)
|
||||
|
||||
defineExpose({
|
||||
show: async (name, address) => {
|
||||
serverName.value = name
|
||||
serverAddress.value = address
|
||||
searchFilter.value = ''
|
||||
|
||||
const profilesVal = await list().catch(handleError)
|
||||
for (const profile of profilesVal) {
|
||||
profile.adding = false
|
||||
profile.added = false
|
||||
|
||||
try {
|
||||
const worlds = await get_profile_worlds(profile.path)
|
||||
profile.added = worlds.some((w) => w.type === 'server' && w.address === serverAddress.value)
|
||||
} catch {
|
||||
// Ignore - will show as not added
|
||||
}
|
||||
}
|
||||
|
||||
profiles.value = profilesVal
|
||||
modal.value.show()
|
||||
|
||||
trackEvent('AddServerToInstanceStart', { source: 'AddServerToInstanceModal' })
|
||||
},
|
||||
})
|
||||
|
||||
async function addServer(profile) {
|
||||
profile.adding = true
|
||||
try {
|
||||
await add_server_to_profile(profile.path, serverName.value, serverAddress.value, 'prompt')
|
||||
profile.added = true
|
||||
|
||||
trackEvent('AddServerToInstance', {
|
||||
server_name: serverName.value,
|
||||
instance_name: profile.name,
|
||||
source: 'AddServerToInstanceModal',
|
||||
})
|
||||
} catch (err) {
|
||||
handleError(err)
|
||||
}
|
||||
profile.adding = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ModalWrapper ref="modal" header="Add server to instance">
|
||||
<div class="flex flex-col gap-4 min-w-[350px]">
|
||||
<Admonition type="warning" body="This server may not be compatible with all instances." />
|
||||
<StyledInput
|
||||
v-model="searchFilter"
|
||||
:icon="SearchIcon"
|
||||
type="search"
|
||||
placeholder="Search for an instance"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<div class="max-h-[21rem] overflow-y-auto">
|
||||
<div
|
||||
v-for="profile in shownProfiles"
|
||||
:key="profile.path"
|
||||
class="flex w-full items-center justify-between gap-2 bg-bg-raised text-icon shadow-none"
|
||||
>
|
||||
<router-link
|
||||
class="btn btn-transparent p-2 text-left"
|
||||
:to="`/instance/${encodeURIComponent(profile.path)}`"
|
||||
@click="modal.hide()"
|
||||
>
|
||||
<Avatar
|
||||
:src="profile.icon_path ? convertFileSrc(profile.icon_path) : null"
|
||||
class="mr-2 [--size:2rem]"
|
||||
/>
|
||||
{{ profile.name }}
|
||||
</router-link>
|
||||
<ButtonStyled>
|
||||
<button :disabled="profile.added || profile.adding" @click="addServer(profile)">
|
||||
<PlusIcon v-if="!profile.added && !profile.adding" />
|
||||
<CheckIcon v-else-if="profile.added" />
|
||||
{{ profile.adding ? 'Adding...' : profile.added ? 'Added' : 'Add' }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-group push-right">
|
||||
<ButtonStyled>
|
||||
<button @click="modal.hide()">Cancel</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
</ModalWrapper>
|
||||
</template>
|
||||
@@ -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'
|
||||
@@ -15,6 +16,7 @@ import { useRouter } from 'vue-router'
|
||||
|
||||
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
||||
import { trackEvent } from '@/helpers/analytics'
|
||||
import { get_project_v3_many } from '@/helpers/cache.js'
|
||||
import {
|
||||
add_project_from_version as installMod,
|
||||
check_installed,
|
||||
@@ -48,19 +50,14 @@ const creatingInstance = ref(false)
|
||||
const profiles = ref([])
|
||||
|
||||
const shownProfiles = computed(() =>
|
||||
profiles.value
|
||||
.filter((profile) => {
|
||||
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
|
||||
})
|
||||
.filter((profile) => {
|
||||
const version = {
|
||||
game_versions: versions.value.flatMap((v) => v.game_versions),
|
||||
loaders: versions.value.flatMap((v) => v.loaders),
|
||||
}
|
||||
return isVersionCompatible(version, project.value, profile)
|
||||
}),
|
||||
profiles.value.filter((profile) => {
|
||||
return profile.name.toLowerCase().includes(searchFilter.value.toLowerCase())
|
||||
}),
|
||||
)
|
||||
|
||||
const isProfileCompatible = (profile) =>
|
||||
versions.value?.some((version) => isVersionCompatible(version, project.value, profile))
|
||||
|
||||
const onInstall = ref(() => {})
|
||||
|
||||
defineExpose({
|
||||
@@ -85,6 +82,22 @@ defineExpose({
|
||||
handleError,
|
||||
)
|
||||
}
|
||||
|
||||
const linkedProjectIds = profilesVal
|
||||
.filter((p) => p.linked_data?.project_id)
|
||||
.map((p) => p.linked_data.project_id)
|
||||
if (linkedProjectIds.length > 0) {
|
||||
const linkedProjects = await get_project_v3_many(linkedProjectIds, 'must_revalidate').catch(
|
||||
() => [],
|
||||
)
|
||||
const serverProjectIds = new Set(
|
||||
linkedProjects.filter((p) => p?.minecraft_server != null).map((p) => p.id),
|
||||
)
|
||||
for (const profile of profilesVal) {
|
||||
profile.isServerInstance = serverProjectIds.has(profile.linked_data?.project_id)
|
||||
}
|
||||
}
|
||||
|
||||
profiles.value = profilesVal
|
||||
|
||||
installModal.value.show()
|
||||
@@ -159,20 +172,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.includes('fabric')
|
||||
? 'fabric'
|
||||
: loaders.includes('neoforge')
|
||||
? 'neoforge'
|
||||
: loaders.includes('forge')
|
||||
? 'forge'
|
||||
: loaders.includes('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 +224,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">
|
||||
@@ -238,17 +252,23 @@ const createInstance = async () => {
|
||||
"
|
||||
>
|
||||
<Button
|
||||
:disabled="profile.installedMod || profile.installing"
|
||||
:disabled="
|
||||
!isProfileCompatible(profile) || profile.installedMod || profile.installing
|
||||
"
|
||||
@click="install(profile)"
|
||||
>
|
||||
<DownloadIcon v-if="!profile.installedMod && !profile.installing" />
|
||||
<DownloadIcon
|
||||
v-if="isProfileCompatible(profile) && !profile.installedMod && !profile.installing"
|
||||
/>
|
||||
<CheckIcon v-else-if="profile.installedMod" />
|
||||
{{
|
||||
profile.installing
|
||||
? 'Installing...'
|
||||
: profile.installedMod
|
||||
? 'Installed'
|
||||
: 'Install'
|
||||
: !isProfileCompatible(profile)
|
||||
? 'Incompatible'
|
||||
: 'Install'
|
||||
}}
|
||||
</Button>
|
||||
</div>
|
||||
@@ -270,7 +290,7 @@ const createInstance = async () => {
|
||||
</div>
|
||||
</div>
|
||||
<div class="creation-settings">
|
||||
<input
|
||||
<StyledInput
|
||||
v-model="name"
|
||||
autocomplete="off"
|
||||
type="text"
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
OverflowMenu,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
@@ -245,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'">
|
||||
@@ -292,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,5 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { Checkbox, defineMessages, injectNotificationManager, useVIntl } from '@modrinth/ui'
|
||||
import {
|
||||
Checkbox,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed, ref, watch } from 'vue'
|
||||
|
||||
import { edit } from '@/helpers/profile'
|
||||
@@ -108,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">
|
||||
@@ -124,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">
|
||||
@@ -140,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,
|
||||
@@ -17,23 +18,18 @@ import {
|
||||
Chips,
|
||||
Combobox,
|
||||
defineMessages,
|
||||
formatLoader,
|
||||
injectNotificationManager,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import {
|
||||
formatCategory,
|
||||
type GameVersionTag,
|
||||
type PlatformTag,
|
||||
type Project,
|
||||
type Version,
|
||||
} from '@modrinth/utils'
|
||||
import type { GameVersionTag, PlatformTag, Project, Version } from '@modrinth/utils'
|
||||
import dayjs from 'dayjs'
|
||||
import { computed, type ComputedRef, type Ref, ref, shallowRef, watch } from 'vue'
|
||||
|
||||
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
|
||||
import ModpackVersionModal from '@/components/ui/ModpackVersionModal.vue'
|
||||
import { trackEvent } from '@/helpers/analytics'
|
||||
import { get_project, get_version_many } from '@/helpers/cache'
|
||||
import { get_project, get_version, get_version_many } from '@/helpers/cache'
|
||||
import { get_loader_versions } from '@/helpers/metadata'
|
||||
import { edit, install, update_repair_modrinth } from '@/helpers/profile'
|
||||
import { get_game_versions, get_loaders } from '@/helpers/tags'
|
||||
@@ -53,6 +49,9 @@ const modalConfirmUnpair = ref()
|
||||
const modalConfirmReinstall = ref()
|
||||
|
||||
const props = defineProps<InstanceSettingsTabProps>()
|
||||
const emit = defineEmits<{
|
||||
unlinked: []
|
||||
}>()
|
||||
|
||||
const loader = ref(props.instance.loader)
|
||||
const gameVersion = ref(props.instance.game_version)
|
||||
@@ -114,6 +113,12 @@ if (props.instance.linked_data && props.instance.linked_data.project_id && !prop
|
||||
versions.find(
|
||||
(version: Version) => version.id === props.instance.linked_data?.version_id,
|
||||
) ?? null
|
||||
|
||||
if (!modpackVersion.value) {
|
||||
get_version(props.instance.linked_data?.version_id, 'bypass')
|
||||
.then((version: Version) => (modpackVersion.value = version ?? null))
|
||||
.catch(handleError)
|
||||
}
|
||||
})
|
||||
.catch(handleError)
|
||||
.finally(() => {
|
||||
@@ -129,9 +134,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) => {
|
||||
@@ -273,7 +276,7 @@ async function unpairProfile() {
|
||||
modpackProject.value = null
|
||||
modpackVersion.value = null
|
||||
modpackVersions.value = null
|
||||
modalConfirmUnpair.value.hide()
|
||||
emit('unlinked')
|
||||
}
|
||||
|
||||
async function repairModpack() {
|
||||
@@ -430,6 +433,18 @@ const messages = defineMessages({
|
||||
id: 'instance.settings.tabs.installation.unlink.description',
|
||||
defaultMessage: `This instance is linked to a modpack, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the modpack.`,
|
||||
},
|
||||
unlinkServerTitle: {
|
||||
id: 'instance.settings.tabs.installation.unlink-server.title',
|
||||
defaultMessage: 'Unlink from server',
|
||||
},
|
||||
unlinkServerDescription: {
|
||||
id: 'instance.settings.tabs.installation.unlink-server.description',
|
||||
defaultMessage: `This instance is linked to a server, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the server.`,
|
||||
},
|
||||
unlinkServerVanillaDescription: {
|
||||
id: 'instance.settings.tabs.installation.unlink-server-vanilla.description',
|
||||
defaultMessage: `This instance is linked to a server, which means you can't change the Minecraft version. Unlinking will permanently disconnect this instance from the server.`,
|
||||
},
|
||||
unlinkInstanceButton: {
|
||||
id: 'instance.settings.tabs.installation.unlink.button',
|
||||
defaultMessage: 'Unlink instance',
|
||||
@@ -441,7 +456,7 @@ const messages = defineMessages({
|
||||
unlinkInstanceConfirmDescription: {
|
||||
id: 'instance.settings.tabs.installation.unlink.confirm.description',
|
||||
defaultMessage:
|
||||
'If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal.',
|
||||
'If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal instance.',
|
||||
},
|
||||
reinstallModpackConfirmTitle: {
|
||||
id: 'instance.settings.tabs.installation.reinstall.confirm.title',
|
||||
@@ -550,7 +565,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">
|
||||
@@ -563,17 +578,27 @@ const messages = defineMessages({
|
||||
})
|
||||
}}
|
||||
</span>
|
||||
<span class="text-sm text-secondary leading-none">
|
||||
<span class="text-sm text-secondary leading-none capitalize">
|
||||
{{
|
||||
modpackProject
|
||||
? modpackVersion
|
||||
? modpackVersion?.version_number
|
||||
: 'Unknown version'
|
||||
: formatCategory(instance.loader)
|
||||
: props.isMinecraftServer
|
||||
? ''
|
||||
: 'Unknown version'
|
||||
: formatLoader(formatMessage, instance.loader)
|
||||
}}
|
||||
<template v-if="instance.loader !== 'vanilla' && !modpackProject">
|
||||
{{ instance.loader_version || formatMessage(messages.unknownVersion) }}
|
||||
</template>
|
||||
<template
|
||||
v-else-if="
|
||||
instance.loader && instance.loader !== 'vanilla' && props.isMinecraftServer
|
||||
"
|
||||
>
|
||||
{{ instance.loader }}
|
||||
{{ instance.loader_version }}
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -605,7 +630,10 @@ const messages = defineMessages({
|
||||
}}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-if="modpackProject" hover-color-fill="background">
|
||||
<ButtonStyled
|
||||
v-if="modpackProject && !props.isMinecraftServer"
|
||||
hover-color-fill="background"
|
||||
>
|
||||
<button
|
||||
v-tooltip="
|
||||
changingVersion
|
||||
@@ -677,7 +705,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"
|
||||
@@ -709,7 +741,7 @@ const messages = defineMessages({
|
||||
? messages.alreadyInstalledVanilla
|
||||
: messages.alreadyInstalledModded,
|
||||
{
|
||||
platform: formatCategory(loader),
|
||||
platform: formatLoader(formatMessage, loader),
|
||||
version: instance.loader_version,
|
||||
game_version: gameVersion,
|
||||
},
|
||||
@@ -756,17 +788,29 @@ const messages = defineMessages({
|
||||
<template v-else>
|
||||
<template v-if="instance.linked_data && instance.linked_data.locked">
|
||||
<h2 class="mt-4 mb-1 text-lg font-extrabold text-contrast block">
|
||||
{{ formatMessage(messages.unlinkInstanceTitle) }}
|
||||
{{
|
||||
formatMessage(
|
||||
props.isMinecraftServer ? messages.unlinkServerTitle : messages.unlinkInstanceTitle,
|
||||
)
|
||||
}}
|
||||
</h2>
|
||||
<p class="m-0">
|
||||
{{ formatMessage(messages.unlinkInstanceDescription) }}
|
||||
{{
|
||||
formatMessage(
|
||||
props.isMinecraftServer
|
||||
? instance.loader === 'vanilla'
|
||||
? messages.unlinkServerVanillaDescription
|
||||
: messages.unlinkServerDescription
|
||||
: messages.unlinkInstanceDescription,
|
||||
)
|
||||
}}
|
||||
</p>
|
||||
<ButtonStyled>
|
||||
<button class="mt-2" @click="modalConfirmUnpair.show()">
|
||||
<UnlinkIcon /> {{ formatMessage(messages.unlinkInstanceButton) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<template v-if="modpackProject">
|
||||
<template v-if="modpackProject && !props.isMinecraftServer">
|
||||
<div>
|
||||
<h2 class="m-0 mb-1 text-lg font-extrabold text-contrast block mt-4">
|
||||
{{ formatMessage(messages.reinstallModpackTitle) }}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
<script setup lang="ts">
|
||||
import { CheckCircleIcon, XCircleIcon } from '@modrinth/assets'
|
||||
import { Checkbox, defineMessages, injectNotificationManager, Slider, useVIntl } from '@modrinth/ui'
|
||||
import {
|
||||
Checkbox,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
Slider,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed, readonly, ref, watch } from 'vue'
|
||||
|
||||
import JavaSelector from '@/components/ui/JavaSelector.vue'
|
||||
@@ -155,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,5 +1,12 @@
|
||||
<script setup lang="ts">
|
||||
import { Checkbox, defineMessages, injectNotificationManager, Toggle, useVIntl } from '@modrinth/ui'
|
||||
import {
|
||||
Checkbox,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
StyledInput,
|
||||
Toggle,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed, type Ref, ref, watch } from 'vue'
|
||||
|
||||
import { edit } from '@/helpers/profile'
|
||||
@@ -121,7 +128,7 @@ const messages = defineMessages({
|
||||
{{ formatMessage(messages.widthDescription) }}
|
||||
</p>
|
||||
</div>
|
||||
<input
|
||||
<StyledInput
|
||||
id="width"
|
||||
v-model="resolution[0]"
|
||||
autocomplete="off"
|
||||
@@ -140,7 +147,7 @@ const messages = defineMessages({
|
||||
{{ formatMessage(messages.heightDescription) }}
|
||||
</p>
|
||||
</div>
|
||||
<input
|
||||
<StyledInput
|
||||
id="height"
|
||||
v-model="resolution[1]"
|
||||
autocomplete="off"
|
||||
|
||||
+195
@@ -0,0 +1,195 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
CheckIcon,
|
||||
CopyIcon,
|
||||
DropdownIcon,
|
||||
LogInIcon,
|
||||
MessagesSquareIcon,
|
||||
WrenchIcon,
|
||||
} from '@modrinth/assets'
|
||||
import { Admonition, ButtonStyled, Collapsible, NewModal } from '@modrinth/ui'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
|
||||
import { login as login_flow, set_default_user } from '@/helpers/auth.js'
|
||||
import { handleSevereError } from '@/store/error.js'
|
||||
|
||||
import { type MinecraftAuthError, minecraftAuthErrors } from './minecraft-auth-errors'
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
const rawError = ref<string>('')
|
||||
const matchedError = ref<MinecraftAuthError | null>(null)
|
||||
const debugCollapsed = ref(true)
|
||||
const copied = ref(false)
|
||||
const loadingSignIn = ref(false)
|
||||
|
||||
function show(errorVal: { message?: string }) {
|
||||
rawError.value = errorVal?.message ?? String(errorVal)
|
||||
|
||||
matchedError.value = minecraftAuthErrors.find((e) => rawError.value.includes(e.errorCode)) ?? null
|
||||
|
||||
debugCollapsed.value = true
|
||||
hide_ads_window()
|
||||
modal.value?.show()
|
||||
}
|
||||
|
||||
function hide() {
|
||||
onModalHide()
|
||||
modal.value?.hide()
|
||||
}
|
||||
|
||||
function onModalHide() {
|
||||
show_ads_window()
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
show,
|
||||
hide,
|
||||
})
|
||||
|
||||
async function signInAgain() {
|
||||
try {
|
||||
loadingSignIn.value = true
|
||||
const loggedIn = await login_flow()
|
||||
if (loggedIn) {
|
||||
await set_default_user(loggedIn.profile.id)
|
||||
}
|
||||
loadingSignIn.value = false
|
||||
modal.value?.hide()
|
||||
} catch (err) {
|
||||
loadingSignIn.value = false
|
||||
handleSevereError(err)
|
||||
}
|
||||
}
|
||||
|
||||
const debugInfo = computed(() => rawError.value || 'No error message.')
|
||||
|
||||
async function copyToClipboard(text: string) {
|
||||
await navigator.clipboard.writeText(text)
|
||||
copied.value = true
|
||||
setTimeout(() => {
|
||||
copied.value = false
|
||||
}, 3000)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<NewModal ref="modal" header="Sign in Failed" :max-width="'548px'" @hide="onModalHide">
|
||||
<div class="flex flex-col gap-6">
|
||||
<Admonition
|
||||
type="warning"
|
||||
body=" We couldn't sign you into your Microsoft account. This may be due to account restrictions or
|
||||
regional limitations."
|
||||
>
|
||||
</Admonition>
|
||||
|
||||
<!-- Matched error details -->
|
||||
<div class="bg-surface-2 rounded-2xl p-4 px-5 flex flex-col gap-3">
|
||||
<template v-if="matchedError">
|
||||
<div class="flex flex-col gap-1.5">
|
||||
<h3 class="text-base font-bold m-0">What we think happened</h3>
|
||||
<p class="text-sm text-secondary m-0">
|
||||
{{ matchedError.whatHappened }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-1.5">
|
||||
<h3 class="text-base font-bold m-0">How to fix it</h3>
|
||||
<ol class="list-none flex flex-col gap-2 m-0 pl-0">
|
||||
<li
|
||||
v-for="(step, index) in matchedError.stepsToFix"
|
||||
:key="index"
|
||||
class="flex items-baseline gap-2"
|
||||
>
|
||||
<span
|
||||
class="inline-flex items-center justify-center shrink-0 w-5 h-5 rounded-full bg-surface-4 border border-solid border-surface-5 text-xs font-medium"
|
||||
>
|
||||
{{ index + 1 }}
|
||||
</span>
|
||||
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||
<span
|
||||
class="text-sm [&_a]:text-info [&_a]:font-medium [&_a]:underline"
|
||||
v-html="step"
|
||||
/>
|
||||
</li>
|
||||
</ol>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="flex flex-col gap-1.5">
|
||||
<h3 class="text-base font-bold m-0">Unknown error</h3>
|
||||
<p class="text-sm text-secondary m-0">
|
||||
We don’t recognize this error and can’t recommend specific steps to resolve it.
|
||||
</p>
|
||||
<p class="text-sm text-secondary m-0">
|
||||
Try visiting
|
||||
<a
|
||||
class="text-info font-medium underline hover:underline"
|
||||
href="https://www.minecraft.net/en-us/login"
|
||||
>Minecraft Login</a
|
||||
>
|
||||
and signing in, as it may prompt you with the necessary steps. You can also contact
|
||||
support and we can look into it further.
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
<!-- Action buttons -->
|
||||
<div class="flex items-center gap-2">
|
||||
<ButtonStyled>
|
||||
<a href="https://support.modrinth.com" class="!w-full" @click="modal?.hide()">
|
||||
<MessagesSquareIcon /> Contact support
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="brand">
|
||||
<button :disabled="loadingSignIn" class="!w-full" @click="signInAgain">
|
||||
<LogInIcon /> Sign in again
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col gap-2">
|
||||
<div class="w-full h-[1px] bg-surface-5"></div>
|
||||
|
||||
<!-- Debug info -->
|
||||
<div class="overflow-clip">
|
||||
<button
|
||||
class="flex items-center justify-between w-full bg-transparent border-0 py-4 cursor-pointer"
|
||||
@click="debugCollapsed = !debugCollapsed"
|
||||
>
|
||||
<span class="flex items-center gap-2 text-contrast font-extrabold m-0">
|
||||
<WrenchIcon class="h-4 w-4" />
|
||||
Debug information
|
||||
</span>
|
||||
<DropdownIcon
|
||||
class="h-5 w-5 text-secondary transition-transform"
|
||||
:class="{ 'rotate-180': !debugCollapsed }"
|
||||
/>
|
||||
</button>
|
||||
<Collapsible :collapsed="debugCollapsed">
|
||||
<div
|
||||
class="p-3 bg-surface-2 rounded-2xl text-xs grid grid-cols-[1fr_auto] max-w-full items-start"
|
||||
>
|
||||
<div
|
||||
class="m-0 p-0 rounded-none bg-transparent text-sm font-mono break-words overflow-auto"
|
||||
>
|
||||
{{ debugInfo }}
|
||||
</div>
|
||||
<ButtonStyled circular>
|
||||
<button
|
||||
v-tooltip="'Copy debug info'"
|
||||
:disabled="copied"
|
||||
@click="copyToClipboard(debugInfo)"
|
||||
>
|
||||
<template v-if="copied"> <CheckIcon class="text-green" /> </template>
|
||||
<template v-else> <CopyIcon /> </template>
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</Collapsible>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</NewModal>
|
||||
</template>
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
export interface MinecraftAuthError {
|
||||
errorCode: string
|
||||
whatHappened: string
|
||||
stepsToFix: string[]
|
||||
}
|
||||
|
||||
export const minecraftAuthErrors: MinecraftAuthError[] = [
|
||||
{
|
||||
errorCode: '2148916222',
|
||||
whatHappened:
|
||||
'Your Minecraft/Xbox Live account requires age verification to comply with UK regulations. You must complete this before signing in.',
|
||||
stepsToFix: [
|
||||
'Go to the <a href="https://www.minecraft.net/en-us/login">Minecraft Login</a> page and sign in',
|
||||
'Follow the instructions to verify your age',
|
||||
'Once verified, try signing in again',
|
||||
'For additional help, visit <a href="https://support.xbox.com/en-GB/help/family-online-safety/online-safety/UK-age-verification">UK age verification on Xbox</a>',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916233',
|
||||
whatHappened: "This account doesn't have an Xbox profile set up or doesn't own Minecraft.",
|
||||
stepsToFix: [
|
||||
'Make sure Minecraft is purchased on this account',
|
||||
'Visit <a href="https://www.minecraft.net/en-us/login">Minecraft Login</a> and sign in',
|
||||
'Complete Xbox profile setup if prompted',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916235',
|
||||
whatHappened: "Xbox Live isn't available in your region, so sign-in is blocked.",
|
||||
stepsToFix: [
|
||||
'Xbox services must be supported in your country before you can sign in',
|
||||
'Check <a href="https://www.xbox.com/en-US/regions">Xbox Availability</a> for supported regions',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916236',
|
||||
whatHappened: 'This account requires adult verification under South Korean regulations.',
|
||||
stepsToFix: [
|
||||
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
|
||||
'Complete the identity verification process',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916237',
|
||||
whatHappened: 'This account requires adult verification under South Korean regulations.',
|
||||
stepsToFix: [
|
||||
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
|
||||
'Complete the identity verification process',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916238',
|
||||
whatHappened: 'This account is underage and not linked to a Microsoft family group.',
|
||||
stepsToFix: [
|
||||
'Review the <a href="https://help.minecraft.net/hc/en-us/articles/4408968616077">Family Setup Guide</a>',
|
||||
'Join or create a family group as instructed',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916227',
|
||||
whatHappened: 'This account was suspended for violating Xbox Community Standards.',
|
||||
stepsToFix: [
|
||||
'Visit <a href="https://support.xbox.com">Xbox Support</a> and review the enforcement details',
|
||||
'Submit an appeal if one is available',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916229',
|
||||
whatHappened: "This account is restricted and doesn't have permission to play online.",
|
||||
stepsToFix: [
|
||||
'Have a guardian sign in to <a href="https://account.microsoft.com/family/">Microsoft Family</a>',
|
||||
'Update online play permissions',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
{
|
||||
errorCode: '2148916234',
|
||||
whatHappened: "This account hasn't accepted Xbox's Terms of Service.",
|
||||
stepsToFix: [
|
||||
'Visit <a href="https://www.xbox.com">Xbox</a> and sign in',
|
||||
'Accept the Terms if prompted',
|
||||
'Once finished, try signing in again',
|
||||
],
|
||||
},
|
||||
]
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import { ConfirmModal } from '@modrinth/ui'
|
||||
import { ref } from 'vue'
|
||||
import { useTemplateRef } from 'vue'
|
||||
|
||||
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
|
||||
import { useTheming } from '@/store/theme.ts'
|
||||
@@ -49,16 +49,16 @@ const props = defineProps({
|
||||
})
|
||||
|
||||
const emit = defineEmits(['proceed'])
|
||||
const modal = ref(null)
|
||||
const modal = useTemplateRef('modal')
|
||||
|
||||
defineExpose({
|
||||
show: () => {
|
||||
hide_ads_window()
|
||||
modal.value.show()
|
||||
modal.value?.show()
|
||||
},
|
||||
hide: () => {
|
||||
onModalHide()
|
||||
modal.value.hide()
|
||||
modal.value?.hide()
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
<template>
|
||||
<NewModal ref="modal" :header="formatMessage(messages.installToPlay)" :closable="true">
|
||||
<div v-if="requiredContentProject" class="flex flex-col gap-6 max-w-[500px]">
|
||||
<Admonition type="info" :header="formatMessage(messages.contentRequired)">
|
||||
{{ formatMessage(messages.serverRequiresMods) }}
|
||||
</Admonition>
|
||||
|
||||
<div class="flex flex-col gap-1">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="font-semibold text-contrast">{{
|
||||
formatMessage(messages.requiredModpack)
|
||||
}}</span>
|
||||
|
||||
<ButtonStyled type="transparent">
|
||||
<button @click="openViewContents">
|
||||
<EyeIcon />
|
||||
{{ formatMessage(messages.viewContents) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-3 rounded-xl bg-surface-2 p-3">
|
||||
<Avatar
|
||||
:src="requiredContentProject.icon_url"
|
||||
:alt="requiredContentProject.title"
|
||||
size="48px"
|
||||
/>
|
||||
<div class="flex flex-col gap-0.5">
|
||||
<span class="font-semibold text-contrast">
|
||||
<template v-if="usingCustomModpack && modpackVersion">
|
||||
{{ modpackVersion.name }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ requiredContentProject.title }}
|
||||
</template>
|
||||
</span>
|
||||
<span class="text-sm text-secondary">
|
||||
{{ loaderDisplay }} {{ requiredContentProject.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>
|
||||
|
||||
<ModpackContentModal
|
||||
ref="modpackContentModal"
|
||||
:modpack-name="project?.name ?? ''"
|
||||
:modpack-icon-url="project?.icon_url ?? undefined"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { Labrinth } from '@modrinth/api-client'
|
||||
import { DownloadIcon, EyeIcon, XIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Admonition,
|
||||
Avatar,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
formatLoader,
|
||||
ModpackContentModal,
|
||||
NewModal,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
|
||||
import { get_project, get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
||||
import { installServerProject, useInstall } from '@/store/install.js'
|
||||
|
||||
import type { ContentItem } from '../../../../../../packages/ui/src/components/instances/types'
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
const modpackVersionId = ref<string | null>(null)
|
||||
const modpackVersion = ref<Labrinth.Versions.v2.Version | null>(null)
|
||||
const project = ref<Labrinth.Projects.v3.Project | null>(null)
|
||||
const requiredContentProject = ref<Labrinth.Projects.v2.Project | null>(null)
|
||||
const onInstallComplete = ref<() => void>(() => {})
|
||||
const { formatMessage } = useVIntl()
|
||||
const installStore = useInstall()
|
||||
|
||||
const usingCustomModpack = computed(() => {
|
||||
return requiredContentProject.value?.id === project.value?.id
|
||||
})
|
||||
|
||||
const loaderDisplay = computed(() => {
|
||||
const loader = requiredContentProject.value?.loaders?.[0]
|
||||
if (!loader) return ''
|
||||
return formatLoader(formatMessage, loader)
|
||||
})
|
||||
|
||||
const modCount = computed(() => modpackVersion.value?.dependencies?.length)
|
||||
|
||||
async function fetchData(versionId: string) {
|
||||
// cache is making version null for some reason so bypassing for now
|
||||
modpackVersion.value = await get_version(versionId, 'bypass')
|
||||
|
||||
if (modpackVersion.value?.project_id) {
|
||||
requiredContentProject.value = await get_project(modpackVersion.value.project_id, 'bypass')
|
||||
}
|
||||
}
|
||||
|
||||
async function handleAccept() {
|
||||
hide()
|
||||
const serverProjectId = project.value?.id
|
||||
installStore.startInstallingServer(serverProjectId)
|
||||
try {
|
||||
await installServerProject(serverProjectId)
|
||||
onInstallComplete.value()
|
||||
} catch (error) {
|
||||
console.error('Failed to install server project from InstallToPlayModal:', error)
|
||||
} finally {
|
||||
installStore.stopInstallingServer(serverProjectId)
|
||||
}
|
||||
}
|
||||
|
||||
function handleDecline() {
|
||||
hide()
|
||||
}
|
||||
|
||||
const modpackContentModal = ref<InstanceType<typeof ModpackContentModal>>()
|
||||
|
||||
async function openViewContents() {
|
||||
modpackContentModal.value?.showLoading()
|
||||
try {
|
||||
// Ensure version data is available — the useQuery may not have resolved yet
|
||||
const versionId = modpackVersionId.value
|
||||
const version =
|
||||
modpackVersion.value ?? (versionId ? await get_version(versionId, 'must_revalidate') : null)
|
||||
|
||||
const deps = version?.dependencies ?? []
|
||||
|
||||
const projectIds = deps
|
||||
.map((d: { project_id?: string }) => d.project_id)
|
||||
.filter((id: string | undefined): id is string => !!id)
|
||||
|
||||
const versionIds = deps
|
||||
.map((d: { version_id?: string }) => d.version_id)
|
||||
.filter((id: string | undefined): id is string => !!id)
|
||||
|
||||
const projects: Labrinth.Projects.v2.Project[] =
|
||||
projectIds.length > 0 ? await get_project_many(projectIds, 'must_revalidate') : []
|
||||
|
||||
const versions: Labrinth.Versions.v2.Version[] =
|
||||
versionIds.length > 0 ? await get_version_many(versionIds, 'must_revalidate') : []
|
||||
|
||||
const projectMap = new Map(projects.map((p: Labrinth.Projects.v2.Project) => [p.id, p]))
|
||||
|
||||
const contentItems: ContentItem[] = deps.map(
|
||||
(dep: Labrinth.Versions.v2.Dependency): ContentItem => {
|
||||
const depProject = dep.project_id ? projectMap.get(dep.project_id) : null
|
||||
// @ts-expect-error - version_id is missing from the type for some reason
|
||||
const depVersion = dep.version_id
|
||||
? // @ts-expect-error - version_id is missing from the type for some reason
|
||||
versions.find((v: Labrinth.Versions.v2.Version) => v.id === dep.version_id)
|
||||
: null
|
||||
|
||||
return {
|
||||
file_name: dep.file_name ?? depProject?.title ?? 'Unknown',
|
||||
project_type: depProject?.project_type ?? 'mod',
|
||||
has_update: false,
|
||||
update_version_id: null,
|
||||
project: {
|
||||
id: depProject?.id ?? dep.project_id ?? dep.file_name ?? 'unknown',
|
||||
slug: depProject?.slug ?? dep.project_id ?? 'unknown',
|
||||
title: depProject?.title ?? dep.file_name ?? 'Unknown',
|
||||
icon_url: depProject?.icon_url ?? undefined,
|
||||
},
|
||||
...(depVersion
|
||||
? {
|
||||
version: {
|
||||
id: depVersion.id,
|
||||
file_name: depVersion.files?.[0]?.filename ?? dep.file_name,
|
||||
version_number: depVersion.version_number ?? undefined,
|
||||
date_published: depVersion.date_published ?? undefined,
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
}
|
||||
},
|
||||
)
|
||||
modpackContentModal.value?.show(contentItems)
|
||||
} catch (err) {
|
||||
console.error('Failed to load modpack contents:', err)
|
||||
modpackContentModal.value?.show([])
|
||||
}
|
||||
}
|
||||
|
||||
async function show(
|
||||
projectVal: Labrinth.Projects.v3.Project,
|
||||
modpackVersionIdVal: string | null = null,
|
||||
callback: () => void = () => {},
|
||||
e?: MouseEvent,
|
||||
) {
|
||||
project.value = projectVal
|
||||
modpackVersionId.value = modpackVersionIdVal
|
||||
modpackVersion.value = null
|
||||
requiredContentProject.value = null
|
||||
onInstallComplete.value = callback
|
||||
|
||||
if (modpackVersionIdVal) await fetchData(modpackVersionIdVal)
|
||||
|
||||
hide_ads_window()
|
||||
modal.value?.show(e)
|
||||
}
|
||||
|
||||
function hide() {
|
||||
modal.value?.hide()
|
||||
show_ads_window()
|
||||
}
|
||||
|
||||
const messages = defineMessages({
|
||||
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',
|
||||
},
|
||||
contentRequired: {
|
||||
id: 'app.modal.install-to-play.content-required',
|
||||
defaultMessage: 'Content required',
|
||||
},
|
||||
serverRequiresMods: {
|
||||
id: 'app.modal.install-to-play.server-requires-mods',
|
||||
defaultMessage:
|
||||
'This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server.',
|
||||
},
|
||||
requiredModpack: {
|
||||
id: 'app.modal.install-to-play.required-modpack',
|
||||
defaultMessage: 'Required modpack',
|
||||
},
|
||||
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',
|
||||
},
|
||||
viewContents: {
|
||||
id: 'app.modal.install-to-play.view-contents',
|
||||
defaultMessage: 'View contents',
|
||||
},
|
||||
})
|
||||
|
||||
defineExpose({ show, hide })
|
||||
</script>
|
||||
@@ -1,4 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import type { Labrinth } from '@modrinth/api-client'
|
||||
import {
|
||||
ChevronRightIcon,
|
||||
CodeIcon,
|
||||
@@ -7,9 +8,16 @@ import {
|
||||
MonitorIcon,
|
||||
WrenchIcon,
|
||||
} from '@modrinth/assets'
|
||||
import { Avatar, defineMessage, TabbedModal, type TabbedModalTab, useVIntl } from '@modrinth/ui'
|
||||
import {
|
||||
Avatar,
|
||||
commonMessages,
|
||||
defineMessage,
|
||||
TabbedModal,
|
||||
type TabbedModalTab,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import { ref } from 'vue'
|
||||
import { computed, ref, watch } from 'vue'
|
||||
|
||||
import GeneralSettings from '@/components/ui/instance_settings/GeneralSettings.vue'
|
||||
import HooksSettings from '@/components/ui/instance_settings/HooksSettings.vue'
|
||||
@@ -17,14 +25,38 @@ import InstallationSettings from '@/components/ui/instance_settings/Installation
|
||||
import JavaSettings from '@/components/ui/instance_settings/JavaSettings.vue'
|
||||
import WindowSettings from '@/components/ui/instance_settings/WindowSettings.vue'
|
||||
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
||||
import { get_project_v3 } from '@/helpers/cache'
|
||||
|
||||
import type { InstanceSettingsTabProps } from '../../../helpers/types'
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const props = defineProps<InstanceSettingsTabProps>()
|
||||
const emit = defineEmits<{
|
||||
unlinked: []
|
||||
}>()
|
||||
|
||||
const tabs: TabbedModalTab<InstanceSettingsTabProps>[] = [
|
||||
const isMinecraftServer = ref(false)
|
||||
const handleUnlinked = () => emit('unlinked')
|
||||
|
||||
watch(
|
||||
() => props.instance,
|
||||
(instance) => {
|
||||
isMinecraftServer.value = false
|
||||
if (instance.linked_data?.project_id) {
|
||||
get_project_v3(instance.linked_data.project_id, 'must_revalidate')
|
||||
.then((project: Labrinth.Projects.v3.Project | undefined) => {
|
||||
if (project?.minecraft_server != null) {
|
||||
isMinecraftServer.value = true
|
||||
}
|
||||
})
|
||||
.catch(() => {})
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
const tabs = computed<TabbedModalTab<InstanceSettingsTabProps>[]>(() => [
|
||||
{
|
||||
name: defineMessage({
|
||||
id: 'instance.settings.tabs.general',
|
||||
@@ -65,7 +97,7 @@ const tabs: TabbedModalTab<InstanceSettingsTabProps>[] = [
|
||||
icon: CodeIcon,
|
||||
content: HooksSettings,
|
||||
},
|
||||
]
|
||||
])
|
||||
|
||||
const modal = ref()
|
||||
|
||||
@@ -74,11 +106,6 @@ function show() {
|
||||
}
|
||||
|
||||
defineExpose({ show })
|
||||
|
||||
const titleMessage = defineMessage({
|
||||
id: 'instance.settings.title',
|
||||
defaultMessage: 'Settings',
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<ModalWrapper ref="modal">
|
||||
@@ -90,10 +117,23 @@ 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>
|
||||
|
||||
<TabbedModal :tabs="tabs.map((tab) => ({ ...tab, props }))" />
|
||||
<TabbedModal
|
||||
:tabs="
|
||||
tabs.map((tab) => ({
|
||||
...tab,
|
||||
props: {
|
||||
...props,
|
||||
isMinecraftServer,
|
||||
onUnlinked: handleUnlinked,
|
||||
},
|
||||
}))
|
||||
"
|
||||
/>
|
||||
</ModalWrapper>
|
||||
</template>
|
||||
|
||||
@@ -0,0 +1,452 @@
|
||||
<template>
|
||||
<NewModal
|
||||
ref="modal"
|
||||
:header="formatMessage(messages.updateToPlay)"
|
||||
:closable="true"
|
||||
no-padding
|
||||
@hide="() => show_ads_window()"
|
||||
>
|
||||
<div v-if="instance" class="max-w-[500px]">
|
||||
<div class="flex flex-col gap-4 p-4">
|
||||
<Admonition type="info" :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">{{
|
||||
formatDate(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 border-t border-b border-r-0 border-l-0 border-solid border-surface-5"
|
||||
>
|
||||
<div
|
||||
v-for="(diff, index) in diffs"
|
||||
:key="diff.project_id"
|
||||
class="grid items-center min-h-10 h-10 gap-2"
|
||||
:class="diff.project?.title ? 'grid-cols-[auto_1fr_1fr_1fr]' : 'grid-cols-[auto_1fr_1fr]'"
|
||||
>
|
||||
<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="index === diffs.length - 1 ? 'bg-transparent' : 'bg-surface-5'"
|
||||
class="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>
|
||||
<span
|
||||
v-else-if="diff.fileName"
|
||||
v-tooltip="diff.fileName"
|
||||
class="text-sm text-contrast font-medium truncate"
|
||||
>
|
||||
{{ decodeURIComponent(diff.fileName) }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<span
|
||||
v-if="
|
||||
diff.project?.title &&
|
||||
(getFilename(diff.newVersion) || getFilename(diff.currentVersion) || diff.fileName)
|
||||
"
|
||||
v-tooltip="
|
||||
getFilename(diff.newVersion) ||
|
||||
getFilename(diff.currentVersion) ||
|
||||
decodeURIComponent(diff.fileName || '')
|
||||
"
|
||||
class="text-xs truncate text-right"
|
||||
>
|
||||
{{
|
||||
getFilename(diff.newVersion) ||
|
||||
getFilename(diff.currentVersion) ||
|
||||
decodeURIComponent(diff.fileName || '')
|
||||
}}
|
||||
</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,
|
||||
useFormatDateTime,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
import dayjs from 'dayjs'
|
||||
import { computed, ref, watch } from 'vue'
|
||||
|
||||
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
|
||||
import { get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
||||
import { update_managed_modrinth_version } from '@/helpers/profile'
|
||||
import type { GameInstance } from '@/helpers/types'
|
||||
import { useInstall } from '@/store/install.js'
|
||||
|
||||
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
|
||||
fileName?: string
|
||||
}
|
||||
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 { formatMessage } = useVIntl()
|
||||
const formatDate = useFormatDateTime({ dateStyle: 'long' })
|
||||
const installStore = useInstall()
|
||||
type UpdateCompleteCallback = () => void | Promise<void>
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
const instance = ref<GameInstance | null>(null)
|
||||
const onUpdateComplete = ref<UpdateCompleteCallback>(() => {})
|
||||
const diffs = ref<DependencyDiff[]>([])
|
||||
const modpackVersionId = ref<string | null>(null)
|
||||
const modpackVersion = ref<Version | null>(null)
|
||||
|
||||
const removedCount = computed(() => diffs.value.filter((d) => d.type === 'removed').length)
|
||||
const addedCount = computed(() => diffs.value.filter((d) => d.type === 'added').length)
|
||||
const updatedCount = computed(() => diffs.value.filter((d) => d.type === 'updated').length)
|
||||
const publishedDate = computed(() =>
|
||||
modpackVersion.value?.date_published ? new Date(modpackVersion.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[]> {
|
||||
console.log('Computing dependency diffs', { currentDeps, latestDeps })
|
||||
|
||||
// Separate deps with project_id from file_name-only deps
|
||||
const currentWithProject = currentDeps.filter((d) => d.project_id)
|
||||
const latestWithProject = latestDeps.filter((d) => d.project_id)
|
||||
const currentFileOnly = currentDeps.filter((d) => !d.project_id && d.file_name)
|
||||
const latestFileOnly = latestDeps.filter((d) => !d.project_id && d.file_name)
|
||||
|
||||
const currentByProject = new Map<string, Dependency>(
|
||||
currentWithProject.map((d) => [d.project_id!, d]),
|
||||
)
|
||||
const latestByProject = new Map<string, Dependency>(
|
||||
latestWithProject.map((d) => [d.project_id!, d]),
|
||||
)
|
||||
const currentFilenames = new Set(currentFileOnly.map((d) => d.file_name!))
|
||||
const latestFilenames = new Set(latestFileOnly.map((d) => d.file_name!))
|
||||
|
||||
const diffs: DependencyDiff[] = []
|
||||
|
||||
// Find added and updated dependencies (by project_id)
|
||||
latestByProject.forEach((latestDep, projectId) => {
|
||||
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 (by project_id)
|
||||
currentByProject.forEach((currentDep, projectId) => {
|
||||
if (!latestByProject.has(projectId)) {
|
||||
diffs.push({
|
||||
type: 'removed',
|
||||
project_id: projectId,
|
||||
currentVersionId: currentDep.version_id,
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Find added/removed file_name-only dependencies
|
||||
// ideally in future, this should use the hash of the file instead of filename, but since version dependencies don't include file hashes, we'll use filename as a best effort approach
|
||||
for (const fileName of latestFilenames) {
|
||||
if (!currentFilenames.has(fileName)) {
|
||||
diffs.push({ type: 'added', project_id: '', newVersionId: '' as string, fileName })
|
||||
}
|
||||
}
|
||||
for (const fileName of currentFilenames) {
|
||||
if (!latestFilenames.has(fileName)) {
|
||||
diffs.push({ type: 'removed', project_id: '', fileName })
|
||||
}
|
||||
}
|
||||
|
||||
// Fetch projects and versions of diffs
|
||||
const allProjectIds = [...new Set(diffs.map((d) => d.project_id).filter(Boolean))]
|
||||
const allVersionIds = [
|
||||
...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, 'bypass'),
|
||||
get_version_many(allVersionIds, 'bypass'),
|
||||
])
|
||||
|
||||
const projectMap = new Map<string, ProjectInfo>(projects.map((p: ProjectInfo) => [p.id, p]))
|
||||
const versionMap = new Map<string, Version>(versions.map((v: Version) => [v.id, v]))
|
||||
|
||||
const mappedDiffs = 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()
|
||||
})
|
||||
.filter((d) => d.project || d.fileName) // filter out any diffs that couldn't be matched to a project or file
|
||||
return mappedDiffs
|
||||
}
|
||||
|
||||
async function checkUpdateAvailable(inst: GameInstance): Promise<DependencyDiff[] | null> {
|
||||
if (!inst.linked_data) return null
|
||||
if (!modpackVersionId.value || !inst.linked_data.version_id) return null
|
||||
|
||||
try {
|
||||
// For server projects, linked_data.project_id is the server project but
|
||||
// linked_data.version_id references a content modpack version from a different project.
|
||||
// Detect this by comparing the version's project_id with linked_data.project_id.
|
||||
modpackVersion.value = await get_version(modpackVersionId.value, 'bypass')
|
||||
const instanceModpackVersion = await get_version(inst.linked_data.version_id, 'bypass')
|
||||
|
||||
// Compute dependency diffs between current and latest version
|
||||
if (instanceModpackVersion && modpackVersion.value) {
|
||||
return await computeDependencyDiffs(
|
||||
instanceModpackVersion.dependencies || [],
|
||||
modpackVersion.value.dependencies || [],
|
||||
)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error checking for updates:', error)
|
||||
return null
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
watch(
|
||||
() => instance.value,
|
||||
async (newInstance) => {
|
||||
if (!newInstance) return
|
||||
const result = await checkUpdateAvailable(newInstance)
|
||||
diffs.value = result || []
|
||||
},
|
||||
{ immediate: true, deep: true },
|
||||
)
|
||||
|
||||
async function handleUpdate() {
|
||||
hide()
|
||||
const serverProjectId = instance.value?.linked_data?.project_id
|
||||
if (serverProjectId) installStore.startInstallingServer(serverProjectId)
|
||||
try {
|
||||
if (modpackVersionId.value && instance.value) {
|
||||
await update_managed_modrinth_version(instance.value.path, modpackVersionId.value)
|
||||
await onUpdateComplete.value()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error updating instance:', error)
|
||||
} finally {
|
||||
if (serverProjectId) installStore.stopInstallingServer(serverProjectId)
|
||||
}
|
||||
}
|
||||
|
||||
function handleReport() {
|
||||
if (instance.value?.linked_data?.project_id) {
|
||||
openUrl(
|
||||
`https://modrinth.com/report?item=project&itemID=${instance.value.linked_data.project_id}`,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
function handleDecline() {
|
||||
hide()
|
||||
}
|
||||
|
||||
function show(
|
||||
instanceVal: GameInstance,
|
||||
modpackVersionIdVal: string | null = null,
|
||||
callback: UpdateCompleteCallback = () => {},
|
||||
e?: MouseEvent,
|
||||
) {
|
||||
instance.value = instanceVal
|
||||
modpackVersionId.value = modpackVersionIdVal
|
||||
onUpdateComplete.value = callback
|
||||
hide_ads_window()
|
||||
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.',
|
||||
},
|
||||
removedCount: {
|
||||
id: 'app.modal.update-to-play.removed-count',
|
||||
defaultMessage: '{count} removed',
|
||||
},
|
||||
addedCount: {
|
||||
id: 'app.modal.update-to-play.added-count',
|
||||
defaultMessage: '{count} added',
|
||||
},
|
||||
updatedCount: {
|
||||
id: 'app.modal.update-to-play.updated-count',
|
||||
defaultMessage: '{count} updated',
|
||||
},
|
||||
})
|
||||
|
||||
const diffTypeMessages = defineMessages({
|
||||
added: {
|
||||
id: 'app.modal.update-to-play.diff-type.added',
|
||||
defaultMessage: 'Added',
|
||||
},
|
||||
removed: {
|
||||
id: 'app.modal.update-to-play.diff-type.removed',
|
||||
defaultMessage: 'Removed',
|
||||
},
|
||||
updated: {
|
||||
id: 'app.modal.update-to-play.diff-type.updated',
|
||||
defaultMessage: 'Updated',
|
||||
},
|
||||
})
|
||||
|
||||
const hasUpdate = computed(() => {
|
||||
if (!instance.value?.linked_data) return false
|
||||
return (
|
||||
modpackVersionId.value != null &&
|
||||
modpackVersionId.value !== instance.value.linked_data.version_id
|
||||
)
|
||||
})
|
||||
|
||||
defineExpose({ show, hide, hasUpdate })
|
||||
</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>
|
||||
|
||||
@@ -8,14 +8,14 @@ import {
|
||||
LOCALES,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { ref, watch } from 'vue'
|
||||
import { computed, ref, watch } from 'vue'
|
||||
|
||||
import { get, set } from '@/helpers/settings.ts'
|
||||
import i18n from '@/i18n.config'
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const platform = formatMessage(languageSelectorMessages.platformApp)
|
||||
const platform = computed(() => formatMessage(languageSelectorMessages.platformApp))
|
||||
|
||||
const settings = ref(await get())
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -28,10 +28,12 @@ watch(
|
||||
async function purgeCache() {
|
||||
await purge_cache_types([
|
||||
'project',
|
||||
'project_v3',
|
||||
'version',
|
||||
'user',
|
||||
'team',
|
||||
'organization',
|
||||
'file',
|
||||
'loader_manifest',
|
||||
'minecraft_manifest',
|
||||
'categories',
|
||||
@@ -39,8 +41,10 @@ async function purgeCache() {
|
||||
'loaders',
|
||||
'game_versions',
|
||||
'donation_platforms',
|
||||
'file_hash',
|
||||
'file_update',
|
||||
'search_results',
|
||||
'search_results_v3',
|
||||
]).catch(handleError)
|
||||
}
|
||||
|
||||
@@ -65,13 +69,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>
|
||||
|
||||
@@ -14,13 +14,13 @@ import {
|
||||
injectNotificationManager,
|
||||
OverflowMenu,
|
||||
SmartClickable,
|
||||
useFormatDateTime,
|
||||
useRelativeTime,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { capitalizeString } from '@modrinth/utils'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import type { Dayjs } from 'dayjs'
|
||||
import dayjs from 'dayjs'
|
||||
import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
@@ -36,6 +36,10 @@ import { handleSevereError } from '@/store/error'
|
||||
const { handleError } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
const formatRelativeTime = useRelativeTime()
|
||||
const formatDateTime = useFormatDateTime({
|
||||
timeStyle: 'short',
|
||||
dateStyle: 'long',
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
@@ -80,7 +84,7 @@ const play = async (event: MouseEvent) => {
|
||||
await run(props.instance.path)
|
||||
.catch((err) => handleSevereError(err, { profilePath: props.instance.path }))
|
||||
.finally(() => {
|
||||
trackEvent('InstancePlay', {
|
||||
trackEvent('InstanceStart', {
|
||||
loader: props.instance.loader,
|
||||
game_version: props.instance.game_version,
|
||||
source: 'InstanceItem',
|
||||
@@ -145,18 +149,14 @@ onUnmounted(() => {
|
||||
</div>
|
||||
<div class="flex items-center gap-2 text-sm text-secondary">
|
||||
<div
|
||||
v-tooltip="
|
||||
instance.last_played
|
||||
? dayjs(instance.last_played).format('MMMM D, YYYY [at] h:mm A')
|
||||
: null
|
||||
"
|
||||
v-tooltip="instance.last_played ? formatDateTime(instance.last_played) : null"
|
||||
class="w-fit shrink-0"
|
||||
:class="{ 'cursor-help smart-clickable:allow-pointer-events': last_played }"
|
||||
>
|
||||
<template v-if="last_played">
|
||||
{{
|
||||
formatMessage(commonMessages.playedLabel, {
|
||||
time: formatRelativeTime(last_played.toISOString?.()),
|
||||
ago: formatRelativeTime(last_played.toISOString?.()),
|
||||
})
|
||||
}}
|
||||
</template>
|
||||
|
||||
@@ -175,10 +175,17 @@ function refreshServer(address: string, instancePath: string) {
|
||||
refreshServerData(serverData.value[address], protocolVersions.value[instancePath], address)
|
||||
}
|
||||
|
||||
async function joinWorld(world: WorldWithProfile) {
|
||||
async function joinWorld(world: WorldWithProfile, instance?: GameInstance) {
|
||||
console.log(`Joining world ${getWorldIdentifier(world)}`)
|
||||
if (world.type === 'server') {
|
||||
await start_join_server(world.profile, world.address).catch(handleError)
|
||||
if (instance) {
|
||||
trackEvent('InstanceStart', {
|
||||
loader: instance.loader,
|
||||
game_version: instance.game_version,
|
||||
source: 'WorldItem',
|
||||
})
|
||||
}
|
||||
} else if (world.type === 'singleplayer') {
|
||||
await start_join_singleplayer_world(world.profile, world.path).catch(handleError)
|
||||
}
|
||||
@@ -188,7 +195,7 @@ async function playInstance(instance: GameInstance) {
|
||||
await run(instance.path)
|
||||
.catch((err) => handleSevereError(err, { profilePath: instance.path }))
|
||||
.finally(() => {
|
||||
trackEvent('InstancePlay', {
|
||||
trackEvent('InstanceStart', {
|
||||
loader: instance.loader,
|
||||
game_version: instance.game_version,
|
||||
source: 'WorldItem',
|
||||
@@ -317,7 +324,7 @@ onUnmounted(() => {
|
||||
() => {
|
||||
currentProfile = item.instance.path
|
||||
currentWorld = getWorldIdentifier(item.world)
|
||||
joinWorld(item.world)
|
||||
joinWorld(item.world, item.instance)
|
||||
}
|
||||
"
|
||||
@play-instance="
|
||||
|
||||
@@ -25,10 +25,13 @@ import {
|
||||
defineMessages,
|
||||
OverflowMenu,
|
||||
SmartClickable,
|
||||
TagItem,
|
||||
useFormatDateTime,
|
||||
useFormatNumber,
|
||||
useRelativeTime,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { formatNumber, getPingLevel } from '@modrinth/utils'
|
||||
import { getPingLevel } from '@modrinth/utils'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import dayjs from 'dayjs'
|
||||
import { Tooltip } from 'floating-vue'
|
||||
@@ -46,8 +49,15 @@ import type {
|
||||
} from '@/helpers/worlds.ts'
|
||||
import { getWorldIdentifier, set_world_display_status } from '@/helpers/worlds.ts'
|
||||
|
||||
import { LockIcon } from '../../../../../../packages/assets/generated-icons'
|
||||
|
||||
const { formatMessage } = useVIntl()
|
||||
const formatRelativeTime = useRelativeTime()
|
||||
const formatNumber = useFormatNumber()
|
||||
const formatDateTime = useFormatDateTime({
|
||||
timeStyle: 'short',
|
||||
dateStyle: 'long',
|
||||
})
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
@@ -78,6 +88,8 @@ const props = withDefaults(
|
||||
message: MessageDescriptor
|
||||
}
|
||||
|
||||
managed?: boolean
|
||||
|
||||
// Instance
|
||||
instancePath?: string
|
||||
instanceName?: string
|
||||
@@ -96,6 +108,7 @@ const props = withDefaults(
|
||||
renderedMotd: undefined,
|
||||
|
||||
gameMode: undefined,
|
||||
managed: false,
|
||||
|
||||
instancePath: undefined,
|
||||
instanceName: undefined,
|
||||
@@ -117,6 +130,7 @@ const serverIncompatible = computed(
|
||||
)
|
||||
|
||||
const locked = computed(() => props.world.type === 'singleplayer' && props.world.locked)
|
||||
const managed = computed(() => props.managed)
|
||||
|
||||
const messages = defineMessages({
|
||||
hardcore: {
|
||||
@@ -171,6 +185,10 @@ const messages = defineMessages({
|
||||
id: 'instance.worlds.dont_show_on_home',
|
||||
defaultMessage: `Don't show on Home`,
|
||||
},
|
||||
linkedServer: {
|
||||
id: 'instance.worlds.linked_server',
|
||||
defaultMessage: 'Managed by server project',
|
||||
},
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
@@ -200,6 +218,14 @@ const messages = defineMessages({
|
||||
<div class="text-lg text-contrast font-bold truncate smart-clickable:underline-on-hover">
|
||||
{{ world.name }}
|
||||
</div>
|
||||
<TagItem
|
||||
v-if="managed"
|
||||
v-tooltip="formatMessage(messages.linkedServer)"
|
||||
class="border !border-solid border-blue bg-highlight-blue text-xs"
|
||||
:style="`--_color: var(--color-blue)`"
|
||||
>
|
||||
<LockIcon aria-hidden="true" class="h-5 w-5" />
|
||||
</TagItem>
|
||||
<div
|
||||
v-if="world.type === 'singleplayer'"
|
||||
class="text-sm text-secondary flex items-center gap-1 font-semibold"
|
||||
@@ -239,7 +265,7 @@ const messages = defineMessages({
|
||||
/>
|
||||
<Tooltip :disabled="!hasPlayersTooltip">
|
||||
<span :class="{ 'cursor-help': hasPlayersTooltip }">
|
||||
{{ formatNumber(serverStatus.players?.online, false) }}
|
||||
{{ formatNumber(serverStatus.players?.online) }}
|
||||
online
|
||||
</span>
|
||||
<template #popper>
|
||||
@@ -260,9 +286,7 @@ const messages = defineMessages({
|
||||
</div>
|
||||
<div class="flex items-center gap-2 text-sm text-secondary">
|
||||
<div
|
||||
v-tooltip="
|
||||
world.last_played ? dayjs(world.last_played).format('MMMM D, YYYY [at] h:mm A') : null
|
||||
"
|
||||
v-tooltip="world.last_played ? formatDateTime(world.last_played) : null"
|
||||
class="w-fit shrink-0"
|
||||
:class="{
|
||||
'cursor-help smart-clickable:allow-pointer-events': world.last_played,
|
||||
@@ -271,7 +295,7 @@ const messages = defineMessages({
|
||||
<template v-if="world.last_played">
|
||||
{{
|
||||
formatMessage(commonMessages.playedLabel, {
|
||||
time: formatRelativeTime(dayjs(world.last_played).toISOString()),
|
||||
ago: formatRelativeTime(dayjs(world.last_played).toISOString()),
|
||||
})
|
||||
}}
|
||||
</template>
|
||||
@@ -396,8 +420,12 @@ const messages = defineMessages({
|
||||
id: 'edit',
|
||||
action: () => emit('edit'),
|
||||
shown: !instancePath,
|
||||
disabled: locked,
|
||||
tooltip: locked ? formatMessage(messages.worldInUse) : undefined,
|
||||
disabled: locked || managed,
|
||||
tooltip: locked
|
||||
? formatMessage(messages.worldInUse)
|
||||
: managed
|
||||
? formatMessage(messages.linkedServer)
|
||||
: undefined,
|
||||
},
|
||||
{
|
||||
id: 'open-folder',
|
||||
@@ -432,8 +460,12 @@ const messages = defineMessages({
|
||||
hoverFilled: true,
|
||||
action: () => emit('delete'),
|
||||
shown: !instancePath,
|
||||
disabled: locked,
|
||||
tooltip: locked ? formatMessage(messages.worldInUse) : undefined,
|
||||
disabled: locked || managed,
|
||||
tooltip: locked
|
||||
? formatMessage(messages.worldInUse)
|
||||
: managed
|
||||
? formatMessage(messages.linkedServer)
|
||||
: undefined,
|
||||
},
|
||||
]"
|
||||
>
|
||||
|
||||
@@ -6,6 +6,7 @@ import {
|
||||
commonMessages,
|
||||
defineMessages,
|
||||
injectNotificationManager,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { computed, ref } from 'vue'
|
||||
@@ -103,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,5 +1,11 @@
|
||||
<script setup lang="ts">
|
||||
import { Combobox, defineMessages, type MessageDescriptor, useVIntl } from '@modrinth/ui'
|
||||
import {
|
||||
Combobox,
|
||||
defineMessages,
|
||||
type MessageDescriptor,
|
||||
StyledInput,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
|
||||
import type { ServerPackStatus } from '@/helpers/worlds.ts'
|
||||
|
||||
@@ -52,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) }}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
import { posthog } from 'posthog-js'
|
||||
|
||||
export const initAnalytics = () => {
|
||||
posthog.init('phc_9Iqi6lFs9sr5BSqh9RRNRSJ0mATS9PSgirDiX3iOYJ', {
|
||||
persistence: 'localStorage',
|
||||
api_host: 'https://posthog.modrinth.com',
|
||||
})
|
||||
}
|
||||
|
||||
export const debugAnalytics = () => {
|
||||
posthog.debug()
|
||||
}
|
||||
|
||||
export const optOutAnalytics = () => {
|
||||
posthog.opt_out_capturing()
|
||||
}
|
||||
|
||||
export const optInAnalytics = () => {
|
||||
posthog.opt_in_capturing()
|
||||
}
|
||||
|
||||
export const trackEvent = (eventName, properties) => {
|
||||
posthog.capture(eventName, properties)
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
import { posthog } from 'posthog-js'
|
||||
|
||||
interface InstanceProperties {
|
||||
loader: string
|
||||
game_version: string
|
||||
}
|
||||
|
||||
interface ProjectProperties extends InstanceProperties {
|
||||
id: string
|
||||
project_type: string
|
||||
}
|
||||
|
||||
type AnalyticsEventMap = {
|
||||
Launched: { version: string; dev: boolean; onboarded: boolean }
|
||||
PageView: { path: string; fromPath: string; failed: unknown }
|
||||
InstanceCreate: { source: string }
|
||||
InstanceCreateStart: { source: string }
|
||||
InstanceStart: InstanceProperties & { source: string }
|
||||
InstanceStop: Partial<InstanceProperties> & { source?: string }
|
||||
InstanceDuplicate: InstanceProperties
|
||||
InstanceRepair: InstanceProperties
|
||||
InstanceSetIcon: Record<string, never>
|
||||
InstanceRemoveIcon: Record<string, never>
|
||||
InstanceUpdateAll: InstanceProperties & { count: number; selected: boolean }
|
||||
InstanceProjectUpdate: InstanceProperties & { id: string; name: string; project_type: string }
|
||||
InstanceProjectDisable: InstanceProperties & {
|
||||
id: string
|
||||
name: string
|
||||
project_type: string
|
||||
disabled: boolean
|
||||
}
|
||||
InstanceProjectRemove: InstanceProperties & { id: string; name: string; project_type: string }
|
||||
ProjectInstall: ProjectProperties & { version_id: string; title: string; source: string }
|
||||
ProjectInstallStart: { source: string }
|
||||
PackInstall: { id: string; version_id: string; title: string; source: string }
|
||||
PackInstallStart: Record<string, never>
|
||||
AccountLogIn: { source?: string }
|
||||
AccountLogOut: Record<string, never>
|
||||
JavaTest: { path: string; success: boolean }
|
||||
JavaManualSelect: { version: string }
|
||||
JavaAutoDetect: { path: string; version: string }
|
||||
}
|
||||
|
||||
export type AnalyticsEvent = keyof AnalyticsEventMap
|
||||
|
||||
let initialized = false
|
||||
|
||||
export const initAnalytics = () => {
|
||||
if (initialized) return
|
||||
posthog.init('phc_9Iqi6lFs9sr5BSqh9RRNRSJ0mATS9PSgirDiX3iOYJ', {
|
||||
persistence: 'localStorage',
|
||||
api_host: 'https://posthog.modrinth.com',
|
||||
})
|
||||
initialized = true
|
||||
}
|
||||
|
||||
export const debugAnalytics = () => {
|
||||
if (!initialized) return
|
||||
posthog.debug()
|
||||
}
|
||||
|
||||
export const optOutAnalytics = () => {
|
||||
if (!initialized) return
|
||||
posthog.opt_out_capturing()
|
||||
}
|
||||
|
||||
export const optInAnalytics = () => {
|
||||
initAnalytics()
|
||||
posthog.opt_in_capturing()
|
||||
}
|
||||
|
||||
type OptionalArgs<T> = Record<string, never> extends T ? [properties?: T] : [properties: T]
|
||||
|
||||
export const trackEvent = <E extends AnalyticsEvent>(
|
||||
eventName: E,
|
||||
...args: OptionalArgs<AnalyticsEventMap[E]>
|
||||
) => {
|
||||
if (!initialized) return
|
||||
posthog.capture(eventName, args[0])
|
||||
}
|
||||
@@ -8,6 +8,14 @@ export async function get_project_many(ids, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_project_many', { ids, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function get_project_v3(id, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_project_v3', { id, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function get_project_v3_many(ids, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_project_v3_many', { ids, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function get_version(id, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_version', { id, cacheBehaviour })
|
||||
}
|
||||
@@ -48,6 +56,14 @@ export async function get_search_results_many(ids, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_search_results_many', { ids, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function get_search_results_v3(id, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_search_results_v3', { id, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function get_search_results_v3_many(ids, cacheBehaviour) {
|
||||
return await invoke('plugin:cache|get_search_results_v3_many', { ids, cacheBehaviour })
|
||||
}
|
||||
|
||||
export async function purge_cache_types(cacheTypes) {
|
||||
return await invoke('plugin:cache|purge_cache_types', { cacheTypes })
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
import { getVersion } from '@tauri-apps/api/app'
|
||||
import { fetch } from '@tauri-apps/plugin-http'
|
||||
|
||||
export const useFetch = async (url, item, isSilent) => {
|
||||
try {
|
||||
const version = await getVersion()
|
||||
return await fetch(url, {
|
||||
method: 'GET',
|
||||
headers: { 'User-Agent': `modrinth/theseus/${version} (support@modrinth.com)` },
|
||||
})
|
||||
} catch (err) {
|
||||
if (!isSilent) {
|
||||
throw err
|
||||
} else {
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,15 @@ 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, icon, skipInstall) {
|
||||
export async function create(
|
||||
name,
|
||||
gameVersion,
|
||||
modloader,
|
||||
loaderVersion,
|
||||
icon,
|
||||
skipInstall,
|
||||
linkedData,
|
||||
) {
|
||||
//Trim string name to avoid "Unable to find directory"
|
||||
name = name.trim()
|
||||
return await invoke('plugin:profile-create|profile_create', {
|
||||
@@ -28,6 +36,7 @@ export async function create(name, gameVersion, modloader, loaderVersion, icon,
|
||||
loaderVersion,
|
||||
icon,
|
||||
skipInstall,
|
||||
linkedData,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -174,8 +183,8 @@ export async function get_pack_export_candidates(profilePath) {
|
||||
|
||||
// Run Minecraft using a pathed profile
|
||||
// Returns PID of child
|
||||
export async function run(path) {
|
||||
return await invoke('plugin:profile|profile_run', { path })
|
||||
export async function run(path, serverAddress = null) {
|
||||
return await invoke('plugin:profile|profile_run', { path, serverAddress })
|
||||
}
|
||||
|
||||
export async function kill(path) {
|
||||
|
||||
+1
@@ -139,4 +139,5 @@ type AppSettings = {
|
||||
export type InstanceSettingsTabProps = {
|
||||
instance: GameInstance
|
||||
offline?: boolean
|
||||
isMinecraftServer?: boolean
|
||||
}
|
||||
|
||||
@@ -141,7 +141,12 @@ export async function add_server_to_profile(
|
||||
address: string,
|
||||
packStatus: ServerPackStatus,
|
||||
): Promise<number> {
|
||||
return await invoke('plugin:worlds|add_server_to_profile', { path, name, address, packStatus })
|
||||
return await invoke('plugin:worlds|add_server_to_profile', {
|
||||
path,
|
||||
name,
|
||||
address,
|
||||
packStatus,
|
||||
})
|
||||
}
|
||||
|
||||
export async function edit_server_in_profile(
|
||||
@@ -212,6 +217,150 @@ export function isServerWorld(world: World): world is ServerWorld {
|
||||
return world.type === 'server'
|
||||
}
|
||||
|
||||
const DEFAULT_MINECRAFT_SERVER_PORT = 25565
|
||||
|
||||
function parseServerPort(port: string): number | null {
|
||||
const parsed = Number.parseInt(port, 10)
|
||||
return Number.isInteger(parsed) && parsed > 0 && parsed <= 65535 ? parsed : null
|
||||
}
|
||||
|
||||
function parseServerHost(address: string): string {
|
||||
const trimmedAddress = address.trim()
|
||||
if (!trimmedAddress) return ''
|
||||
|
||||
if (trimmedAddress.startsWith('[')) {
|
||||
const closingBracket = trimmedAddress.indexOf(']')
|
||||
if (closingBracket > 0) {
|
||||
return trimmedAddress.slice(1, closingBracket).trim().toLowerCase()
|
||||
}
|
||||
}
|
||||
|
||||
const firstColon = trimmedAddress.indexOf(':')
|
||||
const lastColon = trimmedAddress.lastIndexOf(':')
|
||||
|
||||
if (firstColon !== -1 && firstColon === lastColon) {
|
||||
return trimmedAddress.slice(0, firstColon).trim().toLowerCase()
|
||||
}
|
||||
|
||||
return trimmedAddress.toLowerCase()
|
||||
}
|
||||
|
||||
function isIPv4Host(host: string): boolean {
|
||||
const segments = host.split('.')
|
||||
if (segments.length !== 4) return false
|
||||
|
||||
return segments.every((segment) => {
|
||||
if (!/^\d+$/.test(segment)) return false
|
||||
const value = Number.parseInt(segment, 10)
|
||||
return value >= 0 && value <= 255
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalization converts addresses to a canonical form (lowercase-host:port, default port 25565)
|
||||
*/
|
||||
export function normalizeServerAddress(address: string): string {
|
||||
const trimmedAddress = address.trim()
|
||||
const host = parseServerHost(trimmedAddress)
|
||||
if (!host) return ''
|
||||
let port = DEFAULT_MINECRAFT_SERVER_PORT
|
||||
|
||||
// ipv6 address
|
||||
if (trimmedAddress.startsWith('[')) {
|
||||
const closingBracket = trimmedAddress.indexOf(']')
|
||||
if (closingBracket > 0) {
|
||||
const suffix = trimmedAddress.slice(closingBracket + 1)
|
||||
if (suffix.startsWith(':')) {
|
||||
const parsedPort = parseServerPort(suffix.slice(1))
|
||||
if (parsedPort != null) {
|
||||
port = parsedPort
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ipv4 address or hostname
|
||||
} else {
|
||||
const firstColon = trimmedAddress.indexOf(':')
|
||||
const lastColon = trimmedAddress.lastIndexOf(':')
|
||||
if (firstColon !== -1 && firstColon === lastColon) {
|
||||
const parsedPort = parseServerPort(trimmedAddress.slice(firstColon + 1))
|
||||
if (parsedPort != null) {
|
||||
port = parsedPort
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return `${host}:${port}`
|
||||
}
|
||||
|
||||
/**
|
||||
* Domain key used for deduping server entries by removing a single leading subdomain.
|
||||
* Example: test.cobblemon.gg and cobblemon.gg map to cobblemon.gg
|
||||
*/
|
||||
export function getServerDomainKey(address: string): string {
|
||||
const normalizedAddress = normalizeServerAddress(address)
|
||||
if (!normalizedAddress) return ''
|
||||
|
||||
const separator = normalizedAddress.lastIndexOf(':')
|
||||
if (separator <= 0 || separator === normalizedAddress.length - 1) return normalizedAddress
|
||||
|
||||
const host = normalizedAddress.slice(0, separator).replace(/\.+$/, '')
|
||||
if (!host) return normalizedAddress
|
||||
if (host.includes(':') || isIPv4Host(host)) return normalizedAddress
|
||||
|
||||
const segments = host.split('.').filter(Boolean)
|
||||
if (segments.length <= 2) return host
|
||||
|
||||
return segments.slice(1).join('.')
|
||||
}
|
||||
|
||||
export function resolveManagedServerWorld(
|
||||
worlds: World[],
|
||||
managedName: string | null | undefined,
|
||||
managedAddress: string | null | undefined,
|
||||
): ServerWorld | null {
|
||||
if (!managedName || !managedAddress) return null
|
||||
|
||||
const normalizedManagedAddress = normalizeServerAddress(managedAddress)
|
||||
if (!normalizedManagedAddress) return null
|
||||
|
||||
const servers = worlds
|
||||
.filter(isServerWorld)
|
||||
.slice()
|
||||
.sort((a, b) => a.index - b.index)
|
||||
|
||||
const exactMatch = servers.find(
|
||||
(server) =>
|
||||
server.name === managedName &&
|
||||
normalizeServerAddress(server.address) === normalizedManagedAddress,
|
||||
)
|
||||
if (exactMatch) return exactMatch
|
||||
|
||||
return (
|
||||
servers.find((server) => normalizeServerAddress(server.address) === normalizedManagedAddress) ??
|
||||
null
|
||||
)
|
||||
}
|
||||
|
||||
export async function getServerLatency(
|
||||
address: string,
|
||||
protocolVersion: ProtocolVersion | null = null,
|
||||
): Promise<number | undefined> {
|
||||
const pings: number[] = []
|
||||
for (let i = 0; i < 3; i++) {
|
||||
try {
|
||||
const status = await get_server_status(address, protocolVersion)
|
||||
if (status.ping != null) {
|
||||
pings.push(status.ping)
|
||||
}
|
||||
} catch {
|
||||
// Ignore individual ping failures
|
||||
}
|
||||
}
|
||||
if (pings.length === 0) return undefined
|
||||
return Math.round(pings.reduce((sum, p) => sum + p, 0) / pings.length)
|
||||
}
|
||||
|
||||
export async function refreshServerData(
|
||||
serverData: ServerData,
|
||||
protocolVersion: ProtocolVersion | null,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { buildLocaleMessages, createMessageCompiler, type CrowdinMessages } from '@modrinth/ui'
|
||||
import { uiLocaleModulesEager } from '@modrinth/ui/src/locales.eager.ts'
|
||||
import { createI18n } from 'vue-i18n'
|
||||
|
||||
const localeModules = import.meta.glob<{ default: CrowdinMessages }>('./locales/*/index.json', {
|
||||
@@ -12,7 +13,7 @@ const i18n = createI18n({
|
||||
messageCompiler: createMessageCompiler(),
|
||||
missingWarn: false,
|
||||
fallbackWarn: false,
|
||||
messages: buildLocaleMessages(localeModules),
|
||||
messages: buildLocaleMessages(localeModules, uiLocaleModulesEager),
|
||||
})
|
||||
|
||||
export default i18n
|
||||
|
||||
@@ -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": "مزامنة مع النسخة"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,51 @@
|
||||
"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.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": "تم تفعيل وضع المطوّر."
|
||||
},
|
||||
@@ -32,33 +77,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "إدارة الموارد"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "تطبيق Modrinth الإصدار {version} جاهز للتثبيت! أعد التحميل لتحديث التطبيق الآن، أو سيتم التحديث تلقائيًا عند إغلاق تطبيق Modrinth."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "تطبيق Modrinth الإصدار {version} جاهز للتثبيت!\nأعد التحميل لتحديث التطبيق الآن، أو سيتم التحديث تلقائيًا عند إغلاق تطبيق Modrinth."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "تطبيق Modrinth الإصدار {version} متاح الآن!\nنظرًا لأنك تستخدم شبكة محدودة البيانات، لم نقم بتنزيل التحديث تلقائيًا.\n"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "سجلّ التغييرات"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"message": "تنزيل ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "جار التنزيل..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "إعادة تحميل"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "تحديث متاح"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "اكتمل التنزيل"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "انقر هنا لعرض سجلّ التغييرات."
|
||||
},
|
||||
@@ -87,7 +105,7 @@
|
||||
"message": "جار إضافة صديق"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "قد يختلف عن اسم المستخدم الخاص بهم في Minecraft!"
|
||||
"message": "قد يختلف عن اسم المستخدم الخاص بهم في ماينكرافت!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "أدخل اسم مستخدم Modrinth..."
|
||||
@@ -141,7 +159,7 @@
|
||||
"message": "إضافة واللعب"
|
||||
},
|
||||
"instance.add-server.add-server": {
|
||||
"message": "إضافة الخادم"
|
||||
"message": "إضافة خادم"
|
||||
},
|
||||
"instance.add-server.resource-pack.disabled": {
|
||||
"message": "معطَّل"
|
||||
@@ -186,7 +204,7 @@
|
||||
"message": "الاسم"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "خادم ماين كرافت"
|
||||
"message": "خادم Minecraft"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "حزمة الموارد"
|
||||
@@ -279,7 +297,7 @@
|
||||
"message": "مُغلِّف"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.description": {
|
||||
"message": "أمر غلاف لتشغيل ماين كرافت."
|
||||
"message": "أمر غلاف لتشغيل ماينكرافت."
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||
"message": "أدخل أمر الغلاف..."
|
||||
@@ -288,7 +306,7 @@
|
||||
"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} مُثبّتة بالفعل"
|
||||
@@ -330,7 +348,7 @@
|
||||
"message": "إصدار {loader}"
|
||||
},
|
||||
"instance.settings.tabs.installation.minecraft-version": {
|
||||
"message": "ماين كرافت {version}"
|
||||
"message": "Minecraft {version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.no-connection": {
|
||||
"message": "تعذّر جلب تفاصيل حزمة المودات المرتبطة. يرجى التحقق من اتصالك بالإنترنت."
|
||||
@@ -470,9 +488,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,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,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,533 +0,0 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Mahimong dili maabot karon ang mga Minecraft nga magsisilbi sa pagpamatuod. Susiha ang imong pagkakatay sa internet ug unya sulayi pag-usab."
|
||||
},
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Dili maabot ang mga magsisilbi sa pagpamatuod"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Nagadagan 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}! Sa pagpasibo karun pagkarga kausab, kun unya sa kinaugalingon kini sunod sa pagtak-op sa Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Nahuman ang pagkarganug sa Modrinth App v{version}. Sa pagpasibo karun pagkarga kausab, kun unya sa kinaugalingon kini sunod sa pagtak-op sa Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Magamit na karon ang Modrinth App v{version}! 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 hubad 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}"
|
||||
},
|
||||
"friends.sign-in-to-add-friends": {
|
||||
"message": "<link>Pag-sign-in sa Modrinth nga kaakohan</link> aron makadugang og mga higala ug mahibal-an ang ginadula nila!"
|
||||
},
|
||||
"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": "Pag-usab sa 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": "Himoan og hulari 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": "Paghimo 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 na man ang {platform} {version} alang sa Minecraft {game_version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
|
||||
"message": "Nataud na man ang Banilya nga {game_version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.button": {
|
||||
"message": "Pulihan og hubad"
|
||||
},
|
||||
"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 hubad sa putos sa kausaban"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.in-progress": {
|
||||
"message": "Gataud sa bag-o nga hubad"
|
||||
},
|
||||
"instance.settings.tabs.installation.currently-installed": {
|
||||
"message": "Pagkakarong taud"
|
||||
},
|
||||
"instance.settings.tabs.installation.debug-information": {
|
||||
"message": "Kasayoran sa pagputli:"
|
||||
},
|
||||
"instance.settings.tabs.installation.fetching-modpack-details": {
|
||||
"message": "Gapangita og mga kinuti sa putos sa kausaban"
|
||||
},
|
||||
"instance.settings.tabs.installation.game-version": {
|
||||
"message": "Hubad sa dula"
|
||||
},
|
||||
"instance.settings.tabs.installation.install": {
|
||||
"message": "Itaud"
|
||||
},
|
||||
"instance.settings.tabs.installation.install.in-progress": {
|
||||
"message": "Nagtaud karon"
|
||||
},
|
||||
"instance.settings.tabs.installation.loader-version": {
|
||||
"message": "Hubad sa {loader}"
|
||||
},
|
||||
"instance.settings.tabs.installation.minecraft-version": {
|
||||
"message": "Minecraft {version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.no-connection": {
|
||||
"message": "Dili makapangita og mga kinuti sa nakagapos nga putos sa kausapan. Palihug sa pagsusi sa imong pagkakutay sa internet."
|
||||
},
|
||||
"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.no-modpack-found": {
|
||||
"message": "Nakakatay kining pananglitan sa usa ka putos sa kausaban, apan kining putos sa kausaban dili makita didto sa Modrinth."
|
||||
},
|
||||
"instance.settings.tabs.installation.platform": {
|
||||
"message": "Pantawan"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button": {
|
||||
"message": "Itaud pag-usab ang putos sa kausaban"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
|
||||
"message": "Nagtaud pag-usab sa putos sa kusaban"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.description": {
|
||||
"message": "Mahimo nga mobalik sa sinugdan ang tanang gitaod ug giusab nga sulod sa unsay giandam sa putos sa kausaban, tangtangon ang mga kausaban ug sulod nga imong gidugang sa 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.confirm.title": {
|
||||
"message": "Segurado kang gusto nimong mataud pag-usab kining pananglitan?"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.description": {
|
||||
"message": "Mabalik ang mga sulod sa pananglitan sa sinugdang kahimtang, tangtangon ang mga kausaban ug sulod nga imong gidugang sa lintunganay nga putos sa kausaban."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.title": {
|
||||
"message": "Itaud pag-usab ang 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 tiglunsad, apan dili ni masulbad ang mga isyu ug pagdusmog matud sa mga gitaud nga kausaban."
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.confirm.title": {
|
||||
"message": "Ayohon ang pananglitan?"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.in-progress": {
|
||||
"message": "Nag-ayo karon"
|
||||
},
|
||||
"instance.settings.tabs.installation.reset-selections": {
|
||||
"message": "Sa kasamtang pag-usab "
|
||||
},
|
||||
"instance.settings.tabs.installation.show-all-versions": {
|
||||
"message": "Ipakita ang tanang hubad"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.change-version": {
|
||||
"message": "pulihan og hubad"
|
||||
},
|
||||
"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 hubad)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Pagbugto sa pananglitan"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.confirm.description": {
|
||||
"message": "Kun imong ipadayon, dili na nimo makatay kini 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.confirm.title": {
|
||||
"message": "Segurado kang gusto nimong mabugto kining pananglitan?"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.description": {
|
||||
"message": "Nakagapos kining pananglitan sa usa ka putos sa kausaban, pasabot ani nga dili mapasibo ang mga kausaban ug dili nimo mausab ang tigkarga sa kausaban ug ang hubad sa Minecraft. Kanunay nga mabugto kining pananglitan ug putos sa kausaban kon bugtohon."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.title": {
|
||||
"message": "Bugtoi sa putos sa kausaban"
|
||||
},
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java ug memorya"
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Mga lantugi sa kalikopan"
|
||||
},
|
||||
"instance.settings.tabs.java.hooks": {
|
||||
"message": "Mga kaw-it"
|
||||
},
|
||||
"instance.settings.tabs.java.java-arguments": {
|
||||
"message": "Mga lantugi sa java"
|
||||
},
|
||||
"instance.settings.tabs.java.java-installation": {
|
||||
"message": "Pagtaud sa Java"
|
||||
},
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Memoryang gigahin"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Tamboanan"
|
||||
},
|
||||
"instance.settings.tabs.window.custom-window-settings": {
|
||||
"message": "Mga himutangan sa pinatuyo nga tamboanan"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen": {
|
||||
"message": "Punong-tabil"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen.description": {
|
||||
"message": "Himuon nga mosugad ang dula sa punong-tabil paglansad (gamit ang options.txt)."
|
||||
},
|
||||
"instance.settings.tabs.window.height": {
|
||||
"message": "Gitas-on"
|
||||
},
|
||||
"instance.settings.tabs.window.height.description": {
|
||||
"message": "Ang gitas-on sa tamboanan sa dula kon malansad."
|
||||
},
|
||||
"instance.settings.tabs.window.height.enter": {
|
||||
"message": "Ibutang ang gitas-on..."
|
||||
},
|
||||
"instance.settings.tabs.window.width": {
|
||||
"message": "Gilapdon"
|
||||
},
|
||||
"instance.settings.tabs.window.width.description": {
|
||||
"message": "Ang gilapdon sa tamboanan sa dula kon malansad."
|
||||
},
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Ibutang ang gilapdon..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Mga Himutangan"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Usa ka Minecraft nga Magsisilbi"
|
||||
},
|
||||
"instance.worlds.cant_connect": {
|
||||
"message": "Dili makakutay sa magsisilbi"
|
||||
},
|
||||
"instance.worlds.copy_address": {
|
||||
"message": "Hulari ang padad-anan"
|
||||
},
|
||||
"instance.worlds.dont_show_on_home": {
|
||||
"message": "Ayaw pakit-a sa Puloy-anan"
|
||||
},
|
||||
"instance.worlds.filter.available": {
|
||||
"message": "Magamit"
|
||||
},
|
||||
"instance.worlds.game_already_open": {
|
||||
"message": "Bukas na man ang pananglitan"
|
||||
},
|
||||
"instance.worlds.hardcore": {
|
||||
"message": "Mahanasnon nga paagi"
|
||||
},
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Dili mobagay sa magsisilbi"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Dili makahinabi sa magsisilbi"
|
||||
},
|
||||
"instance.worlds.no_server_quick_play": {
|
||||
"message": "Dumalang makalukso ka lamang sa mga magsisilbing naa sa Minecraft Alpha 1.0.5+"
|
||||
},
|
||||
"instance.worlds.no_singleplayer_quick_play": {
|
||||
"message": "Dumalang makalukso ka lamang sa mga inusarang dulang kalibutang naa sa Minecraft 1.20+"
|
||||
},
|
||||
"instance.worlds.play_instance": {
|
||||
"message": "Dulai ang pananglitan"
|
||||
},
|
||||
"instance.worlds.type.server": {
|
||||
"message": "Magsisilbi"
|
||||
},
|
||||
"instance.worlds.type.singleplayer": {
|
||||
"message": "Inusara nga dula"
|
||||
},
|
||||
"instance.worlds.view_instance": {
|
||||
"message": "Tan-awa ang pananglitan"
|
||||
},
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "Gigamit ang kalibotan"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Inako na sa pananglitan"
|
||||
},
|
||||
"search.filter.locked.instance-game-version.title": {
|
||||
"message": "Inako na sa pananglitan ang hubad sa dula"
|
||||
},
|
||||
"search.filter.locked.instance-loader.title": {
|
||||
"message": "Inako na sa pananglitan ang tigkarga sa laro"
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Pagdungan sa pananglitan"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,51 @@
|
||||
"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.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."
|
||||
},
|
||||
@@ -32,33 +77,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Správa zdrojů"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Aplikace Modrinth v{version} je připravena k instalaci! Naninstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Stahování aplikace Modrinth v{version} bylo dokončeno. Naninstalujte aktualizaci nyní nebo automaticky po zavření aplikace Modrinth."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Aplikace Modrinth v{version} je nyní k dispozici! Protože jste v měřené síti, nebyla stažena automaticky."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Seznam změn"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"message": "Stahování ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Stahování..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "Načíst znovu"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Aktualizace je k dispozici"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Stahování bylo dokončeno"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Kliknutím sem zobrazíte seznam změn."
|
||||
},
|
||||
@@ -77,6 +95,9 @@
|
||||
"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í"
|
||||
},
|
||||
@@ -467,9 +488,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Zadejte šířku..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Nastavení"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Minecraft Server"
|
||||
},
|
||||
|
||||
@@ -1,10 +1,52 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Minecraft autentificeringsservere kan måske være nede lige nu. Tjek din internet forbindelse og prøv igen senere."
|
||||
"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. Tryk på installer for at sætte de krævet filler fra modrinth op, så lancer direkte til serveren."
|
||||
},
|
||||
"app.modal.update-to-play.added-count": {
|
||||
"message": "{count} tilføjet"
|
||||
},
|
||||
"app.modal.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.published-date": {
|
||||
"message": "{date, date, long}"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -23,39 +65,15 @@
|
||||
"app.settings.tabs.java-installations": {
|
||||
"message": "Javainstallationer"
|
||||
},
|
||||
"app.settings.tabs.language": {
|
||||
"message": "Sprog"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "Privatliv"
|
||||
},
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcestyring"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version} er allerede installeret! Genindlæs for at opdatere nu, eller automatisk når du lukker Modrinth App."
|
||||
},
|
||||
"app.update-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.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.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."
|
||||
},
|
||||
@@ -258,7 +276,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"
|
||||
@@ -267,7 +285,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"
|
||||
@@ -279,7 +297,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"
|
||||
@@ -456,7 +474,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"
|
||||
@@ -465,10 +483,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"
|
||||
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Authentifizierungsserver sind nicht erreichbar"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Inhalte benötigt"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Benötigtes Modpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Dieser Server benötigt Mods zum spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und dannach direkt dem Server beizutreten."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Geteilte Instanz"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Geteilte Server Instanz"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Inhalte ansehen"
|
||||
},
|
||||
"app.modal.update-to-play.added-count": {
|
||||
"message": "{count} hinzuäfüä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."
|
||||
},
|
||||
@@ -32,33 +89,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcenmanagement"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Lade die App neu, oder schliesse sie, um zu aktualisieren."
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu, oder schliesse sie, um zu aktualisieren."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} ist verfügbar. Benutze deinen Paketmanager zum aktualisieren, um die neusten Features und Bugfixes zu erhalten!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} ist jetzt verfügbar! Da du in einem begrenzten Netzwerk bist, haben wir es nicht automatisch heruntergeladen."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Änderungen"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Herunterladen ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Lade herunter..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Download abgeschlossen"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Neu Laden"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "Aktualisierung verfügbar"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Download abgeschlossen"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Klicke Hier um die Änderungen zu sehen."
|
||||
},
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(unbekannte Version)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Diese Instanz ist mit einem Server verknüpft, was bedeutet, dass du die Minecraft Version nicht ändern kannst. Das trennen der Verknüpfung trennt diese Instanz permanent vom Server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Diese Instanz ist mit einem Server verknüpft, was bedeutet, dass du Mods nicht aktualisieren, und den Modloader oder die Minecraft Version nicht ändern kannst. Das trennen der Verknüpfung trennt diese Instanz permanent vom Server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Serververknüpfung trennen"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Verlinking der Instanz trennen"
|
||||
},
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Breite eingeben..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Einstellungen"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Ä Minecraft-Server"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Server ist inkompatibel"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Von Serverprojekt verwaltet"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Server konnte nicht erreicht werden"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Mit Instanz synchronisieren"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Von Server bereitgestellt"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Nur Clientseitige Mods können der Serverinstanz hinzugefügt werden"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Spielversion vom Server bereitgestellt"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader vom Server bereitgestellt"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Authentifizierungsserver sind nicht erreichbar"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Inhalte benötigt"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Benötigtes Modpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Dieser Server benötigt Mods zum Spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und dannach direkt dem Server beizutreten."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Geteilte Instanz"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Geteilte Serverinstanz"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Inhalte ansehen"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -18,7 +75,7 @@
|
||||
"message": "Standard Instanz-Einstellungen"
|
||||
},
|
||||
"app.settings.tabs.feature-flags": {
|
||||
"message": "Funktionsflaggen"
|
||||
"message": "Funktionsflags"
|
||||
},
|
||||
"app.settings.tabs.java-installations": {
|
||||
"message": "Java-Installationen"
|
||||
@@ -32,32 +89,32 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcenmanagement"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Jetzt neu laden, um zu aktualisieren, oder automatisch beim Schließen der Modrinth App."
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Jetzt neu laden, um zu aktualisieren, oder automatisch beim Schließen der Modrinth App."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} wurde heruntergeladen. Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} ist verfügbar. Verwende deinen Paketmanager, um die neuesten Funktionen und Fehlerbehebungen zu installieren!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} ist jetzt verfügbar! Da du ein getaktetes Netzwerk nutzt, haben wir den Download nicht automatisch gestartet."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Änderungsverlauf"
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Änderungen"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Herunterladen ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Wird Heruntergeladen..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Download abgeschlossen"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Neu laden"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Update verfügbar"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Download abgeschlossen"
|
||||
"app.update-popup.title": {
|
||||
"message": "Aktualisierung verfügbar"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Hier klicken, um das Änderungsprotokoll anzuzeigen."
|
||||
@@ -72,7 +129,7 @@
|
||||
"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"
|
||||
@@ -105,7 +162,7 @@
|
||||
"message": "Freund entfernen"
|
||||
},
|
||||
"friends.friend.request-sent": {
|
||||
"message": "Freundesanfrage gesendet"
|
||||
"message": "Freundschaftsanfrage gesendet"
|
||||
},
|
||||
"friends.friend.view-profile": {
|
||||
"message": "Profil anzeigen"
|
||||
@@ -270,7 +327,7 @@
|
||||
"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"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(unbekannte Version)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Diese Instanz ist mit einem Server verknüpft, was bedeutet, dass du die Minecraft-Version nicht ändern kannst. Durch das Aufheben der Verknüpfung wird diese Instanz dauerhaft vom Server getrennt."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Diese Instanz ist mit einem Server verknüpft, was bedeutet, dass Mods nicht aktualisiert werden können und du den Mod-Loader oder die Minecraft-Version nicht ändern kannst. Durch das Aufheben der Verknüpfung wird diese Instanz dauerhaft vom Server getrennt."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Vom Server trennen"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Verknüpfung der Instanz trennen"
|
||||
},
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Breite eingeben..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Einstellungen"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Ein Minecraft-Server"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Server ist nicht kompatibel"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Von Serverprojekt verwaltet"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Server konnte nicht erreicht werden"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Mit Instanz synchronisieren"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Vom Server vorgegeben"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Nur clientseitige Mods können der Serverinstanz hinzugefügt werden"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Spielversion vom Server vorgegeben"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader vom Server vorgegeben"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,60 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Cannot reach authentication servers"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Content required"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Required modpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Shared instance"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Shared server instance"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "View contents"
|
||||
},
|
||||
"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.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."
|
||||
},
|
||||
@@ -32,33 +86,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Resource management"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} is ready to install! Reload to update now, or automatically when you close Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} is available. Use your package manager to update for the latest features and fixes!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} is available now! Since you're on a metered network, we didn't automatically download it."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Changelog"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Download ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Downloading..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Download complete"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Reload"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "Update available"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Download complete"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Click here to view the changelog."
|
||||
},
|
||||
@@ -407,11 +461,20 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(unknown version)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "This instance is linked to a server, which means you can't change the Minecraft version. Unlinking will permanently disconnect this instance from the server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "This instance is linked to a server, which means mods can't be updated and you can't change the mod loader or Minecraft version. Unlinking will permanently disconnect this instance from the server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Unlink from server"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Unlink instance"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.confirm.description": {
|
||||
"message": "If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal."
|
||||
"message": "If you proceed, you will not be able to re-link it without creating an entirely new instance. You will no longer receive modpack updates and it will become a normal instance."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.confirm.title": {
|
||||
"message": "Are you sure you want to unlink this instance?"
|
||||
@@ -470,9 +533,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Enter width..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Settings"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "A Minecraft Server"
|
||||
},
|
||||
@@ -497,6 +557,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Server is incompatible"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Managed by server project"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Server couldn't be contacted"
|
||||
},
|
||||
@@ -532,5 +595,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Sync with instance"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Provided by the server"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Only client-side mods can be added to the server instance"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Game version is provided by the server"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader is provided by the server"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "No se puede acceder a los servidores de autenticación"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Contenido requerido"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Modpack requerido"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Este servidor requiere mods para poder jugar. Haz click en Instalar para configurar los archivos requeridos desde Modrinth, después se ejecutará para entrar directamente al servidor."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Instancia compartida"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Instancia de servidor compartida"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Ver contenidos"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -32,33 +89,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestión de recursos"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "¡Modrinth App v{version} lista para instalar! Actualiza ahora o automáticamente al cerrar la aplicación."
|
||||
"app.update-popup.body": {
|
||||
"message": "¡Modrinth App v{version} está lista para instalarse! Actualiza ahora o automáticamente al cerrar la Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "La descarga de la Modrinth App v{version} ha finalizado. Actualiza ahora o automáticamente al cerrar la aplicación Modrinth."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "La descarga de la Modrinth App v{version} ha finalizado. Actualiza ahora o automáticamente al cerrar la Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "¡Modrinth App v{version} ya está disponible! Como estás en una red con límite de datos, no se descargó automáticamente."
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "La Modrinth App v{version} está disponible. ¡Usa tu gestor de paquetes para actualizarla y tener las últimas funciones y corrección de errores!"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "¡La Modrinth App v{version} ya está disponible! Al estar usando una red de datos límitada, no la hemos descargado automáticamente."
|
||||
},
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Registro de cambios"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Descargar ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Descargando..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Descarga completada"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Recargar"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "Actualización disponible"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Descarga completada"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Haz clic aquí para ver el registro de cambios."
|
||||
},
|
||||
@@ -189,7 +246,7 @@
|
||||
"message": "Servidor de Minecraft"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "Resource pack"
|
||||
"message": "Paquete de recursos"
|
||||
},
|
||||
"instance.settings.tabs.general": {
|
||||
"message": "General"
|
||||
@@ -240,7 +297,7 @@
|
||||
"message": "Los grupos de la librería te ayudan a organizar tus instancias en diferentes secciones en tu librería."
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.enter-name": {
|
||||
"message": "Ingresa el nombre del grupo"
|
||||
"message": "Escribe nombre del grupo"
|
||||
},
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Nombre"
|
||||
@@ -249,7 +306,7 @@
|
||||
"message": "Hooks de inicio"
|
||||
},
|
||||
"instance.settings.tabs.hooks.custom-hooks": {
|
||||
"message": "Hooks de inicio personalizados"
|
||||
"message": "Hooks personalizados"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "Los hooks permiten que usuarios avanzados ejecuten comandos del sistema antes y despues de lanzar el juego."
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(versión desconocida)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Esta instancia está vinculada a un servidor, lo que significa que no puedes cambiar la versión de Minecraft. Desvincularla la desconectará permanentemente del servidor."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Esta instancia está vinculada a un servidor, 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 servidor."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Desvincular del servidor"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Desvincular instancia"
|
||||
},
|
||||
@@ -470,9 +536,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"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "El servidor es incompatible"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Gestionado por el proyecto del servidor"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "No se pudo conectar al servidor"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Sincronizar con la instancia"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Proporcionado por el servidor"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Solo se puede añadir mods que sean del lado del cliente a la instancia del servidor"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "La versión del juego es proporcionada por el servidor"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "El loader es proporcionado por el servidor"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,58 @@
|
||||
{
|
||||
"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.content-required": {
|
||||
"message": "Contenu requis"
|
||||
},
|
||||
"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.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."
|
||||
},
|
||||
@@ -18,7 +72,7 @@
|
||||
"message": "Instalaciones de Java"
|
||||
},
|
||||
"app.settings.tabs.language": {
|
||||
"message": "Lenguaje"
|
||||
"message": "Idioma"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "Privacidad"
|
||||
@@ -26,33 +80,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestión de recursos"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "¡La versión v{version} de Modrinth está lista para instalarse! Actualiza ahora o automáticamente al cerrar la aplicación."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "La descarga de la versión v{version} de Modrinth ha finalizado. Actualice ahora o automáticamente al cerrar la aplicación."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "¡La versión v{version} de Modrinth App ya está disponible! Como estás conectado a una red con límite de datos, no la hemos descargado automáticamente."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Registro de cambios"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"message": "Descarga ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Descargando..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "Recarga"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Actualización disponible"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Descarga completada"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Haga clic aquí para ver el registro de cambios."
|
||||
},
|
||||
@@ -464,9 +491,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,113 +0,0 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Minecrafti autentimiserverid võivad praegu all olla. Kontrolli oma internetiühendust ja proovi hiljem uuesti."
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version} on valmis installimiseks! Uuendamiseks taaskäivitage kohe või automaatselt, kui sulgeted Modritnth App."
|
||||
},
|
||||
"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,497 +0,0 @@
|
||||
{
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "حالت برنامهنویس روشن شد."
|
||||
},
|
||||
"app.settings.downloading": {
|
||||
"message": "درحال دانلود v{version}"
|
||||
},
|
||||
"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": "مدیریت منابع"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "تغییرات"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "بارگذاری دوباره"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "بروزرسانی دردسترس"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "دانلود کامل شد"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "کلیک کنین تا تغییرات رو ببینید."
|
||||
},
|
||||
"app.update.download-update": {
|
||||
"message": "دانلود بروزرسانی"
|
||||
},
|
||||
"app.update.downloading-update": {
|
||||
"message": "درحال دانلود آپدیت ({percent}%)"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "افزودن یک دوست"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} دوست {count, plural, one {request} other {requests}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "ارسال درخواست دوستی"
|
||||
},
|
||||
"friends.add-friend.title": {
|
||||
"message": "افزودن دوست"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "این ممکنه با یوزرنیم ماینکرافتش متفاوت باشه!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "وارد کردن یوزرنیم مودرینث..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "یوزرنیم مودرینث دوست شما چیست؟"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"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.search-friends-placeholder": {
|
||||
"message": "جستوجو دوستان..."
|
||||
},
|
||||
"friends.section.heading": {
|
||||
"message": "{title} - {count}"
|
||||
},
|
||||
"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": "سینک کردن با اینستنس"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,51 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Todennuspalvelimiin ei saada yhteyttä"
|
||||
},
|
||||
"app.modal.install-to-play.header": {
|
||||
"message": "Asenna pelataksesi"
|
||||
},
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Asenna"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural, one {# mod} other {# modia}}"
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Jaettu instanssi"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Jaettu palvelininstanssi"
|
||||
},
|
||||
"app.modal.update-to-play.added-count": {
|
||||
"message": "{count} lisätty"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.added": {
|
||||
"message": "Lisätty"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.removed": {
|
||||
"message": "Poistettu"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.updated": {
|
||||
"message": "Päivitetty"
|
||||
},
|
||||
"app.modal.update-to-play.header": {
|
||||
"message": "Päivitä pelataksesi"
|
||||
},
|
||||
"app.modal.update-to-play.published-date": {
|
||||
"message": "{date, date, long}"
|
||||
},
|
||||
"app.modal.update-to-play.removed-count": {
|
||||
"message": "{count} poistettu"
|
||||
},
|
||||
"app.modal.update-to-play.update-required": {
|
||||
"message": "Päivitys vaaditaan"
|
||||
},
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "Pävitys vaaditaan pelataksesi {name}. Päivitä viimeisimpään versioon pelataksesi."
|
||||
},
|
||||
"app.modal.update-to-play.updated-count": {
|
||||
"message": "{count} päivitetty"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Kehittäjätila käytössä."
|
||||
},
|
||||
@@ -23,39 +68,15 @@
|
||||
"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.downloading": {
|
||||
"message": "Ladataan..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "Lataa uudelleen"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -78,13 +99,13 @@
|
||||
"message": "{count} ystävä{count, plural, one {pyyntö} other {pyyntöä}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Lähetä ystäväpyyntö"
|
||||
"message": "Lähetä kaveripyyntö"
|
||||
},
|
||||
"friends.add-friend.title": {
|
||||
"message": "Lisätään ystävää"
|
||||
"message": "Lisätään kaveria"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "Se voi olla eri kuin heidän Minecraft-käyttäjänimensä!"
|
||||
"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..."
|
||||
@@ -467,9 +488,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Syötä leveys..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Asetukset"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Minecraft palvelin"
|
||||
},
|
||||
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Hindi maabot ang mga authentication server"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Nangangailangan ng kontento"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Kinailangan na modpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Ang server rna ito ay nangangailangan ng mga mod upang makalaro. Pindutin ang install upang maihanda ang mga kinakailangang file galing sa Modrinth, matapos ay ilunsad nang diretso sa server."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Binahaging instansiya"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Binahaging instansiyang pang-server"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Tingnan ang mga kontento"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -32,33 +89,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Pamamahala ng paglalaan"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"app.update-popup.body": {
|
||||
"message": "Ang Modrinth App v{version} ay handa nang ma-install. Mag-reload upang ma-update ngayon, o awtomatiko sa pagsara ng Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Tapos nang ma-download ang Modrinth App v{version}. Mag-reload upang ma-update ngayon, o awtomatiko sa pagsara ng Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Magagamit na ngayon ang Modrinth App v{version}. Gamitin ang iyong package manager upang i-update sa pinabagong tampok at pag-aayos!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Magagamit na ngayon ang Modrinth App v{version}! Hindi namin dinanload kaagad dahil naka-metro ang inyong network."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Changelog"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "I-download ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Nagda-download..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Nakumpleto ang pagdownload"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Mag-reload"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "May bagong update"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Nakumpleto ang pagdownload"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Dito pumindot upang matingnan ang changelog."
|
||||
},
|
||||
@@ -252,7 +309,7 @@
|
||||
"message": "Mga custom na launch hook"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga system command bago at pagkatapos ma-launch ang laro."
|
||||
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga pansistemang utos o system command bago at pagkatapos ma-launch ang laro."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit": {
|
||||
"message": "Post-exist"
|
||||
@@ -357,7 +414,7 @@
|
||||
"message": "Sigurado ka bang gusto mong i-reinstall ang instansiyang ito?"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.description": {
|
||||
"message": "Mare-reset ang mga kontento ng instansiya sa orihinal niyang estado, tatanggalin ang mga mods at kontentong idinagdag mo sa orihinal na modpack."
|
||||
"message": "Mare-reset ang mga kontento ng instansiya sa orihinal niyang estado, tatanggalin ang mga mod at kontentong idinagdag mo sa orihinal na modpack."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.title": {
|
||||
"message": "I-reinstall ang modpack"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(hindi kilalang bersiyon)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Ang instansiyang ito ay naka-link sa isang server, ibig sabihin ay hindi mo mapapalitan ang bersiyon ng Minecraft. Permanenteng madi-diskonekta ang instansiyang ito sa server kung mag-unlink."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Ang instansiyang ito ay naka-link sa isang server, 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 server kung mag-unlink."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "I-unlink sa server"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "I-unlink sa instansiya"
|
||||
},
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Ilagay ang lapad..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Mga Setting"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Isang Minecraft Server"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Hindi magkatugma sa server"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Pinamamahala ng proyektong server"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Hindi makontak ang server"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Maki-sync sa instansiya"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Handog ng server"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Mga mod sa panig ng client lamang ang maidadaragdag sa instansiyang server"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Ang bersiyon ng laro ay handog ng server"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Ang loader ay handog na ng server"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Impossible de contacter les serveurs d'authentification"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Contenu requis"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Modpack requis"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Ce serveur a besoin de mods pour jouer. Cliquez sur Installer pour mettre en place les fichiers requis depuis Modrinth, puis lancez directement dans le serveur."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Instance partagée"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Instance serveur partagée"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Voir le contenu"
|
||||
},
|
||||
"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é."
|
||||
},
|
||||
@@ -32,33 +89,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestion des ressources"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "L'application Modrinth v{version} est prête à être installée ! Relancez l'application pour faire la mise à jour maintenant, ou automatiquement à la fermeture de l'application Modrinth."
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} est prête à être installée ! Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Le téléchargement de l'application Modrinth v{version} est terminé ! Relancez l'application pour faire la mise à jour maintenant, ou automatiquement à la fermeture de l'application Modrinth."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} a finie d'être téléchargée. Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "L'application Modrinth v{version} est disponible dès maintenant ! Lorsque vous êtes sur un réseau limité ou en données mobiles, nous ne téléchargerons pas les mises à jour automatiquement."
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} est disponible. Utilisez votre gestionnaire de paquets pour mettre à jour les dernières fonctionnalités et corrections de bogues !"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} est disponible maintenant ! Puisque vous êtes sur un réseau métré, nous ne l'avons pas téléchargé automatiquement."
|
||||
},
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Journal des modifications"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Télécharger ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Téléchargement..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Téléchargement terminé"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Recharger"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "Mise à jour disponible"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Téléchargement terminé"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Cliquez ici pour voir les changements récents."
|
||||
},
|
||||
@@ -78,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"
|
||||
@@ -87,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..."
|
||||
@@ -96,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"
|
||||
@@ -126,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..."
|
||||
@@ -249,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."
|
||||
@@ -258,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..."
|
||||
@@ -369,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 ?"
|
||||
@@ -384,7 +441,7 @@
|
||||
"message": "Voir toutes les versions"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.change-version": {
|
||||
"message": "Changer la version"
|
||||
"message": "changer la version"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.install": {
|
||||
"message": "installer"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(version inconnue)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Cette instance est liée à un modpack, ce qui veut dire que vous ne pouvez pas changer la version de Minecraft. Délier déconnectera cette instance du serveur en permanence."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Cette instance est liée à un serveur, ce qui veut dire que les mods ne peuvent pas être mis à jour et que vous ne pouvez pas changer de mod loader ou de version de Minecraft. Délier déconnectera cette instance du serveur en permanence."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Délier du serveur"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Délier l'instance"
|
||||
},
|
||||
@@ -470,9 +536,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"
|
||||
},
|
||||
@@ -486,7 +549,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"
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Le serveur est incompatible"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Géré par le projet du serveur"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Le serveur n'a pas pu être contacté"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Synchroniser avec l'instance"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Fournis par le serveur"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Seuls les mods client peuvent être ajoutés à l'instance du serveur"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Version du jeu est procurée par le serveur"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader est procuré par le serveur"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,55 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "ייתכן ששרתי האימות של Minecraft מושבתים כרגע. בדוק את חיבור האינטרנט שלך ונסה שוב מאוחר יותר."
|
||||
"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.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": "מצב מפתח מופעל."
|
||||
},
|
||||
@@ -23,83 +68,65 @@
|
||||
"app.settings.tabs.java-installations": {
|
||||
"message": "התקנות ג'אווה"
|
||||
},
|
||||
"app.settings.tabs.language": {
|
||||
"message": "שפה"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "פרטיות"
|
||||
},
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "ניהול משאבים"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App גרסה: {version} מוכנה להורדה!\nרענן כדי להוריד עכשיו, או באופן אוטומטי כאשר תסגור את האפליקציה."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App גרסה {version} סיימה את תהליך ההורדה. רענן כדי לעדכן עכשיו, או באופן אוטומטי כאשר תסגור את האפליקציה."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "אפליקצית מודרינת' גרסה {version} זמינה עכשיו! מכיוון שאתה על נתונים, אנחנו לא הורדנו אותה אוטומטית."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "יומן שינויים"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"message": "הורד ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "מוריד..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "רענן"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "עדכונים זמינים"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "הורדה הושלמה"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "לחץ כאן כדי לראות את יומן השינויים."
|
||||
"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": "להוסיף חבר"
|
||||
"message": "הוספת חבר"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count, plural, one {בקשת חברות אחת} other {# בקשות חברות}}"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "שלח בקשת חברות"
|
||||
"message": "שליחת בקשת חברות"
|
||||
},
|
||||
"friends.add-friend.title": {
|
||||
"message": "מוסיף חבר"
|
||||
"message": "הוספת חבר"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "זה יכול להיות שונה מהמשתמש Minecraft!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "הכנס שם משתמש של Modrinth..."
|
||||
"message": "שם משתמש Modrinth..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "מה השם משתמש של החבר שלך בModrinth"
|
||||
"message": "מה השם משתמש של החבר שלך בModrinth?"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"message": "<link>הוסף חברים</link> כדי לראות במה הם משחקים!"
|
||||
"message": "ניתן <link>להוסיף חברים</link> כדי לראות במה הם משחקים!"
|
||||
},
|
||||
"friends.friend.cancel-request": {
|
||||
"message": "בטל בקשה"
|
||||
"message": "ביטול בקשה"
|
||||
},
|
||||
"friends.friend.remove-friend": {
|
||||
"message": "הסר חבר"
|
||||
"message": "הסרת חבר"
|
||||
},
|
||||
"friends.friend.request-sent": {
|
||||
"message": "בקשת חברות נשלחה"
|
||||
},
|
||||
"friends.friend.view-profile": {
|
||||
"message": "הצג פרופיל"
|
||||
"message": "הצגת פרופיל"
|
||||
},
|
||||
"friends.heading": {
|
||||
"message": "חברים"
|
||||
@@ -120,13 +147,13 @@
|
||||
"message": "אין חברים התואמים ל \"{query}\""
|
||||
},
|
||||
"friends.search-friends-placeholder": {
|
||||
"message": "חפש חברים..."
|
||||
"message": "חיפוש חברים..."
|
||||
},
|
||||
"friends.section.heading": {
|
||||
"message": "{title} - {count}"
|
||||
},
|
||||
"friends.sign-in-to-add-friends": {
|
||||
"message": "<link>התחבר לחשבון Modrinth </link> כדי להוסיף חברים ולראות מה הם משחקים!"
|
||||
"message": "אפשר <link>להתחבר לחשבון Modrinth</link> כדי להוסיף חברים ולראות במה הם משחקים!"
|
||||
},
|
||||
"instance.add-server.add-and-play": {
|
||||
"message": "הוסף ושחק"
|
||||
@@ -144,7 +171,7 @@
|
||||
"message": "שאל"
|
||||
},
|
||||
"instance.add-server.title": {
|
||||
"message": "הוסף שרת"
|
||||
"message": "הוספת שרת"
|
||||
},
|
||||
"instance.edit-server.title": {
|
||||
"message": "ערוך שרת"
|
||||
@@ -156,7 +183,7 @@
|
||||
"message": "שם"
|
||||
},
|
||||
"instance.edit-world.placeholder-name": {
|
||||
"message": "עולם מיינקראפט"
|
||||
"message": "עולם Minecraft"
|
||||
},
|
||||
"instance.edit-world.reset-icon": {
|
||||
"message": "אפס סמל"
|
||||
@@ -210,28 +237,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": "שם"
|
||||
@@ -270,7 +297,7 @@
|
||||
"message": "מעטפת"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.description": {
|
||||
"message": "פקודת מעטפת להפעלת מיינקראפט."
|
||||
"message": "פקודת מעטפת להפעלת Minecraft."
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||
"message": "הכנס פקודת מעטפת..."
|
||||
@@ -279,13 +306,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": "התקן"
|
||||
@@ -321,16 +348,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": "פלטפורמה"
|
||||
@@ -461,9 +488,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": "पूर्व-लाँच"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Szükséges tartalom"
|
||||
},
|
||||
"app.modal.install-to-play.header": {
|
||||
"message": "Telepítés a játékhoz"
|
||||
},
|
||||
"app.modal.install-to-play.install-button": {
|
||||
"message": "Telepítés"
|
||||
},
|
||||
"app.modal.install-to-play.mod-count": {
|
||||
"message": "{count, plural,one {# mod}other {# modok}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "Szükséges modcsomag"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Ehhez a szerverhez modok szükségesek a játékhoz. Kattints a Telepítés gombra, hogy telepítsd a szükséges fájlokat a Modrinth-ról, majd indítsd el közvetlenül a szervert."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Megosztott profil"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Megosztott szerverprofil"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Tartalom megjelenítése"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -32,32 +89,32 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Erőforráskezelés"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "A Modrinth App v{version} telepítésre kész! Frissítéshez indítsa újra a programot, vagy zárja be a Modrinth App alkalmazást, és a frissítés automatikusan megtörténik."
|
||||
"app.update-popup.body": {
|
||||
"message": "A Modrinth App v{version} telepítésre kész! Frissítéshez Töltsd újra az oldalt, vagy a Modrinth App bezárásakor automatikusan frissül."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez indítsa újra az alkalmazást, vagy zárja be a Modrinth App alkalmazást, és a frissítés automatikusan megtörténik."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez Töltsd újra az oldalt, vagy a Modrinth App bezárásakor automatikusan frissül."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "A Modrinth App v{version} már elérhető! Mivel díjköteles hálózaton vagy, így nem töltöttük le automatikusan."
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "A Modrinth App v{version} elérhető. Használd a csomagkezelőt a legújabb funkciók és javítások frissítéséhez!"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Változtatások"
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "A Modrinth App v{version} már elérhető! Mivel mérhető hálózaton vagy, nem töltöttük le automatikusan."
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Változásnapló"
|
||||
},
|
||||
"app.update-popup.download": {
|
||||
"message": "Letöltés ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Letöltés..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Letöltés sikeres"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Újratöltés"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Frissítések elérhetőek"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Letöltés befejezve"
|
||||
"app.update-popup.title": {
|
||||
"message": "Frissítés elérhető"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Kattints ide a változások megtekintéséhez."
|
||||
@@ -237,10 +294,10 @@
|
||||
"message": "Új csoport létrehozása"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.description": {
|
||||
"message": "A könyvtárgyűjtemények segítenek külön kategóriákba rendszerezni a profiljaidat."
|
||||
"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": "Add meg a gyűjtemény nevét"
|
||||
"message": "Adja meg a gyűjtemény nevét"
|
||||
},
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Név"
|
||||
@@ -273,7 +330,7 @@
|
||||
"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"
|
||||
@@ -288,7 +345,7 @@
|
||||
"message": "Telepítés"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.already-installed.modded": {
|
||||
"message": "{platform} {version} már telepítve van ehhez: Minecraft {game_version}"
|
||||
"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"
|
||||
@@ -333,40 +390,40 @@
|
||||
"message": "Minecraft {version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.no-connection": {
|
||||
"message": "Nem lehetséges a csatolt modcsomag részleteit lekérdezni. Kérlek nézd meg az internetkapcsolatod."
|
||||
"message": "Nem lehetséges a csatolt modpack részleteit lekérdezni. Kérlek nézd meg az internetkapcsolatod."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-loader-versions": {
|
||||
"message": "{loader} nem elérhető a Minecraft {version} verziójához. Próbálj meg egy másik modbetöltőt."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-modpack-found": {
|
||||
"message": "A profilod linkelve van egy Modrinth modcsomaghoz, de a modcsomag nem található online."
|
||||
"message": "A profilod linkelve van egy Modrinth modcsomaghoz, de a modcsomag nem található Modrinth-on."
|
||||
},
|
||||
"instance.settings.tabs.installation.platform": {
|
||||
"message": "Platform"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button": {
|
||||
"message": "Modcsomag újratelepítése"
|
||||
"message": "Modpack újratelepítése"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
|
||||
"message": "Modcsomag újratelepítése"
|
||||
"message": "Modpack újratelepítése"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.description": {
|
||||
"message": "Az újratelepítés visszaállítja az összes telepített vagy módosított tartalmat a modcsomag által biztosított állapotra, eltávolítva az eredeti telepítéshez hozzáadott modokat vagy tartalmakat. Ez megoldhatja a váratlan hibákat, de fontos tudni hogyha használsz világokat amelyekben utólagosan hozzáadott tartalom van, azok a világok 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 profilt?"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.description": {
|
||||
"message": "Visszaállítja a profilod tartalmát az eredeti állapotába, eltávolítva az eredeti modcsomaghoz 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": "Modcsomag újratelepítése"
|
||||
"message": "Modpack újratelepítése"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.button": {
|
||||
"message": "Javítás"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.button.repairing": {
|
||||
"message": "Javítás"
|
||||
"message": "Javítás folyamatban"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.confirm.description": {
|
||||
"message": "A javítás újratelepíti a Minecraft alapját és ellenőrzi, hogy nincs-e sérülés. Ez megoldhatja a problémákat, ha a játék nem az indítóval kapcsolatos hibák miatt nem indul el, de nem oldja meg a telepített modokkal kapcsolatos problémákat vagy összeomlásokat."
|
||||
@@ -396,17 +453,26 @@
|
||||
"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-server-vanilla.description": {
|
||||
"message": "Ez az profil egy szerverhez van kapcsolva, ami azt jelenti, hogy nem lehet megváltoztatni a Minecraft verzióját. A kapcsolás megszüntetése véglegesen leválasztja ezt az profilt a szerverről."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Ez az profil egy szerverhez van kapcsolva, ami azt jelenti, hogy a modok nem frissíthetők, é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 szerverről."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Leválasztás a szerverről"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Profil leválasztása"
|
||||
},
|
||||
@@ -420,7 +486,7 @@
|
||||
"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": "Modcsomagról való leválasztás"
|
||||
"message": "Modpack-ről való leválasztás"
|
||||
},
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java és memória"
|
||||
@@ -459,7 +525,7 @@
|
||||
"message": "A játék ablakának magassága indításkor."
|
||||
},
|
||||
"instance.settings.tabs.window.height.enter": {
|
||||
"message": "Magasság megadása..."
|
||||
"message": "Magaság megadása..."
|
||||
},
|
||||
"instance.settings.tabs.window.width": {
|
||||
"message": "Szélesség"
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Szélesség megadása..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Beállítások"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Egy Minecraft szerver"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "A Szerver nem kompatibilis"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Szerverprojekt által kezelt"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Nem lehet kapcsolatot létesíteni a szerverrel"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Profil szinkronizálása"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "A szerver biztosítja"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Csak kliensoldali modok adhatók hozzá a szerverprofilhoz"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "A játékverziót a szerver biztosítja"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "A betöltőt a szerver biztosítja"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,66 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Peladen autentikasi Minecraft mungkin sedang tidak tersedia saat ini. Periksa koneksi internet Anda dan coba lagi nanti."
|
||||
"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 peladen autentikasi"
|
||||
"message": "Tidak dapat terhubung ke server autentikasi"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Konten diperlukan"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Paket mod yang diperlukan"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Mod diperlukan untuk bermain di server ini. Klik pasang untuk menyiapkan berkas-berkas yang diperlukan dari Modrinth, kemudian luncurkan langsung sari server."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Instans terbagi"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Instans server terbagi"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Lihat konten"
|
||||
},
|
||||
"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."
|
||||
@@ -15,7 +72,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"
|
||||
@@ -32,35 +89,35 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Manajemen sumber"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} siap dipasang! Muat ulang untuk memperbarui sekarang, atau secara otomatis saat Anda menutup Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} telah selesai mengunduh. Muat ulang untuk memperbarui sekarang, atau secara otomatis saat Anda menutup Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} tersedia. Gunakan pengelola paket Anda untuk memperbarui dan mendapatkan fitur-fitur dan perbaikan terbaru!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} sudah tersedia! Karena Anda saat ini sedang berada dalam jaringan terukur, kami tidak mengunduhnya secara otomatis."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Log perubahan"
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Catatan perubahan"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Unduh ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Mengunduh..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "Muat ulang"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Pembaruan tersedia"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Selesai mengunduh"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Muat ulang"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Pembaruan tersedia"
|
||||
},
|
||||
"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!"
|
||||
@@ -93,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!"
|
||||
@@ -141,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"
|
||||
@@ -153,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"
|
||||
@@ -186,7 +243,7 @@
|
||||
"message": "Nama"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "Peladen Minecraft"
|
||||
"message": "Server Minecraft"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "Paket sumber"
|
||||
@@ -195,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..."
|
||||
@@ -213,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"
|
||||
@@ -237,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"
|
||||
@@ -249,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."
|
||||
@@ -267,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..."
|
||||
@@ -303,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"
|
||||
@@ -315,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"
|
||||
@@ -333,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"
|
||||
@@ -369,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"
|
||||
@@ -407,20 +464,29 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(versi tidak dikenal)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Instans ini berkaitan dengan suatu server, yang berarti Anda tidak dapat mengubah versi Minecraft. Melepas kaitan akan memutuskan instans ini dari server secara permanen."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Instans ini berkaitan dengan suatu server, yang berarti mod tidak dapat diperbarui dan Anda tidak dapat mengubah versi peluncur mod atau Minecraft. Melepas kaitan akan memutuskan instans ini dari server secara permanen."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Lepas kaitan dari server"
|
||||
},
|
||||
"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"
|
||||
@@ -444,7 +510,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"
|
||||
@@ -470,14 +536,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"
|
||||
@@ -489,48 +552,63 @@
|
||||
"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.linked_server": {
|
||||
"message": "Dikelola oleh proyek server"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Disediakan oleh server"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Anda hanya dapat menambahkan mod sisi klien pada instans server"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Versi permainan disediakan oleh server"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Pemuat disediakan oleh server"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Impossibile raggiungere i server di autenticazione"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Contenuto richiesto"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Pacchetto di mod richiesto"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "Questo server richiede alcune mod. Clicca Installa per scaricarle direttamente da Modrinth, poi sarai pronto a giocare."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Istanza condivisa"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Istanza del server condivisa"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Mostra contenuti"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -15,10 +72,10 @@
|
||||
"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"
|
||||
@@ -30,37 +87,37 @@
|
||||
"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, o avverrà in automatico alla chiusura di Modrinth App."
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} è pronta per essere installata! Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, o avverrà in automatico alla chiusura di Modrinth App."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Modrinth App v{version} è ora disponibile! Poiché sei su una rete a consumo, non l''abbiamo scaricata automaticamente."
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} è disponibile. Usa il tuo gestore di pacchetti per aggiornare e ricevere le novità più recenti!"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "Changelog"
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} è ora disponibile! Poiché sei su una rete a consumo, non l'abbiamo scaricata automaticamente."
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Novità"
|
||||
},
|
||||
"app.update-popup.download": {
|
||||
"message": "Scarica ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Scaricando..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "Ricarica"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "Aggiornamento disponibile"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Download completato"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Ricarica"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Aggiornamento disponibile"
|
||||
},
|
||||
"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!"
|
||||
@@ -72,19 +129,19 @@
|
||||
"message": "Scaricando aggiornamento ({percent}%)"
|
||||
},
|
||||
"app.update.reload-to-update": {
|
||||
"message": "Ricarica per installare l''aggiornamento"
|
||||
"message": "Ricarica per installare l'aggiornamento"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "Stringi un''amicizia"
|
||||
"message": "Stringi un'amicizia"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, one {richiesta} other {richieste}} d''amicizia"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "Invia richiesta d''amicizia"
|
||||
"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!"
|
||||
@@ -93,7 +150,7 @@
|
||||
"message": "Inserisci il nome utente Modrinth..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "Con quale utente Modrinth vuoi stringere l''amicizia?"
|
||||
"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!"
|
||||
@@ -105,7 +162,7 @@
|
||||
"message": "Annulla amicizia"
|
||||
},
|
||||
"friends.friend.request-sent": {
|
||||
"message": "Richiesta d''amicizia inviata"
|
||||
"message": "Richiesta d'amicizia inviata"
|
||||
},
|
||||
"friends.friend.view-profile": {
|
||||
"message": "Visita profilo"
|
||||
@@ -114,7 +171,7 @@
|
||||
"message": "Amicizie"
|
||||
},
|
||||
"friends.heading.active": {
|
||||
"message": "Presente"
|
||||
"message": "Presenti"
|
||||
},
|
||||
"friends.heading.offline": {
|
||||
"message": "Offline"
|
||||
@@ -135,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"
|
||||
@@ -201,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..."
|
||||
@@ -210,7 +267,7 @@
|
||||
"message": "Duplica"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
|
||||
"message": "Impossibile duplicare durante l''installazione."
|
||||
"message": "Impossibile duplicare durante l'installazione."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance": {
|
||||
"message": "Duplica istanza"
|
||||
@@ -252,7 +309,7 @@
|
||||
"message": "Hook di avvio personalizzati"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "I hook permettono a utenti avanzati di eseguire comandi di sistema prima e dopo l''avvio 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"
|
||||
@@ -267,13 +324,13 @@
|
||||
"message": "Pre-lancio"
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.description": {
|
||||
"message": "Eseguito prima dell''avvio dell''istanza."
|
||||
"message": "Eseguito prima dell'avvio dell'istanza."
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.enter": {
|
||||
"message": "Inserisci comando pre-avvio..."
|
||||
},
|
||||
"instance.settings.tabs.hooks.title": {
|
||||
"message": "Hook all''avvio del gioco"
|
||||
"message": "Hook all'avvio del gioco"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper": {
|
||||
"message": "Wrapper"
|
||||
@@ -339,7 +396,7 @@
|
||||
"message": "{loader} non è disponibile per Minecraft {version}. Prova un altro loader."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-modpack-found": {
|
||||
"message": "L''istanza è collegata a un pacchetto di mod, ma non è stato possibile trovarlo su Modrinth."
|
||||
"message": "L'istanza è collegata a un pacchetto di mod, ma non è stato possibile trovarlo su Modrinth."
|
||||
},
|
||||
"instance.settings.tabs.installation.platform": {
|
||||
"message": "Piattaforma"
|
||||
@@ -351,13 +408,13 @@
|
||||
"message": "Reinstallando pacchetto di mod"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.description": {
|
||||
"message": "La reinstallazione resetterà tutto il contenuto installato o modificato a ciò che è fornito dal pacchetto di mod, rimuovendo ogni mod o contenuto che tu abbia aggiunto all''installazione originale. Questo potrebbe risolvere comportamenti inaspettati se ci sono state modifiche all''istanza, ma se ora i tuoi mondi dipendessero da contenuto aggiuntivo installato, essi verrebbero corrotti."
|
||||
"message": "La reinstallazione resetterà tutto il contenuto installato o modificato a ciò che è fornito dal pacchetto di mod, rimuovendo ogni mod o contenuto che tu abbia aggiunto all'installazione originale. Questo potrebbe risolvere comportamenti inaspettati se ci sono state modifiche all'istanza, ma se ora i tuoi mondi dipendessero da contenuto aggiuntivo installato, essi verrebbero corrotti."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.title": {
|
||||
"message": "Vuoi davvero reinstallare questa istanza?"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.description": {
|
||||
"message": "Resetta il contenuto dell''istanza al suo stato originale, rimuovendo ogni mod o contenuto che tu abbia aggiunto al pacchetto di mod originale."
|
||||
"message": "Resetta il contenuto dell'istanza al suo stato originale, rimuovendo ogni mod o contenuto che tu abbia aggiunto al pacchetto di mod originale."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.title": {
|
||||
"message": "Reinstalla pacchetto di mod"
|
||||
@@ -372,7 +429,7 @@
|
||||
"message": "La riparazione reinstalla le dipendenze di Minecraft e verifica eventuali corruzioni. Questo potrebbe risolvere problemi di avvio del gioco se dovuti a errori legati al launcher, ma non risolverà problemi o crash legati alle mod installate."
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.confirm.title": {
|
||||
"message": "Riparare l''istanza?"
|
||||
"message": "Riparare l'istanza?"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.in-progress": {
|
||||
"message": "Riparazione in corso"
|
||||
@@ -396,7 +453,7 @@
|
||||
"message": "ripara"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
|
||||
"message": "Impossibile {action} durante l''installazione"
|
||||
"message": "Impossibile {action} durante l'installazione"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
|
||||
"message": "Impossibile {action} senza connessione"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(versione sconosciuta)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "Questa istanza è collegata a un server, cioè non puoi cambiare la versione di Minecraft. Lo scollegamento disconnetterà definitivamente questa istanza dal server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "Questa istanza è collegata a un server, perciò 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 server."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Scollega dal server"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Scollega istanza"
|
||||
},
|
||||
@@ -426,7 +492,7 @@
|
||||
"message": "Java e memoria"
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Variabili d''ambiente"
|
||||
"message": "Variabili d'ambiente"
|
||||
},
|
||||
"instance.settings.tabs.java.hooks": {
|
||||
"message": "Hook"
|
||||
@@ -456,7 +522,7 @@
|
||||
"message": "Altezza"
|
||||
},
|
||||
"instance.settings.tabs.window.height.description": {
|
||||
"message": "L''altezza della finestra del gioco all''avvio."
|
||||
"message": "L'altezza della finestra del gioco all'avvio."
|
||||
},
|
||||
"instance.settings.tabs.window.height.enter": {
|
||||
"message": "Inserisci altezza..."
|
||||
@@ -465,14 +531,11 @@
|
||||
"message": "Larghezza"
|
||||
},
|
||||
"instance.settings.tabs.window.width.description": {
|
||||
"message": "La larghezza della finestra del gioco all''avvio."
|
||||
"message": "La larghezza della finestra del gioco all'avvio."
|
||||
},
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Inserisci larghezza..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Impostazioni"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Un server Minecraft"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Server non è compatibile"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Gestito dal server"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Impossibile contattare il server"
|
||||
},
|
||||
@@ -522,15 +588,27 @@
|
||||
"message": "Mondo già in uso"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Fornito dall''istanza"
|
||||
"message": "Determinato dall'istanza"
|
||||
},
|
||||
"search.filter.locked.instance-game-version.title": {
|
||||
"message": "La versione del gioco è fornita dall''istanza"
|
||||
"message": "La versione del gioco è determinata dall'istanza"
|
||||
},
|
||||
"search.filter.locked.instance-loader.title": {
|
||||
"message": "Il loader è fornito dall''istanza"
|
||||
"message": "Il loader è determinato dall'istanza"
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Sincronizza con l''istanza"
|
||||
"message": "Sincronizza con l'istanza"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Determinato dal server"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "Solo mod lato client possono essere aggiunte all'istanza del server"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "La versione del gioco è determinata dal server"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Il loader è determinato dal server"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,63 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "認証サーバーにアクセスできません"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"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, other {#個のMod}}"
|
||||
},
|
||||
"app.modal.install-to-play.required-modpack": {
|
||||
"message": "必須なModpack"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "このサーバーをプレイするにはModが必要です。インストールをクリックしてModrinthから必要なファイルを設定し、サーバーに接続してください。"
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "共有インスタンス"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "共有サーバーインスタンス"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "コンテンツを見る"
|
||||
},
|
||||
"app.modal.update-to-play.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": "開発者モードがオンになっています。"
|
||||
},
|
||||
@@ -12,7 +69,7 @@
|
||||
"message": "v{version}をダウンロード中"
|
||||
},
|
||||
"app.settings.tabs.appearance": {
|
||||
"message": "外観"
|
||||
"message": "表示設定"
|
||||
},
|
||||
"app.settings.tabs.default-instance-options": {
|
||||
"message": "インスタンスの基本設定"
|
||||
@@ -21,49 +78,49 @@
|
||||
"message": "機能設定"
|
||||
},
|
||||
"app.settings.tabs.java-installations": {
|
||||
"message": "Javaのインストール"
|
||||
"message": "Javaのインストール設定"
|
||||
},
|
||||
"app.settings.tabs.language": {
|
||||
"message": "言語"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "プライバシー"
|
||||
"message": "プライバシー設定"
|
||||
},
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "リソース管理"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version}は今すぐインストールできます!再起動して今すぐ更新するか、アプリを閉じた際に自動で更新されます。"
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} のインストール準備が整いました!今すぐ更新するには再読み込みするか、Modrinth App を閉じる際に自動更新されます。"
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version}のダウンロードが完了しました。再起動して今すぐ更新するか、アプリを閉じた際に自動で更新されます。"
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} のダウンロードが完了しました。今すぐ更新するには再読み込みするか、Modrinth App を閉じる際に自動更新されます。"
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Modrinth App v{version}は今すぐダウンロードできます!従量課金制ネットワークを使用しているため自動でダウンロードはされていません。"
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} が利用可能です。最新の機能と修正プログラムを入手するには、パッケージマネージャーを使用して更新してください!"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} が利用可能になりました!お使いのネットワークが従量制のため、自動ダウンロードは行っておりません。"
|
||||
},
|
||||
"app.update-popup.changelog": {
|
||||
"message": "更新履歴"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "ダウンロード ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "ダウンロード中..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "再起動"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "アップデートが可能"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "ダウンロード完了"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "リロード"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "アップデートが利用可能です"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "クリックすると更新履歴を表示できます。"
|
||||
},
|
||||
"app.update.complete-toast.title": {
|
||||
"message": "バージョン {version} のインストールが正常に完了しました!"
|
||||
"message": "バージョン {version} が正常にインストールされました!"
|
||||
},
|
||||
"app.update.download-update": {
|
||||
"message": "アップデートをダウンロード"
|
||||
@@ -93,7 +150,7 @@
|
||||
"message": "Modrinthユーザーネームを入力..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "あなたのフレンドのModrinthユーザーネームは何ですか?"
|
||||
"message": "あなたのフレンドのModrinthユーザー名は何ですか?"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"message": "<link>友達を追加</link>して、彼らが何をしているか見てみよう!"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(不明なバージョン)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "このインスタンスはサーバーにリンクされているので、Minecraftのバージョンを変更することはできません。リンクを解除するとこのインスタンスはサーバーから永久に切断されます。"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "このインスタンスはサーバーにリンクされているので、Modの更新はできず、ModローダーやMinecraftのバージョンを変更することもできません。リンクを解除すると、このインスタンスはサーバーから永久に切断されます。"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "サーバーとのリンクを解除する"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "インスタンスのリンク解除"
|
||||
},
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "幅を入力…"
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "設定"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Minecraftサーバー"
|
||||
},
|
||||
@@ -497,6 +560,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "サーバーに互換性がありません"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "サーバープロジェクトによる管理"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "サーバーに接続できませんでした"
|
||||
},
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "インスタンスと同期"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "サーバーにより提供されています"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "サーバー構成にはクライアント側Modのみ追加可能"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "ゲームバージョンはサーバーにより提供されています"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "ローダーはサーバーにより提供されています"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,67 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Minecraft 인증 서버가 현재 다운되었을 수 있습니다. 인터넷 연결을 확인한 후 나중에 다시 시도하세요."
|
||||
"message": "Minecraft 인증 서버가 일시적으로 중단되었을 수 있습니다. 인터넷 연결을 확인한 후 나중에 다시 시도하세요."
|
||||
},
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "인증 서버에 연결할 수 없습니다"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"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.required-modpack": {
|
||||
"message": "필요한 모드팩"
|
||||
},
|
||||
"app.modal.install-to-play.server-requires-mods": {
|
||||
"message": "이 서버를 플레이하려면 모드가 필요합니다. '설치'를 클릭하여 Modrinth에서 필수 파일을 내려받은 후, 서버에 바로 접속하세요."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "인스턴스 공유됨"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "서버 인스턴스 공유됨"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"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": "개발자 모드가 활성화되었습니다."
|
||||
},
|
||||
@@ -15,7 +72,7 @@
|
||||
"message": "모양"
|
||||
},
|
||||
"app.settings.tabs.default-instance-options": {
|
||||
"message": "인스턴스 기본 옵션"
|
||||
"message": "기본 인스턴스 옵션"
|
||||
},
|
||||
"app.settings.tabs.feature-flags": {
|
||||
"message": "기능 플래그"
|
||||
@@ -27,38 +84,38 @@
|
||||
"message": "언어"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "개인정보 보호"
|
||||
"message": "개인정보"
|
||||
},
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "리소스 관리"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version}을 설치할 준비가 완료되었습니다! 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트합니다."
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version}을 설치할 준비가 완료되었습니다! 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트합니다."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Modrinth App v{version}이 지금 이용 가능합니다! 종량제 네트워크에 있기 때문에, 자동으로 다운로드하지 않았습니다."
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} 버전을 사용할 수 있습니다. 최신 기능과 오류 수정을 적용하려면 패키지 관리자를 통해 업데이트하세요!"
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version}을 지금 사용할 수 있습니다! 데이터 통신 연결을 사용 중이므로, 자동으로 다운로드하지 않았습니다."
|
||||
},
|
||||
"app.update-popup.changelog": {
|
||||
"message": "변경 내역"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "({size}) 다운로드"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "다운로드 중..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "다운로드 완료"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "새로고침"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "업데이트 가능"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "다운로드 완료"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "변경 내역을 보려면 클릭하세요."
|
||||
},
|
||||
@@ -78,7 +135,7 @@
|
||||
"message": "친구 추가"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} 친구 요청 {count, plural, one {건의} other {건의}}"
|
||||
"message": "{count}건의 친구 요청"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "친구 요청 보내기"
|
||||
@@ -87,7 +144,7 @@
|
||||
"message": "친구 추가 중"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "마인크래프트 사용자명과 다를 수 있습니다!"
|
||||
"message": "Minecraft 사용자명과 다를 수 있습니다!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "Modrinth 사용자명 입력..."
|
||||
@@ -96,7 +153,7 @@
|
||||
"message": "친구의 Modrinth 사용자명이 무엇인가요?"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"message": "친구들이 무엇을 하는지 보려면 <link>친구 추가</link>를 하세요!"
|
||||
"message": "<link>친구 추가</link>를 통해 친구들이 무엇을 하는지 확인해 보세요!"
|
||||
},
|
||||
"friends.friend.cancel-request": {
|
||||
"message": "요청 취소"
|
||||
@@ -105,7 +162,7 @@
|
||||
"message": "친구 삭제"
|
||||
},
|
||||
"friends.friend.request-sent": {
|
||||
"message": "이미 친구 요청을 보냈습니다"
|
||||
"message": "친구 요청 전송됨"
|
||||
},
|
||||
"friends.friend.view-profile": {
|
||||
"message": "프로필 보기"
|
||||
@@ -126,7 +183,7 @@
|
||||
"message": "대기 중"
|
||||
},
|
||||
"friends.no-friends-match": {
|
||||
"message": "\"{query}\"와 일치하는 친구가 없습니다"
|
||||
"message": "\"{query}\" 이름과 일치하는 친구 없음"
|
||||
},
|
||||
"friends.search-friends-placeholder": {
|
||||
"message": "친구 검색 중..."
|
||||
@@ -135,7 +192,7 @@
|
||||
"message": "{title} - {count}"
|
||||
},
|
||||
"friends.sign-in-to-add-friends": {
|
||||
"message": "친구를 추가하고 무엇을 하는지 보려면 <link>Modrinth 계정에 로그인</link>하세요!"
|
||||
"message": "<link>Modrinth 계정으로 로그인</link>하여 친구를 추가하고 무엇을 플레이 중인지 확인하세요!"
|
||||
},
|
||||
"instance.add-server.add-and-play": {
|
||||
"message": "추가 후 플레이"
|
||||
@@ -201,22 +258,22 @@
|
||||
"message": "인스턴스 삭제"
|
||||
},
|
||||
"instance.settings.tabs.general.delete.description": {
|
||||
"message": "기기에서 인스턴스를 완전히 삭제합니다. 월드, 설정, 설치된 모든 콘텐츠가 함께 제거됩니다. 주의하세요, 한 번 삭제하면 인스턴스를 복구할 방법은 없습니다."
|
||||
"message": "세계, 설정, 설치된 모든 요소를 기기에서 완전히 삭제합니다. 삭제 후 인스턴스를 복구할 수 없으므로 주의하세요."
|
||||
},
|
||||
"instance.settings.tabs.general.deleting.button": {
|
||||
"message": "삭제중..."
|
||||
"message": "삭제 중..."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button": {
|
||||
"message": "복제"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
|
||||
"message": "설치중에는 복제할 수 없습니다."
|
||||
"message": "설치 중에는 복제할 수 없습니다."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance": {
|
||||
"message": "인스턴스 복제"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance.description": {
|
||||
"message": "인스턴스의 복사본을 생성합니다. 월드, 설정, 모드, 기타 등등도 함께 복사됩니다."
|
||||
"message": "인스턴스의 복사본을 생성합니다. 세계, 설정, 모드, 기타 등등도 함께 복사됩니다."
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon": {
|
||||
"message": "아이콘 수정"
|
||||
@@ -237,7 +294,7 @@
|
||||
"message": "새 그룹 만들기"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.description": {
|
||||
"message": "라이브러리 그룹을 사용하면 라이브러리 내에서 인스턴스를 서로 다른 섹션으로 구성할 수 있습니다."
|
||||
"message": "라이브러리 그룹을 사용하면 인스턴스를 라이브러리 내 여러 섹션으로 나눠서 정리할 수 있습니다."
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.enter-name": {
|
||||
"message": "그룹 이름 입력"
|
||||
@@ -252,7 +309,7 @@
|
||||
"message": "사용자 지정 실행 후크"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "후크 기능을 사용하면 고급 사용자가 게임을 실행하기 전후에 특정 시스템 명령을 실행할 수 있습니다."
|
||||
"message": "후크 기능을 사용하면 고급 사용자가 게임 실행 전후에 특정 시스템 명령을 실행할 수 있습니다."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit": {
|
||||
"message": "종료 후"
|
||||
@@ -279,7 +336,7 @@
|
||||
"message": "래퍼"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.description": {
|
||||
"message": "Minecraft를 실행을 위한 래퍼 명령어 입니다."
|
||||
"message": "Minecraft 실행을 위한 래퍼 명령어 입니다."
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||
"message": "래퍼 명령어 입력..."
|
||||
@@ -324,7 +381,7 @@
|
||||
"message": "설치"
|
||||
},
|
||||
"instance.settings.tabs.installation.install.in-progress": {
|
||||
"message": "설치가 진행중입니다"
|
||||
"message": "설치 진행 중"
|
||||
},
|
||||
"instance.settings.tabs.installation.loader-version": {
|
||||
"message": "{loader} 버전"
|
||||
@@ -339,7 +396,7 @@
|
||||
"message": "{loader}(은)는 Minecraft {version}에서 사용할 수 없습니다. 다른 모드 로더를 사용하세요."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-modpack-found": {
|
||||
"message": "이 인스턴스가 모드팩에 연결되어 있지만, 모드팩을 Modrinth에서 찾을 수 없습니다."
|
||||
"message": "이 인스턴스는 모드팩과 연결되어 있지만, Modrinth에서 모드팩을 찾을 수 없습니다."
|
||||
},
|
||||
"instance.settings.tabs.installation.platform": {
|
||||
"message": "플랫폼"
|
||||
@@ -351,7 +408,7 @@
|
||||
"message": "모드팩 재설치 중"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.description": {
|
||||
"message": "재설치하면 설치 또는 수정된 모든 콘텐츠가 모드팩에서 제공하는 콘텐츠로 초기화되며, 기존 팩에 추가한 모드나 콘텐츠는 모두 제거됩니다. 인스턴스에 변경 사항이 있는 경우 예상치 못한 동작은 해결할 수 있지만, 현재 월드가 추가로 설치된 콘텐츠에 의존하고 있다면 기존 월드가 손상될 수 있습니다."
|
||||
"message": "재설치하면 설치 또는 수정된 모든 콘텐츠가 모드팩에서 제공하는 콘텐츠로 초기화되며, 기존 팩에 추가한 모드나 콘텐츠는 모두 제거됩니다. 인스턴스에 변경 사항이 있는 경우 예상치 못한 동작은 해결할 수 있지만, 현재 세계가 추가로 설치된 콘텐츠에 의존하고 있다면 기존 세계가 손상될 수 있습니다."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.title": {
|
||||
"message": "정말로 이 인스턴스를 다시 설치하시겠습니까?"
|
||||
@@ -407,6 +464,15 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(알 수 없는 버전)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server-vanilla.description": {
|
||||
"message": "이 인스턴스는 서버에 연결되어 있으므로, 마인크래프트 버전을 변경할 수 없습니다. 연결을 해제하면 이 인스턴스가 서버에서 영구적으로 연결이 끊어집니다."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.description": {
|
||||
"message": "이 인스턴스는 서버에 연결되어 있으므로 모드를 업데이트할 수 없으며 모드 로더나 Minecraft 버전을 변경할 수 없습니다. 연결을 해제하면 이 인스턴스가 서버에서 영구적으로 연결이 끊어집니다."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "서버 연결 해제"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "인스턴스 연결 해제"
|
||||
},
|
||||
@@ -444,7 +510,7 @@
|
||||
"message": "창"
|
||||
},
|
||||
"instance.settings.tabs.window.custom-window-settings": {
|
||||
"message": "사용자 지정 창 설정 활성화"
|
||||
"message": "창 맞춤 설정"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen": {
|
||||
"message": "전체 화면"
|
||||
@@ -470,9 +536,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "너비 입력..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "설정"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Minecraft 서버"
|
||||
},
|
||||
@@ -489,22 +552,25 @@
|
||||
"message": "이용 가능"
|
||||
},
|
||||
"instance.worlds.game_already_open": {
|
||||
"message": "인스턴스가 이미 실행중입니다"
|
||||
"message": "이미 실행된 인스턴스"
|
||||
},
|
||||
"instance.worlds.hardcore": {
|
||||
"message": "하드코어 모드"
|
||||
},
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "서버가 호환되지 않음"
|
||||
"message": "호환되지 않는 서버"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "서버 설정에 의해 관리됨"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "서버가 응답하지 않음"
|
||||
},
|
||||
"instance.worlds.no_server_quick_play": {
|
||||
"message": "Minecraft 알파 1.0.5 이후 버전에서만 서버에 바로 진입할 수 있습니다."
|
||||
"message": "Minecraft 알파 1.0.5 이후 버전에서만 서버에 바로 진입할 수 있습니다"
|
||||
},
|
||||
"instance.worlds.no_singleplayer_quick_play": {
|
||||
"message": "Minecraft 1.20 이후 버전에서만 싱글플레이 세계로 바로 진입할 수 있습니다."
|
||||
"message": "Minecraft 1.20 이후 버전에서만 싱글플레이 세계로 바로 진입할 수 있습니다"
|
||||
},
|
||||
"instance.worlds.play_instance": {
|
||||
"message": "인스턴스 플레이"
|
||||
@@ -519,7 +585,7 @@
|
||||
"message": "인스턴스 보기"
|
||||
},
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "사용중인 월드"
|
||||
"message": "사용 중인 세계"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "인스턴스에서 관리"
|
||||
@@ -532,5 +598,17 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "인스턴스와 동기화"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "서버에 의해 관리됨"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "서버 인스턴스에는 클라이언트 전용 모드만 추가할 수 있습니다"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "게임 버전이 서버에 의해 제공됩니다"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "로더가 서버에 의해 제공됩니다"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,419 +0,0 @@
|
||||
{
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Dev mode iz on."
|
||||
},
|
||||
"app.settings.tabs.appearance": {
|
||||
"message": "Lookz"
|
||||
},
|
||||
"app.settings.tabs.default-instance-options": {
|
||||
"message": "Defawlt instanz opshuns"
|
||||
},
|
||||
"app.settings.tabs.feature-flags": {
|
||||
"message": "Feeechurrr flaaagz"
|
||||
},
|
||||
"app.settings.tabs.java-installations": {
|
||||
"message": "Jawa installz"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "Pwiwacy"
|
||||
},
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Managez da stuffz"
|
||||
},
|
||||
"instance.add-server.add-and-play": {
|
||||
"message": "Plop n’ playz"
|
||||
},
|
||||
"instance.add-server.add-server": {
|
||||
"message": "Gimme servah"
|
||||
},
|
||||
"instance.add-server.resource-pack.disabled": {
|
||||
"message": "Off’d modez"
|
||||
},
|
||||
"instance.add-server.resource-pack.enabled": {
|
||||
"message": "On’d modez"
|
||||
},
|
||||
"instance.add-server.resource-pack.prompt": {
|
||||
"message": "Askz"
|
||||
},
|
||||
"instance.add-server.title": {
|
||||
"message": "Addin' new servah"
|
||||
},
|
||||
"instance.edit-server.title": {
|
||||
"message": "Tweak servah"
|
||||
},
|
||||
"instance.edit-world.hide-from-home": {
|
||||
"message": "Hush on da frontie"
|
||||
},
|
||||
"instance.edit-world.name": {
|
||||
"message": "Naem"
|
||||
},
|
||||
"instance.edit-world.placeholder-name": {
|
||||
"message": "Minecwaft wrold"
|
||||
},
|
||||
"instance.edit-world.reset-icon": {
|
||||
"message": "Resetz iconz"
|
||||
},
|
||||
"instance.edit-world.title": {
|
||||
"message": "Tweak da landz"
|
||||
},
|
||||
"instance.filter.disabled": {
|
||||
"message": "No worky projectz"
|
||||
},
|
||||
"instance.filter.updates-available": {
|
||||
"message": "Fun patchez here"
|
||||
},
|
||||
"instance.server-modal.address": {
|
||||
"message": "Placey"
|
||||
},
|
||||
"instance.server-modal.name": {
|
||||
"message": "Naem"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "Minecwaft servah"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "Resource Packz"
|
||||
},
|
||||
"instance.settings.tabs.general": {
|
||||
"message": "Generulz"
|
||||
},
|
||||
"instance.settings.tabs.general.delete": {
|
||||
"message": "Shoo away instansh"
|
||||
},
|
||||
"instance.settings.tabs.general.delete.button": {
|
||||
"message": "Shoo away instansh"
|
||||
},
|
||||
"instance.settings.tabs.general.delete.description": {
|
||||
"message": "Fur-ever zaps da instansh frum ur device, inkluding all ur worldz, configz, n’ shiny stuffz. Be careful hooman, once u zapp it, no can haz it back."
|
||||
},
|
||||
"instance.settings.tabs.general.deleting.button": {
|
||||
"message": "Deletin'..."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button": {
|
||||
"message": "Cloney"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-button.tooltip.installing": {
|
||||
"message": "No can haz cloney while installin'."
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance": {
|
||||
"message": "Cloney instansh"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance.description": {
|
||||
"message": "Makez a cloney-clone of dis instansh, inkluding worldz, configz, tweakiez, n’ all da shiny stuffz."
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon": {
|
||||
"message": "Tweak iconz"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.remove": {
|
||||
"message": "Shoo away iconz"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.replace": {
|
||||
"message": "Swap iconz"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.select": {
|
||||
"message": "Choose da iconz"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups": {
|
||||
"message": "Bookz gang"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.create": {
|
||||
"message": "Makez bookz gang"
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.description": {
|
||||
"message": "Bookz gang lets u sort ur instansh into diff’nt sectionz in ur library."
|
||||
},
|
||||
"instance.settings.tabs.general.library-groups.enter-name": {
|
||||
"message": "Type gang namez"
|
||||
},
|
||||
"instance.settings.tabs.general.name": {
|
||||
"message": "Naem"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "Hooky thingz"
|
||||
},
|
||||
"instance.settings.tabs.hooks.custom-hooks": {
|
||||
"message": "Purrsonal hookz thingz"
|
||||
},
|
||||
"instance.settings.tabs.hooks.description": {
|
||||
"message": "Hookz lets smrt hoomanz run special system thingz befur n’ after startin’ da game."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit": {
|
||||
"message": "Aftah leevin"
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit.description": {
|
||||
"message": "Did a runny-run aftah da game go bye-bye."
|
||||
},
|
||||
"instance.settings.tabs.hooks.post-exit.enter": {
|
||||
"message": "Type aftah-game magic thingy..."
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch": {
|
||||
"message": "Before game go"
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.description": {
|
||||
"message": "Did a runny-run befurr da instansh go zoom."
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch.enter": {
|
||||
"message": "Type runny-run befurr magic thingy..."
|
||||
},
|
||||
"instance.settings.tabs.hooks.title": {
|
||||
"message": "Gaem hooky thingz"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper": {
|
||||
"message": "Wrappah"
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.description": {
|
||||
"message": "Wrappah magic thingy to blast-off Minecwaft."
|
||||
},
|
||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||
"message": "Type Wrappah thingy..."
|
||||
},
|
||||
"instance.settings.tabs.installation": {
|
||||
"message": "Setupzy"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.already-installed.modded": {
|
||||
"message": "{platform} {version} fur Minecwaft {game_version} iz already snug in da box"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.already-installed.vanilla": {
|
||||
"message": "Vanilla {game_version} iz already snug in da box"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.button": {
|
||||
"message": "Flip flop verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.button.install": {
|
||||
"message": "Setupzy time"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.button.installing": {
|
||||
"message": "Setupzy in progress"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.cannot-while-fetching": {
|
||||
"message": "Grabbin’ modpackz verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.in-progress": {
|
||||
"message": "Setupzy da fresh verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.currently-installed": {
|
||||
"message": "Right meow setupzy"
|
||||
},
|
||||
"instance.settings.tabs.installation.debug-information": {
|
||||
"message": "Trouble sniffin’ info:"
|
||||
},
|
||||
"instance.settings.tabs.installation.fetching-modpack-details": {
|
||||
"message": "Grabbin’ modpack deetz"
|
||||
},
|
||||
"instance.settings.tabs.installation.game-version": {
|
||||
"message": "Gamey verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.install": {
|
||||
"message": "Setupzy time"
|
||||
},
|
||||
"instance.settings.tabs.installation.install.in-progress": {
|
||||
"message": "Setupzy goin’ on"
|
||||
},
|
||||
"instance.settings.tabs.installation.loader-version": {
|
||||
"message": "{loader} verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.minecraft-version": {
|
||||
"message": "Minecwaft {version}"
|
||||
},
|
||||
"instance.settings.tabs.installation.no-connection": {
|
||||
"message": "No can haz linked modpack deetz. Check ur shiny hooman webz."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-loader-versions": {
|
||||
"message": "{loader} iz no can haz fur Minecwaft {version}. Try anudda mody-loady thingy."
|
||||
},
|
||||
"instance.settings.tabs.installation.no-modpack-found": {
|
||||
"message": "Dis instansh iz linked to a modpackz, but da modpackz iz no can haz on Modrinth."
|
||||
},
|
||||
"instance.settings.tabs.installation.platform": {
|
||||
"message": "Platfurrm"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button": {
|
||||
"message": "Snuggly modpackz redo"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.button.reinstalling": {
|
||||
"message": "Snuggly modpackz redo in progress"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.description": {
|
||||
"message": "Redoing da snuggly tweakie bundlez will reset all da stuffz u added or changed back to what da tweakie bundle givz, removin’ any extra modz or shiny contentz u plopped on top. It may fix da oopsies if da instansh iz borked, but if ur worldz need ur extra stuffz, it might break dem."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.confirm.title": {
|
||||
"message": "Iz u sure u wanna reinstall dis instansh?"
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.description": {
|
||||
"message": "I iz gonna reset mah stuffz bak to da way it wuz! All ur fancy add-onz? Gone! Just da original tweakie bundle againz."
|
||||
},
|
||||
"instance.settings.tabs.installation.reinstall.title": {
|
||||
"message": "Snuggly modpackz redo"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.button": {
|
||||
"message": "Fixy-fix"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.button.repairing": {
|
||||
"message": "Fixy-fixin"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.confirm.description": {
|
||||
"message": "Fixy-fixin’ reinstalls all da Minecwaft stuffz it needs and checks if anythin’ iz borked. It may fix da oopsies if da game no start ‘cause of launcher stuff, but it won’t fix borked modz or crashy gamez."
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.confirm.title": {
|
||||
"message": "Fixy-fix dis instansh?"
|
||||
},
|
||||
"instance.settings.tabs.installation.repair.in-progress": {
|
||||
"message": "Fixy-fixin’ goin’ on"
|
||||
},
|
||||
"instance.settings.tabs.installation.reset-selections": {
|
||||
"message": "Go bakk to right meow"
|
||||
},
|
||||
"instance.settings.tabs.installation.show-all-versions": {
|
||||
"message": "Show all da verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.change-version": {
|
||||
"message": "pick new shiny verzhun"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.install": {
|
||||
"message": "setupzy"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.reinstall": {
|
||||
"message": "snuggly redo"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.action.repair": {
|
||||
"message": "fixy-fix"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.cannot-while-installing": {
|
||||
"message": "No can haz {action} while setupzy goin’ on"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.cannot-while-offline": {
|
||||
"message": "No can haz {action} while hooman webz iz sleepin’"
|
||||
},
|
||||
"instance.settings.tabs.installation.tooltip.cannot-while-repairing": {
|
||||
"message": "No can haz {action} while fixy-fixin’"
|
||||
},
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(kitteh dunno verzhun)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Break da instansh link"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.confirm.description": {
|
||||
"message": "If u go furder, no can haz re-link ‘til u make a brand new instansh. U won’t get shiny modpack updatez no more, n’ it will become a plain ol’ instansh."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.confirm.title": {
|
||||
"message": "R u sure u wanna break da instansh link?"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.description": {
|
||||
"message": "Dis instansh iz linked to a tweakie bundlez, which means modz no can haz updates and u no can change da mod loader or Minecwaft version. Unlinkin’ will fur-ever disconnect dis instansh from da tweakie bundle."
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.title": {
|
||||
"message": "Break modpack tie"
|
||||
},
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Jawa and memowy"
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Env pawramz"
|
||||
},
|
||||
"instance.settings.tabs.java.hooks": {
|
||||
"message": "Hooky thingz"
|
||||
},
|
||||
"instance.settings.tabs.java.java-arguments": {
|
||||
"message": "Jawa spellz"
|
||||
},
|
||||
"instance.settings.tabs.java.java-installation": {
|
||||
"message": "Jawa setupzy"
|
||||
},
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Memowy assigned"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Shiny frame"
|
||||
},
|
||||
"instance.settings.tabs.window.custom-window-settings": {
|
||||
"message": "Purrsonal shiny frame tweaks"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen": {
|
||||
"message": "Big shiny frame"
|
||||
},
|
||||
"instance.settings.tabs.window.fullscreen.description": {
|
||||
"message": "Make da game go big when startin’ (using shiny options.txt)."
|
||||
},
|
||||
"instance.settings.tabs.window.height": {
|
||||
"message": "Tallness"
|
||||
},
|
||||
"instance.settings.tabs.window.height.description": {
|
||||
"message": "How tall da shiny frame iz when da game go zoom."
|
||||
},
|
||||
"instance.settings.tabs.window.height.enter": {
|
||||
"message": "Type tallness..."
|
||||
},
|
||||
"instance.settings.tabs.window.width": {
|
||||
"message": "Wideness"
|
||||
},
|
||||
"instance.settings.tabs.window.width.description": {
|
||||
"message": "How wide da shiny frame iz when da game go zoom."
|
||||
},
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Enter wideness..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Tweaks"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "A blocky hooman hangout"
|
||||
},
|
||||
"instance.worlds.cant_connect": {
|
||||
"message": "No can haz connect to servah"
|
||||
},
|
||||
"instance.worlds.copy_address": {
|
||||
"message": "Snag hooman placey"
|
||||
},
|
||||
"instance.worlds.dont_show_on_home": {
|
||||
"message": "Shush on da homez"
|
||||
},
|
||||
"instance.worlds.filter.available": {
|
||||
"message": "Can haz now"
|
||||
},
|
||||
"instance.worlds.game_already_open": {
|
||||
"message": "Instansh iz already openz"
|
||||
},
|
||||
"instance.worlds.hardcore": {
|
||||
"message": "Hawd inside mode"
|
||||
},
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Servah iz borked wif dis"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "No can haz talk to servah"
|
||||
},
|
||||
"instance.worlds.no_server_quick_play": {
|
||||
"message": "U can only jumpz straight into servahz on Minecwaft Alpha 1.0.5+"
|
||||
},
|
||||
"instance.worlds.no_singleplayer_quick_play": {
|
||||
"message": "U can only jumpz straight into loneleh kitteh worldz on Minecwaft 1.20+"
|
||||
},
|
||||
"instance.worlds.play_instance": {
|
||||
"message": "Startz da thingy"
|
||||
},
|
||||
"instance.worlds.type.server": {
|
||||
"message": "Servah"
|
||||
},
|
||||
"instance.worlds.type.singleplayer": {
|
||||
"message": "Loneleh kitteh"
|
||||
},
|
||||
"instance.worlds.view_instance": {
|
||||
"message": "Peek at instansh"
|
||||
},
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "World iz busy playin'"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Instansh gived me dis"
|
||||
},
|
||||
"search.filter.locked.instance-game-version.title": {
|
||||
"message": "Da gamez verzhun iz gived by da instansh, iz rite"
|
||||
},
|
||||
"search.filter.locked.instance-loader.title": {
|
||||
"message": "Loadar iz gived by teh instansh"
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Syncz wif da instansh"
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"instance.add-server.add-server": {
|
||||
"message": "Prideti Serverį"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "Minecraft Serveris"
|
||||
},
|
||||
"instance.settings.tabs.hooks.pre-launch": {
|
||||
"message": "Prieš paleidimą"
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Izstrādātājs mods ieslēgts."
|
||||
},
|
||||
"app.settings.downloading": {
|
||||
"message": "Lejuplādē v{version}"
|
||||
},
|
||||
"app.settings.tabs.appearance": {
|
||||
"message": "Izskats"
|
||||
},
|
||||
"app.settings.tabs.privacy": {
|
||||
"message": "Konfidencialitāte"
|
||||
},
|
||||
"instance.add-server.add-and-play": {
|
||||
"message": "Pievienot un spēlēt"
|
||||
},
|
||||
"instance.add-server.add-server": {
|
||||
"message": "Pievienot serveri"
|
||||
},
|
||||
"instance.add-server.title": {
|
||||
"message": "Pievienot Serveri"
|
||||
},
|
||||
"instance.edit-server.title": {
|
||||
"message": "Rediģēt serveri"
|
||||
},
|
||||
"instance.edit-world.name": {
|
||||
"message": "Nosaukums"
|
||||
},
|
||||
"instance.edit-world.placeholder-name": {
|
||||
"message": "Minecraft Pasaule"
|
||||
},
|
||||
"instance.server-modal.address": {
|
||||
"message": "Adrese"
|
||||
},
|
||||
"instance.server-modal.name": {
|
||||
"message": "Nosaukums"
|
||||
},
|
||||
"instance.server-modal.placeholder-name": {
|
||||
"message": "Minecraft Serveris"
|
||||
},
|
||||
"instance.server-modal.resource-pack": {
|
||||
"message": "Resursu paka"
|
||||
},
|
||||
"instance.settings.tabs.general.deleting.button": {
|
||||
"message": "Dzēš..."
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon": {
|
||||
"message": "Rediģēt ikonu"
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon.select": {
|
||||
"message": "Izvēlēties ikonu"
|
||||
},
|
||||
"instance.settings.tabs.installation": {
|
||||
"message": "Instalācija"
|
||||
},
|
||||
"instance.settings.tabs.installation.change-version.already-installed.modded": {
|
||||
"message": "{platform} {version} priekš Minecraft {game_version} ir jau ieinstalēta"
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Iestatījumi"
|
||||
}
|
||||
}
|
||||
@@ -1,533 +0,0 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Pelayan pengesahan Minecraft mungkin sedang tergendala sekarang. Periksa sambungan internet anda dan cuba lagi nanti."
|
||||
},
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Tidak dapat mencapai pelayan pengesahan"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "مود ڤمباڠون دداياکن."
|
||||
},
|
||||
"app.settings.downloading": {
|
||||
"message": "سدڠ مموات تورون v{version}"
|
||||
},
|
||||
"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": "ڤڠوروسن سومبر"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"message": "Modrinth App v{version} سوده برسديا اونتوق دڤاسڠ! موات سمولا اونتوق کمس کيني سکارڠ⹁ اتاو کمس کيني سچارا اٴوتوماتيک اڤابيلا اندا منوتوڤ Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} سوده سلساي دڤاسڠ! موات سمولا اونتوق کمس کيني سکارڠ⹁ اتاو کمس کيني سچارا اٴوتوماتيک اڤابيلا اندا منوتوڤ Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"message": "Modrinth App v{version} کيني ترسديا! ممندڠکن اندا سدڠ مڠݢوناکن رڠکاين برميتر⹁ کامي تيدق مموات تورونڽ سچارا اٴوتوماتيک."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"message": "لوݢ ڤروبهن"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"message": "موات تورون ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "سدڠ مموات تورون..."
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"message": "موات سمولا"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"message": "کمس کيني ترسديا"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "موات تورون سلساي"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "کليک دسيني اونتوق مليهت لوݢ ڤروبهن."
|
||||
},
|
||||
"app.update.complete-toast.title": {
|
||||
"message": "ۏرسي {version} تله برجاي دڤاسڠ!"
|
||||
},
|
||||
"app.update.download-update": {
|
||||
"message": "موات تورون کمس کيني"
|
||||
},
|
||||
"app.update.downloading-update": {
|
||||
"message": "سدڠ مموات تورون کمس کيني ({percent}%)"
|
||||
},
|
||||
"app.update.reload-to-update": {
|
||||
"message": "موات سمولا اونتوق مماسڠ کمس کيني"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "تمبه راکن"
|
||||
},
|
||||
"friends.action.view-friend-requests": {
|
||||
"message": "{count} {count, plural, other {ڤرمينتاٴن}} راکن"
|
||||
},
|
||||
"friends.add-friend.submit": {
|
||||
"message": "هانتر ڤرمينتاٴن راکن"
|
||||
},
|
||||
"friends.add-friend.title": {
|
||||
"message": "منمبه راکن"
|
||||
},
|
||||
"friends.add-friend.username.description": {
|
||||
"message": "اي موڠکين بربيذا درڤد نام ڤڠݢونا ماٴينکرفت مريک!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "ماسوقکن نام ڤڠݢونا Modrinth..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "اڤاکه نام ڤڠݢونا Modrinth راکن اندا؟"
|
||||
},
|
||||
"friends.add-friends-to-share": {
|
||||
"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": "تمبه دان ماءين"
|
||||
},
|
||||
"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": "سلارسکن دڠن ڤماسڠن"
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,60 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Tidak dapat mencapai pelayan pengesahan"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Kandungan yang diperlukan"
|
||||
},
|
||||
"app.modal.install-to-play.header": {
|
||||
"message": "Pasang untuk mainkan"
|
||||
},
|
||||
"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.required-modpack": {
|
||||
"message": "Pek mod yang diperlukan"
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "Pemasangan yang dikongsi"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "Pemasangan pelayan yang dikongsi"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Lihat kandungan"
|
||||
},
|
||||
"app.modal.update-to-play.added-count": {
|
||||
"message": "{count} ditambah"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.added": {
|
||||
"message": "Ditambah"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.removed": {
|
||||
"message": "Dialih keluar"
|
||||
},
|
||||
"app.modal.update-to-play.diff-type.updated": {
|
||||
"message": "Dikemas kini"
|
||||
},
|
||||
"app.modal.update-to-play.header": {
|
||||
"message": "Kemas kini untuk mainkan"
|
||||
},
|
||||
"app.modal.update-to-play.published-date": {
|
||||
"message": "{date, date, long}"
|
||||
},
|
||||
"app.modal.update-to-play.removed-count": {
|
||||
"message": "{count} dialih keluar"
|
||||
},
|
||||
"app.modal.update-to-play.update-required": {
|
||||
"message": "Kemas kini diperlukan"
|
||||
},
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "Kemas kini diperlukan untuk memainkan {name}. Sila kemas kini kepada versi terkini untuk melancarkan permainan."
|
||||
},
|
||||
"app.modal.update-to-play.updated-count": {
|
||||
"message": "{count} dikemas kini"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Mod pembangun didayakan."
|
||||
},
|
||||
@@ -32,33 +86,33 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Pengurusan sumber"
|
||||
},
|
||||
"app.update-toast.body": {
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} sudah bersedia untuk dipasang! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.download-complete": {
|
||||
"message": "Modrinth App v{version} sudah selesai dipasang! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
|
||||
"app.update-popup.body.download-complete": {
|
||||
"message": "Modrinth App v{version} sudah selesai dimuat turun! Muat semula untuk kemas kini sekarang, atau kemas kini secara automatik apabila anda menutup Modrinth App."
|
||||
},
|
||||
"app.update-toast.body.metered": {
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} tersedia. Gunakan pengurus pakej anda untuk mengemas kini dan mendapatkan ciri-ciri dan pembetulan terkini!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} kini tersedia! Memandangkan anda sedang menggunakan rangkaian bermeter, kami tidak memuat turunnya secara automatik."
|
||||
},
|
||||
"app.update-toast.changelog": {
|
||||
"app.update-popup.changelog": {
|
||||
"message": "Log perubahan"
|
||||
},
|
||||
"app.update-toast.download": {
|
||||
"app.update-popup.download": {
|
||||
"message": "Muat turun ({size})"
|
||||
},
|
||||
"app.update-toast.downloading": {
|
||||
"message": "Sedang memuat turun..."
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Muat turun selesai"
|
||||
},
|
||||
"app.update-toast.reload": {
|
||||
"app.update-popup.reload": {
|
||||
"message": "Muat semula"
|
||||
},
|
||||
"app.update-toast.title": {
|
||||
"app.update-popup.title": {
|
||||
"message": "Kemas kini tersedia"
|
||||
},
|
||||
"app.update-toast.title.download-complete": {
|
||||
"message": "Muat turun selesai"
|
||||
},
|
||||
"app.update.complete-toast.text": {
|
||||
"message": "Klik di sini untuk melihat log perubahan."
|
||||
},
|
||||
@@ -407,6 +461,9 @@
|
||||
"instance.settings.tabs.installation.unknown-version": {
|
||||
"message": "(versi tidak diketahui)"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink-server.title": {
|
||||
"message": "Nyahpaut daripada pelayan"
|
||||
},
|
||||
"instance.settings.tabs.installation.unlink.button": {
|
||||
"message": "Nyahpautkan pemasangan"
|
||||
},
|
||||
@@ -470,9 +527,6 @@
|
||||
"instance.settings.tabs.window.width.enter": {
|
||||
"message": "Masukkan lebar..."
|
||||
},
|
||||
"instance.settings.title": {
|
||||
"message": "Tetapan"
|
||||
},
|
||||
"instance.worlds.a_minecraft_server": {
|
||||
"message": "Pelayan Minecraft"
|
||||
},
|
||||
@@ -497,6 +551,9 @@
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "Pelayan tidak serasi"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Diurus oleh projek pelayan"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "Pelayan tidak dapat dihubungi"
|
||||
},
|
||||
@@ -532,5 +589,14 @@
|
||||
},
|
||||
"search.filter.locked.instance.sync": {
|
||||
"message": "Selaraskan dengan pemasangan"
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Disediakan oleh pelayan"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "Versi permainan adalah disediakan oleh pelayan"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Pemuat adalah disediakan oleh pelayan"
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user