From f108f954267f4088931dd21dc837518623a8bcc5 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Thu, 24 Aug 2023 23:40:24 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E2=9E=95=20=E6=B7=BB=E5=8A=A0=E6=8E=92?= =?UTF-8?q?=E9=99=A4=E6=96=87=E4=BB=B6=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9278379..8ad8af9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,9 @@ target/ *.iws *.iml *.ipr - +### 此处忽略了json与xml后缀 +*.xml +*.json ### Eclipse ### .apt_generated .classpath From fbc1d020d91545599e409975acde013a596b43e7 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Fri, 25 Aug 2023 16:18:26 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E2=9E=95=20=E6=B7=BB=E5=8A=A0=E7=BD=AE?= =?UTF-8?q?=E9=A1=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- src/main/java/module-info.java | 2 +- src/main/java/org/jcnc/jnotepad/LunchApp.java | 29 ++++++---- .../jnotepad/app/config/GlobalConfig.java | 11 +--- .../app/config/LoadJnotepadConfig.java | 55 +++++++++++++++++-- .../app/config/LoadLanguageConfig.java | 31 +++++++++++ .../app/config/LoadShortcutKeyConfig.java | 50 ++--------------- .../jnotepad/constants/TextConstants.java | 24 +++++++- .../controller/event/handler/SaveFile.java | 2 +- .../java/org/jcnc/jnotepad/init/Config.java | 32 ++++++++--- .../jcnc/jnotepad/tool/EncodingDetector.java | 2 - .../jnotepad/ui/menu/JNotepadMenuBar.java | 54 +++++++++++++++++- .../org/jcnc/jnotepad/view/init/View.java | 21 ++++++- 13 files changed, 226 insertions(+), 89 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java diff --git a/.gitignore b/.gitignore index 8edb681..e5b99a4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ - +test/ ### IntelliJ IDEA ### .idea/ *.iws diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index f8ce033..6cde0ce 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -12,7 +12,7 @@ module org.jcnc.jnotepad { requires ch.qos.logback.core; requires ch.qos.logback.classic; requires com.ibm.icu; - + exports org.jcnc.jnotepad.init; exports org.jcnc.jnotepad.app.config; exports org.jcnc.jnotepad; exports org.jcnc.jnotepad.tool; diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index ed227c4..7b3ee60 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -7,20 +7,23 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.layout.Pane; import javafx.stage.Stage; +import org.jcnc.jnotepad.app.config.LoadJnotepadConfig; +import org.jcnc.jnotepad.app.config.LoadLanguageConfig; import org.jcnc.jnotepad.app.config.LoadShortcutKeyConfig; import org.jcnc.jnotepad.constants.AppConstants; import org.jcnc.jnotepad.controller.manager.Controller; -import org.jcnc.jnotepad.init.Config; import org.jcnc.jnotepad.ui.LineNumberTextArea; import org.jcnc.jnotepad.view.init.View; import org.jcnc.jnotepad.view.manager.ViewManager; +import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import static org.jcnc.jnotepad.constants.TextConstants.TITLE; + /** * 启动程序 * @@ -34,22 +37,26 @@ public class LunchApp extends Application { Controller controller = Controller.getInstance(); Scene scene; + /** + * 配置文件数组 + */ + static List loadJnotepadConfigs = new ArrayList<>(); + + static { + // 快捷键配置文件 + loadJnotepadConfigs.add(new LoadShortcutKeyConfig()); + // 语言配置文件 + loadJnotepadConfigs.add(new LoadLanguageConfig()); + } @Override public void start(Stage primaryStage) { - - Config config = new Config(); - Properties properties = config.readPropertiesFromFile(); - String title = properties.getProperty("title", "JNotepad"); - - Pane root = new Pane(); double width = AppConstants.SCREEN_WIDTH; double length = AppConstants.SCREEN_LENGTH; String icon = AppConstants.APP_ICON; - scene = new Scene(root, width, length); Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet()); scene.getStylesheets().add(Objects.requireNonNull(getClass().getResource("/css/styles.css")).toExternalForm()); @@ -62,7 +69,7 @@ public class LunchApp extends Application { Platform.runLater(() -> controller.updateUiWithNewTextArea(textArea)); } }); - primaryStage.setTitle(title); + primaryStage.setTitle(TITLE); primaryStage.setWidth(width); primaryStage.setHeight(length); primaryStage.setScene(scene); @@ -71,7 +78,7 @@ public class LunchApp extends Application { ViewManager viewManager = ViewManager.getInstance(scene); viewManager.initScreen(scene); // 初始化快捷键 - View.getInstance().initShortcutKey(new LoadShortcutKeyConfig()); + View.getInstance().initJnotepadConfigs(loadJnotepadConfigs); } @Override diff --git a/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java index 4f458ec..c771497 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java @@ -1,9 +1,6 @@ package org.jcnc.jnotepad.app.config; -import org.jcnc.jnotepad.init.Config; - -import java.util.Properties; - +import static org.jcnc.jnotepad.constants.TextConstants.PROPERTIES; import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; /** @@ -14,10 +11,8 @@ import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; public class GlobalConfig { private static final GlobalConfig APP_GLOBAL_CONFIG = new GlobalConfig(); - private final Properties properties; private GlobalConfig() { - properties = new Config().readPropertiesFromFile(); } /** @@ -26,12 +21,12 @@ public class GlobalConfig { * @return true, 自动换行;false,不自动换行 */ public boolean getAutoLineConfig() { - return Boolean.parseBoolean(properties.getProperty(TEXT_WRAP, "true")); + return Boolean.parseBoolean(PROPERTIES.getProperty(TEXT_WRAP, "true")); } public void setAutoLineConfig(boolean isAutoLine) { String autoLineConfig = String.valueOf(isAutoLine); - properties.setProperty(TEXT_WRAP, autoLineConfig); + PROPERTIES.setProperty(TEXT_WRAP, autoLineConfig); } public static GlobalConfig getConfig() { diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java index e63657f..54317ca 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java @@ -1,5 +1,8 @@ package org.jcnc.jnotepad.app.config; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCombination; import org.jcnc.jnotepad.app.entity.ShortcutKey; @@ -9,11 +12,10 @@ import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.slf4j.Logger; import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_NAME; +import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_SHORTCUT_KEY_NAME; import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CONFIG; /** @@ -25,6 +27,7 @@ import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CONFIG; public abstract class LoadJnotepadConfig { Logger logger = LogUtil.getLogger(this.getClass()); + public final void load() { // 判断是否存在这个配置文件 try (InputStream inputStream = new FileInputStream(CONFIG_NAME)) { @@ -35,10 +38,54 @@ public abstract class LoadJnotepadConfig { logger.info("未检测到配置文件!"); // 不存在则创建 createConfig(); + logger.info("已创建默认配置文件!"); } } - void createConfig() { + /** + * 解析配置文件 + * + * @param inputStream 输入流 + * @return java.util.List> + * @since 2023/8/25 15:18 + */ + protected List> parseConfig(InputStream inputStream) { + StringBuffer jsonData = new StringBuffer(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = reader.readLine()) != null) { + jsonData.append(line); + } + } catch (IOException e) { + PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!"); + } + // 转json对象 + ObjectMapper mapper = new ObjectMapper(); + Map> mainConfig = null; + try { + mainConfig = mapper.readValue(jsonData.toString(), new TypeReference>>() { + }); + } catch (JsonProcessingException e) { + PopUpUtil.errorAlert("错误", "解析错误", "配置文件解析错误!"); + logger.error("配置文件解析错误!", e); + } + if (mainConfig == null) { + logger.error("未获取到主要配置文件!"); + return Collections.emptyList(); + } + return mainConfig.get(CONFIG_SHORTCUT_KEY_NAME) + .stream() + .map(e -> { + if (e instanceof LinkedHashMap) { + return (LinkedHashMap) e; + } else { + throw new IllegalArgumentException("Invalid element type"); + } + }) + .toList(); + } + + private void createConfig() { List shortcutKeyList = getShortcutKeys(); JnotepadConfig.getInstance().setShortcutKeyList(shortcutKeyList); for (ShortcutKey shortcutKey : shortcutKeyList) { diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java new file mode 100644 index 0000000..e031dd6 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java @@ -0,0 +1,31 @@ +package org.jcnc.jnotepad.app.config; + +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.List; + +import static org.jcnc.jnotepad.constants.TextConstants.CONFIG; +import static org.jcnc.jnotepad.constants.TextConstants.LANGUAGE_MAP; + +/** + * 加载语言配置文件 + * + * @author gewuyou + * @see [相关类/方法] + */ +public class LoadLanguageConfig extends LoadJnotepadConfig { + @Override + protected void loadConfig(InputStream inputStream) { + List> configData = parseConfig(inputStream); + String language = ""; + for (LinkedHashMap config : configData) { + language = config.get("language"); + if (language != null) { + break; + } + } + if (!"".equals(language) && language != null) { + CONFIG.setLanguagePackName(LANGUAGE_MAP.get(language)); + } + } +} diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java index f938a76..f679fa5 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java @@ -1,22 +1,15 @@ package org.jcnc.jnotepad.app.config; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCombination; import org.jcnc.jnotepad.tool.LogUtil; -import org.jcnc.jnotepad.tool.PopUpUtil; import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.slf4j.Logger; -import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.*; - -import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_SHORTCUT_KEY_NAME; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; /** * 加载快捷键实现 @@ -28,41 +21,8 @@ public class LoadShortcutKeyConfig extends LoadJnotepadConfig { @Override protected void loadConfig(InputStream inputStream) { - StringBuffer jsonData = new StringBuffer(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = reader.readLine()) != null) { - jsonData.append(line); - } - } catch (IOException e) { - PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!"); - } - // 转json对象 - ObjectMapper mapper = new ObjectMapper(); - Map> mainConfig = null; - try { - mainConfig = mapper.readValue(jsonData.toString(), new TypeReference>>() { - }); - } catch (JsonProcessingException e) { - PopUpUtil.errorAlert("错误", "解析错误", "配置文件解析错误!"); - log.error("配置文件解析错误!", e); - } - if (mainConfig == null) { - log.error("未获取到主要配置文件!"); - return; - } - List> objectList = mainConfig.get(CONFIG_SHORTCUT_KEY_NAME) - .stream() - .map(e -> { - if (e instanceof LinkedHashMap) { - return (LinkedHashMap) e; - } else { - throw new IllegalArgumentException("Invalid element type"); - } - }) - .toList(); - - for (LinkedHashMap shortcutKey : objectList) { + List> configData = parseConfig(inputStream); + for (LinkedHashMap shortcutKey : configData) { // 保证json的key必须和变量名一致 MenuItem menuItem = JNotepadMenuBar.getMenuBar().getItemMap().get(shortcutKey.get("buttonName")); String shortKeyValue = shortcutKey.get("shortcutKeyValue"); diff --git a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java index c962615..f81030e 100644 --- a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java @@ -2,6 +2,7 @@ package org.jcnc.jnotepad.constants; import org.jcnc.jnotepad.init.Config; +import java.util.Map; import java.util.Properties; /** @@ -17,8 +18,11 @@ public class TextConstants { private TextConstants() { } - private static final Config CONFIG = new Config(); - private static final Properties PROPERTIES = CONFIG.readPropertiesFromFile(); + public static final Config CONFIG = new Config(); + public static final Properties PROPERTIES = CONFIG.readPropertiesFromFile(); + + /// 应用程序文本常量 + public static final String TITLE = PROPERTIES.getProperty("title", "JNotepad"); ///菜单栏文本常量 @@ -44,6 +48,15 @@ public class TextConstants { public static final String OPEN_CONFIGURATION_FILE = PROPERTIES.getProperty("OPEN_CONFIGURATION_FILE"); + public static final String TOP = PROPERTIES.getProperty("TOP"); + + public static final String LANGUAGE = PROPERTIES.getProperty("LANGUAGE"); + + public static final String CHINESE = PROPERTIES.getProperty("CHINESE"); + + public static final String ENGLISH = PROPERTIES.getProperty("ENGLISH"); + + /// GlobalConfig文本常量 /** * 自动换行配置key @@ -70,7 +83,11 @@ public class TextConstants { public static final String WORD_COUNT = PROPERTIES.getProperty("WORD_COUNT"); public static final String ENCODE = PROPERTIES.getProperty("ENCODE"); - + /// 语言映射 + public static final Map LANGUAGE_MAP = Map.of( + "chinese", "JNotepad ch_language_pack", + "english", "JNotepad en_language_pack" + ); /// 配置文件文本常量 /** * 内置配置文件 @@ -78,6 +95,7 @@ public class TextConstants { public static final String JNOTEPAD_CONFIG = """ { + "language":"chinese", "shortcutKey":[ { "buttonName": "newItem", diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java index a6d4cad..577bfce 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java @@ -47,7 +47,7 @@ public class SaveFile implements EventHandler { // 如果该文件是配置文件则刷新快捷键 if (CONFIG_NAME.equals(selectedTab.getText())) { // 初始化快捷键 - View.getInstance().initShortcutKey(new LoadShortcutKeyConfig()); + View.getInstance().initJnotepadConfig(new LoadShortcutKeyConfig()); logger.info("已刷新快捷键!"); } } diff --git a/src/main/java/org/jcnc/jnotepad/init/Config.java b/src/main/java/org/jcnc/jnotepad/init/Config.java index 5b646d6..d9a43d8 100644 --- a/src/main/java/org/jcnc/jnotepad/init/Config.java +++ b/src/main/java/org/jcnc/jnotepad/init/Config.java @@ -22,6 +22,14 @@ public class Config { Logger logger = LogUtil.getLogger(this.getClass()); + public void setLanguagePackName(String languagePackName) { + this.languagePackName = languagePackName; + } + + public String getLanguagePackName() { + return languagePackName; + } + /** * 从文件中读取属性配置。 * @@ -29,11 +37,11 @@ public class Config { */ public Properties readPropertiesFromFile() { Properties properties = new Properties(); - - //设置语言包 + // 设置语言包 languagePackName = EN_LANGUAGE_PACK_NAME; try (InputStream inputStream = new FileInputStream(languagePackName)) { - InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); // 使用 UTF-8 编码 + // 使用 UTF-8 编码 + InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); properties.load(reader); } catch (IOException e) { // 如果读取出错,则调用初始化方法 @@ -52,7 +60,8 @@ public class Config { Properties enLanguagePack = getEnglishLanguagePack(); try (OutputStream outputStream = new FileOutputStream(CH_LANGUAGE_PACK_NAME)) { - OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); // 使用 UTF-8 编码 + // 使用 UTF-8 编码 + OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); chLanguagePack.store(writer, JNOTEPAD_CH_LANGUAGE_PACK_NAME); } catch (IOException ignored) { @@ -60,7 +69,8 @@ public class Config { } try (OutputStream outputStream = new FileOutputStream(EN_LANGUAGE_PACK_NAME)) { - OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); // 使用 UTF-8 编码 + // 使用 UTF-8 编码 + OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); enLanguagePack.store(writer, JNOTEPAD_EN_LANGUAGE_PACK_NAME); } catch (IOException ignored) { @@ -70,8 +80,8 @@ public class Config { private static Properties getChineseLanguagePack() { Properties properties = new Properties(); - - properties.setProperty("TITLE", "JNotepad"); // 设置默认属性 + // 设置默认属性 + properties.setProperty("TITLE", "JNotepad"); properties.setProperty("NEW_FILE", "新建文件"); properties.setProperty("SAVA", "保存"); properties.setProperty("FILE", "文件"); @@ -88,6 +98,10 @@ public class Config { properties.setProperty("COLUMN", "列数"); properties.setProperty("WORD_COUNT", "字数"); properties.setProperty("ENCODE", "编码"); + properties.setProperty("TOP", "窗口置顶"); + properties.setProperty("LANGUAGE", "语言"); + properties.setProperty("CHINESE", "中文"); + properties.setProperty("ENGLISH", "英文"); return properties; } @@ -111,6 +125,10 @@ public class Config { properties.setProperty("COLUMN", "Column"); properties.setProperty("WORD_COUNT", "Word Count"); properties.setProperty("ENCODE", "Encoding"); + properties.setProperty("TOP", "Window Top"); + properties.setProperty("LANGUAGE", "Language"); + properties.setProperty("CHINESE", "Chinese"); + properties.setProperty("ENGLISH", "English"); return properties; } diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java index b601e40..7233054 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java +++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java @@ -3,14 +3,12 @@ package org.jcnc.jnotepad.tool; import com.ibm.icu.text.CharsetDetector; import com.ibm.icu.text.CharsetMatch; -import org.jcnc.jnotepad.constants.TextConstants; import org.slf4j.Logger; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import static org.jcnc.jnotepad.constants.TextConstants.UNKNOWN; diff --git a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java index b17d71a..9659cdf 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java @@ -4,6 +4,7 @@ import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; +import javafx.stage.Stage; import org.jcnc.jnotepad.app.config.GlobalConfig; import org.jcnc.jnotepad.controller.event.handler.*; import org.jcnc.jnotepad.ui.tab.JNotepadTab; @@ -38,7 +39,7 @@ public class JNotepadMenuBar extends MenuBar { */ private Menu fileMenu; /** - * 插件菜单 + * 设置菜单 */ private Menu setMenu; /** @@ -46,6 +47,11 @@ public class JNotepadMenuBar extends MenuBar { */ private Menu pluginMenu; + /** + * 语言菜单 + */ + private Menu languageMenu; + /// 菜单按钮 /** @@ -80,8 +86,19 @@ public class JNotepadMenuBar extends MenuBar { * 自动换行点击菜单按钮 */ private CheckMenuItem lineFeedItem; + /** + * 置顶按钮 + */ + private CheckMenuItem topItem; - + /** + * 中文选项 + */ + private MenuItem chineseItem; + /** + * 英文选项 + */ + private MenuItem englishItem; private final Map itemMap = new HashMap<>(); /** @@ -89,13 +106,31 @@ public class JNotepadMenuBar extends MenuBar { */ private void init() { initFileMenu(); + initLanguageMenu(); initSettingMenu(); initPluginMenu(); + // 菜单栏 this.getMenus().addAll(fileMenu, setMenu, pluginMenu); initEventHandlers(); } + /** + * 初始化语言菜单 + */ + private void initLanguageMenu() { + // 语言菜单 + languageMenu = new Menu(LANGUAGE); + + chineseItem = new MenuItem(CHINESE); + itemMap.put("chineseItem", chineseItem); + + englishItem = new MenuItem(ENGLISH); + itemMap.put("englishItem", englishItem); + + languageMenu.getItems().addAll(chineseItem, englishItem); + } + /** * 初始化文件菜单 */ @@ -128,9 +163,15 @@ public class JNotepadMenuBar extends MenuBar { lineFeedItem = new CheckMenuItem(WORD_WRAP); itemMap.put("lineFeedItem", lineFeedItem); lineFeedItem.selectedProperty().set(true); + + topItem = new CheckMenuItem(TOP); + itemMap.put("topItem", topItem); + openConfigItem = new MenuItem(OPEN_CONFIGURATION_FILE); itemMap.put("openConfigItem", openConfigItem); - setMenu.getItems().addAll(lineFeedItem, openConfigItem); + + itemMap.put("languageMenu", languageMenu); + setMenu.getItems().addAll(lineFeedItem, openConfigItem, topItem, languageMenu); } /** @@ -167,6 +208,13 @@ public class JNotepadMenuBar extends MenuBar { // 2. 对当前tab生效配置 jNotepadTabPane.fireTabSelected(); }); + topItem.selectedProperty().addListener((observableValue, before, after) -> { + // 获取窗口容器 + Stage primaryStage = (Stage) this.getScene().getWindow(); + // 设置窗口为置顶 + primaryStage.setAlwaysOnTop(after); + }); + } public Map getItemMap() { diff --git a/src/main/java/org/jcnc/jnotepad/view/init/View.java b/src/main/java/org/jcnc/jnotepad/view/init/View.java index f129ffe..8625b66 100644 --- a/src/main/java/org/jcnc/jnotepad/view/init/View.java +++ b/src/main/java/org/jcnc/jnotepad/view/init/View.java @@ -2,6 +2,8 @@ package org.jcnc.jnotepad.view.init; import org.jcnc.jnotepad.app.config.LoadJnotepadConfig; +import java.util.List; + /** * @author 许轲 @@ -14,14 +16,27 @@ public class View { private static final View INSTANCE = new View(); /** - * 初始化快捷键 + * 初始化配置文件 * - * @param loadJnotepadConfig 加载配置文件 + * @param loadJnotepadConfigs 需要加载的配置文件数组 * @since 2023/8/24 15:29 */ - public void initShortcutKey(LoadJnotepadConfig loadJnotepadConfig) { + public void initJnotepadConfigs(List loadJnotepadConfigs) { + for (LoadJnotepadConfig loadJnotepadConfig : loadJnotepadConfigs) { + initJnotepadConfig(loadJnotepadConfig); + } + } + + /** + * 初始化配置文件 + * + * @param loadJnotepadConfig 配置文件 + * @since 2023/8/24 15:29 + */ + public void initJnotepadConfig(LoadJnotepadConfig loadJnotepadConfig) { loadJnotepadConfig.load(); } + public static View getInstance() { return INSTANCE; } From eb7eb2552c0636e959c45617b829fb887b093c48 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Fri, 25 Aug 2023 23:05:44 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E2=9E=95=20=E6=B7=BB=E5=8A=A0=E7=BD=AE?= =?UTF-8?q?=E9=A1=B6=E5=8A=9F=E8=83=BD=20=E2=9A=A1=EF=B8=8F=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/module-info.java | 1 - src/main/java/org/jcnc/jnotepad/LunchApp.java | 21 +- .../jnotepad/app/config/GlobalConfig.java | 7 +- .../app/config/LoadJnotepadConfig.java | 73 ++-- .../app/config/LoadLanguageConfig.java | 42 ++- .../app/config/LoadShortcutKeyConfig.java | 32 +- .../app/config/LocalizationConfig.java | 314 ++++++++++++++++++ .../jnotepad/constants/TextConstants.java | 65 +--- .../controller/event/handler/NewFile.java | 5 +- .../controller/event/handler/OpenConfig.java | 2 +- .../controller/manager/Controller.java | 7 +- .../java/org/jcnc/jnotepad/init/Config.java | 135 -------- .../jcnc/jnotepad/tool/EncodingDetector.java | 13 +- .../java/org/jcnc/jnotepad/tool/FileUtil.java | 1 + .../jnotepad/ui/menu/JNotepadMenuBar.java | 94 ++++-- .../jnotepad/ui/status/JNotepadStatusBox.java | 23 +- .../org/jcnc/jnotepad/view/init/View.java | 6 +- 17 files changed, 522 insertions(+), 319 deletions(-) create mode 100644 src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java delete mode 100644 src/main/java/org/jcnc/jnotepad/init/Config.java diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 6cde0ce..1a3f9b1 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -12,7 +12,6 @@ module org.jcnc.jnotepad { requires ch.qos.logback.core; requires ch.qos.logback.classic; requires com.ibm.icu; - exports org.jcnc.jnotepad.init; exports org.jcnc.jnotepad.app.config; exports org.jcnc.jnotepad; exports org.jcnc.jnotepad.tool; diff --git a/src/main/java/org/jcnc/jnotepad/LunchApp.java b/src/main/java/org/jcnc/jnotepad/LunchApp.java index 7b3ee60..5ce4dab 100644 --- a/src/main/java/org/jcnc/jnotepad/LunchApp.java +++ b/src/main/java/org/jcnc/jnotepad/LunchApp.java @@ -10,6 +10,7 @@ import javafx.stage.Stage; import org.jcnc.jnotepad.app.config.LoadJnotepadConfig; import org.jcnc.jnotepad.app.config.LoadLanguageConfig; import org.jcnc.jnotepad.app.config.LoadShortcutKeyConfig; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.jcnc.jnotepad.constants.AppConstants; import org.jcnc.jnotepad.controller.manager.Controller; import org.jcnc.jnotepad.ui.LineNumberTextArea; @@ -22,7 +23,7 @@ import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static org.jcnc.jnotepad.constants.TextConstants.TITLE; + /** * 启动程序 @@ -34,19 +35,19 @@ public class LunchApp extends Application { * 线程池 */ private static final ExecutorService THREAD_POOL = Executors.newCachedThreadPool(); - + LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); Controller controller = Controller.getInstance(); Scene scene; /** * 配置文件数组 */ - static List loadJnotepadConfigs = new ArrayList<>(); + static List> loadJnotepadConfigs = new ArrayList<>(); static { - // 快捷键配置文件 - loadJnotepadConfigs.add(new LoadShortcutKeyConfig()); // 语言配置文件 loadJnotepadConfigs.add(new LoadLanguageConfig()); + // 快捷键配置文件 + loadJnotepadConfigs.add(new LoadShortcutKeyConfig()); } @Override @@ -69,16 +70,16 @@ public class LunchApp extends Application { Platform.runLater(() -> controller.updateUiWithNewTextArea(textArea)); } }); - primaryStage.setTitle(TITLE); + ViewManager viewManager = ViewManager.getInstance(scene); + viewManager.initScreen(scene); + // 加载配置文件 + View.getInstance().initJnotepadConfigs(loadJnotepadConfigs); + primaryStage.setTitle(localizationConfig.getTitle()); primaryStage.setWidth(width); primaryStage.setHeight(length); primaryStage.setScene(scene); primaryStage.getIcons().add(new Image(Objects.requireNonNull(getClass().getResource(icon)).toString())); primaryStage.show(); - ViewManager viewManager = ViewManager.getInstance(scene); - viewManager.initScreen(scene); - // 初始化快捷键 - View.getInstance().initJnotepadConfigs(loadJnotepadConfigs); } @Override diff --git a/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java index c771497..fbaaa51 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/GlobalConfig.java @@ -1,7 +1,5 @@ package org.jcnc.jnotepad.app.config; -import static org.jcnc.jnotepad.constants.TextConstants.PROPERTIES; -import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; /** * 内存中,运行过程中的全局配置项 @@ -11,6 +9,7 @@ import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; public class GlobalConfig { private static final GlobalConfig APP_GLOBAL_CONFIG = new GlobalConfig(); + LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); private GlobalConfig() { } @@ -21,12 +20,12 @@ public class GlobalConfig { * @return true, 自动换行;false,不自动换行 */ public boolean getAutoLineConfig() { - return Boolean.parseBoolean(PROPERTIES.getProperty(TEXT_WRAP, "true")); + return Boolean.parseBoolean(localizationConfig.getTextWrap()); } public void setAutoLineConfig(boolean isAutoLine) { String autoLineConfig = String.valueOf(isAutoLine); - PROPERTIES.setProperty(TEXT_WRAP, autoLineConfig); + localizationConfig.setTextWrap(autoLineConfig); } public static GlobalConfig getConfig() { diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java index 54317ca..78e6964 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java @@ -1,21 +1,23 @@ package org.jcnc.jnotepad.app.config; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCombination; import org.jcnc.jnotepad.app.entity.ShortcutKey; +import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.PopUpUtil; import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.slf4j.Logger; import java.io.*; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_NAME; -import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_SHORTCUT_KEY_NAME; import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CONFIG; /** @@ -24,9 +26,36 @@ import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CONFIG; * * @author gewuyou */ -public abstract class LoadJnotepadConfig { +public abstract class LoadJnotepadConfig { Logger logger = LogUtil.getLogger(this.getClass()); + /** + * 返回json配置文件的json节点 + * + * @param inputStream 输入流 + * @return java.lang.String + * @apiNote + * @since 2023/8/25 17:17 + */ + protected JsonNode getConfigJson(InputStream inputStream) { + StringBuffer jsonData = new StringBuffer(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = reader.readLine()) != null) { + jsonData.append(line); + } + } catch (IOException e) { + PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!"); + } + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode jsonNode; + try { + jsonNode = objectMapper.readTree(jsonData.toString()); + } catch (JsonProcessingException e) { + throw new AppException(e.getMessage()); + } + return jsonNode; + } public final void load() { // 判断是否存在这个配置文件 @@ -49,41 +78,7 @@ public abstract class LoadJnotepadConfig { * @return java.util.List> * @since 2023/8/25 15:18 */ - protected List> parseConfig(InputStream inputStream) { - StringBuffer jsonData = new StringBuffer(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = reader.readLine()) != null) { - jsonData.append(line); - } - } catch (IOException e) { - PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!"); - } - // 转json对象 - ObjectMapper mapper = new ObjectMapper(); - Map> mainConfig = null; - try { - mainConfig = mapper.readValue(jsonData.toString(), new TypeReference>>() { - }); - } catch (JsonProcessingException e) { - PopUpUtil.errorAlert("错误", "解析错误", "配置文件解析错误!"); - logger.error("配置文件解析错误!", e); - } - if (mainConfig == null) { - logger.error("未获取到主要配置文件!"); - return Collections.emptyList(); - } - return mainConfig.get(CONFIG_SHORTCUT_KEY_NAME) - .stream() - .map(e -> { - if (e instanceof LinkedHashMap) { - return (LinkedHashMap) e; - } else { - throw new IllegalArgumentException("Invalid element type"); - } - }) - .toList(); - } + protected abstract T parseConfig(InputStream inputStream); private void createConfig() { List shortcutKeyList = getShortcutKeys(); diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java index e031dd6..3f7860c 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadLanguageConfig.java @@ -1,31 +1,41 @@ package org.jcnc.jnotepad.app.config; -import java.io.InputStream; -import java.util.LinkedHashMap; -import java.util.List; +import org.jcnc.jnotepad.tool.LogUtil; +import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; +import org.slf4j.Logger; -import static org.jcnc.jnotepad.constants.TextConstants.CONFIG; -import static org.jcnc.jnotepad.constants.TextConstants.LANGUAGE_MAP; +import java.io.InputStream; + +import static org.jcnc.jnotepad.constants.TextConstants.LANGUAGE_FILE_MAP; /** * 加载语言配置文件 * * @author gewuyou - * @see [相关类/方法] */ -public class LoadLanguageConfig extends LoadJnotepadConfig { +public class LoadLanguageConfig extends LoadJnotepadConfig { + Logger log = LogUtil.getLogger(this.getClass()); + + LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); + + @Override + protected String parseConfig(InputStream inputStream) { + return getConfigJson(inputStream).get("language").asText(); + } + @Override protected void loadConfig(InputStream inputStream) { - List> configData = parseConfig(inputStream); - String language = ""; - for (LinkedHashMap config : configData) { - language = config.get("language"); - if (language != null) { - break; - } - } + log.info("正在加载语言配置文件..."); + String language = parseConfig(inputStream); if (!"".equals(language) && language != null) { - CONFIG.setLanguagePackName(LANGUAGE_MAP.get(language)); + log.info("正在加载语言包:{}", language); + localizationConfig.setLanguagePackName(LANGUAGE_FILE_MAP.get(language)); + // 刷新语言包 + localizationConfig.initLocalizationConfig(); + JNotepadMenuBar jNotepadMenuBar = JNotepadMenuBar.getMenuBar(); + // 刷新菜单栏 + jNotepadMenuBar.initMenuBar(); + jNotepadMenuBar.toggleLanguageCheck(language); } } } diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java index f679fa5..197ae7d 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadShortcutKeyConfig.java @@ -1,5 +1,6 @@ package org.jcnc.jnotepad.app.config; +import com.fasterxml.jackson.databind.JsonNode; import javafx.scene.control.MenuItem; import javafx.scene.input.KeyCombination; import org.jcnc.jnotepad.tool.LogUtil; @@ -7,18 +8,41 @@ import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.slf4j.Logger; import java.io.InputStream; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Objects; +import java.util.*; + +import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_SHORTCUT_KEY_NAME; /** * 加载快捷键实现 * * @author gewuyou 一个大转盘 */ -public class LoadShortcutKeyConfig extends LoadJnotepadConfig { +public class LoadShortcutKeyConfig extends LoadJnotepadConfig>> { Logger log = LogUtil.getLogger(this.getClass()); + @Override + protected List> parseConfig(InputStream inputStream) { + JsonNode shortcutKeyNode = getConfigJson(inputStream).get(CONFIG_SHORTCUT_KEY_NAME); + if (shortcutKeyNode == null || !shortcutKeyNode.isArray()) { + logger.error("未获取到主要配置文件!"); + return Collections.emptyList(); + } + List> shortcutKeyList = new ArrayList<>(); + for (JsonNode node : shortcutKeyNode) { + if (node.isObject()) { + LinkedHashMap shortcutKey = new LinkedHashMap<>(); + Iterator> fields = node.fields(); + while (fields.hasNext()) { + Map.Entry entry = fields.next(); + shortcutKey.put(entry.getKey(), entry.getValue().asText()); + + } + shortcutKeyList.add(shortcutKey); + } + } + return shortcutKeyList; + } + @Override protected void loadConfig(InputStream inputStream) { List> configData = parseConfig(inputStream); diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java new file mode 100644 index 0000000..24dda22 --- /dev/null +++ b/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java @@ -0,0 +1,314 @@ +package org.jcnc.jnotepad.app.config; + +import org.jcnc.jnotepad.tool.LogUtil; +import org.slf4j.Logger; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.Properties; + +import static org.jcnc.jnotepad.constants.AppConstants.CH_LANGUAGE_PACK_NAME; +import static org.jcnc.jnotepad.constants.AppConstants.EN_LANGUAGE_PACK_NAME; +import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; + +/** + * 本地化配置文件 + * + * @author gewuyou + */ +public class LocalizationConfig { + Logger logger = LogUtil.getLogger(this.getClass()); + private static final LocalizationConfig LOCALIZATION_CONFIG = new LocalizationConfig(); + private final Properties properties = new Properties(); + + /** + * 本地化语言包名,默认英文 + */ + private String languagePackName = EN_LANGUAGE_PACK_NAME; + + private LocalizationConfig() { + + } + + /** + * 初始化本地化语言包 + * + * @since 2023/8/25 18:18 + */ + public void initLocalizationConfig() { + // 设置语言包 + try (InputStream inputStream = new FileInputStream(languagePackName)) { + // 使用 UTF-8 编码 + InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + properties.load(reader); + } catch (IOException e) { + // 如果读取出错,则调用初始化方法 + initializePropertiesFile(); + } + logger.info("初始化本地化语言包成功!"); + title = properties.getProperty("title", "JNotepad"); + sava = properties.getProperty("SAVA"); + file = properties.getProperty("FILE"); + newly = properties.getProperty("NEW"); + open = properties.getProperty("OPEN"); + savaAs = properties.getProperty("SAVA_AS"); + set = properties.getProperty("SET"); + wordWrap = properties.getProperty("WORD_WRAP"); + plugin = properties.getProperty("PLUGIN"); + addPlugin = properties.getProperty("ADD_PLUGIN"); + statistics = properties.getProperty("STATISTICS"); + openConfigurationFile = properties.getProperty("OPEN_CONFIGURATION_FILE"); + top = properties.getProperty("TOP"); + language = properties.getProperty("LANGUAGE"); + chinese = properties.getProperty("CHINESE"); + english = properties.getProperty("ENGLISH"); + textWrap = properties.getProperty(TEXT_WRAP, "true"); + newFile = properties.getProperty("NEW_FILE"); + unknown = properties.getProperty("UNKNOWN"); + row = properties.getProperty("ROW"); + column = properties.getProperty("COLUMN"); + wordCount = properties.getProperty("WORD_COUNT"); + encode = properties.getProperty("ENCODE"); + } + + /** + * 初始化属性配置文件。 + * 如果属性文件不存在,将创建一个新的属性文件并设置默认属性。 + */ + public void initializePropertiesFile() { + switch (languagePackName) { + case CH_LANGUAGE_PACK_NAME -> { + setChineseLanguagePack(); + createLanguagePacks(languagePackName, properties); + } + case EN_LANGUAGE_PACK_NAME -> { + setEnglishLanguagePack(); + createLanguagePacks(languagePackName, properties); + } + default -> logger.error("语言包加载错误!"); + } + + } + + private void createLanguagePacks(String languagePackName, Properties languagePack) { + try (OutputStream outputStream = new FileOutputStream(languagePackName)) { + // 使用 UTF-8 编码 + OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); + languagePack.store(writer, languagePackName); + } catch (IOException ignored) { + logger.info("未检测到语言包!"); + } + } + + private void setChineseLanguagePack() { + properties.clear(); + // 设置默认属性 + properties.setProperty("TITLE", "JNotepad"); + properties.setProperty("NEW_FILE", "新建文件"); + properties.setProperty("SAVA", "保存"); + properties.setProperty("FILE", "文件"); + properties.setProperty("NEW", "新建"); + properties.setProperty("OPEN", "打开"); + properties.setProperty("SAVA_AS", "另存为"); + properties.setProperty("SET", "设置"); + properties.setProperty("WORD_WRAP", "自动换行"); + properties.setProperty("OPEN_CONFIGURATION_FILE", "打开配置文件"); + properties.setProperty("PLUGIN", "插件"); + properties.setProperty("ADD_PLUGIN", "增加插件"); + properties.setProperty("STATISTICS", "统计字数"); + properties.setProperty("ROW", "行数"); + properties.setProperty("COLUMN", "列数"); + properties.setProperty("WORD_COUNT", "字数"); + properties.setProperty("ENCODE", "编码"); + properties.setProperty("TOP", "窗口置顶"); + properties.setProperty("LANGUAGE", "语言"); + properties.setProperty("CHINESE", "中文"); + properties.setProperty("ENGLISH", "英文"); + } + + private void setEnglishLanguagePack() { + properties.clear(); + properties.setProperty("TITLE", "JNotepad"); + properties.setProperty("NEW_FILE", "New File"); + properties.setProperty("SAVA", "Save"); + properties.setProperty("FILE", "File"); + properties.setProperty("NEW", "New"); + properties.setProperty("OPEN", "Open"); + properties.setProperty("SAVA_AS", "Save As"); + properties.setProperty("SET", "Settings"); + properties.setProperty("WORD_WRAP", "Word Wrap"); + properties.setProperty("OPEN_CONFIGURATION_FILE", "Open Configuration File"); + properties.setProperty("PLUGIN", "Plugins"); + properties.setProperty("ADD_PLUGIN", "Add Plugin"); + properties.setProperty("STATISTICS", "Word Count"); + properties.setProperty("ROW", "Row"); + properties.setProperty("COLUMN", "Column"); + properties.setProperty("WORD_COUNT", "Word Count"); + properties.setProperty("ENCODE", "Encoding"); + properties.setProperty("TOP", "Window Top"); + properties.setProperty("LANGUAGE", "Language"); + properties.setProperty("CHINESE", "Chinese"); + properties.setProperty("ENGLISH", "English"); + } + + private String textWrap; + /// 应用程序文本 + + private String title; + + ///菜单栏文本 + + private String sava; + + private String file; + + private String newly; + + private String open; + + private String savaAs; + + private String set; + + private String wordWrap; + + private String plugin; + + private String addPlugin; + + private String statistics; + + private String openConfigurationFile; + + private String top; + + private String language; + + private String chinese; + + private String english; + + /// NewFile 文本常量 + + private String newFile; + /// EncodingDetector 文本常量 + private String unknown; + + /// JNotepadStatusBox + private String row; + + private String column; + + private String wordCount; + + private String encode; + + public static LocalizationConfig getLocalizationConfig() { + return LOCALIZATION_CONFIG; + } + + public void setLanguagePackName(String languagePackName) { + this.languagePackName = languagePackName; + } + + public String getTitle() { + return title; + } + + public String getSava() { + return sava; + } + + public String getFile() { + return file; + } + + public String getNewly() { + return newly; + } + + public String getOpen() { + return open; + } + + public String getSavaAs() { + return savaAs; + } + + public String getSet() { + return set; + } + + public String getWordWrap() { + return wordWrap; + } + + public String getPlugin() { + return plugin; + } + + public String getAddPlugin() { + return addPlugin; + } + + public String getStatistics() { + return statistics; + } + + public String getOpenConfigurationFile() { + return openConfigurationFile; + } + + public String getTop() { + return top; + } + + public String getLanguage() { + return language; + } + + public String getChinese() { + return chinese; + } + + public String getEnglish() { + return english; + } + + public String getNewFile() { + return newFile; + } + + public String getUnknown() { + return unknown; + } + + public String getRow() { + return row; + } + + public String getColumn() { + return column; + } + + public String getWordCount() { + return wordCount; + } + + public String getEncode() { + return encode; + } + + public String getLanguagePackName() { + return languagePackName; + } + + public String getTextWrap() { + return textWrap; + } + + public void setTextWrap(String textWrap) { + this.textWrap = textWrap; + properties.setProperty(TEXT_WRAP, textWrap); + } +} diff --git a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java index f81030e..ea4b8d5 100644 --- a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java @@ -1,9 +1,7 @@ package org.jcnc.jnotepad.constants; -import org.jcnc.jnotepad.init.Config; import java.util.Map; -import java.util.Properties; /** * 文本常量 @@ -15,47 +13,10 @@ import java.util.Properties; * @author gewuyou */ public class TextConstants { + private TextConstants() { } - public static final Config CONFIG = new Config(); - public static final Properties PROPERTIES = CONFIG.readPropertiesFromFile(); - - /// 应用程序文本常量 - public static final String TITLE = PROPERTIES.getProperty("title", "JNotepad"); - - ///菜单栏文本常量 - - public static final String SAVA = PROPERTIES.getProperty("SAVA"); - - public static final String FILE = PROPERTIES.getProperty("FILE"); - - public static final String NEW = PROPERTIES.getProperty("NEW"); - - public static final String OPEN = PROPERTIES.getProperty("OPEN"); - - public static final String SAVA_AS = PROPERTIES.getProperty("SAVA_AS"); - - public static final String SET = PROPERTIES.getProperty("SET"); - - public static final String WORD_WRAP = PROPERTIES.getProperty("WORD_WRAP"); - - public static final String PLUGIN = PROPERTIES.getProperty("PLUGIN"); - - public static final String ADD_PLUGIN = PROPERTIES.getProperty("ADD_PLUGIN"); - - public static final String STATISTICS = PROPERTIES.getProperty("STATISTICS"); - - public static final String OPEN_CONFIGURATION_FILE = PROPERTIES.getProperty("OPEN_CONFIGURATION_FILE"); - - public static final String TOP = PROPERTIES.getProperty("TOP"); - - public static final String LANGUAGE = PROPERTIES.getProperty("LANGUAGE"); - - public static final String CHINESE = PROPERTIES.getProperty("CHINESE"); - - public static final String ENGLISH = PROPERTIES.getProperty("ENGLISH"); - /// GlobalConfig文本常量 /** @@ -63,30 +24,20 @@ public class TextConstants { */ public static final String TEXT_WRAP = "text.wrap"; - /// NewFile 文本常量 - - public static final String NEW_FILE = PROPERTIES.getProperty("NEW_FILE"); /// Config 文本常量 - public static final String JNOTEPAD_CH_LANGUAGE_PACK_NAME = PROPERTIES.getProperty("JNotepad ch_language_pack"); - public static final String JNOTEPAD_EN_LANGUAGE_PACK_NAME = PROPERTIES.getProperty("JNotepad en_language_pack"); + public static final String CH_LANGUAGE_PACK_NAME = "ch_language_pack.txt"; + public static final String EN_LANGUAGE_PACK_NAME = "en_language_pack.txt"; - /// EncodingDetector 文本常量 - public static final String UNKNOWN = PROPERTIES.getProperty("UNKNOWN"); + public static final String ENGLISH = "english"; - /// JNotepadStatusBox - public static final String ROW = PROPERTIES.getProperty("ROW"); + public static final String CHINESE = "chinese"; - public static final String COLUMN = PROPERTIES.getProperty("COLUMN"); - - public static final String WORD_COUNT = PROPERTIES.getProperty("WORD_COUNT"); - - public static final String ENCODE = PROPERTIES.getProperty("ENCODE"); /// 语言映射 - public static final Map LANGUAGE_MAP = Map.of( - "chinese", "JNotepad ch_language_pack", - "english", "JNotepad en_language_pack" + public static final Map LANGUAGE_FILE_MAP = Map.of( + CHINESE, CH_LANGUAGE_PACK_NAME, + ENGLISH, EN_LANGUAGE_PACK_NAME ); /// 配置文件文本常量 /** diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java index 5523e58..5e56cca 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/NewFile.java @@ -2,14 +2,13 @@ package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.jcnc.jnotepad.ui.LineNumberTextArea; import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; import org.jcnc.jnotepad.view.manager.ViewManager; -import static org.jcnc.jnotepad.constants.TextConstants.NEW_FILE; - /** * 新建文件事件的事件处理程序。 @@ -35,7 +34,7 @@ public class NewFile implements EventHandler { // TODO: refactor:统一TextArea新建、绑定监听器入口 ViewManager viewManager = ViewManager.getInstance(); // 将Tab页添加到TabPane中 - JNotepadTabPane.getInstance().addNewTab(new JNotepadTab(NEW_FILE + JNotepadTabPane.getInstance().addNewTab(new JNotepadTab(LocalizationConfig.getLocalizationConfig().getNewFile() + viewManager.selfIncreaseAndGetTabIndex(), textArea)); diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenConfig.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenConfig.java index c8957b4..51fc8f2 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenConfig.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/OpenConfig.java @@ -22,11 +22,11 @@ public class OpenConfig extends OpenHandler { // 显示文件选择对话框,并获取选中的文件 File file = new File(CONFIG_NAME); LogUtil.getLogger(this.getClass()).info("已调用打开配置文件功能"); + LogUtil.getLogger(this.getClass()).info("{}", file); // 创建打开文件的任务 Task openFileTask = getVoidTask(controller, file); // 创建并启动线程执行任务 Thread thread = new Thread(openFileTask); thread.start(); - } } diff --git a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java index f531032..3717a38 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java +++ b/src/main/java/org/jcnc/jnotepad/controller/manager/Controller.java @@ -3,6 +3,7 @@ package org.jcnc.jnotepad.controller.manager; import javafx.application.Platform; import javafx.concurrent.Task; import org.jcnc.jnotepad.Interface.ControllerInterface; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.jcnc.jnotepad.tool.EncodingDetector; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.ui.LineNumberTextArea; @@ -17,8 +18,6 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.List; -import static org.jcnc.jnotepad.constants.TextConstants.NEW_FILE; - /** * 控制器类,实现ControllerInterface接口,用于管理文本编辑器的各种操作和事件处理。 * 包括打开关联文件、创建文本区域、处理行分隔、新建文件、打开文件、自动保存等功能。 @@ -89,7 +88,7 @@ public class Controller implements ControllerInterface { textBuilder.append(line).append("\n"); } String text = textBuilder.toString(); - + LogUtil.getLogger(this.getClass()).info("已调用读取文件功能"); Platform.runLater(() -> { textArea.getMainTextArea().setText(text); JNotepadTab tab = createNewTab(file.getName(), textArea, encoding); @@ -112,7 +111,7 @@ public class Controller implements ControllerInterface { @Override public void updateUiWithNewTextArea(LineNumberTextArea textArea) { ViewManager viewManager = ViewManager.getInstance(); - String tabTitle = NEW_FILE + viewManager.selfIncreaseAndGetTabIndex(); + String tabTitle = LocalizationConfig.getLocalizationConfig().getNewFile() + viewManager.selfIncreaseAndGetTabIndex(); JNotepadTabPane.getInstance().addNewTab(new JNotepadTab(tabTitle, textArea)); } diff --git a/src/main/java/org/jcnc/jnotepad/init/Config.java b/src/main/java/org/jcnc/jnotepad/init/Config.java deleted file mode 100644 index d9a43d8..0000000 --- a/src/main/java/org/jcnc/jnotepad/init/Config.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.jcnc.jnotepad.init; - -import org.jcnc.jnotepad.tool.LogUtil; -import org.slf4j.Logger; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Properties; - -import static org.jcnc.jnotepad.constants.AppConstants.CH_LANGUAGE_PACK_NAME; -import static org.jcnc.jnotepad.constants.AppConstants.EN_LANGUAGE_PACK_NAME; -import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CH_LANGUAGE_PACK_NAME; -import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_EN_LANGUAGE_PACK_NAME; - -/** - * @author 许轲 - * 该类负责配置文件的读取和初始化操作。 - */ -public class Config { - - private String languagePackName; - - Logger logger = LogUtil.getLogger(this.getClass()); - - public void setLanguagePackName(String languagePackName) { - this.languagePackName = languagePackName; - } - - public String getLanguagePackName() { - return languagePackName; - } - - /** - * 从文件中读取属性配置。 - * - * @return 包含从文件中读取的属性的 Properties 对象。 - */ - public Properties readPropertiesFromFile() { - Properties properties = new Properties(); - // 设置语言包 - languagePackName = EN_LANGUAGE_PACK_NAME; - try (InputStream inputStream = new FileInputStream(languagePackName)) { - // 使用 UTF-8 编码 - InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); - properties.load(reader); - } catch (IOException e) { - // 如果读取出错,则调用初始化方法 - initializePropertiesFile(); - } - return properties; - } - - /** - * 初始化属性配置文件。 - * 如果属性文件不存在,将创建一个新的属性文件并设置默认属性。 - */ - public void initializePropertiesFile() { - Properties chLanguagePack = getChineseLanguagePack(); - - Properties enLanguagePack = getEnglishLanguagePack(); - - try (OutputStream outputStream = new FileOutputStream(CH_LANGUAGE_PACK_NAME)) { - // 使用 UTF-8 编码 - OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); - chLanguagePack.store(writer, JNOTEPAD_CH_LANGUAGE_PACK_NAME); - - } catch (IOException ignored) { - logger.info("未检测到中文语言包!"); - } - - try (OutputStream outputStream = new FileOutputStream(EN_LANGUAGE_PACK_NAME)) { - // 使用 UTF-8 编码 - OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); - enLanguagePack.store(writer, JNOTEPAD_EN_LANGUAGE_PACK_NAME); - - } catch (IOException ignored) { - logger.info("未检测到英文语言包!"); - } - } - - private static Properties getChineseLanguagePack() { - Properties properties = new Properties(); - // 设置默认属性 - properties.setProperty("TITLE", "JNotepad"); - properties.setProperty("NEW_FILE", "新建文件"); - properties.setProperty("SAVA", "保存"); - properties.setProperty("FILE", "文件"); - properties.setProperty("NEW", "新建"); - properties.setProperty("OPEN", "打开"); - properties.setProperty("SAVA_AS", "另存为"); - properties.setProperty("SET", "设置"); - properties.setProperty("WORD_WRAP", "自动换行"); - properties.setProperty("OPEN_CONFIGURATION_FILE", "打开配置文件"); - properties.setProperty("PLUGIN", "插件"); - properties.setProperty("ADD_PLUGIN", "增加插件"); - properties.setProperty("STATISTICS", "统计字数"); - properties.setProperty("ROW", "行数"); - properties.setProperty("COLUMN", "列数"); - properties.setProperty("WORD_COUNT", "字数"); - properties.setProperty("ENCODE", "编码"); - properties.setProperty("TOP", "窗口置顶"); - properties.setProperty("LANGUAGE", "语言"); - properties.setProperty("CHINESE", "中文"); - properties.setProperty("ENGLISH", "英文"); - return properties; - } - - private static Properties getEnglishLanguagePack() { - Properties properties = new Properties(); - - properties.setProperty("TITLE", "JNotepad"); - properties.setProperty("NEW_FILE", "New File"); - properties.setProperty("SAVA", "Save"); - properties.setProperty("FILE", "File"); - properties.setProperty("NEW", "New"); - properties.setProperty("OPEN", "Open"); - properties.setProperty("SAVA_AS", "Save As"); - properties.setProperty("SET", "Settings"); - properties.setProperty("WORD_WRAP", "Word Wrap"); - properties.setProperty("OPEN_CONFIGURATION_FILE", "Open Configuration File"); - properties.setProperty("PLUGIN", "Plugins"); - properties.setProperty("ADD_PLUGIN", "Add Plugin"); - properties.setProperty("STATISTICS", "Word Count"); - properties.setProperty("ROW", "Row"); - properties.setProperty("COLUMN", "Column"); - properties.setProperty("WORD_COUNT", "Word Count"); - properties.setProperty("ENCODE", "Encoding"); - properties.setProperty("TOP", "Window Top"); - properties.setProperty("LANGUAGE", "Language"); - properties.setProperty("CHINESE", "Chinese"); - properties.setProperty("ENGLISH", "English"); - return properties; - } - -} diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java index 7233054..876bc87 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java +++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java @@ -3,6 +3,7 @@ package org.jcnc.jnotepad.tool; import com.ibm.icu.text.CharsetDetector; import com.ibm.icu.text.CharsetMatch; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.slf4j.Logger; import java.io.BufferedInputStream; @@ -10,8 +11,6 @@ import java.io.File; import java.io.FileInputStream; import java.nio.charset.Charset; -import static org.jcnc.jnotepad.constants.TextConstants.UNKNOWN; - /** * 编码检测工具类 @@ -19,7 +18,7 @@ import static org.jcnc.jnotepad.constants.TextConstants.UNKNOWN; * @author 许轲 */ public class EncodingDetector { - + static LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); private static final Logger LOG = LogUtil.getLogger(EncodingDetector.class); /** * 编码侦测概率,阈值:50% @@ -42,11 +41,11 @@ public class EncodingDetector { charsetDetector.setText(inputStream); CharsetMatch[] matchList = charsetDetector.detectAll(); if (matchList == null || matchList.length == 0) { - return UNKNOWN; + return localizationConfig.getUnknown(); } CharsetMatch maxConfidence = matchList[0]; if (maxConfidence.getConfidence() < THRESHOLD_CONFIDENCE) { - return UNKNOWN; + return localizationConfig.getUnknown(); } for (int i = 1; i < matchList.length; i++) { CharsetMatch match = matchList[i]; @@ -60,7 +59,7 @@ public class EncodingDetector { } catch (Exception e) { LOG.error("", e); } - return UNKNOWN; + return localizationConfig.getUnknown(); } /** @@ -71,7 +70,7 @@ public class EncodingDetector { */ public static Charset detectEncodingCharset(File file) { String charset = detectEncoding(file); - if (charset.equals(UNKNOWN)) { + if (charset.equals(localizationConfig.getUnknown())) { return Charset.defaultCharset(); } return Charset.forName(charset); diff --git a/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java index a1b0351..630b091 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java +++ b/src/main/java/org/jcnc/jnotepad/tool/FileUtil.java @@ -40,6 +40,7 @@ public class FileUtil { } } + /** * 保存页面方法 * diff --git a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java index 9659cdf..bb62e6d 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java +++ b/src/main/java/org/jcnc/jnotepad/ui/menu/JNotepadMenuBar.java @@ -1,19 +1,22 @@ package org.jcnc.jnotepad.ui.menu; -import javafx.scene.control.CheckMenuItem; -import javafx.scene.control.Menu; -import javafx.scene.control.MenuBar; -import javafx.scene.control.MenuItem; +import javafx.event.ActionEvent; +import javafx.scene.control.*; import javafx.stage.Stage; import org.jcnc.jnotepad.app.config.GlobalConfig; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.jcnc.jnotepad.controller.event.handler.*; +import org.jcnc.jnotepad.tool.LogUtil; +import org.jcnc.jnotepad.ui.status.JNotepadStatusBox; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; +import org.slf4j.Logger; import java.util.HashMap; import java.util.Map; -import static org.jcnc.jnotepad.constants.TextConstants.*; +import static org.jcnc.jnotepad.constants.TextConstants.CHINESE; +import static org.jcnc.jnotepad.constants.TextConstants.ENGLISH; /** * 封装菜单栏组件。 @@ -28,10 +31,15 @@ public class JNotepadMenuBar extends MenuBar { */ JNotepadTabPane jNotepadTabPane = JNotepadTabPane.getInstance(); + JNotepadStatusBox jNotepadStatusBox = JNotepadStatusBox.getInstance(); + private static final JNotepadMenuBar MENU_BAR = new JNotepadMenuBar(); + LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); + Logger logger = LogUtil.getLogger(this.getClass()); + private JNotepadMenuBar() { - init(); + } /** @@ -94,22 +102,38 @@ public class JNotepadMenuBar extends MenuBar { /** * 中文选项 */ - private MenuItem chineseItem; + private RadioMenuItem chineseItem; /** * 英文选项 */ - private MenuItem englishItem; + private RadioMenuItem englishItem; private final Map itemMap = new HashMap<>(); + /** + * 设置当前语言选中状态 + * + * @param language 语言 + * @since 2023/8/25 22:49 + */ + public void toggleLanguageCheck(String language) { + switch (language) { + case CHINESE -> chineseItem.setSelected(true); + case ENGLISH -> englishItem.setSelected(true); + default -> { + + } + } + } + /** * 初始化菜单栏 */ - private void init() { + public void initMenuBar() { initFileMenu(); initLanguageMenu(); initSettingMenu(); initPluginMenu(); - + this.getMenus().clear(); // 菜单栏 this.getMenus().addAll(fileMenu, setMenu, pluginMenu); initEventHandlers(); @@ -119,35 +143,41 @@ public class JNotepadMenuBar extends MenuBar { * 初始化语言菜单 */ private void initLanguageMenu() { + logger.info("初始化语言菜单:{}", localizationConfig.getLanguage()); // 语言菜单 - languageMenu = new Menu(LANGUAGE); + languageMenu = new Menu(localizationConfig.getLanguage()); + ToggleGroup languageToggleGroup = new ToggleGroup(); - chineseItem = new MenuItem(CHINESE); + chineseItem = new RadioMenuItem(localizationConfig.getChinese()); itemMap.put("chineseItem", chineseItem); + languageToggleGroup.getToggles().add(chineseItem); - englishItem = new MenuItem(ENGLISH); + englishItem = new RadioMenuItem(localizationConfig.getEnglish()); itemMap.put("englishItem", englishItem); + languageToggleGroup.getToggles().add(englishItem); languageMenu.getItems().addAll(chineseItem, englishItem); + } /** * 初始化文件菜单 */ private void initFileMenu() { + logger.info("初始化文件菜单:{}", localizationConfig.getFile()); // 文件菜单 - fileMenu = new Menu(FILE); + fileMenu = new Menu(localizationConfig.getFile()); - newItem = new MenuItem(NEW); + newItem = new MenuItem(localizationConfig.getNewly()); itemMap.put("newItem", newItem); - openItem = new MenuItem(OPEN); + openItem = new MenuItem(localizationConfig.getOpen()); itemMap.put("openItem", openItem); - saveItem = new MenuItem(SAVA); + saveItem = new MenuItem(localizationConfig.getSava()); itemMap.put("saveItem", saveItem); - saveAsItem = new MenuItem(SAVA_AS); + saveAsItem = new MenuItem(localizationConfig.getSavaAs()); itemMap.put("saveAsItem", saveAsItem); fileMenu.getItems().addAll(newItem, openItem, saveItem, saveAsItem); @@ -157,17 +187,18 @@ public class JNotepadMenuBar extends MenuBar { * 初始化设置菜单 */ private void initSettingMenu() { + logger.info("初始化设置菜单:{}", localizationConfig.getSet()); // 设置菜单 - setMenu = new Menu(SET); + setMenu = new Menu(localizationConfig.getSet()); - lineFeedItem = new CheckMenuItem(WORD_WRAP); + lineFeedItem = new CheckMenuItem(localizationConfig.getWordWrap()); itemMap.put("lineFeedItem", lineFeedItem); lineFeedItem.selectedProperty().set(true); - topItem = new CheckMenuItem(TOP); + topItem = new CheckMenuItem(localizationConfig.getTop()); itemMap.put("topItem", topItem); - openConfigItem = new MenuItem(OPEN_CONFIGURATION_FILE); + openConfigItem = new MenuItem(localizationConfig.getOpenConfigurationFile()); itemMap.put("openConfigItem", openConfigItem); itemMap.put("languageMenu", languageMenu); @@ -178,12 +209,13 @@ public class JNotepadMenuBar extends MenuBar { * 初始化插件菜单 */ private void initPluginMenu() { + logger.info("初始化插件菜单:{}", localizationConfig.getPlugin()); // 插件菜单 - pluginMenu = new Menu(PLUGIN); - addItem = new MenuItem(ADD_PLUGIN); + pluginMenu = new Menu(localizationConfig.getPlugin()); + addItem = new MenuItem(localizationConfig.getAddPlugin()); itemMap.put("addItem", addItem); - countItem = new MenuItem(STATISTICS); + countItem = new MenuItem(localizationConfig.getStatistics()); itemMap.put("countItem", countItem); pluginMenu.getItems().addAll(addItem, countItem); @@ -214,7 +246,19 @@ public class JNotepadMenuBar extends MenuBar { // 设置窗口为置顶 primaryStage.setAlwaysOnTop(after); }); + // todo 切换语言并将语言修改设置回本地 + englishItem.setOnAction(new OpenHandler() { + @Override + public void handle(ActionEvent actionEvent) { + } + }); + chineseItem.setOnAction(new OpenHandler() { + @Override + public void handle(ActionEvent actionEvent) { + + } + }); } public Map getItemMap() { diff --git a/src/main/java/org/jcnc/jnotepad/ui/status/JNotepadStatusBox.java b/src/main/java/org/jcnc/jnotepad/ui/status/JNotepadStatusBox.java index 0990e7c..be34545 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/status/JNotepadStatusBox.java +++ b/src/main/java/org/jcnc/jnotepad/ui/status/JNotepadStatusBox.java @@ -4,13 +4,12 @@ import javafx.geometry.Insets; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.layout.HBox; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.jcnc.jnotepad.ui.tab.JNotepadTab; import org.jcnc.jnotepad.ui.tab.JNotepadTabPane; import java.nio.charset.Charset; -import static org.jcnc.jnotepad.constants.TextConstants.*; - /** * 状态栏组件封装。 * 1. 文字统计 @@ -21,27 +20,31 @@ import static org.jcnc.jnotepad.constants.TextConstants.*; public class JNotepadStatusBox extends HBox { private static final JNotepadStatusBox STATUS_BOX = new JNotepadStatusBox(); - + LocalizationConfig localizationConfig = LocalizationConfig.getLocalizationConfig(); /** * 字数统计及光标 */ - private final Label statusLabel; + private Label statusLabel; /** * 显示文本编码 */ - private final Label enCodingLabel; + private Label enCodingLabel; private JNotepadStatusBox() { + initStatusBox(); + } + + public void initStatusBox() { + this.getChildren().clear(); // 创建状态栏 - statusLabel = new Label(ROW + ":1 \t" + COLUMN + ":1 \t" + WORD_COUNT + ":0 "); + statusLabel = new Label(localizationConfig.getRow() + ":1 \t" + localizationConfig.getColumn() + ":1 \t" + localizationConfig.getWordCount() + ":0 "); // 创建新的标签以显示编码信息 enCodingLabel = new Label(); - + updateEncodingLabel(); this.getChildren().add(statusLabel); this.getChildren().add(enCodingLabel); this.getProperties().put("borderpane-margin", new Insets(5, 10, 5, 10)); - } public static JNotepadStatusBox getInstance() { @@ -61,7 +64,7 @@ public class JNotepadStatusBox extends HBox { if (encoding == null) { encoding = Charset.defaultCharset().name(); } - this.enCodingLabel.setText("\t" + ENCODE + ": " + encoding); + this.enCodingLabel.setText("\t" + localizationConfig.getEncode() + ": " + encoding); } /** @@ -77,7 +80,7 @@ public class JNotepadStatusBox extends HBox { int row = getRow(caretPosition, textArea.getText()); int column = getColumn(caretPosition, textArea.getText()); int length = textArea.getLength(); - this.statusLabel.setText(ROW + ": " + row + " \t" + COLUMN + ": " + column + " \t" + WORD_COUNT + ": " + length); + this.statusLabel.setText(localizationConfig.getRow() + ": " + row + " \t" + localizationConfig.getColumn() + ": " + column + " \t" + localizationConfig.getWordCount() + ": " + length); } /** diff --git a/src/main/java/org/jcnc/jnotepad/view/init/View.java b/src/main/java/org/jcnc/jnotepad/view/init/View.java index 8625b66..ebb705a 100644 --- a/src/main/java/org/jcnc/jnotepad/view/init/View.java +++ b/src/main/java/org/jcnc/jnotepad/view/init/View.java @@ -21,8 +21,8 @@ public class View { * @param loadJnotepadConfigs 需要加载的配置文件数组 * @since 2023/8/24 15:29 */ - public void initJnotepadConfigs(List loadJnotepadConfigs) { - for (LoadJnotepadConfig loadJnotepadConfig : loadJnotepadConfigs) { + public void initJnotepadConfigs(List> loadJnotepadConfigs) { + for (LoadJnotepadConfig loadJnotepadConfig : loadJnotepadConfigs) { initJnotepadConfig(loadJnotepadConfig); } } @@ -33,7 +33,7 @@ public class View { * @param loadJnotepadConfig 配置文件 * @since 2023/8/24 15:29 */ - public void initJnotepadConfig(LoadJnotepadConfig loadJnotepadConfig) { + public void initJnotepadConfig(LoadJnotepadConfig loadJnotepadConfig) { loadJnotepadConfig.load(); } From 1bd9e17b60ab54a67615b5bda0c75d0abea4b165 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Fri, 25 Aug 2023 23:49:41 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=20BUG=20?= =?UTF-8?q?=E5=BD=93=E6=B2=A1=E6=9C=89=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=89=93=E5=BC=80=E8=BD=AF=E4=BB=B6=E6=8A=A5=E9=94=99=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E8=A7=A3=E5=86=B3=E5=90=88=E5=B9=B6=E5=86=B2?= =?UTF-8?q?=E7=AA=81=EF=BC=8C=E2=9C=8F=EF=B8=8F=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/config/LoadJnotepadConfig.java | 101 ++++++------- .../app/config/LocalizationConfig.java | 137 +++++++++--------- .../jcnc/jnotepad/constants/AppConstants.java | 10 +- .../jnotepad/constants/TextConstants.java | 22 +++ .../jcnc/jnotepad/tool/EncodingDetector.java | 8 +- 5 files changed, 146 insertions(+), 132 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java index 6d81ab2..a940795 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LoadJnotepadConfig.java @@ -1,17 +1,14 @@ package org.jcnc.jnotepad.app.config; -import javafx.scene.control.MenuItem; -import javafx.scene.input.KeyCombination; -import org.jcnc.jnotepad.app.entity.ShortcutKey; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.jcnc.jnotepad.exception.AppException; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.tool.PopUpUtil; -import org.jcnc.jnotepad.ui.menu.JNotepadMenuBar; import org.slf4j.Logger; import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; import static org.jcnc.jnotepad.constants.AppConstants.CONFIG_NAME; import static org.jcnc.jnotepad.constants.TextConstants.JNOTEPAD_CONFIG; @@ -63,6 +60,11 @@ public abstract class LoadJnotepadConfig { logger.info("未检测到配置文件!"); // 不存在则创建 createConfig(); + try { + loadConfig(new FileInputStream(CONFIG_NAME)); + } catch (FileNotFoundException ex) { + throw new AppException(ex.getMessage()); + } } } @@ -76,55 +78,56 @@ public abstract class LoadJnotepadConfig { protected abstract T parseConfig(InputStream inputStream); private void createConfig() { - List shortcutKeyList = getShortcutKeys(); - JnotepadConfig.getInstance().setShortcutKeyList(shortcutKeyList); - for (ShortcutKey shortcutKey : shortcutKeyList) { - // 保证json的key必须和变量名一致 - MenuItem menuItem = JNotepadMenuBar.getMenuBar().getItemMap().get(shortcutKey.getButtonName()); - String shortKeyValue = shortcutKey.getShortcutKeyValue(); - if ("".equals(shortKeyValue) || Objects.isNull(menuItem)) { - continue; - } - // 动态添加快捷键 - menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue)); - } + // List shortcutKeyList = getShortcutKeys(); + // JnotepadConfig.getInstance().setShortcutKeyList(shortcutKeyList); + // for (ShortcutKey shortcutKey : shortcutKeyList) { + // // 保证json的key必须和变量名一致 + // MenuItem menuItem = JNotepadMenuBar.getMenuBar().getItemMap().get(shortcutKey.getButtonName()); + // String shortKeyValue = shortcutKey.getShortcutKeyValue(); + // if ("".equals(shortKeyValue) || Objects.isNull(menuItem)) { + // continue; + // } + // // 动态添加快捷键 + // menuItem.setAccelerator(KeyCombination.keyCombination(shortKeyValue)); + // } try (BufferedWriter writer = new BufferedWriter(new FileWriter(CONFIG_NAME))) { writer.write(JNOTEPAD_CONFIG); } catch (IOException e) { PopUpUtil.errorAlert("错误", "读写错误", "配置文件读写错误!"); } + LocalizationConfig.getLocalizationConfig().initLocalizationConfig(); } - /** - * 获取快捷键集合 - * - * @return java.util.List 快捷键集合 - * @since 2023/8/24 14:19 - */ - private static List getShortcutKeys() { - List shortcutKeyList = new ArrayList<>(); - // 打开文件 - ShortcutKey shortcutKeyOfOpen = new ShortcutKey("openItem", "ctrl+o"); - - // 新建 - ShortcutKey shortcutKeyOfNew = new ShortcutKey("newItem", "ctrl+n"); - - // 保存 - ShortcutKey shortcutKeyOfSave = new ShortcutKey("saveItem", "ctrl+s"); - - // 保存作为 - ShortcutKey shortcutKeyOfSaveAs = new ShortcutKey("saveAsItem", "ctrl+shift+s"); - - // 打开配置文件 - ShortcutKey shortcutKeyOfOpenConfig = new ShortcutKey("openConfigItem", "alt+s"); - - shortcutKeyList.add(shortcutKeyOfOpen); - shortcutKeyList.add(shortcutKeyOfNew); - shortcutKeyList.add(shortcutKeyOfSave); - shortcutKeyList.add(shortcutKeyOfSaveAs); - shortcutKeyList.add(shortcutKeyOfOpenConfig); - return shortcutKeyList; - } + // /** + // * 获取快捷键集合 + // * + // * @return java.util.List 快捷键集合 + // * @since 2023/8/24 14:19 + // */ + // private static List getShortcutKeys() { + // List shortcutKeyList = new ArrayList<>(); + // // 打开文件 + // ShortcutKey shortcutKeyOfOpen = new ShortcutKey("openItem", "ctrl+o"); + // + // // 新建 + // ShortcutKey shortcutKeyOfNew = new ShortcutKey("newItem", "ctrl+n"); + // + // // 保存 + // ShortcutKey shortcutKeyOfSave = new ShortcutKey("saveItem", "ctrl+s"); + // + // // 保存作为 + // ShortcutKey shortcutKeyOfSaveAs = new ShortcutKey("saveAsItem", "ctrl+shift+s"); + // + // // 打开配置文件 + // ShortcutKey shortcutKeyOfOpenConfig = new ShortcutKey("openConfigItem", "alt+s"); + // + // shortcutKeyList.add(shortcutKeyOfOpen); + // shortcutKeyList.add(shortcutKeyOfNew); + // shortcutKeyList.add(shortcutKeyOfSave); + // shortcutKeyList.add(shortcutKeyOfSaveAs); + // shortcutKeyList.add(shortcutKeyOfOpenConfig); + // return shortcutKeyList; + // } /** * 加载配置文件 diff --git a/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java b/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java index 24dda22..7711abd 100644 --- a/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java +++ b/src/main/java/org/jcnc/jnotepad/app/config/LocalizationConfig.java @@ -7,9 +7,8 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.util.Properties; -import static org.jcnc.jnotepad.constants.AppConstants.CH_LANGUAGE_PACK_NAME; -import static org.jcnc.jnotepad.constants.AppConstants.EN_LANGUAGE_PACK_NAME; -import static org.jcnc.jnotepad.constants.TextConstants.TEXT_WRAP; +import static org.jcnc.jnotepad.constants.AppConstants.APP_NAME; +import static org.jcnc.jnotepad.constants.TextConstants.*; /** * 本地化配置文件 @@ -42,33 +41,34 @@ public class LocalizationConfig { InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); properties.load(reader); } catch (IOException e) { + logger.info("未检测到本地化语言包!"); // 如果读取出错,则调用初始化方法 initializePropertiesFile(); } logger.info("初始化本地化语言包成功!"); - title = properties.getProperty("title", "JNotepad"); - sava = properties.getProperty("SAVA"); - file = properties.getProperty("FILE"); - newly = properties.getProperty("NEW"); - open = properties.getProperty("OPEN"); - savaAs = properties.getProperty("SAVA_AS"); - set = properties.getProperty("SET"); - wordWrap = properties.getProperty("WORD_WRAP"); - plugin = properties.getProperty("PLUGIN"); - addPlugin = properties.getProperty("ADD_PLUGIN"); - statistics = properties.getProperty("STATISTICS"); - openConfigurationFile = properties.getProperty("OPEN_CONFIGURATION_FILE"); - top = properties.getProperty("TOP"); - language = properties.getProperty("LANGUAGE"); - chinese = properties.getProperty("CHINESE"); - english = properties.getProperty("ENGLISH"); + title = properties.getProperty(TITLE, APP_NAME); + sava = properties.getProperty(SAVE); + file = properties.getProperty(FILE); + newly = properties.getProperty(NEW); + open = properties.getProperty(OPEN); + savaAs = properties.getProperty(SAVE_AS); + set = properties.getProperty(SET); + wordWrap = properties.getProperty(WORD_WRAP); + plugin = properties.getProperty(PLUGIN); + addPlugin = properties.getProperty(ADD_PLUGIN); + statistics = properties.getProperty(STATISTICS); + openConfigurationFile = properties.getProperty(OPEN_CONFIGURATION_FILE); + top = properties.getProperty(TOP); + language = properties.getProperty(LANGUAGE); + chinese = properties.getProperty(UPPER_CHINESE); + english = properties.getProperty(UPPER_ENGLISH); textWrap = properties.getProperty(TEXT_WRAP, "true"); - newFile = properties.getProperty("NEW_FILE"); - unknown = properties.getProperty("UNKNOWN"); - row = properties.getProperty("ROW"); - column = properties.getProperty("COLUMN"); - wordCount = properties.getProperty("WORD_COUNT"); - encode = properties.getProperty("ENCODE"); + newFile = properties.getProperty(NEW_FILE); + unknown = properties.getProperty(UNKNOWN); + row = properties.getProperty(ROW); + column = properties.getProperty(COLUMN); + wordCount = properties.getProperty(WORD_COUNT); + encode = properties.getProperty(ENCODE); } /** @@ -103,52 +103,52 @@ public class LocalizationConfig { private void setChineseLanguagePack() { properties.clear(); // 设置默认属性 - properties.setProperty("TITLE", "JNotepad"); - properties.setProperty("NEW_FILE", "新建文件"); - properties.setProperty("SAVA", "保存"); - properties.setProperty("FILE", "文件"); - properties.setProperty("NEW", "新建"); - properties.setProperty("OPEN", "打开"); - properties.setProperty("SAVA_AS", "另存为"); - properties.setProperty("SET", "设置"); - properties.setProperty("WORD_WRAP", "自动换行"); - properties.setProperty("OPEN_CONFIGURATION_FILE", "打开配置文件"); - properties.setProperty("PLUGIN", "插件"); - properties.setProperty("ADD_PLUGIN", "增加插件"); - properties.setProperty("STATISTICS", "统计字数"); - properties.setProperty("ROW", "行数"); - properties.setProperty("COLUMN", "列数"); - properties.setProperty("WORD_COUNT", "字数"); - properties.setProperty("ENCODE", "编码"); - properties.setProperty("TOP", "窗口置顶"); - properties.setProperty("LANGUAGE", "语言"); - properties.setProperty("CHINESE", "中文"); - properties.setProperty("ENGLISH", "英文"); + properties.setProperty(TITLE, APP_NAME); + properties.setProperty(NEW_FILE, "新建文件"); + properties.setProperty(SAVE, "保存"); + properties.setProperty(FILE, "文件"); + properties.setProperty(NEW, "新建"); + properties.setProperty(OPEN, "打开"); + properties.setProperty(SAVE_AS, "另存为"); + properties.setProperty(SET, "设置"); + properties.setProperty(WORD_WRAP, "自动换行"); + properties.setProperty(OPEN_CONFIGURATION_FILE, "打开配置文件"); + properties.setProperty(PLUGIN, "插件"); + properties.setProperty(ADD_PLUGIN, "增加插件"); + properties.setProperty(STATISTICS, "统计字数"); + properties.setProperty(ROW, "行数"); + properties.setProperty(COLUMN, "列数"); + properties.setProperty(WORD_COUNT, "字数"); + properties.setProperty(ENCODE, "编码"); + properties.setProperty(TOP, "窗口置顶"); + properties.setProperty(LANGUAGE, "语言"); + properties.setProperty(UPPER_CHINESE, "中文"); + properties.setProperty(UPPER_ENGLISH, "英文"); } private void setEnglishLanguagePack() { properties.clear(); - properties.setProperty("TITLE", "JNotepad"); - properties.setProperty("NEW_FILE", "New File"); - properties.setProperty("SAVA", "Save"); - properties.setProperty("FILE", "File"); - properties.setProperty("NEW", "New"); - properties.setProperty("OPEN", "Open"); - properties.setProperty("SAVA_AS", "Save As"); - properties.setProperty("SET", "Settings"); - properties.setProperty("WORD_WRAP", "Word Wrap"); - properties.setProperty("OPEN_CONFIGURATION_FILE", "Open Configuration File"); - properties.setProperty("PLUGIN", "Plugins"); - properties.setProperty("ADD_PLUGIN", "Add Plugin"); - properties.setProperty("STATISTICS", "Word Count"); - properties.setProperty("ROW", "Row"); - properties.setProperty("COLUMN", "Column"); - properties.setProperty("WORD_COUNT", "Word Count"); - properties.setProperty("ENCODE", "Encoding"); - properties.setProperty("TOP", "Window Top"); - properties.setProperty("LANGUAGE", "Language"); - properties.setProperty("CHINESE", "Chinese"); - properties.setProperty("ENGLISH", "English"); + properties.setProperty(TITLE, APP_NAME); + properties.setProperty(NEW_FILE, "New File"); + properties.setProperty(SAVE, "Save"); + properties.setProperty(FILE, "File"); + properties.setProperty(NEW, "New"); + properties.setProperty(OPEN, "Open"); + properties.setProperty(SAVE_AS, "Save As"); + properties.setProperty(SET, "Settings"); + properties.setProperty(WORD_WRAP, "Word Wrap"); + properties.setProperty(OPEN_CONFIGURATION_FILE, "Open Configuration File"); + properties.setProperty(PLUGIN, "Plugins"); + properties.setProperty(ADD_PLUGIN, "Add Plugin"); + properties.setProperty(STATISTICS, "Word Count"); + properties.setProperty(ROW, "Row"); + properties.setProperty(COLUMN, "Column"); + properties.setProperty(WORD_COUNT, "Word Count"); + properties.setProperty(ENCODE, "Encoding"); + properties.setProperty(TOP, "Window Top"); + properties.setProperty(LANGUAGE, "Language"); + properties.setProperty(UPPER_CHINESE, "Chinese"); + properties.setProperty(UPPER_ENGLISH, "English"); } private String textWrap; @@ -192,6 +192,9 @@ public class LocalizationConfig { private String newFile; /// EncodingDetector 文本常量 + /** + * 未知 + */ private String unknown; /// JNotepadStatusBox diff --git a/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java b/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java index d6378ec..2a1e151 100644 --- a/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/AppConstants.java @@ -18,20 +18,12 @@ public class AppConstants { * 初始高度 */ public static final double SCREEN_LENGTH = 600; + public static final String APP_NAME = "JNotepad"; /** * logo地址 */ public static final String APP_ICON = "/img/icon.png"; - /** - * 中文语言包 - */ - public static final String CH_LANGUAGE_PACK_NAME = "ch_language_pack.txt"; - /** - * 英文语言包 - */ - public static final String EN_LANGUAGE_PACK_NAME = "en_language_pack.txt"; - /** * 配置文件名 */ diff --git a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java index ea4b8d5..981fa94 100644 --- a/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java +++ b/src/main/java/org/jcnc/jnotepad/constants/TextConstants.java @@ -24,6 +24,28 @@ public class TextConstants { */ public static final String TEXT_WRAP = "text.wrap"; + public static final String TITLE = "title"; + public static final String SAVE = "SAVE"; + public static final String FILE = "FILE"; + public static final String NEW = "NEW"; + public static final String OPEN = "OPEN"; + public static final String SAVE_AS = "SAVE_AS"; + public static final String SET = "SET"; + public static final String WORD_WRAP = "WORD_WRAP"; + public static final String PLUGIN = "PLUGIN"; + public static final String ADD_PLUGIN = "ADD_PLUGIN"; + public static final String STATISTICS = "STATISTICS"; + public static final String OPEN_CONFIGURATION_FILE = "OPEN_CONFIGURATION_FILE"; + public static final String TOP = "TOP"; + public static final String LANGUAGE = "LANGUAGE"; + public static final String UPPER_CHINESE = "CHINESE"; + public static final String UPPER_ENGLISH = "ENGLISH"; + public static final String NEW_FILE = "NEW_FILE"; + public static final String UNKNOWN = "UNKNOWN"; + public static final String ROW = "ROW"; + public static final String COLUMN = "COLUMN"; + public static final String WORD_COUNT = "WORD_COUNT"; + public static final String ENCODE = "ENCODE"; /// Config 文本常量 diff --git a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java index 4b33f46..ef70411 100644 --- a/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java +++ b/src/main/java/org/jcnc/jnotepad/tool/EncodingDetector.java @@ -3,16 +3,13 @@ package org.jcnc.jnotepad.tool; import com.ibm.icu.text.CharsetDetector; import com.ibm.icu.text.CharsetMatch; -import org.jcnc.jnotepad.constants.TextConstants; +import org.jcnc.jnotepad.app.config.LocalizationConfig; import org.slf4j.Logger; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -import static org.jcnc.jnotepad.constants.TextConstants.UNKNOWN; /** @@ -73,13 +70,10 @@ public class EncodingDetector { */ public static Charset detectEncodingCharset(File file) { String charset = detectEncoding(file); - if (charset.equals(localizationConfig.getUnknown())) { try { - assert charset != null; return Charset.forName(charset); } catch (Exception e) { return Charset.defaultCharset(); } - return Charset.forName(charset); } } \ No newline at end of file From f5fdb925ea9c93deaec8bb1417c93a87e5370a54 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sat, 26 Aug 2023 00:05:30 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D=20BUG=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E8=AF=AD=E8=A8=80=E5=90=8E=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=8D=B3=E6=97=B6=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jcnc/jnotepad/controller/event/handler/SaveFile.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java index 577bfce..70b1aa1 100644 --- a/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java +++ b/src/main/java/org/jcnc/jnotepad/controller/event/handler/SaveFile.java @@ -2,6 +2,7 @@ package org.jcnc.jnotepad.controller.event.handler; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import org.jcnc.jnotepad.app.config.LoadLanguageConfig; import org.jcnc.jnotepad.app.config.LoadShortcutKeyConfig; import org.jcnc.jnotepad.tool.LogUtil; import org.jcnc.jnotepad.ui.LineNumberTextArea; @@ -46,6 +47,10 @@ public class SaveFile implements EventHandler { selectedTab.save(); // 如果该文件是配置文件则刷新快捷键 if (CONFIG_NAME.equals(selectedTab.getText())) { + + // 刷新语言包 + View.getInstance().initJnotepadConfig(new LoadLanguageConfig()); + logger.info("已刷新语言包!"); // 初始化快捷键 View.getInstance().initJnotepadConfig(new LoadShortcutKeyConfig()); logger.info("已刷新快捷键!");