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: {