diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java index f4c0f9d1b..e916589ac 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/Main.java @@ -25,6 +25,7 @@ import java.net.PasswordAuthentication; import java.security.GeneralSecurityException; import java.security.cert.X509Certificate; import java.text.ParseException; +import java.util.Locale; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -46,6 +47,7 @@ import org.jackhuang.hellominecraft.launcher.ui.MainFrame; import org.jackhuang.hellominecraft.lookandfeel.HelloMinecraftLookAndFeel; import org.jackhuang.hellominecraft.util.MathUtils; import org.jackhuang.hellominecraft.util.StrUtils; +import org.jackhuang.hellominecraft.util.SupportedLocales; import org.jackhuang.hellominecraft.util.VersionNumber; /** @@ -134,6 +136,13 @@ public final class Main implements Runnable { HMCLog.log("*** " + Main.makeTitle() + " ***"); + String s = Settings.getInstance().getLocalization(); + for (SupportedLocales sl : SupportedLocales.values()) + if (sl.name().equals(s)) { + SupportedLocales.NOW_LOCALE = sl; + Locale.setDefault(sl.self); + } + LogWindow.INSTANCE.clean(); LogWindow.INSTANCE.setTerminateGame(GameLauncher.PROCESS_MANAGER::stopAllProcesses); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index 0f0a24e04..d61651726 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -25,9 +25,9 @@ import org.jackhuang.hellominecraft.util.C; */ public enum DownloadType { - Mojang(C.i18n("download.mojang"), new MojangDownloadProvider()), - BMCL(C.i18n("download.BMCL"), new BMCLAPIDownloadProvider()), - RapidData(C.i18n("download.rapid_data"), new RapidDataDownloadProvider()), + Mojang("download.mojang", new MojangDownloadProvider()), + BMCL("download.BMCL", new BMCLAPIDownloadProvider()), + RapidData("download.rapid_data", new RapidDataDownloadProvider()), Curse("Curse CDN", new CurseDownloadProvider()); private final String name; @@ -43,7 +43,7 @@ public enum DownloadType { } public String getName() { - return name; + return C.i18n(name); } private static DownloadType suggestedDownloadType = Mojang; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java index 11024aea9..ab4f27281 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java @@ -54,6 +54,8 @@ public final class Config { private int theme; @SerializedName("java") private List java; + @SerializedName("localization") + private String localization; public List getJava() { return java == null ? java = new ArrayList<>() : java; @@ -226,4 +228,13 @@ public final class Config { this.proxyPassword = proxyPassword; Settings.save(); } + + public String getLocalization() { + return localization; + } + + public void setLocalization(String localization) { + this.localization = localization; + Settings.save(); + } } diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java index 9909c9071..c7729e323 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Settings.java @@ -27,13 +27,11 @@ import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.launcher.Main; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.util.CollectionUtils; -import org.jackhuang.hellominecraft.util.Event; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.UpdateChecker; import org.jackhuang.hellominecraft.util.VersionNumber; -import org.jackhuang.hellominecraft.util.func.Predicate; /** * @@ -87,10 +85,6 @@ public final class Settings { HMCLog.log("Initialized settings."); } catch (IOException | JsonSyntaxException e) { HMCLog.warn("Something happened wrongly when load settings.", e); - if (MessageBox.Show(C.i18n("settings.failed_load"), MessageBox.YES_NO_OPTION) == MessageBox.NO_OPTION) { - HMCLog.err("Cancelled loading settings."); - System.exit(1); - } } else HMCLog.log("No settings file here, may be first loading."); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.form index fff84e948..b3c03362e 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.form @@ -42,7 +42,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -75,7 +75,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java index 30b01fe44..02134b36a 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameDownloadPanel.java @@ -61,7 +61,7 @@ public class GameDownloadPanel extends AnimatedPanel implements Selectable { } }); - lstDownloads.setModel(SwingUtils.makeDefaultTableModel(new String[]{C.I18N.getString("install.version"), C.I18N.getString("install.time"), C.I18N.getString("install.type")},new Class[]{String.class, String.class, String.class}, new boolean[]{false, false, false})); + lstDownloads.setModel(SwingUtils.makeDefaultTableModel(new String[]{C.i18n("install.version"), C.i18n("install.time"), C.i18n("install.type")},new Class[]{String.class, String.class, String.class}, new boolean[]{false, false, false})); lstDownloads.setToolTipText(""); lstDownloads.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane2.setViewportView(lstDownloads); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form index 46881e26b..67af828f8 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.form @@ -23,18 +23,7 @@ - - - - - - - - - - - - + @@ -42,13 +31,8 @@ - - - - - - - + + @@ -72,7 +56,7 @@ - + @@ -87,13 +71,6 @@ - - - - - - - @@ -104,7 +81,6 @@ - @@ -112,7 +88,7 @@ - + @@ -132,8 +108,14 @@ + + + + + + @@ -179,11 +161,10 @@ - + - - + @@ -283,7 +264,7 @@ - + @@ -307,7 +288,7 @@ - + @@ -344,24 +325,14 @@ - + - + - - - - - - - - - - - + @@ -372,7 +343,7 @@ - + @@ -446,7 +417,7 @@ - + @@ -561,7 +532,7 @@ - + @@ -590,7 +561,7 @@ - + @@ -599,7 +570,7 @@ - + @@ -616,7 +587,7 @@ - + @@ -695,7 +666,7 @@ - + @@ -941,25 +912,5 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java index cd05ec5b2..eb8e5d02f 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java @@ -40,7 +40,6 @@ import javax.swing.JPopupMenu; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.TableModelEvent; -import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.table.DefaultTableModel; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -50,24 +49,18 @@ import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.util.FileNameFilter; import org.jackhuang.hellominecraft.launcher.core.ModInfo; import org.jackhuang.hellominecraft.launcher.core.install.InstallerType; -import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; import org.jackhuang.hellominecraft.launcher.core.version.GameDirType; import org.jackhuang.hellominecraft.launcher.core.version.MinecraftVersion; import org.jackhuang.hellominecraft.launcher.setting.DefaultMinecraftService; import org.jackhuang.hellominecraft.launcher.setting.VersionSetting; -import org.jackhuang.hellominecraft.launcher.ui.modpack.ModpackWizard; -import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.Event; -import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; import org.jackhuang.hellominecraft.util.version.MinecraftVersionRequest; import org.jackhuang.hellominecraft.util.system.OS; import org.jackhuang.hellominecraft.util.StrUtils; -import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.ui.SwingUtils; import org.jackhuang.hellominecraft.util.system.Java; -import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; /** * @@ -261,8 +254,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget btnChoosingJavaDir = new javax.swing.JButton(); cboJava = new javax.swing.JComboBox(); btnChoosingGameDir = new javax.swing.JButton(); - btnExportModpack = new javax.swing.JButton(); - btnImportModpack = new javax.swing.JButton(); + btnCleanGame = new javax.swing.JButton(); pnlAdvancedSettings = new AnimatedPanel(); chkDebug = new javax.swing.JCheckBox(); lblJavaArgs = new javax.swing.JLabel(); @@ -299,8 +291,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget btnNewProfile = new javax.swing.JButton(); btnRemoveProfile = new javax.swing.JButton(); btnExplore = new javax.swing.JButton(); - btnIncludeMinecraft = new javax.swing.JButton(); - btnCleanGame = new javax.swing.JButton(); setBackground(new java.awt.Color(255, 255, 255)); setOpaque(false); @@ -365,7 +355,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget } }); - cboLauncherVisibility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.I18N.getString("advancedsettings.launcher_visibility.close"), C.I18N.getString("advancedsettings.launcher_visibility.hide"), C.I18N.getString("advancedsettings.launcher_visibility.keep") })); + cboLauncherVisibility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.launcher_visibility.close"), C.i18n("advancedsettings.launcher_visibility.hide"), C.i18n("advancedsettings.launcher_visibility.keep") })); cboLauncherVisibility.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { cboLauncherVisibilityFocusLost(evt); @@ -376,7 +366,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget lblRunDirectory.setText(C.i18n("settings.run_directory")); // NOI18N - cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.I18N.getString("advancedsettings.game_dir.default"), C.I18N.getString("advancedsettings.game_dir.independent") })); + cboRunDirectory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { C.i18n("advancedsettings.game_dir.default"), C.i18n("advancedsettings.game_dir.independent") })); cboRunDirectory.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { cboRunDirectoryFocusLost(evt); @@ -403,17 +393,10 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget } }); - btnExportModpack.setText(C.i18n("modpack.save.task")); // NOI18N - btnExportModpack.addActionListener(new java.awt.event.ActionListener() { + btnCleanGame.setText(C.i18n("setupwindow.clean")); // NOI18N + btnCleanGame.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - btnExportModpackActionPerformed(evt); - } - }); - - btnImportModpack.setText(C.i18n("modpack.install.task")); // NOI18N - btnImportModpack.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnImportModpackActionPerformed(evt); + btnCleanGameActionPerformed(evt); } }); @@ -424,12 +407,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addGroup(pnlSettingsLayout.createSequentialGroup() .addContainerGap() .addGroup(pnlSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(pnlSettingsLayout.createSequentialGroup() - .addComponent(btnDownloadAllAssets) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btnImportModpack) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnExportModpack)) .addGroup(pnlSettingsLayout.createSequentialGroup() .addGroup(pnlSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lblJavaDir) @@ -440,7 +417,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(lblDimension)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cboRunDirectory, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(cboLauncherVisibility, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(pnlSettingsLayout.createSequentialGroup() .addComponent(txtWidth, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -448,7 +424,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(lblDimensionX) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtHeight, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 410, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 414, Short.MAX_VALUE) .addComponent(chkFullscreen)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pnlSettingsLayout.createSequentialGroup() .addComponent(txtMaxMemory) @@ -463,7 +439,12 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtJavaDir) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnChoosingJavaDir))))) + .addComponent(btnChoosingJavaDir)) + .addComponent(cboRunDirectory, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(pnlSettingsLayout.createSequentialGroup() + .addComponent(btnDownloadAllAssets) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnCleanGame))) .addGap(0, 0, 0)) ); pnlSettingsLayout.setVerticalGroup( @@ -500,11 +481,10 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(lblDimensionX, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lblDimension) .addComponent(txtWidth, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 113, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 84, Short.MAX_VALUE) .addGroup(pnlSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnDownloadAllAssets) - .addComponent(btnExportModpack) - .addComponent(btnImportModpack)) + .addComponent(btnCleanGame)) .addContainerGap()) ); @@ -627,7 +607,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addComponent(lblServerIP) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtServerIP, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 102, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 76, Short.MAX_VALUE) .addGroup(pnlAdvancedSettingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(chkDebug) .addComponent(chkNoJVMArgs) @@ -677,14 +657,14 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addGroup(pnlModManagementContentLayout.createSequentialGroup() .addGroup(pnlModManagementContentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(pnlModManagementContentLayout.createSequentialGroup() - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 779, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 913, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlModManagementContentLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(btnRemoveMod) .addComponent(btnAddMod))) .addGroup(pnlModManagementContentLayout.createSequentialGroup() .addContainerGap() - .addComponent(lblModInfo, javax.swing.GroupLayout.DEFAULT_SIZE, 815, Short.MAX_VALUE))) + .addComponent(lblModInfo, javax.swing.GroupLayout.DEFAULT_SIZE, 1009, Short.MAX_VALUE))) .addGap(0, 0, 0)) ); pnlModManagementContentLayout.setVerticalGroup( @@ -696,9 +676,9 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnRemoveMod) .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 264, Short.MAX_VALUE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblModInfo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblModInfo) .addContainerGap()) ); @@ -867,46 +847,20 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget .addGap(0, 0, Short.MAX_VALUE)) ); - btnIncludeMinecraft.setText(C.i18n("setupwindow.include_minecraft")); // NOI18N - btnIncludeMinecraft.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnIncludeMinecraftActionPerformed(evt); - } - }); - - btnCleanGame.setText(C.i18n("setupwindow.clean")); // NOI18N - btnCleanGame.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - btnCleanGameActionPerformed(evt); - } - }); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(pnlTop, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(btnIncludeMinecraft) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btnCleanGame)) - .addComponent(tabVersionEdit)) - .addContainerGap()) + .addComponent(tabVersionEdit) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(pnlTop, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tabVersionEdit) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(btnIncludeMinecraft) - .addComponent(btnCleanGame)) - .addContainerGap()) + .addComponent(tabVersionEdit, javax.swing.GroupLayout.PREFERRED_SIZE, 338, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); ((NewTabPane)tabVersionEdit).initializing = false; @@ -955,22 +909,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget ppmExplore.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); }//GEN-LAST:event_btnExploreMouseClicked - private void btnIncludeMinecraftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIncludeMinecraftActionPerformed - JFileChooser fc = new JFileChooser(IOUtils.currentDir()); - fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - File newGameDir = fc.getSelectedFile(); - String name = JOptionPane.showInputDialog(C.i18n("setupwindow.give_a_name")); - if (StrUtils.isBlank(name)) { - MessageBox.Show(C.i18n("setupwindow.no_empty_name")); - return; - } - Settings.trySetProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); - MessageBox.Show(C.i18n("setupwindow.find_in_configurations")); - loadProfiles(); - } - }//GEN-LAST:event_btnIncludeMinecraftActionPerformed - private void btnModifyMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnModifyMouseClicked ppmManage.show(evt.getComponent(), evt.getPoint().x, evt.getPoint().y); }//GEN-LAST:event_btnModifyMouseClicked @@ -1085,7 +1023,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private void btnAddModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddModActionPerformed JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); - fc.setDialogTitle(C.I18N.getString("mods.choose_mod")); + fc.setDialogTitle(C.i18n("mods.choose_mod")); fc.setMultiSelectionEnabled(true); if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return; @@ -1094,7 +1032,7 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget flag &= getProfile().service().mod().addMod(getProfile().getSelectedVersion(), f); reloadMods(); if (!flag) - MessageBox.Show(C.I18N.getString("mods.failed")); + MessageBox.Show(C.i18n("mods.failed")); }//GEN-LAST:event_btnAddModActionPerformed private void btnRemoveModActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveModActionPerformed @@ -1135,26 +1073,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget getProfile().service().version().cleanFolder(); }//GEN-LAST:event_btnCleanGameActionPerformed - private void btnImportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImportModpackActionPerformed - JFileChooser fc = new JFileChooser(); - fc.setFileSelectionMode(JFileChooser.FILES_ONLY); - fc.setDialogTitle(C.i18n("modpack.choose")); - fc.setMultiSelectionEnabled(false); - fc.setFileFilter(new FileNameExtensionFilter(C.i18n("modpack"), "zip")); - fc.showOpenDialog(this); - if (fc.getSelectedFile() == null) - return; - String suggestedModpackId = JOptionPane.showInputDialog("Please enter your favourite game name", FileUtils.getBaseName(fc.getSelectedFile().getName())); - TaskWindow.getInstance().addTask(ModpackManager.install(fc.getSelectedFile(), getProfile().service(), suggestedModpackId)).start(); - refreshVersions(); - }//GEN-LAST:event_btnImportModpackActionPerformed - - private void btnExportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExportModpackActionPerformed - if (getProfile().service().version().getVersionCount() <= 0) - return; - WizardDisplayer.showWizard(new ModpackWizard(getProfile().service()).createWizard()); - }//GEN-LAST:event_btnExportModpackActionPerformed - // // private void loadProfiles() { @@ -1345,9 +1263,6 @@ public final class GameSettingsPanel extends AnimatedPanel implements DropTarget private javax.swing.JButton btnCleanGame; private javax.swing.JButton btnDownloadAllAssets; private javax.swing.JButton btnExplore; - private javax.swing.JButton btnExportModpack; - private javax.swing.JButton btnImportModpack; - private javax.swing.JButton btnIncludeMinecraft; private javax.swing.JButton btnModify; private javax.swing.JButton btnNewProfile; private javax.swing.JButton btnRefreshVersions; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.form index 77fec0a48..fff6903de 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.form @@ -42,7 +42,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -74,7 +74,7 @@ - + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java index e088a88a8..fc57dcbcb 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/InstallerPanel.java @@ -76,7 +76,7 @@ public class InstallerPanel extends AnimatedPanel implements Selectable { } }); - lstInstallers.setModel(SwingUtils.makeDefaultTableModel(new String[]{C.I18N.getString("install.version"), C.I18N.getString("install.mcversion")}, + lstInstallers.setModel(SwingUtils.makeDefaultTableModel(new String[]{C.i18n("install.version"), C.i18n("install.mcversion")}, new Class[]{String.class, String.class}, new boolean[]{false, false})); lstInstallers.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane12.setViewportView(lstInstallers); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form index b219017bf..150ae2790 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form @@ -19,42 +19,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -65,13 +29,51 @@ + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + @@ -82,31 +84,36 @@ - + - + - + + + + + + - - + + - + - + - + @@ -118,10 +125,10 @@ - - + + - + @@ -138,27 +145,27 @@ - + - + - + - + - + @@ -166,24 +173,24 @@ - + - + - + - + @@ -193,17 +200,17 @@ - + - + - + @@ -217,10 +224,10 @@ - + - + @@ -229,10 +236,10 @@ - + - + @@ -241,17 +248,17 @@ - + - + - + - + @@ -265,16 +272,18 @@ - + - + - + + + @@ -283,25 +292,42 @@ - + - + - + - + + + + + + + + + + + + + + + + + + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java index 83daaf9a3..68d92476c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java @@ -28,6 +28,7 @@ import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.download.DownloadType; import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.MessageBox; +import org.jackhuang.hellominecraft.util.SupportedLocales; import org.jackhuang.hellominecraft.util.ui.SwingUtils; /** @@ -47,6 +48,16 @@ public class LauncherSettingsPanel extends AnimatedPanel { d.addElement(type.getName()); cboDownloadSource.setModel(d); + d = new DefaultComboBoxModel(); + int id = 0; + for (SupportedLocales type : SupportedLocales.values()) { + d.addElement(type.showString()); + if (type.name().equals(Settings.getInstance().getLocalization())) + id = type.ordinal(); + } + cboLang.setModel(d); + cboLang.setSelectedIndex(id); + txtBackgroundPath.setText(Settings.getInstance().getBgpath()); txtProxyHost.setText(Settings.getInstance().getProxyHost()); txtProxyPort.setText(Settings.getInstance().getProxyPort()); @@ -72,27 +83,29 @@ public class LauncherSettingsPanel extends AnimatedPanel { private void initComponents() { cboDownloadSource = new javax.swing.JComboBox(); - jLabel4 = new javax.swing.JLabel(); + lblAbout = new javax.swing.JLabel(); btnSelBackgroundPath = new javax.swing.JButton(); - jLabel14 = new javax.swing.JLabel(); + lblBackground = new javax.swing.JLabel(); txtBackgroundPath = new javax.swing.JTextField(); - jLabel7 = new javax.swing.JLabel(); + lblDownloadSource = new javax.swing.JLabel(); btnCheckUpdate = new javax.swing.JButton(); chkEnableShadow = new javax.swing.JCheckBox(); - jLabel1 = new javax.swing.JLabel(); + lblTheme = new javax.swing.JLabel(); cboTheme = new javax.swing.JComboBox(); - jLabel2 = new javax.swing.JLabel(); + lblProxy = new javax.swing.JLabel(); txtProxyHost = new javax.swing.JTextField(); - jLabel3 = new javax.swing.JLabel(); + lblProxyHost = new javax.swing.JLabel(); txtProxyPort = new javax.swing.JTextField(); - jLabel5 = new javax.swing.JLabel(); - jLabel6 = new javax.swing.JLabel(); + lblProxyPort = new javax.swing.JLabel(); + lblProxyUserName = new javax.swing.JLabel(); txtProxyUsername = new javax.swing.JTextField(); txtProxyPassword = new javax.swing.JTextField(); - jLabel8 = new javax.swing.JLabel(); + lblProxyPassword = new javax.swing.JLabel(); chkEnableAnimation = new javax.swing.JCheckBox(); chkDecorated = new javax.swing.JCheckBox(); - jLabel9 = new javax.swing.JLabel(); + lblModpack = new javax.swing.JLabel(); + cboLang = new javax.swing.JComboBox(); + lblLang = new javax.swing.JLabel(); cboDownloadSource.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -100,7 +113,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel4.setText(C.i18n("launcher.about")); // NOI18N + lblAbout.setText(C.i18n("launcher.about")); // NOI18N btnSelBackgroundPath.setText(C.i18n("ui.button.explore")); // NOI18N btnSelBackgroundPath.addActionListener(new java.awt.event.ActionListener() { @@ -109,8 +122,8 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel14.setText(C.i18n("launcher.background_location")); // NOI18N - jLabel14.setToolTipText(""); + lblBackground.setText(C.i18n("launcher.background_location")); // NOI18N + lblBackground.setToolTipText(""); txtBackgroundPath.setToolTipText(C.i18n("launcher.background_tooltip")); // NOI18N txtBackgroundPath.addFocusListener(new java.awt.event.FocusAdapter() { @@ -119,7 +132,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel7.setText(C.i18n("launcher.download_source")); // NOI18N + lblDownloadSource.setText(C.i18n("launcher.download_source")); // NOI18N btnCheckUpdate.setText(C.i18n("launcher.update_launcher")); // NOI18N btnCheckUpdate.addActionListener(new java.awt.event.ActionListener() { @@ -135,7 +148,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel1.setText(C.i18n("launcher.theme")); // NOI18N + lblTheme.setText(C.i18n("launcher.theme")); // NOI18N cboTheme.setModel(new DefaultComboBoxModel(new String[]{C.i18n("color.blue"),C.i18n("color.green"),C.i18n("color.purple"),C.i18n("color.dark_blue"),C.i18n("color.orange"),C.i18n("color.red")})); cboTheme.addItemListener(new java.awt.event.ItemListener() { @@ -144,7 +157,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel2.setText(C.i18n("launcher.proxy")); // NOI18N + lblProxy.setText(C.i18n("launcher.proxy")); // NOI18N txtProxyHost.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { @@ -152,7 +165,7 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel3.setText(C.i18n("proxy.host")); // NOI18N + lblProxyHost.setText(C.i18n("proxy.host")); // NOI18N txtProxyPort.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { @@ -160,9 +173,9 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel5.setText(C.i18n("proxy.port")); // NOI18N + lblProxyPort.setText(C.i18n("proxy.port")); // NOI18N - jLabel6.setText(C.i18n("proxy.username")); // NOI18N + lblProxyUserName.setText(C.i18n("proxy.username")); // NOI18N txtProxyUsername.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { @@ -176,31 +189,39 @@ public class LauncherSettingsPanel extends AnimatedPanel { } }); - jLabel8.setText(C.i18n("proxy.password")); // NOI18N + lblProxyPassword.setText(C.i18n("proxy.password")); // NOI18N - chkEnableAnimation.setText("启用动态效果"); + chkEnableAnimation.setText(C.i18n("launcher.enable_animation")); // NOI18N chkEnableAnimation.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { chkEnableAnimationFocusLost(evt); } }); - java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); // NOI18N - chkDecorated.setText(bundle.getString("launcher.decorated")); // NOI18N + chkDecorated.setText(C.i18n("launcher.decorated")); // NOI18N chkDecorated.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { chkDecoratedFocusLost(evt); } }); - jLabel9.setText(C.i18n("launcher.modpack")); // NOI18N - jLabel9.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); - jLabel9.addMouseListener(new java.awt.event.MouseAdapter() { + lblModpack.setText(C.i18n("launcher.modpack")); // NOI18N + lblModpack.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); + lblModpack.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { - jLabel9MouseClicked(evt); + lblModpackMouseClicked(evt); } }); + cboLang.setModel(new DefaultComboBoxModel(new String[]{C.i18n("color.blue"),C.i18n("color.green"),C.i18n("color.purple"),C.i18n("color.dark_blue"),C.i18n("color.orange"),C.i18n("color.red")})); + cboLang.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + cboLangItemStateChanged(evt); + } + }); + + lblLang.setText(C.i18n("launcher.lang")); // NOI18N + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -208,37 +229,6 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel7) - .addComponent(jLabel1) - .addComponent(jLabel14) - .addComponent(jLabel2)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() - .addComponent(txtBackgroundPath) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(btnSelBackgroundPath)) - .addComponent(cboDownloadSource, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(cboTheme, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addGroup(layout.createSequentialGroup() - .addComponent(jLabel3) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtProxyHost, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel5) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtProxyPort, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel6) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel8) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(txtProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)))) .addGroup(layout.createSequentialGroup() .addComponent(chkEnableShadow) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) @@ -247,11 +237,44 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addComponent(btnCheckUpdate) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(chkDecorated)) + .addGroup(layout.createSequentialGroup() + .addComponent(lblProxy) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblProxyHost) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtProxyHost, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lblProxyPort) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtProxyPort, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lblProxyUserName) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(lblProxyPassword) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(0, 0, Short.MAX_VALUE))) + .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblDownloadSource) + .addComponent(lblTheme) + .addComponent(lblBackground) + .addComponent(lblLang)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(cboLang, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addComponent(txtBackgroundPath, javax.swing.GroupLayout.DEFAULT_SIZE, 664, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnSelBackgroundPath)) + .addComponent(cboDownloadSource, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cboTheme, javax.swing.GroupLayout.Alignment.TRAILING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addContainerGap()) ); layout.setVerticalGroup( @@ -259,28 +282,32 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel14) + .addComponent(lblBackground) .addComponent(btnSelBackgroundPath, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txtBackgroundPath, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel7) + .addComponent(lblDownloadSource) .addComponent(cboDownloadSource, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) - .addComponent(jLabel1) + .addComponent(lblTheme) .addComponent(cboTheme, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lblLang) + .addComponent(cboLang, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(txtProxyHost, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel2) - .addComponent(jLabel3) + .addComponent(lblProxy) + .addComponent(lblProxyHost) .addComponent(txtProxyPort, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel5) + .addComponent(lblProxyPort) .addComponent(txtProxyUsername, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel6) + .addComponent(lblProxyUserName) .addComponent(txtProxyPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel8)) + .addComponent(lblProxyPassword)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(chkEnableShadow) @@ -289,10 +316,10 @@ public class LauncherSettingsPanel extends AnimatedPanel { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnCheckUpdate, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(chkDecorated)) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 49, Short.MAX_VALUE) - .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 85, Short.MAX_VALUE) + .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// //GEN-END:initComponents @@ -364,28 +391,34 @@ public class LauncherSettingsPanel extends AnimatedPanel { Settings.getInstance().setDecorated(chkDecorated.isSelected()); }//GEN-LAST:event_chkDecoratedFocusLost - private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel9MouseClicked + private void lblModpackMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblModpackMouseClicked SwingUtils.openLink("http://blog.163.com/huanghongxun2008@126/blog/static/7738046920160323812771/"); - }//GEN-LAST:event_jLabel9MouseClicked + }//GEN-LAST:event_lblModpackMouseClicked + + private void cboLangItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cboLangItemStateChanged + Settings.getInstance().setLocalization(SupportedLocales.values()[cboLang.getSelectedIndex()].name()); + }//GEN-LAST:event_cboLangItemStateChanged // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnCheckUpdate; private javax.swing.JButton btnSelBackgroundPath; private javax.swing.JComboBox cboDownloadSource; + private javax.swing.JComboBox cboLang; private javax.swing.JComboBox cboTheme; private javax.swing.JCheckBox chkDecorated; private javax.swing.JCheckBox chkEnableAnimation; private javax.swing.JCheckBox chkEnableShadow; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel14; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JLabel jLabel5; - private javax.swing.JLabel jLabel6; - private javax.swing.JLabel jLabel7; - private javax.swing.JLabel jLabel8; - private javax.swing.JLabel jLabel9; + private javax.swing.JLabel lblAbout; + private javax.swing.JLabel lblBackground; + private javax.swing.JLabel lblDownloadSource; + private javax.swing.JLabel lblLang; + private javax.swing.JLabel lblModpack; + private javax.swing.JLabel lblProxy; + private javax.swing.JLabel lblProxyHost; + private javax.swing.JLabel lblProxyPassword; + private javax.swing.JLabel lblProxyPort; + private javax.swing.JLabel lblProxyUserName; + private javax.swing.JLabel lblTheme; private javax.swing.JTextField txtBackgroundPath; private javax.swing.JTextField txtProxyHost; private javax.swing.JTextField txtProxyPassword; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form index 6044b13cf..e6b8e59dc 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form @@ -41,11 +41,11 @@ - + - + @@ -60,8 +60,11 @@ - + + + + @@ -78,7 +81,7 @@ - + @@ -92,7 +95,13 @@ - + + + + + + + @@ -112,7 +121,7 @@ - + @@ -129,14 +138,14 @@ - + - + @@ -150,13 +159,13 @@ - + - + - + @@ -207,7 +216,7 @@ - + @@ -243,7 +252,7 @@ - + @@ -257,7 +266,7 @@ - + @@ -267,13 +276,43 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java index ce1748bc8..847655858 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java @@ -25,8 +25,10 @@ import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.util.List; +import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; +import javax.swing.filechooser.FileNameExtensionFilter; import org.jackhuang.hellominecraft.launcher.api.PluginManager; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.logging.HMCLog; @@ -43,12 +45,18 @@ import org.jackhuang.hellominecraft.launcher.core.LauncherVisibility; import org.jackhuang.hellominecraft.launcher.setting.Settings; import org.jackhuang.hellominecraft.launcher.core.auth.AuthenticationException; import org.jackhuang.hellominecraft.launcher.core.launch.LaunchOptions; +import org.jackhuang.hellominecraft.launcher.core.mod.ModpackManager; +import org.jackhuang.hellominecraft.launcher.ui.modpack.ModpackWizard; import org.jackhuang.hellominecraft.lookandfeel.GraphicsUtils; import org.jackhuang.hellominecraft.util.Event; import org.jackhuang.hellominecraft.lookandfeel.comp.ConstomButton; import org.jackhuang.hellominecraft.util.func.Consumer; +import org.jackhuang.hellominecraft.util.system.FileUtils; +import org.jackhuang.hellominecraft.util.system.IOUtils; import org.jackhuang.hellominecraft.util.system.JavaProcessMonitor; +import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.ui.LogWindow; +import org.jackhuang.hellominecraft.util.ui.wizard.api.WizardDisplayer; /** * @@ -104,7 +112,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { lblUserName = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel(); cboProfiles = new javax.swing.JComboBox(); - jLabel1 = new javax.swing.JLabel(); + lblVersion = new javax.swing.JLabel(); cboVersions = new javax.swing.JComboBox(); pnlPassword = new javax.swing.JPanel(); jPanel1 = new javax.swing.JPanel(); @@ -114,6 +122,9 @@ public class MainPagePanel extends AnimatedPanel implements Event { btnLogout = new javax.swing.JButton(); btnMakeLaunchScript = new javax.swing.JButton(); btnShowLog = new javax.swing.JButton(); + btnIncludeMinecraft = new javax.swing.JButton(); + btnImportModpack = new javax.swing.JButton(); + btnExportModpack = new javax.swing.JButton(); setLayout(null); @@ -152,8 +163,8 @@ public class MainPagePanel extends AnimatedPanel implements Event { } }); - jLabel1.setText(C.I18N.getString("ui.label.version")); // NOI18N - jLabel1.setToolTipText(C.i18n("ui.label.version")); // NOI18N + lblVersion.setText(C.i18n("ui.label.version")); // NOI18N + lblVersion.setToolTipText(C.i18n("ui.label.version")); // NOI18N cboVersions.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { @@ -201,7 +212,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { pnlPassword.add(jPanel1, "card2"); - btnLogout.setText(C.I18N.getString("ui.button.logout")); // NOI18N + btnLogout.setText(C.i18n("ui.button.logout")); // NOI18N btnLogout.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnLogoutActionPerformed(evt); @@ -235,6 +246,27 @@ public class MainPagePanel extends AnimatedPanel implements Event { } }); + btnIncludeMinecraft.setText(C.i18n("setupwindow.include_minecraft")); // NOI18N + btnIncludeMinecraft.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnIncludeMinecraftActionPerformed(evt); + } + }); + + btnImportModpack.setText(C.i18n("modpack.install.task")); // NOI18N + btnImportModpack.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnImportModpackActionPerformed(evt); + } + }); + + btnExportModpack.setText(C.i18n("modpack.save.task")); // NOI18N + btnExportModpack.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnExportModpackActionPerformed(evt); + } + }); + javax.swing.GroupLayout pnlMoreLayout = new javax.swing.GroupLayout(pnlMore); pnlMore.setLayout(pnlMoreLayout); pnlMoreLayout.setHorizontalGroup( @@ -246,10 +278,10 @@ public class MainPagePanel extends AnimatedPanel implements Event { .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel10, javax.swing.GroupLayout.Alignment.TRAILING) - .addComponent(jLabel1, javax.swing.GroupLayout.Alignment.TRAILING)) + .addComponent(lblVersion, javax.swing.GroupLayout.Alignment.TRAILING)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(cboProfiles, 0, 124, Short.MAX_VALUE) + .addComponent(cboProfiles, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(cboVersions, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addGroup(pnlMoreLayout.createSequentialGroup() .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -259,8 +291,11 @@ public class MainPagePanel extends AnimatedPanel implements Event { .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(cboLoginMode, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(txtPlayerName))) - .addComponent(btnMakeLaunchScript, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(btnShowLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(btnMakeLaunchScript, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(btnShowLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnIncludeMinecraft, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnExportModpack, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnImportModpack, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); pnlMoreLayout.setVerticalGroup( @@ -273,7 +308,7 @@ public class MainPagePanel extends AnimatedPanel implements Event { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cboVersions, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(jLabel1)) + .addComponent(lblVersion)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(pnlMoreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) @@ -284,7 +319,13 @@ public class MainPagePanel extends AnimatedPanel implements Event { .addComponent(txtPlayerName, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pnlPassword, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 238, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 146, Short.MAX_VALUE) + .addComponent(btnImportModpack) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnExportModpack) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnIncludeMinecraft) + .addGap(18, 18, 18) .addComponent(btnMakeLaunchScript) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnShowLog) @@ -376,6 +417,42 @@ public class MainPagePanel extends AnimatedPanel implements Event { LogWindow.INSTANCE.setVisible(true); }//GEN-LAST:event_btnShowLogActionPerformed + private void btnIncludeMinecraftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnIncludeMinecraftActionPerformed + JFileChooser fc = new JFileChooser(IOUtils.currentDir()); + fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + File newGameDir = fc.getSelectedFile(); + String name = JOptionPane.showInputDialog(C.i18n("setupwindow.give_a_name")); + if (StrUtils.isBlank(name)) { + MessageBox.Show(C.i18n("setupwindow.no_empty_name")); + return; + } + Settings.trySetProfile(new Profile(name).setGameDir(newGameDir.getAbsolutePath())); + MessageBox.Show(C.i18n("setupwindow.find_in_configurations")); + refreshMinecrafts(name); + } + }//GEN-LAST:event_btnIncludeMinecraftActionPerformed + + private void btnImportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImportModpackActionPerformed + JFileChooser fc = new JFileChooser(); + fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + fc.setDialogTitle(C.i18n("modpack.choose")); + fc.setMultiSelectionEnabled(false); + fc.setFileFilter(new FileNameExtensionFilter(C.i18n("modpack"), "zip")); + fc.showOpenDialog(this); + if (fc.getSelectedFile() == null) + return; + String suggestedModpackId = JOptionPane.showInputDialog("Please enter your favourite game name", FileUtils.getBaseName(fc.getSelectedFile().getName())); + TaskWindow.getInstance().addTask(ModpackManager.install(fc.getSelectedFile(), getProfile().service(), suggestedModpackId)).start(); + loadMinecraftVersions(); + }//GEN-LAST:event_btnImportModpackActionPerformed + + private void btnExportModpackActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExportModpackActionPerformed + if (getProfile().service().version().getVersionCount() <= 0) + return; + WizardDisplayer.showWizard(new ModpackWizard(getProfile().service()).createWizard()); + }//GEN-LAST:event_btnExportModpackActionPerformed + boolean isLaunching = false; // @@ -641,19 +718,22 @@ public class MainPagePanel extends AnimatedPanel implements Event { } // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton btnExportModpack; + private javax.swing.JButton btnImportModpack; + private javax.swing.JButton btnIncludeMinecraft; private javax.swing.JButton btnLogout; private javax.swing.JButton btnMakeLaunchScript; private javax.swing.JButton btnShowLog; private javax.swing.JComboBox cboLoginMode; private javax.swing.JComboBox cboProfiles; private javax.swing.JComboBox cboVersions; - private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel9; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel3; private javax.swing.JLabel lblUserName; + private javax.swing.JLabel lblVersion; private javax.swing.JPanel pnlMore; private javax.swing.JPanel pnlPassword; private javax.swing.JPasswordField txtPassword; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.form index abfaedbcf..95f9074ca 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.form +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/NewProfileWindow.form @@ -4,7 +4,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -89,7 +89,7 @@ - + @@ -103,7 +103,7 @@ - + @@ -113,7 +113,7 @@ - + diff --git a/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/ui/Bundle.properties b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/ui/Bundle.properties new file mode 100644 index 000000000..4dc4c3428 --- /dev/null +++ b/HMCL/src/main/resources/org/jackhuang/hellominecraft/launcher/ui/Bundle.properties @@ -0,0 +1,17 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * 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 {http://www.gnu.org/licenses/}. + */ diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/C.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/C.java index 725101684..525d77801 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/C.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/C.java @@ -30,20 +30,6 @@ public final class C { public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static final ResourceBundle I18N; - - static { - ResourceBundle rb = null; - try { - rb = ResourceBundle.getBundle("org/jackhuang/hellominecraft/launcher/I18N"); - } catch (Throwable t) { - rb = null; - System.out.println("Did you delete I18N.properties?"); - t.printStackTrace(); - } - I18N = rb; - } - //http://repo1.maven.org/maven2 public static final String URL_PUBLISH = "http://www.mcbbs.net/thread-142335-1-1.html"; public static final String URL_TIEBA = "http://tieba.baidu.com/f?kw=hellominecraftlauncher"; @@ -61,12 +47,7 @@ public final class C { } public static String i18n(String a, Object... format) { - try { - return String.format(C.I18N.getString(a), format); - } catch (Exception e) { - HMCLog.warn("Failed to read localization key: " + a, e); - return a; - } + return SupportedLocales.NOW_LOCALE.translate(a, format); } } diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/SupportedLocales.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/SupportedLocales.java new file mode 100644 index 000000000..257e2c9e4 --- /dev/null +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/SupportedLocales.java @@ -0,0 +1,64 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2013 huangyuhui + * + * 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 {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hellominecraft.util; + +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * + * @author huangyuhui + */ +public enum SupportedLocales { + def(Locale.getDefault(), "lang.default"), en(Locale.ENGLISH, null), zh_TW(Locale.TRADITIONAL_CHINESE, null), zh_CN(Locale.SIMPLIFIED_CHINESE, null); + + public Locale self; + private String showString, customized; + private ResourceBundle bundle; + + private SupportedLocales(Locale self, String customized) { + this.self = self; + + try { + bundle = ResourceBundle.getBundle("org/jackhuang/hellominecraft/lang/I18N", self); + showString = bundle.getString("lang"); + this.customized = customized; + } catch (Throwable t) { + showString = self.toString(); + t.printStackTrace(); + } + } + + public String showString() { + if (customized == null) + return showString; + else + return NOW_LOCALE.translate(customized); + } + + public static SupportedLocales NOW_LOCALE = def; + + public String translate(String key, Object... format) { + try { + return bundle.getString(key); + } catch (Exception ex) { + ex.printStackTrace(); + return key; + } + } +} diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java index e28fbf4e7..8755dd8ea 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/system/IOUtils.java @@ -192,7 +192,7 @@ public class IOUtils { return path + "java"; } - public static byte[] readFully(InputStream stream) throws IOException { + public static ByteArrayOutputStream readFully(InputStream stream) throws IOException { byte[] data = new byte[4096]; ByteArrayOutputStream entryBuffer = new ByteArrayOutputStream(); int len; @@ -203,7 +203,7 @@ public class IOUtils { entryBuffer.write(data, 0, len); } while (len != -1); - return entryBuffer.toByteArray(); + return entryBuffer; } public static void closeQuietly(Reader input) { diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties similarity index 99% rename from HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties rename to HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties index 16902f4cb..25de795f2 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N.properties @@ -275,6 +275,8 @@ launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u542f\u7528\u7a97\u53e3\u8fb9\u6846(Linux\u4e0b\u53ef\u89e3\u51b3\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u95ee\u9898) launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.enable_animation=\u542f\u7528\u52a8\u6001\u6548\u679c +launcher.lang=\u8bed\u8a00 launcher.title.game=\u6e38\u620f\u8bbe\u7f6e launcher.title.main=\u4e3b\u9875 @@ -369,4 +371,6 @@ wizard.close_mnemonic=\u5173 wizard.summary=\u6982\u8981 wizard.failed=\u5931\u8d25 wizard.steps=\u6b65\u9aa4 -advancedsettings.debug_mode=\u8c03\u8bd5\u6a21\u5f0f + +lang=\u7b80\u4f53\u4e2d\u6587 +lang.default=\u8ddf\u968f\u7cfb\u7edf\u8bed\u8a00 \ No newline at end of file diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties similarity index 99% rename from HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties rename to HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties index 2b744aeff..8696016da 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_en.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_en.properties @@ -275,6 +275,8 @@ launcher.theme=Theme launcher.proxy=Proxy launcher.decorated=Enable system window border(in order to fix the problem that the ui become all gray in Linux OS) launcher.modpack=Documentations for modpacks. +launcher.enable_animation=Enable Animation +launcher.lang=Language launcher.title.game=Games launcher.title.main=Home @@ -368,4 +370,7 @@ wizard.close=Close wizard.close_mnemonic=C wizard.summary=Summary wizard.failed=Failed -wizard.steps=Steps \ No newline at end of file +wizard.steps=Steps + +lang=English +lang.default=Belong to OS language. \ No newline at end of file diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_CN.properties similarity index 99% rename from HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties rename to HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_CN.properties index d3fade3dc..aed1cc01d 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh_CN.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_CN.properties @@ -275,6 +275,8 @@ launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u542f\u7528\u7a97\u53e3\u8fb9\u6846(Linux\u4e0b\u53ef\u89e3\u51b3\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u95ee\u9898) launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.enable_animation=\u542f\u7528\u52a8\u6001\u6548\u679c +launcher.lang=\u8bed\u8a00 launcher.title.game=\u6e38\u620f\u8bbe\u7f6e launcher.title.main=\u4e3b\u9875 @@ -368,4 +370,7 @@ wizard.close=\u5173\u95ed wizard.close_mnemonic=\u5173 wizard.summary=\u6982\u8981 wizard.failed=\u5931\u8d25 -wizard.steps=\u6b65\u9aa4 \ No newline at end of file +wizard.steps=\u6b65\u9aa4 + +lang=\u7b80\u4f53\u4e2d\u6587 +lang.default=\u8ddf\u968f\u7cfb\u7edf\u8bed\u8a00 \ No newline at end of file diff --git a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties similarity index 99% rename from HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties rename to HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties index f73648d51..a572d55f5 100755 --- a/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/launcher/I18N_zh.properties +++ b/HMCLAPI/src/main/resources/org/jackhuang/hellominecraft/lang/I18N_zh_TW.properties @@ -275,6 +275,8 @@ launcher.theme=\u4e3b\u9898 launcher.proxy=\u4ee3\u7406 launcher.decorated=\u555f\u7528\u7a97\u53e3\u908a\u6846(Linux\u4e0b\u53ef\u89e3\u6c7a\u7a0b\u5e8f\u754c\u9762\u5168\u7070\u554f\u984c) launcher.modpack=\u6574\u5408\u5305\u4f5c\u8005\u5e2e\u52a9 +launcher.enable_animation=\u555f\u7528\u52d5\u614b\u6548\u679c +launcher.lang=\u8a9e\u8a00 launcher.title.game=\u904a\u6232\u8a2d\u5b9a launcher.title.main=\u4e3b\u9801 @@ -368,4 +370,7 @@ wizard.close=\u95dc\u9589 wizard.close_mnemonic=\u95dc wizard.summary=\u6982\u8981 wizard.failed=\u5931\u8d25 -wizard.steps=\u6b65\u9a5f \ No newline at end of file +wizard.steps=\u6b65\u9a5f + +lang=\u6b63\u9ad4\u4e2d\u6587 +lang.default=\u8ddf\u96a8\u7cfb\u7d71\u8a9e\u8a00 \ No newline at end of file diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java index a602299cb..5ceded14c 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/install/cauldron/ForgeInstaller.java @@ -140,7 +140,7 @@ public class ForgeInstaller { if (output.exists()) output.delete(); - byte[] decompressed = IOUtils.readFully(new XZInputStream(new ByteArrayInputStream(data))); + byte[] decompressed = IOUtils.readFully(new XZInputStream(new ByteArrayInputStream(data))).toByteArray(); String end = new String(decompressed, decompressed.length - 4, 4); if (!end.equals("SIGN")) { @@ -185,7 +185,7 @@ public class ForgeInstaller { try (JarInputStream jar = new JarInputStream(new ByteArrayInputStream(data))) { JarEntry entry = jar.getNextJarEntry(); while (entry != null) { - byte[] eData = IOUtils.readFully(jar); + byte[] eData = IOUtils.readFully(jar).toByteArray(); if (entry.getName().equals("checksums.sha1")) hashes = new String(eData, Charset.forName("UTF-8")).split("\n"); diff --git a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java index 5b4813eff..1b4d03394 100755 --- a/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java +++ b/HMCSM/src/main/java/org/jackhuang/hellominecraft/svrmgr/ui/MainWindow.java @@ -3863,7 +3863,7 @@ public final class MainWindow extends javax.swing.JFrame File filepath = new File(IOUtils.currentDir(), "forge-installer.jar"); url = v.installer[1]; if (!TaskWindow.getInstance().addTask(new FileDownloadTask(url, filepath).setTag("cauldron-" + v.ver)).start()) - MessageBox.Show(C.I18N.getString("install.failed_download_forge")); + MessageBox.Show(C.i18n("install.failed_download_forge")); else installMCPC(filepath); }//GEN-LAST:event_btnDownloadMCPCActionPerformed @@ -3872,10 +3872,10 @@ public final class MainWindow extends javax.swing.JFrame try { ForgeInstaller installer = new ForgeInstaller(IOUtils.currentDir(), filepath); installer.install(); - MessageBox.Show(C.I18N.getString("install.success")); + MessageBox.Show(C.i18n("install.success")); } catch (Exception e) { HMCLog.warn("Failed to install liteloader", e); - MessageBox.Show(C.I18N.getString("install.failed_forge")); + MessageBox.Show(C.i18n("install.failed_forge")); } }