From 951e5ec5bd468d36d9fd8e514d6f32728c8fe072 Mon Sep 17 00:00:00 2001 From: Syahda Fahreza Date: Fri, 1 May 2026 18:33:01 +0700 Subject: [PATCH 1/5] Add Indonesian localization and UI language option Add Indonesian (id_ID) localization and a selectable UI language option. Key changes: - Add src/localization_id_id.h and register Indonesian in localization arrays; expose localization_get_language_name. - Add config_language (default = auto) to config.c/.h and persist/load it from settings. - Add language combobox and related UI strings/controls in resource.h and .rc; include a UTF-8 .rc copy (res/voidImageViewer_utf8.rc). - Bump application version to 1.0.1.0 (nsis/version.nsh and resource version info) and add scratch_version.ps1 to help update versions. - Adjust some default config values (store settings in %APPDATA% by default, change navigation sort to name ascending). - Minor UI layout adjustments and new control IDs for reset window, commands, and keyboard shortcut labels. - Add auxiliary files: comments.json, issues.json, test_math.c, and update project file (vs2026/voidImageViewer.vcxproj). These changes add language support and UI elements to let users choose their preferred language and ensure the new strings/resources are included and versioned. --- README.md | 6 +- comments.json | Bin 0 -> 16590 bytes issues.json | Bin 0 -> 255982 bytes nsis/version.nsh | 2 +- res/resource.h | 21 ++- res/voidImageViewer.rc | 123 +++++++------- res/voidImageViewer_utf8.rc | 294 ++++++++++++++++++++++++++++++++ scratch_version.ps1 | 4 + src/config.c | 9 +- src/config.h | 1 + src/localization.c | 30 ++++ src/localization.h | 5 + src/localization_en_us.h | 3 + src/localization_id_id.h | 300 +++++++++++++++++++++++++++++++++ src/localization_zh_cn.h | 3 + src/version.h | 4 +- src/viv.c | 147 +++++++++++----- src/viv.h | 18 +- test_math.c | 6 + vs2026/voidImageViewer.vcxproj | 4 +- 20 files changed, 870 insertions(+), 110 deletions(-) create mode 100644 comments.json create mode 100644 issues.json create mode 100644 res/voidImageViewer_utf8.rc create mode 100644 scratch_version.ps1 create mode 100644 src/localization_id_id.h create mode 100644 test_math.c diff --git a/README.md b/README.md index 1d27215..a98a933 100644 --- a/README.md +++ b/README.md @@ -26,21 +26,21 @@ void Image Viewer main window: void Image Viewer General Options: -![Void Image Viewer Options General](https://www.voidtools.com/voidImageViewer.Options.General10.png) +image


void Image Viewer View Options: -![Void Image Viewer Options View](https://www.voidtools.com/voidImageViewer.Options.View10.png) +image


void Image Viewer Controls Options: -![Void Image Viewer Image Controls](https://www.voidtools.com/voidImageViewer.Options.Controls10.png) +image


diff --git a/comments.json b/comments.json new file mode 100644 index 0000000000000000000000000000000000000000..a65ec5fd093a71efa3fda518cd022a93f7060400 GIT binary patch literal 16590 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
wRkkCHHpnp9E}>p2<+ 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 + +///////////////////////////////////////////////////////////////////////////// +#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 From 074282112c2c2b0ce5054c0df8e1f467b6956a8b Mon Sep 17 00:00:00 2001 From: Syahda Fahreza Date: Fri, 1 May 2026 18:39:32 +0700 Subject: [PATCH 2/5] Restore GitHub Actions workflow with NSIS support --- .github/workflows/build.yml | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..d0a4c20 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,40 @@ +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 + echo "C:\Program Files (x86)\NSIS" >> $GITHUB_PATH + + - name: Build Installer x64 + run: powershell -File nsis/build_installer.ps1 -Arch x64 -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 From f5edbf5601aef7cb054e8cab40ae4d179137a92b Mon Sep 17 00:00:00 2001 From: Syahda Fahreza Date: Fri, 1 May 2026 18:42:02 +0700 Subject: [PATCH 3/5] Fix NSIS path in GitHub Actions --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0a4c20..e83fc29 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: - name: Setup NSIS run: | choco install nsis -y - echo "C:\Program Files (x86)\NSIS" >> $GITHUB_PATH + "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 From d199e6b8c040ead80f048a7938bf987674eb8604 Mon Sep 17 00:00:00 2001 From: Syahda Fahreza Date: Fri, 1 May 2026 18:46:47 +0700 Subject: [PATCH 4/5] Add x86 installer build to GitHub Actions --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e83fc29..b818c75 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,6 +30,9 @@ jobs: - 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: From fad8e70d94671d776831a5ec85a24112817fde59 Mon Sep 17 00:00:00 2001 From: Syahda Fahreza <87214398+syahdafahreza@users.noreply.github.com> Date: Fri, 1 May 2026 19:18:59 +0700 Subject: [PATCH 5/5] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a98a933..bd10c25 100644 --- a/README.md +++ b/README.md @@ -26,21 +26,21 @@ void Image Viewer main window: void Image Viewer General Options: -image +image


void Image Viewer View Options: -image +image


void Image Viewer Controls Options: -image +image