Skip to content

Commit

Permalink
Make the message for ModLoadingException show a translated (english) …
Browse files Browse the repository at this point in the history
…message. (#147)
  • Loading branch information
shartte authored May 30, 2024
1 parent 47c18ce commit 4307030
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 5 deletions.
35 changes: 32 additions & 3 deletions loader/src/main/java/net/neoforged/fml/ModLoadingException.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
package net.neoforged.fml;

import java.util.List;
import java.util.stream.Collectors;
import net.neoforged.fml.i18n.FMLTranslations;

public class ModLoadingException extends RuntimeException {
private final List<ModLoadingIssue> issues;
Expand All @@ -25,7 +25,36 @@ public List<ModLoadingIssue> getIssues() {

@Override
public String getMessage() {
return "Loading errors encountered: " + this.issues.stream().map(ModLoadingIssue::translationKey)
.collect(Collectors.joining(",\n\t", "[\n\t", "\n]"));
var result = new StringBuilder();
var errors = this.issues.stream().filter(i -> i.severity() == ModLoadingIssue.Severity.ERROR).toList();
if (!errors.isEmpty()) {
result.append("Loading errors encountered:\n");
for (var error : errors) {
appendIssue(error, result);
}
}
var warnings = this.issues.stream().filter(i -> i.severity() == ModLoadingIssue.Severity.WARNING).toList();
if (!warnings.isEmpty()) {
result.append("Loading warnings encountered:\n");
for (var warning : warnings) {
appendIssue(warning, result);
}
}
return result.toString();
}

private void appendIssue(ModLoadingIssue issue, StringBuilder result) {
String translation;
try {
translation = FMLTranslations.stripControlCodes(FMLTranslations.translateIssueEnglish(issue));
} catch (Exception e) {
// Fall back to *something* readable in case the translation fails
translation = issue.toString();
}

// Poor mans indentation
translation = translation.replace("\n", "\n\t ");

result.append("\t- ").append(translation).append("\n");
}
}
14 changes: 12 additions & 2 deletions loader/src/main/java/net/neoforged/fml/i18n/FMLTranslations.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,17 @@ public static String parseFormat(String format, final Object... args) {
return extendedMessageFormat.format(args);
}

public static String translateIssueEnglish(ModLoadingIssue issue) {
var args = getTranslationArgs(issue);
return parseEnglishMessage(issue.translationKey(), args);
}

public static String translateIssue(ModLoadingIssue issue) {
var args = getTranslationArgs(issue);
return parseMessage(issue.translationKey(), args);
}

private static Object[] getTranslationArgs(ModLoadingIssue issue) {
var args = new ArrayList<>(3 + issue.translationArgs().size());

var modInfo = issue.affectedMod();
Expand All @@ -144,13 +154,13 @@ public static String translateIssue(ModLoadingIssue issue) {

args.replaceAll(FMLTranslations::formatArg);

return parseMessage(issue.translationKey(), args.toArray(Object[]::new));
return args.toArray(Object[]::new);
}

private static Object formatArg(Object arg) {
if (arg instanceof Path path) {
var gameDir = FMLLoader.getGamePath();
if (path.startsWith(gameDir)) {
if (gameDir != null && path.startsWith(gameDir)) {
return gameDir.relativize(path).toString();
} else {
return path.toString();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright (c) NeoForged and contributors
* SPDX-License-Identifier: LGPL-2.1-only
*/

package net.neoforged.fml;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.List;
import org.junit.jupiter.api.Test;

class ModLoadingExceptionTest {
@Test
void getMessage() {
var w = ModLoadingIssue.warning("fml.modloading.brokenfile.unknown", "XXXX");
var e1 = ModLoadingIssue.error("fml.modloading.brokenfile", "YYYY");
var e2 = ModLoadingIssue.error("Some untranslated text\nwhich has newlines in it");

var message = new ModLoadingException(List.of(w, e1, e2)).getMessage();
assertEquals("""
Loading errors encountered:
\t- File YYYY is not a valid mod file
\t- Some untranslated text
\t which has newlines in it
Loading warnings encountered:
\t- File XXXX is not a valid mod file
""", message);
}
}

0 comments on commit 4307030

Please sign in to comment.