mirror of
https://github.com/misode/misode.github.io.git
synced 2026-04-23 07:10:41 +00:00
Link directly to mojira.dev filtered issue list
This commit is contained in:
@@ -1,15 +0,0 @@
|
|||||||
import type { Bugfix } from '../../services/DataFetcher.js'
|
|
||||||
import { Badge } from '../Badge.jsx'
|
|
||||||
import { Card } from '../Card.jsx'
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
fix: Bugfix
|
|
||||||
}
|
|
||||||
export function Issue({ fix }: Props) {
|
|
||||||
return <Card overlay={fix.id} link={`https://mojira.dev/${fix.id}`}>
|
|
||||||
<div class="changelog-content">{fix.summary}</div>
|
|
||||||
<div class="badges-list">
|
|
||||||
{fix.categories.map(c => <Badge label={c} />)}
|
|
||||||
</div>
|
|
||||||
</Card>
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import { useLocale } from '../../contexts/Locale.jsx'
|
|
||||||
import { useAsync } from '../../hooks/useAsync.js'
|
|
||||||
import { fetchBugfixes } from '../../services/DataFetcher.js'
|
|
||||||
import { Issue } from './Issue.jsx'
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
version: string
|
|
||||||
}
|
|
||||||
export function IssueList({ version }: Props) {
|
|
||||||
const { locale } = useLocale()
|
|
||||||
const { value: issues, loading } = useAsync(() => fetchBugfixes(version), [version])
|
|
||||||
|
|
||||||
return <div class="card-column">
|
|
||||||
{issues === undefined || loading ? <>
|
|
||||||
<span class="note">{locale('loading')}</span>
|
|
||||||
</> : issues.length === 0 ? <>
|
|
||||||
<span class="note">{locale('versions.fixes.no_results')}</span>
|
|
||||||
</> : <>
|
|
||||||
{issues?.map(issue => <Issue key={issue.id} fix={issue} />)}
|
|
||||||
</>}
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
@@ -4,11 +4,11 @@ import { useLocale } from '../../contexts/index.js'
|
|||||||
import { useAsync } from '../../hooks/useAsync.js'
|
import { useAsync } from '../../hooks/useAsync.js'
|
||||||
import { useSearchParam } from '../../hooks/useSearchParam.js'
|
import { useSearchParam } from '../../hooks/useSearchParam.js'
|
||||||
import type { VersionMeta } from '../../services/index.js'
|
import type { VersionMeta } from '../../services/index.js'
|
||||||
import { fetchChangelogs, getArticleLink } from '../../services/index.js'
|
import { fetchChangelogs } from '../../services/index.js'
|
||||||
import { Octicon } from '../Octicon.js'
|
import { Octicon } from '../Octicon.js'
|
||||||
import { ChangelogList, IssueList, VersionDiff, VersionMetaData } from './index.js'
|
import { ChangelogList, VersionDiff, VersionMetaData } from './index.js'
|
||||||
|
|
||||||
const Tabs = ['changelog', 'diff', 'fixes']
|
const Tabs = ['changelog', 'diff']
|
||||||
const WIKI_PAGE_PREFIX = 'https://minecraft.wiki/w/Java_Edition_'
|
const WIKI_PAGE_PREFIX = 'https://minecraft.wiki/w/Java_Edition_'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
@@ -31,6 +31,7 @@ export function VersionDetail({ id, version }: Props) {
|
|||||||
changes?.filter(c => c.version === id || (c.group === id && !c.tags.includes('obsolete'))),
|
changes?.filter(c => c.version === id || (c.group === id && !c.tags.includes('obsolete'))),
|
||||||
[id, changes])
|
[id, changes])
|
||||||
|
|
||||||
|
const fixesLink = version && getFixesLink(version.id)
|
||||||
const articleLink = version && getArticleLink(version.id)
|
const articleLink = version && getArticleLink(version.id)
|
||||||
const wikiPageLink = version && WIKI_PAGE_PREFIX + version.name
|
const wikiPageLink = version && WIKI_PAGE_PREFIX + version.name
|
||||||
|
|
||||||
@@ -55,6 +56,10 @@ export function VersionDetail({ id, version }: Props) {
|
|||||||
{Tabs.map(t => <Link key={t} class={tab === t ? 'selected' : ''} href={`/versions/?id=${id}&tab=${t}`}>
|
{Tabs.map(t => <Link key={t} class={tab === t ? 'selected' : ''} href={`/versions/?id=${id}&tab=${t}`}>
|
||||||
{locale(`versions.${t}`)}
|
{locale(`versions.${t}`)}
|
||||||
</Link>)}
|
</Link>)}
|
||||||
|
<a href={fixesLink} target="_blank">
|
||||||
|
{locale('versions.fixes')}
|
||||||
|
{Octicon.link_external}
|
||||||
|
</a>
|
||||||
{articleLink && <a href={articleLink} target="_blank">
|
{articleLink && <a href={articleLink} target="_blank">
|
||||||
{locale('versions.article')}
|
{locale('versions.article')}
|
||||||
{Octicon.link_external}
|
{Octicon.link_external}
|
||||||
@@ -67,7 +72,6 @@ export function VersionDetail({ id, version }: Props) {
|
|||||||
<div class="version-tab">
|
<div class="version-tab">
|
||||||
{tab === 'changelog' && <ChangelogList changes={filteredChangelogs} defaultOrder="asc" />}
|
{tab === 'changelog' && <ChangelogList changes={filteredChangelogs} defaultOrder="asc" />}
|
||||||
{tab === 'diff' && <VersionDiff version={id} />}
|
{tab === 'diff' && <VersionDiff version={id} />}
|
||||||
{tab === 'fixes' && <IssueList version={id} />}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
@@ -76,3 +80,96 @@ export function VersionDetail({ id, version }: Props) {
|
|||||||
export function releaseDate(version: VersionMeta) {
|
export function releaseDate(version: VersionMeta) {
|
||||||
return new Date(version.release_time).toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' })
|
return new Date(version.release_time).toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FIXES_PREFIX = 'https://mojira.dev/?project=MC&resolution=Fixed&fix_version='
|
||||||
|
|
||||||
|
function getFixesLink(version: string) {
|
||||||
|
let match
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) {
|
||||||
|
return FIXES_PREFIX + encodeURIComponent(`${match[1]} Snapshot ${match[2]}`)
|
||||||
|
}
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) {
|
||||||
|
return FIXES_PREFIX + encodeURIComponent(`${match[1]} Pre-Release ${match[2]}`)
|
||||||
|
}
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) {
|
||||||
|
return FIXES_PREFIX + encodeURIComponent(`${match[1]} Release Candidate ${match[2]}`)
|
||||||
|
}
|
||||||
|
return FIXES_PREFIX + encodeURIComponent(version)
|
||||||
|
}
|
||||||
|
|
||||||
|
const ARTICLE_PREFIX = 'https://www.minecraft.net/article/'
|
||||||
|
const ARTICLE_OVERRIDES = new Map(Object.entries({
|
||||||
|
'1.16-pre2': 'minecraft-1-16-pre-release-1',
|
||||||
|
'1.16-pre4': 'minecraft-1-16-pre-release-3',
|
||||||
|
'1.16-pre5': 'minecraft-1-16-pre-release-3',
|
||||||
|
'1.16-pre7': 'minecraft-1-16-pre-release-6',
|
||||||
|
'1.16-pre8': 'minecraft-1-16-pre-release-6',
|
||||||
|
'1.16-rc1': 'minecraft-1-16-release-candidate',
|
||||||
|
'1.16': 'nether-update-java',
|
||||||
|
'1.16.2-pre3': 'minecraft-1-16-2-pre-release-2',
|
||||||
|
'1.16.2-rc1': 'minecraft-1-16-2-pre-release-2',
|
||||||
|
'1.16.2-rc2': 'minecraft-1-16-2-pre-release-2',
|
||||||
|
'1.17-pre3': 'minecraft-1-17-pre-release-2',
|
||||||
|
'1.17-pre4': 'minecraft-1-17-pre-release-2',
|
||||||
|
'1.17-pre5': 'minecraft-1-17-pre-release-2',
|
||||||
|
'1.17.1-pre3': 'minecraft-1-17-1-pre-release-2',
|
||||||
|
'1.17-rc2': 'minecraft-1-17-release-candidate-1',
|
||||||
|
'1.17': 'caves---cliffs--part-i-out-today-java',
|
||||||
|
'1.17.1-rc2': 'minecraft-1-17-1-release-candidate-1',
|
||||||
|
'1.18-pre3': 'minecraft-1-18-pre-release-2',
|
||||||
|
'1.18-pre4': 'minecraft-1-18-pre-release-2',
|
||||||
|
'1.18-pre5': 'minecraft-1-18-pre-release-2',
|
||||||
|
'1.18-pre7': 'minecraft-1-18-pre-release-6',
|
||||||
|
'1.18-pre8': 'minecraft-1-18-pre-release-6',
|
||||||
|
'1.18-rc2': 'minecraft-1-18-release-candidate-1',
|
||||||
|
'1.18-rc3': 'minecraft-1-18-release-candidate-1',
|
||||||
|
'1.18-rc4': 'minecraft-1-18-release-candidate-1',
|
||||||
|
'1.18': 'caves---cliffs--part-ii-out-today-java',
|
||||||
|
'1.18.1-rc2': 'minecraft-1-18-1-release-candidate-1',
|
||||||
|
'1.18.1-rc3': 'minecraft-1-18-1-release-candidate-1',
|
||||||
|
'1.18.2-pre3': 'minecraft-1-18-2-pre-release-2',
|
||||||
|
'1.18.2-pre5': 'minecraft-1-18-2-pre-release-4',
|
||||||
|
'1.19-pre3': 'minecraft-1-19-pre-release-2',
|
||||||
|
'1.19-pre5': 'minecraft-1-19-pre-release-4',
|
||||||
|
'1.19-rc2': 'minecraft-1-19-release-candidate-1',
|
||||||
|
'1.19': 'the-wild-update-out-today-java',
|
||||||
|
'1.19.1-pre4': 'minecraft-1-19-1-pre-release-3',
|
||||||
|
'1.19.2-rc2': 'minecraft-1-19-2-release-candidate-1',
|
||||||
|
'1.19.3-pre2': 'minecraft-1-19-3-pre-release-1',
|
||||||
|
'1.19.3-rc2': 'minecraft-1-19-3-release-candidate-1',
|
||||||
|
'1.19.4-pre3': 'minecraft-1-19-4-pre-release-2',
|
||||||
|
'1.19.4-rc2': 'minecraft-1-19-4-release-candidate-1',
|
||||||
|
'1.20-pre3': 'minecraft-1-20-pre-release-2',
|
||||||
|
'1.20-pre4': 'minecraft-1-20-pre-release-2',
|
||||||
|
'1.20-pre6': 'minecraft-1-20-pre-release-5',
|
||||||
|
'1.20': 'trails-tales-update-out-today-java',
|
||||||
|
'1.20.1': 'minecraft--java-edition-1-20-1',
|
||||||
|
'1.20.2-pre2': 'minecraft-1-20-2-pre-release-1',
|
||||||
|
'23w43b': 'minecraft-snapshot-23w43b',
|
||||||
|
'24w03b': 'minecraft-snapshot-24w03b',
|
||||||
|
'24w05b': 'minecraft-snapshot-24w05b',
|
||||||
|
}))
|
||||||
|
|
||||||
|
function getArticleLink(version: string): string | undefined {
|
||||||
|
const override = ARTICLE_OVERRIDES.get(version)
|
||||||
|
if (override) {
|
||||||
|
return ARTICLE_PREFIX + override
|
||||||
|
}
|
||||||
|
let match
|
||||||
|
if ((match = version.match(/^(\d\dw\d\d)[a-z]$/)) && match[1]) {
|
||||||
|
return ARTICLE_PREFIX + 'minecraft-snapshot-' + match[1] + 'a'
|
||||||
|
}
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) {
|
||||||
|
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-snapshot-' + match[2]
|
||||||
|
}
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) {
|
||||||
|
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-pre-release-' + match[2]
|
||||||
|
}
|
||||||
|
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) {
|
||||||
|
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-release-candidate-' + match[2]
|
||||||
|
}
|
||||||
|
if (version.match(/^\d+\.\d+(\.\d+)?$/)) {
|
||||||
|
return ARTICLE_PREFIX + 'minecraft-java-edition-' + version.replaceAll('.', '-')
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
export * from '../Badge.jsx'
|
export * from '../Badge.jsx'
|
||||||
export * from './ChangelogEntry.js'
|
export * from './ChangelogEntry.js'
|
||||||
export * from './ChangelogList.js'
|
export * from './ChangelogList.js'
|
||||||
export * from './IssueList.jsx'
|
|
||||||
export * from './VersionDetail.js'
|
export * from './VersionDetail.js'
|
||||||
export * from './VersionDiff.jsx'
|
export * from './VersionDiff.jsx'
|
||||||
export * from './VersionEntry.js'
|
export * from './VersionEntry.js'
|
||||||
|
|||||||
@@ -1,77 +0,0 @@
|
|||||||
const ARTICLE_PREFIX = 'https://www.minecraft.net/article/'
|
|
||||||
|
|
||||||
const ARTICLE_OVERRIDES = new Map(Object.entries({
|
|
||||||
'1.16-pre2': 'minecraft-1-16-pre-release-1',
|
|
||||||
'1.16-pre4': 'minecraft-1-16-pre-release-3',
|
|
||||||
'1.16-pre5': 'minecraft-1-16-pre-release-3',
|
|
||||||
'1.16-pre7': 'minecraft-1-16-pre-release-6',
|
|
||||||
'1.16-pre8': 'minecraft-1-16-pre-release-6',
|
|
||||||
'1.16-rc1': 'minecraft-1-16-release-candidate',
|
|
||||||
'1.16': 'nether-update-java',
|
|
||||||
'1.16.2-pre3': 'minecraft-1-16-2-pre-release-2',
|
|
||||||
'1.16.2-rc1': 'minecraft-1-16-2-pre-release-2',
|
|
||||||
'1.16.2-rc2': 'minecraft-1-16-2-pre-release-2',
|
|
||||||
'1.17-pre3': 'minecraft-1-17-pre-release-2',
|
|
||||||
'1.17-pre4': 'minecraft-1-17-pre-release-2',
|
|
||||||
'1.17-pre5': 'minecraft-1-17-pre-release-2',
|
|
||||||
'1.17.1-pre3': 'minecraft-1-17-1-pre-release-2',
|
|
||||||
'1.17-rc2': 'minecraft-1-17-release-candidate-1',
|
|
||||||
'1.17': 'caves---cliffs--part-i-out-today-java',
|
|
||||||
'1.17.1-rc2': 'minecraft-1-17-1-release-candidate-1',
|
|
||||||
'1.18-pre3': 'minecraft-1-18-pre-release-2',
|
|
||||||
'1.18-pre4': 'minecraft-1-18-pre-release-2',
|
|
||||||
'1.18-pre5': 'minecraft-1-18-pre-release-2',
|
|
||||||
'1.18-pre7': 'minecraft-1-18-pre-release-6',
|
|
||||||
'1.18-pre8': 'minecraft-1-18-pre-release-6',
|
|
||||||
'1.18-rc2': 'minecraft-1-18-release-candidate-1',
|
|
||||||
'1.18-rc3': 'minecraft-1-18-release-candidate-1',
|
|
||||||
'1.18-rc4': 'minecraft-1-18-release-candidate-1',
|
|
||||||
'1.18': 'caves---cliffs--part-ii-out-today-java',
|
|
||||||
'1.18.1-rc2': 'minecraft-1-18-1-release-candidate-1',
|
|
||||||
'1.18.1-rc3': 'minecraft-1-18-1-release-candidate-1',
|
|
||||||
'1.18.2-pre3': 'minecraft-1-18-2-pre-release-2',
|
|
||||||
'1.18.2-pre5': 'minecraft-1-18-2-pre-release-4',
|
|
||||||
'1.19-pre3': 'minecraft-1-19-pre-release-2',
|
|
||||||
'1.19-pre5': 'minecraft-1-19-pre-release-4',
|
|
||||||
'1.19-rc2': 'minecraft-1-19-release-candidate-1',
|
|
||||||
'1.19': 'the-wild-update-out-today-java',
|
|
||||||
'1.19.1-pre4': 'minecraft-1-19-1-pre-release-3',
|
|
||||||
'1.19.2-rc2': 'minecraft-1-19-2-release-candidate-1',
|
|
||||||
'1.19.3-pre2': 'minecraft-1-19-3-pre-release-1',
|
|
||||||
'1.19.3-rc2': 'minecraft-1-19-3-release-candidate-1',
|
|
||||||
'1.19.4-pre3': 'minecraft-1-19-4-pre-release-2',
|
|
||||||
'1.19.4-rc2': 'minecraft-1-19-4-release-candidate-1',
|
|
||||||
'1.20-pre3': 'minecraft-1-20-pre-release-2',
|
|
||||||
'1.20-pre4': 'minecraft-1-20-pre-release-2',
|
|
||||||
'1.20-pre6': 'minecraft-1-20-pre-release-5',
|
|
||||||
'1.20': 'trails-tales-update-out-today-java',
|
|
||||||
'1.20.1': 'minecraft--java-edition-1-20-1',
|
|
||||||
'1.20.2-pre2': 'minecraft-1-20-2-pre-release-1',
|
|
||||||
'23w43b': 'minecraft-snapshot-23w43b',
|
|
||||||
'24w03b': 'minecraft-snapshot-24w03b',
|
|
||||||
'24w05b': 'minecraft-snapshot-24w05b',
|
|
||||||
}))
|
|
||||||
|
|
||||||
export function getArticleLink(version: string): string | undefined {
|
|
||||||
const override = ARTICLE_OVERRIDES.get(version)
|
|
||||||
if (override) {
|
|
||||||
return ARTICLE_PREFIX + override
|
|
||||||
}
|
|
||||||
let match
|
|
||||||
if ((match = version.match(/^(\d\dw\d\d)[a-z]$/)) && match[1]) {
|
|
||||||
return ARTICLE_PREFIX + 'minecraft-snapshot-' + match[1] + 'a'
|
|
||||||
}
|
|
||||||
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-snapshot-(\d+)$/)) && match[1] && match[2]) {
|
|
||||||
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-snapshot-' + match[2]
|
|
||||||
}
|
|
||||||
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-pre(\d+)$/)) && match[1] && match[2]) {
|
|
||||||
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-pre-release-' + match[2]
|
|
||||||
}
|
|
||||||
if ((match = version.match(/^(\d+\.\d+(?:\.\d+)?)-rc(\d+)$/)) && match[1]) {
|
|
||||||
return ARTICLE_PREFIX + 'minecraft-' + match[1].replaceAll('.', '-') + '-release-candidate-' + match[2]
|
|
||||||
}
|
|
||||||
if (version.match(/^\d+\.\d+(\.\d+)?$/)) {
|
|
||||||
return ARTICLE_PREFIX + 'minecraft-java-edition-' + version.replaceAll('.', '-')
|
|
||||||
}
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
@@ -14,7 +14,6 @@ const mcmetaUrl = 'https://raw.githubusercontent.com/misode/mcmeta'
|
|||||||
const mcmetaTarballUrl = 'https://github.com/misode/mcmeta/tarball'
|
const mcmetaTarballUrl = 'https://github.com/misode/mcmeta/tarball'
|
||||||
const vanillaMcdocUrl = 'https://raw.githubusercontent.com/SpyglassMC/vanilla-mcdoc'
|
const vanillaMcdocUrl = 'https://raw.githubusercontent.com/SpyglassMC/vanilla-mcdoc'
|
||||||
const changesUrl = 'https://raw.githubusercontent.com/misode/technical-changes'
|
const changesUrl = 'https://raw.githubusercontent.com/misode/technical-changes'
|
||||||
const fixesUrl = 'https://raw.githubusercontent.com/misode/mcfixes'
|
|
||||||
const versionDiffUrl = 'https://mcmeta-diff.misode.workers.dev'
|
const versionDiffUrl = 'https://mcmeta-diff.misode.workers.dev'
|
||||||
const whatsNewUrl = 'https://whats-new.misode.workers.dev'
|
const whatsNewUrl = 'https://whats-new.misode.workers.dev'
|
||||||
|
|
||||||
@@ -309,31 +308,6 @@ export async function fetchChangelogs(): Promise<Change[]> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Bugfix {
|
|
||||||
id: string,
|
|
||||||
summary: string,
|
|
||||||
labels: string[],
|
|
||||||
status: string,
|
|
||||||
confirmation_status: string,
|
|
||||||
categories: string[],
|
|
||||||
priority: string,
|
|
||||||
fix_versions: string[],
|
|
||||||
creation_date: string,
|
|
||||||
resolution_date: string,
|
|
||||||
updated_date: string,
|
|
||||||
watches: number,
|
|
||||||
votes: number,
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function fetchBugfixes(version: string): Promise<Bugfix[]> {
|
|
||||||
try {
|
|
||||||
const fixes = await cachedFetch<Bugfix[]>(`${fixesUrl}/main/versions/${version}.json`, { refresh: true })
|
|
||||||
return fixes
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error(`Error occured while fetching bugfixes for version ${version}: ${message(e)}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface GitHubCommitFile {
|
export interface GitHubCommitFile {
|
||||||
sha: string,
|
sha: string,
|
||||||
filename: string,
|
filename: string,
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
export * from './Article.js'
|
|
||||||
export * from './DataFetcher.js'
|
export * from './DataFetcher.js'
|
||||||
export * from './Sharing.js'
|
export * from './Sharing.js'
|
||||||
export * from './Source.js'
|
export * from './Source.js'
|
||||||
|
|||||||
@@ -362,7 +362,6 @@
|
|||||||
"versions.data_version": "Data version",
|
"versions.data_version": "Data version",
|
||||||
"versions.diff": "Mcmeta diff",
|
"versions.diff": "Mcmeta diff",
|
||||||
"versions.fixes": "Fixed bugs",
|
"versions.fixes": "Fixed bugs",
|
||||||
"versions.fixes.no_results": "No fixes",
|
|
||||||
"versions.latest_release": "Latest release",
|
"versions.latest_release": "Latest release",
|
||||||
"versions.latest_snapshot": "Latest snapshot",
|
"versions.latest_snapshot": "Latest snapshot",
|
||||||
"versions.minecraft_versions": "Minecraft Versions",
|
"versions.minecraft_versions": "Minecraft Versions",
|
||||||
|
|||||||
Reference in New Issue
Block a user