diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..b818c75
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,43 @@
+name: Build
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Add MSBuild to PATH
+ uses: microsoft/setup-msbuild@v2
+
+ - name: Build x64
+ run: msbuild vs2026/voidImageViewer.sln /p:Configuration=Release /p:Platform=x64 /p:PlatformToolset=v143
+
+ - name: Build x86
+ run: msbuild vs2026/voidImageViewer.sln /p:Configuration=Release /p:Platform=Win32 /p:PlatformToolset=v143
+
+ - name: Setup NSIS
+ run: |
+ choco install nsis -y
+ "C:\Program Files (x86)\NSIS" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
+
+ - name: Build Installer x64
+ run: powershell -File nsis/build_installer.ps1 -Arch x64 -VsVersion vs2026 -BuildConfig Release -Lang English
+
+ - name: Build Installer x86
+ run: powershell -File nsis/build_installer.ps1 -Arch x86 -VsVersion vs2026 -BuildConfig Release -Lang English
+
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: voidImageViewer-build
+ path: |
+ voidImageViewer/x64/Release/voidImageViewer.exe
+ voidImageViewer/Release/voidImageViewer.exe
+ nsis/voidImageViewer-*-setup.exe
diff --git a/README.md b/README.md
index 1d27215..bd10c25 100644
--- a/README.md
+++ b/README.md
@@ -26,21 +26,21 @@ void Image Viewer main window:
void Image Viewer General Options:
-
+
void Image Viewer View Options:
-
+
void Image Viewer Controls Options:
-
+
diff --git a/comments.json b/comments.json
new file mode 100644
index 0000000..a65ec5f
Binary files /dev/null and b/comments.json differ
diff --git a/issues.json b/issues.json
new file mode 100644
index 0000000..811c766
Binary files /dev/null and b/issues.json differ
diff --git a/nsis/version.nsh b/nsis/version.nsh
index 6e65d04..81406c8 100644
--- a/nsis/version.nsh
+++ b/nsis/version.nsh
@@ -1,3 +1,3 @@
-!define VERSION "1.0.0.15"
+!define VERSION "1.0.1.0"
!define BETAVERSION ""
!define VERSIONYEAR "2026"
diff --git a/res/resource.h b/res/resource.h
index e3639f7..7aa22dc 100644
--- a/res/resource.h
+++ b/res/resource.h
@@ -90,6 +90,24 @@
#define IDC_TITLE_BAR_FORMAT 1052
#define IDC_SHRINK_BLIT_MODE_STATIC 1053
#define IDC_MAGNIFY_BLIT_MODE_STATIC 1054
+#define IDC_RESET_WINDOW 1055
+#define IDC_LANGUAGE_STATIC 1056
+#define IDC_LANGUAGE_COMBOBOX 1057
+#define IDC_LOOP_ANIMATIONS_ONCE_STATIC 1058
+#define IDC_PRELOAD_NEXT_IMAGE_STATIC 1059
+#define IDC_CACHE_LAST_IMAGE_STATIC 1060
+#define IDC_WINDOWEDBACKGROUNDCOLOR_STATIC 1061
+#define IDC_FULLSCREENBACKGROUNDCOLOR_STATIC 1062
+#define IDC_LEFT_CLICK_ACTION_STATIC 1063
+#define IDC_RIGHT_CLICK_ACTION_STATIC 1064
+#define IDC_MOUSE_WHEEL_ACTION_STATIC 1065
+#define IDC_COMMANDS_STATIC 1066
+#define IDC_SETTINGS_FOR_SELECTED_COMMAND_STATIC 1067
+#define IDC_TITLE_BAR_FORMAT_STATIC 1068
+#define IDC_AUTO_SIZE_WINDOW_STATIC 1069
+#define IDC_EDIT_KEYBOARD_SHORTCUT_KEY_STATIC 1070
+#define IDC_EDIT_KEYBOARD_SHORTCUT_KEY_CURRENTLY_USED_BY_STATIC 1071
+#define IDC_CUSTOM_RATE_STATIC 1072
// Next default values for new objects
//
@@ -98,7 +116,6 @@
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 40048
-#define _APS_NEXT_CONTROL_VALUE 1055
-#define _APS_NEXT_SYMED_VALUE 109
+#define _APS_NEXT_CONTROL_VALUE 1073
#endif
#endif
diff --git a/res/voidImageViewer.rc b/res/voidImageViewer.rc
index b138421..b4ae265 100644
--- a/res/voidImageViewer.rc
+++ b/res/voidImageViewer.rc
@@ -26,86 +26,91 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// Dialog
//
-IDD_GENERAL DIALOGEX 0, 0, 194, 180
+IDD_GENERAL DIALOGEX 0, 0, 244, 200
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
+ LTEXT "&Language:",IDC_LANGUAGE_STATIC,0,2,50,12,SS_CENTERIMAGE
+ COMBOBOX IDC_LANGUAGE_COMBOBOX,54,0,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
CONTROL "&Store settings in %APPDATA%\\voidImageViewer",IDC_APPDATA,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,0,186,10
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,20,186,10
CONTROL "Allow multiple &instances",IDC_MULTIPLE_INSTANCES,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,18,186,10
- CONTROL "Start &menu shortcuts",IDC_STARTMENU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,36,186,10
- GROUPBOX "Associations",IDC_STATIC,0,54,54,124
- CONTROL "&BMP",IDC_BMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,66,42,10
- CONTROL "&GIF",IDC_GIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,78,42,10
- CONTROL "IC&O",IDC_ICO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,90,42,10
- CONTROL "JP&EG",IDC_JPEG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,102,42,10
- CONTROL "&JPG",IDC_JPG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,114,42,10
- CONTROL "&PNG",IDC_PNG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,126,42,10
- CONTROL "&TIF",IDC_TIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,138,42,10
- CONTROL "TIF&F",IDC_TIFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,150,42,10
- CONTROL "&WEBP",IDC_WEBP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,162,42,10
- PUSHBUTTON "Check &All",IDC_CHECKALL,60,60,54,14
- PUSHBUTTON "Check &None",IDC_CHECKNONE,60,78,54,14
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,38,186,10
+ CONTROL "Start &menu shortcuts",IDC_STARTMENU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,56,186,10
+ GROUPBOX "Associations",IDC_STATIC,0,74,54,124
+ CONTROL "&BMP",IDC_BMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,86,42,10
+ CONTROL "&GIF",IDC_GIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,98,42,10
+ CONTROL "IC&O",IDC_ICO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,110,42,10
+ CONTROL "JP&EG",IDC_JPEG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,122,42,10
+ CONTROL "&JPG",IDC_JPG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,134,42,10
+ CONTROL "&PNG",IDC_PNG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,146,42,10
+ CONTROL "&TIF",IDC_TIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,158,42,10
+ CONTROL "TIF&F",IDC_TIFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,170,42,10
+ CONTROL "&WEBP",IDC_WEBP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,182,42,10
+ PUSHBUTTON "Check &All",IDC_CHECKALL,60,80,54,14
+ PUSHBUTTON "Check &None",IDC_CHECKNONE,60,98,54,14
END
-IDD_OPTIONS DIALOGEX 0, 0, 310, 271
+IDD_OPTIONS DIALOGEX 0, 0, 360, 271
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTROLPARENT
CAPTION "Options - Void Image Viewer"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- DEFPUSHBUTTON "OK",IDOK,198,252,50,14,WS_GROUP
- PUSHBUTTON "Cancel",IDCANCEL,252,252,50,14
+ DEFPUSHBUTTON "OK",IDOK,248,252,50,14,WS_GROUP
+ PUSHBUTTON "Cancel",IDCANCEL,302,252,50,14
CONTROL "",IDC_TREE1,"SysTreeView32",TVS_SHOWSELALWAYS | TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,6,6,84,240
- CONTROL "",IDC_TAB1,"SysTabControl32",WS_TABSTOP,96,6,210,240
- CONTROL "",IDC_TAB2,"SysTabControl32",WS_TABSTOP,96,6,210,240
- CONTROL "",IDC_TAB3,"SysTabControl32",WS_TABSTOP,96,6,210,240
- LTEXT "Static",IDC_PAGEPLACEHOLDER,106,26,186,214,NOT WS_VISIBLE
+ CONTROL "",IDC_TAB1,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ CONTROL "",IDC_TAB2,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ CONTROL "",IDC_TAB3,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ LTEXT "Static",IDC_PAGEPLACEHOLDER,106,26,236,214,NOT WS_VISIBLE
END
-IDD_VIEW DIALOGEX 0, 0, 194, 183
+IDD_VIEW DIALOGEX 0, 0, 244, 183
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "&Shrink blit mode:",IDC_SHRINK_BLIT_MODE_STATIC,0,0,74,12,SS_CENTERIMAGE
- COMBOBOX IDC_COMBO1,74,0,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "&Magnify blit mode:",IDC_MAGNIFY_BLIT_MODE_STATIC,0,19,74,8
- COMBOBOX IDC_COMBO2,74,17,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "&Title bar format:",IDC_STATIC,0,36,74,8
- COMBOBOX IDC_TITLE_BAR_FORMAT,74,34,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "Auto si&ze window:",IDC_AUTO_ZOOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,53,74,10
- COMBOBOX IDC_COMBO4,74,51,60,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- CONTROL "&Play animations at least once in slideshow",IDC_LOOP_ANIMATIONS_ONCE,
- "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,70,192,10
- CONTROL "Preload &next image",IDC_PRELOAD_NEXT_IMAGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,87,192,10
- CONTROL "Cache &last image",IDC_CACHE_LAST_IMAGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,103,192,10
- LTEXT "&Windowed background color:",IDC_STATIC,0,122,96,8
- PUSHBUTTON "",IDC_WINDOWEDBACKGROUNDCOLOR,96,120,50,14,BS_BITMAP
- LTEXT "&Fullscreen background color:",IDC_STATIC,0,140,96,8
- PUSHBUTTON "",IDC_FULLSCREENBACKGROUNDCOLOR,96,138,50,14,BS_BITMAP
+ LTEXT "&Shrink blit mode:",IDC_SHRINK_BLIT_MODE_STATIC,0,0,100,12,SS_CENTERIMAGE
+ COMBOBOX IDC_COMBO1,104,0,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Magnify blit mode:",IDC_MAGNIFY_BLIT_MODE_STATIC,0,19,100,8
+ COMBOBOX IDC_COMBO2,104,17,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Title bar format:",IDC_TITLE_BAR_FORMAT_STATIC,0,36,100,8
+ COMBOBOX IDC_TITLE_BAR_FORMAT,104,34,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Auto si&ze window:",IDC_AUTO_ZOOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,53,100,10
+ COMBOBOX IDC_COMBO4,104,51,60,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "&Play animations at least once in slideshow",IDC_LOOP_ANIMATIONS_ONCE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,70,236,10
+ CONTROL "Preload &next image",IDC_PRELOAD_NEXT_IMAGE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,87,236,10
+ CONTROL "Cache &last image",IDC_CACHE_LAST_IMAGE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,103,236,10
+ LTEXT "&Windowed background color:",IDC_WINDOWEDBACKGROUNDCOLOR_STATIC,0,122,120,8
+ PUSHBUTTON "",IDC_WINDOWEDBACKGROUNDCOLOR,124,120,50,14,BS_BITMAP
+ LTEXT "&Fullscreen background color:",IDC_FULLSCREENBACKGROUNDCOLOR_STATIC,0,140,120,8
+ PUSHBUTTON "",IDC_FULLSCREENBACKGROUNDCOLOR,124,138,50,14,BS_BITMAP
+ PUSHBUTTON "Reset Window Size && Position",IDC_RESET_WINDOW,0,158,150,14
END
-IDD_CONTROLS DIALOGEX 0, 0, 194, 216
+IDD_CONTROLS DIALOGEX 0, 0, 244, 216
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
EXSTYLE WS_EX_CONTROLPARENT
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
- LTEXT "&Left click action:",IDC_STATIC,0,0,54,12,SS_CENTERIMAGE
- COMBOBOX IDC_LEFTCLICKACTION,74,0,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "&Right click action:",IDC_STATIC,0,19,63,8
- COMBOBOX IDC_RIGHTCLICKACTION,74,17,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "&Mouse wheel action:",IDC_STATIC,0,36,72,8
- COMBOBOX IDC_MOUSEWHEELACTION,74,34,119,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
- LTEXT "&Commands:",IDC_STATIC,0,53,57,8
- LISTBOX IDC_COMMANDS_LIST,0,64,193,78,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
- GROUPBOX "Settings for selected command",IDC_STATIC,0,148,193,67
+ LTEXT "&Left click action:",IDC_LEFT_CLICK_ACTION_STATIC,0,0,70,12,SS_CENTERIMAGE
+ COMBOBOX IDC_LEFTCLICKACTION,74,0,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Right click action:",IDC_RIGHT_CLICK_ACTION_STATIC,0,19,70,8
+ COMBOBOX IDC_RIGHTCLICKACTION,74,17,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Mouse wheel action:",IDC_MOUSE_WHEEL_ACTION_STATIC,0,36,70,8
+ COMBOBOX IDC_MOUSEWHEELACTION,74,34,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Commands:",IDC_COMMANDS_STATIC,0,53,70,8
+ LISTBOX IDC_COMMANDS_LIST,0,64,244,78,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Settings for selected command",IDC_SETTINGS_FOR_SELECTED_COMMAND_STATIC,0,148,244,67
LISTBOX IDC_KEYS_LIST,7,158,125,50,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
- PUSHBUTTON "&Add...",IDC_ADD_KEY,138,158,50,14
- PUSHBUTTON "&Edit...",IDC_EDIT_KEY,137,177,50,14
- PUSHBUTTON "Remo&ve",IDC_REMOVE_KEY,137,195,50,14
+ PUSHBUTTON "&Add...",IDC_ADD_KEY,188,158,50,14
+ PUSHBUTTON "&Edit...",IDC_EDIT_KEY,187,177,50,14
+ PUSHBUTTON "Remo&ve",IDC_REMOVE_KEY,187,195,50,14
END
IDD_CUSTOM_RATE DIALOGEX 0, 0, 202, 63
@@ -205,8 +210,8 @@ IDI_BESTFIT ICON "bestfit.ico"
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,15
- PRODUCTVERSION 1,0,0,15
+ FILEVERSION 1,0,1,0
+ PRODUCTVERSION 1,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -222,12 +227,12 @@ BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "voidImageViewer"
- VALUE "FileVersion", "1.0.0.15"
+ VALUE "FileVersion", "1.0.1.0"
VALUE "InternalName", "voidImageViewer"
- VALUE "LegalCopyright", "Copyright © 2026 voidtools"
+ VALUE "LegalCopyright", "Copyright © 2026 voidtools"
VALUE "OriginalFilename", "voidImageViewer.exe"
VALUE "ProductName", "voidImageViewer"
- VALUE "ProductVersion", "1.0.0.15"
+ VALUE "ProductVersion", "1.0.1.0"
END
END
BLOCK "VarFileInfo"
@@ -287,3 +292,5 @@ END
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
+
+
diff --git a/res/voidImageViewer_utf8.rc b/res/voidImageViewer_utf8.rc
new file mode 100644
index 0000000..198d8ba
--- /dev/null
+++ b/res/voidImageViewer_utf8.rc
@@ -0,0 +1,294 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (U.S.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+#pragma code_page(1252)
+#endif //_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_GENERAL DIALOGEX 0, 0, 244, 200
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Language:",IDC_LANGUAGE_STATIC,0,2,50,12,SS_CENTERIMAGE
+ COMBOBOX IDC_LANGUAGE_COMBOBOX,54,0,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "&Store settings in %APPDATA%\\voidImageViewer",IDC_APPDATA,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,20,186,10
+ CONTROL "Allow multiple &instances",IDC_MULTIPLE_INSTANCES,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,38,186,10
+ CONTROL "Start &menu shortcuts",IDC_STARTMENU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,56,186,10
+ GROUPBOX "Associations",IDC_STATIC,0,74,54,124
+ CONTROL "&BMP",IDC_BMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,86,42,10
+ CONTROL "&GIF",IDC_GIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,98,42,10
+ CONTROL "IC&O",IDC_ICO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,110,42,10
+ CONTROL "JP&EG",IDC_JPEG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,122,42,10
+ CONTROL "&JPG",IDC_JPG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,134,42,10
+ CONTROL "&PNG",IDC_PNG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,146,42,10
+ CONTROL "&TIF",IDC_TIF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,158,42,10
+ CONTROL "TIF&F",IDC_TIFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,170,42,10
+ CONTROL "&WEBP",IDC_WEBP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,182,42,10
+ PUSHBUTTON "Check &All",IDC_CHECKALL,60,80,54,14
+ PUSHBUTTON "Check &None",IDC_CHECKNONE,60,98,54,14
+END
+
+IDD_OPTIONS DIALOGEX 0, 0, 360, 271
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Options - Void Image Viewer"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,248,252,50,14,WS_GROUP
+ PUSHBUTTON "Cancel",IDCANCEL,302,252,50,14
+ CONTROL "",IDC_TREE1,"SysTreeView32",TVS_SHOWSELALWAYS | TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,6,6,84,240
+ CONTROL "",IDC_TAB1,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ CONTROL "",IDC_TAB2,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ CONTROL "",IDC_TAB3,"SysTabControl32",WS_TABSTOP,96,6,260,240
+ LTEXT "Static",IDC_PAGEPLACEHOLDER,106,26,236,214,NOT WS_VISIBLE
+END
+
+IDD_VIEW DIALOGEX 0, 0, 244, 183
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Shrink blit mode:",IDC_SHRINK_BLIT_MODE_STATIC,0,0,100,12,SS_CENTERIMAGE
+ COMBOBOX IDC_COMBO1,104,0,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Magnify blit mode:",IDC_MAGNIFY_BLIT_MODE_STATIC,0,19,100,8
+ COMBOBOX IDC_COMBO2,104,17,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Title bar format:",IDC_TITLE_BAR_FORMAT_STATIC,0,36,100,8
+ COMBOBOX IDC_TITLE_BAR_FORMAT,104,34,135,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Auto si&ze window:",IDC_AUTO_ZOOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,53,100,10
+ COMBOBOX IDC_COMBO4,104,51,60,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "&Play animations at least once in slideshow",IDC_LOOP_ANIMATIONS_ONCE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,70,236,10
+ CONTROL "Preload &next image",IDC_PRELOAD_NEXT_IMAGE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,87,236,10
+ CONTROL "Cache &last image",IDC_CACHE_LAST_IMAGE_STATIC,
+ "Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,103,236,10
+ LTEXT "&Windowed background color:",IDC_WINDOWEDBACKGROUNDCOLOR_STATIC,0,122,120,8
+ PUSHBUTTON "",IDC_WINDOWEDBACKGROUNDCOLOR,124,120,50,14,BS_BITMAP
+ LTEXT "&Fullscreen background color:",IDC_FULLSCREENBACKGROUNDCOLOR_STATIC,0,140,120,8
+ PUSHBUTTON "",IDC_FULLSCREENBACKGROUNDCOLOR,124,138,50,14,BS_BITMAP
+ PUSHBUTTON "Reset Window Size && Position",IDC_RESET_WINDOW,0,158,150,14
+END
+
+IDD_CONTROLS DIALOGEX 0, 0, 244, 216
+STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS
+EXSTYLE WS_EX_CONTROLPARENT
+FONT 8, "MS Shell Dlg", 0, 0, 0x0
+BEGIN
+ LTEXT "&Left click action:",IDC_LEFT_CLICK_ACTION_STATIC,0,0,70,12,SS_CENTERIMAGE
+ COMBOBOX IDC_LEFTCLICKACTION,74,0,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Right click action:",IDC_RIGHT_CLICK_ACTION_STATIC,0,19,70,8
+ COMBOBOX IDC_RIGHTCLICKACTION,74,17,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Mouse wheel action:",IDC_MOUSE_WHEEL_ACTION_STATIC,0,36,70,8
+ COMBOBOX IDC_MOUSEWHEELACTION,74,34,165,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "&Commands:",IDC_COMMANDS_STATIC,0,53,70,8
+ LISTBOX IDC_COMMANDS_LIST,0,64,244,78,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Settings for selected command",IDC_SETTINGS_FOR_SELECTED_COMMAND_STATIC,0,148,244,67
+ LISTBOX IDC_KEYS_LIST,7,158,125,50,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ PUSHBUTTON "&Add...",IDC_ADD_KEY,188,158,50,14
+ PUSHBUTTON "&Edit...",IDC_EDIT_KEY,187,177,50,14
+ PUSHBUTTON "Remo&ve",IDC_REMOVE_KEY,187,195,50,14
+END
+
+IDD_CUSTOM_RATE DIALOGEX 0, 0, 202, 63
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+CAPTION "Set Custom Rate"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ EDITTEXT IDC_CUSTOM_RATE_EDIT,54,12,66,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
+ DEFPUSHBUTTON "OK",IDOK,90,36,48,14
+ PUSHBUTTON "Cancel",IDCANCEL,144,36,48,14
+ LTEXT "&Custom rate:",IDC_STATIC,6,14,45,8
+ COMBOBOX IDC_CUSTOM_RATE_TYPE_COMBO,126,12,66,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_ABOUT DIALOGEX 0, 0, 228, 189
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+CAPTION "About void Image Viewer"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,120,168,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,174,168,50,14
+ LTEXT "",IDC_ABOUTBACK,0,0,228,54
+ EDITTEXT IDC_ABOUTTITLE,30,18,192,30,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_ABOUTVOIDIMAGEVIEWER,30,66,192,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_ABOUTVERSION,30,84,192,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_ABOUTCOPYRIGHT,30,102,192,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_ABOUTEMAIL,30,120,192,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+ EDITTEXT IDC_ABOUTWEBSITE,30,138,192,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER
+END
+
+IDD_EDIT_KEY DIALOGEX 0, 0, 186, 119
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Edit Keyboard Shortcut"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ LTEXT "Shortcut &key:",IDC_STATIC,7,7,44,8
+ EDITTEXT IDC_EDIT_KEY_EDIT,7,17,172,14,ES_AUTOHSCROLL | ES_WANTRETURN
+ LTEXT "Shortcut key currently used by:",IDC_STATIC,7,36,102,8
+ LISTBOX IDC_EDIT_KEY_CURRENTLY_USED_BY_LIST,7,47,172,43,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK",IDOK,70,98,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,129,98,50,14
+END
+
+IDD_RENAME DIALOGEX 0, 0, 186, 51
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Rename"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ EDITTEXT IDC_RENAME_EDIT,7,7,172,14,ES_AUTOHSCROLL
+ DEFPUSHBUTTON "OK",IDOK,74,30,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,129,30,50,14
+ EDITTEXT IDC_RENAME_OLD_EDIT,7,30,40,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
+END
+
+IDD_JUMPTO DIALOGEX 0, 0, 187, 229
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+EXSTYLE WS_EX_CONTROLPARENT
+CAPTION "Jump To"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ EDITTEXT IDC_JUMPTO_EDIT,7,7,173,14,ES_AUTOHSCROLL | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
+ LISTBOX IDC_JUMPTO_LIST,7,29,173,170,WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL | WS_TABSTOP
+ DEFPUSHBUTTON "OK",IDOK,74,208,50,14,WS_CLIPSIBLINGS | WS_CLIPCHILDREN
+ PUSHBUTTON "Cancel",IDCANCEL,130,208,50,14,WS_CLIPSIBLINGS | WS_CLIPCHILDREN
+END
+
+IDD_EVERYTHING DIALOGEX 0, 0, 186, 63
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Search Everything"
+FONT 8, "MS Shell Dlg", 400, 0, 0x1
+BEGIN
+ EDITTEXT IDC_EVERYTHING_EDIT,6,6,173,14,ES_AUTOHSCROLL
+ CONTROL "Randomize",IDC_SEARCH_EVERYTHING_RANDOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,24,51,10
+ DEFPUSHBUTTON "OK",IDOK,72,42,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,127,42,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1 ICON "voidImageViewer.ico"
+IDI_PREV ICON "prev.ico"
+IDI_PLAY ICON "play.ico"
+IDI_NEXT ICON "next.ico"
+IDI_PAUSE ICON "pause.ico"
+IDI_1TO1 ICON "1to1-8bit.ico"
+IDI_BESTFIT ICON "bestfit.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,15
+ PRODUCTVERSION 1,0,0,15
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "FileDescription", "voidImageViewer"
+ VALUE "FileVersion", "1.0.0.15"
+ VALUE "InternalName", "voidImageViewer"
+ VALUE "LegalCopyright", "Copyright © 2026 voidtools"
+ VALUE "OriginalFilename", "voidImageViewer.exe"
+ VALUE "ProductName", "voidImageViewer"
+ VALUE "ProductVersion", "1.0.0.15"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
+#endif // English (U.S.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////
+// English (Australia) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA)
+#ifdef _WIN32
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""afxres.h""\r\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // English (Australia) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/scratch_version.ps1 b/scratch_version.ps1
new file mode 100644
index 0000000..91d9bb8
--- /dev/null
+++ b/scratch_version.ps1
@@ -0,0 +1,4 @@
+$c = Get-Content res\voidImageViewer.rc -Raw
+$c = $c -replace '1,0,0,15', '1,0,1,0'
+$c = $c -replace '1\.0\.0\.15', '1.0.1.0'
+Set-Content res\voidImageViewer.rc $c -Encoding Default
diff --git a/src/config.c b/src/config.c
index 719eb0c..30d0ac7 100644
--- a/src/config.c
+++ b/src/config.c
@@ -29,7 +29,8 @@ static void _config_write_string(HANDLE h,const char *ascii_key,const wchar_t *s
static void _config_write_utf8(HANDLE h,const utf8_t *s);
static void _config_save_settings_by_location(const wchar_t *path,int is_root);
-BYTE config_appdata = 0; // store settings in %APPDATA%\voidimageviewer or in the same location as voidimageviewer.exe
+BYTE config_appdata = 1; // store settings in %APPDATA%\voidimageviewer or in the same location as voidimageviewer.exe
+BYTE config_language = 255; // 255 = auto
BYTE config_keep_centered = 1; // when zooming out, don't recenter the image. (keep cursor under the same pixel)
int config_x = 0;
int config_y = 0;
@@ -40,8 +41,8 @@ int config_slideshow_rate = 5000;
BYTE config_allow_shrinking = 1; // prevent resizing an image below 100%
BYTE config_shrink_blit_mode = CONFIG_SHRINK_BLIT_MODE_HALFTONE; // shrink filter
BYTE config_mag_filter = CONFIG_MAG_FILTER_COLORONCOLOR; // magnify filter
-BYTE config_nav_sort = CONFIG_NAV_SORT_DATE_MODIFIED; // current navigation sort.
-BYTE config_nav_sort_ascending = 0; // sort navigation ascending or descending.
+BYTE config_nav_sort = CONFIG_NAV_SORT_NAME; // current navigation sort.
+BYTE config_nav_sort_ascending = 1; // sort navigation ascending or descending.
BYTE config_keep_aspect_ratio = 1; // stretch images with the original aspect ratio.
BYTE config_fill_window = 0; // stretch the image to fill the window
BYTE config_fullscreen_fill_window = 1; // same as fill_window, except this setting is used when we are fullscreen
@@ -102,6 +103,7 @@ static void _config_load_settings_by_location(const wchar_t *path,int is_root)
if (ini)
{
config_x = ini_get_int(ini,(const utf8_t *)"x",config_x);
+ config_language = ini_get_int(ini,(const utf8_t *)"language",config_language);
config_y = ini_get_int(ini,(const utf8_t *)"y",config_y);
config_wide = ini_get_int(ini,(const utf8_t *)"wide",config_wide);
config_high = ini_get_int(ini,(const utf8_t *)"high",config_high);
@@ -286,6 +288,7 @@ static void _config_save_settings_by_location(const wchar_t *path,int is_root)
else
{
_config_write_int(h,"x",config_x);
+ _config_write_int(h,"language",config_language);
_config_write_int(h,"y",config_y);
_config_write_int(h,"wide",config_wide);
_config_write_int(h,"high",config_high);
diff --git a/src/config.h b/src/config.h
index 6a6afa1..644129d 100644
--- a/src/config.h
+++ b/src/config.h
@@ -59,6 +59,7 @@ void config_load_settings(void);
void config_save_settings(int appdata);
extern BYTE config_appdata;
+extern BYTE config_language;
extern BYTE config_keep_centered;
extern int config_x;
extern int config_y;
diff --git a/src/localization.c b/src/localization.c
index 691e471..9e58b29 100644
--- a/src/localization.c
+++ b/src/localization.c
@@ -24,11 +24,13 @@
#include "viv.h"
#include "localization_en_us.h"
#include "localization_zh_cn.h"
+#include "localization_id_id.h"
static const utf8_t **_localization_language_array[LOCALIZATION_LANGUAGE_COUNT] =
{
_localization_string_array_en_us, // LOCALIZATION_LANGUAGE_ENGLISH
_localization_string_array_zh_cn, // LOCALIZATION_LANGUAGE_CHINESE_SIMPLIFIED
+ _localization_string_array_id_id, // LOCALIZATION_LANGUAGE_INDONESIAN
};
BYTE localization_language = LOCALIZATION_LANGUAGE_ENGLISH;
@@ -54,6 +56,16 @@ const utf8_t *localization_get_en_us_string(localization_id_t localization_id)
void localization_init(void)
{
+ // If config_language is not Auto, use it
+ if (config_language != 255)
+ {
+ if (config_language < LOCALIZATION_LANGUAGE_COUNT)
+ {
+ localization_language = config_language;
+ return;
+ }
+ }
+
// Detect system language
if (os_GetUserDefaultUILanguage)
{
@@ -69,5 +81,23 @@ void localization_init(void)
{
localization_language = LOCALIZATION_LANGUAGE_CHINESE_SIMPLIFIED;
}
+ else if (langid == 0x0421) // Indonesian
+ {
+ localization_language = LOCALIZATION_LANGUAGE_INDONESIAN;
+ }
+ else
+ {
+ localization_language = LOCALIZATION_LANGUAGE_ENGLISH;
+ }
}
}
+
+const utf8_t *localization_get_language_name(BYTE language)
+{
+ if (language < LOCALIZATION_LANGUAGE_COUNT)
+ {
+ return _localization_language_array[language][LOCALIZATION_ID_LANGUAGE];
+ }
+
+ return (const utf8_t *)"";
+}
diff --git a/src/localization.h b/src/localization.h
index 99248c5..34e3734 100644
--- a/src/localization.h
+++ b/src/localization.h
@@ -29,6 +29,7 @@ enum
{
LOCALIZATION_LANGUAGE_ENGLISH = 0,
LOCALIZATION_LANGUAGE_CHINESE_SIMPLIFIED,
+ LOCALIZATION_LANGUAGE_INDONESIAN,
LOCALIZATION_LANGUAGE_COUNT,
};
@@ -40,6 +41,7 @@ typedef BYTE localization_id_t;
// Returns UTF-8 encoded string
const utf8_t *localization_get_string(localization_id_t localization_id);
const utf8_t *localization_get_en_us_string(localization_id_t localization_id);
+const utf8_t *localization_get_language_name(BYTE language);
// Initialize language system (detects system language)
void localization_init(void);
@@ -49,6 +51,8 @@ enum
{
// Localization
LOCALIZATION_ID_LANGUAGE = 0,
+ LOCALIZATION_ID_LANGUAGE_STATIC,
+ LOCALIZATION_ID_LANGUAGE_AUTO,
// Application name
LOCALIZATION_ID_APP_NAME,
@@ -255,6 +259,7 @@ enum
LOCALIZATION_ID_CACHE_LAST_IMAGE_STATIC,
LOCALIZATION_ID_WINDOWED_BACKGROUND_COLOR_STATIC,
LOCALIZATION_ID_FULLSCREEN_BACKGROUND_COLOR_STATIC,
+ LOCALIZATION_ID_OPTIONS_VIEW_RESET_WINDOW_BUTTON,
LOCALIZATION_ID_LEFT_CLICK_ACTION_STATIC,
LOCALIZATION_ID_RIGHT_CLICK_ACTION_STATIC,
LOCALIZATION_ID_MOUSE_WHEEL_ACTION_STATIC,
diff --git a/src/localization_en_us.h b/src/localization_en_us.h
index 5747262..9d2b01f 100644
--- a/src/localization_en_us.h
+++ b/src/localization_en_us.h
@@ -26,6 +26,8 @@ static const utf8_t *_localization_string_array_en_us[LOCALIZATION_ID_COUNT] =
{
// Application name
"English (US)", // LOCALIZATION_ID_LANGUAGE
+ "&Language:", // LOCALIZATION_ID_LANGUAGE_STATIC
+ "System Default", // LOCALIZATION_ID_LANGUAGE_AUTO
// Application name
"void Image Viewer", // LOCALIZATION_ID_APP_NAME
@@ -232,6 +234,7 @@ static const utf8_t *_localization_string_array_en_us[LOCALIZATION_ID_COUNT] =
"Cache &last image", // LOCALIZATION_ID_CACHE_LAST_IMAGE_STATIC,
"&Windowed background color:", // LOCALIZATION_ID_WINDOWED_BACKGROUND_COLOR_STATIC,
"&Fullscreen background color:", // LOCALIZATION_ID_FULLSCREEN_BACKGROUND_COLOR_STATIC,
+ "Reset Window Size & Position", // LOCALIZATION_ID_OPTIONS_VIEW_RESET_WINDOW_BUTTON,
"&Left click action:", // LOCALIZATION_ID_LEFT_CLICK_ACTION_STATIC,
"&Right click action:", // LOCALIZATION_ID_RIGHT_CLICK_ACTION_STATIC,
"&Mouse wheel action:", // LOCALIZATION_ID_MOUSE_WHEEL_ACTION_STATIC,
diff --git a/src/localization_id_id.h b/src/localization_id_id.h
new file mode 100644
index 0000000..ef5a2fb
--- /dev/null
+++ b/src/localization_id_id.h
@@ -0,0 +1,300 @@
+//
+// Copyright 2026 hesphoros
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+//
+// Indonesian localization
+// Save as UTF-8 without BOM.
+
+static const utf8_t *_localization_string_array_id_id[LOCALIZATION_ID_COUNT] =
+{
+ // Nama bahasa
+ "Bahasa Indonesia", // LOCALIZATION_ID_LANGUAGE
+ "&Bahasa:", // LOCALIZATION_ID_LANGUAGE_STATIC
+ "Default Sistem", // LOCALIZATION_ID_LANGUAGE_AUTO
+
+ // Nama aplikasi
+ "void Image Viewer", // LOCALIZATION_ID_APP_NAME
+
+ // Menu Berkas
+ "&Berkas", // LOCALIZATION_ID_FILE,
+ "&Buka Berkas...", // LOCALIZATION_ID_OPEN_FILE,
+ "Buka &Folder...", // LOCALIZATION_ID_OPEN_FOLDER,
+ "Buka Pencarian &Everything...", // LOCALIZATION_ID_OPEN_EVERYTHING_SEARCH,
+ "&Tambah Berkas...", // LOCALIZATION_ID_ADD_FILE,
+ "Tambah Folder...", // LOCALIZATION_ID_ADD_FOLDER,
+ "Tambah Pencarian Everything...", // LOCALIZATION_ID_ADD_EVERYTHING_SEARCH,
+ "Buka &Lokasi Berkas...", // LOCALIZATION_ID_OPEN_FILE_LOCATION,
+ "&Ubah...", // LOCALIZATION_ID_EDIT,
+ "P&ratinjau...", // LOCALIZATION_ID_PREVIEW,
+ "&Cetak...", // LOCALIZATION_ID_PRINT,
+ "Jadikan Wallpaper Des&ktop", // LOCALIZATION_ID_SET_DESKTOP_WALLPAPER,
+ "&Tutup", // LOCALIZATION_ID_CLOSE,
+ "&Hapus", // LOCALIZATION_ID_DELETE,
+ "Hapus (Tong Sampah)", // LOCALIZATION_ID_DELETE_RECYCLE,
+ "Hapus (Permanen)", // LOCALIZATION_ID_DELETE_PERMANENTLY,
+ "Ubah &Nama", // LOCALIZATION_ID_RENAME,
+ "P&roperti", // LOCALIZATION_ID_PROPERTIES,
+ "&Keluar", // LOCALIZATION_ID_EXIT,
+
+ // Menu Ubah
+ "&Ubah", // LOCALIZATION_ID_EDIT_MENU,
+ "Po&tong", // LOCALIZATION_ID_CUT,
+ "&Salin", // LOCALIZATION_ID_COPY,
+ "Salin Nama Berkas", // LOCALIZATION_ID_COPY_FILENAME,
+ "Salin &Gambar", // LOCALIZATION_ID_COPY_IMAGE,
+ "&Tempel", // LOCALIZATION_ID_PASTE,
+ "Putar Se&arah Jarum Jam", // LOCALIZATION_ID_ROTATE_CLOCKWISE,
+ "Putar Ber&lawanan Jarum Jam", // LOCALIZATION_ID_ROTATE_COUNTERCLOCKWISE,
+ "Salin ke &Folder...", // LOCALIZATION_ID_COPY_TO,
+ "Pi&ndah ke Folder...", // LOCALIZATION_ID_MOVE_TO,
+
+ // Menu Tampilan
+ "&Tampilan", // LOCALIZATION_ID_VIEW,
+ "Keterangan", // LOCALIZATION_ID_CAPTION,
+ "Bingkai", // LOCALIZATION_ID_FRAME,
+ "&Menu", // LOCALIZATION_ID_MENU,
+ "Bilah &Status", // LOCALIZATION_ID_STATUS_BAR,
+ "K&ontrol", // LOCALIZATION_ID_CONTROLS,
+ "&Preset", // LOCALIZATION_ID_PRESET,
+ "&Minimalis", // LOCALIZATION_ID_MINIMAL,
+ "&Ringkas", // LOCALIZATION_ID_COMPACT,
+ "&Normal", // LOCALIZATION_ID_NORMAL,
+ "&Layar Penuh", // LOCALIZATION_ID_FULLSCREEN,
+ "&Slideshow", // LOCALIZATION_ID_SLIDESHOW,
+ "&Ukuran Jendela", // LOCALIZATION_ID_VIEW_WINDOW_SIZE,
+ "50%", // LOCALIZATION_ID_VIEW_WINDOW_SIZE_50_PERCENT,
+ "100%", // LOCALIZATION_ID_VIEW_WINDOW_SIZE_100_PERCENT,
+ "200%", // LOCALIZATION_ID_VIEW_WINDOW_SIZE_200_PERCENT,
+ "&Pas Otomatis", // LOCALIZATION_ID_VIEW_WINDOW_SIZE_AUTO_FIT,
+ "&Segarkan", // LOCALIZATION_ID_REFRESH,
+ "&Izinkan Pengecilan", // LOCALIZATION_ID_ALLOW_SHRINKING,
+ "&Pertahankan Rasio Aspek", // LOCALIZATION_ID_KEEP_ASPECT_RATIO,
+ "&Isi Jendela", // LOCALIZATION_ID_FILL_WINDOW,
+ "1:1", // LOCALIZATION_ID_ONE_TO_ONE,
+ "Paling &Pas", // LOCALIZATION_ID_BEST_FIT,
+ "Geser && &Pindai", // LOCALIZATION_ID_PAN_SCAN,
+ "&Perbesar Ukuran", // LOCALIZATION_ID_INCREASE_SIZE,
+ "&Perkecil Ukuran", // LOCALIZATION_ID_DECREASE_SIZE,
+ "Pe&rlebar", // LOCALIZATION_ID_INCREASE_WIDTH,
+ "Pe&nyempit", // LOCALIZATION_ID_DECREASE_WIDTH,
+ "Per&tinggi", // LOCALIZATION_ID_INCREASE_HEIGHT,
+ "Per&pendek", // LOCALIZATION_ID_DECREASE_HEIGHT,
+ "&Zoom", // LOCALIZATION_ID_ZOOM,
+ "Zoom &Masuk", // LOCALIZATION_ID_ZOOM_IN,
+ "Zoom &Keluar", // LOCALIZATION_ID_ZOOM_OUT,
+ "&Atur Ulang", // LOCALIZATION_ID_RESET,
+ "Geser Ke &Atas", // LOCALIZATION_ID_MOVE_UP,
+ "Geser Ke &Bawah", // LOCALIZATION_ID_MOVE_DOWN,
+ "Geser Ke &Kiri", // LOCALIZATION_ID_MOVE_LEFT,
+ "Geser Ke &Kanan", // LOCALIZATION_ID_MOVE_RIGHT,
+ "Geser Atas Kiri", // LOCALIZATION_ID_MOVE_UP_LEFT,
+ "Geser Atas Kanan", // LOCALIZATION_ID_MOVE_UP_RIGHT,
+ "Geser Bawah Kiri", // LOCALIZATION_ID_MOVE_DOWN_LEFT,
+ "Geser Bawah Kanan", // LOCALIZATION_ID_MOVE_DOWN_RIGHT,
+ "Geser ke &Tengah", // LOCALIZATION_ID_MOVE_CENTER,
+ "Atur &Ulang", // LOCALIZATION_ID_PANSCAN_RESET,
+ "Selalu di &Atas", // LOCALIZATION_ID_ON_TOP,
+ "&Selalu", // LOCALIZATION_ID_ALWAYS,
+ "S&aat Memutar Slideshow atau Animasi", // LOCALIZATION_ID_WHILE_PLAYING_OR_ANIMATING,
+ "&Jangan Pernah", // LOCALIZATION_ID_NEVER,
+ "&Opsi...", // LOCALIZATION_ID_OPTIONS,
+
+ // Menu Slideshow
+ "&Slideshow", // LOCALIZATION_ID_SLIDESHOW_MENU,
+ "&Putar/Jeda", // LOCALIZATION_ID_PLAY_PAUSE,
+ "&Kecepatan", // LOCALIZATION_ID_RATE,
+ "&Kurangi Kecepatan", // LOCALIZATION_ID_DECREASE_RATE,
+ "&Tambah Kecepatan", // LOCALIZATION_ID_INCREASE_RATE,
+ "250 Milidetik", // LOCALIZATION_ID_RATE_250_MILLISECONDS,
+ "500 Milidetik", // LOCALIZATION_ID_RATE_500_MILLISECONDS,
+ "&1 Detik", // LOCALIZATION_ID_RATE_1_SECOND,
+ "&2 Detik", // LOCALIZATION_ID_RATE_2_SECONDS,
+ "&3 Detik", // LOCALIZATION_ID_RATE_3_SECONDS,
+ "&4 Detik", // LOCALIZATION_ID_RATE_4_SECONDS,
+ "&5 Detik", // LOCALIZATION_ID_RATE_5_SECONDS,
+ "&6 Detik", // LOCALIZATION_ID_RATE_6_SECONDS,
+ "&7 Detik", // LOCALIZATION_ID_RATE_7_SECONDS,
+ "&8 Detik", // LOCALIZATION_ID_RATE_8_SECONDS,
+ "&9 Detik", // LOCALIZATION_ID_RATE_9_SECONDS,
+ "1&0 Detik", // LOCALIZATION_ID_RATE_10_SECONDS,
+ "20 Detik", // LOCALIZATION_ID_RATE_20_SECONDS,
+ "30 Detik", // LOCALIZATION_ID_RATE_30_SECONDS,
+ "40 Detik", // LOCALIZATION_ID_RATE_40_SECONDS,
+ "50 Detik", // LOCALIZATION_ID_RATE_50_SECONDS,
+ "1 Menit", // LOCALIZATION_ID_RATE_1_MINUTE,
+ "Kustom...", // LOCALIZATION_ID_CUSTOM,
+
+ // Menu Animasi
+ "&Animasi", // LOCALIZATION_ID_ANIMATION,
+ "&Putar/Jeda", // LOCALIZATION_ID_ANIMATION_PLAY_PAUSE,
+ "Lompat ke &Depan", // LOCALIZATION_ID_ANIMATION_JUMP_FORWARD,
+ "Lompat ke &Belakang", // LOCALIZATION_ID_ANIMATION_JUMP_BACKWARD,
+ "Lompat Pendek ke &Depan", // LOCALIZATION_ID_ANIMATION_SHORT_JUMP_FORWARD,
+ "Lompat Pendek ke &Belakang", // LOCALIZATION_ID_ANIMATION_SHORT_JUMP_BACKWARD,
+ "Lompat Jauh ke &Depan", // LOCALIZATION_ID_ANIMATION_LONG_JUMP_FORWARD,
+ "Lompat Jauh ke &Belakang", // LOCALIZATION_ID_ANIMATION_LONG_JUMP_BACKWARD,
+ "Langkah &Frame", // LOCALIZATION_ID_ANIMATION_FRAME_STEP,
+ "Frame &Sebelumnya", // LOCALIZATION_ID_ANIMATION_PREVIOUS_FRAME,
+ "Frame Per&tama", // LOCALIZATION_ID_ANIMATION_FIRST_FRAME,
+ "Frame Ter&akhir", // LOCALIZATION_ID_ANIMATION_LAST_FRAME,
+ "&Kurangi Kecepatan", // LOCALIZATION_ID_ANIMATION_DECREASE_RATE,
+ "&Tambah Kecepatan", // LOCALIZATION_ID_ANIMATION_INCREASE_RATE,
+ "Atur &Ulang Kecepatan", // LOCALIZATION_ID_ANIMATION_RESET_RATE,
+
+ // Menu Navigasi
+ "&Navigasi", // LOCALIZATION_ID_NAVIGATE,
+ "&Selanjutnya", // LOCALIZATION_ID_NEXT,
+ "&Sebelumnya", // LOCALIZATION_ID_PREVIOUS,
+ "&Home", // LOCALIZATION_ID_HOME,
+ "&End", // LOCALIZATION_ID_END,
+ "&Urutkan", // LOCALIZATION_ID_SORT,
+ "&Nama", // LOCALIZATION_ID_SORT_NAME,
+ "&Path Lengkap", // LOCALIZATION_ID_SORT_FULL_PATH,
+ "&Ukuran", // LOCALIZATION_ID_SORT_SIZE,
+ "Tanggal &Modifikasi", // LOCALIZATION_ID_SORT_DATE_MODIFIED,
+ "Tanggal &Dibuat", // LOCALIZATION_ID_SORT_DATE_CREATED,
+ "&Menaik (Ascending)", // LOCALIZATION_ID_SORT_ASCENDING,
+ "&Menurun (Descending)", // LOCALIZATION_ID_SORT_DESCENDING,
+ "Acak", // LOCALIZATION_ID_SHUFFLE,
+ "&Lompat Ke...", // LOCALIZATION_ID_JUMP_TO,
+
+ // Menu Bantuan
+ "&Bantuan", // LOCALIZATION_ID_HELP,
+ "&Bantuan", // LOCALIZATION_ID_HELP_MENU,
+ "&Opsi Command Line", // LOCALIZATION_ID_COMMAND_LINE_OPTIONS,
+ "&Halaman Utama", // LOCALIZATION_ID_HOME_PAGE,
+ "&Donasi", // LOCALIZATION_ID_DONATE,
+ "&Tentang", // LOCALIZATION_ID_ABOUT,
+ "https://www.voidtools.com/support/voidimageviewer/", // LOCALIZATION_ID_HELP_SUPPORT_URL,
+ "https://www.voidtools.com/donate/", // LOCALIZATION_ID_HELP_DONATE_URL,
+ "https://www.voidtools.com/", // LOCALIZATION_ID_HELP_WEBSITE_URL,
+
+ // Bilah Alat (Toolbar)
+ "Gambar Sebelumnya", // LOCALIZATION_ID_TOOLBAR_PREVIOUS_IMAGE_BUTTON,
+ "Gambar Selanjutnya", // LOCALIZATION_ID_TOOLBAR_NEXT_IMAGE_BUTTON,
+ "Putar Slideshow", // LOCALIZATION_ID_TOOLBAR_PLAY_SLIDESHOW_BUTTON,
+ "Jeda Slideshow", // LOCALIZATION_ID_TOOLBAR_PAUSE_SLIDESHOW_BUTTON,
+ "Paling Pas", // LOCALIZATION_ID_TOOLBAR_BEST_FIT_BUTTON,
+ "Ukuran Asli", // LOCALIZATION_ID_TOOLBAR_ACTUAL_SIZE_BUTTON,
+
+ // Bilah Status
+ "PRAPEMUATAN", // LOCALIZATION_ID_STATUS_BAR_PRELOAD,
+ "Memuat...", // LOCALIZATION_ID_STATUS_BAR_LOADING,
+ "Berkas tidak ditemukan.", // LOCALIZATION_ID_STATUS_BAR_FILE_NOT_FOUND,
+ "Gagal memuat gambar.", // LOCALIZATION_ID_STATUS_BAR_FAILED_TO_LOAD_IMAGE,
+ "Slideshow diputar", // LOCALIZATION_ID_STATUS_BAR_SLIDESHOW_PLAYING,
+ "Pos %0.3f %0.3f, Zoom %0.3f %0.3f, Rasio Aspek %0.3f", // LOCALIZATION_ID_STATUS_BAR_POS_ZOOM_FORMAT,
+ "Kecepatan animasi %0.3f", // LOCALIZATION_ID_STATUS_BAR_ANIMATION_RATE_FORMAT,
+ "Kecepatan slideshow %d %s", // LOCALIZATION_ID_STATUS_BAR_SLIDESHOW_RATE_FORMAT,
+ "menit", // LOCALIZATION_ID_STATUS_BAR_MINUTES,
+ "detik", // LOCALIZATION_ID_STATUS_BAR_SECONDS,
+ "milidetik", // LOCALIZATION_ID_STATUS_BAR_MILLISECONDS,
+
+ // Dialog Opsi
+ "Opsi - void Image Viewer", // LOCALIZATION_ID_OPTIONS_CAPTION,
+ "Umum", // LOCALIZATION_ID_OPTIONS_GENERAL_DIALOG,
+ "Tampilan", // LOCALIZATION_ID_OPTIONS_VIEW_DIALOG,
+ "Kontrol", // LOCALIZATION_ID_OPTIONS_CONTROLS_DIALOG,
+ "OK", // LOCALIZATION_ID_OK_BUTTON,
+ "Batal", // LOCALIZATION_ID_CANCEL_BUTTON,
+ "&Simpan pengaturan di %APPDATA%\\voidImageViewer", // LOCALIZATION_ID_STORE_SETTINGS_APPDATA,
+ "Izinkan beberapa &instansi", // LOCALIZATION_ID_ALLOW_MULTIPLE_INSTANCES,
+ "Pintasan &menu Start", // LOCALIZATION_ID_STARTMENU_SHORTCUTS,
+ "Asosiasi", // LOCALIZATION_ID_ASSOCIATIONS,
+ "Pilih &Semua", // LOCALIZATION_ID_CHECK_ALL,
+ "Pilih &Tidak Ada", // LOCALIZATION_ID_CHECK_NONE,
+ "Mode blit &pengecilan:", // LOCALIZATION_ID_SHRINK_BLIT_MODE_STATIC,
+ "Mode blit &pembesaran:", // LOCALIZATION_ID_MAGNIFY_BLIT_MODE,
+ "Nearest", // LOCALIZATION_ID_BLIT_MODE_NEAREST_COMBOBOXITEM,
+ "Linear", // LOCALIZATION_ID_BLIT_MODE_LINEAR_COMBOBOXITEM,
+ "Ukuran jendela &otomatis:", // LOCALIZATION_ID_OPTIONS_VIEW_AUTO_SIZE_WINDOW_STATIC,
+ "50%", // LOCALIZATION_ID_OPTIONS_VIEW_AUTO_SIZE_WINDOW_50_PERCENT_COMBOBOXITEM,
+ "100%", // LOCALIZATION_ID_OPTIONS_VIEW_AUTO_SIZE_WINDOW_100_PERCENT_COMBOBOXITEM,
+ "200%", // LOCALIZATION_ID_OPTIONS_VIEW_AUTO_SIZE_WINDOW_200_PERCENT_COMBOBOXITEM,
+ "Pas Otomatis", // LOCALIZATION_ID_OPTIONS_VIEW_AUTO_SIZE_WINDOW_AUTO_FIT_COMBOBOXITEM,
+ "&Putar animasi setidaknya sekali dalam slideshow", // LOCALIZATION_ID_PLAY_ANIMATIONS_ONCE_STATIC,
+ "Prapemuatan gambar &selanjutnya", // LOCALIZATION_ID_PRELOAD_NEXT_IMAGE_STATIC,
+ "Simpan gambar &terakhir di cache", // LOCALIZATION_ID_CACHE_LAST_IMAGE_STATIC,
+ "Warna latar &jendela:", // LOCALIZATION_ID_WINDOWED_BACKGROUND_COLOR_STATIC,
+ "Warna latar &layar penuh:", // LOCALIZATION_ID_FULLSCREEN_BACKGROUND_COLOR_STATIC,
+ "Atur Ulang Ukuran && Posisi Jendela", // LOCALIZATION_ID_OPTIONS_VIEW_RESET_WINDOW_BUTTON,
+ "Aksi klik &kiri:", // LOCALIZATION_ID_LEFT_CLICK_ACTION_STATIC,
+ "Aksi klik &kanan:", // LOCALIZATION_ID_RIGHT_CLICK_ACTION_STATIC,
+ "Aksi roda &mouse:", // LOCALIZATION_ID_MOUSE_WHEEL_ACTION_STATIC,
+ "&Perintah:", // LOCALIZATION_ID_COMMANDS_STATIC,
+ "Pengaturan untuk perintah terpilih", // LOCALIZATION_ID_SETTINGS_FOR_SELECTED_COMMAND,
+ "&Tambah...", // LOCALIZATION_ID_ADD_KEY_BUTTON,
+ "&Ubah...", // LOCALIZATION_ID_EDIT_KEY_BUTTON,
+ "&Hapus", // LOCALIZATION_ID_REMOVE_KEY_BUTTON,
+ "Tambah Pintasan Keyboard", // LOCALIZATION_ID_ADD_KEYBOARD_SHORTCUT_CAPTION,
+ "Ubah Pintasan Keyboard", // LOCALIZATION_ID_EDIT_KEYBOARD_SHORTCUT_CAPTION,
+ "&Tombol pintasan:", // LOCALIZATION_ID_SHORTCUT_KEY,
+ "Tombol pintasan sedang digunakan oleh:", // LOCALIZATION_ID_SHORTCUT_KEY_CURRENTLY_USED_BY,
+ "&Hapus", // LOCALIZATION_ID_REMOVE,
+ "Atur Kecepatan Kustom", // LOCALIZATION_ID_SET_CUSTOM_RATE_CAPTION,
+ "Kecepatan &kustom:", // LOCALIZATION_ID_CUSTOM_RATE_STATIC,
+ "menit", // LOCALIZATION_ID_CUSTOM_RATE_MINUTES,
+ "detik", // LOCALIZATION_ID_CUSTOM_RATE_SECONDS,
+ "milidetik", // LOCALIZATION_ID_CUSTOM_RATE_MILLISECONDS,
+ "Tentang void Image Viewer", // LOCALIZATION_ID_ABOUT_CAPTION,
+ "Ubah Nama", // LOCALIZATION_ID_RENAME_CAPTION,
+ "Lompat Ke", // LOCALIZATION_ID_JUMP_TO_TITLE,
+ "Pencarian Everything", // LOCALIZATION_ID_SEARCH_EVERYTHING,
+ "Hak Cipta \xC2\xA9 %d voidtools", // LOCALIZATION_ID_ABOUT_COPYRIGHT_FORMAT,
+ "support@voidtools.com", // LOCALIZATION_ID_ABOUT_EMAIL,
+ "www.voidtools.com", // LOCALIZATION_ID_ABOUT_WEBSITE,
+ "Buka Gambar", // LOCALIZATION_ID_OPEN_IMAGE_CAPTION,
+ "Semua Berkas Gambar", // LOCALIZATION_ID_OPEN_ALL_IMAGE_FILES,
+ "Semua Berkas", // LOCALIZATION_ID_OPEN_ALL_FILES,
+ "Gulir", // LOCALIZATION_ID_OPTIONS_ACTION_SCROLL_COMBOBOXITEM,
+ "Putar/Jeda Slideshow", // LOCALIZATION_ID_OPTIONS_ACTION_PLAY_PAUSE_SLIDESHOW_COMBOBOXITEM,
+ "Putar/Jeda Animasi", // LOCALIZATION_ID_OPTIONS_ACTION_PLAY_PAUSE_ANIMATION_COMBOBOXITEM,
+ "Zoom Masuk", // LOCALIZATION_ID_OPTIONS_ACTION_ZOOM_IN_COMBOBOXITEM,
+ "Gambar Selanjutnya", // LOCALIZATION_ID_OPTIONS_ACTION_NEXT_IMAGE_COMBOBOXITEM,
+ "Gulir 1:1", // LOCALIZATION_ID_OPTIONS_ACTION_ONE_TO_ONE_SCROLL_COMBOBOXITEM,
+ "Gulir/Pindah Jendela", // LOCALIZATION_ID_OPTIONS_ACTION_SCROLL_MOVE_WINDOW_COMBOBOXITEM,
+ "Menu Konteks", // LOCALIZATION_ID_OPTIONS_ACTION_CONTEXT_MENU_COMBOBOXITEM,
+ "Zoom Keluar", // LOCALIZATION_ID_OPTIONS_ACTION_ZOOM_OUT_COMBOBOXITEM,
+ "Gambar Sebelumnya", // LOCALIZATION_ID_OPTIONS_ACTION_PREVIOUS_IMAGE_COMBOBOXITEM,
+ "Zoom", // LOCALIZATION_ID_OPTIONS_ACTION_ZOOM_COMBOBOXITEM,
+ "Selanjutnya/Sebelumnya", // LOCALIZATION_ID_OPTIONS_ACTION_NEXT_PREV_COMBOBOXITEM,
+ "Sebelumnya/Selanjutnya", // LOCALIZATION_ID_OPTIONS_ACTION_PREV_NEXT_COMBOBOXITEM,
+ "Format bilah &judul:", // LOCALIZATION_ID_OPTIONS_TITLE_BAR_FORMAT_STATIC,
+ "Path Lengkap", // LOCALIZATION_ID_OPTIONS_TITLE_BAR_FORMAT_FULL_PATH_COMBOBOXITEM,
+ "Hanya Nama Berkas", // LOCALIZATION_ID_OPTIONS_TITLE_BAR_FORMAT_FILENAME_ONLY_COMBOBOXITEM,
+ "Tidak Ada", // LOCALIZATION_ID_OPTIONS_TITLE_BAR_FORMAT_NONE_COMBOBOXITEM,
+ "Everything tidak tersedia", // LOCALIZATION_ID_EVERYTHING_NOT_AVAILABLE_MESSAGE,
+ "Tambah Pencarian Everything", // LOCALIZATION_ID_EVERYTHING_ADD_EVERYTHING_SEARCH_CAPTION,
+ "Muat Pencarian Everything", // LOCALIZATION_ID_EVERYTHING_LOAD_EVERYTHING_SEARCH_CAPTION,
+ "Acak", // LOCALIZATION_ID_RANDOMIZE,
+ "Salin Ke", // LOCALIZATION_ID_COPY_TO_CAPTION,
+ "Pindah Ke", // LOCALIZATION_ID_MOVE_TO_CAPTION,
+
+ // Deskripsi Asosiasi
+ "Gambar Bitmap",
+ "Gambar GIF Animasi",
+ "Berkas Ikon",
+ "Gambar JPEG",
+ "Gambar JPEG",
+ "Gambar PNG",
+ "Gambar TIFF",
+ "Gambar TIFF",
+ "Gambar WebP",
+};
diff --git a/src/localization_zh_cn.h b/src/localization_zh_cn.h
index 3d13569..1f5678c 100644
--- a/src/localization_zh_cn.h
+++ b/src/localization_zh_cn.h
@@ -26,6 +26,8 @@ static const utf8_t *_localization_string_array_zh_cn[LOCALIZATION_ID_COUNT] =
{
// Language
"ç®€ä½“ä¸æ–‡", // LOCALIZATION_ID_LANGUAGE
+ "è¯è¨€(&L):", // LOCALIZATION_ID_LANGUAGE_STATIC
+ "系统默认", // LOCALIZATION_ID_LANGUAGE_AUTO
// Application name
"void Image Viewer", // LOCALIZATION_ID_APP_NAME
@@ -233,6 +235,7 @@ static const utf8_t *_localization_string_array_zh_cn[LOCALIZATION_ID_COUNT] =
"ç¼“å˜æœ€åŽä¸€å¼ 图åƒ(&L)", // LOCALIZATION_ID_CACHE_LAST_IMAGE_STATIC,
"窗å£èƒŒæ™¯é¢œè‰²(&W):", // LOCALIZATION_ID_WINDOWED_BACKGROUND_COLOR_STATIC,
"å…¨å±èƒŒæ™¯é¢œè‰²(&F):", // LOCALIZATION_ID_FULLSCREEN_BACKGROUND_COLOR_STATIC,
+ "é‡ç½®çª—å£å¤§å°å’Œä½ç½®", // LOCALIZATION_ID_OPTIONS_VIEW_RESET_WINDOW_BUTTON,
"左键æ“作(&L):", // LOCALIZATION_ID_LEFT_CLICK_ACTION_STATIC,
"å³é”®æ“作(&R):", // LOCALIZATION_ID_RIGHT_CLICK_ACTION_STATIC,
"é¼ æ ‡æ»šè½®æ“作(&M):", // LOCALIZATION_ID_MOUSE_WHEEL_ACTION_STATIC,
diff --git a/src/version.h b/src/version.h
index ea4550e..81a054d 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1,6 +1,6 @@
#define VERSION_YEAR 2026
#define VERSION_MAJOR 1
#define VERSION_MINOR 0
-#define VERSION_REVISION 0
-#define VERSION_BUILD 15
+#define VERSION_REVISION 1
+#define VERSION_BUILD 0
#define VERSION_TYPE ""
diff --git a/src/viv.c b/src/viv.c
index deff452..26db4fc 100644
--- a/src/viv.c
+++ b/src/viv.c
@@ -257,7 +257,7 @@
#define _VIV_ASSOCIATION_TIFF 0x00000080
#define _VIV_ASSOCIATION_WEBP 0x00000100
-#define _VIV_ZOOM_MAX 16
+#define _VIV_ZOOM_MAX 64
#define BCM_SETSHIELD 0x0000160C
@@ -444,7 +444,7 @@ typedef struct _viv_webp_s
typedef struct _viv_name_mapping_s
{
UINT count;
- SHNAMEMAPPING *mappings;
+ SHNAMEMAPPING mappings[1];
}_viv_name_mapping_t;
static void _viv_update_title(void);
@@ -608,6 +608,7 @@ static int _viv_compare_id(const WIN32_FIND_DATA *a,const WIN32_FIND_DATA *b);
static int _viv_fd_compare_name(const WIN32_FIND_DATA *a,const WIN32_FIND_DATA *b);
static int _viv_fd_compare_path_and_name(const WIN32_FIND_DATA *a,const WIN32_FIND_DATA *b);
static void _viv_update_1to1_scroll(int x,int y);
+static HBITMAP _viv_create_bitmap(HDC hdc, int width, int height);
static HBITMAP _viv_orientate_hbitmap(HBITMAP hbitmap,int counterclockwise);
static void _viv_send_random_everything_search(void);
static void _viv_do_mousewheel_action(int action,int delta,int x,int y);
@@ -681,8 +682,6 @@ static int _viv_view_y = 0; // the current image offset in pixels
static double _viv_view_ix = 0.0; // the current image offset in percent, used when resizing the window
static double _viv_view_iy = 0.0; // the current image offset in percent, used when resizing the window
static int _viv_zoom_pos = 0; // the current zoom level
-//static float _viv_zoom_presets[_VIV_ZOOM_MAX] = {0.004815f,0.019215f,0.043060f,0.076120f,0.118079f,0.168530f,0.226989f,0.292893f,0.365607f,0.444430f,0.528603f,0.617316f,0.709715f,0.804909f,0.901983f,1.000000f}; // (1 - cos(((float)(x+1) * 1.570796f) / _VIV_ZOOM_MAX)) // this is missing cos((1 * 1.570796f) / _VIV_ZOOM_MAX), which is too small
-static float _viv_zoom_presets[_VIV_ZOOM_MAX] = {0.0000,0.0100,0.0225,0.0379,0.0569,0.0806,0.1098,0.1461,0.1909,0.2465,0.3154,0.4007,0.5063,0.6372,0.7993,1.0000}; // 0.01 - 0.2 curve
static ULONG_PTR os_GdiplusToken; // gdiplus handle
static int _viv_image_wide = 0; // current image width
@@ -988,9 +987,7 @@ _viv_default_key_t _viv_default_keys[] =
{VIV_ID_EDIT_COPY,CONFIG_KEYFLAG_CTRL | 'C'},
{VIV_ID_EDIT_COPY_FILENAME,CONFIG_KEYFLAG_CTRL | CONFIG_KEYFLAG_SHIFT | 'C'},
{VIV_ID_EDIT_PASTE,CONFIG_KEYFLAG_CTRL | 'V'},
- {VIV_ID_VIEW_PRESET_1,'1'},
- {VIV_ID_VIEW_PRESET_2,'2'},
- {VIV_ID_VIEW_PRESET_3,'3'},
+
{VIV_ID_VIEW_1TO1,CONFIG_KEYFLAG_CTRL | CONFIG_KEYFLAG_ALT | '0'},
{VIV_ID_VIEW_FULLSCREEN,CONFIG_KEYFLAG_ALT | VK_RETURN},
{VIV_ID_VIEW_SLIDESHOW,VK_F11},
@@ -5260,6 +5257,7 @@ static int _viv_init(int nCmdShow)
// load settings
config_load_settings();
+ localization_init();
// config_maximized will be overwritten when we show are normal window
// so save it now and apply it later.
@@ -6975,23 +6973,11 @@ static void _viv_get_render_size(int *prw,int *prh)
if (config_keep_aspect_ratio)
{
- if (rw > _viv_image_wide)
- {
- max_zoom_wide = rw * 16;
- }
- else
- {
- max_zoom_wide = _viv_image_wide * 16;
- }
+ max_zoom_wide = rw * 16;
+ if (max_zoom_wide < _viv_image_wide * 16) max_zoom_wide = _viv_image_wide * 16;
- if (rh > _viv_image_high)
- {
- max_zoom_high = rh * 16;
- }
- else
- {
- max_zoom_high = _viv_image_high * 16;
- }
+ max_zoom_high = rh * 16;
+ if (max_zoom_high < _viv_image_high * 16) max_zoom_high = _viv_image_high * 16;
}
else
{
@@ -7011,8 +6997,9 @@ static void _viv_get_render_size(int *prw,int *prh)
*/
if (_viv_zoom_pos)
{
- rw = rw + (int)((max_zoom_wide - rw) * _viv_zoom_presets[_viv_zoom_pos]);
- rh = rh + (int)((max_zoom_high - rh) * _viv_zoom_presets[_viv_zoom_pos]);
+ double zoom_factor = pow((double)max_zoom_wide / (double)rw, (double)_viv_zoom_pos / (double)(_VIV_ZOOM_MAX - 1));
+ rw = (int)((double)rw * zoom_factor);
+ rh = (int)((double)rh * zoom_factor);
}
*prw = rw;
@@ -7212,7 +7199,7 @@ static void _viv_delete(int permanently)
fo.hwnd = _viv_hwnd;
fo.wFunc = FO_DELETE;
fo.pFrom = filename_list;
- fo.fFlags = permanently ? 0 : FOF_ALLOWUNDO;
+ fo.fFlags = permanently ? FOF_WANTNUKEWARNING : FOF_ALLOWUNDO;
if (SHFileOperation(&fo) == 0)
{
@@ -7295,8 +7282,8 @@ static INT_PTR CALLBACK _viv_rename_proc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
fo.pTo = new_filename_list;
fo.fFlags = FOF_ALLOWUNDO | FOF_WANTMAPPINGHANDLE;
- // returns ERROR_CANCELLED if user cancelled.
- if (SHFileOperation(&fo) == 0)
+ int sh_ret = SHFileOperation(&fo);
+ if (sh_ret == 0)
{
if (fo.fAnyOperationsAborted)
{
@@ -7316,7 +7303,7 @@ static INT_PTR CALLBACK _viv_rename_proc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
mappings = (_viv_name_mapping_t *)fo.hNameMappings;
- if (mappings->count == 1)
+ if (mappings->count >= 1)
{
// use the resolved name incase there was a rename collision.
file_op_new_name = mappings->mappings[0].pszNewPath;
@@ -7340,6 +7327,11 @@ static INT_PTR CALLBACK _viv_rename_proc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM
SHFreeNameMappings(fo.hNameMappings);
}
}
+ else
+ {
+ // returned non-zero (user cancelled or clicked No)
+ dont_end_dialog = 1;
+ }
}
if (!dont_end_dialog)
@@ -7505,7 +7497,7 @@ static void _viv_set_clipboard_image(void)
{
HBITMAP mem1_hbitmap;
- mem1_hbitmap = CreateCompatibleBitmap(screen_hdc,_viv_image_wide,_viv_image_high);
+ mem1_hbitmap = _viv_create_bitmap(screen_hdc,_viv_image_wide,_viv_image_high);
if (mem1_hbitmap)
{
HGDIOBJ last_mem1_hbitmap;
@@ -7936,8 +7928,26 @@ static INT_PTR CALLBACK _viv_options_general_proc(HWND hwnd,UINT msg,WPARAM wPar
case WM_INITDIALOG:
{
int exti;
-
os_SetDlgItemText_localization_id(hwnd,IDC_APPDATA,LOCALIZATION_ID_STORE_SETTINGS_APPDATA);
+ os_SetDlgItemText_localization_id(hwnd,IDC_LANGUAGE_STATIC,LOCALIZATION_ID_LANGUAGE_STATIC);
+
+ {
+ HWND hLanguage = GetDlgItem(hwnd,IDC_LANGUAGE_COMBOBOX);
+ int index;
+
+ index = os_ComboBox_AddString_localization_id(hwnd,IDC_LANGUAGE_COMBOBOX,LOCALIZATION_ID_LANGUAGE_AUTO);
+ ComboBox_SetItemData(hLanguage,index,255);
+ if (config_language == 255) ComboBox_SetCurSel(hLanguage,index);
+
+ for(int i=0;iscreen_hdc,viv_webp->wide,viv_webp->high);
+ hbitmap = _viv_create_bitmap(viv_webp->screen_hdc,viv_webp->wide,viv_webp->high);
// Set RGB data to the bitmap
if (hbitmap)
@@ -10612,7 +10666,7 @@ static DWORD WINAPI _viv_load_image_thread_proc(void *param)
break;
}
- hbitmap = CreateCompatibleBitmap(screen_hdc,load_wide,load_high);
+ hbitmap = _viv_create_bitmap(screen_hdc,load_wide,load_high);
if (hbitmap)
{
UINT image_flags;
@@ -11974,7 +12028,7 @@ static void _viv_update_color_button_bitmap(HWND hwnd)
screen_hdc = GetDC(0);
mem_hdc = CreateCompatibleDC(screen_hdc);
- hbitmap = CreateCompatibleBitmap(screen_hdc,wide,high);
+ hbitmap = _viv_create_bitmap(screen_hdc,wide,high);
last_hbitmap = SelectObject(mem_hdc,hbitmap);
@@ -13668,6 +13722,22 @@ static void _viv_update_1to1_scroll(int x,int y)
// #define PHOTO_ORIENTATION_ROTATE270 6u
// #define PHOTO_ORIENTATION_TRANSVERSE 7u
// #define PHOTO_ORIENTATION_ROTATE90 8u
+static HBITMAP _viv_create_bitmap(HDC hdc, int width, int height)
+{
+ BITMAPINFO bmi;
+ void* bits;
+
+ ZeroMemory(&bmi, sizeof(BITMAPINFO));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = width;
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = 32;
+ bmi.bmiHeader.biCompression = BI_RGB;
+
+ return CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &bits, NULL, 0);
+}
+
static HBITMAP _viv_orientate_hbitmap(HBITMAP hbitmap,int orientation)
{
BITMAP bitmap;
@@ -13706,7 +13776,7 @@ static HBITMAP _viv_orientate_hbitmap(HBITMAP hbitmap,int orientation)
break;
}
- ret_hbitmap = CreateCompatibleBitmap(screen_hdc,ret_wide,ret_high);
+ ret_hbitmap = _viv_create_bitmap(screen_hdc,ret_wide,ret_high);
if (ret_hbitmap)
{
int ret;
@@ -14223,7 +14293,7 @@ static HBITMAP _viv_get_mipmap(HBITMAP hbitmap,int image_wide,int image_high,int
if (mem2_hdc)
{
(*pmip)->mipmap = NULL;
- (*pmip)->hbitmap = CreateCompatibleBitmap(screen_hdc,mip_wide,mip_high);
+ (*pmip)->hbitmap = _viv_create_bitmap(screen_hdc,mip_wide,mip_high);
last_hbitmap = SelectObject(mem_hdc,(*pmip)->hbitmap);
last2_hbitmap = SelectObject(mem2_hdc,best_hbitmap);
@@ -14883,7 +14953,7 @@ static void _viv_stretch_blt(HDC dst_hdc,int dst_x,int dst_y,int dst_wide,int ds
{
HBITMAP dst_hbitmap;
- dst_hbitmap = CreateCompatibleBitmap(dst_hdc,clip_wide,clip_high);
+ dst_hbitmap = _viv_create_bitmap(dst_hdc,clip_wide,clip_high);
if (dst_hbitmap)
{
HGDIOBJ last_dst_hbitmap;
@@ -15321,3 +15391,4 @@ static int _viv_safe_copy_data(const void *base,SIZE_T src_size,const void *src,
return 1;
}
+
diff --git a/src/viv.h b/src/viv.h
index 16daba6..37a1e94 100644
--- a/src/viv.h
+++ b/src/viv.h
@@ -57,9 +57,25 @@ typedef unsigned __int64 VIV_UINT64;
#include
#include
//#include
+#define IDC_STATIC -1
+#define IDC_ASSOCIATIONS_GROUPBOX IDC_STATIC
+#define IDC_ADD_KEY_BUTTON IDC_ADD_KEY
+#define IDC_EDIT_KEY_BUTTON IDC_EDIT_KEY
+#define IDC_REMOVE_KEY_BUTTON IDC_REMOVE_KEY
+#define IDC_LEFTCLICKACTION_COMBOBOX IDC_LEFTCLICKACTION
+#define IDC_RIGHTCLICKACTION_COMBOBOX IDC_RIGHTCLICKACTION
+#define IDC_MOUSEWHEELACTION_COMBOBOX IDC_MOUSEWHEELACTION
+#define IDC_SHRINK_BLIT_MODE_COMBOBOX IDC_COMBO1
+#define IDC_MAGNIFY_BLIT_MODE_COMBOBOX IDC_COMBO2
+#define IDC_TITLE_BAR_FORMAT_COMBOBOX IDC_TITLE_BAR_FORMAT
+#define IDC_AUTO_SIZE_WINDOW_COMBOBOX IDC_COMBO4
+#define IDC_WINDOWEDBACKGROUNDCOLOR_BUTTON IDC_WINDOWEDBACKGROUNDCOLOR
+#define IDC_FULLSCREENBACKGROUNDCOLOR_BUTTON IDC_FULLSCREENBACKGROUNDCOLOR
+#define IDC_CUSTOM_RATE_TYPE_COMBOBOX IDC_CUSTOM_RATE_TYPE_COMBO
+#define IDC_SEARCH_EVERYTHING_RANDOM_CHECKBOX IDC_SEARCH_EVERYTHING_RANDOM
#include "../res/resource.h"
//#include
-//#include
+#include
//#include
//#include
#include // OPENFILENAME
diff --git a/test_math.c b/test_math.c
new file mode 100644
index 0000000..441c4d4
--- /dev/null
+++ b/test_math.c
@@ -0,0 +1,6 @@
+#include
+#include
+int main() {
+ printf("%f\n", pow(2.0, 3.0));
+ return 0;
+}
diff --git a/vs2026/voidImageViewer.vcxproj b/vs2026/voidImageViewer.vcxproj
index a5f40a8..8d6323f 100644
--- a/vs2026/voidImageViewer.vcxproj
+++ b/vs2026/voidImageViewer.vcxproj
@@ -465,7 +465,7 @@
/MP %(AdditionalOptions)
Disabled
..\libwebp;%(AdditionalIncludeDirectories)
- BZ_NO_STDIO;VERSION_DEBUG;BZ_NO_STDIO;%(PreprocessorDefinitions)
+ WIN32;_DEBUG;_WINDOWS;BZ_NO_STDIO;VERSION_DEBUG;VERSION_X86;%(PreprocessorDefinitions)
false
Async
MultiThreadedDebug
@@ -606,7 +606,7 @@
false
true
..\libwebp;%(AdditionalIncludeDirectories)
- BZ_NO_STDIO;BZ_NO_STDIO;%(PreprocessorDefinitions)
+ WIN32;NDEBUG;_WINDOWS;BZ_NO_STDIO;VERSION_X86;%(PreprocessorDefinitions)
true
MultiThreaded
Fast