From 16ac2aae6b9e5680727ba55a7daac83696ce87cb Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:01:56 -0800 Subject: [PATCH] Make tags translatable, move icons to frontend, a few other things (#5229) * Make tags translatable, move icons to frontend, a few other things * Migrate more things * fix import * more import fixes * export tag-messages * lint --- .../src/components/ui/InstanceIndicator.vue | 6 +- .../src/components/ui/ProjectCard.vue | 6 +- .../src/components/ui/SearchCard.vue | 6 +- .../InstallationSettings.vue | 35 +- .../src/components/ui/ProjectCard.vue | 3 +- .../components/LoaderPicker.vue | 8 +- .../stages/LoadersStage.vue | 9 +- .../stages/MetadataStage.vue | 8 +- .../src/components/ui/search/Categories.vue | 72 --- .../ui/servers/ContentVersionEditModal.vue | 31 +- .../ui/servers/icons/LoaderIcon.vue | 13 +- apps/frontend/src/pages/[type]/[id].vue | 2 +- .../src/pages/[type]/[id]/settings/tags.vue | 55 ++- .../pages/[type]/[id]/version/[version].vue | 2 +- packages/assets/build/generate-exports.ts | 179 +++++++- packages/assets/generated-icons.ts | 271 ++++++++++++ .../icons/tags/categories/adventure.svg | 1 + .../icons/tags/categories/atmosphere.svg | 1 + .../assets/icons/tags/categories/audio.svg | 1 + .../assets/icons/tags/categories/blocks.svg | 1 + .../assets/icons/tags/categories/bloom.svg | 1 + .../assets/icons/tags/categories/cartoon.svg | 1 + .../icons/tags/categories/challenging.svg | 1 + .../tags/categories/colored-lighting.svg | 1 + .../assets/icons/tags/categories/combat.svg | 1 + .../icons/tags/categories/core-shaders.svg | 1 + .../assets/icons/tags/categories/cursed.svg | 1 + .../icons/tags/categories/decoration.svg | 1 + .../assets/icons/tags/categories/economy.svg | 1 + .../assets/icons/tags/categories/entities.svg | 5 + .../icons/tags/categories/environment.svg | 1 + .../icons/tags/categories/equipment.svg | 1 + .../assets/icons/tags/categories/fantasy.svg | 1 + .../assets/icons/tags/categories/foliage.svg | 1 + .../assets/icons/tags/categories/fonts.svg | 1 + .../assets/icons/tags/categories/food.svg | 1 + .../icons/tags/categories/game-mechanics.svg | 1 + packages/assets/icons/tags/categories/gui.svg | 1 + .../assets/icons/tags/categories/high.svg | 1 + .../assets/icons/tags/categories/items.svg | 1 + .../icons/tags/categories/kitchen-sink.svg | 1 + .../assets/icons/tags/categories/library.svg | 1 + .../icons/tags/categories/lightweight.svg | 1 + .../assets/icons/tags/categories/locale.svg | 1 + packages/assets/icons/tags/categories/low.svg | 1 + .../assets/icons/tags/categories/magic.svg | 1 + .../icons/tags/categories/management.svg | 1 + .../assets/icons/tags/categories/medium.svg | 1 + .../assets/icons/tags/categories/minigame.svg | 1 + .../assets/icons/tags/categories/mobs.svg | 5 + .../assets/icons/tags/categories/modded.svg | 1 + .../assets/icons/tags/categories/models.svg | 1 + .../icons/tags/categories/multiplayer.svg | 1 + .../icons/tags/categories/optimization.svg | 1 + .../icons/tags/categories/path-tracing.svg | 1 + packages/assets/icons/tags/categories/pbr.svg | 1 + .../assets/icons/tags/categories/potato.svg | 1 + .../assets/icons/tags/categories/quests.svg | 1 + .../icons/tags/categories/realistic.svg | 1 + .../icons/tags/categories/reflections.svg | 1 + .../icons/tags/categories/screenshot.svg | 1 + .../icons/tags/categories/semi-realistic.svg | 1 + .../assets/icons/tags/categories/shadows.svg | 1 + .../icons/tags/categories/simplistic.svg | 1 + .../assets/icons/tags/categories/social.svg | 1 + .../assets/icons/tags/categories/storage.svg | 1 + .../icons/tags/categories/technology.svg | 1 + .../assets/icons/tags/categories/themed.svg | 1 + .../icons/tags/categories/transportation.svg | 1 + .../assets/icons/tags/categories/tweaks.svg | 1 + .../assets/icons/tags/categories/utility.svg | 1 + .../icons/tags/categories/vanilla-like.svg | 1 + .../assets/icons/tags/categories/worldgen.svg | 1 + packages/assets/icons/tags/loaders/babric.svg | 1 + .../assets/icons/tags/loaders/bta-babric.svg | 1 + packages/assets/icons/tags/loaders/bukkit.svg | 1 + .../assets/icons/tags/loaders/bungeecord.svg | 7 + packages/assets/icons/tags/loaders/canvas.svg | 1 + .../assets/icons/tags/loaders/datapack.svg | 1 + packages/assets/icons/tags/loaders/fabric.svg | 4 + packages/assets/icons/tags/loaders/folia.svg | 1 + packages/assets/icons/tags/loaders/forge.svg | 4 + packages/assets/icons/tags/loaders/geyser.svg | 1 + packages/assets/icons/tags/loaders/iris.svg | 4 + .../assets/icons/tags/loaders/java-agent.svg | 1 + .../icons/tags/loaders/legacy-fabric.svg | 1 + .../assets/icons/tags/loaders/liteloader.svg | 1 + .../assets/icons/tags/loaders/minecraft.svg | 1 + .../assets/icons/tags/loaders/modloader.svg | 1 + packages/assets/icons/tags/loaders/mrpack.svg | 1 + .../assets/icons/tags/loaders/neoforge.svg | 1 + .../assets/icons/tags/loaders/nilloader.svg | 1 + .../assets/icons/tags/loaders/optifine.svg | 1 + .../assets/icons/tags/loaders/ornithe.svg | 1 + packages/assets/icons/tags/loaders/paper.svg | 6 + packages/assets/icons/tags/loaders/purpur.svg | 12 + packages/assets/icons/tags/loaders/quilt.svg | 10 + packages/assets/icons/tags/loaders/rift.svg | 1 + packages/assets/icons/tags/loaders/spigot.svg | 1 + packages/assets/icons/tags/loaders/sponge.svg | 1 + .../assets/icons/tags/loaders/vanilla.svg | 1 + .../assets/icons/tags/loaders/velocity.svg | 1 + .../assets/icons/tags/loaders/waterfall.svg | 1 + packages/assets/index.ts | 16 + packages/assets/styles/variables.scss | 2 - .../ui/src/components/base/FormattedTag.vue | 19 + .../ui/src/components/base/ProjectCard.vue | 3 +- packages/ui/src/components/base/TagIcon.vue | 21 + packages/ui/src/components/base/index.ts | 1 + .../src/components/project/NewProjectCard.vue | 6 +- .../src/components/project/ProjectHeader.vue | 5 +- .../project/ProjectPageVersions.vue | 21 +- .../project/ProjectSidebarCompatibility.vue | 16 +- .../project/ProjectSidebarDetails.vue | 9 +- .../ui/src/components/search/Categories.vue | 34 +- .../version/VersionFilterControl.vue | 10 +- packages/ui/src/locales/en-US/index.json | 285 ++++++++++++ packages/ui/src/utils/index.ts | 1 + packages/ui/src/utils/search.ts | 59 ++- packages/ui/src/utils/tag-messages.ts | 409 ++++++++++++++++++ packages/utils/utils.ts | 3 + 121 files changed, 1532 insertions(+), 229 deletions(-) delete mode 100644 apps/frontend/src/components/ui/search/Categories.vue create mode 100644 packages/assets/icons/tags/categories/adventure.svg create mode 100644 packages/assets/icons/tags/categories/atmosphere.svg create mode 100644 packages/assets/icons/tags/categories/audio.svg create mode 100644 packages/assets/icons/tags/categories/blocks.svg create mode 100644 packages/assets/icons/tags/categories/bloom.svg create mode 100644 packages/assets/icons/tags/categories/cartoon.svg create mode 100644 packages/assets/icons/tags/categories/challenging.svg create mode 100644 packages/assets/icons/tags/categories/colored-lighting.svg create mode 100644 packages/assets/icons/tags/categories/combat.svg create mode 100644 packages/assets/icons/tags/categories/core-shaders.svg create mode 100644 packages/assets/icons/tags/categories/cursed.svg create mode 100644 packages/assets/icons/tags/categories/decoration.svg create mode 100644 packages/assets/icons/tags/categories/economy.svg create mode 100644 packages/assets/icons/tags/categories/entities.svg create mode 100644 packages/assets/icons/tags/categories/environment.svg create mode 100644 packages/assets/icons/tags/categories/equipment.svg create mode 100644 packages/assets/icons/tags/categories/fantasy.svg create mode 100644 packages/assets/icons/tags/categories/foliage.svg create mode 100644 packages/assets/icons/tags/categories/fonts.svg create mode 100644 packages/assets/icons/tags/categories/food.svg create mode 100644 packages/assets/icons/tags/categories/game-mechanics.svg create mode 100644 packages/assets/icons/tags/categories/gui.svg create mode 100644 packages/assets/icons/tags/categories/high.svg create mode 100644 packages/assets/icons/tags/categories/items.svg create mode 100644 packages/assets/icons/tags/categories/kitchen-sink.svg create mode 100644 packages/assets/icons/tags/categories/library.svg create mode 100644 packages/assets/icons/tags/categories/lightweight.svg create mode 100644 packages/assets/icons/tags/categories/locale.svg create mode 100644 packages/assets/icons/tags/categories/low.svg create mode 100644 packages/assets/icons/tags/categories/magic.svg create mode 100644 packages/assets/icons/tags/categories/management.svg create mode 100644 packages/assets/icons/tags/categories/medium.svg create mode 100644 packages/assets/icons/tags/categories/minigame.svg create mode 100644 packages/assets/icons/tags/categories/mobs.svg create mode 100644 packages/assets/icons/tags/categories/modded.svg create mode 100644 packages/assets/icons/tags/categories/models.svg create mode 100644 packages/assets/icons/tags/categories/multiplayer.svg create mode 100644 packages/assets/icons/tags/categories/optimization.svg create mode 100644 packages/assets/icons/tags/categories/path-tracing.svg create mode 100644 packages/assets/icons/tags/categories/pbr.svg create mode 100644 packages/assets/icons/tags/categories/potato.svg create mode 100644 packages/assets/icons/tags/categories/quests.svg create mode 100644 packages/assets/icons/tags/categories/realistic.svg create mode 100644 packages/assets/icons/tags/categories/reflections.svg create mode 100644 packages/assets/icons/tags/categories/screenshot.svg create mode 100644 packages/assets/icons/tags/categories/semi-realistic.svg create mode 100644 packages/assets/icons/tags/categories/shadows.svg create mode 100644 packages/assets/icons/tags/categories/simplistic.svg create mode 100644 packages/assets/icons/tags/categories/social.svg create mode 100644 packages/assets/icons/tags/categories/storage.svg create mode 100644 packages/assets/icons/tags/categories/technology.svg create mode 100644 packages/assets/icons/tags/categories/themed.svg create mode 100644 packages/assets/icons/tags/categories/transportation.svg create mode 100644 packages/assets/icons/tags/categories/tweaks.svg create mode 100644 packages/assets/icons/tags/categories/utility.svg create mode 100644 packages/assets/icons/tags/categories/vanilla-like.svg create mode 100644 packages/assets/icons/tags/categories/worldgen.svg create mode 100644 packages/assets/icons/tags/loaders/babric.svg create mode 100644 packages/assets/icons/tags/loaders/bta-babric.svg create mode 100644 packages/assets/icons/tags/loaders/bukkit.svg create mode 100644 packages/assets/icons/tags/loaders/bungeecord.svg create mode 100644 packages/assets/icons/tags/loaders/canvas.svg create mode 100644 packages/assets/icons/tags/loaders/datapack.svg create mode 100644 packages/assets/icons/tags/loaders/fabric.svg create mode 100644 packages/assets/icons/tags/loaders/folia.svg create mode 100644 packages/assets/icons/tags/loaders/forge.svg create mode 100644 packages/assets/icons/tags/loaders/geyser.svg create mode 100644 packages/assets/icons/tags/loaders/iris.svg create mode 100644 packages/assets/icons/tags/loaders/java-agent.svg create mode 100644 packages/assets/icons/tags/loaders/legacy-fabric.svg create mode 100644 packages/assets/icons/tags/loaders/liteloader.svg create mode 100644 packages/assets/icons/tags/loaders/minecraft.svg create mode 100644 packages/assets/icons/tags/loaders/modloader.svg create mode 100644 packages/assets/icons/tags/loaders/mrpack.svg create mode 100644 packages/assets/icons/tags/loaders/neoforge.svg create mode 100644 packages/assets/icons/tags/loaders/nilloader.svg create mode 100644 packages/assets/icons/tags/loaders/optifine.svg create mode 100644 packages/assets/icons/tags/loaders/ornithe.svg create mode 100644 packages/assets/icons/tags/loaders/paper.svg create mode 100644 packages/assets/icons/tags/loaders/purpur.svg create mode 100644 packages/assets/icons/tags/loaders/quilt.svg create mode 100644 packages/assets/icons/tags/loaders/rift.svg create mode 100644 packages/assets/icons/tags/loaders/spigot.svg create mode 100644 packages/assets/icons/tags/loaders/sponge.svg create mode 100644 packages/assets/icons/tags/loaders/vanilla.svg create mode 100644 packages/assets/icons/tags/loaders/velocity.svg create mode 100644 packages/assets/icons/tags/loaders/waterfall.svg create mode 100644 packages/ui/src/components/base/FormattedTag.vue create mode 100644 packages/ui/src/components/base/TagIcon.vue create mode 100644 packages/ui/src/utils/tag-messages.ts diff --git a/apps/app-frontend/src/components/ui/InstanceIndicator.vue b/apps/app-frontend/src/components/ui/InstanceIndicator.vue index a00263bd7..72a7e2151 100644 --- a/apps/app-frontend/src/components/ui/InstanceIndicator.vue +++ b/apps/app-frontend/src/components/ui/InstanceIndicator.vue @@ -1,7 +1,6 @@ - - diff --git a/apps/frontend/src/components/ui/servers/ContentVersionEditModal.vue b/apps/frontend/src/components/ui/servers/ContentVersionEditModal.vue index a87db5e83..0bfe2ba11 100644 --- a/apps/frontend/src/components/ui/servers/ContentVersionEditModal.vue +++ b/apps/frontend/src/components/ui/servers/ContentVersionEditModal.vue @@ -132,17 +132,24 @@ :loader="'Vanilla'" class="size-5 flex-none" /> - + />
{{ filtersRef?.selectedPlatforms.length === 0 ? 'All platforms' - : filtersRef?.selectedPlatforms.map((x) => formatCategory(x)).join(', ') + : filtersRef?.selectedPlatforms + .map((x) => { + const message = getTagMessageOrDefault(x, 'loader') + return typeof message === 'string' ? message : formatMessage(message) + }) + .join(', ') }}
@@ -242,6 +249,7 @@ import { DropdownIcon, ExternalIcon, GameIcon, + getLoaderIcon, LockOpenIcon, XIcon, } from '@modrinth/assets' @@ -252,10 +260,12 @@ import { Checkbox, Combobox, CopyCode, + getTagMessageOrDefault, NewModal, + TagItem, + useVIntl, } from '@modrinth/ui' -import TagItem from '@modrinth/ui/src/components/base/TagItem.vue' -import { formatCategory, formatVersionsForDisplay, type Mod, type Version } from '@modrinth/utils' +import { formatVersionsForDisplay, type Mod, type Version } from '@modrinth/utils' import { computed, ref } from 'vue' import Accordion from '~/components/ui/Accordion.vue' @@ -265,6 +275,8 @@ import ContentVersionFilter, { } from '~/components/ui/servers/ContentVersionFilter.vue' import LoaderIcon from '~/components/ui/servers/icons/LoaderIcon.vue' +const { formatMessage } = useVIntl() + const props = defineProps<{ type: 'Mod' | 'Plugin' loader: string @@ -424,7 +436,10 @@ const formattedVersions = computed(() => { if (secondLoaderPosition === -1) return -1 return firstLoaderPosition - secondLoaderPosition }) - .map((loader: string) => formatCategory(loader)), + .map((loader: string) => { + const message = getTagMessageOrDefault(loader, 'loader') + return typeof message === 'string' ? message : formatMessage(message) + }), } }) diff --git a/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue b/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue index 4bd494e49..090bb945b 100644 --- a/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue +++ b/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue @@ -1,22 +1,15 @@ diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue index f6bc2767c..fe52b5d86 100644 --- a/apps/frontend/src/pages/[type]/[id].vue +++ b/apps/frontend/src/pages/[type]/[id].vue @@ -977,7 +977,7 @@ import { useVIntl, } from '@modrinth/ui' import VersionSummary from '@modrinth/ui/src/components/version/VersionSummary.vue' -import { formatCategory, formatPrice, formatProjectType, renderString } from '@modrinth/utils' +import { formatPrice, formatProjectType, renderString } from '@modrinth/utils' import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query' import { useLocalStorage } from '@vueuse/core' import dayjs from 'dayjs' diff --git a/apps/frontend/src/pages/[type]/[id]/settings/tags.vue b/apps/frontend/src/pages/[type]/[id]/settings/tags.vue index 203730ba7..e705c5ab7 100644 --- a/apps/frontend/src/pages/[type]/[id]/settings/tags.vue +++ b/apps/frontend/src/pages/[type]/[id]/settings/tags.vue @@ -66,18 +66,24 @@ v-for="category in categoryLists[header]" :key="`category-${header}-${category.name}`" :model-value="current.selectedTags.includes(category)" - :description="formatCategory(category.name)" + :description=" + typeof getTagMessageOrDefault(category.name, 'category') === 'string' + ? getTagMessageOrDefault(category.name, 'category') + : formatMessage(getTagMessageOrDefault(category.name, 'category')) + " class="category-selector" @update:model-value="toggleCategory(category)" >
-
@@ -100,18 +106,24 @@ :key="`featured-category-${category.name}`" class="category-selector" :model-value="current.featuredTags.includes(category)" - :description="formatCategory(category.name)" + :description=" + typeof getTagMessageOrDefault(category.name, 'category') === 'string' + ? getTagMessageOrDefault(category.name, 'category') + : formatMessage(getTagMessageOrDefault(category.name, 'category')) + " :disabled="current.featuredTags.length >= 3 && !current.featuredTags.includes(category)" @update:model-value="toggleFeaturedCategory(category)" >
-
@@ -128,14 +140,17 @@ + + diff --git a/packages/ui/src/components/base/ProjectCard.vue b/packages/ui/src/components/base/ProjectCard.vue index a2dcddd0a..201a1b46a 100644 --- a/packages/ui/src/components/base/ProjectCard.vue +++ b/packages/ui/src/components/base/ProjectCard.vue @@ -69,14 +69,13 @@ + + diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts index ebe2c7901..a0f430b1c 100644 --- a/packages/ui/src/components/base/index.ts +++ b/packages/ui/src/components/base/index.ts @@ -28,6 +28,7 @@ export type { FilterBarOption } from './FilterBar.vue' export { default as FilterBar } from './FilterBar.vue' export { default as FloatingActionBar } from './FloatingActionBar.vue' export { default as FloatingPanel } from './FloatingPanel.vue' +export { default as FormattedTag } from './FormattedTag.vue' export { default as HeadingLink } from './HeadingLink.vue' export { default as HorizontalRule } from './HorizontalRule.vue' export { default as IconSelect } from './IconSelect.vue' diff --git a/packages/ui/src/components/project/NewProjectCard.vue b/packages/ui/src/components/project/NewProjectCard.vue index e7491b084..7e8378bdd 100644 --- a/packages/ui/src/components/project/NewProjectCard.vue +++ b/packages/ui/src/components/project/NewProjectCard.vue @@ -20,7 +20,7 @@ :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) }} + @@ -65,10 +65,10 @@