Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ A lightweight, 25x fast, Windows notepad alternative built with C++17 and Win32

## Features

- **Multi-language support**: English and Japanese translations with runtime switching.
- **Multi-language support**: English, Japanese, and Traditional Chinese translations with runtime switching.
- **Multi-encoding text**: UTF-8, UTF-8 BOM, UTF-16 LE/BE, ANSI with line-ending selection.
- **Rich editing**: word wrap toggle, font selection, zoom, time/date stamp, find/replace/goto.
- **Backgrounds**: optional image with tile/stretch/fit/fill/anchor modes and opacity control. (known issues)
Expand Down
6 changes: 5 additions & 1 deletion src/lang/en.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,18 @@ inline LangStrings g_langEN = {
L"Fill",
L"Window &Transparency...",
L"Always on &Top",
L"&Icon",
L"&Change Icon...",
L"&Reset to Default",

L"&Help",
L"&About Notepad",
L"&Check for Updates",

L"&Language",
L"&English",
L"&Japanese",
L"日本語(&J)",
L"繁體中文(&T)",

L"Find",
L"Find and Replace",
Expand Down
4 changes: 4 additions & 0 deletions src/lang/ja.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ inline LangStrings g_langJA = {
L"フィル",
L"ウィンドウの透明度(&T)...",
L"常に最前面に表示(&T)",
L"アイコン(&I)",
L"アイコンを変更(&C)...",
L"既定に戻す(&R)",

L"ヘルプ(&H)",
L"メモ帳について(&A)",
Expand All @@ -69,6 +72,7 @@ inline LangStrings g_langJA = {
L"言語(&L)",
L"英語(&E)",
L"日本語(&J)",
L"繁體中文(&T)",

L"検索",
L"検索と置換",
Expand Down
4 changes: 4 additions & 0 deletions src/lang/lang.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "lang.h"
#include "en.h"
#include "ja.h"
#include "zh_tw.h"
#include <windows.h>

static LangID g_currentLang = LangID::EN;
Expand Down Expand Up @@ -49,6 +50,9 @@ void SetLanguage(LangID lang)
case LangID::JA:
g_currentStrings = &g_langJA;
break;
case LangID::ZH_TW:
g_currentStrings = &g_langZHTW;
break;
case LangID::EN:
default:
g_currentStrings = &g_langEN;
Expand Down
7 changes: 6 additions & 1 deletion src/lang/lang.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
enum class LangID
{
EN,
JA
JA,
ZH_TW
};

struct LangStrings
Expand Down Expand Up @@ -69,6 +70,9 @@ struct LangStrings
std::wstring menuBgPosFill;
std::wstring menuTransparency;
std::wstring menuAlwaysOnTop;
std::wstring menuIcon;
std::wstring menuIconChange;
std::wstring menuIconReset;

std::wstring menuHelp;
std::wstring menuAbout;
Expand All @@ -77,6 +81,7 @@ struct LangStrings
std::wstring menuLanguage;
std::wstring menuLangEnglish;
std::wstring menuLangJapanese;
std::wstring menuLangTraditionalChinese;

std::wstring dialogFind;
std::wstring dialogFindReplace;
Expand Down
110 changes: 110 additions & 0 deletions src/lang/zh_tw.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#pragma once

#include "lang.h"

inline LangStrings g_langZHTW = {
L"記事本",
L"未命名",

L"檔案(&F)",
L"開新檔案(&N)\tCtrl+N",
L"開啟(&O)...\tCtrl+O",
L"儲存檔案(&S)\tCtrl+S",
L"另存新檔(&A)...\tCtrl+Shift+S",
L"列印(&P)...\tCtrl+P",
L"版面設定(&U)...",
L"結束(&X)",
L"最近使用的檔案",

L"編輯(&E)",
L"復原(&U)\tCtrl+Z",
L"重做(&R)\tCtrl+Y",
L"剪下(&T)\tCtrl+X",
L"複製(&C)\tCtrl+C",
L"貼上(&P)\tCtrl+V",
L"刪除(&L)\tDel",
L"尋找(&F)...\tCtrl+F",
L"找下一個(&N)\tF3",
L"找上一個(&V)\tShift+F3",
L"取代(&H)...\tCtrl+H",
L"到指定行(&G)...\tCtrl+G",
L"全選(&A)\tCtrl+A",
L"時間/日期(&D)\tF5",

L"格式(&O)",
L"自動換行(&W)",
L"字型(&F)...",

L"檢視(&V)",
L"放大(&I)\tCtrl+Plus",
L"縮小(&O)\tCtrl+Minus",
L"還原預設縮放(&R)\tCtrl+0",
L"狀態列(&S)",
L"深色模式(&D)",
L"背景(&B)",
L"選取圖片(&S)...",
L"清除背景(&C)",
L"不透明度(&O)...",
L"位置(&P)",
L"左上",
L"上方置中",
L"右上",
L"中央靠左",
L"置中",
L"中央靠右",
L"左下",
L"下方置中",
L"右下",
L"並排顯示",
L"延展",
L"最適大小",
L"填滿",
L"視窗透明度(&T)...",
L"最上層顯示(&A)",
L"圖示(&I)",
L"變更圖示(&C)...",
L"重設為預設值(&R)",

L"說明(&H)",
L"關於記事本(&A)",
L"檢查更新(&U)",

L"語言(&L)",
L"English(&E)",
L"日本語(&J)",
L"繁體中文(&T)",

L"尋找",
L"尋找與取代",
L"到指定行",
L"視窗透明度",
L"尋找:",
L"取代為:",
L"找下一個",
L"取代",
L"全部取代",
L"關閉",
L"行號:",
L"確定",
L"取消",
L"不透明度 (10-100%):",

L"找不到 \"",
L"是否要儲存對下列檔案的變更: ",
L"無法開啟檔案。",
L"無法儲存檔案。",
L"錯誤",
L"Legacy Notepad v1.2.0\n\n快速、輕量的文字編輯器。\n\n使用 C++ 與 Win32 API 建置。\n",

L" 第 ",
L" 行,第 ",

L"UTF-8",
L"UTF-8 with BOM",
L"UTF-16 LE",
L"UTF-16 BE",
L"ANSI",

L"Windows (CRLF)",
L"Unix (LF)",
L"Macintosh (CR)"};
21 changes: 19 additions & 2 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,13 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return -1;
}
}

DWORD editorStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | ES_NOHIDESEL;
if (!g_state.wordWrap)
editorStyle |= WS_HSCROLL | ES_AUTOHSCROLL;

g_hwndEditor = CreateWindowExW(0, richEditClass, nullptr,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | ES_NOHIDESEL,
0, 0, 100, 100, hwnd, reinterpret_cast<HMENU>(IDC_EDITOR), GetModuleHandleW(nullptr), nullptr);
editorStyle, 0, 0, 100, 100, hwnd, reinterpret_cast<HMENU>(IDC_EDITOR), GetModuleHandleW(nullptr), nullptr);
g_origEditorProc = reinterpret_cast<WNDPROC>(SetWindowLongPtrW(g_hwndEditor, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditorSubclassProc)));
g_hwndStatus = CreateWindowExW(0, STATUSCLASSNAMEW, nullptr,
WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, reinterpret_cast<HMENU>(IDC_STATUSBAR), GetModuleHandleW(nullptr), nullptr);
Expand All @@ -81,6 +85,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
SetupStatusBarParts();
UpdateMenuStrings();
UpdateLanguageMenu();
CheckMenuItem(GetMenu(g_hwndMain), IDM_FORMAT_WORDWRAP, g_state.wordWrap ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(GetMenu(g_hwndMain), IDM_VIEW_ALWAYSONTOP, g_state.alwaysOnTop ? MF_CHECKED : MF_UNCHECKED);
if (g_state.alwaysOnTop)
SetWindowPos(g_hwndMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
Expand Down Expand Up @@ -442,6 +447,18 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
UpdateTitle();
UpdateStatus();
break;
case IDM_VIEW_LANG_ZH_TW:
if (g_hwndFindDlg)
{
DestroyWindow(g_hwndFindDlg);
g_hwndFindDlg = nullptr;
}
SetLanguage(LangID::ZH_TW);
UpdateMenuStrings();
UpdateLanguageMenu();
UpdateTitle();
UpdateStatus();
break;
case IDM_VIEW_ICON_CHANGE:
ViewChangeIcon();
break;
Expand Down
14 changes: 8 additions & 6 deletions src/modules/background.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "core/globals.h"
#include "theme.h"
#include "resource.h"
#include "lang/lang.h"
#include <commdlg.h>
#include <uxtheme.h>
#include <algorithm>
Expand Down Expand Up @@ -331,11 +332,12 @@ static INT_PTR CALLBACK OpacityDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARA
case WM_INITDIALOG:
{
ApplyBackgroundDialogDarkMode(hDlg);
const auto &lang = GetLangStrings();
HFONT hFont = reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
CreateWindowExW(0, L"STATIC", L"Opacity (0-100%):", WS_CHILD | WS_VISIBLE, 10, 15, 110, 20, hDlg, nullptr, nullptr, nullptr);
hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | ES_NUMBER, 125, 12, 60, 22, hDlg, reinterpret_cast<HMENU>(1001), nullptr, nullptr);
CreateWindowExW(0, L"BUTTON", L"OK", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 55, 50, 70, 26, hDlg, reinterpret_cast<HMENU>(IDOK), nullptr, nullptr);
CreateWindowExW(0, L"BUTTON", L"Cancel", WS_CHILD | WS_VISIBLE, 135, 50, 70, 26, hDlg, reinterpret_cast<HMENU>(IDCANCEL), nullptr, nullptr);
CreateWindowExW(0, L"STATIC", lang.dialogOpacityLabel.c_str(), WS_CHILD | WS_VISIBLE, 15, 25, 135, 20, hDlg, nullptr, nullptr, nullptr);
hEdit = CreateWindowExW(WS_EX_CLIENTEDGE, L"EDIT", L"", WS_CHILD | WS_VISIBLE | ES_NUMBER, 155, 22, 70, 24, hDlg, reinterpret_cast<HMENU>(1001), nullptr, nullptr);
CreateWindowExW(0, L"BUTTON", lang.dialogOK.c_str(), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 75, 72, 85, 28, hDlg, reinterpret_cast<HMENU>(IDOK), nullptr, nullptr);
CreateWindowExW(0, L"BUTTON", lang.dialogCancel.c_str(), WS_CHILD | WS_VISIBLE, 175, 72, 85, 28, hDlg, reinterpret_cast<HMENU>(IDCANCEL), nullptr, nullptr);
for (HWND h = GetWindow(hDlg, GW_CHILD); h; h = GetWindow(h, GW_HWNDNEXT))
SendMessageW(h, WM_SETFONT, reinterpret_cast<WPARAM>(hFont), TRUE);
int pct = g_state.background.opacity * 100 / 255;
Expand Down Expand Up @@ -397,8 +399,8 @@ static INT_PTR CALLBACK OpacityDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARA

void ViewBackgroundOpacity()
{
HWND hDlg = CreateWindowExW(WS_EX_DLGMODALFRAME, L"#32770", L"Background Opacity",
WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 300, 300, 270, 120,
const auto &lang = GetLangStrings();
HWND hDlg = CreateWindowExW(WS_EX_DLGMODALFRAME, L"#32770", lang.menuBgOpacity.c_str(), WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 300, 300, 340, 175,
g_hwndMain, nullptr, GetModuleHandleW(nullptr), nullptr);
if (!hDlg)
return;
Expand Down
4 changes: 3 additions & 1 deletion src/modules/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <commdlg.h>
#include <shlwapi.h>
#include <shellapi.h>
#include <richedit.h>
#include <vector>

static HICON LoadCustomIcon(const wchar_t *path)
Expand Down Expand Up @@ -199,7 +200,7 @@ void FilePageSetup()
}

void EditUndo() { SendMessageW(g_hwndEditor, EM_UNDO, 0, 0); }
void EditRedo() { SendMessageW(g_hwndEditor, EM_UNDO, 0, 0); }
void EditRedo() { SendMessageW(g_hwndEditor, EM_REDO, 0, 0); }
void EditCut() { SendMessageW(g_hwndEditor, WM_CUT, 0, 0); }
void EditCopy() { SendMessageW(g_hwndEditor, WM_COPY, 0, 0); }
void EditPaste() { SendMessageW(g_hwndEditor, WM_PASTE, 0, 0); }
Expand All @@ -221,6 +222,7 @@ void FormatWordWrap()
{
g_state.wordWrap = !g_state.wordWrap;
CheckMenuItem(GetMenu(g_hwndMain), IDM_FORMAT_WORDWRAP, g_state.wordWrap ? MF_CHECKED : MF_UNCHECKED);
SaveFontSettings();
ApplyWordWrap();
}

Expand Down
Loading