diff --git a/packages/ui/src/components/project/server/ServerModpackContentCard.vue b/packages/ui/src/components/project/server/ServerModpackContentCard.vue
index 2f748cdd32..ef66a91567 100644
--- a/packages/ui/src/components/project/server/ServerModpackContentCard.vue
+++ b/packages/ui/src/components/project/server/ServerModpackContentCard.vue
@@ -4,7 +4,7 @@
-
@@ -32,6 +32,7 @@
diff --git a/packages/ui/src/components/project/server/ServerPing.vue b/packages/ui/src/components/project/server/ServerPing.vue
index db9f1f83f5..43185cea63 100644
--- a/packages/ui/src/components/project/server/ServerPing.vue
+++ b/packages/ui/src/components/project/server/ServerPing.vue
@@ -2,7 +2,7 @@
import { SignalIcon } from '@modrinth/assets'
import { computed } from 'vue'
-import { defineMessage, useVIntl } from '../../../composables'
+import { defineMessages, useVIntl } from '../../../composables'
import { TagItem } from '../../base'
const props = defineProps<{
@@ -10,9 +10,23 @@ const props = defineProps<{
statusOnline?: boolean
}>()
-const pingMessage = defineMessage({
- id: 'project.server.ping.ms',
- defaultMessage: '{ping, number} ms',
+const messages = defineMessages({
+ ping: {
+ id: 'project.server.ping.ms',
+ defaultMessage: '{ping, number} ms',
+ },
+ online: {
+ id: 'project.server.status.online',
+ defaultMessage: 'Online',
+ },
+ offline: {
+ id: 'project.server.status.offline',
+ defaultMessage: 'Offline',
+ },
+ offlineTooltip: {
+ id: 'project.server.status.offline.tooltip',
+ defaultMessage: 'Server is offline',
+ },
})
const { formatMessage } = useVIntl()
@@ -37,19 +51,19 @@ const pingClass = computed(() => {
:class="pingClass"
>
- {{ formatMessage(pingMessage, { ping }) }}
+ {{ formatMessage(messages.ping, { ping }) }}
- Online
+ {{ formatMessage(messages.online) }}
- Offline
+ {{ formatMessage(messages.offline) }}
diff --git a/packages/ui/src/components/project/server/ServerRegion.vue b/packages/ui/src/components/project/server/ServerRegion.vue
index 9270fb5bc3..1bf6716742 100644
--- a/packages/ui/src/components/project/server/ServerRegion.vue
+++ b/packages/ui/src/components/project/server/ServerRegion.vue
@@ -1,25 +1,28 @@
- {{ regionName }}
+ {{ regionName }}
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json
index 73a219c701..62d4d9e5af 100644
--- a/packages/ui/src/locales/en-US/index.json
+++ b/packages/ui/src/locales/en-US/index.json
@@ -329,9 +329,6 @@
"instances.modpack-card.unlink": {
"defaultMessage": "Unlink modpack"
},
- "instances.modpack-content-modal.back-button": {
- "defaultMessage": "Back"
- },
"instances.modpack-content-modal.copy-link": {
"defaultMessage": "Copy link"
},
@@ -653,9 +650,6 @@
"modal.open-in-app.benefit.update": {
"defaultMessage": "Keep files updated when the server changes"
},
- "modal.open-in-app.close": {
- "defaultMessage": "Close"
- },
"modal.open-in-app.get-app": {
"defaultMessage": "Get Modrinth App"
},
@@ -941,6 +935,9 @@
"project.about.compatibility.title": {
"defaultMessage": "Compatibility"
},
+ "project.about.creators.organization": {
+ "defaultMessage": "Organization"
+ },
"project.about.creators.owner": {
"defaultMessage": "Project owner"
},
@@ -1001,18 +998,36 @@
"project.about.links.wiki": {
"defaultMessage": "Visit wiki"
},
+ "project.about.server.address.tooltip": {
+ "defaultMessage": "Copy Java server address"
+ },
"project.about.server.copied": {
"defaultMessage": "Copied!"
},
"project.about.server.copiedText": {
- "defaultMessage": "IP address copied to clipboard"
+ "defaultMessage": "Server address copied to clipboard"
+ },
+ "project.about.server.downloadModpack": {
+ "defaultMessage": "Download modpack"
+ },
+ "project.about.server.languages": {
+ "defaultMessage": "Languages"
},
- "project.about.server.latency": {
- "defaultMessage": "Latency"
+ "project.about.server.recommendedVersion": {
+ "defaultMessage": "(Recommended)"
+ },
+ "project.about.server.region": {
+ "defaultMessage": "Region"
+ },
+ "project.about.server.requiredContent": {
+ "defaultMessage": "Required content"
},
"project.about.server.title": {
"defaultMessage": "Server details"
},
+ "project.about.tags.title": {
+ "defaultMessage": "Tags"
+ },
"project.download-count-tooltip": {
"defaultMessage": "{count, number} {count, plural, one {download} other {downloads}}"
},
@@ -1097,9 +1112,267 @@
"project.recent-plays.tooltip": {
"defaultMessage": "{count} {countPlural, plural, one {recent play} other {recent plays}} from Modrinth in the past 2 weeks"
},
+ "project.server.customModpackTooltip": {
+ "defaultMessage": "This project uses a custom modpack"
+ },
+ "project.server.language.af": {
+ "defaultMessage": "Afrikaans"
+ },
+ "project.server.language.am": {
+ "defaultMessage": "Amharic"
+ },
+ "project.server.language.ar": {
+ "defaultMessage": "Arabic"
+ },
+ "project.server.language.az": {
+ "defaultMessage": "Azerbaijani"
+ },
+ "project.server.language.be": {
+ "defaultMessage": "Belarusian"
+ },
+ "project.server.language.bg": {
+ "defaultMessage": "Bulgarian"
+ },
+ "project.server.language.bn": {
+ "defaultMessage": "Bengali"
+ },
+ "project.server.language.bs": {
+ "defaultMessage": "Bosnian"
+ },
+ "project.server.language.ca": {
+ "defaultMessage": "Catalan"
+ },
+ "project.server.language.cs": {
+ "defaultMessage": "Czech"
+ },
+ "project.server.language.da": {
+ "defaultMessage": "Danish"
+ },
+ "project.server.language.de": {
+ "defaultMessage": "German"
+ },
+ "project.server.language.el": {
+ "defaultMessage": "Greek"
+ },
+ "project.server.language.en": {
+ "defaultMessage": "English"
+ },
+ "project.server.language.eo": {
+ "defaultMessage": "Esperanto"
+ },
+ "project.server.language.es": {
+ "defaultMessage": "Spanish"
+ },
+ "project.server.language.et": {
+ "defaultMessage": "Estonian"
+ },
+ "project.server.language.eu": {
+ "defaultMessage": "Basque"
+ },
+ "project.server.language.fa": {
+ "defaultMessage": "Persian"
+ },
+ "project.server.language.fi": {
+ "defaultMessage": "Finnish"
+ },
+ "project.server.language.fr": {
+ "defaultMessage": "French"
+ },
+ "project.server.language.ga": {
+ "defaultMessage": "Irish"
+ },
+ "project.server.language.gl": {
+ "defaultMessage": "Galician"
+ },
+ "project.server.language.he": {
+ "defaultMessage": "Hebrew"
+ },
+ "project.server.language.hi": {
+ "defaultMessage": "Hindi"
+ },
+ "project.server.language.hr": {
+ "defaultMessage": "Croatian"
+ },
+ "project.server.language.hu": {
+ "defaultMessage": "Hungarian"
+ },
+ "project.server.language.hy": {
+ "defaultMessage": "Armenian"
+ },
+ "project.server.language.id": {
+ "defaultMessage": "Indonesian"
+ },
+ "project.server.language.is": {
+ "defaultMessage": "Icelandic"
+ },
+ "project.server.language.it": {
+ "defaultMessage": "Italian"
+ },
+ "project.server.language.ja": {
+ "defaultMessage": "Japanese"
+ },
+ "project.server.language.ka": {
+ "defaultMessage": "Georgian"
+ },
+ "project.server.language.kk": {
+ "defaultMessage": "Kazakh"
+ },
+ "project.server.language.km": {
+ "defaultMessage": "Khmer"
+ },
+ "project.server.language.kn": {
+ "defaultMessage": "Kannada"
+ },
+ "project.server.language.ko": {
+ "defaultMessage": "Korean"
+ },
+ "project.server.language.lo": {
+ "defaultMessage": "Lao"
+ },
+ "project.server.language.lt": {
+ "defaultMessage": "Lithuanian"
+ },
+ "project.server.language.lv": {
+ "defaultMessage": "Latvian"
+ },
+ "project.server.language.mk": {
+ "defaultMessage": "Macedonian"
+ },
+ "project.server.language.ml": {
+ "defaultMessage": "Malayalam"
+ },
+ "project.server.language.mn": {
+ "defaultMessage": "Mongolian"
+ },
+ "project.server.language.mr": {
+ "defaultMessage": "Marathi"
+ },
+ "project.server.language.ms": {
+ "defaultMessage": "Malay"
+ },
+ "project.server.language.my": {
+ "defaultMessage": "Burmese"
+ },
+ "project.server.language.ne": {
+ "defaultMessage": "Nepali"
+ },
+ "project.server.language.nl": {
+ "defaultMessage": "Dutch"
+ },
+ "project.server.language.no": {
+ "defaultMessage": "Norwegian"
+ },
+ "project.server.language.pa": {
+ "defaultMessage": "Punjabi"
+ },
+ "project.server.language.pl": {
+ "defaultMessage": "Polish"
+ },
+ "project.server.language.pt": {
+ "defaultMessage": "Portuguese"
+ },
+ "project.server.language.ro": {
+ "defaultMessage": "Romanian"
+ },
+ "project.server.language.ru": {
+ "defaultMessage": "Russian"
+ },
+ "project.server.language.si": {
+ "defaultMessage": "Sinhala"
+ },
+ "project.server.language.sk": {
+ "defaultMessage": "Slovak"
+ },
+ "project.server.language.sl": {
+ "defaultMessage": "Slovenian"
+ },
+ "project.server.language.sq": {
+ "defaultMessage": "Albanian"
+ },
+ "project.server.language.sr": {
+ "defaultMessage": "Serbian"
+ },
+ "project.server.language.sv": {
+ "defaultMessage": "Swedish"
+ },
+ "project.server.language.sw": {
+ "defaultMessage": "Swahili"
+ },
+ "project.server.language.ta": {
+ "defaultMessage": "Tamil"
+ },
+ "project.server.language.te": {
+ "defaultMessage": "Telugu"
+ },
+ "project.server.language.th": {
+ "defaultMessage": "Thai"
+ },
+ "project.server.language.tl": {
+ "defaultMessage": "Filipino"
+ },
+ "project.server.language.tr": {
+ "defaultMessage": "Turkish"
+ },
+ "project.server.language.uk": {
+ "defaultMessage": "Ukrainian"
+ },
+ "project.server.language.ur": {
+ "defaultMessage": "Urdu"
+ },
+ "project.server.language.uz": {
+ "defaultMessage": "Uzbek"
+ },
+ "project.server.language.vi": {
+ "defaultMessage": "Vietnamese"
+ },
+ "project.server.language.yo": {
+ "defaultMessage": "Yoruba"
+ },
+ "project.server.language.zh": {
+ "defaultMessage": "Chinese"
+ },
+ "project.server.language.zu": {
+ "defaultMessage": "Zulu"
+ },
"project.server.ping.ms": {
"defaultMessage": "{ping, number} ms"
},
+ "project.server.region.asia": {
+ "defaultMessage": "Asia"
+ },
+ "project.server.region.australia": {
+ "defaultMessage": "Australia"
+ },
+ "project.server.region.europe": {
+ "defaultMessage": "Europe"
+ },
+ "project.server.region.middle_east": {
+ "defaultMessage": "Middle East"
+ },
+ "project.server.region.russia": {
+ "defaultMessage": "Russia"
+ },
+ "project.server.region.south_america": {
+ "defaultMessage": "South America"
+ },
+ "project.server.region.tooltip": {
+ "defaultMessage": "Server hosted in {regionName}"
+ },
+ "project.server.region.us_east": {
+ "defaultMessage": "US East"
+ },
+ "project.server.region.us_west": {
+ "defaultMessage": "US West"
+ },
+ "project.server.status.offline": {
+ "defaultMessage": "Offline"
+ },
+ "project.server.status.offline.tooltip": {
+ "defaultMessage": "Server is offline"
+ },
+ "project.server.status.online": {
+ "defaultMessage": "Online"
+ },
"project.settings.analytics.title": {
"defaultMessage": "Analytics"
},
@@ -1334,9 +1607,27 @@
"search.filter_type.project_id": {
"defaultMessage": "Project ID"
},
+ "search.filter_type.server_content_type": {
+ "defaultMessage": "Type"
+ },
+ "search.filter_type.server_language": {
+ "defaultMessage": "Language"
+ },
+ "search.filter_type.server_region": {
+ "defaultMessage": "Region"
+ },
+ "search.filter_type.server_status": {
+ "defaultMessage": "Status"
+ },
"search.filter_type.shader_loader": {
"defaultMessage": "Loader"
},
+ "search.server_content_type.modpack": {
+ "defaultMessage": "Modded"
+ },
+ "search.server_content_type.vanilla": {
+ "defaultMessage": "Vanilla"
+ },
"servers.backups.item.auto": {
"defaultMessage": "Auto"
},
@@ -1695,7 +1986,7 @@
"defaultMessage": "Kitchen Sink"
},
"tag.category.kitpvp": {
- "defaultMessage": "Kit PVP"
+ "defaultMessage": "Kit PvP"
},
"tag.category.library": {
"defaultMessage": "Library"
@@ -1779,7 +2070,7 @@
"defaultMessage": "Plots"
},
"tag.category.pokemon": {
- "defaultMessage": "Pokemon"
+ "defaultMessage": "Pokémon"
},
"tag.category.potato": {
"defaultMessage": "Potato"
@@ -1788,10 +2079,10 @@
"defaultMessage": "Prison"
},
"tag.category.pve": {
- "defaultMessage": "PVE"
+ "defaultMessage": "PvE"
},
"tag.category.pvp": {
- "defaultMessage": "PVP"
+ "defaultMessage": "PvP"
},
"tag.category.questing": {
"defaultMessage": "Questing"
diff --git a/packages/ui/src/utils/server-search.ts b/packages/ui/src/utils/server-search.ts
index 1813ae0fc8..1cdea717ae 100644
--- a/packages/ui/src/utils/server-search.ts
+++ b/packages/ui/src/utils/server-search.ts
@@ -1,97 +1,105 @@
+import type { Labrinth } from '@modrinth/api-client'
import { getCategoryIcon, SERVER_CATEGORY_ICON_MAP } from '@modrinth/assets'
+import { sortedCategories } from '@modrinth/utils'
import { computed, type Ref, ref } from 'vue'
import { useRoute } from 'vue-router'
-import { useVIntl } from '../composables/i18n'
+import { defineMessage, useVIntl } from '../composables/i18n'
import type { FilterType, FilterValue, SortType, Tags } from './search'
import { formatCategory, formatCategoryHeader } from './tag-messages'
-export const SERVER_REGIONS = [
- { code: 'us_east', name: 'US East' },
- { code: 'us_west', name: 'US West' },
- { code: 'europe', name: 'Europe' },
- { code: 'asia', name: 'Asia' },
- { code: 'australia', name: 'Australia' },
- { code: 'south_america', name: 'South America' },
- { code: 'middle_east', name: 'Middle East' },
- { code: 'russia', name: 'Russia' },
-]
+export const SERVER_REGIONS = {
+ us_east: defineMessage({ id: 'project.server.region.us_east', defaultMessage: 'US East' }),
+ us_west: defineMessage({ id: 'project.server.region.us_west', defaultMessage: 'US West' }),
+ europe: defineMessage({ id: 'project.server.region.europe', defaultMessage: 'Europe' }),
+ asia: defineMessage({ id: 'project.server.region.asia', defaultMessage: 'Asia' }),
+ australia: defineMessage({ id: 'project.server.region.australia', defaultMessage: 'Australia' }),
+ south_america: defineMessage({
+ id: 'project.server.region.south_america',
+ defaultMessage: 'South America',
+ }),
+ middle_east: defineMessage({
+ id: 'project.server.region.middle_east',
+ defaultMessage: 'Middle East',
+ }),
+ russia: defineMessage({ id: 'project.server.region.russia', defaultMessage: 'Russia' }),
+}
-export const SERVER_LANGUAGES = [
- { code: 'en', name: 'English' },
- { code: 'es', name: 'Spanish' },
- { code: 'pt', name: 'Portuguese' },
- { code: 'fr', name: 'French' },
- { code: 'de', name: 'German' },
- { code: 'it', name: 'Italian' },
- { code: 'nl', name: 'Dutch' },
- { code: 'ru', name: 'Russian' },
- { code: 'uk', name: 'Ukrainian' },
- { code: 'pl', name: 'Polish' },
- { code: 'cs', name: 'Czech' },
- { code: 'sk', name: 'Slovak' },
- { code: 'hu', name: 'Hungarian' },
- { code: 'ro', name: 'Romanian' },
- { code: 'bg', name: 'Bulgarian' },
- { code: 'hr', name: 'Croatian' },
- { code: 'sr', name: 'Serbian' },
- { code: 'el', name: 'Greek' },
- { code: 'tr', name: 'Turkish' },
- { code: 'ar', name: 'Arabic' },
- { code: 'he', name: 'Hebrew' },
- { code: 'hi', name: 'Hindi' },
- { code: 'bn', name: 'Bengali' },
- { code: 'ur', name: 'Urdu' },
- { code: 'zh', name: 'Chinese' },
- { code: 'ja', name: 'Japanese' },
- { code: 'ko', name: 'Korean' },
- { code: 'th', name: 'Thai' },
- { code: 'vi', name: 'Vietnamese' },
- { code: 'id', name: 'Indonesian' },
- { code: 'ms', name: 'Malay' },
- { code: 'tl', name: 'Filipino' },
- { code: 'sv', name: 'Swedish' },
- { code: 'no', name: 'Norwegian' },
- { code: 'da', name: 'Danish' },
- { code: 'fi', name: 'Finnish' },
- { code: 'lt', name: 'Lithuanian' },
- { code: 'lv', name: 'Latvian' },
- { code: 'et', name: 'Estonian' },
- { code: 'af', name: 'Afrikaans' },
- { code: 'am', name: 'Amharic' },
- { code: 'az', name: 'Azerbaijani' },
- { code: 'be', name: 'Belarusian' },
- { code: 'bs', name: 'Bosnian' },
- { code: 'ca', name: 'Catalan' },
- { code: 'eo', name: 'Esperanto' },
- { code: 'eu', name: 'Basque' },
- { code: 'fa', name: 'Persian' },
- { code: 'ga', name: 'Irish' },
- { code: 'gl', name: 'Galician' },
- { code: 'hy', name: 'Armenian' },
- { code: 'is', name: 'Icelandic' },
- { code: 'ka', name: 'Georgian' },
- { code: 'kk', name: 'Kazakh' },
- { code: 'km', name: 'Khmer' },
- { code: 'kn', name: 'Kannada' },
- { code: 'lo', name: 'Lao' },
- { code: 'mk', name: 'Macedonian' },
- { code: 'ml', name: 'Malayalam' },
- { code: 'mn', name: 'Mongolian' },
- { code: 'mr', name: 'Marathi' },
- { code: 'my', name: 'Burmese' },
- { code: 'ne', name: 'Nepali' },
- { code: 'pa', name: 'Punjabi' },
- { code: 'si', name: 'Sinhala' },
- { code: 'sl', name: 'Slovenian' },
- { code: 'sq', name: 'Albanian' },
- { code: 'sw', name: 'Swahili' },
- { code: 'ta', name: 'Tamil' },
- { code: 'te', name: 'Telugu' },
- { code: 'uz', name: 'Uzbek' },
- { code: 'yo', name: 'Yoruba' },
- { code: 'zu', name: 'Zulu' },
-]
+export const SERVER_LANGUAGES = {
+ en: defineMessage({ id: 'project.server.language.en', defaultMessage: 'English' }),
+ es: defineMessage({ id: 'project.server.language.es', defaultMessage: 'Spanish' }),
+ pt: defineMessage({ id: 'project.server.language.pt', defaultMessage: 'Portuguese' }),
+ fr: defineMessage({ id: 'project.server.language.fr', defaultMessage: 'French' }),
+ de: defineMessage({ id: 'project.server.language.de', defaultMessage: 'German' }),
+ it: defineMessage({ id: 'project.server.language.it', defaultMessage: 'Italian' }),
+ nl: defineMessage({ id: 'project.server.language.nl', defaultMessage: 'Dutch' }),
+ ru: defineMessage({ id: 'project.server.language.ru', defaultMessage: 'Russian' }),
+ uk: defineMessage({ id: 'project.server.language.uk', defaultMessage: 'Ukrainian' }),
+ pl: defineMessage({ id: 'project.server.language.pl', defaultMessage: 'Polish' }),
+ cs: defineMessage({ id: 'project.server.language.cs', defaultMessage: 'Czech' }),
+ sk: defineMessage({ id: 'project.server.language.sk', defaultMessage: 'Slovak' }),
+ hu: defineMessage({ id: 'project.server.language.hu', defaultMessage: 'Hungarian' }),
+ ro: defineMessage({ id: 'project.server.language.ro', defaultMessage: 'Romanian' }),
+ bg: defineMessage({ id: 'project.server.language.bg', defaultMessage: 'Bulgarian' }),
+ hr: defineMessage({ id: 'project.server.language.hr', defaultMessage: 'Croatian' }),
+ sr: defineMessage({ id: 'project.server.language.sr', defaultMessage: 'Serbian' }),
+ el: defineMessage({ id: 'project.server.language.el', defaultMessage: 'Greek' }),
+ tr: defineMessage({ id: 'project.server.language.tr', defaultMessage: 'Turkish' }),
+ ar: defineMessage({ id: 'project.server.language.ar', defaultMessage: 'Arabic' }),
+ he: defineMessage({ id: 'project.server.language.he', defaultMessage: 'Hebrew' }),
+ hi: defineMessage({ id: 'project.server.language.hi', defaultMessage: 'Hindi' }),
+ bn: defineMessage({ id: 'project.server.language.bn', defaultMessage: 'Bengali' }),
+ ur: defineMessage({ id: 'project.server.language.ur', defaultMessage: 'Urdu' }),
+ zh: defineMessage({ id: 'project.server.language.zh', defaultMessage: 'Chinese' }),
+ ja: defineMessage({ id: 'project.server.language.ja', defaultMessage: 'Japanese' }),
+ ko: defineMessage({ id: 'project.server.language.ko', defaultMessage: 'Korean' }),
+ th: defineMessage({ id: 'project.server.language.th', defaultMessage: 'Thai' }),
+ vi: defineMessage({ id: 'project.server.language.vi', defaultMessage: 'Vietnamese' }),
+ id: defineMessage({ id: 'project.server.language.id', defaultMessage: 'Indonesian' }),
+ ms: defineMessage({ id: 'project.server.language.ms', defaultMessage: 'Malay' }),
+ tl: defineMessage({ id: 'project.server.language.tl', defaultMessage: 'Filipino' }),
+ sv: defineMessage({ id: 'project.server.language.sv', defaultMessage: 'Swedish' }),
+ no: defineMessage({ id: 'project.server.language.no', defaultMessage: 'Norwegian' }),
+ da: defineMessage({ id: 'project.server.language.da', defaultMessage: 'Danish' }),
+ fi: defineMessage({ id: 'project.server.language.fi', defaultMessage: 'Finnish' }),
+ lt: defineMessage({ id: 'project.server.language.lt', defaultMessage: 'Lithuanian' }),
+ lv: defineMessage({ id: 'project.server.language.lv', defaultMessage: 'Latvian' }),
+ et: defineMessage({ id: 'project.server.language.et', defaultMessage: 'Estonian' }),
+ af: defineMessage({ id: 'project.server.language.af', defaultMessage: 'Afrikaans' }),
+ am: defineMessage({ id: 'project.server.language.am', defaultMessage: 'Amharic' }),
+ az: defineMessage({ id: 'project.server.language.az', defaultMessage: 'Azerbaijani' }),
+ be: defineMessage({ id: 'project.server.language.be', defaultMessage: 'Belarusian' }),
+ bs: defineMessage({ id: 'project.server.language.bs', defaultMessage: 'Bosnian' }),
+ ca: defineMessage({ id: 'project.server.language.ca', defaultMessage: 'Catalan' }),
+ eo: defineMessage({ id: 'project.server.language.eo', defaultMessage: 'Esperanto' }),
+ eu: defineMessage({ id: 'project.server.language.eu', defaultMessage: 'Basque' }),
+ fa: defineMessage({ id: 'project.server.language.fa', defaultMessage: 'Persian' }),
+ ga: defineMessage({ id: 'project.server.language.ga', defaultMessage: 'Irish' }),
+ gl: defineMessage({ id: 'project.server.language.gl', defaultMessage: 'Galician' }),
+ hy: defineMessage({ id: 'project.server.language.hy', defaultMessage: 'Armenian' }),
+ is: defineMessage({ id: 'project.server.language.is', defaultMessage: 'Icelandic' }),
+ ka: defineMessage({ id: 'project.server.language.ka', defaultMessage: 'Georgian' }),
+ kk: defineMessage({ id: 'project.server.language.kk', defaultMessage: 'Kazakh' }),
+ km: defineMessage({ id: 'project.server.language.km', defaultMessage: 'Khmer' }),
+ kn: defineMessage({ id: 'project.server.language.kn', defaultMessage: 'Kannada' }),
+ lo: defineMessage({ id: 'project.server.language.lo', defaultMessage: 'Lao' }),
+ mk: defineMessage({ id: 'project.server.language.mk', defaultMessage: 'Macedonian' }),
+ ml: defineMessage({ id: 'project.server.language.ml', defaultMessage: 'Malayalam' }),
+ mn: defineMessage({ id: 'project.server.language.mn', defaultMessage: 'Mongolian' }),
+ mr: defineMessage({ id: 'project.server.language.mr', defaultMessage: 'Marathi' }),
+ my: defineMessage({ id: 'project.server.language.my', defaultMessage: 'Burmese' }),
+ ne: defineMessage({ id: 'project.server.language.ne', defaultMessage: 'Nepali' }),
+ pa: defineMessage({ id: 'project.server.language.pa', defaultMessage: 'Punjabi' }),
+ si: defineMessage({ id: 'project.server.language.si', defaultMessage: 'Sinhala' }),
+ sl: defineMessage({ id: 'project.server.language.sl', defaultMessage: 'Slovenian' }),
+ sq: defineMessage({ id: 'project.server.language.sq', defaultMessage: 'Albanian' }),
+ sw: defineMessage({ id: 'project.server.language.sw', defaultMessage: 'Swahili' }),
+ ta: defineMessage({ id: 'project.server.language.ta', defaultMessage: 'Tamil' }),
+ te: defineMessage({ id: 'project.server.language.te', defaultMessage: 'Telugu' }),
+ uz: defineMessage({ id: 'project.server.language.uz', defaultMessage: 'Uzbek' }),
+ yo: defineMessage({ id: 'project.server.language.yo', defaultMessage: 'Yoruba' }),
+ zu: defineMessage({ id: 'project.server.language.zu', defaultMessage: 'Zulu' }),
+}
export const SERVER_SORT_TYPES: SortType[] = [
{ display: 'Relevance', name: 'relevance' },
@@ -123,7 +131,10 @@ export function useServerSearch(opts: {
}) {
const { tags, query, maxResults, currentPage } = opts
- const { formatMessage } = useVIntl()
+ const { formatMessage, locale } = useVIntl()
+ const formatCategoryName = (categoryName: string) => {
+ return formatCategory(formatMessage, categoryName)
+ }
const route = useRoute()
@@ -133,8 +144,8 @@ export function useServerSearch(opts: {
const serverFilterTypes = computed
(() => {
const categoryFilters: Record = {}
- for (const c of (tags.value?.categories ?? []).filter(
- (c) => c.project_type === 'minecraft_java_server',
+ for (const c of sortedCategories(tags.value, formatCategoryName, locale.value).filter(
+ (c: Labrinth.Tags.v2.Category) => c.project_type === 'minecraft_java_server',
)) {
const filterTypeId = `server_category_${c.header}`
if (!categoryFilters[filterTypeId]) {
@@ -158,27 +169,55 @@ export function useServerSearch(opts: {
})
}
- const featuresFilter = categoryFilters['server_category_minecraft_server_features']
- if (featuresFilter) {
- featuresFilter.options.sort((a, b) => {
- if (a.id === 'pokemon') return -1
- if (b.id === 'pokemon') return 1
- return 0
- })
- }
+ const sortedRegions = Object.entries(SERVER_REGIONS).sort(([_, a], [__, b]) => {
+ const aFormatted = formatMessage(a)
+ const bFormatted = formatMessage(b)
+ return aFormatted.localeCompare(bFormatted, locale.value)
+ })
+
+ const sortedLanguages = Object.entries(SERVER_LANGUAGES).sort(([_, a], [__, b]) => {
+ const aFormatted = formatMessage(a)
+ const bFormatted = formatMessage(b)
+ return aFormatted.localeCompare(bFormatted, locale.value)
+ })
return [
{
id: 'server_content_type',
- formatted_name: 'Type',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.filter_type.server_content_type',
+ defaultMessage: 'Type',
+ }),
+ ),
supported_project_types: ['server'],
display: 'all',
query_param: 'sct',
supports_negative_filter: false,
searchable: false,
options: [
- { id: 'vanilla', formatted_name: 'Vanilla', method: 'or', value: 'vanilla' },
- { id: 'modpack', formatted_name: 'Modded', method: 'or', value: 'modpack' },
+ {
+ id: 'vanilla',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.server_content_type.vanilla',
+ defaultMessage: 'Vanilla',
+ }),
+ ),
+ method: 'or',
+ value: 'vanilla',
+ },
+ {
+ id: 'modpack',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.server_content_type.modpack',
+ defaultMessage: 'Modded',
+ }),
+ ),
+ method: 'or',
+ value: 'modpack',
+ },
],
},
...[
@@ -191,7 +230,12 @@ export function useServerSearch(opts: {
.filter(Boolean),
{
id: 'server_game_version',
- formatted_name: 'Game Version',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.filter_type.game_version',
+ defaultMessage: 'Game version',
+ }),
+ ),
supported_project_types: ['server'],
display: 'scrollable',
query_param: 'sgv',
@@ -207,45 +251,80 @@ export function useServerSearch(opts: {
},
{
id: 'server_region',
- formatted_name: 'Region',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.filter_type.server_region',
+ defaultMessage: 'Region',
+ }),
+ ),
supported_project_types: ['server'],
display: 'all',
query_param: 'sr',
supports_negative_filter: true,
searchable: false,
- options: SERVER_REGIONS.map((r) => ({
- id: r.code,
- formatted_name: r.name,
+ options: sortedRegions.map(([code, name]) => ({
+ id: code,
+ formatted_name: formatMessage(name),
method: 'or' as const,
- value: r.code,
+ value: code,
})),
},
{
id: 'server_language',
- formatted_name: 'Language',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.filter_type.server_language',
+ defaultMessage: 'Language',
+ }),
+ ),
supported_project_types: ['server'],
display: 'scrollable',
query_param: 'sl',
supports_negative_filter: false,
searchable: true,
- options: SERVER_LANGUAGES.map((l) => ({
- id: l.code,
- formatted_name: l.name,
+ options: sortedLanguages.map(([code, name]) => ({
+ id: code,
+ formatted_name: formatMessage(name),
method: 'or' as const,
- value: l.code,
+ value: code,
})),
},
{
id: 'server_status',
- formatted_name: 'Status',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'search.filter_type.server_status',
+ defaultMessage: 'Status',
+ }),
+ ),
supported_project_types: ['server'],
display: 'all',
query_param: 'sst',
supports_negative_filter: false,
searchable: false,
options: [
- { id: 'online', formatted_name: 'Online', method: 'or', value: 'online' },
- { id: 'offline', formatted_name: 'Offline', method: 'or', value: 'offline' },
+ {
+ id: 'online',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'project.server.status.online',
+ defaultMessage: 'Online',
+ }),
+ ),
+ method: 'or',
+ value: 'online',
+ },
+ {
+ id: 'offline',
+ formatted_name: formatMessage(
+ defineMessage({
+ id: 'project.server.status.offline',
+ defaultMessage: 'Offline',
+ }),
+ ),
+ method: 'or',
+ value: 'offline',
+ },
],
},
]
diff --git a/packages/ui/src/utils/tag-messages.ts b/packages/ui/src/utils/tag-messages.ts
index 5275a32133..13eff7b56a 100644
--- a/packages/ui/src/utils/tag-messages.ts
+++ b/packages/ui/src/utils/tag-messages.ts
@@ -324,7 +324,7 @@ export const categoryMessages = defineMessages({
},
kitpvp: {
id: 'tag.category.kitpvp',
- defaultMessage: 'Kit PVP',
+ defaultMessage: 'Kit PvP',
},
library: {
id: 'tag.category.library',
@@ -436,7 +436,7 @@ export const categoryMessages = defineMessages({
},
pokemon: {
id: 'tag.category.pokemon',
- defaultMessage: 'Pokemon',
+ defaultMessage: 'Pokémon',
},
potato: {
id: 'tag.category.potato',
@@ -448,11 +448,11 @@ export const categoryMessages = defineMessages({
},
pve: {
id: 'tag.category.pve',
- defaultMessage: 'PVE',
+ defaultMessage: 'PvE',
},
pvp: {
id: 'tag.category.pvp',
- defaultMessage: 'PVP',
+ defaultMessage: 'PvP',
},
questing: {
id: 'tag.category.questing',
diff --git a/packages/utils/utils.ts b/packages/utils/utils.ts
index 4d185f7ab0..4d9fe5775d 100644
--- a/packages/utils/utils.ts
+++ b/packages/utils/utils.ts
@@ -69,16 +69,14 @@ const SERVER_HEADER_ORDER = [
export const sortedCategories = (tags, formatCategoryName, locale) => {
return tags.categories.slice().sort((a, b) => {
- const aServerIdx = SERVER_HEADER_ORDER.indexOf(a.header)
- const bServerIdx = SERVER_HEADER_ORDER.indexOf(b.header)
- if (aServerIdx !== -1 || bServerIdx !== -1) {
- return (
- (aServerIdx === -1 ? Infinity : aServerIdx) - (bServerIdx === -1 ? Infinity : bServerIdx)
- )
- }
-
const headerCompare = a.header.localeCompare(b.header)
if (headerCompare !== 0) {
+ const aServerIdx = SERVER_HEADER_ORDER.indexOf(a.header)
+ const bServerIdx = SERVER_HEADER_ORDER.indexOf(b.header)
+ if (aServerIdx !== -1 && bServerIdx !== -1) {
+ return aServerIdx - bServerIdx
+ }
+
return headerCompare
}
@@ -87,6 +85,9 @@ export const sortedCategories = (tags, formatCategoryName, locale) => {
return x.indexOf(a.name) - x.indexOf(b.name)
}
+ if (a.name === 'pokemon') return -1
+ if (b.name === 'pokemon') return 1
+
const aFormatted = formatCategoryName(a.name)
const bFormatted = formatCategoryName(b.name)
return aFormatted.localeCompare(bFormatted, locale, { numeric: true })