diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/html/Contributors.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/html/Contributors.java
index c51efb0a2..b4d297cf0 100644
--- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/html/Contributors.java
+++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/html/Contributors.java
@@ -62,7 +62,8 @@ public class Contributors {
new Contributor("TDJisvan", LANG),
new Contributor("Vankka", CODE),
new Contributor("yukieji", LANG),
- new Contributor("qsefthuopq", LANG)
+ new Contributor("qsefthuopq", LANG),
+ new Contributor("Karlatemp", CODE, LANG)
};
int estimatedLength = contributors.length * 40 + 50;
StringBuilder html = new StringBuilder(estimatedLength);
diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseFactory.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseFactory.java
index d6dffa028..1ced9dfc2 100644
--- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseFactory.java
+++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseFactory.java
@@ -175,7 +175,11 @@ public class ResponseFactory {
try {
String content = UnaryChain.of(getResource(fileName).asString())
.chain(theme::replaceThemeColors)
- .chain(locale::replaceLanguageInJavascript)
+ .chain(resource -> {
+ if (fileName.startsWith("vendor/") || fileName.startsWith("/vendor/"))
+ return resource;
+ return locale.replaceLanguageInJavascript(resource);
+ })
.apply();
return Response.builder()
.setMimeType(MimeType.JS)
diff --git a/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/TranslatedString.java b/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/TranslatedString.java
index c3276d6c1..d0150fefb 100644
--- a/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/TranslatedString.java
+++ b/Plan/common/src/main/java/com/djrapitops/plan/settings/locale/TranslatedString.java
@@ -18,6 +18,11 @@ package com.djrapitops.plan.settings.locale;
import org.apache.commons.lang3.StringUtils;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
/**
* Utility for translating String.
*
@@ -27,23 +32,100 @@ import org.apache.commons.lang3.StringUtils;
* @author Rsl1122
*/
class TranslatedString {
+ private static final Pattern LINK_MATCHER = Pattern.compile("http(s|)://[\\w.\\-_%/?$#@!()&=]+");
- private String translating;
+ private final List translating = new LinkedList<>();
TranslatedString(String translating) {
- this.translating = translating;
+ final Matcher matcher = LINK_MATCHER.matcher(translating);
+ int start = 0;
+ while (matcher.find()) {
+ String link = translating.substring(matcher.start(), matcher.end());
+ String prev = translating.substring(start, matcher.start());
+ if (!prev.isEmpty()) {
+ this.translating.add(new Translatable(prev));
+ }
+ start = matcher.end();
+ this.translating.add(new LockedString(link));
+ }
+ String remaining = translating.substring(start);
+ if (!remaining.isEmpty()) {
+ this.translating.add(new Translatable(remaining));
+ }
+ }
+
+ TranslatedString() {
}
public void translate(String replace, String with) {
- translating = StringUtils.replace(translating, replace, with);
+ for (TranslatedString sub : translating) {
+ sub.translate(replace, with);
+ }
}
@Override
public String toString() {
- return translating;
+ StringBuilder builder = new StringBuilder();
+ toString(builder);
+ return builder.toString();
+ }
+
+ public void toString(StringBuilder builder) {
+ for (TranslatedString sub : translating) {
+ sub.toString(builder);
+ }
}
public int length() {
- return translating.length();
+ int length = 0;
+ for (TranslatedString sub : translating) {
+ length += sub.length();
+ }
+ return length;
+ }
+
+ static class Translatable extends TranslatedString {
+
+ private String translating;
+
+ Translatable(String translating) {
+ this.translating = translating;
+ }
+
+ public void translate(String replace, String with) {
+ translating = StringUtils.replace(translating, replace, with);
+ }
+
+ @Override
+ public void toString(StringBuilder builder) {
+ builder.append(translating);
+ }
+
+ @Override
+ public int length() {
+ return translating.length();
+ }
+ }
+
+ static class LockedString extends TranslatedString {
+ final String text;
+
+ LockedString(String text) {
+ this.text = text;
+ }
+
+ @Override
+ public void translate(String replace, String with) {
+ }
+
+ @Override
+ public void toString(StringBuilder builder) {
+ builder.append(text);
+ }
+
+ @Override
+ public int length() {
+ return text.length();
+ }
}
}
\ No newline at end of file
diff --git a/Plan/common/src/main/resources/assets/plan/locale/locale_CN.txt b/Plan/common/src/main/resources/assets/plan/locale/locale_CN.txt
index d68608c36..8af46a4ab 100644
--- a/Plan/common/src/main/resources/assets/plan/locale/locale_CN.txt
+++ b/Plan/common/src/main/resources/assets/plan/locale/locale_CN.txt
@@ -213,7 +213,7 @@ HTML - SIDE_SERVERS_TITLE || 服务器
HTML - SIDE_SESSIONS || 时域
HTML - SIDE_TO_MAIN_PAGE || 到主页面
HTML - TEXT_CLICK_TO_EXPAND || 点击拓展
-HTML - TEXT_CONTRIBUTORS_CODE || 码农
+HTML - TEXT_CONTRIBUTORS_CODE || 开发者
HTML - TEXT_CONTRIBUTORS_LOCALE || 译者
HTML - TEXT_CONTRIBUTORS_MONEY || 特别感谢那些在经济上支持该插件发展的人.
HTML - TEXT_CONTRIBUTORS_THANKS || 另外以下 awesome people 也为该插件作出了贡献:
diff --git a/Plan/common/src/main/resources/assets/plan/web/error.html b/Plan/common/src/main/resources/assets/plan/web/error.html
index fdfe4d097..107c7634f 100644
--- a/Plan/common/src/main/resources/assets/plan/web/error.html
+++ b/Plan/common/src/main/resources/assets/plan/web/error.html
@@ -179,9 +179,7 @@
v3.0
Plan
- Wiki,
- Tutorials & Documentation
+ rel="noopener noreferrer" target="_blank"> Plan Wiki, Tutorials & Documentation
Report Issues
Plan Wiki,
- Tutorials & Documentation
+ rel="noopener noreferrer" target="_blank"> Plan Wiki, Tutorials & Documentation
Report Issues
Plan
- Wiki,
- Tutorials & Documentation
+ rel="noopener noreferrer" target="_blank"> Plan Wiki, Tutorials & Documentation
Report Issues
Plan
- Wiki,
- Tutorials & Documentation
+ rel="noopener noreferrer" target="_blank"> Plan Wiki, Tutorials & Documentation
Report Issues
Plan
- Wiki,
- Tutorials & Documentation
+ rel="noopener noreferrer" target="_blank"> Plan Wiki, Tutorials & Documentation
Report Issues