diff --git a/HMCL/image/ShulkerSakura.jpg b/HMCL/image/ShulkerSakura.jpg new file mode 100644 index 000000000..169abe168 Binary files /dev/null and b/HMCL/image/ShulkerSakura.jpg differ diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/HMCLAccounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/HMCLAccounts.java deleted file mode 100644 index b4ea2eb77..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/HMCLAccounts.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.setting; - -import com.google.gson.annotations.SerializedName; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import org.jackhuang.hmcl.auth.OAuth; -import org.jackhuang.hmcl.task.Schedulers; -import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.gson.JsonUtils; -import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; -import org.jackhuang.hmcl.util.io.HttpRequest; -import org.jackhuang.hmcl.util.io.NetworkUtils; - -import java.util.UUID; - -import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.Pair.pair; - -public final class HMCLAccounts { - - private static final ObjectProperty account = new SimpleObjectProperty<>(); - - private HMCLAccounts() { - } - - public static HMCLAccount getAccount() { - return account.get(); - } - - public static ObjectProperty accountProperty() { - return account; - } - - public static void setAccount(HMCLAccount account) { - HMCLAccounts.account.set(account); - } - - public static Task login() { - String nonce = UUIDTypeAdapter.fromUUID(UUID.randomUUID()); - String scope = "openid offline_access"; - - return Task.supplyAsync(() -> { - OAuth.Session session = Accounts.OAUTH_CALLBACK.startServer(); - Accounts.OAUTH_CALLBACK.openBrowser(NetworkUtils.withQuery( - "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", - mapOf( - pair("client_id", Accounts.OAUTH_CALLBACK.getClientId()), - pair("response_type", "id_token code"), - pair("response_mode", "form_post"), - pair("scope", scope), - pair("redirect_uri", session.getRedirectURI()), - pair("nonce", nonce) - ))); - String code = session.waitFor(); - - // Authorization Code -> Token - String responseText = HttpRequest.POST("https://login.microsoftonline.com/common/oauth2/v2.0/token") - .form(mapOf(pair("client_id", Accounts.OAUTH_CALLBACK.getClientId()), pair("code", code), - pair("grant_type", "authorization_code"), pair("client_secret", Accounts.OAUTH_CALLBACK.getClientSecret()), - pair("redirect_uri", session.getRedirectURI()), pair("scope", scope))) - .getString(); - OAuth.AuthorizationResponse response = JsonUtils.fromNonNullJson(responseText, - OAuth.AuthorizationResponse.class); - - HMCLAccountProfile profile = HttpRequest.GET("https://hmcl.huangyuhui.net/api/user") - .header("Token-Type", response.tokenType) - .header("Access-Token", response.accessToken) - .header("Authorization-Provider", "microsoft") - .authorization("Bearer", session.getIdToken()) - .getJson(HMCLAccountProfile.class); - - return new HMCLAccount("microsoft", profile.nickname, profile.email, profile.role, session.getIdToken(), response.tokenType, response.accessToken, response.refreshToken); - }).thenAcceptAsync(Schedulers.javafx(), account -> { - setAccount(account); - }); - } - - public static class HMCLAccount implements HttpRequest.Authorization { - private final String provider; - private final String nickname; - private final String email; - private final String role; - private final String idToken; - private final String tokenType; - private final String accessToken; - private final String refreshToken; - - public HMCLAccount(String provider, String nickname, String email, String role, String idToken, String tokenType, String accessToken, String refreshToken) { - this.provider = provider; - this.nickname = nickname; - this.email = email; - this.role = role; - this.idToken = idToken; - this.tokenType = tokenType; - this.accessToken = accessToken; - this.refreshToken = refreshToken; - } - - public String getProvider() { - return provider; - } - - public String getNickname() { - return nickname; - } - - public String getEmail() { - return email; - } - - public String getRole() { - return role; - } - - public String getIdToken() { - return idToken; - } - - @Override - public String getTokenType() { - return tokenType; - } - - @Override - public String getAccessToken() { - return accessToken; - } - - public String getRefreshToken() { - return refreshToken; - } - } - - private static class HMCLAccountProfile { - @SerializedName("ID") - String id; - @SerializedName("Provider") - String provider; - @SerializedName("Email") - String email; - @SerializedName("NickName") - String nickname; - @SerializedName("Role") - String role; - } - -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index c1aec271c..df64048e2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -41,6 +41,7 @@ import org.jackhuang.hmcl.download.quilt.QuiltAPIRemoteVersion; import org.jackhuang.hmcl.download.quilt.QuiltRemoteVersion; import org.jackhuang.hmcl.setting.Theme; import org.jackhuang.hmcl.setting.VersionIconType; +import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionPane; @@ -51,7 +52,6 @@ import org.jackhuang.hmcl.ui.construct.RipplerContainer; import org.jackhuang.hmcl.ui.wizard.Navigation; import org.jackhuang.hmcl.ui.wizard.Refreshable; import org.jackhuang.hmcl.ui.wizard.WizardPage; -import org.jackhuang.hmcl.util.HMCLService; import org.jackhuang.hmcl.util.Holder; import java.util.List; @@ -263,7 +263,7 @@ public final class VersionsPage extends BorderPane implements WizardPage, Refres private void onBack() { navigation.onPrev(true); } private void onSponsor() { - HMCLService.openRedirectLink("bmclapi_sponsor"); + FXUtils.openLink("https://bmclapidoc.bangbang93.com"); } private static class RemoteVersionListCell extends ListCell { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java index af5829d44..f811efdd9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java @@ -179,7 +179,7 @@ public final class ModpackInfoPage extends Control implements WizardPage { if (skinnable.controller.getSettings().get(MODPACK_TYPE) == MODPACK_TYPE_SERVER) { Hyperlink hyperlink = new Hyperlink(i18n("modpack.wizard.step.initialization.server")); hyperlink.setOnMouseClicked(e -> { - FXUtils.openLink("https://hmcl.huangyuhui.net/api/redirect/server-modpack"); + FXUtils.openLink("https://docs.hmcl.net/modpack/serverpack.htm"); }); borderPane.setTop(hyperlink); } else { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java index 33c0f9e9c..c90a6f587 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/AboutPage.java @@ -80,6 +80,18 @@ public class AboutPage extends StackPane { zkitefly.setSubtitle(i18n("about.thanks_to.zkitefly.statement")); zkitefly.setExternalLink("https://github.com/zkitefly"); + IconedTwoLineListItem burningtnt = new IconedTwoLineListItem(); + burningtnt.setImage(FXUtils.newBuiltinImage("/assets/img/burningtnt.png")); + burningtnt.setTitle("Burning_TNT"); + burningtnt.setSubtitle(i18n("about.thanks_to.burningtnt.statement")); + burningtnt.setExternalLink("https://github.com/burningtnt"); + + IconedTwoLineListItem shulkerSakura = new IconedTwoLineListItem(); + shulkerSakura.setTitle("ShulkerSakura"); + shulkerSakura.setImage(FXUtils.newBuiltinImage("/assets/img/ShulkerSakura.png")); + shulkerSakura.setSubtitle(i18n("about.thanks_to.shulkersakura.statement")); + shulkerSakura.setExternalLink("https://github.com/ShulkerSakura"); + IconedTwoLineListItem gamerteam = new IconedTwoLineListItem(); gamerteam.setTitle("gamerteam"); gamerteam.setImage(FXUtils.newBuiltinImage("/assets/img/gamerteam.png")); @@ -91,12 +103,6 @@ public class AboutPage extends StackPane { redLnn.setImage(FXUtils.newBuiltinImage("/assets/img/red_lnn.png")); redLnn.setSubtitle(i18n("about.thanks_to.red_lnn.statement")); - // IconedTwoLineListItem mcbbs = new IconedTwoLineListItem(); - // mcbbs.setImage(FXUtils.newBuiltinImage("/assets/img/chest.png")); - // mcbbs.setTitle(i18n("about.thanks_to.mcbbs")); - // mcbbs.setSubtitle(i18n("about.thanks_to.mcbbs.statement")); - // mcbbs.setExternalLink("https://www.mcbbs.net/"); - IconedTwoLineListItem mcmod = new IconedTwoLineListItem(); mcmod.setImage(FXUtils.newBuiltinImage("/assets/img/mcmod.png")); mcmod.setTitle(i18n("about.thanks_to.mcmod")); @@ -113,9 +119,9 @@ public class AboutPage extends StackPane { users.setImage(FXUtils.newBuiltinImage("/assets/img/icon.png")); users.setTitle(i18n("about.thanks_to.users")); users.setSubtitle(i18n("about.thanks_to.users.statement")); - users.setExternalLink("https://hmcl.huangyuhui.net/api/redirect/sponsor"); + users.setExternalLink("https://docs.hmcl.net/groups.html"); - thanks.getContent().setAll(yushijinhun, bangbang93, glavo, zekerzhayard, zkitefly, /* mcbbs, */ mcmod, gamerteam, redLnn, contributors, users); + thanks.getContent().setAll(yushijinhun, bangbang93, glavo, zekerzhayard, zkitefly, burningtnt, mcmod, shulkerSakura, gamerteam, redLnn, contributors, users); } ComponentList dep = new ComponentList(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java index b53470944..91b1f7951 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SettingsPage.java @@ -144,7 +144,7 @@ public final class SettingsPage extends SettingsView { @Override protected void onSponsor() { - FXUtils.openLink("https://hmcl.huangyuhui.net/api/redirect/sponsor"); + FXUtils.openLink("https://github.com/HMCL-dev/HMCL"); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java deleted file mode 100644 index ea21757c6..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/main/SponsorPage.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.ui.main; - -import com.google.gson.annotations.SerializedName; -import com.google.gson.reflect.TypeToken; -import com.jfoenix.controls.JFXListCell; -import com.jfoenix.controls.JFXListView; -import javafx.geometry.Insets; -import javafx.geometry.VPos; -import javafx.scene.Cursor; -import javafx.scene.control.Label; -import javafx.scene.layout.*; -import javafx.scene.text.TextAlignment; -import org.jackhuang.hmcl.task.Schedulers; -import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.ui.FXUtils; -import org.jackhuang.hmcl.util.Holder; -import org.jackhuang.hmcl.util.io.HttpRequest; - -import java.math.BigDecimal; -import java.time.Instant; -import java.util.List; - -import static org.jackhuang.hmcl.util.i18n.I18n.i18n; - -public class SponsorPage extends StackPane { - private final JFXListView listView; - - public SponsorPage() { - VBox content = new VBox(); - content.setPadding(new Insets(10)); - content.setSpacing(10); - content.setFillWidth(true); - - { - StackPane sponsorPane = new StackPane(); - sponsorPane.getStyleClass().add("card"); - sponsorPane.setCursor(Cursor.HAND); - sponsorPane.setOnMouseClicked(e -> onSponsor()); - - GridPane gridPane = new GridPane(); - - ColumnConstraints col = new ColumnConstraints(); - col.setHgrow(Priority.SOMETIMES); - col.setMaxWidth(Double.POSITIVE_INFINITY); - - gridPane.getColumnConstraints().setAll(col); - - RowConstraints row = new RowConstraints(); - row.setMinHeight(Double.NEGATIVE_INFINITY); - row.setValignment(VPos.TOP); - row.setVgrow(Priority.SOMETIMES); - gridPane.getRowConstraints().setAll(row); - - { - Label label = new Label(i18n("sponsor.hmcl")); - label.setWrapText(true); - label.setTextAlignment(TextAlignment.JUSTIFY); - GridPane.setRowIndex(label, 0); - GridPane.setColumnIndex(label, 0); - gridPane.getChildren().add(label); - } - - sponsorPane.getChildren().setAll(gridPane); - content.getChildren().add(sponsorPane); - } - - { - StackPane pane = new StackPane(); - pane.getStyleClass().add("card"); - listView = new JFXListView<>(); - Holder lastCell = new Holder<>(); - listView.setCellFactory((listView) -> new JFXListCell() { - @Override - public void updateItem(Sponsor item, boolean empty) { - super.updateItem(item, empty); - - // https://mail.openjdk.org/pipermail/openjfx-dev/2022-July/034764.html - if (this == lastCell.value && !isVisible()) - return; - lastCell.value = this; - - if (!empty) { - setText(item.getName()); - setGraphic(null); - } - } - }); - VBox.setVgrow(pane, Priority.ALWAYS); - pane.getChildren().setAll(listView); - content.getChildren().add(pane); - } - - loadSponsorList(); - - getChildren().setAll(content); - } - - private void onSponsor() { - FXUtils.openLink("https://hmcl.huangyuhui.net/api/redirect/sponsor"); - } - - private void loadSponsorList() { - Task.>supplyAsync(() -> HttpRequest.GET("https://hmcl.huangyuhui.net/api/sponsor").getJson(new TypeToken>() { - }.getType())).thenAcceptAsync(Schedulers.javafx(), sponsors -> { - listView.getItems().setAll(sponsors); - }).start(); - } - - private static class Sponsor { - @SerializedName("name") - private final String name; - - @SerializedName("create_time") - private final Instant createTime; - - @SerializedName("money") - private final BigDecimal money; - - @SerializedName("contact") - private final String contact; - - @SerializedName("afdian_id") - private final String afdianId; - - public Sponsor() { - this("", Instant.now(), BigDecimal.ZERO, "", ""); - } - - public Sponsor(String name, Instant createTime, BigDecimal money, String contact, String afdianId) { - this.name = name; - this.createTime = createTime; - this.money = money; - this.contact = contact; - this.afdianId = afdianId; - } - - public String getName() { - return name; - } - - public Instant getCreateTime() { - return createTime; - } - - public BigDecimal getMoney() { - return money; - } - - public String getContact() { - return contact; - } - - public String getAfdianId() { - return afdianId; - } - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLService.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLService.java deleted file mode 100644 index 06da73378..000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/HMCLService.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.util; - -import org.jackhuang.hmcl.ui.FXUtils; - -public final class HMCLService { - private HMCLService() { - } - - public static void openRedirectLink(String id) { - FXUtils.openLink("https://hmcl.huangyuhui.net/api/redirect/" + id); - } -} diff --git a/HMCL/src/main/resources/assets/img/ShulkerSakura.png b/HMCL/src/main/resources/assets/img/ShulkerSakura.png new file mode 100644 index 000000000..14caa77ab Binary files /dev/null and b/HMCL/src/main/resources/assets/img/ShulkerSakura.png differ diff --git a/HMCL/src/main/resources/assets/img/ShulkerSakura@2x.png b/HMCL/src/main/resources/assets/img/ShulkerSakura@2x.png new file mode 100644 index 000000000..6a10e7cef Binary files /dev/null and b/HMCL/src/main/resources/assets/img/ShulkerSakura@2x.png differ diff --git a/HMCL/src/main/resources/assets/img/burningtnt.png b/HMCL/src/main/resources/assets/img/burningtnt.png new file mode 100644 index 000000000..06c273fcd Binary files /dev/null and b/HMCL/src/main/resources/assets/img/burningtnt.png differ diff --git a/HMCL/src/main/resources/assets/img/burningtnt@2x.png b/HMCL/src/main/resources/assets/img/burningtnt@2x.png new file mode 100644 index 000000000..834690083 Binary files /dev/null and b/HMCL/src/main/resources/assets/img/burningtnt@2x.png differ diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 417eb5af7..d500630f9 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -30,17 +30,19 @@ about.dependency=Third-party Libraries about.legal=Legal Acknowledgement about.thanks_to=Thanks to about.thanks_to.bangbang93.statement=For providing BMCLAPI download API, please consider donating. +about.thanks_to.burningtnt.statement=Contribute a lot of technical support to HMCL. about.thanks_to.contributors=All contributors on GitHub about.thanks_to.contributors.statement=Without the awesome open-source community, Hello Minecraft! Launcher would not make it so far. about.thanks_to.gamerteam.statement=For providing the default background image. -about.thanks_to.glavo.statement=Contribute a lot of technical support to HMCL. +about.thanks_to.glavo.statement=Responsible for maintaining HMCL. about.thanks_to.zekerzhayard.statement=Contribute a lot of technical support to HMCL. -about.thanks_to.zkitefly.statement=Contribute a lot of technical support to HMCL. +about.thanks_to.zkitefly.statement=Responsible for maintaining documentation of HMCL. about.thanks_to.mcbbs=MCBBS (Minecraft Chinese Forum) about.thanks_to.mcbbs.statement=For providing mcbbs.net download mirror for Mainland China users. about.thanks_to.mcmod=mcmod.cn about.thanks_to.mcmod.statement=For providing Chinese translations and wiki for various mods. about.thanks_to.red_lnn.statement=For providing the default background image. +about.thanks_to.shulkersakura.statement=For providing the icon for HMCL about.thanks_to.users=HMCL User Group Members about.thanks_to.users.statement=Thanks for donations, bug reports, and so on. about.thanks_to.yushijinhun.statement=For providing authlib-injector related support. @@ -1162,7 +1164,7 @@ settings.type.special.edit.hint=Current instance [%s] has enabled per-instance s sponsor=Donators sponsor.bmclapi=Downloads are provided by BMCLAPI. Click here for more information. -sponsor.hmcl=Hello Minecraft! Launcher is a FOSS Minecraft launcher which allows users to manage multiple Minecraft instances easily. You can donate to us on Afdian to support our file hosting and project development. Click here for more information. +sponsor.hmcl=Hello Minecraft! Launcher is a FOSS Minecraft launcher which allows users to manage multiple Minecraft instances easily. Click here for more information. system.architecture=Architecture system.operating_system=Operating System diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index b85bb51b0..38d3bf2b0 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -28,17 +28,19 @@ about.dependency=相依元件 about.legal=法律聲明 about.thanks_to=鳴謝 about.thanks_to.bangbang93.statement=提供 BMCLAPI 下載地點。請贊助支持 BMCLAPI! +about.thanks_to.burningtnt.statement=為 HMCL 貢獻許多技術支持 about.thanks_to.contributors=所有通過 Issues、Pull Requests 等管道參與本項目的貢獻者 about.thanks_to.contributors.statement=沒有開源社區的支持,Hello Minecraft! Launcher 無法走到今天 about.thanks_to.gamerteam.statement=提供預設背景圖 -about.thanks_to.glavo.statement=為 HMCL 貢獻許多技術支持 +about.thanks_to.glavo.statement=負責 HMCL 的日常維護 about.thanks_to.zekerzhayard.statement=為 HMCL 貢獻許多技術支持 -about.thanks_to.zkitefly.statement=為 HMCL 貢獻許多技術支持 +about.thanks_to.zkitefly.statement=負責維護 HMCL 的文檔 about.thanks_to.mcbbs=MCBBS 我的世界中文論壇 about.thanks_to.mcbbs.statement=提供 MCBBS 下載地點 about.thanks_to.mcmod=MC 百科 about.thanks_to.mcmod.statement=提供 Mod 中文名映射表與 Mod 百科 about.thanks_to.red_lnn.statement=提供預設背景圖 +about.thanks_to.shulkersakura.statement=提供 HMCL 的圖標 about.thanks_to.users=HMCL 用戶群成員 about.thanks_to.users.statement=感謝用戶群成員贊助充電、積極催更、迴響問題、出謀劃策 about.thanks_to.yushijinhun.statement=authlib-injector 相关支援 @@ -1028,7 +1030,7 @@ settings.type.special.edit.hint=當前遊戲版本 %s 啟動了遊戲特定設 sponsor=贊助 sponsor.bmclapi=大中華區下載源由 BMCLAPI 提供高速下載服務 -sponsor.hmcl=Hello Minecraft! Launcher 是一個免費、開源的 Minecraft 啟動器,允許玩家方便快捷地安裝、管理、執行遊戲。您的贊助將幫助 Hello Minecraft! Launcher 獲得更好的發展、支援穩定高速的遊戲安裝與檔案下載服務。點選此處查閱更多詳細訊息。 +sponsor.hmcl=Hello Minecraft! Launcher 是一個免費、開源的 Minecraft 啟動器,允許玩家方便快捷地安裝、管理、執行遊戲。點選此處查閱更多詳細訊息。 system.architecture=架構 system.operating_system=操作系統 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 9aeae86be..ce5d00afa 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -28,17 +28,19 @@ about.dependency=依赖 about.legal=法律声明 about.thanks_to=鸣谢 about.thanks_to.bangbang93.statement=提供 BMCLAPI 下载源。请赞助支持 BMCLAPI! +about.thanks_to.burningtnt.statement=为 HMCL 贡献许多技术支持 about.thanks_to.contributors=所有通过 Issues、Pull Requests 等方式参与本项目的贡献者 about.thanks_to.contributors.statement=没有开源社区的支持,Hello Minecraft! Launcher 就无法走到今天 about.thanks_to.gamerteam.statement=提供默认背景图 -about.thanks_to.glavo.statement=为 HMCL 贡献许多技术支持 +about.thanks_to.glavo.statement=负责 HMCL 的日常维护 about.thanks_to.zekerzhayard.statement=为 HMCL 贡献许多技术支持 -about.thanks_to.zkitefly.statement=为 HMCL 贡献许多技术支持 +about.thanks_to.zkitefly.statement=负责维护 HMCL 的文档 about.thanks_to.mcbbs=MCBBS 我的世界中文论坛 about.thanks_to.mcbbs.statement=提供 MCBBS 下载源 about.thanks_to.mcmod=MC 百科 about.thanks_to.mcmod.statement=提供模组中文名映射表与 Mod 百科 about.thanks_to.red_lnn.statement=提供默认背景图 +about.thanks_to.shulkersakura.statement=提供 HMCL 的图标 about.thanks_to.users=HMCL 用户群成员 about.thanks_to.users.statement=感谢用户群成员赞助充电、积极催更、反馈问题、出谋划策 about.thanks_to.yushijinhun.statement=authlib-injector 相关支持 @@ -1036,7 +1038,7 @@ settings.type.special.edit.hint=当前游戏版本 %s 启用了游戏特定设 sponsor=赞助 sponsor.bmclapi=国内下载源由 BMCLAPI 提供高速下载服务。BMCLAPI 为公益服务,赞助 BMCLAPI 可以帮助作者更好的提供稳定高速的下载服务,[点击此处查阅详细信息] -sponsor.hmcl=Hello Minecraft! Launcher 是一个免费、自由、开放源代码的 Minecraft 启动器。您的赞助将帮助 Hello Minecraft! Launcher 获得更好的发展,还可以获得 HMCL 的开发进展。[点击此处查阅更多详细信息] +sponsor.hmcl=Hello Minecraft! Launcher 是一个免费、自由、开放源代码的 Minecraft 启动器。[点击此处查阅更多详细信息] system.architecture=架构 system.operating_system=操作系统