From d3aa96e617d9eb9301be8ed541e213e06e0bc8dd Mon Sep 17 00:00:00 2001 From: tdgao Date: Mon, 31 Aug 2026 12:42:02 -0600 Subject: [PATCH] fix: nag link overflow --- .../ui/moderation/ModerationProjectNags.vue | 16 ++++++++++++- .../moderation/src/locales/en-US/index.json | 24 ++++++++++++++----- .../src/validation-rules/rules/disclosures.ts | 2 +- .../src/validation-rules/rules/license.ts | 2 +- .../src/validation-rules/rules/links.ts | 10 +++++--- .../src/validation-rules/rules/tags.ts | 2 +- packages/ui/src/utils/common-messages.ts | 4 ++-- packages/ui/src/utils/tag-messages.ts | 8 +++++-- 8 files changed, 51 insertions(+), 17 deletions(-) diff --git a/apps/frontend/src/components/ui/moderation/ModerationProjectNags.vue b/apps/frontend/src/components/ui/moderation/ModerationProjectNags.vue index 73d77c9e4e..9588584bad 100644 --- a/apps/frontend/src/components/ui/moderation/ModerationProjectNags.vue +++ b/apps/frontend/src/components/ui/moderation/ModerationProjectNags.vue @@ -75,7 +75,14 @@ /> {{ getFormattedMessage(nag.title) }} - {{ getNagDescription(nag) }} + + + “”]+)/gi) + .filter(Boolean) + .map((text) => ({ text, isUrl: /^https?:\/\//i.test(text) })) +} + function getFormattedMessage(message: string | MessageDescriptor): string { if (typeof message === 'string') { return message diff --git a/packages/moderation/src/locales/en-US/index.json b/packages/moderation/src/locales/en-US/index.json index 4f294e4d2d..a1df3fead9 100644 --- a/packages/moderation/src/locales/en-US/index.json +++ b/packages/moderation/src/locales/en-US/index.json @@ -36,7 +36,7 @@ "defaultMessage": "Add external links" }, "nags.adjacent-headers.description": { - "defaultMessage": "Headers of the same level cannot be placed next to each other. Combine them or add content between them." + "defaultMessage": "Headers of the same level cannot be placed next to each other." }, "nags.adjacent-headers.title": { "defaultMessage": "Separate adjacent headers" @@ -54,7 +54,7 @@ "defaultMessage": "Select accurate tags" }, "nags.banned-link-usage.description": { - "defaultMessage": "“{url}” is not allowed in project links." + "defaultMessage": "Remove the prohibited external link: “{url}\"" }, "nags.banned-link-usage.title": { "defaultMessage": "Remove prohibited links" @@ -66,7 +66,7 @@ "defaultMessage": "Check content disclosures" }, "nags.description-ends-with-header.description": { - "defaultMessage": "Your description cannot end with a header. Add content below it or remove it." + "defaultMessage": "Your description cannot end with a header." }, "nags.description-ends-with-header.title": { "defaultMessage": "Add content after the final header" @@ -248,6 +248,9 @@ "nags.project-description-banned-link.description": { "defaultMessage": "“{fullUrl}” is not allowed in project descriptions." }, + "nags.project-description-non-english.description": { + "defaultMessage": "Your project description must be written in English or include an English translation." + }, "nags.project-description-non-standard-text.description": { "defaultMessage": "Non-standard text characters, such as “₮ɆӾ₮”, are not allowed." }, @@ -279,11 +282,14 @@ "defaultMessage": "Review the project summary" }, "nags.project-summary-links.description": { - "defaultMessage": "Any links, URLs, or IPs are not allowed in the project summary." + "defaultMessage": "Links, URLs, or IPs are not allowed in the project summary." }, "nags.project-summary-links.title": { "defaultMessage": "Remove links from the summary" }, + "nags.project-summary-non-english.description": { + "defaultMessage": "Your project summary must be written in English or include an English translation." + }, "nags.project-summary-non-standard-text.description": { "defaultMessage": "Non-standard text characters, such as “₮ɆӾ₮”, are not allowed." }, @@ -317,6 +323,12 @@ "nags.select-country.title": { "defaultMessage": "Select a region" }, + "nags.select-environment.description": { + "defaultMessage": "Specify the environment where your project can run." + }, + "nags.select-environment.title": { + "defaultMessage": "Select an environment" + }, "nags.select-language.description": { "defaultMessage": "List the language or languages supported by your server." }, @@ -363,10 +375,10 @@ "defaultMessage": "Visit versions settings" }, "nags.summary-special-formatting.description": { - "defaultMessage": "Your summary cannot not contain Markdown or HTML, as it displays in plain text." + "defaultMessage": "Your summary cannot contain Markdown or HTML, as it displays in plain text." }, "nags.summary-special-formatting.title": { - "defaultMessage": "Clean up the summary" + "defaultMessage": "Remove Markdown and HTML from the summary" }, "nags.summary-too-short.title": { "defaultMessage": "Expand the summary" diff --git a/packages/moderation/src/validation-rules/rules/disclosures.ts b/packages/moderation/src/validation-rules/rules/disclosures.ts index e0a41d9f4e..e9bf326e37 100644 --- a/packages/moderation/src/validation-rules/rules/disclosures.ts +++ b/packages/moderation/src/validation-rules/rules/disclosures.ts @@ -1,5 +1,5 @@ -import { formatProjectTypeSentence } from '@modrinth/ui' import { defineMessages } from '@modrinth/ui/i18n' +import { formatProjectTypeSentence } from '@modrinth/ui/src/utils/common-messages.ts' import type { Nag, ProjectValidationContext } from '../../types/nags.ts' import { evaluateRules } from '../evaluate-rules.ts' diff --git a/packages/moderation/src/validation-rules/rules/license.ts b/packages/moderation/src/validation-rules/rules/license.ts index 8a79f06c77..0ec6907cfd 100644 --- a/packages/moderation/src/validation-rules/rules/license.ts +++ b/packages/moderation/src/validation-rules/rules/license.ts @@ -1,5 +1,5 @@ -import { formatProjectTypeSentence } from '@modrinth/ui' import { defineMessages } from '@modrinth/ui/i18n' +import { formatProjectTypeSentence } from '@modrinth/ui/src/utils/common-messages.ts' import type { Nag, ProjectValidationContext } from '../../types/nags.ts' import { getLinkHostname, isInappropriateLicenseLink } from '../../validators/links/index.ts' diff --git a/packages/moderation/src/validation-rules/rules/links.ts b/packages/moderation/src/validation-rules/rules/links.ts index e599d512ca..d976550190 100644 --- a/packages/moderation/src/validation-rules/rules/links.ts +++ b/packages/moderation/src/validation-rules/rules/links.ts @@ -1,5 +1,5 @@ -import { formatProjectTypeSentence } from '@modrinth/ui' import { defineMessages } from '@modrinth/ui/i18n' +import { formatProjectTypeSentence } from '@modrinth/ui/src/utils/common-messages.ts' import type { Nag, ProjectValidationContext } from '../../types/nags.ts' import { licenseRequiresSource, notSourceAsDistributed } from '../../utils.ts' @@ -64,7 +64,7 @@ const messages = defineMessages({ }, removeBannedLinksDescription: { id: 'nags.banned-link-usage.description', - defaultMessage: '“{url}” is not allowed in project links.', + defaultMessage: 'Remove the prohibited external link: “{url}"', }, provideSource: { id: 'nags.gpl-license-source-required.title', @@ -190,7 +190,11 @@ export const projectLinksValidationRules = { }, presentation: { message: messages.removeBannedLinksDescription, - nag: { title: messages.removeBannedLinks }, + nag: { + title: messages.removeBannedLinks, + destination: 'links', + linkTitle: messages.visitLinks, + }, }, }, 'gpl-license-source-required': { diff --git a/packages/moderation/src/validation-rules/rules/tags.ts b/packages/moderation/src/validation-rules/rules/tags.ts index 40a0ca5da8..87c22a1961 100644 --- a/packages/moderation/src/validation-rules/rules/tags.ts +++ b/packages/moderation/src/validation-rules/rules/tags.ts @@ -1,5 +1,5 @@ import type { Labrinth } from '@modrinth/api-client' -import { formatCategory } from '@modrinth/ui' +import { formatCategory } from '@modrinth/ui/src/utils/tag-messages.ts' import { defineMessages } from '@modrinth/ui/i18n' import type { Nag, ProjectValidationContext } from '../../types/nags.ts' diff --git a/packages/ui/src/utils/common-messages.ts b/packages/ui/src/utils/common-messages.ts index 314863039e..24be12f31c 100644 --- a/packages/ui/src/utils/common-messages.ts +++ b/packages/ui/src/utils/common-messages.ts @@ -1,7 +1,7 @@ import type { Labrinth } from '@modrinth/api-client' -import { capitalizeString } from '@modrinth/utils' +import { capitalizeString } from '@modrinth/utils/utils.ts' -import { defineMessage, defineMessages, type MessageDescriptor } from '../composables/i18n' +import { defineMessage, defineMessages, type MessageDescriptor } from '../composables/i18n.ts' export const commonMessages = defineMessages({ acceptButton: { diff --git a/packages/ui/src/utils/tag-messages.ts b/packages/ui/src/utils/tag-messages.ts index 9833b1f3d5..26753bcb16 100644 --- a/packages/ui/src/utils/tag-messages.ts +++ b/packages/ui/src/utils/tag-messages.ts @@ -1,6 +1,10 @@ -import { capitalizeString } from '@modrinth/utils' +import { capitalizeString } from '@modrinth/utils/utils.ts' -import { defineMessages, type MessageDescriptor, type VIntlFormatters } from '../composables/i18n' +import { + defineMessages, + type MessageDescriptor, + type VIntlFormatters, +} from '../composables/i18n.ts' export const loaderMessages = defineMessages({ babric: {