├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── question.md └── workflows │ └── msbuild.yml ├── .gitignore ├── LICENSE ├── README.md ├── WhatsappTray.sln ├── WhatsappTray ├── AboutDialog.cpp ├── AboutDialog.h ├── AppData.cpp ├── AppData.h ├── DirectoryWatcher.cpp ├── DirectoryWatcher.h ├── Enum.h ├── Helper.cpp ├── Helper.h ├── Hook.cpp ├── Hook.vcxproj ├── Hook.vcxproj.filters ├── Logger.cpp ├── Logger.h ├── ReadRegister.asm ├── Registry.cpp ├── Registry.h ├── SharedDefines.h ├── TrayManager.cpp ├── TrayManager.h ├── Version.rc2 ├── WhatsappTray.cpp ├── WhatsappTray.h ├── WhatsappTray.ico ├── WhatsappTray.rc ├── WhatsappTray.vcxproj ├── WhatsappTray.vcxproj.filters ├── WinSockClient.cpp ├── WinSockClient.h ├── WinSockLogger.cpp ├── WinSockLogger.h ├── WinSockServer.cpp ├── WinSockServer.h ├── WindowsMessage.h ├── resource.h ├── stdafx.cpp └── stdafx.h ├── libs └── readerwriterqueue │ ├── atomicops.h │ └── readerwriterqueue.h ├── setupBuildfile.iss └── setup_creator_binaries ├── Default.isl ├── ISCC.exe ├── ISCmplr.dll ├── ISCrypt.dll ├── ISPP.dll ├── Languages ├── Armenian.isl ├── BrazilianPortuguese.isl ├── Bulgarian.isl ├── Catalan.isl ├── Corsican.isl ├── Czech.isl ├── Danish.isl ├── Dutch.isl ├── Finnish.isl ├── French.isl ├── German.isl ├── Greek.isl ├── Hebrew.isl ├── Hungarian.isl ├── Icelandic.isl ├── Italian.isl ├── Japanese.isl ├── Norwegian.isl ├── Polish.isl ├── Portuguese.isl ├── Russian.isl ├── ScottishGaelic.isl ├── SerbianCyrillic.isl ├── SerbianLatin.isl ├── Slovak.isl ├── Slovenian.isl ├── Spanish.isl ├── Turkish.isl └── Ukrainian.isl ├── Setup.e32 ├── SetupClassicIcon.ico ├── SetupLdr.e32 ├── WizClassicImage-IS.bmp ├── WizClassicImage.bmp ├── WizClassicSmallImage-IS.bmp ├── WizClassicSmallImage.bmp ├── isbunzip.dll ├── isbzip.dll ├── islzma.dll ├── isscint.dll ├── isunzlib.dll ├── iszlib.dll └── license.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help improve WhatsappTray 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. Windows 7 / 8 / 10 / 11] 28 | 29 | **Log file when the bug happend** 30 | The logfile can be found in \\log 31 | With the default installation-path this should be C:\Program Files (x86)\WhatsappTray\log 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask anything 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | -------------------------------------------------------------------------------- /.github/workflows/msbuild.yml: -------------------------------------------------------------------------------- 1 | name: MSBuild 2 | 3 | on: [push] 4 | 5 | env: 6 | # Path to the solution file relative to the root of the project. 7 | SOLUTION_FILE_PATH: . 8 | 9 | # Configuration type to build. 10 | # You can convert this to a build matrix if you need coverage of multiple configuration types. 11 | # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix 12 | BUILD_CONFIGURATION: Release 13 | 14 | APPLICATION_NAME_SUFFIX: " DEBUG " 15 | 16 | jobs: 17 | build: 18 | runs-on: windows-latest 19 | steps: 20 | - uses: actions/checkout@v2 21 | 22 | - name: Add MSBuild to PATH 23 | uses: microsoft/setup-msbuild@v1.0.2 24 | 25 | - name: Restore NuGet packages 26 | working-directory: ${{env.GITHUB_WORKSPACE}} 27 | run: nuget restore ${{env.SOLUTION_FILE_PATH}} 28 | 29 | - name: Build 30 | working-directory: ${{env.GITHUB_WORKSPACE}} 31 | # Add additional options to the MSBuild command line here (like platform or verbosity level). 32 | # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference 33 | run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}} 34 | 35 | - name: Set WA_TRAY_VERSION env-variable 36 | run: cat <(echo -n "WA_TRAY_VERSION=") <(sed -n "s/^.*#define MAJOR \([0-9]\).*$/\1/p" WhatsappTray/Version.rc2 | tr -d '\n') <(echo -n ".") <(sed -n "s/^.*#define MINOR \([0-9]\).*$/\1/p" WhatsappTray/Version.rc2 | tr -d '\n') <(echo -n ".") <(sed -n "s/^.*#define PATCH \([0-9]\).*$/\1/p" WhatsappTray/Version.rc2 | tr -d '\n') >> $GITHUB_ENV 37 | shell: bash 38 | 39 | - name: Set WA_TRAY_VERSION_IS_DEBUG env-variable 40 | run: cat <(echo -n "WA_TRAY_VERSION_IS_DEBUG=") <(sed -n "s/^.*#define IS_DEBUG \([0-9]\).*$/\1/p" WhatsappTray/Version.rc2 | tr -d '\n') >> $GITHUB_ENV 41 | shell: bash 42 | 43 | - name: Show WhatsappTray-version 44 | run: echo ${{env.WA_TRAY_VERSION}} 45 | shell: bash 46 | 47 | # NOTE: The space here is on purpose because after much trying i could not set the env-var to an empty string 48 | - name: Set application-name-suffix 49 | if: ${{ env.WA_TRAY_VERSION_IS_DEBUG == '0' }} 50 | run: echo "APPLICATION_NAME_SUFFIX= " >> $GITHUB_ENV 51 | shell: bash 52 | 53 | # === Archive === 54 | - name: Archive WhatsappTray binaries (WhatsappTray.exe and Hook.dll) 55 | uses: actions/upload-artifact@v2 56 | with: 57 | name: WhatsappTray ${{env.WA_TRAY_VERSION}}${{env.APPLICATION_NAME_SUFFIX}}binaries (WhatsappTray.exe and Hook.dll) 58 | path: | 59 | bin/Release/WhatsappTray.exe 60 | bin/Release/Hook.dll 61 | 62 | - name: Package WhatsappTray as installer 63 | run: setup_creator_binaries/ISCC.exe "setupBuildfile.iss" 64 | 65 | - name: Archive WhatsappTray Installer 66 | uses: actions/upload-artifact@v2 67 | with: 68 | name: WhatsappTray ${{env.WA_TRAY_VERSION}}${{env.APPLICATION_NAME_SUFFIX}}installer 69 | path: Output/*.exe 70 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore temporary files and build results 2 | 3 | .vs/ 4 | [Bb]in/ 5 | intermediate/ 6 | Output/ 7 | *.vcxproj.user -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WhatsappTray 2 | Extension for the Whatsapp Desktop Client, that enables minimize-to-tray and close-to-tray functionality. 3 | 4 | ## Requirements: 5 | - **WhatsApp Desktop Client (64 bit)**: 6 | - Download from the [Official WhatsApp Page](https://www.whatsapp.com/download/) 7 | - Windows 8 or higher 8 | 9 | ## Features: 10 | - Minimize/Close button sends WhatsApp window to tray 11 | - Toggle WhatsApp window by clicking on the tray icon 12 | - Show unread messages in tray-icon 13 | - Esc key sends WhatsApp window to tray (optional) 14 | 15 | ## Configuration: 16 | WhatsappTray can be configured through: 17 | - The **right-click-menue** in the tray. (Changes the values in *appData.ini*) 18 | - The **appData.ini** which is automatically created in the installation-folder after the first start of WhatsappTray 19 | 20 | ### Advanced Configuration 21 | #### WHATSAPP_STARTPATH 22 | By default WhatsappTray uses the shortcut that was created when WhatsApp was installed to start WhatsApp. 23 | If you want to set a different path to the WhatsApp binary(exe), you can do so by using the 'WHATSAPP_STARTPATH' config in the appData.ini 24 | - *Absolute:* "WHATSAPP_STARTPATH=C:\Users\Dakoon\AppData\Local\WhatsApp\WhatsApp.exe" 25 | - *Relative to the folder in which WhatsappTray.exe lies:* "WHATSAPP_STARTPATH=.\..\WhatsApp.exe" 26 | - Support for variables *%UserProfile%* and *%AppData%* 27 | 28 | #### Other 29 | - Close to tray feature can also be activated by passing "--closeToTray" to WhatsappTray 30 | 31 | ## Silent install 32 | Start a command line in the same folder where the .exe is located and start the .exe file with the parameters /Silent to install WhatsApp Tray without user input. 33 | 34 | ## Notice: 35 | **DONT** start the application with administrative rights unless your Whatsapp is also running with administrative rights. 36 | Otherwise it will **not work** because of communication problems between the two applications. 37 | 38 | ## Thanks to: 39 | Nikolay Redko and J.D. Purcell for creating the RBTray software (http://rbtray.sourceforge.net/) 40 | -------------------------------------------------------------------------------- /WhatsappTray.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30503.244 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Hook", "WhatsappTray\Hook.vcxproj", "{9CD8044A-759A-4F65-B9FE-6DD8DD188428}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WhatsappTray", "WhatsappTray\WhatsappTray.vcxproj", "{CDDAA887-EEE9-47FA-B4B5-929A92D71248}" 9 | ProjectSection(ProjectDependencies) = postProject 10 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428} = {9CD8044A-759A-4F65-B9FE-6DD8DD188428} 11 | EndProjectSection 12 | EndProject 13 | Global 14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 15 | Debug|x64 = Debug|x64 16 | Release|x64 = Release|x64 17 | EndGlobalSection 18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 19 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428}.Debug|x64.ActiveCfg = Debug|x64 20 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428}.Debug|x64.Build.0 = Debug|x64 21 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428}.Debug|x64.Deploy.0 = Debug|x64 22 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428}.Release|x64.ActiveCfg = Release|x64 23 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428}.Release|x64.Build.0 = Release|x64 24 | {CDDAA887-EEE9-47FA-B4B5-929A92D71248}.Debug|x64.ActiveCfg = Debug|x64 25 | {CDDAA887-EEE9-47FA-B4B5-929A92D71248}.Debug|x64.Build.0 = Debug|x64 26 | {CDDAA887-EEE9-47FA-B4B5-929A92D71248}.Release|x64.ActiveCfg = Release|x64 27 | {CDDAA887-EEE9-47FA-B4B5-929A92D71248}.Release|x64.Build.0 = Release|x64 28 | EndGlobalSection 29 | GlobalSection(SolutionProperties) = preSolution 30 | HideSolutionNode = FALSE 31 | EndGlobalSection 32 | GlobalSection(ExtensibilityGlobals) = postSolution 33 | SolutionGuid = {44DCDD4F-960E-4BD3-981C-F1261B6575B5} 34 | EndGlobalSection 35 | EndGlobal 36 | -------------------------------------------------------------------------------- /WhatsappTray/AboutDialog.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | 6 | #include "AboutDialog.h" 7 | 8 | #include "resource.h" 9 | #include "Helper.h" 10 | #include "Logger.h" 11 | 12 | #include 13 | #include 14 | 15 | #undef MODULE_NAME 16 | #define MODULE_NAME "AboutDialog::" 17 | 18 | void AboutDialog::Create(_In_opt_ HINSTANCE hInstance, HWND _hwndWhatsappTray) 19 | { 20 | DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_ABOUT), _hwndWhatsappTray, (DLGPROC)AboutDialog::DlgProc); 21 | } 22 | 23 | INT_PTR CALLBACK AboutDialog::DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 24 | { 25 | switch (msg) { 26 | case WM_INITDIALOG: 27 | { 28 | std::string labelString = std::string("WhatsappTray ") + Helper::GetProductAndVersion(); 29 | auto versionLabel = GetDlgItem(hWnd, IDC_VERSION_TEXT); 30 | SetWindowTextA(versionLabel, labelString.c_str()); 31 | break; 32 | } 33 | case WM_CLOSE: 34 | PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0); 35 | break; 36 | case WM_COMMAND: 37 | switch (LOWORD(wParam)) { 38 | case IDOK: 39 | EndDialog(hWnd, TRUE); 40 | break; 41 | case IDCANCEL: 42 | EndDialog(hWnd, FALSE); 43 | break; 44 | } 45 | break; 46 | default: 47 | return FALSE; 48 | } 49 | return TRUE; 50 | } 51 | -------------------------------------------------------------------------------- /WhatsappTray/AboutDialog.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #include 7 | 8 | class AboutDialog 9 | { 10 | public: 11 | AboutDialog() { } 12 | ~AboutDialog() { } 13 | static void Create(_In_opt_ HINSTANCE hInstance, HWND _hwndWhatsappTray); 14 | static INT_PTR DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 15 | 16 | private: 17 | 18 | }; 19 | 20 | -------------------------------------------------------------------------------- /WhatsappTray/AppData.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2018 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | 6 | #include "AppData.h" 7 | #include "Logger.h" 8 | #include "Helper.h" 9 | 10 | //#include 11 | #include 12 | #include 13 | 14 | #undef MODULE_NAME 15 | #define MODULE_NAME "AppData::" 16 | 17 | /** 18 | * Initialize the data-storage for the application. 19 | */ 20 | DataEntryS AppData::CloseToTray(Data::CLOSE_TO_TRAY, false, &AppData::SetData); 21 | DataEntryS AppData::LaunchOnWindowsStartup(Data::LAUNCH_ON_WINDOWS_STARTUP, false, &AppData::SetData); 22 | DataEntryS AppData::StartMinimized(Data::START_MINIMIZED, false, &AppData::SetData); 23 | DataEntryS AppData::ShowUnreadMessages(Data::SHOW_UNREAD_MESSAGES, false, &AppData::SetData); 24 | DataEntryS AppData::CloseToTrayWithEscape(Data::CLOSE_TO_TRAY_WITH_ESCAPE, false, &AppData::SetData); 25 | DataEntryS AppData::WhatsappStartpath(Data::WHATSAPP_STARTPATH, std::string("%userStartmenuePrograms%\\WhatsApp\\WhatsApp.lnk"), &AppData::SetData); 26 | 27 | /// Initialize the dummy-value initDone with a lambda to get a static-constructor like behavior. NOTE: The disadvantage is though that we can not control the order. For example if we want to make sure that the logger inits first. 28 | bool AppData::initDone([]() 29 | { 30 | // Currently the DataEntries hold the default value. 31 | // Now we look vor values in the config-file and write those if they exist. 32 | CloseToTray.Get().SetAsString(GetDataOrSetDefault(CloseToTray)); 33 | LaunchOnWindowsStartup.Get().SetAsString(GetDataOrSetDefault(LaunchOnWindowsStartup)); 34 | StartMinimized.Get().SetAsString(GetDataOrSetDefault(StartMinimized)); 35 | ShowUnreadMessages.Get().SetAsString(GetDataOrSetDefault(ShowUnreadMessages)); 36 | CloseToTrayWithEscape.Get().SetAsString(GetDataOrSetDefault(CloseToTrayWithEscape)); 37 | WhatsappStartpath.Get().SetAsString(GetDataOrSetDefault(WhatsappStartpath)); 38 | 39 | return true; 40 | }()); 41 | 42 | /** 43 | * @brief Set the data in the persistant storage. 44 | * Write data to the AppData-file. 45 | */ 46 | bool AppData::SetData(DataEntry& value) 47 | { 48 | std::string appDataFilePath = GetAppDataFilePath(); 49 | if (WritePrivateProfileStringA("config", value.Info.toString(), value.Value->ToString().c_str(), appDataFilePath.c_str()) == NULL) { 50 | // We get here also when the folder does not exist. 51 | std::stringstream message; 52 | message << MODULE_NAME "SetData() - Saving app-data failed because the data could not be written in the AppData-file '" << appDataFilePath.c_str() << "'."; 53 | Logger::Error(message.str().c_str()); 54 | MessageBox(NULL, message.str().c_str(), "WhatsappTray", MB_OK | MB_ICONINFORMATION); 55 | return false; 56 | } 57 | return true; 58 | } 59 | 60 | /** 61 | * @brief Returns the default value if no value is found. 62 | */ 63 | std::string AppData::GetDataOrSetDefault(DataEntry& value) 64 | { 65 | std::string appDataFilePath = GetAppDataFilePath(); 66 | 67 | char valueBuffer[200] = { 0 }; 68 | DWORD copiedCharacters = GetPrivateProfileStringA("config", value.Info.toString(), value.DefaultValue->ToString().c_str(), valueBuffer, sizeof(valueBuffer), appDataFilePath.c_str()); 69 | // If the default value is "" i dont want to trigger an error if the value cannot be read. So i added "value.DefaultValue->ToString().length() > 0" 70 | if (copiedCharacters == 0 && value.DefaultValue->ToString().length() > 0) { 71 | // If we end up here that means the config was found but was empty. 72 | // If the config would have not existed the default value would have been used. 73 | std::stringstream message; 74 | message << MODULE_NAME "GetDataOrSetDefault() - Could not find value '" << value.Info.toString() << "' in AppData-file '" << appDataFilePath.c_str() << "'.\n Setting the value to default='" << value.DefaultValue->ToString().c_str() << "'."; 75 | Logger::Error(message.str().c_str()); 76 | MessageBox(NULL, message.str().c_str(), "WhatsappTray", MB_OK | MB_ICONINFORMATION); 77 | return value.DefaultValue->ToString(); 78 | } 79 | 80 | return valueBuffer; 81 | } 82 | 83 | /** 84 | * @brief Get path to the data-file. 85 | */ 86 | std::string AppData::GetAppDataFilePath() 87 | { 88 | std::string appDirectory = Helper::GetApplicationDirectory(); 89 | 90 | std::string appDataFilePath(appDirectory); 91 | appDataFilePath.append("appData.ini"); 92 | 93 | return appDataFilePath; 94 | } 95 | 96 | /** 97 | * @brief Gets the path to the shortcut(*.lnk) or *.exe file of WhatsApp 98 | */ 99 | std::string AppData::WhatsappStartpathGet() 100 | { 101 | auto path = AppData::WhatsappStartpath.Get().ToString(); 102 | 103 | Helper::Replace(path, "%userStartmenuePrograms%", Helper::GetStartMenuProgramsDirectory()); 104 | Helper::Replace(path, "%UserProfile%", Helper::GetCurrentUserDirectory()); 105 | Helper::Replace(path, "%userprofile%", Helper::GetCurrentUserDirectory()); 106 | Helper::Replace(path, "%AppData%", Helper::GetWindowsAppDataRoamingDirectory()); 107 | Helper::Replace(path, "%appdata%", Helper::GetWindowsAppDataRoamingDirectory()); 108 | 109 | return path; 110 | } 111 | -------------------------------------------------------------------------------- /WhatsappTray/AppData.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2019 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | #include "Enum.h" 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | BETTER_ENUM(Data, uint8_t, 13 | CLOSE_TO_TRAY, 14 | LAUNCH_ON_WINDOWS_STARTUP, 15 | START_MINIMIZED, 16 | SHOW_UNREAD_MESSAGES, 17 | CLOSE_TO_TRAY_WITH_ESCAPE, 18 | WHATSAPP_STARTPATH, 19 | WHATSAPP_ROAMING_DIRECTORY 20 | ) 21 | 22 | class Serializeable 23 | { 24 | public: 25 | Serializeable() 26 | { } 27 | virtual std::string ToString() = 0; 28 | std::function valueChanged; 29 | }; 30 | 31 | class SBool : public Serializeable 32 | { 33 | bool Value; 34 | public: 35 | SBool() : Value(false) { } 36 | SBool(bool value) : Value(value) { } 37 | void operator=(const SBool& newValue) 38 | { 39 | Value = newValue; 40 | valueChanged(); 41 | } 42 | operator bool() const { return Value; } 43 | std::string ToString() { 44 | return this->Value ? "1" : "0"; 45 | } 46 | void SetAsString(std::string valueAsString) 47 | { 48 | Value = valueAsString.compare("1") == 0; 49 | valueChanged(); 50 | } 51 | }; 52 | 53 | class SString : public Serializeable 54 | { 55 | std::string Value; 56 | public: 57 | SString() : Value("") { } 58 | SString(std::string value) : Value(value) { } 59 | void operator=(const SString& newValue) 60 | { 61 | Value = newValue; 62 | valueChanged(); 63 | } 64 | operator std::string() const { return Value; } 65 | std::string ToString() { 66 | return this->Value; 67 | } 68 | void SetAsString(std::string valueAsString) 69 | { 70 | Value = valueAsString; 71 | valueChanged(); 72 | } 73 | }; 74 | 75 | class DataEntry 76 | { 77 | public: 78 | DataEntry(const Data info) 79 | : Info(info) 80 | { } 81 | const Data Info; 82 | Serializeable* Value{}; 83 | Serializeable* DefaultValue{}; 84 | }; 85 | 86 | template 87 | class DataEntryS : public DataEntry 88 | { 89 | public: 90 | DataEntryS(const Data info, T defaultValue, const std::function& valueChangedHandler) : DataEntry(info) 91 | { 92 | //this->Value = new T(defaultValue); 93 | this->Value = new T(); 94 | *(this->Value) = defaultValue; 95 | this->Value->valueChanged = std::bind(&DataEntryS::OnValueChanged, this); 96 | this->valueChangedHandler = valueChangedHandler; 97 | this->DefaultValue = new T(defaultValue); 98 | } 99 | ~DataEntryS() 100 | { 101 | delete this->Value; 102 | delete this->DefaultValue; 103 | } 104 | T& Get() 105 | { 106 | return *(reinterpret_cast(this->Value)); 107 | } 108 | void Set(const T& value) 109 | { 110 | *(reinterpret_cast(this->Value)) = value; 111 | } 112 | std::function valueChangedHandler; 113 | void OnValueChanged() 114 | { 115 | if (valueChangedHandler) { 116 | valueChangedHandler(*this); 117 | } 118 | } 119 | }; 120 | 121 | class AppData 122 | { 123 | public: 124 | static bool SetData(DataEntry& value); 125 | static std::string GetDataOrSetDefault(DataEntry& value); 126 | 127 | // If true, the close-button of WhatsApp sends it to tray instead of closing. 128 | static DataEntryS CloseToTray; 129 | static DataEntryS LaunchOnWindowsStartup; 130 | static DataEntryS StartMinimized; 131 | static DataEntryS ShowUnreadMessages; 132 | static DataEntryS CloseToTrayWithEscape; 133 | 134 | static std::string WhatsappStartpathGet(); 135 | private: 136 | AppData() {} 137 | 138 | // NOTE: UTF8-string. 139 | static DataEntryS WhatsappStartpath; 140 | 141 | static std::string GetAppDataFilePath(); 142 | 143 | /// Dummy-value used for initialization. Like a static constructor. 144 | static bool initDone; 145 | }; 146 | -------------------------------------------------------------------------------- /WhatsappTray/DirectoryWatcher.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * WhatsappTray 4 | * Copyright (C) 1998-2018 Sebastian Amann 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 2 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program; if not, write to the Free Software 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 | * 20 | */ 21 | 22 | #include "stdafx.h" 23 | 24 | #include "DirectoryWatcher.h" 25 | #include "Logger.h" 26 | #include "Helper.h" 27 | #include "ReadDirectoryChanges/ReadDirectoryChanges.h" 28 | 29 | /* 30 | * NOTE: It is better to use wstring for paths because of unicode-charcters that can happen in other languages 31 | */ 32 | DirectoryWatcher::DirectoryWatcher(std::wstring directory, const std::function& directoryChangedHandler) 33 | : watchedDirectory(directory) 34 | , directoryChangedEvent(directoryChangedHandler) 35 | , watcherThread(&DirectoryWatcher::WatchDirectoryWorker, this, directory) 36 | , terminate(false) 37 | , WaitHandle() 38 | { 39 | } 40 | 41 | DirectoryWatcher::~DirectoryWatcher() 42 | { 43 | // We need to wait for the thread to finish to not trigger an exception. 44 | StopThread(); 45 | } 46 | 47 | void DirectoryWatcher::WatchDirectoryWorker(std::wstring directory) 48 | { 49 | const DWORD dwNotificationFlags = 50 | FILE_NOTIFY_CHANGE_LAST_WRITE 51 | | FILE_NOTIFY_CHANGE_CREATION 52 | | FILE_NOTIFY_CHANGE_FILE_NAME; 53 | 54 | CReadDirectoryChanges changes; 55 | changes.AddDirectory(directory.c_str(), false, dwNotificationFlags); 56 | 57 | WaitHandle = changes.GetWaitHandle(); 58 | 59 | while (true) { 60 | DWORD rc = ::WaitForSingleObjectEx(WaitHandle, INFINITE, true); 61 | if (terminate) { 62 | return; 63 | } 64 | switch (rc) { 65 | case WAIT_OBJECT_0 + 0: 66 | { 67 | // We've received a notification in the queue. 68 | if (changes.CheckOverflow()) { 69 | Logger::Error("Queue overflowed."); 70 | } else { 71 | DWORD dwAction; 72 | CStringA strFilename; 73 | changes.Pop(dwAction, strFilename); 74 | //Logger::Debug("%s %s", CReadDirectoryChanges::ActionToString(dwAction).c_str(), strFilename); 75 | 76 | directoryChangedEvent(dwAction, Helper::Utf8ToWide(std::string(strFilename))); 77 | } 78 | } 79 | break; 80 | case WAIT_IO_COMPLETION: 81 | // Nothing to do. 82 | break; 83 | } 84 | } 85 | } 86 | 87 | /** 88 | * Stops the thread and waits till it is finished. 89 | */ 90 | void DirectoryWatcher::StopThread() 91 | { 92 | terminate = true; 93 | // Increase count by one so the thread continues and can end. 94 | ReleaseSemaphore(WaitHandle, 1, NULL); 95 | watcherThread.join(); 96 | } -------------------------------------------------------------------------------- /WhatsappTray/DirectoryWatcher.h: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * WhatsappTray 4 | * Copyright (C) 1998-2018 Sebastian Amann 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by 8 | * the Free Software Foundation; either version 2 of the License, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU General Public License for more details. 15 | * 16 | * You should have received a copy of the GNU General Public License 17 | * along with this program; if not, write to the Free Software 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 | * 20 | */ 21 | 22 | #pragma once 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | 29 | class DirectoryWatcher 30 | { 31 | public: 32 | DirectoryWatcher(std::wstring directory, const std::function& directoryChangedHandler); 33 | ~DirectoryWatcher(); 34 | private: 35 | std::wstring watchedDirectory; 36 | const std::function directoryChangedEvent; 37 | std::thread watcherThread; 38 | volatile bool terminate; 39 | HANDLE WaitHandle; 40 | 41 | void WatchDirectoryWorker(std::wstring directory); 42 | void StopThread(); 43 | }; 44 | 45 | -------------------------------------------------------------------------------- /WhatsappTray/Helper.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | #include "Helper.h" 6 | 7 | #include "Logger.h" 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | /* For .lnk resolver */ 15 | #include "shobjidl.h" 16 | #include "shlguid.h" 17 | #include "strsafe.h" 18 | 19 | #undef MODULE_NAME 20 | #define MODULE_NAME "Helper::" 21 | 22 | /* 23 | * @brief Get the Path to the exe-file of the application. 24 | */ 25 | std::string Helper::GetApplicationFilePath() 26 | { 27 | char szPathToExe[MAX_PATH]; 28 | GetModuleFileNameA(NULL, szPathToExe, MAX_PATH); 29 | 30 | return szPathToExe; 31 | } 32 | 33 | /* 34 | * @brief Get the Path to the directory where the exe-file of the application is. 35 | */ 36 | std::string Helper::GetApplicationDirectory() 37 | { 38 | char szPathToExe[MAX_PATH]; 39 | GetModuleFileNameA(NULL, szPathToExe, MAX_PATH); 40 | 41 | std::string applicationFilePath = GetApplicationFilePath(); 42 | std::size_t found = applicationFilePath.find_last_of('\\'); 43 | if (found == std::string::npos) { 44 | OutputDebugString(TEXT("ERROR: GetApplicationDirectory() - Could not find \\ in the application-path.\n")); 45 | return ""; 46 | } 47 | 48 | return applicationFilePath.substr(0, found) + "\\"; 49 | } 50 | 51 | std::wstring Helper::Utf8ToWide(const std::string& inputString) 52 | { 53 | int size_needed = MultiByteToWideChar(CP_UTF8, 0, inputString.c_str(), (int)inputString.size(), NULL, 0); 54 | std::wstring wstrTo(size_needed, 0); 55 | MultiByteToWideChar(CP_UTF8, 0, inputString.c_str(), (int)inputString.size(), &wstrTo[0], size_needed); 56 | return wstrTo; 57 | } 58 | 59 | /** 60 | * Convert a std::wstring to a std::string. 61 | * 62 | * NOTE: Non ascii-characters will look broken when viewed in the debugger, to see the UTF-8 representation use the watch-window and add ',s8' 63 | */ 64 | std::string Helper::WideToUtf8(const std::wstring& inputString) 65 | { 66 | int size_needed = WideCharToMultiByte(CP_UTF8, 0, inputString.c_str(), (int)inputString.size(), NULL, 0, NULL, NULL); 67 | std::string strTo(size_needed, 0); 68 | WideCharToMultiByte(CP_UTF8, 0, inputString.c_str(), (int)inputString.size(), &strTo[0], size_needed, NULL, NULL); 69 | return strTo; 70 | } 71 | 72 | bool Helper::Replace(std::string& str, const std::string& oldValue, const std::string& newValue) { 73 | size_t start_pos = str.find(oldValue); 74 | if (start_pos == std::string::npos) { 75 | return false; 76 | } 77 | 78 | str.replace(start_pos, oldValue.length(), newValue); 79 | 80 | return true; 81 | } 82 | 83 | HICON Helper::GetWindowIcon(HWND hwnd) 84 | { 85 | HICON icon; 86 | if (icon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0)) return icon; 87 | if (icon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0)) return icon; 88 | if (icon = (HICON)GetClassLongPtr(hwnd, GCLP_HICONSM)) return icon; 89 | if (icon = (HICON)GetClassLongPtr(hwnd, GCLP_HICON)) return icon; 90 | return LoadIcon(NULL, IDI_WINLOGO); 91 | } 92 | 93 | // From: https://stackoverflow.com/questions/7028304/error-lnk2019-when-using-getfileversioninfosize 94 | std::string Helper::GetProductAndVersion() 95 | { 96 | // get the filename of the executable containing the version resource 97 | TCHAR szFilename[MAX_PATH + 1] = { 0 }; 98 | if (GetModuleFileName(NULL, szFilename, MAX_PATH) == 0) { 99 | Logger::Error("GetModuleFileName failed with error %d", GetLastError()); 100 | return ""; 101 | } 102 | 103 | // allocate a block of memory for the version info 104 | DWORD dummy; 105 | DWORD dwSize = GetFileVersionInfoSize(szFilename, &dummy); 106 | if (dwSize == 0) { 107 | Logger::Error("GetFileVersionInfoSize failed with error %d", GetLastError()); 108 | return ""; 109 | } 110 | std::vector data(dwSize); 111 | 112 | // load the version info 113 | if (!GetFileVersionInfo(szFilename, NULL, dwSize, &data[0])) { 114 | Logger::Error("GetFileVersionInfo failed with error %d", GetLastError()); 115 | return ""; 116 | } 117 | 118 | // get the version strings 119 | LPVOID pvProductVersion = NULL; 120 | unsigned int iProductVersionLen = 0; 121 | 122 | UINT uiVerLen = 0; 123 | VS_FIXEDFILEINFO* pFixedInfo = 0; // pointer to fixed file info structure 124 | // get the fixed file info (language-independent) 125 | if (VerQueryValue(&data[0], TEXT("\\"), (void**)&pFixedInfo, (UINT *)&uiVerLen) == 0) { 126 | Logger::Error("Can't obtain ProductVersion from resources"); 127 | return ""; 128 | } 129 | 130 | std::stringstream stringStream; 131 | stringStream << HIWORD(pFixedInfo->dwProductVersionMS) << "." << LOWORD(pFixedInfo->dwProductVersionMS) << "." << HIWORD(pFixedInfo->dwProductVersionLS) << "." << LOWORD(pFixedInfo->dwProductVersionLS); 132 | 133 | return stringStream.str(); 134 | } 135 | 136 | std::string Helper::GetStartMenuProgramsDirectory() 137 | { 138 | wchar_t* startMenuProgramsBuffer; 139 | if (SHGetKnownFolderPath(FOLDERID_Programs, 0, NULL, &startMenuProgramsBuffer) != S_OK) { 140 | MessageBoxA(NULL, "'Start Menu\\Programs' folder not found", "WhatsappTray", MB_OK); 141 | return NULL; 142 | } 143 | std::string startMenuPrograms = Helper::WideToUtf8(startMenuProgramsBuffer); 144 | CoTaskMemFree(startMenuProgramsBuffer); 145 | return startMenuPrograms; 146 | } 147 | 148 | /** 149 | * @brief Gets the path to C:\Users\\AppData\Roaming 150 | */ 151 | std::string Helper::GetWindowsAppDataRoamingDirectory() 152 | { 153 | PWSTR appDataRoamingDirectoryWide = NULL; 154 | if (SHGetKnownFolderPath(FOLDERID_RoamingAppData, KF_FLAG_DEFAULT, NULL, &appDataRoamingDirectoryWide) != S_OK) { 155 | Logger::Fatal(MODULE_NAME "Init() - Could not get the AppDataRoaming-directory!"); 156 | MessageBoxA(NULL, MODULE_NAME "Init() - Fatal: Could not get the AppDataRoaming-directory!", "WhatsappTray", MB_OK | MB_ICONINFORMATION); 157 | return ""; 158 | } 159 | 160 | std::string appDataRoamingDirectory = Helper::WideToUtf8(appDataRoamingDirectoryWide); 161 | CoTaskMemFree(appDataRoamingDirectoryWide); 162 | return appDataRoamingDirectory; 163 | } 164 | 165 | std::string Helper::GetCurrentUserDirectory() 166 | { 167 | PWSTR currentUserDirectoryWide = NULL; 168 | if (SHGetKnownFolderPath(FOLDERID_Profile, KF_FLAG_DEFAULT, NULL, ¤tUserDirectoryWide) != S_OK) { 169 | Logger::Fatal(MODULE_NAME "Init() - Could not get the CurrentUser-directory!"); 170 | MessageBoxA(NULL, MODULE_NAME "Init() - Fatal: Could not get the CurrentUser-directory!", "WhatsappTray", MB_OK | MB_ICONINFORMATION); 171 | return ""; 172 | } 173 | 174 | std::string currentUserDirectory = Helper::WideToUtf8(currentUserDirectoryWide); 175 | CoTaskMemFree(currentUserDirectoryWide); 176 | return currentUserDirectory; 177 | } 178 | 179 | std::string Helper::GetFilenameFromPath(std::string path) 180 | { 181 | std::string filename(MAX_PATH, 0); 182 | std::string extension(MAX_PATH, 0); 183 | _splitpath_s(path.c_str(), NULL, NULL, NULL, NULL, &filename[0], filename.length(), &extension[0], extension.length()); 184 | 185 | return filename; 186 | } 187 | 188 | std::wstring Helper::GetFilenameFromPath(std::wstring path) 189 | { 190 | std::wstring filename(MAX_PATH, 0); 191 | std::wstring extension(MAX_PATH, 0); 192 | _wsplitpath_s(path.c_str(), NULL, NULL, NULL, NULL, &filename[0], filename.length(), &extension[0], extension.length()); 193 | 194 | return filename; 195 | } 196 | 197 | /** 198 | * @brief Uses the Shell's IShellLink and IPersistFile interfaces to retrieve the path and description from an existing shortcut. 199 | * 200 | * Returns the result of calling the member functions of the interfaces. 201 | * WARNING: It is assumed that CoInitialize() 202 | * 203 | * @param hwnd A handle to the parent window. The Shell uses this window to 204 | * display a dialog box if it needs to prompt the user for more 205 | * information while resolving the link. 206 | * @param lpszLinkFile Address of a buffer that contains the path of the link, 207 | * including the file name. 208 | * 209 | * @note From: https://docs.microsoft.com/en-ca/windows/win32/shell/links?redirectedfrom=MSDN (ResolveIt) 210 | */ 211 | std::string Helper::ResolveLnk(HWND hwnd, LPCSTR lpszLinkFile) 212 | { 213 | HRESULT hres; 214 | IShellLink* psl; 215 | TCHAR szGotPath[MAX_PATH]; 216 | //TCHAR szDescription[MAX_PATH]; 217 | WIN32_FIND_DATA wfd; 218 | std::string lnkPath = ""; 219 | 220 | //*lpszPath = 0; // Assume failure 221 | 222 | // Get a pointer to the IShellLink interface. It is assumed that CoInitialize has already been called. 223 | hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); 224 | if (SUCCEEDED(hres)) 225 | { 226 | IPersistFile* ppf; 227 | 228 | // Get a pointer to the IPersistFile interface. 229 | hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf); 230 | 231 | if (SUCCEEDED(hres)) 232 | { 233 | WCHAR wsz[MAX_PATH]; 234 | 235 | // Ensure that the string is Unicode. 236 | MultiByteToWideChar(CP_UTF8, 0, lpszLinkFile, -1, wsz, MAX_PATH); 237 | 238 | // Add code here to check return value from MultiByteWideChar 239 | // for success. 240 | 241 | // Load the shortcut. 242 | hres = ppf->Load(wsz, STGM_READ); 243 | 244 | if (SUCCEEDED(hres)) 245 | { 246 | // Resolve the link. 247 | hres = psl->Resolve(hwnd, 0); 248 | 249 | if (SUCCEEDED(hres)) 250 | { 251 | // Get the path to the link target. 252 | hres = psl->GetPath(szGotPath, MAX_PATH, (WIN32_FIND_DATA*)&wfd, SLGP_SHORTPATH); 253 | 254 | if (SUCCEEDED(hres)) 255 | { 256 | //hres = StringCbCopy(lpszPath, iPathBufferSize, szGotPath); 257 | lnkPath = std::string(szGotPath); 258 | 259 | // Get the description of the target. 260 | //hres = psl->GetDescription(szDescription, MAX_PATH); 261 | 262 | //if (SUCCEEDED(hres)) 263 | //{ 264 | // 265 | //} 266 | } 267 | } 268 | } 269 | 270 | // Release the pointer to the IPersistFile interface. 271 | ppf->Release(); 272 | } 273 | 274 | // Release the pointer to the IShellLink interface. 275 | psl->Release(); 276 | } 277 | 278 | return lnkPath; 279 | } 280 | 281 | /** 282 | * @brief Get the path to the executable for the ProcessID 283 | * 284 | * @param processId The ProcessID from which the path to the executable should be fetched 285 | * @return The path to the executable from the ProcessID 286 | */ 287 | std::string Helper::GetFilepathFromProcessID(DWORD processId) 288 | { 289 | HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId); 290 | if (processHandle == NULL) { 291 | Logger::Error(MODULE_NAME "::GetFilepathFromProcessID() - Failed to open process."); 292 | return ""; 293 | } 294 | 295 | wchar_t filepath[MAX_PATH]; 296 | if (GetModuleFileNameExW(processHandle, NULL, filepath, MAX_PATH) == 0) { 297 | CloseHandle(processHandle); 298 | Logger::Error(MODULE_NAME "::GetFilepathFromProcessID() - Failed to get module filepath."); 299 | return ""; 300 | } 301 | CloseHandle(processHandle); 302 | 303 | return Helper::WideToUtf8(filepath); 304 | } 305 | 306 | /** 307 | * @brief Gets the text of a window. 308 | */ 309 | std::string Helper::GetWindowTitle(const HWND hwnd) 310 | { 311 | char windowNameBuffer[2000]; 312 | GetWindowTextA(hwnd, windowNameBuffer, sizeof(windowNameBuffer)); 313 | 314 | return std::string(windowNameBuffer); 315 | } 316 | 317 | /** 318 | * @brief Create a process. 319 | */ 320 | PROCESS_INFORMATION Helper::StartProcess(std::string exePath) 321 | { 322 | STARTUPINFO si; 323 | PROCESS_INFORMATION pi; 324 | 325 | ZeroMemory(&si, sizeof(si)); 326 | si.cb = sizeof(si); 327 | ZeroMemory(&pi, sizeof(pi)); 328 | 329 | // Add quotes so a path with spaces can be used 330 | auto cmdLine = ("\"" + exePath + "\""); 331 | 332 | // Start the process. 333 | if (!CreateProcess(NULL, // No module name (use command line) 334 | (LPSTR)cmdLine.c_str(), // Command line 335 | NULL, // Process handle not inheritable 336 | NULL, // Thread handle not inheritable 337 | FALSE, // Set handle inheritance to FALSE 338 | 0, // No creation flags 339 | NULL, // Use parent's environment block 340 | NULL, // Use parent's starting directory 341 | &si, // Pointer to STARTUPINFO structure 342 | &pi) // Pointer to PROCESS_INFORMATION structure 343 | ) { 344 | Logger::Info("CreateProcess failed(%d).", GetLastError()); 345 | } 346 | 347 | return pi; 348 | } 349 | -------------------------------------------------------------------------------- /WhatsappTray/Helper.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | // Include lib for GetFileVersionInfoSize() 7 | #pragma comment(lib,"Version.lib") 8 | 9 | #include 10 | #include 11 | 12 | class Helper 13 | { 14 | public: 15 | Helper() { } 16 | ~Helper() { } 17 | 18 | static std::string Helper::GetApplicationFilePath(); 19 | static std::string GetApplicationDirectory(); 20 | static std::wstring Utf8ToWide(const std::string& inputString); 21 | static std::string WideToUtf8(const std::wstring& inputString); 22 | static bool Replace(std::string& str, const std::string& oldValue, const std::string& newValue); 23 | static HICON GetWindowIcon(HWND hwnd); 24 | static std::string GetProductAndVersion(); 25 | static std::string GetStartMenuProgramsDirectory(); 26 | static std::string GetWindowsAppDataRoamingDirectory(); 27 | static std::string GetCurrentUserDirectory(); 28 | static std::string GetFilenameFromPath(std::string path); 29 | static std::wstring GetFilenameFromPath(std::wstring path); 30 | static std::string ResolveLnk(HWND hwnd, LPCSTR lpszLinkFile); 31 | static std::string GetFilepathFromProcessID(DWORD processId); 32 | static std::string GetWindowTitle(const HWND hwnd); 33 | static PROCESS_INFORMATION Helper::StartProcess(std::string exePath); 34 | }; 35 | 36 | -------------------------------------------------------------------------------- /WhatsappTray/Hook.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | x64 7 | 8 | 9 | Release 10 | x64 11 | 12 | 13 | 14 | {9CD8044A-759A-4F65-B9FE-6DD8DD188428} 15 | RBHook 16 | Win32Proj 17 | Hook 18 | 10.0 19 | 20 | 21 | 22 | DynamicLibrary 23 | MultiByte 24 | true 25 | v142 26 | 27 | 28 | DynamicLibrary 29 | MultiByte 30 | true 31 | v142 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | <_ProjectFileVersion>10.0.40219.1 46 | $(SolutionDir)bin\$(Configuration)\ 47 | $(SolutionDir)bin\$(Configuration)\ 48 | $(SolutionDir)intermediate\$(ProjectName)\$(Configuration)\ 49 | $(SolutionDir)intermediate\$(ProjectName)\$(Configuration)\ 50 | false 51 | false 52 | 53 | 54 | $(IncludePath) 55 | 56 | 57 | $(IncludePath) 58 | 59 | 60 | 61 | X64 62 | 63 | 64 | MaxSpeed 65 | true 66 | WIN32;NDEBUG;_WINDOWS;_USRDLL;RBHOOK_EXPORTS;%(PreprocessorDefinitions) 67 | MultiThreaded 68 | true 69 | 70 | 71 | Level3 72 | ProgramDatabase 73 | stdcpp17 74 | 75 | 76 | true 77 | Windows 78 | true 79 | true 80 | MachineX64 81 | 82 | 83 | $(IntDir)Buildlog\$(MSBuildProjectName).log 84 | 85 | 86 | 87 | 88 | X64 89 | 90 | 91 | MaxSpeed 92 | true 93 | WIN32;_DEBUG;_WINDOWS;_USRDLL;RBHOOK_EXPORTS;%(PreprocessorDefinitions) 94 | MultiThreadedDebug 95 | true 96 | 97 | 98 | Level3 99 | ProgramDatabase 100 | stdcpp17 101 | 102 | 103 | true 104 | Windows 105 | true 106 | true 107 | MachineX64 108 | 109 | 110 | $(IntDir)Buildlog\$(MSBuildProjectName).log 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /WhatsappTray/Hook.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 6 | h;hpp;hxx;hm;inl;inc;xsd 7 | 8 | 9 | 10 | 11 | Files 12 | 13 | 14 | Files 15 | 16 | 17 | Files 18 | 19 | 20 | 21 | 22 | Files 23 | 24 | 25 | Files 26 | 27 | 28 | Files 29 | 30 | 31 | 32 | 33 | Files 34 | 35 | 36 | -------------------------------------------------------------------------------- /WhatsappTray/Logger.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | #include "Logger.h" 6 | 7 | #include "Helper.h" 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | std::ofstream Logger::logFile; 15 | Loglevel Logger::loglevelToLog = Loglevel::LOG_ERROR; 16 | bool Logger::isSetupDone = false; 17 | 18 | Logger::Logger() 19 | { 20 | } 21 | 22 | Logger::~Logger() 23 | { 24 | } 25 | 26 | /** 27 | * Setup the logging. 28 | */ 29 | void Logger::Setup() 30 | { 31 | if (isSetupDone == true) { 32 | OutputDebugStringA("ERROR: The setup for the logger was already done.\n"); 33 | return; 34 | } 35 | 36 | if (Logger::loglevelToLog == Loglevel::LOG_NONE) { 37 | OutputDebugStringA("WARNING: The log-level is 'NONE'.\n"); 38 | return; 39 | } 40 | 41 | auto timeString = Logger::GetTimeString("%Y-%m-%d_%H#%M#%S"); 42 | 43 | std::string logPath = Helper::GetApplicationDirectory() + "log\\"; 44 | std::string logFileName = std::string("Log_") + timeString + std::string(".txt"); 45 | 46 | // Create log-folder 47 | if (CreateDirectory(logPath.c_str(), NULL) == false && ERROR_ALREADY_EXISTS != GetLastError()) { 48 | OutputDebugStringA("ERROR: Creating the log-folder failed and it was NOT because it did already existed.\n"); 49 | return; 50 | } 51 | 52 | OutputDebugStringA((std::string("Log to ") + logPath + logFileName + "\n").c_str()); 53 | 54 | logFile.open((logPath + logFileName).c_str(), std::ofstream::out); 55 | if ((logFile.rdstate() & std::ofstream::failbit) != 0) { 56 | OutputDebugStringA("ERROR: Logfile could not be created!\n"); 57 | } 58 | 59 | isSetupDone = true; 60 | } 61 | 62 | void Logger::ReleaseInstance() 63 | { 64 | if (logFile.is_open()) { 65 | logFile.close(); 66 | } 67 | 68 | isSetupDone = false; 69 | } 70 | 71 | bool Logger::App(std::string text, ...) 72 | { 73 | va_list argptr; 74 | va_start(argptr, text); 75 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 76 | va_end(argptr); 77 | return returnValue; 78 | } 79 | bool Logger::Fatal(std::string text, ...) 80 | { 81 | va_list argptr; 82 | va_start(argptr, text); 83 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 84 | va_end(argptr); 85 | return returnValue; 86 | } 87 | bool Logger::Error(std::string text, ...) 88 | { 89 | va_list argptr; 90 | va_start(argptr, text); 91 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 92 | va_end(argptr); 93 | return returnValue; 94 | } 95 | bool Logger::Warning(std::string text, ...) 96 | { 97 | va_list argptr; 98 | va_start(argptr, text); 99 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 100 | va_end(argptr); 101 | return returnValue; 102 | } 103 | bool Logger::Info(std::string text, ...) 104 | { 105 | va_list argptr; 106 | va_start(argptr, text); 107 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 108 | va_end(argptr); 109 | return returnValue; 110 | } 111 | bool Logger::Debug(std::string text, ...) 112 | { 113 | va_list argptr; 114 | va_start(argptr, text); 115 | auto returnValue = LogVariadic(Loglevel::LOG_APP, text + "\n", argptr); 116 | va_end(argptr); 117 | return returnValue; 118 | } 119 | 120 | bool Logger::LogLine(Loglevel loglevel, std::string text, ...) 121 | { 122 | va_list argptr; 123 | va_start(argptr, text); 124 | auto returnValue = LogVariadic(loglevel, text + "\n", argptr); 125 | va_end(argptr); 126 | 127 | return returnValue; 128 | } 129 | 130 | bool Logger::Log(Loglevel loglevel, std::string text, ...) 131 | { 132 | va_list argptr; 133 | va_start(argptr, text); 134 | auto returnvalue = LogVariadic(loglevel, text, argptr); 135 | va_end(argptr); 136 | 137 | return returnvalue; 138 | } 139 | 140 | bool Logger::LogVariadic(Loglevel loglevel, std::string logFormatString, va_list argptr) 141 | { 142 | const size_t buffersize = 5000; 143 | char logStringBuffer[buffersize]; 144 | auto count = vsnprintf(logStringBuffer, buffersize, logFormatString.c_str(), argptr); 145 | 146 | if (count > buffersize) { 147 | OutputDebugStringA("Error: The buffer was to small for the logstring. It has to be adusted in the code if that happens."); 148 | std::cerr << "Error: The buffer was to small for the logstring. It has to be adusted in the code if that happens."; 149 | } 150 | 151 | ProcessLog(loglevel, logStringBuffer); 152 | 153 | return true; 154 | } 155 | 156 | void Logger::ProcessLog(const Loglevel loglevel, const char* logTextBuffer) 157 | { 158 | if (isSetupDone == false) { 159 | OutputDebugStringA("ERROR: Logger setup was not done!\n"); 160 | return; 161 | } 162 | 163 | std::string logText = ""; 164 | // Append timestamp 165 | auto timeString = Logger::GetTimeString("%H:%M:%S", true); 166 | logText.append(timeString + " - "); 167 | 168 | // Append loglevel 169 | switch (loglevel) { 170 | case Loglevel::LOG_APP: break; 171 | case Loglevel::LOG_FATAL: logText = "FATAL: "; break; 172 | case Loglevel::LOG_ERROR: logText = "ERROR: "; break; 173 | case Loglevel::LOG_WARNING: logText = "WARNING: "; break; 174 | case Loglevel::LOG_INFO: logText = "INFO: "; break; 175 | case Loglevel::LOG_DEBUG: logText = "DEBUG: "; break; 176 | } 177 | logText.append(logTextBuffer); 178 | 179 | // Log everything to VS-console/DebugView for debugging. 180 | #ifdef _DEBUG 181 | std::wstring wideLogText = Helper::Utf8ToWide(logText); 182 | OutputDebugStringW(wideLogText.c_str()); 183 | #endif 184 | 185 | // If the loglevel is above the maximum, nothing shall be loged. 186 | if (loglevel > Logger::loglevelToLog) { 187 | return; 188 | } 189 | 190 | logFile << logText; 191 | logFile.flush(); 192 | } 193 | 194 | std::string Logger::GetTimeString(const char* formatString, bool withMilliseconds) 195 | { 196 | using namespace std::chrono; 197 | 198 | // Get current time 199 | auto now = system_clock::now(); 200 | 201 | // Get number of milliseconds for the current second 202 | // (remainder after division into seconds) 203 | auto ms = duration_cast(now.time_since_epoch()) % 1000; 204 | 205 | // Convert to std::time_t in order to convert to std::tm (broken time) 206 | auto timer = system_clock::to_time_t(now); 207 | 208 | // Convert to broken time 209 | struct tm local_time; 210 | localtime_s(&local_time, &timer); 211 | 212 | std::ostringstream oss; 213 | 214 | oss << std::put_time(&local_time, formatString); 215 | if (withMilliseconds) 216 | { 217 | oss << '.' << std::setfill('0') << std::setw(3) << ms.count(); 218 | } 219 | 220 | return oss.str(); 221 | } 222 | -------------------------------------------------------------------------------- /WhatsappTray/Logger.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | #include 6 | #include 7 | 8 | #define LogInfo(logString, ...) Logger::Info(MODULE_NAME + std::string("::") + std::string(__func__) + ": " + string_format(logString, __VA_ARGS__)) 9 | #define LogError(logString, ...) Logger::Error(MODULE_NAME + std::string("::") + std::string(__func__) + ": " + string_format(logString, __VA_ARGS__)) 10 | 11 | enum class Loglevel 12 | { 13 | LOG_NONE, 14 | LOG_APP, 15 | LOG_FATAL, 16 | LOG_ERROR, 17 | LOG_WARNING, 18 | LOG_INFO, 19 | LOG_DEBUG, 20 | }; 21 | 22 | class Logger 23 | { 24 | private: 25 | Logger(); 26 | ~Logger(); 27 | 28 | static std::ofstream logFile; 29 | 30 | bool Log(Loglevel loglevel, std::string text, ...); 31 | static bool LogVariadic(Loglevel loglevel, std::string text, va_list vadriaicList); 32 | static void ProcessLog(const Loglevel loglevel, const char* logTextBuffer); 33 | static std::string GetTimeString(const char* formatString, bool withMilliseconds = false); 34 | 35 | public: 36 | static Loglevel loglevelToLog; 37 | static bool isSetupDone; 38 | static void Setup(); 39 | static void ReleaseInstance(); 40 | static bool App(std::string text, ...); 41 | static bool Fatal(std::string text, ...); 42 | static bool Error(std::string text, ...); 43 | static bool Warning(std::string text, ...); 44 | static bool Info(std::string text, ...); 45 | static bool Debug(std::string text, ...); 46 | static bool LogLine(Loglevel loglevel, std::string text, ...); 47 | }; 48 | -------------------------------------------------------------------------------- /WhatsappTray/ReadRegister.asm: -------------------------------------------------------------------------------- 1 | .code 2 | ;To get a registervalue, we need to write the needed register in rax because after 'ret' the function returns whatever is in the rax-register 3 | 4 | ReturnRdx proc 5 | mov rax, rdx 6 | ret 7 | ReturnRdx endp 8 | 9 | ReturnRcx proc 10 | mov rax, rcx 11 | ret 12 | ReturnRcx endp 13 | 14 | ReturnRdi proc 15 | mov rax, rdi 16 | ret 17 | ReturnRdi endp 18 | 19 | ReturnR8 proc 20 | mov rax, r8 21 | ret 22 | ReturnR8 endp 23 | 24 | ReturnR9 proc 25 | mov rax, r9 26 | ret 27 | ReturnR9 endp 28 | 29 | end -------------------------------------------------------------------------------- /WhatsappTray/Registry.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | 6 | #include "Registry.h" 7 | #include "Helper.h" 8 | #include "Logger.h" 9 | 10 | #include 11 | #include 12 | 13 | const TCHAR* Registry::applicatinName = TEXT("WhatsappTray"); 14 | 15 | /* 16 | * @brief Creates an entry in the registry to run WhatsappTray on startup. 17 | */ 18 | void Registry::RegisterProgram() 19 | { 20 | // Get the path to WhatsappTray. 21 | TCHAR szPathToExe[MAX_PATH]; 22 | GetModuleFileName(NULL, szPathToExe, MAX_PATH); 23 | 24 | // Set the autostart in registry. 25 | RegisterMyProgramForStartup(applicatinName, szPathToExe, TEXT("")); 26 | } 27 | 28 | /* 29 | * @brief Creates an entry in the registry to run \p pszAppName on startup. 30 | */ 31 | bool Registry::RegisterMyProgramForStartup(const TCHAR* pszAppName, TCHAR* pathToExe, TCHAR* args) 32 | { 33 | HKEY hKey = NULL; 34 | LONG lResult = 0; 35 | bool fSuccess = TRUE; 36 | DWORD dwSize; 37 | 38 | const size_t count = MAX_PATH * 2; 39 | TCHAR szValue[count] = { 0 }; 40 | 41 | _tcscpy_s(szValue, count, TEXT("\"")); 42 | _tcscat_s(szValue, count, pathToExe); 43 | _tcscat_s(szValue, count, TEXT("\" ")); 44 | 45 | if (args != NULL) { 46 | // caller should make sure "args" is quoted if any single argument has a space 47 | // e.g. ("-name \"Mark Voidale\""); 48 | _tcscat_s(szValue, count, args); 49 | } 50 | 51 | lResult = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, NULL, 0, (KEY_WRITE | KEY_READ), NULL, &hKey, NULL); 52 | 53 | if (lResult != 0) { 54 | Logger::Error("Registry::RegisterMyProgramForStartup() - Regestry-key could not been created."); 55 | return false; 56 | } 57 | 58 | if ((_tcslen(szValue) + 1) * 2 > ULONG_MAX) { 59 | Logger::Error("Registry::RegisterMyProgramForStartup() - String is too long."); 60 | throw std::exception("Registry::RegisterMyProgramForStartup() - String is too long."); 61 | } 62 | 63 | dwSize = static_cast((_tcslen(szValue) + 1) * 2); 64 | lResult = RegSetValueEx(hKey, pszAppName, 0, REG_SZ, (BYTE*)szValue, dwSize); 65 | 66 | if (hKey != NULL) { 67 | RegCloseKey(hKey); 68 | } 69 | 70 | if (lResult != 0) { 71 | Logger::Error("Registry::RegisterMyProgramForStartup() - Could not set value of regestry-key."); 72 | return false; 73 | } 74 | 75 | return (lResult == 0); 76 | } 77 | 78 | /* 79 | * @brief Returns true if the autorun entry for WhatsappTray exists in the registry. 80 | */ 81 | bool Registry::IsMyProgramRegisteredForStartup(TCHAR* pszAppName) 82 | { 83 | HKEY hKey = NULL; 84 | LONG lResult = 0; 85 | bool fSuccess = TRUE; 86 | DWORD dwRegType = REG_SZ; 87 | TCHAR szPathToExe[MAX_PATH] = { 0 }; 88 | DWORD dwSize = sizeof(szPathToExe); 89 | 90 | lResult = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ, &hKey); 91 | 92 | fSuccess = (lResult == 0); 93 | 94 | if (fSuccess) { 95 | lResult = RegGetValue(hKey, NULL, pszAppName, RRF_RT_REG_SZ, &dwRegType, szPathToExe, &dwSize); 96 | fSuccess = (lResult == 0); 97 | } 98 | 99 | if (fSuccess) { 100 | fSuccess = (lstrlen(szPathToExe) > 0) ? TRUE : FALSE; 101 | } 102 | 103 | if (hKey != NULL) { 104 | RegCloseKey(hKey); 105 | hKey = NULL; 106 | } 107 | 108 | return fSuccess; 109 | } 110 | 111 | /* 112 | * @brief Deletes the entry in the registry to run WhatsappTray on startup. 113 | */ 114 | void Registry::UnregisterProgram() 115 | { 116 | RegDeleteKeyValue(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), applicatinName); 117 | } 118 | -------------------------------------------------------------------------------- /WhatsappTray/Registry.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #include 7 | 8 | class Registry 9 | { 10 | public: 11 | static void RegisterProgram(); 12 | static bool RegisterMyProgramForStartup(const TCHAR* pszAppName, TCHAR* pathToExe, TCHAR* args); 13 | static bool IsMyProgramRegisteredForStartup(TCHAR* pszAppName); 14 | static void UnregisterProgram(); 15 | private: 16 | Registry() { } 17 | ~Registry() { } 18 | static const TCHAR* applicatinName; 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /WhatsappTray/SharedDefines.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #define NAME TEXT("WhatsappTray") 7 | #define WHATSAPP_CLIENT_NAME TEXT("WhatsApp") 8 | #define WHATSAPPTRAY_LOAD_LIBRARY_TEST_ENV_VAR "WhatsappTrayLoadLibraryTest" /* The enviroment-variable used to test if the hook.dll was triggerd by WhatsappTray's LoadLibrary() */ 9 | #define WHATSAPPTRAY_LOAD_LIBRARY_TEST_ENV_VAR_VALUE "TRUE" /* The value of the enviroment-variable used to test if the hook.dll was triggerd by WhatsappTray's LoadLibrary() */ 10 | 11 | #define LOGGER_IP "127.0.0.1" 12 | // What port to use: https://stackoverflow.com/a/53667220/4870255 13 | // Ports 49152 - 65535 - Free to use these in client programs 14 | #define LOGGER_PORT "52677" 15 | 16 | #define WM_WA_MINIMIZE_BUTTON_PRESSED 0x0401 /* The minimize-button in WhatsApp was pressed */ 17 | #define WM_WA_CLOSE_BUTTON_PRESSED 0x0402 /* The close-button in WhatsApp was pressed (X) */ 18 | #define WM_WA_KEY_PRESSED 0x0403 /* A key in WhatsApp was pressed (X) */ 19 | #define WM_TRAYCMD 0x0404 20 | #define WM_WHAHTSAPP_CLOSING 0x0405 21 | #define WM_WHATSAPP_API_NEW_MESSAGE 0x0407 22 | #define WM_WHATSAPP_TO_WHATSAPPTRAY_RECEIVED_WM_CLOSE 0x0408 /* WhatsApp received a WM_CLOSE-message. This message is ment to be sent from the hook inside WhatsApp */ 23 | #define WM_WHATSAPP_SHOWWINDOW_BLOCKED 0x0409 /* The hook sucessfully blocked the ShowWindow()-function. */ 24 | #define WM_WHATSAPPTRAY_TO_WHATSAPP_SEND_WM_CLOSE 0x8000 - 100 /* This message is ment to send to the Whatsapp-window and the hook processes it and should close Whatsapp */ 25 | #define IDM_RESTORE 0x1001 26 | #define IDM_CLOSE 0x1002 27 | #define IDM_ABOUT 0x1004 28 | #define IDM_SETTING_CLOSE_TO_TRAY 0x1005 29 | #define IDM_SETTING_LAUNCH_ON_WINDOWS_STARTUP 0x1006 30 | #define IDM_SETTING_START_MINIMIZED 0x1007 31 | #define IDM_SETTING_SHOW_UNREAD_MESSAGES 0x1008 32 | #define IDM_SETTING_CLOSE_TO_TRAY_WITH_ESCAPE 0x1009 33 | 34 | #include 35 | #include 36 | #include 37 | 38 | /** 39 | * @brief 40 | * 41 | * https://stackoverflow.com/a/26221725/4870255 42 | */ 43 | template 44 | std::string string_format(const std::string& format, Args ... args) 45 | { 46 | size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1ll; // '1 + ' because extra space for '\0' 47 | if (size <= 0) { throw std::runtime_error("Error during formatting."); } 48 | std::unique_ptr buf(new char[size]); 49 | snprintf(buf.get(), size, format.c_str(), args ...); 50 | return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside 51 | } -------------------------------------------------------------------------------- /WhatsappTray/TrayManager.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #include "stdafx.h" 5 | 6 | #include "TrayManager.h" 7 | #include "Helper.h" 8 | #include "Logger.h" 9 | #include "WhatsappTray.h" 10 | #include "SharedDefines.h" 11 | #include 12 | 13 | using namespace Gdiplus; 14 | 15 | #undef MODULE_NAME 16 | #define MODULE_NAME "TrayManager::" 17 | 18 | TrayManager::TrayManager(const HWND hwndWhatsappTray) 19 | : _hwndWhatsappTray(hwndWhatsappTray) 20 | , _hwndItems { 0 } 21 | { 22 | Logger::Info(MODULE_NAME "ctor() - Creating TrayManger."); 23 | } 24 | 25 | void TrayManager::MinimizeWindowToTray(const HWND hwnd) 26 | { 27 | Logger::Info(MODULE_NAME "MinimizeWindowToTray(0x%08X)", reinterpret_cast(hwnd)); 28 | 29 | // Hide window 30 | // NOTE: The SW_MINIMIZE is important for the case when close-to-tray-feature is used: 31 | // Without it, a maximized window is not restored as maximized. 32 | // This means Windows only remebers the size when it was minimized before. This is done implicied when the minimize-button is used for minimizing to tray 33 | // See also https://github.com/D4koon/WhatsappTray/issues/10 34 | ShowWindow(hwnd, SW_MINIMIZE); 35 | ShowWindow(hwnd, SW_HIDE); 36 | } 37 | 38 | /** 39 | * If a window is already in the tray nothing will be done. 40 | */ 41 | void TrayManager::RegisterWindow(const HWND hwnd) 42 | { 43 | // Add icon to tray if it's not already there 44 | if (GetIndexFromWindowHandle(hwnd) != -1) { 45 | Logger::Warning(MODULE_NAME "RegisterWindow() - Trying to send a window to tray that should already be minimized. This should not happen."); 46 | return; 47 | } 48 | 49 | // Search first empty spot. 50 | int32_t newIndex = -1; 51 | for (int32_t index = 0; index < MAXTRAYITEMS; index++) { 52 | if (_hwndItems[index] == NULL) { 53 | newIndex = index; 54 | } 55 | } 56 | 57 | if (newIndex == -1) { 58 | Logger::Error(MODULE_NAME "RegisterWindow() - Tray is full!"); 59 | } 60 | 61 | _hwndItems[newIndex] = hwnd; 62 | AddTrayIcon(newIndex, hwnd); 63 | } 64 | 65 | void TrayManager::AddTrayIcon(const int32_t index, const HWND hwnd) 66 | { 67 | Logger::Info(MODULE_NAME "AddTrayIcon(%d)", index); 68 | 69 | auto nid = CreateTrayIconData(index, Helper::GetWindowIcon(hwnd)); 70 | 71 | Shell_NotifyIcon(NIM_ADD, &nid); 72 | Shell_NotifyIcon(NIM_SETVERSION, &nid); 73 | } 74 | 75 | void TrayManager::CloseWindowFromTray(const HWND hwnd) 76 | { 77 | Logger::Info(MODULE_NAME "CloseWindowFromTray() 0x%08X", hwnd); 78 | 79 | // Use PostMessage to avoid blocking if the program brings up a dialog on exit. 80 | // NOTE: WM_WHATSAPPTRAY_TO_WHATSAPP_SEND_WM_CLOSE is a special message i made because WM_CLOSE is always blocked by the hook 81 | PostMessage(hwnd, WM_WHATSAPPTRAY_TO_WHATSAPP_SEND_WM_CLOSE, 0, 0); 82 | 83 | Sleep(50); 84 | if (IsWindow(hwnd)) { 85 | Sleep(50); 86 | } 87 | 88 | if (!IsWindow(hwnd)) { 89 | // Closed successfully 90 | RemoveTrayIcon(hwnd); 91 | } 92 | } 93 | 94 | void TrayManager::RemoveTrayIcon(const HWND hwnd) 95 | { 96 | int32_t index = GetIndexFromWindowHandle(hwnd); 97 | if (index == -1) { return; } 98 | RemoveFromTray(index); 99 | } 100 | 101 | void TrayManager::RemoveFromTray(const int32_t index) 102 | { 103 | Logger::Info(MODULE_NAME "RemoveFromTray(%d)", index); 104 | 105 | NOTIFYICONDATA nid { 0 }; 106 | nid.cbSize = NOTIFYICONDATA_V2_SIZE; 107 | nid.hWnd = _hwndWhatsappTray; 108 | nid.uID = (UINT)index; 109 | 110 | Shell_NotifyIcon(NIM_DELETE, &nid); 111 | 112 | _hwndItems[index] = NULL; 113 | } 114 | 115 | void TrayManager::RestoreAllWindowsFromTray() 116 | { 117 | for (int i = 0; i < MAXTRAYITEMS; i++) { 118 | HWND itHwnd = _hwndItems[i]; 119 | if (itHwnd) { 120 | RestoreWindowFromTray(itHwnd); 121 | } 122 | } 123 | } 124 | 125 | void TrayManager::RestoreWindowFromTray(const HWND hwnd) 126 | { 127 | // Checking if the window is visible prevents the window from being reduced to windowed when the window is maximized and already showen. 128 | if (IsWindowVisible(hwnd) == false) { 129 | ShowWindow(hwnd, SW_RESTORE); 130 | SetForegroundWindow(hwnd); 131 | } 132 | } 133 | 134 | void TrayManager::UpdateIcon(uint64_t id) 135 | { 136 | Logger::Info(MODULE_NAME "UpdateIcon() Use bitmap with id(%d)", id); 137 | 138 | HICON waIcon = Helper::GetWindowIcon(GetWhatsAppHwnd()); 139 | auto trayIcon = waIcon; 140 | 141 | if (id > 0) { 142 | std::string appDirectory = Helper::GetApplicationDirectory(); 143 | 144 | // Delete old unread_messsages-bitmap 145 | auto lastMessageCountBitmapPath = appDirectory + std::string("unread_messages_") + std::to_string(id - 1) + ".bmp"; 146 | if (std::filesystem::exists(lastMessageCountBitmapPath)) { 147 | Logger::Info(MODULE_NAME "UpdateIcon() Deleting old unread_messages-bitmap '%s'", lastMessageCountBitmapPath.c_str()); 148 | std::filesystem::remove(lastMessageCountBitmapPath); 149 | } 150 | 151 | // Add the message-count-icon from WhatsApp to the normal icon 152 | auto messageCountBitmapPath = appDirectory + std::string("unread_messages_") + std::to_string(id) + ".bmp"; 153 | if (std::filesystem::exists(messageCountBitmapPath) == false) { 154 | Logger::Info(MODULE_NAME "UpdateIcon() Could not find message-count-bitmap in '%s'", messageCountBitmapPath.c_str()); 155 | } else { 156 | trayIcon = AddImageOverlayToIcon(waIcon, messageCountBitmapPath.c_str()); 157 | } 158 | } 159 | 160 | auto index = GetIndexFromWindowHandle(GetWhatsAppHwnd()); 161 | if (index == -1) { 162 | return; 163 | } 164 | 165 | auto nid = CreateTrayIconData(index, trayIcon); 166 | 167 | Shell_NotifyIcon(NIM_MODIFY, &nid); 168 | 169 | if (id > 0) { 170 | // Only destroy the icon when we created it (Through AddImageOverlayToIcon) 171 | ::DestroyIcon(trayIcon); 172 | } 173 | } 174 | 175 | NOTIFYICONDATA TrayManager::CreateTrayIconData(const int32_t index, HICON trayIcon) 176 | { 177 | Logger::Info(MODULE_NAME "CreateTrayIconData() With index=%d", index); 178 | 179 | NOTIFYICONDATA nid{ 0 }; 180 | nid.cbSize = NOTIFYICONDATA_V2_SIZE; 181 | nid.hWnd = _hwndWhatsappTray; 182 | nid.uID = static_cast(index); 183 | nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 184 | nid.uCallbackMessage = WM_TRAYCMD; 185 | nid.hIcon = trayIcon; 186 | nid.uVersion = NOTIFYICON_VERSION; 187 | strncpy_s(nid.szTip, ARRAYSIZE(nid.szTip), "WhatsApp", _TRUNCATE); 188 | 189 | return nid; 190 | } 191 | 192 | int32_t TrayManager::GetIndexFromWindowHandle(const HWND hwnd) 193 | { 194 | if (hwnd == NULL) { 195 | return -1; 196 | } 197 | 198 | for (int i = 0; i < MAXTRAYITEMS; i++) { 199 | if (_hwndItems[i] == hwnd) { 200 | return i; 201 | } 202 | } 203 | 204 | return -1; 205 | } 206 | 207 | HICON TrayManager::AddImageOverlayToIcon(HICON hBackgroundIcon, LPCSTR text) 208 | { 209 | // Load up background icon 210 | ICONINFO ii = { 0 }; 211 | //GetIconInfo creates bitmaps for the hbmMask and hbmColor members of ICONINFO. 212 | //WARNING: The calling application must manage these bitmaps and delete them when they are no longer necessary.!!!! 213 | ::GetIconInfo(hBackgroundIcon, &ii); 214 | 215 | HDC hDc = ::GetDC(NULL); 216 | HDC hMemDC = ::CreateCompatibleDC(hDc); 217 | 218 | HGDIOBJ hOldBmp = ::SelectObject(hMemDC, ii.hbmColor); 219 | 220 | auto bitmap = Bitmap::FromFile(Helper::Utf8ToWide(text).c_str()); 221 | 222 | Graphics graphics(hMemDC); 223 | 224 | // Set black as transparent (don't copy black pixels with DrawImage) 225 | Gdiplus::ImageAttributes attr; 226 | attr.SetColorKey(Gdiplus::Color::Black, Gdiplus::Color::Black, Gdiplus::ColorAdjustTypeBitmap); 227 | 228 | // Set x/y-postion and size where the image should be copied to. 229 | const Gdiplus::Rect rect(10, 10, 20, 20); 230 | graphics.DrawImage(bitmap, rect, 0, 0, bitmap->GetWidth(), bitmap->GetHeight(), Gdiplus::Unit::UnitPixel, &attr); 231 | 232 | delete bitmap; 233 | 234 | ::SelectObject(hMemDC, hOldBmp); 235 | 236 | // Use new icon bitmap with text and new mask bitmap with text 237 | ICONINFO ii2 = { 0 }; 238 | ii2.fIcon = TRUE; 239 | ii2.hbmMask = ii.hbmMask; 240 | ii2.hbmColor = ii.hbmColor; 241 | 242 | // Create updated icon 243 | HICON iconWithText = ::CreateIconIndirect(&ii2); 244 | 245 | // Delete background icon bitmap info 246 | ::DeleteObject(ii.hbmColor); 247 | ::DeleteObject(ii.hbmMask); 248 | 249 | ::DeleteDC(hMemDC); 250 | ::ReleaseDC(NULL, hDc); 251 | 252 | return iconWithText; 253 | } 254 | -------------------------------------------------------------------------------- /WhatsappTray/TrayManager.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 1998 - 2018 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #include 7 | #include 8 | #pragma comment (lib,"Gdiplus.lib") 9 | 10 | #include 11 | 12 | class TrayManager 13 | { 14 | public: 15 | TrayManager(const HWND hwndWhatsappTray); 16 | ~TrayManager() { } 17 | void MinimizeWindowToTray(const HWND hwnd); 18 | void CloseWindowFromTray(const HWND hwnd); 19 | void RemoveTrayIcon(const HWND hwnd); 20 | void RemoveFromTray(const int32_t index); 21 | void RestoreAllWindowsFromTray(); 22 | void RestoreWindowFromTray(const HWND hwnd); 23 | void UpdateIcon(uint64_t id); 24 | void RegisterWindow(const HWND hwnd); 25 | private: 26 | static const int MAXTRAYITEMS = 64; 27 | 28 | /// The windows that are currently minimized to tray. 29 | HWND _hwndWhatsappTray; 30 | HWND _hwndItems[MAXTRAYITEMS]; 31 | 32 | void AddTrayIcon(const int32_t index, const HWND hwnd); 33 | NOTIFYICONDATA CreateTrayIconData(const int32_t index, HICON trayIcon); 34 | int32_t GetIndexFromWindowHandle(const HWND hwnd); 35 | HICON AddImageOverlayToIcon(HICON hBackgroundIcon, LPCSTR text); 36 | }; 37 | 38 | -------------------------------------------------------------------------------- /WhatsappTray/Version.rc2: -------------------------------------------------------------------------------- 1 | /** 2 | * This contains the version information and is purposefully named rc2, so it will not interpreted as a resoucefile by visual studio. 3 | * This file is then included in the main resourcefile. 4 | * This was done because otherwise using defines is not possible. 5 | * https://semver.org/ 6 | */ 7 | 8 | #define MAJOR 1 9 | #define MINOR 9 10 | #define PATCH 0 11 | #define IS_DEBUG 0 12 | 13 | #define STRINGIFY(x) #x 14 | #define TOSTRING(x) STRINGIFY(x) 15 | #define MY_PRODUCT_VERSION_NUM MAJOR, MINOR, PATCH, IS_DEBUG 16 | #define MY_PRODUCT_VERSION TOSTRING(MAJOR) "." TOSTRING(MINOR) "." TOSTRING(PATCH) "." TOSTRING(IS_DEBUG) 17 | 18 | VS_VERSION_INFO VERSIONINFO 19 | FILEVERSION MY_PRODUCT_VERSION_NUM 20 | PRODUCTVERSION MY_PRODUCT_VERSION_NUM 21 | FILEFLAGSMASK 0x17L 22 | #ifdef _DEBUG 23 | FILEFLAGS 0x1L 24 | #else 25 | FILEFLAGS 0x0L 26 | #endif 27 | FILEOS 0x4L 28 | FILETYPE 0x1L 29 | FILESUBTYPE 0x0L 30 | BEGIN 31 | BLOCK "StringFileInfo" 32 | BEGIN 33 | BLOCK "040904b0" 34 | BEGIN 35 | VALUE "FileDescription", "WhatsappTray" 36 | VALUE "FileVersion", MY_PRODUCT_VERSION 37 | VALUE "InternalName", "WhatsappTray" 38 | VALUE "LegalCopyright", "Copyright © 1998-2019 Sebastian Amann, Nikolay Redko, J.D. Purcell" 39 | VALUE "OriginalFilename", "WhatsappTray.exe" 40 | VALUE "ProductName", "WhatsappTray" 41 | VALUE "ProductVersion", MY_PRODUCT_VERSION 42 | END 43 | END 44 | BLOCK "VarFileInfo" 45 | BEGIN 46 | VALUE "Translation", 0x409, 1200 47 | END 48 | END 49 | -------------------------------------------------------------------------------- /WhatsappTray/WhatsappTray.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #pragma comment (lib,"Gdiplus.lib") 6 | 7 | HWND GetWhatsAppHwnd(); 8 | -------------------------------------------------------------------------------- /WhatsappTray/WhatsappTray.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/WhatsappTray/WhatsappTray.ico -------------------------------------------------------------------------------- /WhatsappTray/WhatsappTray.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/WhatsappTray/WhatsappTray.rc -------------------------------------------------------------------------------- /WhatsappTray/WhatsappTray.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | x64 7 | 8 | 9 | Release 10 | x64 11 | 12 | 13 | 14 | {CDDAA887-EEE9-47FA-B4B5-929A92D71248} 15 | RBTray 16 | Win32Proj 17 | WhatsappTray 18 | 10.0 19 | 20 | 21 | 22 | Application 23 | MultiByte 24 | true 25 | v142 26 | 27 | 28 | Application 29 | MultiByte 30 | false 31 | v142 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | <_ProjectFileVersion>10.0.40219.1 45 | $(SolutionDir)bin\$(Configuration)\ 46 | $(SolutionDir)bin\$(Configuration)\ 47 | $(SolutionDir)intermediate\$(ProjectName)\$(Configuration)\ 48 | $(SolutionDir)intermediate\$(ProjectName)\$(Configuration)\ 49 | false 50 | true 51 | 52 | 53 | $(SolutionDir)WhatsappTray;$(IncludePath) 54 | 55 | 56 | false 57 | $(SolutionDir)WhatsappTray;$(IncludePath) 58 | 59 | 60 | 61 | X64 62 | 63 | 64 | MaxSpeed 65 | true 66 | WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) 67 | MultiThreaded 68 | true 69 | Use 70 | Level3 71 | ProgramDatabase 72 | false 73 | stdcpp17 74 | 75 | 76 | true 77 | Windows 78 | true 79 | true 80 | MachineX64 81 | 82 | 83 | $(IntDir)Buildlog\$(MSBuildProjectName).log 84 | 85 | 86 | $(SolutionDir)WhatsappTray;%(AdditionalIncludeDirectories) 87 | 88 | 89 | 90 | 91 | X64 92 | 93 | 94 | Disabled 95 | false 96 | WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) 97 | MultiThreadedDebug 98 | true 99 | Use 100 | Level3 101 | EditAndContinue 102 | false 103 | true 104 | false 105 | EnableFastChecks 106 | false 107 | stdcpp17 108 | 109 | 110 | true 111 | Windows 112 | 113 | 114 | 115 | 116 | MachineX64 117 | %(AdditionalDependencies) 118 | 119 | 120 | $(IntDir)Buildlog\$(MSBuildProjectName).log 121 | 122 | 123 | $(SolutionDir)WhatsappTray;%(AdditionalIncludeDirectories) 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | Create 134 | Create 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | -------------------------------------------------------------------------------- /WhatsappTray/WhatsappTray.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 6 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {aeed58ce-9b0a-4a09-a1d9-087e2327d29d} 14 | 15 | 16 | {65cf085c-1c27-43ca-a0b5-839dc1ae68bf} 17 | 18 | 19 | {5846c5e2-100a-49a0-8d59-3b78f28da4a4} 20 | 21 | 22 | 23 | 24 | Files 25 | 26 | 27 | Files 28 | 29 | 30 | Resource Files 31 | 32 | 33 | Precompiled Header 34 | 35 | 36 | Files\Logging 37 | 38 | 39 | Files 40 | 41 | 42 | Files\Helper 43 | 44 | 45 | Files\Helper 46 | 47 | 48 | Files 49 | 50 | 51 | Files 52 | 53 | 54 | Files\Helper 55 | 56 | 57 | Files\Logging 58 | 59 | 60 | 61 | 62 | Files 63 | 64 | 65 | Files 66 | 67 | 68 | Precompiled Header 69 | 70 | 71 | Files\Logging 72 | 73 | 74 | Files 75 | 76 | 77 | Files\Helper 78 | 79 | 80 | Files 81 | 82 | 83 | Files 84 | 85 | 86 | Files\Logging 87 | 88 | 89 | 90 | 91 | Resource Files 92 | 93 | 94 | 95 | 96 | Resource Files 97 | 98 | 99 | Resource Files 100 | 101 | 102 | -------------------------------------------------------------------------------- /WhatsappTray/WinSockClient.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | // WinSockClient implementation 5 | 6 | #include "WinSockClient.h" 7 | 8 | #include 9 | #include 10 | #include "../libs/readerwriterqueue/readerwriterqueue.h" 11 | #include "../libs/readerwriterqueue/atomicops.h" 12 | 13 | #pragma comment(lib, "ws2_32.lib") 14 | 15 | #undef MODULE_NAME 16 | #define MODULE_NAME "ClientSocket" 17 | 18 | // NOTE: For debugging OutputDebugStringA could be used... 19 | #define LogDebug(message, ...) //printf(MODULE_NAME "::" __FUNCTION__ " - " message "\n", __VA_ARGS__) 20 | 21 | static void ProcessMessageQueue(); 22 | static bool SocketInit(); 23 | static void SocketCleanup(); 24 | static bool SocketSendMessage(const char ipString[], const char portString[], const char message[]); 25 | static bool SetupSocket(); 26 | static bool CreateServerAddress(SOCKET clientSocket, const char ipString[], const char portString[], sockaddr_in& ServerAddress); 27 | static int WaitForNewMesaageWithTimeout(FD_SET& readSet, long sec, long usec); 28 | 29 | static bool _isRunning = false; 30 | static bool _waitForEmptyBuffer; 31 | static std::string _ipString; 32 | static std::string _portString; 33 | static std::thread _processMessagesThread; 34 | static moodycamel::BlockingReaderWriterQueue _messageBuffer; 35 | static SOCKET clientSocket = INVALID_SOCKET; 36 | 37 | constexpr int timeoutReceiveSec = 10; 38 | 39 | /** 40 | * @brief Sends message to server 41 | */ 42 | void SocketSendMessage(const char message[]) 43 | { 44 | if (_isRunning) { 45 | _messageBuffer.enqueue(std::string(message)); 46 | } 47 | } 48 | 49 | /** 50 | * @brief Starts the client 51 | */ 52 | void SocketStart(const char ipString[], const char portString[]) 53 | { 54 | _ipString = ipString; 55 | _portString = portString; 56 | 57 | LogDebug("Start message-processing thread"); 58 | 59 | _isRunning = true; 60 | 61 | _processMessagesThread = std::thread(ProcessMessageQueue); 62 | } 63 | 64 | void ProcessMessageQueue() 65 | { 66 | SocketInit(); 67 | 68 | std::string item; 69 | while (true) { 70 | _messageBuffer.wait_dequeue(item); 71 | 72 | if (_isRunning == false) { 73 | break; 74 | } 75 | 76 | SocketSendMessage(_ipString.c_str(), _portString.c_str(), item.c_str()); 77 | } 78 | 79 | if (_waitForEmptyBuffer) { 80 | // Empty the buffer before stopping. 81 | 82 | // One item should be still in item that was not processed yet. 83 | // If it was the dummy, do nothing. 84 | 85 | while (true) { 86 | 87 | if (_messageBuffer.size_approx() == 0) { 88 | break; 89 | } 90 | 91 | SocketSendMessage(_ipString.c_str(), _portString.c_str(), item.c_str()); 92 | 93 | _messageBuffer.try_dequeue(item); 94 | } 95 | 96 | } 97 | 98 | SocketCleanup(); 99 | } 100 | 101 | bool SocketInit() 102 | { 103 | WSADATA wsaData; 104 | int nResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 105 | 106 | if (NO_ERROR != nResult) { 107 | LogDebug("Error occurred while executing WSAStartup()"); 108 | return false; 109 | } 110 | 111 | LogDebug("WSAStartup() successful"); 112 | 113 | return true; 114 | } 115 | 116 | void SocketCleanup() 117 | { 118 | if (clientSocket != INVALID_SOCKET) { 119 | closesocket(clientSocket); 120 | } 121 | 122 | // Cleanup Winsock 123 | WSACleanup(); 124 | } 125 | 126 | bool SocketSendMessage(const char ipString[], const char portString[], const char message[]) 127 | { 128 | if (SetupSocket() == false) { 129 | closesocket(clientSocket); 130 | } 131 | 132 | sockaddr_in ServerAddress; 133 | if (CreateServerAddress(clientSocket, ipString, portString, ServerAddress) == false) { 134 | return false; 135 | } 136 | 137 | // Establish connection with the server 138 | if (SOCKET_ERROR == connect(clientSocket, reinterpret_cast(&ServerAddress), sizeof(ServerAddress))) { 139 | auto error = WSAGetLastError(); 140 | LogDebug("Error occurred while connecting: %ld.", error); 141 | } 142 | LogDebug("connect() successful."); 143 | 144 | // Send the message to the server 145 | int nBytesSent = send(clientSocket, message, (int)strlen(message), 0); 146 | 147 | if (SOCKET_ERROR == nBytesSent) { 148 | LogDebug("Error occurred while writing to socket."); 149 | return false; 150 | } 151 | LogDebug("send() successful."); 152 | 153 | FD_SET readSet; 154 | // NOTE: selRet has the cout of sockets that are ready 155 | auto selRet = WaitForNewMesaageWithTimeout(readSet, timeoutReceiveSec, 0); 156 | if (selRet == SOCKET_ERROR) { 157 | LogDebug("Error occurred while using select() on socket."); 158 | return false; 159 | } else if (selRet == 0) { 160 | LogDebug("Waiting for message timeout."); 161 | return false; 162 | } 163 | 164 | if (FD_ISSET(clientSocket, &readSet)) { 165 | // Server sent message to client 166 | 167 | // Init szBuffer with 0 168 | const int bufferSize = 256; 169 | char szBuffer[bufferSize]; 170 | ZeroMemory(szBuffer, bufferSize); 171 | 172 | // Get the message from the server 173 | // WARNING: MSG_WAITALL only because in this case the server will close the connection, wich will also stop the waiting. 174 | int bytesRecv = recv(clientSocket, szBuffer, bufferSize - 1, MSG_WAITALL); 175 | 176 | if (SOCKET_ERROR == bytesRecv) { 177 | LogDebug("Error occurred while reading from socket."); 178 | return false; 179 | } 180 | LogDebug("recv() successful."); 181 | 182 | LogDebug("Server message: '%s'", szBuffer); 183 | } 184 | 185 | closesocket(clientSocket); 186 | 187 | return true; 188 | } 189 | 190 | /** 191 | * @brief Create a socket 192 | * 193 | * @return True if socket was sucessfully created. 194 | */ 195 | static bool SetupSocket() 196 | { 197 | clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 198 | 199 | if (INVALID_SOCKET == clientSocket) { 200 | LogDebug("Error occurred while opening socket: %ld.", WSAGetLastError()); 201 | return false; 202 | } 203 | LogDebug("socket() successful."); 204 | 205 | return true; 206 | } 207 | 208 | static bool CreateServerAddress(SOCKET clientSocket, const char ipString[], const char portString[], sockaddr_in& serverAddress) 209 | { 210 | // Server name will be supplied as a commandline argument 211 | // Get the server details 212 | struct hostent* server = gethostbyname(ipString); 213 | 214 | if (server == NULL) { 215 | LogDebug("Error occurred no such host."); 216 | return false; 217 | } 218 | 219 | LogDebug("gethostbyname() successful."); 220 | 221 | // Port number will be supplied as a commandline argument 222 | int portNumber = atoi(portString); 223 | 224 | // Cleanup and Init the serverAddress with 0 225 | ZeroMemory((char*)&serverAddress, sizeof(serverAddress)); 226 | 227 | serverAddress.sin_family = AF_INET; 228 | 229 | // Assign the information received from gethostbyname() 230 | CopyMemory((char*)&serverAddress.sin_addr.s_addr, (char*)server->h_addr, server->h_length); 231 | 232 | serverAddress.sin_port = htons(portNumber); //comes from commandline 233 | 234 | return true; 235 | } 236 | 237 | // Wait with timeout for new message. 238 | static int WaitForNewMesaageWithTimeout(FD_SET& readSet, long sec, long usec) 239 | { 240 | FD_ZERO(&readSet); 241 | FD_SET(clientSocket, &readSet); 242 | timeval timeoutTime; 243 | timeoutTime.tv_sec = sec; 244 | timeoutTime.tv_usec = usec; 245 | 246 | // NOTE: selRet has the cout of sockets that are ready 247 | auto selRet = select(NULL, &readSet, NULL, NULL, &timeoutTime); 248 | 249 | return selRet; 250 | } 251 | 252 | /** 253 | * @brief Stops the client 254 | */ 255 | void SocketStop(bool waitForEmptyBuffer, bool waitForShutdown) 256 | { 257 | _waitForEmptyBuffer = waitForEmptyBuffer; 258 | _isRunning = false; 259 | 260 | // Send dummy-message to get out of wait_dequeue() 261 | _messageBuffer.enqueue(std::string("end processing dummy-message. This should not be sent!")); 262 | 263 | if (waitForShutdown && _processMessagesThread.joinable()) { 264 | _processMessagesThread.join(); 265 | } 266 | } 267 | -------------------------------------------------------------------------------- /WhatsappTray/WinSockClient.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | // WinSockClient header 5 | 6 | #pragma once 7 | 8 | #include 9 | #include 10 | 11 | void SocketSendMessage(const char message[]); 12 | void SocketStart(const char ipString[], const char portString[]); 13 | void SocketStop(bool waitForEmptyBuffer = true, bool waitForShutdown = true); 14 | -------------------------------------------------------------------------------- /WhatsappTray/WinSockLogger.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | #include "WinSockLogger.h" 5 | 6 | void WinSockLogger::TraceString(const std::string traceString) 7 | { 8 | SocketSendMessage(traceString.c_str()); 9 | 10 | //#ifdef _DEBUG 11 | // OutputDebugStringA(traceString.c_str()); 12 | //#endif 13 | } 14 | 15 | void WinSockLogger::TraceStream(std::ostringstream& traceBuffer) 16 | { 17 | SocketSendMessage(traceBuffer.str().c_str()); 18 | traceBuffer.clear(); 19 | traceBuffer.str(std::string()); 20 | 21 | //#ifdef _DEBUG 22 | // OutputDebugStringA(traceBuffer.str().c_str()); 23 | // traceBuffer.clear(); 24 | // traceBuffer.str(std::string()); 25 | //#endif 26 | } -------------------------------------------------------------------------------- /WhatsappTray/WinSockLogger.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #include "WinSockClient.h" 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | #define LogString(logString, ...) WinSockLogger::TraceString(MODULE_NAME + std::string("::") + std::string(__func__) + ": " + string_format(logString, __VA_ARGS__)) 13 | 14 | class WinSockLogger 15 | { 16 | public: 17 | static void TraceString(const std::string traceString); 18 | static void TraceStream(std::ostringstream& traceBuffer); 19 | }; 20 | -------------------------------------------------------------------------------- /WhatsappTray/WinSockServer.cpp: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | // Implementation for the WinSock server. 5 | 6 | #include "stdafx.h" 7 | #include "WinSockServer.h" 8 | 9 | #include 10 | //#include 11 | #include 12 | #include "Logger.h" 13 | 14 | #pragma comment(lib, "ws2_32.lib") 15 | 16 | #undef MODULE_NAME 17 | #define MODULE_NAME "ServerSocket" 18 | 19 | #define LogDebug(message, ...) //Logger::Info(MODULE_NAME "::" __FUNCTION__ " - " message "\n", __VA_ARGS__) 20 | 21 | static bool SocketDoProcessing(char portString[]); 22 | static bool SetupSocket(char portString[]); 23 | static bool ProcessClientSocket(SOCKET remoteSocket, std::string& messageFromClient); 24 | static int WaitForNewMesaageWithTimeout(SOCKET clientSocket, FD_SET& readSet, long sec, long usec); 25 | 26 | static std::atomic isRunning = false; 27 | static SOCKET listenSocket = INVALID_SOCKET; 28 | static std::function socketMessageReceivedEvent = NULL; 29 | 30 | /** 31 | * @brief Initialize socket 32 | * 33 | * @param portString The port the socket is running on 34 | */ 35 | bool SocketStart(char portString[]) 36 | { 37 | isRunning = true; 38 | 39 | // Initialize Winsock 40 | WSADATA wsaData; 41 | int nResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 42 | 43 | if (NO_ERROR != nResult) { 44 | LogDebug("Error occurred while executing WSAStartup()."); 45 | return false; 46 | } 47 | 48 | LogDebug("WSAStartup() successful."); 49 | 50 | SocketDoProcessing(portString); 51 | 52 | // Cleanup Winsock 53 | WSACleanup(); 54 | return true; 55 | } 56 | 57 | static bool SocketDoProcessing(char portString[]) 58 | { 59 | bool success = true; 60 | 61 | if (SetupSocket(portString) == false) { 62 | return false; 63 | } 64 | 65 | if (SOCKET_ERROR == listen(listenSocket, SOMAXCONN)) { 66 | closesocket(listenSocket); 67 | 68 | LogDebug("Error occurred while listening."); 69 | return false; 70 | } 71 | 72 | LogDebug("Listen to port successful."); 73 | 74 | struct sockaddr_in clientAddress{}; 75 | int clientSize = sizeof(clientAddress); 76 | while (true) { 77 | 78 | LogDebug("Wait for a client to connect."); 79 | SOCKET clientSocket = accept(listenSocket, (struct sockaddr*)&clientAddress, &clientSize); 80 | 81 | if (INVALID_SOCKET == clientSocket) { 82 | if (isRunning == false) { 83 | LogDebug("Listening on socket for new connection stopped."); 84 | break; 85 | } 86 | 87 | auto errorNo = WSAGetLastError(); 88 | LogDebug("Error occurred while accepting socket: %ld.", errorNo); 89 | 90 | success = false; 91 | break; 92 | } 93 | else { 94 | LogDebug("Accept() successful."); 95 | } 96 | 97 | LogDebug("Client connected from: %s", inet_ntoa(clientAddress.sin_addr)); 98 | 99 | std::string messageFromClient; 100 | auto clientProcessingSuccessful = ProcessClientSocket(clientSocket, messageFromClient); 101 | } 102 | 103 | if (INVALID_SOCKET != listenSocket) { 104 | closesocket(listenSocket); 105 | } 106 | return success; 107 | } 108 | 109 | void SocketNotifyOnNewMessage(const std::function& messageReceivedEvent) 110 | { 111 | socketMessageReceivedEvent = messageReceivedEvent; 112 | } 113 | 114 | void SocketStopServer() 115 | { 116 | isRunning = false; 117 | // NOTE: closesocket() can be calld on invalid sockets, so there is no handling for that necessary 118 | closesocket(listenSocket); 119 | listenSocket = INVALID_SOCKET; 120 | } 121 | 122 | /** 123 | * @brief Create a socket 124 | */ 125 | static bool SetupSocket(char portString[]) 126 | { 127 | SOCKET listenSocketTemp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 128 | 129 | if (INVALID_SOCKET == listenSocketTemp) { 130 | LogDebug("Error occurred while opening socket: %ld.", WSAGetLastError()); 131 | return false; 132 | } 133 | 134 | LogDebug("socket() successful."); 135 | 136 | struct sockaddr_in ServerAddress{}; 137 | // Cleanup and Init with 0 the ServerAddress 138 | ZeroMemory((char*)&ServerAddress, sizeof(ServerAddress)); 139 | 140 | // Port number will be supplied as a commandline argument 141 | int nPortNo = atoi(portString); 142 | 143 | // Fill up the address structure 144 | ServerAddress.sin_family = AF_INET; 145 | ServerAddress.sin_addr.s_addr = INADDR_ANY; // WinSock will supply address 146 | ServerAddress.sin_port = htons(nPortNo); //comes from commandline 147 | 148 | // Assign local address and port number 149 | if (SOCKET_ERROR == bind(listenSocketTemp, (struct sockaddr*)&ServerAddress, sizeof(ServerAddress))) { 150 | closesocket(listenSocketTemp); 151 | 152 | LogDebug("Error occurred while binding."); 153 | return false; 154 | } 155 | else { 156 | LogDebug("bind() successful."); 157 | } 158 | 159 | listenSocket = listenSocketTemp; 160 | 161 | return true; 162 | } 163 | 164 | static bool ProcessClientSocket(SOCKET clientSocket, std::string& messageFromClient) 165 | { 166 | FD_SET readSet; 167 | 168 | auto selRet = WaitForNewMesaageWithTimeout(clientSocket, readSet, 10, 0); 169 | if (selRet == SOCKET_ERROR) { 170 | LogDebug("Error occurred while using select() on socket."); 171 | return false; 172 | } 173 | else if (selRet == 0) { 174 | LogDebug("Waiting for message timeout."); 175 | return false; 176 | } 177 | 178 | if (FD_ISSET(clientSocket, &readSet)) { 179 | // Init messageBuffer with 0 180 | const int messageBufferSize = 2000; 181 | char messageBuffer[messageBufferSize]; 182 | ZeroMemory(messageBuffer, messageBufferSize); 183 | 184 | // Receive data from a connected or bound socket 185 | int nBytesRecv = recv(clientSocket, messageBuffer, messageBufferSize - 1, 0); 186 | 187 | if (SOCKET_ERROR == nBytesRecv) { 188 | LogDebug("Error occurred while receiving from socket."); 189 | 190 | closesocket(clientSocket); 191 | return false; 192 | } 193 | LogDebug("recv() successful."); 194 | 195 | messageFromClient = std::string(messageBuffer); 196 | 197 | if (socketMessageReceivedEvent) { 198 | socketMessageReceivedEvent(messageFromClient); 199 | } 200 | } 201 | 202 | // Send data to connected client 203 | std::string messageToClient = "Message received successfully"; 204 | int nBytesSent = send(clientSocket, messageToClient.c_str(), (int)messageToClient.length(), 0); 205 | 206 | if (SOCKET_ERROR == nBytesSent) { 207 | LogDebug("Error occurred while writing message to Client to socket."); 208 | 209 | closesocket(clientSocket); 210 | return false; 211 | } 212 | LogDebug("Send message to Client successful."); 213 | 214 | closesocket(clientSocket); 215 | 216 | return true; 217 | } 218 | 219 | /** 220 | * @brief Wait with timeout for new message. 221 | * 222 | * @return The cout of sockets that have data or SOCKET_ERROR 223 | */ 224 | static int WaitForNewMesaageWithTimeout(SOCKET clientSocket, FD_SET& readSet, long sec, long usec) 225 | { 226 | FD_ZERO(&readSet); 227 | FD_SET(clientSocket, &readSet); 228 | timeval timeoutTime; 229 | timeoutTime.tv_sec = sec; 230 | timeoutTime.tv_usec = usec; 231 | 232 | // NOTE: selRet has the cout of sockets that are ready 233 | auto selRet = select(NULL, &readSet, NULL, NULL, &timeoutTime); 234 | 235 | return selRet; 236 | } 237 | -------------------------------------------------------------------------------- /WhatsappTray/WinSockServer.h: -------------------------------------------------------------------------------- 1 | /* SPDX-License-Identifier: GPL-3.0-only */ 2 | /* Copyright(C) 2020 - 2020 WhatsappTray Sebastian Amann */ 3 | 4 | #pragma once 5 | 6 | #include 7 | #include 8 | 9 | bool SocketStart(char portString[]); 10 | void SocketNotifyOnNewMessage(const std::function& messageReceivedEvent); 11 | void SocketStopServer(); 12 | -------------------------------------------------------------------------------- /WhatsappTray/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by WhatsappTray.rc 4 | // 5 | #define IDD_ABOUT 101 6 | #define IDI_WHATSAPPTRAY 102 7 | #define IDC_VERSION_TEXT 1002 8 | 9 | // Next default values for new objects 10 | // 11 | #ifdef APSTUDIO_INVOKED 12 | #ifndef APSTUDIO_READONLY_SYMBOLS 13 | #define _APS_NEXT_RESOURCE_VALUE 103 14 | #define _APS_NEXT_COMMAND_VALUE 40001 15 | #define _APS_NEXT_CONTROL_VALUE 1003 16 | #define _APS_NEXT_SYMED_VALUE 101 17 | #endif 18 | #endif 19 | -------------------------------------------------------------------------------- /WhatsappTray/stdafx.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/WhatsappTray/stdafx.cpp -------------------------------------------------------------------------------- /WhatsappTray/stdafx.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/WhatsappTray/stdafx.h -------------------------------------------------------------------------------- /setupBuildfile.iss: -------------------------------------------------------------------------------- 1 | ; Script generated by the Inno Script Studio Wizard. 2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 3 | 4 | #define MyAppName "WhatsappTray" 5 | #define MyAppURL "https://github.com/D4koon/WhatsappTray" 6 | #define MyAppExeName "WhatsappTray.exe" 7 | #define PathToExe "bin\Release\" 8 | #define MyAppVersion GetVersionNumbersString(PathToExe + MyAppExeName) 9 | 10 | [Setup] 11 | ; NOTE: The value of AppId uniquely identifies this application. 12 | ; Do not use the same AppId value in installers for other applications. 13 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 14 | SetupIconFile=compiler:SetupClassicIcon.ico 15 | AppId={{1237D679-445B-4101-B7EC-B5081C5FA4A3} 16 | AppName={#MyAppName} 17 | AppVersion={#MyAppVersion} 18 | ;AppVerName={#MyAppName} {#MyAppVersion} 19 | AppPublisherURL={#MyAppURL} 20 | AppSupportURL={#MyAppURL} 21 | AppUpdatesURL={#MyAppURL} 22 | DefaultDirName={commonpf}\{#MyAppName} 23 | DefaultGroupName={#MyAppName} 24 | OutputBaseFilename=WhatsappTrayV{#MyAppVersion} 25 | Compression=lzma 26 | SolidCompression=yes 27 | 28 | [Languages] 29 | Name: "english"; MessagesFile: "compiler:Default.isl" 30 | 31 | [Tasks] 32 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 33 | 34 | ; The dirs-part is needed to set permisions for the folder so that the config file and the logs can be written. 35 | [Dirs] 36 | Name: "{app}"; Permissions: users-full 37 | 38 | [Files] 39 | Source: "{#PathToExe}WhatsappTray.exe"; DestDir: "{app}"; Flags: ignoreversion 40 | Source: "{#PathToExe}Hook.dll"; DestDir: "{app}"; Flags: ignoreversion 41 | Source: "README.md"; DestDir: "{app}"; Flags: ignoreversion 42 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 43 | 44 | [Icons] 45 | Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 46 | Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" 47 | Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 48 | 49 | [Run] 50 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 51 | -------------------------------------------------------------------------------- /setup_creator_binaries/Default.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 6.1.0+ English messages *** 2 | ; 3 | ; To download user-contributed translations of this file, go to: 4 | ; https://jrsoftware.org/files/istrans/ 5 | ; 6 | ; Note: When translating this text, do not add periods (.) to the end of 7 | ; messages that didn't have them already, because on those messages Inno 8 | ; Setup adds the periods automatically (appending a period would result in 9 | ; two periods being displayed). 10 | 11 | [LangOptions] 12 | ; The following three entries are very important. Be sure to read and 13 | ; understand the '[LangOptions] section' topic in the help file. 14 | LanguageName=English 15 | LanguageID=$0409 16 | LanguageCodePage=0 17 | ; If the language you are translating to requires special font faces or 18 | ; sizes, uncomment any of the following entries and change them accordingly. 19 | ;DialogFontName= 20 | ;DialogFontSize=8 21 | ;WelcomeFontName=Verdana 22 | ;WelcomeFontSize=12 23 | ;TitleFontName=Arial 24 | ;TitleFontSize=29 25 | ;CopyrightFontName=Arial 26 | ;CopyrightFontSize=8 27 | 28 | [Messages] 29 | 30 | ; *** Application titles 31 | SetupAppTitle=Setup 32 | SetupWindowTitle=Setup - %1 33 | UninstallAppTitle=Uninstall 34 | UninstallAppFullTitle=%1 Uninstall 35 | 36 | ; *** Misc. common 37 | InformationTitle=Information 38 | ConfirmTitle=Confirm 39 | ErrorTitle=Error 40 | 41 | ; *** SetupLdr messages 42 | SetupLdrStartupMessage=This will install %1. Do you wish to continue? 43 | LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted 44 | LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted 45 | HelpTextNote= 46 | 47 | ; *** Startup error messages 48 | LastErrorMessage=%1.%n%nError %2: %3 49 | SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. 50 | SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. 51 | SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. 52 | InvalidParameter=An invalid parameter was passed on the command line:%n%n%1 53 | SetupAlreadyRunning=Setup is already running. 54 | WindowsVersionNotSupported=This program does not support the version of Windows your computer is running. 55 | WindowsServicePackRequired=This program requires %1 Service Pack %2 or later. 56 | NotOnThisPlatform=This program will not run on %1. 57 | OnlyOnThisPlatform=This program must be run on %1. 58 | OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 59 | WinVersionTooLowError=This program requires %1 version %2 or later. 60 | WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. 61 | AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. 62 | PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. 63 | SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. 64 | UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. 65 | 66 | ; *** Startup questions 67 | PrivilegesRequiredOverrideTitle=Select Setup Install Mode 68 | PrivilegesRequiredOverrideInstruction=Select install mode 69 | PrivilegesRequiredOverrideText1=%1 can be installed for all users (requires administrative privileges), or for you only. 70 | PrivilegesRequiredOverrideText2=%1 can be installed for you only, or for all users (requires administrative privileges). 71 | PrivilegesRequiredOverrideAllUsers=Install for &all users 72 | PrivilegesRequiredOverrideAllUsersRecommended=Install for &all users (recommended) 73 | PrivilegesRequiredOverrideCurrentUser=Install for &me only 74 | PrivilegesRequiredOverrideCurrentUserRecommended=Install for &me only (recommended) 75 | 76 | ; *** Misc. errors 77 | ErrorCreatingDir=Setup was unable to create the directory "%1" 78 | ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files 79 | 80 | ; *** Setup common messages 81 | ExitSetupTitle=Exit Setup 82 | ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? 83 | AboutSetupMenuItem=&About Setup... 84 | AboutSetupTitle=About Setup 85 | AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 86 | AboutSetupNote= 87 | TranslatorNote= 88 | 89 | ; *** Buttons 90 | ButtonBack=< &Back 91 | ButtonNext=&Next > 92 | ButtonInstall=&Install 93 | ButtonOK=OK 94 | ButtonCancel=Cancel 95 | ButtonYes=&Yes 96 | ButtonYesToAll=Yes to &All 97 | ButtonNo=&No 98 | ButtonNoToAll=N&o to All 99 | ButtonFinish=&Finish 100 | ButtonBrowse=&Browse... 101 | ButtonWizardBrowse=B&rowse... 102 | ButtonNewFolder=&Make New Folder 103 | 104 | ; *** "Select Language" dialog messages 105 | SelectLanguageTitle=Select Setup Language 106 | SelectLanguageLabel=Select the language to use during the installation. 107 | 108 | ; *** Common wizard text 109 | ClickNext=Click Next to continue, or Cancel to exit Setup. 110 | BeveledLabel= 111 | BrowseDialogTitle=Browse For Folder 112 | BrowseDialogLabel=Select a folder in the list below, then click OK. 113 | NewFolderName=New Folder 114 | 115 | ; *** "Welcome" wizard page 116 | WelcomeLabel1=Welcome to the [name] Setup Wizard 117 | WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. 118 | 119 | ; *** "Password" wizard page 120 | WizardPassword=Password 121 | PasswordLabel1=This installation is password protected. 122 | PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. 123 | PasswordEditLabel=&Password: 124 | IncorrectPassword=The password you entered is not correct. Please try again. 125 | 126 | ; *** "License Agreement" wizard page 127 | WizardLicense=License Agreement 128 | LicenseLabel=Please read the following important information before continuing. 129 | LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. 130 | LicenseAccepted=I &accept the agreement 131 | LicenseNotAccepted=I &do not accept the agreement 132 | 133 | ; *** "Information" wizard pages 134 | WizardInfoBefore=Information 135 | InfoBeforeLabel=Please read the following important information before continuing. 136 | InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. 137 | WizardInfoAfter=Information 138 | InfoAfterLabel=Please read the following important information before continuing. 139 | InfoAfterClickLabel=When you are ready to continue with Setup, click Next. 140 | 141 | ; *** "User Information" wizard page 142 | WizardUserInfo=User Information 143 | UserInfoDesc=Please enter your information. 144 | UserInfoName=&User Name: 145 | UserInfoOrg=&Organization: 146 | UserInfoSerial=&Serial Number: 147 | UserInfoNameRequired=You must enter a name. 148 | 149 | ; *** "Select Destination Location" wizard page 150 | WizardSelectDir=Select Destination Location 151 | SelectDirDesc=Where should [name] be installed? 152 | SelectDirLabel3=Setup will install [name] into the following folder. 153 | SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. 154 | DiskSpaceGBLabel=At least [gb] GB of free disk space is required. 155 | DiskSpaceMBLabel=At least [mb] MB of free disk space is required. 156 | CannotInstallToNetworkDrive=Setup cannot install to a network drive. 157 | CannotInstallToUNCPath=Setup cannot install to a UNC path. 158 | InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share 159 | InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. 160 | DiskSpaceWarningTitle=Not Enough Disk Space 161 | DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? 162 | DirNameTooLong=The folder name or path is too long. 163 | InvalidDirName=The folder name is not valid. 164 | BadDirName32=Folder names cannot include any of the following characters:%n%n%1 165 | DirExistsTitle=Folder Exists 166 | DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? 167 | DirDoesntExistTitle=Folder Does Not Exist 168 | DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? 169 | 170 | ; *** "Select Components" wizard page 171 | WizardSelectComponents=Select Components 172 | SelectComponentsDesc=Which components should be installed? 173 | SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. 174 | FullInstallation=Full installation 175 | ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) 176 | CompactInstallation=Compact installation 177 | CustomInstallation=Custom installation 178 | NoUninstallWarningTitle=Components Exist 179 | NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? 180 | ComponentSize1=%1 KB 181 | ComponentSize2=%1 MB 182 | ComponentsDiskSpaceGBLabel=Current selection requires at least [gb] GB of disk space. 183 | ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. 184 | 185 | ; *** "Select Additional Tasks" wizard page 186 | WizardSelectTasks=Select Additional Tasks 187 | SelectTasksDesc=Which additional tasks should be performed? 188 | SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. 189 | 190 | ; *** "Select Start Menu Folder" wizard page 191 | WizardSelectProgramGroup=Select Start Menu Folder 192 | SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? 193 | SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. 194 | SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. 195 | MustEnterGroupName=You must enter a folder name. 196 | GroupNameTooLong=The folder name or path is too long. 197 | InvalidGroupName=The folder name is not valid. 198 | BadGroupName=The folder name cannot include any of the following characters:%n%n%1 199 | NoProgramGroupCheck2=&Don't create a Start Menu folder 200 | 201 | ; *** "Ready to Install" wizard page 202 | WizardReady=Ready to Install 203 | ReadyLabel1=Setup is now ready to begin installing [name] on your computer. 204 | ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. 205 | ReadyLabel2b=Click Install to continue with the installation. 206 | ReadyMemoUserInfo=User information: 207 | ReadyMemoDir=Destination location: 208 | ReadyMemoType=Setup type: 209 | ReadyMemoComponents=Selected components: 210 | ReadyMemoGroup=Start Menu folder: 211 | ReadyMemoTasks=Additional tasks: 212 | 213 | ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile 214 | DownloadingLabel=Downloading additional files... 215 | ButtonStopDownload=&Stop download 216 | StopDownload=Are you sure you want to stop the download? 217 | ErrorDownloadAborted=Download aborted 218 | ErrorDownloadFailed=Download failed: %1 %2 219 | ErrorDownloadSizeFailed=Getting size failed: %1 %2 220 | ErrorFileHash1=File hash failed: %1 221 | ErrorFileHash2=Invalid file hash: expected %1, found %2 222 | ErrorProgress=Invalid progress: %1 of %2 223 | ErrorFileSize=Invalid file size: expected %1, found %2 224 | 225 | ; *** "Preparing to Install" wizard page 226 | WizardPreparing=Preparing to Install 227 | PreparingDesc=Setup is preparing to install [name] on your computer. 228 | PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. 229 | CannotContinue=Setup cannot continue. Please click Cancel to exit. 230 | ApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. 231 | ApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications. 232 | CloseApplications=&Automatically close the applications 233 | DontCloseApplications=&Do not close the applications 234 | ErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing. 235 | PrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now? 236 | 237 | ; *** "Installing" wizard page 238 | WizardInstalling=Installing 239 | InstallingLabel=Please wait while Setup installs [name] on your computer. 240 | 241 | ; *** "Setup Completed" wizard page 242 | FinishedHeadingLabel=Completing the [name] Setup Wizard 243 | FinishedLabelNoIcons=Setup has finished installing [name] on your computer. 244 | FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts. 245 | ClickFinish=Click Finish to exit Setup. 246 | FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? 247 | FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? 248 | ShowReadmeCheck=Yes, I would like to view the README file 249 | YesRadio=&Yes, restart the computer now 250 | NoRadio=&No, I will restart the computer later 251 | ; used for example as 'Run MyProg.exe' 252 | RunEntryExec=Run %1 253 | ; used for example as 'View Readme.txt' 254 | RunEntryShellExec=View %1 255 | 256 | ; *** "Setup Needs the Next Disk" stuff 257 | ChangeDiskTitle=Setup Needs the Next Disk 258 | SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. 259 | PathLabel=&Path: 260 | FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. 261 | SelectDirectoryLabel=Please specify the location of the next disk. 262 | 263 | ; *** Installation phase messages 264 | SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. 265 | AbortRetryIgnoreSelectAction=Select action 266 | AbortRetryIgnoreRetry=&Try again 267 | AbortRetryIgnoreIgnore=&Ignore the error and continue 268 | AbortRetryIgnoreCancel=Cancel installation 269 | 270 | ; *** Installation status messages 271 | StatusClosingApplications=Closing applications... 272 | StatusCreateDirs=Creating directories... 273 | StatusExtractFiles=Extracting files... 274 | StatusCreateIcons=Creating shortcuts... 275 | StatusCreateIniEntries=Creating INI entries... 276 | StatusCreateRegistryEntries=Creating registry entries... 277 | StatusRegisterFiles=Registering files... 278 | StatusSavingUninstall=Saving uninstall information... 279 | StatusRunProgram=Finishing installation... 280 | StatusRestartingApplications=Restarting applications... 281 | StatusRollback=Rolling back changes... 282 | 283 | ; *** Misc. errors 284 | ErrorInternal2=Internal error: %1 285 | ErrorFunctionFailedNoCode=%1 failed 286 | ErrorFunctionFailed=%1 failed; code %2 287 | ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 288 | ErrorExecutingProgram=Unable to execute file:%n%1 289 | 290 | ; *** Registry errors 291 | ErrorRegOpenKey=Error opening registry key:%n%1\%2 292 | ErrorRegCreateKey=Error creating registry key:%n%1\%2 293 | ErrorRegWriteKey=Error writing to registry key:%n%1\%2 294 | 295 | ; *** INI errors 296 | ErrorIniEntry=Error creating INI entry in file "%1". 297 | 298 | ; *** File copying errors 299 | FileAbortRetryIgnoreSkipNotRecommended=&Skip this file (not recommended) 300 | FileAbortRetryIgnoreIgnoreNotRecommended=&Ignore the error and continue (not recommended) 301 | SourceIsCorrupted=The source file is corrupted 302 | SourceDoesntExist=The source file "%1" does not exist 303 | ExistingFileReadOnly2=The existing file could not be replaced because it is marked read-only. 304 | ExistingFileReadOnlyRetry=&Remove the read-only attribute and try again 305 | ExistingFileReadOnlyKeepExisting=&Keep the existing file 306 | ErrorReadingExistingDest=An error occurred while trying to read the existing file: 307 | FileExistsSelectAction=Select action 308 | FileExists2=The file already exists. 309 | FileExistsOverwriteExisting=&Overwrite the existing file 310 | FileExistsKeepExisting=&Keep the existing file 311 | FileExistsOverwriteOrKeepAll=&Do this for the next conflicts 312 | ExistingFileNewerSelectAction=Select action 313 | ExistingFileNewer2=The existing file is newer than the one Setup is trying to install. 314 | ExistingFileNewerOverwriteExisting=&Overwrite the existing file 315 | ExistingFileNewerKeepExisting=&Keep the existing file (recommended) 316 | ExistingFileNewerOverwriteOrKeepAll=&Do this for the next conflicts 317 | ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: 318 | ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: 319 | ErrorReadingSource=An error occurred while trying to read the source file: 320 | ErrorCopying=An error occurred while trying to copy a file: 321 | ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: 322 | ErrorRestartReplace=RestartReplace failed: 323 | ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: 324 | ErrorRegisterServer=Unable to register the DLL/OCX: %1 325 | ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 326 | ErrorRegisterTypeLib=Unable to register the type library: %1 327 | 328 | ; *** Uninstall display name markings 329 | ; used for example as 'My Program (32-bit)' 330 | UninstallDisplayNameMark=%1 (%2) 331 | ; used for example as 'My Program (32-bit, All users)' 332 | UninstallDisplayNameMarks=%1 (%2, %3) 333 | UninstallDisplayNameMark32Bit=32-bit 334 | UninstallDisplayNameMark64Bit=64-bit 335 | UninstallDisplayNameMarkAllUsers=All users 336 | UninstallDisplayNameMarkCurrentUser=Current user 337 | 338 | ; *** Post-installation errors 339 | ErrorOpeningReadme=An error occurred while trying to open the README file. 340 | ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. 341 | 342 | ; *** Uninstaller messages 343 | UninstallNotFound=File "%1" does not exist. Cannot uninstall. 344 | UninstallOpenError=File "%1" could not be opened. Cannot uninstall 345 | UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall 346 | UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log 347 | ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? 348 | UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. 349 | OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. 350 | UninstallStatusLabel=Please wait while %1 is removed from your computer. 351 | UninstalledAll=%1 was successfully removed from your computer. 352 | UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. 353 | UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? 354 | UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall 355 | 356 | ; *** Uninstallation phase messages 357 | ConfirmDeleteSharedFileTitle=Remove Shared File? 358 | ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. 359 | SharedFileNameLabel=File name: 360 | SharedFileLocationLabel=Location: 361 | WizardUninstalling=Uninstall Status 362 | StatusUninstalling=Uninstalling %1... 363 | 364 | ; *** Shutdown block reasons 365 | ShutdownBlockReasonInstallingApp=Installing %1. 366 | ShutdownBlockReasonUninstallingApp=Uninstalling %1. 367 | 368 | ; The custom messages below aren't used by Setup itself, but if you make 369 | ; use of them in your scripts, you'll want to translate them. 370 | 371 | [CustomMessages] 372 | 373 | NameAndVersion=%1 version %2 374 | AdditionalIcons=Additional shortcuts: 375 | CreateDesktopIcon=Create a &desktop shortcut 376 | CreateQuickLaunchIcon=Create a &Quick Launch shortcut 377 | ProgramOnTheWeb=%1 on the Web 378 | UninstallProgram=Uninstall %1 379 | LaunchProgram=Launch %1 380 | AssocFileExtension=&Associate %1 with the %2 file extension 381 | AssocingFileExtension=Associating %1 with the %2 file extension... 382 | AutoStartProgramGroupDescription=Startup: 383 | AutoStartProgram=Automatically start %1 384 | AddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway? 385 | -------------------------------------------------------------------------------- /setup_creator_binaries/ISCC.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/ISCC.exe -------------------------------------------------------------------------------- /setup_creator_binaries/ISCmplr.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/ISCmplr.dll -------------------------------------------------------------------------------- /setup_creator_binaries/ISCrypt.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/ISCrypt.dll -------------------------------------------------------------------------------- /setup_creator_binaries/ISPP.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/ISPP.dll -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Armenian.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 6.1.0+ Armenian messages *** 2 | ; 3 | ; Armenian translation by Hrant Ohanyan 4 | ; E-mail: h.ohanyan@haysoft.org 5 | ; Translation home page: http://www.haysoft.org 6 | ; Last modification date: 2020-10-06 7 | ; 8 | [LangOptions] 9 | LanguageName=Հայերեն 10 | LanguageID=$042B 11 | LanguageCodePage=0 12 | ; If the language you are translating to requires special font faces or 13 | ; sizes, uncomment any of the following entries and change them accordingly. 14 | ;DialogFontName= 15 | ;DialogFontSize=8 16 | ;WelcomeFontName=Verdana 17 | ;WelcomeFontSize=12 18 | ;TitleFontName=Arial 19 | ;TitleFontSize=29 20 | ;CopyrightFontName=Arial 21 | ;CopyrightFontSize=8 22 | 23 | [Messages] 24 | 25 | ; *** Application titles 26 | SetupAppTitle=Տեղադրում 27 | SetupWindowTitle=%1-ի տեղադրում 28 | UninstallAppTitle=Ապատեղադրում 29 | UninstallAppFullTitle=%1-ի ապատեղադրում 30 | 31 | ; *** Misc. common 32 | InformationTitle=Տեղեկություն 33 | ConfirmTitle=Հաստատել 34 | ErrorTitle=Սխալ 35 | 36 | ; *** SetupLdr messages 37 | SetupLdrStartupMessage=Այս ծրագիրը կտեղադրի %1-ը Ձեր համակարգչում։ Շարունակե՞լ։ 38 | LdrCannotCreateTemp=Հնարավոր չէ ստեղծել ժամանակավոր ֆայլ։ Տեղադրումը կասեցված է 39 | LdrCannotExecTemp=Հնարավոր չէ կատարել ֆայլը ժամանակավոր պանակից։ Տեղադրումը կասեցված է 40 | 41 | ; *** Startup error messages 42 | LastErrorMessage=%1.%n%nՍխալ %2: %3 43 | SetupFileMissing=%1 ֆայլը բացակայում է տեղադրման պանակից։ Ուղղեք խնդիրը կամ ստացեք ծրագրի նոր տարբերակը։ 44 | SetupFileCorrupt=Տեղադրվող ֆայլերը վնասված են։ 45 | SetupFileCorruptOrWrongVer=Տեղադրվող ֆայլերը վնասված են կամ անհամատեղելի են տեղակայիչի այս տարբերակի հետ։ Ուղղեք խնդիրը կամ ստացեք ծրագրի նոր տարբերակը։ 46 | InvalidParameter=Հրամանատողում նշված է սխալ հրաման.%n%n%1 47 | SetupAlreadyRunning=Տեղակայիչը արդեն աշխատեցված է։ 48 | WindowsVersionNotSupported=Ծրագիրը չի աջակցում այս համակարգչում աշխատող Windows-ի տարբերակը։ 49 | WindowsServicePackRequired=Ծրագիրը պահանջում է %1-ի Service Pack %2 կամ ավելի նոր։ 50 | NotOnThisPlatform=Այս ծրագիրը չի աշխատի %1-ում։ 51 | OnlyOnThisPlatform=Այս ծրագիրը հնարավոր է բացել միայն %1-ում։ 52 | OnlyOnTheseArchitectures=Այս ծրագրի տեղադրումը հնարավոր է միայն Windows-ի մշակիչի հետևյալ կառուցվածքներում՝ %n%n%1 53 | WinVersionTooLowError=Այս ծրագիրը պահանջում է %1-ի տարբերակ %2 կամ ավելի նորը։ 54 | WinVersionTooHighError=Ծրագիրը չի կարող տեղադրվել %1-ի տարբերակ %2 կամ ավելի նորում 55 | AdminPrivilegesRequired=Ծրագիրը տեղադրելու համար պահանջվում են Վարիչի իրավունքներ։ 56 | PowerUserPrivilegesRequired=Ծրագիրը տեղադրելու համար պետք է մուտք գործել համակարգ որպես Վարիչ կամ «Փորձառու օգտագործող» (Power Users): 57 | SetupAppRunningError=Տեղակայիչը հայտնաբերել է, որ %1-ը աշխատում է։%n%nՓակեք այն և սեղմեք «Լավ»՝ շարունակելու համար կամ «Չեղարկել»՝ փակելու համար։ 58 | UninstallAppRunningError=Ապատեղադրող ծրագիրը հայտնաբերել է, որ %1-ը աշխատում է։%n%nՓակեք այն և սեղմեք «Լավ»՝ շարունակելու համար կամ «Չեղարկել»՝ փակելու համար։ 59 | 60 | ; *** Startup questions 61 | PrivilegesRequiredOverrideTitle=Ընտրեք տեղակայիչի տեղադրման կերպը 62 | PrivilegesRequiredOverrideInstruction=Ընտրեք տեղադրման կերպը 63 | PrivilegesRequiredOverrideText1=%1-ը կարող է տեղադրվել բոլոր օգտվողների համար (պահանջում է վարիչի արտոնություններ) կամ միայն ձեզ համար: 64 | PrivilegesRequiredOverrideText2=%1-ը կարող է տեղադրվել միայն ձեզ համար կամ բոլոր օգտվողների համար (պահանջում է վարիչի արտոնություններ): 65 | PrivilegesRequiredOverrideAllUsers=Տեղադրել &բոլոր օգտվողների համար 66 | PrivilegesRequiredOverrideAllUsersRecommended=Տեղադրել &բոլոր օգտվողների համար (հանձնարարելի) 67 | PrivilegesRequiredOverrideCurrentUser=Տեղադրել միայն &ինձ համար 68 | PrivilegesRequiredOverrideCurrentUserRecommended=Տեղադրել միայն &ինձ համար (հանձնարարելի) 69 | 70 | ; *** Misc. errors 71 | ErrorCreatingDir=Հնարավոր չէ ստեղծել "%1" պանակը 72 | ErrorTooManyFilesInDir=Հնարավոր չէ ստեղծել ֆայլ "%1" պանակում, որովհետև նրանում կան չափից ավելի շատ ֆայլեր 73 | 74 | ; *** Setup common messages 75 | ExitSetupTitle=Տեղակայման ընդհատում 76 | ExitSetupMessage=Տեղակայումը չի ավարատվել։ Եթե ընդհատեք, ապա ծրագիրը չի տեղադրվի։%n%nԱվարտե՞լ։ 77 | AboutSetupMenuItem=&Ծրագրի մասին... 78 | AboutSetupTitle=Ծրագրի մասին 79 | AboutSetupMessage=%1, տարբերակ՝ %2%n%3%n%nՎեբ կայք՝ %1:%n%4 80 | AboutSetupNote= 81 | TranslatorNote=Armenian translation by Hrant Ohanyan »»» http://www.haysoft.org 82 | 83 | ; *** Buttons 84 | ButtonBack=« &Նախորդ 85 | ButtonNext=&Հաջորդ » 86 | ButtonInstall=&Տեղադրել 87 | ButtonOK=Լավ 88 | ButtonCancel=Չեղարկել 89 | ButtonYes=&Այո 90 | ButtonYesToAll=Այո բոլորի &համար 91 | ButtonNo=&Ոչ 92 | ButtonNoToAll=Ո&չ բոլորի համար 93 | ButtonFinish=&Ավարտել 94 | ButtonBrowse=&Ընտրել... 95 | ButtonWizardBrowse=&Ընտրել... 96 | ButtonNewFolder=&Ստեղծել պանակ 97 | 98 | ; *** "Select Language" dialog messages 99 | SelectLanguageTitle=Ընտրել տեղակայիչի լեզուն 100 | SelectLanguageLabel=Ընտրեք այն լեզուն, որը օգտագործվելու է տեղադրման ընթացքում: 101 | 102 | ; *** Common wizard text 103 | ClickNext=Սեղմեք «Հաջորդ»՝ շարունակելու համար կամ «Չեղարկել»՝ տեղակայիչը փակելու համար։ 104 | BeveledLabel= 105 | BrowseDialogTitle=Ընտրել պանակ 106 | BrowseDialogLabel=Ընտրեք պանակը ցանկից և սեղմեք «Լավ»։ 107 | NewFolderName=Նոր պանակ 108 | 109 | ; *** "Welcome" wizard page 110 | WelcomeLabel1=Ձեզ ողջունում է [name]-ի տեղակայման օգնականը 111 | WelcomeLabel2=Ծրագիրը կտեղադրի [name/ver]-ը Ձեր համակարգչում։%n%nՇարունակելուց առաջ խորհուրդ ենք տալիս փակել բոլոր աշխատող ծրագրերը։ 112 | 113 | ; *** "Password" wizard page 114 | WizardPassword=Գաղտնաբառ 115 | PasswordLabel1=Ծրագիրը պաշտպանված է գաղտնաբառով։ 116 | PasswordLabel3=Մուտքագրեք գաղտնաբառը և սեղմեք «Հաջորդ»։ 117 | PasswordEditLabel=&Գաղտնաբառ. 118 | IncorrectPassword=Մուտքագրված գաղտնաբառը սխալ է, կրկին փորձեք։ 119 | 120 | ; *** "License Agreement" wizard page 121 | WizardLicense=Արտոնագրային համաձայնագիր 122 | LicenseLabel=Խնդրում ենք շարունակելուց առաջ կարդալ հետևյալ տեղեկությունը։ 123 | LicenseLabel3=Կարդացեք արտոնագրային համաձայնագիրը։ Շարունակելուց առաջ պետք է ընդունեք նշված պայմանները։ 124 | LicenseAccepted=&Ընդունում եմ արտոնագրային համաձայնագիրը 125 | LicenseNotAccepted=&Չեմ ընդունում արտոնագրային համաձայնագիրը 126 | 127 | ; *** "Information" wizard pages 128 | WizardInfoBefore=Տեղեկություն 129 | InfoBeforeLabel=Շարունակելուց առաջ կարդացեք այս տեղեկությունը։ 130 | InfoBeforeClickLabel=Եթե պատրաստ եք սեղմեք «Հաջորդը»։ 131 | WizardInfoAfter=Տեղեկություն 132 | InfoAfterLabel=Շարունակելուց առաջ կարդացեք այս տեղեկությունը։ 133 | InfoAfterClickLabel=Երբ պատրաստ լինեք շարունակելու՝ սեղմեք «Հաջորդ»։ 134 | 135 | ; *** "User Information" wizard page 136 | WizardUserInfo=Տեղեկություն օգտվողի մասին 137 | UserInfoDesc=Գրեք տվյալներ Ձեր մասին 138 | UserInfoName=&Օգտվողի անուն և ազգանուն. 139 | UserInfoOrg=&Կազմակերպություն. 140 | UserInfoSerial=&Հերթական համար. 141 | UserInfoNameRequired=Պետք է գրեք Ձեր անունը։ 142 | 143 | ; *** "Select Destination Location" wizard page 144 | WizardSelectDir=Ընտրել տեղակադրման պանակը 145 | SelectDirDesc=Ո՞ր պանակում տեղադրել [name]-ը։ 146 | SelectDirLabel3=Ծրագիրը կտեղադրի [name]-ը հետևյալ պանակում։ 147 | SelectDirBrowseLabel=Սեղմեք «Հաջորդ»՝ շարունակելու համար։ Եթե ցանկանում եք ընտրել այլ պանակ՝ սեղմեք «Ընտրել»։ 148 | DiskSpaceGBLabel=Առնվազն [gb] ԳԲ ազատ տեղ է պահանջվում: 149 | DiskSpaceMBLabel=Առնվազն [mb] ՄԲ ազատ տեղ է պահանջվում: 150 | CannotInstallToNetworkDrive=Հնարավոր չէ տեղադրել Ցանցային հիշասարքում։ 151 | CannotInstallToUNCPath=Հնարավոր չէ տեղադրել UNC ուղիում։ 152 | InvalidPath=Պետք է նշեք ամբողջական ուղին՝ հիշասարքի տառով, օրինակ՝%n%nC:\APP%n%nկամ UNC ուղի՝ %n%n\\սպասարկիչի_անունը\ռեսուրսի_անունը 153 | InvalidDrive=Ընտրված հիշասարքը կամ ցանցային ուղին գոյություն չունեն կամ անհասանելի են։ Ընտրեք այլ ուղի։ 154 | DiskSpaceWarningTitle=Չկա պահանջվող չափով ազատ տեղ 155 | DiskSpaceWarning=Առնվազն %1 ԿԲ ազատ տեղ է պահանջվում, մինչդեռ հասանելի է ընդամենը %2 ԿԲ։%n%nԱյնուհանդերձ, շարունակե՞լ։ 156 | DirNameTooLong=Պանակի անունը կամ ուղին երկար են: 157 | InvalidDirName=Պանակի նշված անունը անընդունելի է։ 158 | BadDirName32=Անվան մեջ չպետք է լինեն հետևյալ գրանշանները՝ %n%n%1 159 | DirExistsTitle=Թղթապանակը գոյություն ունի 160 | DirExists=%n%n%1%n%n պանակը արդեն գոյություն ունի։ Այնուհանդերձ, տեղադրե՞լ այստեղ։ 161 | DirDoesntExistTitle=Պանակ գոյություն չունի 162 | DirDoesntExist=%n%n%1%n%n պանակը գոյություն չունի։ Ստեղծե՞լ այն։ 163 | 164 | ; *** "Select Components" wizard page 165 | WizardSelectComponents=Ընտրել բաղադրիչներ 166 | SelectComponentsDesc=Ո՞ր ֆայլերը պետք է տեղադրվեն։ 167 | SelectComponentsLabel2=Նշեք այն ֆայլերը, որոնք պետք է տեղադրվեն, ապանշեք նրանք, որոնք չպետք է տեղադրվեն։ Սեղմեք «Հաջորդ»՝ շարունակելու համար։ 168 | FullInstallation=Լրիվ տեղադրում 169 | ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) 170 | CompactInstallation=Սեղմված տեղադրում 171 | CustomInstallation=Ընտրովի տեղադրում 172 | NoUninstallWarningTitle=Տեղակայվող ֆայլերը 173 | NoUninstallWarning=Տեղակայիչ ծրագիրը հայտնաբերել է, որ հետևյալ բաղադրիչները արդեն տեղադրված են Ձեր համակարգչում։ %n%n%1%n%nԱյս բաղադրիչների ընտրության վերակայումը չի ջնջի դրանք։%n%nՇարունակե՞լ։ 174 | ComponentSize1=%1 ԿԲ 175 | ComponentSize2=%1 ՄԲ 176 | ComponentsDiskSpaceGBLabel=Ընթացիկ ընտրումը պահանջում է առնվազն [gb] ԳԲ տեղ հիշասարքում: 177 | ComponentsDiskSpaceMBLabel=Տվյալ ընտրությունը պահանջում է ամենաքիչը [mb] ՄԲ տեղ հիշասարքում: 178 | 179 | ; *** "Select Additional Tasks" wizard page 180 | WizardSelectTasks=Լրացուցիչ առաջադրանքներ 181 | SelectTasksDesc=Ի՞նչ լրացուցիչ առաջադրանքներ պետք է կատարվեն։ 182 | SelectTasksLabel2=Ընտրեք լրացուցիչ առաջադրանքներ, որոնք պետք է կատարվեն [name]-ի տեղադրման ընթացքում, ապա սեղմեք «Հաջորդ». 183 | 184 | ; *** "Select Start Menu Folder" wizard page 185 | WizardSelectProgramGroup=Ընտրել «Մեկնարկ» ցանկի պանակը 186 | SelectStartMenuFolderDesc=Որտե՞ղ ստեղծել դյուրանցումներ. 187 | SelectStartMenuFolderLabel3=Ծրագիրը կստեղծի դյուրանցումներ «Մեկնարկ» ցանկի հետևյալ պանակում։ 188 | SelectStartMenuFolderBrowseLabel=Սեղմեք «Հաջորդ»՝ շարունակելու համար։ Եթե ցանկանում եք ընտրեք այլ պանակ՝ սեղմեք «Ընտրել»։ 189 | MustEnterGroupName=Պետք է գրել պանակի անունը։ 190 | GroupNameTooLong=Պանակի անունը կամ ուղին շատ երկար են։ 191 | InvalidGroupName=Նշված անունը անընդունելի է։ 192 | BadGroupName=Անվան մեջ չպետք է լինեն հետևյալ գրանշանները՝ %n%n%1 193 | NoProgramGroupCheck2=&Չստեղծել պանակ «Մեկնարկ» ցանկում 194 | 195 | ; *** "Ready to Install" wizard page 196 | WizardReady=Պատրաստ է 197 | ReadyLabel1=Տեղակայիչը պատրաստ է սկսել [name]-ի տեղադրումը։ 198 | ReadyLabel2a=Սեղմեք «Տեղադրել»՝ շարունակելու համար կամ «Նախորդ»՝ եթե ցանկանում եք դիտել կամ փոփոխել տեղադրելու կարգավորումները։ 199 | ReadyLabel2b=Սեղմեք «Տեղադրել»՝ շարունակելու համար։ 200 | ReadyMemoUserInfo=Տեղեկություն օգտվողի մասին. 201 | ReadyMemoDir=Տեղադրելու պանակ. 202 | ReadyMemoType=Տեղադրման ձև. 203 | ReadyMemoComponents=Ընտրված բաղադրիչներ. 204 | ReadyMemoGroup=Թղթապանակ «Մեկնարկ» ցանկում. 205 | ReadyMemoTasks=Լրացուցիչ առաջադրանքներ. 206 | ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile 207 | DownloadingLabel=Լրացուցիչ ֆայլերի ներբեռնում... 208 | ButtonStopDownload=&Կանգնեցնել ներբեռնումը 209 | StopDownload=Համոզվա՞ծ եք, որ պետք է կանգնեցնել ներբեռնումը: 210 | ErrorDownloadAborted=Ներբեռնումը կասեցված է 211 | ErrorDownloadFailed=Ներբեռնումը ձախողվեց. %1 %2 212 | ErrorDownloadSizeFailed=Չափի ստացումը ձախողվեց. %1 %2 213 | ErrorFileHash1=Ֆահլի հաշվեգումարը ձախողվեց. %1 214 | ErrorFileHash2=Ֆայլի անվավեր հաշվեգումար. ակընկալվում էր %1, գտնվել է %2 215 | ErrorProgress=Անվավեր ընթացք. %1-ը %2-ից 216 | ErrorFileSize=Ֆայլի անվավեր աչփ. ակընկալվում էր %1, գտնվել է %2 217 | ; *** "Preparing to Install" wizard page 218 | WizardPreparing=Նախատրաստում է տեղադրումը 219 | PreparingDesc=Տեղակայիչը պատրաստվում է տեղադրել [name]-ը ձեր համակարգչում։ 220 | PreviousInstallNotCompleted=Այլ ծրագրի տեղադրումը կամ ապատեղադրումը չի ավարտվել։ Այն ավարտելու համար պետք է վերամեկնարկեք համակարգիչը։%n%nՎերամեկնարկելուց հետո կրկին բացեք տեղակայման փաթեթը՝ [name]-ի տեղադրումը ավարտելու համար։ 221 | CannotContinue=Հնարավոր չէ շարունակել։ Սեղմեք «Չեղարկել»՝ ծրագիրը փակելու համար։ 222 | ApplicationsFound=Հետևյալ ծրագրերը օգտագործում են ֆայլեր, որոնք պետք է թարմացվեն տեղակայիչի կողմից։ Թույլատրեք տեղակայիչին ինքնաբար փակելու այդ ծրագրերը։ 223 | ApplicationsFound2=Հետևյալ ծրագրերը օգտագործում են ֆայլեր, որոնք պետք է թարմացվեն տեղակայիչի կողմից։ Թույլատրեք տեղակայիչին ինքնաբար փակելու այդ ծրագրերը։ Տեղադրումը ավարտելուց հետո տեղակայիչը կփորձի վերամեկնարկել այդ ծրագրերը։ 224 | CloseApplications=&Ինքնաբար փակել ծրագրերը 225 | DontCloseApplications=&Չփակել ծրագրերը 226 | ErrorCloseApplications=Տեղակայիչը չկարողացավ ինքնաբար փակել բոլոր ծրագրերը: Խորհուրդ ենք տալիս փակել այն բոլոր ծրագրերը, որոնք պետք է թարմացվեն տեղակայիչի կողմից: 227 | PrepareToInstallNeedsRestart=Տեղակայիչը պետք է վերամեկնարկի ձեր համակարգիչը: Դրանից հետո կրկին աշխատեցրեք այն՝ ավարտելու համար [name]-ի տեղադրումը:%n%nՑանկանո՞ւմ եք վերամեկնարկել հիմա: 228 | 229 | ; *** "Installing" wizard page 230 | WizardInstalling=Տեղադրում 231 | InstallingLabel=Խնդրում ենք սպասել մինչ [name]-ը կտեղադրվի Ձեր համակարգչում։ 232 | 233 | ; *** "Setup Completed" wizard page 234 | FinishedHeadingLabel=[name]-ի տեղադրման ավարտ 235 | FinishedLabelNoIcons=[name] ծրագիրը տեղադրվել է Ձեր համակարգչում։ 236 | FinishedLabel=[name] ծրագիրը տեղադրվել է Ձեր համակարգչում։ 237 | ClickFinish=Սեղմեք «Ավարտել»՝ տեղակայիչը փակելու համար։ 238 | FinishedRestartLabel=[name]-ի տեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։ վերամեկնարկե՞լ հիմա։ 239 | FinishedRestartMessage=[name]-ի տեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։ %n%վերամեկնարկե՞լ հիմա։ 240 | ShowReadmeCheck=Նայել README ֆայլը։ 241 | YesRadio=&Այո, վերամեկնարկել 242 | NoRadio=&Ոչ, ես հետո վերամեկնարկեմ 243 | ; used for example as 'Run MyProg.exe' 244 | RunEntryExec=Աշխատեցնել %1-ը 245 | ; used for example as 'View Readme.txt' 246 | RunEntryShellExec=Նայել %1-ը 247 | 248 | ; *** "Setup Needs the Next Disk" stuff 249 | ChangeDiskTitle=Տեղակայիչը պահանջում է հաջորդ սկավառակը 250 | SelectDiskLabel2=Զետեղեք %1 սկավառակը և սեղմեք «Լավ»։ %n%nԵթե ֆայլերի պանակը գտնվում է այլ տեղ, ապա ընտրեք ճիշտ ուղին կամ սեղմեք «Ընտրել»։ 251 | PathLabel=&Ուղին. 252 | FileNotInDir2="%1" ֆայլը չի գտնվել "%2"-ում։ Զետեղեք ճիշտ սկավառակ կամ ընտրեք այլ պանակ։ 253 | SelectDirectoryLabel=Խնդրում ենք նշել հաջորդ սկավառակի տեղադրությունը։ 254 | 255 | ; *** Installation phase messages 256 | SetupAborted=Տեղակայումը չի ավարտվել։ %n%nՈւղղեք խնդիրը և կրկին փորձեք։ 257 | AbortRetryIgnoreSelectAction=Ընտրեք գործողություն 258 | AbortRetryIgnoreRetry=&Կրկին փորձել 259 | AbortRetryIgnoreIgnore=&Անտեսել սխալը և շարունակել 260 | AbortRetryIgnoreCancel=Չեղարկել տեղադրումը 261 | 262 | ; *** Installation status messages 263 | StatusClosingApplications=Փակում է ծրագրերը... 264 | StatusCreateDirs=Պանակների ստեղծում... 265 | StatusExtractFiles=Ֆայլերի դուրս բերում... 266 | StatusCreateIcons=Դյուրանցումների ստեղծում... 267 | StatusCreateIniEntries=INI ֆայլերի ստեղծում... 268 | StatusCreateRegistryEntries=Գրանցամատյանի գրանցումների ստեղծում... 269 | StatusRegisterFiles=Ֆայլերի գրանցում... 270 | StatusSavingUninstall=Ապատեղադրելու տեղեկության պահում... 271 | StatusRunProgram=Տեղադրելու ավարտ... 272 | StatusRestartingApplications=Ծրագրերի վերամեկնարկում... 273 | StatusRollback=Փոփոխությունների հետ բերում... 274 | 275 | ; *** Misc. errors 276 | ErrorInternal2=Ներքին սխալ %1 277 | ErrorFunctionFailedNoCode=%1. վթար 278 | ErrorFunctionFailed=%1. վթար, կոդը՝ %2 279 | ErrorFunctionFailedWithMessage=%1. վթար, կոդը՝ %2.%n%3 280 | ErrorExecutingProgram=Հնարավոր չէ կատարել %n%1 ֆայլը 281 | 282 | ; *** Registry errors 283 | ErrorRegOpenKey=Գրանցամատյանի բանալին բացելու սխալ՝ %n%1\%2 284 | ErrorRegCreateKey=Գրանցամատյանի բանալին ստեղծելու սխալ՝ %n%1\%2 285 | ErrorRegWriteKey=Գրանցամատյանի բանալիում գրանցում կատարելու սխալ՝ %n%1\%2 286 | 287 | ; *** INI errors 288 | ErrorIniEntry=Սխալ՝ "%1" INI ֆայլում գրառում կատարելիս։ 289 | 290 | ; *** File copying errors 291 | FileAbortRetryIgnoreSkipNotRecommended=Բաց թողնել այս ֆայլը (խորհուրդ չի տրվում) 292 | FileAbortRetryIgnoreIgnoreNotRecommended=Անտեսել սխալը և շարունակել (խորհուրդ չի տրվում) 293 | SourceIsCorrupted=Սկզբնական ֆայլը վնասված է։ 294 | SourceDoesntExist=Սկզբնական "%1" ֆայլը գոյություն չունի 295 | ExistingFileReadOnly2=Առկա ֆայլը չի կարող փոխարինվել, քանի որ այն նշված է որպես միայն կարդալու: 296 | ExistingFileReadOnlyRetry=&Հեռացրեք միայն կարդալ հատկանիշը և կրկին փորձեք 297 | ExistingFileReadOnlyKeepExisting=&Պահել առկա ֆայլը 298 | ErrorReadingExistingDest=Սխալ՝ ֆայլը կարդալիս. 299 | FileExistsSelectAction=Ընտրեք գործողություն 300 | FileExists2=Ֆայլը գոյություն չունի 301 | FileExistsOverwriteExisting=&Վրագրել առկա ֆայլը 302 | FileExistsKeepExisting=&Պահել առկա ֆայլը 303 | FileExistsOverwriteOrKeepAll=&Անել սա հաջորդ բախման ժամանակ 304 | ExistingFileNewerSelectAction=Ընտրեք գործողություն 305 | ExistingFileNewer2=Առկա ֆայլը ավելի նոր է, քան այն, որ տեղակայիչը փորձում է տեղադրել: 306 | ExistingFileNewerOverwriteExisting=&Վրագրել առկա ֆայլը 307 | ExistingFileNewerKeepExisting=&Պահել առկա ֆայլը (հանձնարարելի) 308 | ExistingFileNewerOverwriteOrKeepAll=&Անել սա հաջորդ բախման ժամանակ 309 | ErrorChangingAttr=Սխալ՝ ընթացիկ ֆայլի հատկանիշները փոխելիս. 310 | ErrorCreatingTemp=Սխալ՝ նշված պանակում ֆայլ ստեղծելիս. 311 | ErrorReadingSource=Սխալ՝ ֆայլը կարդալիս. 312 | ErrorCopying=Սխալ՝ ֆայլը պատճենելիս. 313 | ErrorReplacingExistingFile=Սխալ՝ գոյություն ունեցող ֆայլը փոխարինելիս. 314 | ErrorRestartReplace=RestartReplace ձախողում. 315 | ErrorRenamingTemp=Սխալ՝ նպատակակետ պանակում՝ ֆայլը վերանվանելիս. 316 | ErrorRegisterServer=Հնարավոր չէ գրանցել DLL/OCX-ը. %1 317 | ErrorRegSvr32Failed=RegSvr32-ի ձախողում, կոդ՝ %1 318 | ErrorRegisterTypeLib=Հնարավոր չէ գրանցել դարանները՝ %1 319 | ; *** Uninstall display name markings 320 | ; used for example as 'My Program (32-bit)' 321 | UninstallDisplayNameMark=%1 (%2) 322 | ; used for example as 'My Program (32-bit, All users)' 323 | UninstallDisplayNameMarks=%1 (%2, %3) 324 | UninstallDisplayNameMark32Bit=32 բիթային 325 | UninstallDisplayNameMark64Bit=64 բիթային 326 | UninstallDisplayNameMarkAllUsers=Բոլոր օգտվողները 327 | UninstallDisplayNameMarkCurrentUser=Ընթացիկ օգտվողը 328 | 329 | ; *** Post-installation errors 330 | ErrorOpeningReadme=Սխալ՝ README ֆայլը բացելիս։ 331 | ErrorRestartingComputer=Հնարավոր չեղավ վերամեկնարկել համակարգիչը։ Ինքներդ փորձեք։ 332 | 333 | ; *** Uninstaller messages 334 | UninstallNotFound="%1" ֆայլը գոյություն չունի։ Հնարավոր չէ ապատեղադրել։ 335 | UninstallOpenError="%1" ֆայլը հնարավոր չէ բացել: Հնարավոր չէ ապատեղադրել 336 | UninstallUnsupportedVer=Ապատեղադրելու "%1" մատյանի ֆայլը անճանաչելի է ապատեղադրող ծրագրի այս տարբերակի համար։ Հնարավոր չէ ապատեղադրել 337 | UninstallUnknownEntry=Անհայտ գրառում է (%1)՝ հայնաբերվել ապատեղադրելու մատյանում 338 | ConfirmUninstall=Ապատեղադրե՞լ %1-ը և նրա բոլոր բաղադրիչները։ 339 | UninstallOnlyOnWin64=Հնարավոր է ապատեղադրել միայն 64 բիթանոց Windows-ում։ 340 | OnlyAdminCanUninstall=Հնարավոր է ապատեղադրել միայն Ադմինի իրավունքներով։ 341 | UninstallStatusLabel=Խնդրում ենք սպասել, մինչև %1-ը ապատեղադրվում է Ձեր համակարգչից։ 342 | UninstalledAll=%1 ծրագիրը ապատեղադրվել է համակարգչից։ 343 | UninstalledMost=%1-ը ապատեղադրվեց Ձեր համակարգչից։%n%nՈրոշ ֆայլեր հնարավոր չեղավ հեռացնել։ Ինքներդ հեռացրեք դրանք։ 344 | UninstalledAndNeedsRestart=%1-ի ապատեղադրումը ավարտելու համար պետք է վերամեկնարկել համակարգիչը։%n%nՎերամեկնարկե՞լ։ 345 | UninstallDataCorrupted="%1" ֆայլը վնասված է։ Հնարավոր չէ ապատեղադրել 346 | 347 | ; *** Uninstallation phase messages 348 | ConfirmDeleteSharedFileTitle=Հեռացնե՞լ համատեղ օգտագործվող ֆայլը։ 349 | ConfirmDeleteSharedFile2=Համակարգը նշում է, որ հետևյալ համատեղ օգտագործվող ֆայլը այլևս չի օգտագործվում այլ ծրագրի կողմից։ Ապատեղադրե՞լ այն։ %n%nԵթե համոզված չեք սեղմեք «Ոչ»։ 350 | SharedFileNameLabel=Ֆայլի անուն. 351 | SharedFileLocationLabel=Տեղադրություն. 352 | WizardUninstalling=Ապատեղադրելու վիճակ 353 | StatusUninstalling=%1-ի ապատեղադրում... 354 | 355 | ; *** Shutdown block reasons 356 | ShutdownBlockReasonInstallingApp=%1-ի տեղադրում։ 357 | ShutdownBlockReasonUninstallingApp=%1-ի ապատեղադրում։ 358 | 359 | ; The custom messages below aren't used by Setup itself, but if you make 360 | ; use of them in your scripts, you'll want to translate them. 361 | 362 | [CustomMessages] 363 | 364 | NameAndVersion=%1 տարբերակ՝ %2 365 | AdditionalIcons=Լրացուցիչ դյուրանցումներ 366 | CreateDesktopIcon=Ստեղծել դյուրանցում &Աշխատասեղանին 367 | CreateQuickLaunchIcon=Ստեղծել դյուրանցում &Արագ թողարկման գոտում 368 | ProgramOnTheWeb=%1-ի վեբ կայքը 369 | UninstallProgram=%1-ի ապատեղադրում 370 | LaunchProgram=Բացել %1-ը 371 | AssocFileExtension=Հա&մակցել %1-ը %2 ֆայլերի հետ։ 372 | AssocingFileExtension=%1-ը համակցվում է %2 ընդլայնումով ֆայլերի հետ... 373 | AutoStartProgramGroupDescription=Ինքնամեկնարկ. 374 | AutoStartProgram=Ինքնաբար մեկնարկել %1-ը 375 | AddonHostProgramNotFound=%1 չի կարող տեղադրվել Ձեր ընտրած պանակում։%n%nՇարունակե՞լ։ 376 | 377 | -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/BrazilianPortuguese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/BrazilianPortuguese.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Bulgarian.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 6.1.0+ Bulgarian messages *** 2 | ; Ventsislav Dimitrov 3 | ; 4 | ; За да изтеглите преводи на този файл, предоставени от потребители, посетете: 5 | ; http://www.jrsoftware.org/files/istrans/ 6 | ; 7 | ; Забележка: когато превеждате, не добавяйте точка (.) в края на съобщения, 8 | ; които нямат, защото Inno Setup им добавя автоматично (прибавянето на точка 9 | ; ще доведе до показване на две точки). 10 | 11 | [LangOptions] 12 | ; Следните три записа са много важни. Уверете се, че сте прочел и разбирате 13 | ; раздела "[LangOptions]" на помощния файл. 14 | LanguageName=Български 15 | LanguageID=$0402 16 | LanguageCodePage=1251 17 | ; Ако езикът, на който превеждате, изисква специална гарнитура или размер на 18 | ; шрифта, извадете от коментар съответните записи по-долу и ги променете 19 | ; според вашите нужди. 20 | ;DialogFontName= 21 | ;DialogFontSize=8 22 | ;WelcomeFontName=Verdana 23 | ;WelcomeFontSize=12 24 | ;TitleFontName=Arial 25 | ;TitleFontSize=29 26 | ;CopyrightFontName=Arial 27 | ;CopyrightFontSize=8 28 | 29 | [Messages] 30 | 31 | ; *** Заглавия на приложенията 32 | SetupAppTitle=Инсталиране 33 | SetupWindowTitle=Инсталиране на %1 34 | UninstallAppTitle=Деинсталиране 35 | UninstallAppFullTitle=Деинсталиране на %1 36 | 37 | ; *** Заглавия от общ тип 38 | InformationTitle=Информация 39 | ConfirmTitle=Потвърждение 40 | ErrorTitle=Грешка 41 | 42 | ; *** Съобщения на зареждащия модул 43 | SetupLdrStartupMessage=Ще се инсталира %1. Желаете ли да продължите? 44 | LdrCannotCreateTemp=Не е възможно да се създаде временен файл. Инсталирането бе прекратено 45 | LdrCannotExecTemp=Не е възможно да се стартира файл от временната директория. Инсталирането бе прекратено 46 | 47 | ; *** Съобщения за грешка при стартиране 48 | LastErrorMessage=%1.%n%nГрешка %2: %3 49 | SetupFileMissing=Файлът %1 липсва от инсталационната директория. Моля, отстранете проблема или се снабдете с ново копие на програмата. 50 | SetupFileCorrupt=Инсталационните файлове са повредени. Моля, снабдете се с ново копие на програмата. 51 | SetupFileCorruptOrWrongVer=Инсталационните файлове са повредени или несъвместими с тази версия на инсталатора. Моля, отстранете проблема или се снабдете с ново копие на програмата. 52 | InvalidParameter=В командния ред е подаден невалиден параметър:%n%n%1 53 | SetupAlreadyRunning=Инсталаторът вече се изпълнява. 54 | WindowsVersionNotSupported=Програмата не поддържа версията на Windows, с която работи компютърът ви. 55 | WindowsServicePackRequired=Програмата изисква %1 Service Pack %2 или по-нов. 56 | NotOnThisPlatform=Програмата не може да се изпълнява под %1. 57 | OnlyOnThisPlatform=Програмата трябва да се изпълнява под %1. 58 | OnlyOnTheseArchitectures=Програмата може да се инсталира само под версии на Windows за следните процесорни архитектури:%n%n%1 59 | WinVersionTooLowError=Програмата изисква %1 версия %2 или по-нова. 60 | WinVersionTooHighError=Програмата не може да бъде инсталирана в %1 версия %2 или по-нова. 61 | AdminPrivilegesRequired=За да инсталирате програмата, трябва да влезете като администратор. 62 | PowerUserPrivilegesRequired=За да инсталирате програмата, трябва да влезете като администратор или потребител с разширени права. 63 | SetupAppRunningError=Инсталаторът установи, че %1 се изпълнява в момента.%n%nМоля, затворете всички копия на програмата и натиснете "OK", за да продължите, или "Cancel" за изход. 64 | UninstallAppRunningError=Деинсталаторът установи, че %1 се изпълнява в момента.%n%nМоля, затворете всички копия на програмата и натиснете "OK", за да продължите, или "Cancel" за изход. 65 | 66 | ; *** Въпроси при стартиране 67 | PrivilegesRequiredOverrideTitle=Избор на режим на инсталация 68 | PrivilegesRequiredOverrideInstruction=Изберете режим на инсталация 69 | PrivilegesRequiredOverrideText1=%1 може да бъде инсталирана за всички потребители (изисква администраторски привилегии) или само за Вас. 70 | PrivilegesRequiredOverrideText2=%1 може да бъде инсталирана само за Вас или за всички потребители (изисква администраторски привилегии). 71 | PrivilegesRequiredOverrideAllUsers=Инсталирай за &всички потребители 72 | PrivilegesRequiredOverrideAllUsersRecommended=Инсталирай за &всички потребители (препоръчва се) 73 | PrivilegesRequiredOverrideCurrentUser=Инсталирай само за &мен 74 | PrivilegesRequiredOverrideCurrentUserRecommended=Инсталирай само за &мен (препоръчва се) 75 | 76 | ; *** Други грешки 77 | ErrorCreatingDir=Не е възможно да се създаде директория "%1" 78 | ErrorTooManyFilesInDir=Не е възможно да се създаде файл в директорията "%1", тъй като тя съдържа твърде много файлове 79 | 80 | ; *** Съобщения от общ тип на инсталатора 81 | ExitSetupTitle=Затваряне на инсталатора 82 | ExitSetupMessage=Инсталирането не е завършено. Ако затворите сега, програмата няма да бъде инсталирана.%n%nПо-късно можете отново да стартирате инсталатора, за да завършите инсталирането.%n%nЗатваряте ли инсталатора? 83 | AboutSetupMenuItem=&За инсталатора... 84 | AboutSetupTitle=За инсталатора 85 | AboutSetupMessage=%1 версия %2%n%3%n%nУебстраница:%n%4 86 | AboutSetupNote= 87 | TranslatorNote=Превод на български: Михаил Балабанов 88 | 89 | ; *** Бутони 90 | ButtonBack=< На&зад 91 | ButtonNext=На&пред > 92 | ButtonInstall=&Инсталиране 93 | ButtonOK=OK 94 | ButtonCancel=Отказ 95 | ButtonYes=&Да 96 | ButtonYesToAll=Да за &всички 97 | ButtonNo=&Не 98 | ButtonNoToAll=Не за в&сички 99 | ButtonFinish=&Готово 100 | ButtonBrowse=Пре&глед... 101 | ButtonWizardBrowse=Пре&глед... 102 | ButtonNewFolder=&Нова папка 103 | 104 | ; *** Съобщения в диалоговия прозорец за избор на език 105 | SelectLanguageTitle=Избор на език за инсталатора 106 | SelectLanguageLabel=Изберете кой език ще ползвате с инсталатора. 107 | 108 | ; *** Текстове от общ тип на съветника 109 | ClickNext=Натиснете "Напред", за да продължите, или "Отказ" за затваряне на инсталатора. 110 | BeveledLabel= 111 | BrowseDialogTitle=Преглед за папка 112 | BrowseDialogLabel=Изберете папка от долния списък и натиснете "OK". 113 | NewFolderName=Нова папка 114 | 115 | ; *** Страница "Добре дошли" на съветника 116 | WelcomeLabel1=Добре дошли при Съветника за инсталиране на [name] 117 | WelcomeLabel2=Съветникът ще инсталира [name/ver] във Вашия компютър.%n%nПрепоръчва се да затворите всички останали приложения, преди да продължите. 118 | 119 | ; *** Страница "Парола" на съветника 120 | WizardPassword=Парола 121 | PasswordLabel1=Инсталацията е защитена с парола. 122 | PasswordLabel3=Моля, въведете паролата и натиснете "Напред", за да продължите. Главни и малки букви са от значение. 123 | PasswordEditLabel=&Парола: 124 | IncorrectPassword=Въведената от вас парола е неправилна. Моля, опитайте отново. 125 | 126 | ; *** Страница "Лицензионно споразумение" на съветника 127 | WizardLicense=Лицензионно споразумение 128 | LicenseLabel=Моля, прочетете следната важна информация, преди да продължите. 129 | LicenseLabel3=Моля, прочетете следното Лицензионно споразумение. Преди инсталирането да продължи, трябва да приемете условията на споразумението. 130 | LicenseAccepted=П&риемам споразумението 131 | LicenseNotAccepted=&Не приемам споразумението 132 | 133 | ; *** Страници "Информация" на съветника 134 | WizardInfoBefore=Информация 135 | InfoBeforeLabel=Моля, прочетете следната важна информация, преди да продължите. 136 | InfoBeforeClickLabel=Когато сте готов да продължите, натиснете "Напред". 137 | WizardInfoAfter=Информация 138 | InfoAfterLabel=Моля, прочетете следната важна информация, преди да продължите. 139 | InfoAfterClickLabel=Когато сте готов да продължите, натиснете "Напред". 140 | 141 | ; *** Страница "Данни за потребител" на съветника 142 | WizardUserInfo=Данни за потребител 143 | UserInfoDesc=Моля, въведете вашите данни. 144 | UserInfoName=&Име: 145 | UserInfoOrg=&Организация: 146 | UserInfoSerial=&Сериен номер: 147 | UserInfoNameRequired=Трябва да въведете име. 148 | 149 | ; *** Страница "Избор на местоназначение" на съветника 150 | WizardSelectDir=Избор на местоназначение 151 | SelectDirDesc=Къде да се инсталира [name]? 152 | SelectDirLabel3=[name] ще се инсталира в следната папка. 153 | SelectDirBrowseLabel=Натиснете "Напред", за да продължите. За да изберете друга папка, натиснете "Преглед". 154 | DiskSpaceGBLabel=Изискват се поне [gb] ГБ свободно дисково пространство. 155 | DiskSpaceMBLabel=Изискват се поне [mb] МБ свободно дисково пространство. 156 | CannotInstallToNetworkDrive=Инсталаторът не може да инсталира на мрежово устройство. 157 | CannotInstallToUNCPath=Инсталаторът не може да инсталира в UNC път. 158 | InvalidPath=Трябва да въведете пълен път с буква на устройство, например:%n%nC:\APP%n%nили UNC път във вида:%n%n\\сървър\споделено място 159 | InvalidDrive=Избраното от вас устройство или споделено UNC място не съществува или не е достъпно. Моля, изберете друго. 160 | DiskSpaceWarningTitle=Недостиг на дисково пространство 161 | DiskSpaceWarning=Инсталирането изисква %1 кБ свободно място, но на избраното устройство има само %2 кБ.%n%nЖелаете ли все пак да продължите? 162 | DirNameTooLong=Твърде дълго име на папка или път. 163 | InvalidDirName=Името на папка е невалидно. 164 | BadDirName32=Имената на папки не могат да съдържат следните знаци:%n%n%1 165 | DirExistsTitle=Папката съществува 166 | DirExists=Папката:%n%n%1%n%nвече съществува. Желаете ли все пак да инсталирате в нея? 167 | DirDoesntExistTitle=Папката не съществува 168 | DirDoesntExist=Папката:%n%n%1%n%nне съществува. Желаете ли да бъде създадена? 169 | 170 | ; *** Страница "Избор на компоненти" на съветника 171 | WizardSelectComponents=Избор на компоненти 172 | SelectComponentsDesc=Кои компоненти да бъдат инсталирани? 173 | SelectComponentsLabel2=Изберете компонентите, които желаете да инсталирате, и откажете нежеланите. Натиснете "Напред", когато сте готов да продължите. 174 | FullInstallation=Пълна инсталация 175 | ; По възможност не превеждайте "Compact" като "Minimal" (има се предвид "Minimal" на Вашия език) 176 | CompactInstallation=Компактна инсталация 177 | CustomInstallation=Инсталация по избор 178 | NoUninstallWarningTitle=Компонентите съществуват 179 | NoUninstallWarning=Инсталаторът установи, че следните компоненти са вече инсталирани в компютърa:%n%n%1%n%nОтказването на тези компоненти няма да ги деинсталира.%n%nЖелаете ли все пак да продължите? 180 | ComponentSize1=%1 кБ 181 | ComponentSize2=%1 МБ 182 | ComponentsDiskSpaceGBLabel=Направеният избор изисква поне [gb] ГБ дисково пространство. 183 | ComponentsDiskSpaceMBLabel=Направеният избор изисква поне [mb] МБ дисково пространство. 184 | 185 | ; *** Страница "Избор на допълнителни задачи" на съветника 186 | WizardSelectTasks=Избор на допълнителни задачи 187 | SelectTasksDesc=Кои допълнителни задачи да бъдат изпълнени? 188 | SelectTasksLabel2=Изберете кои допълнителни задачи желаете да се изпълнят при инсталиране на [name], след което натиснете "Напред". 189 | 190 | ; *** Страница "Избор на папка в менюто "Старт" на съветника 191 | WizardSelectProgramGroup=Избор на папка в менюто "Старт" 192 | SelectStartMenuFolderDesc=Къде да бъдат поставени преките пътища на програмата? 193 | SelectStartMenuFolderLabel3=Инсталаторът ще създаде преки пътища в следната папка от менюто "Старт". 194 | SelectStartMenuFolderBrowseLabel=Натиснете "Напред", за да продължите. За да изберете друга папка, натиснете "Преглед". 195 | MustEnterGroupName=Трябва да въведете име на папка. 196 | GroupNameTooLong=Твърде дълго име на папка или път. 197 | InvalidGroupName=Името на папка е невалидно. 198 | BadGroupName=Името на папка не може да съдържа следните знаци:%n%n%1 199 | NoProgramGroupCheck2=И&нсталиране без папка в менюто "Старт" 200 | 201 | ; *** Страница "Готовност за инсталиране" на съветника 202 | WizardReady=Готовност за инсталиране 203 | ReadyLabel1=Инсталаторът е готов да инсталира [name] във Вашия компютър. 204 | ReadyLabel2a=Натиснете "Инсталиране", за да продължите, или "Назад" за преглед или промяна на някои настройки. 205 | ReadyLabel2b=Натиснете "Инсталиране", за да продължите с инсталирането. 206 | ReadyMemoUserInfo=Данни за потребител: 207 | ReadyMemoDir=Местоназначение: 208 | ReadyMemoType=Тип инсталация: 209 | ReadyMemoComponents=Избрани компоненти: 210 | ReadyMemoGroup=Папка в менюто "Старт": 211 | ReadyMemoTasks=Допълнителни задачи: 212 | 213 | ; *** Страница "TDownloadWizardPage" на съветника и DownloadTemporaryFile 214 | DownloadingLabel=Изтегляне на допълнителни файлове... 215 | ButtonStopDownload=&Спри изтеглянето 216 | StopDownload=Сигурни ли сте, че искате да спрете изтеглянето? 217 | ErrorDownloadAborted=Изтеглянето беше прекъснато 218 | ErrorDownloadFailed=Изтеглянето беше неуспешно: %1 %2 219 | ErrorDownloadSizeFailed=Неуспешно получаване на размер: %1 %2 220 | ErrorFileHash1=Неуспешна контролна сума на файл: %1 221 | ErrorFileHash2=Невалидна контролна сума на файл: очаквана %1, открита %2 222 | ErrorProgress=Невалиден напредък: %1 of %2 223 | ErrorFileSize=Невалиден размер на файл: очакван %1, открит %2 224 | 225 | ; *** Страница "Подготовка за инсталиране" на съветника 226 | WizardPreparing=Подготовка за инсталиране 227 | PreparingDesc=Инсталаторът се подготвя да инсталира [name] във Вашия компютър. 228 | PreviousInstallNotCompleted=Инсталиране или премахване на предишна програма не е завършило. Рестартирайте компютъра, за да може процесът да завърши.%n%nСлед като рестартирате, стартирайте инсталатора отново, за да довършите инсталирането на [name]. 229 | CannotContinue=Инсталирането не може да продължи. Моля, натиснете "Отказ" за изход. 230 | ApplicationsFound=Следните приложения използват файлове, които трябва да бъдат обновени от инсталатора. Препоръчва се да разрешите на инсталатора автоматично да затвори приложенията. 231 | ApplicationsFound2=Следните приложения използват файлове, които трябва да бъдат обновени от инсталатора. Препоръчва се да разрешите на инсталатора автоматично да затвори приложенията. След края на инсталирането ще бъде направен опит за рестартирането им. 232 | CloseApplications=Приложенията да се затворят &автоматично 233 | DontCloseApplications=Приложенията да &не се затварят 234 | ErrorCloseApplications=Не бе възможно да се затворят автоматично всички приложения. Препоръчва се преди да продължите, да затворите всички приложения, използващи файлове, които инсталаторът трябва да обнови. 235 | PrepareToInstallNeedsRestart=Инсталаторът трябва да ресартира Вашия компютър. След рестартирането, стартирайте инсталатора отново, за да завършите инсталацията на [name].%n%nЖелаете ли да рестартирате сега? 236 | 237 | ; *** Страница "Инсталиране" на съветника 238 | WizardInstalling=Инсталиране 239 | InstallingLabel=Моля, изчакайте докато [name] се инсталира във Вашия компютър. 240 | 241 | ; *** Страница "Инсталирането завърши" на съветника 242 | FinishedHeadingLabel=Съветникът за инсталиране на [name] завърши 243 | FinishedLabelNoIcons=Инсталирането на [name] във Вашия компютър завърши. 244 | FinishedLabel=Инсталирането на [name] във Вашия компютър завърши. Можете да стартирате приложението чрез инсталираните икони. 245 | ClickFinish=Натиснете "Готово", за да затворите инсталатора. 246 | FinishedRestartLabel=Инсталаторът трябва да рестартира компютъра, за да завърши инсталирането на [name]. Желаете ли да рестартирате сега? 247 | FinishedRestartMessage=Инсталаторът трябва да рестартира компютъра, за да завърши инсталирането на [name].%n%nЖелаете ли да рестартирате сега? 248 | ShowReadmeCheck=Да, желая да прегледам файла README 249 | YesRadio=&Да, нека компютърът се рестартира сега 250 | NoRadio=&Не, ще рестартирам компютъра по-късно 251 | ; Използва се например в "Стартиране на MyProg.exe" 252 | RunEntryExec=Стартиране на %1 253 | ; Използва се например в "Преглеждане на Readme.txt" 254 | RunEntryShellExec=Преглеждане на %1 255 | 256 | ; *** Текстове от рода на "Инсталаторът изисква следващ носител" 257 | ChangeDiskTitle=Инсталаторът изисква следващ носител 258 | SelectDiskLabel2=Моля, поставете носител %1 и натиснете "ОК".%n%nАко файловете от носителя се намират в различна от показаната по-долу папка, въведете правилния път до тях или натиснете "Преглед". 259 | PathLabel=П&ът: 260 | FileNotInDir2=Файлът "%1" не бе намерен в "%2". Моля, поставете правилния носител или изберете друга папка. 261 | SelectDirectoryLabel=Моля, посочете местоположението на следващия носител. 262 | 263 | ; *** Съобщения от фаза "Инсталиране" 264 | SetupAborted=Инсталирането не е завършено.%n%nМоля, отстранете проблема и стартирайте инсталатора отново. 265 | AbortRetryIgnoreSelectAction=Изберете действие 266 | AbortRetryIgnoreRetry=Повторен &опит 267 | AbortRetryIgnoreIgnore=&Пренебрегни грешката и продължи 268 | AbortRetryIgnoreCancel=Прекрати инсталацията 269 | 270 | ; *** Съобщения за хода на инсталирането 271 | StatusClosingApplications=Затварят се приложения... 272 | StatusCreateDirs=Създават се директории... 273 | StatusExtractFiles=Извличат се файлове... 274 | StatusCreateIcons=Създават се преки пътища... 275 | StatusCreateIniEntries=Създават се записи в INI файл... 276 | StatusCreateRegistryEntries=Създават се записи в регистъра... 277 | StatusRegisterFiles=Регистрират се файлове... 278 | StatusSavingUninstall=Записват се данни за деинсталиране... 279 | StatusRunProgram=Инсталацията приключва... 280 | StatusRestartingApplications=Рестартират се приложения... 281 | StatusRollback=Заличават се промени... 282 | 283 | ; *** Грешки от общ тип 284 | ErrorInternal2=Вътрешна грешка: %1 285 | ErrorFunctionFailedNoCode=Неуспешно изпълнение на %1 286 | ErrorFunctionFailed=Неуспешно изпълнение на %1; код на грешката: %2 287 | ErrorFunctionFailedWithMessage=Неуспешно изпълнение на %1; код на грешката: %2.%n%3 288 | ErrorExecutingProgram=Не е възможно да се стартира файл:%n%1 289 | 290 | ; *** Грешки, свързани с регистъра 291 | ErrorRegOpenKey=Грешка при отваряне на ключ в регистъра:%n%1\%2 292 | ErrorRegCreateKey=Грешка при създаване на ключ в регистъра:%n%1\%2 293 | ErrorRegWriteKey=Грешка при писане в ключ от регистъра:%n%1\%2 294 | 295 | ; *** Грешки, свързани с INI файлове 296 | ErrorIniEntry=Грешка при създаване на INI запис във файла "%1". 297 | 298 | ; *** Грешки при копиране на файлове 299 | FileAbortRetryIgnoreSkipNotRecommended=Прескочи този &файл (не се препоръчва) 300 | FileAbortRetryIgnoreIgnoreNotRecommended=&Пренебрегни грешката и продължи (не се препоръчва) 301 | SourceIsCorrupted=Файлът - източник е повреден 302 | SourceDoesntExist=Файлът - източник "%1" не съществува 303 | ExistingFileReadOnly2=Съществуващият файл не беше заменен, защото е маркиран само за четене. 304 | ExistingFileReadOnlyRetry=&Премахни атрибута „само за четене“ и опитай отново 305 | ExistingFileReadOnlyKeepExisting=&Запази съществуващия файл 306 | ErrorReadingExistingDest=Грешка при опит за четене на съществуващ файл: 307 | FileExistsSelectAction=Изберете действие 308 | FileExists2=Файлът вече съществува. 309 | FileExistsOverwriteExisting=&Презапиши съществуващия файл 310 | FileExistsKeepExisting=&Запази съществуващия файл 311 | FileExistsOverwriteOrKeepAll=&Извършвай същото за останалите конфликти 312 | ExistingFileNewerSelectAction=Изберете действие 313 | ExistingFileNewer2=Съществуващият файл е по-нов от този, който инсталаторът се опитва да инсталира. 314 | ExistingFileNewerOverwriteExisting=&Презапиши съществуващия файл 315 | ExistingFileNewerKeepExisting=&Запази съществуващия файл (препоръчително) 316 | ExistingFileNewerOverwriteOrKeepAll=&Извършвай същото за останалите конфликти 317 | ErrorChangingAttr=Грешка при опит за смяна на атрибути на съществуващ файл: 318 | ErrorCreatingTemp=Грешка при опит за създаване на файл в целевата директория: 319 | ErrorReadingSource=Грешка при опит за четене на файл - източник: 320 | ErrorCopying=Грешка при опит за копиране на файл: 321 | ErrorReplacingExistingFile=Грешка при опит за заместване на съществуващ файл: 322 | ErrorRestartReplace=Неуспешно отложено заместване: 323 | ErrorRenamingTemp=Грешка при опит за преименуване на файл в целевата директория: 324 | ErrorRegisterServer=Не е възможно да се регистрира библиотека от тип DLL/OCX: %1 325 | ErrorRegSvr32Failed=Неуспешно изпълнение на RegSvr32 с код на изход %1 326 | ErrorRegisterTypeLib=Не е възможно да се регистрира библиотека от типове: %1 327 | 328 | ; *** Обозначаване на показваните имена на програми за деинсталиране 329 | UninstallDisplayNameMark=%1 (%2) 330 | UninstallDisplayNameMarks=%1 (%2, %3) 331 | UninstallDisplayNameMark32Bit=32-битова 332 | UninstallDisplayNameMark64Bit=64-битова 333 | UninstallDisplayNameMarkAllUsers=Всички потребители 334 | UninstallDisplayNameMarkCurrentUser=Текущ потребител 335 | 336 | ; *** Грешки след инсталиране 337 | ErrorOpeningReadme=Възникна грешка при опит за отваряне на файла README. 338 | ErrorRestartingComputer=Инсталаторът не е в състояние да рестартира компютъра. Моля, направете го ръчно. 339 | 340 | ; *** Съобщения на деинсталатора 341 | UninstallNotFound=Файлът "%1" не съществува. Деинсталирането е невъзможно. 342 | UninstallOpenError=Файлът "%1" не може да се отвори. Деинсталирането е невъзможно 343 | UninstallUnsupportedVer=Форматът на регистрационния файл за деинсталиране "%1" не се разпознава от тази версия на деинсталатора. Деинсталирането е невъзможно 344 | UninstallUnknownEntry=Открит бе непознат запис (%1) в регистрационния файл за деинсталиране 345 | ConfirmUninstall=Наистина ли желаете да премахнете напълно %1 и всички прилежащи компоненти? 346 | UninstallOnlyOnWin64=Програмата може да бъде деинсталирана само под 64-битов Windows. 347 | OnlyAdminCanUninstall=Програмата може да бъде премахната само от потребител с администраторски права. 348 | UninstallStatusLabel=Моля, изчакайте премахването на %1 от Вашия компютър да приключи. 349 | UninstalledAll=%1 беше премахната успешно от Вашия компютър. 350 | UninstalledMost=Деинсталирането на %1 завърши.%n%nПремахването на някои елементи не бе възможно. Можете да ги отстраните ръчно. 351 | UninstalledAndNeedsRestart=За да приключи деинсталирането на %1, трябва да рестартирате Вашия компютър.%n%nЖелаете ли да рестартирате сега? 352 | UninstallDataCorrupted=Файлът "%1" е повреден. Деинсталирането е невъзможно 353 | 354 | ; *** Съобщения от фаза "Деинсталиране" 355 | ConfirmDeleteSharedFileTitle=Премахване на споделен файл? 356 | ConfirmDeleteSharedFile2=Системата отчита, че следният споделен файл вече не се ползва от никоя програма. Желаете ли деинсталаторът да го премахне?%n%nАко някоя програма все пак ползва файла и той бъде изтрит, програмата може да спре да работи правилно. Ако се колебаете, изберете "Не". Оставянето на файла в системата е безвредно. 357 | SharedFileNameLabel=Име на файла: 358 | SharedFileLocationLabel=Местоположение: 359 | WizardUninstalling=Ход на деинсталирането 360 | StatusUninstalling=%1 се деинсталира... 361 | 362 | ; *** Обяснения за блокирано спиране на системата 363 | ShutdownBlockReasonInstallingApp=Инсталира се %1. 364 | ShutdownBlockReasonUninstallingApp=Деинсталира се %1. 365 | 366 | ; Потребителските съобщения по-долу не се ползват от самия инсталатор, но 367 | ; ако ползвате такива в скриптовете си, вероятно бихте искали да ги преведете. 368 | 369 | [CustomMessages] 370 | 371 | NameAndVersion=%1, версия %2 372 | AdditionalIcons=Допълнителни икони: 373 | CreateDesktopIcon=Икона на &работния плот 374 | CreateQuickLaunchIcon=Икона в лентата "&Бързо стартиране" 375 | ProgramOnTheWeb=%1 в Интернет 376 | UninstallProgram=Деинсталиране на %1 377 | LaunchProgram=Стартиране на %1 378 | AssocFileExtension=&Свързване на %1 с файловото разширение %2 379 | AssocingFileExtension=%1 се свързва с файловото разширение %2... 380 | AutoStartProgramGroupDescription=Стартиране: 381 | AutoStartProgram=Автоматично стартиране на %1 382 | AddonHostProgramNotFound=%1 не бе намерена в избраната от вас папка.%n%nЖелаете ли все пак да продължите? 383 | -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Catalan.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Catalan.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Czech.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Czech.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Danish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Danish.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Dutch.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 6.1.0+ Dutch messages *** 2 | ; 3 | ; This file is based on user-contributed translations by various authors 4 | ; 5 | ; Maintained by Martijn Laan (mlaan@jrsoftware.org) 6 | 7 | [LangOptions] 8 | LanguageName=Nederlands 9 | LanguageID=$0413 10 | LanguageCodePage=1252 11 | 12 | [Messages] 13 | 14 | ; *** Application titles 15 | SetupAppTitle=Setup 16 | SetupWindowTitle=Setup - %1 17 | UninstallAppTitle=Verwijderen 18 | UninstallAppFullTitle=%1 verwijderen 19 | 20 | ; *** Misc. common 21 | InformationTitle=Informatie 22 | ConfirmTitle=Bevestigen 23 | ErrorTitle=Fout 24 | 25 | ; *** SetupLdr messages 26 | SetupLdrStartupMessage=Hiermee wordt %1 geïnstalleerd. Wilt u doorgaan? 27 | LdrCannotCreateTemp=Kan geen tijdelijk bestand maken. Setup wordt afgesloten 28 | LdrCannotExecTemp=Kan een bestand in de tijdelijke map niet uitvoeren. Setup wordt afgesloten 29 | 30 | ; *** Startup error messages 31 | LastErrorMessage=%1.%n%nFout %2: %3 32 | SetupFileMissing=Het bestand %1 ontbreekt in de installatiemap. Corrigeer dit probleem of gebruik een andere kopie van het programma. 33 | SetupFileCorrupt=De installatiebestanden zijn beschadigd. Gebruik een andere kopie van het programma. 34 | SetupFileCorruptOrWrongVer=De installatiebestanden zijn beschadigd, of zijn niet compatibel met deze versie van Setup. Corrigeer dit probleem of gebruik een andere kopie van het programma. 35 | InvalidParameter=Er werd een ongeldige schakeloptie opgegeven op de opdrachtregel:%n%n%1 36 | SetupAlreadyRunning=Setup is al gestart. 37 | WindowsVersionNotSupported=Dit programma ondersteunt de versie van Windows die u gebruikt niet. 38 | WindowsServicePackRequired=Dit programma vereist %1 Service Pack %2 of hoger. 39 | NotOnThisPlatform=Dit programma kan niet worden uitgevoerd onder %1. 40 | OnlyOnThisPlatform=Dit programma moet worden uitgevoerd onder %1. 41 | OnlyOnTheseArchitectures=Dit programma kan alleen geïnstalleerd worden onder versies van Windows ontworpen voor de volgende processor architecturen:%n%n%1 42 | WinVersionTooLowError=Dit programma vereist %1 versie %2 of hoger. 43 | WinVersionTooHighError=Dit programma kan niet worden geïnstalleerd onder %1 versie %2 of hoger. 44 | AdminPrivilegesRequired=U moet aangemeld zijn als een systeembeheerder om dit programma te kunnen installeren. 45 | PowerUserPrivilegesRequired=U moet ingelogd zijn als systeembeheerder of als gebruiker met systeembeheerders rechten om dit programma te kunnen installeren. 46 | SetupAppRunningError=Setup heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters hiervan, en klik daarna op OK om verder te gaan, of op Annuleren om Setup af te sluiten. 47 | UninstallAppRunningError=Het verwijderprogramma heeft vastgesteld dat %1 op dit moment actief is.%n%nSluit alle vensters hiervan, en klik daarna op OK om verder te gaan, of op Annuleren om het verwijderen af te breken. 48 | 49 | ; *** Startup questions 50 | PrivilegesRequiredOverrideTitle=Selecteer installatie modus voor Setup 51 | PrivilegesRequiredOverrideInstruction=Selecteer installatie modus 52 | PrivilegesRequiredOverrideText1=%1 kan geïnstalleerd worden voor alle gebruikers (vereist aanmelding als een systeembeheerder), of voor u alleen. 53 | PrivilegesRequiredOverrideText2=%1 kan geïnstalleerd worden voor u alleen, of voor alle gebruikers (vereist aanmelding als een systeembeheerder). 54 | PrivilegesRequiredOverrideAllUsers=Installeer voor &alle gebruikers 55 | PrivilegesRequiredOverrideAllUsersRecommended=Installeer voor &alle gebruikers (aanbevolen) 56 | PrivilegesRequiredOverrideCurrentUser=Installeer voor &mij alleen 57 | PrivilegesRequiredOverrideCurrentUserRecommended=Installeer voor &mij alleen (aanbevolen) 58 | 59 | ; *** Misc. errors 60 | ErrorCreatingDir=Setup kan de map "%1" niet maken 61 | ErrorTooManyFilesInDir=Kan geen bestand maken in de map "%1" omdat deze te veel bestanden bevat 62 | 63 | ; *** Setup common messages 64 | ExitSetupTitle=Setup afsluiten 65 | ExitSetupMessage=Setup is niet voltooid. Als u nu afsluit, wordt het programma niet geïnstalleerd.%n%nU kunt Setup later opnieuw uitvoeren om de installatie te voltooien.%n%nSetup afsluiten? 66 | AboutSetupMenuItem=&Over Setup... 67 | AboutSetupTitle=Over Setup 68 | AboutSetupMessage=%1 versie %2%n%3%n%n%1-homepage:%n%4 69 | AboutSetupNote= 70 | TranslatorNote=Dutch translation maintained by Martijn Laan (mlaan@jrsoftware.org) 71 | 72 | ; *** Buttons 73 | ButtonBack=< Vo&rige 74 | ButtonNext=&Volgende > 75 | ButtonInstall=&Installeren 76 | ButtonOK=OK 77 | ButtonCancel=Annuleren 78 | ButtonYes=&Ja 79 | ButtonYesToAll=Ja op &alles 80 | ButtonNo=&Nee 81 | ButtonNoToAll=N&ee op alles 82 | ButtonFinish=&Voltooien 83 | ButtonBrowse=&Bladeren... 84 | ButtonWizardBrowse=B&laderen... 85 | ButtonNewFolder=&Nieuwe map maken 86 | 87 | ; *** "Select Language" dialog messages 88 | SelectLanguageTitle=Selecteer taal voor Setup 89 | SelectLanguageLabel=Selecteer de taal die Setup gebruikt tijdens de installatie. 90 | 91 | ; *** Common wizard text 92 | ClickNext=Klik op Volgende om verder te gaan of op Annuleren om Setup af te sluiten. 93 | BeveledLabel= 94 | BrowseDialogTitle=Map Selecteren 95 | BrowseDialogLabel=Selecteer een map in onderstaande lijst en klik daarna op OK. 96 | NewFolderName=Nieuwe map 97 | 98 | ; *** "Welcome" wizard page 99 | WelcomeLabel1=Welkom bij het installatieprogramma van [name]. 100 | WelcomeLabel2=Hiermee wordt [name/ver] geïnstalleerd op deze computer.%n%nU wordt aanbevolen alle actieve programma's af te sluiten voordat u verder gaat. 101 | 102 | ; *** "Password" wizard page 103 | WizardPassword=Wachtwoord 104 | PasswordLabel1=Deze installatie is beveiligd met een wachtwoord. 105 | PasswordLabel3=Voer het wachtwoord in en klik op Volgende om verder te gaan. Wachtwoorden zijn hoofdlettergevoelig. 106 | PasswordEditLabel=&Wachtwoord: 107 | IncorrectPassword=Het ingevoerde wachtwoord is niet correct. Probeer het opnieuw. 108 | 109 | ; *** "License Agreement" wizard page 110 | WizardLicense=Licentieovereenkomst 111 | LicenseLabel=Lees de volgende belangrijke informatie voordat u verder gaat. 112 | LicenseLabel3=Lees de volgende licentieovereenkomst. Gebruik de schuifbalk of druk op de knop Page Down om de rest van de overeenkomst te zien. 113 | LicenseAccepted=Ik &accepteer de licentieovereenkomst 114 | LicenseNotAccepted=Ik accepteer de licentieovereenkomst &niet 115 | 116 | ; *** "Information" wizard pages 117 | WizardInfoBefore=Informatie 118 | InfoBeforeLabel=Lees de volgende belangrijke informatie voordat u verder gaat. 119 | InfoBeforeClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. 120 | WizardInfoAfter=Informatie 121 | InfoAfterLabel=Lees de volgende belangrijke informatie voordat u verder gaat. 122 | InfoAfterClickLabel=Klik op Volgende als u gereed bent om verder te gaan met Setup. 123 | 124 | ; *** "User Information" wizard page 125 | WizardUserInfo=Gebruikersinformatie 126 | UserInfoDesc=Vul hier uw informatie in. 127 | UserInfoName=&Gebruikersnaam: 128 | UserInfoOrg=&Organisatie: 129 | UserInfoSerial=&Serienummer: 130 | UserInfoNameRequired=U moet een naam invullen. 131 | 132 | ; *** "Select Destination Location" wizard page 133 | WizardSelectDir=Kies de doelmap 134 | SelectDirDesc=Waar moet [name] geïnstalleerd worden? 135 | SelectDirLabel3=Setup zal [name] in de volgende map installeren. 136 | SelectDirBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. 137 | DiskSpaceGBLabel=Er is ten minste [gb] GB vrije schijfruimte vereist. 138 | DiskSpaceMBLabel=Er is ten minste [mb] MB vrije schijfruimte vereist. 139 | CannotInstallToNetworkDrive=Setup kan niet installeren naar een netwerkstation. 140 | CannotInstallToUNCPath=Setup kan niet installeren naar een UNC-pad. 141 | InvalidPath=U moet een volledig pad met stationsletter invoeren; bijvoorbeeld:%nC:\APP%n%nof een UNC-pad zoals:%n%n\\server\share 142 | InvalidDrive=Het geselecteerde station bestaat niet. Kies een ander station. 143 | DiskSpaceWarningTitle=Onvoldoende schijfruimte 144 | DiskSpaceWarning=Setup vereist ten minste %1 kB vrije schijfruimte voor het installeren, maar het geselecteerde station heeft slechts %2 kB beschikbaar.%n%nWilt u toch doorgaan? 145 | DirNameTooLong=De mapnaam of het pad is te lang. 146 | InvalidDirName=De mapnaam is ongeldig. 147 | BadDirName32=Mapnamen mogen geen van de volgende tekens bevatten:%n%n%1 148 | DirExistsTitle=Map bestaat al 149 | DirExists=De map:%n%n%1%n%nbestaat al. Wilt u toch naar die map installeren? 150 | DirDoesntExistTitle=Map bestaat niet 151 | DirDoesntExist=De map:%n%n%1%n%nbestaat niet. Wilt u de map aanmaken? 152 | 153 | ; *** "Select Components" wizard page 154 | WizardSelectComponents=Selecteer componenten 155 | SelectComponentsDesc=Welke componenten moeten geïnstalleerd worden? 156 | SelectComponentsLabel2=Selecteer de componenten die u wilt installeren. Klik op Volgende als u klaar bent om verder te gaan. 157 | FullInstallation=Volledige installatie 158 | CompactInstallation=Compacte installatie 159 | CustomInstallation=Aangepaste installatie 160 | NoUninstallWarningTitle=Component bestaat 161 | NoUninstallWarning=Setup heeft gedetecteerd dat de volgende componenten al geïnstalleerd zijn op uw computer:%n%n%1%n%nAls u de selectie van deze componenten ongedaan maakt, worden ze niet verwijderd.%n%nWilt u toch doorgaan? 162 | ComponentSize1=%1 KB 163 | ComponentSize2=%1 MB 164 | ComponentsDiskSpaceGBLabel=De huidige selectie vereist ten minste [gb] GB vrije schijfruimte. 165 | ComponentsDiskSpaceMBLabel=De huidige selectie vereist ten minste [mb] MB vrije schijfruimte. 166 | 167 | ; *** "Select Additional Tasks" wizard page 168 | WizardSelectTasks=Selecteer extra taken 169 | SelectTasksDesc=Welke extra taken moeten uitgevoerd worden? 170 | SelectTasksLabel2=Selecteer de extra taken die u door Setup wilt laten uitvoeren bij het installeren van [name], en klik vervolgens op Volgende. 171 | 172 | ; *** "Select Start Menu Folder" wizard page 173 | WizardSelectProgramGroup=Selecteer menu Start map 174 | SelectStartMenuFolderDesc=Waar moeten de snelkoppelingen van het programma geplaatst worden? 175 | SelectStartMenuFolderLabel3=Setup plaatst de snelkoppelingen van het programma in de volgende menu Start map. 176 | SelectStartMenuFolderBrowseLabel=Klik op Volgende om door te gaan. Klik op Bladeren om een andere map te kiezen. 177 | MustEnterGroupName=U moet een mapnaam invoeren. 178 | GroupNameTooLong=De mapnaam of het pad is te lang. 179 | InvalidGroupName=De mapnaam is ongeldig. 180 | BadGroupName=De mapnaam mag geen van de volgende tekens bevatten:%n%n%1 181 | NoProgramGroupCheck2=&Geen menu Start map maken 182 | 183 | ; *** "Ready to Install" wizard page 184 | WizardReady=Het voorbereiden van de installatie is gereed 185 | ReadyLabel1=Setup is nu gereed om te beginnen met het installeren van [name] op deze computer. 186 | ReadyLabel2a=Klik op Installeren om verder te gaan met installeren, of klik op Vorige als u instellingen wilt terugzien of veranderen. 187 | ReadyLabel2b=Klik op Installeren om verder te gaan met installeren. 188 | ReadyMemoUserInfo=Gebruikersinformatie: 189 | ReadyMemoDir=Doelmap: 190 | ReadyMemoType=Installatietype: 191 | ReadyMemoComponents=Geselecteerde componenten: 192 | ReadyMemoGroup=Menu Start map: 193 | ReadyMemoTasks=Extra taken: 194 | 195 | ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile 196 | DownloadingLabel=Bezig met het downloaden van extra bestanden... 197 | ButtonStopDownload=&Stop download 198 | StopDownload=Weet u zeker dat u de download wilt stoppen? 199 | ErrorDownloadAborted=Download afgebroken 200 | ErrorDownloadFailed=Download mislukt: %1 %2 201 | ErrorDownloadSizeFailed=Ophalen grootte mislukt: %1 %2 202 | ErrorFileHash1=Bestand hashing mislukt: %1 203 | ErrorFileHash2=Ongeldige bestandshash: %1 verwacht, %2 gevonden 204 | ErrorProgress=Ongeldige voortgang: %1 van %2 205 | ErrorFileSize=Ongeldige bestandsgrootte: %1 verwacht, %2 gevonden 206 | 207 | ; *** "Preparing to Install" wizard page 208 | WizardPreparing=Bezig met het voorbereiden van de installatie 209 | PreparingDesc=Setup is bezig met het voorbereiden van de installatie van [name]. 210 | PreviousInstallNotCompleted=De installatie/verwijdering van een vorig programma is niet voltooid. U moet uw computer opnieuw opstarten om die installatie te voltooien.%n%nStart Setup nogmaals nadat uw computer opnieuw is opgestart om de installatie van [name] te voltooien. 211 | CannotContinue=Setup kan niet doorgaan. Klik op annuleren om af te sluiten. 212 | ApplicationsFound=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. 213 | ApplicationsFound2=De volgende programma's gebruiken bestanden die moeten worden bijgewerkt door Setup. U wordt aanbevolen Setup toe te staan om automatisch deze programma's af te sluiten. Nadat de installatie is voltooid zal Setup proberen de applicaties opnieuw op te starten. 214 | CloseApplications=&Programma's automatisch afsluiten 215 | DontCloseApplications=Programma's &niet afsluiten 216 | ErrorCloseApplications=Setup kon niet alle programma's automatisch afsluiten. U wordt aanbevolen alle programma's die bestanden gebruiken die moeten worden bijgewerkt door Setup af te sluiten voordat u verder gaat. 217 | PrepareToInstallNeedsRestart=Setup moet uw computer opnieuw opstarten. Start Setup nogmaals nadat uw computer opnieuw is opgestart om de installatie van [name] te voltooien.%n%nWilt u nu opnieuw opstarten? 218 | 219 | ; *** "Installing" wizard page 220 | WizardInstalling=Bezig met installeren 221 | InstallingLabel=Setup installeert [name] op uw computer. Een ogenblik geduld... 222 | 223 | ; *** "Setup Completed" wizard page 224 | FinishedHeadingLabel=Setup heeft het installeren van [name] op deze computer voltooid. 225 | FinishedLabelNoIcons=Setup heeft het installeren van [name] op deze computer voltooid. 226 | FinishedLabel=Setup heeft het installeren van [name] op deze computer voltooid. U kunt het programma uitvoeren met de geïnstalleerde snelkoppelingen. 227 | ClickFinish=Klik op Voltooien om Setup te beëindigen. 228 | FinishedRestartLabel=Setup moet de computer opnieuw opstarten om de installatie van [name] te voltooien. Wilt u nu opnieuw opstarten? 229 | FinishedRestartMessage=Setup moet uw computer opnieuw opstarten om de installatie van [name] te voltooien.%n%nWilt u nu opnieuw opstarten? 230 | ShowReadmeCheck=Ja, ik wil het bestand Leesmij zien 231 | YesRadio=&Ja, start de computer nu opnieuw op 232 | NoRadio=&Nee, ik start de computer later opnieuw op 233 | RunEntryExec=Start %1 234 | RunEntryShellExec=Bekijk %1 235 | 236 | ; *** "Setup Needs the Next Disk" stuff 237 | ChangeDiskTitle=Setup heeft de volgende diskette nodig 238 | SelectDiskLabel2=Voer diskette %1 in en klik op OK.%n%nAls de bestanden op deze diskette in een andere map gevonden kunnen worden dan die hieronder wordt getoond, voer dan het juiste pad in of klik op Bladeren. 239 | PathLabel=&Pad: 240 | FileNotInDir2=Kan het bestand "%1" niet vinden in "%2". Voer de juiste diskette in of kies een andere map. 241 | SelectDirectoryLabel=Geef de locatie van de volgende diskette. 242 | 243 | ; *** Installation phase messages 244 | SetupAborted=Setup is niet voltooid.%n%nCorrigeer het probleem en voer Setup opnieuw uit. 245 | AbortRetryIgnoreSelectAction=Selecteer actie 246 | AbortRetryIgnoreRetry=&Probeer opnieuw 247 | AbortRetryIgnoreIgnore=&Negeer de fout en ga door 248 | AbortRetryIgnoreCancel=Breek installatie af 249 | 250 | ; *** Installation status messages 251 | StatusClosingApplications=Programma's afsluiten... 252 | StatusCreateDirs=Mappen maken... 253 | StatusExtractFiles=Bestanden uitpakken... 254 | StatusCreateIcons=Snelkoppelingen maken... 255 | StatusCreateIniEntries=INI-gegevens instellen... 256 | StatusCreateRegistryEntries=Registergegevens instellen... 257 | StatusRegisterFiles=Bestanden registreren... 258 | StatusSavingUninstall=Verwijderingsinformatie opslaan... 259 | StatusRunProgram=Installatie voltooien... 260 | StatusRestartingApplications=Programma's opnieuw starten... 261 | StatusRollback=Veranderingen ongedaan maken... 262 | 263 | ; *** Misc. errors 264 | ErrorInternal2=Interne fout: %1 265 | ErrorFunctionFailedNoCode=%1 mislukt 266 | ErrorFunctionFailed=%1 mislukt; code %2 267 | ErrorFunctionFailedWithMessage=%1 mislukt; code %2.%n%3 268 | ErrorExecutingProgram=Kan bestand niet uitvoeren:%n%1 269 | 270 | ; *** Registry errors 271 | ErrorRegOpenKey=Fout bij het openen van registersleutel:%n%1\%2 272 | ErrorRegCreateKey=Fout bij het maken van registersleutel:%n%1\%2 273 | ErrorRegWriteKey=Fout bij het schrijven naar registersleutel:%n%1\%2 274 | 275 | ; *** INI errors 276 | ErrorIniEntry=Fout bij het maken van een INI-instelling in bestand "%1". 277 | 278 | ; *** File copying errors 279 | FileAbortRetryIgnoreSkipNotRecommended=&Sla dit bestand over (niet aanbevolen) 280 | FileAbortRetryIgnoreIgnoreNotRecommended=&Negeer de fout en ga door (niet aanbevolen) 281 | SourceIsCorrupted=Het bronbestand is beschadigd 282 | SourceDoesntExist=Het bronbestand "%1" bestaat niet 283 | ExistingFileReadOnly2=Het bestaande bestand kon niet vervangen worden omdat het een alleen-lezen markering heeft. 284 | ExistingFileReadOnlyRetry=&Verwijder de alleen-lezen markering en probeer het opnieuw 285 | ExistingFileReadOnlyKeepExisting=&Behoud het bestaande bestand 286 | ErrorReadingExistingDest=Er is een fout opgetreden bij het lezen van het bestaande bestand: 287 | FileExistsSelectAction=Selecteer actie 288 | FileExists2=Het bestand bestaat al. 289 | FileExistsOverwriteExisting=&Overschrijf het bestaande bestand 290 | FileExistsKeepExisting=&Behoud het bestaande bestand 291 | FileExistsOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren 292 | ExistingFileNewerSelectAction=Selecteer actie 293 | ExistingFileNewer2=Het bestaande bestand is nieuwer dan het bestand dat Setup probeert te installeren. 294 | ExistingFileNewerOverwriteExisting=&Overschrijf het bestaande bestand 295 | ExistingFileNewerKeepExisting=&Behoud het bestaande bestand (aanbevolen) 296 | ExistingFileNewerOverwriteOrKeepAll=&Dit voor de volgende conflicten uitvoeren 297 | ErrorChangingAttr=Er is een fout opgetreden bij het wijzigen van de kenmerken van het bestaande bestand: 298 | ErrorCreatingTemp=Er is een fout opgetreden bij het maken van een bestand in de doelmap: 299 | ErrorReadingSource=Er is een fout opgetreden bij het lezen van het bronbestand: 300 | ErrorCopying=Er is een fout opgetreden bij het kopiëren van een bestand: 301 | ErrorReplacingExistingFile=Er is een fout opgetreden bij het vervangen van het bestaande bestand: 302 | ErrorRestartReplace=Vervangen na opnieuw starten is mislukt: 303 | ErrorRenamingTemp=Er is een fout opgetreden bij het hernoemen van een bestand in de doelmap: 304 | ErrorRegisterServer=Kan de DLL/OCX niet registreren: %1 305 | ErrorRegSvr32Failed=RegSvr32 mislukt met afsluitcode %1 306 | ErrorRegisterTypeLib=Kan de type library niet registreren: %1 307 | 308 | ; *** Uninstall display name markings 309 | UninstallDisplayNameMark=%1 (%2) 310 | UninstallDisplayNameMarks=%1 (%2, %3) 311 | UninstallDisplayNameMark32Bit=32-bit 312 | UninstallDisplayNameMark64Bit=64-bit 313 | UninstallDisplayNameMarkAllUsers=Alle gebruikers 314 | UninstallDisplayNameMarkCurrentUser=Huidige gebruiker 315 | 316 | ; *** Post-installation errors 317 | ErrorOpeningReadme=Er is een fout opgetreden bij het openen van het Leesmij-bestand. 318 | ErrorRestartingComputer=Setup kan de computer niet opnieuw opstarten. Doe dit handmatig. 319 | 320 | ; *** Uninstaller messages 321 | UninstallNotFound=Bestand "%1" bestaat niet. Kan het programma niet verwijderen. 322 | UninstallUnsupportedVer=Het installatie-logbestand "%1" heeft een formaat dat niet herkend wordt door deze versie van het verwijderprogramma. Kan het programma niet verwijderen 323 | UninstallUnknownEntry=Er is een onbekend gegeven (%1) aangetroffen in het installatie-logbestand 324 | ConfirmUninstall=Weet u zeker dat u %1 en alle bijbehorende componenten wilt verwijderen? 325 | UninstallOnlyOnWin64=Deze installatie kan alleen worden verwijderd onder 64-bit Windows. 326 | OnlyAdminCanUninstall=Deze installatie kan alleen worden verwijderd door een gebruiker met administratieve rechten. 327 | UninstallStatusLabel=%1 wordt verwijderd van uw computer. Een ogenblik geduld. 328 | UninstallOpenError=Bestand "%1" kon niet worden geopend. Kan het verwijderen niet voltooien. 329 | UninstalledAll=%1 is met succes van deze computer verwijderd. 330 | UninstalledMost=Het verwijderen van %1 is voltooid.%n%nEnkele elementen konden niet verwijderd worden. Deze kunnen handmatig verwijderd worden. 331 | UninstalledAndNeedsRestart=Om het verwijderen van %1 te voltooien, moet uw computer opnieuw worden opgestart.%n%nWilt u nu opnieuw opstarten? 332 | UninstallDataCorrupted="%1" bestand is beschadigd. Kan verwijderen niet voltooien 333 | 334 | ; *** Uninstallation phase messages 335 | ConfirmDeleteSharedFileTitle=Gedeeld bestand verwijderen? 336 | ConfirmDeleteSharedFile2=Het systeem geeft aan dat het volgende gedeelde bestand niet langer gebruikt wordt door enig programma. Wilt u dat dit gedeelde bestand verwijderd wordt?%n%nAls dit bestand toch nog gebruikt wordt door een programma en het verwijderd wordt, werkt dat programma misschien niet meer correct. Als u het niet zeker weet, kies dan Nee. Bewaren van het bestand op dit systeem is niet schadelijk. 337 | SharedFileNameLabel=Bestandsnaam: 338 | SharedFileLocationLabel=Locatie: 339 | WizardUninstalling=Verwijderingsstatus 340 | StatusUninstalling=Verwijderen van %1... 341 | 342 | ; *** Shutdown block reasons 343 | ShutdownBlockReasonInstallingApp=Installeren van %1. 344 | ShutdownBlockReasonUninstallingApp=Verwijderen van %1. 345 | 346 | [CustomMessages] 347 | 348 | NameAndVersion=%1 versie %2 349 | AdditionalIcons=Extra snelkoppelingen: 350 | CreateDesktopIcon=Maak een snelkoppeling op het &bureaublad 351 | CreateQuickLaunchIcon=Maak een snelkoppeling op de &Snel starten werkbalk 352 | ProgramOnTheWeb=%1 op het Web 353 | UninstallProgram=Verwijder %1 354 | LaunchProgram=&Start %1 355 | AssocFileExtension=&Koppel %1 aan de %2 bestandsextensie 356 | AssocingFileExtension=Bezig met koppelen van %1 aan de %2 bestandsextensie... 357 | AutoStartProgramGroupDescription=Opstarten: 358 | AutoStartProgram=%1 automatisch starten 359 | AddonHostProgramNotFound=%1 kon niet worden gevonden in de geselecteerde map.%n%nWilt u toch doorgaan? 360 | -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Finnish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Finnish.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Greek.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Greek.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Hebrew.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Hebrew.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Hungarian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Hungarian.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Icelandic.isl: -------------------------------------------------------------------------------- 1 | ; *** Inno Setup version 6.1.0+ Icelandic messages *** 2 | ; 3 | ; Translator: Stefán Örvar Sigmundsson, eMedia Intellect 4 | ; Contact: emi@emi.is 5 | ; Date: 2020-07-25 6 | 7 | [LangOptions] 8 | 9 | LanguageName=<00CD>slenska 10 | LanguageID=$040F 11 | LanguageCodePage=1252 12 | 13 | [Messages] 14 | 15 | ; *** Application titles 16 | SetupAppTitle=Uppsetning 17 | SetupWindowTitle=Uppsetning - %1 18 | UninstallAppTitle=Niðurtaka 19 | UninstallAppFullTitle=%1-niðurtaka 20 | 21 | ; *** Misc. common 22 | InformationTitle=Upplýsingar 23 | ConfirmTitle=Staðfesta 24 | ErrorTitle=Villa 25 | 26 | ; *** SetupLdr messages 27 | SetupLdrStartupMessage=Þetta mun uppsetja %1. Vilt þú halda áfram? 28 | LdrCannotCreateTemp=Ófært um að skapa tímabundna skrá. Uppsetningu hætt 29 | LdrCannotExecTemp=Ófært um að keyra skrá í tímabundna skráasafninu. Uppsetningu hætt 30 | HelpTextNote= 31 | 32 | ; *** Startup error messages 33 | LastErrorMessage=%1.%n%nVilla %2: %3 34 | SetupFileMissing=Skrána %1 vantar úr uppsetningarskráasafninu. Vinsamlega leiðréttu vandamálið eða fáðu nýtt afrita af forritinu. 35 | SetupFileCorrupt=Uppsetningarskrárnar eru spilltar. Vinsamlega fáðu nýtt afrita af forritinu. 36 | SetupFileCorruptOrWrongVer=Uppsetningarskrárnar eru spilltar eða eru ósamrýmanlegar við þessa útgáfu af Uppsetningu. Vinsamlega leiðréttu vandamálið eða fáðu nýtt afrit af forritinu. 37 | InvalidParameter=Ógild færibreyta var afhend á skipanalínunni:%n%n%1 38 | SetupAlreadyRunning=Uppsetning er nú þegar keyrandi. 39 | WindowsVersionNotSupported=Þetta forrit styður ekki útgáfuna af Windows sem tölvan þín er keyrandi. 40 | WindowsServicePackRequired=Þetta forrit krefst Þjónustupakka %2 eða síðari. 41 | NotOnThisPlatform=Þetta forrit mun ekki keyra á %1. 42 | OnlyOnThisPlatform=Þetta forrit verður að keyra á %1. 43 | OnlyOnTheseArchitectures=Þetta forrit er einungis hægt að uppsetja á útgáfur af Windows hannaðar fyrir eftirfarandi gjörvahannanir:%n%n%1 44 | WinVersionTooLowError=Þetta forrit krefst %1-útgáfu %2 eða síðari. 45 | WinVersionTooHighError=Þetta forrit er ekki hægt að uppsetja á %1-útgáfu %2 eða síðari. 46 | AdminPrivilegesRequired=Þú verður að vera innskráð(ur) sem stjórnandi meðan þú uppsetur þetta forrit. 47 | PowerUserPrivilegesRequired=Þú verður að vera innskráð(ur) sem stjórnandi eða sem meðlimur Power Users-hópsins meðan þú uppsetur þetta forrit. 48 | SetupAppRunningError=Uppsetning hefur greint að %1 er eins og er keyrandi.%n%nVinsamlega lokaðu öllum tilvikum þess núna, smelltu síðan á Í lagi til að halda áfram eða Hætta við til að hætta. 49 | UninstallAppRunningError=Niðurtaka hefur greint að %1 er eins og er keyrandi.%n%nVinsamlega lokaðu öllum tilvikum þess núna, smelltu síðan á Í lagi til að halda áfram eða Hætta við til að hætta. 50 | 51 | ; *** Startup questions 52 | PrivilegesRequiredOverrideTitle=Veldu uppsetningarham 53 | PrivilegesRequiredOverrideInstruction=Veldu uppsetningarham 54 | PrivilegesRequiredOverrideText1=%1 er hægt að setja upp fyrir alla notendur (krefst stjórnandaréttinda) eða fyrir þig einungis. 55 | PrivilegesRequiredOverrideText2=%1 er hægt að setja upp fyrir þig einungis eða fyrir alla notendur (krefst stjórnandaréttinda). 56 | PrivilegesRequiredOverrideAllUsers=Uppsetja fyrir &alla notendur 57 | PrivilegesRequiredOverrideAllUsersRecommended=Uppsetja fyrir &alla notendur (ráðlagt) 58 | PrivilegesRequiredOverrideCurrentUser=Uppsetja fyrir &mig einungis 59 | PrivilegesRequiredOverrideCurrentUserRecommended=Uppsetja fyrir &mig einungis (ráðlagt) 60 | 61 | ; *** Misc. errors 62 | ErrorCreatingDir=Uppsetningunni var ófært um að skapa skráasafnið „%1“ 63 | ErrorTooManyFilesInDir=Ófært um að skapa skrá í skráasafninu „%1“ vegna þess það inniheldur of margar skrár 64 | 65 | ; *** Setup common messages 66 | ExitSetupTitle=Hætta í Uppsetningu 67 | ExitSetupMessage=Uppsetningu er ekki lokið. Ef þú hættir núna mun forritið ekki vera uppsett.%n%nÞú getur keyrt Uppsetningu aftur síðar til að ljúka uppsetningunni.%n%nHætta í Uppsetningu? 68 | AboutSetupMenuItem=&Um Uppsetningu… 69 | AboutSetupTitle=Um Uppsetningu 70 | AboutSetupMessage=%1 útgáfa %2%n%3%n%n%1 heimasíðu:%n%4 71 | AboutSetupNote= 72 | TranslatorNote=Stefán Örvar Sigmundsson, eMedia Intellect 73 | 74 | ; *** Buttons 75 | ButtonBack=< &Fyrri 76 | ButtonNext=&Næst > 77 | ButtonInstall=&Uppsetja 78 | ButtonOK=Í lagi 79 | ButtonCancel=Hætta við 80 | ButtonYes=&Já 81 | ButtonYesToAll=Já við &öllu 82 | ButtonNo=&Nei 83 | ButtonNoToAll=&Nei við öllu 84 | ButtonFinish=&Ljúka 85 | ButtonBrowse=&Vafra… 86 | ButtonWizardBrowse=&Vafra… 87 | ButtonNewFolder=&Skapa nýja möppu 88 | 89 | ; *** "Select Language" dialog messages 90 | SelectLanguageTitle=Veldu tungumál Uppsetningar 91 | SelectLanguageLabel=Veldu tungumálið sem nota á við uppsetninguna. 92 | 93 | ; *** Common wizard text 94 | ClickNext=Smelltu á Næst til að halda áfram eða Hætta við til að hætta Uppsetningu. 95 | BeveledLabel= 96 | BrowseDialogTitle=Vafra eftir möppu 97 | BrowseDialogLabel=Veldu möppu í listanum fyrir neðan, smelltu síðan á Í lagi. 98 | NewFolderName=Ný mappa 99 | 100 | ; *** "Welcome" wizard page 101 | WelcomeLabel1=Velkomin(n) í [name]-uppsetningaraðstoðarann 102 | WelcomeLabel2=Þetta mun uppsetja [name/ver] á þína tölvu.%n%nÞað er ráðlagt að þú lokir öllum öðrum hugbúnaði áður en haldið er áfram. 103 | 104 | ; *** "Password" wizard page 105 | WizardPassword=Aðgangsorð 106 | PasswordLabel1=Þessi uppsetning er aðgangsorðsvarin. 107 | PasswordLabel3=Vinsamlega veitu aðgangsorðið, smelltu síðan á Næst til að halda áfram. Aðgangsorð eru hástafanæm. 108 | PasswordEditLabel=&Aðgangsorð: 109 | IncorrectPassword=Aðgangsorðið sem þú innslóst er ekki rétt. Vinsamlega reyndu aftur. 110 | 111 | ; *** "License Agreement" wizard page 112 | WizardLicense=Leyfissamningur 113 | LicenseLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. 114 | LicenseLabel3=Vinsamlega lestu eftirfarandi leyfissamning. Þú verður að samþykkja skilmála samningsins áður en haldið er áfram með uppsetninguna. 115 | LicenseAccepted=Ég &samþykki samninginn 116 | LicenseNotAccepted=Ég samþykki &ekki samninginn 117 | 118 | ; *** "Information" wizard pages 119 | WizardInfoBefore=Upplýsingar 120 | InfoBeforeLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. 121 | InfoBeforeClickLabel=Þegar þú ert tilbúin(n) til að halda áfram með Uppsetninguna, smelltu á Næst. 122 | WizardInfoAfter=Upplýsingar 123 | InfoAfterLabel=Vinsamlega lestu hinar eftirfarandi mikilvægu upplýsingar áður en haldið er áfram. 124 | InfoAfterClickLabel=Þegar þú ert tilbúin(n) til að halda áfram með Uppsetninguna, smelltu á Næst. 125 | 126 | ; *** "User Information" wizard page 127 | WizardUserInfo=Notandaupplýsingar 128 | UserInfoDesc=Vinsamlega innsláðu upplýsingarnar þínar. 129 | UserInfoName=&Notandanafn: 130 | UserInfoOrg=&Stofnun: 131 | UserInfoSerial=&Raðnúmer: 132 | UserInfoNameRequired=Þú verður að innslá nafn. 133 | 134 | ; *** "Select Destination Location" wizard page 135 | WizardSelectDir=Velja staðsetningu 136 | SelectDirDesc=Hvar ætti [name] að vera uppsettur? 137 | SelectDirLabel3=Uppsetning mun uppsetja [name] í hina eftirfarandi möppu. 138 | SelectDirBrowseLabel=Til að halda áfram, smelltu á Næst. Ef þú vilt velja aðra möppu, smelltu á Vafra. 139 | DiskSpaceGBLabel=Að minnsta kosti [gb] GB af lausu diskplássi er krafist. 140 | DiskSpaceMBLabel=Að minnsta kosti [mb] MB af lausu diskplássi er krafist. 141 | CannotInstallToNetworkDrive=Uppsetning getur ekki uppsett á netdrif. 142 | CannotInstallToUNCPath=Uppsetning getur ekki uppsett á UNC-slóð. 143 | InvalidPath=Þú verður að innslá fulla slóð með drifstaf; til dæmis:%n%nC:\APP%n%neða UNC-slóð samkvæmt sniðinu:%n%n\\server\share 144 | InvalidDrive=Drifið eða UNC-deilingin sem þú valdir er ekki til eða er ekki aðgengileg. Vinsamlega veldu annað. 145 | DiskSpaceWarningTitle=Ekki nóg diskpláss 146 | DiskSpaceWarning=Uppsetning krefst að minnsta kosti %1 KB af lausu plássi til að uppsetja, en hið valda drif hefur einungis %2 KB tiltæk.%n%nVilt þú halda áfram hvort sem er? 147 | DirNameTooLong=Möppunafnið eða slóðin er of löng. 148 | InvalidDirName=Möppunafnið er ekki gilt. 149 | BadDirName32=Möppunöfn geta ekki innihaldið nein af hinum eftirfarandi rittáknum:%n%n%1 150 | DirExistsTitle=Mappa er til 151 | DirExists=Mappan:%n%n%1%n%ner nú þegar til. Vilt þú uppsetja í þá möppu hvort sem er? 152 | DirDoesntExistTitle=Mappa er ekki til 153 | DirDoesntExist=Mappan:%n%n%1%n%ner ekki til. Vilt þú að mappan sé sköpuð? 154 | 155 | ; *** "Select Components" wizard page 156 | WizardSelectComponents=Velja atriði 157 | SelectComponentsDesc=Hvaða atriði ætti að uppsetja? 158 | SelectComponentsLabel2=Veldu atriðin sem þú vilt uppsetja; hreinsaðu atriðin sem þú vilt ekki uppsetja. Smelltu á Næst þegar þú ert tilbúin(n) til að halda áfram. 159 | FullInstallation=Full uppsetning 160 | CompactInstallation=Samanþjöppuð uppsetning 161 | CustomInstallation=Sérsnídd uppsetning 162 | NoUninstallWarningTitle=Atriði eru til 163 | NoUninstallWarning=Uppsetning hefur greint það að eftirfarandi atriði eru nú þegar uppsett á tölvunni þinni:%n%n%1%n%nAð afvelja þessi atriði mun ekki niðurtaka þau.%n%nVilt þú halda áfram hvort sem er? 164 | ComponentSize1=%1 KB 165 | ComponentSize2=%1 MB 166 | ComponentsDiskSpaceGBLabel=Núverandi val krefst að minnsta kosti [gb] GB af diskplássi. 167 | ComponentsDiskSpaceMBLabel=Núverandi val krefst að minnsta kosti [mb] MB af diskplássi. 168 | 169 | ; *** "Select Additional Tasks" wizard page 170 | WizardSelectTasks=Veldu aukaleg verk 171 | SelectTasksDesc=Hvaða aukalegu verk ættu að vera framkvæmd? 172 | SelectTasksLabel2=Veldu hin aukalegu verk sem þú vilt að Uppsetning framkvæmi meðan [name] er uppsettur, ýttu síðan á Næst. 173 | 174 | ; *** "Select Start Menu Folder" wizard page 175 | WizardSelectProgramGroup=Veldu Upphafsvalmyndarmöppu 176 | SelectStartMenuFolderDesc=Hvert ætti Uppsetning að setja skyndivísa forritsins? 177 | SelectStartMenuFolderLabel3=Uppsetning mun skapa skyndivísa forritsins í hina eftirfarandi Upphafsvalmyndarmöppu. 178 | SelectStartMenuFolderBrowseLabel=Til að halda áfram, smelltu á Næst. Ef þú vilt velja aðra möppu, smelltu á Vafra. 179 | MustEnterGroupName=Þú verður að innslá möppunafn. 180 | GroupNameTooLong=Möppunafnið eða slóðin er of löng. 181 | InvalidGroupName=Möppunafnið er ekki gilt. 182 | BadGroupName=Möppunafnið getur ekki innihaldið neitt af hinum eftirfarandi rittáknum:%n%n%1 183 | NoProgramGroupCheck2=&Ekki skapa Upphafsvalmyndarmöppu 184 | 185 | ; *** "Ready to Install" wizard page 186 | WizardReady=Tilbúin til að uppsetja 187 | ReadyLabel1=Uppsetning er núna tilbúin til að hefja uppsetningu [name] á tölvuna þína. 188 | ReadyLabel2a=Smelltu á Uppsetja til að halda áfram uppsetningunni eða smelltu á Til baka ef þú vilt endurskoða eða breyta einhverjum stillingum. 189 | ReadyLabel2b=Smelltu á Uppsetja til að halda áfram uppsetningunni. 190 | ReadyMemoUserInfo=Notandaupplýsingar: 191 | ReadyMemoDir=Staðsetning: 192 | ReadyMemoType=Uppsetningartegund: 193 | ReadyMemoComponents=Valin atriði: 194 | ReadyMemoGroup=Upphafsvalmyndarmappa: 195 | ReadyMemoTasks=Aukaleg verk: 196 | 197 | ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile 198 | DownloadingLabel=Niðurhlaðandi aukalegum skrám… 199 | ButtonStopDownload=&Stöðva niðurhleðslu 200 | StopDownload=Ert þú viss um að þú viljir stöðva niðurhleðsluna? 201 | ErrorDownloadAborted=Niðurhleðslu hætt 202 | ErrorDownloadFailed=Niðurhleðsla mistókst: %1 %2 203 | ErrorDownloadSizeFailed=Mistókst að sækja stærð: %1 %2 204 | ErrorFileHash1=Skráarhakk mistókst: %1 205 | ErrorFileHash2=Ógilt skráarhakk: bjóst við %1, fékk %2 206 | ErrorProgress=Ógild framvinda: %1 of %2 207 | ErrorFileSize=Ógild skráarstærð: bjóst við %1, fékk %2 208 | 209 | ; *** "Preparing to Install" wizard page 210 | WizardPreparing=Undirbúandi uppsetningu 211 | PreparingDesc=Uppsetning er undirbúandi uppsetningu [name] á tölvuna þína. 212 | PreviousInstallNotCompleted=Uppsetningu/Fjarlægingu eftirfarandi forrits var ekki lokið. Þú þarft að endurræsa tölvuna þína til að ljúka þeirri uppsetningu.%n%nEftir endurræsingu tölvunnar þinnar, keyrðu Uppsetningu aftur til að ljúka uppsetningu [name]. 213 | CannotContinue=Uppsetning getur ekki haldið áfram. Vinsamlega smelltu á Hætta við til að hætta. 214 | ApplicationsFound=Eftirfarandi hugbúnaður er notandi skrár sem þurfa að vera uppfærðar af Uppsetningu. Það er ráðlagt að þú leyfir Uppsetningu sjálfvirkt að loka þessum hugbúnaði. 215 | ApplicationsFound2=Eftirfarandi hugbúnaður er notandi skrár sem þurfa að vera uppfærðar af Uppsetningu. Það er ráðlagt að þú leyfir Uppsetningu sjálfvirkt að loka þessum hugbúnaði. Eftir að uppsetningunni lýkur mun Uppsetning reyna að endurræsa hugbúnaðinn. 216 | CloseApplications=&Sjálfvirkt loka hugbúnaðinum 217 | DontCloseApplications=&Ekki loka hugbúnaðinum 218 | ErrorCloseApplications=Uppsetningu var ófært um að sjálfvirkt loka öllum hugbúnaði. Það er ráðlagt að þú lokir öllum hugbúnaði notandi skrár sem þurfa að vera uppfærðar af Uppsetningu áður en haldið er áfram. 219 | PrepareToInstallNeedsRestart=Þú verður að endurræsa tölvuna þína. Eftir að hafa endurræst tölvuna þína, keyrðu Uppsetningu aftur til að ljúka uppsetningu [name].%n%nVilt þú endurræsa núna? 220 | 221 | ; *** "Installing" wizard page 222 | WizardInstalling=Uppsetjandi 223 | InstallingLabel=Vinsamlega bíddu meðan Uppsetning uppsetur [name] á tölvuna þína. 224 | 225 | ; *** "Setup Completed" wizard page 226 | FinishedHeadingLabel=Ljúkandi [name]-uppsetningaraðstoðaranum 227 | FinishedLabelNoIcons=Uppsetning hefur lokið uppsetningu [name] á tölvuna þína. 228 | FinishedLabel=Uppsetning hefur lokið uppsetningu [name] á þinni tölvu. Hugbúnaðurinn getur verið ræstur með því að velja hina uppsettu skyndivísa. 229 | ClickFinish=Smelltu á Ljúka til að hætta í Uppsetningu. 230 | FinishedRestartLabel=Til að ljúka uppsetningu [name] þarft Uppsetning að endurræsa tölvuna þína. Vilt þú endurræsa núna? 231 | FinishedRestartMessage=Til að ljúka uppsetningu [name] þarf Uppsetning að endurræsa tölvuna þína.%n%nVilt þú endurræsa núna? 232 | ShowReadmeCheck=Já, ég vil skoða README-skrána 233 | YesRadio=&Já, endurræsa tölvuna núna 234 | NoRadio=&Nei, ég mun endurræsa tölvuna síðar 235 | RunEntryExec=Keyra %1 236 | RunEntryShellExec=Skoða %1 237 | 238 | ; *** "Setup Needs the Next Disk" stuff 239 | ChangeDiskTitle=Uppsetning þarfnast næsta disks 240 | SelectDiskLabel2=Vinsamlega settu inn disk %1 og smelltu á Í lagi.%n%nEf skrárnar á þessum disk er hægt að finna í annarri möppu en þeirri sem birt er fyrir neðan, innsláðu réttu slóðina og smelltu á Vafra. 241 | PathLabel=&Slóð: 242 | FileNotInDir2=Skrána „%1“ var ekki hægt að staðsetja í „%2“. Vinsamlega settu inn rétta diskinn eða veldu aðra möppu. 243 | SelectDirectoryLabel=Vinsamlega tilgreindu staðsetningu næsta disks. 244 | 245 | ; *** Installation phase messages 246 | SetupAborted=Uppsetningu var ekki lokið.%n%nVinsamlega leiðréttu vandamálið og keyrðu Uppsetningu aftur. 247 | AbortRetryIgnoreSelectAction=Velja aðgerð 248 | AbortRetryIgnoreRetry=&Reyna aftur 249 | AbortRetryIgnoreIgnore=&Hunsa villuna og halda áfram 250 | AbortRetryIgnoreCancel=Hætta við uppsetningu 251 | 252 | ; *** Installation status messages 253 | StatusClosingApplications=Lokandi hugbúnaði… 254 | StatusCreateDirs=Skapandi skráasöfn… 255 | StatusExtractFiles=Útdragandi skrár… 256 | StatusCreateIcons=Skapandi skyndivísa… 257 | StatusCreateIniEntries=Skapandi INI-færslur… 258 | StatusCreateRegistryEntries=Skapandi Windows Registry-færslur… 259 | StatusRegisterFiles=Skrásetjandi skrár… 260 | StatusSavingUninstall=Vistandi niðurtekningarupplýsingar… 261 | StatusRunProgram=Ljúkandi uppsetningu… 262 | StatusRestartingApplications=Endurræsandi hugbúnað… 263 | StatusRollback=Rúllandi aftur breytingum… 264 | 265 | ; *** Misc. errors 266 | ErrorInternal2=Innri villa: %1 267 | ErrorFunctionFailedNoCode=%1 mistókst 268 | ErrorFunctionFailed=%1 mistókst; kóði %2 269 | ErrorFunctionFailedWithMessage=%1 mistókst; kóði %2.%n%3 270 | ErrorExecutingProgram=Ófært um að keyra skrá:%n%1 271 | 272 | ; *** Registry errors 273 | ErrorRegOpenKey=Villa við opnun Windows Registry-lykils:%n%1\%2 274 | ErrorRegCreateKey=Villa við sköpun Windows Registry-lykils:%n%1\%2 275 | ErrorRegWriteKey=Villa við ritun í Windows Registry-lykil:%n%1\%2 276 | 277 | ; *** INI errors 278 | ErrorIniEntry=Villa við sköpun INI-færslu í skrána „%1“. 279 | 280 | ; *** File copying errors 281 | FileAbortRetryIgnoreSkipNotRecommended=&Sleppa þessari skrá (ekki ráðlagt) 282 | FileAbortRetryIgnoreIgnoreNotRecommended=&Hunsa villuna og halda áfram (ekki ráðlagt) 283 | SourceIsCorrupted=Upprunaskráin er spillt 284 | SourceDoesntExist=Upprunaskráin „%1“ er ekki til 285 | ExistingFileReadOnly2=Hina gildandi skrá var ekki hægt að yfirrita því hún er merkt sem lesa-einungis. 286 | ExistingFileReadOnlyRetry=&Fjarlægja lesa-einungis eigindi og reyna aftur 287 | ExistingFileReadOnlyKeepExisting=&Halda gildandi skrá 288 | ErrorReadingExistingDest=Villa kom upp meðan reynt var að lesa gildandi skrána: 289 | FileExistsSelectAction=Velja aðgerð 290 | FileExists2=Skráin er nú þegar til. 291 | FileExistsOverwriteExisting=&Yfirrita hina gildandi skrá 292 | FileExistsKeepExisting=&Halda hinni gildandi skrá 293 | FileExistsOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður 294 | ExistingFileNewerSelectAction=Velja aðgerð 295 | ExistingFileNewer2=Hin gildandi skrá er nýrri en sú sem Uppsetning er að reyna að uppsetja. 296 | ExistingFileNewerOverwriteExisting=&Yfirrita hina gildandi skrá 297 | ExistingFileNewerKeepExisting=&Halda hinni gildandi skrá (ráðlagt) 298 | ExistingFileNewerOverwriteOrKeepAll=&Gera þetta við næstu ósamstæður 299 | ErrorChangingAttr=Villa kom upp meðan reynt var að breyta eigindum gildandi skráarinnar: 300 | ErrorCreatingTemp=Villa kom upp meðan reynt var að skapa skrá í staðsetningarskráasafninu: 301 | ErrorReadingSource=Villa kom upp meðan reynt var að lesa upprunaskrána: 302 | ErrorCopying=Villa kom upp meðan reynt var að afrita skrána: 303 | ErrorReplacingExistingFile=Villa kom upp meðan reynt var að yfirrita gildandi skrána: 304 | ErrorRestartReplace=RestartReplace mistókst: 305 | ErrorRenamingTemp=Villa kom upp meðan reynt var að endurnefna skrá í staðsetningarskráasafninu: 306 | ErrorRegisterServer=Ófært um að skrá DLL/OCX: %1 307 | ErrorRegSvr32Failed=RegSvr32 mistókst með skilakóðann %1 308 | ErrorRegisterTypeLib=Ófært um að skrá tegundasafnið: $1 309 | 310 | ; *** Uninstall display name markings 311 | UninstallDisplayNameMark=%1 (%2) 312 | UninstallDisplayNameMarks=%1 (%2, %3) 313 | UninstallDisplayNameMark32Bit=32-bita 314 | UninstallDisplayNameMark64Bit=64-bita 315 | UninstallDisplayNameMarkAllUsers=Allir notendur 316 | UninstallDisplayNameMarkCurrentUser=Núverandi notandi 317 | 318 | ; *** Post-installation errors 319 | ErrorOpeningReadme=Villa kom upp meðan reynt var að opna README-skrána. 320 | ErrorRestartingComputer=Uppsetningu tókst ekki að endurræsa tölvuna. Vinsamlega gerðu þetta handvirkt. 321 | 322 | ; *** Uninstaller messages 323 | UninstallNotFound=Skráin „%1“ er ekki til. Getur ekki niðurtekið. 324 | UninstallOpenError=Skrána „%1“ var ekki hægt að opna. Getur ekki niðurtekið 325 | UninstallUnsupportedVer=Niðurtökuatburðaskráin „%1“ er á sniði sem er ekki þekkt af þessari útgáfu af niðurtakaranum. Getur ekki niðurtekið 326 | UninstallUnknownEntry=Óþekkt færsla (%1) var fundin í niðurtökuatburðaskránni 327 | ConfirmUninstall=Ert þú viss um að þú viljir algjörlega fjarlægja %1 og öll atriði þess? 328 | UninstallOnlyOnWin64=Þessa uppsetningu er einungis hægt að niðurtaka á 64-bita Windows. 329 | OnlyAdminCanUninstall=Þessi uppsetning getur einungis verið niðurtekin af notanda með stjórnandaréttindi. 330 | UninstallStatusLabel=Vinsamlega bíddu meðan %1 er fjarlægt úr tölvunni þinni. 331 | UninstalledAll=%1 var færsællega fjarlægt af tölvunni þinni. 332 | UninstalledMost=%1-niðurtöku lokið.%n%nSuma liði var ekki hægt að fjarlægja. Þá er hægt að fjarlægja handvirkt. 333 | UninstalledAndNeedsRestart=Til að ljúka niðurtöku %1 þarf að endurræsa tölvuna þína.%n%nVilt þú endurræsa núna? 334 | UninstallDataCorrupted=„%1“-skráin er spillt. Getur ekki niðurtekið 335 | 336 | ; *** Uninstallation phase messages 337 | ConfirmDeleteSharedFileTitle=Fjarlægja deilda skrá? 338 | ConfirmDeleteSharedFile2=Kerfið gefur til kynna að hin eftirfarandi deilda skrá er ekki lengur í notkun hjá neinu forriti. Vilt þú að Niðurtakari fjarlægi þessa deildu skrá?%n%nEf einhver forrit eru enn notandi þessa skrá og hún er fjarlægð, kann að vera að þau forrit munu ekki virka almennilega. Ef þú ert óviss, veldu Nei. Að skilja skrána eftir á kerfinu þínu mun ekki valda skaða. 339 | SharedFileNameLabel=Skráarnafn: 340 | SharedFileLocationLabel=Staðsetning: 341 | WizardUninstalling=Niðurtökustaða 342 | StatusUninstalling=Niðurtakandi %1… 343 | 344 | ; *** Shutdown block reasons 345 | ShutdownBlockReasonInstallingApp=Uppsetjandi %1. 346 | ShutdownBlockReasonUninstallingApp=Niðurtakandi %1. 347 | 348 | [CustomMessages] 349 | 350 | NameAndVersion=%1 útgáfa %2 351 | AdditionalIcons=Aukalegir skyndivísir: 352 | CreateDesktopIcon=Skapa &skjáborðsskyndivísi 353 | CreateQuickLaunchIcon=Skapa &Skyndiræsitáknmynd 354 | ProgramOnTheWeb=%1 á Vefnum 355 | UninstallProgram=Niðurtaka %1 356 | LaunchProgram=Ræsa %1 357 | AssocFileExtension=&Tengja %1 við %2-skráarframlenginguna 358 | AssocingFileExtension=&Tengjandi %1 við %2-skráarframlenginguna… 359 | AutoStartProgramGroupDescription=Ræsing: 360 | AutoStartProgram=Sjálfvikt ræsa %1 361 | AddonHostProgramNotFound=%1 gat ekki staðsett möppuna sem þú valdir.%n%nVilt þú halda áfram hvort sem er? -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Japanese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Japanese.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Norwegian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Norwegian.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Polish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Polish.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Portuguese.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Portuguese.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Russian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Russian.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/ScottishGaelic.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/ScottishGaelic.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/SerbianCyrillic.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/SerbianCyrillic.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/SerbianLatin.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/SerbianLatin.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Slovenian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Slovenian.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Spanish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Spanish.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Turkish.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Turkish.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Languages/Ukrainian.isl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Languages/Ukrainian.isl -------------------------------------------------------------------------------- /setup_creator_binaries/Setup.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/Setup.e32 -------------------------------------------------------------------------------- /setup_creator_binaries/SetupClassicIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/SetupClassicIcon.ico -------------------------------------------------------------------------------- /setup_creator_binaries/SetupLdr.e32: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/SetupLdr.e32 -------------------------------------------------------------------------------- /setup_creator_binaries/WizClassicImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/WizClassicImage-IS.bmp -------------------------------------------------------------------------------- /setup_creator_binaries/WizClassicImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/WizClassicImage.bmp -------------------------------------------------------------------------------- /setup_creator_binaries/WizClassicSmallImage-IS.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/WizClassicSmallImage-IS.bmp -------------------------------------------------------------------------------- /setup_creator_binaries/WizClassicSmallImage.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/WizClassicSmallImage.bmp -------------------------------------------------------------------------------- /setup_creator_binaries/isbunzip.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/isbunzip.dll -------------------------------------------------------------------------------- /setup_creator_binaries/isbzip.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/isbzip.dll -------------------------------------------------------------------------------- /setup_creator_binaries/islzma.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/islzma.dll -------------------------------------------------------------------------------- /setup_creator_binaries/isscint.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/isscint.dll -------------------------------------------------------------------------------- /setup_creator_binaries/isunzlib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/isunzlib.dll -------------------------------------------------------------------------------- /setup_creator_binaries/iszlib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/D4koon/WhatsappTray/accfba3c5fc2470408906a25b4ae2eb3e2d0ae57/setup_creator_binaries/iszlib.dll -------------------------------------------------------------------------------- /setup_creator_binaries/license.txt: -------------------------------------------------------------------------------- 1 | Inno Setup License 2 | ================== 3 | 4 | Except where otherwise noted, all of the documentation and software included in the Inno Setup 5 | package is copyrighted by Jordan Russell. 6 | 7 | Copyright (C) 1997-2021 Jordan Russell. All rights reserved. 8 | Portions Copyright (C) 2000-2021 Martijn Laan. All rights reserved. 9 | 10 | This software is provided "as-is," without any express or implied warranty. In no event shall the 11 | author be held liable for any damages arising from the use of this software. 12 | 13 | Permission is granted to anyone to use this software for any purpose, including commercial 14 | applications, and to alter and redistribute it, provided that the following conditions are met: 15 | 16 | 1. All redistributions of source code files must retain all copyright notices that are currently in 17 | place, and this list of conditions without modification. 18 | 19 | 2. All redistributions in binary form must retain all occurrences of the above copyright notice and 20 | web site addresses that are currently in place (for example, in the About boxes). 21 | 22 | 3. The origin of this software must not be misrepresented; you must not claim that you wrote the 23 | original software. If you use this software to distribute a product, an acknowledgment in the 24 | product documentation would be appreciated but is not required. 25 | 26 | 4. Modified versions in source or binary form must be plainly marked as such, and must not be 27 | misrepresented as being the original software. 28 | 29 | 30 | Jordan Russell 31 | jr-2020 AT jrsoftware.org 32 | https://jrsoftware.org/ --------------------------------------------------------------------------------