From 42a57b83877c8d898554911282c929cbe5f6c17a Mon Sep 17 00:00:00 2001 From: Nathan F Syfrig Date: Tue, 21 Apr 2026 23:56:54 -0700 Subject: [PATCH 1/3] Add new JSON-RPC API calls, with documentation --- docs/JSON-RPC.md | 34 ++++++++++++++++++++++++++++++++++ src/clientrpc.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/docs/JSON-RPC.md b/docs/JSON-RPC.md index 7cf7a92b3e..5556401a27 100644 --- a/docs/JSON-RPC.md +++ b/docs/JSON-RPC.md @@ -188,6 +188,40 @@ Results: | result.clients | array | The client list. See jamulusclient/clientListReceived for the format. | +### jamulusclient/getCurrentDirectory + +Returns the currently selected directory socket address. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params | object | No parameters (empty object). | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | The socket address of the current directory, usable as params.directory in jamulusclient/pollServerList. | + + +### jamulusclient/getDirectories + +Returns the list of directories in the same order as presented in Jamulus. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params | object | No parameters (empty object). | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | array | Array of directory socket address strings, usable as params.directory in jamulusclient/pollServerList. | + + ### jamulusclient/getMidiDevices Returns a list of available MIDI input devices. diff --git a/src/clientrpc.cpp b/src/clientrpc.cpp index c2efc59b25..28e632e118 100644 --- a/src/clientrpc.cpp +++ b/src/clientrpc.cpp @@ -183,6 +183,39 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe response["result"] = "ok"; } ); + /// @rpc_method jamulusclient/getDirectories + /// @brief Returns the list of directories in the same order as presented in Jamulus. + /// @param {object} params - No parameters (empty object). + /// @result {array} result - Array of directory socket address strings, usable as params.directory in jamulusclient/pollServerList. + pRpcServer->HandleMethod ( "jamulusclient/getDirectories", [=] ( const QJsonObject& params, QJsonObject& response ) { + QJsonArray arrDirectories; + // built-in directories in UI order + for ( int i = AT_DEFAULT; i < AT_CUSTOM; i++ ) + { + arrDirectories.append ( NetworkUtil::GetDirectoryAddress ( static_cast ( i ), "" ) ); + } + // custom directories — stored newest-first, displayed oldest-first (reverse iteration) + for ( int i = MAX_NUM_SERVER_ADDR_ITEMS - 1; i >= 0; i-- ) + { + if ( !m_pSettings->vstrDirectoryAddress[i].isEmpty() ) + { + arrDirectories.append ( m_pSettings->vstrDirectoryAddress[i] ); + } + } + response["result"] = arrDirectories; + Q_UNUSED ( params ); + } ); + + /// @rpc_method jamulusclient/getCurrentDirectory + /// @brief Returns the currently selected directory socket address. + /// @param {object} params - No parameters (empty object). + /// @result {string} result - The socket address of the current directory, usable as params.directory in jamulusclient/pollServerList. + pRpcServer->HandleMethod ( "jamulusclient/getCurrentDirectory", [=] ( const QJsonObject& params, QJsonObject& response ) { + response["result"] = NetworkUtil::GetDirectoryAddress ( m_pSettings->eDirectoryType, + m_pSettings->vstrDirectoryAddress[m_pSettings->iCustomDirectoryIndex] ); + Q_UNUSED ( params ); + } ); + /// @rpc_method jamulus/getMode /// @brief Returns the current mode, i.e. whether Jamulus is running as a server or client. /// @param {object} params - No parameters (empty object). From 05ce98aa870ad2cd77a3b78b4ed5f9788b4c5156 Mon Sep 17 00:00:00 2001 From: Nathan F Syfrig Date: Fri, 24 Apr 2026 13:06:34 -0700 Subject: [PATCH 2/3] Fix linter issue about split line --- src/clientrpc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clientrpc.cpp b/src/clientrpc.cpp index 28e632e118..c698106325 100644 --- a/src/clientrpc.cpp +++ b/src/clientrpc.cpp @@ -211,8 +211,8 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe /// @param {object} params - No parameters (empty object). /// @result {string} result - The socket address of the current directory, usable as params.directory in jamulusclient/pollServerList. pRpcServer->HandleMethod ( "jamulusclient/getCurrentDirectory", [=] ( const QJsonObject& params, QJsonObject& response ) { - response["result"] = NetworkUtil::GetDirectoryAddress ( m_pSettings->eDirectoryType, - m_pSettings->vstrDirectoryAddress[m_pSettings->iCustomDirectoryIndex] ); + response["result"] = + NetworkUtil::GetDirectoryAddress ( m_pSettings->eDirectoryType, m_pSettings->vstrDirectoryAddress[m_pSettings->iCustomDirectoryIndex] ); Q_UNUSED ( params ); } ); From 292658904b23cef3f13f00b3d43b9d23ef8386a1 Mon Sep 17 00:00:00 2001 From: Nathan F Syfrig Date: Tue, 14 Jul 2026 14:09:03 -0700 Subject: [PATCH 3/3] initial branch with new JSON-RPC API calls --- .github/autobuild/android.sh | 44 +- .github/autobuild/extractVersionChangelog.pl | 44 +- .github/autobuild/get_build_vars.py | 44 +- .github/autobuild/ios.sh | 44 +- .github/autobuild/linux_deb.sh | 44 +- .github/autobuild/mac.sh | 44 +- .github/autobuild/windows.ps1 | 44 +- .github/workflows/autobuild.yml | 14 +- .github/workflows/bump-dependencies.yml | 4 +- .github/workflows/check-json-rpcs-docs.yml | 2 +- .github/workflows/coding-style-check.yml | 6 +- .github/workflows/translation-check.yml | 2 +- .../workflows/update-copyright-notices.yml | 4 +- COMPILING.md | 8 +- CONTRIBUTING.md | 19 +- COPYING | 1350 +++++++++- ChangeLog | 73 +- Jamulus.pro | 5 +- README.md | 2 +- android/AndroidManifest.xml | 47 + android/res/drawable-hdpi/icon.png | Bin 4131 -> 3338 bytes android/res/drawable-ldpi/icon.png | Bin 2466 -> 2222 bytes android/res/drawable-mdpi/icon.png | Bin 3023 -> 2570 bytes android/res/drawable-xhdpi/icon.png | Bin 5230 -> 4108 bytes android/res/drawable-xxhdpi/icon.png | Bin 7482 -> 5812 bytes android/res/drawable-xxxhdpi/icon.png | Bin 9769 -> 7573 bytes docs/JAMULUS_PROTOCOL.md | 64 +- docs/JSON-RPC.md | 159 +- docs/README.md | 44 + docs/TRANSLATING.md | 44 + ios/Info.plist | 47 + ios/deploy_ios.sh | 46 + libs/NSIS/NSIS-source/Bin/GenPat.exe | Bin 0 -> 25088 bytes libs/NSIS/NSIS-source/Bin/MakeLangId.exe | Bin 0 -> 24576 bytes libs/NSIS/NSIS-source/Bin/RegTool-x86.bin | Bin 0 -> 5120 bytes libs/NSIS/NSIS-source/Bin/makensis.exe | Bin 0 -> 468992 bytes libs/NSIS/NSIS-source/Bin/zip2exe.exe | Bin 0 -> 23040 bytes libs/NSIS/NSIS-source/Bin/zlib1.dll | Bin 0 -> 81964 bytes libs/NSIS/NSIS-source/COPYING | 144 ++ .../Contrib/Graphics/Checks/big.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/classic-cross.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/classic.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/colorful.bmp | Bin 0 -> 2512 bytes .../Contrib/Graphics/Checks/grey-cross.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/grey.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/modern.bmp | Bin 0 -> 1652 bytes .../Contrib/Graphics/Checks/red-round.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/red.bmp | Bin 0 -> 886 bytes .../Contrib/Graphics/Checks/simple-round.bmp | Bin 0 -> 1616 bytes .../Contrib/Graphics/Checks/simple-round2.bmp | Bin 0 -> 1844 bytes .../Contrib/Graphics/Checks/simple.bmp | Bin 0 -> 1616 bytes .../Contrib/Graphics/Header/nsis-r.bmp | Bin 0 -> 9744 bytes .../Contrib/Graphics/Header/nsis.bmp | Bin 0 -> 9744 bytes .../Graphics/Header/nsis3-branding-r.bmp | Bin 0 -> 25820 bytes .../Graphics/Header/nsis3-branding.bmp | Bin 0 -> 25820 bytes .../Graphics/Header/nsis3-grey-right.bmp | Bin 0 -> 8932 bytes .../Contrib/Graphics/Header/nsis3-grey.bmp | Bin 0 -> 8956 bytes .../Graphics/Header/nsis3-metro-right.bmp | Bin 0 -> 25820 bytes .../Contrib/Graphics/Header/nsis3-metro.bmp | Bin 0 -> 25820 bytes .../Graphics/Header/nsis3-vintage-right.bmp | Bin 0 -> 8996 bytes .../Contrib/Graphics/Header/nsis3-vintage.bmp | Bin 0 -> 9008 bytes .../Contrib/Graphics/Header/orange-nsis.bmp | Bin 0 -> 9740 bytes .../Contrib/Graphics/Header/orange-r-nsis.bmp | Bin 0 -> 9740 bytes .../Contrib/Graphics/Header/orange-r.bmp | Bin 0 -> 9744 bytes .../Graphics/Header/orange-uninstall-nsis.bmp | Bin 0 -> 9740 bytes .../Header/orange-uninstall-r-nsis.bmp | Bin 0 -> 9740 bytes .../Graphics/Header/orange-uninstall-r.bmp | Bin 0 -> 9744 bytes .../Graphics/Header/orange-uninstall.bmp | Bin 0 -> 9744 bytes .../Contrib/Graphics/Header/orange.bmp | Bin 0 -> 9744 bytes .../Contrib/Graphics/Header/win.bmp | Bin 0 -> 9744 bytes .../Contrib/Graphics/Icons/arrow-install.ico | Bin 0 -> 4710 bytes .../Graphics/Icons/arrow-uninstall.ico | Bin 0 -> 4710 bytes .../Contrib/Graphics/Icons/arrow2-install.ico | Bin 0 -> 4710 bytes .../Graphics/Icons/arrow2-uninstall.ico | Bin 0 -> 4710 bytes .../Contrib/Graphics/Icons/box-install.ico | Bin 0 -> 4710 bytes .../Contrib/Graphics/Icons/box-uninstall.ico | Bin 0 -> 4710 bytes .../Graphics/Icons/classic-install.ico | Bin 0 -> 1078 bytes .../Graphics/Icons/classic-uninstall.ico | Bin 0 -> 1078 bytes .../Contrib/Graphics/Icons/llama-blue.ico | Bin 0 -> 2238 bytes .../Contrib/Graphics/Icons/llama-grey.ico | Bin 0 -> 2238 bytes .../Icons/modern-install-blue-full.ico | Bin 0 -> 23558 bytes .../Graphics/Icons/modern-install-blue.ico | Bin 0 -> 13902 bytes .../Icons/modern-install-colorful.ico | Bin 0 -> 23558 bytes .../Graphics/Icons/modern-install-full.ico | Bin 0 -> 23558 bytes .../Contrib/Graphics/Icons/modern-install.ico | Bin 0 -> 13902 bytes .../Icons/modern-uninstall-blue-full.ico | Bin 0 -> 23558 bytes .../Graphics/Icons/modern-uninstall-blue.ico | Bin 0 -> 13902 bytes .../Icons/modern-uninstall-colorful.ico | Bin 0 -> 23558 bytes .../Graphics/Icons/modern-uninstall-full.ico | Bin 0 -> 23558 bytes .../Graphics/Icons/modern-uninstall.ico | Bin 0 -> 13902 bytes .../Contrib/Graphics/Icons/nsis-menu.ico | Bin 0 -> 39119 bytes .../Contrib/Graphics/Icons/nsis1-install.ico | Bin 0 -> 1078 bytes .../Graphics/Icons/nsis1-uninstall.ico | Bin 0 -> 1078 bytes .../Graphics/Icons/nsis3-install-alt.ico | Bin 0 -> 13111 bytes .../Contrib/Graphics/Icons/nsis3-install.ico | Bin 0 -> 11697 bytes .../Graphics/Icons/nsis3-uninstall.ico | Bin 0 -> 12533 bytes .../Graphics/Icons/orange-install-nsis.ico | Bin 0 -> 25214 bytes .../Contrib/Graphics/Icons/orange-install.ico | Bin 0 -> 25214 bytes .../Graphics/Icons/orange-uninstall-nsis.ico | Bin 0 -> 25214 bytes .../Graphics/Icons/orange-uninstall.ico | Bin 0 -> 25214 bytes .../Contrib/Graphics/Icons/pixel-install.ico | Bin 0 -> 5390 bytes .../Graphics/Icons/pixel-uninstall.ico | Bin 0 -> 5390 bytes .../Contrib/Graphics/Icons/win-install.ico | Bin 0 -> 1078 bytes .../Contrib/Graphics/Icons/win-uninstall.ico | Bin 0 -> 1078 bytes .../Contrib/Graphics/Wizard/arrow.bmp | Bin 0 -> 52576 bytes .../Contrib/Graphics/Wizard/llama.bmp | Bin 0 -> 26494 bytes .../Contrib/Graphics/Wizard/nsis.bmp | Bin 0 -> 26494 bytes .../Graphics/Wizard/nsis3-branding.bmp | Bin 0 -> 154544 bytes .../Contrib/Graphics/Wizard/nsis3-grey.bmp | Bin 0 -> 51832 bytes .../Contrib/Graphics/Wizard/nsis3-metro.bmp | Bin 0 -> 154544 bytes .../Contrib/Graphics/Wizard/nsis3-vintage.bmp | Bin 0 -> 51920 bytes .../Contrib/Graphics/Wizard/nullsoft.bmp | Bin 0 -> 26494 bytes .../Contrib/Graphics/Wizard/orange-nsis.bmp | Bin 0 -> 52572 bytes .../Graphics/Wizard/orange-uninstall-nsis.bmp | Bin 0 -> 52572 bytes .../Graphics/Wizard/orange-uninstall.bmp | Bin 0 -> 52576 bytes .../Contrib/Graphics/Wizard/orange.bmp | Bin 0 -> 52576 bytes .../Contrib/Graphics/Wizard/win.bmp | Bin 0 -> 26494 bytes .../Contrib/Language files/Afrikaans.nlf | 190 ++ .../Contrib/Language files/Afrikaans.nsh | 121 + .../Contrib/Language files/Albanian.nlf | 191 ++ .../Contrib/Language files/Albanian.nsh | 129 + .../Contrib/Language files/Arabic.nlf | 190 ++ .../Contrib/Language files/Arabic.nsh | 130 + .../Contrib/Language files/Armenian.nlf | 191 ++ .../Contrib/Language files/Armenian.nsh | 130 + .../Contrib/Language files/Asturian.nlf | 190 ++ .../Contrib/Language files/Asturian.nsh | 129 + .../Contrib/Language files/Basque.nlf | 190 ++ .../Contrib/Language files/Basque.nsh | 129 + .../Contrib/Language files/Belarusian.nlf | 190 ++ .../Contrib/Language files/Belarusian.nsh | 129 + .../Contrib/Language files/Bosnian.nlf | 191 ++ .../Contrib/Language files/Bosnian.nsh | 121 + .../Contrib/Language files/Breton.nlf | 191 ++ .../Contrib/Language files/Breton.nsh | 121 + .../Contrib/Language files/Bulgarian.nlf | 194 ++ .../Contrib/Language files/Bulgarian.nsh | 124 + .../Contrib/Language files/Catalan.nlf | 191 ++ .../Contrib/Language files/Catalan.nsh | 121 + .../Contrib/Language files/Corsican.nlf | 193 ++ .../Contrib/Language files/Corsican.nsh | 133 + .../Contrib/Language files/Croatian.nlf | 190 ++ .../Contrib/Language files/Croatian.nsh | 121 + .../Contrib/Language files/Czech.nlf | 191 ++ .../Contrib/Language files/Czech.nsh | 129 + .../Contrib/Language files/Danish.nlf | 191 ++ .../Contrib/Language files/Danish.nsh | 129 + .../Contrib/Language files/Dutch.nlf | 191 ++ .../Contrib/Language files/Dutch.nsh | 129 + .../Contrib/Language files/English.nlf | 191 ++ .../Contrib/Language files/English.nsh | 129 + .../Contrib/Language files/Esperanto.nlf | 191 ++ .../Contrib/Language files/Esperanto.nsh | 129 + .../Contrib/Language files/Estonian.nlf | 190 ++ .../Contrib/Language files/Estonian.nsh | 121 + .../Contrib/Language files/Farsi.nlf | 191 ++ .../Contrib/Language files/Farsi.nsh | 121 + .../Contrib/Language files/Finnish.nlf | 193 ++ .../Contrib/Language files/Finnish.nsh | 125 + .../Contrib/Language files/French.nlf | 191 ++ .../Contrib/Language files/French.nsh | 129 + .../Contrib/Language files/Galician.nlf | 191 ++ .../Contrib/Language files/Galician.nsh | 121 + .../Contrib/Language files/Georgian.nlf | 190 ++ .../Contrib/Language files/Georgian.nsh | 121 + .../Contrib/Language files/German.nlf | 190 ++ .../Contrib/Language files/German.nsh | 129 + .../Contrib/Language files/Greek.nlf | 190 ++ .../Contrib/Language files/Greek.nsh | 121 + .../Contrib/Language files/Hebrew.nlf | 190 ++ .../Contrib/Language files/Hebrew.nsh | 129 + .../Contrib/Language files/Hindi.nlf | 190 ++ .../Contrib/Language files/Hindi.nsh | 129 + .../Contrib/Language files/Hungarian.nlf | 191 ++ .../Contrib/Language files/Hungarian.nsh | 122 + .../Contrib/Language files/Icelandic.nlf | 191 ++ .../Contrib/Language files/Icelandic.nsh | 121 + .../Contrib/Language files/Indonesian.nlf | 194 ++ .../Contrib/Language files/Indonesian.nsh | 129 + .../Contrib/Language files/Irish.nlf | 191 ++ .../Contrib/Language files/Irish.nsh | 121 + .../Contrib/Language files/Italian.nlf | 192 ++ .../Contrib/Language files/Italian.nsh | 131 + .../Contrib/Language files/Japanese.nlf | 190 ++ .../Contrib/Language files/Japanese.nsh | 129 + .../Contrib/Language files/Korean.nlf | 191 ++ .../Contrib/Language files/Korean.nsh | 121 + .../Contrib/Language files/Kurdish.nlf | 190 ++ .../Contrib/Language files/Kurdish.nsh | 122 + .../Contrib/Language files/Latvian.nlf | 191 ++ .../Contrib/Language files/Latvian.nsh | 122 + .../Contrib/Language files/Lithuanian.nlf | 191 ++ .../Contrib/Language files/Lithuanian.nsh | 121 + .../Contrib/Language files/Luxembourgish.nlf | 190 ++ .../Contrib/Language files/Luxembourgish.nsh | 121 + .../Contrib/Language files/Macedonian.nlf | 191 ++ .../Contrib/Language files/Macedonian.nsh | 121 + .../Contrib/Language files/Malay.nlf | 190 ++ .../Contrib/Language files/Malay.nsh | 121 + .../Contrib/Language files/Mongolian.nlf | 190 ++ .../Contrib/Language files/Mongolian.nsh | 129 + .../Contrib/Language files/Norwegian.nlf | 190 ++ .../Contrib/Language files/Norwegian.nsh | 129 + .../Language files/NorwegianNynorsk.nlf | 191 ++ .../Language files/NorwegianNynorsk.nsh | 129 + .../Contrib/Language files/Pashto.nlf | 191 ++ .../Contrib/Language files/Pashto.nsh | 121 + .../Contrib/Language files/Polish.nlf | 195 ++ .../Contrib/Language files/Polish.nsh | 132 + .../Contrib/Language files/Portuguese.nlf | 191 ++ .../Contrib/Language files/Portuguese.nsh | 129 + .../Contrib/Language files/PortugueseBR.nlf | 191 ++ .../Contrib/Language files/PortugueseBR.nsh | 129 + .../Contrib/Language files/Romanian.nlf | 202 ++ .../Contrib/Language files/Romanian.nsh | 128 + .../Contrib/Language files/Russian.nlf | 192 ++ .../Contrib/Language files/Russian.nsh | 129 + .../Contrib/Language files/ScotsGaelic.nlf | 191 ++ .../Contrib/Language files/ScotsGaelic.nsh | 129 + .../Contrib/Language files/Serbian.nlf | 190 ++ .../Contrib/Language files/Serbian.nsh | 121 + .../Contrib/Language files/SerbianLatin.nlf | 190 ++ .../Contrib/Language files/SerbianLatin.nsh | 121 + .../Contrib/Language files/SimpChinese.nlf | 192 ++ .../Contrib/Language files/SimpChinese.nsh | 130 + .../Contrib/Language files/Slovak.nlf | 190 ++ .../Contrib/Language files/Slovak.nsh | 133 + .../Contrib/Language files/Slovenian.nlf | 190 ++ .../Contrib/Language files/Slovenian.nsh | 130 + .../Contrib/Language files/Spanish.nlf | 191 ++ .../Contrib/Language files/Spanish.nsh | 130 + .../Language files/SpanishInternational.nlf | 191 ++ .../Language files/SpanishInternational.nsh | 130 + .../Contrib/Language files/Swedish.nlf | 190 ++ .../Contrib/Language files/Swedish.nsh | 130 + .../Contrib/Language files/Tatar.nlf | 190 ++ .../Contrib/Language files/Tatar.nsh | 129 + .../Contrib/Language files/Thai.nlf | 191 ++ .../Contrib/Language files/Thai.nsh | 121 + .../Contrib/Language files/TradChinese.nlf | 194 ++ .../Contrib/Language files/TradChinese.nsh | 131 + .../Contrib/Language files/Turkish.nlf | 192 ++ .../Contrib/Language files/Turkish.nsh | 122 + .../Contrib/Language files/Ukrainian.nlf | 192 ++ .../Contrib/Language files/Ukrainian.nsh | 130 + .../Contrib/Language files/Uzbek.nlf | 190 ++ .../Contrib/Language files/Uzbek.nsh | 121 + .../Contrib/Language files/Vietnamese.nlf | 191 ++ .../Contrib/Language files/Vietnamese.nsh | 129 + .../Contrib/Language files/Welsh.nlf | 191 ++ .../Contrib/Language files/Welsh.nsh | 121 + .../Contrib/Modern UI 2/Deprecated.nsh | 86 + .../Contrib/Modern UI 2/Interface.nsh | 363 +++ .../Contrib/Modern UI 2/Localization.nsh | 198 ++ .../NSIS-source/Contrib/Modern UI 2/MUI2.nsh | 117 + .../NSIS-source/Contrib/Modern UI 2/Pages.nsh | 324 +++ .../Contrib/Modern UI 2/Pages/Components.nsh | 242 ++ .../Contrib/Modern UI 2/Pages/Directory.nsh | 126 + .../Contrib/Modern UI 2/Pages/Finish.nsh | 510 ++++ .../Modern UI 2/Pages/InstallFiles.nsh | 149 ++ .../Contrib/Modern UI 2/Pages/License.nsh | 143 ++ .../Contrib/Modern UI 2/Pages/StartMenu.nsh | 236 ++ .../Modern UI 2/Pages/UninstallConfirm.nsh | 100 + .../Contrib/Modern UI 2/Pages/Welcome.nsh | 181 ++ .../NSIS-source/Contrib/Modern UI/System.nsh | 2255 +++++++++++++++++ .../Contrib/Modern UI/ioSpecial.ini | 19 + libs/NSIS/NSIS-source/Contrib/UIs/default.exe | Bin 0 -> 6144 bytes libs/NSIS/NSIS-source/Contrib/UIs/modern.exe | Bin 0 -> 6656 bytes .../Contrib/UIs/modern_headerbmp.exe | Bin 0 -> 4608 bytes .../Contrib/UIs/modern_headerbmpr.exe | Bin 0 -> 4608 bytes .../NSIS-source/Contrib/UIs/modern_nodesc.exe | Bin 0 -> 4096 bytes .../Contrib/UIs/modern_smalldesc.exe | Bin 0 -> 4096 bytes .../NSIS-source/Contrib/UIs/sdbarker_tiny.exe | Bin 0 -> 6656 bytes .../NSIS/NSIS-source/Contrib/zip2exe/Base.nsh | 81 + .../NSIS-source/Contrib/zip2exe/Classic.nsh | 4 + .../NSIS-source/Contrib/zip2exe/Modern.nsh | 8 + .../NSIS-source/Docs/AdvSplash/advsplash.txt | 51 + libs/NSIS/NSIS-source/Docs/Banner/Readme.txt | 47 + .../NSIS/NSIS-source/Docs/BgImage/BgImage.txt | 92 + libs/NSIS/NSIS-source/Docs/Dialer/Dialer.txt | 121 + .../Docs/InstallOptions/Changelog.txt | 144 ++ .../Docs/InstallOptions/Readme.html | 909 +++++++ libs/NSIS/NSIS-source/Docs/Math/Math.txt | 197 ++ .../NSIS-source/Docs/Modern UI 2/License.txt | 10 + .../NSIS-source/Docs/Modern UI 2/Readme.html | 1162 +++++++++ .../Docs/Modern UI 2/images/closed.gif | Bin 0 -> 203 bytes .../Docs/Modern UI 2/images/header.gif | Bin 0 -> 6023 bytes .../Docs/Modern UI 2/images/open.gif | Bin 0 -> 138 bytes .../Docs/Modern UI 2/images/screen1.png | Bin 0 -> 15647 bytes .../Docs/Modern UI 2/images/screen2.png | Bin 0 -> 18437 bytes .../NSIS-source/Docs/Modern UI/Changelog.txt | 268 ++ .../NSIS-source/Docs/Modern UI/License.txt | 10 + .../NSIS-source/Docs/Modern UI/Readme.html | 1160 +++++++++ .../Docs/Modern UI/images/closed.gif | Bin 0 -> 203 bytes .../Docs/Modern UI/images/header.gif | Bin 0 -> 6023 bytes .../Docs/Modern UI/images/open.gif | Bin 0 -> 138 bytes .../Docs/Modern UI/images/screen1.png | Bin 0 -> 15647 bytes .../Docs/Modern UI/images/screen2.png | Bin 0 -> 18437 bytes .../NSIS-source/Docs/MultiUser/Readme.html | 391 +++ libs/NSIS/NSIS-source/Docs/NSISdl/License.txt | 18 + libs/NSIS/NSIS-source/Docs/NSISdl/ReadMe.txt | 92 + libs/NSIS/NSIS-source/Docs/Splash/splash.txt | 41 + .../NSIS-source/Docs/StartMenu/Readme.txt | 47 + .../NSIS/NSIS-source/Docs/StrFunc/StrFunc.txt | 705 ++++++ libs/NSIS/NSIS-source/Docs/System/System.html | 898 +++++++ .../NSIS/NSIS-source/Docs/System/WhatsNew.txt | 46 + libs/NSIS/NSIS-source/Docs/VPatch/Readme.html | 310 +++ .../NSIS-source/Docs/makensisw/License.txt | 17 + .../NSIS-source/Docs/makensisw/Readme.txt | 245 ++ .../NSIS-source/Docs/nsDialogs/Readme.html | 880 +++++++ libs/NSIS/NSIS-source/Docs/nsExec/nsExec.txt | 55 + .../Examples/AdvSplash/Example.nsi | 35 + libs/NSIS/NSIS-source/Examples/AppGen.nsi | 78 + .../NSIS-source/Examples/Banner/Example.nsi | 38 + .../NSIS-source/Examples/BgImage/Example.nsi | 101 + libs/NSIS/NSIS-source/Examples/FileFunc.ini | 91 + libs/NSIS/NSIS-source/Examples/FileFunc.nsi | 732 ++++++ .../NSIS-source/Examples/FileFuncTest.nsi | 572 +++++ .../Examples/InstallOptions/test.ini | 76 + .../Examples/InstallOptions/test.nsi | 84 + .../Examples/InstallOptions/testimgs.ini | 65 + .../Examples/InstallOptions/testimgs.nsi | 59 + .../Examples/InstallOptions/testlink.ini | 44 + .../Examples/InstallOptions/testlink.nsi | 58 + .../Examples/InstallOptions/testnotify.ini | 105 + .../Examples/InstallOptions/testnotify.nsi | 133 + libs/NSIS/NSIS-source/Examples/Library.nsi | 130 + libs/NSIS/NSIS-source/Examples/LogicLib.nsi | 638 +++++ libs/NSIS/NSIS-source/Examples/Math/math.nsi | 33 + .../NSIS-source/Examples/Math/mathtest.ini | 101 + .../NSIS-source/Examples/Math/mathtest.nsi | 171 ++ .../NSIS-source/Examples/Math/mathtest.txt | 7 + libs/NSIS/NSIS-source/Examples/Memento.nsi | 79 + .../NSIS-source/Examples/Modern UI/Basic.nsi | 89 + .../Examples/Modern UI/HeaderBitmap.nsi | 91 + .../Examples/Modern UI/MultiLanguage.nsi | 204 ++ .../Examples/Modern UI/StartMenu.nsi | 115 + .../Examples/Modern UI/WelcomeFinish.nsi | 93 + libs/NSIS/NSIS-source/Examples/MultiUser.nsi | 58 + libs/NSIS/NSIS-source/Examples/NSISMenu.nsi | 358 +++ .../Examples/Plugin/exdll-vs2008.sln | 20 + .../Examples/Plugin/exdll-vs2008.vcproj | 266 ++ libs/NSIS/NSIS-source/Examples/Plugin/exdll.c | 42 + .../NSIS-source/Examples/Plugin/exdll.dpr | 118 + .../NSIS-source/Examples/Plugin/exdll.dsp | 112 + .../NSIS-source/Examples/Plugin/exdll.dsw | 29 + .../Examples/Plugin/exdll_with_unit.dpr | 100 + .../NSIS-source/Examples/Plugin/extdll.inc | 145 ++ .../NSIS/NSIS-source/Examples/Plugin/nsis.pas | 236 ++ .../NSIS-source/Examples/Plugin/nsis/api.h | 85 + .../Examples/Plugin/nsis/nsis_tchar.h | 229 ++ .../Plugin/nsis/pluginapi-x86-ansi.lib | Bin 0 -> 7004 bytes .../Plugin/nsis/pluginapi-x86-unicode.lib | Bin 0 -> 7012 bytes .../Examples/Plugin/nsis/pluginapi.h | 108 + .../NSIS-source/Examples/Splash/Example.nsi | 21 + .../Examples/StartMenu/Example.nsi | 50 + libs/NSIS/NSIS-source/Examples/StrFunc.nsi | 562 ++++ .../NSIS-source/Examples/System/Resource.dll | Bin 0 -> 31744 bytes .../NSIS-source/Examples/System/SysFunc.nsh | 395 +++ .../NSIS-source/Examples/System/System.nsh | 413 +++ .../NSIS-source/Examples/System/System.nsi | 161 ++ libs/NSIS/NSIS-source/Examples/TextFunc.ini | 130 + libs/NSIS/NSIS-source/Examples/TextFunc.nsi | 834 ++++++ .../NSIS-source/Examples/TextFuncTest.nsi | 414 +++ .../Examples/UserInfo/UserInfo.nsi | 45 + .../NSIS-source/Examples/VPatch/example.nsi | 62 + .../NSIS-source/Examples/VPatch/newfile.txt | 6 + .../NSIS-source/Examples/VPatch/oldfile.txt | 6 + .../NSIS-source/Examples/VPatch/patch.pat | Bin 0 -> 99 bytes .../NSIS/NSIS-source/Examples/VersionInfo.nsi | 29 + libs/NSIS/NSIS-source/Examples/WordFunc.ini | 107 + libs/NSIS/NSIS-source/Examples/WordFunc.nsi | 535 ++++ .../NSIS-source/Examples/WordFuncTest.nsi | 610 +++++ libs/NSIS/NSIS-source/Examples/bigtest.nsi | 330 +++ libs/NSIS/NSIS-source/Examples/example1.nsi | 45 + libs/NSIS/NSIS-source/Examples/example2.nsi | 98 + libs/NSIS/NSIS-source/Examples/gfx.nsi | 123 + .../NSIS-source/Examples/install-per-user.nsi | 181 ++ .../NSIS-source/Examples/install-shared.nsi | 95 + libs/NSIS/NSIS-source/Examples/languages.nsi | 192 ++ libs/NSIS/NSIS-source/Examples/makensis.nsi | 1115 ++++++++ .../Examples/nsDialogs/InstallOptions.nsi | 47 + .../Examples/nsDialogs/example.nsi | 299 +++ .../NSIS-source/Examples/nsDialogs/timer.nsi | 107 + .../Examples/nsDialogs/welcome.nsi | 214 ++ .../NSIS/NSIS-source/Examples/nsExec/test.nsi | 31 + .../NSIS/NSIS-source/Examples/one-section.nsi | 80 + libs/NSIS/NSIS-source/Examples/primes.nsi | 70 + libs/NSIS/NSIS-source/Examples/rtest.nsi | 93 + libs/NSIS/NSIS-source/Examples/silent.nsi | 63 + libs/NSIS/NSIS-source/Examples/unicode.nsi | 47 + libs/NSIS/NSIS-source/Examples/waplugin.nsi | 205 ++ libs/NSIS/NSIS-source/Include/Colors.nsh | 75 + libs/NSIS/NSIS-source/Include/FileFunc.nsh | 2012 +++++++++++++++ .../NSIS-source/Include/InstallOptions.nsh | 244 ++ libs/NSIS/NSIS-source/Include/Integration.nsh | 44 + libs/NSIS/NSIS-source/Include/LangFile.nsh | 191 ++ libs/NSIS/NSIS-source/Include/Library.nsh | 885 +++++++ libs/NSIS/NSIS-source/Include/LogicLib.nsh | 968 +++++++ libs/NSIS/NSIS-source/Include/MUI.nsh | 1 + libs/NSIS/NSIS-source/Include/MUI2.nsh | 1 + libs/NSIS/NSIS-source/Include/Memento.nsh | 570 +++++ libs/NSIS/NSIS-source/Include/MultiUser.nsh | 505 ++++ libs/NSIS/NSIS-source/Include/Sections.nsh | 310 +++ libs/NSIS/NSIS-source/Include/StrFunc.nsh | 1627 ++++++++++++ libs/NSIS/NSIS-source/Include/TextFunc.nsh | 1211 +++++++++ libs/NSIS/NSIS-source/Include/UpgradeDLL.nsh | 207 ++ libs/NSIS/NSIS-source/Include/Util.nsh | 184 ++ libs/NSIS/NSIS-source/Include/VB6RunTime.nsh | 90 + libs/NSIS/NSIS-source/Include/VPatchLib.nsh | 47 + libs/NSIS/NSIS-source/Include/Win/COM.nsh | 392 +++ libs/NSIS/NSIS-source/Include/Win/Propkey.nsh | 216 ++ .../Include/Win/RestartManager.nsh | 117 + libs/NSIS/NSIS-source/Include/Win/WinDef.nsh | 67 + .../NSIS/NSIS-source/Include/Win/WinError.nsh | 155 ++ libs/NSIS/NSIS-source/Include/Win/WinNT.nsh | 224 ++ libs/NSIS/NSIS-source/Include/Win/WinUser.nsh | 199 ++ libs/NSIS/NSIS-source/Include/WinCore.nsh | 263 ++ libs/NSIS/NSIS-source/Include/WinMessages.nsh | 890 +++++++ libs/NSIS/NSIS-source/Include/WinVer.nsh | 705 ++++++ libs/NSIS/NSIS-source/Include/WordFunc.nsh | 1800 +++++++++++++ libs/NSIS/NSIS-source/Include/nsDialogs.nsh | 1264 +++++++++ libs/NSIS/NSIS-source/Include/x64.nsh | 120 + libs/NSIS/NSIS-source/NSIS.chm | Bin 0 -> 415492 bytes libs/NSIS/NSIS-source/NSIS.exe | Bin 0 -> 91345 bytes .../Plugins/x86-ansi/AdvSplash.dll | Bin 0 -> 5632 bytes .../NSIS-source/Plugins/x86-ansi/Banner.dll | Bin 0 -> 4096 bytes .../NSIS-source/Plugins/x86-ansi/BgImage.dll | Bin 0 -> 7680 bytes .../NSIS-source/Plugins/x86-ansi/Dialer.dll | Bin 0 -> 3584 bytes .../Plugins/x86-ansi/InstallOptions.dll | Bin 0 -> 14848 bytes .../NSIS-source/Plugins/x86-ansi/LangDLL.dll | Bin 0 -> 5632 bytes .../NSIS-source/Plugins/x86-ansi/Math.dll | Bin 0 -> 67584 bytes .../NSIS-source/Plugins/x86-ansi/NSISdl.dll | Bin 0 -> 15360 bytes .../NSIS-source/Plugins/x86-ansi/Splash.dll | Bin 0 -> 4096 bytes .../Plugins/x86-ansi/StartMenu.dll | Bin 0 -> 7680 bytes .../NSIS-source/Plugins/x86-ansi/System.dll | Bin 0 -> 12288 bytes .../NSIS-source/Plugins/x86-ansi/TypeLib.dll | Bin 0 -> 3584 bytes .../NSIS-source/Plugins/x86-ansi/UserInfo.dll | Bin 0 -> 4096 bytes .../NSIS-source/Plugins/x86-ansi/VPatch.dll | Bin 0 -> 8192 bytes .../Plugins/x86-ansi/nsDialogs.dll | Bin 0 -> 9728 bytes .../NSIS-source/Plugins/x86-ansi/nsExec.dll | Bin 0 -> 6656 bytes .../Plugins/x86-unicode/AdvSplash.dll | Bin 0 -> 6144 bytes .../Plugins/x86-unicode/Banner.dll | Bin 0 -> 4096 bytes .../Plugins/x86-unicode/BgImage.dll | Bin 0 -> 7680 bytes .../Plugins/x86-unicode/Dialer.dll | Bin 0 -> 3584 bytes .../Plugins/x86-unicode/InstallOptions.dll | Bin 0 -> 15872 bytes .../Plugins/x86-unicode/LangDLL.dll | Bin 0 -> 5632 bytes .../NSIS-source/Plugins/x86-unicode/Math.dll | Bin 0 -> 69120 bytes .../Plugins/x86-unicode/NSISdl.dll | Bin 0 -> 15360 bytes .../Plugins/x86-unicode/Splash.dll | Bin 0 -> 4096 bytes .../Plugins/x86-unicode/StartMenu.dll | Bin 0 -> 7680 bytes .../Plugins/x86-unicode/System.dll | Bin 0 -> 12288 bytes .../Plugins/x86-unicode/TypeLib.dll | Bin 0 -> 3584 bytes .../Plugins/x86-unicode/UserInfo.dll | Bin 0 -> 4096 bytes .../Plugins/x86-unicode/VPatch.dll | Bin 0 -> 8704 bytes .../Plugins/x86-unicode/nsDialogs.dll | Bin 0 -> 9728 bytes .../Plugins/x86-unicode/nsExec.dll | Bin 0 -> 7168 bytes libs/NSIS/NSIS-source/Stubs/bzip2-x86-ansi | Bin 0 -> 37888 bytes libs/NSIS/NSIS-source/Stubs/bzip2-x86-unicode | Bin 0 -> 38912 bytes .../NSIS-source/Stubs/bzip2_solid-x86-ansi | Bin 0 -> 38400 bytes .../NSIS-source/Stubs/bzip2_solid-x86-unicode | Bin 0 -> 39424 bytes libs/NSIS/NSIS-source/Stubs/lzma-x86-ansi | Bin 0 -> 37376 bytes libs/NSIS/NSIS-source/Stubs/lzma-x86-unicode | Bin 0 -> 38400 bytes .../NSIS-source/Stubs/lzma_solid-x86-ansi | Bin 0 -> 38400 bytes .../NSIS-source/Stubs/lzma_solid-x86-unicode | Bin 0 -> 38912 bytes libs/NSIS/NSIS-source/Stubs/uninst | Bin 0 -> 766 bytes libs/NSIS/NSIS-source/Stubs/zlib-x86-ansi | Bin 0 -> 38912 bytes libs/NSIS/NSIS-source/Stubs/zlib-x86-unicode | Bin 0 -> 39936 bytes .../NSIS-source/Stubs/zlib_solid-x86-ansi | Bin 0 -> 38912 bytes .../NSIS-source/Stubs/zlib_solid-x86-unicode | Bin 0 -> 40960 bytes libs/NSIS/NSIS-source/makensis.exe | Bin 0 -> 2560 bytes libs/NSIS/NSIS-source/makensisw.exe | Bin 0 -> 1139200 bytes libs/NSIS/NSIS-source/nsisconf.nsh | 62 + libs/oboe | 1 - linux/debian/copyright | 47 +- mac/Info-make.plist | 47 + mac/Info-xcode.plist | 47 + mac/Jamulus.entitlements | 47 + mac/deploy_mac.sh | 46 + src/analyzerconsole.cpp | 46 +- src/analyzerconsole.h | 44 +- src/android/androiddebug.cpp | 44 +- src/audiomixerboard.cpp | 50 +- src/audiomixerboard.h | 44 +- src/buffer.cpp | 67 +- src/buffer.h | 44 +- src/channel.cpp | 46 +- src/channel.h | 46 +- src/chatdlg.cpp | 44 +- src/chatdlg.h | 44 +- src/client.cpp | 316 ++- src/client.h | 92 +- src/clientdlg.cpp | 245 +- src/clientdlg.h | 51 +- src/clientrpc.cpp | 254 +- src/clientrpc.h | 55 +- src/clientsettingsdlg.cpp | 47 +- src/clientsettingsdlg.h | 46 +- src/connectdlg.cpp | 62 +- src/connectdlg.h | 48 +- src/global.h | 59 +- src/levelmeter.cpp | 44 +- src/levelmeter.h | 44 +- src/mac/activity.h | 44 +- src/mac/activity.mm | 46 +- src/mac/badgelabel.h | 44 +- src/mac/badgelabel.mm | 44 +- src/main.cpp | 118 +- src/multicolorled.cpp | 44 +- src/multicolorled.h | 44 +- src/protocol.cpp | 145 +- src/protocol.h | 58 +- src/recorder/creaperproject.cpp | 44 +- src/recorder/creaperproject.h | 44 +- src/recorder/cwavestream.cpp | 44 +- src/recorder/cwavestream.h | 44 +- src/recorder/jamcontroller.cpp | 44 +- src/recorder/jamcontroller.h | 44 +- src/recorder/jamrecorder.cpp | 44 +- src/recorder/jamrecorder.h | 44 +- src/res/CLEDBlackBig.png | Bin 669 -> 567 bytes src/res/CLEDBlackSrc.png | Bin 40795 -> 22973 bytes src/res/CLEDGreenSrc.png | Bin 45228 -> 38428 bytes src/res/CLEDGreySrc.png | Bin 36790 -> 21879 bytes src/res/CLEDRedSrc.png | Bin 44559 -> 37553 bytes src/res/CLEDYellowSrc.png | Bin 42234 -> 35677 bytes src/res/HLEDBlackSrc.png | Bin 18860 -> 11193 bytes src/res/HLEDGreenSrc.png | Bin 21869 -> 19833 bytes src/res/HLEDGreySrc.png | Bin 17755 -> 10893 bytes src/res/HLEDRedSrc.png | Bin 21608 -> 19617 bytes src/res/HLEDYellowSrc.png | Bin 21234 -> 19055 bytes src/res/flags/flagnone.png | Bin 418 -> 415 bytes src/res/flags/readme.txt | 4 +- src/res/fronticon.png | Bin 2960 -> 2607 bytes src/res/fronticonserver.png | Bin 32978 -> 25797 bytes src/res/instruments/clarinet.png | Bin 587 -> 541 bytes src/res/instruments/conductor.png | Bin 830 -> 704 bytes src/res/instruments/flute.png | Bin 936 -> 639 bytes src/res/instruments/vocaltenor.png | Bin 2174 -> 2172 bytes src/res/io.jamulus.jamulus.png | Bin 27223 -> 21512 bytes src/res/mixerboardbackground.png | Bin 22401 -> 21853 bytes src/rpcserver.cpp | 44 +- src/rpcserver.h | 44 +- src/server.cpp | 407 +-- src/server.h | 75 +- src/serverdlg.cpp | 50 +- src/serverdlg.h | 44 +- src/serverlist.cpp | 76 +- src/serverlist.h | 57 +- src/serverlogging.cpp | 44 +- src/serverlogging.h | 45 +- src/serverrpc.cpp | 129 +- src/serverrpc.h | 44 +- src/settings.cpp | 46 +- src/settings.h | 44 +- src/signalhandler.cpp | 44 +- src/signalhandler.h | 44 +- src/socket.cpp | 180 +- src/socket.h | 89 +- src/sound/README.md | 46 +- src/sound/asio/sound.cpp | 44 +- src/sound/asio/sound.h | 44 +- src/sound/coreaudio-ios/sound.h | 44 +- src/sound/coreaudio-ios/sound.mm | 44 +- src/sound/coreaudio-mac/sound.cpp | 44 +- src/sound/coreaudio-mac/sound.h | 82 +- src/sound/jack/sound.cpp | 48 +- src/sound/jack/sound.h | 46 +- src/sound/midi-win/midi.cpp | 44 +- src/sound/midi-win/midi.h | 44 +- src/sound/oboe/sound.cpp | 44 +- src/sound/oboe/sound.h | 44 +- src/sound/soundbase.cpp | 56 +- src/sound/soundbase.h | 44 +- src/testbench.h | 44 +- src/threadpool.h | 62 +- src/translation/translation_de_DE.ts | 1199 ++++----- src/translation/translation_es_ES.ts | 1199 ++++----- src/translation/translation_fr_FR.ts | 1199 ++++----- src/translation/translation_it_IT.ts | 1199 ++++----- src/translation/translation_ja_JP.ts | 1199 ++++----- src/translation/translation_ko_KR.ts | 1199 ++++----- src/translation/translation_nb_NO.ts | 1199 ++++----- src/translation/translation_nl_NL.ts | 1199 ++++----- src/translation/translation_pl_PL.ts | 1199 ++++----- src/translation/translation_pt_BR.ts | 1337 +++++----- src/translation/translation_pt_PT.ts | 1199 ++++----- src/translation/translation_ru_RU.ts | 1203 ++++----- src/translation/translation_sk_SK.ts | 1199 ++++----- src/translation/translation_sv_SE.ts | 1199 ++++----- src/translation/translation_zh_CN.ts | 1199 ++++----- src/util.cpp | 171 +- src/util.h | 131 +- tools/changelog-helper.sh | 44 +- tools/check-wininstaller-translations.sh | 44 +- tools/checkkeys.pl | 44 +- tools/create-translation-issues.sh | 44 +- tools/generate_json_rpc_docs.py | 50 +- tools/get_release_contributors.py | 47 + tools/qt5_to_qt6_country_code_table.py | 48 +- tools/update-copyright-notices.sh | 44 +- windows/deploy_windows.ps1 | 46 + windows/installer.nsi | 46 + 603 files changed, 79793 insertions(+), 10571 deletions(-) create mode 100644 libs/NSIS/NSIS-source/Bin/GenPat.exe create mode 100644 libs/NSIS/NSIS-source/Bin/MakeLangId.exe create mode 100644 libs/NSIS/NSIS-source/Bin/RegTool-x86.bin create mode 100644 libs/NSIS/NSIS-source/Bin/makensis.exe create mode 100644 libs/NSIS/NSIS-source/Bin/zip2exe.exe create mode 100644 libs/NSIS/NSIS-source/Bin/zlib1.dll create mode 100644 libs/NSIS/NSIS-source/COPYING create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/big.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/classic-cross.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/classic.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/colorful.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/grey-cross.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/grey.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/modern.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red-round.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round2.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis-r.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-branding-r.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-branding.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey-right.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-metro-right.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-metro.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-vintage-right.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-vintage.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-r-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-r.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Header/win.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow2-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow2-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/box-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/box-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-blue.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-grey.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-blue-full.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-blue.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-colorful.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-full.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-colorful.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-full.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis-menu.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis1-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis1-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install-alt.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-install-nsis.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-uninstall-nsis.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/pixel-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/pixel-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/win-install.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Icons/win-uninstall.ico create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/arrow.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/llama.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-branding.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-grey.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-metro.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-vintage.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nullsoft.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange-uninstall-nsis.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange-uninstall.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/win.bmp create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Basque.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Basque.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Breton.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Breton.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Czech.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Czech.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Danish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Danish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/English.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/English.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/French.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/French.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Galician.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Galician.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/German.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/German.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Greek.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Greek.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Irish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Irish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Italian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Italian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Korean.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Korean.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Malay.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Malay.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Polish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Polish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Russian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Russian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Thai.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Thai.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nlf create mode 100644 libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Deprecated.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Interface.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Localization.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/MUI2.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Components.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Directory.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Finish.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/InstallFiles.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/License.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/StartMenu.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Welcome.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI/System.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/Modern UI/ioSpecial.ini create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/default.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/modern.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/modern_headerbmp.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/modern_headerbmpr.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/modern_nodesc.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/modern_smalldesc.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/UIs/sdbarker_tiny.exe create mode 100644 libs/NSIS/NSIS-source/Contrib/zip2exe/Base.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/zip2exe/Classic.nsh create mode 100644 libs/NSIS/NSIS-source/Contrib/zip2exe/Modern.nsh create mode 100644 libs/NSIS/NSIS-source/Docs/AdvSplash/advsplash.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Banner/Readme.txt create mode 100644 libs/NSIS/NSIS-source/Docs/BgImage/BgImage.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Dialer/Dialer.txt create mode 100644 libs/NSIS/NSIS-source/Docs/InstallOptions/Changelog.txt create mode 100644 libs/NSIS/NSIS-source/Docs/InstallOptions/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/Math/Math.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/License.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/images/closed.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/images/header.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/images/open.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/images/screen1.png create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI 2/images/screen2.png create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/Changelog.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/License.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/images/closed.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/images/header.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/images/open.gif create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/images/screen1.png create mode 100644 libs/NSIS/NSIS-source/Docs/Modern UI/images/screen2.png create mode 100644 libs/NSIS/NSIS-source/Docs/MultiUser/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/NSISdl/License.txt create mode 100644 libs/NSIS/NSIS-source/Docs/NSISdl/ReadMe.txt create mode 100644 libs/NSIS/NSIS-source/Docs/Splash/splash.txt create mode 100644 libs/NSIS/NSIS-source/Docs/StartMenu/Readme.txt create mode 100644 libs/NSIS/NSIS-source/Docs/StrFunc/StrFunc.txt create mode 100644 libs/NSIS/NSIS-source/Docs/System/System.html create mode 100644 libs/NSIS/NSIS-source/Docs/System/WhatsNew.txt create mode 100644 libs/NSIS/NSIS-source/Docs/VPatch/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/makensisw/License.txt create mode 100644 libs/NSIS/NSIS-source/Docs/makensisw/Readme.txt create mode 100644 libs/NSIS/NSIS-source/Docs/nsDialogs/Readme.html create mode 100644 libs/NSIS/NSIS-source/Docs/nsExec/nsExec.txt create mode 100644 libs/NSIS/NSIS-source/Examples/AdvSplash/Example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/AppGen.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Banner/Example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/BgImage/Example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/FileFunc.ini create mode 100644 libs/NSIS/NSIS-source/Examples/FileFunc.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/FileFuncTest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/test.ini create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/test.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.ini create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.ini create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.ini create mode 100644 libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Library.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/LogicLib.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Math/math.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Math/mathtest.ini create mode 100644 libs/NSIS/NSIS-source/Examples/Math/mathtest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Math/mathtest.txt create mode 100644 libs/NSIS/NSIS-source/Examples/Memento.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Modern UI/Basic.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Modern UI/HeaderBitmap.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Modern UI/MultiLanguage.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Modern UI/StartMenu.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Modern UI/WelcomeFinish.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/MultiUser.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/NSISMenu.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.sln create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.vcproj create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll.c create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll.dpr create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsp create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsw create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/exdll_with_unit.dpr create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/extdll.inc create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis.pas create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis/api.h create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis/nsis_tchar.h create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi-x86-ansi.lib create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi-x86-unicode.lib create mode 100644 libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi.h create mode 100644 libs/NSIS/NSIS-source/Examples/Splash/Example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/StartMenu/Example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/StrFunc.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/System/Resource.dll create mode 100644 libs/NSIS/NSIS-source/Examples/System/SysFunc.nsh create mode 100644 libs/NSIS/NSIS-source/Examples/System/System.nsh create mode 100644 libs/NSIS/NSIS-source/Examples/System/System.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/TextFunc.ini create mode 100644 libs/NSIS/NSIS-source/Examples/TextFunc.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/TextFuncTest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/UserInfo/UserInfo.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/VPatch/example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/VPatch/newfile.txt create mode 100644 libs/NSIS/NSIS-source/Examples/VPatch/oldfile.txt create mode 100644 libs/NSIS/NSIS-source/Examples/VPatch/patch.pat create mode 100644 libs/NSIS/NSIS-source/Examples/VersionInfo.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/WordFunc.ini create mode 100644 libs/NSIS/NSIS-source/Examples/WordFunc.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/WordFuncTest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/bigtest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/example1.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/example2.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/gfx.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/install-per-user.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/install-shared.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/languages.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/makensis.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/nsDialogs/InstallOptions.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/nsDialogs/example.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/nsDialogs/timer.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/nsDialogs/welcome.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/nsExec/test.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/one-section.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/primes.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/rtest.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/silent.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/unicode.nsi create mode 100644 libs/NSIS/NSIS-source/Examples/waplugin.nsi create mode 100644 libs/NSIS/NSIS-source/Include/Colors.nsh create mode 100644 libs/NSIS/NSIS-source/Include/FileFunc.nsh create mode 100644 libs/NSIS/NSIS-source/Include/InstallOptions.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Integration.nsh create mode 100644 libs/NSIS/NSIS-source/Include/LangFile.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Library.nsh create mode 100644 libs/NSIS/NSIS-source/Include/LogicLib.nsh create mode 100644 libs/NSIS/NSIS-source/Include/MUI.nsh create mode 100644 libs/NSIS/NSIS-source/Include/MUI2.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Memento.nsh create mode 100644 libs/NSIS/NSIS-source/Include/MultiUser.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Sections.nsh create mode 100644 libs/NSIS/NSIS-source/Include/StrFunc.nsh create mode 100644 libs/NSIS/NSIS-source/Include/TextFunc.nsh create mode 100644 libs/NSIS/NSIS-source/Include/UpgradeDLL.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Util.nsh create mode 100644 libs/NSIS/NSIS-source/Include/VB6RunTime.nsh create mode 100644 libs/NSIS/NSIS-source/Include/VPatchLib.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/COM.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/Propkey.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/RestartManager.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/WinDef.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/WinError.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/WinNT.nsh create mode 100644 libs/NSIS/NSIS-source/Include/Win/WinUser.nsh create mode 100644 libs/NSIS/NSIS-source/Include/WinCore.nsh create mode 100644 libs/NSIS/NSIS-source/Include/WinMessages.nsh create mode 100644 libs/NSIS/NSIS-source/Include/WinVer.nsh create mode 100644 libs/NSIS/NSIS-source/Include/WordFunc.nsh create mode 100644 libs/NSIS/NSIS-source/Include/nsDialogs.nsh create mode 100644 libs/NSIS/NSIS-source/Include/x64.nsh create mode 100644 libs/NSIS/NSIS-source/NSIS.chm create mode 100644 libs/NSIS/NSIS-source/NSIS.exe create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/AdvSplash.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/Banner.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/BgImage.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/Dialer.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/InstallOptions.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/LangDLL.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/Math.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/NSISdl.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/Splash.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/StartMenu.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/System.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/TypeLib.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/UserInfo.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/VPatch.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/nsDialogs.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-ansi/nsExec.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/AdvSplash.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/Banner.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/BgImage.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/Dialer.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/InstallOptions.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/LangDLL.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/Math.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/NSISdl.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/Splash.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/StartMenu.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/System.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/TypeLib.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/UserInfo.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/VPatch.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/nsDialogs.dll create mode 100644 libs/NSIS/NSIS-source/Plugins/x86-unicode/nsExec.dll create mode 100644 libs/NSIS/NSIS-source/Stubs/bzip2-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/bzip2-x86-unicode create mode 100644 libs/NSIS/NSIS-source/Stubs/bzip2_solid-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/bzip2_solid-x86-unicode create mode 100644 libs/NSIS/NSIS-source/Stubs/lzma-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/lzma-x86-unicode create mode 100644 libs/NSIS/NSIS-source/Stubs/lzma_solid-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/lzma_solid-x86-unicode create mode 100644 libs/NSIS/NSIS-source/Stubs/uninst create mode 100644 libs/NSIS/NSIS-source/Stubs/zlib-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/zlib-x86-unicode create mode 100644 libs/NSIS/NSIS-source/Stubs/zlib_solid-x86-ansi create mode 100644 libs/NSIS/NSIS-source/Stubs/zlib_solid-x86-unicode create mode 100644 libs/NSIS/NSIS-source/makensis.exe create mode 100644 libs/NSIS/NSIS-source/makensisw.exe create mode 100644 libs/NSIS/NSIS-source/nsisconf.nsh delete mode 160000 libs/oboe diff --git a/.github/autobuild/android.sh b/.github/autobuild/android.sh index 3043d73222..f03af98f13 100755 --- a/.github/autobuild/android.sh +++ b/.github/autobuild/android.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/extractVersionChangelog.pl b/.github/autobuild/extractVersionChangelog.pl index 5f81e74f7b..da4154017c 100755 --- a/.github/autobuild/extractVersionChangelog.pl +++ b/.github/autobuild/extractVersionChangelog.pl @@ -7,21 +7,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/get_build_vars.py b/.github/autobuild/get_build_vars.py index f6eee7534c..0cba83ad67 100755 --- a/.github/autobuild/get_build_vars.py +++ b/.github/autobuild/get_build_vars.py @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/ios.sh b/.github/autobuild/ios.sh index a1e058f588..952b88935f 100755 --- a/.github/autobuild/ios.sh +++ b/.github/autobuild/ios.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/linux_deb.sh b/.github/autobuild/linux_deb.sh index d7ac2818db..10edc37c88 100755 --- a/.github/autobuild/linux_deb.sh +++ b/.github/autobuild/linux_deb.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/mac.sh b/.github/autobuild/mac.sh index c80ef51b2c..a70cedc9e9 100755 --- a/.github/autobuild/mac.sh +++ b/.github/autobuild/mac.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/autobuild/windows.ps1 b/.github/autobuild/windows.ps1 index 082c644fca..263fdc20d6 100644 --- a/.github/autobuild/windows.ps1 +++ b/.github/autobuild/windows.ps1 @@ -5,21 +5,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml index d17ac1e76e..4b2c172202 100644 --- a/.github/workflows/autobuild.yml +++ b/.github/workflows/autobuild.yml @@ -75,7 +75,7 @@ jobs: contents: write steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Determine release version, type and prerelease variables run: ./.github/autobuild/get_build_vars.py @@ -258,14 +258,14 @@ jobs: - config_name: Windows (artifact+codeQL) target_os: windows - building_on_os: windows-2022 + building_on_os: windows-2025 base_command: powershell .\.github\autobuild\windows.ps1 -Stage run_codeql: true is_main_build_target: true - config_name: Windows JACK (artifact) target_os: windows - building_on_os: windows-2022 + building_on_os: windows-2025 base_command: powershell .\.github\autobuild\windows.ps1 -BuildOption jackonwindows -Stage run_codeql: false @@ -308,7 +308,7 @@ jobs: git config --global --add safe.directory "${GITHUB_WORKSPACE}" - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: # only Android needs the oboe submodule, so don't fetch it for other builds submodules: ${{ matrix.config.target_os == 'android' }} @@ -316,7 +316,7 @@ jobs: - name: Cache Mac dependencies if: matrix.config.target_os == 'macos' - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | ~/qt @@ -325,7 +325,7 @@ jobs: - name: Cache Windows dependencies if: matrix.config.target_os == 'windows' - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | C:\Qt @@ -337,7 +337,7 @@ jobs: - name: Cache Android dependencies if: matrix.config.target_os == 'android' - uses: actions/cache@v5 + uses: actions/cache@v6 with: path: | /opt/Qt diff --git a/.github/workflows/bump-dependencies.yml b/.github/workflows/bump-dependencies.yml index b78696c5d0..2cb12fe315 100644 --- a/.github/workflows/bump-dependencies.yml +++ b/.github/workflows/bump-dependencies.yml @@ -83,7 +83,7 @@ jobs: local_version_regex: (.*["\/])((?:ASIO-SDK|asiosdk)_[^"]+?)(".*|\.zip.*) steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: ssh-key: ${{ secrets.BUMP_DEPENDENCIES_SSH_DEPLOY_KEY || 'fail-due-to-missing-ssh-key-as-secret' }} fetch-depth: '0' # we create/compare new branches and therefore require full history @@ -171,7 +171,7 @@ jobs: # This job runs via pull_request_target. Please check for any security # consequences when extending these steps: # https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 # this checks out the upstream `main` and not the PR branch; this is fine for us # as we just need a proper config for git/gh to work with. - env: diff --git a/.github/workflows/check-json-rpcs-docs.yml b/.github/workflows/check-json-rpcs-docs.yml index 075100a204..3a6d98aae8 100644 --- a/.github/workflows/check-json-rpcs-docs.yml +++ b/.github/workflows/check-json-rpcs-docs.yml @@ -13,7 +13,7 @@ jobs: check-json-rpc-docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - run: ./tools/generate_json_rpc_docs.py - run: | [[ -z "$(git status --porcelain=v1)" ]] && exit 0 diff --git a/.github/workflows/coding-style-check.yml b/.github/workflows/coding-style-check.yml index 494cbb3b14..bc5ee337cd 100644 --- a/.github/workflows/coding-style-check.yml +++ b/.github/workflows/coding-style-check.yml @@ -30,7 +30,7 @@ jobs: # The clangFormatVersion is based on Ubuntu current LTS (jammy at time of writing). runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Check .cpp/.h/.mm with clang-format uses: DoozyX/clang-format-lint-action@bcb4eb2cb0d707ee4f3e5cc3b456eb075f12cf73 with: @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest # shellcheck is already pre-installed on ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Check .sh with shellcheck run: find -name '*.sh' -not -path './libs/*' -exec shellcheck --shell=bash {} + - name: Install shfmt @@ -56,7 +56,7 @@ jobs: name: Verify Python coding style runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Install pylint run: pip install --user "pylint < 3.0" - name: Check Python files with pylint diff --git a/.github/workflows/translation-check.yml b/.github/workflows/translation-check.yml index ed8fab7f19..171cd7fea3 100644 --- a/.github/workflows/translation-check.yml +++ b/.github/workflows/translation-check.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: "Check Windows installer translations" run: ./tools/check-wininstaller-translations.sh - name: "Check for duplicate hotkeys (will not fail)" diff --git a/.github/workflows/update-copyright-notices.yml b/.github/workflows/update-copyright-notices.yml index 98ea78fa1e..6994f2ad52 100644 --- a/.github/workflows/update-copyright-notices.yml +++ b/.github/workflows/update-copyright-notices.yml @@ -19,7 +19,7 @@ jobs: pull-requests: write contents: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - run: ./tools/update-copyright-notices.sh - env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -51,7 +51,7 @@ jobs: pull-requests: write contents: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - env: pr_branch: ${{ github.event.pull_request.head.ref }} run: | diff --git a/COMPILING.md b/COMPILING.md index 8ef78b5efe..c6ac38b098 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -95,7 +95,7 @@ If you build with *ASIO* support, you'll need the [ASIO development files](https ### Compiling only 1. Create a folder under `\libs` called ASIOSDK2 -1. Download the [ASIOSDK](https://www.steinberg.net/asiosdk), open the top level folder in the .zip file and copy the contents into `[\path\to\jamulus\source]\libs\ASIOSDK2` if not already done, open the top level folder in the .zip file and copy the contents into `[\path\to\jamulus\source]\libs\ASIOSDK2` so that, e.g., the folder `[\path\to\jamulus\source]\libs\ASIOSDK2\common` exists +1. Download the [ASIOSDK](https://www.steinberg.net/asiosdk), open the top level folder in the .zip file and copy the contents into `[\path\to\jamulus\source]\libs\ASIOSDK2` so that, e.g., the folder `[\path\to\jamulus\source]\libs\ASIOSDK2\common` exists 1. Open Jamulus.pro in Qt Creator, configure the project with a default kit, then compile & run If you want to work with Visual Studio, run `qmake -tp vc Jamulus.pro` to generate the `vcxproj` file which enables you to test, debug and build Jamulus via Visual Studio. @@ -119,7 +119,8 @@ brew link Qt@5 --force ### Generate Xcode Project file -`qmake -spec macx-xcode Jamulus.pro` +`qmake QMAKE_APPLE_DEVICE_ARCHS=arm64 QT_ARCH=arm64 -spec macx-xcode Jamulus.pro` +**Note:** if you still build on x86_64, not Apple Silicon, you must replace `arm64` with `x86_64`. ### Print build targets and configuration in console @@ -149,6 +150,7 @@ Schemes: `xcodebuild build` Will build the file and make it available in `./Release/Jamulus.app` +In order to run the application, you need to run `macdeployqt ./Release/Jamulus.app` once to set up all required libraries and frameworks. If you want to build the installer, please run the `deploy_mac.sh` script: `./mac/deploy_mac.sh`. You'll find the installer in the deploy/ folder. @@ -164,7 +166,7 @@ If you want to build the installer, please run the `deploy_mac.sh` script: `./ma **Note:** -- If have a free Apple Developer Account, you can use it as a "Personal Team": +- If you have a free Apple Developer Account, you can use it as a "Personal Team": - Set it up under Xcode Menu->Preferences->Accounts. - Then choose a Bundle Identifier at your choice in the relevant field in the "General" Tab (in section "Identity") - Now click on the "Signing & Capabilities" tab. In the section "Signing", the "Automatically manage signing" option should be selected. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df801e67b0..d16f02122c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,11 +48,22 @@ and note the [Editorconfig file](.editorconfig) in the project too. ### Licensing -If you add new (source code) files, please add a header with the license to the file. This clarifies how your work is licensed. Please use the same format as in e.g. the source files in the `src/` directory. A license header must include: +**As of Jamulus 3.12.1dev commit eb172d47:** All new source code contributions must be licensed under AGPL 3.0 or any later version. + +**Existing code:** Code contributed before commit eb172d47 was licensed under GPL 2.0+. +This code will be licensed under GPL 3.0 (or any later version) from commit eb172d47. +When distributed as part of Jamulus, the AGPL 3.0 terms govern the combined work, including network use provisions. + +**New files**: Any completely new file should include a header with: +* Copyright line(s) +* Author(s)/copyright holder(s) +* License declaration: "Licensed under AGPL 3.0 or any later version. See COPYING for details." + +(The warranty disclaimer and equivalent standard text from the existing files is not required, but may be included if desired.) + +**Note:** We adopted AGPL 3.0 to ensure that modifications and derivative works developed for network services +remain available to users. -* A Legal copyright line -* The Author(s)/Copyright holder(s) list -* A Declaration of the licence, indicating how to refer to the full text if not provided ### Supported platforms diff --git a/COPYING b/COPYING index 56ca5c8d12..d7bfd7f9eb 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,1353 @@ -General software license: +Jamulus is distributed under the AGPL 3.0 or any later version. +New code contributed from 3.12.1dev (commit eb172d47) onwards +is licensed under AGPL 3.0 or any later version. + +Code contributed prior to 3.12.1dev (commit eb172d47) is licensed +under GPL 3.0 or any later version. + +-------------------------------------------------------------------------------- + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + + +-------------------------------------------------------------------------------- + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +-------------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 diff --git a/ChangeLog b/ChangeLog index fd028bd66e..35ba449fe1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,69 @@ -### 3.11.0dev <- NOTE: the release version number will be 3.12.0 ### +### 3.12.2dev <- NOTE: the release version number will be 4.0.0 ### + +- Optimize Images (#3539). + (contributed by @ann0see) + +- Added uncompressed audio transmission - dedicated to the memory of Hans Petter Selasky (1982 - 2023) (#3653). + (contributed by @dingodoppelt) + +- Internals: fix deprecation warnings in threadpool.h for C++17 onwards (#3681). + (contributed by @softins) + +- Make server version string searchable (#3693). + (contributed by @dingodoppelt) + +- Introduce Directory Server in Asia. This replaces Any Genre 3. Asian/Australian users should from now on use Any Genre Asia (#3697). + (contributed by @ann0see) + +- Move internal domains from jamulus.io to jamulus.app as .io domains have an unclear future (#3701). + (contributed by @ann0see) + +- Updated copyright to incorporate AGPL3.0+ (#3712). + (contributed by @pljones) + +- Bugfix: Provide a working location for famfamfam flags (#3722). + (contributed by @pljones) + +- Request and receive server features by connection-less message (#3727). + (contributed by @pljones) + +- Bugfix: Fix memory leak for audio alerts (#3728). + (contributed by @ann0see) + +- Refactor server chat handling by extracting methods (#3741). + (contributed by @dingodoppelt) + +- Client: Ensure INI file settings are loaded before doing -c/--connect startup (#3738). + (contributed by @seanogdelaney) + +- Client/Server: Enable IPv6 by default if supported by host. Provide option to disable manually (#3720). + (contributed by @softins) + +- Server: Report OS as Unix if not Windows, Mac, iOS, Android or Linux (#3699). + (contributed by @softins) + +- Server: Optimize mixing (#3706). + (contributed by @ann0see) + +- Server: Removed HTML status file support and -m/--htmlstatus option (#3721). + (contributed by @softins) + +- Internal: Removed unused array to silence compiler warning (#3717). + (contributed by @softins) + + +### 3.12.1 (2026-05-17) ### + +- Client: Fix occasional spurious version updated message display (#3691). + (contributed by @softins) + +### 3.12.0 (2026-05-02) ### + +- FreeBSD: make -6 option work properly with both IPv6 and IPv4 peers (#3664). + (contributed by @softins) + +- Added missing override specifiers for virtual methods (#3667). + (contributed by @softins) - Client+Server: Correct QoS setting for IPv6 (#3622). (contributed by @rdica) @@ -42,15 +107,15 @@ - Tools: Added missing Makefile.in files to Opus 1.5.2 distro (#3488). (contributed by @softins) -- Translations updated from Hosted Weblate (#3540, #3453, #3441, #3388, #3652, #3638, #3620, #3656). - (contributed by @weblate) - - Translation: Added Japanese translation (#3568). (contributed by @tsukurun) - Translation: Updated Slovak translation (#3650). (contributed by @jose1711) +- Translations updated from Hosted Weblate (#3540, #3453, #3441, #3388, #3652, #3638, #3620, #3656, #3663). + (contributed by @weblate) + - Client: Added MIDI tab to Settings GUI exposing MIDI parameters. MIDI Learn feature also added (#3502). (contributed by @ignotus666) diff --git a/Jamulus.pro b/Jamulus.pro index 28f3bacd74..fa956ef6d5 100644 --- a/Jamulus.pro +++ b/Jamulus.pro @@ -1,4 +1,4 @@ -VERSION = 3.11.0dev +VERSION = 3.12.2dev # Using lrelease and embed_translations only works for Qt 5.12 or later. # See https://github.com/jamulussoftware/jamulus/pull/3288 for these changes. @@ -85,7 +85,7 @@ DEFINES += APP_VERSION=\\\"$$VERSION\\\" \ CUSTOM_MODES \ _REENTRANT -# some depreciated functions need to be kept for older versions to build +# some deprecated functions need to be kept for older versions to build # TODO as soon as we drop support for the old Qt version, remove the following line DEFINES += QT_NO_DEPRECATED_WARNINGS @@ -663,7 +663,6 @@ SOURCES_OPUS = libs/opus/celt/bands.c \ SOURCES_OPUS_ARM = libs/opus/celt/arm/armcpu.c \ libs/opus/celt/arm/arm_celt_map.c \ libs/opus/silk/arm/arm_silk_map.c \ - libs/opus/silk/arm/arm_silk_map.c \ libs/opus/silk/arm/biquad_alt_neon_intr.c \ libs/opus/silk/arm/LPC_inv_pred_gain_neon_intr.c \ libs/opus/silk/arm/NSQ_del_dec_neon_intr.c \ diff --git a/README.md b/README.md index aa525b0cfa..371ae40cfb 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ to thank the maintainers of these projects for making their efforts available to (taken from "The Synthesis ToolKit in C++ (STK)"): [ccrma.stanford.edu/software/stk/](https://ccrma.stanford.edu/software/stk/) * Some pixmaps are from the Open Clip Art Library (OCAL): [openclipart.com](https://openclipart.org/) -* Country flag icons from Mark James: [famfamfam.com](http://www.famfamfam.com) +* Country flag icons from Mark James: (originally famfamfam.com but see) [www.iconarchive.com](https://www.iconarchive.com/artist/famfamfam.html) * [JACK Audio Connection Kit](https://jackaudio.org/) by [the JACK authors](https://github.com/jackaudio/jack2/blob/develop/AUTHORS.rst?plain=1) * ASIO is a trademark and software of Steinberg Media Technologies GmbH diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7725864d27..0f58f79021 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,4 +1,51 @@ + diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png index 3ba6f7222f36a603683151392357ab925f9c5a50..704dc5710815e5d4acbffedfd21981d92c1123a4 100644 GIT binary patch delta 3299 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 literal 4131 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 diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png index ea9221bedfc1673418a9523775c8bceba8def25e..2c26f9697cf5456dd076cf686bb861653faa3cfc 100644 GIT binary patch literal 2222 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 V+P`>bPxbm=lf5+&e+_p$_HT+j5qAIp diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png index 9ea7673bd8604d57ce00d71a4768c8e6fad2a256..601c2f31f33e78de7b789a1b8b96d9a9056c589f 100644 GIT binary patch literal 2570 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 Jtu^0Dy!50Qvv`0D$NK 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 literal 5230 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 diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png index 873c1fc25bd949e1d46bc19fe2a95b9508fc72a1..32a0492448a2438c1320c3ad2aa2655b8c3c0e10 100644 GIT binary patch delta 5793 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 Lx_reGv!MS0jV1!K literal 7482 zcmaJ`byQSsw@120V5D=XmuASJV;Df1p-aF4MtX)AVCarPP(WH5B_$;+1Vmc8Lqb48 zI#fXL;&;FIyZ4X#-m}&@Pptj>?cd(dex7yKIXJk%T>v>VIUXJ!KwC@Q_@+(ybCVL^ zJU2DJyt-+aFdCK^6Z8X20Kx}}2X#U_AVJ!m2xp`*65$l+-H%kn!z18zHMPW8>g&ln zqCG_se{4jto?bU-JUm4etQW%39f<)sAe~)NN?ZqT+qpolPD)%B()wchUNEGKt5%Q? z(j>^h)G^52QO=1=MH!@smA@hIL}CyitfvRcS01ax^)FueoBp3^Fc;`wCKz`muKyNg zsSgLi&^|~IL{v<~QA|t%BqJv(4v~_AhzWxv#3aPPV$xu72@!FKyqJ`{xD4pu7uSt9 zAEyWM#_F2?_H{E-;&Q=YyyU^)fPete07+4_k26?YPEHOiCIOa^5V^4s@eM>_5LgkE zFZbUJ>PTNlA6GAoD;fp*!-#M|`(c#0Zj}Ca2%cX5p+))rJ54tU17i_hU~y5gKOy~X zsIUM3n|gZw$J!TTjQk(H|0l7pX`mMpY>f0p`}sKDEZhU`Kd!vwVLnI%2JK^tMtl67 zMYszZgZ6bndx0dxMI}J|`Upo?)SnrFe?j#1<+V}17zD}@sjaTWbweWR>gpsf29buT zi%ZI?NlJ)`i)%pDWYu75(&7?On1-a3q!{dPtUB7!&l8El{Ec<`AFSLzV*gZwr`L^V zb)=80KhjCl2ki;^SJd*Z|EvY_k9_~eI{mX2nSaEBZ^VHAtnL3=>%XUN3g}PwKb3nk z_)qO4Q8xweb5q&%cMxtjo2pt{9cqf5-?b&f(wem>Ys)+B?dHesD$IczU1tNLgu4h% zaq<;?zAT$^hS1&|XfHBEzVy+u*kf--qkC~og%^Z#L`0@7cmrvw_)eTLySmQYWLDX} zZxr6AJUgh_uidZRnfx8PSsh|u^|lK2+izcPv%t4@BAG=-H4M}Fc;;$#1-=#yGb zoCJBd?fRfpF)LIqrm^r^Q_W9^Fb(Yb>#&}7<90d|e=X!ak;nil-O$LND`%b-U%OCh z7@Hk^Ogf<0Wy(X8;(x)o!Nz0!NDZ`2)5}6dRjQZ>1RpIZ;g029|Kc&pQUhJy+4N4I zB3`pF;MWYK+2FPTYICL($O?8zo!Kw}%T+{+UqFGLMx;(G$9mmeg_NSNTtI8uYh_W? z0Tys7lgQR;idXUqP{R=b$fByWnuWP80Ol9WXIgZc@Z055>nT?%IW4|bysVqzJ6z+y z_yM_QloKHq`mUYfz}0XFg~lpRsfkXKIrte0q|Y$WO$J{CVw!LtPue z25wj)@oI`&TWCS&X_`O!&=s8*$tN| z|HwxsZ7WR;G?)NuKk?-sA;`Xd`uOxL;&lTvBO4Q*9ZD3^_Cs?Leph$rzJ)e`w%JZ* zQ^>l17zPY|M%|})3Y(r`Y+|| zq2HI>8p@hDp&%YZR(Ai$ur?hrZ+Z=)j*_O;l><4wv=KAwaDeilQ2doya#aw4wmB~iepVv)halO3oNJ(3`r4l@9F8RAhnMV z47<>7E%j^?Z&$1MW|-@eD>sqTMMK*EBq6?wANtPMWOBbgNDbe`$>Cde;=9DZuzQxA zE^i6P5N7)Si<`S$aiue&;t1y!IL9M&3nICgV)ymB~k6{56oeUlLQ{D_LuM z5SK+oONwI{YrI>Q(k$sr0x}e1S6)eVwytM3fApBCah(%;+c(m=oCiv&(zqYn$kaPM zwMs^K(aiQBU9M|}AS`Za8lKydJu$b=bGWt;z6LMw-x8o)rq;nM_sjP#PZ2HUWmFB0 z(A?>6t~srj=#`_R!CsTs%M?^;UQS@ z?Bdf;*|C1#hBr*+9KxeDaVFyoulrai1XloC4oYuG{FthHKf6;K z9o1)`Cta`;8X1vO!PymMsr8iY-vadZK|iJjXqLHvh=>R{4L6lCBm@t@^wcsd-Wa!8QPp~*~~BEqNns&P=4X~atk@K+(y&U?^TAEjZm#I zinnTq#RAkT%=XVdnTeQU810{xvF_l!nNuY9wKm=M#pCV?UAlqZ;pB+HZkgH3!F+BU z0T$oh-3gYR=TlhZc;|U(UE^NNb&ZM zlllQkjQ?3j%V6^-U)1B7h|-9>h+Rg&i;=ej@}4+B+|a5(=4ac%;WfgtSQNn92W5VZ%d0yL~>c*RtM9VWzm*Txq4UG zF?BCZx;!A}T~~{K{a8TH(|bsxx2zeY>#sSe4oI5=`nK*xGCM!;NqA;aOT{pyrob(i z^d>Di@$k-uwJkRPosS4Be`R!ZMl!+lLSMq~!Ph=se*SS*+-e@jzfK2}Gy#`pNbbS> z$7WVq>~7I-?Y7QoH$t!>!asvvMWsWV=FC49yr=JR>*)T#P^7m&9G~cp2yo3W^7rSk ze-V?T1+r=L*LKm8BvoguY$OWgM{KVqX=UevsG^@R%hE{-%JpyN0y&(f16nbduA@P} zo6R*n=`ReQ8YA+QZ8r9c6`|f9Y}PV1dywWV$9{dc?={W^uQn%zv{?DLQf0YUyr42X zMWBGIX59pMd5dT0R!FJBkg!t`(Ejqw9d(J6-qto=%tweR?Ma2tCrO! zaASWoA7_O>(>Bn&cW8?XORQ=`1s<-TC$zrWTwM`mq2shUPJze`Yztw@$b6T-PmFRJp9%D;PI0Lr{O?u1+>v%sa<_BB(@UIE#YFI7 z{Ffu_ca;ZkHx~8EbPspV+%^c;po3k)V;8Fx&%QUIT-A8p_h6~3Uqz2(?v)(nu)c`f z7H94w{qfdS|ihNf1FqV@7&V9irG(fk+o1;7tdilsSpcTy?*>8BGeLdop9 zyb{MdJjElUYcHGqzITwEZ+to^D$sN+A=p)h?Cmn>R!fwG@|SOlPxA>J1r;X~*i7S{ zozrx+6brcBmIpo=Yr&BnI}pQvtXnjW^I%@_DX9UWv$_5c0%nLEnG=AkITW0alOLt( zOY%P0E&uTAO4B7Vx5%iAl4q!bG#t7%Haku96l^Xrl9RBUBNz#EB~QtGSw8181)7h? zmlLuoEHNlICI3eHYRU7>9&A1Ug-JmrN=RS%3kBKk<%xA1Q@X~$nzYyru%|osnYY>_ z8m2emG(Q8GNGM2BpqAfk4t>1iJSHWcjJDt=usPCg@W?NjKm**Umx}hTu4aYj_Da5S z#ZGzX)^JX6f~ba!Y1O534uMXkKDa{4jYOaHxJN*TAcrQ5zT7y(rzPoJbK-FW<{2ic z;W=PY>oWG5c}w)ZaHjFM^m75kidNAnsoRIEqe`Lr>KAr0ZSW#=kQ1KMDlHwzIJ`UU zjrnZXwn&o{q)(KhtOpJs`Fyl#8ji2jCm#&O6q#9<&$6Vi-c7{-tJM9P)vm|CO713m zxpZO>xlQlpU+y-tyU}|sy&gH$0L1)NuPiRfNyy4J4KhRp-U-MbDxfHfj?_tHbY+dn z17{|0Z!1^_G!Fk|(~&C;e?)%V3fXLIrV=3;YFUfgUU|0Z|8!^@fIM{&|F&z@z#I#B zu!7ZAl7VYel(E;2>s%`J@QrqIki|?eG_09BIvaD*)ok#K0Zb3h!q{yt;r8AAz-sg2 z=b4Vpp9He51B>d2b8jW_oC_z9q|DmrdXQR)wSkq?e26mnL}!l1eF93aCdRT8TFbU|f5GIl|O^bSQdN>8Ni zzjkgnYTh5)8vLb$YTj;RqDiZ^7T5^jDW00zQvs6haSTB8B>f@Hw%*VBUOxBo_lbHa z!dCx%ix+!T9m4;DiBZVa?I5b%mtL>GT0i5y;kFV()vI}u@;Z*U2JjV50>;X^(rDVf z35Ko`K0VR-afUn2U1~_|3Ny6A?MAO|*L6%Kh)jppflq`KfUO`|~ z7opEV3E6=2ehZ_WcR;9_;)M)biRJSZ6HUCI?O%2-_@1>qQKy{#qRPP2_i<#-xjeRUT(8bmU z+y36J&QjHs@hn{|#Osb=$5WAXbVwhn=hqK%?O4u&Y(WOsR{SQFYoclTTuNE!f>;d( zl$%Qs*4c&YjZ76xALAq~u;r=lkge$~bx^6%hv|LxeBG**2R~os&aAj@P7&vS3vYO% zAu)2igaa;BDXbDrDvR`xex!`eT&TFVG4N_p6?yXQ_oNKb;dE;j<|=v@SK95j$Rk5& zrh*car|)p3^?MEFgok6Rh0)?a{LHu&TfkIHLjq&c&5hFhUtjKHDpO22oX4Un>J>|hVtlq^=VjblvpytP>~)6; zFY3vlmZ1eB(^vPG5)T@KkDtDta3h`v6g&8XViGp5PuEZL}UvBnvf5@%WhVW9&Db=wH(9XAuch`SQ1L1qW zjIWrw*1neSPlkYm+PfpNM@COCT|Ss=e1K*dH^M$=aq?NYzlhO zzmgpF5MVkBQ;Ear^H!J*!W1&&>sE;S*8C`iEbipUVwfa0qz@N_${8tZAr|;St#`b_{#cEPbWrL=|a;sZKF5C?9 z*nr?@C|V8?b_g-BkbDx&+e$UR#UGC46oPINk#`XD7!f~I4O9dFif#cI*qM89(m5_x z>TPC_;SPU(#A+Ytq$@9y*yW@@6RP|gaU2NY#w{k%Y$XXWTrbQ?pw=|vWlBiA*Iad8 zsfZI^%gWgPSnIom>s&hgpbq8H;hPDA;}^FZHuFuXfpvshe+N8pF+^TPhc#&*7CJxw zkY+?R(lhdg%`O;O{GXLDdvrkz^6+81cP1d6mIf z5yBX$EdHb9n{VBR;u34*DH|T`={tqkh1eeklWOc&WEi||VKX&N>6*GxWozGrB$i)3ehF`_1_W3QyC5v9)=mc8DyLfD1I z{5Fk2_KVEjdp7AcCrhZ)lP+)60xmuY>*qIC`(w?MSq z6*|$|d*1N0KQ!?0DuXzl-N{Yr%+3G@Q(pLa-+o_!fHbCMR9P{PdX0ETA$X;=H*uxz zZX&CwTfY4q;mDp+xx3U^peq}zK&`JVenzX8kc>p~&F3l4Mc(P;-BD{St^iE3(d2E6nV=c1)Sn8wdeJFie#tVSLz^eiCw!?Gg_fUHTALrz;7q0;OR7(tx>L=}}G|qbjl=sEBIw<0*l|Z8t0Q|OlMjQd(MzZN}iI%*_w{IBY32@(?w9nhiC9tyyMG)p}_vG`QQffmNnXW z(OQ5%wdWUCdYXz6ObgQnA358nyG7L$pGbeid(&K}P`_wN(32iwOR*UvCDC#BV>5d} zxKsMGq?=G8C4mczE>bLpclwNq&gER&rLe9L(Y!C9PSR|h@1lDbUy0F`H=Uhbnkzlo zY4V(bE(Ea&<}MUlE|5F#SQjkVvaqKk4QSzOu z6CBDw^#q=nF7EFVGJ6@nHRO?^o^F^=Mn9P?kRru@e%ZTAX;fYhEo&l*6A&?G3W)Et zHU)xh^a;);G$-pL=S$mM6If))w`vAiqSlKcZ8DyU&Sro~Ll)lERq6C@3676-Mg^Mv zcVFWH^}QQ_1<>b*!EdQ6s8Ug#UAp`yNC-B4;8^hXN>*sW2D@U2lzN{@gaokg_ZwTX zN$0~##M+Z0boBw}7__wFH~lDDHuzJY?`ZDI-faVRu6|n9=!1*jT`0nx6M~-QaBRK864rply}p_x+bAR9ziV9)s!u|rK?)JnWm+> zfGKe4dI{~9qEpLNcGrNl-(J+mQpI}R-tyh@+7QAtvVPZrtBw`MKBi~I&L@yXB9i=< zd&ID(9dt#8=+u{AY1G+cRj0Yf+SV@yC%@(hrYjE6KDZLtgO0{uZ`7v}%h3*662B~o z^r%bb&r}bTBm%zI9|zSj-Sc~5vn$Bl2gyy4q83?(kMIgKi*Y;DF$;fqL9LamUQ)v? zAc@G#N5`tM))l=&3aeI7Yt5^3;a|m3nzPvFrgbiHy`{vJ(ydX@;m>7hIUXJI57_cg z?>-EmJ$0?%0C`(~{N)g{)3bZOU;qFB diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png index 43c1851e6ef008b5804254e790bd0ee2659b6052..308541558371ba1e9a6483164edf74eb672d2a5a 100644 GIT binary patch literal 7573 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 literal 9769 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 diff --git a/docs/JAMULUS_PROTOCOL.md b/docs/JAMULUS_PROTOCOL.md index 8af9df19c3..20fc0438f0 100644 --- a/docs/JAMULUS_PROTOCOL.md +++ b/docs/JAMULUS_PROTOCOL.md @@ -1,6 +1,50 @@ +### Copyright (c) 2022-2026 + +Author(s): +* Emlyn Bolton +* The Jamulus Development Team + +As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +under AGPL 3.0 or any later version. + +Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +This code will be licensed under GPL 3.0 (or any later version) from +3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +the combined work, including network use provisions. + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + # The Jamulus Audio Protocol -Jamulus uses connectionless UDP packets to communicate between the client and server, and additionally for directory server registration. The `src/protocol.cpp` file contains much of the details of the packets themselves, whereas this document is intended to form a higher-level view of the protocol interactions. +Jamulus uses connectionless UDP packets to communicate between the client and server, and additionally for directory server registration. The `src/protocol.cpp` file contains much of the details of the packets themselves, whereas this document is intended to form a higher-level view of the protocol interactions. Some of the messages need to be acknowledged, some do not. If a message ID is less than 1000, the message must be acknowledged in under `SEND_MESS_TIMEOUT_MS` ms. All of this information can be discovered from reading the code, but hopefully is quicker to digest when available in one location. There is a wireshark dissector available too, [here](https://github.com/softins/jamulus-wireshark), if you would like to inspect the packet flow. @@ -17,10 +61,10 @@ The message packet structure is: +-------------+------------+------------+------------------+--------------+-------------+ ``` -The TAG bytes are zero bytes. -The ID provides the message type. -The SEQ is a wrapping sequence number for the message -LENgth of the data preceeds the data and is followed by a CRC for the packet. +The TAG bytes are zero bytes. +The ID provides the message type. +The SEQ is a wrapping sequence number for the message +LENgth of the data precedes the data and is followed by a CRC for the packet. Data is sent little-endian, i.e. not network byte-order. @@ -32,16 +76,16 @@ Where a message will not fit into the maximum packet size before fragmentation, +------------+--------------+----------------+--------------+ ``` -The ID is the message type sent in fragments -FRAGS is the total number of fragments -FRAG_ID is the sequence number of the data in this fragment +The ID is the message type sent in fragments +FRAGS is the total number of fragments +FRAG_ID is the sequence number of the data in this fragment DATA is the fragment data to be re-assembled This forms the data component of the packet above. ## Client Session with a Server -As the protocol is connectionless, the message flow at session start up can happen out of order. +As the protocol is connectionless, the message flow at session start up can happen out of order. When a client starts a session with a server, it sends valid audio packets to the server port, to which the server will respond with the audio mix for that client. The server on a new client connection will: @@ -133,7 +177,7 @@ A typical flow would be: ## General Streaming Messages -During streaming, some control messages are used. +During streaming, some control messages are used. Some typical messages could be: ``` diff --git a/docs/JSON-RPC.md b/docs/JSON-RPC.md index 5556401a27..c57634f546 100644 --- a/docs/JSON-RPC.md +++ b/docs/JSON-RPC.md @@ -31,7 +31,7 @@ The JSON-RPC server is based on the [JSON-RPC 2.0](https://www.jsonrpc.org/speci ## Connect to a JSON-RPC server -On Linux, you can connect to a JSON-RPC server using the `nc` CLI tool. +On Linux, you can connect to a JSON-RPC server using the `nc` CLI tool. On Windows, [you can download](https://nmap.org/ncat/) and use the `ncat` CLI tool. @@ -129,6 +129,42 @@ Results: | result.version | string | The Jamulus version. | +### jamulusclient/connect + +Connects to a server previously discovered via jamulusclient/pollServerList on the given directory. Blocks for a short time (up to a few seconds) while the outcome of the connection attempt is determined. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.directory | string | Socket address of the directory the server was discovered from. Must have already been queried via jamulusclient/pollServerList. | +| params.server | string | Socket address of the server to connect to, as returned in params.servers[*].address of jamulusclient/serverListReceived. | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | "ok"; "Not Found" if the directory hasn't been polled, or the server address is invalid; "Unauthorized" if the server requires accepting a licence, which isn't supported over this API; "Gone (server no longer listed)" if the server is not, or is no longer, present in the directory's server list; "Upgrade Required (obsolete protocol, upgrade Jamulus)" if the server requires a newer protocol version than this client supports; or "Insufficient Storage (Full)" if the server is full. If the local audio interface fails to start, an error is returned instead of a result. | + + +### jamulusclient/disconnect + +Disconnects from the server that was connected via jamulusclient/connect. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.directory | string | Socket address of the directory that was passed to jamulusclient/connect. | +| params.server | string | Socket address of the server that was passed to jamulusclient/connect. | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | "ok"; "Not Found" if params.directory/params.server do not match the connection established by the most recent jamulusclient/connect call; or, reflecting the outcome of that call, "Unauthorized", "Gone (server no longer listed)", or "Upgrade Required (obsolete protocol, upgrade Jamulus)". | + + ### jamulusclient/getChannelInfo Returns the client's profile information. @@ -143,7 +179,7 @@ Results: | Name | Type | Description | | --- | --- | --- | -| result.id | number | The channel ID. | +| result.id | number | The channel ID assigned by the server, or -1 if not currently connected. | | result.name | string | The musician’s name. | | result.skillLevel | string | The musician’s skill level (beginner, intermediate, expert, or null). | | result.countryId | number | The musician’s country ID (see QLocale::Country). | @@ -290,9 +326,26 @@ Results: | result | string | Always "ok". | +### jamulusclient/setCurrentDirectory + +Selects the current directory, as returned by jamulusclient/getCurrentDirectory and used as the default in jamulusclient/pollServerList. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.directory | string | Socket address of the directory to select, in the same format as the strings returned by jamulusclient/getDirectories (and accepted as params.directory by jamulusclient/pollServerList). Must be one of the directories returned by jamulusclient/getDirectories. | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | "ok" or "Not Found" if the given directory is not one of the known directories. | + + ### jamulusclient/setFaderLevel -Sets the fader level. Example: {"id":1,"jsonrpc":"2.0","method":"jamulusclient/setFaderLevel","params":{"channelIndex": 0,"level": 50}}. +Sets the fader level. Example: {"id":1,"jsonrpc":"2.0","method":"jamulusclient/setFaderLevel","params":{"channelIndex": 0,"level": 50}}. Parameters: @@ -325,6 +378,23 @@ Results: | result | string | Always "ok". | +### jamulusclient/setMuted + +Mutes or unmutes the client. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.muted | boolean | muted (true or false). | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | Always "ok". | + + ### jamulusclient/setName Sets your name. @@ -359,6 +429,23 @@ Results: | result | string | Always "ok". | +### jamulusserver/broadcastChatMessage + +Sends a message (as the server) to all connected clients. This can be used to broadcast messages from external sources (e.g. scripts or monitoring tools). + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.chatMessage | string | The chat message text. | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | Always "ok". | + + ### jamulusserver/getClients Returns the list of connected clients along with details about them. @@ -425,11 +512,29 @@ Results: | result.countryId | number | The server country ID (see QLocale::Country). | | result.welcomeMessage | string | The server welcome message. | | result.directoryType | string | The directory type as a string (see EDirectoryType and SerializeDirectoryType). | -| result.directoryAddress | string | The string used to look up the directory address (only assume valid if directoryType is "custom" and registrationStatus is "registered"). | +| result.directoryAddress | string | The string used to look up the directory address (only assume valid if directoryType is "custom" and registrationStatus is "registered"). | | result.directory | string | The directory with which this server requested registration, or blank if none. | | result.registrationStatus | string | The server registration status as string (see ESvrRegStatus and SerializeRegistrationStatus). | +### jamulusserver/privateChatMessage + +Sends a chat message to a single connected client. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.chatMessage | string | The chat message text. | +| params.id | number | The client's channel id. | + +Results: + +| Name | Type | Description | +| --- | --- | --- | +| result | string | "ok" or "error" if bad arguments. | + + ### jamulusserver/restartRecording Restarts the recording into a new directory. @@ -444,7 +549,7 @@ Results: | Name | Type | Description | | --- | --- | --- | -| result | string | Always "acknowledged". To check if the recording was restarted or if there is any error, call `jamulusserver/getRecorderStatus` again. | +| result | string | Always "acknowledged". To check if the recording was restarted or if there is any error, call `jamulusserver/getRecorderStatus` again. | ### jamulusserver/setDirectory @@ -479,7 +584,7 @@ Results: | Name | Type | Description | | --- | --- | --- | -| result | string | Always "acknowledged". To check if the directory was changed, call `jamulusserver/getRecorderStatus` again. | +| result | string | Always "acknowledged". To check if the directory was changed, call `jamulusserver/getRecorderStatus` again. | ### jamulusserver/setServerName @@ -530,7 +635,7 @@ Results: | Name | Type | Description | | --- | --- | --- | -| result | string | Always "acknowledged". To check if the recording was enabled, call `jamulusserver/getRecorderStatus` again. | +| result | string | Always "acknowledged". To check if the recording was enabled, call `jamulusserver/getRecorderStatus` again. | ### jamulusserver/stopRecording @@ -547,7 +652,7 @@ Results: | Name | Type | Description | | --- | --- | --- | -| result | string | Always "acknowledged". To check if the recording was disabled, call `jamulusserver/getRecorderStatus` again. | +| result | string | Always "acknowledged". To check if the recording was disabled, call `jamulusserver/getRecorderStatus` again. | ## Notification reference @@ -559,7 +664,7 @@ Parameters: | Name | Type | Description | | --- | --- | --- | -| params.channelLevelList | array | The channel level list. Each item corresponds to the respective client retrieved from the jamulusclient/clientListReceived notification. | +| params.channelLevelList | array | The channel level list. Each item corresponds to the respective client retrieved from the jamulusclient/clientListReceived notification. | | params.channelLevelList[*] | number | The channel level, an integer between 0 and 9. | @@ -655,3 +760,39 @@ Parameters: | params.servers[*].city | string | Server city. | +### jamulusserver/chatMessageReceived + +Emitted when a chat message is received from either a Jamulus or RPC client and to be broadcast to all connected clients. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.id | number | Channel ID of sending client or -1 for RPC sent messages. | +| params.chatMessage | string | Chat message text. | + + +### jamulusserver/clientConnected + +Emitted when a client has connected to the server. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.id | number | The channel ID assigned to the client. | +| params.address | string | The client's address. | +| params.totalChannels | number | Number of total channels connected to the server. | + + +### jamulusserver/clientDisconnected + +Emitted when a client has disconnected from the server. + +Parameters: + +| Name | Type | Description | +| --- | --- | --- | +| params.id | number | The channel ID assigned to the client. | + + diff --git a/docs/README.md b/docs/README.md index 97a876a90d..3ac4a1f554 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,47 @@ +### Copyright (c) 2019-2026 + +Author(s): +* Volker Fischer +* The Jamulus Development Team + +As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +under AGPL 3.0 or any later version. + +Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +This code will be licensed under GPL 3.0 (or any later version) from +3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +the combined work, including network use provisions. + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + # Documentation Mostly documentation can be found on the Jamulus Website: https://jamulus.io diff --git a/docs/TRANSLATING.md b/docs/TRANSLATING.md index 404b1aa66e..64cbf96d41 100644 --- a/docs/TRANSLATING.md +++ b/docs/TRANSLATING.md @@ -1,3 +1,47 @@ +### Copyright (c) 2021-2026 + +Author(s): +* Tony Mountifield +* The Jamulus Development Team + +As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +under AGPL 3.0 or any later version. + +Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +This code will be licensed under GPL 3.0 (or any later version) from +3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +the combined work, including network use provisions. + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + # Guide for Translators This guide is written to provide instructions from scratch for contributing to the translation of the Jamulus application to other languages. diff --git a/ios/Info.plist b/ios/Info.plist index 32501d534d..0776c2643c 100644 --- a/ios/Info.plist +++ b/ios/Info.plist @@ -1,5 +1,52 @@ + ITSAppUsesNonExemptEncryption diff --git a/ios/deploy_ios.sh b/ios/deploy_ios.sh index be79bd2a79..220c6c0edd 100755 --- a/ios/deploy_ios.sh +++ b/ios/deploy_ios.sh @@ -1,4 +1,50 @@ #!/bin/bash +############################################################################## +# Copyright (c) 2022-2026 +# +# Author(s): +# ann0see +# The Jamulus Development Team +# +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# +############################################################################## +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## set -eu -o pipefail ## Builds an ipa file for iOS. Should be run from the repo-root diff --git a/libs/NSIS/NSIS-source/Bin/GenPat.exe b/libs/NSIS/NSIS-source/Bin/GenPat.exe new file mode 100644 index 0000000000000000000000000000000000000000..62da1ff3e64614c7c0d02796e16d69bc7c80692b GIT binary patch literal 25088 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�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%0Al#XtHvGfhQm!opa+BX%j7{DZR|-QrK3 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

xhDc~SlL@wm= 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Bin/zip2exe.exe b/libs/NSIS/NSIS-source/Bin/zip2exe.exe new file mode 100644 index 0000000000000000000000000000000000000000..20c7efc07a5dbdab803282a938dee49bfc085a2d GIT binary patch literal 23040 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 Ag8%>k literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Bin/zlib1.dll b/libs/NSIS/NSIS-source/Bin/zlib1.dll new file mode 100644 index 0000000000000000000000000000000000000000..afe71c1d450290c6565cd0ed4e4812563663e472 GIT binary patch literal 81964 zcmeEve|(eGy?@%IZD<1t5TI(6D%~A3)zt;JV$h{634t~tr8H%gwz#ocdzr&F0XAr% zJPG#X5QkHlyVtAR?%n-*xBJ~M-5sdYre#ejPFm^}6gQFi-BQY(MObN}Bj5MuJWqa< zA8vQo@9XvbLp06F^PK0L&-t9s`TRcTan|lpsZ}bK2A^0=rP_yY`ezk?Km5-qZqJzi z!VJ~((|&#PzO;&8-@Ll%f!6$uEnmIA<-V`vf9bvlAN;B}|BGMFZ}B~t|GDdKJ)3@1<9)6%;|5Nc#j^zhW{XKrqD*pLXU%~gO;$Mj0nU?3C+JN7g zmR~;AEb8xj>g)KvJBvNli0>cW^2$?9_};7erTAX;z?Yh+&C5sNwy9JVX&I_RlTW+j z_fDv0+?dXD~xZ~1Ev zaQisA$i1XeEuq`_X{tSh_{;wlrKzH5$law<Yx(kqucD%h+5-+mJ^D`hXH}_6Q+|G2{1^itW8h;9e2jsQ zG4L@4KE}Yu82A_iA7kKS41A1%{{{xC`DyOdR`EK6r-o02-#2u;OKt$^Vw&%Byjo}O z3Z|?3IwsEGT1#ffFny~hI%4##-+3Jj)sFY6%p(oq6NdVn@V#|C+@}kS`LY}8_mTOA z3(`eH>z#q)UTQ5<-Dg)%l>5$2ZIegLM_#6e8qSZ^-^;tvSWdXEr{m&J=1@nkqoI92 z{&)3pW=nFc;S4! zFdi>V#0wYVg^TgRWW4a_c;QmK5Tk;6!l4h`AB)9!*nDI^jp_Uu9(hGz2{4{NA9L#X z1$|&KssxVf{WLaUNWb&DDDa+eRAW9OjTrtv9MpON@ziNd3{uPo}dro*AbLQbo6U~?ajvK#U!IC@z~3B;kH9WQV8lqp__Tb0_k~Z*2oGPU9tcNu z>cP-b!*qd%eH*(fYEuv*>gxb!I{I}QFzQP8swf;^fJ~Qc&#A+N@-{;tc7DLSU@WZm z-oyvY$Ai~(oCKy-=Am#@%Z*P^Cdv3!0;zw-Vm%s+GcP~fLbtXAibZj43!Xb#b}j_mk)USZ|Gg%c=B%Tz<3F3DW++0 z@WbKZbPVK35`=0o>+frbP-xDKmrXfcNWuKja^CIxWgrGp>m#9|%xgc98t4W!&0+gW z-^qsh^8<-RF6jBg`Bleh6{ym~eFjjpF%a9X2j3doJPq8Sp`O;?e%!`_-jOfu`!615 z6@eYFTbC|xM~_~rDx;Pw z8_A6~@idMP`{Gf^36x8JeKa7h;5SQO7Fh~n$3>lJM;lkaiq3_Vtqi5 z5^vL5F8Fj%ZO~;*X0FTfSxv5`+m{_#mT&!0MJ=mYxVWakmlau7uns>l6lo%cyEYwh zLBd>}(ehSX_W9$idXm){M`lSE_3hIk^3gl`P~jT4^xS+jm;}^}D~0?xl%o`fof$vti4#bnACF(zS7o{u^~vxTvK*jnk-4G`MVG(*ZF5 z<}`P#CZFU6>1Z^NNmP~x;+#acY;zuS;qeUCBYyJTjzN@`dQCq{7Z_0*7d zw*xrjt$Belz28Sgr!H_%?{B7Jd#)5qXKj;uKdG@&EX|iKwQFwG2P){U-5coA2TGJX z^PoGpD|vZQWpu?kvHmcFtgMJv8_Zo6!f<@U`BmjX#uy0`YwQSe(gbjNk8Z!+r8&qjtrs1=hZ5+LNpl!1< z4afBY#+a2hmeo=7g%yjNrGxP`UT5XQ-3k$;BwRFKn zUTu5slUS@A%Ijl;<+H;fBlvu8qAE9|@&BrYly*|D<&vMrL z;NpgS?*oe)3cTxCgON38Swn7QSt0en?OIlEWOf6$=URH&GR_|Zs!^`ueO2e*yy0M# z^zMEs{E#%B&RiN_R&;VK78}Wke*XhvNjkQyh}AFjL^C%D+A((t9u{XG#E1Y7DMH$s z=odjrv@jt%d^)}?&mA3*DUL(wOzN!Ix#_-a8oDFT+*Q{jI8&m! z;K$WkEQwF?QmTIoYJxXsaI2A}0spv^!&l_-M_&RBFc8yaEy(@VpxS1>B@e=LBVT6V z-=Kvgb){SSTD3ymY=DMNsx5z*+Ig8ct!dP9wmqGneE}q_;;#*z1k2zM2DkoC z>Y+s}vVJPI>7-c9m-PxU+>x1qn11(jC`mE!%OBAFIs=yG?q}%QMexhLC|I5*PTDP>{M#RMc8DA^P&p;iZK58O<51qEFDeJfLN^$;B@d^YGeG-+UzeZaNdc z&0UTB(HHO(+q(m|8+pe*{4gJ3yLOA8kG@1dyV%}6^4*uIs(l-`O)>$ozyO|?L9lFP@T&?xht=v)(P*gR zjtpptdjJ2XHfXx_{_jz7S*{dSdGB+0S30~|`vh7&d}ZFgS-1&mTEQPOz~IQ_B}S>s z$REn9!Y^&`Cac|l+&9i2Dwz7S@Lv3$3-TG6$(L<7f9!@X>4Zk=${a}t6WLs}A7rnx zoblbVc%|ESBmaQ+hyOSO5O%}-AmigqgSxjK21piJ7`g^^7^|ZpRFWwc3C1^t{}w<1 zD*X34Dv~tL(0^k(%3#F1Gw50w>=nKLj22UBQTcMf{D}3wi{IR?xtpYbZ<;ir(Fb0m zOI3!z5ufq9I>?0vR+d{Y=wFtgo`ur*t?VXNJv-(F%-J> zf$yMER7X`vk||Yj*;p!S#qYa}CCp{yV8*Dg#i&v`5>M|U8eRr%1D)~1zAORq$UNy~ zS`_JR)4<-gY0OP9L{#Kxb;{U_QBO zUYReqPP26Wys2M(xY85N#ezmP@H5oRC)QQ=8Mh}&88LuQb_k-{8QBM+P;k#k9A+pj zHhthX1S*XUB1P}-qhF<<*nCXRC&&k58D~yy>lT`pcAX{Sv+%DMLY(AT!kcn|E>qae z%Zk*4P}BFnA8)xT`b+dlk9c&D3%t+LjYhm?n%H(Nuf)vf2aVaC#$qA?dp=Qt6_n0U zTw#;}w}jy-YUxa%ot7E(Ngdj?>aaWmwnU#)(VlN9HTq^GCu2E=gJCY$2L@?QZ8?b~~wbpAAG@H-AmS;W~)Xf8- zV^CV=oFo#$vJM=?!uHO@kVZm^vBI5`BWm(4+4J}oLg_6u!tPBsVCk5;q03c)#8ySW zgsxFlRvTf8WiwYk$n0KuWcTU=zoxOE4MzcKsFVi=r2f?-)1-_{`=KK%_^3z5{%h*U zvM{XspUzr&|U$-vyKftBQ!idjrUh#=YGvvb?H z`5>t&FxQ?AFAo`2(!0~lU8X^}I`mI>IYPS6ODCq8`Yiq1Z^R{UE}tXIo2n`DrcDO{ z#mf~Lm5V{~oigjCb}{}0XbE@JXEVDTR4uVi73>PCVb88Pik&0V32X_qduT*xf)&6sMsR7Lla zu!$qxa0SvyAJllKC1=5&3->Zvzj#h1CWasnJWA*gA{kVmh#*D&RNax3KM9)n4Aqe- zB3NY>@-;4bgd7i6#RXZsm1$RL1^g@7N=`~EBrryj{Fr!lDnGstzk$B0=#v8MTtRZ} ziiP4bk`Jb#UjKNU@W7Yhl(?K8=cu5^uqv2JNtcFV%8D;p|A*QHD`lgWZ!uy%PGMB{ zaJLZ`N}1c((5d?jcNk0RnS(sWQ~%+4VGKhD^Dv(_y1SWBY~RF%C;I=tASSn-1k!%bLaD8;9G&?B0eX4KhUCWTC}+TrzC4HvNd_lGyzqGOpPa3iD!IT z`dwDsoDLkoivy`tUct(&7`^b~c=B1T2`jj``;#b z%B>__21Rix6?;*n0lX|O6~Z`CALK2?JS@{eA2}@kg_jrd7AxOs#l6dJRPdIieCyIH zZ|Hc7mT%QwR)2+oE|+OduYoGyODKn?Ex;aZ7(4|pQOM}Q)yK%bWt_Z3A^tcZ3q95e zOCcm}L$r$V+#LLUtbqPXMfgkHy{^X-{l=e3Drn*^B21#Ps*=ls))Sep<}ql2d_{%2 ztA>>>;id40cpaB;fqy;D_}-LVHiu-F%}!F$%?BGo8f*AOdL!=?)@5*qxQd@-U$P)s zf#!qwN%kcRk_jk&3j4BU18Z5!TDetl$mF{Q_Esk<8f04$m?!y9r8@}8dGG<8^)cTzr z^bBAtD>fZ9A5?b-wfqb(U&C4*L%)Zz;z%>&=jsJ#K+3HS=n-Ybyww5uz1145Fo1!f z?$Ga1!`#bT7s2I)5tTU>e4zNdHuG`^FO&UUlJK;ZdrQe1DSk*3>K0N7e$cVin+Y&m zr}Npo6j$_t$ADD+9Jxh#*%HgBUfLnx1b#QDk6J!xz1!4%cRC)ytZdTmQ%W-O&zQT^ z7i98zO(q}2BGldWOrqw5zzYTG3Co$*+e~kmdONzsuL1Dm0cxUOeF?GEuGA*d9;0U! z$3&bwWd9O{H9-^_9)^MrXfmM6@@|Yu4SF*5dAOP3W*_{--86TNE+gd3<~f)K8j7C3DnaO&ZS0R}M! z?pbT;ZvR~12%vKntNUpYnz}JiSbt}~lseE)#G6s$d%Jl`Wh94H9>AqRNu-n#{b z|D7lLuLx1gQy^c;!8DUFV2Umo#5XyaTe;lk|d&FLIzU_^4{KqP8*S-}|Hn9>Kd+X`$Vs*g8`f$lx@cstX7hg-2$I3*l%M z!jyYd7jdl{&+Q@+#N~*H3|GAuY{)VIh`Dex>K_lAj`0aB!g?=1w0SKtml}j-))4{` zgQ<6vnnA}Kf)(k+w&1A$9XaX|$tJc1PyJg!SrVDGGTy|n8L((yM{W6jHvA8uIf2Du zbssp*pjb0&BKCDej6uYM9788CoE2$iw7Pmh7#Bt`EdmCCl%OV^i(pKrZL%?y ze?j^Hui3y?A|AJm`Ofjph3bBa^DNsEdYXi|WoXlM(;FS#v@%%r>5(iY4<+=dkT2Dv z!PVMWXLU}{sO_wd@o$m7Vd-wsguem=)p)t@oaF;n9o?j6)#sp7@|xmcT}=H(aUQIz z@1t(8E~j{HdQ2Z6n!7rqhl-_l{Z)v<>i5ET- zFMKLq$d4E1#S1gyg$#>xwB==2H z>T+mU4U2e9tMq9%7lKDb2n8Y~v9r>RH z$9n}l1?$AyF(LTgCq2<0Av%N$5IxGZ9Kp`@{uRXdzyRmKdjNX?>lW6A!urg|1?N+^ z-iNJLEU-mb!Hv9r!vZYKBKI0~-S(R_0mH+ShrVmPd8~!d4qCO;@35pkr8Y z#KFyGaKvt*%)-{sz@p!Lv+N5_^Ufi=f3|pHBXD|wHfmwI+rc-t2)@|~(phX@r+;`m z3M5oqUM{n%r-_Y*wrT$ybZr42T`%)d2N-FU!bqP^VWih9PdQ;^iszMljUyjDBUQNQ z77?lf6NMTJs7(Xveu{9q5K`O%c2~lQ(OHgeULsG8B9H!xc_HbOBl>_yBb z8&Y#<@j-bBE}a>Z1yr2>j$ecSj?3s5{I@jDeZ@Q^x$iETuH}}nujoSH% z;b?_Jm*}E&IfN0P3k(ZRHcVO$)PfQRumR#x0Tl@74)2GZ%I!^1dujze70aLnmufK< zqNz@s7Ne*{Ke9X){IpY(%>{t4x2$qn856%r1d}XLP#%(hp=C=1JU*QtW~mImG(HU} z3Xx#&Cu>v3WyH9W3|{bebwp8?WrTkif8RT$tv+(qCbUSs|2D9#58>~XN&=0?+i`)o z^ky&`8{$jcBN&Z*EzW3YlPcLsX{7I5P%AQ9zY{4wv{*qZB0?!NtTYBL)P1hHK}yD?er8{3cN9eJ=ktRG4~%b6;novU{!IIG&wQXU=*-d1=ElxrX)Ts;u=j0I20tAXmh!h z_>~}#<(Lu6pg!;*@vSTMK%u(5=mFX?K`(CRSsVSYQ>ZzE?79+)lLZ#xNplyxd|a4y z=cbx3`7i|+|>0%U%y@{B~>F)63>%U*WDbejFO8I)_jTrh5N|I z(^i>}dn`RQtZvemblW$52i0S93|%mYC{f08HsvOgiKT-vR-Z>vyL`xw`gN?{z+4Vi zUx7rmV3r?Ja2Fa_QnXFKWbyVK{mWfa6scs6k^8CG^`FwXbMsoVxR#bx)W!;)$i-L0 zZlIx!EJfj`Uqiuy0*R)P&nV%ykxxbJWGbpg5KgNgjc;Tg3ee+JBZweYfWJV}6jF`g zvb1G@B0$M|+-|V+_-1=zb95LE24kk&Akro87Py?hxW3SPwcAQtQk(7)qB_8oyDBzE zODGwa4v4%LgE=;$LrRgk>w_PiA6(8SLJeuCLuf-kNMFM2U9Dwat&=XGQG^gFz*tr3 zmK#R1BeUS9MJT9R8_X{4)LQ)qePgJOLCDYo`jJl}x_BGmh!Q$Jp#_u5AYnsEQXTKo zc?mh;>1ja2j#qa`7h>%i-aS&#^dGo@PTf8o+Fli#lMf(AvN0_5T`T}bj4XyYh!5e+ zTz)qpt1@=f6FUlHJ%KW*-H=AH4KYO>?PAJ&w>GCypa~5v!b8lngu9mT0R&7I3?d&9 zAo$P#O3c2*6MX{H1LRPum6(J*<0Tcf_4rid^JRSQz^4qK3Vi0{vk;%V@Y#TmD*KxM z(o*iEXRA|wWozh1Ms{Z6S{9YG)21#Mh2PbfiDKA2GP;qbVP)-0S$k1Ujfb_biFz`` zI%4fw)~;jiP056@sq5`&Xi}KYsq0PTpCMt&YiXXHvbvC?b8AggF199sNR2=tSd_cQ z6RkxX9zGr?+&t{_0ApwnTuj*yA+PUCmC@U;)*omKp-6dK2iTw(l2>;(kq)AYwAn*M z*W+ayC?LHxLv~k}ARLwgy_`QM;yd1w_{0};`&!5z1Sl{13b`HgUX0K=d9grXL<L^Um-@p8}nV)rT>lZ(?y%{sDiodWEdKoCc~P^~cCt<}%1!&pW$gLV!Nyu7Ci2 zT=Y)4Y@;ACE@Q_=YFh|7*6EPr03K#KcEg2{dECARWn4t{Y;H$#>uU9}*%#yOcUirgwXdeYu1BZtnSB&% zJTc8;eNcYC2YX+1*pyTmoksdqAOGOnpb|@;Z<^%;Uk0Znvun_YOwU@}1s;ib6_VD= zB%N|&jR*5Nn^(FKspJo>#)MVsX1{@!@f#Z(#*!BjG$`N$aM8y|Xvk1$J_IV%C;bT2 zI!y+MT36V#*C0cbddE10OLD|U3=8@xVLdA+oHK}r;}fCft|n7hdP{|C3FwsdPVj+& z{FU$te0gt7;Aw_{%BPcgTLv##TGx|UP+}LR5#AW~8P*F>+A zg%vU2UnBjUtI_V~EWPlhA%3Qz7*QXBNS6hQaG^@WbI`MzqK8QD&Vicq<;7dA-f4@s zHYs_kWkqNU0k=H$LCcwz2f=84`IwpzbPJEWD*6qY3BmgH{*^?ph-XqlbQNp$vht15 z_r-mrx5It>X}Ygw76Jt^sA>cmk#c~N9Ct#}DDxR+M`#a6IpW(;k*cEe$*89Ecs&0; zaAG;H58NpFnN;)&cziIQONlGVibkBixX+02m?46kJJ3!hDOZP0ed=!TiZUZ;VhQ9H zxNxAWeFmSa9^n0KuH|sc8-cF21+h7KB%QTj?YSsGv95~RVCKjjQpHg}13MIbKLoCk>}d)kt6-(h)Q4+`2@+IAcq9&0(^EuI z7ptNHS#cOS*hDnnJXsZOm9NA{#JA@LV!n)5{J331G*~tDe$!fd?ow6MB43wjv#tl@ zmF-7T5#;rXCIyqUV$dsVczY8RU_G}NaM$|a%ua(9+YirkdlT~dLQbt|ppv@^)P1Yq z;q6rN!`+7wyN;1qu|3#EhUEuJ#96mF0)I4hFqFy9V zFxSTD{i0!_Bd=p*jwcFBS(yhfl$#s`!Q0VU& zg$f{AGnG+N2jH3sCZ00?d7;+zWRr%`8!yY}cM~6S$By!HWOo#(4?^$e;y7> zSq=3$l&OK6*+T4>fo=ka-%b3p*ra?}#tOElM9O4uZ&eYiDx9(+<@un^ z_~3()oF4Ce_3wYVJU+8LN8YqR+vh%6kjATf3ZTxkD#)r%8j@ zbf9Gp9d}?OdvIn6bHLQA>%rP-PD3unKO#g9Mh4crjqE((b`z?V%#-B)+)+Q+CRk6B zQ7K>%ez1UbFo?ii{bQH_MMKdChVcWsKL`W~>lgKbH^uKY(xDhG&FA*j+yxmV45lXp zQRrZTXEpF1AyaKyOQbFFYX+9P<*@HotjGujMO2}R${3bTXBz3+E}eR4_8~ICkeus+ z-~&;GmdwHf^O~L~#`9;yPtJ>hawGu}$+a(B+^+H6s6HGr)>sa2ni>2;Z25}L>v7$3 zc=HE=*LngW2KY)5J$nU@y z1fkv^rpMG+7kO3Dc?j>v<%USQ!*#uXCu&%Fkp#F|O+p5&vP`q8nHF~uc!3aZ$ftt_ z&}VwBgc6VOKYodwYl(!Bts35{h5vQ7X;3}EX7eiS2Vq+^(h(KIb)Sw^K~@{oXH0_( z$50%BG31>Kpl0z){Da}OASy-rB993R%rEXxdk=(%XhI_qn z)^F1SHozn6cc2AYL+>!(r1usOgRBoP-n!Ojgl>0TLbtn!U^6;TV8;8W#ar`yGpeE= zU^?YV_MW^_$vY=hA)*xT0ZVIM%W^1bUVTkf^oJlfQX6msI)RS0HnFnxyb9?}(h*Hgr~PkkXlGUU;c(+8Vi zD3&)-Iv{0~B7IbPLnRc+tWdK|x5=J|rGt%q_JwR2Hc?^|tVn4T{6B90$ohc~dhYpzNY(q_q4AJF^e(1k z^clR$C>$+I<7;}`Y>Qn(n<->zDL1U>tSa{~ZR14@!G$y@ay!!I#ATFN0ryRs?{3(k=gYR*;PBpY1!TJwlzEdTuz( zY`PqTyA3|SGUG(wGQ-pRzk}AntcWup8xcQ*V@)3*)easi4DZH-P*t2#(Megb((+yp zj{#U4_K4mIe;-011B27O5s)PhJ_RCyh9GJwaP9R00y2b-Iu(2Rqh1 zNXv+p37JBA19s^3Br07l1pz-+J=CWQib)LQkrVt36yj)1))7H4S@3SE#mc-)g5r63 z_%+ZBPysA6fr4KoQ6RDg?MNl}&GJN}DdJ8>)75cvA|XA!U*$p{GZ1-vTUaQ9Bd);~ zKj0~3GxRQ4J>hci$Q>+j2jQmq7fr;EC@|)@dWJQvAMg~ls0Xs-^mih`( z-UUyRK`OWcq@9WZ2xBLy=VOMvz?8fc(>&4J#8eTkp;g=03e~I%0=LE;{hnZ;@San| zNa^dU`P*WBn2(c-Es@@>(1JiObEs%1d4vZ428@G1EVO1Ct5|jpgg&P<&(pJ)BrN0Fw*p#V#MTtb)1RCYl(3#J(}6J_>2x7fN3hU7kKUh-5F<7u zTSl4hJ-z?jbTnC#8_6UuAH*EPp$9XoECV&j?82V-uW69+3S|mOR129iia_mfj`_GW zF^jdG!&YxrJ-R9HMKCyW93dZ!8Q2!W>Am6<6euaMcOKRKy$BwTHeXBi3AP0)XKs(Ukc(GR}LL%ZfO$-v2z{ z;w~$)^qr>>F0>g!)#KQ!lE5mkr}ujW1fy6|3!q*jUyeCPnX9l82XeV9nJpTtrtR3o zg!YP>r!A398Q6qvJB=Jd>{kNnv0zSfY-?|ea%^)@oT$9|9MEqXz+M$6ZjEwZ6e=f* z&i9ZCX&UF1Ry8(0Fx&wx`J$}Siu0@j6(A;=8iym;S|VMXac$)7M}=!6Z$>Keq>&lY zyYs`*jE*pcTsaQy%Af->Kq7kSt0wiBoaNQo}e4E>T!w2O2 z5oFQccdeCu7D^j<2UK3H>~vb$CkR_KUUj$>d0t9S-1*x^X~NL@Dfp&^ z$^^Ul7%(_=s*!H73OnJ`N)Bp!)A0Yo9P0xlV?|xiGx9?$$6D>zn$B{9leVc|bvnh_ zFw_L7&T_2f1x~AClGq!j2lfO=$^TV!NlBFs&VkuID)o`6|DFF95eWrp`zyFP*qP3o#Nd@Y+dT`DdZ(jz5v}NHqt0{ zWud2~*P5qtrKhWL;P~jX)fYh68sSgVlBoxUcX+)K?E;1LoyooiH)|msE(No-ehHXEHtu2>^n;@#0mfYu zy$ws8*XXz&p$NWRgVc25$sTNlSOQ7QY@=9vn5y9w)Vmm*I|Y&p`fIJAX`)TBg0g9ehrtj}V8Q=|wQk%qwF9hl+oT^Uo4*G>#=1w9 zqZXXM!2yyo5D-bhex#|Z`xUkXdIYGTd*^RuA*#li8WjMYJO7g!uU4R!xfS+rI8TFR zZNJu1u#zAkWdy1S4WyrN2>LBEsg!JzYX!D#5jsMG2`ku8SwXy<9if^J^@#!wVJ zVRsDT+t}u9+(|Ilej^sX8UlRtE{qV?FX8pH;30AJ0x;8?L(#-I{71l9An)OLw#hQw zzL36IVW-3{okXzM@dRS!hmyMo9^V+lQPE5uS$3S1A0S?eW2C+oMoFqzs!+w! zRH}f=T8JY}Y@;_ESukKi9`aJl;3h>oo`lgRtLGza^7{BYa7L^THy8^u@Pt{YIh>M13Sri zy2OEsz7Y{@@=3yQg4v|s^#|mk4#EGO%*^!6%uF>t^iPwq=N()>i_dI4^GSS!y$n;NqWE28hgw&Ypp01E#ZX}* z)-~Yxs;Lg8gulgGAhzd|%M5N}?_7vSc=wTys8zQ9i}1n~J`?H>$w}rh%WK|s$cwY| zdcVLn=COy2>>(|CC>NnO%NuamLv2fcTMly< zGxrifMz9OE-_G4jLW_Xi{LKq$UZL5>v5Zaw2w~-d3Eqz%j$-xU2IeTfI_1e;BETb^ z#sQt;#Jw)>TD}p->@nZ#-c<!Xu!QNV&;4g zX;<8;fyM<1$ZP}HtTcWTxP`2FG3SYh?HC?VZPE+!iwAnDCu0SHZGL!B>EuPr*i*EY-%LJQfV&FM%0EXEz!g}4d7f*k!F{%4qUUhwBE>|w zH2UDu82-Fyy+9h#goiZ%n#}Yt4f`JEDiC@AHUXXl)HwYqy8Jt!E9@k3YR@0(I7vCy z@L244Z5rUk(JZW_h|LAu!)IoZy}XHzzk*HhJauynm*ifbqMrxxlW=(l#1jQ*KS5BC zA-Wt29(MldWg8xtRd)+)LiYkT2l)WtN4RCm5VoPQvECE7Ci>e!9W+sYh%a?{wSbIx zlmYRYu>k7SaigQ1LMz^~MLy8`8Q zYV_Jrk^`#cb(~@#`c*SGg0iAZjB>JBgC6lP{2{rRpYSO|r){LuIow%&N}hkr{#{c* zfI=4sfrw5<)a1-K2t;o}8wQeatYs>ihTWJh?cn z>*wD~#RK$j0)h{Tr!?M&Xx461fcYwbaqvS}TzI`g7Qq3<8`)|p^#7ljNN_fskc*Sx zaAMD2=)5?kbI~ohw!kK6UXXtzlLVa%jFNc=-PJa3fye7@IMm=VLunN3VJr9K<8VAH zr(@xm?N#q*=~Ou1+ooRLk{dFnS>D*BF^%%qc=fB;I~-bq{j{<}O*!|)_d2u!c+3=t zaU8@boZJYAL?8PuR)G^4XhbaNTRnl?GIG;G%eJD3BZevSMITrRkg;4Mb}L|3MKZ}E z70uyD8b)P#P8XsYj+E~TY8FGMfl5SSQQO!5rJc3uD4tlJX%KX;p-1({qU|A8s zB9!9v)ln!Umj0G5#4*Qym5yj7>`)Li!U`i;tpdWg0jgY)QWt;?n6U6j27Zj=E&*Q( zj>%b!JtJ1}l}SD;0WXp)QsCW!$F2cyK`Oip|C{hy{t~<~@~BUNw?GCI4kH=Rbgw6s zt-MALTzkP9$fT3m3Q#6aKCleL*~kWBBR8V~oY0R2AgFLI_ZY$#rV%@FQ}`N;n53J0 zs#tXEGej4NeB}~ploTnp-S6P?CN2_R!iy6?U1bRq4is_1Ge|t)p}QhxfH6_bpn5VPguX-fu1ziRseusU-RFIDidrJOJooaxfM^UxMZ%nOHmU?BFOWtaQD9y6ozMu$1{0 zd>Dx`=@`?+V9xQj_khRI)U0V*&lCwbtqz;cFxxq9d!6C8?>*#NyR9M%sqM6I_`in? zb3Qt}7J!kHKhC^=hTqqiJmJufPaYilcveQ*ul>jATR!E7kM(#F3wGC!r~!9QPbI$lP%xosa|{!9&Y5iYVlZPscR#; z{hPe_&7{RZTeBU*g1HGx584hn@`q2sHj_O$XN7FiOS8yx zl63glD^~FS1vm>p)5&ZHxb0WGFX8pGDPrRcTD|H7LW_fQOdxAP9|Z}nY-IC`+}V2# zA3hM)$g6vSP{oZ8AATL!oX@BD??>s#%C{1P^uV>?u)L)x!EcbE56035zo4thbPU7~ z0`XH)c-%{mV9VQAI_blNDLmlI5`)p4J(t3tj<)8@b&z=5pkpylWM zRbufuNL`fGwukWam|s389}fJNm97*AKC4b5f;vEOfR;29=o~tQ0ALEH(jFlsL&V|6n+d4>&^(0? z9VYd481rx+%!_C9y>pUtqUcONrW;lW)`UBJcrPwVC-jj_ynPK4)&Y+;R#PL^ZILq4 z6R3eCHCT^yTn>#{m_}rh^d}eY5k4qhP(!c60+L^a&Em2GyXrnJhNAew0k=9V4-P;> zp^s$FrH*&?VPJ5PCy2)VSC9%NApQkXabKHMh(w4~{uUB($C>|!k;wm|*unphM9AlU z4H7XO1K$?}0UX;7Fi}h_Dw$LeYdQ5ST)v|~c6{2&`#t;&2}WmcBy%1xAX6l$fV|&v z5?BusxLqNE-%#zVjwDF{uU~}#mQEo6;r5rFE-e^r{O4eErrIm z(uCz$NJi-BrtA1Fa&m$=6}^z0{*I25tceVTugV#>81DgW4NhS3nfLPNbF4QTXaUI{PWly9mZ4Y-j);=mP%S-W(I&JQpqdCW7KPavH^GNSILI zED0+L5TYSGiD$ZfH(kvp0^y7yXnLc=p7fGa-nVpcgstA)Jf)T`%J_k$9q*IAP5>3AG*1 z!d@9E!Mw7?tVBnHDltHiuo8_d%YDO1`V$<@ReEP#}8q zXwJWN!x2*Ttq|mZ8ZT*BPHSaJ$GbZKF!2+FFVXwTLLat)BN{;&)_7$RG;)2wgyTdo zCJOn8Jr=mE_;|nfAYv{XD{B80pHDqhQTro&EG-qaWBB}QYenr!Z$<5Ce5!pFwL9>6 z5}&Vas;E7O&joy1H&@hNq|cU$+N^CAwbSwWe0xRhi};l8sHlAop9ecCYQKd~%T65e zBURMij?Xvo$-?tD;Ij;$d+~|qL<;{q#dl7Kh)z7dbK=ak<2&;C0LUAx&s)58k#8X{ zFG$Fxg-BnHr#wbj*&-1uAX-AOVe!_5I7qEr_U{gzWLt~a)>{gvA zjF$~y4-P8z@fMuRI<*GFNvmZG8(5i=cFDKWZ}kK}3OFqTiH)1Qst_T=4CD}8wvkOi zDDWxg8`Jgx%EtW+@>by(G;u4%da~UjpLGx`0E7&796uEMT0t?iC*vEDqg-Gd zIb-WAIFs6|m&UWb`uNhvzOwOb90Vdicnt zuhj5)raqj+fWk@`e{3EY6j!4v4mASn^%8^v&w?X27;B=>{EiSxd8n)g@7yxVdZ);} zraJLyq;edIgg-hzn>GSv5zY+0A;#b8_(K{-hL^tru#O1* zwY=j~myFExAMxV2h>>Y8Ko`V0RFuAAu;KvASI}rfJPW=s5}-TV8AVTQ`>cKg|b~pZh38t^fphq|;kKHJIZ4!4FVe~>FA=-i?nEwrBdea(Ycp7T zZ8Ot2P9`xluxxI?`!kW!kd4uVHB2i9C5ge%+7LMtbaE?Nu0zWiWtO*E&MvN-Y*oYa zDX>p(3{{Uc@(SCtrZZdSLXhh>{TDHnv39%@1e9x%wkIODaG7LuwhS+>Hf;JV28=UCJ&j;zw+K%x4Zp(Hi5F7R>-_{WJcNwS5I)Gr zF2#A;{q(MHQ}=!>(3tnL4)5%U?L_feh*#TtTkwT^l98f)``}EZHz9*^ZcB$s2IX_# zIIf8wBh%3V?vg(mH<%3yG~QG*02`A`P9Pd#pwo&B#(Nd{DEwL>M+{+W*qgqryH~^1 z8p+1n7kxQ*yV1H{Iz_7wFNUnngZCamC!AjE%tMBEu&0qvyS2O1Hj@IoU?kWhoQ>I0 zH8SU{kz3m5a_4(NT}h`C6LkW(zzYs-vqq@Ky2gl&JR@yLl`|z1^Um?!q4#04;Kk3O zMRe+vN>fqHLLfa(IdU3MM@kVZFK1LAqx zt7sc~+ky$an5pfU-k(WVtIvt8l~DYF07`l9pr%n9=rRu?<6P7nx^F!Y1 zXU(xjevc_4PNirYEhz;k>MqOCmOt<|cp{K!s8!a!x)&5i__w{C#Q%kKlnMW>58}1q zZAQ{#=XL6Ka(%FRvU7Du8qzkaPn!nA7t-Me?MNT~G6`UW8N0pL1)b+;q2T_lZ_;Y% ztb+_SFg$E~8|r097a-h%F1P`@36%U?GH399Lq)I^HV5wTw8JH|I+Z@vrK_!pMoO@?R}lj;9l4A3##>&ROnQ>g@ROE|z07=qWe zWD)-wJYjG1k_t*fEOGPYt3kDKEfEv3d<`5J1Ih*RW#CP(t+$j?mN?ue!F1(3ZS{Dm z>|sTx*u#qaOHjQny5KO^bu#Bm-1$o$cV7*?Z+cUBqrCQK4L-0UeLxGcSG+FRCkr)` z2uyJ>ITl1Hs1+5?Hfl(AVkKJfy%4m$Z12n*rX$)DPmvSAsq-#^@jsi67O$QRW|QTQ zQ1}HvC!`a-?-6vkV!=_oiwd{`N%o=HV}JDs;p%(uY9kb*gUjN5jBhE8Z#F= zclyfly?5F8L>n~7XANGA`eh7Ac5jf|`dq7N>Yy+r^#zO-?;l302g1aY$byRxR`d)9 zoOr<{MoYTIIV9c!kUlIYtoqmRLZ?Cfu4%+;y5U)H9zbBkc6t*icbq>e+!e?ZDW==- zPFIgE$6{OnLy-<5hU~^Wex(kOEv4V-f|Y3{c1P!2-`L0lP{7Mgpo0@?{6Q8l9yKBI zf(KexUshQxN*#D19Gkd(CvL+Cp3>a)iSAnGUh(uf8U!c@XKQRK47vX--uZj}C6nKDStaNsa{mQ0((q-@1hJTQ6a#_9?s6Wo2+6hTau>SL{|Exy2hL8wx*y$oN&!Q@jV8PfP|sVf6M1VsN#y&1IOMsX`_DQ;kEmMA9* zCiIhN6Lo+i4nv)fqZHah=lZiwdZ|pPQ@miNlU^!gJ{Z|S!MOL}++cg?Wiyc-h4?#8 z&W;_$DCuy>RU_-9H>k4Cm+&`Ac8JKwOK`Qz)LEgQR%<=`DMn}>3+*Hb8d;IlrCIJf zAKFQv?59>zt`SK4N!BK=v7h}r_4%`B#owQZzjR`4V`S&!P^{BZ&IptBH@uGqx21{c z?X{%38~GdH2@Y-Jv^@koUL_TLk_w%9Gw~uRq%;Pf+>f6)I>bnq_Rzz8jq#_3Tl>oz zhyEyapJi+Crc=7y$bLdk*55mVtZn1aNu^0Ctd>y%p@5ZueTQ(h48VJd?c8zIQs792 z&mE;>q^DvoF<+Rf7r8bVDK8u~Yi$sI5ZuSA3Lsq`AX zpY~?s#pwPY6MT;df@w2?;6gPT;H?`A*JW&+wo8zkT^oE_Cbu+P4L&W?n(~6w&O9yN zPiFn8f!@}+iyFGMuW{&<)OD7LUyW=pJv%asrbZNL(&Qcy>w07%M$7l+;jgvCU0Mk& z9K?`A;^iHoM`*d>2%2cMh|uK?^UJ|qmJV6=UB?%inkKNeXS)T z0OWfKP{^Y#cVktw zFKU#QJgh?A-(I=_D+q`Bi;{mYuNN@WheBO{b zZJAa)N-xa`tw>{!$PGL~4dA@(httqZrf5c{uoZ#hOpuy)jxbE5biRvd4%uPiJJI~M z?+RrYKI=)!7Zk968zS`B;6>?T+BRbqHn&siKQL5|3vE!~>20QRMgH_U^xvFT!*}l@ zNE{ya2wjm;5FHUSOnBhC=rY<^&K{xP>?r{`-%CG`X~0B*`Q`C&&qFr~f` z+-(CGJ*|L7d2S+mHT|B6GsT)vqK0bqL!c2P@T64uS=`u7W9snGzCt$?z z00!`>4;9nIJuSf7OW>9B9wvUW$Hizc(^ztJ0upqdj@~7x;=ySnf5H@Dxu#M^D!-Kd zGka)$YWPb(A+&^apT**C)9SzRJp!Ul*LEj=zLUD-Pj!kJuGSqUNFIO2V z>d?)*qwYGAtsWa4-x;nu@&*yEzVx*jHjjZ2ry3+Xg;2he{F5xfTUkJvWO&8s^B zYr%o6s&f!v+-ksHGk}CR5cD76DG0r=1dzaW`$HZS^Y5GF{-78-^MW>a(nagtv|RKd zdW%MA_fEQtiQ7*X;atN}9k69#w`t*S#uj&MuH<+Z+%`N714?JLMA|d$*sY9~+fHLk zEl;-`-d+nk76;pxir&X8hjH%K8Pj>nW?BSn`tEzMydY|P{~MkWm-IgRN2flPO69^n%oqNjkng1VpsX6c5n5E*$h~)- zXjGq3k6HO^@ULL;*?!ypdsva?vB2?dpCuozz~?X0F`Szl`Dz5;L~1Z_Us?$Z*LEWM zUzFT;083u;3%liP`{C5CvLh3py6p8)G|PqT8_QwNfm5 z`!rnWq6=9l96-SgQ+yIWT3r&7k?ZlM65R{%e9DlGWG5jeNNhM~0fbzqV>W|6unvTL z1@`6rFpBWYAcMa~RyL%GoR3Iu|LNLtJ3~=3gt9?B-U~VmmBv02ec`fx=K>vgi&sKt zn9?_|gKDJ^`6JH|RS6u>o06ut<1B&T zw*)M8{RLqtFlk><{inq&4xZn2!fTN!cw1kS~4(^`(|{Xal$i*HgN`WJ#vHaO7b zOM7T^FH$nE=^e|V_I30ctmpU8YWxthjZ8Swqv?gf@O-$1VhUSM7-?k4$%^S8Llt)+ zlL8D*m~CM0BgRJllxV$i=y#3NgdM0p?2;`Kz$%NB;a_2x^xm4ELM~eH8ZN(}f~x}! zrhOUQmuR;W%*}m5|KE}@Hy6X)Oxl`!0+l-R^e{Ecp#QHi@+XD)gqZk8 z0N0h%MHr#RuZEH7A1Ox8PQ?fvD42o~_3$})?7dfvo#fX4v$0d-SB(8n(!?}n?A0GZ z&r;9%DPxD#nIwfQxg(s7Lo5xU3*U@X7B+H|{;0aj~l4j)sp?utdutG}!(Cf%wv68dTs%ujz36D>*l8-pSDFY;ZuCiDIjj z?3b(7jw}ER7u|q`%K#{hoYzgN4=MAW_ryMg_h6FOVdIsb5UYDa_2-J(7X(Vr$j_OE zEdA|Y_z2_-F#rLrm=_t;k(o(kDp0NLh*6BOHJfw@dJPz2i-(axj-QW;7q2=E<}n$& zgl+Gm=?a{`g^dLv^JS2wcunME9|_C?!wI}9JQZg+`w+cbv^Pl$Ful~TDR^D3V-pC)L9)zN{ha^9?JJ-wg z5}`lnTVzkYu)QmG7G5Rcpd0H>^JbD^>a$s4+YX+R#^<-6LiRrr0btzRiPB4=WI~Ay zU6t?VefjtbJz@kgi6;&8B;N6>Qf+%*-d~MkieFszmdN%5&Nrg->OB06^ncqs^LVPZ z|Nrk}JSX#1is}@pNEwfLstlDvloA<_@t8?eQZ$iDN}AA!1{o3}NpqC3&_GI}iK0Tu z@3lGZ?cUG#KJMf3`}}_Y{C?Ky*?YbB8uxqcy{)zO+IzQC`0mtna+WRLR=c^orsF?` zU&HhF51sDXvA%nMP7$ ztBtgN zUaS=leTP3mzs(R0_un<+mWrba=;x9vxA1P^O57oi;6HKBnjk?PL<*xqBH}u#!a`YbDH~Zy zNPb9Ri*VlWProIQ5%7ux_zqqJ=!{G5z{q$fSp^MdZ12^N!ZwyS0YMolwcN3nt z@|!3ei+e)_wYX2?c3tG$Apugx3Ctni&)G+bqwNyNz=lu*&nQ@a;J!X*k606sGQ&yGp6KLzyfo3-pk>=@#Kd* zI6|kNxQs0*gl4uTlY?Ybu5xI`EYf5fWvP@8cg&@WflbynB1S1JuvBcAh%umZGxrnc(Td=iyU2AHUq$RC`Fl{0i;b z#+*oA#lp7aw92DqrvZjqw*R-B%$>27D zTA%!JX9hCz)mh28^Pk)=erDKTa^W?rQ6<#A#kfk~$@A5EHRmrVHOXlc%~nxX4fn=7 zS6|QXy*y3kR^H0P2d`EMow-(+Qphojx|7>6w~7CbY$spNj*b5FM9e)`ouBM{Lr>BD z%08p#>v#g6QA+5w$@0RFyLN5M37ndLh38D$^;FgR!j6;odDpA;6GD43Xi1XEf~~~@ z-kTNme5r?6ZV427*Y;j3A0HQImUN>MbK5e)<;%x|Jgg08@OAHA>Q>uZLSOGRWiu^1 z3q;=)md0(|S@g4I@(Y(micckaHrDNCn%DnW<(#|pkyXBS2vKtCl~QrN(V3RT4F?NQvsydpFJ9mGhzzf|#Zp(8<95aQ5 z`AWCb`R~uj_q5I1=1-^9yBDRlIX@EYZ(f^xziIaL#|<^ytEmSMshO;eU07^GIz@h?eQ&cbCFyk4wlsvJn+W~!VUx5re z?+Css!M5W=w8WWN#JHRk-c1V=g}Q4`QFnNLp-lNz&g11^>+-$AgBcabU`>3>y-arJIaf@I zb}vb*^`F6b<+=P|7=IRi1&i|<y_owS2yJ2Y+S_}zy8&@v`@7H4K~qS%gXaO zwVdTV(!Y;)s$Od9wdh%xpZ;R+nylw`Pnz8MS`52&8a1r5N-}S!6gO|K$~EmA%2$&9 za_w4d`PBzXiFwv%PhFPfW>jBIo&{HxHoLm_H?_Icaw}PsIg7=78RG* z#CCKIR5bOz=C{bdurx9&e~)5xN|ki-4lB{}#lkX8)^!2B>-QUVIj?BQnk(L(uhEd7 zES(e+&AmEVYO7=>arD`MV)l^=My7*9Si3ZfHPm8YRG%Vf_wb}_%)!?Zsk`YWx#`Yf znWbl2J3hay?&*+?ZobLPz5VoDmV?9lRFj3XDt-LD1_Rb*`6z33*~!!A(0KWLHKj#+ z7$z;bybgB)Z2~?jF@1W!_sADtDOWxjnjpPPEsb~IkCN00SL0&@!<#c_Xm;i54u$sw zmzs5WZ<4xgq$}UNirXT*dtszY=MF`S@;lNt&nU4H2Mmh^{+Nmc7@jDL*CM8%VH#Cc6R^F{0 zX#J2_G4R#C!6j&Nd$>{> zt8d{3^9syl86i@%$?Ec=TwhA8m*mBpEe~jBhAVePI{oTte|x=r@YlwK>c@I%6_o>w z*yv*3gd^*1N^-QA=^0Csqjkn*CQrXVkWbrLktJ;5(B&w|>NR<2(B!*Yusmdes9g_- zjM2Lr0jwKQMq!Pn4U9uP?TUMD=M!gQVx&qY#To^!DYo-W?g(4Z)WouzVxcJE7|Gy2 zrYJS@g*2frN+cIqD@Uj8bIFRUvCiK={&w#R+up8Q2hz*C9w#+@>n!2T%7~XP@M%^) zCf_B$?PIvlg9~N>b^cNgeRJhaT3Z>-?rFTYH@n(&*i2{kEPd0H%W=9qQ_3SDMoBI$ zb#`Ia?Y92Z=0WYso+ldyJE}^2GNT6Vau4g%Qgb(J#+=WVm7eoif>&L|M1D$em@@C> z)&R4w)jn2?Xp@MrTnE=>4FeTI?X9(y`IY_gF%2&lizZ#-lZn4_FCgvsE~DZY69*Yi zUY6#hTLu!!+XMw?%}=)Q;LNm%EE@=4v8BSreCln@Eo*yal8>hg<~>i6I44Eeys=ZZ z_<7jHrJ>O}{Luu9)^keHE7nK)@ho3 z&&i?{cBhJ-P^~nG4H}e9B+q{h?{bP?eGKR7QWK8n88qJaHW6JQ^HP8ojuuU$_2i8Qb(OX zPAYFXFZng!YvR2x>Y_u*-^I?#<%lGh2Mdea=}O2b{SuGZQ#gKUTf~HyCQCIN=Iqtl zv;V$MQ6HbS?x%$Yd@0kQ=9R@C3HbhYRbbZYDZz(Tp9e|LNDNc3uv!=Nc|wTs z(Z`|dpYMvaxUyvPc&fmrX)aY8PlrT>Cr+8a{y`d7#NdNF8?xt?uy!nr^lcu{^zYm^ z;K$mY@3ZDZm^a6AWlwd@9xv+VOD+ZyzOL@)6`ZYZbUM{HoMpbg=H_;lbGm!H*Gmt2 zMT6Od6B3J-O|@PU9-6TDr)#rC1xSe8BHA<;%XJCS+di#KIr+i4*Xd*1t9c!DJ3n^DGS0uhX7BZ`yHITKZf(ua z6xN|%nLI0o<_J$3kcw#hG5=Ode`uC{pIIl-vpKr_i=19ew}`FD=L1Hx-ct${Uk47x ze}6b+@y*F$eUq)m)keWxKc8y7)_+#=HLy7@HLs<1+SeCvmS{Y0-w<6`A-dSWQdAD+O@($b35+k4Sc_wRic;kzHgyRdSB@Aik2>dLAVi#Q$`CS6Jh`{}!H?tF#)6K8cM z9@9UYbl%48(3f}958jS?d7$rZNov)_$dn{8&0{CR2ae17=O>GChaFyAtbBA+P0tY} z^^DQ=& zi7~Ect+r`PPS_z3^muz(^{dQ7SLqp#xZKb6`<*_&asB(OC8D!0iC*x(IOER63zAzt zr_Xz@dUoB4(9=c+1!r!}?n~=gpnc-p;KozO50##*4!)KDb|TN^(saWsyB=;W;D7co zS0_g(&qZia&I)E+w&(PQVn;KHt32PV3zd&06kU#OE{T3AeeLO5yXzm-l1s_+pXpIj z7L$0B*Ze6vC=G?zpDcdS=>0`C ztmWlOVb@iuwi7J}l+JXBrwR`Q_Fb5NuWUoh#q_%#3#dV%a{iAV25i1~P(o5f@khaF zgOqB?9Wy(sCe7a)eDVVQPWFA%2&(=im9#bY_DJS?=!~l-cI0|#TF&El{BY=1_v&ps z4!zN<*|D8@`K9&?JBz(l2D4PdwhOntdmXlFxj^GbL(l70eJA=9x^JZ(GLu)DZf9Ye z^6H!aqRolauXi`48$OmS`{}!^I#pevKqmgSWKwF{X8D;DO$V=Tq#JSU-`gwvy~8X+ zZR&8>;&mY3cq+O5^Fur8A2J zXBl!|xzm+>`qWN-=}FnowrpsK7U z)bKLyLAJfB&Xv_4*VepQksWDi`gr1pA=We<7n;eAr*At|?rq((C!jv%NyIw*TawH+#{9#ml~4>RC5kB}pVDc73Tr z^5mvN^d7GhGHXQD#g?=%WiBAk9@RRtZrAN*kY z=hL>PNs?WeS{DZ^*NPbPd|JBBb=T)d@p22FcNq1#S%uH*SDTV(^fX7#`udY2?>q1G z=j}dW%;zH5J(1VT{6wkMQQc>ZnK9~z_a|BYnmhM!k&WEX=8hE6K!@F7<6G4p&1Gbs zUlc21+-|^0-x6KCF5%^Cv2XTk23L13O4eWTc^c1F) z^Q5Qsn|xoiz3;8hw~DUYc2|s*ywc4lqioQnKO&ZS|ARQi-ollK)ifZa=NeBH_^RVa zzh~|xy!Nq^QQJw6z#v`Dwwfhe^`^A~+Xl~!%lA>w&ls4Wo6LGveE-RXl72&#M%HWN z7W>fWPXwyY*XXU5Yf`#k)l6vLYp{yCUhO=7+U4H-m3g;hs;(Y9TzKt_&@7I^6i4oz z)I0o5xjB5Dvh(~m?pWn%E^@uqN`3hPzZ^WHxxMD(jA(K7b53MNZ#_7*6n`syhrxUmkkyV_HHe5`t{Xo`WByC}%corS{(VDs;=1ncZ|pw4l>6uC(yo&!U|hU0zIXk$9@OXm{Plo*(t* z%%!=`tF-g29-S&7Lh6f^UM+4pW2D!3u;FygE#JB)y+0Osb$YA$HT}HkvD4(KQ(^T& zF2!I~&dG1ijWc(AA+YhjC3m3iOb(-SrF_D|_xb7DZ9Vg6(EYdN6}i{b9yzzAu5IoY zoZWOkIlDS}`rU?%%d7MBCd|Dou%+Ody-wLx*2Ry7(exwN^R94SdBq=+Q+wpyV^gi; zwPBaIp2 zr%=9ldhwM1`tD-u5XJPUn8;!T`uXs@{Z%iuZdaYcOW~&xb{;PlSN0dR`0pw0>Yq?h zy1*%W&*LXgPIa89NsQENEWc&Z@@08VvB&4LCAJ<0`8+Soav4h+1r(lM8YgAW;9UI8 zh%3UW#i{FNhDXZ^WxqXLCSIlC70!9POWdO;&G4^HTkiRaQOO^6u$a%3b2`WPq7~e7 z^KM_&Db2mcH%sBN-G2K#Z?5u&q4fOfD&;v%DRFC>vnC&PE6@Jm`b93(`_wTG-^6jp zXgrzk1sMiGydK-Q30tv)*B5VnRTv?@Ax9yL|B966{@Oi9-#jiA*!aAwfbUt$wC#1Z z^`Gls&G&qf*EjWPwBMG}@ejWh$*u9v4r`SxFb&&DwQC;|@(yt4(Rm<3;j`b%Od0BP z$?|gc8LAu4sxnR+_iBBEK<%exT+udKoO$Kx9&*mrPUF8X@-khj?-%wgtHyhA(-XVr zhAn*V8jU*LnI&1)&BZCVO>?U@E9DP$Uc2^1`oY!mSnIq*CE3fT&R(r%a6fF|NwjIU zoh{SkaXrsHV(u;H#f1)@QXKOB3I{Ipm1^AN-*du_yG2Toqbr^~|0hZ*8>ui{wkjxE z-*jW$=Gqk2YrN7feY=HG(%pMavDBLK;za{p9kH)_n<_5kTkz*+MJ`Q=R@}2AS-NU* zxu}(OlZ^2C-heviE~EW(vl>=t>>l}cWHl*p9KRvdVi$*4He9_HXM z#9~R;8yU1bv=dA@7$bXfcdEqe^js5qX=a%7=Z@C19X-`=Z#GBEKE0jGba2Qzx6mZ@ zy}wW8taSl{URugNS#){3EZe^fxSLVrDFM>?jt+<_*%erqSd%oIQ;@yu(li9DBVV?60!oM+O%?c*dq(Znv<<*y1mwZ`n7M~Z+ zYz}aW>{5Q)-t+6%VEOgO)d?FbE7J6$V;KWS5_pSqN^I6=q%*a2qLY_QPtF`i%OAKe zoK>;YvCF~2q?aY=+hp)Cq+D=!kDcg(cSbTCH&_8T8pDjD4lx=`_b9gWoFVdWmq^9L z1RBLo^0X^nvmmS^*^brJB%x?Ag`W}WI8#dTm_8x>q9~aVO^a5xj>~e{w?E&y=0)%A z@wd8qZM(|T4}5D%dYr{u(pexKpK(mN*=HLj03P^+f2<2IyU^z#<=<)|Ki9pP(YpCI zZyJXGu1kBE(>Zc`-biJZpH_-V@R*&NCf9a5t8lP6wf{*^rFK=v;D)G7pOVA5c7wU8 zH2w22nw#fH%Vw+dN_?IoZ=%Ah92RUA(0bX*r}}GzNi@UNAvdgIpkY~UYr9ZCCIDVG z#Kd1p5?y>HUWV^@TEM-SVxwK0G7ct_G+DgL5(c+s2?}oWut=UCX_LvhB7C6C+@)g6 z7R}pJlVy6><_V@BKPQp&{EZDE_0vMxuEE9S@S||+#zn0b6D$WJS8ixfJm^v>U9T7) zE2frIynJeLM*>e;Q}x=&o)4zX@{2691iw)0w0YX1j1CzZZzfgN##_XIsgRT&-nO^I z?9Ax|Dfer!@-x3wl)QXj9e<*1u-T=ly-P;Cr1hFWdi77a*k}WTgxtu0YS|*M3W>h? z?It>F2E!trGkx-JN80s%vZiT#H`82KNXyDOA)4A9Yf!10C_5NLp8u3`Zw=0vdOr@6 z($&1QjORQRqLuqqA4w(6%T1E4o@~lltALjfvLdQWVGW*_-M~ z%bg0C+;-n|>dCMvQ=BHxmYT4g@{mZ5+*#pZ^8^W9 zJ8|(}N;2aM_e4yHXj`he)a0es-Z>3A_xJD7=IbjmSold-e|rp{ZkhISJq}AIW9@`h z8pk&It3SQTP?OB0DBE6-Q9AfIPo>W1ovH}sg{;q;eKRumrqAqB{w1fl=Dv)}QuFC) zGdIxN4^N*a+an>r{_-q^tIbnq|8z2$r9UoEF;Kd9PTsnkbHCm@GEd{=#egI6Wr3^S zeh;3qIxFb8>fx}&8Pe;lEEGZ}d=3hIeAGB{*Yow8mt3*fBtRX%vC3sycvQ&g_4B7B zMsTG)*l_2;Agg3I(_oDv%JGTtnpM{&f(RgsqS)VGu72s!oXSK zyt`B94J+o^hI%)*Yp>m>b6)j$=@oC*P(fcLabm&}>#55YCxnJuG`s#>CQYj_w=3Ac zH2K9DlUqlUO?kR685=J9ws5QL4WoxD3k`)<1hz8rhxZ9;_OpL*uJt#zbG$gu zw^dy#>gD&qf>$|JpI!%_X=>Navw!=m$>&X>he}(70C$(%V$Dx&bfFI?Q&xU->UHjz z_o}V)kuntXa!H^z$D>0KN=&X`crPr@3YSe?IAkN zzLZCA?vBxu`)pz>(n~Ws@U=qW)c5#<1K%u$9yYCaaB94&Vf*ywF2QH|ueF*3zm~M* zrN+JZI<5A(#*#M;KKzYOGTpoCyBe=NR?OW}?Q)u{Chd`GU3-9ct?VR++iQOb-#T_+ z=AEbVk#{8x7nR$tth{+p_s5O8ttZPwIu2GWy_E4_@9ork_cz?R&nNP^av^WX!|lEc zs>n=*Ot_R}xX<@z*nWlia}zsfO-wqgf9#N(&H01V-+ejoGU|3}$=$w`$ct6S zG{usR4}_mc&i9u+9L6nnRJnNZk)E1O@w?QOb}w<{-6PPtc5hXjS8UYr4{`IqKikE% zXzR{9GWpR*+;(nVC3rn*N_P8}=TB>55-V-CS)Fy=F+oy$`{N*i%vaTE8T6}%&bf0v zI)B=)KkNPajhAMNF1hG`LG;4KJ2TQhZ;?E!`hMQ&&=u>>6c`w#_07I@LVH2asf~l@ zPL>`zo_{O2`ZCYNw^t0)OAEF>+?D(A8GoKoj!w=ZA(!kp=8EEm>7G|5%p41?zws0$ z98)f7j=g+M`epQWyR}bClhrus1~vQ*Iv3cU;<$Alk0_Fyc=JETQ-#4 z^SGOSF*Jy};Nc^Gxq}xs2Ple2N*J6j__0H>I%QH-$IO$#d*^50pQg*jj8}&N7%M>W2 zCQ06&DZe@G>Y(XF4kP+T;oiObGt4@^9~EDvCzD~YN_q0WE4xm7uM=Na<$d8nhEVBd z-d3KQPBClK0&3f(ClvH%7OpmzXwj`Hf4j{qGV0}qig|)J!_0gt1cXio=Xl)u6(K?C0I0b=@o9nS*NqR?nv|RJhkOn_9QKjhRq7K>k|_F zruOQ{edmlmvd=wXp25!9iK{+dUg%`Q-^Z&wWobss+0Rv1f9-GiU^2IGm(9@$9v@}~ za0GUn72h|X*ZizMO3Bsu?Ft`*v}1MAcl&QJJST+53I(+}XjIs@T4pV?88ZCVkvtARsGrpw%?%UYoGPKX4ra~ z`{(u>6Bf;$cj@c0#VXU+^~9!#Bqb}9uBRVrn!LXE{*p4Ythu#=lrnE4_cPy<)=FE* zYlS=$l&D1V_eLvx~t zNz|EjGL3iKL!BZh!a-G8za9kNKWcmW^YkvsB-6o*TA9WoYb)0+{lxR=^Dfut3+3Y7 z`iwgI=Y?AtB~DSZmdkni{>YQ-dHr`f`HWBOp4ctua>Cq;SNEt@Y0ON`R8tjKvA{U@nM;axsOC*7oF!cXg4m7-a>!g;QG|Pu^MPh=p3ihQraQ|y zgh^MPt1?%EzQ8{qJjlz#GlZ_JrKPT@qNJ=sU(9s&Q)Kyv2GC8Ny;!Vpy0f1feW`Ph z58cR(#SEeozq@KBb2~0PNDYbfGt5fAF$2Dhpr*2dxm2AM6I^(EE@cPt#JD15uQJ3gyedkM12+1>v_)KHfV* zbpg|%pN7P05b9PiA9@?o!+=yffX|!J4xs!6@Z;UmRBh<>C?9W}qk02*=$9c$d&Yvr z(0h>{FDIt11mg)q?1~t#D*WpJ1L2h@A8**Ax&t}r7a&P{ZwDsOKOjBcbVpqara(W2 z@?GJN1p3gQqkOywnd%4TLN9^D8?vZ-z%uAR+3k;4tWZU;|IzIB4}`9a@N(o&*4G(K zgMJc{0=57n=&uk?)@L=qH&|%<+3g<=T?=|GyZybO&xW20N!E84SOonG(v$6phqb5@ zgfNwZGSdE`(A5$CfZhIhEev%A^mCA;y|w{k=|6u572ihHW`;#`6fqoW}j2{gaKyOESvi;Wp z*qN5ZZvPF?b)Y|Cx4#c`9M`lfkmT_c2bMtphViscf^rH{ELvJy|)7s=pT`uZ2z@j3iRXb_K$?F5B&wZ{r#ZNg?9Hy4?nQ=D6w zOs^!$EkLH{AJ2VbBt0QQh?18Sf|sD-190Qe@8Lrqh@apj1hDc_5Raat#{Y7i8tbQw z^;3SoPMyR7_4{>dte^7N>(p33<*(zEv3|;5$0=j|l(BxwSU=@|r=LRi^82@Wp}$N4 zaiXuojeZX=dO$Sve)!Pq5kj9xjF>=35mN~nLV-{vbch9nHQ`DG6Vb#e;wJH$oYNV0 zQ47;++i;_ROUG4c~8mJt|1p?AfBo)%dLvi~K3loN?*gfd}7I1^il z8w7>2g@Q>VP6`)=heDq|2fcCB|4%TQz~1}`x~SNi<MiFb7-!EbswHgJZxRJO{d<1Z)I90SDL$=7VxD9h?L%;1xiL#D1_G z)B+Wd3xdEGFb>3m#oz&u2j_q{cn2ndBft(k1=`>$hyVkC2W$r>;0}-jXMsCt2jf8! zSP7m02Dk#&fp0(%>;cQbBQO_a0YC5wOaUoiEocV%pcF)cUw{I(03&b%Oamu?GiU`O zAOTo`8lVhvKp^-GXkZsu1nz^`AQO0jPB0N12CG36&;msu9P|Tjunic4+h7Jb1DN0q zkN^k43h)@HgM1JQz5)Rd50-+5KoML7zThL642}Z_@B-+8YhV)?1Y+0&F$#@HgiM6A zhO~yPgRFy8g;a&igUo{rh75-6f$V|ggXDvZgN%b*0=WdT090a5|-Jmh&uA4ng_ z_mJ-)r68psk3t@WTm!iV@)_haNF7KW$YRK1$PJJiAb&vqfF!SCypTH}cR-p#nnK=% zybC!KawcRtWICh=qzB|%$hVLaASXZ`f;~UdX+W7LXQ@RghJX^C0IzUV^*?=@01-*#+4JITdm$WGZATq$8vwWD8^qqyeM> zX>L6TPnLqG>kKp0p8B@h6}akd$l1w4TySOqk}dcXx10$Jb&#DNV^ z10jGDIYfg6;3kj(r+_PX4ah64@bFR0jl8*s|FVcf@&jqW0Ym{g&YuK$z<3}CrT_{M z0W>fXkUt3^044)YAO`q=6yOCD072p4-{r2k7d`M-3-?a$4FcBj$CjpO4Z zo0DuZvRO#e3bUOE+ljKB7~7F{``wW?{N0V(b5xGnbyWV%y#Jy8&D{T?{)_o1{hRr5 z;tltcM*9b3zlH3xko}d>ehS$)A^Rhk0meB>;M~UZ&;T>%xLy#rCJ?wz5V#f)xQ5^Z zFTe=|fGCg#%D_wTyCeHfzn4pvNnQ!avdD7CGU$NJ+YmT`C{PB-N=N-~WUvpfO^X3( zU_I~z_P`8i0y-eW?0=Dkj5z)w)T@jjY<}BjiESelVMqE+{GWWL+?e9X3T85WyclYP zFo$E9e*n{uAU<=1xdw;$`?}zU(^?MqASRO_5;%OFSuB57g2?3v4hZt{3vnk(ID$ih zm_b4QK?HG+aD>m#pCAr$_%eN6J+ZBo;l*^9l)J z2KnOezN537cW7{kqr00IZZSF#3%!D!U06&T&mg9=o4J=ukaJM@0+b$1EHPfb%-CF2 zWh9p!6vyETCsQ2BnE31O=*sdBMr|ixUxK_s;QLQE`uu!01}kI}o3kl|&B;$$rbtpg2=|fQ%xs`?y2xA;MkK#Jltxi#`f$f&@t^#hm3;k z#(`{!Y4~jTvk~7Ac?2v(95WnyhR7S!{7P#OACesW1Ymm_=*H~}x+OvE1JzbYhi%oS z2uGTi3y>$`3L}p2Dr^VBi*d+c8#)&R-5Bw3`zH;4Ly(O;x{*H}ty^u6GJOya(sCF4 z+YxsMwxeD4`9j7bJ|rEwB}hZuY{W@J96I8sA>8sJ{8=aypd(9Mh0V%AEocKD!FRyT zNg?>aL@*mD1AVX*1930~%mT_l3m5=XU;$Qw zwSWoyKsbm3yTE>M6r2Q^AR82cGH@R}2G7A8@CkeazrZ-$kHGx{LLM-H5m*kKfG-FK z+d(2Y0dm1zPzTz;S3vMk2worw$P3Kq2>16)K}7+cK4HBA{~AXW5_)G-#(z_n8gV;UWd ztMo9oFu?WB2xF-QINXderZGj|YZ1mqONa=Tmy7c7$>mHg22oWZ*wWDzmjf?9=HGQ( zHxLpK#0(Dp!=v(tZ@z!1pBv#C4YxjwEDnBv-MF1{fnh_U1*n zfT%eBuKl4{ItMxX29E|=GX31V{5<|pgS>p1qsnq-Ff-&Y$`U3sV042uGi0HcYlxS> zAFe>ZZ8XExh8Z-v!6p=T@nD8HVy7HK$SW7&5#bW*?v5xP5w0wzGkK95_L3JTaucNE zA6p#5u+7aYi0K+adWJ7)9uZ7`cW5J5SC0sHR%oy%bQI&t7LFq_7{cG(o!pI459|pq zc_|+ef9S&{v9HG-5dopYc|nkQ3|~P>5#|LOdqj|b7T97qJqidIF{?*J2oo3a5iuMV z>c_6v$VHbu*+j7Ad}mjm-~D78{uV^GqvPm?;kIT6{ua-a8N#+XJB;1!kcsNWx_ zM1=A1Uq|w^T7c8Ui^ViyIeP>TpJywXLBTk(a4i^fV-^^*z?cQbEHGw)F$;`YV9Wyl zuUcSqeY>u^oAwMheL|Z~5dNVdbbog`CQbY?$RLOyW?(2YIE3j&XEFUeLOkhi{>)&y zpMMD5-7AFd<%fSEqaj3Prf=Md+S z=tz%I%lZI}Ij|iAB(e(b=%4;kpCEsKUwVi?Jpcm_x~nI;{)ieB{Ga8HK63E)a=rZ4 zIkUV_s8?`^v!5#ynfcS*orCBun3~P0`<7(FK!Yt0p$?qnS z`-W+-;ccWpgS|}*eqKQCi*JB)h!+OU^mTs@h(<=we;lfa7mV?=m#Y`kFJ$yg`TbyK zAA2LCW#mg9$)l-9!!YV3{Fvlf@aK>oQODev1;#8eW`Qvaj9FmJ0%H~!v%r`I#w;*q zf&U8@z(elH6-xx7{+jv7Is~QvVLOeBz`a@Aqo-4dIh=n@MQU?6)$spHtcP^O|HfGV zYK=R&7FcKM2)PXRcJVwN+%>K)tS%w%Ig|IEdH;|G!=WSVlF79)zq{SoKtX;XSVilF zm8u@d%?m4bnaJ4>D_^nHgYX=VqlEj+O1Q&JN@GA^jouWb9gV*bX>faZIG+II=Y_N* z_q`&JpBGl~(viX$Ah@;CR7wwQ|?m=?Gys1^P^3i0g>0w)Sq zgpx;xAM$7YRwe=n8dn<`Va$zLV9Wwz78tX@m<7fxFlK=<3yfJ{%mQN;_`hcX4EV{h zXX#xsH>_kRku-RscJbhVjk zI%?f&J?i6-o0irAt&3VUTF*W>pargt9wGXOt(o_THjPZTz`jthJKO$4Sn+A z9dazUTzQ*HoNBG=L^X!GHTHhLda-(w`djtYjBrK{gHJWX6ek)(b6&1d8;d>C$E>Hzr~=#;JX32C}f3eW zbr0#D*G1<0M%u1k<%5aAlx9vAi?0ULAt>OgB*h^1~&{I88jMvH0U=NG9a=?o~xRsq^h)6 z>4H*`(j6t@uMMOYQem>aXem<7fxFlK=<3yfJ{%mQN;7_-2b1;#A!|G5R0 m%~w_;O+dbLfC9Nd+kPQ)ojv(HsN(Rm0K;D8xdCo2#Qy@i91;cq literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/COPYING b/libs/NSIS/NSIS-source/COPYING new file mode 100644 index 0000000000..2eb41cc7da --- /dev/null +++ b/libs/NSIS/NSIS-source/COPYING @@ -0,0 +1,144 @@ +COPYRIGHT +--------- + +Copyright (C) 1999-2026 Contributors + +More detailed copyright information can be found in the individual source code files. + +APPLICABLE LICENSES +------------------- + +* All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license. + +* The zlib compression module for NSIS is licensed under the zlib/libpng license. + +* The bzip2 compression module for NSIS is licensed under the bzip2 license. + +* The LZMA compression module for NSIS is licensed under the Common Public License version 1.0. + +ZLIB/LIBPNG LICENSE +------------------- + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +BZIP2 LICENSE +------------- + +This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2000 Julian R Seward. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + + 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Julian Seward, Cambridge, UK. + +jseward@acm.org + +COMMON PUBLIC LICENSE VERSION 1.0 +--------------------------------- + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. + +SPECIAL EXCEPTION FOR LZMA COMPRESSION MODULE +--------------------------------------------- + +Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0. diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/big.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/big.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d6db07793905996d858436e0ecbdb9c84ffbc41e GIT binary patch literal 886 zcmah{yAi`63{@_SYWN4n8{>{~p&L9b?dxLe8zQ{aGz##T(l87_*_h%>(vu>X^|Zn7^vPBw{W0;wfp3+c=|jB}U8uKPeW+7O9|B`9^)Ls&{a;jHmFfqvog(!aeMk5Hp-;#ZXF*~MOa7E6WGf4ANzXuODpybk`v{y5o8)#M zjudS`yuu&w3;aMQL|EQWFZ*bTFv!{jh?vr{EI`@V;-GDl861x+A%tk&Cv3+#Q=S~n zv@p}X$GI@m!neNfBy%+i&vI^We8!?*_-KhFk3(Q!;X7v68?8^>n)vADi$9IvYyFjw z0ey6C_WaSg>6d;WN_{X3mU`GZ^r7|Zd|iLN9<5*RSL@gBQ|rr$+)u_&zwx^j{XhSQ PqVJ*^-@rLr&TGO8nLgM; literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/classic.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/classic.bmp new file mode 100644 index 0000000000000000000000000000000000000000..83e3cf565385105ac3e973e146aff90548f9cf37 GIT binary patch literal 886 zcma))K@Ni;5JjhHldep9jGm+W-l0e6%5g*DPBz}jBe;VNXR&_oaN8$anM?`VIX=7i2`5k1y-o5}{GsMnT4qhGBrp#H5X;Nk-^+~C?@ jKe*hVn;-sqUb(pqzrLS8{|9kFcyBdKN&6IWSvh|Iu!-To literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/colorful.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/colorful.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7713942e0262a1d4646ed1a3ac4a1dc2902b2a01 GIT binary patch literal 2512 zcmc(f4Nz277=~Xo?2@5oW`vngMi%rVm8E4{5E+&zMt~#;h=gK z9fbb#A?TNdV4!9P`fDSh?2HZW7bn3d(Cl#U2hPV>n1+bdeXSi>gFJlqVXYF4Y)yVgYIn3!rE#MSn*H z`r0cnsF35>b`IIwIAjsxP!0vry7YgQ7@^*!25~qL$YGx!hqz4~_V{v$S}g_#+{ z!i5ah)(kc_40d)54h{^B->b#o+DD;N!#K>&vitGebZCLtr37 zP!PkRLp--oR>n|L@*65E8IAuybu~kMJ;S9-43{r6G&K#QwUwd0onc^L1cQSNN+s<_ z#xOiQjG>_+IyZ>EzCI`v3UqaKp|i6S9UUDsryXr=Z8X0XEiEl*Zf=HLE=NN{17tE8 zii?XOl}b@mR0N4cg2KW=6ciL7FE0uAi=#K*bBdpDH1pND^WGPHY;9v_&(~Eob(P1fMg#cz ze*b#!HCy6>*E;h7_gwrN{{u#|-g5HKR4+mE#Z;{7FLUve#-mGPJN#)Jd{)2D8G75oqy~0{i(uK3UFDuN)!JhPc0S- z{|w-Lr;emkJsP0Szhi$IT^|k5#6Q(gxY&?Z@S(-Ki+G<@EKEPFTES(xI)7BMFfB#3 z0xuU${7)D@GeeJW(FbM=d7tEPdX|K5(Xoaf)cLDh7$ z$dFx9=ij?;Z&*kG1svS8Tob?kv?&uG*3o|c#kb!u<$Wjer6p&|&Xs0oR$Wx*-?b+) zJT%BZEdId8&ouGBpf~kVReGncDsH<*uF46tLAlV4b@C^RM4$_rDMS`u_MY#2Xh!Q&zvFfaSLe*@IG=myG7z{fGhDT z_Zr|zocs-Mj?V9S=R+0Xy&+MLmV~U+q~N5ts#e|6U#cPM&G@hH8tCZ?Wd4IlMgLLN znbC3e6oZP6GBk#N0%kRCb%AN z^1unM$Hm`Brgx#`#z#~@2u4Ws%b@JBf_c%8Zw%e9Kj94|kGa-cD|&GScK$>|)|<-T zS`;|)Ur6&Fiq4jWVe literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/modern.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/modern.bmp new file mode 100644 index 0000000000000000000000000000000000000000..62468dedc173ab5383a74a75def0d54c10d21ca0 GIT binary patch literal 1652 zcmb`HL2`pI3`K<@gyMMGD`eLL^aS1a4n0Gs2go8<=`nhREW2dOk|j&}C7Fl-PG;JO zu?HdZ{Auj3Ipj{(==K(znb)A#8_P218>(@@v< z)OH;W!$3XmJKVRZHK-krN4z6_=**9sNb;iy*DnM9 zy$J{(sdFkY@^J*RixeMqX&CBD|Ah$%-*16efykE=W`P7>>MXG8e`f;9_s+!~ocTd_ zkmOgogH``K6A*sk-Pod$&(^s`DLz~07Onc9ikp2SOO*-BH literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red-round.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red-round.bmp new file mode 100644 index 0000000000000000000000000000000000000000..31d3c025288ec03ec3c376509a0c26b8774c220c GIT binary patch literal 886 zcma))F;c`Z3`NC2n;E)5k)CtVa|e#VHfuM`geq<_1LYRnB}dq;;uJbd_>ycACp!b$ zSU+pOe9KXuUyiq=aYTN?c*VHKxS=~_L|V5$>)aCIqP8_b#w`uQ0F{MVFPdk$!@y6b zkXR!|)4y|{5%?gOw;D8&Q=@$6u(skKLJi)qmH*{rd~_v$2+HsLr|$^`5smL7 z3R?Vq=TXq!pV@fklE-0%-}$3J6eOKs6twuuVe6~@vVrp0py08=Rew%AZ+HiO_kLtz tYSf>{zVLUxUi>QowZG6$=`-SO-Cu2+%p(5({qz<%p@h8oQuBA2^al$U!w3KX literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/red.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e14e6b4a0baf3a1949ff1114462df72e66034221 GIT binary patch literal 886 zcmah_v2ny85X55_;4)l?^Y6h`{6WBsGLbM2H3aHKUBCxdi@e7POY-BcsV>t=Kgtg@dD-)DPNIYPNsllH^z84M-CXrd{&+t`XwdUV1J!3b z>(QX=&u)@D%;>-0KLXjY>(9LD`H!B)-5KSo literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round.bmp new file mode 100644 index 0000000000000000000000000000000000000000..695023224c652dca377cff35aff9c68be0ddb226 GIT binary patch literal 1616 zcmc(fZ4QDk42Ji?jK7S>@EFGb8js*nINA~qhJ9P8V{BxoiLV)0+CE)7^m4uL4C_YM z6RiiWBQ0z8bT!72|9OywP^^JI=ScTqFfm5c_dPxRi-JnZs~JACvnGO5F)&z_*j^>J zhP$G_j(12%@YcdsI(>ot#!GzW&+yB5?A|%)Vd6U{lp4S5)ZfC#7P-L4hs}Trzavfl z20n07K=@(`s2b YV$bli0!4rRf|_st&+`05f!{uO0To;qwg3PC literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round2.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple-round2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ee1ec8427efb946b350e9ed7fe30d683ac07ccbc GIT binary patch literal 1844 zcmchXKXVd67{;GFz$1k*5)sr$luIr|4IBvyB=KLgwb3$-g(=hzpq0a)Mn^w@6RG21 zC#@-9tZ1lcC~^e_UjyHF_p(D^XU@X$fp>S`d-i_s-tEHPvw{VoO#{f#=q1Ghg@Guw zfO!u1Jul-Scki20Y|WWHdsj(?Pr4#@HawqzH}Sop?At{)O+uk9gDug@MNu zdmWQ{lll;zhzR3pCxZR1jn};*-iRpSZLf?E{pS=f@MZ7{p9crjAK=h?hr<&J?>&x) zeKh=ppQEp6Q8a%v@vYIoXf(obIE3eU7z_sJ_xtGedgyk$Xti2sHk)YByn4NkTCIj^ zwTeomf=DESa5#)mC-P@;Z=AT{evEW+fhF@f zC6Uj}SN5D=@JxY;>7u}Hd~xy8M1kFCG^z*$n3+H2pMg^{J%1;0IUWb(6A*8Q?x&+H zOKAAQFO`%Z#NSRP6a21X{tMa`c)x&#&wjDw7a)IH)9beq0#Cm}xd9fhp2aKF@X2R< zx$OIa{A5z{kVwRscghFtgPwn{C?x$r{?%*1(h}FWeua7YJitNirjDP_-@Q#i5`G|m zIfWF7c*`l~xh`B1<*uvayY4Oa3x$I41Nmvv&Gd~lkWMo%=L^W?bo^6)YfJcne0ycp zCav1AZRTaqXQhzM>iEi^7k(h$S#z8yaXA7u5ENQ7!+)huR^mqPDfq!`c_yYxBqlW+h literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Checks/simple.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c687a1d92731dbbbbab08a06a4ff0f73607c2f82 GIT binary patch literal 1616 zcmd6nVGe>Y428Q5jK7S>@EFGb8js*nINA~qhVQL{V=&wj5`Cm2rSP>~7cSTPPJ(V& zPp}8<2s5(BDq<0T9@O|Mt;cotxc9wy@1^THJpF;%i9{xDTkoeWv^ElXCK7!YiGK9D zU5Nh$-&$>AsLxt$B3FOYjPa8CxdkD?n@>LgGW-S_;st!-G=cKfCt#URye2?A)ofnI zD32Y)e0H$LX9uNx&GF$o$DDb-bJ{^6pL-A9$miCq@fi<0RK^dZMS_9P&zT@szs5O% o8oo*R?hD`5^2hmVeOyuB>^yv;mGy7LpZw5J-$eC(dj2=}U+a7rssI20 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis-r.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis-r.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eb3650f7d3901e6d8b969afc6b3647433d773e58 GIT binary patch literal 9744 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 I6;%N1{~MpyNdN!< literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cbb52312f16e431e9b0c634948e3e59dda14d1eb GIT binary patch literal 9744 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-branding-r.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-branding-r.bmp new file mode 100644 index 0000000000000000000000000000000000000000..795f5db122f383193a06a4cd49582f916585a327 GIT binary patch literal 25820 zcmeI)O-~a+7zgnBEj)Vk(#Apl>Um`?} zfkc#pN}}RHV>CviCMFs$=s!IAWZc~uy0Np{hNqcs)^4rM{Q7@pX18_sp4E!T`fVq+ z+i}n0z6CC)p6$=emGoILEUF%f{f}YK{$qHN z^KC=GF|@(zKi49}&;lR?JPmUVUF2g(X5WG4*DI@cr)NhSyT5(@s+$)r&n=|(HPP#c zVSt9SW0zJImJN&qNNxs36%dSK7_1?Dbc`yXff0biN0QmY9UNvc4BXI@(GBRyNPu5H ze42>&i=iDl?pM$85Ve$K9E>_Z2O|UGaWS+E2+0i%RmO{{5j@|}a1t$3+lCT~1QM(m zmWCnbp97U~OmXs^!{#%qBMn_(WI)NGeZWF;2*7k@e06yRQ=D{F;@zt^6fpNzEunl= za%i8?TuT{{Obm10PHQ`d%q>0seM!UtC) zuw29$9Ya%3mO@et12hB+mIyjV0A}jjao%mZcYNvAeO-HaEE-in{Bz@nrkVSP+ZdmstJQZa54QWv^xt3Dz2D24I zG2D#*fr(+%8jJQ=t)HGRK3M(F^?mj2$#;Z{8d0@t1KSrvF_bbJeh)|vC5PdE3IiK< eO7fpNQi7vL=i;=Mo@wF!-1c}+?nzG=BT$TUpe)w6yIf><; zU9{dok4}2*rpK1VHd-eVDSCbTPW4!>pjG|BA}m=Q0T^cgAq>OpH$1Q>tA`PEo+5xe z%>F!tAq;U%oB0Ufe26^E{85O@8u$6It04I}b$5f8>(%Wrkw(C6I8=LOX~Tb>-+3tg z4ba|wK7?Vm932tz@In7b_nDe?T~f(TmGa2LfCDFj;b`kXz>Yt@(+ zxVX2tf&4wo)uKAp7Z~a$(z4L7BfqNsWaX-FGIeiaes+#peti4hbzSssZoVnE42G)) zbJYey!~TlqFCRYn83|Cic^Gv->Lc=SRVYsbxgq&@7#YyRNPsQJDrltTe!-AK5l{#+ zbTJx$Rz?L#DSE$mnEMMu4n;sA)G(dV3TQAgAl1V#fXli`3`3oKr@?L5nkWM^|; z1r4E;feIFeR*-F=A-4;N-z0mRtKxvFXxmnAo4K4%C$)hLj_1fC|%-o zoT{FioK*>yzSf6OeieD>GLhEr-|E_e=S%f@8oIYo2n?v6dKeX;K8mVMVCagxv_2>g z4L}bgXCN0;V_L&dYUOG#H?#s;84Wk%DGXgE(t4p`XF-xKVm!AIJg6FC3R$m&q14LN zUT8?WAx8ft=x{?1O?bEDt=vZN_(=t3grUnsS}!-G$*fjF@Ya zTDjT_4ZF|Q_LVn|58O6b_$j3seHzhITu*7{S!gGEk1*G!M?+c`8q&SRuZ5p3Mm0`$ z6<(wU)8kJ)%V1TT-cuOr(U6wqhLmzvMn2IkeEUIDZ=UO(*(Z}-g~?P+7k3th9EyNK zkYPF_1FAvQ!>9o11_jqN0bJHiLJf6B1JJ|BfYb(tR*-0_GE-xF8ln5RwDgy`3x6t1gzMg*hX6BV^8ENWM?`&MD!q5s5P#I*%L+Ib%e{R-wk97|%E-vah z#$_5p>kpmde(8)b3DNt9=0C8kp5||mC*{QGs2J& zVitskuE}hJ(F4egFpNpZn@bE`fX1LY^XP?s4&=8o3i=<5W3J5zj_9exurarcg6&y4 zPFIWGoEyWCLlIDr7zXS<;wCVR7$|GA2!>N*6Q1v%t;tLDHB~hr<2$5QC4XfEL%!MD zfC3EtT-H}%xS9VyP1}jeH5n&GJLxT1`9hoZm_ucH1l)O;-WE0gX9Sj({?C4)SJ5MY sJlxFZ!|2BWT4pu^$V22I{%>ODBjEo0Ftg(W-aUE*FqUqHu{4qR2YH?%kpKVy literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey-right.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey-right.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4b935c77e494dc1c84998f098c61bf142c6dd2fd GIT binary patch literal 8932 zcmeI$y-(Xf7zXesEi{zkw$Ku2p?pKkmkF^tbnV{%2^67(k3@hVLV!pjF|Z&Zu`ni3xfizOz)ol!ez){Yp+Oo8iZE@7+cB^H;SGq8dYh$?mf3`oXRc z8pQM8y+Ds8ukY*$zwYktaC>`;o0}V4UtgnEtKsVE3e{>AmzS5QR4TZ*xWM`OInK_` zaC&-*lamva%Vm^GB^)0gqgX8B=;#QChle;gIKck?KKAzZu)Dj9ot+(QZ*QYeC?KED zBbUozYikReo156!*ueVwI@Z?Kkj-YXy1I&$l@%;6FJozG35$!1$Ye4|r_)$iSit=J zJm%)+FgrVoR4RpJGKra)86*-3Oixc^YHCXSpSCXx@FmL*T+bVqAg>^==OysGzy9C* ztLyVWm8nvFsk~am-ty!}N8pkPu)MxSpQu)VBCn_#qsPA6ed3DS-R-)@ZJW>)jk{sR z!k-3TtC?W1=Y+0ElZM5@fQE4vsS66mSsG@T!_+PZCRq;5Fzb5BT>_?90>)VIfs4bw zw&*fP8Os;0@I<`R-7SYW%MY%w)zDHVXWm10i$*~ zEC78^>zk}zVI-Rn-oftYN00i$;H=yj{5U$HoBgm%5}8f{YJXxN<* zU3_~a-M8x%%ovG%d9Uij7_|!yjJ3R;nh3RZ4-w}D2@^9>!5Hfmao5-den)5HYWO;v5oELhFeeU%vaCxP3|6P#R{Y<=`1bKO-bN`)x^8)?=iTGgG literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-grey.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dbd7028735b671a0a15d32bc2d0b32ee0628ac1d GIT binary patch literal 8956 zcmeI0yH6W29LK+uLa(%?rL=`o3L!KQNJ2sal%res{!bv@;UQj%K)e|c3lb6xY#_ma zU}Heg0Tvb(1|%jbsO|Il0uj)h6x)^fNq1*m&hf|J-@|wQ`Rk7t%)D8EpR^L>Fv*bx zgWdmK0eI@H;|IAzkDHqtTwh<~>go!YmzTJ>xWM`OInK_`aC&-*lamu1A0OlB=m>|0 zhd4Mm!2bR|_V)I$ySs~>ogHj%Z)0m~3!9sp*x1;>`uaN7*4D7Px{8&R6)Z0=V`*s# zi;Ig`SXjXP{5I1-5j#>U1lIy#Dxkr50J z4`XO(2!n%z7#J8pe}6yv`uY%$$I;u{i=Lhyba!{7tE&s0ot^0D=sUdD)sU~ zfDtSKW<>p}xoj|o#lehdUa@j63yfniFoFdQxF}dnp|FY=!P0^&C)iN!td^DE36>6A zIl+S5@EcJes9HL35iCG}8BtBR7?uDdAy1=TyUel!~W#lotnzvaE> zq;UDNZ7?Gmta>M`QZ*Mi7zwH8H6jP{gXN0#f(6DhQGn$Ka}>wDk3<(y?4?!YIT*o` zTqnYJ>lfuhw!euN2nI&6By-*Rex!AkaWN-aX-U8smSnD$FwHY+yxvnTqcL12tlEqb zwPfp+S|@06|5p3@m2F>4lVzpyxF=40_VqK_y=RtBwWMHjxl-ec#g+hLSPV=qSE!ll zL5;^(y;UGM7{{Vua=B9C%U-G(n7|@nYPoDIfPlTVl(f$DGhE%e-Q?^v)g@C|ZFO9! zEXj8ialIFNO7}F1)a-xplJ($4(thEse0&gy|0s#esjHEDe0S$|b#lCAuI=cRxiQ@Q sv!j=r-kIy8t6t9gYUbwd=AU)-V=UliHkt1es?YowZbs16kM#|}UrkvsN&o-= literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-metro-right.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-metro-right.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0871426abd58098282793a055690034fdcfaf4c1 GIT binary patch literal 25820 zcmeI*PizcP90%}iBqSUZMN=g8FR2J25i}9;=i)+~xj5kLSOnYus!A&ql{iR~3wF`d_4NL_=zQcc1>u&c63{U(M|7Howj6WI8k1-Mr6y-@Nx`cDrSJ zWN#q(Sc`cDp6z&6;#m|Z#XJzWhVA7m#WT4Av+gRM3cCc@u<#FIHe|!Xu7xJXd8CLD z3cdumF6Fwk;1A*nP@QrPIftA>|4V>#Xr9AZ`}&Xf4&-Y=|_KdpfS@bLi@ULx#}v`grNTvXc#6)e~a> zWq4>3UL3ZC>(guwT_K z`u6mE_rW4I^hQsVtJLt_jXi_UuWA?tpm5VL+5z!)oI`IURfh0UG1>t&i~tNbE(kZ2 zQHhY34>_iy1A%Akw5`!YS^}eJ{m7%SpwM@qWu{PPDc}`_u@wV$ZF)o zA}|u*IC9A2rRL|%jD`TTg2ltH?jnt$>X|?Ko{4~^&+SzxZ8gmy8@g>sfWkz>2tcc* z#HyV$^5F#mVu20KO|q;)X*W#{9e^4}N?<}Vm5~koGn4{K83|BqbuhA_Pli3ME5tca zu%yqaQgr~PGqRyihNx-ZoLQ}Jf<{j*3mu(i??%|EDUEFCqv6>#ntmWQ^_*Vr=tkHL zu`C$F^`&&~<*_zzJf&@#SbL>aSBeVL!9st+2UjD|UBu|PX0i{KLXr)0Xb2W`5mbzc zb6|ZL#@+fZZ~OYBRW*Hi++x+vrVz5BH-IQtX%1nC$VnL!fXSgWO~W-2*WaUWukXg? z;YjmhV$3Fo@nf_*FJxH)8pCu(0!%2y<4VRcz|oOGZqs-cKN8j(0*cb;08A>%7;S*q zhYj<Fvd0LLN6Vea?B!Z@b+c^Bq5j0Tr~eQ#?eui;^RC&jkdKELhrRa>dW~fhy2LMT6CuxW=n#-u#9_~ky$&x-sscL* z8;8P}4-iX#J8%-J*;e>3ep1@cn%#`780tbY3(R zdlIgm&4w8}Gh+dwVb{40zrVb(GXkJ+voOkl&_<5Kj8K*WbVKm5Fe0FZ5db5#^I@dL zcCjILg+s#0(8QO3|B0XYsGtV~sW z7z#ibLPt+=8cGIU-xL9s{wNQjxR&G4WJ1k%HAFyRVqp}3@+c~*up!mTRNl!@0kkk; z1Y&~Y&_v;!PdC&8Y8e$bcoDhDe63CH4QiTb2%lU0{gE^=igD5lmO_F4 z=Pj0{tF=OIDI3bYK~2*QA>_1-c%b_;&;ys=EayGnUbaVrrQMgdV`JG6yTT#iWSGu~ zfMQU!FbY7Jpzt}31DCdntD(#|*r8WE{q4BtexEby@uGzzBta14}%*^p{w zD(`A2BCzZHM)-c=_qTTk-*uRlkJopLjVouWY-lo}<~teU5IQpav-?Wrr`!8dBmd+W z!!!(`p`%6ED4CHBv0Hp5=!OU=pe&3EplB&FvY}5ptWGqHoLrDTjnFb`0cA!uLy14!z?>WTPzF1zNbOU@6X0%75q$949NT&Qmv9bGYdnU>`g*~ z4eeaowQN|(zsHZ%EgY9|lJp|6=5p<>#+jBLFvp>#60e$4J-~*AJeE$WU5y)K=>d*I ijzj*Nd%5ocjzf;a-0y{!1I091#c`PbaX9*)O8x_PO^by9 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-vintage-right.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/nsis3-vintage-right.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bed344a808e0f4f754536845918bef97c938cc04 GIT binary patch literal 8996 zcmeI$J4_To7zgnG0m~av;J5>M9P*Uc0*AmJ$ieMtqQ=75BJq(3NKiqeQDao1@+dS~ z5H0MCi4EbA7#m|{;j>X2qm?!`CNy@4GqXE$uov(snB7FaWZ7kJ!~X7@Z{}Mzbg--x zEcUyADsnVMHjQj9B(w8hN&sKIvF#ye==S~NC;a^S4R;S6##B!)zP^5gp11@YiC568 zB;jasDvqab!HJAaoZOa;lUX_F%XXtbCl~#04+e6*81Urbls6xPdD}6VUx1;4A`BH4 z<8+Y^XNpU3c1J0OOUp1)R*sSK3Y@E`#QDl9T&S+Wg_>GitgFW*wE&N5a5j?$g8PhjLF*i1j z`H4x)jZfg&ox6B`?>=5Uc!*a|p5X2DG~Uh3;Qj0@KFrVK^UIg`_2UPAFD&5C;v$xo zmROz?M+V?Xma^$u-?%t6Uq0XZzK5)AHYvTeIK@7h?$+DS3^-?5=y0Wy0u8)EUg`3Wp<&VIz;o z^91eNJLn)9L57mC44BO>r7SWLeW^ytGnn13aX_bQ(d)|K; zOV-*y#rr~u^|iLh_*A%Lt*gbWjGg85R$hQ%NzXa_ezERlnq(ytE;=d&9~{g`4~6TDa9yyBf);27>euLJq2pkWW z&?ZIVL{v1|qhruvjzvdI98Si?<5YYiIunx6nV5{O

zLSkaSeLpR-etakL;9O$(> zaK_=pS!X)VrMYlEJp&gq-RN_B(4Uo!i`hB2l$(dkdHEQ~FTg-SA+8jc;A&Ypu2ocG zu-c13Zw-cOd>E;%!$@5{t~bcIA^UOD--KIDhcHT-ai`@lCfYmj=yVqz_w?dPUq7aX zNAPrL7&BwH@oaPq&+pyGiwEO)`EUZSCMWTBY6|bBr}2Jf2J^GCn4g=&x5Y(#Us}SC z**50$qEOehaOtJ~2X{4YFCN%Yy){iVzM{ zSR(WC5Dud(4wEe|(JmdvSQ<>W)Rzi(sW6SjV3b7+;8I{|mAvv|Da#NplPxAQaJS5f zqAVl0Otvbd9N-Itl9mx%ltl=K$rgjS7>mPb%PU!I+8t5Ii5P${?ymhf~1fwY|$>F!Dvf0rtvx8vlj@?i>NR*6FJOhHwo^05A80RScAIAYcR?Zy-p}D;&<)V z76=AYScY)1K~$$Dg)x>9T(UX2kXNP@N7FJwUa}?2SzD)9i6pUEDZKCLARgQo-lPsA z@$I7Pg8~!nV!g#-jKyGrUGeGyp}{nk0u$`gZ`BOOSrjJLrLzd3uo|Ve^iuu}7kA%| z4m@c})kT55I9I^1){!7rHGihG&Ow=&=U>{Awc$?0^TG{5+AsgPD`B0n`{Q)RT79?k g=K{~8cmB2i<`qM(;L;1_70N5P1cJNTxcvqE0thSOSO5S3 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-nsis.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b4a0cf94b92d220b2d75b3ac2df52b4c5f1e5b25 GIT binary patch literal 9740 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-r-nsis.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-r-nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2da34f174f051dd82b1962eafac5ba8e85f48689 GIT binary patch literal 9740 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 Dj)1Nn literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r-nsis.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5f215d77455b87f02b42afdbad857a445d37c107 GIT binary patch literal 9740 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 UQy>?9n1cB%g*O7@;b%Mk50Ge=o&W#< literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Header/orange-uninstall-r.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1672afa6d3ba4625690277187b4bab8bd0abd738 GIT binary patch literal 9744 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 UGxls$wavJSpZ;St{PC{;0!F;pv;Y7A literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..0441d5cef880ed99fb4a827ae09d004d88b8ae53 GIT binary patch literal 4710 zcmeH}O>WyT5QWE*Tcm)2`Uqa;7+w(F8t5sqNzb6;ubs%3x75a;?nFMn z6S-#&8m5uAM=vsHf2#u_90qgfF+>~0dk+xwUqavr4S$?smuwuTWgO)&jv_ypZo7f)2L8Vr*wMO99iBeQJYlqhaipAr7PSeR051{|x3$KwGtTX~TGUw9^iDaq zjXLiCL#+>x;;%o=*Z7@1Vc9cUsz-v_b=wB~sDq&Xs6&t8%jyx*)m&q;cW!p`CAflcl+j25-l#!9m!R@`c3 z;lvi8`HERx<9dcQfIMOi_(je0RPhV-#0@OpYI)X+X+EQJ-4Y^d9EDEd)eM8s=L{S+YM|t5O09> z`#D31q8>e3-!}tH7Ou#ma!SQ}=3@a{$OctD7uSE|3{xxX$NU&&C&}xl@GCFESB+wQ zU&b7*IF@Y#T29;sG~93#Q1gWAfQlDf1r%Q65|DX|b3o#2oC02zceaZ;yXSiSE^+l& r91}5L2Ww89IYuk4vhZ%jExO`1vHJY~MP7e_ug>@LA2I)z-&4K=J#6-L literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..f3e7bfed3e2dd45a6b7e75ee3530916d20d72587 GIT binary patch literal 4710 zcmeHJJ8s-S4CP9jz}rbD(3ZYL09QGSD5^dVE8FW-^SG;>IxdFicwI7FK7c$y+uWuvF|Gd^5wo zpW^hwWI8Ev z9&UcqI-6qY<+mXFi(zBGyjLh{?|za=4%0Flfi>fb0odudgs1ly-mX{mP^NQ^KmM z+ym0jJ&Uv>|Hb~WaL*Zg^FDFLc);L&P334xXTF)g-OzlJ{Z3KUW?$|V*el=_&_?`| z2`hic6R&PJcnkOWZF%3i>|p6}@$qYCyJl-@uju2#g_3=5gko@RD7WQ@W+on@|ZjblU&z6XJ+n=sc1z}Fze3Q z`>eC}KIhysaQ6Yq;73hOjrJ{Nz^wo|$g4110qo_NZ5#cUa^Rav;YL4J1)L24Et12= zVdnX1fwZ<)GgL%Or;Vd!mo1GTK3=ve`^^cGPk5 z;u+=8lX4(aEzWT~KJPfA!X=MBFMgDH;w68nhvCIlk@0b#JdbOIC%yz@!F zz$+^&aq(CgF1}ugOK${l>CF(^YAhTt!@@fiSU3^D!b$Se5iFdsF@CZgi|4vA`TjO6 zetHL{J|4v4*dV4qe;AAB_hIJi!&vE;Jr5_m>N=s4$cfh8HO#s0UrjNtg35_0=(d!7|;-kR27$IEzI=;a5gmCf8Py6rq&f1(d#a66G zVC}j(()_4XVg1pLmfdTsM@-jHO8~!8Ih7l5)PQnwN~MGku#+2595OtYQ=-eT=uSZ- zH9BW-7|%&G=Wq!r)+>S3LV?sTfz&cVf$Q4n;ZhPkx~Y|}F0u*G`C69hTA0tsIzaS- ztONcem;HF+^TJ1E0h4cPd5Px@mv_{5U{&k)8pD5)Q|K*a;0KRmo zVwZ;h@s6yS;o2=+$!1Hj$$d@3Z=ANC`vkub2m}InbbB28?@iDr@YrAj9^cV`gF74W z)KDW1?6C2~P8&}S**LVz!lC;bapZmrPY*ZZ+1(bN+hbwmK^eC>&Ngi0ncX(WZH(-- z@xntkp5I5$rtdDV`FVG#;=LuP?=F|$YQ*KYZCp9t%yt8=oY;u*Q=2h<`euy3+k^2l zeV90V3nntRVdA~pG5NtZwmUKT;a!+KcQ>X!x`+3g?U?#x7uyhWpFO~~2f49FFg>;( z(_b9G^p^)Q^Hmx%=Z|3a+Y!wE@FM1Zdaj$JN(IC6?vV@^G-ZiF!+`Jj?ZsM3V2{+9p_Tm;QytJ zRjQ-FINS!bcM2#QTk7cHcA%q6pp>yPkITC{fX;4#GFIe5R}XXoT|F+etX$sH1$6hi zFuKcoyMdlQ7e;q^Uk~*yE{yK-E!2BcE{yK-R4?;WTT3u{iEd3X-@Ad|t}pT*AoDNZ GQ+@>p!8)4& literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow2-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/arrow2-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..fa6064fab4610999be7310f5e548ca3eb3528e54 GIT binary patch literal 4710 zcmeHJTTfh76#fQgxXsASIh@WoVHoHILJJHaL78F*R4&JuCYq@6+Ly*lY&DISw2)v1 zQdCS$@lunChG~52gXxQ!_Q}kz@DCI%l(sMeu~Q$8-`eM#xs)1hVxx(CGi$BA*0|r%`L$g>5!3d}g865^K@sEh{5d zp=dMW=UFc{O`D-BR_f9VNT)M-?&Bg`$>-#G+$*F;YRk`whbJiQCu_$asy|JcSi*>B17p4oj9?QJHJdQ&Ht@s)n|RXL#Pcm%IF{VPD;+<64f zuDc_}mpU2FA7!YyytjG8as{mn@Mv02%QahCvu5QqEhK(37rADQA=}U8G~p#IyycK| zZJr%0=Cg_N87?5iIYp?MB@3Bb#C`QMZvVW!ALpamPv)fTpW)n<8OpEY=f%$yeGXz7 z#|7T9@i%=nsih+A{N7BV-1+^sPulTS0=v7uJ?l$+CMep;w`afNIsXNjyfVdmfcxjp z0+p%4#CD_i-^!j@?%mF7Bqrz!L3(Px=EgPza_6!M`n z81ihtyNo$^7qk9nJRSc9&+fj8=k{I2i|xyJ`M@%cKD2^YA6~(011orAa0SPQuHns* zYj}HX74JU2ij#*|af&ka)OAcha~(4;+`#FVZs4P%H!=UpO`JWphO@`laPFNoeEHrw z(v$1>dU_p;Dc*VJa=7rxuekWd2EO}h6W>#QSlq;=^INz~;lE7Dq3tYpPT>D`0s%h} z@JAG)k!Um;j_TC9rt3TlzrWh&H<@Dk4AV3XBWwmWE_BW!y%81F)yyDI%5NA36U?9y z)-+QKYmJS(Z%BfvKBVmWFc;iH_=;*j6HIAf@XPjW5jNQ%DmMgF_*q^@I$-)E_5+xP z7LfKhxHG|yCV}LT zjq(I1NPckGL1}^;8w7?%Toe=B$jA`+Lj|}Ag}@>5!=pvm2}OT&nDwI*6XW9(R1`_D b-Ej$yvcBX2xUFdx_U1z9zd-h1zNh>F4bbGw literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/box-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/box-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd6c7c1f3b12f56a3b89c3581f8bf739bdbd15c8 GIT binary patch literal 4710 zcmeHJX>3$g6#ib_q|!V7=M^(OwY`@_kQ;~ z=iK|wOx`(wfh-gh6sUQ$0n7x5LF__vHgG%ld_K(|&j1eP2-f^o7qH6>j20g%x9OL~ z5s0Xi-)EAZ|D=I&-B|}17Eo$kCg){tqpDV_>#-1%pV`o^@hq>gE^PxQtpUt+83?Y=fVmN9cyJhZ}-pQmv->^~rB4#zTe)YKs6|S){A^lkkZJh9Tu;XvX zbNub|T#mneA67y8eBMUYS;ybT;@=ZiHC3KX`L~8CPI=T_ePCY8Uks^$c>Ya~Ns;fn}Cu@XRRnsAWk%;iFEYO24KgOHXQ) zUP6>2{luu7fN}Q#HA|s-iwO^~zgPiW@-R@lihTxqjKGt?lyyd;&j>!l_?vRrZ@AIe zUWCRMidEk+cWW7YkC6zm|5#x69}8X^i|bz>ulkT?_9Bb7PewEKwjK4VC%J=tNz2Mbgsp(13nKcNWO)FiwKqsl+5v|>)9 zhs_C(Ag@`|RJ>_aSNZ*OL-QNz>!)7qCa-+Ss`#d9jH|A`I;3S*o|}AAlVTly!bFD- zHF|{CtbM*|)CT6+?&LixzT7TxejpHV0?aPdynTY)-!$qci^2RWE}wZ>eNkcG^QYHM z2?XZNy`aiBoQddre#7*79&u&$=&H&QrQW{hH_)K2wszdu3rAIsC|7*i`BgNi3j}CT zJ*raTJI^0d_cNVeR?keYe*RF%PLNpHzp0ue{Xt=yB#@R~yv-&J()c8sFi7QfWKvqx z0jWG3CdD9)@5dmW?`zPD?_c!csgp0)9^@r+tgH+X0X zT83`ti4#oEJj?XlNv0Q`XL|7*lW8)ouQ9D=U!}LMzC*bj(-+@- zN5A~Oy{E=V)0TDx+7L`@+Wh zqK0r78frw1=YQfm8$rNXsNIhUy=#BT>JK{l4^B}0$rYBr-;dzfN^(T#Q6iVcB%fPp z#Hs;#3&ldAB78p2IdjEZ;7XB!0nMCgdW-0OEPahlG%WNo!RUK{8W%wW1HvD?g>8S^ z-u4Hr;??|hz6O8wJm`WtzxDj}{Q7-V{%uqBRCzb$ziLA4_G~4rVM&PAYhwlF4Ya*q zSY@EGv||yJM8fMnEf+Sf8Cbk(GR@C3EkKu^W;%(PU5EoYC{i z*|T~^Ie(t%<(HV2UtwBVX1Z`e&n*`(GOb~DvFDeyb*8KDy^kOH9%XTsS?2ZEn66x5 zdgD!|Ywt2$zrI5^ZZLiL0n^7HF@630PjvHBrXOxssa$5-*kIb+WV&;QX={tATE)-N zmUadH&lS*fhP^gaA`us0_(GTy4)}Z?x7+2y{9#EVk%)_dF*-768+5r`77tc<7#N2m zBZH}6Z=mm(&)ubYA?N3XkCQQWI5L+>2ZIZl;~qEW7koj4jmH%qH=<*YXEK@e0+wSQ zw;{A*Rs49|h()7maFB&Qp9j3f+WcfJ8e0@P9mH#ZM`RVlia#|Odsy>>cuy7Ik^j-D zql|i<1wfGjpg^bNV&LHSF>vzD27CA>gT1`dpozsr{So(L>jo`Y%b+zY P27k%6A~7xet8>bq==+=B literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..5afcc62e85ddfc493b85b04fd55426ab9f502765 GIT binary patch literal 1078 zcma)5F>c&25M22TP^olJP!;$W$qVv^JV6}^7=hT4hGAUF82*Gy1Hu9P#ue&Qsyh|7 zH?zBveTM`_RvIp6XGyJ=5>Z7LwB2q=?5ZOA4BxiKe_s%NL+lDMiL^jPml%nPjy72K z8i+)=DMoV`F{M%pya=o}G0P0VB_SCWOJ0pq7E3WfgvGq*waS5N4Z}|m8uin3?wOVI zWO}panP1kEJ_oy3R*6)zA|m!bC>v(!Qww|r);>k_@ShgZA_&?NnPH+Ay!7g%O~|rx ztXFS+avsXNxo|iBG#X}fq~GQ7-U9tDb}r2?hkI)w^yEUH55J5<4?d;&kZ&Jl2hl?a z-KX0@`JxjIPw`F90}?|gT=X#9Ji3%r?|DksPY-)ub)JI18TRurNjiz19)@wZ3w1^b z;5lFK$1HW{&ba$A=IFd%d2{r>mlNyA`z~il_8lx-ca|YK=3||mooY@{s86LUg`h< literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/classic-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..09532909ed74d815f65c765b309955f60ee53e0a GIT binary patch literal 1078 zcmb7?F>b>!3`M`20`BJAz?q8PqCG*cqip6TZM~9@5}->*j~%r=(0FNpXWG-L^4A0K&e#iMikzqhkDP%q<~r5tHDCb$Fsp_$U5w*MtAxiN z?(!)96w|zCl*`F+TQ)b7f_#0)El+-$=Jichp|V@uqRnKFcO1B}aB#6{F?|8{bI^mC;#k^J#Tq(Ry^56?uzbx%MgCZemy*r6fAY4O`ww1yM(-EO(EkAa mtXq92F4W%Z0vzttjJ&qgfoiGVfWdglN3=e1i*F3>yz{>o%}Y)I literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-blue.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-blue.ico new file mode 100644 index 0000000000000000000000000000000000000000..08288b6ddbbc80c450f536548e26ffef32d79124 GIT binary patch literal 2238 zcmcJRcT|&U7KeZKvdE5O8{IR4)X0#c+7FcgPiK_CbM z0f`8R6e+xR z1X&j%eIc+C0EGle!IXqFFC}2EY@1$YO>bv3x4~M|7Y^#?_(}5sPHULL#n>80_fzo0 zVQrkT+XQb1O&qs2gT1X4Tx_X0ePSQUnZv`$20mwP;p65AFE0=1Elt9vRgsXJ*Neq- z-(ta>cbGSO7_(=INHYn!4>71~0%5k6jvdO$xU_L8u5O!;m~Z4k+pLO!t_+Ts3OJt1V4qV%sjm@=eYb$^yahD#-MDPI6LE(u5cIP-!rXQu%;yji z{l7)fIeP?qokED8JMOxef#nP9h`Xd)$h2!mTJ@+z(uZ%HTDq z30;kvfUi(XBk#l3;L)Y8@%V}YngZ9NIYAiRAGE^bRQAc-{It1Ai{3lBnuhZ4gb4Lq399_I+Y2tOB2Hvx^ z@PVU^4<*{@%{PD`S0As-^e{j^50vQO-UUlkNA5#a)KOH?kD;1=1kV!9Q4{Nkj;vka zXHwCeO2s3l2c9w=(2(hiey%=-xVjkT=|Om34}+EZ7_HLB$O9791{fzHs$Y-EdP7Xq z8bbVdJtR+zAbDzpDY8dh3`J}t4N0+)h>eX!N(>DdNmo#i@GEj|CL;ej4eZQ#WM^k1 zEiDZNnJLK6yMyxL0@M{GpegSHn(hRnwIm)b>=;xPrK7U62(>&mnrceGzn_lo`U3Pf za8OxUiMqO4)IO}l%X%JOKC44pb0gYXTfyhIqq(^mjn5nKrjdvKmWL4XAEK}01xC6a zW2CzQ!oGG01OoJQccH((AANnj5WRZ^(NI4I2L~Y>9>(P8M@){7KqL}jY-|kTiE&6I z5=>1^VM;89cv1u%DFe=Yg0)N`2*or|s%k&}3~%^$zCV0UoO#$C@$yP zy&S1uc!_uyilOV}>!~u&V_FUL)?3fl3oo&KI?{R1?gl;7ZKH8u_OvgeY5rwU*v+qh zuvlY0e?)L!n|N0vqiN48I{vTv4&jt&u!sNT5&xs8r}7UUCaW(!d9On-I4%~8$Atqu zA4kT!|MXeX^NSbt4vHk=NrG51E)jp`iv#}pVO%O__{>K-@P)GC|KaUxNN?gue;Jd1 z)*FXqk>_LoctUC?Mn}g+31gB8L6tUnKCZ@p_`1<4qKDqRA+z@G{qX2;%NaZ3-HeTc zvQv`SwCW+rq~v|;!GFj&{Ps3`J;q7E%_)E?u`n4Z57YikVBQ)7~NtZG* zU-XOaM-2^r$^0$q`-e|Dgrcsc0W%}YW)&nSM)|l=4b=TIe><UJfHJvIc zh_{EU6LtG0r8&Evr}_TV$!UvR-@zTOGq|}pJDHho-)1sLXI(>{{~l9QQ>{a~JIrRF zQb}g}whilabg-{2@1~{2Zu6bydv?#TXOD%2#Wx!aq(4vGe%+dPJ0tyb_D*XZo!Q?u zwzW3?7cUxe_nNGqO{!%;K~+uVQ&bfd73Rv+7@*JzET{nH1dzW9(!l?Tne!`1uTIia G+WU7|t@P6X literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-grey.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/llama-grey.ico new file mode 100644 index 0000000000000000000000000000000000000000..4749479fa7a93f5af53407a0dadc9516112882e8 GIT binary patch literal 2238 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 KcOEfZq5lO`eceR> literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-colorful.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-colorful.ico new file mode 100644 index 0000000000000000000000000000000000000000..2908f58be0f58154dc012697b5e80e133cc707a1 GIT binary patch literal 23558 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 SB^Jc8u4rgkXDr|rJpX@JLYu_^ literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-full.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install-full.ico new file mode 100644 index 0000000000000000000000000000000000000000..3aa83e9f426548d9ba03e62af4276fdb27122ef4 GIT binary patch literal 23558 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..f8fbd5ffa910bd7e090becb3ec78fda3cfa4dd8f GIT binary patch literal 13902 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue-full.ico new file mode 100644 index 0000000000000000000000000000000000000000..cd9227971c3731d85cb8e64bcfb6fee2197492b5 GIT binary patch literal 23558 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-blue.ico new file mode 100644 index 0000000000000000000000000000000000000000..77031b58eaea4cea614e0e164b042c84f3ea0755 GIT binary patch literal 13902 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 JYRuL1{{c5`wW|OC literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-colorful.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-colorful.ico new file mode 100644 index 0000000000000000000000000000000000000000..461035cc2c3fef9a2b405435f18557d31c6fc4ab GIT binary patch literal 23558 zcmeHvbzoIT^Y&0Eu0^YqQmRmadS8l`;!q&Cd$1%xLa-!guqY8ANEG5q6o|XKyXVGk z{OZg%=K?J+Z`)UY|9uO4_v|?LOOzgr{zfXUj*8cp40RaC81B0gl|MDe-hlg`0JRsG7AQG?$XEwD`77aMktS?xKLjh3+MrGP;N&q5Zdy(Uf2;SvB48qvne_*`aUY;-L)edi zMCVt4TweppqqjN!4aiJp06BdCO4rYT?7s$^==b1W>BkV8{|dCkbK3AXp*80xu)aMP zE?nFL7q4nUkn=up3)=~fo=3snMISO;J~Pueyxk?w@h9u1)Qr6A9q z2MzTwaCS_B`>r|Q{J zeA7xHtgr~~G=zhRJQl7 z>L~;iMMHgO4AfIJG*SvwQ!Za;K{*ydjjRl0?fKA6g-}-A47H6_(AZJ~X_!|Q=Z)! zHtMdgr`JRM>7Q;F?hF}u(Eh?1gDZY|KaAn%FGCmJyLc_c_@_H=hsI9^m^a_*){>yB z=R7Vu9DRQ*z^^No+F-GK#VV6IvuAzt$;a=!`NrEj;pe%Qwm0_gQ~&a_sqcL>nkTWr2fXc0 zp3psVc+2-6e!&6^c+J)Kf%APQ$J0NK6Xb(|yIleT0w20-@sgo(!v}r4N8`H>zJ36FQh5wbxp{l(0{rfy~`1y@#Zogw3|NRC>UyKXU7vieu@A0QmA#NZPrdsKqrvH!P zhC*fRxIC3W|7HBSIQqopu|Ut_`jSh0XX%tjqarS3X)+&VOzej}|28O>q z$pl`s+L^$*#F;}4geInK^J_3Mu+0SGz=zD@Q=%Wgr{s_8+;MpD7`wJY?S_Hdy zuY|)IYvI(Xb+G)j2JG9v8#J`H!qMXgK=-&dq#OlM9va5F#s@GU;B^>a^Cf(Ja|#R& z{Q|yo{}}Yn{{-_rCc%)TzVKB-fB39pD2y!q2&QGvfOon+fr*j{urzBh=wd&ywT@7>%cY%)Cepu(C0~#)SK*Q+-=sBE*bO5?#$^cX zB#_j63gx1&KwdKg&Rv-e4=uL99l!Z-({&@57#{-{Yi%&SzYT6Vu|DLk0ZOZdkmR!t z9f>FILJZw4$8R?rrnzkIW#4Djy_A@A@n;Zh-F}Hi7n)6gVCb4@*LtU`Sd93>T%t zw9Y7aEn5UrSPy%>yB?-B*Tbp!L|7~;fV~}=u%w^?v{GAOb5#RqwA6#4p&?whJO|dM zm*BjWHMi$IFz~nox9rW~qPH!$xVV7dLr(~L;t%Fz0}r|{fHU2MAf*`?r~80^qCZ@3 z^8$Nv08iG>0ws?iI>rbTX{Hd}U;rr+BPc4jglMz`sy_=I{BGE24k)#R*mzIq&i8;K zkuO9mLLf&T0@6AsXrcQcBUez?1+y*`2r|BZ*)#*J+|s}|C?7l?R>JknMDWZ`0ORg7 z@a{?jW_IG9EfH9$Fhqp&koB!g_5&PAwEQ)Iwc-9W+R)p-Wy5RSjZj>gj+U zMc31T|L^? zJhG*?=ie3a$?M*?X5PN}r6wpOB)af0LPe*Qhd zrO&?jF*v)~ZBEd}~DN~N+$Pp_s!CeA#zSgp581pjNs*R8`^T1pHGRFCuX^E*1kImZ?+ zoH0)XR>}?P za&l6m_sw58hb6dTYiI9LT3S_BqF+&Y(UjYgR9vqk0UV4jb`#BtP$L zZEJ07%gxPgt4_>EBD_e?65OK6KplMj-*auFlSOc6le3&)WIyF~Do1-w1A1bzW5m z<}RGQddb$`9s`UT{pL^UQkg=gv_pS9kf6xhXF` z7U$VC4~(Tg0TWvRRMj)GyQ~h zkzwVmW3U%=4Z-&^_!s@N^u5cU<`?uDLEjnAWzP`mP#HtY`>CoH^pr2yZ)N|Ro}wC8 zd_!>D#eUOMHh%`%2fl(IG>^iD4Xa_x_LZ>zz;alwy%l!t+6hP1_rf8aor1*&&YhkH zip~8XMY9(u4)NNp^C=9m7z)EYhrlP^{rUP^m~8SX4Dg%+3&KXi@xcC|XZSs=@%j=5 zr4E8=Nqt~s(-8Q)Yak4XoC1>zzk_iNQ{nU0??5fRA84ibg2mziu)k$6=*E5kTkw0( zlfMhoEmy#RCktTOqa}P{#*#~PaR>P6=n_>U0jd0@TW?1I72#y5Ihdr)aVA+jh zaQvz|95&kv$FH1#-K+~T2pHcO4Zhb0!=-?};O*WEu3Ains}H6?s!=bHn+}8& z-@Z@vnQLDH`c4MpBmnnJo{E}>fTw6681j3hXY_@hv=NY1I}jSHheJ%s_kbB6L3+#Q zAZ?lk#wNdlxyNE~c(?)1UEBfY*Y?9j%Uxi4?I_%^I0+%Q55mph?GSMP1Sl*PL59Z$ zQ1~o`EK?n*wB8Fb0sBGbrv;Z2Hh^F5N_e824+eP$Av9VYT#_~6QNa-~Z8!{<@i^R; z>B1A-2_aRi@5r=3nzS4W<-bBt#|pMNodiYZen=4Sg}5Fa=#pr`i8c4&=i^sEeT@e! z*z*{U?DL1Oe~yBoddaXvEf!Yqiif?262L@*Z8cigz(~^`Mj2m+FRz)w2-iz6#K;>) z_^}Ri;|grOU8FVk9JOtT2SYN>-$$%U{|oDLe|R9K$g2%4<_tZb}O*ABrx+#gZnaHro`Dr`H8Br-Gm^llBMZDcQsHue7y^@O zz_g_aoI2_uF)ITydQw3w&4l#4dMIeBg?6b(HT?f~KUt}%al*P99T%6H^-qgUjrsn& zFTb2Vefrd?Ukn^DDEhCn#Qpg7&&N;e=NA+dR9-%F@}T;_{)6KFw35{CexAEfuduql zzP_P>|5sIAI<|{*r2er~(bL|Ww@|OBUQ*9%5W9wkhMKDLTX*&8|3_7%e*W&vg$wh_ zBoe9Osgo+C4K+0vc5MBk&p%d?Fzvmk$)BfI<>5Lw!{(i@zMLUp+KibCRHbt|c@I08 zT*&b>!HCx6%)@=5X<)W%WYxr0W(JhdVcA1+qP}& z+yA#_P5o^4oH;J8rR`k4B@0_qwWhA-PP^!UFM!7SgK;6{y}I^LC)a12?xYq5SrC zUkjlXSr|bSnYl<>C#z$DwAEIuTKQ_UP=Vd;!21t4c^j86=ki&cr=@dxiws$v;8f{X z4IU_bgPXyDfe(Vh+SIY9(nV1b6=qrMT=3!v*cXdK?)Q)uqbN=4)v%&4O#K)EBwMu9^T#| zA>mxUkfFP~yZQQc-^Rv9k+q5SVWHgTZphGIdvW?qGcRv%pNIYt5gi>JU0ogB9nHSi z&5ccru38<|P#Zps-H>6NhZW_aLi)yM={bXtqobp{tD_^rF7faYp>QGjupvW+^S>cO zRp~Q5xcrcZ;Smv0QBe_oTti!%yQ|*i3+Gm^UcqkI3ZVineb_U3JUqRFLqZ}Wg(mXz zYqPuK?C$Ei(BQ(3ZL3$WTBXV|Y}oK2!&dzIw0&$mgM+z2BO}AYI{f_nuJyj-?)>xo zv*&m0*tBgG=Mb{6P%D02`RnUKd*1Nm4-oV?G%T#G)z8n?*4EB>@;7-up1Qy_Y}@oK z1Ls+_a%tZ*?hiNED9b&xuoCJizklqxDql5GOgIOa^<2uLVufl zJ1~HIs55sru~^*RUR+kp|L?}sPVIZb@Z33m?bX~lS8dw3agnNjCfo{ey6@oVE*4AV zlJ+ujySTVmT%1x;^8L3pdtTjnR8wp9D(?N8H!gi$)&Iql?d|Oy9Nc?2xm+SCD=Xt# zGR5^JF=;i4`^yjYJ-``OZP~o`sW<>XOtGIeYmR%poE?u~&L9zs%Osg8lKR^8?AQVE z=XkhpUb}V~w~pXSMopRZ(=1mOhr5|nBH`(oouo%xpOs!)o0V8D%s-pgF4_4sIl$jW z{q*Ti3(BONS}vr2nuBNbo-AokdToWF;Wkdb=(qU?MvodZerBnJGw}2w;VcajVF9Rb zko44M)Hc)@ZrQwM$-d{s1LTYtGk(H?GC9x9Tm#pkn*XJosX`g zdvk)TgwqQ1lS0TROeBKiJXf}?9k*Qgw7+N^mnWraVsh&A$&H3%?*NofsQqj+%Jvw7~Z#3znU-a{fs_Uz(t1j!VU-$m|UzPuH za=u%uGjZaiNs~VK;Ny=sY}l}F-MaV3?aKYr)WU=MlOIl;IPrstAH2^cj~lnU_AgUE zeOOzY#+%8s+Ma(Q?LSST+AOizn-OCHNmilAGlY;gRl|gkH(C9Ju$;F`LTJE63ZYQ4 zK4bYpID;_|AsqjE$on!bfTsr`?Du?GUthcxK%5x_AX4)4u+_cXe@X|SP`0n-V*EJFn629hz zs%n14ac#~|il5c4>Q zIU8i>I<%8H4Zn7EcMbZ+aaS7iMu@o!#CSb1-cQU$Am$_x^Am`93&i{dVm<^hSA&@M zK^M&DKH=4JjL;9ma~}ON+~s{Kb4-YN0K|AdF*ksi8$iqx;4qq)H$cp5Am(_`HJ_2q zkrAP@UhKm*vDb9oP8lg3}OxjF~@}NmQIqHKbjGlmJ$8q%lTf6_w;lQPOb3y)iGP| zoK32xwSC%QbDylUr?c{&%>ARWD;DM^VcvQ^7rt27A6y#whYuev zOioUo%7)~(+S=NN{D;;3maVq7b{zAzeiFvyQSBplb{^dnx$(q`?5$^4mF~W{u4?ba zHPw4guB_O!cX@%@+LZ|#H*WOO($X@uw6s)bGw`g6ii)@YsC|E{;7=}iYc!axyi=^K zEf4NKxzlUo-IW!)Q#W)Q)gMzb284|N@SJ2t@n}Je@gQS8O3$qQ@@w|%J2&lIT>0yY zr7?T=?!9^E&Yf*3DJfqzH8IHdFS_RD<`IJIC-ro#esP#nyQpEIlJQ2eqw5q)epEn_ zREoY${5REzvFd%A-0PdY}Y$%*VKlk2I&d=e|Gs7oQD9yyO8_A+@r$rR-z!wizM z9H_ibj2#l=lz8mo-#Qj7oR@y^;KA!YK0Zr?e)MPc3*X7x*K6f6vyJJWmd#f%{z@8L zw=FqR67k%P#nh^(BT-v56_uAzR$dY17M4;?Z7p?nHjz}?NOD;bp){1R+nN}!B*sk9 z^4?e7iA;a#($tBg^OqCJKRAaP8tX|a;r8e(B1K0SG0sPnx0u=s-$6^8&$<^Z z_&HVh7D9h`xlh*A)Vy)R?2P5xvFmY4`%Yq0d>sE@aZit?_inA(h(N8o3=BNZMIQik1+fqT@s{-%?xFXw=pFx?|b0 zWr26^-rXvUi|5~gH@W@Y{k_(`XS=<1LZ>!OQyk@Yzf9)j#kI#!GGWfqw}kFJD5k|r5=d=zJUt1^r=Cvk4_y@`YfU4pbR#dW+NKpw zcRdP7+|xyJlv9U9LJz#k`Q20KvT+_6ndgz=r4(ZPk`!GfBok+mq9%|q^$d~wH$?tJ z$@boO$+Be&qphs0_6l>9&<0+Cerw)yvuYaM^MF3#HeZ2GbXpli_Z0Eu$73v9kwx~g zakNoAmNLpj)P+6N+}%kYffcl7V-wkM%^RZ;;%xHyNFo)XAF_FMogk1;Tj$!N@dg1dpR}vQ+v?8ACgz8FW!nKvuE> za*`L2kD`#A^0H{-p;!utt)yEXd9-+AB%L!)qx$w%{uW)V3$~M&Umh7852fZzH=-P_ zGtHDJiQhf^Jdy2cqKog4(yBKF-xwiZwsd~HFgKQ#mcIY7+5O7bvg?WQdiqgPL3>yy z)a$M$Bfh>Ns~`tiIk~kI(-EsATCp>pepweur?00_L1P`S<6@G^TPQ2Hh;)yJ665zI z3(zETSw(bjF_FV24%r+3Omy;XQk;K<5?M!Er}jg>u!d!4XMgp+k$=OeC-wA3Q9I43 z64UNlG3mC5>0EmY8Fw|4RZk;1NE+x)Q8}q;CekmPV(4y2E+to&Q9)HXG0slsPX&>w z);(&uuTFTAb-JsQiOzgPbpA^s!&Sez|Kjb?yYpV7lzC)n8N#Yj;vo z(%g5?M6@ukg2s7?h zeg?%yoS{1B?IgK7kI?v2B0a8ChqpXhgNgRB-^F_APS!8?yiT-jFg2?KB^(9Xy7G%E zL4V*i_HW}a`!x;sETa)|B4XYKF-L=#pFw-Lo};|aIGM`2dsIA~N{A$NPka70ezad{ zO4`c9l&;uD%!MI}`-FAyw}>3Mt{YsZDeJ@+2NLNHcq+?5mg!JmYPi6(U^BoSo4zbH zHa6BQEG+zNg2~;w!J$Poq_B=AG}qB=Q7NqvWz&J?EIKF7A>E)PI`J@uel@hAIj2q& zb5v-puP!kkh?qA+%#|Um;r2~oJ^sl!mSZIA)Wdna4`scY)47&0#g$&%|$T%^P zjt2VDnfwQ&W__M+mD|&1{q4jY9b)bdHD@g)N`9XxlG`Dezk|ytZVQ&hXb69sKEzNG zF$ak}?D{Hq>{t*k=xW0Jx7=7an7KMQpge|#i@fRMCVSEn`H@#`EQQyl)02{1@~=)I z_r^H7R~kVk=|N;6_(X4FZVv^f+tTs#JITl60Hp+Op#-;;)c9lpQOFnkJ-9F47{_~+ zKGc*2#JnalwjSQ4rFr0%pkE2~-}JWA9CAmehj~E6oFMw3;VKz5`cZsCCZ#tQQD$oa zrF10IqwXi<(;Y%iSrOz_97}FlkrYz;m;y5WiMczh6Iha!#c}d;K1J>~5As~Fh3MfA zEW;#{MZZefZ-JUVJDF}V8k3SGH!FDtkyg# z5?51kdnJ|ddYUawWKAHDqU0eI!+V(Us#r>Bh@z16X!42*A?EQ=Xp|SFBsdfEiRiwi z9Zqog&RVMNuAp*RHtS$9luDtLP9elA1Mgk}D5ouwa>QYjS{_bMVneC8G@Qbo_)}y4 z4c0#n@H{+&GAjCzeF9VNE{(6gdDCj2U{4U<{kdyss(*cn)x5C2_dZ4D;SqD$&Yo!crieL#$b3IiS01N4);;Q3?`l$1 zv%XtF4OGIunD>80tnU`G-pl#`?+Kf^MVeSk6jMC!@8YRP5lu=AAm*#lqpJR77}8sQ z+;C19?W$2GWIga0MesMT=T>gVCVszGuCtZv%=@r)(G$Mn?@E zxz;lFMI_?(uVpJw2JI$K@#}Q0;1xXSHKfhT_JDPAa^hdwr=HjOa>zEOw_Fo08K_5n znY}QxujJ>d-l*0#jP~}tODE)0>5Ae!b)wP9_gHo>_Gm4rKu`gjl>F)T~>-MFNX*!fSszoPjbn~&)aSgh0 zZ&h6g`!LVeV~1mC)Ps%1#l@2tKVst5|IV?VK0sJ6m^t=YYHI4=;^X7zvaM@oW@hGB zB_$>A^L#d%`}W{}r$#3H3TDX}Y|mBki3Rg-Ia^NI_X=lk08eePLin#Z15WhJtMZ3G zEvvUsE}KS&3H7MBI|f{Dc|R4u_zTXnmHlsaib)*#A38zD7WSRI*1ykf_DxVw&^&i{ z_mzwTZM=2s)=u6Fs0;Q2!CPBf@40>Z_BJOcr**=9l~KCsX=!PnbNfyZ_RqqeMc6O> z55@b_q68a+U{4kHi;T=I5@hA`YiBeyH7$1U-fg#a>sGf-n>P6{_TbO@d?5P(_I@09 z=Vy-l_wTnlefsnnQ&ZDJ_wV0dE7$+0&d z>hk5w$9V5;vs-;<$TsbDnVZipFWYFexNe)(@}|8ut6LAB&65kEhEUmHC=Jp;kUBz(V|oSct^@4;>Kr*`lE$N-zPX7|7Rlh|05w^7SZ|e~mFE-zn9P{L=CBycwnZEgrLN&0H84v9Yn=3GeXl zdh2~>%B*o+m_p{%1W zw)=HTny|C0k=nbOsJ*ipySrHjk+7FFqnvGm3OUb^wOwvDjm8_X6> zz>C*^=vlsUPR)V^3!?Vz+h@u1?smb(%zbI(U$y!3XTrM%1O_bJclMC$*LI8BKB!)Z z-zd~@8SdehKZVy=b}t^GNf?JEEPEZ6qgYvwP2IIvSznG>`S}>1nvF3@*%+Ukiy1jZ zSYBC;t*s*L>1jnNzn@H2g$hYFDtp2ZyYC~mUq-CmjEaiSu(awOw6gnJvV7I-T7HK} zW}cV|^PMmrSkL>*F)hsPg8fJ5;?Y~5Tl^yasBi^-E?rHtXd7)p9X!X@xBKKlQ5ePA zXC_tfNEIoov8t_tl5(=h$vc(|O(Ri9k8J?D(RB1g3>sXBqnme=DKs({E30d$tGk)M z2fssCCCNH+P|*=VD0U*OKZ{hjoRs+=P)+HZXmR%o$&%$Ws<|&c62^ltriFRwuXG94 zZzkH@vDW&`aIR=V`YN2#x&^;g?4U(#xzofec#9seCHM&?VImgth^gL-)4J#W{8NcAriFQl`FTJ5nY~-kgPD@DXx{O4 z8E+(R$4Sk*@yqVrI8&*CoADgalXmFNBQ~7-O&ZTJMam*9=_FIDw=~3 z%da7(ZAJ{6ikLVCi;BkZ`%mwfHEUL?Ft<87I<9Bb|07jW+<-R%C_tCyr)mB zqUMfno?8@b$5oO{Dd#cKMzg6MI zPUHBVlQ>0rl77N7xPkk;J~@*uuSNbC%Y8qMl9kz**q%iWPoik+!EoGjIGKWCE2yQj zQ?LQE^a>%Q`le2F^R1wr>S?r6EeQ{4WzeS0DRk~a5|);fl8nc^Y8-SGk+d}(6?JSI zFSH=NrdE_F zr6_y$uTk8EuD<2CLp>E&uS>#f=6U!esv6H-$-+JA2^bTdgAyJ)imqamcNCzsH3Q`h z;fO`{h)E|Az2+j?y@TjC5VKPUD>rWVu5t0=#i9D_1UvilaUkGIj&4pnr&*jY9#-Um zW2LugA{yZjWKC;Wc5S5}87V{Qz9JF*l&QR%&tO|e7Wx$>(&0-Hv~Fh{K1!}2v8;>t zo)YR&O0cfAgS7 zxZRVy)*MY^l}_{#-o}|cQ*KuJ;Ymd(nKIUIFHb=)#tZ_L+4Mx7gC6;bwEs*bZ9kNV z*=551xm)F{TgB)eTuR&aCDYQCad^c%hq4OTzAx=YiM*TQQ>$s`js(1SCy`ofQxU}p zj48zs)0P=P$I6Amxpn}?+q(5TK_dXw>y$*gNFkVn!1X$GES%)nGyKsQ-tM|nPZDDvr{ zyZ}9Gvgw#r9Ie@zfFbeKlvmeC_k8nd_3mh#whd@Q`YHD5EjBORVvMWfnl=?%s@Goro)X3!O6a<@ z1nfLCj>nMhfk0%AJSh^dB1P!3O;nRGNE7MNX~x7(5qcg%vSF;^%6Ei%V-PR* zq0U=uqrEypzGB%o<=eJxvw!g5!5ZEpj4*U`J2%YKLop(;hDJBG(wmG+OqEunT30}n$T-AlH(F0n>mD5vsvb4JZ9GsTB{)$ z&nG%NjZlZ%U;h9SwP2G;Zr4^R9NhC21pj_D;=BcrmDm z)*MZt1&r73Jg1j*n% z#u3I79vhFOJCQj7{>}$Kwp`@MoJO&*yDWp{gGH}WEG~%-{w0oxysxQ4yd}fCDEDRQ1(x9Ge%Lomo zBI!&dJoGx!KE@;VjwIYY3Te+6qTO#09(W%~gK;DE_XxKPMagEM>b;E790Al?Ke3IO z!GX`@AAjhoy%(Ro!BICWan${Ke9K*g->_fuunD&Xh;UzcGaim&Gx=-< zEoej2qE<93??AKa4z%VzXH(aPRuxTnHKzs*B8pHw*bV*t%`nwc7x_#Pwp*=4h1pNs zPq?ofe;e`0NJNcchzExt?j4M{i~SD1-pcoOaG&4(CWm7YHx0m!ZGfc*03);j_p80v z#{6l20c+;|^R}j`z3bqMG5DH&IgRkEqcKmKXfn$@H@1mZr-*P{ZWE~&H`D&=X4I-_ zq0>#R#AkOifZVJr~)rkWz&_8JUTB;CSB=6JSa7%(>;2W)_oKu)oTfp7>f$| z8p)lp$9r${nluv0Xejre!ANHri#k1!$LSz$bG~ML4)+b`@4^_--Vua*`l6Vzxl*>x zMO*+pu<5b-R(mA(FFIBE;Bq15ueM# z7WpE=+HYAW;JzNkSepOqgznr|?1vHF9)e`ec%s=L!b<~@P7feDHh}Q3@GgwA9pHC4 z+#8z>f%s@SMce>9xO-v~+s9nk*0P@WV@umA@qR^hN>5x(8nj9)iY z;R4(439OTXWE`G7k@X#-aYB1k`j3L_Q0Kd}a_=+&YWLD{XOWi~(+q zI)bN)bdb-JVJWJiMDiW$#vdbQO+bu&3-J;6i-)5SJx3tAaDTBM%4;q6pKAjV&kaC4 z&0d$Ub^4+F9AJYDVBTH8AlqKJckc&vyLRoeWn1M6UcZK1y6<#$kg=6~U?^jSIps9C zriRAyy!c6LF3o66$K?$Pw6iIZj{9q5JQ{I{AstXA8xR=rNg0) zq!nXBGtL~q)i;jP&FY(^W48zStQ_MTYnVGR7pao*>g-QgKYj-(lE-Pt7}oQ-pLlRT zvFAQx!FVcj2JylGq;q|VF88MHJAgG0figXS-0r=q+`e;4Df1l6LPA33@(G{*HV-}b z4ZD1%tABV34Jat5fmL}lvLyrGYYnBZn?i7@D1>xG5sWj(qFqBWIi%*0kq^I%PXb*F zO(5rnY&_`dOJ)uJbgtNiHr+GF)3Mfczs{BT>?Ue6{>|t3h|m6EWbhsm=dC2n{i^Jt{oqlqkDBQ)Z1Ve%>|@Ae}8(@0nn0hAgHbjxCpeDkIs)0x|* zC-7?p{U<0kbkY0zyQ}*K`{96+OzdACgF_o0;TuiP_*s(^Zfx{Ii@GrMsENg(`Xqc@ znuk7Vx#*ddiGJ;g=u*r2U1Av8w?9UstU$EP2|@e1hiDw(j(k24&)&U^;W@T=!E_(0 zADD}APc%`SvlSZ>w_r=$D(s1w#io?cSzqJ6<;e4r4fiiAo}2FVMag6CI~jnv*?^JJ zfCh$RIyY}x6~JS6hhU!)5E2dJS=i2 z_qr&GWL-C@F`H6baw(-P7h^kt3#)I2eK69Px5fTNMmW6c zJbo^^f(A`)_*j&HDWW{gXfDC57WSkw*pWK)@e__7_}aQpCLJ=T{`Y>abVQKkXXz zOVh={xf=9Qoi6INIZ|Y60_8LpV6+-)Lwzb9Ys{sl|{+&C}u7HL8W>f}JnaG9WlDse?!kN+&9g)v?5}$1*KI6$_ zVk1$|Y(k&OD9aj1nbklcd4Nt4fTv7HHy_x))4|iz^H*X2{#5d(zfG*iY1`_U4l|hA z-Y;l3_K)9#0}|HLJ7qiYP^Tq5>5OK%i?FP%hV4DIRKdDgWoJ26br(`T@5@pc$&6*( zI)SZ2No-?DQG`%>PZ(uO9%D`?qnw#Z^e8nBi^UQ2B z-zo-1tU*3!jib{S;fjuv=p_ll(vEzr>Zron&RVSPs=@khzLu0=8Sl$-*(RHgk?g}T z1D~)>H-s&V!I;l`xDsVB7D+>~i2GTEG6)k3cpiuf!;0Dj%q<8<|9}9@N%ux+r4jGl zkMJ6?o%diwA)WYx^kuB19e3Co+u7)2hV+&NT>+1Q}sf@iXwKLZ60 zKqK4#>oAs4`AC*OjGFixwKG4VT^5Ti?eWZw3}$|)E0WllWDScbr=dSOFfZj?U@z1- zH?dscgfS=TtA7O_OG}TQGt*>B-k{rq6#XBM#X(tb;hXJK*?M~(c?QLDWic{$0UOz- z-^8}t24w|`u#D~hf-l7;wo13KZ^dG4Q~5&P+vjsUho5EevoyY+j2&E77k?`W+aqP% z@0i!Xb|7smXc~nM1%MZL?muQdR-|vR-%8-O{uRgedHV|?f1d$vk8JkOy76JjP`7@H zSEC2fpqjDtg<=-oVBTvcrE$L~WBjCsnFV#+#iuh0vDnSi}<>b!#wQa5@p=?6pV#5c2A-Er9fx7&+Fb9(Q^LMMkjA? zkAIkNUX=Hbu3K80MmmRD9G-XY{j!nvedGfZUd5s9uiqiA2c=eHu&hLez#Dj1OeunD& z&w=gHncNTRv66S`BJK|@EVr1gJYwwO9wOnl61-I9+c<1x%V-OSP3&tpO%bOG;XEhV zmOT}ntNY>cP(VGW(IPXG?RSEL{1yo~&_9#&ubvBBhwPNddFKOH`poqh+4OPLD~j=r zy>NoGKYp%!lh)9DvcyY_-#wyI9<%lQ+lg!#uh7X9z@x#hN>8~>sJwl5g@^w`zh8wp@YA>Zm zOmF$gM}ymq9llPz?W=AZ5OixF&+9)3Jo^{*u@~$6zq)P{w~nrXEOYdXX?**MX=N@HpI5g?*w)BLMdBsJA z0=_=-uh!H5E7@NzSJ=l1dr`&`MsXi_opqGASw|et{vE!4lgHv1-fNE#?5!{7{cqyJ z9~F9jzVh$Rr-pN>Okh%-Q=Or@{QZ0?Be2XjQk_d>?h$}+HcANjoYeEMT!;&2r-YDQ zxa#-!(BN78&%$Sq|L4J<)fX<*^juyJ%Z0db?(12odM|!Y)%)`Mt3saHRqep-^AG1( d!?`%2{kQ;CyK)9qJ9EMr!hH(oKd=Pw{{Ws0U_$@^ literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-full.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/modern-uninstall-full.ico new file mode 100644 index 0000000000000000000000000000000000000000..a134f586c76a971b26dd8706ce3260cd7c4ab442 GIT binary patch literal 23558 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\uX% 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

jDm0>te=mzKyoAA-7tuaukm-bwk2ata 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

dLYQMF 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis-menu.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis-menu.ico new file mode 100644 index 0000000000000000000000000000000000000000..94396b40b02b2682986b410b441d8e16d39e893d GIT binary patch literal 39119 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis1-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis1-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..a37774cf3d64bf2d49b13938d17a5608f6dfa203 GIT binary patch literal 1078 zcmbu7F>>QD3`M`<%xF9N26DBNTVzj=>(Cw1iCwOwqj+YUlrB|df;^B?)&9W*f3{`eqLH-E)%uvjdO;f9N=o^%FW7vMW*Z%&{ru^r zzIT7!xnIzPY*mMkv}(C=u=SiB+|T@g=+hDXLu;Rm9)7)y9+9CZ)v)7!yH8ZuR)5-j zygr>;7hAMX@D>2CIq-@rZrm`~qFDV0+W8;x7%yW{uU_bvyj~|e^|;W&c`gJ#IL~7u zurgV0P<&yq-l8xPIAG(HgY#@9j>j0mWET$9Gl#7nuPCr_L)B~X^#z&s$Zr?{8$YsC zl#kC*`OD@0pJ_AqH$D2S!OzGvyh+0xQ+*=}^|v}pyBl>AV~cjEM}tY(81hNIUwFl< IvO6>X4xy1yC;$Ke literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install-alt.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install-alt.ico new file mode 100644 index 0000000000000000000000000000000000000000..855cdc3d30235c0f37cd1d1af88c885158e8ea99 GIT binary patch literal 13111 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d9409cf755210cbc2e2ff062365991eda9ef1fd GIT binary patch literal 11697 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 TviW4&HJ*4H_@w#2IxqhNqhBe> literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/nsis3-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..617a5470b93161c8eaa82eef964e02e45000a582 GIT binary patch literal 12533 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 KKeFO?tN#O)lB@v$ literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/orange-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..1db75f8e4a2470b7477f7a1ca6d536a898aad40a GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/pixel-uninstall.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/pixel-uninstall.ico new file mode 100644 index 0000000000000000000000000000000000000000..2003b2df819c9be5f2a03a99ee437182a059d0ed GIT binary patch literal 5390 zcmeHLyKdV+5FF?3xA=I9y(W_Yxm7;2nVLYqNjmz!ze-w`PAUfe){N zH`LGtgw>BX+$C}yj^EoSRNo))>+^f;b~{{MU7@aPJU%{Rzu&`qKXjUr`2^+@crhoy z64Du2S{ALDr77(Qh^4jyX61RB7pf4OmRuFc)M6|HvP?K6Nn!xg2HPnh+b~}26uK?d z(>6=?MSmyvIA|xYqM>xx6rjVlI7 zXIYBzmQ(7pjIR^PVx5)xDs?s1+gNMoI;+PwU*;2d$tU1?r7J$Eb458MoXhi~JSPNI zyhj*nxD_Ia9Z}*8R7OH0Xq2Mo5%7X&NMRn9(ahm#eegSY2RqQP5Ka|B$=zihb~(ptv4hvLH*HYJz% z{hk#wj7E=SbN7Ed{3nk(@i@Yx!UHy769StN*qG35UJ1E`eJi0Z!GYY7x)XhB`brF$ z-dRll!|V6LEu-9V#y+-5X^f2XJ|^D`(#xKopPTQ7`}_O(yJ6()W@tWvmvjQXGCFuL z=hDTnMn;))S(YxQ1i~smDlpdgp+MM}Wq3DVtjKV#R=ouqrsSo+a_TLsxCpHBD~l2Q z8HplSm^=N=t?{&l%YwjsWe-7U3&s~gSx!8Fb9Mq`;}K z38X0nMY&im^;Ni3Jw%{Ai>*|ELL+E`M$qyFzhx%0VgLXD literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/win-install.ico b/libs/NSIS/NSIS-source/Contrib/Graphics/Icons/win-install.ico new file mode 100644 index 0000000000000000000000000000000000000000..a5eb774b3e663f252446dfccd9c8770ed18067f1 GIT binary patch literal 1078 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/llama.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/llama.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1e1d94251ebe71c2d87b981a469c90c548ce95dd GIT binary patch literal 26494 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-branding.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nsis3-branding.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3da21fde116213800437db23f1fff6ae562d1272 GIT binary patch literal 154544 zcmeI5-H#Sm8NlEAS9s~AS6=qQOYi*)yeURg`r$<_0ZU*hL|mb=?gs)}OS^!46k66) zpbd>El>|eojWH%h6HV0E59lJLEQMXRKJ7FoPv+yynb|pW&YAbOnSFD1=FIav^ZU)2 znRoWx*>8OFm*4u*=(Def<@>Ah{R{d2`a`49L!&QCYc$#_%fIrq(dXZv&ybhBk8Eaw z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009UU)A-4^fAGKSOY7tx&*o4G1Rwwb2*gHU|Mzyj_39gcz4oWS|M4$O zVF`HMH;z0zvwZu``Y#}f&lL`sa6#;*)FT8NN zt0IZh2?1Ppf-#98xK2V-Cq?$``aggBrySdvf)ME0wcNw^myyV!2$Wu%;X0HKuX%Cp z6>n6*aUGQouf^cnE8eJr<2ouGUW>uCSG-XL$8}UXycUCNuXv*hj_as&cr6CkUhzg1 z9M@6l@LCM6z2c23IIg48;k6iCd&L`7a9l^F!)r0P_KG*E;JA)Thu30o?GF`<% zuD#-oDmbpA(&4ojTzkbERd8HKrNe76xb})Ss^GYeN{82CaP1XuRKal_l@71P;MyzR zsDk5Kp3)hW5r4&uxoi2y4Ih1YQ(pZMjwkXsyB5XwmhZ{~=;U=AbdRlTBRYH7;5g_W zPuItHAIL_ueyXI*IsU_+#dFB*ypl0=eQMAA%DwyAvT4hFS=u?|NCJ+VYm4a2_<(hf zmFrs3!`3}Mt{p`WSofH?ZX|lBy2rtF3(o4y@^g&_b^=dEILu$18^Ngbc(uDcO6i4a=Mdty*PK&$NT6^ zqWfzqZ^Y7deQy5b+S;1C5wAVh9z2kGVz^;qsUcCBH8gG*PWv42t_BMJ2}_U zijH4*a;~Qzo0xfghvW3lrK_EsrX`MJM(H-aal7TD8E{c@t{bs>`{M69aV>Eg<&Cp5 zu3dHpT*tZh>Z%ymng-*Vajo}Zv2H)VdC$`OH+mD%Ln2&jzq$6*cekE@{?xVCFUv*90H)a|p3OF}^Y>g5 z**Bk@8h&&n(79{JymafI0IvII9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4 zFRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG% z9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9x5ZQLy_-4FRuG%9xCIN z#fzQ%naNwPz7c8@$m>X8VPd)y*GG5GI%cF>Kmu;~ zuS?CP<3|?)8epmGTQ`>0*47&7)}kBfwur{Hi%okU7uV9qU3XEmqi!QQJLVV5)}bg|7yXc(m-=037y}goGk)AEZb!(gU z6K4~0e|)IXw6J5^6sAQ>a9kTQ-8R~}mbI>)yJRYvesr50{~Jxy8@Fex=S1V$ zQ0=_Y&h_ul|3)g2;r!ZxrnP~@f@xDGp;+goCVa7U9QcfzY#6BK+To8 zyKcK^iI3|@Tx-$Ue$q&{5iOhZhc~b2JjgQMVDDU5wp)|3;N=T!(dS7hS76Cpzn2r5o1)UAu_3=q?p)(T(d+uH_>o zlG^>wSng8IBDzX9u0y$QB)T}d*Po5D4O`rG8_|+iMt7s5fpnH*NL9hQ z)T%zrw-C?(OI^#^Q|@j#>eiwqshqVNo#myoTpLtXt4pow!+Z+?4Y10!^l{N`M9Vok z`&7An`c&S6=@j<1{4zz}+*MVp*RATqd!8t(w1LwHq~uJXYc5XHS1D~ zOPNzkKm)Y9w&>1@&SEywZA8mGI^J{DT5H##k?T_3rJ@_@)}m!aT(?tMyH-=zIo%e~ zj=FQAab2sdb%z$NwQl)Mw4}D*FtHrWi=uJeT4n8u?Oe-R@~M(6xLtG>zf^arXk6DS zYu%xp>)J!N4qK|bN;IxptE^p7OR2pM&pNjdozpF!KF!`o%T>27AZv4NR%@+Y2aVdr zwGl1pZ#|^5zAaXDR}I(Q zDmKyFT^rGIF(!Y9B@yHgrRA9kI)c4z&e0}&scu{wKHWC79m}}ZqNOcs$@5Pd=`M=S zHl(N<*WD^M(Og^?MQ3Zd>#h=AsvFnFPPdI(*YcDDIcQ7L()ZCWy6vKix^dmDViT>_ zb@ud+eLIvH?EDHZX30(C7ngIUAMbvtsB?fDmKw-UDt}P(%n?F(JfC@Gv(=q zE>+K`?MOfaEMA8@iZ1GICpxP+`;bGieqCyDDRXKGXn;A_!d#vU>i!T>>6v|`M4mya z@0rxr;MhTz>bMHsGyx4T=UR7*p{+}ep`PSw&;W6roW4c{zE+6qC>n5-Me(> z&K{F2q05&q)1^z7=;FnTbm77U zI)DB=ojZ4q&YnF>XU?3V)2C001BW03ZMWA zpa2S>01BW03ZMWApa2S>K&rsX<^2VlQaE{aa9Vr#_HLp6(T(Nk&H6$Ki8SMyi3QU| z9L-oNBvJ3U;IlJ+)6-YqRGL)1k+!XSS~;hM+OlnKte#MH{WedK-)$#keUMDN#r0lu; zJ{s>cFgk7qbaV_DKOG&>k*5I9QZOFTk*5I9QZOFTk*5I9QZOFTk*5I9QZOFTk*5I9 zQZOFTk*5I9QZOFTk*5I9QZOFTk*5I9Qt}y(t9WqnQgShtzAkYh^DvfLsg)C%gHaHP z70GX0Dv1KQlx=gf8+*rxM56J%Tu5$XLS#fT8&gC+B(G5;vLRWG29XQNY5ai5gk&^U zA@U&kj8%y&NH${)A_tPo*sTuT@ew?AF}}y~V9sRhZb_lct1aDbNFHM*k;oCrVjP3$ zisUekNpwUq7%hlyNOz+Z(Fy5nv?RJ9U5(a62c)BML5q1X%(&g?A;`@*Pn`Fuj%nPy zh7RUV#yW}OJXQ@MU5s@T8$>!78z44@bTAGNY18By19P%A*U-xPhopniSlQGX#;L}9 z_1}b1rbWm4Mh?cK7&HujdyS6hh+_|qJ@y6gdX3j>`_ZE2#On-RXFjXfneS%1O~XNu zvCj;TwQ#lHRlkgn;qpM{GWBN~`^Q>zb(^{uM%hp7Gmag_3C=mDT(|X_Z#jsRt1GG|1`%skc)qN8=H%o))! zGmrIy=xCiPb4GN`%wzo^I$Ed7oDm%}^H@KKj@GF%XGF)$Jk}4Qqjjpx89#=OKh=0s zW@hI9tho>N)iD0rTt@cV=2ZLB<}YSvKdIS|4lh|?PD_TGjllX)00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yJAZqRyRS{E2LF}Fw4+w9@RLKf4K}upvyLV%POcP^dNTdQ7W28d^cmAK^#T|h<(TaB`n_2&(4j2RWoj&{2L#fqvC}{bVzA68+qc56v3;_Jl*C}b z7@_@xo{f}7$_?Ecn4b^PR`zX7A;YmKKDtmx3Sw7`lp|DmbH0?Tir)ih7gtrukVx|L z71KyTobLD7BaJaKCK^adEWr0>5i%ia$dFhFqb#{F{@F!_O*VH#EQXP$=&vp@GA0(o znA*^?V_Z@Z3t{|#7$WD(-6fm~uwM&e)gP{d84B9V?%#2D$`pp*(l@IgVE-K^Q&{AtbZCY#!tKezkGFFnce%bl4sXQp%RIcM%K z%r0l=p83A-{(ke#ojZGXvi)nvcWfS9|F=!PJ|VKD8oH4RV2m;|;pV<9wIdu$CGcnr{2Bv2+B@i|e3x zlM0UOq;v!=2G>FHCKVjlN$Ch$46cLXO)5C9lhP5i7+eR%n^bUIC#553F}MzjH>u#b zPD)46VsIT4Z&JZ=os^EC#o#(9-lT%#Iw>7Ni@|kJyh#Peby7Nl7K7`cc#{f_>!fr9 zEe6*?@g@}<*GcIJS`4m(;!P?zu9MOcv>03m#hX-cTqmU?Xfe1BiZ`j?xK2t(&|+{M z6mL?&ah;TopvB-iDBh%k<2orFL5sn4P`pV6$8}OVf)<18pm>uCj_ag!1T6;FLGdOP z9M^J}&ZLZlD`vu7%YWQ3ymVT=ha;R$1cf$$?Lk0-J8xKxARIS(DlL-+t-JewPib&_3~)vkP`_wX|5fjjqx7qo+#I~ zqWi6Ta$I|g?y>F(aotFCUv*D{>lUJWsk`^CTZ`_W?tZ&|hoXC?yT`6O5#1-HDfKm>7Lcze_avFQ*f^D$=fuUb?<6dUe>;X6<~5DUsW8PGPJ5xeg@S>l8)jpgTL)>55KX zcXqC)_q=ar?`@vT%FD+(d6||to*8A@^qwt_7tM$dW#_sPtBWrk?!>jkX_Pn3$+-5} z8E~EE-m9ykuQd(&n!eWiL%w7BTDzmK>1(||nmsedj7ZH$#;>@nwsa>xoe3W8jH5m?YPvn&tWa)IkN|+0=bsR zp`UoSeswfl`?!V2_d%*HN%XNs8+z*rO!HbrkGTlHxiF z_9#hl9R+)oq_~cPJxWqsN5LK?DXybnkCGJEQLslzit8xYqa?+36zoxw;yMcUC`oZ0 z1$&gFxQ>E7N>W@$!5$?kuA^X&k`&ibut!OX>nPZxB*k?U>`{{9ItunENtgcka3_Ce zviQR8DD{)npTOLat(~}@`|+p!lQJ_Ffqx(W_WD~_S{q+~>+1R6eK%I|z-j-m6wj^DuUCF?ofCh+be{MO>#C49=+SQEfcHDB@DyZvI zhwq*{x=paWcKlmwS1$Q4t8XqYJh6R*r!IBmA%65BpaGV?UKg4Bgq1lWdiBkvwX3hs zAH7F@T>QgMoy##^Umc!#`o3Zoy-D#=*3=Tv083pDFZ}D=b31C|j7%`1P4Gs#t3*qD zUFt|We)J)r0hYU7ncrAnYouF?Zlv2G8rMEH-E+KL%Or2zMbVzRt!Q)1FP5!KEk4Sc zS^^qiWnY^~9=fYU*Xp*S<(2x{(oAXDy42DMtaKC50Bc;!RHtsYXoqesTE@eb`O=zo zsihNG=_a57*1N9O?IXHW_lRhjgKM|4){i!JU8dV#^r-IVA2e^TxG|wq0ut;*e7jaTC~K*wI$Q-prz}LjpaW*YAcz3_`P!cZ?sJB*aJ+)O(9rf9hYYR}C5 zb-P7NJ-AN9^(~^!j&k#jn2&BNTAt3uzdWY*G&{z13a(2;H_>fHpZ@umPVT?sm0g=w zUOr|O+X1elyRH=Nr`w7)Cu76q*(%+*j_bNcbe--I(Pny;Zd^xn?IpTecd2NHZd}K5 zEgvb7)D5nT-Fm9#5M8Ak*RfnT6J6+Td3BZu#S128VySLiM|3^2@Alb)Q_YtBciMv8 zqKmq5ZP9f*(EU|r$)cu--vH11xnduby&s%Tu=&ElFqh-`VU{{@|3H8&p-RORbv2dItdwu*$W} z@zHHX%WJgxRJnZmRDL<4Q@F?S%M^KYS5>XvwrURR9RxH$hijSU)~!X$SboLXRJRpv z-q9Cp)}-A-lg zR!v=x=yr(q)IA~^*R{%8PiWy<>z3a{OKSH86UV{4C>qzTRn~6U&b4eMpDHoI-J(tW zQr)GZab2sd^@Mh=YY*KzY^m-l(YS7{vUWo)rS?4hhP9i2AMMl8I{yE=``HJ~`)E1q z))UN_bF*4&?Ivi{KCW#?OFH?Cw`|gAkx!D_I^`4QI=da?+9K+9Udt@pMOvy$RA3}Jri^U_t?Hh+w7&fac%i@JJ5C< zeXT{yShkY;pES~46m6bJQ8%u;RcxdAxGst|Tlwp*5?!hr*VazAgId>emjgLyOVZM_ zZXexl(M8?3?pCplR_of_y`)sMPj~x>9?^|!Yp2^mt!qi=5bf6OFIwxyb+?Lbv|87- zqN{W_6>W9P9o1}kdZ0_y>lu3z&;X0);hv(4y4#61HJcAP6zkWe79V9zEddR1#I-P& z`-1x4L{w&)kCezgNcA<7+8R73=u$m5VVWkO0gkxV(^44gQd6iWyBah=TxX}RQNg%w zge&XG+V$*#yQH;~U395gGmllg2AI(}7Ot%GX5?3wnl1f_9LMoLP})+EX(_Z+jvlZDTQ1AhA}zF~l%s&92si-*gDB#G_yQ0SB`6Ab z6O~s=LOeozfyP8%_{Qi9Fed6dE(P9TX7~Id*5Jv$Ickp514J-y~(XGqW=v zzVpm%w~*b21wS7nefqcu(P-`7A?<6LcE1N@>+>s)5|xZIzE)^+*jLBzXQ=)3Z*=aL zU+Mhu6V!g{H2rb%6rDeDlHORE|bq0DSrot;B#a{AHQ{<*YP$)iVd2hh5_d|EePAU&Eth#nhQKjin=KW7!DW6e*|8W5&|f@e^oU)kNAhaT0BxJcVAET1`8uYiLK! zG%$-kr=e5wjmW8x;{sKC%=3)Bq z@eTCRh9~IIGn?qprf2EXEnDf6&0FZRtQ+Yb)VcLxvB(Zh%7rz1zG^XysbICF+N&z+;o7cS7H_ICQSvy(1&bkLPcm*}sH z7wMmC*Xa7ytMvDkD|F-fb^7<_O}csG2Hm=KOFsq*CKNyc6hHwKKmim$0Te(16hHwK zKmim$0Te(16hHx6fr8SqkWDrmyE}B&d^L2F(->J4I-mw}81pj2NOT%2LP>NQ``mHH zUQ^4vH&xE@ZsZt`Q`$sMlO5aU`DOrl?w{wOSm(|tFl^@Bd9tSjrAOcIeX6B(uD>y# z(u#?*Gk@d6IFCy2Y=2{QdNFbK24kEs-JH$U@vdsA6PIz0|5|dFn&%9R0S^N@1`KFE z939b7OaU=l!FWVRF$KhI1>+GN#S{>;6^uu86jMOVRxlpXQA`0bTfullM==G&Yz5;H z9mNz7vlWa-bQDuS%vMq}9`nWE%&nxvSh=85Br+Ao%Ejtpk;oJnHKHmMDc(4i5jEr( zVTW6|v1+MKRMn+bqL8AEQKCSkV55yF4k^~?APPeYHM)qRkRpv;h=Py;jUGfXNO49_ zq7bAoV;rIgq$p#Sb?G**;I^BkQvzPh1sSuJ*--Ag%d&zY#Tb2wsu~a}#F&5>6e+@( zkQfjtz{o)ih74}xA_hVRHgXb!AcGpYi2;xSjoE(JMN!wuV8*`7-45UHAMBgd#XOL) zn?zMzo)j{OvD?HXkpYZJ5R*d&Fcua$rsg<9vDvX!Q9<{IWB{XUXH9X8O|JF2|1FFx zEjo5@dWGeGDmL=M>x6PUhBkQM~GXXn}OLQ3cmZ$Vs=k?@6Bv>n@MrB0r z1iR;2oLZwYu-~kvz|#=l^Lj|4?OSJXs&9R+kEz}@_x54rPUX8II{N0}UWks|seD&N zN8dc$3(=7~mG6q^=$nUoAv$uW@?8-fee-ZHL`UvazAK`mZyxT2=*XSQcg6oh$ND(G z(3t7_H%srr@;JtO(#!DQ+q4HfluM@jKPcTx2aoULp6L0Y-Te&j!PsKd8cvw1|ovV~hKpP#MvM zj1pxTU2oTF5FJR3XnjbDq>j#aLbZrCq(;ojG)J5?qpf6&7)3JTvKHyaDAGC^97#o#Hj^h3# z2xBa=b2$t~jo7MP%$>*>F$_jV)UT6vq()R`vxwRxzoS8PAvNNp;#~8+rllJ#q64WP z=nM-f+ZZF-kmgvlkdlpdViai-Rn9s;_t`n&d zm65Kp<-_F~Tbdn6MpQ~%BeZO&WTR?FvIAYExIZ7FH6q(+L+WEu`{+U^QX|%wNH#(( zZ;Ef(uFT&7v}kv&k~&fU+%P**BR0yt_AsM~G>I-GBZlB-GXohVI*>Xs6h>BZlKI+& zg^i9$gBT8@I@|f|Vj@jqIE=Of%{rPTEn+B)U5Gj|hn+6^6oT_wBPs>%7uSQd3t)pm z3_(XmR7SaeM=^mtxmedp=^fdDu2b|68aA`B8*MDckg|=&Se)TP8bqt4WTQb;RVUIS znn=0E%;;+uJ2FNzkaCTcv1gYU(oWQoa*Z)!>~K4Y3@O*>_;^60q?@QAd$4m{o7f3& z+)MeNY*)t5j}D?yvMW(htbYxYVXRu{{AaO#dd4w7 z;WugSSnB>chv)k=8`p@}&3AbYHE~(puTNkrJQa0;BVhGp@3ZMWA Rpa2S>01BW03WT@-(SIXT=k)*p literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nullsoft.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/nullsoft.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d4145d4ff3a6834a40ca592067cfcad82daec58e GIT binary patch literal 26494 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange-uninstall.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange-uninstall.bmp new file mode 100644 index 0000000000000000000000000000000000000000..097d09429264c6444bcfbff3e0f9b53b5da41d76 GIT binary patch literal 52576 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 ZFOR=x{}X6%)qjCq_FrH<{|k(e{{zaz4F~`L literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/orange.bmp new file mode 100644 index 0000000000000000000000000000000000000000..196a5b7a7e0179fb9ac572b4c0dea3b6c9801687 GIT binary patch literal 52576 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 ICon?(A1_5If&c&j literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/win.bmp b/libs/NSIS/NSIS-source/Contrib/Graphics/Wizard/win.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5524eef945119e421d076d8fa9f8ded1205c1021 GIT binary patch literal 26494 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 Dp19ST literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nlf new file mode 100644 index 0000000000..0ebfb74630 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1078 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Friedel Wolff +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Installasie +# ^UninstallCaption +$(^Name) Verwydering +# ^LicenseSubCaption +: Lisensie-ooreenkoms +# ^ComponentsSubCaption +: Installasiekeuses +# ^DirSubCaption +: Installasiegids +# ^InstallingSubCaption +: Installeer tans +# ^CompletedSubCaption +: Voltooid +# ^UnComponentsSubCaption +: Verwyderingkeuses +# ^UnDirSubCaption +: Verwyderinggids +# ^ConfirmSubCaption +: Bevestiging +# ^UninstallingSubCaption +: Verwyder tans +# ^UnCompletedSubCaption +: Voltooid +# ^BackBtn +< V&orige +# ^NextBtn +&Volgende > +# ^AgreeBtn +&Regso +# ^AcceptBtn +Ek &aanvaar die ooreenkoms +# ^DontAcceptBtn +Ek aan vaar &nie die ooreenkoms nie +# ^InstallBtn +&Installeer +# ^UninstallBtn +&Verwyder +# ^CancelBtn +Kanselleer +# ^CloseBtn +&Sluit af +# ^BrowseBtn +&Blaai... +# ^ShowDetailsBtn +&Wys detail +# ^ClickNext +Klik op Volgende om verder te gaan. +# ^ClickInstall +Klik op Installeer om die installasie te begin. +# ^ClickUninstall +Klik op Verwyder om die verwydering te begin. +# ^Name +Naam +# ^Completed +Voltooid +# ^LicenseText +Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Klik op Regso as u die ooreenkoms aanvaar. +# ^LicenseTextCB +Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK +# ^LicenseTextRB +Lees die lisensieooreenkoms voordat u $(^NameDA) installeer. Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK +# ^UnLicenseText +Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Klik op Regso als u die ooreenkoms aanvaar. +# ^UnLicenseTextCB +Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. Merk die blokkie hieronder as u die ooreenkoms aanvaar. $_CLICK +# ^UnLicenseTextRB +Lees die lisensieooreenkoms voordat u $(^NameDA) verwyder. KIes die eerste keuse hieronder as u die ooreenkoms aanvaar. $_CLICK +# ^Custom +Aangepast +# ^ComponentsText +Kies die komponente wat u wil installeer en deselekteer dié wat u nie wil installeer nie. $_CLICK +# ^ComponentsSubText1 +Kies die installasietipe: +# ^ComponentsSubText2_NoInstTypes +Kies die komponente wat geïnstalleer moet word: +# ^ComponentsSubText2 +Of kies die komponente wat geïnstalleer moet word: +# ^UnComponentsText +Kies die komponente wat u wil verwyder en deselekteer dié wat u nie wil verwyder nie. $_CLICK +# ^UnComponentsSubText1 +Kies die verwyderingstipe: +# ^UnComponentsSubText2_NoInstTypes +Kies die komponente wat verwyder moet word: +# ^UnComponentsSubText2 +Of kies die komponente wat verwyder moet word: +# ^DirText +$(^NameDA) sal in die volgende gids geïnstalleer word. Om elders te installeer, klik op Blaai en kies 'n ander een. $_CLICK +# ^DirSubText +Installasiegids +# ^DirBrowseText +Kies die gids om $(^NameDA) in te installeer: +# ^UnDirText +$(^NameDA) gaan uit die volgende gids verwyder word. Om van elders af te verwyder, klik op Blaai en kies 'n ander gids. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Kies die gids om $(^NameDA) uit te verwyder: +# ^SpaceAvailable +"Beskikbare spasie: " +# ^SpaceRequired +"Vereiste spasie: " +# ^UninstallingText +$(^NameDA) sal uit die volgende gids verwyder word. $_CLICK +# ^UninstallingSubText +Verwydering uit: +# ^FileError +Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Staak om de installasie te stop,\r\nProbeer weer om weer te probeer of\r\nIgnoreer om dié lêer oor te slaan. +# ^FileError_NoIgnore +Fout met skryf na lêer: \r\n\r\n$0\r\n\r\nKlik Probeer weer om op nuut te probeer, of \r\nKanselleer om die installasie te stop. +# ^CantWrite +"Kon nie skyf nie: " +# ^CopyFailed +Kopiëring het misluk +# ^CopyTo +"Kopieer na " +# ^Registering +"Registreer tans: " +# ^Unregistering +"Deregistreer tans: " +# ^SymbolNotFound +"Kon nie simbool vind nie: " +# ^CouldNotLoad +"Kon nie laai nie: " +# ^CreateFolder +"Skep gids: " +# ^CreateShortcut +"Maak kortpad: " +# ^CreatedUninstaller +"Verwyderingsprogram gemaak: " +# ^Delete +"Verwyder lêer: " +# ^DeleteOnReboot +"Verwyder na herbegin van rekenaar: " +# ^ErrorCreatingShortcut +"Fout met maak van kortpad: " +# ^ErrorCreating +"Fout met skep: " +# ^ErrorDecompressing +Fout met uitpak van data! Korrupte installasielêer? +# ^ErrorRegistering +Fout met registrasie van DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Voer uit: " +# ^Extract +"Pak uit: " +# ^ErrorWriting +"Uitpak: fout met skryf na lêer " +# ^InvalidOpcode +Installasieprogram korrup: ongeldige opcode +# ^NoOLE +"Geen OLE vir: " +# ^OutputFolder +"Afvoergids: " +# ^RemoveFolder +"Verwyder gids: " +# ^RenameOnReboot +"Hernoem na herbegin van rekenaar: " +# ^Rename +"Hernoem: " +# ^Skipped +"Oorgeslaan: " +# ^CopyDetails +Kopieer detail na knipbord +# ^LogInstall +Boekstaaf die installasieproses +# ^Byte +G +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nsh new file mode 100644 index 0000000000..70423bc324 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Afrikaans.nsh @@ -0,0 +1,121 @@ +;Language: Afrikaans (1078) +;By Friedel Wolff + +!insertmacro LANGFILE "Afrikaans" = "Afrikaans" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Installasieslimmerd" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die installasie van $(^NameDA).$\r$\n$\r$\nDit word aanbeveel dat u alle ander programme afsluit voor die begin van die installasie. Dit maak dit moontlik om die relevante stelsellêers op te dateer sonder om die rekenaar te herlaai.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom by die $(^NameDA) Verwyderingslimmerd" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Hierdie slimmerd lei mens deur die verwydering van $(^NameDA).$\r$\n$\r$\nVoor die verwydering begin word, maak seker dat $(^NameDA) nie loop nie.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensie-ooreenkoms" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) installeer." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die blokkie hier onder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te installeer. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensie-ooreenkoms" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees die lisensie-ooreenkoms voordat u $(^NameDA) verwyder." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Regso om verder te gaan as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Merk die kiesblokkie hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kies die eerste keuse hieronder as u die ooreenkoms aanvaar. U moet die ooreenkoms aanvaar om $(^NameDA) te verwyder." +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om die res van die ooreenkoms te sien." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Kies komponente" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) geïnstalleer moet word." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Kies komponente" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies watter komponente van $(^NameDA) verwyder moet word." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrywing" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg die muis oor 'n komponent om sy beskrywing te sien." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Kies 'n komponent om sy beskrywing te sien." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Kies installasieplek" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies die gids waarin u $(^NameDA) wil installeer." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kies verwyderinggids" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies die gids waaruit u $(^NameDA) wil verwyder." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installeer tans" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) geïnstalleer word." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasie voltooid" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die installasie is suksesvol voltooi." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasie gestaak" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die installasie is nie suksesvol voltooi nie." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Verwyder tans" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Wag asb. terwyl $(^NameDA) van u rekenaar verwyder word." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwydering voltooi" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Verwydering is suksesvol voltooi." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwydering gestaak" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Verwydering is nie suksesvol voltooi nie." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Installasieslimmerd" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleer op uw rekenaar.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die installasie van $(^NameDA) te voltooi. Wil u nou oorbegin?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooi van die $(^NameDA) Verwyderingslimmerd" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van u rekenaar verwyder.$\r$\n$\r$\nKlik op Voltooi om hierdie slimmerd af te sluit." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Die rekenaar moet oorbegin word om die verwydering van $(^NameDA) te voltooi. Wil u nou oorbegin?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Begin nou oor" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ek wil later self oorbegin" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Laat loop $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Wys Leesmy-lêer" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooi" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Kies gids in Begin-kieslys" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies 'n gids in die Begin-kieslys vir $(^NameDA) se kortpaaie." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies die gids in die Begin-kieslys waarin die program se kortpaaie geskep moet word. U kan ook 'n nuwe naam gee om 'n nuwe gids te skep." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Moenie kortpaaie maak nie" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Verwyder $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Verwyder $(^NameDA) van u rekenaar." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Wil u definitief die installasie van $(^Name) afsluit?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Wil u definitief die verwydering van $(^Name) afsluit?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nlf new file mode 100644 index 0000000000..49cccf6712 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1052 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Përkthimi nga Besnik Bleta, besnik@programeshqip.org +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Rregullimi i $(^Name) +# ^UninstallCaption +Çinstalimi i $(^Name) +# ^LicenseSubCaption +: Marrëveshje Licence +# ^ComponentsSubCaption +: Mundësi Instalimi +# ^DirSubCaption +: Dosje Instalimi +# ^InstallingSubCaption +: Po instalohet +# ^CompletedSubCaption +: U plotësua +# ^UnComponentsSubCaption +: Mundësi Çinstalimi +# ^UnDirSubCaption +: Dosje Çinstalimi +# ^ConfirmSubCaption +: Ripohim +# ^UninstallingSubCaption +: Po çinstalohet +# ^UnCompletedSubCaption +: U plotësua +# ^BackBtn +< &Mbrapsht +# ^NextBtn +&Pasuesi > +# ^AgreeBtn +&Pajtohem +# ^AcceptBtn +&I pranoj kushtet e Marrëveshjes së Licencës +# ^DontAcceptBtn +&Nuk i pranoj kushtet e Marrëveshjes së Licencës +# ^InstallBtn +&Instaloje +# ^UninstallBtn +&Çinstaloje +# ^CancelBtn +Anuloje +# ^CloseBtn +&Mbylle +# ^BrowseBtn +Sh&fletoni… +# ^ShowDetailsBtn +Shfaq &hollësi +# ^ClickNext +Që të vazhdohet, klikoni Pasuesi. +# ^ClickInstall +Që të fillojë instalimi, klikoni Instaloje. +# ^ClickUninstall +Që të fillojë çinstalimi, klikoni Çinstaloje. +# ^Name +Emër +# ^Completed +U plotësua +# ^LicenseText +Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem. +# ^LicenseTextCB +Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK +# ^LicenseTextRB +Ju lutemi, para instalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK +# ^UnLicenseText +Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni Pajtohem. +# ^UnLicenseTextCB +Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, klikoni kutizën më poshtë. $_CLICK +# ^UnLicenseTextRB +Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni marrëveshjen e licencës. Nëse i pranoni tërë kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. $_CLICK +# ^Custom +Vetjake +# ^ComponentsText +U vini shenjë përbërësve që doni të instalohen dhe hiquani shenjën përbërësve që s’doni të instalohen. $_CLICK +# ^ComponentsSubText1 +Përzgjidhni llojin e instalimit: +# ^ComponentsSubText2_NoInstTypes +Përzgjidhni përbërësit për instalim: +# ^ComponentsSubText2 +Ose, përzgjidhni përbërësit e mundshëm që doni të instalohen: +# ^UnComponentsText +U vini shenjë përbërësve që doni të çinstalohen dhe hiquni shenjën përbërësve që s’doni të çinstalohen. $_CLICK +# ^UnComponentsSubText1 +Përzgjidhni llojin e çinstalimit: +# ^UnComponentsSubText2_NoInstTypes +Përzgjidhni përbërësit për çinstalim: +# ^UnComponentsSubText2 +Ose, përzgjidhni përbërësit e mundshëm që doni të çinstalohen: +# ^DirText +Rregullimi do ta instalojë $(^NameDA) në dosjen vijuese. Për instalim në një dosje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK +# ^DirSubText +Dosje Vendmbërritje +# ^DirBrowseText +Përzgjidhni dosjen ku të instalohet $(^NameDA): +# ^UnDirText +Rregullimi do të çinstalojë $(^NameDA) prej dosjes vijuese. Për çinstalim prej një dosjeje tjetër, klikoni Shfletoni dhe përzgjidhni një tjetër dosje. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Përzgjidhni dosjen prej nga ku të çinstalohet $(^NameDA): +# ^SpaceAvailable +"Hapësirë e mundshme: " +# ^SpaceRequired +"Hapësirë e nevojshme: " +# ^UninstallingText +$(^NameDA) do të çinstalohet prej dosjes vijuese. $_CLICK +# ^UninstallingSubText +Po çinstalohet prej: +# ^FileError +Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Ndërprite për të ndalur instalimin,\r\nRiprovo për të provuar sërish, ose\r\nShpërfille për të anashkaluar këtë kartelë. +# ^FileError_NoIgnore +Gabim në hapje kartele për shkrim: \r\n\r\n$0\r\n\r\nKlikoni Riprovo për të provuar sërish, ose\r\nAnuloje për të ndalur instalimin. +# ^CantWrite +"S’shkruhet dot: " +# ^CopyFailed +Kopjimi dështoi +# ^CopyTo +"Kopjoje tek " +# ^Registering +"Regjistrim: " +# ^Unregistering +"Çregjistrim: " +# ^SymbolNotFound +"S’u gjet dot simbol: " +# ^CouldNotLoad +"S’u ngarkua dot: " +# ^CreateFolder +"Krijo dosje: " +# ^CreateShortcut +"Krijo shkurtore: " +# ^CreatedUninstaller +"Krijo çinstalues: " +# ^Delete +"Fshi kartelë: " +# ^DeleteOnReboot +"Fshi gjatë rinisjes: " +# ^ErrorCreatingShortcut +"Gabim në krijim shkurtoresh: " +# ^ErrorCreating +"Gabim në krijimin e: " +# ^ErrorDecompressing +Gabim në çngjeshje të dhënash! Instalues i dëmtuar? +# ^ErrorRegistering +Gabim në regjistrim DLL-je +# ^ExecShell +"ExecShell: " +# ^Exec +"Ekzekuto: " +# ^Extract +"Përfto: " +# ^ErrorWriting +"Përftim: gabim në shkrim te kartela " +# ^InvalidOpcode +Instalues i dëmtuar: opcode i pavlefshëm +# ^NoOLE +"Pa OLE për: " +# ^OutputFolder +"Dosje përfundimesh: " +# ^RemoveFolder +"Hiq dosjen: " +# ^RenameOnReboot +"Riemërtoje gjatë rinisjes: " +# ^Rename +"Riemërtoje: " +# ^Skipped +"U anashkalua: " +# ^CopyDetails +Kopjo Hollësira Te E Papastra +# ^LogInstall +Regjistroje procesin e instalimit +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nsh new file mode 100644 index 0000000000..30f76f706f --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Albanian.nsh @@ -0,0 +1,129 @@ +;Language: Albanian (1052) +;Translation Besnik Bleta, besnik@programeshqip.org + +!insertmacro LANGFILE "Albanian" = "Shqip" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Mirë se vini te Rregullimi i $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ky do t’ju udhëheqë gjatë instalimit të $(^NameDA).$\r$\n$\r$\nKëshillohet që të mbyllni tërë aplikacionet e tjera, para se të nisni Rregullimin. Kjo bën të mundur përditësimin e kartelave të rëndësishme të sistemit pa u dashur të riniset kompjuteri juaj.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Mirë se vini te Çinstalimi i $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ky do t’ju udhëheqë gjatë çinstalimit të $(^NameDA).$\r$\n$\r$\nPara nisjes së çinstalimit, sigurohuni se $(^NameDA) s’është duke xhiruar.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Marrëveshje Licence" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ju lutemi, para se të instaloni $(^NameDA), shqyrtoni kushtet e licencës." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem, që të vazhdohet. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni më poshtë mundësinë e parë. Që të instalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Marrëveshje Licence" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ju lutemi, para çinstalimit të $(^NameDA), shqyrtoni kushtet e licencës." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Nëse i pranoni kushtet e marrëveshjes, klikoni Pajtohem, që të vazhdohet. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nëse pranoni kushtet e marrëveshjes, klikoni kutizën më poshtë. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nëse pranoni kushtet e marrëveshjes, përzgjidhni mundësinë e parë më poshtë. Që të çinstalohet $(^NameDA), duhet të pranoni marrëveshjen. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Për të parë pjesën e mbetur të marrëveshjes, shtypni tastin Page Down." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Përzgjidhni Përbërës" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të instalohen." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Zgjidhni Përbërës" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zgjidhni cilat anë të $(^NameDA) doni të çinstalohen." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Përshkrim" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Për të parë përshkrimin e një përbërësi, vendosni kursorin përsipër tij." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zgjidhni Vend Instalimi" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen tek e cila të instalohet $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Zgjidhni Vend Çinstalimi" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Zgjidhni dosjen prej së cilës të çinstalohet $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Po instalohet" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ju lutemi, prisni, ndërkohë që $(^NameDA) instalohet." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalim i Plotësuar" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Rregullimi u plotësua me sukses." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalimi u Ndërpre" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Rregullimi s’u plotësua me sukses." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Çinstalim" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ju lutemi, prisni, ndërsa $(^NameDA) çinstalohet." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Çinstalim i Plotë" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Çinstalimi u plotësua me sukses." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Çinstalimi u Ndërpre" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Çinstalimi s’u plotësua me sukses." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Po plotësohet Rregullimi i $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) u instalua në kompjuterin tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Që të mund të plotësohet instalimi i $(^NameDA), kompjuteri juaj duhet të riniset. Doni të riniset tani?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Po plotësohet Çinstalimi i $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) u çinstalua prej kompjuterit tuaj.$\r$\n$\r$\nPër mbylljen e procesit, klikoni Përfundoje." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Kompjuteri juaj duhet të riniset, që të mund të plotësohet çinstalimi i $(^NameDA). Doni të riniset tani?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Rinise tani" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Dua ta rinis dorazi më vonë" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Nis $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Shfaq Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Përfundoje" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Zgjidhni Dosje Menuje Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Zgjidhni një dosje Menuje Start për shkurtore $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Përzgjidhni dosjen e Menusë Start në të cilën do të donit të krijohen shkurtoret për programin. Mundeni edhe të jepni një emër për të krijuar një dosje të re." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Mos krijo shkurtore" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Çinstalo $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Hiqeni $(^NameDA) prej kompjuterit tuaj." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Jeni i sigurt se doni të dilet nga Rregullimi i $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeni i sigurt se doni të dilet nga Çinstalimi i $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Zgjidhni Përdorues" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Zgjidhni për cilët përdorues doni të instalohet $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Përzgjidhni nëse doni të instalohet $(^NameDA) vetëm për veten tuaj apo për tërë përdoruesit e këtij kompjuteri. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instaloje për këdo në këtë kompjuter" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instaloje vetëm për mua" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nlf new file mode 100644 index 0000000000..8157173712 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1025 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1256 +# RTL - anything else than RTL means LTR +RTL +# Translation by asdfuae@msn.com, updated by Rami Kattan +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +تنصيب $(^Name) +# ^UninstallCaption +إزالة $(^Name) +# ^LicenseSubCaption +إتفاقية‏ الترخيص : +# ^ComponentsSubCaption +خيارات التنصيب : +# ^DirSubCaption +مجلد التنصيب : +# ^InstallingSubCaption +تنصيب : +# ^CompletedSubCaption +إنتهى : +# ^UnComponentsSubCaption +خيارات الإزالة : +# ^UnDirSubCaption +مجلد الإزالة : +# ^ConfirmSubCaption +تأكيد : +# ^UninstallingSubCaption +إزالة : +# ^UnCompletedSubCaption +إنتهى : +# ^BackBtn +< ال&سابق +# ^NextBtn +ال&تالي > +# ^AgreeBtn +موافق& +# ^AcceptBtn +&أوافق على شروط اتفاقية الترخيص +# ^DontAcceptBtn +&لا أوافق على شروط اتفاقية الترخيص +# ^InstallBtn +&تنصيب +# ^UninstallBtn +&إزالة +# ^CancelBtn +إلغاء +# ^CloseBtn +إ&غلاق +# ^BrowseBtn +&عرض... +# ^ShowDetailsBtn +إ&ظهار التفاصيل +# ^ClickNext +إضغط على التالي للمتابعة. +# ^ClickInstall +إضغط على تنصيب لتشغيل التنصيب. +# ^ClickUninstall +إضغط على إزالة لتشغيل الإزالة. +# ^Name +الإسم +# ^Completed +إنتهى +# ^LicenseText +الرجاء مراجعة إتفاقية الترخيص قبل تنصيب $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، إضغط موافق. +# ^LicenseTextCB +الرجاء مراجعة إتفاقية الترخيص قبل تنصيب $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، إضغط على مربع المؤشر التالي. $_CLICK. +# ^LicenseTextRB +الرجاء مراجعة إتفاقية الترخيص قبل تنصيب $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، إختر الخيار الأول التالي. $_CLICK +# ^UnLicenseText +الرجاء مراجعة إتفاقية الترخيص قبل إزالة $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، إضغط موافق. +# ^UnLicenseTextCB +الرجاء مراجعة إتفاقية الترخيص قبل إزالة $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، اضغط على مربع المؤشر التالي. $_CLICK +# ^UnLicenseTextRB +الرجاء مراجعة إتفاقية الترخيص قبل إزالة $(^NameDA). عند الموافقة على جميع شروط الإتفاقية، إختر الخيار الأول التالي. $_CLICK +# ^Custom +إختياري +# ^ComponentsText +علّم المكونات المراد تنصيبها وإزل العلامة عن المكونات الغير مراد تنصيبها. $_CLICK +# ^ComponentsSubText1 +إختر نوع التنصيب: +# ^ComponentsSubText2_NoInstTypes +إختر المكونات للتنصيب: +# ^ComponentsSubText2 +أو، قم بإختيار المكونات الإختيارية المراد تنصيبها: +# ^UnComponentsText +علّم المكونات المراد إزالتها وأزل العلامة عن المكونات الغير مراد إزالتها. $_CLICK +# ^UnComponentsSubText1 +إختر نوع الإزالة: +# ^UnComponentsSubText2_NoInstTypes +إختر المكونات للإزالة: +# ^UnComponentsSubText2 +أو، إختر المكونات الإختيارية المراد إزالتها: +# ^DirText +سيتم تنصيب $(^NameDA) في المجلد التالي. للتنصيب في مجلد آخر، إضغط عرض وإختر مجلد آخر. $_CLICK +# ^DirSubText +مجلد الهدف +# ^DirBrowseText +إختر المجلد لتنصيب $(^NameDA) فيه: +# ^UnDirText +سيتم إزالة $(^NameDA) من المجلد التالي. للإزالة من مجلد آخر، إضغط عرض وأختر مجلد آخر. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +إختر المجلد لإزالة $(^NameDA) منه: +# ^SpaceAvailable +"المساحة المتوفرة: " +# ^SpaceRequired +"المساحة المطلوبة: " +# ^UninstallingText +سيتم إزالة $(^NameDA) من المجلد التالي. $_CLICK +# ^UninstallingSubText +إزالة من: +# ^FileError +حدث خلل أثناء فتح ملف للكتابة: \r\n\t\"$0\"\r\nإضغط إلغاء لإلغاء التنصيب،\r\nمحاولة لإعادة محاولة كتابة الملف،\r\n تجاهل لتخطي الملف +# ^FileError_NoIgnore +حدث خلل أثناء فتح ملف للكتابة: \r\n\t\"$0\"\r\nإضغط محاولة لإعادة محاولة كتابة الملف، أو\r\nإلغاء لإلغاء التنصيب +# ^CantWrite +"لا يستطيع الكتابة: " +# ^CopyFailed +فشل النسخ +# ^CopyTo +"نسخ إلى" +# ^Registering +"تسجيل: " +# ^Unregistering +"إلغاء تسجيل: " +# ^SymbolNotFound +"لم يتمكن من إيجاد الرمز :" +# ^CouldNotLoad +"لم يتمكن من تحميل :" +# ^CreateFolder +"إنشاء مجلد" +# ^CreateShortcut +"إنشاء إختصار: " +# ^CreatedUninstaller +"إنشاء مزيل: " +# ^Delete +"حذف ملف: " +# ^DeleteOnReboot +"حذف بعد إعادة التشغيل: " +# ^ErrorCreatingShortcut +"خلل أثناء إنشاء إختصار: " +# ^ErrorCreating +"خلل أثناء إنشاء :" +# ^ErrorDecompressing +خلل أثناء فتح البيانات المضغوطة! منصب تالف؟ +# ^ErrorRegistering +خلل أثناء تسجيل DLL +# ^ExecShell +"تنفيذ ExecShell:" +# ^Exec +"تنفيذ: " +# ^Extract +"إستخراج: " +# ^ErrorWriting +"إستخراج: خلل أثناء الكتابة إلى ملف " +# ^InvalidOpcode +المنصّب تالف: شفرة غير صالحة +# ^NoOLE +"لا توجد OLE لـِ: " +# ^OutputFolder +"مجلد الإخراج: " +# ^RemoveFolder +"إزالة مجلد: " +# ^RenameOnReboot +"إعادة تسمية بعد إعادة التشغيل: " +# ^Rename +"إعادة تسمية: " +# ^Skipped +"تخطى: " +# ^CopyDetails +نسخ التفاصيل إلى الذاكرة +# ^LogInstall +سجّل عملية التنصيب +# ^Byte +بايت +# ^Kilo + كيلو +# ^Mega + ميغا +# ^Giga + جيغا diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nsh new file mode 100644 index 0000000000..523104f1f1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Arabic.nsh @@ -0,0 +1,130 @@ +;Language: Arabic (1025) +;Translation by asdfuae@msn.com +;updated by Rami Kattan + +!insertmacro LANGFILE "Arabic" = "العربية" "Al-Arabiyyah" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "مرحبا بك في مرشد إعداد $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "سيساعدك هذا المرشد في تنصيب $(^NameDA).$\r$\n$\r$\nمن المفضل إغلاق جميع البرامج قبل التنصيب. سيساعد هذا في تجديد ملفات النظام دون الحاجة لإعادة تشغيل الجهاز.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "مرحبا بك في مرشد إزالة $(^NameDA) " + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "هذا المرشد سيدلّك أثناء إزالة $(^NameDA).$\r$\n$\r$\n قبل البدء بالإزالة، يرجى التأكد من أن $(^NameDA) غير شغّال.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "إتفاقية‏ الترخيص" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "الرجاء مراجعة إتفاقية‏ الترخيص قبل تنصيب $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "عند الموافقة على شروط الإتفاقية‏، إضغط أوافق للمتابعة. يجب الموافقة على الإتفاقية‏ لتنصيب $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "عند الموافقة على شروط الإتفاقية‏، علّم مربع العلامة التالي. يجب الموافقة على الإتفاقية‏ لتنصيب $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "عند الموافقة على شروط الإتفاقية، إختر الخيار الأول من التالي. يجب الموافقة على الإتفاقية لتنصيب $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "إتفاقية الترخيص" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "الرجاء مراجعة شروط الترخيص قبل إزالة $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "عند الموافقة على شروط الإتفاقية، إضغط على موافق. يجب الموافقة على الإتفاقية لإزالة $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "عند الموافقة على شروط الإتفاقية، علّم المربع العلامة التالي. يجب الموافقة على الإتفاقية لإزالة $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "عند الموافقة على شروط الإتفاقية، إختر الخيار الأول من التالي. يجب الموافقة على الإتفاقية لإزالة $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "إضعط مفتاح صفحة للأسفل لرؤية باقي الإتفاقية" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "إختر المكونات" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "إختر ميزات $(^NameDA) المراد تنصيبها." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "إختر المكونات" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "إختر ميزات $(^NameDA) المراد إزالتها." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "الوصف" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "أشر بالفأرة فوق أحد المكونات لرؤية الوصف" + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "إختر موقع التنصيب" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "إختر المجلد المراد تنصيب $(^NameDA) فيه." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "إختر موقع المزيل" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "إختر المجلد الذي سيزال منه $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "تنصيب" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "الرجاء الإنتظار أثناء تنصيب $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "إنتهى التنصيب" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "إنتهت عملية التنصيب بنجاح." + ${LangFileString} MUI_TEXT_ABORT_TITLE "إلغاء التنصيب" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "لم ينتهي التنصيب بنجاح." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "إزالة" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "الرجاء الإنتظار أثناء إزالة $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "إنتهى" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "إنتهت عملية الإزالة بنجاح." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "إلغاء الإزالة" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "لم تنتهي الإزالة بنجاح." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "إنهاء مرشد إعداد $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "لقد تم تنصيب $(^NameDA) على الجهاز$\r$\n$\r$\nإضغط إنهاء لإغلاق مرشد الإعداد." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "يجب إعادة تشغيل الجهاز لإنهاء تنصيب $(^NameDA). هل تريد إعادة التشغيل الآن؟" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "إنهاء مرشد إزالة $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "لقد تم إزالة $(^NameDA) من الجهاز.$\r$\n$\r$\n إضغط إنهاء لإغلاق المرشد." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "يجب إعادة تشغيل الجهاز لإنهاء إزالة $(^NameDA). هل تريد إعادة التشغيل الآن؟" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "أعد التشغيل الآن" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "أرغب في إعادة تشغيل الجهاز في وقت لاحق" + ${LangFileString} MUI_TEXT_FINISH_RUN "&شغل $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "اعرض& أقرأني" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&إنهاء" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "إختر مجلد قائمة ابدأ" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "إختر مجلد قائمة ابدأ لإختصارات $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "إختر المجلد في قائمة ابدأ الذي ستنشأ فيه إختصارات البرنامج. يمكن أيضا كتابة إسم لإنشاء مجلد جديد." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "لا تنشئ إختصارات" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "إزالة $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "إزالة $(^NameDA) من الجهاز." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "هل أنت متأكد من إغلاق منصّب $(^Name)؟" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "هل أنت متأكد من أنك الخروج من مزيل $(^Name)؟" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "اختر المستخدمين" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "حدد لمن من المستخدمين تريد تركيب $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "حدد لمن تريد تركيب $(^NameDA) لنفسك فقط أم لجميع مستخدمي الحاسب. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "تركيب لجميع مستخدمي هذا الحاسب" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "تركيب لي فقط" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nlf new file mode 100644 index 0000000000..12bd7a8ff1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1067 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1200 +# RTL - anything else than RTL means LTR +- +# Translation by Hrant Ohanyan (h.ohanyan@haysoft.org) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Տեղակայել $(^Name)-ը +# ^UninstallCaption +Ջնջել $(^Name)-ը +# ^LicenseSubCaption +: Արտոնագրային համաձայնություն +# ^ComponentsSubCaption +: Տեղակայելու ընտրանքները +# ^DirSubCaption +: Տեղակայելու թղթապանակը +# ^InstallingSubCaption +: Ֆայլերը պատճենվում են +# ^CompletedSubCaption +: Գործողությունը ավարտվեց +# ^UnComponentsSubCaption +: Տեղակայելու ընտրությունը +# ^UnDirSubCaption +: Ջնջվող թղթապանակը +# ^ConfirmSubCaption +: Հաստատեք +# ^UninstallingSubCaption +: Ֆայլերը ջնջվում են +# ^UnCompletedSubCaption +: Գործողությունը ավարտվեց +# ^BackBtn +« &Նախորդը +# ^NextBtn +&Հաջորդը » +# ^AgreeBtn +Համաձայն& եմ +# ^AcceptBtn +Ես &ընդունում եմ համաձայնագրի պայմանները +# ^DontAcceptBtn +Ես &չեմ ընդունում համաձայնագրի պայմանները +# ^InstallBtn +&Տեղակայել +# ^UninstallBtn +Ջն&ջել +# ^CancelBtn +Չեղարկել +# ^CloseBtn +&Փակել +# ^BrowseBtn +Դ&իտել ... +# ^ShowDetailsBtn +&Մանրամասն... +# ^ClickNext +Շարունակելու համար սեղմեք 'Առաջ'։ +# ^ClickInstall +Տեղակայելու համար սեղմեք 'Տեղակայել'։ +# ^ClickUninstall +Ծրագիրը ջնջելու համար սեղմեք 'Ջնջել'։ +# ^Name +Անունը +# ^Completed +Պատրաստ է +# ^LicenseText +$(^NameDA)-ը տեղակայելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ սեղմեք 'Համաձայն եմ'։ +# ^LicenseTextCB +$(^NameDA)-ը տեղակայելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ դրեք նիշը ներքևում։ $_CLICK +# ^LicenseTextRB +$(^NameDA)-ը տեղակայելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ ընտրեք ներքոնշյալներից առաջինը։ $_CLICK +# ^UnLicenseText +$(^NameDA)-ը ջնջելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ սեղմեք 'Համաձայն եմ'։ +# ^UnLicenseTextCB +$(^NameDA)-ը ջնջելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ դրեք նիշը ներքևում։ $_CLICK +# ^UnLicenseTextRB +$(^NameDA)-ը ջնջելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։ Եթե ընդունում եք այն՝ ընտրեք ներքոնշյալներից առաջինը։ $_CLICK +# ^Custom +Հարմարեցված +# ^ComponentsText +Ընտրեք այն բաղադրիչները, որոնք ցանկանում եք տեղակայել։ $_CLICK +# ^ComponentsSubText1 +Ընտրեք տեղակայելու եղանակը. +# ^ComponentsSubText2_NoInstTypes +Տեղակայելու համար ընտրեք բաղադրիչները. +# ^ComponentsSubText2 +կամ ընտրեք լրացուցիչ բաղադրիչներ. +# ^UnComponentsText +Ջնջելու համար ընտրեք բաղադրիչները։ $_CLICK +# ^UnComponentsSubText1 +Ընտրեք ջնջելու եղանակը. +# ^UnComponentsSubText2_NoInstTypes +Ընտրեք ջնջելու բաղադրիչները. +# ^UnComponentsSubText2 +կամ ջնջելու համար ընտրեք լրացուցիչ բաղադրիչներ։ +# ^DirText +Ծրագիրը կտեղակայի $(^NameDA)-ը նշված թղթապանակում։ Այլ թղթապանակում տեղակայելու համար սեղմեք 'Ընտրել' և ընտրեք այն։ $_CLICK +# ^DirSubText +Տեղակայելու թղթապանկը +# ^DirBrowseText +Նշեք $(^NameDA)-ի տեղակայելու թղթապանակը. +# ^UnDirText +Ծրագիրը կջնջի $(^NameDA)-ը նշված թղթապանակից։ Այլ թղթապանակից ջնջելու համար սեղմեք 'Ընտրել' և ընտրեք այն։ $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Ընտրեք թղթապանակը, որից պետք է ջնջել $(^NameDA)-ը. +# ^SpaceAvailable +"Հասանելի է. " +# ^SpaceRequired +"Պահանջվում է. " +# ^UninstallingText +$(^NameDA) ծրագիրը կջնջվի Ձեր համակարգչից։ $_CLICK +# ^UninstallingSubText +Ջնջվում է՝ +# ^FileError +Հնարավոր չէ բացել ֆայլը՝ գրանցելու համար։ \r\n\t"$0"\r\n'Դադարեցնել'՝ ընդհատել տեղակայումը,\r\n"Կրկնել"՝ կրկին փորձել,\r\n"Բաց թողնել"՝ բաց թողնել գործողությունը։ +# ^FileError_NoIgnore +Հնարավոր չէ բացել ֆայլը՝ գրանցելու համար։ \r\n\t"$0"\r\n'Կրկնել'՝ կրկին փորձել,\r\n'Դադարեցնել'՝ ընդհատել տեղակայումը։ +# ^CantWrite +"Հնարավոր չէ գրանցել " +# ^CopyFailed +Սխալ՝ պատճենելու ժամանակ +# ^CopyTo +"Պատճենել՝ " +# ^Registering +"Գրանցում. " +# ^Unregistering +"Վերագրանցում. " +# ^SymbolNotFound +"Հնարավոր չէ գտնել՝ " +# ^CouldNotLoad +"Հնարավոր չէ բացել. " +# ^CreateFolder +"Ստեղծվում է թղթապանակ " +# ^CreateShortcut +"Ստեղծվում են պիտակներ." +# ^CreatedUninstaller +"Ստեղծվում ջնջման ծրագիրը. " +# ^Delete +"Ֆայլերի ջնջում. " +# ^DeleteOnReboot +"Կջնջվի վերագործարկելուց հետո. " +# ^ErrorCreatingShortcut +"Սխալ՝ պիտակը ստեղծելիս. " +# ^ErrorCreating +"Սխալ. " +# ^ErrorDecompressing +Սխալ՝ տվյալները բացելու ժամանակ։ +# ^ErrorRegistering +Հնարավոր չէ գրանցել գրադարանը(DLL) +# ^ExecShell +"Ֆայլի կիրառում. " +# ^Exec +"Կատարվում է. " +# ^Extract +"Հանում է. " +# ^ErrorWriting +"Ֆայլերը գրելու սխալ. " +# ^InvalidOpcode +Տեղակայիչը վնասված է. +# ^NoOLE +"Չկա OLE՝" +# ^OutputFolder +"Տեղակայելու թղթապանակը. " +# ^RemoveFolder +"Թղթապանակի ջնջում. " +# ^RenameOnReboot +"Կանվանափոխվի վերագործարկելուց հետո. " +# ^Rename +"Անվանափոխում. " +# ^Skipped +"Բաց թողնած. " +# ^CopyDetails +Պատճենել տվյալները +# ^LogInstall +Տեղակայման հաշվետվություն +# byte +բայթ +# kilo + Կ +# mega + Մ +# giga + Գ \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nsh new file mode 100644 index 0000000000..07c5ad3e68 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Armenian.nsh @@ -0,0 +1,130 @@ +;Language: Armenian (1067) +;Translation by Hrant Ohanyan (h.ohanyan@haysoft.org) + +!insertmacro LANGFILE "Armenian" = "Հայերեն" "Hayeren" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ձեզ ողջունում է $(^NameDA) տեղակայիչը" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Այս ծրագիրը կտեղակայի $(^NameDA)-ը Ձեր համակարգչում։$\r$\n$\r$\nԽորհուրդ ենք տալիս փակել աշխատող բոլոր ծրագրերը։ Դա հնարավորություն կտա տեղակայելուց հետո խուսափել համակարգչը վերագործարկելուց։$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ձեզ ողջունում է $(^NameDA)-ը հեռացնելու ծրագիրը" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Այս ծրագիրը կջնջի $(^NameDA)-ը Ձեր համակարգչից։$\r$\n$\r$\nՋնջելուց առաջ համոզվեք, որ $(^NameDA) ծրագիրը բացած չէ։$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Արտոնագրային համաձայնություն" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)-ը տեղակայելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Եթե ընդունում եք համաձայնագիրը, ապա սեղմեք $\"Համաձայն եմ$\"։ Ծրագիրը տեղակայելու համար պետք է ընդունեք։" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Եթե ընդունում եք համաձայնագիրը՝ դրեք նիշը ներքևում։ Ծրագիրը տեղակայելու համար պետք է ընդունեք: $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Եթե ընդունում եք համաձայնագիրը՝ ընտրեք ներքոնշյալներից առաջինը։ Ծրագիրը տեղակայելու համար պետք է ընդունեք: $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Արտոնագրային համաձայնություն" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)-ը ջնջելուց առաջ ծանոթացեք արտոնագրային համաձայնությանը։" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Եթե ընդունում եք համաձայնագիրը՝ սեղմեք $\"Համաձայն եմ$\" կոճակը։ Ջնջելու համար պետք է ընդունեք։ $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Եթե ընդունում եք համաձայնագիրը՝ դրեք նիշը ներքևում։ Ջնջելու համար պետք է ընդունեք։ $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Եթե ընդունում եք համաձայնագիրը՝ ընտրեք ներքոնշյալներից առաջինը։ Ջնջելու համար պետք է ընդունեք։ $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Տեքստը կարդալու համար օգտագործեք կոճակներ՝ $\"PageUp$\" և $\"PageDown$\"։" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Տեղակայվող ծրագրի բաղադրիչները" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ընտրեք $(^NameDA)-ի բաղադրիչները, որոնք ցանկանում եք տեղակայել։" + +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Ծրագրի բաղադրիչները" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Ընտրեք $(^NameDA)-ի բաղադրիչները, որոնք ցանկանում եք ջնջել։" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Նկարագրությունը" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Մկնիկի սլաքը ուղղեք բաղադրիչի վրա՝ նկարագրությունը կարդալու համար։" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Մկնիկի սլաքը ուղղեք բաղադրիչի վրա՝ նկարագրությունը կարդալու համար։" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Տեղակայելու թղթապանակի ընտրություն" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Ընտրեք թղթապանակը, որտեղ պետք է տեղակայել $(^NameDA)-ը։" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Ջնջելու թղթապանակի ընտրություն" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Ընտրեք թղթապանակը, որտեղից պետք է ջնջել $(^NameDA)-ը։" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Ֆայլերը պատճենվում են" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Սպասեք, պատճենում է $(^NameDA)-ի ֆայլերը..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Տեղակայվեց" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Հաջողությամբ տեղակայվեց" + ${LangFileString} MUI_TEXT_ABORT_TITLE "Տեղակայումը ընդհատվել է։" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Տեղակայումը չի ավարտվել։" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ջնջում է" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Սպասեք, ջնջում է $(^NameDA)-ի ֆայլերը..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ջնջվեց" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ծրագիրը հաջողությամբ ջնջվեց։" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ջնջման գործողությունը ընդհատվել է։" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ծրագիրը ամբողջությամբ չի ջնջվել։" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)-ի տեղակայման աշխատանքի ավարտում" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)-ը տեղակայվեց։$\r$\n$\r$\nՍեղմեք $\"Պատրաստ է$\" կոճակը՝ տեղակայիչը փակելու համար։" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)-ի տեղակայումը ավարտելու համար պահանջվում է համակարգչի վերագործարկում: Վերագործարկե՞լ։" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)-ի ջնջելու գործողության ամփոփում " + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ծրագիրը ջնջվել է Ձեր համակարգչից։ $\r$\n$\r$\nՍեղմեք $\"Պատրաստ է $\" կոճակը՝ ծրագրից դուրս գալու համար։" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)-ի ջնջումը ավարտելու համար պահանջվում է համակարգչի վերագործարկում: Վերագործարկե՞լ։" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Այո, վերագործարկել համակարգիչը։" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ոչ, ես վերագործարկեմ ավելի ուշ։" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Բացել$(^NameDA)-ը" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ցուցադրել ReadMe ֆայլը" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Պատրաստ է" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Թղթապանակ՝ $\"Start$\" ընտրացանկում" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Ընտրեք $\"Start$\"-ի թղթապանակը՝ ծրագրի պիտակների համար" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Ընտրեք $\"Start$\"-ի թղթապանակը, որտեղ կստեղծվեն ծրագրի պիտակները։" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Չստեղծել պիտակներ" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)-ի ջնջում" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)-ը ջնջվում է համակարգչից։" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ընդհատե՞լ $(^Name)-ի տեղակայումը։" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Կանգնեցնե՞լ $(^Name)-ի ջնջումը։" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Ընտրել օգտվողներին" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Ընտրեք, թե որ օգտվողների համար եք ցանկանում տեղակայել $(^NameDA)-ը:" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Ընտրեք, թե ինչպես եք ցանկանում տեղակայել $(^NameDA)-ը՝ միայն Ձեզ համար, թե բոլոր օգտվողների: $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Տեղակայել բոլոր օգտվողների համար" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Տեղակայել միայն ինձ համար" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nlf new file mode 100644 index 0000000000..7d4e59d52b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit ;Asturian - Asturies +NLF v6 +# Language ID (none exists at the moment) +9997 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Marcos (marcoscostales@gmail.com). +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalación de $(^Name) +# ^UninstallCaption +Desinstalación de $(^Name) +# ^LicenseSubCaption +: Alcuerdu de Llicencia +# ^ComponentsSubCaption +: Opciones d'Instalación +# ^DirSubCaption +: Direutoriu d'Instalación +# ^InstallingSubCaption +: Instalando +# ^CompletedSubCaption +: Completáu +# ^UnComponentsSubCaption +: Opciones de Desinstalación +# ^UnDirSubCaption +: Direutoriu de Desinstalación +# ^ConfirmSubCaption +: Confirmación +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Completáu +# ^BackBtn +< &Atrás +# ^NextBtn +&Siguiente > +# ^AgreeBtn +A&ceuto +# ^AcceptBtn +A&ceuto los términos de la llicencia +# ^DontAcceptBtn +&Non aceuto los términos de la llicencia +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Encaboxar +# ^CloseBtn +&Zarrar +# ^BrowseBtn +&Restolar... +# ^ShowDetailsBtn +Ver &detalles +# ^ClickNext +Calca Siguiente pa siguir. +# ^ClickInstall +Calca Instalar pa entamar la instalación. +# ^ClickUninstall +Calca Desinstalar pa entamar la desinstalación. +# ^Name +Nome +# ^Completed +Completáu +# ^LicenseText +Por favor, revisa l'acuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, calca Aceuto. +# ^LicenseTextCB +Por favor, revisa l'alcuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, marca embaxo la caxella. $_CLICK +# ^LicenseTextRB +Por favor, revisa l'alcuerdu de llicencia enantes d'instalar $(^NameDA). Si aceutes tolos términos del alcuerdu, seleiciona embaxo la primer opción. $_CLICK +# ^UnLicenseText +Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, calca Aceuto. +# ^UnLicenseTextCB +Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, marca embaxo la caxella. $_CLICK. +# ^UnLicenseTextRB +Por favor, revisa l'alcuerdu de llicencia enantes de desinstalar $(^NameDA). Si aceutes tolos términos del alcuerdu, seleiciona embaxo la primer opción. $_CLICK +# ^Custom +Personalizada +# ^ComponentsText +Conseña los componentes que deseyes instalar y desconseña los componentes que nun quies instalar. $_CLICK +# ^ComponentsSubText1 +Tipos d'instalación: +# ^ComponentsSubText2_NoInstTypes +Seleiciona los componentes a instalar: +# ^ComponentsSubText2 +O selecciona los componentes opcionales que deseyes instalar: +# ^UnComponentsText +Conseña los componentes que deseyes desinstalar y desconseña los componentes que nun quieras desinstalar. $_CLICK +# ^UnComponentsSubText1 +Tipos de desinstalación: +# ^UnComponentsSubText2_NoInstTypes +Seleiciona los componentes a desinstalar: +# ^UnComponentsSubText2 +O seleiciona los componentes opcionales que deseyes desinstalar: +# ^DirText +El programa d'instalación instalará $(^NameDA) nel siguiente direutoriu. Pa instalar nun direutoriu distintu, calca Restolar y seleiciona otru direutoriu. $_CLICK +# ^DirSubText +Direutoriu de Destín +# ^DirBrowseText +Seleiciona'l direutoriu nel qu'instalará $(^NameDA): +# ^UnDirText +El programa d'instalación desinstalará $(^NameDA) del siguiente direutoriu. Pa desinstalar d'un direutoriu distintu, calca Restolar y seleiciona otru direutoriu. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Seleiciona'l direutoriu dende'l cual desinstalará $(^NameDA): +# ^SpaceAvailable +Espaciu disponible: +# ^SpaceRequired +Espaciu requeríu: +# ^UninstallingText +$(^NameDA) sedrá desinstaláu del siguiente direutoriu. $_CLICK +# ^UninstallingSubText +Desinstalando dende: +# ^FileError +Error abriendo ficheru pa escritura: \r\n\t"$0"\r\nCalca albortar p'anular la instalación,\r\nreintentar pa volver a intentar escribir el ficheru, u\r\nomitir pa inorar esti ficheru +# ^FileError_NoIgnore +Error abriendo ficheru pa escritura: \r\n\t"$0"\r\nCalca reintentar pa volver a intentar escribir el ficheru, o\r\nencaboxar p'anular la instalación +# ^CantWrite +"Nun pudo escribise: " +# ^CopyFailed +Falló la copia +# ^CopyTo +"Copiar a " +# ^Registering +"Rexistrando: " +# ^Unregistering +"Desaniciando rexistru: " +# ^SymbolNotFound +"Nun pudo atopase símbolu: " +# ^CouldNotLoad +"Nun pudo cargase: " +# ^CreateFolder +"Criar direutoriu: " +# ^CreateShortcut +"Criar accesu direutu: " +# ^CreatedUninstaller +"Criar desinstalador: " +# ^Delete +"Desaniciar ficheru: " +# ^DeleteOnReboot +"Desaniciar al reaniciu: " +# ^ErrorCreatingShortcut +"Fallu criando accesu direutu: " +# ^ErrorCreating +"Fallu criando: " +# ^ErrorDecompressing +¡Error descomprimiendo datos! ¿Instalador corruptu? +# ^ErrorRegistering +Fallu rexistrando DLL +# ^ExecShell +"Executar comandu: " +# ^Exec +"Executar: " +# ^Extract +"Estrayer: " +# ^ErrorWriting +"Extrayer: fallu escribiendo al ficheru " +# ^InvalidOpcode +Instalador corruptu: códigu d'operación non válidu +# ^NoOLE +"Ensin OLE pa: " +# ^OutputFolder +"Direutoriu de salida: " +# ^RemoveFolder +"Desaniciar direutoriu: " +# ^RenameOnReboot +"Renomar al reaniciu: " +# ^Rename +"Renomar: " +# ^Skipped +"Omitíu: " +# ^CopyDetails +Copiar Detalles al Cartafueyu +# ^LogInstall +Rexistrar procesu d'instalación +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nsh new file mode 100644 index 0000000000..a641214071 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Asturian.nsh @@ -0,0 +1,129 @@ +;Language: Asturian (1150) +;By Marcos (marcoscostales@gmail.com). + +!insertmacro LANGFILE "Asturian" = "Asturies" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienveníu al Asistente d'Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Esti programa instalará $(^NameDA) nel to ordenador.$\r$\n$\r$\nEncamiéntase que zarres toles demás aplicaciones enantes d'aniciar la instalación. Esto faerá posible anovar ficheros rellacionaos col sistema ensin tener que reaniciar el to ordenador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienveníu al Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Esti asistente guiaráte durante la desinstalación de $(^NameDA).$\r$\n$\r$\nEnantes d'aniciar la desinstalación, asegúrate de que $(^NameDA) nun se ta executando.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Alcuerdu de llicencia" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revisa los términos de la llicencia enantes d'instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si aceutes tolos términos del alcuerdu, seleiciona Aceuto pa siguir. Tienes d'aceutar l'alcuerdu pa instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si aceutes los términos del alcuerdu, conseña embaxo la caxella. Tienes d'aceutar los términos pa instalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si aceutes los términos del alcuerdu, seleiciona embaxo la primer opción. Tienes d'aceutar los términos pa instalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Alcuerdu de llicencia" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revisa los términos de la llicencia enantes de desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si aceutes tolos términos del alcuerdu, seleiciona Aceuto pa siguir. Tienes d'aceutar l'alcuerdu pa desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si aceutes los términos del alcuerdu, conseña embaxu la caxella. Tienes d'aceutar los términos pa desinstalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si aceutes los términos del alcuerdu, seleccione embaxu la primer opción. Tienes d'aceutar los términos pa desinstalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Calca Avanzar Páxina pa ver el restu del alcuerdu." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Seleición de componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleicione qué carauterístiques de $(^NameDA) deseyes instalar." + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Seleición de componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleicione qué carauterístiques de $(^NameDA) quies desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Allugue'l mur enriba d'un componente pa ver la so descripción." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escoyer llugar d'instalación" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escueye'l direutoriu pa instalar $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escoyer llugar de desinstalación" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escueye'l direutoriu dende'l cual se desinstalará $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espera mientres $(^NameDA) s'instala." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Completada" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación completóse correutamente." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Desaniciada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación nun se completó correutamente." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espera mientres $(^NameDA) se desinstala." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Completada" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación completóse correutamente." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Desaniciada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación nun se completó correutamente." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando l'Asistente d'Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) foi instaláu nel to sistema.$\r$\n$\r$\nCalca Finar pa zarrar esti asistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "El to sistema tien de reaniciase pa que pueda completase la instalación de $(^NameDA). ¿Quies reaniciar agora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando l'Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi desinstaláu del to sistema.$\r$\n$\r$\nCalca Finar pa zarrar esti asistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "El to ordenador tien que reaniciar pa finar la desinstalación de $(^NameDA). ¿Quies reiniciar agora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reaniciar agora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reaniciar manualmente más sero" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ver Lléame" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finar" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escoyer Carpeta del Menú Aniciu" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escueye una Carpeta del Menú Aniciu pa los accesos direutos de $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleiciona una carpeta del Menú Aniciu na que quieras criar los accesos direutos del programa. Tamién puedes introducir un nome pa criar una nueva carpeta." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non criar accesos direutos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Desaniciar $(^NameDA) del to sistema." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "¿De xuru que quies colar de la instalación de $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿De xuru que quies colar de la desinstalación de $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escoyer Usuarios" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escueye los usuarios pa los cuales quies instalar $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleiciona si quies instalar $(^NameDA) namái pa tí o pa tolos usuarios d'esti Ordenador.$(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalación pa cualisquier usuariu d'esti ordenador" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación namái pa mí" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nlf new file mode 100644 index 0000000000..b299b54cf4 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1069 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Iñaki San Vicente +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) -ren Instalazioa +# ^UninstallCaption +$(^Name) -ren Ezabaketa +# ^LicenseSubCaption +: Lizentzia hitzarmen agiria +# ^ComponentsSubCaption +: Instalazio aukerak +# ^DirSubCaption +: Instalazio karpeta +# ^InstallingSubCaption +: Instalatzen +# ^CompletedSubCaption +: Instalazioa burututa +# ^UnComponentsSubCaption +: Ezabaketa aukerak +# ^UnDirSubCaption +: Ezabaketa direktorioa +# ^ConfirmSubCaption +: Berretsi ezabaketa +# ^UninstallingSubCaption +: Ezabatzen +# ^UnCompletedSubCaption +: Ezabaketa burututa +# ^BackBtn +< &Atzera +# ^NextBtn +&Aurrera > +# ^AgreeBtn +Onartu +# ^AcceptBtn +Lizentzia hitzarmenaren baldintzak onartzen ditut. +# ^DontAcceptBtn +Ez ditut lizentzia hitzarmenaren baldintzak onartzen. +# ^InstallBtn +&Instalatu +# ^UninstallBtn +&Ezabatu +# ^CancelBtn +Ezeztatu +# ^CloseBtn +&Itxi +# ^BrowseBtn +&Arakatu... +# ^ShowDetailsBtn +Ikusi &zehaztasunak +# ^ClickNext +Sakatu Aurrera jarraitzeko. +# ^ClickInstall +Sakatu Instalatu instalazioarekin hasteko. +# ^ClickUninstall +Sakatu Ezabatu ezabaketarekin hasteko. +# ^Name +Izena +# ^Completed +Osatuta +# ^LicenseText +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu. +# ^LicenseTextCB +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK +# ^LicenseTextRB +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) instalatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK +# ^UnLicenseText +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, sakatu Onartu. +# ^UnLicenseTextCB +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, nabarmendu azpiko laukitxoa. $_CLICK. +# ^UnLicenseTextRB +Mesedez, aztertu lizentzia hitzarmena $(^NameDA) ezabatu aurretik. Baldintza guztiak onartzen badituzu, hautatu azpian lehen aukera. $_CLICK +# ^Custom +Norberaren nahien arabera +# ^ComponentsText +Nabarmendu instalatu nahi diren osagaiak, eta utzi zuri instalatu nahi ez direnak. $_CLICK +# ^ComponentsSubText1 +Hautatu instalazio mota: +# ^ComponentsSubText2_NoInstTypes +Hautatu instalatu beharreko osagaiak: +# ^ComponentsSubText2 +Edo hautatu instalatu beharreko aukerazko osagaiak: +# ^UnComponentsText +Nabarmendu ezabatu nahi diren osagaiak, eta utzi zuri ezabatu nahi ez direnak. $_CLICK +# ^UnComponentsSubText1 +Hautatu ezabaketa mota: +# ^UnComponentsSubText2_NoInstTypes +Hautatu ezabatu beharreko osagaiak: +# ^UnComponentsSubText2 +Edo hautatu ezabatu beharreko aukerazko osagaiak: +# ^DirText +Instalazio programak $(^NameDA) honako karpetan instalatuko du. Beste karpeta batean instalatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK +# ^DirSubText +Helburu karpeta +# ^DirBrowseText +Aukeratu $(^NameDA) instalatuko den karpeta: +# ^UnDirText +Instalazio programak $(^NameDA) honako karpetatik ezabatuko du. Beste karpeta batetik ezabatzeko, sakatu Arakatu eta aukeratu beste bat. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Aukeratu $(^NameDA) zein karpetatik ezabatuko den: +# ^SpaceAvailable +Leku erabilgarria: +# ^SpaceRequired +Behar den lekua: +# ^UninstallingText +$(^NameDA) ondorengo karpetan instalatuko da. $_CLICK +# ^UninstallingSubTex +Ezabatzen honako karpetatik: +# ^FileError +Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nSakatu Irten instalazioa ,\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko, u\r\njarraitu fitxategi hau alde batera utzita aurrera egiteko +# ^FileError_NoIgnore +Hutsegitea idazteko fitxategia irekitzean: \r\n\t"$0"\r\nsaiatu berriz fitxategi hau berriz idazten saiatzeko ,\r\nSakatu Irten instalazioa +# ^CantWrite +"Ezin izan da idatzi: " +# ^CopyFailed +Kopiatzeak hutsegin du +# ^CopyTo +"Kopiatu hona " +# ^Registering +"Erregistratzen: " +# ^Unregistering +"Erregistroa ezabatzen: " +# ^SymbolNotFound +"Ikurra ezin izan da aurkitu: " +# ^CouldNotLoad +"Ezin izan da kargatu: " +# ^CreateFolder +"Sortu karpeta: " +# ^CreateShortcut +"Sortu lasterbidea: " +# ^CreatedUninstaller +"Sortu ezabatzailea: " +# ^Delete +"Ezabatu fitxategia: " +# ^DeleteOnReboot +"Ezabatu berrabiarazitakoan: " +# ^ErrorCreatingShortcut +"Hutsegitea lasterbidea sortzerakoan: " +# ^ErrorCreating +"Hutsegitea sortzerakoan: " +# ^ErrorDecompressing +¡Hutsegitea datuak deskomprimatzean! Instalatzailea okerra? +# ^ErrorRegistering +Hutsegitea DLL erregistratzerakoan +# ^ExecShell +"Exekutatu agindua: " +# ^Exec +"Exekutatu: " +# ^Extract +"Kanporatu: " +# ^ErrorWriting +"Kanporaketa: hutsegitea fitxategira idazterakoan " +# ^InvalidOpcode +Instalatzailea okerra: ekintza kodea ez da baliozkoa +# ^NoOLE +"OLE-rik ez honentzako: " +# ^OutputFolder +"Irteera karpeta: " +# ^RemoveFolder +"Ezabatu karpeta: " +# ^RenameOnReboot +"Berrizendatu berrabiarazitakoan: " +# ^Rename +"Berrizendatu: " +# ^Skipped +"Alde batera utzitakoa: " +# ^CopyDetails +Kopiatu xehetasunak arbelera +# ^LogInstall +Instalazio prozesuaren erregistroa gorde +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nsh new file mode 100644 index 0000000000..e03a7c9788 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Basque.nsh @@ -0,0 +1,129 @@ +;Language: Basque (1069) +;By Iñaki San Vicente + +!insertmacro LANGFILE "Basque" = "Euskera" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren instalazio programara" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Programa honek $(^NameDA) zure ordenagailuan instalatuko du.$\r$\n$\r$\nAholkatzen da instalazioarekin hasi aurretik beste aplikazio guztiak ixtea. Honek sistemarekin erlazionatuta dauden fitxategien eguneratzea ahalbidetuko du, ordenagailua berrabiarazi beharrik izan gabe.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ongi etorri $(^NameDA) -ren ezabaketa programara" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Laguntzaile honek $(^NameDA)-ren ezabaketa prozesuan zehar gidatuko zaitu.$\r$\n$\r$\nEzabaketa hasi aurretik, ziurtatu $(^NameDA) martxan ez dagoela .$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizentzia hitzarmena" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) instalatu aurretik." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) instalatzeko. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizentzia hitzarmena" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Mesedez aztertu lizentziaren baldintzak $(^NameDA) ezabatu aurretik." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Baldintzak onartzen badituzu, sakatu Onartu aurrera egiteko. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Baldintzak onartzen badituzu, nabarmendu azpiko laukitxoa. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Baldintzak onartzen badituzu, hautatu azpian lehen aukera. Hitzarmena onartzea ezinbestekoa da $(^NameDA) ezabatzeko. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sakatu Av Pág hitzarmenaren gainontzeko atalak ikusteko." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Osagaien hautatzea" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri instalatu nahi duzun." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Osagaien hautatzea" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Hautatu $(^NameDA)-ren zein ezaugarri ezabatu nahi duzun." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Azalpena" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Jarri sagua osagai baten gainean dagokion azalpena ikusteko." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hautatu osagai bat bere azalpena ikusteko." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hautatu instalazioaren lekua" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) instalatzeko karpeta." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Aukeratu ezabatuko den karpeta" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Aukeratu $(^NameDA) zein karpetatik ezabatuko den." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalatzen" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) instalatzen den bitartean." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalazioa burututa" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalazioa zuzen burutu da." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalazioa ezeztatua" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalazioa ez da zuzen burutu." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Ezabatzen" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mesedez itxoin $(^NameDA) ezabatzen den bitartean." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ezabatzea burututa" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ezabatzea zuzen burutu da." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ezabatzea ezeztatuta" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ezabatzea ez da zuzen burutu." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)-ren instalazio laguntzailea osatzen" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) zure sisteman instalatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Zure sistema berrabiarazi behar duzu $(^NameDA)-ren instalazioa osatzeko. Orain Berrabiarazi nahi duzu?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)-ren ezabaketa laguntzailea osatzen" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) zure sistematik ezabatu da.$\r$\n$\r$\nSakatu Amaitu laguntzaile hau ixteko." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Zure ordenagailuak berrabiarazia izan behar du $(^NameDA)-ren ezabaketa osatzeko. Orain Berrabiarazi nahi duzu?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Berrabiarazi orain" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Neuk berrabiarazi geroago" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Exekutatu $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ikusi Readme.txt" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Amaitu" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Aukeratu Hasiera Menuko karpeta" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Aukeratu Hasiera Menuko karpeta bat $(^NameDA)-ren lasterbideentzako." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Aukeratu Hasiera Menuko karpeta bat, non programaren lasterbideak instalatu nahi dituzun. Karpeta berri bat sortzeko izen bat ere adierazi dezakezu." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ez sortu lasterbiderik" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Ezabatu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) zure sistematik ezabatzen du." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ziur zaude $(^Name)-ren instalaziotik irten nahi duzula?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ziur zaude $(^Name)-ren ezabaketa laguntzailetik irten nahi duzula?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Hautatu Erabiltzaileak" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Hautatu zein erabiltzailerentzat ezartzea nahi duzun $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Hautatu norentzat ezartzea nahi duzun $(^NameDA) zuretzat bakarrik edo ordenagailu honetako erabiltzaile guztientzat. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Ezarri ordenagailu hau erabiltzen duen edonorentzat" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Ezarri niretzat bakarrik" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nlf new file mode 100644 index 0000000000..7e710e43fb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1059 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by PrydesparBLR [ prydespar@outlook.com ] +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Усталяванне $(^Name) +# ^UninstallCaption +Выдаленне $(^Name) +# ^LicenseSubCaption +: Ліцэнзійнае пагадненне +# ^ComponentsSubCaption +: Параметры ўсталявання +# ^DirSubCaption +: Папка ўсталявання +# ^InstallingSubCaption +: Капіяванне файлаў +# ^CompletedSubCaption +: Працэдура завершена +# ^UnComponentsSubCaption +: Параметры выдалення +# ^UnDirSubCaption +: Папка выдалення +# ^ConfirmSubCaption +: Пацвярджэнне +# ^UninstallingSubCaption +: Выдаленне файлаў +# ^UnCompletedSubCaption +: Працэдура завершана +# ^BackBtn +< &Назад +# ^NextBtn +&Далей > +# ^AgreeBtn +&Прыняць +# ^AcceptBtn +Я &прымаю ўмовы Ліцэнзійнага пагаднення +# ^DontAcceptBtn +Я н&е прымаю ўмовы Ліцэнзійнага пагаднення +# ^InstallBtn +&Усталяваць +# ^UninstallBtn +Выд&аліць +# ^CancelBtn +Скасаваць +# ^CloseBtn +За&крыць +# ^BrowseBtn +А&гляд ... +# ^ShowDetailsBtn +Падра&бязнасці... +# ^ClickNext +Націсніце кнопку "Далей", каб працягнуць усталяванне праграмы. +# ^ClickInstall +Націсніце кнопку "Усталяваць", каб пачаць працэс ўсталявання праграмы. +# ^ClickUninstall +Націсніце кнопку "Выдаліць", каб пачаць працэс выдалення праграмы. +# ^Name +Імя +# ^Completed +Завершана +# ^LicenseText +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам усталявання $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, націсніце кнопку "Прыняць". +# ^LicenseTextCB +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам усталявання $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, націсніце на сцяжок ніжэй. $_CLICK +# ^LicenseTextRB +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам усталявання $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, выберыце першы варыянт з прапанаваных нiжэй. $_CLICK +# ^UnLicenseText +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам выдалення $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, нацiснiце кнопку "Прыняць". +# ^UnLicenseTextCB +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам выдалення $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, націсніце на сцяжок ніжэй. $_CLICK +# ^UnLicenseTextRB +Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад пачаткам выдалення $(^NameDA). Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, выберыце першы варыянт з прапанаваных нiжэй. $_CLICK +# ^Custom +Выбарачна +# ^ComponentsText +Выберыце кампаненты праграмы, якiя Вы жадаеце ўсталяваць. $_CLICK +# ^ComponentsSubText1 +Выберыце тып усталявання: +# ^ComponentsSubText2_NoInstTypes +Выберыце кампаненты праграмы, каб усталяваць iх: +# ^ComponentsSubText2 +або выберыце кампаненты праграмы, каб усталяваць iх па свайму жаданню: +# ^UnComponentsText +Выберыце кампаненты, якiя Вы жадаеце выдалiць, i знiмiце сцяжкі, выбраныя для тых кампанентаў, якiя не трэба выдаляць. $_CLICK +# ^UnComponentsSubText1 +Выберыце тып выдалення: +# ^UnComponentsSubText2_NoInstTypes +Выберыце кампаненты для выдалення: +# ^UnComponentsSubText2 +або выберыце кампаненты праграмы для выдалення: +# ^DirText +Праграма ўсталюе $(^NameDA) у выбраную папку. Каб усталяваць праграму ў iншай папкі, нацiснiце кнопку "Агляд" i выберыце патрэбную папку. $_CLICK +# ^DirSubText +Папка ўсталявання +# ^DirBrowseText +Выберыце папку для ўсталявання $(^NameDA): +# ^UnDirText +Праграма выдалiць $(^NameDA) з выбранай папкі. Каб выдаліць праграму з iншай папкі, нацiснiце кнопку "Агляд" i выберыце патрэбную папку. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Выберыце папку, з якой Вы жадаеце выдалiць $(^NameDA): +# ^SpaceAvailable +"Даступна на дыску: " +# ^SpaceRequired +"Патрэбна месца на дыску: " +# ^UninstallingText +Праграма выдалiць $(^NameDA) з Вашага камп'ютара. $_CLICK +# ^UninstallingSubText +Выдаленне з: +# ^FileError +Немагчыма адкрыць файл для запiсу: \r\n\r\n$0\r\n\r\nНацiснiце кнопку "Перапынiць", каб перапынiць усталяванне;\r\n"Паўтарыць", каб паўтарыць спробу запiсу ў файл;\r\n"Ігнараваць", каб прапусцiць гэта дзеянне. +# ^FileError_NoIgnore +Немагчыма адкрыць файл для запiсу: \r\n\r\n$0\r\n\r\nНацiснiце кнопку "Паўтарыць", каб паўтарыць спробу запiсу ў файл;\r\n"Скасаваць", каб перапынiць усталяванне. +# ^CantWrite +"Немагчыма запiсаць: " +# ^CopyFailed +Памылка пры капіяванні +# ^CopyTo +"Капіяванне ў " +# ^Registering +"Рэгiстрацыя: " +# ^Unregistering +"Выдаленне рэгiстрацыi: " +# ^SymbolNotFound +"Немагчыма знайсці сiмвал: " +# ^CouldNotLoad +"Немагчыма загрузiць: " +# ^CreateFolder +"Стварэнне папкі: " +# ^CreateShortcut +"Стварэнне ярлыка: " +# ^CreatedUninstaller +"Стварэнне праграмы выдалення: " +# ^Delete +"Выдаленне файла: " +# ^DeleteOnReboot +"Выдаленне пасля перазапуску камп'ютара: " +# ^ErrorCreatingShortcut +"Памылка стварэння ярлыка: " +# ^ErrorCreating +"Памылка стварэння: " +# ^ErrorDecompressing +Немагчыма выцягнуць дадзеныя. Магчыма пашкоджаны дыстрыбутыў. +# ^ErrorRegistering +Немагчыма зарэгістраваць бібліятэку (DLL) +# ^ExecShell +"Выкананне каманды абалонкі: " +# ^Exec +"Выкананне: " +# ^Extract +"Выманне: " +# ^ErrorWriting +"Выманне: памылка запiсу файла" +# ^InvalidOpcode +дыстрыбутыў пашкоджаны: код памылкi +# ^NoOLE +"Няма OLE для: " +# ^OutputFolder +"Папка усталявання: " +# ^RemoveFolder +"Выдаленне папкі: " +# ^RenameOnReboot +"Перайменаванне пасля перазапуску камп'ютара: " +# ^Rename +"Перайменаванне: " +# ^Skipped +"Прапушчана: " +# ^CopyDetails +Капіяваць звесткi ў буфер абмена +# ^LogInstall +Запiсваць у лог працэс усталявання +# byte +Б +# kilo + К +# mega + М +# giga + Г diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nsh new file mode 100644 index 0000000000..32f11a454e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Belarusian.nsh @@ -0,0 +1,129 @@ +;Language: Belarusian (1059) +;Translated by PrydesparBLR [ prydespar@outlook.com.by ] + +!insertmacro LANGFILE "Belarusian" = "Беларуская" "Bielaruskaja" ; Biełaruskaja + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Вас вiтае ўсталёўшчык $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Гэта праграма ўсталюе $(^NameDA) на Ваш камп'ютар.$\r$\n$\r$\nПерад усталяваннем прапануем закрыць усе праграмы, якія выконваюцца на дадзены момант. Гэта дапаможа ўсталёўшчыку абнавіць сістэмныя файлы без перазапуску камп'ютара.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Вы вырашылі выдаліць $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Гэта праграма выдаліць $(^NameDA) з Вашага камп'ютара.$\r$\n$\r$\nПерад выдаленнем пераканайцеся ў тым, што праграма $(^NameDA) не запушчана.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лiцензiйнае пагадненне" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад усталяваннем $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Калi Вы прымаеце ўмовы Лiцензiйнага пагаднення, націсніце кнопку $\"Прыняць$\". Гэта неабходна для ўсталявання праграмы." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Калi Вы прымаеце ўмовы Лiцензiйнага пагаднення, націсніце на сцяжок ніжэй. Гэта неабходна для ўсталявання праграмы. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Калi Вы прымаеце ўмовы Ліцэнзійнага пагаднення, выберыце першы варыянт з прапанаваных ніжэй. Гэта неабходна для ўсталявання праграмы. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ліцэнзійнае пагадненне" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Калі ласка, прачытайце ўмовы Ліцэнзійнага пагаднення перад выдаленнем $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, націсніце кнопку $\"Прыняць$\". Гэта неабходна для выдалення праграмы. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, націсніце на сцяжок ніжэй. Гэта неабходна для выдалення праграмы. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Калі Вы прымаеце ўмовы Ліцэнзійнага пагаднення, выберыце першы варыянт з прапанаваных ніжэй. Гэта неабходна для выдалення праграмы. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Выкарыстоўвайце кнопкi $\"PageUp$\" i $\"PageDown$\" для перамяшчэння па тэксце." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Кампаненты праграмы, якая ўсталёўваецца" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Выберыце кампаненты $(^NameDA), якія Вы жадаеце ўсталяваць." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Кампаненты праграмы" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Выберыце кампаненты $(^NameDA), якія Вы жадаеце выдаліць." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Апісанне" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Перамясціце курсор мышы на назву кампанента, каб прачытаць яго апісанне." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Выберыце кампанент, каб прачытаць яго апісанне." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Выбар папкі для ўсталявання" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Выберыце папку, у якую патрэбна ўсталяваць $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Выбар папкі для выдалення" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Выберыце папку, з якой патрэбна выдаліць $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Капіяванне файлаў" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Пачакайце, калі ласка, выконваецца капіяванне файлаў $(^NameDA) на Ваш камп'ютар..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Усталяванне завершана" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Усталяванне паспяхова завершана." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Усталяванне перарвана" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Усталяванне не завершана." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Выдаленне" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Пачакайце, калі ласка, выконваецца выдаленне файлаў $(^NameDA) з Вашага камп'ютара..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Выдаленне завершана" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Выдаленне праграмы паспяхова завершана." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Выдаленне перарвана" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Выдаленне выканана не поўнасцю." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Заканчэнне ўсталявання $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Усталяванне $(^NameDA) выканана.$\r$\n$\r$\nНацісніце кнопку $\"Гатова$\", каб выйсці." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Каб завершыць усталяванне $(^NameDA), неабходна перазапусціць камп'ютар. Ці жадаеце Вы зрабіць гэта зараз?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Заканчэнне выдалення $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Выдаленне $(^NameDA) з Вашага камп'ютара выканана.$\r$\n$\r$\nНацісніце кнопку $\"Гатова$\"каб выйсці." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Каб завершыць выдаленне $(^NameDA), неабходна перазапусціць камп'ютар. Ці жадаеце Вы зрабіць гэта зараз?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Так, перазапусціць камп'ютар зараз" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Не, перазапусціць камп'ютар пазней" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Запусціць $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Паказаць інфармацыю аб праграме" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Гатова" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Папка ў меню $\"Пуск$\"" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Выберыце папку ў меню $\"Пуск$\" для размяшчэння ярлыкоў праграмы." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Выберыце папку ў меню $\"Пуск$\", куды будуць змешчаны ярлыкі праграмы. Вы таксама можаце ўвесці іншае імя папкі." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Не ствараць ярлыкі" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Выдаленне $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Выдаленне $(^NameDA) з Вашага камп'ютара." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Вы сапраўды жадаеце скасаваць усталяванне $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Вы сапраўды жадаеце скасаваць выдаленне $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Выбраць карыстальнікаў" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Выберыце, для якіх карыстальнікаў Вы хочаце усталяваць $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Выберыце, ўсталёўваць $(^NameDA) толькі для сябе або для ўсіх карыстальнікаў гэтага камп'ютара. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Усталяваць для ўсіх карыстальнікаў" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Усталяваць толькі для бягучага карыстальніка" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nlf new file mode 100644 index 0000000000..dfb42183ce --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +5146 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Salih CAVKIC, cavkic@skynet.be +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Instalacija +# ^UninstallCaption +$(^Name) Uklanjanje +# ^LicenseSubCaption +: Licencno pravo korištenja +# ^ComponentsSubCaption +: Opcije instalacije +# ^DirSubCaption +: Izbor mape za instalaciju +# ^InstallingSubCaption +: Instaliranje +# ^CompletedSubCaption +: Završeno +# ^UnComponentsSubCaption +: Opcije uklanjanja +# ^UnDirSubCaption +: Mapa uklanjanja +# ^ConfirmSubCaption +: Potvrda +# ^UninstallingSubCaption +: Uklanjanje +# ^UnCompletedSubCaption +: Završeno uklanjanje +# ^BackBtn +< &Nazad +# ^NextBtn +&Dalje > +# ^AgreeBtn +&Prihvatam +# ^AcceptBtn +&Prihvatam uvjete licencnog ugovora +# ^DontAcceptBtn +&Ne prihvatam uvjete licencnog ugovora +# ^InstallBtn +&Instaliraj +# ^UninstallBtn +&Ukloni +# ^CancelBtn +Odustani +# ^CloseBtn +&Zatvori +# ^BrowseBtn +&Pregledaj... +# ^ShowDetailsBtn +Prikaži &detalje +# ^ClickNext +Pritisnite dugme 'Dalje' za nastavak. +# ^ClickInstall +Pritisnite dugme 'Instaliraj' za početak instalacije. +# ^ClickUninstall +Pritisnite dugme 'Ukloni' za početak uklanjanja. +# ^Name +Ime +# ^Completed +Završeno +# ^LicenseText +Molim pročitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'. +# ^LicenseTextCB +Molim pročitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, označite donji kvadratić. $_CLICK +# ^LicenseTextRB +Molim pročitajte licencu prije instaliranja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK +# ^UnLicenseText +Molim pročitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite 'Prihvatam'. +# ^UnLicenseTextCB +Molim pročitajte licencu prije uklanjanja programa $(^NameDA). Ako prihvatate sve uvjete ugovora, obilježite donji kvadratić. $_CLICK +# ^UnLicenseTextRB +Molim pročitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvatate sve uvjete ugovora, odaberite prvu opciju ispod. $_CLICK +# ^Custom +Podešavanje +# ^ComponentsText +Označite komponente koje želite instalirati. Instaliraju se samo označene komponente. Uklonite oznaku sa onih koje ne želite instalirati. $_CLICK +# ^ComponentsSubText1 +Izaberite tip instalacije: +# ^ComponentsSubText2_NoInstTypes +Odaberite komponente za instalaciju: +# ^ComponentsSubText2 +Ili po izboru označite komponente koje želite instalirati: +# ^UnComponentsText +Označite komponente koje želite ukloniti. Uklonite oznaku sa onih koje ne želite ukloniti. $_CLICK +# ^UnComponentsSubText1 +Izaberite tip uklanjanja: +# ^UnComponentsSubText2_NoInstTypes +Izaberite komponente za uklanjanje: +# ^UnComponentsSubText2 +Ili po izboru odaberite komponente koje želite da uklonite: +# ^DirText +Program $(^NameDA) će biti instaliran u sljedeću mapu. Za instalaciju na neku drugu mapu odaberite 'Pregledaj...' i odaberite drugu mapu. $_CLICK +# ^DirSubText +Odredišna mapa +# ^DirBrowseText +Izaberite mapu u koju želite instalirati program $(^NameDA): +# ^UnDirText +Program $(^NameDA) će biti uklonjen iz navedene mape. Za uklanjanje iz druge mape odaberite 'Pregledaj...' i označite drugu mapu. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Izaberite mapu iz koje ćete program $(^NameDA) ukloniti: +# ^SpaceAvailable +"Slobodno prostora na disku: " +# ^SpaceRequired +"Potrebno prostora na disku: " +# ^UninstallingText +Program $(^NameDA) će biti uklonjen iz sljedeće mape. $_CLICK +# ^UninstallingSubText +Uklanjanje iz: +# ^FileError +Greška prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Odustani\" za prekid instalacije,\r\n\"Ponovi\" za ponovni pokušaj upisivanja, ili\r\n\"Ignoriši\" za zanemarenje te datoteke +# ^FileError_NoIgnore +Greška prilikom otvaranja datoteke za upisivanje: \r\n\t"$0"\r\n\"Ponovi\" za ponovni pokušaj zapisivanja, ili\r\n\"Odustani\" za prekid instalacije +# ^CantWrite +"Nemoguće upisati: " +# ^CopyFailed +Greška prilikom kopiranja +# ^CopyTo +"Kopiraj u " +# ^Registering +"Prijava: " +# ^Unregistering +"Odjava: " +# ^SymbolNotFound +"Nemoguće naći simbol: " +# ^CouldNotLoad +"Nemoguće učitavanje: " +# ^CreateFolder +"Napravi mapu: " +# ^CreateShortcut +"Napravi prečicu: " +# ^CreatedUninstaller +"Program za uklanjanje: " +# ^Delete +"Obriši datoteku: " +# ^DeleteOnReboot +"Obriši prilikom ponovnog pokretanja: " +# ^ErrorCreatingShortcut +"Greška prilikom kreiranja prečica: " +# ^ErrorCreating +"Greška prilikom kreiranja: " +# ^ErrorDecompressing +Greška prilikom otpakivanja podataka! Oštećen instalacijski program? +# ^ErrorRegistering +Greška prilikom prijavljivanja DLLa +# ^ExecShell +"ExecShell: " +# ^Exec +"Izvrši: " +# ^Extract +"Otpakuj: " +# ^ErrorWriting +"Otpakivanje: greška upisivanja u datoteku " +# ^InvalidOpcode +Oštećena instalacijska datoteka: neispravna opkoda +# ^NoOLE +"Nema OLE za: " +# ^OutputFolder +"Izlazna mapa: " +# ^RemoveFolder +"Obriši mapu: " +# ^RenameOnReboot +"Preimenuj prilikom ponovnog startovanja: " +# ^Rename +"Preimenuj: " +# ^Skipped +"Preskočeno: " +# ^CopyDetails +Kopiraj detalje na Klembord +# ^LogInstall +Logiraj zapisnik procesa instalacije +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G + diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nsh new file mode 100644 index 0000000000..29c1bcb2a3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Bosnian.nsh @@ -0,0 +1,121 @@ +;Language: Bosnian (5146) +;By Salih Čavkić, cavkic@skynet.be + +!insertmacro LANGFILE "Bosnian" = "Bosanski" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u program za instalaciju $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ovaj program će instalirati $(^NameDA) na Vaš sistem. $\r$\n$\r$\nPreporučujemo da neizostavno zatvorite sve druge otvorene programe prije nego što definitivno započnete sa instaliranjem. To će omogućiti bolju nadogradnju određenih sistemskih datoteka bez potrebe da Vaš računar ponovo startujete. Instaliranje programa možete prekinuti pritiskom na dugme 'Odustani'.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u postupak uklanjanja programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj će Vas vodič provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog početka, molim zatvorite program $(^NameDA) ukoliko je slučajno otvoren.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licencni ugovor" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Molim pročitajte licencni ugovor $(^NameDA) prije instalacije programa." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za instalaciju programa $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, označite donji kvadratić. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licencni ugovor o pravu korištenja" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Molim pročitajte licencu prije uklanjanja programa $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate uslove licence, odaberite 'Prihvatam' za nastavak. Morate prihvatiti licencu za uklanjanje programa $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate uslove licence, označite donji kvadratić. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate uslove licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite 'Page Down' na tastaturi za ostatak licence." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite instalirati." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za uklanjanje" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente programa $(^NameDA) koje želite ukloniti." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite kursor od miša iznad komponente da biste vidjeli njezin opis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selektirajte jednu komponentu da vidite njezin opis." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odredište za instalaciju" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izaberite polazište za uklanjanje" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Selektirajte mapu iz koje želite ukloniti program $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instaliranje" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Molim pričekajte na završetak instalacije programa $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti uspješno završila." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije završila uspješno." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Molim Vas pričekajte da vodič završi uklanjanje $(^NameDA) programa." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje je završeno" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti završilo uspješno." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije završilo uspješno." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dovršavanje instalacije programa $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na Vaše računar.$\r$\n$\r$\nPritisnite dugme 'Kraj' za završetak." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Računar treba ponovno startovati za dovršavanje instalacije programa $(^NameDA). Želite li to učiniti sada?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završetak uklanjanja programa $(^NameDA) sa Vašeg sistema." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je uklonjen sa Vašeg računara.$\r$\n$\r$\nPritisnite dugme 'Kraj' za zatvaranje ovog prozora." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Vaš računar trebate ponovno startovati da dovršite uklanjanje programa $(^NameDA). Želite li da odmah sad ponovo startujete računar?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Startuj računar odmah sad" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno ću pokrenuti računar kasnije" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži datoteku &Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u Start meniju" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite ime za programsku mapu unutar Start menija." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite jednu mapu u Start meniju u kojoj želite da se kreiraju prečice programa. Možete također unijeti ime za novu mapu ili selektirati već postojeću." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemojte praviti prečice" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) će biti uklonjen sa Vašeg računara." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje $(^Name) programa?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nlf new file mode 100644 index 0000000000..14230265a8 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1150 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by KAD-Korvigelloù an Drouizig (drouizig@drouizig.org) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Staliañ ha kefluniañ $(^Name) +# ^UninstallCaption +Distaliañ $(^Name) +# ^LicenseSubCaption +: Aotre arverañ +# ^ComponentsSubCaption +: Dibaboù staliañ +# ^DirSubCaption +: Kavlec'h staliañ +# ^InstallingSubCaption +: O staliañ ar restroù +# ^CompletedSubCaption +: Echu eo +# ^UnComponentsSubCaption +: Dibaboù distaliañ +# ^UnDirSubCaption +: Kavlec'h distaliañ +# ^ConfirmSubCaption +: Kadarnañ +# ^UninstallingSubCaption +: O tistaliañ ar restroù +# ^UnCompletedSubCaption +: Echu eo +# ^BackBtn +< &Kent +# ^NextBtn +&War-lerc'h > +# ^AgreeBtn +&A-du emaon +# ^AcceptBtn +&Degemer holl dermoù al lañvaz emglev +# ^DontAcceptBtn +&Chom hep degemer termoù al lañvaz emglev +# ^InstallBtn +&Staliañ +# ^UninstallBtn +&Distaliañ +# ^CancelBtn +Nullañ +# ^CloseBtn +&Serriñ +# ^BrowseBtn +F&urchal... +# ^ShowDetailsBtn +Muioc'h a &ditouroù +# ^ClickNext +Klikit war « War-lerc'h » evit mont war-raok. +# ^ClickInstall +Klikit war « Staliañ » evit kregiñ gant ar staliadur. +# ^ClickUninstall +Klikit war « Distaliañ » evit kregiñ gant an distaliadur. +# ^Name +Anv +# ^Completed +Echu eo +# ^LicenseText +Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ». +# ^LicenseTextCB +Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK +# ^LicenseTextRB +Bezit aketus en ur lenn an aotre arverañ a-raok staliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, dizuzit an dibab kentañ a-zindan. $_CLICK +# ^UnLicenseText +Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war « A-du emaon ». +# ^UnLicenseTextCB +Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, klikit war al log a-zindan. $_CLICK +# ^UnLicenseTextRB +Bezit aketus en ur lenn an aotre arverañ a-raok distaliañ $(^NameDA) mar plij. Mar degemerit pep term eus an aotre, diuzit an dibab kentañ a-zindan. $_CLICK +# ^Custom +Diouzh ho kiz +# ^ComponentsText +Dibabit an elfennoù a fell deoc'h staliañ pe diziuzit an elfennoù a fell deoc'h leuskel a-gostez. $_CLICK +# ^ComponentsSubText1 +Dibabit pe seurt staliañ a vo : +# ^ComponentsSubText2_NoInstTypes +Dibabit an elfennoù da staliañ : +# ^ComponentsSubText2 +Pe dibabit an elfennoù diret a fell deoc'h staliañ : +# ^UnComponentsText +Dibabit an elfennoù a fell deoc'h distaliañ pe diziuzit an elfennoù a fell deoc'h mirout. $_CLICK +# ^UnComponentsSubText1 +Dibabit peseurt distaliañ a vo : +# ^UnComponentsSubText2_NoInstTypes +Dibabit an elfennoù da zistaliañ : +# ^UnComponentsSubText2 +Pe dibabit an elfennoù diret a fell deoc'h distaliañ : +# ^DirText +Staliet e vo $(^NameDA) gant ar goulev-mañ er c'havlec'h da-heul. Mar fell deoc'h dibab ur c'havlec'h all, klikit war « Furchal » ha dibabit ur c'havlec'h all. $_CLICK +# ^DirSubText +Kavlec'h bukenn +# ^DirBrowseText +Dibabit ar c'havlec'h e vo diazezet $(^NameDA) ennañ : +# ^UnDirText +Distaliet e vo $(^NameDA) gant ar goulev-mañ adalek ar c'havlec'h da heul. Ma fell deoc'h distaliañ adalek ur c'havlec'h all, klikit war « Furchal » ha diuzit ur c'havlec'h all. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Diuzit ar c'havlec'h evit distaliañ $(^NameDA) adalek : +# ^SpaceAvailable +"Egor kantenn vak : " +# ^SpaceRequired +"Egor kantenn rekis : " +# ^UninstallingText +Distaliet e vo $(^NameDA) adalek ar c'havelec'h da-heul. $_CLICK +# ^UninstallingSubText +Distaliañ adalek : +# ^FileError +Fazi en ur zigeriñ ur restr evit skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Paouez » evit paouez gant ar staliañ,\r\n« Adober » evit eseañ en-dro, pe\r\n« Tremen » evit leuskel a-gostez ar restr-mañ. +# ^FileError_NoIgnore +Fazi en ur zigeriñ ur restr a-benn skrivañ : \r\n\r\n$0\r\n\r\nKlikit war « Adober » evit esaeañ en-dro, pe\r\nwar « Nullañ » evit paouez gant ar staliañ. +# ^CantWrite +"N'haller ket skrivañ : " +# ^CopyFailed +Kopiañ faziet +# ^CopyTo +"Kopiañ da " +# ^Registering +"Oc'h enskrivañ : " +# ^Unregistering +"O tienskrivañ : " +# ^SymbolNotFound +"N'haller ket kavout ur simbolenn : " +# ^CouldNotLoad +"N'haller ket kargañ : " +# ^CreateFolder +"Krouiñ kavlec'h : " +# ^CreateShortcut +"Krouiñ berradenn : " +# ^CreatedUninstaller +"Skoazeller distaliañ krouet : " +# ^Delete +"Dilemel restr : " +# ^DeleteOnReboot +"Dilemel en ur adloc'hañ : " +# ^ErrorCreatingShortcut +"Fazi en ur grouiñ berradenn : " +# ^ErrorCreating +"Fazi en ur grouiñ : " +# ^ErrorDecompressing +Fazi en ur ziwaskañ stlenn ! Skoazeller staliañ gwastet ? +# ^ErrorRegistering +Fazi en ur enskrivañ an DLL +# ^ExecShell +"ExecShell : " +# ^Exec +"Lañsañ : " +# ^Extract +"Eztennañ : " +# ^ErrorWriting +"Eztennañ : fazi en ur skrivañ restr " +# ^InvalidOpcode +Skoazeller staliañ gwastet : opcode direizh +# ^NoOLE +"OLE ebet evit : " +# ^OutputFolder +"Kavlec'h ec'hank : " +# ^RemoveFolder +"Dilemel ar c'havlec'h : " +# ^RenameOnReboot +"Adenvel pa vez adloc'het : " +# ^Rename +"Adenvel : " +# ^Skipped +"Laosket a-gostez: " +# ^CopyDetails +Kopiañ ar munudoù er golver +# ^LogInstall +Tresañ an argerzh staliañ +# ^Byte +E +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nsh new file mode 100644 index 0000000000..a17d935960 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Breton.nsh @@ -0,0 +1,121 @@ +;Language: Breton (1150) +;By KAD-Korvigelloù An Drouizig + +!insertmacro LANGFILE "Breton" = "Brezhoneg" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Degemer mat e skoazeller staliañ $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ evit staliañ $(^NameDA).$\r$\n$\r$\nGwelloc'h eo serriñ pep arload oberiant er reizhiad a-raok mont pelloc'h gant ar skoazeller-mañ. Evel-se e c'heller nevesaat ar restroù reizhiad hep rankout adloc'hañ hoc'h urzhiataer.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Degemer mat er skoazeller distaliañ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Sturiet e viot gant ar skoazeller-mañ a-benn distaliañ $(^NameDA).$\r$\n$\r$\nEn em asurit n'eo ket lañset $(^NameDA) a-raok mont pelloc'h gant an distaliañ.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lañvaz emglev" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bezit aketus en ur lenn pep term eus al lañvaz a-raok staliañ $(^NameDA), mar plij." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « War-lerc'h ». Ret eo deoc'h degemer al lañvaz evit staliañ $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, diuzit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz a-benn staliañ $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lañvaz emglev" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Trugarez da lenn al lañvaz a-raok distaliañ $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Mar degemerit pep term eus al lañvaz, klikit war « A-du emaon » evit kenderc'hel. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Mar degemerit pep term eus al lañvaz, klikit war al log a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Mar degemerit pep term eus al lañvaz, dizuit an dibab kentañ a-zindan. Ret eo deoc'h degemer al lañvaz evit distaliañ $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pouezit war « Pajenn a-raok » evit lenn ar pajennoù eus al lañvaz da-heul." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dibab elfennoù" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h staliañ." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dibabit elfennoù" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dibabit pe elfenn(où) $(^NameDA) a fell deoc'h distaliañ." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskrivadenn" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Lakait ho logodenn a-zioc'h an elfenn evit gwelout he deskrivadenn." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Diuzuit an elfenn evit gwelout he deskrivadenn." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur staliañ" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h ma vo lakaet $(^NameDA) ennañ." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dibabit al lec'hiadur distaliañ" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dibabit ar c'havlec'h e vo dilamet $(^NameDA) dioutañ." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "O staliañ" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ staliet." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Echu eo gant ar staliañ" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kaset eo bet da benn mat ar staliañ." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Staliañ paouezet" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat ar staliañ." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O tistaliañ" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Gortozit mar plij, emañ $(^NameDA) o vezañ distaliet." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Echu eo gant an distaliañ" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Gant berzh eo bet kaset da benn an distaliañ." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Distaliañ paouezet" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "N'eo ket bet kaset da benn mat an distaliañ." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oc'h echuiñ staliañ $(^NameDA) gant ar skoazeller" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Staliet eo bet $(^NameDA) war hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn staliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oc'h echuiñ distaliañ $(^NameDA) gant ar skoazeller" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Distaliet eo bet $(^NameDA) diouzh hoc'h urzhiataer.$\r$\n$\r$\nKlikit war « Echuiñ » evit serriñ ar skoazeller-mañ." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ret eo hoc'h urzhiataer bezañ adloc'het evit ma vez kaset da benn distaliañ $(^NameDA). Ha fellout a ra deoc'h adloc'hañ diouzhtu ?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Adloc'hañ diouzhtu" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Fellout a ra din adloc'hañ diwezatoc'h dre zorn" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Lañsañ $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Diskouez ar restr Malennit" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Echuiñ" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Diskouez kavlec'h al Lañser loc'hañ" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dibabit ur c'havlec'h Lañser loc'hañ evit berradennoù $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Diuzit ar c'havlec'h Lañser loc'hañ e vo savet ennañ berradennoù ar goulevioù. Gallout a rit ingal reiñ un anv evit sevel ur c'havlec'h nevez." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Chom hep sevel berradennoù" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Distaliañ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dilemel $(^NameDA) adalek hoc'h urzhiataer." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat staliañ $(^Name) ?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ha sur oc'h e fell deoc'h kuitaat distaliañ $(^Name) ?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nlf new file mode 100644 index 0000000000..7803a14d12 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nlf @@ -0,0 +1,194 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1026 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Asparouh Kalyandjiev +# Updated v2 to v6 by Plamen Penkov +# Updated by Кирил Кирилов (DumpeR) +# +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Инсталиране на $(^Name) +# ^UninstallCaption +Изтриване на $(^Name) +#^LicenseSubCaption +: Лицензионно споразумение +#^ComponentsSubCaption +: Опции за инсталиране +# ^DirSubCaption +: Инсталиране в папка +#^InstallingSubCaption +: Инсталиране +#^CompletedSubCaption +: Завършване +# ^UnComponentsSubCaption +: Опции за изтриване +# ^UnDirSubCaption +: Изтриване от папка +# ^ConfirmSubCaption +: Потвърждение +#^UninstallingSubCaption +: Изтриване +#^UnCompletedSubCaption +: Завършване +# ^BackBtn +< &Назад +#^NextBtn +Н&апред > +# ^AgreeBtn +&Съгласен +# ^AcceptBtn +&Съгласен съм с условията на Лицензионното споразумение. +# ^DontAcceptBtn +&Не съм съгласен с условията на Лицензионното споразумение. +# ^InstallBtn +&Инсталирай +#^UninstallBtn +&Изтрий +# ^CancelBtn +&Отказ +#^CloseBtn +&Затвори +#^BrowseBtn +П&реглед... +#^ShowDetailsBtn +&Детайли +# ^ClickNext +Натиснете "Напред", за да продължите. +# ^ClickInstall +Натиснете "Инсталирай", за да започне инсталирането. +# ^ClickUninstall +Натиснете "Изтрий", за да започне изтриването. +# ^Name +Име +#^Completed +Край +# ^LicenseText +Моля прочетете Лицензионното споразумение преди да инсталирате $(^NameDA). Ако приемате всички условия на споразумението, натиснете "Съгласен". +# ^LicenseTextCB +Моля прочетете Лицензионното споразумение преди да инсталирате $(^NameDA). Ако приемате всички условия на споразумението, сложете отметка в полето по-долу. $_CLICK +# ^LicenseTextRB +Моля прочетете Лицензионното споразумение преди да инсталирате $(^NameDA). Ако приемате всички условия на споразумението, изберете първата опция по-долу. $_CLICK +# ^UnLicenseText +Моля прочетете Лицензионното споразумение преди да изтриете $(^NameDA). Ако приемате всички условия на споразумението, натиснете "Съгласен". +# ^UnLicenseTextCB +Моля прочетете Лицензионното споразумение преди да изтриете $(^NameDA). Ако приемате всички условия на споразумението, сложете отметка в полето по-долу. $_CLICK +# ^UnLicenseTextRB +Моля прочетете Лицензионното споразумение преди да изтриете $(^NameDA). Ако приемате всички условия на споразумението, изберете първата опция по-долу. $_CLICK +# ^Custom +Инсталиране по избор +#^ComponentsText +Изберете компонентите, които искате да бъдат инсталирани. $_CLICK +#^ComponentsSubText1 +Изберете тип инсталиране: +#^ComponentsSubText2_NoInstTypes +Изберете компоненти: +#^ComponentsSubText2 +Или изберете компонентите, които искате да бъдат инсталирани: +# ^UnComponentsText +Сложете отметка пред компонентите, които искате да изтриете, а тези които не искате да изтриете оставете без отметка. $_CLICK +# ^UnComponentsSubText1 +Изберете типа на изтриване: +# ^UnComponentsSubText2_NoInstTypes +Изберете компонентите за изтриване: +# ^UnComponentsSubText2 +Или, изберете допълнителни компоненти за изтриване: +# ^DirText +Програмата ще инсталира $(^NameDA) в посочената папка. За да инсталирате в друга папка, натиснете "Преглед" и изберете друга папка. $_CLICK +# ^DirSubText +Целева папка +# ^DirBrowseText +Изберете папка, в която да се инсталира $(^NameDA): +# ^UnDirText +Програмата ще изтрие $(^NameDA) от следната папка. За да изтриете от друга папка, натиснете "Преглед" и изберете друга папка. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Изберете папката от която да се изтрие $(^NameDA): +# ^SpaceAvailable +"Свободно пространство: " +#^SpaceRequired +"Необходимо пространство: " +# ^UninstallingText +$(^NameDA) ще бъде изтрита от следната папка. $_CLICK +# ^UninstallingSubText +Изтриване от: +# ^FileError +Грешка при отваряне на файла за запис: \r\n\t"$0"\r\nНатиснете "Прекрати", за да прекратите инсталирането, "Повтори", за да опитате отново или "Игнорирай", за да пропуснете този файл +# ^FileError_NoIgnore +Грешка при отваряне на файла за запис: \r\n\t"$0"\r\nНатиснете "Повтори", за да опитате отново или "Прекрати", за да прекратите инсталирането. +# ^CantWrite +"Неуспешно записване на: " +#^CopyFailed +Копирането неуспешно +# ^CopyTo +"Копиране на " +# ^Registering +"Регистриране на: " +# ^Unregistering +"Дерегистриране на: " +#^SymbolNotFound +"Символът не е намерен: " +# ^CouldNotLoad +"Неуспешно зареждане на: " +# ^CreateFolder +"Създаване на папка: " +# ^CreateShortcut +"Създаване на пряк път: " +#^CreatedUninstaller +"Създаване на програма за изтриване: " +# ^Delete +"Изтриване на: " +#^DeleteOnReboot +"Изтриване след рестарт: " +#^ErrorCreatingShortcut +"Грешка при създаване на прекия път: " +#^ErrorCreating +"Грешка при създаване на: " +# ^ErrorDecompressing +Грешка при декомпресиране на данните! Вероятно инсталационния пакет е повреден. +# ^ErrorRegistering +Грешка при регистриране на DLL +#^ExecShell +"ExecShell: " +#^Exec +"Изпълнение на: " +#^Extract +"Извличане на: " +#^ErrorWriting +"Извличане на: грешка при запис във файл " +#^InvalidOpcode +Пакета е повреден: грешен код на операция +# ^NoOLE +"Няма OLE за: " +#^OutputFolder +"Инсталиране в папка: " +#^RemoveFolder +"Изтриване на папка: " +#^RenameOnReboot +"Преименуване при рестарт: " +# ^Rename +"Преименуване на: " +#^Skipped +"Пропускане на: " +# ^CopyDetails +Копиране на данните в буфера +# ^LogInstall +Записване на отчет за инсталирането +# ^Byte +Б +# ^Kilo + К +# ^Mega + М +# ^Giga + Г \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nsh new file mode 100644 index 0000000000..74c4c078df --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Bulgarian.nsh @@ -0,0 +1,124 @@ +;Language: Bulgarian (1026) +;Translated by Asparouh Kalyandjiev [acnapyx@sbline.net] +;Review and update from v1.63 to v1.68 by Plamen Penkov [plamen71@hotmail.com] +;Updated by Кирил Кирилов (DumpeR) [dumper@data.bg] +; + +!insertmacro LANGFILE "Bulgarian" = "Български" "Balgarski" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добре дошли в Съветника за инсталиране на $(^NameDA)!" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Той ще инсталира $(^NameDA) на вашия компютър.$\r$\n$\r$\nПрепоръчва се да затворите всички други приложения, преди да продължите. Това ще позволи на програмата да обнови някои системни файлове, без да се рестартира компютъра.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добре дошли в Съветника за изтриване на $(^NameDA)!" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Той ще ви помогне да изтриете $(^NameDA) от вашия компютър.$\r$\n$\r$\nПреди да продължите, уверете се че $(^NameDA) не е стартирана в момента.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензионно споразумение" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Моля запознайте се Лицензионното споразумение преди да продължите." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ако приемате условията на споразумението, натиснете $\"Съгласен$\", за да продължите. Трябва да приемете споразумението, за да инсталирате $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако приемате условията на споразумението, сложете отметка в полето по-долу. Трябва да приемете споразумението, за да инсталирате $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако приемате условията на споразумението, изберете първата опция по-долу. Трябва да приемете споразумението, за да инсталирате $(^NameDA) $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензионно споразумение" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Моля запознайте се лицензионните условия преди да изтриете $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ако приемате условията на споразуменито, натиснете $\"Съгласен$\" за да продължите. Трябва да приемете споразумението, за да изтриете $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако приемате условията на споразумението, сложете отметка в полето по-долу. Трябва да приемете споразумението, за да изтриете $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако приемате условията на споразуменито, изберете първата опция по-долу. Трябва да приемете споразумението, за да изтриете $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Натиснете клавиша $\"Page Down$\", за да видите останалата част от споразумението." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Избор на компоненти" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Изберете кои компоненти на $(^NameDA) искате да инсталирате." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Избор на компоненти" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Изберете кои компоненти на $(^NameDA) искате да изтриете." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Описание" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Преминете с мишката над определен компонент, за да видите описанието му." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Изберете компонент, за да видите описанието му." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Избор на папка за инсталиране" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Изберете папката, в която да се инсталира $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Избор на папка за изтриване" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Изберете папката, от която да се изтрие $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Инсталиране" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Изчакайте, инсталират се файловете на $(^NameDA)..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Инсталирането завърши." + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Инсталирането завърши успешно." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Инсталирането прекратено." + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Инсталирането не завърши успешно." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Изтриване" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Изчакайте, изтриват се файловете на $(^NameDA)..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Край" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Изтриването завърши успешно." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Изтриването прекратено." + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Изтриването не завърши напълно." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Приключване на Съветника за инсталиране на $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Инсталирането на $(^NameDA) е завършено.$\r$\n$\r$\nНатиснете бутона $\"Край$\", за да затворите Съветника." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Компютърът трябва да бъде рестартиран, за да завърши инсталирането на $(^NameDA). Искате ли да рестартирате сега?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Приключване на Съветника за изтриване на $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Програмата $(^NameDA) беше изтрита от вашия компютър.$\r$\n$\r$\nНатиснете $\"Край$\" за да затворите този Съветник." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Компютърът ви трябва да се рестартира, за да приключи успешно изтриването на $(^NameDA). Искате ли да рестартирате сега?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Да, рестартирай сега" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Не, ще рестартирам по-късно" + ${LangFileString} MUI_TEXT_FINISH_RUN "Стартирай $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Покажи файла $\"ReadMe$\"" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Край" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Избор на папка в менюто $\"Старт$\"" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Изберете папка в менюто $\"Старт$\" за преки пътища към програмата." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Изберете папка в менюто $\"Старт$\", в която искате да създадете преки пътища към програмата. Можете също така да въведете име, за да създадете нова папка." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Не създавай преки пътища" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Изтриване на $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Изтриване на $(^NameDA) от вашия компютър." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурни ли сте, че искате да прекратите инсталирането на $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурни ли сте, че искате да прекратите изтриването на $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nlf new file mode 100644 index 0000000000..8328c26623 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +1027 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by falanko +# Corrections by Toni Hermoso Pulido +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instal·lació de l'aplicació $(^Name) +# ^UninstallCaption +Desinstal·lació de l'aplicació $(^Name) +# ^LicenseSubCaption +: Acord de llicència +# ^ComponentsSubCaption +: Opcions d'instal·lació +# ^DirSubCaption +: Carpeta d'instal·lació +# ^InstallingSubCaption +: S'està instal·lant +# ^CompletedSubCaption +: S'ha acabat +# ^UnComponentsSubCaption +: Opcions de desinstal·lació +# ^UnDirSubCaption +: Carpeta de desinstal·lació +# ^ConfirmSubCaption +: Confirmació +# ^UninstallingSubCaption +: S'està desinstal·lant +# ^UnCompletedSubCaption +: No s'ha acabat +# ^BackBtn +< En&rere +# ^NextBtn +En&davant > +# ^AgreeBtn +Hi estic d'a&cord +# ^AcceptBtn +&Accepto els termes de l'acord de llicència +# ^DontAcceptBtn +&No accepto els termes de l'acord de llicència +# ^InstallBtn +&Instal·la +# ^UninstallBtn +&Desinstal·la +# ^CancelBtn +&Cancel·la +# ^CloseBtn +&Tanca +# ^BrowseBtn +&Navega... +# ^ShowDetailsBtn +&Mostra els detalls +# ^ClickNext +Feu clic a Endavant per a continuar. +# ^ClickInstall +Feu clic a Instal·la per a iniciar la instal·lació. +# ^ClickUninstall +Feu clic a Desinstal·la per a iniciar la desinstal·lació. +# ^Name +Nom +# ^Completed +S'ha acabat +# ^LicenseText +Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord. +# ^LicenseTextCB +Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la casella de sota. $_CLICK +# ^LicesnseTextRB +Reviseu l'acord de llicència abans d'instal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK +# ^UnLicenseText +Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, feu clic a Hi estic d'acord. +# ^UnLicenseTextCB +Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, activeu la la casella de sota. $_CLICK +# ^UnLicesnseTextRB +Reviseu l'acord de llicència abans de desinstal·lar l'aplicació $(^NameDA). Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. $_CLICK +# ^Custom +Personalitzada +# ^ComponentsText +Activeu els components que voleu instal·lar i desactiveu els que no. $_CLICK +# ^ComponentsSubText1 +Seleccioneu el tipus d'instal·lació: +# ^ComponentsSubText2_NoInstTypes +Seleccioneu els components per instal·lar: +# ^ComponentsSubText2 +O bé, seleccioneu els components opcionals que desitgéssiu instal·lar: +# ^UnComponentsText +Activeu els components que voleu desinstal·lar i desactiveu els que no. $_CLICK +# ^UnComponentsSubText1 +Seleccioneu el tipus de desinstal·lació: +# ^UnComponentsSubText2_NoInstTypes +Seleccioneu els components per desinstal·lar: +# ^UnComponentsSubText2 +O bé, seleccioneu els components opcionals per desinstal·lar: +# ^DirText +El programa d'instal·lació instal·larà l'aplicació $(^NameDA) en la següent carpeta. Per a instal·lar-lo en una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK +# ^DirSubText +Carpeta de destinació +# ^DirBrowseText +Seleccioneu la carpeta on s'instal·larà l'aplicació $(^NameDA): +# ^UnDirText +El programa d'instal·lació desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. Per a desinstal·lar-lo d'una carpeta diferent, feu clic a Navega i seleccioneu-ne una altra. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Seleccioneu la carpeta des d'on es desinstal·larà l'aplicació $(^NameDA): +# ^SpaceAvailable +"Espai lliure: " +# ^SpaceRequired +"Espai necessari: " +# ^UninstallingText +Es desinstal·larà l'aplicació $(^NameDA) de la següent carpeta. $_CLICK +# ^UninstallingSubTex +S'està desinstal·lant de: +# ^FileError +S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Abandona per a aturar la instal·lació,\r\nReintenta per a tornar-ho a provar, o\r\Ignora per a ometre aquest fitxer. +# ^FileError_NoIgnore +S'ha produït un error en obrir el fitxer en mode d'escriptura: \r\n\t"$0"\r\nFeu clic a Reintenta per a tornar-ho a provar, o\r\Cancel·la per a aturar la instal·lació. +# ^CantWrite +"No s'ha pogut escriure: " +# ^CopyFailed +Ha fallat la còpia +# ^CopyTo +"Copia a " +# ^Registering +"S'esta registrant:" +# ^Unregistering +"S'està suprimint el registre: " +# ^SymbolNotFound +"No s'ha trobat el símbol: " +# ^CouldNotLoad +"No s'ha pogut carregar: " +# ^CreateFolder +"Crea la carpeta: " +# ^CreateShortcut +"Crea la drecera: " +# ^CreatedUninstaller +"S'ha creat el desinstal·lador: " +# ^Delete +"S'ha suprimit el fitxer: " +# ^DeleteOnReboot +"Suprimeix en reiniciar: " +# ^ErrorCreatingShortcut +"S'ha produït un error en crear la drecera: " +# ^ErrorCreating +S'ha produït un error en crear: +# ^ErrorDecompressing +S'ha produït un error en descomprimir les dades! L'instal·lador està corrupte? +# ^ErrorRegistering +S'ha produït un error en registrar una DLL +# ^ExecShell +"Executa l'ordre: " +# ^Exec +"Executa:" +# ^Extract +"Extreu: " +# ^ErrorWriting +"Extreu: s'ha produït un error en escriure el fitxer " +# ^InvalidOpcode +L'instal·lador està corrupte: el codi d'operació no és vàlid +# ^NoOLE +"No hi ha OLE per a: " +# ^OutputFolder +"Carpeta de sortida: " +# ^RemoveFolder +"Suprimeix la carpeta: " +# ^RenameOnReboot +"Reanomena en reiniciar: " +# ^Rename +"Reanomena: " +# ^Skipped +"S'ha omès: " +# ^CopyDetails +Copia els detalls al porta-retalls +# ^LogInstall +Registra el procés d'instal·lació +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nsh new file mode 100644 index 0000000000..e085500d7c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Catalan.nsh @@ -0,0 +1,121 @@ +;Language: Catalan (1027) +;By falanko, corrections by Toni Hermoso Pulido + +!insertmacro LANGFILE "Catalan" = "Català" "Catala" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar d'instal·lació de l'aplicació $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà durant el procés d'instal·lació de l'aplicació $(^NameDA).$\r$\n$\r$\nEs recomana tancar la resta d'aplicacions abans de començar la instal·lació. Això permetrà al programa d'instal·ació actualitzar fitxers del sistema rellevants sense haver de reiniciar l'ordinador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvinguts a l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Aquest auxiliar us guiarà a través de la desinstal·lació de l'aplicació $(^NameDA).$\r$\n\rAbans de començar la desinstal·lació, assegureu-vos que l'aplicació $(^NameDA) no s'està executant.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acord de Llicència" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans d'instal·lar l'aplicació $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'acord per a continuar. Heu d'acceptar l'acord per a poder instal·lar l'aplicació $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per poder instal·lar l'aplicació $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder instal·lar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acord de llicència" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Reviseu els termes de la llicència abans de desinstal·lar l'aplicació $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si accepteu tots els termes de l'acord, premeu Hi estic d'Acord per a continuar. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si accepteu tots els termes de l'acord, activeu la casella de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si accepteu tots els termes de l'acord, seleccioneu la primera opció de sota. Heu d'acceptar l'acord per a poder desinstal·lar l'aplicació $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premeu AvPàg per a veure la resta de l'acord." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selecció de components" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu instal·lar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selecció de components" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccioneu quines característiques de l'aplicació $(^NameDA) desitgeu desinstal·lar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripció" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Situeu el ratolí damunt d'un component per a veure'n la descripció." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Trieu una ubicació d'instal·lació" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Trieu la carpeta on instal·lar-hi l'aplicació $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Trieu la ubicació de desinstal·lació" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Trieu la carpeta d'on desinstal·lar l'aplicació $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "S'està instal·lant" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) s'instal·la." + ${LangFileString} MUI_TEXT_FINISH_TITLE "S'ha acabat la instal·lació" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instal·lació ha acabat correctament." + ${LangFileString} MUI_TEXT_ABORT_TITLE "S'ha abandonat la instal·lació" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instal·lació no ha acabat correctament." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "S'està desinstal·lant" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Si us plau, espereu mentre l'aplicació $(^NameDA) es desinstal·la." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "S'ha acabat la desinstal·lació" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstal·lació s'ha realitzat correctament." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "S'ha abandonat la desinstal·lació" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstal·lació no ha acabat correctament." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar d'instal·lació de l'aplicació $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha instal·lat a l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la instal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "S'està acabant l'auxiliar de desinstal·lació de l'aplicació $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "L'aplicació $(^NameDA) s'ha desinstal·lat de l'ordinador.$\r$\n$\r$\nFeu clic a Finalitza per a tancar aquest auxiliar." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cal reiniciar l'ordinador perquè pugui acabar-se la desinstal·lació de l'aplicació $(^NameDA). Voleu reiniciar-lo ara?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reinicia ara" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reinicia més tard manualment" + ${LangFileString} MUI_TEXT_FINISH_RUN "Executa l'aplicació $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostra el Llegeix-me" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finalitza" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tria la carpeta del menú Inicia" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tria una carpeta del menú Inicia per a les dreceres de l'aplicació $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccioneu la carpeta del Menú Inicia en la que hi vulgueu crear les dreceres del programa. Podeu introduir-hi un altre nom si voleu crear una carpeta nova." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No creïs les dreceres" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstal·la l'aplicació $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Suprimeix l'aplicació $(^NameDA) de l'ordinador." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Esteu segur que voleu sortir del programa d'instal·lació de l'aplicació $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Esteu segur que voleu sortir del programa de desinstal·lació de l'aplicació $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nlf new file mode 100644 index 0000000000..6a590c56d0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nlf @@ -0,0 +1,193 @@ +# Header, don't edit +NLF v6 +# Language ID +1155 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything other than RTL means LTR +- +# Translation by Patriccollu di Santa Maria è Sichè - +# Updated on August 9th, 2020 for version 3.06.1 +# Created on April 24th, 2016 for version 3.0rc1 +# Traduzzione corsa creata è mantinuta da Patriccollu di Santa Maria è Sichè +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Assistente d’installazione di $(^Name) +# ^UninstallCaption +Disinstallazione di $(^Name) +# ^LicenseSubCaption +: Cuntrattu di licenza +# ^ComponentsSubCaption +: Ozzioni d’installazione +# ^DirSubCaption +: Cartulare d’installazione +# ^InstallingSubCaption +: Installazione in corsu +# ^CompletedSubCaption +: Installazione compia +# ^UnComponentsSubCaption +: Ozzioni di disinstallazione +# ^UnDirSubCaption +: Cartulare di disinstallazione +# ^ConfirmSubCaption +: Cunfirmazione +# ^UninstallingSubCaption +: Disinstallazione in corsu +# ^UnCompletedSubCaption +: Disinstallazione compia +# ^BackBtn +< &Precedente +# ^NextBtn +&Seguente > +# ^AgreeBtn +&Accunsentu +# ^AcceptBtn +Sò d’&accunsentu cù i termini di u cuntrattu di licenza +# ^DontAcceptBtn +Ùn sò &micca d’accunsentu cù i termini di u cuntrattu di licenza +# ^InstallBtn +&Installà +# ^UninstallBtn +&Disinstallà +# ^CancelBtn +Abbandunà +# ^CloseBtn +&Chjode +# ^BrowseBtn +&Sfuglià... +# ^ShowDetailsBtn +Affissà i &ditaglii +# ^ClickNext +Sciglite Seguente per cuntinuà. +# ^ClickInstall +Sciglite Installà per principià l’installazione. +# ^ClickUninstall +Sciglite Disinstallà per principià a disinstallazione. +# ^Name +Nome +# ^Completed +Compiu +# ^LicenseText +Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite Accunsentu. +# ^LicenseTextCB +Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a casella inghjò. $_CLICK +# ^LicenseTextRB +Ci vole à leghje u cuntrattu di licenza nanzu d’installà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a prima ozzione inghjò. $_CLICK +# ^UnLicenseText +Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite Accunsentu. +# ^UnLicenseTextCB +Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a casella inghjò. $_CLICK +# ^UnLicenseTextRB +Ci vole à leghje u cuntrattu di licenza nanzu di disinstallà $(^NameDA). S’è voi site d’accunsentu cù tutti i termini di u cuntrattu, sciglite a prima ozzione inghjò. $_CLICK +# ^Custom +Persunalizata +# ^ComponentsText +Selezziunà i cumpunenti chì voi vulete installà è viutà a casella di quelli ch’ellu ùn ci vole micca à installà. $_CLICK +# ^ComponentsSubText1 +Selezziunà u tipu d’installazione : +# ^ComponentsSubText2_NoInstTypes +Selezziunà i cumpunenti à installà : +# ^ComponentsSubText2 +Osinnò, selezziunà i cumpunenti addizziunali chì voi vulete installà : +# ^UnComponentsText +Selezziunà i cumpunenti chì voi vulete disinstallà è viutà a casella di quelli ch’ellu ùn ci vole à disinstallà. $_CLICK +# ^UnComponentsSubText1 +Selezziunà u tipu di disinstallazione : +# ^UnComponentsSubText2_NoInstTypes +Selezziunà i cumpunenti à disinstallà : +# ^UnComponentsSubText2 +Osinnò, selezziunà i cumpunenti addizziunali chì voi vulete disinstallà : +# ^DirText +L’assistente hà da installà $(^NameDA) in quessu cartulare. Per installà in un altru cartulare, sciglite Sfuglià è selezziunà un altru cartulare. $_CLICK +# ^DirSubText +Cartulare di destinazione +# ^DirBrowseText +Selezziunà u cartulare d’installazione di $(^NameDA) : +# ^UnDirText +L’assistente hà da disinstallà $(^NameDA) da quessu cartulare. Per disinstallà da un altru cartulare, sciglite Sfuglià è selezziunà un altru cartulare. $_CLICK +# ^UnDirSubText +Cartulare d’installazione +# ^UnDirBrowseText +Selezziunà u cartulare di disinstallazione di $(^NameDA) : +# ^SpaceAvailable +Spaziu dispunibule : +# ^SpaceRequired +Spaziu richiestu : +# ^UninstallingText +$(^NameDA) serà disinstallatu da quessu cartulare. $_CLICK +# ^UninstallingSubText +Disinstallazione da : +# ^FileError +Sbagliu durante l’accessu in scrittura di u schedariu : \r\n\r\n$0\r\n\r\nSciglite Interrompe per piantà l’installazione,\r\nTorna per pruvà torna, o\r\nIgnurà per ignurà stu schedariu. +# ^FileError_NoIgnore +Sbagliu durante l’accessu in scrittura di u schedariu : \r\n\r\n$0\r\n\r\nSciglite Torna per pruvà torna, o\r\nAbbandunà per piantà l’installazione. +# ^CantWrite +Ùn pò micca scrive : +# ^CopyFailed +Fiascu di a copia +# ^CopyTo +Cupià ver di +# ^Registering +Arregistramentu : +# ^Unregistering +Disarregistramentu : +# ^SymbolNotFound +Impussibule di truvà un simbolu : +# ^CouldNotLoad +Impussibule di caricà : +# ^CreateFolder +Creazione di u cartulare : +# ^CreateShortcut +Creazione di l’accurtatoghju : +# ^CreatedUninstaller +Creazione di l’assistente di disinstallazione : +# ^Delete +Squassatura di schedariu : +# ^DeleteOnReboot +Squassatura à l’avviu di l’urdinatore : +# ^ErrorCreatingShortcut +Sbagliu durante a creazione di l’accurtatoghju : +# ^ErrorCreating +Sbagliu durante a creazione di : +# ^ErrorDecompressing +Sbagliu durante a scumprezzione di i dati ! Stalladore alteratu ? +# ^ErrorRegistering +Sbagliu durante l’arregistramentu di DLL +# ^ExecShell +ExecShell : +# ^Exec +Eseguisce : +# ^Extract +Estrazzione : +# ^ErrorWriting +Estrazzione : sbagliu di scrittura ver di u schedariu +# ^InvalidOpcode +Stalladore alteratu : opcode micca accettevule +# ^NoOLE +Alcunu OLE per : +# ^OutputFolder +Cartulare di destinazione : +# ^RemoveFolder +Cacciatura di u cartulare : +# ^RenameOnReboot +Rinumà à l’avviu di l’urdinatore : +# ^Rename +Rinumà : +# ^Skipped +Tralasciatu : +# ^CopyDetails +Cupià i detaglii ver di u preme’papei +# ^LogInstall +Arregistrà u ghjurnale d’installazione +# ^Byte +o +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nsh new file mode 100644 index 0000000000..5e58b1e3c1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Corsican.nsh @@ -0,0 +1,133 @@ +/* +** Language: Corsican (1155) +** Traduzzione corsa da Patriccollu di Santa Maria è Sichè - +** ISO 639-1: co +** ISO 639-2: cos +*/ + +!insertmacro LANGFILE "Corsican" "Corsican" "Corsu" "Corsu" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvenuta in l’assistente d’installazione di $(^NameDA)m" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "L’assistente d’installazione hà da aiutavvi à installà $(^NameDA).$\r$\n$\r$\nHè ricumandatu di chjode tutte l’altre appiecazioni nanzu di avvià st’assistente. Quessu permetterà di mudificà i schedarii di u sistema senza riavvià l’urdinatore.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvenuta in l’assistente di disinstallazione di $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "L’assistente hà da aiutavvi à disinstallà $(^NameDA).$\r$\n$\r$\nNanzu di principià a disinstallazione, ci vole à assicurassi chì $(^NameDA) ùn sia micca in funzione.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Cuntrattu di licenza" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ci vole à leghje i termini di a licenza nanzu d’installà $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite Accunsentu per cuntinuà. Ci vole à accettà u cuntrattu per installà $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a casella inghjò. Ci vole à accettà u cuntrattu per installà $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a prima ozzione inghjò. Ci vole à accettà u cuntrattu per installà $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Cuntrattu di licenza" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ci vole à leghje i termini di a licenza nanzu di disinstallà $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite Accunsentu per cuntinuà. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a casella inghjò. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "S’è voi site d’accunsentu cù i termini di u cuntrattu, sciglite a prima ozzione inghjò. Ci vole à accettà u cuntrattu per disinstallà $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sciglite Pagina Seguente per fighjà a seguita di u ducumentu." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Sciglite i cumpunenti" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Sciglite e funzioni di $(^NameDA) chì voi vulete installà." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Sciglite i cumpunenti" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Sciglite e funzioni di $(^NameDA) chì voi vulete disinstallà." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Discrizzione" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Piazzà u topu nant’à un cumpunentu per fighjà a so discrizzione." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selezziunà un cumpunentu per fighjà a so discrizzione." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Sciglite u cartulare d’installazione" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Sciglite u cartulare induve installà $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Sciglite u cartulare di disinstallazione" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Sciglite u cartulare di disinstallazione di $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione in corsu" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Aspettate per piacè chì $(^NameDA) sia installatu." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione compia" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L’installazione hè compia bè." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L’installazione ùn hè micca compia bè." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione in corsu" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Aspettate per piacè chì $(^NameDA) sia disinstallatu." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione compia" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A disinstallazione hè compia bè." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A disinstallazione ùn hè micca compia bè." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Fine d’installazione di $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) hè statu installatu nant’à l’urdinatore.$\r$\n$\r$\nSciglite Piantà per chjode l’assistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "L’urdinatore deve esse piantatu è rilanciatu per compie l’installazione di $(^NameDA). Vulete piantalu è rilancialu avà ?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fine di disinstallazione di $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) hè statu disinstallatu da l’urdinatore.$\r$\n$\r$\nSciglite Piantà per chjode l’assistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "L’urdinatore deve esse piantatu è rilanciatu per compie a disinstallazione di $(^NameDA). Vulete piantalu è rilancialu avà ?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Rilancià subitu" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Vogliu fallu dopu dapermè" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Eseguisce $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Affissà u schedariu LisezMoi/Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Piantà" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Sciglite un cartulare in u listinu « Démarrer »" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Sciglite un cartulare in u listinu « Démarrer » per l’accurtatoghjii di $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Sciglite un cartulare in u listinu « Démarrer » induve l’accurtatoghjii di u prugramma seranu creati. Pudete dinù scrive un nome per creà un novu cartulare." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ùn creà micca d’accurtatoghji" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstallà $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Caccià $(^NameDA) da l’urdinatore." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Site sicuru di vulè chità l’assistente d’installazione di $(^Name) ?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Site sicuru di vulè chità l’assistente di disinstallazione di $(^Name) ?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Scelta di l’utilizatori" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Sciglite l’utilizatori chì puderanu impiegà $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selezziunà s’èllu ci vole à installà $(^NameDA) solu per voi o per tutti l’utilizatori di l’urdinatore. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installà per tutti l’utilizatori di l’urdinatore" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installà solu per mè" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nlf new file mode 100644 index 0000000000..c26571a541 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1050 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Igor Ostriz +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalacija programa $(^Name) +# ^UninstallCaption +Uklanjanje programa $(^Name) +# ^LicenseSubCaption +: Uvjeti Ugovora o licenci +# ^ComponentsSubCaption +: Instalacijske opcije +# ^DirSubCaption +: Instalacijska mapa +# ^InstallingSubCaption +: Instaliranje +# ^CompletedSubCaption +: Završeno +# ^UnComponentsSubCaption +: Opcije uklanjanja +# ^UnDirSubCaption +: Mapa uklanjanja +# ^ConfirmSubCaption +: Potvrda +# ^UninstallingSubCaption +: Uklanjanje +# ^UnCompletedSubCaption +: Završeno +# ^BackBtn +< &Natrag +# ^NextBtn +&Dalje > +# ^AgreeBtn +&Prihvaćam +# ^AcceptBtn +&Prihvaćam uvjete Ugovora o licenci +# ^DontAcceptBtn +&Ne prihvaćam uvjete Ugovora o licenci +# ^InstallBtn +&Instaliraj +# ^UninstallBtn +&Ukloni +# ^CancelBtn +Odustani +# ^CloseBtn +&Zatvori +# ^BrowseBtn +&Pregledaj... +# ^ShowDetailsBtn +Prikaži &detalje +# ^ClickNext +Za nastavak odaberite 'Dalje'. +# ^ClickInstall +Za početak instalacije odaberite 'Instaliraj'. +# ^ClickUninstall +Za početak uklanjanja odaberite 'Ukloni'. +# ^Name +Ime +# ^Completed +Završeno +# ^LicenseText +Pročitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite 'Prihvaćam'. +# ^LicenseTextCB +Pročitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, označite donji kvadratić. $_CLICK +# ^LicenseTextRB +Pročitajte licencu prije instalacije programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK +# ^UnLicenseText +Pročitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite 'Prihvaćam'. +# ^UnLicenseTextCB +Pročitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, označite donji kvadratić. $_CLICK +# ^UnLicenseTextRB +Pročitajte licencu prije uklanjanja programa $(^NameDA). Ukoliko prihvaćate sve uvjete ugovora, odaberite prvu donju opciju. $_CLICK +# ^Custom +Posebna +# ^ComponentsText +Označite komponente koje želite instalirati i uklonite oznaku s onih koje ne želite instalirati. $_CLICK +# ^ComponentsSubText1 +Izaberite tip instalacije: +# ^ComponentsSubText2_NoInstTypes +Odaberite komponente za instalaciju: +# ^ComponentsSubText2 +Ili po izboru označite komponente koje želite instalirati: +# ^UnComponentsText +Označite komponente koje želite ukloniti i uklonite oznaku s onih koje ne želite ukloniti. $_CLICK +# ^UnComponentsSubText1 +Izaberite tip uklanjanja: +# ^UnComponentsSubText2_NoInstTypes +Odaberite komponente za uklanjanje: +# ^UnComponentsSubText2 +Ili po izboru označite komponente koje želite ukloniti: +# ^DirText +Program $(^NameDA) bit će instaliran u sljedeću mapu. Ako želite promijeniti odredište, pritisnite dugme za traženje mape i označite drugu mapu. $_CLICK +# ^DirSubText +Odredišna mapa +# ^DirBrowseText +Odaberite mapu u koju želite instalirati program $(^NameDA): +# ^UnDirText +Program $(^NameDA) bit će uklonjen iz sljedeće mape. Za uklanjanje s drugog mjesta odaberite 'Pregledaj' i označite drugu mapu. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Mapa iz koje će program $(^NameDA) biti uklonjen: +# ^SpaceAvailable +"Slobodno prostora na disku: " +# ^SpaceRequired +"Potrebno prostora na disku: " +# ^UninstallingText +Program $(^NameDA) bit će uklonjen iz sljedeće mape. $_CLICK +# ^UninstallingSubText +Uklanjam iz: +# ^FileError +Greška prilikom otvaranja datoteke za zapisivanje: \r\n\r\n$0\r\n\r\nPritisnite "Abort" ako želite prekinuti instalaciju,\r\n"Retry" ako želite pokušati ponovno, ili\r\n"Ignore" ako želite zanemariti tu datoteku +# ^FileError_NoIgnore +Greška prilikom otvaranja datoteke za zapisivanje: \r\n\r\n$0\r\n\r\nPritisnite "Retry" za ponovni pokušaj zapisivanja, ili\r\n"Cancel" za prekid instalacije +# ^CantWrite +"Ne mogu zapisati: " +# ^CopyFailed +Greška prilikom kopiranja +# ^CopyTo +"Kopiraj u " +# ^Registering +"Prijava: " +# ^Unregistering +"Odjava: " +# ^SymbolNotFound +"Ne mogu naći simbol: " +# ^CouldNotLoad +"Ne mogu učitati: " +# ^CreateFolder +"Stvori mapu: " +# ^CreateShortcut +"Stvori prečac: " +# ^CreatedUninstaller +"Program za uklanjanje: " +# ^Delete +"Izbriši datoteku: " +# ^DeleteOnReboot +"Izbriši prilikom ponovnog pokretanja: " +# ^ErrorCreatingShortcut +"Greška prilikom stvaranja prečaca: " +# ^ErrorCreating +"Greška prilikom stvaranja: " +# ^ErrorDecompressing +Greška dekompresije podataka! Oštećena instalacijska datoteka? +# ^ErrorRegistering +Greška prilikom prijavljivanja DLL-a +# ^ExecShell +"ExecShell: " +# ^Exec +"Izvrši: " +# ^Extract +"Otpakiraj: " +# ^ErrorWriting +"Otpakiranje: greška zapisivanja u datoteku " +# ^InvalidOpcode +Oštećena instalacijska datoteka: neispravan opkod +# ^NoOLE +"Nema OLE za: " +# ^OutputFolder +"Izlazna mapa: " +# ^RemoveFolder +"Izbriši mapu: " +# ^RenameOnReboot +"Preimenuj prilikom ponovnog pokretanja: " +# ^Rename +"Preimenuj: " +# ^Skipped +"Preskočeno: " +# ^CopyDetails +Kopiraj detalje u međuspremnik +# ^LogInstall +Logiraj instalacijski proces +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nsh new file mode 100644 index 0000000000..9fd76771b0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Croatian.nsh @@ -0,0 +1,121 @@ +;Language: Croatian (1050) +;By Igor Ostriz + +!insertmacro LANGFILE "Croatian" = "Hrvatski" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u instalaciju programa $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Instalacija programa $(^NameDA) na Vaše računalo sastoji se od nekoliko jednostavnih koraka kroz koje će Vas provesti ovaj čarobnjak.$\r$\n$\r$\nPreporučamo zatvaranje svih ostalih aplikacija prije samog početka instalacije. To će omogućiti nadogradnju nekih sistemskih datoteka bez potrebe za ponovnim pokretanjem Vašeg računala. U svakom trenutku instalaciju možete prekinuti pritiskom na 'Odustani'.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u postupak uklanjanja programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ovaj će Vas čarobnjak provesti kroz postupak uklanjanja programa $(^NameDA).$\r$\n$\r$\nPrije samog početka, molim zatvorite program $(^NameDA) ukoliko je slučajno otvoren.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ugovor o licenci" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pročitajte licencu prije instalacije programa $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvaćate uvjete licence, pritisnite 'Prihvaćam' za nastavak. Da biste instalirali program $(^NameDA), morate prihvatiti licencu." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaćate uvjete licence, označite donji kvadratić. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaćate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za instalaciju programa $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ugovor o licenci" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pročitajte licencu prije uklanjanja programa $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvaćate uvjete licence, pritisnite 'Prihvaćam' za nastavak. Da biste instalirali program $(^NameDA), morate prihvatiti licencu." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ukoliko prihvaćate uvjete licence, označite donji kvadratić. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ukoliko prihvaćate uvjete licence, odaberite prvu donju opciju. Morate prihvatiti licencu za uklanjanje programa $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Služite se tipkom 'Page Down' da biste vidjeli ostatak licence." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Odaberite komponente programa $(^NameDA) koje želite instalirati." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Odaberite koje komponente programa $(^NameDA) želite ukloniti." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Postavite pokazivač iznad komponente za njezin opis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Označite komponentu za njezin opis." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Odaberite odredište za instalaciju" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Odaberite mapu u koju želite instalirati program $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Odaberite polazište za uklanjanje" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Odaberite mapu iz koje želite ukloniti program $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacija u tijeku..." + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Pričekajte završetak instalacije programa $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Kraj instalacije" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je u potpunosti završila uspješno." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacija je prekinuta" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija nije završila uspješno." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uklanjanje u tijeku..." + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Pričekajte završetak uklanjanja programa $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uklanjanje završeno" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uklanjanje je u potpunosti završilo uspješno." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uklanjanje je prekinuto" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uklanjanje nije završilo uspješno." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dovršetak instalacije programa $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) upravo je instaliran.$\r$\n$\r$\nOdaberite 'Kraj' za završetak." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Da bi se dovršila instalacija programa $(^NameDA), trebate ponovno pokrenuti računalo. Želite li to učiniti sada?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završetak uklanjanja programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) uklonjen je s Vašeg računala.$\r$\n$\r$\nOdaberite 'Kraj' za zatvaranje ovog čarobnjaka." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Da bi se dovršio postupka uklanjanja programa $(^NameDA), trebate ponovno pokrenuti računalo. Želite li to učiniti sada?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovno pokreni računalo sada" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ponovno ću pokrenuti računalo kasnije" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Pokreni program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Otvori datoteku '&Readme'" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Kraj" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor mape u izborniku 'Start'" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Odaberite ime za programsku mapu unutar izbornika 'Start'." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Program će pripadati odabranoj programskoj mapi u izborniku 'Start'. Možete odrediti novo ime za mapu ili odabrati već postojeću." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nemoj napraviti prečace" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uklanjanje programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Program $(^NameDA) bit će uklonjen s Vašeg računala." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti instalaciju programa $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Jeste li sigurni da želite prekinuti uklanjanje programa $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nlf new file mode 100644 index 0000000000..d524925763 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1029 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Václav Pavlíček (v.pavlicek@centrum.cz), dříve SELiCE +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalace $(^Name) +# ^UninstallCaption +Odinstalace $(^Name) +# ^LicenseSubCaption +: Licenční smlouva +# ^ComponentsSubCaption +: Možnosti instalace +# ^DirSubCaption +: Instalační složka +# ^InstallingSubCaption +: Instalace +# ^CompletedSubCaption +: Dokončeno +# ^UnComponentsSubCaption +: Možnosti odinstalace +# ^UnDirSubCaption +: Odinstalační složka +# ^ConfirmSubCaption +: Potvrzení +# ^UninstallingSubCaption +: Odinstalace +# ^UnCompletedSubCaption +: Dokončeno +# ^BackBtn +< &Zpět +# ^NextBtn +&Další > +# ^AgreeBtn +Souhl&asím +# ^AcceptBtn +Souhl&asím s podmínkami licenční smlouvy +# ^DontAcceptBtn +&Nesouhlasím s podmínkami licenční smlouvy +# ^InstallBtn +&Instalovat +# ^UninstallBtn +&Odinstalovat +# ^CancelBtn +Storno +# ^CloseBtn +&Zavřít +# ^BrowseBtn +P&rocházet... +# ^ShowDetailsBtn +&Podrobnosti +# ^ClickNext +Pokračujte kliknutím na tlačítko Další. +# ^ClickInstall +Instalaci spustíte kliknutím na tlačítko Instalovat. +# ^ClickUninstall +Odinstalaci spustíte kliknutím na tlačítko Odinstalovat. +# ^Name +Název +# ^Completed +Dokončeno +# ^LicenseText +Před instalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, klikněte na tlačítko Souhlasím. +# ^LicenseTextCB +Před instalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, zaškrtněte políčko níže. $_CLICK +# ^LicenseTextRB +Před instalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, vyberte níže první možnost. $_CLICK +# ^UnLicenseText +Před odinstalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, klikněte na tlačítko Souhlasím. +# ^UnLicenseTextCB +Před odinstalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, zaškrtněte políčko níže. $_CLICK +# ^UnLicenseTextRB +Před odinstalací programu $(^NameDA) si prosím přečtěte licenční smlouvu. Jestliže souhlasíte s podmínkami této smlouvy, vyberte níže první možnost. $_CLICK +# ^Custom +Vlastní +# ^ComponentsText +Zaškrtněte součásti, které chcete nainstalovat a zrušte zaškrtnutí součástí, které nechcete nainstalovat. $_CLICK +# ^ComponentsSubText1 +Zvolte způsob instalace: +# ^ComponentsSubText2_NoInstTypes +Vyberte součásti, které chcete nainstalovat. +# ^ComponentsSubText2 +Nebo vyberte volitelné součásti, které chcete nainstalovat. +# ^UnComponentsText +Zaškrtněte součásti, které chcete odinstalovat a zrušte zaškrtnutí součástí, které nechcete odinstalovat. $_CLICK +# ^UnComponentsSubText1 +Zvolte způsob odinstalace: +# ^UnComponentsSubText2_NoInstTypes +Vyberte součásti, které chcete odinstalovat. +# ^UnComponentsSubText2 +Nebo vyberte volitelné součásti, které chcete odinstalovat. +# ^DirText +Instalační program nainstaluje program $(^NameDA) do následující složky. Chcete-li instalovat do jiné složky, klikněte na tlačítko Procházet a vyberte jinou složku. $_CLICK +# ^DirSubText +Cílová složka +# ^DirBrowseText +Výběr instalační složky programu $(^NameDA). +# ^UnDirText +Odinstalační program odinstaluje program $(^NameDA) z následující složky. Chcete-li odinstalovat z jiné složky, klikněte na tlačítko Procházet a vyberte jinou složku. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Vyberte odinstalační složku programu $(^NameDA): +# ^SpaceAvailable +"Volné místo: " +# ^SpaceRequired +"Požadované místo: " +# ^UninstallingText +Program $(^NameDA) bude odinstalován z následující složky. $_CLICK +# ^UninstallingSubText +Odinstalovat z: +# ^FileError +Soubor nelze otevřít pro zápis: \r\n\t"$0"\r\nKlikněte na tlačítko Přerušit k ukončení instalace,\r\nnebo na tlačítko Opakovat k zopakování akce, nebo\r\n na tlačítko Ignorovat k přeskočení souboru. +# ^FileError_NoIgnore +Soubor nelze otevřít pro zápis: \r\n\t"$0"\r\nKlikněte na tlačítko Opakovat k zopakování akce, nebo\r\n na tlačítko Storno k ukončení instalace. +# ^CantWrite +"Nelze zapsat: " +# ^CopyFailed +Kopírování se nezdařilo. +# ^CopyTo +"Kopírování do " +# ^Registering +"Registrace: " +# ^Unregistering +"Rušení registrace: " +# ^SymbolNotFound +"Nelze najít symbol: " +# ^CouldNotLoad +"Nelze načíst: " +# ^CreateFolder +"Vytváření složky: " +# ^CreateShortcut +"Vytváření zástupce: " +# ^CreatedUninstaller +"Vytváření odinstalačního programu: " +# ^Delete +"Odstraňování souboru: " +# ^DeleteOnReboot +"Odstranit při restartování: " +# ^ErrorCreatingShortcut +"Při vytváření zástupce došlo k chybě: " +# ^ErrorCreating +"Při vytváření došlo k chybě: " +# ^ErrorDecompressing +Při dekompresi dat došlo k chybě. Byl poškozen instalační program? +# ^ErrorRegistering +Při registraci souborů DLL došlo k chybě. +# ^ExecShell +"Spouštění prostředí: " +# ^Exec +"Spouštění: " +# ^Extract +"Extrahování: " +# ^ErrorWriting +"Extrakce: Při zápisu souboru došlo k chybě " +# ^InvalidOpcode +Instalační program byl poškozen: neplatný operační kód. +# ^NoOLE +"Nedostupné OLE pro: " +# ^OutputFolder +"Výstupní složka: " +# ^RemoveFolder +"Odstraňování složky: " +# ^RenameOnReboot +"Přejmenovat při restartování: " +# ^Rename +"Přejmenováno: " +# ^Skipped +"Přeskočeno: " +# ^CopyDetails +Zkopírovat podrobnosti do schránky +# ^LogInstall +Protokolovat proces instalace +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nsh new file mode 100644 index 0000000000..51c0fa4981 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Czech.nsh @@ -0,0 +1,129 @@ +;Language: Czech (1029) +;By Václav Pavlíček (v.pavlicek@centrum.cz), dříve SELiCE + +!insertmacro LANGFILE "Czech" = "Čeština" "Cestina" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vítejte v průvodci instalace programu $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento průvodce vás provede instalací programu $(^NameDA).$\r$\n$\r$\nPřed spuštěním instalačního programu je doporučeno ukončit všechny ostatní aplikace. Umožní to aktualizovat související systémové soubory bez restartování počítače.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vítejte v průvodci odinstalace programu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento průvodce vás provede odinstalací programu $(^NameDA).$\r$\n$\r$\nPřed spuštěním odinstalace se přesvědčte, zda program $(^NameDA) není spuštěn.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenční smlouva" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Před instalací programu $(^NameDA) si prosím projděte licenční podmínky." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte s podmínkami smlouvy, klikněte na tlačítko Souhlasím. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte s podmínkami smlouvy, zaškrtněte políčko níže. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte s podmínkami smlouvy, vyberte níže první možnost. Chcete-li nainstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenční smlouva" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Před odinstalací programu $(^NameDA) si prosím projděte licenční podmínky." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jestliže souhlasíte s podmínkami smlouvy, klikněte na tlačítko Souhlasím. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jestliže souhlasíte s podmínkami smlouvy, zaškrtněte políčko níže. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jestliže souhlasíte s podmínkami smlouvy, vyberte níže první možnost. Chcete-li odinstalovat program $(^NameDA), je nutné s touto smlouvou souhlasit. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Zbytek textu zobrazíte stisknutím klávesy Page Down." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Volba součástí" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Výběr součástí programu $(^NameDA) pro instalaci." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Volba součástí" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Výběr součástí programu $(^NameDA) pro odinstalaci." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Chcete-li zobrazit popis součásti, umístěte na ní ukazatel myši." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Chcete-li zobrazit popis součásti, vyberte ji." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Volba umístění instalace" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Výběr instalační složky programu $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Volba umístění odinstalace" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Výběr odinstalační složky programu $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalace" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Počkejte prosím na dokončení instalace programu $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalace dokončena" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalace byla úspěšně dokončena." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalace přerušena" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalace nebyla úspěšně dokončena." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odinstalace" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Počkejte prosím na dokončení odinstalace programu $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odinstalace dokončena" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalace byla úspěšně dokončena." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odinstalace přerušena" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odinstalace nebyla úspěšně dokončena." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dokončení instalace programu $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) byl nainstalován do počítače.$\r$\n$\r$\nKliknutím na tlačítko Dokončit ukončíte tohoto průvodce." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "K dokončení instalace programu $(^NameDA) je nutné restartovat počítač. Chcete jej restartovat nyní?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Dokončení odinstalace programu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) byl odinstalován z počítače.$\r$\n$\r$\nKliknutím na tlačítko Dokončit ukončíte tohoto průvodce." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "K dokončení odinstalace $(^NameDA) je nutné restartovat počítač. Chcete jej restartovat nyní?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartovat nyní" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Restartovat později ručně" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Spustit program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Zobrazit soubor Readme (Čti mě)" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Dokončit" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Volba složky v Nabídce Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Výběr složky v Nabídce Start pro zástupce programu $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vyberte složku v Nabídce Start, ve které chcete vytvořit zástupce programu. Chcete-li vytvořit novou složku, zadejte její název." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nevytvořit zástupce" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstalace programu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odebere program $(^NameDA) z počítače." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Opravdu chcete instalaci programu $(^Name) ukončit?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Opravdu chcete odinstalaci programu $(^Name) ukončit?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Volba uživatelů" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Výběr uživatelů, kterým bude program $(^NameDA) nainstalován." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vyberte, zda chcete program $(^NameDA) nainstalovat pouze pro sebe, nebo pro všechny uživatele počítače. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalovat pro všechny uživatele počítače" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalovat pouze pro sebe" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nlf new file mode 100644 index 0000000000..82b0863d1b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1030 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Claus Futtrup, scootergrisen +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Installation +# ^UninstallCaption +$(^Name) Afinstallation +# ^LicenseSubCaption +: Licensaftale +# ^ComponentsSubCaption +: Installationsvalgmuligheder +# ^DirSubCaption +: Installationsmappe +# ^InstallingSubCaption +: Installerer +# ^CompletedSubCaption +: Gennemført +# ^UnComponentsSubCaption +: Afinstallationsvalgmuligheder +# ^UnDirSubCaption +: Afinstallationsmappe +# ^ConfirmSubCaption +: Bekræft +# ^UninstallingSubCaption +: Afinstallerer +# ^UnCompletedSubCaption +: Gennemført +# ^BackBtn +< &Tilbage +# ^NextBtn +&Næste > +# ^AgreeBtn +Jeg &accepterer +# ^AcceptBtn +Jeg &accepterer vilkårene i licensaftalen +# ^DontAcceptBtn +Jeg &accepterer ikke vilkårene i licensaftalen +# ^InstallBtn +&Installer +# ^UninstallBtn +&Afinstaller +# ^CancelBtn +Annuller +# ^CloseBtn +&Luk +# ^BrowseBtn +G&ennemse... +# ^ShowDetailsBtn +Vis &detaljer +# ^ClickNext +Tryk på Næste for at fortsætte. +# ^ClickInstall +Tryk på Installer for at starte installationen. +# ^ClickUninstall +Tryk på Afinstaller for at starte afinstallationen. +# ^Name +Navn +# ^Completed +Gennemført +# ^LicenseText +Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du klikke på Jeg accepterer. +# ^LicenseTextCB +Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du klikke på afkrydsningsfeltet nedenfor. $_CLICK +# ^LicenseTextRB +Gennemlæs venligst licensaftalen før installationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du vælge den første valgmulighed nedenfor. $_CLICK +# ^UnLicenseText +Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du trykke på Jeg accepterer. +# ^UnLicenseTextCB +Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du klikke på afkrydsningsfeltet nedenfor. $_CLICK +# ^UnLicenseTextRB +Gennemlæs venligst licensaftalen før afinstallationen af $(^NameDA). Hvis du accepterer alle vilkår i aftalen, skal du vælge den første valgmulighed nedenfor. $_CLICK +# ^Custom +Brugerdefineret +# ^ComponentsText +Tilvælg de komponenter du vil installere, og fravælg de komponenter du ikke vil installere. $_CLICK +# ^ComponentsSubText1 +Vælg installationstype: +# ^ComponentsSubText2_NoInstTypes +Vælg de komponenter der skal installeres: +# ^ComponentsSubText2 +Eller vælg de valgfrie komponenter du ønsker at installere: +# ^UnComponentsText +Tilvælg de komponenter du vil afinstallere, og fravælg de komponenter du ikke vil afinstallere. $_CLICK +# ^UnComponentsSubText1 +Vælg afinstallationstype: +# ^UnComponentsSubText2_NoInstTypes +Vælg de komponenter der skal afinstalleres: +# ^UnComponentsSubText2 +Eller vælg de valgfrie komponenter du ønsker at afinstallere: +# ^DirText +Installationsguiden vil installere $(^NameDA) i følgende mappe. For at installere i en anden mappe, tryk på Gennemse og vælg en anden mappe. $_CLICK +# ^DirSubText +Destinationsmappe +# ^DirBrowseText +Vælg den mappe hvori $(^NameDA) skal installeres: +# ^UnDirText +Installationsguiden vil afinstallere $(^NameDA) fra følgende mappe. For at afinstallere fra en anden mappe, tryk på Gennemse og vælg en anden mappe. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Vælg den mappe hvorfra $(^NameDA) skal afinstalleres: +# ^SpaceAvailable +"Ledig plads: " +# ^SpaceRequired +"Nødvendig plads: " +# ^UninstallingText +$(^NameDA) vil blive afinstalleret fra følgende mappe. $_CLICK +# ^UninstallingSubText +Afinstallerer fra: +# ^FileError +Fejl ved skrivning af fil til skrivning: \r\n\r\n$0\r\n\r\nTryk på Annuller for at stoppe installationen,\r\nPrøv igen for at prøve igen, eller\r\nIgnorer for at springe over denne fil. +# ^FileError_NoIgnore +Fejl ved åbning af fil til skrivning: \r\n\r\n$0\r\n\r\nTryk på Prøv igen for at prøve igen, eller\r\nAnnuller for at stoppe installationen. +# ^CantWrite +"Kan ikke skrive: " +# ^CopyFailed +Kopiering mislykkedes +# ^CopyTo +"Kopier til " +# ^Registering +"Registrerer: " +# ^Unregistering +"Afregisterer: " +# ^SymbolNotFound +"Kunne ikke finde symbol: " +# ^CouldNotLoad +"Kunne ikke indlæse: " +# ^CreateFolder +"Opret mappe: " +# ^CreateShortcut +"Opret genvej: " +# ^CreatedUninstaller +"Afinstallationsguide oprettet: " +# ^Delete +"Slet fil: " +# ^DeleteOnReboot +"Slet ved genstart: " +# ^ErrorCreatingShortcut +"Fejl ved oprettelse af genvej: " +# ^ErrorCreating +"Fejl ved oprettelse: " +# ^ErrorDecompressing +Fejl ved udpakning af data! Beskadiget installationsguide? +# ^ErrorRegistering +Fejl ved registrering af DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Kør: " +# ^Extract +"Udpak: " +# ^ErrorWriting +"Udpak: fejl ved skrivning til fil " +# ^InvalidOpcode +Beskadiget installationsguide: ugyldig opcode +# ^NoOLE +"Ingen OLE for: " +# ^OutputFolder +"Outputmappe: " +# ^RemoveFolder +"Slet mappe: " +# ^RenameOnReboot +"Omdøb ved genstart: " +# ^Rename +"Omdøb: " +# ^Skipped +"Sprunget over: " +# ^CopyDetails +Kopier detaljer til udklipsholderen +# ^LogInstall +Log installationsproces +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nsh new file mode 100644 index 0000000000..f6da994974 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Danish.nsh @@ -0,0 +1,129 @@ +;Language: Danish (1030) +;By Claus Futtrup, scootergrisen + +!insertmacro LANGFILE "Danish" = "Dansk" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til installationsguiden for $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne guide hjælper dig gennem installationen af $(^NameDA).$\r$\n$\r$\nDet anbefales, at du lukker alle kørende programmer inden start af installationsguiden. Det gør det muligt at opdatere de nødvendige systemfiler uden at skulle genstarte din computer.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) afinstallationsguiden" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne guide hjælper dig gennem afinstallationen af $(^NameDA).$\r$\n$\r$\nFør start af afinstallationen skal du være sikker på at $(^NameDA) ikke kører.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensaftale" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Læs venligst licensaftalen før installationen af $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Hvis du accepterer vilkårene i aftalen, skal du klikke på Jeg accepterer for at fortsætte. Du skal acceptere aftalen for at installere $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer vilkårene i aftalen, skal du klikke på afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at installere $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer vilkårene i aftalen, skal du vælge den første valgmulighed nedenfor. Du skal acceptere aftalen for at installere $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensaftale" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Læs venligst licensaftalen før afinstallationen af $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du accepterer vilkårene i aftalen, skal du klikke på Jeg accepterer for at fortsætte. Du skal acceptere aftalen for at afinstallere $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du accepterer vilkårene i aftalen, skal du klikke på afkrydsningsfeltet nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du accepterer vilkårene i aftalen, skal du vælge den første valgmulighed nedenfor. Du skal acceptere aftalen for at afinstallere $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryk på Page Down for at se resten af aftalen." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vælg komponenter" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vælg hvilke faciliteter af $(^NameDA) du vil installere." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vælg komponenter" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vælg hvilke faciliteter af $(^NameDA) du vil afinstallere." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Placer musemarkøren over en komponent for at se dens beskrivelse." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vælg en komponent for at se dens beskrivelse." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vælg installationsmappe" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vælg den mappe hvori du vil installere $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vælg afinstallationsmappe" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vælg den mappe hvorfra du vil afinstallere $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver installeret." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation gennemført" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installationsguiden blev gennemført." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation afbrudt" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installationsguiden blev ikke gennemført." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Afinstallerer" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent venligst mens $(^NameDA) bliver afinstalleret." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Afinstallation gennemført" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Afinstallationen blev gennemført." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Afinstallation afbrudt" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Afinstallationen blev ikke gennemført." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Gennemfører $(^NameDA) installationsguiden" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet installeret på din computer.$\r$\n$\r$\nTryk på Afslut for at lukke installationsguiden." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din computer skal genstartes for at gennemføre installationen af $(^NameDA). Vil du genstarte nu?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Gennemfører $(^NameDA) afinstallationsguiden" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er blevet afinstalleret fra din computer.$\r$\n$\r$\nTryk på Afslut for at lukke installationsguiden." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din computer skal genstartes for at gennemføre afinstallationen af $(^NameDA). Vil du genstarte nu?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Genstart nu" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jeg genstarter selv på et senere tidspunkt" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Kør $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Afslut" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vælg mappe i menuen Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vælg en mappe i menuen Start til programmets genveje." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vælg mappe i menuen Start hvori du vil oprette programmets genveje. Du kan også skrive et navn for at oprette en ny mappe." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Opret ikke genveje" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Afinstaller $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slet $(^NameDA) fra din computer." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker på, at du vil afslutte installationen af $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker på, at du vil afslutte afinstallationen af $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vælg brugere" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vælg de brugere som skal have installeret $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vælg hvorvidt du vil installere $(^NameDA) kun for dig selv eller for alle brugere på denne computer. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som bruger denne computer" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer kun for mig" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nlf new file mode 100644 index 0000000000..86ced7fe3c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1043 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Joost Verburg & Hendri Adireans, fixes by Milan Bast +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name)-installatie +# ^UninstallCaption +$(^Name)-deïnstallatie +# ^LicenseSubCaption +: Licentieovereenkomst +# ^ComponentsSubCaption +: Installatieopties +# ^DirSubCaption +: Installatiemap +# ^InstallingSubCaption +: Bezig met installeren +# ^CompletedSubCaption +: Voltooid +# ^UnComponentsSubCaption +: Verwijderingsopties +# ^UnDirSubCaption +: Te verwijderen map +# ^ConfirmSubCaption +: Bevestiging +# ^UninstallingSubCaption +: Bezig met verwijderen +# ^UnCompletedSubCaption +: Voltooid +# ^BackBtn +< V&orige +# ^NextBtn +&Volgende > +# ^AgreeBtn +&Akkoord +# ^AcceptBtn +Ik &accepteer de overeenkomst +# ^DontAcceptBtn +Ik accepteer de overeenkomst &niet +# ^InstallBtn +&Installeren +# ^UninstallBtn +&Verwijderen +# ^CancelBtn +Annuleren +# ^CloseBtn +&Afsluiten +# ^BrowseBtn +&Bladeren... +# ^ShowDetailsBtn +&Details tonen +# ^ClickNext +Klik op Volgende om verder te gaan. +# ^ClickInstall +Klik op Installeren om de installatie te beginnen. +# ^ClickUninstall +Klik op Verwijderen om de deïnstallatie te beginnen. +# ^Name +Naam +# ^Completed +Voltooid +# ^LicenseText +Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Klik op Akkoord als u de overeenkomst accepteert. +# ^LicenseTextCB +Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK +# ^LicenseTextRB +Lees de licentieovereenkomst voordat u $(^NameDA) installeert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK +# ^UnLicenseText +Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Klik op Akkoord als u de overeenkomst accepteert. +# ^UnLicenseTextCB +Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Schakel het selectievakje hieronder in als u de overeenkomst accepteert. $_CLICK +# ^UnLicenseTextRB +Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert. Selecteer de eerste optie hieronder als u de overeenkomst accepteert. $_CLICK +# ^Custom +Aangepast +# ^ComponentsText +Selecteer de onderdelen die u wilt installeren en deselecteer welke u niet wilt installeren. $_CLICK +# ^ComponentsSubText1 +Selecteer het installatietype: +# ^ComponentsSubText2_NoInstTypes +Selecteer de onderdelen die moeten worden geïnstalleerd: +# ^ComponentsSubText2 +Of selecteer de optionele onderdelen die moeten worden geïnstalleerd: +# ^UnComponentsText +Selecteer de onderdelen die u wilt verwijderen en deselecteer welke u niet wilt verwijderen. $_CLICK +# ^UnComponentsSubText1 +Selecteer het type verwijdering: +# ^UnComponentsSubText2_NoInstTypes +Selecteer de onderdelen die moeten worden verwijderd: +# ^UnComponentsSubText2 +Of selecteer de optionele onderdelen die moeten worden verwijderd: +# ^DirText +Setup zal $(^NameDA) in de volgende map installeren. Klik op Bladeren als u $(^NameDA) in een andere map wilt installeren en selecteer deze. $_CLICK +# ^DirSubText +Installatiemap +# ^DirBrowseText +Selecteer de map om $(^NameDA) in te installeren: +# ^UnDirText +Setup zal $(^NameDA) uit de volgende map verwijderen. Klik op Bladeren als u $(^NameDA) uit een andere map wilt verwijderen en selecteer deze. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Selecteer de map om $(^NameDA) uit te verwijderen: +# ^SpaceAvailable +"Beschikbare ruimte: " +# ^SpaceRequired +"Vereiste ruimte: " +# ^UninstallingText +$(^NameDA) zal uit de volgende map worden verwijderd. $_CLICK +# ^UninstallingSubText +Verwijderen uit: +# ^FileError +Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Afbreken om de installatie te stoppen,\r\nOpnieuw om het opnieuw te proberen of\r\nNegeren om dit bestand over te slaan. +# ^FileError_NoIgnore +Fout bij het schrijven naar bestand: \r\n\r\n$0\r\n\r\nKlik op Opnieuw om het opnieuw te proberen of \r\nAnnuleren om de installatie te stoppen. +# ^CantWrite +"Kon niet schrijven: " +# ^CopyFailed +Kopiëren mislukt +# ^CopyTo +"Kopiëren naar " +# ^Registering +"Registreren: " +# ^Unregistering +"Deregistreren: " +# ^SymbolNotFound +"Kon symbool niet vinden: " +# ^CouldNotLoad +"Kon niet laden: " +# ^CreateFolder +"Map maken: " +# ^CreateShortcut +"Snelkoppeling maken: " +# ^CreatedUninstaller +"Deïnstallatieprogramma gemaakt: " +# ^Delete +"Bestand verwijderen: " +# ^DeleteOnReboot +"Verwijderen na opnieuw opstarten: " +# ^ErrorCreatingShortcut +"Fout bij maken snelkoppeling: " +# ^ErrorCreating +"Fout bij maken: " +# ^ErrorDecompressing +Fout bij uitpakken van gegevens! Gegevens beschadigd? +# ^ErrorRegistering +Fout bij registreren DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Uitvoeren: " +# ^Extract +"Uitpakken: " +# ^ErrorWriting +"Uitpakken: fout bij schrijven naar bestand " +# ^InvalidOpcode +Installatieprogramma beschadigd: ongeldige opcode +# ^NoOLE +"Geen OLE voor: " +# ^OutputFolder +"Uitvoermap: " +# ^RemoveFolder +"Map verwijderen: " +# ^RenameOnReboot +"Hernoemen na opnieuw opstarten: " +# ^Rename +"Hernoemen: " +# ^Skipped +"Overgeslagen: " +# ^CopyDetails +Details kopiëren naar klembord +# ^LogInstall +Gegevens over installatie bewaren +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nsh new file mode 100644 index 0000000000..3ae418b200 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Dutch.nsh @@ -0,0 +1,129 @@ +;Language: Dutch (1043) +;By Joost Verburg + +!insertmacro LANGFILE "Dutch" = "Nederlands" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-installatiewizard" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) op uw systeem installeren.$\r$\n$\r$\nHet wordt aanbevolen alle overige toepassingen af te sluiten alvorens de installatie te starten. Dit maakt het mogelijk relevante systeembestanden bij te werken zonder uw systeem opnieuw op te moeten starten.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welkom bij de $(^NameDA)-deïnstallatiewizard" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Deze wizard zal $(^NameDA) van uw syteem verwijderen.$\r$\n$\r$\nControleer voordat u begint met verwijderen of $(^NameDA) is afgesloten.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licentieovereenkomst" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) installeert." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Klik op Akkoord om verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te installeren." +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licentieovereenkomst" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lees de licentieovereenkomst voordat u $(^NameDA) verwijdert." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Klik op Akkoord op verder te gaan als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Schakel het selectievakje hieronder in als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Selecteer de eerste optie hieronder als u de overeenkomst accepteert. U moet de overeenkomst accepteren om $(^NameDA) te verwijderen." +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Druk op Page Down om de rest van de overeenkomst te zien." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Onderdelen kiezen" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt installeren." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Onderdelen kiezen" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Kies de onderdelen die u wilt verwijderen." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschrijving" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beweeg uw muis over een onderdeel om de beschrijving te zien." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selecteer een onderdeel om de beschrijving te zien." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Installatielocatie kiezen" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Kies de map waarin u $(^NameDA) wilt installeren." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Locatie kiezen" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Kies de map waaruit u $(^NameDA) wilt verwijderen." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Bezig met installeren" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) wordt geïnstalleerd." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatie voltooid" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "De installatie is succesvol voltooid." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatie afgebroken" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "De installatie is niet voltooid." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Bezig met verwijderen" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Een ogenblik geduld terwijl $(^NameDA) van uw systeem wordt verwijderd." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Verwijderen gereed" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "$(^NameDA) is van uw systeem verwijderd." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Verwijderen afgebroken" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "$(^NameDA) is niet volledig van uw systeem verwijderd." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-installatiewizard" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) is geïnstalleerd op uw systeem.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om de installatie van $(^NameDA) te voltooien. Wilt u nu herstarten?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Voltooien van de $(^NameDA)-deïnstallatiewizard" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) is van uw systeem verwijderd.$\r$\n$\r$\nKlik op Voltooien om deze wizard te sluiten." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Uw systeem moet opnieuw worden opgestart om het verwijderen van $(^NameDA) te voltooien. Wilt u nu herstarten?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Nu herstarten" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ik wil later handmatig herstarten" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &starten" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Leesmij weergeven" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Voltooien" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenumap kiezen" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Kies een map in het menu Start voor de snelkoppelingen van $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Kies een map in het menu Start waarin de snelkoppelingen moeten worden aangemaakt. U kunt ook een naam invoeren om een nieuwe map te maken." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Geen snelkoppelingen aanmaken" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) verwijderen" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) van uw systeem verwijderen." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-installatie wilt afsluiten?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Weet u zeker dat u de $(^Name)-deïnstallatie wilt afsluiten?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Gebruikers kiezen" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Kies voor welke gebruikers u $(^NameDA) wilt installeren." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecteer of u $(^NameDA) alleen voor uzelf of voor alle gebruikers van deze computer wilt installeren. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installeer voor alle gebruikers van deze computer" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installeer alleen voor mijzelf" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/English.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/English.nlf new file mode 100644 index 0000000000..feb69cbd0f --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/English.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1033 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +- +# RTL - anything else than RTL means LTR +- +# Translation by ..... (any credits should go here) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Setup +# ^UninstallCaption +$(^Name) Uninstall +# ^LicenseSubCaption +: License Agreement +# ^ComponentsSubCaption +: Installation Options +# ^DirSubCaption +: Installation Folder +# ^InstallingSubCaption +: Installing +# ^CompletedSubCaption +: Completed +# ^UnComponentsSubCaption +: Uninstallation Options +# ^UnDirSubCaption +: Uninstallation Folder +# ^ConfirmSubCaption +: Confirmation +# ^UninstallingSubCaption +: Uninstalling +# ^UnCompletedSubCaption +: Completed +# ^BackBtn +< &Back +# ^NextBtn +&Next > +# ^AgreeBtn +I &Agree +# ^AcceptBtn +I &accept the terms of the License Agreement +# ^DontAcceptBtn +I &do not accept the terms of the License Agreement +# ^InstallBtn +&Install +# ^UninstallBtn +&Uninstall +# ^CancelBtn +Cancel +# ^CloseBtn +&Close +# ^BrowseBtn +B&rowse... +# ^ShowDetailsBtn +Show &details +# ^ClickNext +Click Next to continue. +# ^ClickInstall +Click Install to start the installation. +# ^ClickUninstall +Click Uninstall to start the uninstallation. +# ^Name +Name +# ^Completed +Completed +# ^LicenseText +Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click I Agree. +# ^LicenseTextCB +Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK +# ^LicenseTextRB +Please review the license agreement before installing $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK +# ^UnLicenseText +Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click I Agree. +# ^UnLicenseTextCB +Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, click the check box below. $_CLICK +# ^UnLicenseTextRB +Please review the license agreement before uninstalling $(^NameDA). If you accept all terms of the agreement, select the first option below. $_CLICK +# ^Custom +Custom +# ^ComponentsText +Check the components you want to install and uncheck the components you don't want to install. $_CLICK +# ^ComponentsSubText1 +Select the type of install: +# ^ComponentsSubText2_NoInstTypes +Select components to install: +# ^ComponentsSubText2 +Or, select the optional components you wish to install: +# ^UnComponentsText +Check the components you want to uninstall and uncheck the components you don't want to uninstall. $_CLICK +# ^UnComponentsSubText1 +Select the type of uninstall: +# ^UnComponentsSubText2_NoInstTypes +Select components to uninstall: +# ^UnComponentsSubText2 +Or, select the optional components you wish to uninstall: +# ^DirText +Setup will install $(^NameDA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK +# ^DirSubText +Destination Folder +# ^DirBrowseText +Select the folder to install $(^NameDA) in: +# ^UnDirText +Setup will uninstall $(^NameDA) from the following folder. To uninstall from a different folder, click Browse and select another folder. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Select the folder to uninstall $(^NameDA) from: +# ^SpaceAvailable +"Space available: " +# ^SpaceRequired +"Space required: " +# ^UninstallingText +$(^NameDA) will be uninstalled from the following folder. $_CLICK +# ^UninstallingSubText +Uninstalling from: +# ^FileError +Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Abort to stop the installation,\r\nRetry to try again, or\r\nIgnore to skip this file. +# ^FileError_NoIgnore +Error opening file for writing: \r\n\r\n$0\r\n\r\nClick Retry to try again, or\r\nCancel to stop the installation. +# ^CantWrite +"Can't write: " +# ^CopyFailed +Copy failed +# ^CopyTo +"Copy to " +# ^Registering +"Registering: " +# ^Unregistering +"Unregistering: " +# ^SymbolNotFound +"Could not find symbol: " +# ^CouldNotLoad +"Could not load: " +# ^CreateFolder +"Create folder: " +# ^CreateShortcut +"Create shortcut: " +# ^CreatedUninstaller +"Created uninstaller: " +# ^Delete +"Delete file: " +# ^DeleteOnReboot +"Delete on reboot: " +# ^ErrorCreatingShortcut +"Error creating shortcut: " +# ^ErrorCreating +"Error creating: " +# ^ErrorDecompressing +Error decompressing data! Corrupted installer? +# ^ErrorRegistering +Error registering DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Execute: " +# ^Extract +"Extract: " +# ^ErrorWriting +"Extract: error writing to file " +# ^InvalidOpcode +Installer corrupted: invalid opcode +# ^NoOLE +"No OLE for: " +# ^OutputFolder +"Output folder: " +# ^RemoveFolder +"Remove folder: " +# ^RenameOnReboot +"Rename on reboot: " +# ^Rename +"Rename: " +# ^Skipped +"Skipped: " +# ^CopyDetails +Copy Details To Clipboard +# ^LogInstall +Log install process +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/English.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/English.nsh new file mode 100644 index 0000000000..4da2e096c7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/English.nsh @@ -0,0 +1,129 @@ +;Language: English (1033) +;By Joost Verburg + +!insertmacro LANGFILE "English" "English" "English" "English" ; See \Include\LangFile.nsh for a description of these parameters + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Welcome to $(^NameDA) Setup" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup will guide you through the installation of $(^NameDA).$\r$\n$\r$\nIt is recommended that you close all other applications before starting Setup. This will make it possible to update relevant system files without having to reboot your computer.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Welcome to $(^NameDA) Uninstall" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Setup will guide you through the uninstallation of $(^NameDA).$\r$\n$\r$\nBefore starting the uninstallation, make sure $(^NameDA) is not running.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "License Agreement" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Please review the license terms before installing $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to install $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to install $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "License Agreement" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Please review the license terms before uninstalling $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to uninstall $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to uninstall $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to uninstall $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Press Page Down to see the rest of the agreement." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choose Components" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to install." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choose Components" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to uninstall." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Position your mouse over a component to see its description." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Select a component to see its description." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choose Install Location" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choose the folder in which to install $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choose Uninstall Location" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choose the folder from which to uninstall $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installing" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Please wait while $(^NameDA) is being installed." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation Complete" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup was completed successfully." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation Aborted" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup was not completed successfully." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstalling" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Please wait while $(^NameDA) is being uninstalled." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Uninstallation Complete" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall was completed successfully." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Uninstallation Aborted" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall was not completed successfully." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completing $(^NameDA) Setup" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) has been installed on your computer.$\r$\n$\r$\nClick Finish to close Setup." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the installation of $(^NameDA). Do you want to reboot now?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completing $(^NameDA) Uninstall" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) has been uninstalled from your computer.$\r$\n$\r$\nClick Finish to close Setup." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the uninstallation of $(^NameDA). Do you want to reboot now?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot now" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "I want to manually reboot later" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Run $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Show Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finish" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choose Start Menu Folder" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choose a Start Menu folder for the $(^NameDA) shortcuts." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Select the Start Menu folder in which you would like to create the program's shortcuts. You can also enter a name to create a new folder." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Do not create shortcuts" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Uninstall $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remove $(^NameDA) from your computer." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Setup?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Uninstall?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choose Users" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Choose for which users you want to install $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Select whether you want to install $(^NameDA) only for yourself or for all users of this computer. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Install for anyone using this computer" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Install just for me" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nlf new file mode 100644 index 0000000000..f2f9e82daa --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID (none exists for Esperanto at the moment) +9998 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +- +# RTL - anything else than RTL means LTR +- +# Translation v4.0.3 by Felipe Castro +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalado de $(^Name) +# ^UninstallCaption +Malinstalado de $(^Name) +# ^LicenseSubCaption +: Permes-Kontrakto +# ^ComponentsSubCaption +: Instaladaj Opcioj +# ^DirSubCaption +: Instalada Dosierujo +# ^InstallingSubCaption +: Oni Instalas Dosierojn +# ^CompletedSubCaption +: Kompletite +# ^UnComponentsSubCaption +: Malinstaladaj Opcioj +# ^UnDirSubCaption +: Malinstalada Dosierujo +# ^ConfirmSubCaption +: Konfirmo +# ^UninstallingSubCaption +: Oni malinstalas +# ^UnCompletedSubCaption +: Kompletite +# ^BackBtn +< &Antauxe +# ^NextBtn +&Sekve > +# ^AgreeBtn +&Akceptite +# ^AcceptBtn +Mi &akceptas la kondicxojn de la Permes-Kontrakto +# ^DontAcceptBtn +Mi &ne akceptas la kondicxojn de la Permes-Kontrakto +# ^InstallBtn +&Instali +# ^UninstallBtn +&Malinstali +# ^CancelBtn +Nuligi +# ^CloseBtn +&Fermi +# ^BrowseBtn +&Sercxi... +# ^ShowDetailsBtn +Vidi &Detalojn +# ^ClickNext +Musklaku en 'Sekve' por dauxrigi. +# ^ClickInstall +Musklaku en 'Instali' por ekigi la instaladon. +# ^ClickUninstall +Musklaku en 'Malinstali' por ekigi la malinstaladon. +# ^Name +Nomo +# ^Completed +Kompletite +# ^LicenseText +Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'. +# ^LicenseTextCB +Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK +# ^LicenseTextRB +Bonvole revidu la permes-akordon antaux ol instali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK +# ^UnLicenseText +Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en 'Akceptite'. +# ^UnLicenseTextCB +Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, musklaku en la suba elekt-skatolo. $_CLICK +# ^UnLicenseTextRB +Bonvole revidu la permes-akordon antaux ol malinstali $(^NameDA). Se vi konsentas kun cxiuj kondicxoj de la permeso, elektu la unuan opcion sube. $_CLICK +# ^Custom +Personigite +# ^ComponentsText +Marku la konsisterojn, kiujn vi deziras instali kaj malmarku tiujn, kiujn vi ne deziras instali. $_CLICK +# ^ComponentsSubText1 +Elektu la tipon de instalado: +# ^ComponentsSubText2_NoInstTypes +Elektu la konsisterojn por instali: +# ^ComponentsSubText2 +Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras instali: +# ^UnComponentsText +Marku la konsisterojn, kiujn vi volas malinstali aux male. $_CLICK +# ^UnComponentsSubText1 +Elektu la tipon de malinstalado: +# ^UnComponentsSubText2_NoInstTypes +Elektu la konsisterojn por malinstali: +# ^UnComponentsSubText2 +Aux, elektu la nedevigajn konsisterojn, kiujn vi deziras malinstali: +# ^DirText +$(^NameDA) estos instalita en la jena dosierujo. Por instali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK +# ^DirSubText +Celota Dosierujo +# ^DirBrowseText +Elektu dosierujon por instali $(^NameDA): +# ^UnDirText +$(^NameDA) estos malinstalita el la jena dosierujo. Por malinstali en alia dosierujo, musklaku en 'Sercxi...' kaj elektu gxin. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Elektu dosierujon el kie $(^NameDA) estos malinstalita: +# ^SpaceAvailable +"Disponebla spaco: " +# ^SpaceRequired +"Postulata spaco: " +# ^UninstallingText +$(^NameDA) estos malinstalita el la jena dosierujo. $_CLICK +# ^UninstallingSubText +Malinstalado el: +# ^FileError +Eraro dum malfermo de dosiero por skribi: \r\n\t"$0"\r\nMusklaku en Cxesigi por finigi la instaladon,\r\Ripeti por provi refoje skribi sur la dosiero, aux\r\nPreteratenti por preteratenti tiun cxi dosieron. +# ^FileError_NoIgnore +Eraro dum malfermo de dosierujo por skribi: \r\n\t"$0"\r\nMusklaku en Ripeti por provi refoje skribi sur la dosiero, aux\r\nNuligi por cxesigi la instaladon. +# ^CantWrite +"Ne eblis skribi: " +# ^CopyFailed +Malsukceso dum kopio +# ^CopyTo +"Kopii al " +# ^Registering +"Oni registras: " +# ^Unregistering +"Oni malregistras: " +# ^SymbolNotFound +"Ne trovita simbolo: " +# ^CouldNotLoad +"Ne eblis sxargi: " +# ^CreateFolder +"Oni kreas subdosierujon: " +# ^CreateShortcut +"Oni kreas lancxilon: " +# ^CreatedUninstaller +"Oni kreas malinstalilon: " +# ^Delete +"Oni forigas dosieron: " +# ^DeleteOnReboot +"Forigi je restarto: " +# ^ErrorCreatingShortcut +"Eraro dum kreo de lancxilo: " +# ^ErrorCreating +"Eraro dum kreo: " +# ^ErrorDecompressing +Eraro dum malkompaktigo de datumaro! Cxu misrompita instalilo? +# ^ErrorRegistering +Eraru dum registro de DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Lancxi: " +# ^Extract +"Eltiri: " +# ^ErrorWriting +"Eltirado: eraro dum skribo de dosiero " +# ^InvalidOpcode +Misrompita instalilo: malvalida operaci-kodo +# ^NoOLE +"Sen OLE por: " +# ^OutputFolder +"Celota dosierujo: " +# ^RemoveFolder +"Oni forigas la dosierujon: " +# ^RenameOnReboot +"Renomigi je restarto: " +# ^Rename +"Oni renomigas: " +# ^Skipped +"Preterpasita: " +# ^CopyDetails +Kopii detalojn al la tondejo +# ^LogInstall +Registri instalad-procezo +# ^Byte +B +# ^Kilo + k +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nsh new file mode 100644 index 0000000000..cdbdd30ac7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Esperanto.nsh @@ -0,0 +1,129 @@ +;Language: Esperanto (0) +;By Felipe Castro + +!insertmacro LANGFILE "Esperanto" = "Esperanto" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Instalado de $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la instalado de $(^NameDA).$\r$\n$\r$\nOni rekomendas fermi cxiujn aliajn aplikajxojn antaux ol ekigi la Instaladon. Tio cxi ebligos al la Instalilo gxisdatigi la koncernajn dosierojn de la sistemo sen bezono restartigi la komputilon.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bonvenon al la Gvidilo por Malinstalado de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tiu cxi gvidilo helpos vin dum la malinstalado de $(^NameDA).$\r$\n$\r$\nAntaux ol ekigi la malinstalado, certigxu ke $(^NameDA) ne estas plenumata nun.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Permes-Kontrakto" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol instali la programon $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por instali la programon $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por instali la programon $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Permes-Kontrakto" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bonvole, kontrolu la kondicxojn de la permesilo antaux ol malinstali la programon $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se vi akceptas la kondicxojn, musklaku en 'Akceptite' por dauxrigi. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se vi akceptas la permes-kondicxojn, musklaku la suban elekt-skatolon. Vi devos akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se vi akceptas la permes-kondicxojn, elektu la unuan opcion sube. Vi devas akcepti la kontrakton por malinstali la programon $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premu 'Page Down' por rigardi la reston de la permeso." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Elekto de Konsisteroj" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras instali." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Elekto de Konsisteroj" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Elektu kiujn funkciojn de $(^NameDA) vi deziras malinstali." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Priskribo" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Poziciu la muson sur konsistero por rigardi ties priskribon." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elekto de la Instalada Loko" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon en kiun vi deziras instali la programon $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elekto de la Malinstalada Loko" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elektu la dosierujon el kiu vi deziras malinstali la programon $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Oni instalas" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas instalata." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalado Plenumite" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalado sukcese plenumigxis." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalado Cxesigite" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalado ne plenumigxis sukcese." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Oni malinstalas" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bonvole, atendu dum $(^NameDA) estas malinstalata." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Malinstalado Plenumite" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La malinstalado sukcese plenumigxis." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Malinstalado Cxesigxite" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La malinstalado ne plenumigxis sukcese." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Instalado de $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) estas instalita en via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la instaladon de $(^NameDA). Cxu restartigi nun?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Oni finigas la Gvidilon por Malinstalado de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) estis forigita el via komputilo.$\r$\n$\r$\nMusklaku en Finigi por fermi tiun cxi gvidilon." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Via komputilo devas esti restartigita por kompletigi la malinstaladon de $(^NameDA). Cxu restartigi nun?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Restartigi Nun" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Mi volas restartigi permane poste" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Lancxi $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Montri Legumin" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Finigi" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elektu Dosierujon de la Ek-Menuo" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elektu dosierujon de la Ek-Menuo por la lancxiloj de la programo." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Elektu dosierujon de la Ek-Menuo en kiu vi deziras krei la lancxilojn de la programo. Vi povas ankaux tajpi nomon por krei novan ujon." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne krei lancxilojn" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Malinstali $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Forigi $(^NameDA) el via komputilo." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Cxu vi certe deziras nuligi la instaladon de $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Cxu vi certe deziras nuligi la malinstaladon de $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elekti Uzantojn" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elekti por kiuj uzantoj vi deziras instali $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elektu cxu vi volas instali $(^NameDA) por vi mem aux por cxiuj uzantoj de tiu cxi komputilo. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instali por iu ajn uzanto de tiu cxi komputilo" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instali nur por mi" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nlf new file mode 100644 index 0000000000..d43f259a18 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1061 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1257 +# RTL - anything else than RTL means LTR +- +# Translation by izzo (izzo@hot.ee) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Paigaldamine +# ^UninstallCaption +$(^Name) Eemaldamine +# ^LicenseSubCaption +: Litsentsileping +# ^ComponentsSubCaption +: Paigaldusvalikud +# ^DirSubCaption +: Paigalduskaust +# ^InstallingSubCaption +: Paigaldan +# ^CompletedSubCaption +: Valmis +# ^UnComponentsSubCaption +: Eemaldusvalikud +# ^UnDirSubCaption +: Eemalduskaust +# ^ConfirmSubCaption +: Kinnitus +# ^UninstallingSubCaption +: Eemaldan +# ^UnCompletedSubCaption +: Valmis +# ^BackBtn +< Tagasi +# ^NextBtn +Edasi > +# ^AgreeBtn +Nõustun +# ^AcceptBtn +Nõustun litsentsilepingu tingimustega +# ^DontAcceptBtn +Ei nõustu litsentsilepingu tingimustega +# ^InstallBtn +Paigalda +# ^UninstallBtn +Eemalda +# ^CancelBtn +Loobu +# ^CloseBtn +Sule +# ^BrowseBtn +Sirvi... +# ^ShowDetailsBtn +Detailid +# ^ClickNext +Jätkamiseks vajuta Edasi. +# ^ClickInstall +Paigaldamise alustamiseks vajuta Paigalda. +# ^ClickUninstall +Eemaldamise alustamiseks vajuta Eemalda. +# ^Name +Nimi +# ^Completed +Valmis +# ^LicenseText +Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun. +# ^LicenseTextCB +Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK +# ^LicenseTextRB +Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK +# ^UnLicenseText +Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vajuta Nõustun. +# ^UnLicenseTextCB +Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, vali allolev märkeruut. $_CLICK +# ^UnLicenseTextRB +Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle. Kui sa nõustud kõigi lepingu tingimustega, märgi allpool esimene valik. $_CLICK +# ^Custom +Kohandatud +# ^ComponentsText +Märgista komponendid mida soovid paigaldada ja eemalda märgistus neilt, mida ei soovi paigaldada. $_CLICK +# ^ComponentsSubText1 +Vali paigalduse tüüp: +# ^ComponentsSubText2_NoInstTypes +Vali paigaldatavad komponendid: +# ^ComponentsSubText2 +või vali lisakomponendid mida soovid paigaldada: +# ^UnComponentsText +Märgista komponendid mida soovid eemaldada ja eemalda märgistus neilt, mida ei soovi eemaldada. $_CLICK +# ^UnComponentsSubText1 +Vali eemalduse tüüp: +# ^UnComponentsSubText2_NoInstTypes +Vali eemaldatavad komponendid: +# ^UnComponentsSubText2 +või vali lisakomponendid mida soovid eemaldada: +# ^DirText +$(^NameDA) paigaldatakse järgmisse kausta. Et mujale paigaldada, vajuta sirvi ja vali teine kaust. $_CLICK +# ^DirSubText +Sihtkaust +# ^DirBrowseText +Vali kaust kuhu $(^NameDA) paigaldada: +# ^UnDirText +$(^NameDA) eemaldatakse järgmisest kaustast. Et mujalt eemaldada, vajuta sirvi ja vali teine kaust. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Vali kaust kust $(^NameDA) eemaldada: +# ^SpaceAvailable +"Vaba ruum: " +# ^SpaceRequired +"Vajalik ruum: " +# ^UninstallingText +$(^NameDA) eemaldatakse järgmisest kaustast. $_CLICK +# ^UninstallingSubText +Eemaldan sealt: +# ^FileError +Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nPaigalduse katkestamiseks vajuta Katkesta,\r\nvajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nIgnoreeri, et see fail vahele jätta. +# ^FileError_NoIgnore +Tõrge faili avamisel kirjutamiseks: \r\n\t"$0"\r\nVajuta Ürita uuesti, et faili kirjutamist uuesti proovida, või\r\nLoobu, et paigaldamine katkestada +# ^CantWrite +"Ei saa kirjutada: " +# ^CopyFailed +Kopeerimine ebaõnnestus +# ^CopyTo +"Kopeeri sinna " +# ^Registering +"Registreerin: " +# ^Unregistering +"Deregistreerin: " +# ^SymbolNotFound +"Ei leidnud sümbolit: " +# ^CouldNotLoad +"Ei saanud laadida: " +# ^CreateFolder +"Loo kaust: " +# ^CreateShortcut +"Loo otsetee: " +# ^CreatedUninstaller +"Loodud eemaldaja: " +# ^Delete +"Kustuta fail: " +# ^DeleteOnReboot +"Kustuta taaskäivitamisel: " +# ^ErrorCreatingShortcut +"Tõrge otsetee loomisel: " +# ^ErrorCreating +"Tõrge loomisel: " +# ^ErrorDecompressing +Tõrge andmete lahtipakkimisel! Vigane paigaldaja? +# ^ErrorRegistering +Tõrge DLL-i registreerimisel +# ^ExecShell +"ExecShell: " +# ^Exec +"Käivita: " +# ^Extract +"Paki lahti: " +# ^ErrorWriting +"Paki lahti: viga faili kirjutamisel " +# ^InvalidOpcode +Paigaldaja kõlbmatu: vigane opkood +# ^NoOLE +"No OLE for: " +# ^OutputFolder +"Väljastatav kaust: " +# ^RemoveFolder +"Eemalda kaust: " +# ^RenameOnReboot +"Taaskäivitusel nimeta ümber: " +# ^Rename +"Nimeta ümber: " +# ^Skipped +"Vahele jäetud: " +# ^CopyDetails +Kopeeri detailid lõikelauale +# ^LogInstall +Logi paigaldusprotsess +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nsh new file mode 100644 index 0000000000..a780a6fa18 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Estonian.nsh @@ -0,0 +1,121 @@ +;Language: Estonian (1061) +;Translated by johnny izzo (izzo@hot.ee) + +!insertmacro LANGFILE "Estonian" = "Eesti keel" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) paigaldamine!" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "See abiline aitab paigaldada $(^NameDA).$\r$\n$\r$\nEnne paigaldamise alustamist on soovitatav kõik teised programmid sulgeda, see võimaldab teatud süsteemifaile uuendada ilma arvutit taaskäivitamata.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) eemaldamine!" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "See abiline aitab eemaldada $(^NameDA).$\r$\n$\r$\nEnne eemaldamist vaata, et $(^NameDA) oleks suletud.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Litsentsileping" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Enne $(^NameDA) paigaldamist vaata palun litsentsileping üle." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) paigaldamiseks pead sa lepinguga nõustuma." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) paigaldamiseks pead lepinguga nõustuma. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Litsentsileping" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Enne $(^NameDA) eemaldamist vaata palun litsentsileping üle." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Kui sa oled lepingu tingimustega nõus, vali jätkamiseks Nõustun. $(^NameDA) eemaldamiseks pead sa lepinguga nõustuma." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Kui nõustud lepingu tingimustega, vali allolev märkeruut. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kui nõustud lepingu tingimustega, märgi allpool esimene valik. $(^NameDA) eemaldamiseks pead lepinguga nõustuma. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Vajuta Page Down, et näha ülejäänud teksti." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vali komponendid" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid paigaldada." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vali komponendid" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vali millised $(^NameDA) osad sa soovid eemaldada." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Kirjeldus" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Nihuta hiir komponendile, et näha selle kirjeldust." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vali komponent, et näha selle kirjeldust." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vali asukoht" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vali kaust kuhu paigaldada $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vali asukoht" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vali kaust kust $(^NameDA) eemaldada." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Paigaldan..." + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on paigaldatud." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Programm paigaldatud" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Paigaldus edukalt sooritatud." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Paigaldus katkestatud" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Paigaldamine ebaõnnestus." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eemaldan..." + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Palun oota kuni $(^NameDA) on eemaldatud." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Eemaldamine lõpetatud" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Eemaldamine edukalt lõpule viidud." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Eemaldamine katkestatud" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Eemaldamine ebaõnestus." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) paigalduse lõpule viimine." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutisse paigaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks paigaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) eemaldamise lõpule viimine." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on sinu arvutist eemaldatud.$\r$\n$\r$\nAbilise sulgemiseks vajuta Lõpeta." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) täielikuks eemaldamiseks tuleb arvuti taaskäivitada. Kas soovid arvuti kohe taaskäivitada ?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Taaskäivita kohe" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Taaskäivitan hiljem käsitsi" + ${LangFileString} MUI_TEXT_FINISH_RUN "Käivita $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Kuva Loemind" + ${LangFileString} MUI_BUTTONTEXT_FINISH "Lõpeta" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vali Start-menüü kaust" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vali $(^NameDA) otseteede jaoks Start-menüü kaust." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vali Start-menüü kaust, kuhu soovid paigutada programmi otseteed. Võid ka sisestada nime, et luua uus kaust." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ära loo otseteid" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Eemalda $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eemalda $(^NameDA) oma arvutist." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) paigaldamise katkestada?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Oled sa kindel et soovid $(^Name) eemaldamise katkestada?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nlf new file mode 100644 index 0000000000..b048e4434b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1065 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1256 +# RTL - anything else than RTL means LTR +RTL +# Translation By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com, Elnaz Sarbar +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +نصب $(^Name) +# ^UninstallCaption +حذف $(^Name) +# ^LicenseSubCaption +: مجوز نصب +# ^ComponentsSubCaption +: گزینه‌های نصب +# ^DirSubCaption +: پوشه نصب +# ^InstallingSubCaption +: در حال نصب +# ^CompletedSubCaption +: پایان یافت +# ^UnComponentsSubCaption +: گزینه‌های حذف +# ^UnDirSubCaption +: پوشه‌ی حذف +# ^ConfirmSubCaption +: تأیید +# ^UninstallingSubCaption +: در حال حذف +# ^UnCompletedSubCaption +: پایان یافت +# ^BackBtn +&قبل +# ^NextBtn +&بعد +# ^AgreeBtn +&موافقم +# ^AcceptBtn +من همه‌ی بندهای مجوز را قبول &دارم +# ^DontAcceptBtn +من بندهای مجوز را قبول &ندارم +# ^InstallBtn +&نصب +# ^UninstallBtn +&حذف +# ^CancelBtn +انصراف +# ^CloseBtn +&بستن +# ^BrowseBtn +&مرور... +# ^ShowDetailsBtn +نمایش جزئیات +# ^ClickNext +برای ادامه روی دکمه‌ی بعد کلیک کنید. +# ^ClickInstall +برای شروع نصب روی دکمه‌ی نصب کلیک کنید. +# ^ClickUninstall +برای شروع حذف روی دکمه‌ی حذف کلیک کنید. +# ^Name +نام +# ^Completed +پایان یافت +# ^LicenseText +لطفاً قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی دکمه‌ی موافقم کلیک کنید. +# ^LicenseTextCB +لطفاً قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی جعبه نشانه‌زنی زیر کلیک کنید. $_CLICK +# ^LicenseTextRB +لطفاً قبل از نصب $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید گزینه‌ی اول را انتخاب کنید. $_CLICK +# ^UnLicenseText +لطفاً قبل از حذف $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی دکمه‌ی موافقم کلیک کنید. +# ^UnLicenseTextCB +لطفاً قبل از حذف $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید روی جعبه نشانه‌زنی زیر کلیک کنید. $_CLICK +# ^UnLicenseTextRB +لطفاً قبل از حذف $(^NameDA) متن مجوز را بخوانید. اگر همه‌ی بندهای آن را قبول دارید گزینه‌ی اول را انتخاب کنید. $_CLICK +# ^Custom +سفارشی +# ^ComponentsText +کنار بخش‌هایی که می‌خواهید نصب شوند نشانه بزنید و نشانه بخش‌هایی را که نمی‌خواهید نصب شوند بردارید. $_CLICK +# ^ComponentsSubText1 +نوع نصب را مشخص کنید: +# ^ComponentsSubText2_NoInstTypes +بخش‌هایی را که می‌خواهید نصب شوند انتخاب کنید: +# ^ComponentsSubText2 +یا، بخش‌های اختیاری را که می‌خواهید نصب شوند انتخاب کنید: +# ^UnComponentsText +کنار بخش‌هایی که می‌خواهید حذف شوند نشانه بزنید و نشانه بخش‌هایی را که نمی‌خواهید حذف شوند بردارید. $_CLICK +# ^UnComponentsSubText1 +نوع حذف را انتخاب کنید: +# ^UnComponentsSubText2_NoInstTypes +بخش‌هایی را که می‌خواهید حذف شوند انتخاب کنید: +# ^UnComponentsSubText2 +یا، بخش‌های اختیاری را که می‌خواهید حذف شوند انتخاب کنید: +# ^DirText +برنامه نصب، $(^NameDA) را در پوشه‌ی زیر نصب خواهد کرد. برای نصب در پوشه‌ی دیگر روی دکمه مرور کلیک کنید و پوشه‌ی دیگری انتخاب کنید. $_CLICK +# ^DirSubText +پوشه‌ی مقصد +# ^DirBrowseText +انتخاب پوشه برای نصب $(^NameDA): +# ^UnDirText +برنامه نصب، $(^NameDA) را از پوشه‌ی زیر حذف خواهد کرد. برای نصب در پوشه‌ی دیگر روی دکمه مرور کلیک کنید و پوشه‌ی دیگری انتخاب کنید. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +انتخاب پوشه برای حذف $(^NameDA): +# ^SpaceAvailable +"فضای موجود: " +# ^SpaceRequired +"فضای مورد نیاز: " +# ^UninstallingText +$(^NameDA) از پوشه‌ی زیر حذف خواهد شد. $_CLICK +# ^UninstallingSubText +حذف از: +# ^FileError +خطا هنگام باز کردن پرونده برای نوشتن: \r\n\r\n$0\r\n\n برای توقف نصب روی Abort \r\n برای تلاش مجدد روی Retry \r\n و برای صرف‌نظر از این پرونده روی Ignore کلیک کنید. +# ^FileError_NoIgnore +خطا هنگام باز کردن پرونده برای نوشتن: \r\n\r\n$0\r\n\nبرای تلاش مجدد روی Retry\r\nو برای انصراف روی Cancel کلیک کنید. +# ^CantWrite +"نوشتن ممکن نیست: " +# ^CopyFailed +نسخه‌برداری ناموفق بود. +# ^CopyTo +"نسخه‌برداری در: " +# ^Registering +"در حال ثبت: " +# ^Unregistering +"در حال حذف ثبت: " +# ^SymbolNotFound +"علامت پیدا نشد: " +# ^CouldNotLoad +"بارگذاری ممکن نیست: " +# ^CreateFolder +"ایجاد پوشه: " +# ^CreateShortcut +"ایجاد میان‌بُر: " +# ^CreatedUninstaller +"حذف‌کننده ایجاد شد: " +# ^Delete +"حذف پرونده: " +# ^DeleteOnReboot +"حذف هنگام راه اندازی مجدد: " +# ^ErrorCreatingShortcut +"خطا هنگام ایجاد میان‌بُر: " +# ^ErrorCreating +"خطا هنگام ایجاد: " +# ^ErrorDecompressing +خطا هنگام باز کردن اطلاعات! نصب‌کننده خراب است؟ +# ^ErrorRegistering +خطا هنگام ثبت DLL +# ^ExecShell +"پوسته اجرایی: " +# ^Exec +"اجرا: " +# ^Extract +"استخراج: " +# ^ErrorWriting +"استخراج: خطا هنگام نوشتن در پرونده" +# ^InvalidOpcode +نصب‌کننده خراب است: کد عملیاتی نامعتبر. +# ^NoOLE +"‏OLE وجود ندارد: " +# ^OutputFolder +"پوشه‌ی خروجی: " +# ^RemoveFolder +"حذف پوشه: " +# ^RenameOnReboot +"تغییر نام هنگام راه اندازی مجدد: " +# ^Rename +"تغییر نام: " +# ^Skipped +"چشم پوشی شد: " +# ^CopyDetails +نسخه‌برداری جزئیات در کلیپ‌برد +# ^LogInstall +ثبت روند نصب +# ^Byte + بایت +# ^Kilo + کیلو +# ^Mega + مگا +# ^Giga + گیگا diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nsh new file mode 100644 index 0000000000..bb0adb4004 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Farsi.nsh @@ -0,0 +1,121 @@ +;Language: Farsi (1065) +;By FzerorubigD - FzerorubigD@gmail.com - Thanx to all people help me in forum.persiantools.com + +!insertmacro LANGFILE "Farsi" "Persian" "فارسی" "Farsi" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "به برنامه نصب $(^NameDA) خوش آمدید." + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "این برنامه شما را در نصب $(^NameDA) یاری می‌کند.$\r$\n$\r$\nتوصیه می‌کنیم کلیه برنامه‌های در حال اجرا را ببندید. این به برنامه نصب اجازه می‌دهد که فایل‌های لازم را بدون نیاز به راه اندازی دوباره‌ی کامپیوتر شما به روز کند.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "به برنامه حذف $(^NameDA) خوش آمدید." + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT " این برنامه برای حذف $(^NameDA) به شما کمک می‌کند.$\r$\n$\r$\nقبل از حذف $(^NameDA) مطمئن شوید این برنامه در حال اجرا نباشد.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "توافقنامه نصب" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "لطفا پیش از نصب $(^NameDA) مفاد توافقنامه را مرور کنید." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "اگر کلیه بندهای توافقنامه را قبول دارید دکمه‌ی موافقم را بفشارید. برای نصب $(^NameDA) شما بایست این توافقنامه را قبول کنید." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "اگر کلیه بندهای توافقنامه را قبول دارید تیک زیر را انتخاب کنید. برای نصب $(^NameDA) شما بایست این توافقنامه را قبول کنید. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "اگر کلیه بندهای توافقنامه را قبول دارید گزینه اول را انتخاب کنید. برای نصب $(^NameDA) شما بایست این توافقنامه را قبول کنید. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "توافقنامه حذف" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "لطفا کلیه بندهای این توافقنامه را قبل ار حذف $(^NameDA) مرور کنید." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "اگر کلیه بندهای توافقنامه را قبول دارید دکمه‌ی موافقم را بفشارید. برای حذف $(^NameDA) شما بایست این توافقنامه را قبول کنید." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "اگر کلیه بندهای توافقنامه را قبول دارید تیک زیر را انتخاب کنید. برای حذف $(^NameDA) شما بایست این توافقنامه ر قبول کنید. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "اگر کلیه بندهای توافقنامه را قبول دارید گزینه اول را انتخاب کنید. برای حذف $(^NameDA) شما بایست این توافقنامه ر قبول کنید. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "برای دیدن متن به صورت کامل از کلید Page Down استفاده کنید." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "انتخاب اجزای برنامه " + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "اجزایی از $(^NameDA) که می‌خواهید نصب شوند را انتخاب کنید." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "انتخاب اجزای برنامه" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "اجزایی از $(^NameDA) را که می‌خواهید حذف کنید انتخاب کنید." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "توضیحات" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "نشانگر ماوس را بر روی اجزایی که می‌خواهید ببرید تا توضیحات آن را ببینید." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "يكي از گزينه هاي نصب را انتخاب كنيد تا توضيحات مربوط به آن را ببينيد." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "انتخاب پوشه نصب" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "پوشه‌ای که می‌خواهید $(^NameDA) در آن نصب شود را انتخاب کنید." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "پوشه حذف را انتخاب کنید" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "پوشه‌ای که می‌خواهید $(^NameDA) را از آن حذف کنید انتخاب کنید." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "نصب برنامه" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "لطفا مدت زمانی که $(^NameDA) در حال نصب است را صبر کنید." + ${LangFileString} MUI_TEXT_FINISH_TITLE "نصب پایان یافت" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "برنامه نصب با موفقیت پایان یافت." + ${LangFileString} MUI_TEXT_ABORT_TITLE "برنامه نصب لغو شد." + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "برنامه نصب به صورت نیمه تمام پایان یافت." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "حذف برنامه" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "لطفا مدت زمانی که $(^NameDA) در حال حذف است را صبر کنید." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "حذف پایان یافت" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "برنامه حذف با موفقیت پایان یافت." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "برنامه حذف لغو شد" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "برنامه حذف به صورت نیمه تمام پایان یافت" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "برنامه نصب $(^NameDA) پایان یافت" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) بر روی کامپیوتر شما نصب شد.$\r$\n$\r$\nبر روی دکمه‌ی پایان برای خروج از این برنامه کلیک کنید." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "کامپیوتر شما برای تکمیل نصب $(^NameDA) بایستی دوباره راه اندازی شود. آیا می‌خواهید این کار را الان انجام دهید؟" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "برنامه حذف $(^NameDA) پایان یافت" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) از روی کامپیوتر شما حذف شد.$\r$\n$\r$\nبر روی دکمه‌ی پایان برای خروج از این برنامه کلیک کنید." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "کامپیوتر شما برای تکمیل حذف$(^NameDA) بایست دوباره راه اندازی شود.آیا می‌خواهید این کار را الان انجام دهید؟" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "راه اندازی مجدد." + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "من خودم این کار را انجام خواهم داد." + ${LangFileString} MUI_TEXT_FINISH_RUN "&اجرای $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&نمایش فایل توضیحات" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&پایان" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "انتخاب پوشه در منوی برنامه‌ها" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "پوشه‌ای که می‌خواهید میانبرهای $(^NameDA) در آن قرار بگیرند را انتخاب کنید." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "پوشه‌ای در منوی برنامه‌ها که می‌خواهید میانبرهای برنامه در آنجا ایجاد شوند را انتخاب کنید. برای ایجاد یک پوشه جدید میتوانید یک نام تایپ کنید." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "میانبری نساز" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "حذف $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "پاک کردن $(^NameDA) از روی کامپیوتر شما." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "آیا مطمئنید که می‌خواهید از برنامه نصب $(^Name) خارج شوید؟" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "آیا مطمئنید که می‌خواهید از برنامه حذف $(^Name) خارج شوید؟" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nlf new file mode 100644 index 0000000000..6e01c723e7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nlf @@ -0,0 +1,193 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1035 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Eclipser (Jonne Lehtinen) +# Corrections by the Mozilla.fi crew +# Upd 11/08 by WTLib Team +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) -asennus +# ^UninstallCaption +$(^Name) -poisto +# ^LicenseSubCaption +: Lisenssisopimus +# ^ComponentsSubCaption +: Asennusvalinnat +# ^DirSubCaption +: Asennuskansio +# ^InstallingSubCaption +: Asennetaan +# ^CompletedSubCaption +: Valmis +# ^UnComponentsSubCaption +: Poistovalinnat +# ^UnDirSubCaption +: Poistokansio +# ^ConfirmSubCaption +: Varmistus +# ^UninstallingSubCaption +: Poistetaan +# ^UnCompletedSubCaption +: Valmis +# ^BackBtn +< &Edellinen +# ^NextBtn +&Seuraava > +# ^AgreeBtn +&Hyväksyn +# ^AcceptBtn +Hyväksyn lisenssisopimuksen ehdot +# ^DontAcceptBtn +En hyväksy sopimuksen ehtoja +# ^InstallBtn +&Asenna +# ^UninstallBtn +&Poista +# ^CancelBtn +Peruuta +# ^CloseBtn +&Sulje +# ^BrowseBtn +S&elaa... +# ^ShowDetailsBtn +&Näytä tiedot +# ^ClickNext +Jatka valitsemalla Seuraava. +# ^ClickInstall +Aloita asennus valitsemalla Asenna. +# ^ClickUninstall +Aloita asennuksen poisto valitsemalla Poista. +# ^Name +Nimi +# ^Completed +Valmis +# ^LicenseText +Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn. +# ^LicenseTextCB +Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK +# ^LicenseTextRB +Lue lisenssisopimus ennen asennusta ja jos hyväksyt sopimuksen kaikki ehdot, valitse alta ensimmäinen valinta. $_CLICK +# ^UnLicenseText +Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, valitse Hyväksyn. +# ^UnLicenseTextCB +Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, laita rasti ruutuun. $_CLICK +# ^UnLicenseTextRB +Lue lisenssisopimus ennen asennuksen poistoa ja jos hyväksyt sopimuksen kaikki ehdot, valitse alta ensimmäinen valinta. $_CLICK +# ^Custom +Mukautettu +# ^ComponentsText +Valitse asennettavat komponentit ja poista valinnat niistä, joita et halua asentaa. $_CLICK +# ^ComponentsSubText1 +Valitse asennustyyppi: +# ^ComponentsSubText2_NoInstTypes +Valitse asennettavat komponentit: +# ^ComponentsSubText2 +Tai valitse valinnaiset komponentit, jotka haluat asentaa: +# ^UnComponentsText +Valitse poistettavat komponentit ja poista valinnat niistä, joita et haluat poistaa. $_CLICK +# ^UnComponentsSubText1 +Valitse poistotyyppi: +# ^UnComponentsSubText2_NoInstTypes +Valitse poistettavat komponentit: +# ^UnComponentsSubText2 +Tai valitse valinnaiset komponentit, jotka haluat poistaa +# ^DirText +$(^NameDA) -asennetaan seuraavaan kansioon. Jos haluat asentaa sen eri kansioon, valitse kansio painamalla Selaa. $_CLICK +# ^DirSubText +Kohdekansio +# ^DirBrowseText +Valitse kansio, johon $(^NameDA) asennetaan: +# ^UnDirText +$(^NameDA) poistetaan seuraavasta kansiosta. Jos haluat poistaa sen eri kansiosta, valitse kansio painamalla Selaa. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Valitse kansio, josta $(^NameDA) poistetaan: +# ^SpaceAvailable +"Tilaa vapaana: " +# ^SpaceRequired +"Tarvittava tila: " +# ^UninstallingText +Tämä asentaja poistaa $(^NameDA) -asennuksen tietokoneelta. $_CLICK +# ^UninstallingSubText +Poistetaan kansiosta: +# ^FileError +Tiedostomuutoksia ei voida tallentaa: \r\n\t"$0"\r\nLopeta asennus valitsemalla Keskeytä,\r\nyritä uudelleen valitsemalla Uudelleen, tai\r\nohita tiedosto valitsemalla Ohita. +# ^FileError_NoIgnore +Tiedostomuutoksia ei voida tallentaa: \r\n\t"$0"\r\nYritä uudelleen valitsemalla Uudelleen tai\r\nlopeta asennus valitsemalla Keskeytä. +# ^CantWrite +"Tiedostomuutoksia ei voida tallentaa: " +# ^CopyFailed +Kopiointi epäonnistui +# ^CopyTo +"Kopioidaan kohteeseen " +# ^Registering +"Rekisteröidään: " +# ^Unregistering +"Poistetaan rekisteröinti: " +# ^SymbolNotFound +"Symbolia ei löytynyt: " +# ^CouldNotLoad +"Lataus epäonnistui: " +# ^CreateFolder +"Luo kansio: " +# ^CreateShortcut +"Luo pikakuvake: " +# ^CreatedUninstaller +"Asennuksen poisto luotiin: " +# ^Delete +"Poista: " +# ^DeleteOnReboot +"Poista uudelleenkäynnistyksen yhteydessä: " +# ^ErrorCreatingShortcut +"Virhe luotaessa pikakuvaketta: " +# ^ErrorCreating +"Virhe luotaessa: " +# ^ErrorDecompressing +Pakettia ei voitu purkaa. Onko asennuksen poisto vioittunut? +# ^ErrorRegistering +Virhe rekisteröitäessä DLL-tiedostoa +# ^ExecShell +"ExecShell: " +# ^Exec +"Suorita: " +# ^Extract +"Pura: " +# ^ErrorWriting +"Pura: tiedostomuutoksia ei voitu tallentaa " +# ^InvalidOpcode +Asennuspaketti on vioittunut: virheellinen opcode +# ^NoOLE +"OLE puuttuu: " +# ^OutputFolder +"Kansio: " +# ^RemoveFolder +"Poista kansio: " +# ^RenameOnReboot +"Nimeä uudelleen uudelleenkäynnistyksen yhteydessä: " +# ^Rename +"Nimeä uudelleen: " +# ^Skipped +"Ohitettiin: " +# ^CopyDetails +Kopioi tiedot leikepöydälle +# ^LogInstall +Tallenna asennusloki +# ^Byte +t +# ^Kilo + k +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nsh new file mode 100644 index 0000000000..382789952b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Finnish.nsh @@ -0,0 +1,125 @@ +;Compatible with Modern UI 1.86 +;Language: Finnish (1035) +;By Eclipser (Jonne Lehtinen) +;Updated by Puuhis (puuhis@puuhis.net) +;Updated 11/08 by WTLib Team +;Updated 01/24 by olavinto (Oskari Lavinto) (l18npub@olavinto.simplelogin.com) + +!insertmacro LANGFILE "Finnish" = "Suomi" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Tervetuloa $(^NameDA) -asennukseen" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Näet tarpeellisia ohjeita $(^NameDA) -asennuksen edistyessä.$\r$\n$\r$\nKaikki muut sovellukset kannattaa sulkea ennen asennuksen aloitusta, jotta asennus voi päivittää järjestelmätiedostoja käynnistämättä tietokonetta uudelleen.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tervetuloa $(^NameDA) -asennuksen poistoon" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Saat tarvittavia ohjeita sitä mukaa kuin $(^NameDA) -asennuksen poisto edistyy.$\r$\n$\r$\nVarmista ennen asennuksen poiston aloitusta, ettei $(^NameDA) ole käynnissä.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Käyttöoikeussopimus" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lue käyttöehdot huolellisesti ennen $(^NameDA) -asennusta." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jos hyväksyt ehdot, valitse Hyväksyn. Asennus edellyttää käyttöehtojen hyväksyntää." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, laita rasti ruutuun. Asennus edellyttää käyttöehtojen hyväksyntää. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse alta ensimmäinen valinta. Asennus edellyttää käyttöehtojen hyväksyntää. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Käyttöoikeussopimus" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lue käyttöehdot huolellisesti ennen $(^NameDA) -asennuksen poistoa." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jos hyväksyt ehdot, valitse Hyväksyn. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jos hyväksyt ehdot, laita rasti ruutuun. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jos hyväksyt ehdot, valitse alta ensimmäinen valinta. Asennuksen poisto edellyttää käyttöehtojen hyväksyntää. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Vieritä ja näytä sopimusta lisää painamalla Page Down -näppäintä." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Valitse komponentit" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Valitse asennettavat $(^NameDA) -ominaisuudet." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Valitse komponentit" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Valitse $(^NameDA) -ominaisuudet, jotka haluat poistaa." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Kuvaus" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Näytä komponentin kuvaus osoittamalla sitä hiirellä." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Näytä komponentin kuvaus valitsemalla se." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Valitse asennuskansio" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Valitse kansio, johon $(^NameDA) asennetaan." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Valitse poistokansio" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Valitse kansio, josta $(^NameDA) poistetaan." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Asennetaan" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Odota... $(^NameDA) asennetaan..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Asennus on valmis" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Asennus onnistui." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Asennus keskeytettiin" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Asennus epäonnistui." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Asennusta poistetaan" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Odota... $(^NameDA) poistetaan." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Asennuksen poisto on valmis" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Asennuksen poisto onnistui." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Asennuksen poisto keskeytettiin" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Asennuksen poisto epäonnistui." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) on asennettu" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) on asennettu tietokoneelle.$\r$\n$\r$\nSulje asentaja valitsemalla Valmis." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) -asennuksen viimeisteleminen edellyttää tietokoneen uudelleenkäynnistämistä. Haluatko käynnistää tietokoneen uudelleen nyt?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) on poistettu" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) on poistettu tietokoneelta.$\r$\n$\r$\nSulje asentaja valitsemalla Lopeta." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) -asennuksen poiston viimeisteleminen edellyttää tietokoneen uudelleenkäynnistystä. Haluatko käynnistää tietokoneen uudelleen nyt?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Käynnistä uudelleen nyt" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Käynnistän uudelleen myöhemmin" + ${LangFileString} MUI_TEXT_FINISH_RUN "Käynnistä $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Näytä Lueminut-tiedosto" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Valmis" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Valitse Käynnistä-valikon kansio" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Valitse Käynnistä-valikon kansio, johon pikakuvakkeet asennetaan." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Valitse Käynnistä-valikon kansio, johon pikakuvakkeet asennetaan. Voit luoda myös uuden kansion kirjoittamalla sen nimen." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Älä luo pikakuvakkeita." +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Poista $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Poista $(^NameDA) tietokoneesta." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Haluatko varmasti keskeyttää $(^Name) -asennuksen?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Haluatko varmasti keskeyttää $(^Name) -asennuksen poiston?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/French.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/French.nlf new file mode 100644 index 0000000000..e30d2a6a0a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/French.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +1036 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by the French NSIS team - http://www.winampfr.com/nsis. +# Updated to v6 by Jerome Charaoui (lavamind@inetflex.com) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Installation de $(^Name) +# ^UninstallCaption +Désinstallation de $(^Name) +# ^LicenseSubCaption +: Licence +# ^ComponentsSubCaption +: Options d'installation +# ^DirSubCaption +: Dossier d'installation +# ^InstallingSubCaption +: Installation des fichiers +# ^CompletedSubCaption +: Terminé +# ^UnComponentsSubCaption +: Options de désinstallation +# ^UnDirSubCaption +: Dossier de désinstallation +# ^ConfirmSubCaption +: Confirmation +# ^UninstallingSubCaption +: Désinstallation des fichiers +# ^UnCompletedSubCaption +: Terminé +# ^BackBtn +< &Précédent +# ^NextBtn +&Suivant > +# ^AgreeBtn +J'a&ccepte +# ^AcceptBtn +J'a&ccepte les termes de la licence +# ^DontAcceptBtn +Je &n'accepte pas les termes de la licence +# ^InstallBtn +&Installer +# ^UninstallBtn +&Désinstaller +# ^CancelBtn +Annuler +# ^CloseBtn +&Fermer +# ^BrowseBtn +P&arcourir... +# ^ShowDetailsBtn +P&lus d'infos +# ^ClickNext +Cliquez sur Suivant pour continuer. +# ^ClickInstall +Cliquez sur Installer pour démarrer l'installation. +# ^ClickUninstall +Cliquez sur Désinstaller pour démarrer la désinstallation. +# ^Name +Nom +# ^Completed +Terminé +# ^LicenseText +Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte. +# ^LicenseTextCB +Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK +# ^LicesnseTextRB +Veuillez examiner le contrat de licence avant d'installer $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK +# ^UnLicenseText +Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cliquez sur J'accepte. +# ^UnLicenseTextCB +Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, cochez la boîte de contrôle ci-dessous. $_CLICK +# ^UnLicesnseTextRB +Veuillez examiner le contrat de licence avant de désinstaller $(^NameDA). Si vous acceptez tous les termes du contrat, sélectionnez la première option ci-dessous. $_CLICK +# ^Custom +Personnalisée +# ^ComponentsText +Cochez les composants que vous désirez installer et décochez ceux que vous ne désirez pas installer. $_CLICK +# ^ComponentsSubText1 +Type d'installation : +# ^ComponentsSubText2_NoInstTypes +Sélectionnez les composants à installer : +# ^ComponentsSubText2 +Ou, sélectionnez les composants optionnels que vous voulez installer : +# ^UnComponentsText +Cochez les composants que vous désirez désinstaller et décochez ceux que vous ne désirez pas désinstaller. $_CLICK +# ^UnComponentsSubText1 +Sélectionnez le type de désinstallation : +# ^UnComponentsSubText2_NoInstTypes +Sélectionnez les composants à désinstaller : +# ^UnComponentsSubText2 +Ou, sélectionnez les composants optionnels que vous voulez désinstaller : +# ^DirText +Ceci installera $(^NameDA) dans le dossier suivant. Pour installer dans un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK +# ^DirSubText +Dossier d'installation +# ^DirBrowseText +Sélectionnez le dossier d'installation pour $(^NameDA) : +# ^UnDirText +Ceci désinstallera $(^NameDA) du dossier suivant. Pour désinstaller d'un autre dossier, cliquez sur Parcourir et choisissez un autre dossier. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Sélectionnez le dossier de désinstallation pour $(^NameDA) : +# ^SpaceAvailable +"Espace disponible : " +# ^SpaceRequired +"Espace requis : " +# ^UninstallingText +Ce programme désinstallera $(^NameDA) de votre ordinateur. $_CLICK +# ^UninstallingSubText +Désinstallation à partir de : +# ^FileError +Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Abandonner pour annuler l'installation,\r\nRéessayer pour réessayer l'écriture du fichier, ou\r\nIgnorer pour passer ce fichier +# ^FileError_NoIgnore +Erreur lors de l'ouverture du fichier en écriture : \r\n\t"$0"\r\nAppuyez sur Réessayez pour re-écrire le fichier, ou\r\nAnnuler pour abandonner l'installation +# ^CantWrite +"Impossible d'écrire : " +# ^CopyFailed +Échec de la copie +# ^CopyTo +"Copier vers " +# ^Registering +"Enregistrement : " +# ^Unregistering +"Suppression de l'enregistrement : " +# ^SymbolNotFound +"Impossible de trouver un symbole : " +# ^CouldNotLoad +"Impossible de charger : " +# ^CreateFolder +"Création du dossier : " +# ^CreateShortcut +"Création du raccourci : " +# ^CreatedUninstaller +"Création de la désinstallation : " +# ^Delete +"Suppression : " +# ^DeleteOnReboot +"Suppression au redémarrage : " +# ^ErrorCreatingShortcut +"Erreur lors de la création du raccourci : " +# ^ErrorCreating +"Erreur de la création : " +# ^ErrorDecompressing +Erreur lors de la décompression des données ! Installation corrompue ? +# ^ErrorRegistering +Erreur lors de l'enregistrement de la DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Exécution : " +# ^Extract +"Extraction : " +# ^ErrorWriting +"Extraction : erreur d'écriture du fichier " +# ^InvalidOpcode +Installation corrompue : opcode incorrect +# ^NoOLE +"Pas de OLE pour : " +# ^OutputFolder +"Destination : " +# ^RemoveFolder +"Suppression du dossier : " +# ^RenameOnReboot +"Renommer au redémarrage : " +# ^Rename +"Renommer : " +# ^Skipped +"Passé : " +# ^CopyDetails +Copier les Détails dans le Presse-papier +# ^LogInstall +Enregistrer le déroulement de l'installation +# ^Byte +o +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/French.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/French.nsh new file mode 100644 index 0000000000..282d2cde6b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/French.nsh @@ -0,0 +1,129 @@ +;Language: French (1036) +;By Sébastien Delahaye + +!insertmacro LANGFILE "French" = "Français" "Francais" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme d'installation de $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Vous êtes sur le point d'installer $(^NameDA) sur votre ordinateur.$\r$\n$\r$\nAvant de démarrer l'installation, il est recommandé de fermer toutes les autres applications. Cela permettra la mise à jour de certains fichiers système sans redémarrer votre ordinateur.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenue dans le programme de désinstallation de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Vous êtes sur le point de désinstaller $(^NameDA) de votre ordinateur.$\r$\n$\r$\nAvant d'amorcer la désinstallation, assurez-vous que $(^NameDA) ne soit pas en cours d'exécution.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licence utilisateur" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Veuillez examiner les termes de la licence avant d'installer $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin d'installer $(^NameDA)." +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licence utilisateur" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Veuillez examiner les conditions de la licence avant de désinstaller $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si vous acceptez les conditions de la licence utilisateur, cliquez sur J'accepte pour continuer. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si vous acceptez les conditions de la licence utilisateur, cochez la case ci-dessous. Vous devez accepter la licence utilisateur afin de désintaller $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si vous acceptez les conditions de la licence utilisateur, sélectionnez le premier choix ci-dessous. Vous devez accepter la licence utilisateur afin de désinstaller $(^NameDA)." +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Appuyez sur Page Suivante pour lire le reste de la licence utilisateur." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Choisissez les composants" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Choisissez les composants de $(^NameDA) que vous souhaitez installer." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Choisissez les composants" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Cochez les composants de $(^NameDA) que vous souhaitez désinstaller." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Passez le curseur de votre souris sur un composant pour en voir la description." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sélectionnez un composant pour en voir la description." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Choisissez le dossier d'installation" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Choisissez le dossier dans lequel installer $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Choisissez le dossier de désinstallation" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Choisissez le dossier à partir duquel vous voulez désinstaller $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installation en cours" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Veuillez patienter pendant l'installation de $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installation terminée" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installation s'est terminée avec succès." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installation interrompue" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installation n'a pas été terminée." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Désinstallation en cours" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Veuillez patienter pendant la désinstallation de $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Désinstallation terminée" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La désinstallation s'est terminée avec succès." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Désinstallation interrompue" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La désinstallation n'a pas été terminée." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Fin de l'installation de $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a été installé sur votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré afin de compléter l'installation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fin de la désinstallation de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a été supprimé de votre ordinateur.$\r$\n$\r$\nCliquez sur Fermer pour quitter le programme d'installation." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Votre ordinateur doit être redémarré pour terminer la désinstallation de $(^NameDA). Souhaitez-vous redémarrer maintenant ?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Redémarrer maintenant" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Je souhaite redémarrer moi-même plus tard" + ${LangFileString} MUI_TEXT_FINISH_RUN "Lancer $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Afficher le fichier Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fermer" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Choisissez un dossier dans le menu Démarrer" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Choisissez un dossier dans le menu Démarrer pour les raccourcis de l'application." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Choisissez le dossier du menu Démarrer dans lequel vous voulez placer les raccourcis du programme. Vous pouvez également entrer un nouveau nom pour créer un nouveau dossier." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne pas créer de raccourcis" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Désinstaller $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Supprimer $(^NameDA) de votre ordinateur." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter l'installation de $(^Name) ?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Êtes-vous sûr de vouloir quitter la désinstallation de $(^Name) ?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Choix des utilisateurs" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Sélection des utilisateurs désirant utiliser $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Choix entre installer $(^NameDA) seulement pour vous-même ou bien pour tous les utilisateurs du système. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer pour tous les utilisateurs" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer seulement pour moi" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nlf new file mode 100644 index 0000000000..1d1d4f885a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1110 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation v 1.0.0 by Ramon Flores +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalación de $(^Name) +# ^UninstallCaption +Desinstalación de $(^Name) +# ^LicenseSubCaption +: Contrato de licenza +# ^ComponentsSubCaption +: Opcións de instalación +# ^DirSubCaption +: Diretória de instalación +# ^InstallingSubCaption +: Instalando ficheiros +# ^CompletedSubCaption +: Concluído +# ^UnComponentsSubCaption +: Opcións de desinstalación +# ^UnDirSubCaption +: Cartafol de desinstalación +# ^ConfirmSubCaption +: Confirmación +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Concluído +# ^BackBtn +< &Anterior +# ^NextBtn +&Seguinte > +# ^AgreeBtn +&Aceito +# ^AcceptBtn +Eu &aceito os termos do Contrato de licenza +# ^DontAcceptBtn +Eu &non aceito os termos do Contrato de licenza +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Cancelar +# ^CloseBtn +&Fechar +# ^BrowseBtn +&Procurar... +# ^ShowDetailsBtn +Ver &Detalles +# ^ClickNext +Clique en 'Seguinte' para continuar. +# ^ClickInstall +Clique en 'Instalar' para iniciar a instalación. +# ^ClickUninstall +Clique en 'Desinstalar' para iniciar a desinstalación. +# ^Name +Nome +# ^Completed +Concluído +# ^LicenseText +Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'. +# ^LicenseTextCB +Por favor reveja o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK +# ^LicenseTextRB +Por favor revexa o acordo de licenza antes de instalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK +# ^UnLicenseText +Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique em 'Aceito'. +# ^UnLicenseTextCB +Por favor reveja o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, clique na caixa de selección abaixo. $_CLICK +# ^UnLicenseTextRB +Por favor revexa o acordo de licenza antes de desinstalar $(^NameDA). Se concordar con todos os termos da licenza, escolla a primeira opción abaixo. $_CLICK +# ^Custom +Personalizado +# ^ComponentsText +Marque os componentes que desexa instalar e desmarque os componentes que non desexa instalar. $_CLICK +# ^ComponentsSubText1 +Escolla o tipo de instalación: +# ^ComponentsSubText2_NoInstTypes +Escolla os componentes para instalar: +# ^ComponentsSubText2 +Ou, escolla os componentes opcionais que desexa instalar: +# ^UnComponentsText +Marque os componentes que queira desinstalar e vice versa. $_CLICK +# ^UnComponentsSubText1 +Escolla o tipo de desinstalación: +# ^UnComponentsSubText2_NoInstTypes +Escolla os componentes para desinstalar: +# ^UnComponentsSubText2 +Ou, escolla os componentes opcionais que queira desinstalar: +# ^DirText +O $(^NameDA) será instalado na seguinte directória. Para instalar nunha directória diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK +# ^DirSubText +Directória de destino +# ^DirBrowseText +Escolla unha directória para instalar o $(^NameDA): +# ^UnDirText +O $(^NameDA) será desinstalado da seguinte directória. Para desinstalar dunha pasta diferente, clique en 'Procurar...' e escolla outra directória. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Escolla a directória de onde vai ser desinstalado o $(^NameDA): +# ^SpaceAvailable +"Espazo disponíbel: " +# ^SpaceRequired +"Espazo necesário: " +# ^UninstallingText +$(^NameDA) vai ser desinstalado da seguinte directória. $_CLICK +# ^UninstallingSubText +Desinstalando de: +# ^FileError +Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Abortar para abortar a instalación,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro. +# ^FileError_NoIgnore +Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique en Repetir para tentar novamente a gravación do ficheiro, ou\r\nCancelar para abortar a instalación. +# ^CantWrite +"Non foi posíbel escreber: " +# ^CopyFailed +Falla ao copiar +# ^CopyTo +"Copiar para " +# ^Registering +"Rexistando: " +# ^Unregistering +"Desrexistando: " +# ^SymbolNotFound +"Símbolo non achado: " +# ^CouldNotLoad +"Non foi posíbel carregar: " +# ^CreateFolder +"Criando diretória: " +# ^CreateShortcut +"Criando atallo: " +# ^CreatedUninstaller +"Criando desinstalador: " +# ^Delete +"Eliminando ficheiro: " +# ^DeleteOnReboot +"Eliminar ao reiniciar: " +# ^ErrorCreatingShortcut +"Erro ao criar atallo: " +# ^ErrorCreating +"Erro ao criar: " +# ^ErrorDecompressing +Erro ao descomprimir dados! Instalador corrompido? +# ^ErrorRegistering +Erro ao rexistar DLL +# ^ExecShell +"Executando polo Shell: " +# ^Exec +"Executando: " +# ^Extract +"Extraindo: " +# ^ErrorWriting +"Extraindo: erro ao escreber ficheiro " +# ^InvalidOpcode +Instalador corrompido: código de operación inválido +# ^NoOLE +"Sen OLE para: " +# ^OutputFolder +"Cartafol de destino: " +# ^RemoveFolder +"Removendo cartafol: " +# ^RenameOnReboot +"Renomear ao reiniciar: " +# ^Rename +"Renomeando: " +# ^Skipped +"Ignorado: " +# ^CopyDetails +Copiar detalles para a Área de transférencia +# ^LogInstall +Rexistar proceso de instalación +# ^Byte +B +# kilo + K +# mega + M +# giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nsh new file mode 100644 index 0000000000..7654c2a608 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Galician.nsh @@ -0,0 +1,121 @@ +;Language: Galician (1110) +;Ramon Flores + +!insertmacro LANGFILE "Galician" = "Galego" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de Instalación do $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a instalación do $(^NameDA).$\r$\n$\r$\nRecomenda-se fechar todas as outras aplicacións antes de iniciar a instalación. Isto posibilita actualizar os ficheiros do sistema relevantes sen ter que reiniciar o computador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Benvindo ao Asistente de desinstalación do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente vai axudá-lo durante a desinstalación do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalación, certifique-se de que o $(^NameDA) non está a executar-se.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de licenza" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para instalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de licenza" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licenza antes de desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licenza, clique en 'Aceito' para continuar. Cumpre aceitar o contrato para desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licenza, clique na caixa de selección abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licenza, seleccione a primeira opción abaixo. Cumpre aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Prema Page Down para ver o restante da licenza." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolla de componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) que desexa instalar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escoller componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolla que características do $(^NameDA) desexa desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrición" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre un componente para ver a sua descrición." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver a sua descrición." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolla do local da instalación" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolla a directória na cal desexa instalar o $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolla o Local de desinstalación" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolla a directória de onde pretende desinstalar o $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, agarde entanto o $(^NameDA) está sendo instalado." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación completa" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalación concluiu con suceso." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalación concluiu sen suceso." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, agarde entanto se desinstala o $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación completa" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalación concluiu con suceso." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación abortada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalación non concluiu con suceso" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Asistente de instalación do $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Instalou-se o $(^NameDA) no seu computador.$\r$\n$\r$\nClique en Rematar para fechar este asistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a instalación do $(^NameDA). Desexa reiniciar agora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o asistente de desinstalación do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Eliminou-se $(^NameDA) do seu computador.$\r$\n$\r$\nClique em Rematar para fechar este asistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Cumpre reiniciar o seu computador para concluír a desinstalación do $(^NameDA). Desexa reiniciá-lo agora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Prefiro reinicia-lo manualmente despois" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leame" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Rematar" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolla un cartafol do Menu Iniciar" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolla un cartafol do Menu Iniciar para os atallos do programa." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione o cartafol do Menu Iniciar no que desexa criar os atallos do programa. Tamén é posíbel dixitar un nome para criar un novo cartafol. " + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non criar atallos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Eliminar o $(^NameDA) do seu computador." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Realmente desexa cancelar a instalación do $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Realmente desexa cancelar a desinstalación do $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nlf new file mode 100644 index 0000000000..fa5758c1d4 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1079 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1200 +# RTL - anything else than RTL means LTR +- +#Translation by David Huriev +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +ჩატვირთვა $(^Name) +# ^UninstallCaption +$(^Name)–ის წაშლა +# ^LicenseSubCaption +: სალიცენზიო შეთანხმება +# ^ComponentsSubCaption +: ჩატვირთვის მონაცემები +# ^DirSubCaption +: საინსტალაციო ფოლდერი +# ^InstallingSubCaption +: ფაილების კოპირება +# ^CompletedSubCaption +: ოპერაცია დასრულებულია +# ^UnComponentsSubCaption +: წაშლის მონაცემები +# ^UnDirSubCaption +: წაშლის ფოულდერი +# ^ConfirmSubCaption +: თანხმობა +# ^UninstallingSubCaption +: ფაილების წაშლა +# ^UnCompletedSubCaption +: ოპერაცია დასრულებულია +# ^BackBtn +< &უკან +# ^NextBtn +&შემდეგ > +# ^AgreeBtn +ვეთანხმე&ბი +# ^AcceptBtn +&ვეთანხმები სალიცენზიო პირობებს +# ^DontAcceptBtn +&არ ვეთანხმები სალიცენზიო პირობებს +# ^InstallBtn +&ჩატვირთვა +# ^UninstallBtn +წაშ&ლა +# ^CancelBtn +უარი +# ^CloseBtn +&დახურვა +# ^BrowseBtn +დათ&ვალიერება... +# ^ShowDetailsBtn +&დეტალები... +# ^ClickNext +გასაგრძელებლად დააწკაპუნეთ ღილაკზე 'შემდეგ'. +# ^ClickInstall +დააწკაპუნეთ ღილაკზე 'ჩატვირთვა', პროგრამის ჩასატვირთად. +# ^ClickUninstall +დააწკაპუნეთ ღილაკზე 'წაშლა', პროგრამის წასაშლელად. +# ^Name +სახელი +# ^Completed +ჩაიტვირთა +# ^LicenseText +სანამ ჩაიტვირთება $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს დააწკაპუნეთ ღილაკზე 'თანხმობა'. +# ^LicenseTextCB +სანამ ჩაიტვირთება $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს მონიშნეთ ფანჯარა ქვემოთ. $_CLICK +# ^LicenseTextRB +სანამ ჩაიტვირთება $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს მონიშნეთ ქვემოთ მოცემული პირველი ვარიანტი. $_CLICK +# ^UnLicenseText +სანამ წაშლით $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს დააწკაპუნეთ ღილაკზე 'თანხმობა'. +# ^UnLicenseTextCB +სანამ წაშლით $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს მონიშნეთ ფანჯარა ქვემოთ. $_CLICK +# ^UnLicenseTextRB +სანამ წაშლით $(^NameDA) გაეცანით სალიცენზიო ხელშეკრულებას. თუ ეთანხმებით პირობებს მონიშნეთ ქვემოთ მოცემული პირველი ვარიანტი. $_CLICK +# ^Custom +სტანდარტული +# ^ComponentsText +აირჩიეთ ის კომპონენტები, რომლის ჩატვირთვაც გსურთ. $_CLICK +# ^ComponentsSubText1 +აირჩიეთ ჩატვირთვის მეთოდი: +# ^ComponentsSubText2_NoInstTypes +ჩასატვირთად აირჩიეთ პროგრამის კომპონენტები: +# ^ComponentsSubText2 +ან ჩასატვირთად აირჩიეთ პროგრამის დამატებითი კომპონენტები: +# ^UnComponentsText +აირჩიეთ ის კომპონენტები, რომლის წაშლაც გსურთ. $_CLICK +# ^UnComponentsSubText1 +აირჩიეთ წაშლის მეთოდი: +# ^UnComponentsSubText2_NoInstTypes +წასაშლელად აირჩიეთ პროგრამის კომპონენტები: +# ^UnComponentsSubText2 +ან წასაშლელად აირჩიეთ პროგრამის დამატებითი კომპონენტები: +# ^DirText +პროგრამა ჩაგიტვირთავთ $(^NameDA)–ის მითითებულ ფოლდერში. სხვა ადგილზე ჩასატვირთად დააწკაპუნეთ ღილაკზე 'დათვალიერება' და მიუთითეთ ადგილი. $_CLICK +# ^DirSubText +ჩატვირთვის ფოლდერი +# ^DirBrowseText +მითითეთ ფოლდერი სადაც უნდა ჩაიტვირთოს $(^NameDA): +# ^UnDirText +პროგრამა წაშლის $(^NameDA)–ის მითითებული ფოლდერიდან. სხვა ფოლდერიდან წასაშლელად დააწკაპუნეთ ღილაკზე 'დათვალიერება' და მიუთითეთ ადგილი. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +მიუთითეთ ფოლდერი საიდანაც უნდა წაიშალოს $(^NameDA): +# ^SpaceAvailable +"Доступно на диске: " +# ^SpaceRequired +"Требуется на диске: " +# ^UninstallingText +პროგრამა $(^NameDA) წაიშლება თქვენი კომპიუტერიდან. $_CLICK +# ^UninstallingSubText +წაშლა: +# ^FileError +არ იხსნება ფაილები ჩასაწერად: \r\n\t"$0"\r\n'შეჩერება': შეჩერდეს ჩატვირთვა;\r\n"გამეორება": მცდელობის გამეორება;\r\n"გამოტოვება": ამ მოქმედების გამოტოვება. +# ^FileError_NoIgnore +არ იხსნება ფაილეი ჩასაწერად: \r\n\t"$0"\r\n'გამეორება': მცდელობის გამეორება;\r\n'უარი': ჩატვირთვის პროცესის შეწყვეტა. +# ^CantWrite +"არ იწერება: " +# ^CopyFailed +შეცდომა ჩაწერის დროს +# ^CopyTo +"კოპირება: " +# ^Registering +"რეგისტრირება: " +# ^Unregistering +"რეგისტრირებიდან მოხსნა: " +# ^SymbolNotFound +"ვერ მოიძებნა სიმბოლო: " +# ^CouldNotLoad +"ჩატვირთვა შეუძლებელია: " +# ^CreateFolder +"ფოლდერის შექმნა: " +# ^CreateShortcut +"იარლიყის შექმნა: " +# ^CreatedUninstaller +"წაშლის პროგრამის შექმნა: " +# ^Delete +"ფაილის წაშლა: " +# ^DeleteOnReboot +"წაიშლება კომპიუტერის გადატვირთვის დროს: " +# ^ErrorCreatingShortcut +"იარლიყის შექმნისას დაშვებულია შეცდომა: " +# ^ErrorCreating +"შექმნისას დაშვებულია შეცდომა: " +# ^ErrorDecompressing +შეცდომა მონაცემების გახსნისას! შესაძლოა საინსტალაციო პროგრამაა დაზიანებული. +# ^ErrorRegistering +არ რეგისტრირდება (DLL) +# ^ExecShell +"ExecShell: " +# ^Exec +"შესრულება: " +# ^Extract +"ამონაწერი: " +# ^ErrorWriting +"ამონაწერი: შეცდომაა დაშვებული ფაილის ჩაწერისას " +# ^InvalidOpcode +საინსტალაციო პროგრამა დაზიანებულია: კოდი არ არსებობს +# ^NoOLE +"OLE არ არის: " +# ^OutputFolder +"ჩატვირთვის ფოლდერი: " +# ^RemoveFolder +"ფოლდერის წაშლა: " +# ^RenameOnReboot +"სახელის შეცვლა კომპიუტერის გადავირთვისას: " +# ^Rename +"სახელის შეცვლა: " +# ^Skipped +"გამოტოვა: " +# ^CopyDetails +მონაცემების ბუფერში კოპირება +# ^LogInstall +ჩატვირთვის აღწერა +# byte +B +# kilo + K +# mega + M +# giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nsh new file mode 100644 index 0000000000..766c3c7698 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Georgian.nsh @@ -0,0 +1,121 @@ +;Language: Georgian (1079) +;Translation by David Huriev and format updated by Jim Park + +!insertmacro LANGFILE "Georgian" = "ქართული" "Kartuli" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "მოგესალმებათ $(^NameDA)–ის საინსტალაციო პროგრამა" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ეს პროგრამა ჩატვირთავს $(^NameDA)–ს თქვენს კომპიუტერში.$\r$\n$\r$\nჩატვირთვამდე რეკომენდირებულია ყველა პროგრამის დახურვა. ამ შემთხვევაში პროგრამა სისტემურ ფაილებს ისე შეცვლის, რომ კომპიუტერს გადატვირთვა არ დასჭირდება.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "მოგესალმებათ $(^NameDA)–ის დეინსტალაციის ფანჯარა" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ეს პროგრამა წაშლის $(^NameDA)–ს კომპიუტერიდან.$\r$\n$\r$\nწაშლამდე დახურეთ პროგრამა $(^NameDA).$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "სალიცენზიო შეთანხმება" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "სანამ $(^NameDA)–ს ჩატვირთავთ გაეცანით სალიცენზიო შეთანხმებას." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "თუ ეთანხმებით პირობებს, დააწკაპუნეთ ღილაკზე $\"ვეთანხმები$\". პროგრამის ჩასატვირთად აუცილებელია დათანხმება." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "თუ ეთანხმებით პირობებს, მონიშნეთ ფანჯარა ქვემოთ. $(^NameDA)–ის ჩასატვირთად აუცილებელია პირობებზე დათანხმება. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "თუ ეთანხმებით პირობებს მონიშნეთ ქვემოთ მოცემული პირველი ვარიანტი. $(^NameDA)–ის ჩასატვირთად აუცილებელია პირობებზე დათანხმება. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "სალიცენზიო შეთანხმება" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "სანამ წაშლით $(^NameDA)–ს გაეცანით სალიცენზიო შეთანხმებას." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "თუ ეთანხმებით პირობებს დააწკაპუნეთ ღილაკზე $\"თანხმობა$\". $(^NameDA)–ის წასაშლელად საჭიროა პიროებებზე დათანხმება. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "თუ ეთანხმებით პირობებს მონიშნეთ ფანჯარა ქვემოთ. $(^NameDA)–ს წასაშლელად საჭიროა პიროებებზე დათანხმება. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "თუ ეთანხმებით პირობებს მონიშნეთ ქვემოთ მოცემული პირველი ვარიანტი. $(^NameDA)–ს წასაშლელად საჭიროა პიროებებზე დათანხმება. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "ტექსტის წასაკითხად გამოიყენეთ ღილაკები $\"PageUp$\" და $\"PageDown$\"." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "ჩასატვირთი პროგრამის კომპონენტები" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "აირჩიეთ $(^NameDA)–ის კომპონენტები, რომლის ჩატვირთაც გსურთ." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "პროგრამის კომპონენტები" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "აირჩიეთ $(^NameDA)–ის კომპონენტები, რომლის წაშლაც გსურთ." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "შემადგენლობა" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "მიიყვანეთ მაუსი კომპონენტის სახელწოდებასთან მის სრულად წასაკითხად." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "აირჩიეთ კომპონენტი, შემადგენლობის დასანახად." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "ჩასატვირთი ფოლდერის მონიშვნა" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "აირჩიეთ $(^NameDA)–ს ჩასატვირთი ფოლდერი." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "წასაშლელი ფოლდერის მონიშვნა" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "მიუთითეთ ფოლდერი, საიდანაც უნდა წაიშალოს $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "ჩატვირთვა" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "დაელოდეთ, მიმდინარეობს $(^NameDA)–ის ჩატვირთვა..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "ჩატვირთვა დასრულებულია" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "პროგრამა წარმატებით ჩაიტვირთა." + ${LangFileString} MUI_TEXT_ABORT_TITLE "ჩატვირთვა შეწყდა" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ჩატვირთვა არ დასრულებულა." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "წაშლა" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "დაელოდეთ, მიმდინარეობს $(^NameDA)–ის წაშლა..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "წაიშალა" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "პროგრამა სრულად წაიშალა." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "შეწყდა წაშლა" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "სრულად არ წაშლილა." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "დასრულდა $(^NameDA)–ის საინსტალაციო პროგრამა" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ჩაიტვირთა კომპიუტერში.$\r$\n$\r$\nდააწკაპუნეთ ღილაკზე $\"მზადაა$\" საინსტალაციო პროგრამიდან გამოსასვლელად." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)–ის ჩატვირთვის დასასრულებლად გადატვირთეთ კომპიუტერი. ახლავე გსურთ მისი გადატვირთვა?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)–ის წაშლის პროგრამა" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) წაიშალა კომპიუტერიდან.$\r$\n$\r$\nდააწკაპუნეთ ღილაკზე $\"მზადაა$\" წაშლის პროგრამიდან გამოსასვლელად." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)–ის სრულად წასაშლელად გადატვირთეთ კომპიუტერი. ახლავე გსურთ მისი გადატვირთვა?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "დიახ, ახლავე გადაიტვირთოს" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "არა, მოგვიანებით გადავტვირთავ კომპიუტერს" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA)–ის &ჩართვა" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "ReadMe &ფაილის ჩვენება" #FIXME: BUGBUG "ReadMe"? + ${LangFileString} MUI_BUTTONTEXT_FINISH "&მზადაა" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "მენიუში არსებული ფოლდერი $\"სტარტი$\"" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "აირჩიეთ ფოლდერი მენიუში $\"სტარტი$\" $(^NameDA)–ის იარლიყების განსათავსებლად." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "აირჩიეთ ფოლდერი მენიუში $\"სტარტი$\", სადაც განთავსდება პროგრამის იარლიყები. თქვენ სხვა სახელიც შეგიძლიათ მიუთითოთ ახალი ფოლდერის შესაქმნელად." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "არ შეიქმნას იარლიყი" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)–ის წაშლა" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)–ის კომპიუტერიდან წაშლა." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "ნამდვილად გსურთ უარი თქვათ $(^Name)–ის ჩატვირთვაზე?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "ნამდვილად გსურთ უარი თქვათ $(^Name)–ის წაშლაზე?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/German.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/German.nlf new file mode 100644 index 0000000000..ed2f91f455 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/German.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1031 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by L.King, changes by R. Bisswanger, Tim Kosse, Frederik Schwarzer & Sebastian Stange +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Installation von $(^Name) +# ^UninstallCaption +Deinstallation von $(^Name) +# ^LicenseSubCaption +: Lizenzabkommen +# ^ComponentsSubCaption +: Installationsoptionen +# ^DirSubCaption +: Zielverzeichnis +# ^InstallingSubCaption +: Wird installiert +# ^CompletedSubCaption +: Fertig +# ^UnComponentsSubCaption +: Deinstallationsoptionen +# ^UnDirSubCaption +: Quellverzeichnis +# ^ConfirmSubCaption +: Bestätigung +# ^UninstallingSubCaption +: Wird entfernt +# ^UnCompletedSubCaption +: Fertig +# ^BackBtn +< &Zurück +# ^NextBtn +&Weiter > +# ^AgreeBtn +&Annehmen +# ^AcceptBtn +Lizenzabkommen &akzeptieren +# ^DontAcceptBtn +Lizenzabkommen ab&lehnen +# ^InstallBtn +&Installieren +# ^UninstallBtn +&Deinstallieren +# ^CancelBtn +Abbrechen +# ^CloseBtn +&Beenden +# ^BrowseBtn +&Durchsuchen ... +# ^ShowDetailsBtn +&Details anzeigen +# ^ClickNext +Klicken Sie auf Weiter, um fortzufahren. +# ^ClickInstall +Klicken Sie auf Installieren, um die Installation zu starten. +# ^ClickUninstall +Klicken Sie auf Deinstallieren, um die Deinstallation zu starten. +# ^Name +Name +# ^Completed +Fertig +# ^LicenseText +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. +# ^LicenseTextCB +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK +# ^LicenseTextRB +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) installieren. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK +# ^UnLicenseText +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. +# ^UnLicenseTextCB +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kontrollkästchen. $_CLICK +# ^UnLicenseTextRB +Bitte lesen Sie das Lizenzabkommen, bevor Sie $(^NameDA) entfernen. Wenn Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie die entsprechende Option. $_CLICK +# ^Custom +Benutzerdefiniert +# ^ComponentsText +Wählen Sie die Komponenten, welche Sie installieren wollen. $_CLICK +# ^ComponentsSubText1 +Installationstyp bestimmen: +# ^ComponentsSubText2_NoInstTypes +Wählen Sie die zu installierenden Komponenten: +# ^ComponentsSubText2 +oder wählen Sie zusätzliche zu installierende Komponenten: +# ^UnComponentsText +Wählen Sie die Komponenten, welche Sie entfernen wollen. $_CLICK +# ^UnComponentsSubText1 +Deinstallationstyp bestimmen: +# ^UnComponentsSubText2_NoInstTypes +Wählen Sie die zu entfernenden Komponenten: +# ^UnComponentsSubText2 +oder wählen Sie zusätzliche Komponenten, welche Sie entfernen möchten: +# ^DirText +$(^NameDA) wird in das unten angegebene Verzeichnis installiert. Falls Sie in ein anderes Verzeichnis installieren möchten, klicken Sie auf Durchsuchen und wählen Sie ein anderes Verzeichnis aus. $_CLICK +# ^DirSubText +Zielverzeichnis +# ^DirBrowseText +Wählen Sie das Verzeichnis aus, in das Sie $(^NameDA) installieren möchten: +# ^UnDirText +$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. Falls sich $(^NameDA) in einem anderen Verzeichnis befindet, klicken Sie auf Durchsuchen und wählen Sie das richtige Verzeichnis aus. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Wählen Sie das Verzeichnis aus, in dem sich $(^NameDA) befindet: +# ^SpaceAvailable +"Verfügbarer Speicher: " +# ^SpaceRequired +"Benötigter Speicher: " +# ^UninstallingText +$(^NameDA) wird aus dem unten angegebenen Verzeichnis entfernt. $_CLICK +# ^UninstallingSubText +Wird entfernt aus: +# ^FileError +Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Abbrechen, um abzubrechen,\r\nauf Wiederholen, um den Schreibvorgang erneut zu versuchen,\r\noder auf Ignorieren, um diese Datei zu überspringen. +# ^FileError_NoIgnore +Fehler beim Überschreiben der Datei: \r\n\t"$0"\r\nKlicken Sie auf Wiederholen, um den Schreibvorgang erneut zu versuchen,\r\noder auf Abbrechen, um die Installation zu beenden. +# ^CantWrite +"Fehler beim Schreiben: " +# ^CopyFailed +Kopieren fehlgeschlagen +# ^CopyTo +"Wird kopiert nach " +# ^Registering +"Wird registriert: " +# ^Unregistering +"Wird deregistriert: " +# ^SymbolNotFound +"Symbol ist nicht vorhanden: " +# ^CouldNotLoad +"Fehler beim Laden von " +# ^CreateFolder +"Verzeichnis wird erstellt: " +# ^CreateShortcut +"Verknüpfung wird erstellt: " +# ^CreatedUninstaller +"Deinstallationsprogramm wird erstellt: " +# ^Delete +"Datei wird gelöscht: " +# ^DeleteOnReboot +"Datei wird nach Neustart gelöscht: " +# ^ErrorCreatingShortcut +"Fehler beim Erstellen der Verknüpfung: " +# ^ErrorCreating +"Fehler beim Erstellen: " +# ^ErrorDecompressing +Fehler beim Entpacken. Ist das Installationsprogramm beschädigt? +# ^ErrorRegistering +Fehler beim Registrieren der DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Wird gestartet: " +# ^Extract +"Wird entpackt: " +# ^ErrorWriting +"Entpacken: Fehler beim Schreiben der Datei " +# ^InvalidOpcode +Beschädigtes Installationsprogramm: ungültiger Befehlscode +# ^NoOLE +"Kein OLE für: " +# ^OutputFolder +"Zielverzeichnis: " +# ^RemoveFolder +"Verzeichnis wird entfernt: " +# ^RenameOnReboot +"Umbenennen nach Neustart: " +# ^Rename +"Umbenennen: " +# ^Skipped +"Übersprungen: " +# ^CopyDetails +Details in die Zwischenablage kopieren +# ^LogInstall +Installationsverlauf protokollieren +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/German.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/German.nsh new file mode 100644 index 0000000000..1acdf7843f --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/German.nsh @@ -0,0 +1,129 @@ +;Language: German (1031) +;By L.King, changes by K. Windszus, R. Bisswanger, M. Simmack, D. Weiß, Frederik Schwarzer & S. Stange + +!insertmacro LANGFILE "German" = "Deutsch" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Willkommen zur Installation$\r$\nvon $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Installation von $(^NameDA) begleiten.$\r$\n$\r$\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen, damit bestimmte Systemdateien ohne Neustart ersetzt werden können.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Willkommen zur Deinstallation$\r$\nvon $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Deinstallation von $(^NameDA) begleiten.$\r$\n$\r$\nBitte beenden Sie $(^NameDA), bevor Sie mit der Deinstallation fortfahren.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzabkommen" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Installation fortfahren." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzabkommen" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Deinstallation von $(^NameDA) fortfahren." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Drücken Sie die BILD-AB-Taste, um den Rest des Abkommens zu lesen." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswählen" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie installieren möchten." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswählen" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie entfernen möchten." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreibung" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bewegen Sie den Mauszeiger über eine Komponente, um die Beschreibung zu lesen." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Wählen Sie eine Komponente, um die Beschreibung zu lesen." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis auswählen" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, in das $(^NameDA) installiert werden soll." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Verzeichnis für Deinstallation auswählen" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, aus dem $(^NameDA) entfernt werden soll." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Wird installiert ..." + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) installiert wird." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Die Installation ist vollständig" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Die Installation wurde erfolgreich abgeschlossen." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Abbruch der Installation" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Die Installation wurde nicht vollständig abgeschlossen." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Wird deinstalliert ..." + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) entfernt wird." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Die Deinstallation ist vollständig" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Die Deinstallation wurde erfolgreich abgeschlossen." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Abbruch der Deinstallation" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Die Deinstallation wurde nicht vollständig abgeschlossen." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Die Installation von $(^NameDA) wird abgeschlossen" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) wurde auf Ihrem Computer installiert.$\r$\n$\r$\nKlicken Sie auf Fertigstellen, um den Installationsassistenten zu schließen." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Installation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Die Deinstallation von $(^NameDA) wird abgeschlossen" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ist von Ihrem Computer entfernt worden.$\r$\n$\r$\nKlicken Sie auf Fertigstellen, um den Assistenten zu schließen." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Deinstallation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Jetzt neu starten" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Windows später selbst neu starten" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ausführen" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmich-Datei anzeigen" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fertigstellen" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Ordner bestimmen" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestimmen Sie einen Startmenü-Ordner für die Programmverknüpfungen." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wählen Sie den Startmenü-Ordner für die Programmverknüpfungen aus. Falls Sie einen neuen Ordner erstellen möchten, geben Sie dessen Namen ein." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keine Verknüpfungen erstellen" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstallation von $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) wird von Ihrem Computer entfernt." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Installation von $(^Name) abbrechen möchten?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Deinstallation von $(^Name) abbrechen möchten?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Benutzer auswählen" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wählen Sie die Benutzer aus, für die Sie $(^NameDA) installieren möchten." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wählen Sie aus, ob Sie $(^NameDA) nur für den eigenen Gebrauch oder für die Nutzung durch alle Benutzer dieses Systems installieren möchten. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installation für alle Benutzer dieses Computers" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installation nur für mich" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nlf new file mode 100644 index 0000000000..84f3988ecb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1032 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1253 +# RTL - anything else than RTL means LTR +- +# Translation by Makidis N. Michael - http://dias.aueb.gr/~p3010094/ +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Εγκατάσταση του '$(^Name)' +# ^UninstallCaption +Απεγκατάσταση του '$(^Name)' +# ^LicenseSubCaption +: Συμφωνία Άδειας Χρήσης +# ^ComponentsSubCaption +: Επιλογές Εγκατάστασης +# ^DirSubCaption +: Φάκελος Εγκατάστασης +# ^InstallingSubCaption +: Εγκατάσταση σε εξέλιξη +# ^CompletedSubCaption +: Ολοκληρώθηκε +# ^UnComponentsSubCaption +: Επιλογές Απεγκατάστασης +# ^UnDirSubCaption +: Φάκελος Απεγκατάστασης +# ^ConfirmSubCaption +: Επιβεβαίωση +# ^UninstallingSubCaption +: Απεγκατάσταση σε εξέλιξη +# ^UnCompletedSubCaption +: Ολοκληρώθηκε +# ^BackBtn +< &Πίσω +# ^NextBtn +&Επόμενο > +# ^AgreeBtn +&Συμφωνώ +# ^AcceptBtn +&Αποδέχομαι τους όρους της άδειας χρήσης +# ^DontAcceptBtn +&Δεν αποδέχομαι τους όρους της άδειας χρήσης +# ^InstallBtn +&Εγκατάσταση +# ^UninstallBtn +Απε&γκατάστ. +# ^CancelBtn +Άκυρο +# ^CloseBtn +&Κλείσιμο +# ^BrowseBtn +Α&ναζήτηση... +# ^ShowDetailsBtn +&Λεπτομέρειες +# ^ClickNext +Κάντε κλικ στο Επόμενο για να συνεχίσετε. +# ^ClickInstall +Κάντε κλικ στο Εγκατάσταση για να αρχίσετε την εγκατάσταση. +# ^ClickUninstall +Κάντε κλικ στο Απεγκατάσταση για να αρχίσετε την απεγκατάσταση. +# ^Name +Όνομα +# ^Completed +Ολοκληρώθηκε +# ^LicenseText +Ελέγξτε την άδεια χρήσης πριν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στο Συμφωνώ. +# ^LicenseTextCB +Ελέγξτε την άδεια χρήσης πριν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στην επιλογή παρακάτω. $_CLICK +# ^LicenseTextRB +Ελέγξτε την άδεια χρήσης πριν εγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στην πρώτη επιλογή παρακάτω. $_CLICK +# ^UnLicenseText +Ελέγξτε την άδεια χρήσης πριν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στο Συμφωνώ. +# ^UnLicenseTextCB +Ελέγξτε την άδεια χρήσης πριν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στην επιλογή παρακάτω. $_CLICK +# ^UnLicenseTextRB +Ελέγξτε την άδεια χρήσης πριν απεγκαταστήσετε το '$(^NameDA)'. Εάν αποδέχεστε όλους τους όρους, κάντε κλικ στην πρώτη επιλογή παρακάτω. $_CLICK +# ^Custom +Προσαρμοσμένη +# ^ComponentsText +Επιλέξτε τα στοιχεία που θέλετε να εγκαταστήσετε και αποεπιλέξτε τα στοιχεία που δε θέλετε να εγκαταστήσετε. $_CLICK +# ^ComponentsSubText1 +Επιλέξτε τύπο εγκατάστασης: +# ^ComponentsSubText2_NoInstTypes +Επιλέξτε τα στοιχεία που θέλετε να εγκαταστήσετε: +# ^ComponentsSubText2 +Ή, επιλέξτε τα προαιρετικά στοιχεία που θέλετε να εγκαταστήσετε: +# ^UnComponentsText +Επιλέξτε τα στοιχεία που θέλετε να απεγκαταστήσετε και αποεπιλέξτε τα στοιχεία που δε θέλετε να απεγκαταστήσετε. $_CLICK +# ^UnComponentsSubText1 +Επιλέξτε τύπο απεγκατάστασης: +# ^UnComponentsSubText2_NoInstTypes +Επιλέξτε τα στοιχεία που θέλετε να απεγκαταστήσετε: +# ^UnComponentsSubText2 +Ή, επιλέξτε τα προαιρετικά στοιχεία που θέλετε να απεγκαταστήσετε: +# ^DirText +Το πρόγραμμα εγκατάστασης θα εγκαταστήσει το '$(^NameDA)' στον παρακάτω φάκελο. Για να το εγκαταστήσετε σε έναν άλλο φάκελο, κάντε κλικ στο Αναζήτηση και επιλέξτε κάποιον άλλο φάκελο. $_CLICK +# ^DirSubText +Φάκελος Εγκατάστασης +# ^DirBrowseText +Επιλέξτε το φάκελο εγκατάστασης για το '$(^NameDA)': +# ^UnDirText +Το πρόγραμμα εγκατάστασης θα απεγκαταστήσει το '$(^NameDA)' από τον παρακάτω φάκελο. Για να απεγκαταστήσετε από έναν άλλο φάκελο, κάντε κλικ στο Αναζήτηση και επιλέξτε κάποιον άλλο φάκελο. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Επιλέξτε το φάκελο απεγκατάστασης για το '$(^NameDA)': +# ^SpaceAvailable +"Διαθέσιμος χώρος: " +# ^SpaceRequired +"Απαιτούμενος χώρος: " +# ^UninstallingText +Το '$(^NameDA)' θα απεγκατασταθεί από τον ακόλουθο φάκελο. $_CLICK +# ^UninstallingSubText +Απεγκατάστ. από: +# ^FileError +Σφάλμα κατά το άνοιγμα αρχείου για εγγραφή: \r\n\t"$0"\r\nΕπιλέξτε ματαίωση για να ματαιώσετε την εγκατάσταση,\r\nεπανάληψη για να δοκιμάσετε να γράψετε το αρχείο πάλι, ή\r\nπαράβλεψη για να παραλείψετε αυτό το αρχείο. +# ^FileError_NoIgnore +Σφάλμα κατά το άνοιγμα αρχείου για εγγραφή: \r\n\t"$0"\r\nΕπιλέξτε επανάληψη για να δοκιμάσετε να γράψετε το αρχείο πάλι, ή\r\nματαίωση για να ματαιώσετε την εγκατάσταση. +# ^CantWrite +"Αδυναμία εγγραφής: " +# ^CopyFailed +Αντιγραφή απέτυχε +# ^CopyTo +"Αντιγραφή στο " +# ^Registering +"Καταχώρηση: " +# ^Unregistering +"Κατάργηση καταχώρησης: " +# ^SymbolNotFound +"Αδυναμία εύρεσης συμβόλου: " +# ^CouldNotLoad +"Αδυναμία φόρτωσης: " +# ^CreateFolder +"Δημιουργία φακέλου: " +# ^CreateShortcut +"Δημιουργία συντόμευσης: " +# ^CreatedUninstaller +"Δημιουργία προγράμματος απεγκατάστασης: " +# ^Delete +"Διαγραφή αρχείου: " +# ^DeleteOnReboot +"Διαγραφή στην επανεκκίνηση: " +# ^ErrorCreatingShortcut +"Σφάλμα στη δημιουργία συντόμευσης: " +# ^ErrorCreating +"Σφάλμα στη δημιουργία: " +# ^ErrorDecompressing +Σφάλμα στην αποσυμπίεση δεδομένων! Κατεστραμμένο πρόγραμμα εγκατάστασης; +# ^ErrorRegistering +Σφάλμα καταχώρησης του DLL +# ^ExecShell +"Εκτέλεση (ExecShell): " +# ^Exec +"Εκτέλεση: " +# ^Extract +"Αποσυμπίεση: " +# ^ErrorWriting +"Αποσυμπίεση: σφάλμα εγγραφής στο αρχείο " +# ^InvalidOpcode +Εγκατάσταση κατεστραμμένη: μη-έγκυρο opcode +# ^NoOLE +"Όχι OLE για το: " +# ^OutputFolder +"Φάκελος εξόδου: " +# ^RemoveFolder +"Διαγραφή φακέλου: " +# ^RenameOnReboot +"Μετονομασία στην επανεκκίνηση: " +# ^Rename +"Μετονομασία: " +# ^Skipped +"Παραλείφθηκε: " +# ^CopyDetails +Αντιγραφή λεπτομερειών στο Πρόχειρο +# ^LogInstall +Καταγραφή διαδικασίας εγκατάστασης +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nsh new file mode 100644 index 0000000000..50628d8dd3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Greek.nsh @@ -0,0 +1,121 @@ +;Language: Greek (1032) +;By Makidis N. Michael - http://dias.aueb.gr/~p3010094/ + +!insertmacro LANGFILE "Greek" = "Ελληνικά" "Ellinika" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Καλώς ήλθατε στην Εγκατάσταση του '$(^NameDA)'" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ο οδηγός αυτός θα σας καθοδηγήσει κατά τη διάρκεια της εγκατάστασης του '$(^NameDA)'.$\r$\n$\r$\nΣυνιστάται να κλείσετε όλες τις άλλες εφαρμογές πριν ξεκινήσετε την Εγκατάσταση. Αυτό θα επιτρέψει στην Εγκατάσταση να ενημερώσει τα σχετικά αρχεία συστήματος χωρίς την επανεκκίνηση του υπολογιστή σας.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Καλώς ήλθατε στον οδηγό απεγκατ. του '$(^NameDA)'" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ο οδηγός αυτός θα σας καθοδηγήσει κατά τη διάρκεια της απεγκατάστασης του '$(^NameDA)'.$\r$\n$\r$\nΠριν ξεκινήσετε την απεγκατάσταση, βεβαιωθείτε ότι το '$(^NameDA)' δεν τρέχει.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Συμφωνία Άδειας Χρήσης" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ελέγξτε την άδεια χρήσης πριν εγκαταστήσετε το '$(^NameDA)'." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στο Συμφωνώ για να συνεχίσετε. Πρέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στην επιλογή παρακάτω. Πρέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στην πρώτη επιλογή παρακάτω. Πρέπει να αποδεχθείτε τη συμφωνία για να εγκαταστήσετε το '$(^NameDA)'. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Συμφωνία Άδειας Χρήσης" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ελέγξτε την άδεια χρήσης πριν απεγκαταστήσετε το '$(^NameDA)'." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στο Συμφωνώ για να συνεχίσετε. Πρέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στην επιλογή παρακάτω. Πρέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Εάν αποδέχεστε τους όρους της άδειας χρήσης, κάντε κλικ στην πρώτη επιλογή παρακάτω. Πρέπει να αποδεχθείτε τη συμφωνία για να απεγκαταστήσετε το '$(^NameDA)'. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Πατήστε το Page Down για να δείτε το υπόλοιπο της άδειας χρήσης." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Επιλογή Στοιχείων" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Επιλέξτε τα στοιχεία του '$(^NameDA)' που θέλετε να εγκαταστήσετε." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Επιλογή Στοιχείων" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Επιλέξτε τα στοιχεία του '$(^NameDA)' που θέλετε να απεγκαταστήσετε." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Περιγραφή" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Περάστε το δείκτη του ποντικιού πάνω από ένα στοιχείο για να δείτε την περιγραφή του." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Επιλέξτε ένα στοιχείο για να δείτε την περιγραφή του." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Επιλογή Θέσης Εγκατάστασης" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Επιλέξτε το φάκελο μέσα στον οποίο θα εγκατασταθεί το '$(^NameDA)'." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Επιλογή Θέσης Απεγκατάστασης" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Επιλέξτε το φάκελο από τον οποίο θα απεγκατασταθεί το '$(^NameDA)'." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Εγκατάσταση Σε Εξέλιξη" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Παρακαλώ περιμένετε όσο το '$(^NameDA)' εγκαθίσταται." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Η Εγκατάσταση Ολοκληρώθηκε" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Η εγκατάσταση ολοκληρώθηκε επιτυχώς." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Η Εγκατάσταση Διακόπηκε" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Η εγκατάσταση δεν ολοκληρώθηκε επιτυχώς." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Απεγκατάσταση Σε Εξέλιξη" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Παρακαλώ περιμένετε όσο το '$(^NameDA)' απεγκαθίσταται." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Η Απεγκατάσταση Ολοκληρώθηκε" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Η απεγκατάσταση ολοκληρώθηκε επιτυχώς." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Η Απεγκατάσταση Διακόπηκε" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Η απεγκατάσταση δεν ολοκληρώθηκε επιτυχώς." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ολοκλήρωση της Εγκατάστασης του '$(^NameDA)'" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Το '$(^NameDA)' εγκαταστάθηκε στον υπολογιστή σας.$\r$\n$\r$\nΚάντε κλικ στο Τέλος για να κλείσετε αυτόν τον οδηγό." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Πρέπει να γίνει επανεκκίνηση του υπολογιστή σας για να ολοκληρωθεί η εγκατάσταση του '$(^NameDA)'. Θέλετε να επανεκκινήσετε τον υπολογιστή σας τώρα;" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ολοκλήρωση της Απεγκατάστασης του '$(^NameDA)'" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Το '$(^NameDA)' απεγκαταστάθηκε από τον υπολογιστή σας.$\r$\n$\r$\nΚάντε κλικ στο Τέλος για να κλείσετε αυτόν τον οδηγό." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Πρέπει να γίνει επανεκκίνηση του υπολογιστή σας για να ολοκληρωθεί η απεγκατάσταση του '$(^NameDA)'. Θέλετε να επανεκκινήσετε τον υπολογιστή σας τώρα;" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Να γίνει επανεκκίνηση τώρα" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Θα επανεκκινήσω τον υπολογιστή μου αργότερα" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Εκτέλεση του '$(^NameDA)'" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Εμφάνιση του &αρχείου Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Τέλος" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Επιλογή Φακέλου για το Μενού Έναρξη" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Επιλέξτε ένα φάκελο του μενού Έναρξη για τις συντομεύσεις του '$(^NameDA)'." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Επιλέξτε ένα φάκελο του μενού Έναρξη για τις συντομεύσεις του προγράμματος. Μπορείτε επίσης να εισάγετε ένα όνομα για να δημιουργήσετε ένα νέο φάκελο." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Να μη δημιουργηθούν συντομεύσεις" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Απεγκατάσταση του '$(^NameDA)'" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Αφαίρεση του '$(^NameDA)' από τον υπολογιστή σας." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Είστε σίγουροι πως θέλετε να τερματίσετε την εγκατάσταση του '$(^Name)';" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Είστε σίγουροι πως θέλετε να τερματίσετε την απεγκατάσταση του '$(^Name)';" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nlf new file mode 100644 index 0000000000..cf0af87cdc --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nlf @@ -0,0 +1,190 @@ +# Hebrew NSIS language file +NLF v6 +# Language ID +1037 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1255 +# RTL - anything else than RTL means LTR +RTL +# Translation by Amir Szekely (aka KiCHiK), fixed by Yaron Shahrabani +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +התקנת $(^Name) +# ^UninstallCaption +הסרת $(^Name) +# ^LicenseSubCaption +: הסכם רישוי +# ^ComponentsSubCaption +: אפשרויות התקנה +# ^DirSubCaption +: תיקיית התקנה +# ^InstallingSubCaption +: מתקין +# ^CompletedSubCaption +: ההתקנה הושלמה +# ^UnComponentsSubCaption +: אפשרויות הסרה +# ^UnDirSubCaption +: תיקייה להסרה +# ^ConfirmSubCaption +: אישור הסרה +# ^UninstallingSubCaption +: מסיר +# ^UnCompletedSubCaption +: ההסרה הושלמה +# ^BackBtn +< ה&קודם +# ^NextBtn +ה&בא > +# ^AgreeBtn +אני &מסכים +# ^AcceptBtn +אני &מסכים לתנאי הסכם הרישוי +# ^DontAcceptBtn +אני &לא מסכים לתנאי הסכם הרישוי +# ^InstallBtn +&התקן +# ^UninstallBtn +&הסר +# ^CancelBtn +ביטול +# ^CloseBtn +סגור& +# ^BrowseBtn +&עיין... +# ^ShowDetailsBtn +ה&צג פרטים +# ^ClickNext +לחץ על הבא כדי להמשיך. +# ^ClickInstall +לחץ על התקן כדי להתחיל את ההתקנה. +# ^ClickUninstall +לחץ על הסר כדי להתחיל את ההסרה. +# ^Name +שם +# ^Completed +הפעולה הושלמה +# ^LicenseText +אנא סקור את הסכם הרישוי לפני התקנת $(^NameDA). אם הינך מקבל את כל תנאי ההסכם, לחץ 'אני מסכים'. +# ^LicenseTextCB +אנא סקור את הסכם הרישוי לפני התקנת $(^NameDA). אם הינך מקבל את כל תנאי ההסכם, סמן את תיבת הסימון שלהלן. $_CLICK +# ^LicenseTextRB +אנא סקור את הסכם הרישוי לפני התקנת $(^NameDA). אם הינך מקבל את כל תנאי ההסכם, בחר באפשרות הראשונה שלהלן. $_CLICK +# ^UnLicenseText +אנא סקור את הסכם הרישוי לפני הסרת $(^NameDA). אם הינך מסכים לכל תנאי ההסכם, לחץ 'אני מסכים'. +# ^UnLicenseTextCB +אנא סקור את הסכם הרישוי לפני הסרת $(^NameDA). אם הינך מסכים לכל תנאי ההסכם, סמן את תיבת הסימון שלהלן. $_CLICK +# ^UnLicenseTextRB +אנא סקור את הסכם הרישוי לפני הסרת $(^NameDA). אם הינך מסכים לכל תנאי ההסכם, בחר באפשרות הראשונה שלהלן. $_CLICK +# ^Custom +מותאם אישית +# ^ComponentsText +סמן את הרכיבים שברצונך להתקין ובטל את הסימון של רכיבים שאין ברצונך להתקין. $_CLICK +# ^ComponentsSubText1 +בחר סוג התקנה: +# ^ComponentsSubText2_NoInstTypes +בחר רכיבים להתקנה: +# ^ComponentsSubText2 +או, בחר רכיבי רשות להתקנה: +# ^UnComponentsText +סמן את הרכיבים שברצונך להסיר ובטל את הסימון של רכיבים שאין ברצונך להסיר. $_CLICK +# ^UnComponentsSubText1 +בחר סוג הסרה: +# ^UnComponentsSubText2_NoInstTypes +בחר רכיבים להסרה: +# ^UnComponentsSubText2 +או, בחר רכיבי רשות להסרה: +# ^DirText +תוכנית זו תתקין את $(^NameDA) לתיקייה שלהלן. כדי להתקין לתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK +# ^DirSubText +תיקיית יעד +# ^DirBrowseText +בחר תיקייה להתקנת $(^NameDA): +# ^UnDirText +תוכנית זו תסיר את $(^NameDA) מהתיקייה שלהלן. כדי להסיר מתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +בחר תיקייה ממנה תוסר $(^NameDA): +# ^SpaceAvailable +"מקום פנוי: " +# ^SpaceRequired +"מקום דרוש: " +# ^UninstallingText +הסרת $(^NameDA) תתבצע מהתיקייה שלהלן. $_CLICK +# ^UninstallingSubText +מסיר מ: +# ^FileError +ארעה שגיאה בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על ביטול כדי לבטל את ההתקנה,\r\nנסה שנית כדי לנסות לפתוח את הקובץ שוב, או\r\nהתעלם כדי לדלג על הקובץ +# ^FileError_NoIgnore +ארעה שגיאה בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על נסה שנית כדי לנסות לפתוח את הקובץ שוב, או\r\nביטול כדי לבטל את התתקנה +# ^CantWrite +"לא ניתן לכתוב: " +# ^CopyFailed +ההעתקה נכשלה +# ^CopyTo +העתק ל- +# ^Registering +"רושם: " +# ^Unregistering +"ביטול רישום: " +# ^SymbolNotFound +"סמל לא נמצא: " +# ^CouldNotLoad +"לא ניתן לטעון: " +# ^CreateFolder +"צור תיקייה: " +# ^CreateShortcut +"צור קיצור דרך: " +# ^CreatedUninstaller +"מסיר התקנה נוצר: " +# ^Delete +"מחק קובץ: " +# ^DeleteOnReboot +"מחק אחרי אתחול: " +# ^ErrorCreatingShortcut +"שגיאה בעת יצירת קיצור דרך: " +# ^ErrorCreating +"שגיאה בעת יצירת: " +# ^ErrorDecompressing +שגיאה בעת פרישת מידע! התקנה פגומה? +# ^ErrorRegistering +שגיאה בעת רישום DLL +# ^ExecShell +"בצע פעולת-קובץ: " +# ^Exec +"בצע: " +# ^Extract +"פרוש: " +# ^ErrorWriting +"פרוש: שגיאה בעת כתיבה לקובץ " +# ^InvalidOpcode +התקנה פגומה! פקודת ביצוע שגויה +# ^NoOLE +"אין OLE ל: " +# ^OutputFolder +"תיקיית פלט: " +# ^RemoveFolder +"הסר תיקייה: " +# ^RenameOnReboot +"שנה שם לאחר אתחול: " +# ^Rename +"שנה שם: " +# ^Skipped +"דלג: " +# ^CopyDetails +העתק פרטים ללוח +# ^LogInstall +שמור רישום פעילויות ההתקנה +# ^Byte +"ב +# ^Kilo +" ק" +# ^Mega +" מ" +# ^Giga +" ג" \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nsh new file mode 100644 index 0000000000..5dcc80e3da --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hebrew.nsh @@ -0,0 +1,129 @@ +;Language: Hebrew (1037) +;By Yaron Shahrabani + +!insertmacro LANGFILE "Hebrew" = "עברית" "Ivrit" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ברוכים הבאים לאשף ההתקנה של $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "אשף זה ינחה אתכם במהלך ההתקנה של $(^NameDA).$\r$\n$\r$\nמומלץ לסגור כל תוכנית אחרת לפני התחלת ההתקנה. פעולה זו תאפשר לאשף לעדכן קבצי מערכת ללא איתחול המחשב.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ברוכים הבאים לאשף ההסרה של $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "אשף זה ינחה אתכם במהלך ההסרה של $(^NameDA).$\r$\n$\r$\nמומלץ לסגור כל תוכנית אחרת לפני התחלת ההסרה. פעולה זו תאפשר לאשף לעדכן קבצי מערכת ללא איתחול המחשב.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "הסכם רישוי" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "נא עיין בתנאי הסכם הרישוי לפני התקנת $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי ההסכם, לחץ על 'אני מסכים' כדי להמשיך. אם לא תסכים לתנאי ההסכם לא תוכל להתקין את $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להתקין את $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם כדי להתקין את $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "הסכם רישוי" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "נא עיין בתנאי הסכם הרישוי לפני הסרת $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי ההסכם, לחץ על 'אני מסכים' כדי להמשיך. אם לא תקבל את תנאי ההסכם לא תוכל להסיר את $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם כדי להסיר את $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם כדי להסיר את $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "כדי לצפות בשאר הסכם הרישוי לחץ על Page Down." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "בחר רכיבים" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "בחר אילו רכיבים של $(^NameDA) ברצונך להתקין." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "בחר רכיבים" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "בחר אילו תכונות של $(^NameDA) ברצונך להסיר." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "תיאור" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "העבר את העכבר מעל רכיב כלשהו בכדי לצפות בתיאורו." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "בחר רכיב כלשהו בכדי לצפות בתיאורו." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "בחר מיקום להתקנה" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "בחר את התיקייה בה אתה מעוניין להתקין את $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "בחר מיקום להסרה" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "בחר את התיקייה ממנה אתה מעוניין להסיר את $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "מתקין" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^NameDA) מותקן." + ${LangFileString} MUI_TEXT_FINISH_TITLE "ההתקנה הושלמה" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "ההתקנה הושלמה במלואה." + ${LangFileString} MUI_TEXT_ABORT_TITLE "ההתקנה בוטלה" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "ההתקנה לא הושלמה המלואה." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "מסיר" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^NameDA) מוסר מהמחשב." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "ההסרה הושלמה" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "ההסרה הושלמה במלואה." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "ההסרה בוטלה" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "ההסרה לא הושלמה במלואה." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "משלים את אשף ההתקנה של $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) הותקן בהצלחה.$\r$\n$\r$\nלחץ על סיום כדי לסגור את האשף." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב כדי לסיים את התקנת $(^NameDA). האם ברצונך לאתחל כעת?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "משלים את אשף ההסרה של $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) הוסר בהצלחה.$\r$\n$\r$\nלחץ על סיום כדי לסגור את האשף." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב כדי לסיים את הסרת $(^NameDA). האם ברצונך לאתחל כעת?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "אתחל כעת" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ברצוני לאתחל ידנית מאוחר יותר" + ${LangFileString} MUI_TEXT_FINISH_RUN "&הרץ את $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&הצג מסמך 'קרא אותי'" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&סיים" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "בחר תיקייה בתפריט ההתחלה" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "בחר בתיקיית תפריט ההתחלה בה יווצרו קיצורי הדרך של התוכנית." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "בחר בתיקייה מתפריט ההתחלה בה ברצונך ליצור את קיצורי הדרך עבור התוכנית. באפשרותך גם להקליד את שם התיקייה כדי ליצור תיקייה חדשה." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "אל תיצור קיצורי דרך" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "הסר את $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "הסר את $(^NameDA) מהמחשב." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהתקנת $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהסרת $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "בחר משתמשים" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "בחר לאילו משתמשים להתקין את $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "בחר האם להתקין את $(^NameDA) לעצמך או לכל המשתמשים של המחשב. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "התקן לכל משתמשי המחשב" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "התקן רק למשתמש שלי" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nlf new file mode 100644 index 0000000000..aebcb9e4af --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1081 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1200 +# RTL - anything else than RTL means LTR +- +# Translation by Ryan Pretorius +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) सेटअप +# ^UninstallCaption +$(^Name) अनइनस्टॉल करें +# ^LicenseSubCaption +: लाइसेंस समझौता +# ^ComponentsSubCaption +: इंस्टालेशन के विकल्प +# ^DirSubCaption +: इंस्टालेशन फोल्डर +# ^InstallingSubCaption +: इनस्टॉल कर रहे हैं +# ^CompletedSubCaption +: संपन्न +# ^UnComponentsSubCaption +: अनइंस्टालेशन के विकल्प +# ^UnDirSubCaption +: अनइंस्टालेशन फोल्डर +# ^ConfirmSubCaption +: पुष्टिकरण +# ^UninstallingSubCaption +: अनइनस्टॉल कर रहे हैं +# ^UnCompletedSubCaption +: सम्पन्न +# ^BackBtn +< &पीछे +# ^NextBtn +&आगे > +# ^AgreeBtn +मैं &सहमत हूँ +# ^AcceptBtn +मैं लाइसेंस समझौते की शर्तें &स्वीकार करता हूँ +# ^DontAcceptBtn +मैं लाइसेंस समझौते की शर्तें स्वीकार नहीं &करता हूँ +# ^InstallBtn +&इनस्टॉल करें +# ^UninstallBtn +&अनइनस्टॉल करें +# ^CancelBtn +रद्द करें +# ^CloseBtn +&बंद करें +# ^BrowseBtn +ब्रा&उज करें... +# ^ShowDetailsBtn +&विवरण दिखाएं +# ^ClickNext +जारी रखने के लिए आगे पर क्लिक करें। +# ^ClickInstall +इंस्टालेशन शुरू करने के लिए इनस्टॉल करें पर क्लिक करें। +# ^ClickUninstall +अनइंस्टालेशन शुरू करने के लिए अनइनस्टॉल करें पर क्लिक करें। +# ^Name +म +# ^Completed +सम्पन्न +# ^LicenseText +$(^NameDA) इनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो मैं सहमत हूँ पर क्लिक करें। +# ^LicenseTextCB +$(^NameDA) इनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो नीचे दिए गए चेक बॉक्स पर क्लिक करें। $_CLICK +# ^LicenseTextRB +$(^NameDA) इनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो नीचे दिए गए पहले विकल्प का चयन करें। $_CLICK +# ^UnLicenseText +$(^NameDA) अनइनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो मैं सहमत हूँ पर क्लिक करें। +# ^UnLicenseTextCB +$(^NameDA) अनइनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो नीचे दिए गए चेक बॉक्स पर क्लिक करें। $_CLICK +# ^UnLicenseTextRB +$(^NameDA) अनइनस्टॉल करने से पहले लाइसेंस समझौते की समीक्षा करें। यदि आप समझौते की सभी शर्तें स्वीकार करते हैं तो नीचे दिए गए पहले विकल्प का चयन करें। $_CLICK +# ^Custom +कस्टम +# ^ComponentsText +आप जो घटक इनस्टॉल करना चाहते हैं उन्हें चेक करें और आप जो घटक इनस्टॉल नहीं करना चाहते हैं उन्हें अनचेक करें। $_CLICK +# ^ComponentsSubText1 +इनस्टॉल के प्रकार का चयन करें: +# ^ComponentsSubText2_NoInstTypes +इनस्टॉल करने के लिए घटकों का चयन करें: +# ^ComponentsSubText2 +या उन वैकल्पिक घटकों का चयन करें जिन्हें आप इनस्टॉल करना चाहते हैं: +# ^UnComponentsText +आप जो घटक अनइनस्टॉल करना चाहते हैं उन्हें चेक करें और आप जो घटक अनइनस्टॉल नहीं करना चाहते हैं उन्हें अनचेक करें। $_CLICK +# ^UnComponentsSubText1 +अनइनस्टॉल के प्रकार का चयन करें: +# ^UnComponentsSubText2_NoInstTypes +अनइनस्टॉल करने के लिए घटकों का चयन करें: +# ^UnComponentsSubText2 +या उन वैकल्पिक घटकों का चयन करें जिन्हें आप अनइनस्टॉल करना चाहते हैं: +# ^DirText +सेटअप $(^NameDA) को निम्नलिखित फोल्डर में इनस्टॉल करेगा। किसी भिन्न फोल्डर में इनस्टॉल करने के लिए ब्राउज करें पर क्लिक करें और किसी अन्य फोल्डर का चयन करें। $_CLICK +# ^DirSubText +गंतव्य फोल्डर +# ^DirBrowseText +$(^NameDA) को जिस फोल्डर में इनस्टॉल करना है उसका चयन करें: +# ^UnDirText +सेटअप $(^NameDA) को निम्नलिखित फोल्डर से अनइनस्टॉल करेगा। किसी भिन्न फोल्डर से अनइनस्टॉल करने के लिए ब्राउज करें पर क्लिक करें और किसी अन्य फोल्डर का चयन करें। $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA) को जिस फोल्डर से अनइनस्टॉल करना है उसका चयन करें: +# ^SpaceAvailable +"उपलब्ध जगह: " +# ^SpaceRequired +"अपेक्षित जगह: " +# ^UninstallingText +$(^NameDA) को निम्नलिखित फोल्डर से अनइनस्टॉल किया जाएगा। $_CLICK +# ^UninstallingSubText +इस से अनइनस्टॉल कर रहे हैं: +# ^FileError +लिखने के लिए फ़ाइल खोलने में त्रुटि: \r\n\r\n$0\r\n\r\nइंस्टालेशन रोकने के लिए निरस्त करें पर क्लिक करें,\r\nफिर से प्रयास करने के लिए पुनः प्रयास करें, या\r\nइस फाइल को छोड़ने के लिए नजरंदाज करें। +# ^FileError_NoIgnore +लिखने के लिए फ़ाइल खोलने में त्रुटि: \r\n\r\n$0\r\n\r\nफिर से प्रयास करने के लिए पुनः प्रयास करें पर क्लिक करें, या\r\nइंस्टालेशन रोकने के लिए रद्द करें। +# ^CantWrite +"नहीं लिख सकते: " +# ^CopyFailed" +कॉपी करना विफल रहा +# ^CopyTo" +"में कॉपी करें " +# ^Registering +"पंजीकृत कर रहे हैं: " +# ^Unregistering +"पंजीकरण रद्द कर रहे हैं: " +# ^SymbolNotFound +"प्रतीक नहीं ढूंढ सके: " +# ^CouldNotLoad +"लोड नहीं कर सके: " +# ^CreateFolder +"फोल्डर बनाएं: " +# ^CreateShortcut +"शॉर्टकट बनाएं: " +# ^CreatedUninstaller +"अनइंस्टालर बनाया: " +# ^Delete +"फाइल हटाएं: " +# ^DeleteOnReboot" +"रीबूट करने पर हटाएं: " +# ^ErrorCreatingShortcut +"शॉर्टकट बनाने में त्रुटि: " +# ^ErrorCreating +"बनाने में त्रुटि: " +# ^ErrorDecompressing +डेटा असंपीड़ित करने पर त्रुटि! दूषित इंस्टालर? +# ^ErrorRegistering +DLL पंजीकृत करने पर त्रुटि +# ^ExecShell +"शेल निष्पादित करें: " +# ^Exec +निष्पादित करें: " +# ^Extract +"निकालें: " +# ^ErrorWriting +"निकालें: फाइल में लिखते समय त्रुटि " +# ^InvalidOpcode +इंस्टालर दूषित: अवैध ऑपकोड +# ^NoOLE +"इसके लिए कोई OLE नहीं: " +# ^OutputFolder +"आउटपुट फोल्डर: " +# ^RemoveFolder +"फोल्डर निकालें: " +# ^RenameOnReboot +"रीबूट करने पर नाम बदलें: " +# ^Rename +"नाम बदलें: " +# ^Skipped +"छोड़ा गया: " +# ^CopyDetails +क्लिपबोर्ड पर विवरण कॉपी करें +# ^LogInstall +लॉग इनस्टॉल प्रक्रिया +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nsh new file mode 100644 index 0000000000..ffbd653679 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hindi.nsh @@ -0,0 +1,129 @@ +;Language: Hindī (Devanagari script) (1081) +;By Ryan Pretorius + +!insertmacro LANGFILE "Hindi" = "हिन्दी" "Hindi" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) सेटअप में आपका स्वागत है" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "सेटअप $(^NameDA) के इंस्टालेशन के दौरान आपका मार्गदर्शन करेगा।$\r$\n$\r$\nयह सिफारिश की जाती है कि सेटअप शुरू करने से पहले आप अन्य सभी अनुप्रयोग बंद कर दें। इससे आपके कंप्यूटर को रीबूट किए बिना प्रासंगिक सिस्टम फ़ाइलों को अपडेट करना संभव हो जाएगा।$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) के अनइंस्टालेशन में आपका स्वागत है" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "सेटअप $(^NameDA) के अनइंस्टालेशन के दौरान आपका मार्गदर्शन करेगा।$\r$\n$\r$\nअनइंस्टालेशन शुरू करने से पहले सुनिश्चित करें कि $(^NameDA) चल न रहा हो।$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "लाइसेंस समझौता" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) इनस्टॉल करने से पहले लाइसेंस शर्तों की समीक्षा करें।" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "यदि आप समझौते की शर्ते स्वीकार करते हैं तो जारी रखने के लिए मैं सहमत हूँ पर क्लिक करें। आपको $(^NameDA) इनस्टॉल करने के लिए समझौते को स्वीकार करना होगा।" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "यदि आप समझौते की शर्ते स्वीकार करते हैं तो नीचे दिए गए चेक बॉक्स पर क्लिक करें। आपको $(^NameDA) इनस्टॉल करने के लिए समझौते को स्वीकार करना होगा। $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "यदि आप समझौते की शर्ते स्वीकार करते हैं तो नीचे दिए गए पहले विकल्प का चयन करें। आपको $(^NameDA) इनस्टॉल करने के लिए समझौते को स्वीकार करना होगा। $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "लाइसेंस समझौता" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) अनइनस्टॉल करने से पहले लाइसेंस शर्तों की समीक्षा करें।" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "यदि आप समझौते की शर्ते स्वीकार करते हैं तो जारी रखने के लिए मैं सहमत हूँ पर क्लिक करें। आपको $(^NameDA) अनइनस्टॉल करने के लिए समझौते को स्वीकार करना होगा।" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "यदि आप समझौते की शर्ते स्वीकार करते हैं तो नीचे दिए गए चेक बॉक्स पर क्लिक करें। आपको $(^NameDA) अनइनस्टॉल करने के लिए समझौते को स्वीकार करना होगा। $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "यदि आप समझौते की शर्ते स्वीकार करते हैं तो नीचे दिए गए पहले विकल्प का चयन करें। आपको $(^NameDA) अनइनस्टॉल करने के लिए समझौते को स्वीकार करना होगा। $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "शेष समझौता देखने के लिए पेज नीचे करें को दबाएं।" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "घटक चुनें" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA) की वे विशेषताएं चुनें जो आप इनस्टॉल करना चाहते हैं।" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "घटक चुनें" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA) की वे विशेषताएं चुनें जो आप अनइनस्टॉल करना चाहते हैं।" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "विवरण" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "उस घटक पर अपना माउस रखें जिसका आप विवरण देखना चाहते हैं।" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "उस घटक का चयन करें जिसका आप विवरण देखना चाहते हैं।" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "इनस्टॉल करने का स्थान चुनें" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "वह फोल्डर चुनें जिसमें $(^NameDA) को इनस्टॉल करना है।" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "अनइनस्टॉल करने का स्थान चुनें" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "वह फोल्डर चुनें जिससे $(^NameDA) को इनस्टॉल करना है।" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "इनस्टॉल कर रहे हैं" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) इनस्टॉल होने तक प्रतीक्षा करें।" + ${LangFileString} MUI_TEXT_FINISH_TITLE "इंस्टालेशन सम्पन्न" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "सेटअप सफलतापूर्वक पूर्ण हुआ।" + ${LangFileString} MUI_TEXT_ABORT_TITLE "इंस्टालेशन निरस्त किया गया" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "सेटअप सफलतापूर्वक पूर्ण नहीं हुआ।" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "अनइनस्टॉल कर रहे हैं" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) अनइनस्टॉल होने तक प्रतीक्षा करें।" + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "अनइंस्टालेशन सम्पन्न" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "अनइंस्टालेशन सफलतापूर्वक पूर्ण हुआ।" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "अनइंस्टालेशन निरस्त किया गया" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "अनइंस्टालेशन सफलतापूर्वक पूर्ण नहीं हुआ।" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) का सेटअप पूरा कर रहे हैं" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "आपके कंप्यूटर पर $(^NameDA) को इनस्टॉल कर दिया गया है।$\r$\n$\r$\nसेटअप बंद करने के लिए समाप्त करें पर क्लिक करें।" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) के इंस्टालेशन को पूरा करने के लिए आपके कंप्यूटर को फिर से शुरू करना होगा। क्या आप अभी रीबूट करना चाहते हैं?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) का अनइंस्टालेशन पूरा कर रहे हैं" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "आपके कंप्यूटर पर $(^NameDA) को अनइनस्टॉल कर दिया गया है।$\r$\n$\r$\nसेटअप बंद करने के लिए समाप्त करें पर क्लिक करें।" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) के अनइंस्टालेशन को पूरा करने के लिए आपके कंप्यूटर को फिर से शुरू करना होगा। क्या आप अभी रीबूट करना चाहते हैं?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "अभी रीबूट करें" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "मैं बाद में मैन्युअली रीबूट करना चाहता हूँ" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &चलाएं" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "रीडमी &दिखाएं" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&समाप्त करें" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "स्टार्ट मेनू फोल्डर चुनें" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) के शॉर्टकट के लिए स्टार्ट मेनू फोल्डर चुनें।" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "उस स्टार्ट मेनू फोल्डर का चयन करें जिसमें आप प्रोग्राम के शॉर्टकट बनाना चाहते हैं। आप नया फोल्डर बनाने के लिए नाम भी प्रविष्ट कर सकते हैं।" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "शॉर्टकट न बनाएं" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) अनइनस्टॉल करें" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "अपने कंप्यूटर से $(^NameDA) निकालें।" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "क्या आप वाकई $(^Name) का सेटअप छोड़ना चाहते हैं?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "क्या आप वाकई $(^Name) को अनइनस्टॉल करना छोड़ना चाहते हैं?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "उपयोगकर्ता चुनें" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "वे उपयोगकर्ता चुनें जिनके लिए आप $(^NameDA) इनस्टॉल करना चाहते हैं।" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "चयन करें कि क्या आप $(^NameDA) को केवल अपने लिए इनस्टॉल करना चाहते हैं या इस कंप्यूटर के सभी उपयोगकर्ताओं के लिए। $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "इस कंप्यूटर का उपयोग करने वाले किसी भी व्यक्ति के लिए इनस्टॉल करें" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "केवल मेरे लिए इनस्टॉल करें" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nlf new file mode 100644 index 0000000000..38e92e9d83 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +1038 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Soft-Trans Bt. (V2) +# Translation by Orfanik Kft. (V3-V6) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Telepítő +# ^UninstallCaption +$(^Name) Eltávolító +# ^LicenseSubCaption +: Licencszerződés +# ^ComponentsSubCaption +: Telepítési lehetőségek +# ^DirSubCaption +: Célmappa +# ^InstallingSubCaption +: Fájlok telepítése +# ^CompletedSubCaption +: Kész +# ^UnComponentsSubCaption +: Eltávolítási lehetőségek +# ^UnDirSubCaption +: Eltávolítás mappája +# ^ConfirmSubCaption +: Megerősítés +# ^UninstallingSubCaption +: Fájlok eltávolítása +# ^UnCompletedSubCaption +: Kész +# ^BackBtn +< &Vissza +# ^NextBtn +&Tovább > +# ^AgreeBtn +&Elfogadom +# ^AcceptBtn +&Elfogadom a Licencszerződés feltételeit +# ^DontAcceptBtn +&Nem fogadom el a Licencszerződés feltételeit +# ^InstallBtn +&Telepítés +# ^UninstallBtn +&Eltávolítás +# ^CancelBtn +&Mégse +# ^CloseBtn +&Bezárás +# ^BrowseBtn +&Tallózás... +# ^ShowDetailsBtn +&Részletek +# ^ClickNext +Kattintson a Tovább-ra a folytatáshoz. +# ^ClickInstall +Kattintson a Telepítésre a telepítéshez. +# ^ClickUninstall +Kattintson az Eltávolításra az eltávolításhoz. +# ^Name +Név +# ^Completed +Kész +# ^LicenseText +A(z) $(^NameDA) telepítése előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, az Elfogadom gombbal folytathatja. +# ^LicenseTextCB +A(z) $(^NameDA) telepítése előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, jelölje be a Jelölőnégyzeten. $_CLICK +# ^LicenseTextRB +A(z) $(^NameDA) telepítése előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, válassza az első lehetőséget. $_CLICK +# ^UnLicenseText +A(z) $(^NameDA) eltávolítása előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, az Elfogadom gombbal folytathatja. +# ^UnLicenseTextCB +A(z) $(^NameDA) eltávolítása előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, jelölje be a Jelölőnégyzeten. $_CLICK +# ^UnLicenseTextRB +A(z) $(^NameDA) eltávolítása előtt tekintse át a szerződés feltételeit. Ha elfogadja a szerződés valamennyi feltételét, válassza az első lehetőséget. $_CLICK +# ^Custom +Egyéni +# ^ComponentsText +Jelölje be azokat az összetevőket amelyeket telepíteni kíván és törölje a jelölést a nem kívánt összetevőknél. $_CLICK +# ^ComponentsSubText1 +Válassza ki a telepítés típusát: +# ^ComponentsSubText2_NoInstTypes +Válassza ki a telepítendő összetevőket: +# ^ComponentsSubText2 +vagy, jelölje ki a választható összetevők közül a telepíteni kívánta(ka)t: +# ^UnComponentsText +Jelölje be azokat az összetevőket amelyeket el kíván távolítani és törölje a jelölést az eltávolítani nem kívánt összetevőknél. $_CLICK +# ^UnComponentsSubText1 +Válassza ki az Eltávolítás típusát: +# ^UnComponentsSubText2_NoInstTypes +Válassza ki az eltávolítandó összetevőket: +# ^UnComponentsSubText2 +vagy, jelölje ki a választható összetevők közül az eltávolítani kívánta(ka)t: +# ^DirText +A $(^NameDA) a következő mappába kerül. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK +# ^DirSubText +Telepítés helye +# ^DirBrowseText +A(z) $(^NameDA) telepítési helyének kiválasztása: +# ^UnDirText +A(z) $(^NameDA) eltávolítása a következő mappából. Másik mappa választásához kattintson a Tallózás gombra. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Válassza ki, hogy a $(^NameDA) melyik mappából kerüljön eltávolításra: +# ^SpaceAvailable +"Szabad terület: " +# ^SpaceRequired +"Helyigény: " +# ^UninstallingText +A(z) $(^NameDA) eltávolítása következik a számítógépről. $_CLICK +# ^UninstallingSubText +Eltávolítás helye: +# ^FileError +Hiba történt a fájl írásra történő megnyitásakor: \r\n\t"$0"\r\nA Mégse gomb megnyomásával megszakíthatja a telepítést,\r\naz Ismét gombbal megismételheti a fájl írását,\r\na Kihagyás gombbal kihagyhatja ezt a fájlt. +# ^FileError_NoIgnore +Hiba történt a fájl írásra történő megnyitásakor: \r\n\t"$0"\r\nAz Újra gomb megnyomásával megismételheti a műveletet, vagy \r\na Mégse gombbal megszakíthatja a telepítést. +# ^CantWrite +"Nem írható: " +# ^CopyFailed +A másolás megszakadt +# ^CopyTo +"Másolás ide: " +# ^Registering +"Bejegyzés: " +# ^Unregistering +"Eltávolítás: " +# ^SymbolNotFound +"A következő szimbólum nem található: " +# ^CouldNotLoad +"Nem tölthető be: " +# ^CreateFolder +"Mappa létrehozás: " +# ^CreateShortcut +"Parancsikon létrehozása: " +# ^CreatedUninstaller +"Létrehozott eltávolító: " +# ^Delete +"Törölt fájl: " +# ^DeleteOnReboot +"Rendszerindításkor törlendő: " +# ^ErrorCreatingShortcut +"Hiba a parancsikon létrehozásakor: " +# ^ErrorCreating +"Hiba a létrehozáskor: " +# ^ErrorDecompressing +Hiba az adatok kibontásakor! Megsérült a Telepítő? +# ^ErrorRegistering +Hiba a DLL regisztrálásakor +# ^ExecShell +"Végrehajtás a hozzárendeléseken keresztül: " +# ^Exec +"Végrehajtás: " +# ^Extract +"Kibontás: " +# ^ErrorWriting +"Kibontás: Hiba a fájl írásakor " +# ^InvalidOpcode +Sérült a telepítő: hibás utasítás +# ^NoOLE +"Nincs OLE: " +# ^OutputFolder +"Kimeneti mappa: " +# ^RemoveFolder +"Mappa eltávolítása: " +# ^RenameOnReboot +"Átnevezés rendszerindításkor: " +# ^Rename +"Átnevezés: " +# ^Skipped +"Kihagyott: " +# ^CopyDetails +Adatok vágólapra másolása +# ^LogInstall +Telepítő ellenőrzőlista +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nsh new file mode 100644 index 0000000000..317f89292c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Hungarian.nsh @@ -0,0 +1,122 @@ +;Language: Hungarian (1038) +;Translation by Jozsef Tamas Herczeg ( - 1.61-ig), +; Lajos Molnar (Orfanik) ( 1.62 - től) + +!insertmacro LANGFILE "Hungarian" = "Magyar" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) Telepítő Varázsló" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "A(z) $(^NameDA) telepítése következik a számítógépre.$\r$\n$\r$\nJavasoljuk, hogy indítás előtt zárja be a futó alkalmazásokat. Így a telepítő a rendszer újraindítása nélkül tudja frissíteni a szükséges rendszerfájlokat.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Üdvözli a(z) $(^NameDA) Eltávolító Varázsló" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ez a varázsló segíti a(z) $(^NameDA) eltávolításában.$\r$\n$\r$\nMielőtt elkezdi az eltávilítást győződjön meg arról, hogy a(z) $(^NameDA) nem fut.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licencszerződés" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) telepítése előtt tekintse át a szerződés feltételeit." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerződés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) telepítéséhez." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölőnényzeten. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az első opciót. A(z) $(^NameDA) telepítéséhez el kell fogadnia a feltételeket. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licencszerződés" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "A(z) $(^NameDA) eltávolítása előtt tekintse át a szerződés feltételeit." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ha elfogadja a szerződés valamennyi feltételét, az Elfogadom gombbal folytathatja. El kell fogadnia a(z) $(^NameDA) eltávolításához." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Amennyiben elfogadja a feltételeket, jelölje be a jelölőnényzeten. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Amennyiben elfogadja a feltételeket, válassza az első opciót. A(z) $(^NameDA) eltávolításához el kell fogadnia a feltételeket. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "A PageDown gombbal olvashatja el a szerződés folytatását." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Összetevők kiválasztása" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja telepíteni." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Összetevők kiválasztása" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Válassza ki, hogy a(z) $(^NameDA) mely funkcióit kívánja eltávolítani." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Leírás" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vigye rá az egeret az összetevőre, hogy megtekinthesse a leírását." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Telepítési hely kiválasztása" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Válassza ki a(z) $(^NameDA) telepítésének mappáját." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Telepítési folyamat" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) telepítéséig." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Telepítés befejeződött" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A telepítés sikeresen befejeződött." + ${LangFileString} MUI_TEXT_ABORT_TITLE "A telepítés megszakadt" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A telepítés sikertelen volt." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Eltávolítási folyamat" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Kis türelmet a(z) $(^NameDA) eltávolításáig." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Az eltávolítás befejeződött" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Az eltávolítás sikeresen befejeződött." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Az eltávolítás megszakadt" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Az eltávolítás sikertelen volt." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) telepítése megtörtént." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) telepítése megtörtént.$\r$\n$\r$\nA Befejezés gomb megnyomásával zárja be a varázslót." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "A(z) $(^NameDA) telepítésének befejezéséhez újra kell indítani a rendszert. Most akarja újraindítani?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A(z) $(^NameDA) eltávolítás varázslójának befejezése." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "A(z) $(^NameDA) eltávolítása sikeresen befejeződött.$\r$\n$\r$\nA Finish-re kattintva bezárul ez a varázsló." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "A számítógépet újra kell indítani, hogy a(z) $(^NameDA) eltávolítása teljes legyen. Akarja most újraindítani a rendszert?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Most indítom újra" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Később fogom újraindítani" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) futtatása" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "OlvassEl fájl megjelenítése" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Befejezés" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start menü mappa kijelölése" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start menü mappa kijelölése a program parancsikonjaihoz." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Jelöljön ki egy mappát a Start menüben, melybe a program parancsikonjait fogja elhelyezni. Beírhatja új mappa nevét is." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nincs parancsikon elhelyezés" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "A(z) $(^NameDA) Eltávolítása." + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "A(z) $(^NameDA) eltávolítása következik a számítógépről." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) Telepítőből?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Biztos, hogy ki akar lépni a(z) $(^Name) Eltávolítóból?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nlf new file mode 100644 index 0000000000..1352784731 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1039 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Gretar Orri Kristinsson +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Uppsetning +# ^UninstallCaption +$(^Name) Fjarlæging +# ^LicenseSubCaption +: Notandaleyfissamningur +# ^ComponentsSubCaption +: Uppsetningarvalmöguleikar +# ^DirSubCaption +: Uppsetningarskráarsafn +# ^InstallingSubCaption +: Set upp +# ^CompletedSubCaption +: Lokið +# ^UnComponentsSubCaption +: Fjarlægingarvalmöguleikar +# ^UnDirSubCaption +: Fjarlægingarskráarsafn +# ^ConfirmSubCaption +: Staðfesting +# ^UninstallingSubCaption +: Fjarlægi +# ^UnCompletedSubCaption +: Lokið +# ^BackBtn +< &Til baka +# ^NextBtn +&Áfram > +# ^AgreeBtn +Ég &Samþykki +# ^AcceptBtn +Ég &samþykki skilmála leyfissamningsins +# ^DontAcceptBtn +Ég samþykki &ekki skilmála leyfissamningsins +# ^InstallBtn +&Setja upp +# ^UninstallBtn +&Fjarlægja +# ^CancelBtn +Hætta við +# ^CloseBtn +&Loka +# ^BrowseBtn +&Vafra... +# ^ShowDetailsBtn +Sýna &upplýsingar +# ^ClickNext +Smelltu á 'Áfram' til að halda áfram. +# ^ClickInstall +Smelltu á 'Setja upp' til þess að hefja uppsetninguna. +# ^ClickUninstall +Smelltu á 'Fjarlægja' til að hefja fjarlægingar ferlið. +# ^Name +Nafn +# ^Completed +Lokið +# ^LicenseText +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'. +# ^LicenseTextCB +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK +# ^LicenseTextRB +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK +# ^UnLicenseText +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki'. +# ^UnLicenseTextCB +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. $_CLICK +# ^UnLicenseTextRB +Vinsamlegast skoðaðu notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst. Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. $_CLICK +# ^Custom +Sjálfval +# ^ComponentsText +Hakaðu við þá íhluti sem þú vilt setja upp og taktu hakið af þeim íhlutum sem þú vilt ekki setja upp. $_CLICK +# ^ComponentsSubText1 +Veldu tegund uppsetningar: +# ^ComponentsSubText2_NoInstTypes +Veldu þá íhluti sem á að setja upp: +# ^ComponentsSubText2 +Eða, veldu valfrjálsa íhluti á að setja upp: +# ^UnComponentsText +Hakaðu við þá íhluti sem þú vilt fjarlægja og taktu hakið af þeim íhlutum sem þú vilt ekki fjarlægja. $_CLICK +# ^UnComponentsSubText1 +Veldu tegund fjarlægingar: +# ^UnComponentsSubText2_NoInstTypes +Veldu íhluti sem á að fjarlægja: +# ^UnComponentsSubText2 +Eða, veldu valfrjálsa íhluti sem á að fjarlægja: +# ^DirText +Uppsetningin mun setja $(^NameDA) upp í eftirfarandi skráarsafn. Til að setja forritið upp í annað skráarsafn, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK +# ^DirSubText +Uppsetningarskráarsafn +# ^DirBrowseText +Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í: +# ^UnDirText +Uppsetningin mun fjarlægja $(^NameDA) úr eftirfarandi skráarsafni. Til að fjarlægja forritið úr öðru skráarsafni, smelltu á 'Vafra...' og veldu annað skráarsafn. $_CLICK +# ^UnDirSubText +"Fjarlægingarskráarsafn" +# ^UnDirBrowseText +Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr: +# ^SpaceAvailable +"Tiltækt rými: " +# ^SpaceRequired +"Nauðsynlegt rými: " +# ^UninstallingText +$(^NameDA) verður fjarlægt úr eftirfarandi skráarsafni. $_CLICK +# ^UninstallingSubText +Fjarlægi úr: +# ^FileError +Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Hætta við' til að stoppa uppsetninguna,\r\n'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hunsa' til sleppa þessari skrá. +# ^FileError_NoIgnore +Villa við að skrifa í skrá: \r\n\r\n$0\r\n\r\nSmelltu á 'Reyna aftur' til að gera aðra tilraun, eða\r\n'Hætta við' til að stoppa uppsetninguna. +# ^CantWrite +"Get ei skrifað: " +# ^CopyFailed +Afritun mistókst +# ^CopyTo +"Afrita til " +# ^Registering +"Skrásetja: " +# ^Unregistering +"Afskrá: " +# ^SymbolNotFound +"Fann ekki tákn: " +# ^CouldNotLoad +"Gat ekki hlaðið inn: " +# ^CreateFolder +"Búa til skráarsafn: " +# ^CreateShortcut +"Búa til flýtileið: " +# ^CreatedUninstaller +"Bjó til fjarlægingarhjálp: " +# ^Delete +"Eyða skrá: " +# ^DeleteOnReboot +"Eyða við endurræsingu: " +# ^ErrorCreatingShortcut +"Villa við gerð flýtileiðar: " +# ^ErrorCreating +"Villa við gerð: " +# ^ErrorDecompressing +Villa við afþjöppun gagna! Biluð uppsetningarhjálp? +# ^ErrorRegistering +Villa við skrásetningu DLL +# ^ExecShell +"Keyrslugluggi: " +# ^Exec +"Keyra: " +# ^Extract +"Færa út: " +# ^ErrorWriting +"Færa út: villa við að skrifa í skrá " +# ^InvalidOpcode +Uppsetningarhjálp biluð: rangur stýrikóði +# ^NoOLE +"Engin OLE fyrir: " +# ^OutputFolder +"Útskráarsafn: " +# ^RemoveFolder +"Fjarlægja skráarsafn: " +# ^RenameOnReboot +"Endurskíra við endurræsingu: " +# ^Rename +"Endurskíra: " +# ^Skipped +"Sleppt: " +# ^CopyDetails +Afrita upplýsingar til skrifbrettis +# ^LogInstall +Skrá uppsetningarferli +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nsh new file mode 100644 index 0000000000..eb24d6f77e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Icelandic.nsh @@ -0,0 +1,121 @@ +;Language: Icelandic (15) +;By Gretar Orri Kristinsson + +!insertmacro LANGFILE "Icelandic" = "Íslenska" "Islenska" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkominn til $(^NameDA) uppsetningarhjálparinnar" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum uppsetninguna á $(^NameDA).$\r$\n$\r$\nMælt er með því að þú lokir öllum öðrum forritum áður en uppsetningin hefst. Þetta mun gera uppsetningarforritinu kleyft að uppfæra kerfiskrár án þess að endurræsa tölvuna.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkomin(n) til $(^NameDA) fjarlægingarhjálparinnar" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Þessi hjálp mun leiða þig í gegnum fjarlæginguna á $(^NameDA).$\r$\n$\r$\nÁður en fjarlæging hefst skal ganga úr skugga um að $(^NameDA) sé ekki opið.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Notandaleyfissamningur" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu Notandaleyfissamninginn vel áður en uppsetning á $(^NameDA) hefst." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að setja upp $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Leyfissamningur" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vinsamlegast skoðaðu leyfissamninginn vel áður en fjarlæging á $(^NameDA) hefst." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ef þú samþykkir skilmála samningsins, smelltu þá á 'Ég samþykki' til að halda áfram. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ef þú samþykkir skilmála samningsins, hakaðu þá í kassann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ef þú samþykkir skilmála samningsins, veldu þá fyrsta valmöguleikann hér að neðan. Þú verður að samþykkja samninginn til þess að fjarlægja $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Smelltu á 'PageDown' takkann á lyklaborðinu til að sjá afganginn af samningnum." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velja íhluti" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Veldu hvaða $(^NameDA) íhluti þú vilt setja upp." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velja íhluti" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velja hvaða $(^NameDA) íhluti þú vilt fjarlægja." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Lýsing" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Færðu músina yfir íhlut til að fá lýsinguna á honum." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Veldu íhlut til þess að fá lýsinguna á honum." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Veldu uppsetningarskáarsafn" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt setja $(^NameDA) upp í." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velja fjarlægingarskáarsafn" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Veldu það skráarsafn sem þú vilt fjarlægja $(^NameDA) úr." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Set upp" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vinsamlegast dokaðu við meðan $(^NameDA) er sett upp." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Uppsetningu lokið" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Uppsetning tókst." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Hætt við uppsetningu" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Uppsetningu lauk ekki sem skildi." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Fjarlægi" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vinsamlegast dokaðu við á meðan $(^NameDA) er fjarlægt." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Fjarlægingu lokið" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Fjarlæging tókst." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Hætt við fjarlægingu" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Fjarlægingu lauk ekki sem skildi." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) uppsetningarhjálpinni" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er nú upp sett á tölvunni þinni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Til að ljúka uppsetningunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Ljúka $(^NameDA) fjarlægingarhjálpinni" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) hefur nú verið fjarlægt úr tölvunni.$\r$\n$\r$\nSmelltu á 'Ljúka' til að loka þessari hjálp." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Til að ljúka fjarlægingunni á $(^NameDA) verður að endurræsa tölvuna. Viltu endurræsa núna?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Endurræsa núna" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ég vil endurræsa seinna" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Keyra $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Skoða LestuMig" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ljúka" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velja skráarsafn 'Start' valmyndar" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Veldu skráarsafn $(^NameDA) flýtileiða fyrir 'Start' valmyndina." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Veldu skráarsafn flýtileiða forritsins fyrir 'Start' valmyndina. Þú getur einnig búið til nýtt skráarsafn með því að setja inn nýtt nafn." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ekki búa til flýtileiðir í 'Start' valmyndinni" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Fjarlægja $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjarlægja $(^NameDA) úr tölvunni." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) uppsetningarhjálpinni?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ertu viss um að þú viljir loka $(^Name) fjarlægingarhjálpinni?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nlf new file mode 100644 index 0000000000..98c696a1fc --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nlf @@ -0,0 +1,194 @@ +# Header, don't edit +NLF v6 +# Language ID +1057 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Revision date: 2009 April +# Translators: +## Ariel , +## was.uthm@gmail.com +# +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalasi Program $(^Name) +# ^UninstallCaption +Penghapusan Program $(^Name) +# ^LicenseSubCaption +: Perihal Lisensi +# ^ComponentsSubCaption +: Pilihan Instalasi +# ^DirSubCaption +: Lokasi Instalasi +# ^InstallingSubCaption +: Proses Instalasi +# ^CompletedSubCaption +: Selesai +# ^UnComponentsSubCaption +: Pilihan Penghapusan +# ^UnDirSubCaption +: Berkas Lokasi yang dihapus +# ^ConfirmSubCaption +: Konfirmasi +# ^UninstallingSubCaption +: Proses Penghapusan +# ^UnCompletedSubCaption +: Selesai +# ^BackBtn +< &Mundur +# ^NextBtn +&Lanjut > +# ^AgreeBtn +Saya &Setuju +# ^AcceptBtn +Saya s&etuju dengan Perihal Lisensi +# ^DontAcceptBtn +Saya &tidak setuju dengan Perihal Lisensi +# ^InstallBtn +&Instal +# ^UninstallBtn +&Hapus +# ^CancelBtn +Batalkan +# ^CloseBtn +&Tutup +# ^BrowseBtn +Ca&ri... +# ^ShowDetailsBtn +Lihat &perincian +# ^ClickNext +Tekan tombol Lanjut untuk melanjutkan. +# ^ClickInstall +Tekan tombol Instal untuk memulai instalasi. +# ^ClickUninstall +Tekan tombol Hapus untuk memulai penghapusan. +# ^Name +Nama +# ^Completed +Selesai +# ^LicenseText +Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju. +# ^LicenseTextCB +Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK +# ^LicenseTextRB +Silahkan membaca lisensi berikut sebelum memulai instalasi $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK +# ^UnLicenseText +Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, tekan tombol Saya Setuju. +# ^UnLicenseTextCB +Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, beri tanda centang. $_CLICK +# ^UnLicenseTextRB +Silahkan membaca lisensi berikut sebelum mulai menghapus $(^NameDA). Jika anda menyetujui dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. $_CLICK +# ^Custom +Tentukan Sendiri +# ^ComponentsText +Beri tanda centang pada komponen yang akan di instal and hilangkan tanda centang pada komponen yang tidak perlu di instal. $_CLICK +# ^ComponentsSubText1 +Pilih tipe instalasi: +# ^ComponentsSubText2_NoInstTypes +Pilih komponen-komponen yang akan di instal: +# ^ComponentsSubText2 +Atau, pilih komponen tambahan yang akan di instal: +# ^UnComponentsText +Beri tanda centang pada komponen yang akan dihapus and hilangkan tanda centang pada komponen yang tidak ingin dihapus. $_CLICK +# ^UnComponentsSubText1 +Pilih tipe penghapusan: +# ^UnComponentsSubText2_NoInstTypes +Pilih komponen-komponen yang ingin dihapus: +# ^UnComponentsSubText2 +Atau, pilih komponen tambahan yang ingin dihapus: +# ^DirText +Program $(^NameDA) akan di instal pada lokasi berikut. Untuk memilih lokasi, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK +# ^DirSubText +Lokasi instalasi +# ^DirBrowseText +Pilih lokasi instalasi program $(^NameDA): +# ^UnDirText +Proses penghapusan program $(^NameDA) dari lokasi instalasi berikut. Untuk memilih lokasi lainnya, tekan tombol Cari kemudian pilih lokasi yang anda kehendaki. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Pilih lokasi instalasi program $(^NameDA) yang akan dihapus: +# ^SpaceAvailable +"Ruang yang tersedia: " +# ^SpaceRequired +"Ruang yang dibutuhkan: " +# ^UninstallingText +$(^NameDA) akan dihapus dari lokasi berikut. $_CLICK +# ^UninstallingSubText +Proses penghapusan dari: +# ^FileError +Tidak dapat membuka berkas untuk menulis: \r\n\t"$0"\r\nTekan tombol Abort untuk membatalkan instalasi,\r\nRetry untuk mencoba lagi, atau\r\nIgnore untuk melewati file ini. +# ^FileError_NoIgnore +Tidak dapat membuka berkas untuk menulis: \r\n\t"$0"\r\nTekan tombol Retry untuk mencoba lagi, atau\r\nCancel untuk membatalkan instalasi. +# ^CantWrite +"Tidak bisa menulis pada berkas: " +# ^CopyFailed +Gagal menyalin berkas +# ^CopyTo +"Menyalin ke " +# ^Registering +"Memasukkan dalam daftar: " +# ^Unregistering +"Menghapus dari daftar: " +# ^SymbolNotFound +"Tidak dapat menemukan simbol: " +# ^CouldNotLoad +"Tidak dapat memuat: " +# ^CreateFolder +"Membuat tempat menyimpan berkas: " +# ^CreateShortcut +"Membuat shortcut: " +# ^CreatedUninstaller +"Program penghapusan yang dibuat: " +# ^Delete +"Menghapus berkas: " +# ^DeleteOnReboot +"Akan dihapus saat reboot: " +# ^ErrorCreatingShortcut +"Tidak dapat membuat shortcut: " +# ^ErrorCreating +"Ada kesalahan saat membuat: " +# ^ErrorDecompressing +Ada kesalahan saat membuka data! Program Instalasi tidak lengkap? +# ^ErrorRegistering +Ada kesalahan ketika mendaftarkan modul DLL +# ^ExecShell +"Perintah: " +# ^Exec +"Menjalankan: " +# ^Extract +"Proses ekstraksi berkas: " +# ^ErrorWriting +"Ekstraksi: ada kesalahan saat menulis ke berkas " +# ^InvalidOpcode +Program instalasi rusak: kode program tidak lengkap +# ^NoOLE +"OLE tidak ditemukan: " +# ^OutputFolder +"Lokasi tujuan: " +# ^RemoveFolder +"Menghapus lokasi penyimpanan: " +# ^RenameOnReboot +"Memberi nama baru saat reboot: " +# ^Rename +"Memberi nama baru: " +# ^Skipped +"Dilewati: " +# ^CopyDetails +Salin perincian ke Clipboard +# ^LogInstall +Catat proses instalasi +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nsh new file mode 100644 index 0000000000..48064c248a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Indonesian.nsh @@ -0,0 +1,129 @@ +;Language: Indonesian (1057) +;By Ariel825010106@yahoo.com modified by was.uthm@gmail.com in April 2009 + +!insertmacro LANGFILE "Indonesian" = "Bahasa Indonesia" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Selamat datang di program instalasi $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Program ini akan membantu anda dalam proses instalasi $(^NameDA).$\r$\n$\r$\nAnda sangat disarankan untuk menutup program lainnya sebelum memulai proses instalasi. Hal ini diperlukan agar berkas yang terkait dapat diperbarui tanpa harus booting ulang komputer anda.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang di program penghapusan $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Program ini akan membantu anda pada proses penghapusan $(^NameDA).$\r$\n$\r$\nSebelum memulai proses penghapusan, pastikan dulu $(^NameDA) tidak sedang digunakan.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perihal Lisensi" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Silahkan membaca perihal lisensi sebelum memulai proses instalasi $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai instalasi $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda setuju dan menerima semua pernyatan, beri tanda centang. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai instalasi $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Perihal Lisensi" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Silahkan membaca lisensi berikut sebelum melakukan penghapusan $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda setuju dan menerima semua pernyataan, tekan tombol Saya Setuju untuk melanjutkan. Anda harus setuju untuk memulai proses penghapusan $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda setuju dan menerima semua pernyataan, beri tanda centang. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda setuju dan menerima semua pernyataan, pilihlah salah satu item dibawah ini. Anda harus setuju untuk memulai proses penghapusan $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan tombol Page Down untuk melihat pernyataan berikutnya." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih komponen fitur tambahan dari $(^NameDA) yang ingin di instal." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih komponen fitur tambahan dari $(^NameDA) yang ingin dihapus." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Deskripsi" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tunjuk ke salah satu komponen untuk melihat deskripsi tentang komponen itu." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Instalasi" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih lokasi untuk instalasi program $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi berkas yang akan dihapus" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih lokasi instalasi program $(^NameDA) yang akan dihapus." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Proses instalasi " + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Mohon tunggu sejenak, instalasi program $(^NameDA) sedang berlangsung." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalasi Selesai" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Seluruh proses instalasi sudah paripurna." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalasi Dibatalkan" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Proses instalasi tidak selesai dengan sempurna." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Proses penghapusan" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Mohon tunggu sejenak, penghapusan program $(^NameDA) sedang berlangsung." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Penghapusan Selesai" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Seluruh proses penghapusan sudah paripurna." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Penghapusan Dibatalkan" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Proses penghapusa tidak selesai dengan sempurna." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menutup Instalasi Program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah di instal di komputer anda.$\r$\n$\r$\nTekan tombol Selesai untuk menutup program." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda memerlukan booting ulang untuk menyempurnakan proses instalasi $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menutup program penghapusan $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dihapus dari komputer anda.$\r$\n$\r$\nTekan tombol Selesai untuk menutup." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda memerlukan booting untuk menyempurnakan proses penghapusan $(^NameDA). Apakah anda akan melakukan booting ulang sekarang juga?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Booting ulang sekarang" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Booting ulang nanti" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka berkas Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih lokasi dari Menu Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih lokasi dari Menu Start untuk meletakkan shortcut $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih lokasi dari Menu Start untuk meletakkan shortcut program ini. Anda bisa juga membuat lokasi baru dengan cara menulis nama lokasi yang dikehendaki." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Tidak perlu membuat shortcut" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Penghapusan $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Menghapus $(^NameDA) dari komputer anda." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Apakah anda yakin ingin menghentikan proses instalasi $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Apakah anda yakin ingin menghentikan proses penghapusan $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Pilihan Pemakai" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Pilihlah pemakai komputer yang akan menggunakan program $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Apakah anda akan melakukan instalasi $(^NameDA) untuk anda sendiri atau untuk semua pemakai komputer ini. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalasi untuk semua pemakai komputer ini" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalasi hanya untuk saya sendiri" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nlf new file mode 100644 index 0000000000..26a082589b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +2108 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Kevin P. Scannell < scannell at slu dot edu > +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Socrú $(^Name) +# ^UninstallCaption +Díshuiteáil $(^Name) +# ^LicenseSubCaption +: Comhaontú um Cheadúnas +# ^ComponentsSubCaption +: Roghanna Suiteála +# ^DirSubCaption +: Fillteán Suiteála +# ^InstallingSubCaption +: Suiteáil +# ^CompletedSubCaption +: Críochnaithe +# ^UnComponentsSubCaption +: Roghanna Díshuiteála +# ^UnDirSubCaption +: Fillteán Díshuiteála +# ^ConfirmSubCaption +: Deimhniú +# ^UninstallingSubCaption +: Díshuiteáil +# ^UnCompletedSubCaption +: Críochnaithe +# ^BackBtn +< Ar Ai&s +# ^NextBtn +Ar &Aghaidh > +# ^AgreeBtn +Gl&acaim Leis +# ^AcceptBtn +Táim toilteanach &glacadh le coinníollacha an Chomhaontú um Cheadúnas +# ^DontAcceptBtn +Nílim &toilteanach glacadh le coinníollacha an Chomhaontú um Cheadúnas +# ^InstallBtn +&Suiteáil +# ^UninstallBtn +&Díshuiteáil +# ^CancelBtn +Cealaigh +# ^CloseBtn +&Dún +# ^BrowseBtn +B&rabhsáil... +# ^ShowDetailsBtn +Taispeáin &sonraí +# ^ClickNext +Cliceáil "Ar Aghaidh" chun leanúint ar aghaidh. +# ^ClickInstall +Cliceáil "Suiteáil" chun tosú. +# ^ClickUninstall +Cliceáil "Díshuiteáil" chun tosú. +# ^Name +Ainm +# ^Completed +Críochnaithe +# ^LicenseText +Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis". +# ^LicenseTextCB +Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK +# ^LicenseTextRB +Déan iniúchadh ar an gComhaontú um Cheadúnas sula suiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK +# ^UnLicenseText +Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil "Glacaim Leis". +# ^UnLicenseTextCB +Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, cliceáil an ticbhosca thíos. $_CLICK +# ^UnLicenseTextRB +Déan iniúchadh ar an gComhaontú um Cheadúnas sula ndíshuiteálann tú $(^NameDA). Má ghlacann tú le gach coinníoll den chomhaontú, roghnaigh an chéad rogha thíos. $_CLICK +# ^Custom +Saincheaptha +# ^ComponentsText +Roghnaigh na comhpháirteanna is mian leat a shuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a shuiteáil. $_CLICK +# ^ComponentsSubText1 +Roghnaigh cineál na suiteála: +# ^ComponentsSubText2_NoInstTypes +Roghnaigh na comhpháirteanna is mian leat a shuiteáil: +# ^ComponentsSubText2 +Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a shuiteáil: +# ^UnComponentsText +Roghnaigh na comhpháirteanna is mian leat a dhíshuiteáil, agus díroghnaigh na comhpháirteanna nach mian leat a dhíshuiteáil. $_CLICK +# ^UnComponentsSubText1 +Roghnaigh cineál na díshuiteála: +# ^UnComponentsSubText2_NoInstTypes +Roghnaigh comhpháirteanna le díshuiteáil: +# ^UnComponentsSubText2 +Nó, roghnaigh na comhpháirteanna roghnacha is mian leat a dhíshuiteáil: +# ^DirText +Cuirfidh an Suiteálaí $(^NameDA) san fhillteán seo a leanas. Más mian leat suiteáil i bhfillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK +# ^DirSubText +Sprioc-Fhillteán +# ^DirBrowseText +Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil: +# ^UnDirText +Bainfidh an Suiteálaí $(^NameDA) amach as an bhfillteán seo a leanas. Más mian leat é a dhíshuiteáil ó fhillteán difriúil, cliceáil "Brabhsáil" agus roghnaigh fillteán eile. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as: +# ^SpaceAvailable +"Spás le fáil: " +# ^SpaceRequired +"Spás de dhíth: " +# ^UninstallingText +Díshuiteálfar $(^NameDA) ón fhillteán seo a leanas. $_CLICK +# ^UninstallingSubText +Á dhíshuiteáil ó: +# ^FileError +Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Abort" chun an tsuiteáil a stopadh,\r\n"Retry" chun iarracht eile a dhéanamh, nó\r\n"Ignore" chun neamhaird a dhéanamh den chomhad seo. +# ^FileError_NoIgnore +Earráid agus comhad á scríobh: \r\n\r\n$0\r\n\r\nCliceáil "Retry" chun iarracht eile a dhéanamh, nó\r\n"Cancel" chun an tsuiteáil a stopadh. +# ^CantWrite +"Ní féidir scríobh: " +# ^CopyFailed +Theip ar an gcóipeáil +# ^CopyTo +"Cóipeáil go " +# ^Registering +"Clárú: " +# ^Unregistering +"Díchlárú: " +# ^SymbolNotFound +"Níorbh fhéidir siombail a aimsiú: " +# ^CouldNotLoad +"Níorbh fhéidir luchtú: " +# ^CreateFolder +"Cruthaigh fillteán: " +# ^CreateShortcut +"Cruthaigh aicearra: " +# ^CreatedUninstaller +"Cruthaíodh díshuiteálaí: " +# ^Delete +"Scrios comhad: " +# ^DeleteOnReboot +"Scrios ag am atosaithe: " +# ^ErrorCreatingShortcut +"Earráid agus aicearra á chruthú: " +# ^ErrorCreating +"Earráid le linn cruthaithe: " +# ^ErrorDecompressing +Earráid agus sonraí á ndíchomhbhrú! Suiteálaí truaillithe? +# ^ErrorRegistering +Earráid agus DLL á chlárú +# ^ExecShell +"Blaosc: " +# ^Exec +"Rith: " +# ^Extract +"Bain Amach: " +# ^ErrorWriting +"Extract: earráid le linn scríofa " +# ^InvalidOpcode +Díshuiteálaí truaillithe: cód neamhbhailí oibríochta +# ^NoOLE +"Gan OLE le haghaidh: " +# ^OutputFolder +"Fillteán aschurtha: " +# ^RemoveFolder +"Bain fillteán: " +# ^RenameOnReboot +"Athainmnigh ag am atosaithe: " +# ^Rename +"Athainmnigh: " +# ^Skipped +"Neamhaird déanta de: " +# ^CopyDetails +Cóipeáil Sonraí go dtí an Ghearrthaisce +# ^LogInstall +Logáil an próiseas suiteála +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nsh new file mode 100644 index 0000000000..aff4d54d8e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Irish.nsh @@ -0,0 +1,121 @@ +;Language: Irish (2108) +;By Kevin P. Scannell < scannell at slu dot edu > + +!insertmacro LANGFILE "Irish" = "Gaeilge" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Suiteála $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an suiteáil de $(^NameDA).$\r$\n$\r$\nMoltar duit gach feidhmchlár eile a dhúnadh sula dtosaíonn tú an Suiteálaí. Cinnteoidh sé seo gur féidir na comhaid oiriúnacha a nuashonrú gan do ríomhaire a atosú.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fáilte go dtí Draoi Díshuiteála $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Déanfaidh an draoi seo treorú duit tríd an díshuiteáil de $(^NameDA).$\r$\n$\r$\nBí cinnte nach bhfuil $(^NameDA) ag rith sula dtosaíonn tú an díshuiteáil.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Comhaontú um Cheadúnas" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula suiteálann tú $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a shuiteáil. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Comhaontú um Cheadúnas" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Déan iniúchadh ar choinníollacha an cheadúnais sula ndíshuiteálann tú $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil $\"Glacaim Leis$\" chun leanúint ar aghaidh. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Má ghlacann tú le coinníollacha an chomhaontaithe, cliceáil an ticbhosca thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Má ghlacann tú le coinníollacha an chomhaontaithe, roghnaigh an chéad rogha thíos. Caithfidh tú glacadh leis an gcomhaontú chun $(^NameDA) a dhíshuiteáil. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Brúigh $\"Page Down$\" chun an chuid eile den cheadúnas a léamh." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat suiteáil." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Roghnaigh Comhpháirteanna" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Roghnaigh na gnéithe $(^NameDA) ba mhaith leat díshuiteáil." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Cur Síos" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir do luch os cionn comhpháirte chun cur síos a fheiceáil." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Roghnaigh comhpháirt chun cur síos a fheiceáil." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Suiteála" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán inar mian leat $(^NameDA) a shuiteáil." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Roghnaigh Suíomh na Díshuiteála" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Roghnaigh an fillteán ar mian leat $(^NameDA) a dhíshuiteáil as." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Á Shuiteáil" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á shuiteáil." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Suiteáil Críochnaithe" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'éirigh leis an tsuiteáil." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Suiteáil Tobscortha" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Níor éirigh leis an tsuiteáil." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Á Dhíshuiteáil" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fan go fóill; $(^NameDA) á dhíshuiteáil." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Díshuiteáil Críochnaithe" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'éirigh leis an díshuiteáil." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Díshuiteáil Tobscortha" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Níor éirigh leis an díshuiteáil." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Draoi Suiteála $(^NameDA) á Chríochnú" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Suiteáladh $(^NameDA) ar do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun suiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Draoi Díshuiteála $(^NameDA) á Chríochnú" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Díshuiteáladh $(^NameDA) ó do ríomhaire.$\r$\n$\r$\nCliceáil $\"Críochnaigh$\" chun an draoi seo a dhúnadh." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ní mór duit do ríomhaire a atosú chun díshuiteáil $(^NameDA) a chur i gcrích. Ar mhaith leat atosú anois?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Atosaigh anois" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Atosóidh mé de láimh níos déanaí" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Rith $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Tai&speáin comhad README" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Críochnaigh" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Roghnaigh Fillteán sa Roghchlár Tosaigh" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Roghnaigh fillteán sa Roghchlár Tosaigh a gcuirfear aicearraí $(^NameDA) ann." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Roghnaigh an fillteán sa Roghchlár Tosaigh inar mian leat aicearraí an chláir a chruthú. Is féidir freisin fillteán nua a chruthú trí ainm nua a iontráil." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ná cruthaigh aicearraí" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Díshuiteáil $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Bain $(^NameDA) ó do ríomhaire." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Suiteálaí $(^Name) a scor?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "An bhfuil tú cinnte gur mian leat Díshuiteálaí $(^Name) a scor?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nlf new file mode 100644 index 0000000000..07e7759630 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nlf @@ -0,0 +1,192 @@ +# Header, don't edit +NLF v6 +# Language ID +1040 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation orginally started by Orfanik - http://www.orfanik.hu +# Updated v2 to v6 by Alessandro Staltari < staltari (a) geocities.com > +# Revised by < mdalco@gmail.com > and bovirus < bovirus@gmail.com > +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Installazione di $(^Name) +# ^UninstallCaption +Disinstallazione di $(^Name) +# ^LicenseSubCaption +: Accordo di licenza +# ^ComponentsSubCaption +: Opzioni installazione +# ^DirSubCaption +: Cartella installazione +# ^InstallingSubCaption +: Installazione +# ^CompletedSubCaption +: Installazione completata +# ^UnComponentsSubCaption +: Opzioni disinstallazione +# ^UnDirSubCaption +: Cartella disinstallazione +# ^ConfirmSubCaption +: Conferma +# ^UninstallingSubCaption +: Disinstallazione +# ^UnCompletedSubCaption +: Disisntallazione completata +# ^BackBtn +< &Indietro +# ^NextBtn +&Avanti > +# ^AgreeBtn +&Accetto +# ^AcceptBtn +&Accetto le condizioni della licenza +# ^DontAcceptBtn +&Non accetto le condizioni della licenza +# ^InstallBtn +Ins&talla +# ^UninstallBtn +&Disinstalla +# ^CancelBtn +Annulla +# ^CloseBtn +&Fine +# ^BrowseBtn +S&foglia... +# ^ShowDetailsBtn +Visualizza &dettagli +# ^ClickNext +Per proseguire, seleziona 'Avanti'. +# ^ClickInstall +Per avviare l'installazione, seleziona 'Installa'. +# ^ClickUninstall +Per avviare la disinstallazione, seleziona 'Disinstalla'. +# ^Name +Nome +# ^Completed +Installazione completata +# ^LicenseText +Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti le condizioni della licenza, seleziona 'Accetto'. +# ^LicenseTextCB +Leggi licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK +# ^LicesnseTextRB +Leggi la licenza prima di procedere con l'installazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK +# ^UnLicenseText +Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona 'Accetto'. $_CLICK +# ^UnLicenseTextCB +Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la casella sottostante. $_CLICK +# ^UnLicesnseTextRB +Leggi la licenza prima di procedere con la disinstallazione di $(^NameDA). Se accetti tutte le condizioni della licenza, seleziona la prima delle opzioni sottoindicate. $_CLICK +# ^Custom +Personalizzata +# ^ComponentsText +Seleziona componenti da installare. +# ^ComponentsSubText1 +Seleziona tipo installazione: +# ^ComponentsSubText2_NoInstTypes +Seleziona componenti da installare: +# ^ComponentsSubText2 +Oppure, seleziona componenti opzionali da installare: +# ^UnComponentsText +Seleziona componenti da disinstallare. +# ^UnComponentsSubText1 +Seleziona tipo disinstallazione: +# ^UnComponentsSubText2_NoInstTypes +Seleziona componenti da disinstallare: +# ^UnComponentsSubText2 +Oppure, seleziona componenti opzionali da disinstallare : +# ^DirText +Questa procedura installerà $(^NameDA) in questa cartella.\r\nPer installare in una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK +# ^DirSubText +Cartella destinazione +# ^DirBrowseText +Seleziona la cartella dove installare $(^NameDA): +# ^UnDirText +Questa procedura disinstallerà $(^NameDA) da questa cartella.\r\nPer disinstallare da una cartella diversa, seleziona 'Sfoglia' e scegli un'altra cartella.\r\n$_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Seleziona la cartella dalla quale disinstallare $(^NameDA): +# ^SpaceAvailable +"Spazio disponibile: " +# ^SpaceRequired +"Spazio richiesto: " +# ^UninstallingText +$(^NameDA) verrà disinstallato da questa cartella.\r\n$_CLICK +# ^UninstallingSubText +Rimozione da: +# ^FileError +Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Termina' per interrompere l'installazione,\r\n'Riprova' per ritentare, oppure\r\n'Ignora' per saltare questo file. +# ^FileError_NoIgnore +Errore nell'apertura del file per la scrittura: \r\n\t"$0"\r\nSeleziona 'Riprova' per ritentare, oppure\r\n'Termina' per interrompere l'installazione +# ^CantWrite +"Impossibile scrivere: " +# ^CopyFailed +Copia fallita +# ^CopyTo +"Copia in " +# ^Registering +"Registrazione di: " +# ^Unregistering +"Deregistrazione di: " +# ^SymbolNotFound +"Impossibile trovare il simbolo: " +# ^CouldNotLoad +"Impossibile caricare: " +# ^CreateFolder +"Creazione cartella: " +# ^CreateShortcut +"Creazione collegamento: " +# ^CreatedUninstaller +"Creazione programma disinstallazione: " +# ^Delete +"Eliminazione file: " +# ^DeleteOnReboot +"Elimina al riavvio: " +# ^ErrorCreatingShortcut +"Errore nella creazione del collegamento: " +# ^ErrorCreating +"Errore nella creazione di: " +# ^ErrorDecompressing +Errore nella decompressione dei dati! Probabile programma di installazione corrotto. +# ^ErrorRegistering +Errore nella registrazione della DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Esecuzione di: " +# ^Extract +"Estrazione di: " +# ^ErrorWriting +"Estrazione: errore nella scrittura nel file " +# ^InvalidOpcode +Programma di installazione corrotto: opcode non valido +# ^NoOLE +"Nessuna OLE per: " +# ^OutputFolder +"Cartella destinazione: " +# ^RemoveFolder +"Rimozione cartella: " +# ^RenameOnReboot +"Al riavvio rinomina: " +# ^Rename +Rinomina +# ^Skipped +"Saltato: " +# ^CopyDetails +Copia i dettagli negli Appunti +# ^LogInstall +Registro eventi processo installazione +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nsh new file mode 100644 index 0000000000..78bd16880a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Italian.nsh @@ -0,0 +1,131 @@ +;Language: Italian (1040) +;By SANFACE Software v1.67 accents +;Review and update from v1.65 to v1.67 by Alessandro Staltari < staltari (a) geocities.com > +;Review and update from v1.67 to v1.68 by Lorenzo Bevilacqua < meow811@libero.it > + +!insertmacro LANGFILE "Italian" = "Italiano" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Installazione di $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Questo programma installerà $(^NameDA) nel computer.$\r$\n$\r$\nSi raccomanda di chiudere tutte le altre applicazioni prima di iniziare l'installazione. Questo permetterà al programma di installazione di aggiornare i file di sistema senza dover riavviare il computer.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Disinstallazione di $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Questa programma ti guiderà nella disinstallazione di $(^NameDA).$\r$\n$\r$\nPrima di iniziare la disinstallazione, assicurati che $(^Name) non sia in esecuzione.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Accordo di licenza" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Accordo di licenza" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Leggi le condizioni dell'accordo di licenza prima di installare $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se accetti tutti i termini dell'accordo di licenza, seleziona 'Accetto' per continuare. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se accetti i termini dell'accordo di licenza, seleziona la casella sottostante. Per installare $(^NameDA) è necessario accettare i termini dell'accordo di licenza. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se accetti i termini dell'accordo di licenza, seleziona la prima opzione sottostante. Per installare $(^NameDA) è necessario accettare i termini della licenza d'uso. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Premi 'PagGiù' per visualizzare il resto dell'accordo di licenza." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selezione componenti" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da installare." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selezione componenti" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleziona i componenti di $(^NameDA) da disinstallare." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrizione" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posiziona il puntatore del mouse sul componente per visualizzare la relativa descrizione." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleziona un componente per visualizzare la relativa descrizione." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selezione cartella installazione" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Seleziona la cartella nella quale installare $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selezione cartella da cui disinstallare" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Seleziona la cartella dalla quale disinstallare $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installazione" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Attendi il completamento dell'installazione di $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installazione completata" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "L'installazione è stata completata correttamente." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installazione interrotta" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "L'installazione non è stata completata correttamente." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Disinstallazione" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Attendi il completamento della disinstallazione di $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Disinstallazione completata" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La disinstallazione è stata completata correttamente." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Disinstallazione interrotta" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La disintallazione non è stata completata correttamente." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installazione di $(^NameDA) completata." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) è stato installato.$\r$\n$\r$\nScegli 'Chiudi' per chiudere il programma di installazione." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Per completare l'installazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Disinstallazione di $(^NameDA) completata." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) è stato disinstallato.$\r$\n$\r$\nSeleziona 'Chiudi' per chiudere questa procedura." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Per completare la disinstallazione di $(^NameDA) il computer deve essere riavviato. Vuoi riavviarlo ora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Riavvia ora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Preferisco riavviarlo manualmente più tardi" + ${LangFileString} MUI_TEXT_FINISH_RUN "Esegui $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Visualizza il file Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Chiudi" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selezione cartella menu Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Seleziona la cartella del menu Start in cui creare i collegamenti del programma." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleziona la cartella del menu Start in cui verranno creati i collegamenti del programma. È possibile inserire un nome per creare una nuova cartella." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Non creare i collegamenti del programma." +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Disinstallazione" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Disinstalla il programma $(^NameDA)." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Sei sicuro di voler interrompere l'installazione di $(^Name) ?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sei sicuro di voler interrompere la disinstallazione di $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Configurazione profilo utenti" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Seleziona per quali utenti vuoi installare $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleziona se vuoi installare $(^NameDA) solo per questo utente o per tutti gli utenti di questo sistema. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installazione per tutti gli utenti" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installazione per il singolo utente" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nlf new file mode 100644 index 0000000000..d961543423 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1041 +# Font and size - dash (-) means default +MS Pゴシック +9 +# Codepage - dash (-) means ASCII code page +932 +# RTL - anything else than RTL means LTR +- +# Translation by Dnanako(2002), Updated by Takahiro Yoshimura(2003) , maboroshin(2020) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) セットアップ +# ^UninstallCaption +$(^Name) アンインストール +# ^LicenseSubCaption +:使用許諾契約 +# ^ComponentsSubCaption +:インストール オプション +# ^DirSubCaption +:インストール フォルダ +# ^InstallingSubCaption +:インストール +# ^CompletedSubCaption +:完了 +# ^UnComponentsSubCaption +: アンインストール オプション +# ^UnDirSubCaption +: アンインストール フォルダ +# ^ComfirmSubCaption +:確認 +# ^UninstallingSubCaption +:アンインストール +# ^UnCompletedSubCaption +:完了 +# ^BackBtn +< 戻る(&B) +# ^NextBtn +次へ(&N) > +# ^AgreeBtn +同意する(&A) +# ^AcceptBtn +この使用許諾契約に同意する(&A) +# ^DontAcceptBtn +この使用許諾契約に同意しません(&D) +# ^InstallBtn +インストール(&I) +# ^UninstallBtn +アンインストール(&U) +# ^CancelBtn +キャンセル +# ^CloseBtn +閉じる(&C) +# ^BrowseBtn +参照(&R)... +# ^ShowDetailsBtn +詳細を表示(&D) +# ^ClickNext +「次へ」をクリックし続行します。 +# ^ClickInstall +「インストール」をクリックしインストールを開始します。 +# ^ClickUninstall +「アンインストール」をクリックしアンインストールを開始します。 +# ^Name +アプリケーション +# ^Completed +完了 +# ^LicenseText +$(^NameDA) をインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、「同意する」をクリックしてください。 +# ^LicenseTextCB +$(^NameDA) をインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、下のチェックボックスをクリックしてください。 $_CLICK +# ^LicenseTextRB +$(^NameDA) をインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、下の選択肢から最初のものを選択してください。 $_CLICK +# ^UnLicenseText +$(^NameDA) をアンインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、「同意する」をクリックしてください。 +# ^UnLicenseTextCB +$(^NameDA) をアンインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、下のチェックボックスをクリックしてください。 $_CLICK +# ^UnLicenseTextRB +$(^NameDA) をアンインストールする前に、使用許諾契約を確認してください。契約のすべての条件に同意するなら、下の選択肢から最初のものを選択してください。 $_CLICK +# ^Custom +カスタム +# ^ComponentsText +インストールしたい構成要素にチェックしてください。不要なものはチェックを外してください。 $_CLICK +# ^ComponentsSubText1 +インストールの種類を選択: +# ^ComponentsSubText2_NoInstTypes +インストールする構成要素を選択: +# ^ComponentsSubText2 +またはインストールしたい構成要素を選択: +# ^UnComponentsText +アンインストールしたい構成要素にチェックしてください。そうでないものはチェックを外してください。 $_CLICK +# ^UnComponentsSubText1 +アンインストールの種類を選択: +# ^UnComponentsSubText2_NoInstTypes +アンインストールする構成要素を選択: +# ^UnComponentsSubText2 +またはアンインストールしたい構成要素を選択: +# ^DirText +$(^NameDA) を以下のフォルダにインストールします。別のフォルダにインストールするには、「参照」 を押しフォルダを選択してください。 $_CLICK +# ^DirSubText +インストール先のフォルダ +# ^DirBrowseText +$(^NameDA) をインストールするフォルダを選択: +# ^UnDirText +$(^NameDA) を以下のフォルダからアンインストールします。別のフォルダからアンインストールするには、「参照」 を押しフォルダを選択してください。 $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA) をアンインストールするフォルダを選択: +# ^SpaceAvailable +空き容量: +# ^SpaceRequired +必要容量: +# ^UninstallingText +$(^NameDA) を以下のフォルダからアンインストールされます。 $_CLICK +# ^UninstallingSubText +アンインストール元: +# ^FileError +書き込みファイルオープンのエラー:\r\n\t"$0"\r\nインストールを中止するには「中止」、\r\n再びこのファイルの作成を試みるには「再試行」、\r\nこのファイルをスキップして続けるには「無視」を押してください。 +# ^FileError_NoIgnore +書き込みファイルオープンのエラー: \r\n\t"$0"\r\n再びこのファイルの作成を試みるには「再試行」、\r\nインストールを中止するには「キャンセル」を押してください。 +# ^CantWrite +書き込めません: +# ^CopyFailed +コピー失敗 +# ^CopyTo +コピー +# ^Registering +登録中: +# ^Unregistering +登録解除中: +# ^SymbolNotFound +シンボルが見つかりません: +# ^CouldNotLoad +読み込みに失敗: +# ^CreateFolder +フォルダ作成: +# ^CreateShortcut +ショートカット作成: +# ^CreatedUninstaller +アンインストーラ作成: +# ^Delete +ファイル削除: +# ^DeleteOnReboot +再起動時に削除: +# ^ErrorCreatingShortcut +ショートカット作成エラー: +# ^ErrorCreating +作成エラー: +# ^ErrorDecompressing +データの展開エラー\r\n\r\nインストーラが破損していませんか? +# ^ErrorRegistering +DLL の登録エラー +# ^ExecShell +拡張子の関連付け実行: +# ^Execute +実行: +# ^Extract +展開: +# ^ErrorWriting +展開:ファイルへの書き込みエラー +# ^InvalidOpcode +インストーラーが壊れている:無効な opcode +# ^NoOLE +OLE がありません: +# ^OutputFolder +出力先フォルダ: +# ^RemoveFolder +フォルダ削除: +# ^RenameOnReboot +再起動時に名前の変更: +# ^Rename +名前の変更: +# ^Skipped +省略: +# ^CopyDetails +クリップボードへ詳細をコピー +# ^LogInstall +インストールの経過をログヘ記録 +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nsh new file mode 100644 index 0000000000..a143b0fd2b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Japanese.nsh @@ -0,0 +1,129 @@ +;Language: Japanese (1041) +; 1st translation by Dnanako Dnanako (2002, r1537), 2nd update by Takahiro Yoshimura (2003, r2489) , 3rd update by maboroshin (July 2020) + +!insertmacro LANGFILE "Japanese" = "日本語" "Nihongo" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) セットアップへようこそ" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "セットアップは、$(^NameDA) のインストールをご案内します。$\r$\n$\r$\nセットアップを開始する前に、他のすべてのアプリケーションを終了することを推奨します。これによってセットアップがコンピュータを再起動せずに、システム ファイルを更新することができるようになります。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) アンインストールへようこそ" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "セットアップは、$(^NameDA) のアンインストールをご案内します。$\r$\n$\r$\nアンインストールを開始する前に、$(^NameDA) が起動していないことを確認して下さい。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "使用許諾契約" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) をインストールする前に、ライセンス条件を確認してください。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "契約のすべての条件に同意するなら、「同意する」 を選択しインストールを続行します。$(^NameDA) をインストールするには、契約に同意する必要があります。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "契約のすべての条件に同意するなら、下のチェックボックスをクリックしてください。$(^NameDA) をインストールするには、契約に同意する必要があります。 $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "契約のすべての条件に同意するなら、下に表示されているオプションのうち、最初のものを選択してください。$(^NameDA) をインストールするには、契約に同意する必要があります。 $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "使用許諾契約" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) をアンインストールする前に、ライセンス条件を確認してください。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "契約のすべての条件に同意するなら、「同意する」 を選択しアンインストールを続行します。$(^NameDA) をアンインストールするには、契約に同意する必要があります。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "契約のすべての条件に同意するなら、下のチェックボックスをクリックしてください。$(^NameDA) をアンインストールするには、契約に同意する必要があります。 $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "契約のすべての条件に同意するなら、下の選択肢から最初のものを選択してください。$(^NameDA) をアンインストールするには、契約に同意する必要があります。 $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "[Page Down] を押し契約をすべてお読みください。" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "構成要素の選択" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "インストールしたい $(^NameDA) の機能を選択してください。" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "構成要素の選択" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "アンインストールしたい $(^NameDA) の機能を選択してください。" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "説明" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "構成要素にマウス カーソルを載せると、説明が表示されます。" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "構成要素を選択すると、説明が表示されます。" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "インストール先の選択" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) をインストールするフォルダを選択してください。" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "アンインストール元の選択" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) をアンインストールするフォルダを選択してください。" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "インストール" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) をインストール中です。お待ちください。" + ${LangFileString} MUI_TEXT_FINISH_TITLE "インストールの完了" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "インストールに成功しました。" + ${LangFileString} MUI_TEXT_ABORT_TITLE "インストールの中止" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "セットアップは正常に完了しませんでした。" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "アンインストール" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) をアンインストール中です。お待ちください。" + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "アンインストールの完了" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "アンインストールに成功しました。" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "アンインストールの中止" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "アンインストールは正常に完了しませんでした。" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) セットアップの完了" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) は、このコンピュータにインストールされました。$\r$\n$\r$\n「完了」をクリックしセットアップを閉じます。" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) のインストールを完了するには、このコンピュータを再起動する必要があります。今すぐ再起動しますか?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) アンインストールの完了" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) は、このコンピュータからアンインストールされました。$\r$\n$\r$\n「完了」をクリックしセットアップを閉じます。" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) のアンインストールを完了するには、このコンピュータを再起動する必要があります。今すぐ再起動しますか?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "今すぐ再起動" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "後で手動で再起動" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) を実行(&R)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme を表示(&S)" + ${LangFileString} MUI_BUTTONTEXT_FINISH "完了(&F)" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "スタートメニューのフォルダの選択" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) のショートカットを作成するスタートメニューのフォルダを選択してください。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "このプログラムのショートカットを作成したいスタートメニューのフォルダを選択してください。また、新規フォルダの名前を入力することもできます。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ショートカットを作成しない" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) のアンインストール" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) をこのコンピュータから削除します。" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) セットアップを中止しますか?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) アンインストールを中止しますか?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "ユーザーの選択" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "どのユーザーのために $(^NameDA) をインストールするか選択してください。" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA) を自分自身のためだけにインストールするのか、このコンピューターのすべてのユーザーにインストールするのか選択してください。$(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "このコンピューターを使用する全員にインストール" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "自分にのみインストール" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nlf new file mode 100644 index 0000000000..6a04a974e7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1042 +# Font and size - dash (-) means default +굴림 +9 +# Codepage - dash (-) means ASCII code page +949 +# RTL - anything else than RTL means LTR +- +# Translation by dTomoyo dtomoyo@empal.com ( ~V2.0 BETA2 ) / By hardkoder@gmail.com (V2.0 BETA3 ~ ) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) 설치 +# ^UninstallCaption +$(^Name) 제거 +# ^LicenseSubCaption +: 사용권 계약 동의 +# ^ComponentsSubCaption +: 설치 옵션 +# ^DirSubCaption +: 폴더 지정 +# ^InstallingSubCaption +: 파일 설치중 +# ^CompletedSubCaption +: 설치 완료 +# ^UnComponentsSubCaption +: 제거 옵션 +# ^UnDirSubCaption +: 제거 폴더 +# ^ConfirmSubCaption +: 확인 +# ^UninstallingSubCaption +: 제거중 +# ^UnCompletedSubCaption +: 제거 완료 +# ^BackBtn +< 뒤로 +# ^NextBtn +다음 > +# ^AgreeBtn +동의함 +# ^AcceptBtn +위 사항에 동의합니다. +# ^DontAcceptBtn +동의하지 않습니다. +# ^InstallBtn +설치 +# ^UninstallBtn +제거 +# ^CancelBtn +취소 +# ^CloseBtn +닫음 +# ^BrowseBtn +찾아보기... +# ^ShowDetailsBtn +자세히 보기 +# ^ClickNext +계속하시려면 '다음' 버튼을 눌러 주세요. +# ^ClickInstall +설치를 시작하시려면 '설치' 버튼을 눌러 주세요. +# ^ClickUninstall +'제거' 버튼을 누르면 제거가 시작됩니다. +# ^Name +이름 +# ^Completed +완료 +# ^LicenseText +$(^NameDA)(을)를 설치하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 '동의함'을 눌러 주세요. +# ^LicenseTextCB +$(^NameDA)(을)를 설치하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 아래 사항을 체크해 주세요. $_CLICK +# ^LicesnseTextRB +$(^NameDA)(을)를 설치하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 아래 옵션을 선택해 주세요. $_CLICK +# ^UnLicenseText +$(^NameDA)(을)를 제거하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 '동의함'을 눌러 주세요. +# ^UnLicenseTextCB +$(^NameDA)(을)를 제거하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 아래 사항을 체크해 주세요. $_CLICK +# ^UnLicesnseTextRB +$(^NameDA)(을)를 제거하기 전에 사용권 계약 내용을 살펴보시기 바랍니다. 내용에 동의하셨다면 아래 옵션을 선택해 주세요. $_CLICK +# ^Custom +사용자 정의 +# ^ComponentsText +설치를 원하시는 구성 요소를 선택하여 주시기 바랍니다. $_CLICK +# ^ComponentsSubText1 +설치 형태 선택: +# ^ComponentsSubText2_NoInstTypes +설치하려는 구성 요소 선택: +# ^ComponentsSubText2 +구성요소 직접 선택: +# ^UnComponentsText +제거를 원하는 구성 요소를 체크해 주시기 바랍니다. $_CLICK +# ^UnComponentsSubText1 +제거 형태 선택: +# ^UnComponentsSubText2_NoInstTypes +제거하려는 구성 요소 선택: +# ^UnComponentsSubText2 +제거하려는 구성요소 직접 선택: +# ^DirText +$(^NameDA)(을)를 다음 폴더에 설치할 예정입니다. \r\n다른 폴더에 설치하고 싶으시면 '찾아보기' 버튼을 눌러서 다른 폴더를 선택해 주세요. $_CLICK +# ^DirSubText +설치 폴더 +# ^DirBrowseText +$(^NameDA)(을)를 다음 폴더에 설치합니다: +# ^UnDirText +$(^NameDA)(을)를 다음 폴더에서 제거할 예정입니다. \r\n다른 폴더에서 제거하고 싶으시면 '찾아보기' 버튼을 눌러서 다른 폴더를 선택해 주세요. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA)(을)를 다음 폴더에서 제거 합니다: +# ^SpaceAvailable +"남은 디스크 공간: " +# ^SpaceRequired +"필요한 디스크 공간: " +# ^UninstallingText +시스템에서 $(^NameDA)(을)를 제거 할 것입니다. $_CLICK +# ^UninstallingText +제거 대상: +# ^FileError +다음 파일을 열 수 없습니다.: \r\n\t"$0"\r\n'중단'을 눌러 설치를 종료하거나,\r'다시 시도'를 눌러 다시 시도해 보거나,\r'무시'를 눌러 이 파일을 건너 뛰세요. +# ^FileError_NoIgnore +다음 파일을 열 수 없습니다.: \r\n\t"$0"\r\n'다시 시도'를 눌러 다시 시도해 보거나,\r'취소'를 눌러 설치를 종료하세요. +# ^CantWrite +"기록할 수 없음: " +# ^CopyFailed +복사 실패 +# ^CopyTo +"파일 복사 " +# ^Registering +"등록중: " +# ^Unregistering +"등록 해제중: " +# ^SymbolNotFound +"심볼을 찾을 수 없음: " +# ^CouldNotLoad +"불러올 수 없음: " +# ^CreateFolder +"폴더 생성: " +# ^CreateShortcut +"바로 가기 생성: " +# ^CreatedUninstaller +"언인스톨러 생성: " +# ^Delete +"파일 삭제: " +# ^DeleteOnReboot +"재부팅시 삭제: " +# ^ErrorCreatingShortcut +"바로 가기 생성 오류: " +# ^ErrorCreating +"생성 실패: " +# ^ErrorDecompressing +압축 해제중 오류 발생! 설치 파일이 손상되었습니다. +# ^ErrorRegistering +DLL 등록 실패 +# ^ExecShell +"쉘 실행: " +# ^Exec +"실행: " +# ^Extract +"압축 해제: " +# ^ErrorWriting +"압축 해제: 파일을 기록하는 도중 오류 발생 " +# ^InvalidOpcode +인스톨러 손상됨: 잘못된 실행코드 +# ^NoOLE +"OLE 정보 없음: " +# ^OutputFolder +"대상 폴더: " +# ^RemoveFolder +"폴더 삭제: " +# ^RenameOnReboot +"재부팅시 이름 변경: " +# ^Rename +"이름 변경: " +# ^Skipped +"건너뜀: " +# ^CopyDetails +자세한 내용을 클립보드로 복사 +# ^LogInstall +설치 로그 작성 +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nsh new file mode 100644 index 0000000000..c60a02d949 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Korean.nsh @@ -0,0 +1,121 @@ +;Language: Korean (1042) +;By linak linak@korea.com ( ~ V2.0 BETA3 ) By kippler@gmail.com(www.kipple.pe.kr) ( V2.0 BETA3 ~ ) (last update:2007/09/05) + +!insertmacro LANGFILE "Korean" = "한국어" "Hangugeo" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) 설치를 시작합니다." + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "이 프로그램은 당신의 컴퓨터에 $(^NameDA)(을)를 설치할 것입니다.$\r$\n$\r$\n설치를 시작하기 전 가능한 한 모든 프로그램을 종료하여 주시기 바랍니다. 이는 재부팅을 하지 않고서도 시스템 파일을 수정할 수 있게 해줍니다.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) 제거를 시작합니다." + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "이 프로그램은 당신의 컴퓨터에서 $(^NameDA)(을)를 제거할 것입니다.$\r$\n$\r$\n제거를 시작하기 전에 $(^NameDA)(을)를 종료하여 주시기 바랍니다.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "사용권 계약" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)(을)를 설치하시기 전에 사용권 계약 내용을 살펴보시기 바랍니다." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "내용에 동의하셨다면 '동의함'을 눌러 주세요. $(^NameDA)(을)를 설치하기 위해서는 반드시 내용에 동의하셔야 합니다." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "내용에 동의하셨다면 아래 사항을 선택해 주세요. $(^NameDA)(을)를 설치하기 위해서는 반드시 내용에 동의하셔야 합니다. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "내용에 동의하셨다면 첫 번째 사항을 선택해 주세요. $(^NameDA)(을)를 설치하기 위해서는 반드시 내용에 동의하셔야 합니다. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "사용권 계약 동의" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)(을)를 제거하시기 전에 사용권 계약 내용을 살펴보시기 바랍니다." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "내용에 동의하셨다면 '동의함'을 눌러 주세요. $(^NameDA)(을)를 제거하기 위해서는 반드시 내용에 동의하셔야 합니다." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "내용에 동의하셨다면 아래 사항을 선택해 주세요. $(^NameDA)(을)를 제거하기 위해서는 반드시 내용에 동의하셔야 합니다. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "내용에 동의하셨다면 첫 번째 사항을 선택해 주세요. $(^NameDA)(을)를 제거하기 위해서는 반드시 내용에 동의하셔야 합니다. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "사용권 계약 동의 사항의 나머지 부분을 보시려면 [Page Down] 키를 눌러 주세요." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "구성 요소 선택" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "설치하고자 하는 $(^NameDA)의 구성 요소를 선택해 주세요." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "구성 요소 선택" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "제거하고자 하는 $(^NameDA)의 구성 요소를 선택해 주세요." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "상세 설명" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "상세 설명을 보고 싶으신 부분에 마우스를 올려놓으세요." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "상세 설명을 보고 싶으신 부분을 선택하세요." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "설치 위치 선택" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)(을)를 설치할 폴더를 선택해 주세요." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "제거 위치 선택" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)(을)를 제거할 폴더를 선택해 주세요." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "설치중" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)(을)를 설치하는 동안 잠시 기다려 주세요." + ${LangFileString} MUI_TEXT_FINISH_TITLE "설치 완료" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "설치가 성공적으로 완료되었습니다." + ${LangFileString} MUI_TEXT_ABORT_TITLE "설치 취소" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "프로그램 설치가 취소되었습니다." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "제거중" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA)(을)를 제거하는 동안 잠시 기다려 주시기 바랍니다." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "제거 마침" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "프로그램을 성공적으로 제거하였습니다." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "프로그램 제거 취소" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "프로그램 제거가 취소되었습니다." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) 설치 완료" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)의 설치가 완료되었습니다.$\r$\n$\r$\n설치 프로그램을 마치려면 '마침' 버튼을 눌러 주세요." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)의 설치를 완료하기 위해서는 시스템을 다시 시작해야 합니다. 지금 재부팅 하시겠습니까?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) 제거 완료" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA)의 제거가 완료 되었습니다.$\r$\n$\r$\n설치 프로그램을 마치려면 '마침' 버튼을 눌러 주세요." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA)의 제거를 완료하기 위해서는 시스템을 다시 시작해야 합니다. 지금 재부팅 하시겠습니까?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "지금 재부팅 하겠습니다." + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "나중에 재부팅 하겠습니다." + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) 실행하기(&R)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Readme 파일 보기(&S)" + ${LangFileString} MUI_BUTTONTEXT_FINISH "마침" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "시작 메뉴 폴더 선택" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "프로그램의 바로 가기 아이콘이 생성될 시작 메뉴 폴더 선택." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "프로그램의 바로 가기 아이콘이 생성될 시작 메뉴 폴더를 선택하세요. 새로운 폴더를 생성하려면 폴더 이름을 입력하세요." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "바로 가기 아이콘을 만들지 않겠습니다." +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) 제거" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) 제거하기" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) 설치를 취소하시겠습니까?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) 제거를 취소하시겠습니까?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nlf new file mode 100644 index 0000000000..94070c5414 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID (none exists for Kurdish at this time) +9999 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1254 +# RTL - anything else than RTL means LTR +- +# Translation by Rêzan Tovjîn(chagy) (retovjin@hotmail.com.com) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Sazkirin +# ^UninstallCaption +$(^Name) Rakirin +# ^LicenseSubCaption +: Peymana Lîsansê +# ^ComponentsSubCaption +: Vebijêrkên Sazkirinê +# ^DirSubCaption +: Peldanka Sazkirinê +# ^InstallingSubCaption +: Tê Sazkirin +# ^CompletedSubCaption +: Qediya +# ^UnComponentsSubCaption +: Vebijêrkên Rakirinê +# ^UnDirSubCaption +: Peldanka Rakirinê +# ^ConfirmSubCaption +: Erêkirin +# ^UninstallingSubCaption +: Tê Rakirin +# ^UnCompletedSubCaption +: Qediya +# ^BackBtn +< &Vegere +# ^NextBtn +&Bidomîne > +# ^AgreeBtn +&Ez Dipejirînim +# ^AcceptBtn +Şertên Peymanê &Dipejirînim +# ^DontAcceptBtn +Şertên Peymanê Napejirînim +# ^InstallBtn +&Saz Bike +# ^UninstallBtn +&Rake +# ^CancelBtn +Betal +# ^CloseBtn +&Bigire +# ^BrowseBtn +&Çavlêgerîn... +# ^ShowDetailsBtn +Hûragahiyan &Nîşan Bide +# ^ClickNext +Ji bo berdewamê 'Bidomîne'yê bitikîne. +# ^ClickInstall +Ji bo destpêka sazkirinê 'Saz Bike'yê bitikîne. +# ^ClickUninstall +Ji bo destpêka rakirinê 'Rake' bitikîne. +# ^Name +nav +# ^Completed +Qediya +# ^LicenseText +Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû şertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne. +# ^LicenseTextCB +Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, çavekî li peymana lîsansê bigerîne. Heke tu hemû şertan dipejirînî, zeviya erêkirinê ya jêrîn dagire. $_CLICK +# ^LicenseTextRB +Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî çavekî li peymana lîsansê bigerîne. Heke tu hemû şertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK +# ^UnLicenseText +Ji kerema xwe re berî tu bernameya $(^NameDA) rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû şertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîn. +# ^UnLicenseTextCB +Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû şertên peymanê dipejirînî, zeviya jêrîn a erêkirinê dagire. $_CLICK +# ^UnLicenseTextRB +Ji kerema xwe re berî tu bernameya $(^NameDA) ji pergala xwe rakî, çavekî li peymana lîsansê bigerîne. Heke tu hemû şertên peymanê dipejirînî, zeviya vebijêrkê ya jêrîn dagire. $_CLICK +# ^Custom +Taybet +# ^ComponentsText +Beşên tu dixwazî saz bikî hilbijêre û niqirên 'check' beşên tu naxwazî werin sazkirin rake. $_CLICK +# ^ComponentsSubText1 +Awayê sazkirinê hilbijêre: +# ^ComponentsSubText2_NoInstTypes +Beşên dê werin sazkirin hilbijêre: +# ^ComponentsSubText2 +an jî, beşên beşên tu dixwazî werin sazkirin hilbijêre: +# ^UnComponentsText +Beşên tu dixwazî rakî hilbijêre, an jî niqira 'check'a ber beşên tu daxwazî were rakirin, rake. $_CLICK +# ^UnComponentsSubText1 +Awayê rakirinê hilbijêre: +# ^UnComponentsSubText2_NoInstTypes +Beşên dê werin rakirin hilbijêre: +# ^UnComponentsSubText2 +an jî beşên tu dixwazî werin rakirin hilbijêre: +# ^DirText +$(^NameDA) dê ji aliyê sazkirinê ve li peldanka jêrîn were sazkirin. Ji bo tu li peldankeke din saz bikî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK +# ^DirSubText +Peldanka Armanckirî +# ^DirBrowseText +Peldanka tu dixwazî bernameya $(^NameDA) lê were sazkirin hilbijêre: +# ^UnDirText +$(^NameDA) dê ji aliyê sazkirinê ve ji peldanka jêrîn were rakirin. Ji bo tu ji peldankeke cuda rakî 'Çavlêgerîn'ê bitikîne û peldankeke din hilbijêre. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Peldanka tu dixwazî bernameya $(^NameDA) jê were rakirin hilbijêre: +# ^SpaceAvailable +"Herêma vala ku dikare were bikaranîn: " +# ^SpaceRequired +"Herêma vala ya pêwist: " +# ^UninstallingText +Bernameya $(^NameDA) dê ji peldanka jêrîn were rakirin. $_CLICK +# ^UninstallingSubText +tê rakirin: +# ^FileError +Dosya ji bo nivîsandinê venebû: \r\n\t"$0"\r\nJi bo destjêberdana sazkirinê abort'ê bitikîne,\r\nji bo ceribandina ji nû ve retry'ê , an jî\r\nji bo tu dosiyê tune bihesibînî û berdewam bikî ignore'yê bitikîne +# ^FileError_NoIgnore +Dosya ji bo nivîsandinê vebenebû: \r\n\t"$0"\r\nJi bo nivîsandina ji nû ve retry'yê, an jî\r\nJi bo destjêberdana sazkirinê abort'ê hilbijêre +# ^CantWrite +"Nehate Nivîsandin: " +# ^CopyFailed +Çewtiya Jibergirtinê +# ^CopyTo +"Ji Ber Bigire " +# ^Registering +"Tê Tomarkirin: " +# ^Unregistering +"Tomarî Tê Jêbirin: " +# ^SymbolNotFound +"Dawêr Nehate Dîtin: " +# ^CouldNotLoad +"Nehate Barkirin: " +# ^CreateFolder +"Peldankê Çêke: " +# ^CreateShortcut +"Kineriyê Çêke: " +# ^CreatedUninstaller +"Sêrbazê Rakirinê Hate Çêkirin: " +# ^Delete +"Dosyayê Jê Bibe: " +# ^DeleteOnReboot +"Dema ji nû ve dest pê kir dosiyê jê bibe: " +# ^ErrorCreatingShortcut +"Dema çêkirina kineriyê çewtî derket: " +# ^ErrorCreating +"Çewtiya çêkirinê: " +# ^ErrorDecompressing +Di dema vekirina daneyan de çewtî derket! Sazkirina Çewt? +# ^ErrorRegistering +Çewtiya tomariya DLL +# ^ExecShell +"Qalikê Xebatê: " +# ^Exec +"Bixebitîne: " +# ^Extract +"Veke: " +# ^ErrorWriting +"Veke: Dema li dosiyê hate nivîsîn çewtiyek derket " +# ^InvalidOpcode +Sazkirina Xirabe: koda nerast pêkanînê +# ^NoOLE +"OLE nehate dîtin: " +# ^OutputFolder +"Peldanka derketinê: " +# ^RemoveFolder +"Peldankê jê bibe: " +# ^RenameOnReboot +"Dema ji nû hate destpêkirin ji nû ve bi nav bike: " +# ^Rename +"Nav Biguhere: " +# ^Skipped +"Hate gavkirin: " +# ^CopyDetails +Hûragahiyan li Pano'yê binivîse +# ^LogInstall +Pêkanîna sazkirinê li lênûska rewşê binivîse +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nsh new file mode 100644 index 0000000000..75a27867b0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Kurdish.nsh @@ -0,0 +1,122 @@ +;Language: Kurdish +;By Rêzan Tovjîn +;Updated by Erdal Ronahî (erdal.ronahi@gmail.com) + +!insertmacro LANGFILE "Kurdish" = "Kurdî" "Kurdi" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Tu bi xêr hatî sêrbaziya sazkirinê" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ev sêrbaz dê di dema sazkirina $(^NameDA) de rêberiya te bike.$\r$\n$\r$\nBerî tu dest bi sazkirinê bikî, em pêşniyar dikin tu hemû bernameyên vekirî bigirî. Bi vî rengî beyî tu komputera ji nû ve vekî dê hinek dosiyên pergalê bêpirsgirêk werin sazkirin.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Tu bi xêr hatî sêrbaziya rakirina bernameya $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ev sêrbaz ji bo rakirina bernameya $(^NameDA) dê alîkariya te bike.$\r$\n$\r$\nBerî tu dest bi rakirina bernameyê bikî, bernameyên vekirî hemûyan bigire. Bi vî rengî dû re tu mecbûr namînî ku komputera xwe bigirî û ji nû ve veki.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Peymana Lîsansê" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ji kerema xwe re berî tu bernameya $(^NameDA) saz bikî, peymana lîsansê bixwîne." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Heke tu şertên peymanê dipejirînî, 'Ez Dipejirînim'ê bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu şertên peymanê bipejirînî." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu şertên peymanê dipejirînî, zeviya piştrastkirinê ya jêrîn dagire. Ji bo tu bikarî bernameya $(^NameDA) saz bikî divê tu şertên peymanê bipejirînî. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu şertên peymanê dipejirînî, bişkojka erêkirinê ya jêrîn bitikîne. Ji bo sazkirina bernameya $(^NameDA) divê tu şertên peymanê bipejirînî. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Peymana Lîsansê" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Berî tu bernameya $(^NameDA) ji pergala xwe rakî peymanê bixwîne." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Heke tu şertên peymanê dipejirînî, 'Dipejirînim'ê bitikîne. Ji bo rakirina bernameya $(^NameDA) divê tu şertên peymanê bipejirînî." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Heke tu şertên peymanê dipejirînî, zeviya erêkirinê ya jêrîn dagire. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu peymanê bipejirînî. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Heke tu şertên peymanê dipejirînî, bişkojka erêkirinê ya jêrîn hilbijêre. Ji bo tu bernameya $(^NameDA) ji pergala xwe rakî divê tu şertên peymanê bipejirînî. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ji bo dûmahîka peymanê bişkojka 'page down' bitikîne." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Hilbijartina pareyan" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Ji bo sazkirina $(^NameDA) pareyên tu dixwazî hilbijêre." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Hilbijartina Pareyan" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pareya bernameya $(^NameDA) ku tu dixwazî rakî hilbijêre." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Dazanîn" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî nîşanekê bibe ser pareyekê." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Ji bo tu der barê pareyan de agahiyan bistînî pareyekê hilbijêre." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hilbijartina peldanka armanckirî" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Peldanka tu dixwazî bernameya $(^NameDA) tê de were sazkirin hilbijêre." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Hilbijartina Peldanka Dê Were Rakirin" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Peldanka bernameya $(^NameDA) ku tudixwazî rakî hilbijêre." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Tê sazkirin" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ji kerema xwe re heta sazkirina $(^NameDA) biqede raweste." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Sazkirin Qediya" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Sazkirin bi serkeftinî qediya." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Sazkirin hate betalkirin" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Sazkirin be tevahî qediya." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Tê rakirin" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Heta bernameya $(^NameDA) ji pergala te were rakirin raweste." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Rakirina Bernameyê Biqedîne" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Rakirina bernameyê bi serkeftin pêk hat." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Rakirina bernameyê hate betalkirin" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Rakirina bernameyê neqediya." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Sêrbaziya sazkirina $(^NameDA) diqede." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) li komputera te hate barkirin.$\r$\n$\r$\n'Biqedîne'yê bitikîne û sazkirinê bi dawî bîne." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Ji bo bidawîkirina sazkirina $(^NameDA) divê tu komputerê ji nû ve vekî.Tu dixwazî komputerê ji nû ve vekî?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Sêrbaziya Rakirina Bernameya $(^NameDA) Tê Temamkirin" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Bernameya $(^NameDA) ji pergale hate rakirin.$\r$\n$\r$\nJi bo girtina sêrbaz 'biqedîne'yê bitikîne." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Ji bo rakirina bernameya $(^NameDA) biqede divê tu komputera xwe ji nû ve vekî. Tu dixwazî niha komputera te were girtin û ji nû ve dest pê bike?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ji nû ve veke" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ezê paşê ji nû ve vekim." + ${LangFileString} MUI_TEXT_FINISH_RUN "Bernameya $(^NameDA) bixebitîne" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Dosiya min bixwîne/readme &nîşan bide" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Biqedîne" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Hilbijartina Peldanka Pêşeka Destpêkê" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Peldanka pêşeka destpêkê ya ku dê kineriya $(^NameDA) tê de were bikaranîn hilbijêre." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Peldanka pêşeka destpêkê ya ku dê kineriya bernameyê tê de were bicihkirin hilbijêre. Tu dikarî bi navekî nû peldankeke nû ava bikî." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bêyî çêkirina kineriyê bidomîne" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Bernameya $(^NameDA) Rake" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Rakirina bernameya $(^NameDA) ji pergala te." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Tu bawer î ku dixwazî ji sazkirina $(^Name) derkevî?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Tu bawer î ku dixwazî dest ji rakirina bernameya $(^Name) berdî?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nlf new file mode 100644 index 0000000000..179fb73c75 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +1062 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1257 +# RTL - anything else than RTL means LTR +- +# Translation by Valdis Griķis (valmiera-9@inbox.lv) +# Corrections by Kristaps Meņģelis / x-f (x-f 'AT' inbox.lv) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +'$(^Name)' Uzstādīšana +# ^UninstallCaption +'$(^Name)' Atinstalēšana +# ^LicenseSubCaption +: Licences līgums +# ^ComponentsSubCaption +: Uzstādīšanas opcijas +# ^DirSubCaption +: Uzstādīšanas mape +# ^InstallingSubCaption +: Notiek uzstādīšana +# ^CompletedSubCaption +: Uzstādīšana pabeigta. +# ^UnComponentsSubCaption +: Atinstalēšanas opcijas +# ^UnDirSubCaption +: Atinstalēšanas mape +# ^ConfirmSubCaption +: Apstiprināšana +# ^UninstallingSubCaption +: Notiek atinstalēšana +# ^UnCompletedSubCaption +: Atinstalēšana pabeigta +# ^BackBtn +< &Atpakaļ +# ^NextBtn +&Tālāk > +# ^AgreeBtn +Es &piekrītu +# ^AcceptBtn +Es &piekrītu licences līguma noteikumiem +# ^DontAcceptBtn +Es &nepiekrītu licences līguma noteikumiem +# ^InstallBtn +&Uzstādīt +# ^UninstallBtn +&Atinstalēt +# ^CancelBtn +Atcelt +# ^CloseBtn +Ai&zvērt +# ^BrowseBtn +Pā&rlūkot... +# ^ShowDetailsBtn +Parādīt &detaļas +# ^ClickNext +Spiediet 'Tālāk', lai turpinātu. +# ^ClickInstall +Spiediet 'Uzstādīt', lai sāktu uzstādīšanas procesu. +# ^ClickUninstall +Spiediet 'Atinstalēt', lai sāktu atinstalēšanas procesu. +# ^Name +Vārds +# ^Completed +Uzstādīšana pabeigta +# ^LicenseText +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' uzstādīšanas. Ja piekrītat licences līguma noteikumiem, tad spiediet 'Es piekrītu'. +# ^LicenseTextCB +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' uzstādīšanas. Ja piekrītat licences līguma noteikumiem, tad atzīmējiet izvēles rūtiņu. $_CLICK +# ^LicenseTextRB +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' uzstādīšanas. Ja piekrītat licences līguma noteikumiem, tad izvēlieties pirmo zemākesošo opciju. $_CLICK +# ^UnLicenseText +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrītat licences līguma noteikumiem, tad spiediet 'Es piekrītu'. +# ^UnLicenseTextCB +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrītat licences līguma noteikumiem, tad atzīmējiet izvēles rūtiņu. $_CLICK +# ^UnLicenseTextRB +Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' atinstalēšanas. Ja piekrītat licences līguma noteikumiem, tad izvēlieties zemākesošo opciju. $_CLICK +# ^Custom +Pielāgots +# ^ComponentsText +Izvēlieties, kurus komponentus vēlaties uzstādīt un neiezīmējiet tos, kurus nevēlaties uzstādīt. $_CLICK +# ^ComponentsSubText1 +Izvēlieties uzstādīšanas veidu: +# ^ComponentsSubText2_NoInstTypes +Izvēlieties uzstādāmos komponentus: +# ^ComponentsSubText2 +Vai arī – izvēlieties tikai nepieciešamos komponentus, kurus vēlaties uzstādīt: +# ^UnComponentsText +Izvēlieties, kurus komponentus atinstalēt un neiezīmējiet tos, kurus nevēlaties atinstalēt. $_CLICK +# ^UnComponentsSubText1 +Izvēlieties atinstalēšanas veidu: +# ^UnComponentsSubText2_NoInstTypes +Izvēlieties atinstalējamos komponentus: +# ^UnComponentsSubText2 +Vai arī – izvēlieties tikai nepieciešamos komponentus, kurus vēlaties atinstalēt: +# ^DirText +'$(^NameDA)' tiks uzstādīta šajā mapē. Lai to uzstādītu citā mapē, nospiediet 'Pārlūkot' un izvēlieties citu mapi. $_CLICK +# ^DirSubText +Uzstādīšanas mape +# ^DirBrowseText +Izvēlieties mapi, kurā uzstādīt '$(^NameDA)': +# ^UnDirText +'$(^NameDA)' tiks atinstalēta no šīs mapes. Lai to atinstalētu no citas mapes, nospiediet 'Pārlūkot' un izvēlieties citu mapi. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Izvēlieties mapi, no kuras atinstalēt '$(^NameDA)': +# ^SpaceAvailable +"Pieejamais diska apjoms: " +# ^SpaceRequired +"Nepieciešamais diska apjoms: " +# ^UninstallingText +'$(^NameDA)' tiks atinstalēta no šīs mapes. $_CLICK +# ^UninstallingSubText +Atinstalēšana no: +# ^FileError +Kļūda atverot failu rakstīšanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai atceltu uzstādīšanas procesu,\r\n'Mēģināt vēlreiz', lai atkārtoti mēģinātu rakstīt failā vai\r\n'Ignorēt', lai izlaistu šī faila uzstādīšanu +# ^FileError_NoIgnore +Kļūda atverot failu rakstīšanai: \r\n\t"$0"\r\nNospiediet 'Atcelt', lai pārtrauktu uzstādīšanas procesu +# ^CantWrite +"Nevar ierakstīt: " +# ^CopyFailed +Kopēšana neizdevās +# ^CopyTo +"Kopē uz " +# ^Registering +"Reģistrē: " +# ^Unregistering +"Atreģistrē: " +# ^SymbolNotFound +"Simbols nav atrasts: " +# ^CouldNotLoad +"Nav iespējams ielādēt: " +# ^CreateFolder +"Izveido mapi: " +# ^CreateShortcut +"Izveido saīsni: " +# ^CreatedUninstaller +"Izveidots atinstalētājs: " +# ^Delete +"Dzēš failu: " +# ^DeleteOnReboot +"Dzēst pēc pārstartēšanas: " +# ^ErrorCreatingShortcut +"Kļūda veidojot saīsni: " +# ^ErrorCreating +"Kļūda veidojot: " +# ^ErrorDecompressing +Kļūda atkompresējot datus! Bojāta instalācija? +# ^ErrorRegistering +Kļūda reģistrējot DLL failu +# ^ExecShell +"Izpilda čaulā: " +# ^Exec +"Izpilda: " +# ^Extract +"Atspiež: " +# ^ErrorWriting +"Atspiešana: kļūda rakstot failā " +# ^InvalidOpcode +Instalācija bojāta: nederīgs CRC kods +# ^NoOLE +"Nav OLE priekš: " +# ^OutputFolder +"Izvades mape: " +# ^RemoveFolder +"Dzēš mapi: " +# ^RenameOnReboot +"Pārsaukt pēc pārstartēšanas: " +# ^Rename +"Pārsaukt: " +# ^Skipped +"Izlaists: " +# ^CopyDetails +Iekopēt detaļas starpliktuvē +# ^LogInstall +Ierakstīt žurnāla failā uzstādīšanas procesu +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nsh new file mode 100644 index 0000000000..4371e89ceb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Latvian.nsh @@ -0,0 +1,122 @@ +;Language: Latviešu [Latvian] - (1062) +;By Valdis Griķis +;Corrections by Kristaps Meņģelis / x-f (x-f 'AT' inbox.lv) + +!insertmacro LANGFILE "Latvian" = "Latviešu" "Latviesu" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Esiet sveicināti '$(^NameDA)' uzstādīšanas vednī" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Šis uzstādīšanas vednis jums palīdzēs veikt '$(^NameDA)' uzstādīšanu.$\r$\n$\r$\nĻoti ieteicams aizvērt citas programmas pirms šīs programmas uzstādīšanas veikšanas. Tas ļaus atjaunot svarīgus sistēmas failus bez datora pārstartēšanas.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Esiet sveicināti '$(^NameDA)' atinstalēšanas vednī" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Šis vednis jums palīdzēs veikt '$(^NameDA)' atinstalēšanu.$\r$\n$\r$\nPirms sākt atinstalēšanas procesu, pārliecinieties, vai '$(^NameDA)' pašlaik nedarbojas.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licences līgums" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' uzstādīšanas." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ja piekrītat licences līguma noteikumiem, spiediet 'Piekrītu', lai turpinātu uzstādīšanu. Jums ir jāpiekrīt licences noteikumiem, lai uzstādītu '$(^NameDA)'." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrītat licences līguma noteikumiem, tad atzīmējiet izvēles rūtiņu. Jums ir jāpiekrīt licences noteikumiem, lai uzstādītu '$(^NameDA)'. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrītat licences līguma noteikumiem, tad izvēlieties pirmo zemākesošo opciju. Jums ir jāpiekrīt licences noteikumiem, lai uzstādītu '$(^NameDA)'. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licences līgums" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lūdzu izlasiet licences līgumu pirms '$(^NameDA)' atinstalēšanas." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ja piekrītat licences noteikumiem, spiediet 'Piekrītu', lai turpinātu. Jums ir jāpiekrīt licences noteikumiem, lai atinstalētu '$(^NameDA)'." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ja piekrītat licences līguma noteikumiem, tad iezīmējiet izvēles rūtiņu. Jums ir jāpiekrīt licences noteikumiem, lai atinstalētu '$(^NameDA)'. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ja piekrītat licences līguma noteikumiem, tad izvēlieties pirmo zemākesošo opciju. Jums ir jāpiekrīt licences noteikumiem, lai atinstalētu '$(^NameDA)'. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Spiediet 'Page Down', lai aplūkotu visu līgumu." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izvēlieties komponentus" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izvēlieties nepieciešamās '$(^NameDA)' sastāvdaļas, kuras uzstādīt." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izvēlieties komponentus" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izvēlieties nepieciešamās '$(^NameDA)' sastāvdaļas, kuras atinstalēt." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Apraksts" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Novietojiet peles kursoru uz komponenta, lai tiktu parādīts tā apraksts." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izvēlieties uzstādīšanas mapi" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izvēlieties mapi, kurā uzstādīt '$(^NameDA)'." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izvēlieties atinstalēšanas mapi" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izvēlieties mapi, no kuras notiks '$(^NameDA)' atinstalēšana." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Notiek uzstādīšana" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Lūdzu uzgaidiet, kamēr notiek '$(^NameDA)' uzstādīšana." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Uzstādīšana pabeigta" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Uzstādīšana noritēja veiksmīgi." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Uzstādīšana atcelta" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Uzstādīšana nenoritēja veiksmīgi." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Notiek atinstalēšana" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Lūdzu uzgaidiet, kamēr '$(^NameDA)' tiek atinstalēta." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Atinstalēšana pabeigta" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Atinstalēšana noritēja veiksmīgi." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Atinstalēšana atcelta" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Atinstalēšana nenoritēja veiksmīgi." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' uzstādīšana" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmīgi uzstādīta jūsu datorā.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvērtu vedni." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Jūsu datoru ir nepieciešams pārstartēt, lai pabeigtu '$(^NameDA)' uzstādīšanu. Vai vēlaties pārstartēt datoru tūlīt?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Tiek pabeigta '$(^NameDA)' atinstalācija" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "'$(^NameDA)' tika veiksmīgi izdzēsta no jūsu datora.$\r$\n$\r$\nNospiediet 'Pabeigt', lai aizvērtu vedni." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Jūsu datoru nepieciešams pārstartēt, lai pabeigtu '$(^NameDA)' atinstalēšanu. Vai vēlaties pārstartēt datoru tūlīt?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Pārstartēt tūlīt" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Es vēlos pārstartēt pats vēlāk" + ${LangFileString} MUI_TEXT_FINISH_RUN "P&alaist '$(^NameDA)'" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Pa&rādīt LasiMani failu" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Pabeigt" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izvēlieties 'Start Menu' folderi" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izvēlieties 'Start Menu' mapi '$(^NameDA)' saīsnēm." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izvēlieties 'Start Menu' mapi, kurā tiks izveidotas programmas saīsnes. Varat arī pats izveidot jaunu mapi." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Neveidot saīsnes" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "'$(^NameDA)' atinstalēšana" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dzēst '$(^NameDA)' no jūsu datora." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Vai tiešām vēlaties pārtraukt '$(^Name)' uzstādīšanu?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Vai tiešām vēlaties pārtraukt '$(^Name)' atinstalēšanu?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nlf new file mode 100644 index 0000000000..8a489a7421 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +1063 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1257 +# RTL - anything else than RTL means LTR +- +# Translation by Vytautas Krivickas (Vytautas) +# Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.03.24 +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Įdiegimas +# ^UninstallCaption +$(^Name) Šalinti +# ^LicenseSubCaption +: Naudojimo sutartis +# ^ComponentsSubCaption +: Įdiegimo nustatymai +# ^DirSubCaption +: Įdiegimo katalogas +# ^InstallingSubCaption +: Įdiegiama +# ^CompletedSubCaption +: Baigta +# ^UnComponentsSubCaption +: Ištrinimo nustatymai +# ^UnDirSubCaption +: Ištrinimo katalogas +# ^ConfirmSubCaption +: Patvirtinimas +# ^UninstallingSubCaption +: Panaikinama +# ^UnCompletedSubCaption +: Baigta +# ^BackBtn +< &Atgal +# ^NextBtn +&Toliau > +# ^AgreeBtn +Aš &sutinku +# ^AcceptBtn +Aš &sutinku su naudojimo sutarties sąlygomis +# ^DontAcceptBtn +Aš &nesutinku su naudojimo sutarties sąlygomis +# ^InstallBtn +&Įdiegti +# ^UninstallBtn +&Panaikinti +# ^CancelBtn +Nutraukti +# ^CloseBtn +&Uždaryti +# ^BrowseBtn +P&asirinkti... +# ^ShowDetailsBtn +Parodyti &detales +# ^ClickNext +Paspauskite toliau +# ^ClickInstall +Paspauskite įdiegti +# ^ClickUninstall +Paspauskite ištrinti +# ^Name +Vardas +# ^Completed +Baigta +# ^LicenseText +Prašome perskaityti sutartį prieš įdiegdami $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, spauskite Sutinku. +# ^LicenseTextCB +Prašome perskaityti sutartį prieš įdiegdami $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, padėkite varnelę tam skirtame laukelyje. $_CLICK +# ^LicenseTextRB +Prašome perskaityti sutartį prieš įdiegdami $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, pasirinkite pirmą pasirinkimą esantį žemiau. $_CLICK +# ^UnLicenseText +Prašome perskaityti sutartį prieš ištrinant $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, spauskite Sutinku. +# ^UnLicenseTextCB +Prašome perskaityti sutartį prieš ištrinant $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, padėkite varnelę tam skirtame laukelyje. $_CLICK +# ^UnLicenseTextRB +Prašome perskaityti sutartį prieš ištrinant $(^NameDA). Jei jūs sutinkate su nurodytomis sąlygomis, pasirinkite pirmą pasirinkimą esantį žemiau. $_CLICK +# ^Custom +Kitoks +# ^ComponentsText +Padėkite varneles laukeliuose komponentų kuriuos norite įdiegti ir nuimkite nuo kurių nenorite įdiegti. $_CLICK +# ^ComponentsSubText1 +Pasirinkite įdiegimo būdą: +# ^ComponentsSubText2_NoInstTypes +Pasirinkite komponentus, kuriuos įdiegti: +# ^ComponentsSubText2 +Arba, pasirinkite neprivalomus komponentus, kuriuos jūs norite įdiegti: +# ^UnComponentsText +Padėkite varneles laukeliuose komponentų kuriuos norite pašalinti ir nuimkite nuo kurių nenorite pašalinti. $_CLICK +# ^UnComponentsSubText1 +Pasirinkite šalinimo būdą: +# ^UnComponentsSubText2_NoInstTypes +Pasirinkite komponentus, kuriuos šalinti: +# ^UnComponentsSubText2 +Arba, pasirinkite neprivalomus komponentus, kuriuos jūs norite pašalinti: +# ^DirText +Įdiegimas dabar įdiegs $(^NameDA) šiame kataloge. Jeigu norite pakeisti šį katalogą, paspauskite Pasirinkti. $_CLICK +# ^DirSubText +Įdiegimo katalogas +# ^DirBrowseText +Pasirinkite katalogą, kur įdiegti $(^NameDA): +# ^UnDirText +Įdiegimas dabar pašalins $(^NameDA) iš šio katalogo. Jeigu norite pakeisti šį katalogą paspauskite Pasirinkti. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Pasirinkite katalogą iš kurio pašalinti $(^NameDA): +# ^SpaceAvailable +Yra vietos: +# ^SpaceRequired +Reikia vietos: +# ^UninstallingText +$(^NameDA) dabar bus pašalintas iš šio katalogo. $_CLICK +# ^UninstallingSubText +Trinama iš: +# ^FileError +Klaida atidarant failą įrašymui: \r\n\t"$0"\r\nPaspauskite Nutraukti, jei norite nutraukti įdiegimą,\r\nPakartoti, jei norite pabandyti dar kartą įrašyti failą, ar\r\nIgnoruoti, jei norite praleisti šį failą +# ^FileError_NoIgnore +Klaida atidarant failą įrašymui: \r\n\t"$0"\r\nPaspauskite Pakartoti, jei norite pabandyti dar kartą įrašyti failą, ar\r\nNutraukti, jei norite nutraukti įdiegimą. +# ^CantWrite +"Negalima įrašyti: " +# ^CopyFailed +Kopijavimas nepavyko +# ^CopyTo +Kopijuoti į +# ^Registering +"Užregistruojama: " +# ^Unregistering +"Išregistruojama: " +# ^SymbolNotFound +Nerastas simbolis: +# ^CouldNotLoad +Negaliu įkrauti: +# ^CreateFolder +Sukurti katalogą: +# ^CreateShortcut +Sukurti nuorodą: +# ^CreatedUninstaller +Sukurti panaikinimo programą: +# ^Delete +Ištrinti failą: +# ^DeleteOnReboot +"Ištrinti perkraunant: " +# ^ErrorCreatingShortcut +"Klaida kuriant nuorodą: " +# ^ErrorCreating +"Klaida kuriant: " +# ^ErrorDecompressing +Klaida išskleidžiant duomenis! Sugadintas įdiegimo failas? +# ^ErrorRegistering +Klaida užregistruojant DLL +# ^ExecShell +"VykdytiShell: " +# ^Exec +"Vykdyti: " +# ^Extract +"Išskleisti: " +# ^ErrorWriting +Išskleisti: klaida įrašant į failą +# ^InvalidOpcode +Įdiegimo failas sugadintas: neteisingas opkodas +# ^NoOLE +"Nėra OLE dėl: " +# ^OutputFolder +"Paskirties katalogas: " +# ^RemoveFolder +"Panaikinti katalogą: " +# ^RenameOnReboot +"Pervardinti perkraunant: " +# ^Rename +"Pervardinti: " +# ^Skipped +"Praleista: " +# ^CopyDetails +Kopijuoti detales į atmintį +# ^LogInstall +Įrašyti įdiegimo detales +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nsh new file mode 100644 index 0000000000..094e99af47 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Lithuanian.nsh @@ -0,0 +1,121 @@ +;Language: Lithuanian (1063) +;By Vytautas Krivickas (Vytautas). Updated by Danielius Scepanskis (Daan daniel@takas.lt) 2004.01.09 + +!insertmacro LANGFILE "Lithuanian" = "Lietuvių" "Lietuviu" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sveiki atvykę į $(^NameDA) įdiegimo programą." + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ši programa jums padės lengvai įdiegti $(^NameDA).$\r$\n$\r$\nRekomenduojama išjungti visas programas, prieš pradedant įdiegimą. Tai leis atnaujinti sistemos failus neperkraunat kompiuterio.$\r$\n$\r$\n" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sveiki atvykę į $(^NameDA) pašalinimo programą." + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ši programa jums padės lengvai ištrinti $(^NameDA).$\r$\n$\r$\nPrieš pradedant pasitikrinkite kad $(^NameDA) yra išjungta.$\r$\n$\r$\n" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Naudojimo sutartis" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prašome perskaityti sutartį prieš įdiegdami $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jei jūs sutinkate su nurodytomis sąlygomis, spauskite Sutinku. Jūs privalote sutikti, jei norite įdiegti $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jei jūs sutinkate su nurodytomis sąlygomis, padėkite varnelę tam skirtame laukelyje. Jūs privalote sutikti, jei norite įdiegti $(^NameDA). " + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jūs sutinkate su nurodytomis sąlygomis, pasirinkite pirmą pasirinkimą esantį žemiau. Jūs privalote sutikti, jei norite įdiegti $(^NameDA). " +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Naudojimo sutartis" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prašome perskaityti sutartį prieš $(^NameDA) pašalinimą." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jei jūs sutinkate su nurodytomis sąlygomis, spauskite Sutinku. Jūs privalote sutikti, jei norite ištrinti $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "s, padėkite varnelę tam skirtame laukelyje. Jūs privalote sutikti, jei norite ištrinti $(^NameDA). " + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jei jūs sutinkate su nurodytomis sąlygomis, pasirinkite pirmą pasirinkimą esantį žemiau. Jūs privalote sutikti, jei norite ištrinti $(^NameDA)." +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Paspauskite Page Down ir perskaitykite visą sutartį." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pasirinkite" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jūs norite įdiegti." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pasirinkite" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pasirinkite kokias $(^NameDA) galimybes jūs norite pašalinti." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Paaiškinimas" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Užveskite pelės žymeklį ant komponento ir pamatysite jo aprašymą." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pasirinkite komponentį ir pamatysite jo aprašymą." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pasirinkite įdiegimo vietą" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogą į kūri įdiegsite $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pasirinkite ištrinimo vietą" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pasirinkite katalogą iš kurio ištrinsite $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Diegiama" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prašome palaukti, kol $(^NameDA) bus įdiegtas." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Įdiegimas baigtas" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Įdiegimas baigtas sekmingai." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Įdiegimas nutrauktas" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Įdiegimas nebuvo baigtas sekmingai." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Šalinama" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prašome palaukti, kol $(^NameDA) bus pašalinta." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Programos pašalinimas baigtas" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Ištrynimas baigtas sekmingai." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ištrynimas nutrauktas" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Ištrynimas nebuvo baigtas sekmingai." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) įdiegimo procesą" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) buvo įdiegtas į jūsų kompiuterį.$\r$\n$\r$\nPaspauskite Baigti." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Jūsų kompiuteris turi būti perkrautas, kad būtų baigtas $(^NameDA) įdiegimas. Ar jūs norite perkrauti dabar?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Baigiu $(^NameDA) pašalinimo programą." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) buvo ištrinta iš jūsų kompiuterio.$\r$\n$\r$\nPaspauskite Baigti." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Jūsų kompiuteris turi būti perkrautas, kad būtų baigtas $(^NameDA) pašalinimas. Ar jūs norite perkrauti dabar?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Perkrauti dabar" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Aš noriu perkrauti veliau pats" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Leisti $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Parodyti dokumentaciją" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Baigti" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pasirinkite Start Menu katalogą" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pasirinkite Start Menu katalogą, kuriame bus sukurtos programos nuorodos." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pasirinkite Start Menu katalogą, kuriame bus sukurtos programos nuorodos. Jūs taip pat galite sukurti naują katalogą." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nekurti nuorodų" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Panaikinti $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Ištrinti $(^NameDA) iš jūsų kompiuterio." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ar jūs tikrai norite išjungti $(^Name) įdiegimo programą?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ar jūs tikrai norite išjungti $(^Name) pašalinimo programą?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nlf new file mode 100644 index 0000000000..1b59a15ec4 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +4103 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Jo Hoeser +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Installatioun +# ^UninstallCaption +$(^Name) Desinstallatioun +# ^LicenseSubCaption +: Lizenzofkommes +# ^ComponentsSubCaption +: Installatiouns-Optiounen +# ^DirSubCaption +: Zielverzeechnis +# ^InstallingSubCaption +: Installéieren +# ^CompletedSubCaption +: Färdeg +# ^UnComponentsSubCaption +: Desinstallatiuons-Optiounen +# ^UnDirSubCaption +: Quellverzeechnes +# ^ConfirmSubCaption +: Bestätegung +# ^UninstallingSubCaption +: Läschen +# ^UnCompletedSubCaption +: Färdeg +# ^BackBtn +< &Zréck +# ^NextBtn +&Weider > +# ^AgreeBtn +&Unhuelen +# ^AcceptBtn +Ech &huelen d'Lizenzofkommes un. +# ^DontAcceptBtn +Ech &lehnen d'Lizenzofkommes of. +# ^InstallBtn +&Installéieren +# ^UninstallBtn +&Desinstalléieren +# ^CancelBtn +Ofbriechen +# ^CloseBtn +&Zou maan +# ^BrowseBtn +&Duerchsichen... +# ^ShowDetailsBtn +&Details uweisen +# ^ClickNext +Klick op weider fir weiderzefueren +# ^ClickInstall +Klick op Installéieren, fir d'Installatioun unzefänken. +# ^ClickUninstall +Klick op Desinstalléieren, fir d'Desinstallatioun unzefänken. +# ^Name +Numm +# ^Completed +Färdeg +# ^LicenseText +W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. +# ^LicenseTextCB +W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK +# ^LicenseTextRB +W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) installéiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, wiel d'entsprichend Optioun. $_CLICK +# ^UnLicenseText +W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. +# ^UnLicenseTextCB +W.e.g. d'Lizenzofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Kontrollkeschtchen. $_CLICK +# ^UnLicenseTextRB +W.e.g. d'Lizenzoofkommes liesen, ierts de $(^NameDA) desinstalléiers. Wanns de all Bedengungen vum Oofkommes akzeptéiers, wiel d'entspriechend Optioun. $_CLICK +# ^Custom +Benutzerdefiniert +# ^ComponentsText +Wiel d'Komponenten aus, déis de wëlls installéieren an wiel déijéineg of, déis de net installéieren wëlls. $_CLICK +# ^ComponentsSubText1 +Installatiouns-Typ bestëmmen: +# ^ComponentsSubText2_NoInstTypes +Wiel d'Komponenten aus, déis de installéieren wëlls: +# ^ComponentsSubText2 +oder wiel zousätzlech Komponenten aus déis de installéieren wëlls: +# ^UnComponentsText +Wiel d'Komponenten aus déis de desinstalléieren wëlls an wiel déijéineg of, déis de net desinstalléieren wëlls. $_CLICK +# ^UnComponentsSubText1 +Deinstallatiouns-Typ bestëmmen: +# ^UnComponentsSubText2_NoInstTypes +Wiel d'Komponenten aus, déis de desinstalléieren wëlls: +# ^UnComponentsSubText2 +oder wiel zusätzlech Komponenten aus, déis de desinstalléieren wëlls: +# ^DirText +$(^NameDA) gëtt an den Dossier installéiert deen fierginn gouf. Wanns de et an een aneren Dossier installéieren wëlls, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK +# ^DirSubText +Zielverzeechnes +# ^DirBrowseText +Wiel en Dossier aus wuers de $(^NameDA) installéieren wëlls: +# ^UnDirText +$(^NameDA) gëtt an deem Dossier desinstalléiert, deen uginn gouf. Wann $(^NameDA) an engem aneren Dossier ass, klick op Duechsichen an wiel een aneren Dossier aus. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Wiel den Dossier aus wou $(^NameDA) dran installéiert ass: +# ^SpaceAvailable +"Verfügbaren Späicher: " +# ^SpaceRequired +"Gebrauchten Späicher: " +# ^UninstallingText +$(^NameDA) gëtt aus dem ausgewielten Dossier desinstalléiert. $_CLICK +# ^UninstallingSubText +Desinstalléieren aus: +# ^FileError +Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op ofbriechen fir den Setup ze verloossen,\r\nop Widderhuelen fir den Setup nach eng Kéier duechzeféieren\r\n oder op Ignoréieren fir des Datei ze iwwersprengen an weiderzefueren. +# ^FileError_NoIgnore +Fehler beim Iwwerschreiwen vun der Datei: \r\n\t"$0"\r\nKlick op Widderhuelen fir den Setup nach eng Kéier duechzeféieren,\r\noder op ofbriechen fir den Setup ze verloossen. +# ^CantWrite +"Fehler beim Schreiwen: " +# ^CopyFailed +Kopéieren fehlgeschloen +# ^CopyTo +"Kopéiere an " +# ^Registering +"Registréieren: " +# ^Unregistering +"Deregistréieren: " +# ^SymbolNotFound +"Symbol ass net do: " +# ^CouldNotLoad +"Fehler beim Lueden vun: " +# ^CreateFolder +"Maan Dossier: " +# ^CreateShortcut +"Maan Oofkierzung: " +# ^CreatedUninstaller +"Man Desinstallatiouns-Programm: " +# ^Delete +"Läschen Datei: " +# ^DeleteOnReboot +"Läschen Datei no engem Neistart: " +# ^ErrorCreatingShortcut +"Fehler beim man vun enger Oofkierzung: " +# ^ErrorCreating +"Fehler beim maan: " +# ^ErrorDecompressing +Fehler beim Dekompriméieren. Installations-Programm beschiedegt? +# ^ErrorRegistering +Fehler beim Registréieren vun der DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Starten: " +# ^Extract +"Dekompriméieren: " +# ^ErrorWriting +"Dekompriméierung: Fehler beim Schreiwen vun der Datei " +# ^InvalidOpcode +Installations-Programm Beschiedegt: net zoulässegen Befehlscode +# ^NoOLE +"Keen OLE fier: " +# ^OutputFolder +"Zieldossier: " +# ^RemoveFolder +"Läschen Dossier: " +# ^RenameOnReboot +"Gett no Neistart embenannt: " +# ^Rename +"Embenennen: " +# ^Skipped +"Iwwersprongen: " +# ^CopyDetails +Detailler an d'Zwëschenooflag kopéieren +# ^LogInstall +Installatioun protokolléieren +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nsh new file mode 100644 index 0000000000..61fb95d22c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Luxembourgish.nsh @@ -0,0 +1,121 @@ +;Language: Luxembourgish (1031) +;By Snowloard, changes by Philo + +!insertmacro LANGFILE "Luxembourgish" = "Lëtzebuergesch" "Letzebuergesch" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Wëllkomm beim Installatiouns-$\r$\nAssistent vun $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Dësen Assistent wärt dech duech d'Installatioun vun $(^NameDA) begleeden.$\r$\n$\r$\nEt gëtt ugeroden alleguer d'Programmer di am Moment lafen zouzemaan, datt bestëmmt Systemdateien ouni Neistart ersat kënne ginn.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Wëllkomm am Desinstallatiouns-$\r$\n\Assistent fir $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Desen Assistent begleet dech duech d'Desinstallatioun vun $(^NameDA).$\r$\n$\r$\nW.e.g. maach $(^NameDA) zu, ierts de mat der Desinstallatioun ufänks.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lizenzofkommes" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "W.e.g. d'Lizenzoofkommes liesen, ierts de mat der Installatioun weiderfiers." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, klick op Unhuelen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de alleguer d'Bedengungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Äntwert aus. Du muss alleguer d'Fuerderungen unerkennen, fir $(^NameDA) installéieren ze kënnen. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lizenzofkommes" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "W.e.g. lies d'Lizenzofkommes duech ierts de mat der Desinstallatioun vun $(^NameDA) weiderfiers." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, klick op unhuelen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, aktivéier d'Këschtchen. Du muss d'Ofkommes akzeptéieren, fir $(^NameDA) kënnen ze desinstalléieren. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Wanns de d'Fuerderungen vum Ofkommes akzeptéiers, wiel ënnen di entspriechend Optioun. Du muss d'Oofkommes akzeptéieren, fir $(^NameDA) kennen ze desinstalléieren. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Dréck d'PageDown-Tast fir den Rescht vum Ofkommes ze liesen." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Komponenten auswielen" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wiel d'Komponenten aus, déis de wëlls installéieren." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswielen" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wiel eng Komponent aus, déis de desinstalléieren wëlls." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreiwung" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Hal den Mausfeil iwwer eng Komponent, fir d'Beschreiwung dervun ze gesinn." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Zielverzeechnes auswielen" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, an deen $(^NameDA) installéiert soll ginn." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dossier fir d'Desinstallatioun wielen" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wiel den Dossier aus, aus dem $(^NameDA) desinstalléiert soll ginn." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installéieren..." + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Waard w.e.g während deem $(^NameDA) installéiert gëtt." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installatioun färdeg" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "D'Installatioun ass feelerfräi oofgeschloss ginn." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installatioun ofgebrach" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "D'Installatioun ass net komplett ofgeschloss ginn." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalléieren..." + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "W.e.g. waard, während deems $(^NameDA) desinstalléiert gëtt." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstallatioun ofgeschloss" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "D'Desinstallatioun ass erfollegräich ofgeschloss ginn." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstallatioun oofbriechen" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Desinstallatioun ass net erfollegräich ofgeschloss ginn." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "D'Installatioun vun $(^NameDA) gëtt ofgeschloss." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ass um Computer installéiert ginn.$\r$\n$\r$\nKlick op färdeg maan, fir den Installatiouns-Assistent zou ze maan.." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Den Windows muss nei gestart ginn, fir d'Installatioun vun $(^NameDA) ofzeschléissen. Wëlls de Windows lo néi starten?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Desinstallatioun vun $(^NameDA) gëtt ofgeschloss" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ass vum Computer desinstalléiert ginn.$\r$\n$\r$\nKlick op Ofschléissen fir den Assistent zou ze maan." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss néi gestart gin, fir d'Desinstallatioun vun $(^NameDA) ze vervollstännegen. Wëlls de Windows lo néi starten?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Lo néi starten" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Spéider manuell néi starten" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) op maan" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Liesmech op maan" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Färdeg man" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Startmenü-Dossier bestëmmen" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Bestëmm een Startmanü-Dossier an deen d'Programmofkierzungen kommen. Wanns de een néien Dossier man wells, gëff deem säin zukünftegen Numm an." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Keng Ofkierzungen man" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstallatioun vun $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) gett vum Computer desinstalléiert." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Bass de sécher, dass de d'Installatioun vun $(^Name) ofbriechen wëlls?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Bass de sécher, dass de d'Desinstallatioun vun $(^Name) ofbriechen wëlls?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nlf new file mode 100644 index 0000000000..8baef1368e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1071 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Sasko Zdravkin [wingman2083@yahoo.com] +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Инсталирање на $(^Name) +# ^UninstallCaption +Деинсталирање на $(^Name) +# ^LicenseSubCaption +: Лиценцен Договор +# ^ComponentsSubCaption +: Инсталациони Опции +# ^DirSubCaption +: Инсталационен Директориум +# ^InstallingSubCaption +: Инсталира +# ^CompletedSubCaption +: Завршено +# ^UnComponentsSubCaption +: Деинсталациони Опции +# ^UnDirSubCaption +: Деинсталационен Директориум +# ^ConfirmSubCaption +: Потврда +# ^UninstallingSubCaption +: Деинсталира +# ^UnCompletedSubCaption +: Завршено +# ^BackBtn +< &Назад +# ^NextBtn +Н&апред > +# ^AgreeBtn +&Да +# ^AcceptBtn +&Ги прифаќам условите од Лиценцниот Договор +# ^DontAcceptBtn +Н&е ги прифаќам условите од Лиценцниот Договор +# ^InstallBtn +&Инсталирај +# ^UninstallBtn +&Деинсталирај +# ^CancelBtn +Откажи +# ^CloseBtn +&Затвори +# ^BrowseBtn +&Пребарувај... +# ^ShowDetailsBtn +П&окажи Детали +# ^ClickNext +Притиснете 'Напред' за да продолжите. +# ^ClickInstall +Притиснете 'Инсталирај' за да се инсталира. +# ^ClickUninstall +Притиснете 'Деинсталирај' за да се деинсталира. +# ^Name +Име +# ^Completed +Завршено +# ^LicenseText +Ве молиме прочитајте го Лиценцниот Договор пред да се инсталира $(^NameDA). Ако ги прифаќате сите услови, притиснете 'Да'. +# ^LicenseTextCB +Ве молиме прочитајте го Лиценцниот Договор пред да се инсталира $(^NameDA). Ако ги прифаќате сите услови, притиснете го Check box-от подоле. $_CLICK +# ^LicenseTextRB +Ве молиме прочитајте го Лиценцниот Договор пред да се инсталира $(^NameDA). Ако ги прифаќате сите услови, одберете ја првата опција подоле. $_CLICK +# ^UnLicenseText +Ве молиме прочитајте го Лиценцниот Договор пред да се деинсталира $(^NameDA). Ако ги прифаќате сите услови, притиснете 'Да'. +# ^UnLicenseTextCB +Ве молиме прочитајте го Лиценцниот Договор пред да се деинсталира $(^NameDA). Ако ги прифаќате сите услови, притиснете го Check box-от подоле. $_CLICK +# ^UnLicenseTextRB +Ве молиме прочитајте го Лиценцниот Договор пред да се деинсталира $(^NameDA). Ако ги прифаќате сите услови, одберете ја првата опција подоле. $_CLICK +# ^Custom +Подесено +# ^ComponentsText +Чекирајте ги компонентите што сакате да се инсталираат или дечекирајте ги тие што не сакате да се инсталираат. $_CLICK +# ^ComponentsSubText1 +Одберете вид на инсталација: +# ^ComponentsSubText2_NoInstTypes +Одберете ги компонентите што ќе се инсталираат: +# ^ComponentsSubText2 +или, одберете други компоненти што сакате да се инсталираат: +# ^UnComponentsText +Чекирајте ги компонентите што сакате да се деинсталираат или дечекирајте ги тие што не сакате да се деинсталираат. $_CLICK +# ^UnComponentsSubText1 +Одберете го видот на деинсталацијата: +# ^UnComponentsSubText2_NoInstTypes +Одберете ги компонентите што ќе се деинсталираат: +# ^UnComponentsSubText2 +или, одберете други компоненти што сакате да се деинсталираат: +# ^DirText +Инсталациониот програм ќе го инсталира $(^NameDA) во следниов директориум. За да инсталирате во друг, притиснете 'Пребарувај' и одберете друг директориум. $_CLICK +# ^DirSubText +Директориум каде што ќе се инсталира +# ^DirBrowseText +Одберете директориум за инсталирање на $(^NameDA): +# ^UnDirText +Инсталациониот програм ќе го деинсталира $(^NameDA) од следниов директориум. За да деинсталирате од друг, притиснете 'Пребарувај' и одберете друг директориум. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Одберете го директориумот за деинсталирање на $(^NameDA): +# ^SpaceAvailable +"Слободен простор: " +# ^SpaceRequired +"Потребен простор: " +# ^UninstallingText +$(^NameDA) ќе биде деинсталиран од следниов директориум. $_CLICK +# ^UninstallingSubText +Деинсталира од: +# ^FileError +Грешка при отварањето на датотеката за запишување: \r\n\t"$0"\r\nПритиснете 'Откажи' за да ја откажете инсталацијата,\r\n'Пробај' за да проба да ја запише датотеката, или\r\n'Игнорирај' за да ја прерипа датотеката +# ^FileError_NoIgnore +Грешка при отварањето на датотеката за запишување: \r\n\t"$0"\r\nПритиснете 'Пробај' за да проба да ја запише датотеката, или\r\n'Откажи' за да ја откаже инсталацијата +# ^CantWrite +"Не може да запише: " +# ^CopyFailed +Копирањето не успеа +# ^CopyTo +"Копирај до " +# ^Registering +"Регистрира: " +# ^Unregistering +"Дерегистрира: " +# ^SymbolNotFound +"Не може да го најде симболот: " +# ^CouldNotLoad +"Не може да лоадира: " +# ^CreateFolder +"Создади директориум: " +# ^CreateShortcut +"Создади кратеница: " +# ^CreatedUninstaller +"Создаден деинсталатор: " +# ^Delete +"Избришана датотека: " +# ^DeleteOnReboot +"Избриши после рестартирање: " +# ^ErrorCreatingShortcut +"Грешка при создавањето на скратеницата: " +# ^ErrorCreating +"Грешка при создавањето: " +# ^ErrorDecompressing +Грешка при отпакувањето на податоците! Расипан инсталационен програм? +# ^ErrorRegistering +Грешка при регистрирањето на DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Покрени: " +# ^Extract +"Отпакувано: " +# ^ErrorWriting +"Отпакувај: грешка при снимањето во датотеката " +# ^InvalidOpcode +Расипан инсталационен програм: погрешен код +# ^NoOLE +"Нема OLE за: " +# ^OutputFolder +"Инсталационен директориум: " +# ^RemoveFolder +"Избришан директориум: " +# ^RenameOnReboot +"Преименувај после рестартирање: " +# ^Rename +"Преименувај: " +# ^Skipped +"Прерипано: " +# ^CopyDetails +Копирај ги Деталите во Clipboard-от +# ^LogInstall +Сними лог за инсталационите процеси +# ^Byte +б +# ^Kilo + К +# ^Mega + М +# ^Giga + Г diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nsh new file mode 100644 index 0000000000..1694fae40d --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Macedonian.nsh @@ -0,0 +1,121 @@ +;Language: Macedonian (1071) +;By Sasko Zdravkin [wingman2083@yahoo.com] + +!insertmacro LANGFILE "Macedonian" = "Македонски" "Makedonski" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добро дојдовте во инсталацијата на $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Овој програм ќе ве води низ инсталацијата на $(^NameDA).$\r$\n$\r$\nПрепорачано е да ги затворите сите програми пред да инсталирате. Ова ќе дозволи инсталациониот програм да обнови некои системски датотеки без да го рестартира компјутерот.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добро дојдовте во деинсталацијата на $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Овој програм ќе ве води низ деинсталацијата на $(^NameDA).$\r$\n$\r$\nПред да ја почнете деинсталацијата на $(^NameDA) проверете дали е исклучена програмата.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лиценцен Договор" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ве молиме проверете ги лиценцните услови пред да го инсталирате $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ако ги прифаќате условите од договорот, притиснете 'Да' за да продолжите. Мора да го прифатите договорот за да го инсталирате $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако ги прифаќате условите од договорот, чекирајте го check box-от подоле. Мора да го прифатите договорот за го инсталирате $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако ги прифаќате условите од договорот, одберете ја првата опција подоле. Мора да го прифатите договорот за го инсталирате $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лиценцен Договор" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ве молиме проверете ги лиценцните услови пред да го деинсталирате $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ако ги прифаќате условите од договорот, притиснете 'Да' за да продолжите. Мора да го прифатите договорот за да го деинсталирате $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако ги прифаќате условите од договорот, чекирајте го check box-от подоле. Мора да го прифатите договорот за го деинсталирате $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако ги прифаќате условите од договорот, одберете ја првата опција подоле. Мора да го прифатите договорот за го деинсталирате $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Притиснете 'Page Down' за да го видете останатиот дел од договорот." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Одберете Компоненти" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Одберете кои работи од $(^NameDA) сакате да се инсталираат." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Одберете Компоненти" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Одберете кои работи од $(^NameDA) сакате да се деинсталираат." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Објаснение" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Однесете го курсорот до компонентата за да го видете нејзиното објаснение." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Одберете ја компонентата за да го видете нејзиното објаснение." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Одберете ја локацијата за инсталирање" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Одберете го директориумот каде што сакате да се инсталира $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Одберете ја локацијата за деинсталирање" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Одберете го директориумот од кој сакате да се деинсталира $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Инсталира" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Ве молиме почекајте додека $(^NameDA) се инсталира." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Инсталацијата е завршена" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Инсталирањето беше успешно." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Инсталацијата е откажана" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Инсталирањето не беше успешно завршено." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Деинсталира" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Ве молиме почекајте додека $(^NameDA) се деинсталира." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Деинсталацијата е завршена" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Деинсталирањето беше успешно." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Деинсталацијата е откажана" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Деинсталирањето не беше успешно завршено." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завршува инсталирањето на $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) е инсталиран на вашиот компјутер.$\r$\n$\r$\nПритиснете 'Крај' за да го затворите инсталациониот програм." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Вашиот компјутер мора да се рестартира за да заврши инсталацијата на $(^NameDA). Дали сакате да се рестартира сега?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завршува деинсталирањето на $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) е деинсталиран од вашиот компјутер.$\r$\n$\r$\nПритиснете 'Крај' за да го затворите деинсталациониот програм." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Вашиот компјутер мора да се рестартира за да заврши деинсталацијата на $(^NameDA). Дали сакате да се рестартира сега?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Рестартирај сега" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Ако сакате да го рестартирате подоцна" + ${LangFileString} MUI_TEXT_FINISH_RUN "Пок&рени го $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Отвор&и 'Прочитај Ме'" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Крај" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Одберете директориум за Старт Менито" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Одберете директориум во Старт Менито за креирање скратеница на $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Одберете го директориумот во Старт Менито во кој сакате да се креира скратеница за програмата. Исто така можете да внесете друго име за да се креира нов директориум." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Не креирај скратеница" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Деинсталирај го $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Одстранете го $(^NameDA) од вашиот компјутер." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурни ли сте дека сакате да се откажете од инсталацијата на $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурни ли сте дека сакате да се откажете од деинсталацијата на $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nlf new file mode 100644 index 0000000000..6bf0a81ed4 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1086 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation muhammadazwa@yahoo.com +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Setup $(^Name) +# ^UninstallCaption +Uninstall $(^Name) +# ^LicenseSubCaption +: Perlesenan +# ^ComponentsSubCaption +: Pilihan kemasukan +# ^DirSubCaption +: Folder kemasukan +# ^InstallingSubCaption +: Memasang +# ^CompletedSubCaption +: Selesai +# ^UnComponentsSubCaption +: Pilihan membuang +# ^UnDirSubCaption +: Folder Uninstal +# ^ConfirmSubCaption +: Kepastian +# ^UninstallingSubCaption +: Membuang +# ^UnCompletedSubCaption +: Tidak Selesai +# ^BackBtn +< &Ke Belakang +# ^NextBtn +&Ke Depan > +# ^AgreeBtn +Saya &setuju +# ^AcceptBtn +Saya s&etuju dengan Perlesenan +# ^DontAcceptBtn +Saya &tidak setuju dengan Perlesenan +# ^InstallBtn +&Masukkan +# ^UninstallBtn +&Buang +# ^CancelBtn +Batal +# ^CloseBtn +&Tutup +# ^BrowseBtn +S&elusur... +# ^ShowDetailsBtn +Buka &lagi +# ^ClickNext +Klik Ke Depan untuk teruskan. +# ^ClickInstall +Klik Masukkan untuk kemasukkan. +# ^ClickUninstall +Klik Uninstall untuk membuang. +# ^Name +Nama +# ^Completed +Selesai +# ^LicenseText +Sila baca lesen sebelum memasukkan $(^NameDA). Jika anda terima perlesenan, klik Saya setuju. +# ^LicenseTextCB +Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK +# ^LicenseTextRB +Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK +# ^UnLicenseText +Sila baca lesen sebelum sebelum membuang $(^NameDA). Jika anda terima perlesenan, klik Saya setuju. +# ^UnLicenseTextCB +Sila baca lesen sebelum memasukkan $(^NameDA). Jika terima, beri tanda dicheckbox. $_CLICK +# ^UnLicenseTextRB +Sila baca lesen sebelum sebelum membuang $(^NameDA).Jika anda terima perlesenan, pilihlah salah satu item dibawah ini. $_CLICK +# ^Custom +Custom +# ^ComponentsText +Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK +# ^ComponentsSubText1 +Pilih kemasukan: +# ^ComponentsSubText2_NoInstTypes +Pilih komponen-komponen untuk dimasukkan: +# ^ComponentsSubText2 +Atau, pilih komponen berikut untuk dimasukkan: +# ^UnComponentsText +Beri tanda dicheckbox pada komponen yang ingin dimasukkan and hilangkan tanda pada komponen yang tidak perlu dimasukkan. $_CLICK +# ^UnComponentsSubText1 +Pilih tipe un-kemasukan: +# ^UnComponentsSubText2_NoInstTypes +Pilih komponen-komponen untuk di buang: +# ^UnComponentsSubText2 +Atau, pilih komponen berikut untuk di buang: +# ^DirText +Setup akan memasukkan $(^NameDA) pada folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK +# ^DirSubText +Folder tujuan +# ^DirBrowseText +Pilih folder untuk memasukkan $(^NameDA): +# ^UnDirText +Setup akan membuang $(^NameDA) dari folder berikut. Untuk memilih folder lainnya, klik Selusur dan pilih folder pilihan anda. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Pilih folder untuk dibuang $(^NameDA): +# ^SpaceAvailable +"Ruang cakera keras yang ada: " +# ^SpaceRequired +"Ruang cakera keras yang diperlukan: " +# ^UninstallingText +$(^NameDA) akan buang dari folder berikut. $_CLICK +# ^UninstallingSubText +Membuang: +# ^FileError +Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik abort untuk membatalkan kemasukan,\r\nretry untuk cuba lagi, atau\r\nignore untuk abaikan fail ini. +# ^FileError_NoIgnore +Tidak dapat menulis pada fail: \r\n\t"$0"\r\nKlik retry untuk cuba lagi, atau\r\ncancel untuk batalkan kemasukan +# ^CantWrite +"Gagal menulis pada: " +# ^CopyFailed +Gagal menyalin +# ^CopyTo +"Menyalin ke " +# ^Registering +"Mendaftarkan modul: " +# ^Unregistering +"Melepaskan modul: " +# ^SymbolNotFound +"Symbol tidak jumpa : " +# ^CouldNotLoad +"Tidak dapat membuka: " +# ^CreateFolder +"Membuat folder: " +# ^CreateShortcut +"Membuat pintasan: " +# ^CreatedUninstaller +"Membuat program unistall: " +# ^Delete +"Memadam fail: " +# ^DeleteOnReboot +"Akan dipadam ketika reboot: " +# ^ErrorCreatingShortcut +"Tidak dapat membuat pintasan: " +# ^ErrorCreating +"Ralat penciptaan: " +# ^ErrorDecompressing +Ralat ketika membuka data! Program Installer rosak +# ^ErrorRegistering +Ralat mendaftarkan modul DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Menjalankan: " +# ^Extract +"Mengekstrak: " +# ^ErrorWriting +"Ekstrak: ralat ketika menulis ke fail " +# ^InvalidOpcode +Installer rosak: opcode tidak lengkap +# ^NoOLE +"OLE tidak ditemukan: " +# ^OutputFolder +"Folder tujuan: " +# ^RemoveFolder +"Menghapuskan folder: " +# ^RenameOnReboot +"Menamakan semula pada reboot: " +# ^Rename +"Menamakan semula: " +# ^Skipped +"Diabaikan: " +# ^CopyDetails +Salin terperinci ke clipboard +# ^LogInstall +Catat proses kemasukan +# ^Byte +Bait +# ^Kilo + Kilo +# ^Mega + Mega +# ^Giga + Giga diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nsh new file mode 100644 index 0000000000..81ae9dec1b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Malay.nsh @@ -0,0 +1,121 @@ +;Language: Malay (1086) +;By muhammadazwa@yahoo.com + +!insertmacro LANGFILE "Malay" = "Bahasa Melayu" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Assalamualaikum, Selamat datang ke $(^NameDA) Setup Wizard" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Setup Wizard akan membantu anda untuk memasukkan $(^NameDA).$\r$\n$\r$\nSila tutup program aplikasi yang lain sebelum Setup ini dimulakan. Ini supaya tiada proses reboot komputer diperlukan.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Selamat datang ke $(^NameDA) Uninstall Wizard" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Uninstall Wizard akan membantu anda pada proses membuang $(^NameDA).$\r$\n$\r$\nSebelum membuang, pastikan dulu $(^NameDA) dimatikan.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Perlesenan" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Sila baca teks lesen berikut sebelum memasukkan $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jika anda bersetuju, klik Saya setuju untuk teruskan. Anda mesti setuju untuk sebelum aplikasi dapat dimasukkan $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda bersetuju dengan syarat-syarat lesen, sila tanda dicheckbox. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda terima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju sebelum memasukkan $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Tentang Lesen" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Sila baca teks lesen sebelum membuang $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jika anda menerima lesen, klik Saya setuju untuk teruskan. Anda mesti setuju untuk dapat membuang $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jika anda menerima semua yang ada di lesen, beri tanda dicheckbox. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jika anda menerima semua yang ada di lesen, pilihlah salah satu item dibawah ini. Anda mesti setuju untuk dapat membuang $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tekan Page Down untuk melihat teks selebihnya." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Pilih Komponen" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi dari $(^NameDA) yang ingin dimasukkan." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Pilih Komponen" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Pilih fungsi-fungsi $(^NameDA) yang ingin dibuang." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Penerangan" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Alihkan tetikus ke komponen untuk mengetahui penerangannya." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pilih komponen untuk mengetahui penerangannya." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Pilih Lokasi Kemasukan" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Pilih folder untuk memasukkan $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Pilih Lokasi Uninstall" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Pilih folder untuk meng-uninstall $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Pemasangan" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang dimasukkan." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Proses Selesai" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Setup sudah selesai." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Proses Dibatalkan" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Setup terbatal." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Uninstall" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Sila tunggu ketika $(^NameDA) sedang di-buang." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Proses Uninstall Selesai" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Uninstall sudah selesai." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Proses Uninstall Dibatalkan" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Uninstall belum selesai secara sempurna." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Setup Wizard" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dimasukkan di komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Komputer anda harus direboot untuk menyelesaikan proses memasukkan $(^NameDA). Apakah anda hendak reboot sekarang juga?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Menyelesaikan $(^NameDA) Uninstall Wizard" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) sudah dibuang dari komputer anda.$\r$\n$\r$\nKlik Selesai untuk menutup Setup Wizard." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Komputer anda harus di reboot untuk menyelesaikan proses membuang $(^NameDA). Reboot sekarang?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reboot sekarang" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reboot nanti" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Jalankan $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Buka fail Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Selesai" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Pilih Folder Start Menu" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Pilih folder Start Menu untuk meletakkan pintasan $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Pilih folder Start Menu untuk perletakkan pintasan aplikasi ini. Boleh cipta nama folder anda sendiri." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Tidak perlu pintasan" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Buang $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Padam $(^NameDA) dari komputer anda." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan Setup $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Adakan anda yakin ingin membatalkan proses buang $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nlf new file mode 100644 index 0000000000..5ea8431460 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1104 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Bayarsaikhan Enkhtaivan. ebayaraa@gmail.com +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Суулгац +# ^UninstallCaption +$(^Name) Суулгасныг устгах +# ^LicenseSubCaption +: Лицензийн зөвшөөрөл +# ^ComponentsSubCaption +: Суулгах сонголт +# ^DirSubCaption +: Суулгах Хавтас +# ^InstallingSubCaption +:Суулгаж байна +# ^CompletedSubCaption +: Дууслаа +# ^UnComponentsSubCaption +: Суулгасныг устгахын Сонголт +# ^UnDirSubCaption +: Суулгасныг устгах Хавтас +# ^ConfirmSubCaption +: Батламж +# ^UninstallingSubCaption +: Суулгасныг устгаж байна +# ^UnCompletedSubCaption +: Дууслаа +# ^BackBtn +< &Буцах +# ^NextBtn +&Цааш> +# ^AgreeBtn +&Зөвшөөрлөө +# ^AcceptBtn +Би Лицензийн Зөвшөөрлийн зүйлүүдийг &зөвшөөрч байна +# ^DontAcceptBtn +Би Лицензийн Зөвшөөрлийн зүйлүүдийг &зөвшөөрөхгүй байна +# ^InstallBtn +&Суулга +# ^UninstallBtn +&Устга +# ^CancelBtn +Болих +# ^CloseBtn +&Xaax +# ^BrowseBtn +Х&өтлөх... +# ^ShowDetailsBtn +&Дэлгэрэнгүй +# ^ClickNext +Цааш дээр дарвал үргэлжилнэ. +# ^ClickInstall +Суулга дээр дарвал суулгац эхэлнэ. +# ^ClickUninstall +Устга дээр дарвал суулгацын устгалт эхэлнэ. +# ^Name +Нэр +# ^Completed +Дууслаа +# ^LicenseText +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, Зөвшөөрлөө-г дарна уу. +# ^LicenseTextCB +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх нүдийг чагтална уу. $_CLICK +# ^LicenseTextRB +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх эхний сонголтыг сонгоно уу. $_CLICK +# ^UnLicenseText +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, Зөвшөөрлөө-г дарна уу. +# ^UnLicenseTextCB +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх нүдийг чагтална уу. $_CLICK +# ^UnLicenseTextRB +$(^NameDA)-г суулгахын өмнө Лицензийн Зөвшөөрлийг уншина уу. Хэрэв та зөвшилцлийн зүйлүүдийг зөвшөөрч байвал, доорх эхний сонголтыг сонгоно уу. $_CLICK +# ^Custom +Бусад +# ^ComponentsText +Суулгахыг хүссэн нэгдлээ чагтлаад, суулгахыг хүсэхгүй буйгаа бүү чагтлаарай. $_CLICK +# ^ComponentsSubText1 +Суулгах төрлийг сонгоно уу: +# ^ComponentsSubText2_NoInstTypes +Суулгах нэгдлийг сонгоно уу: +# ^ComponentsSubText2 +Эсвэл, заавал суулгахгүй байх нэгдлүүдийг сонго: +# ^UnComponentsText +Устгахыг хүссэн нэгдлээ чагтлаад, устгахыг хүсэхгүй байгаагаа бүү чагтлаарай. $_CLICK +# ^UnComponentsSubText1 +Устгах төрлийг сонгоно уу: +# ^UnComponentsSubText2_NoInstTypes +Устгах нэгдлүүдийг сонгоно ууl: +# ^UnComponentsSubText2 +Эсвэл, заавал устгахгүй байх нэгдлүүдийг сонго: +# ^DirText +$(^NameDA) нь дараах хавтсанд сууна. Өөр газар суулгахыг хүсвэл Хөтлөх товч дээр даран өөр хавтас сонгоно уу. $_CLICK +# ^DirSubText +Зорилтот Хавтас +# ^DirBrowseText +$(^NameDA)-ыг суулгах хавтсыг сонгох: +# ^UnDirText +$(^NameDA)-г уг хавтаснаас устгана. Өөр газраас устгахыг хүсвэл Хөтлөх товч дээр даран өөр хавтас сонгоно уу. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA)-г устгах хавтсыг сонгох: +# ^SpaceAvailable +"Боломжит зай: " +# ^SpaceRequired +"Шаардагдах зай: " +# ^UninstallingText +$(^NameDA) нь уг хавтаснаас устгагдлаа. $_CLICK +# ^UninstallingSubText +Устгагдах газар: +# ^FileError +Файл бичихээр нээхэд алдлаа: \r\n\t"$0"\r\nТаслах дарвал суулгалт таслагдана,\r\nДахья дарвал файлыг бичихээр дахин оролдоно,\r\nэсвэл Үл тоох дарвал уг файлыг алгасна +# ^FileError_NoIgnore +Файл бичихээр нээхэд алдлаа: \r\n\t"$0"\r\nДахия дарвал файлыг бичихээр дахин оролдоно, \r\nэсвэл болих дарвал суулгалт таслагдана +# ^CantWrite +"Бичиж чадсангүй: " +# ^CopyFailed +Хуулалт бүтсэнгүй +# ^CopyTo +"Хуулах нь " +# ^Registering +"Бүртгэж байна: " +# ^Unregistering +"Бүртгэлийг арилгаж байна: " +# ^SymbolNotFound +"Тэмдэг хайгдсангүй: " +# ^CouldNotLoad +"Дуудагдсангүй: " +# ^CreateFolder +"Үүсгэх хавтас: " +# ^CreateShortcut +"Үүсгэх shortcut: " +# ^CreatedUninstaller +"Үүссэн uninstaller: " +# ^Delete +"Файл устгах: " +# ^DeleteOnReboot +"Д.ачаалахад устгах: " +# ^ErrorCreatingShortcut +"Shortcut үүсгэхэд алдлаа: " +# ^ErrorCreating +"Үүсгэх алдаа: " +# ^ErrorDecompressing +Өгөгдөл задлахад алдлаа! Суулгац эвдэрчээ? +# ^ErrorRegistering +DLL бүртгүүлэхэд алдлаа +# ^ExecShell +"Ажиллуулах команд(ExecShell): " +# ^Exec +"Ажиллуулах: " +# ^Extract +"Задлах: " +# ^ErrorWriting +"Задлалт:файл руу бичихэд алдаа " +# ^InvalidOpcode +Суулгац эвдэрчээ: задлах код буруу +# ^NoOLE +"OLE байхгүй: " +# ^OutputFolder +"Гаргах хавтас: " +# ^RemoveFolder +"Устгах хавтас: " +# ^RenameOnReboot +"Д.ачаалахад дахин нэрлэх: " +# ^Rename +"Дахин нэрлэх: " +# ^Skipped +"Алгассан: " +# ^CopyDetails +Дэлгэрэнгүйг Clipboard руу хуулах +# ^LogInstall +Суулгах явцын баримт +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nsh new file mode 100644 index 0000000000..831f1bed24 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Mongolian.nsh @@ -0,0 +1,129 @@ +;Language: Mongolian (1104) +;By Bayarsaikhan Enkhtaivan + +!insertmacro LANGFILE "Mongolian" "Mongolian (Cyrillic)" "Монгол Кирилл" "Mongol kirill" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Суулгацад тавтай морил" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "$(^NameDA) суулгацын илбэчинг та шууд ашиглаж болно.$\r$\n$\r$\nҮүнийг суулгахын өмнө бусад бүх програмуудаа хаахыг зөвлөж байна. Системийн файлуудыг шинэчилбэл компьютерээ дахин ачаалахгүй байх боломжтой.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Суулгацыг устгах илбэчинд тавтай морил" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "$(^NameDA) устгацын илбэчинг та шууд ашиглаж болно.$\r$\n$\r$\nУстгахын өмнө $(^NameDA) нь ажиллаагүй эсэхийг шалга.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензийн зөвшөөрөл" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA)-ыг суулгахынхаа өмнө зөвшилцлийн зүйлүүдийг уншина уу." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, Зөвшөөрлөө товчийг даран үргэлжлүүлнэ үү. $(^NameDA)-ыг суулгахын тулд заавал зөвшөөрөх шаардлагатай." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, Зөвлөх хайрцгийг даран үргэлжлүүлнэ үү. $(^NameDA)-ыг суулгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, доорхоос эхнийг нь сонгон үргэлжлүүлнэ үү. $(^NameDA)-ыг суулгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензийн зөвшөөрөл" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) устгахын өмнө зөвшилцлийн зүйлсийг уншина уу." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, Зөвшөөрлөө товчийг даран үргэлжлүүлнэ үү. $(^NameDA)-ыг устгахын тулд заавал зөвшөөрөх шаардлагатай." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, Зөвлөх хайрцгийг даран үргэлжлүүлнэ үү. $(^NameDA)-ыг устгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Хэрэв зөвшилцлийн зүйлсийг зөвшөөрч байвал, доорхоос эхнийг нь сонгон үргэлжлүүлнэ үү. $(^NameDA)-ыг устгахын тулд заавал зөвшөөрөх шаардлагатай. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Page Down товчийг даран зөвшилцлийг доош гүйлгэнэ үү." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Нэгдлийг сонгох" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ыг суулгахад шаардагдах хэсгийг сонгоно уу." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Нэгдлийг сонгох" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)-ын устгах шаардлагатай нэгдлийг сонгох." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Тайлбар" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Та хулганаараа нэгдлийн дээр очиход түүний тайлбарыг харуулна." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Нэгдлийг сонговол түүний тайлбарыг харна." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Суулгах байрлалыг сонгох" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) суулгацын суулгах замыг сонго." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Устгацын байрлалыг сонгох" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA)-ыг устгах хавтсыг сонгох." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Суулгаж байна" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA)-ыг суулгаж дуустал түр хүлээнэ үү." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Суулгаж дууслаа" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Суулгац амжилттай болов." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Суулгалт таслагдлаа" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Суулгалт амжилтгүй болов." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Устгаж байна" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) -ыг зайлуулж дуустал түр хүлээнэ үү." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Устгаж дууслаа" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Устгалт амжилттай дууслаа." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Устгац таслагдлаа" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Устгалт амжилтгүй боллоо." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Суулгацын илбэчин дууслаа" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) нь таны компьютерт суулаа.$\r$\n$\r$\nТөгсгөл дээр дарвал хаана." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA)-ын суулгацын дараалалд та компьютерээ дахин ачаалснаар дуусна. Та дахин ачаалахыг хүсэж байна уу?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) Устгацын илбэчин дууслаа" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) нь таны компьютерээс зайлуулагдлаа.$\r$\n$\r$\nТөгсгөл дээр дарвал хаана." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) Устгацын дараалалд та компьютерээ дахин ачаалснаар дуусна. Та д.ачаалмаар байна уу?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Д.Ачаал" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Би дараа д.ачаалахыг хүсэж байна." + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) ажиллуулах" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme харуулах" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Төгсгөл" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Start цэсний хавтсыг сонго" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Start цэс дэх $(^NameDA) shortcut-ын хавтсыг сонго." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Start цэсэнд програмын shortcut үүсгэх хавтсыг сонго. Эсвэл та шинэ нэрээр үүсгэж болно." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Shortcut үүсгэхгүй" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)--ын Устгац" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) -ыг таны компьютерээс зайлуулах." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) -ын суулгацаас гармаар байна уу?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Устгацаас гармаар байна уу?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Хэрэглэгч сонгох" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "$(^NameDA)-ыг аль хэрэглэгчид зориулж суулгах вэ." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA)-ыг зөвхөн өөртөө эсвэл энэ компьютер дээрх бүх хэрэглэгчдэд зориулж суулгахыг сонго. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Энэ компьютер дээрх бүх хэрэглэчдэд суулгах" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Зөвхөн өөртөө суулгах" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nlf new file mode 100644 index 0000000000..a4d69309a2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1044 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Jonas Lindstrøm (jonasc_88@hotmail.com). Reviewed and fixed by Jan Ivar Beddari +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) installasjon +# ^UninstallCaption +$(^Name) avinstallasjon +# ^LicenseSubCaption +: Lisensavtale +# ^ComponentsSubCaption +: Installasjonsvalg +# ^DirSubCaption +: Installasjonsmappe +# ^InstallingSubCaption +: Installerer +# ^CompletedSubCaption +: Ferdig +# ^UnComponentsSubCaption +: Avinstallasjonsvalg +# ^UnDirSubCaption +: Avinstallasjonsmappe +# ^ConfirmSubCaption +: Bekreft +# ^UninstallingSubCaption +: Avinstallerer +# ^UnCompletedSubCaption +: Ferdig +# ^BackBtn +< &Tilbake +# ^NextBtn +&Neste > +# ^AgreeBtn +&Godta +# ^AcceptBtn +Jeg &godtar vilkårene i lisensavtalen +# ^DontAcceptBtn +Jeg godtar &ikke vilkårene i lisensavtalen +# ^InstallBtn +&Installer +# ^UninstallBtn +&Avinstaller +# ^CancelBtn +Avbryt +# ^CloseBtn +&Lukk +# ^BrowseBtn +Bla &gjennom... +# ^ShowDetailsBtn +Vis &detaljer +# ^ClickNext +Trykk Neste for å fortsette. +# ^ClickInstall +Trykk Installer for å starte installasjonen. +# ^ClickUninstall +Trykk Avinstaller for å starte avinstallasjonen. +# ^Name +Navn +# ^Completed +Ferdig +# ^LicenseText +Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, trykk på Godta. +# ^LicenseTextCB +Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, merk av under. $_CLICK +# ^LicenseTextRB +Vennligst les gjennom lisensavtalen før du installerer $(^Name). Hvis du godtar vilkårene i avtalen, velg det første alternativet. $_CLICK +# ^UnLicenseText +Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, trykk på Godta. +# ^UnLicenseTextCB +Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, merk av under. $_CLICK +# ^UnLicenseTextRB +Vennligst les gjennom lisensavtalen før du avinstallerer $(^Name). Hvis du godtar vilkårene i avtalen, velg det første alternativet. $_CLICK +# ^Custom +Egendefinert +# ^ComponentsText +Merk komponentene du vil installere og fjern merkingen for de du ikke vil installere. $_CLICK +# ^ComponentsSubText1 +Velg hvilken måte du vil installere på: +# ^ComponentsSubText2_NoInstTypes +Merk komponenter du vil installere: +# ^ComponentsSubText2 +Eller merk de valgfrie komponentene du ønsker å installere: +# ^UnComponentsText +Merk komponentene du vil avinstallere og fjern merkingen for de du vil beholde. $_CLICK +# ^UnComponentsSubText1 +Velg hvilken måte du vil avinstallere på: +# ^UnComponentsSubText2_NoInstTypes +Merk komponenter du vil avinstallere: +# ^UnComponentsSubText2 +Eller merk de valgfrie komponentene du ønsker å avinstallere: +# ^DirText +$(^Name) vil bli installert i følgende mappe. For å velge en annen mappe, trykk Bla gjennom. $_CLICK +# ^DirSubText +Målmappe +# ^DirBrowseText +Velg mappe du vil installere $(^Name) i: +# ^UnDirText +$(^Name) i følgende mappe vil bli avinstallert. For å velge en annen mappe, trykk Bla gjennom. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Velg mappe du vil avinstallere $(^Name) fra: +# ^SpaceAvailable +"Ledig plass: " +# ^SpaceRequired +"Nødvendig plass: " +# ^UninstallingText +Denne veiviseren vil avinstallere $(^Name) fra din datamaskin. $_CLICK +# ^UninstallingSubText +Avinstallerer fra: +# ^FileError +Feil under åpning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for å avbryte installasjonen,\r\nPrøv igjen for å prøve igjen, eller\r\nIgnorer for å hoppe over denne filen +# ^FileError_NoIgnore +Feil under åpning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for å prøve igjen, or\r\neller Avbryt for å avbryte installasjonen +# ^CantWrite +"Kan ikke skrive: " +# ^CopyFailed +Kopiering mislyktes +# ^CopyTo +"Kopier til " +# ^Registering +"Registrerer: " +# ^Unregistering +""Avregistrerer: " +# ^SymbolNotFound +"Kunne ikke finne symbol: " +# ^CouldNotLoad +"Kunne ikke laste: " +# ^CreateFolder +"Lag mappe: " +# ^CreateShortcut +"Lag snarvei: " +# ^CreatedUninstaller +"Avinstallasjon laget: " +# ^Delete +"Slett fil: " +# ^DeleteOnReboot +"Slett ved omstart: " +# ^ErrorCreatingShortcut +"Feil under opprettelse av snarvei: " +# ^ErrorCreating +"Feil under opprettelse av: " +# ^ErrorDecompressing +Feil under utpakking av data! Installasjonsprogrammet kan være skadet. +# ^ErrorRegistering +Feil under registrering av DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Kjøre: " +# ^Extract +"Pakk ut: " +# ^ErrorWriting +"Pakk ut: Feil under skriving til fil " +# ^InvalidOpcode +Installasjonsprogrammet er skadet: ukjent kode +# ^NoOLE +"Ingen OLE for: " +# ^OutputFolder +"Ut-mappe: " +# ^RemoveFolder +"Fjern mappe: " +# ^RenameOnReboot +"Gi nytt navn ved omstart: " +# ^Rename +"Gi nytt navn: " +# ^Skipped +"Hoppet over: " +# ^CopyDetails +Kopier detaljer til utklippstavlen +# ^LogInstall +Loggfør installasjonsprosessen +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nsh new file mode 100644 index 0000000000..a8cb181114 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Norwegian.nsh @@ -0,0 +1,129 @@ +;Language: Norwegian (2068) +;By Jonas Lindsrøm (jonasc_88@hotmail.com) Reviewed and fixed by Jan Ivar Beddari, d0der at online.no + +!insertmacro LANGFILE "Norwegian" = "Norsk" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for installasjon av $(^NameDA) " + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom installasjonen av $(^NameDA).$\r$\n$\r$\nDet anbefales at du avslutter alle andre programmer før du fortsetter. Dette vil la installasjonsprogrammet forandre på systemfiler uten at du må starte datamaskinen på nytt.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til veiviseren for avinstallasjon av $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne veiviseren vil lede deg gjennom avinstallasjonen av $(^NameDA).$\r$\n$\r$\nFør du fortsetter må du forsikre deg om at $(^NameDA) ikke kjører.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du starter installasjonen av $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for å fortsette. Du må godta lisensavtalen for å installere $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av på merket under. Du må godta lisensavtalen for å installere $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du må godta lisensavtalen for å installere $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vennligst les gjennom lisensavtalen før du avinstallerer $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Hvis du godtar lisensavtalen trykk Godta for å fortsette. Du må godta lisensavtalen for å avintallere $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Hvis du godtar lisensavtalen, kryss av på merket under. Du må godta lisensavtalen for å avinstallere $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Hvis du godtar lisensavtalen, velg det første alternativet ovenfor. Du må godta lisensavtalen for å avinstallere $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down knappen for å se resten av lisensavtalen." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Velg komponenter" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker å installere." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Velg komponenter" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Velg hvilke deler av $(^NameDA) du ønsker å avinstallere." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivelse" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musen over komponentene for å se beskrivelsen." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Velg en komponent for å se beskrivelsen." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Velg installasjonsmappe" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Velg hvilken mappe du vil installere $(^NameDA) i." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Velg mappe for avinstallasjon" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Velg mappen du vil avinstallere $(^NameDA) fra." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installasjonen pågår" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir installert." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installasjonen er ferdig" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installasjonen ble fullført uten feil." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installasjonen er avbrutt" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installasjonen ble ikke fullført riktig." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallasjon pågår" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vennligst vent mens $(^NameDA) blir avinstallert." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallasjon ferdig" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallasjonen ble utført uten feil." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallasjon avbrutt" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallasjonen ble ikke utført riktig." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutter $(^NameDA) installasjonsveiviser" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er klart til bruk på din datamskin.$\r$\n$\r$\nTrykk Ferdig for å avslutte installasjonsprogrammet." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du må starte datamaskinen på nytt for å fullføre installasjonen av $(^NameDA). Vil du starte datamaskinen på nytt nå?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstallasjonen av $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) har blitt avinstallert fra din datamaskin.$\r$\n$\r$\nTrykk på ferdig for å avslutte denne veiviseren." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen må starte på nytt for å fullføre avinstallasjonen av $(^NameDA). Vil du starte datamaskinen på nytt nå?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ja. Start datamaskinen på nytt nå" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nei. Jeg vil starte datamaskinen på nytt senere" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Kjør $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Vis Readme filen" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Ferdig" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Velg plassering på startmenyen" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Velg hvilken mappe snarveiene til $(^NameDA) skal ligge i." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Velg mappe for snarveiene til programmet. Du kan også skrive inn et nytt navn for å lage en ny mappe." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikke lag snarveier" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Fjern $(^NameDA) fra din datamaskin." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Er du sikker på at du vil avslutte installasjonen av $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du sikker på at du vil avbryte avinstallasjonen av $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Velg brukere" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Velg hvilke brukere du vil installere $(^NameDA) for." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Velg om du vil installere $(^NameDA) bare for deg selv, eller for alle som bruker denne maskinen. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som bruker denne maskinen" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer bare for meg" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nlf new file mode 100644 index 0000000000..f2a52d91ad --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Language ID +2068 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Vebjørn Sture, vsture gmail com +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) installasjon +# ^UninstallCaption +$(^Name) avinstallasjon +# ^LicenseSubCaption +: Lisensavtale +# ^ComponentsSubCaption +: Installasjonsval +# ^DirSubCaption +: Installasjonsmappe +# ^InstallingSubCaption +: Installerer +# ^CompletedSubCaption +: Ferdig +# ^UnComponentsSubCaption +: Avinstallasjonsval +# ^UnDirSubCaption +: Avinstallasjonsmappe +# ^ConfirmSubCaption +: Stadfest +# ^UninstallingSubCaption +: Avinstallerer +# ^UnCompletedSubCaption +: Ferdig +# ^BackBtn +< &Attende +# ^NextBtn +&Neste > +# ^AgreeBtn +&Godta +# ^AcceptBtn +Eg &godtek vilkåra i lisensavtalen +# ^DontAcceptBtn +Eg godtek &ikkje vilkåra i lisensavtalen +# ^InstallBtn +&Installer +# ^UninstallBtn +&Avinstaller +# ^CancelBtn +Avbryt +# ^CloseBtn +&Lat att +# ^BrowseBtn +Bla &gjennom ... +# ^ShowDetailsBtn +Syn &detaljar +# ^ClickNext +Trykk Neste for å halda fram. +# ^ClickInstall +Trykk Installer for å starta installasjonen. +# ^ClickUninstall +Trykk Avinstaller for å starta avinstallasjonen. +# ^Name +Namn +# ^Completed +Ferdig +# ^LicenseText +Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, trykk på Godta. +# ^LicenseTextCB +Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, merk av under. $_CLICK +# ^LicenseTextRB +Ver grei og les gjennom lisensavtalen før du installerer $(^NameDA). Dersom du godtek vilkåra i avtalen, vel det fyrste alternativet. $_CLICK +# ^UnLicenseText +Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, trykk på Godta. +# ^UnLicenseTextCB +Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, merk av under. $_CLICK +# ^UnLicenseTextRB +Ver grei og les gjennom lisensavtalen før du avinstallerer $(^NameDA). Dersom du godtek vilkåra i avtalen, vel det fyrste alternativet. $_CLICK +# ^Custom +Eigendefinert +# ^ComponentsText +Merk komponentane du vil installera og fjern merkinga for dei du ikkje vil installera. $_CLICK +# ^ComponentsSubText1 +Vel kva måte du vil installera på: +# ^ComponentsSubText2_NoInstTypes +Merk komponentar du vil installera: +# ^ComponentsSubText2 +Eller merk dei valfrie komponentane du ynskjer å installera: +# ^UnComponentsText +Merk komponentane du vil avinstallera og fjern merkinga for dei du vil ta vare på. $_CLICK +# ^UnComponentsSubText1 +Vel kva måte du vil avinstallera på: +# ^UnComponentsSubText2_NoInstTypes +Merk komponentar du vil avinstallera: +# ^UnComponentsSubText2 +Eller merk dei valfrie komponentane du ynskjer å avinstallera: +# ^DirText +$(^NameDA) vil verta installert i fylgjande mappe. For å velja ei anna mappe, trykk Bla gjennom. $_CLICK +# ^DirSubText +Målmappe +# ^DirBrowseText +Vel mappe du vil installera $(^NameDA) i: +# ^UnDirText +$(^NameDA) i fylgjande mappe vil verta avinstallert. For å velja ei anna mappe, trykk Bla gjennom. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Vel mappe du vil avinstallera $(^NameDA) frå: +# ^SpaceAvailable +"Ledig plass: " +# ^SpaceRequired +"Naudsynt plass: " +# ^UninstallingText +Denne vegvisaren vil avinstallera $(^NameDA) frå din datamaskin. $_CLICK +# ^UninstallingSubText +Avinstallerer frå: +# ^FileError +Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Avbryt for å avbryta installasjonen,\r\nPrøv igjen for å prøva igjen, eller\r\nIgnorer for å hoppa over denne fila +# ^FileError_NoIgnore +Feil under opning av fil for skriving: \r\n\t\"$0\"\r\nTrykk Prøv igjen for å prøva igjen, or\r\neller Avbryt for å avbryta installasjonen +# ^CantWrite +"Kan ikkje skriva: " +# ^CopyFailed +Kopiering mislukka +# ^CopyTo +"Kopier til " +# ^Registering +"Registrerer: " +# ^Unregistering +""Avregistrerer: " +# ^SymbolNotFound +"Kunne ikkje finna symbol: " +# ^CouldNotLoad +"Kunne ikkje lasta: " +# ^CreateFolder +"Lag mappe: " +# ^CreateShortcut +"Lag snarveg: " +# ^CreatedUninstaller +"Avinstallasjon laga: " +# ^Delete +"Slett fil: " +# ^DeleteOnReboot +"Slett ved omstart: " +# ^ErrorCreatingShortcut +"Feil under oppretting av snarveg: " +# ^ErrorCreating +"Feil under oppretting av: " +# ^ErrorDecompressing +Feil under utpakking av data! Installasjonsprogrammet kan vera skadd. +# ^ErrorRegistering +Feil under registrering av DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Køyra: " +# ^Extract +"Pakk ut: " +# ^ErrorWriting +"Pakk ut: Feil under skriving til fil " +# ^InvalidOpcode +Installasjonsprogrammet er skadd: ukjend kode +# ^NoOLE +"Ingen OLE for: " +# ^OutputFolder +"Ut-mappe: " +# ^RemoveFolder +"Fjern mappe: " +# ^RenameOnReboot +"Gje nytt namn ved omstart: " +# ^Rename +"Gje nytt namn: " +# ^Skipped +"Hoppa over: " +# ^CopyDetails +Kopier detaljar til utklyppstavla +# ^LogInstall +Loggfør installasjonsprosessen +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G + diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nsh new file mode 100644 index 0000000000..8a9398f955 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/NorwegianNynorsk.nsh @@ -0,0 +1,129 @@ +;Language: Norwegian nynorsk (2068) +;By Vebjoern Sture and Håvard Mork (www.firefox.no) + +!insertmacro LANGFILE "NorwegianNynorsk" "Norwegian (Nynorsk)" "Norsk (nynorsk)" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Velkommen til $(^NameDA) innstallasjonsvegvisar" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom installeringa av $(^NameDA).$\n$\nDet er tilrådd at du avsluttar alle andre program før du held fram. Dette vil la installeringsprogrammet oppdatera systemfiler utan at du må starta datamaskinen på nytt.$\n$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Velkommen til avinstallering av $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denne vegvisaren vil leie deg gjennom avinstalleringen av $(^NameDA).$\n$\nFør du fortsetter må du forsikre deg om at $(^NameDA) ikkje er opent.$\n$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisensavtale" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar installeringa av $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Trykk på «Godta» dersom du godtar betingelsane i avtala. Du må godta avtala for å installere $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk på avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å installere $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtek vilkåra i avtala. Du må godta avtala for å installera $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisensavtale" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Les gjennom lisensavtalen før du startar avinstalleringa av $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Trykk på «Godta» dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Trykk på avkryssingsboksen nedanfor nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Vel det første alternativet nedanfor dersom du godtar betingelsane i avtala. Du må godta avtala for å avinstallera $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Trykk Page Down-knappen for å sjå resten av lisensavtala." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Vel komponentar" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Vel kva delar av $(^NameDA) du ynskjer å installera." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Vel funksjonar" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Vel kva for funksjonar du vil avinstallera i $(^NameDA)." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskriving" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Beveg musa over komponentene for å sjå beskrivinga." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Vel ein komponent for å sjå beskrivinga." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Vel installasjonsmappe" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vel kva mappe du vil installera $(^NameDA) i." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Vel avinstalleringplassering" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vel mappa du vil avinstallere $(^NameDA) frå." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerer" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vent mens $(^NameDA) blir installert." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installeringa er fullført" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Installeringa vart fullført." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installeringa vart avbroten" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Installeringa vart ikkje fullført." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerer" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vent medan $(^NameDA) vert avinstallert." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallering ferdig" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallering ble utført uten feil." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallering broten" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallering ble ikkje utført riktig." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Installering fullført" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) er installert og klar til bruk.$\n$\nTrykk på «Fullfør» for å avslutte installeringa." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Du må starta datamaskinen på nytt for å fullføra installeringa av $(^NameDA). Vil du starta på nytt no?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Fullfører avinstalleringa av $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) er no avinstallert frå datamaskina di.$\n$\nTrykk på «Fullfør» for å avslutta denne vegvisaren." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Datamaskinen må starta på nytt for å fullføra avinstalleringa av $(^NameDA). Vil du starta datamaskina på nytt no?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Start på nytt no" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eg vil starta på nytt seinare" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Køyr $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Syn lesmeg" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Fullfør" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Vel mappe på startmenyen" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vel kva mappe snarvegane til $(^NameDA) skal liggja i." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vel mappa du vil oppretta snarvegane til programmet i. Du kan òg skriva inn eit nytt namn for å laga ei ny mappe." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ikkje opprett snarvegar" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstaller $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Slett $(^NameDA) frå datamaskinen." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Er du viss på at du vil avslutta installeringa av $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Er du viss på at du vil avbryta avinstalleringa av $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vel brukarar" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vel kva brukarar du vil installere $(^NameDA) for." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vel om du vil installere $(^NameDA) berre for deg, eller for alle som nyttar denne maskina. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installer for alle som nyttar maskina" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installer berre for me" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nlf new file mode 100644 index 0000000000..5bb291d5a9 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1123 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1256 +# RTL - anything else than RTL means LTR +RTL +# Translation by Pakhtosoft (www.pakhtosoft.com) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +امسته $(^Name) +# ^UninstallCaption +نالګاو $(^Name) +# ^LicenseSubCaption +: منښتليک تړون +# ^ComponentsSubCaption +: لګاو غوراوي +# ^DirSubCaption +: لګاو پوښۍ +# ^InstallingSubCaption +: لګيږي +# ^CompletedSubCaption +: بشپړ +# ^UnComponentsSubCaption +: نالګاو غوراوي +# ^UnDirSubCaption +: نالګاو پوښۍ +# ^ConfirmSubCaption +: باورول +# ^UninstallingSubCaption +: نالګيږي +# ^UnCompletedSubCaption +: بشپړ +# ^BackBtn +< &وروسته +# ^NextBtn +&مخکښې > +# ^AgreeBtn +زه &منم +# ^AcceptBtn +زه &د منښتليک توکي منم +# ^DontAcceptBtn +زه &د منښتليک توکي نه منم +# ^InstallBtn +&لګول +# ^UninstallBtn +&نالګول +# ^CancelBtn +بندول +# ^CloseBtn +&بندول +# ^BrowseBtn +...چ&ڼل +# ^ShowDetailsBtn +خبرتياوې &ښودل +# ^ClickNext +.مخکښې تلو لپاره مخکښې ټک وهئ +# ^ClickInstall +.لګاو پېلولو لپاره لګول ټک وهئ +# ^ClickUninstall +.نالګاو پېلولو لپاره نالګول ټک وهئ +# ^Name +نوم +# ^Completed +بشپړ +# ^LicenseText +.د لګولو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، زه منم ټک وهئ $(^NameDA) د +# ^LicenseTextCB +$_CLICK .د لګولو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، لاندې خوښبکس ټک وهئ $(^NameDA) د +# ^LicenseTextRB +$_CLICK .د لګولو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، لاندې لمړی غوراوی خوښ کړئ $(^NameDA) د +# ^UnLicenseText +.د نالګاو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، زه منم ټک وهئ $(^NameDA) د +# ^UnLicenseTextCB +$_CLICK .د نالګاو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، لاندې خوښبکس ټک وهئ $(^NameDA) د +# ^UnLicenseTextRB +$_CLICK .د نالګاو نه مخکښې منښتليک وګورئ. که چېرې تاسې د منښتليک ټول توکي منئ، لاندې لمړی غوراوي خوښ کړئ $(^NameDA) د +# ^Custom +دوديز +# ^ComponentsText +$_CLICK .کوم رغتوکي چې لګول غواړئ خوښ يې کړئ او کوم رغتوکي چې نه غواړئ ويې لګوئ مه يې خوښوئ +# ^ComponentsSubText1 +:د لګاو ډول وټاکئ +# ^ComponentsSubText2_NoInstTypes +:د لګولو لپاره رغتوکي خوښ کړئ +# ^ComponentsSubText2 +:يا، هغه غوراويز رغتوکي چې لګول يې غواړئ وټاکئ +# ^UnComponentsText +$_CLICK .کوم رغتوکي چې نالګول غواړئ خوښ يې کړئ او کوم رغتوکي چې نه غواړئ ويې نالګوئ مه يې خوښوئ +# ^UnComponentsSubText1 +:د نالګاو ډول وټاکئ +# ^UnComponentsSubText2_NoInstTypes +:د نالګولو لپاره رغتوکي وټاکئ +# ^UnComponentsSubText2 +:يا، هغه غوراويز رغتوکي چې نالګول يې غواړئ وټاکئ +# ^DirText +$_CLICK .په لاندې پوښۍ کښې ولګوي. په بلې پوښۍ کښې يې د لګولو لپاره، چڼل ټک وهئ او بله پوښۍ وټاکئ $(^NameDA) امسته به +# ^DirSubText +موخه پوښۍ +# ^DirBrowseText +:پکښې لګول غواړئ وټاکئ $(^NameDA) هغه پوښۍ چې +# ^UnDirText +$_CLICK .د لاندې پوښۍ نه ونالګوي. د بلې پوښۍ نې د نالګولو لپاره، چڼل ټک وهئ او بله پوښۍ وټاکئ $(^NameDA) امسته به +# ^UnDirSubText +"" +# ^UnDirBrowseText +:ترې نالګول غواړئ وټاکئ $(^NameDA) هغه پوښۍ چې +# ^SpaceAvailable +" :شته تشه" +# ^SpaceRequired +" :اړينه تشه" +# ^UninstallingText +$_CLICK .به د لاندې پوښۍ نه ونالګول شي $(^NameDA) +# ^UninstallingSubText +:نالګيږي له +# ^FileError +:د ليکلو لپاره د دوتنې پرانيستلو کښې ستونزه \r\n\r\n$0\r\n\r\n،د لګاو د بندولو لپاره بندول ټک وهئ\r\nبياهڅه د بيا هڅې کولو لپاره، يا\r\n.پرېږده د دې دوتنې پرېښودلو لپاره +# ^FileError_NoIgnore +:د ليکلو لپاره د دوتنې پرانيستلو کښې ستونزه \r\n\r\n$0\r\n\r\nد بيا هڅې کولو لپاره بياهڅه ټک وهئ، يا\r\n.بندول د لګاو د بندولو لپاره +# ^CantWrite +" :نشي ليکلی" +# ^CopyFailed +لمېسلو پاتېينه +# ^CopyTo +"ته لمېسل " +# ^Registering +" :نومکښليږي" +# ^Unregistering +" :نانومکښليږي" +# ^SymbolNotFound +" :پېلام نشي پېدا کولی" +# ^CouldNotLoad +" :نشي راوستلی" +# ^CreateFolder +" :پوښۍ جوړول" +# ^CreateShortcut +" :لنډلاری جوړول" +# ^CreatedUninstaller +" :جوړ شوی نالګاند" +# ^Delete +" :دوتنې ړنګول" +# ^DeleteOnReboot +" :پر بياپېلات ړنګول" +# ^ErrorCreatingShortcut +" :د لنډاري جوړولو ستونزه" +# ^ErrorCreating +" :جوړولو ستونزه" +# ^ErrorDecompressing +اومتوک نازېرلو ستونزه! اندرغل لګاند؟ +# ^ErrorRegistering +د ډلل نومکښلو ستونزه +# ^ExecShell +" :اکزک شل" +# ^Exec +" :پېلول" +# ^Extract +" :وېستل" +# ^ErrorWriting +"وېستل: دوتنې کښې ليکلو ستونزه " +# ^InvalidOpcode +اندرغل لګاند: ناسم اپکوډ +# ^NoOLE +"No OLE for: " +# ^OutputFolder +" :وتنې پوښۍ" +# ^RemoveFolder +" :پوښې ړنګول" +# ^RenameOnReboot +" :پر بياپېلات بيانومول" +# ^Rename +" :بيانومول" +# ^Skipped +" :پرېښودلي" +# ^CopyDetails +خبرتياوې ټوټې ډړې ته لمېسل +# ^LogInstall +د لګاو بهير خبرالول +# ^Byte +ب +# ^Kilo + ک +# ^Mega + م +# ^Giga + ګ diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nsh new file mode 100644 index 0000000000..cfcd8790a5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Pashto.nsh @@ -0,0 +1,121 @@ +;Language: Pashto (1123) +;By Pakhtosoft - www.pakhtosoft.com + +!insertmacro LANGFILE "Pashto" = "پښتو" "Pashto" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "امسته اسانګر ته ښه راغلاست $(^NameDA) د " + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT ".لګونې ته يوسي $(^NameDA) دا اسانګر به تاسې د$\r$\n$\r$\n.د امستې د پېلولو نه مخکښې د نورو ساوترو د بندولو سپارښتنه کوو. د دې کار په کولو سره به دا شونه شي چې پرته له کمپيوټر د بياپيلاته اړينې غونډال دوتنې اوسمهاله شي$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "نالګاو اسانګر ته ښه راغلاست $(^NameDA) د" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT ".نالګونې ته يوسي $(^NameDA) دا اسانګر به تاسې د$\r$\n$\r$\n.نه وي پرانيستل شوی $(^NameDA) د نالګاو د پېلولو نه مخکښې، ځان ډاډمن کړﺉ چې$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "منښتليک تړون" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE ".لګولو نه مخکښې منښتليک توکي وګورﺉ $(^NameDA) د" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM ".د لګاونې لپاره د تړون منل اړين دي $(^NameDA) که چېرې تړون توکي منئ، زه منم ټک وهئ چې مخکښې ولاړ شئ. د" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX ".لګولو لپاره د تړون منل اړين دي $(^NameDA) که چېرې د تړون توکي منئ، نو لاندې خوښبکس ټک وهئ. د $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS ".لګولو لپاره د تړون منل اړين دي $(^NameDA) که چېرې د تړون توکي منئ، نو لاندې لمړی غوراوی ټک وهئ. د $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "منښتليک تړون" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE ".نالګولو نه مخکښې د منښتليک توکي وګورﺉ $(^NameDA) د" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) که چېرې د تړون توکي منئ، زه منم ټک وهئ چې مخکښې ولاړ شئ. د" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) که چېرې د تړون توکي منئ، نو لاندې خوښبکس ټک وهئ. د $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS ".نالګولو لپاره د تړون منل اړين دي $(^NameDA) که چېرې د تړون توکي منئ، نو لاندې لمړی غوراوی ټک وهئ. د $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP ".د تړون د نورې برخې کتلو لپاره پېج ډاون کيلۍ ووهئ" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "رغتوکي خوښ کړﺉ" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE ".کومې ځانګړتياوې چې لګول غواړﺉ، خوښ يې کړﺉ $(^NameDA) د" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "رغتوکي خوښ کړﺉ" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE ".کومې ځانګړتياوې چې نالګول غواړﺉ، خوښ يې کړﺉ $(^NameDA) د" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "سپړاوي" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO ".د رغتوکي سپړاوي کتلو لپاره موږک د هغې دپاسه ودروﺉ" + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "لګاو ځای وټاکئ" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE ".لګول غواړﺉ ويې ټاکئ $(^NameDA) په کومه پوښۍ کښې چې" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "نالګاو ځای وټاکئ" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE ".نالګول غواړﺉ ويې ټاکئ $(^NameDA) د کومې پوښۍ نه چې" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "لګيږي" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE ".په بشپړه توګه ولګول شي $(^NameDA) مهرباني وکړﺉ لږه تمه وکړﺉ ترڅو" + ${LangFileString} MUI_TEXT_FINISH_TITLE "لګونه بشپړه شوه" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE ".امسته په برياليتوب سرته ورسېده" + ${LangFileString} MUI_TEXT_ABORT_TITLE "لګونه بنده شوه" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE ".امسته په برياليتوب سرته ونه رسېده" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "نالګيږي" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE ".په بشپړه توګه ونالګول شي $(^NameDA) مهرباني وکړﺉ لږه تمه وکړﺉ ترڅو" + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "نالګونه بشپړه شوه" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE ".نالګاو په برياليتوب سرته ورسېدو" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "نالګونه بنده شوه" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE ".نالګاو په برياليتوب سرته ونه رسېدو" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "امسته اسانګر بشپړيږي $(^NameDA) د" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT ".ستاسې په کمپيوټر کښې ولګول شو $(^NameDA)$\r$\n$\r$\nد دې اسانګر د بندولو لپاره پای ته ټک ورکړﺉ" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "لګاو بشپړولو لپاره ستاسې کمپيوټر بياپېلات ته اړتيا لري. ايا اوس بياپېلون کول غواړﺉ؟ $(^NameDA) د" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "نالګاو اسانګر بشپړيږي $(^NameDA) د" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT ".ستاسې له کمپيوټر نه ونالګول شو $(^NameDA)$\r$\n$\r$\nد دې اسانګر د بندولو لپاره پای ته ټک ورکړﺉ" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT " نالګاو بشپړولو لپاره ستاسې کمپيوټر بياپېلات ته اړتيا لري. ايا اوس بياپېلون کول غواړﺉ؟ $(^NameDA) د" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "سمدستي بياپېلون" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "وروسته زه پخپله بياپېلون کول غواړم" + ${LangFileString} MUI_TEXT_FINISH_RUN "&پرانيستل $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ماولوله ښودل" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&پای" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "پېل غورنۍ پوښۍ خوښه کړﺉ" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "د لنډلارو لپاره يو پېل غورنۍ پوښۍ خوښه کړﺉ $(^NameDA) د" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP ".د پېل غورنۍ هغه پوښۍ چې د ساوتري لنډلاري پکښې جوړول غواړﺉ خوښه کړﺉ. نوې پوښۍ جوړولو لپاره نوم هم ليکلی شئ" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "لنډلاري مه جوړوه" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "نالګول $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE ".د خپل کمپيوټر نه ړنګول $(^NameDA)" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "امسته بندول غواړﺉ؟ $(^Name) ايا په ډاډمنه توګه د" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "نالګاو بندول غواړﺉ؟ $(^Name) ايا په ډاډمنه توګه د" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nlf new file mode 100644 index 0000000000..1a34dcb7cd --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nlf @@ -0,0 +1,195 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1045 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Piotr Murawski & Rafał Lampe +# Updated by cube and SYSTEMsoft Group +# Corrected by Marek Stępień - http://www.aviary.pl +# Corrected by Mateusz Gola (aka Prozac) - http://www.avirecomp.com +# Updated by Paweł Porwisz (http://www.pawelporwisz.pl) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalator $(^Name) +# ^UninstallCaption +Deinstalator $(^Name) +# ^LicenseSubCaption +: Umowa licencyjna +# ^ComponentsSubCaption +: Opcje instalacji +# ^DirSubCaption +: Folder instalacyjny +# ^InstallingSubCaption +: Instalowanie plików +# ^CompletedSubCaption +: Zakończono +# ^UnComponentsSubCaption +: Opcje deinstalacji +# ^UnDirSubCaption +: Folder deinstalacyjny +# ^ConfirmSubCaption +: Potwierdzenie +# ^UnDirSubCaption +: Deinstalowanie plików +# ^UnCompletedSubCaption +: Zakończono +# ^BackBtn +< &Wstecz +# ^NextBtn +&Dalej > +# ^AgreeBtn +&Zgadzam się +# ^AcceptBtn +&Akceptuję warunki umowy licencyjnej +# ^DontAcceptBtn +&Nie akceptuję warunków umowy licencyjnej +# ^InstallBtn +&Zainstaluj +# ^UninstallBtn +&Odinstaluj +# ^CancelBtn +Anuluj +# ^CloseBtn +&Zamknij +# ^BrowseBtn +&Przeglądaj... +# ^ShowDetailsBtn +Pokaż &szczegóły +# ^ClickNext +Kliknij przycisk 'Dalej', aby kontynuować. +# ^ClickInstall +Kliknij przycisk 'Zainstaluj', aby rozpocząć instalację. +# ^ClickUninstall +Kliknij przycisk 'Odinstaluj', aby rozpocząć deinstalację. +# ^Name +Nazwa +# ^Completed +Zakończono +# ^LicenseText +Przed instalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, kliknij przycisk 'Zgadzam się'. +# ^LicenseTextCB +Przed instalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, kliknij poniższe pole wyboru. $_CLICK. +# ^LicenseTextRB +Przed instalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, wybierz pierwszą z poniższych opcji. $_CLICK. +# ^UnLicenseText +Przed deinstalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, kliknij przycisk 'Zgadzam się'. +# ^UnLicenseTextCB +Przed deinstalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, kliknij poniższe pole wyboru. $_CLICK. +# ^UnLicenseTextRB +Przed deinstalacją $(^NameDA) zapoznaj się z warunkami licencji. Jeśli akceptujesz wszystkie warunki umowy, wybierz pierwszą z poniższych opcji. $_CLICK. +# ^Custom +Użytkownika +# ^ComponentsText +Zaznacz komponenty, które chcesz zainstalować i odznacz te, których nie chcesz instalować. $_CLICK +# ^ComponentsSubText1 +Wybierz typ instalacji: +# ^ComponentsSubText2_NoInstTypes +Wybierz komponenty do zainstalowania: +# ^ComponentsSubText2 +Albo wybierz opcjonalne komponenty, które chcesz zainstalować: +# ^UnComponentsText +Zaznacz komponenty, które chcesz odinstalować i odznacz te, które nie zostaną odinstalowane. $_CLICK +# ^UnComponentsSubText1 +Wybierz typ deinstalacji: +# ^UnComponentsSubText2_NoInstTypes +Wybierz komponenty do odinstalowania: +# ^UnComponentsSubText2 +Albo wybierz opcjonalne komponenty, które chcesz odinstalować: +# ^DirText +Instalator zainstaluje $(^NameDA) w podanym poniżej folderze docelowym (możesz także kliknąć przycisk 'Przeglądaj...' i wybrać inny folder). $_CLICK +# ^DirSubText +Folder docelowy +# ^DirBrowseText +Wybierz folder instalacyjny $(^NameDA): +# ^UnDirText +Deinstalator usunie $(^NameDA) z następującego folderu. Aby odinstalować z innego folderu, kliknij przycisk 'Przeglądaj...' i wybierz folder. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Wybierz folder, z którego zostanie odinstalowany $(^NameDA): +# ^SpaceAvailable +"Dostępne miejsce: " +# ^SpaceRequired +"Wymagane miejsce: " +# ^UninstallingText +Ten kreator odinstaluje $(^NameDA) z Twojego komputera. $_CLICK +# ^UninstallingSubText +Deinstalacja z: +# ^FileError +Błąd otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz 'Anuluj', aby przerwać instalację,\r\n'Ponów', aby ponowić zapis do pliku lub\r\n'Ignoruj', aby pominąć ten plik. +# ^FileError_NoIgnore +Błąd otwarcia pliku do zapisu: \r\n\r\n$0\r\n\r\nWybierz 'Ponów', aby ponowić zapis do pliku lub\r\n'Anuluj', aby przerwać instalację. +# ^CantWrite +"Nie można zapisać: " +# ^CopyFailed +Błąd kopiowania +# ^CopyTo +"Kopiuj do " +# ^Registering +"Rejestrowanie: " +# ^Unregistering +"Wyrejestrowywanie: " +# ^SymbolNotFound +"Nie można odnaleźć symbolu: " +# ^CouldNotLoad +"Nie można wczytać: " +#^CreateFolder +"Utwórz folder: " +# ^CreateShortcut +"Utwórz skrót: " +# ^CreatedUninstaller +"Utworzono deinstalator: " +# ^Delete +"Usuń plik: " +# ^DeleteOnReboot +"Usuń przy ponownym uruchomieniu: " +# ^ErrorCreatingShortcut +"Błąd tworzenia skrótu: " +# ^ErrorCreating +"Błąd tworzenia: " +# ^ErrorDecompressing +Błąd wyodrębniania danych! Uszkodzony instalator? +# ^ErrorRegistering +Błąd rejestracji pliku DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Uruchom: " +# ^Extract +"Wyodrębnij: " +# ^ErrorWriting +"Wyodrębnij: błąd zapisu do pliku " +# ^InvalidOpcode +Instalator uszkodzony: nieprawidłowy kod operacji +# ^NoOLE +"Brak OLE dla: " +# ^OutputFolder +"Folder wyjściowy: " +# ^RemoveFolder +"Usuń folder: " +# ^RenameOnReboot +"Zmień nazwę przy ponownym uruchomieniu: " +# ^Rename +"Zmień nazwę: " +# ^Skipped +"Pominięte: " +# ^CopyDetails +Kopiuj szczegóły do schowka +# ^LogInstall +Rejestruj przebieg instalacji +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nsh new file mode 100644 index 0000000000..59987a8435 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Polish.nsh @@ -0,0 +1,132 @@ +;Language: Polish (1045) +;By Piotr Murawski & Rafał Lampe +;Updated by cube and SYSTEMsoft Group +;Updated by Mateusz Gola (aka Prozac) - http://www.avirecomp.com +;Updated by Paweł Porwisz (http://www.pawelporwisz.pl) + +!insertmacro LANGFILE "Polish" = "Polski" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Witamy w kreatorze instalacji $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Kreator ten pomoże Ci zainstalować $(^NameDA).$\r$\n$\r$\nZalecane jest zamknięcie wszystkich uruchomionych programów przed rozpoczęciem instalacji. Pozwoli to na uaktualnienie niezbędnych plików systemowych bez konieczności ponownego uruchamiania komputera.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Witamy w kreatorze deinstalacji $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Kreator ten pomoże Ci odinstalować $(^NameDA).$\r$\n$\r$\nPrzed rozpoczęciem deinstalacji, upewnij się, że $(^NameDA) nie jest uruchomiony.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Umowa licencyjna" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Przed instalacją $(^NameDA) zapoznaj się z warunkami licencji." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Jeżeli akceptujesz warunki umowy, kliknij przycisk 'Zgadzam się', aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jeżeli akceptujesz warunki umowy, zaznacz poniższe pole wyboru, aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jeżeli akceptujesz warunki umowy, wybierz pierwszą z poniższych opcji, aby kontynuować. Musisz zaakceptować warunki umowy, aby zainstalować $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Umowa licencyjna" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Przed deinstalacją $(^NameDA) zapoznaj się z warunkami licencji." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Jeżeli akceptujesz warunki umowy, kliknij przycisk 'Zgadzam się', aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Jeżeli akceptujesz warunki umowy, zaznacz poniższe pole wyboru, aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Jeżeli akceptujesz warunki umowy, wybierz pierwszą z poniższych opcji, aby kontynuować. Musisz zaakceptować warunki umowy, aby odinstalować $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Naciśnij klawisz Page Down, aby zobaczyć dalszą część umowy." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Wybierz komponenty" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Wybierz komponenty $(^NameDA), które chcesz zainstalować." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Wybierz komponenty" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Wybierz, które elementy $(^NameDA) chcesz odinstalować." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Przesuń kursor myszy nad komponent, aby zobaczyć jego opis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Wybierz komponent, aby zobaczyć jego opis." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Wybierz lokalizację dla instalacji" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Wybierz folder, w którym chcesz zainstalować $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Wybierz lokalizację dla deinstalacji" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Wybierz folder, z którego chcesz odinstalować $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacja" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Proszę czekać, trwa instalacja $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Zakończono instalację" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacja zakończona pomyślnie." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalacja przerwana" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacja nie została zakończona pomyślnie." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacja" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Proszę czekać, trwa deinstalacja $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Zakończono deinstalację" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinstalowanie zakończone pomyślnie." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Deinstalacja przerwana" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacja nie została zakończona pomyślnie." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Kończenie pracy kreatora instalacji $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) został pomyślnie zainstalowany na Twoim komputerze.$\r$\n$\r$\nKliknij przycisk 'Zakończ', aby zakończyć działanie instalatora." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Twój komputer musi zostać ponownie uruchomiony, aby zakończyć instalację $(^NameDA). Czy chcesz teraz ponownie uruchomić komputer?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Kończenie pracy kreatora deinstalacji $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) został odinstalowany z Twojego komputera.$\r$\n$\r$\nKliknij przycisk 'Zakończ', aby zakończyć działanie deinstalatora." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Twój komputer musi zostać ponownie uruchomiony w celu zakończenia deinstalacji $(^NameDA). Czy chcesz teraz ponownie uruchomić komputer?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Uruchom ponownie teraz" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Sam uruchomię ponownie komputer później" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Uruchom $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Pokaż plik ReadMe" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Zakończ" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Wybierz folder w menu Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Wybierz folder menu Start, w którym zostaną umieszczone skróty do $(^NameDA)" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Wybierz folder w menu Start, w którym chciałbyś umieścić skróty do programu. Możesz także utworzyć nowy folder wpisując jego nazwę." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nie twórz skrótów" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinstaluj $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Usuń $(^NameDA) z Twojego komputera." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Czy na pewno chcesz zakończyć działanie instalatora $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Czy na pewno chcesz przerwać proces deinstalacji $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Wybierz użytkowników" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Wybierz, dla których użytkowników chcesz zainstalować $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Wybierz, czy chcesz zainstalować $(^NameDA) tylko dla siebie, czy dla wszystkich użytkowników tego komputera. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Zainstaluj dla wszystkich użytkowników tego komputera" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Zainstaluj tylko dla mnie" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nlf new file mode 100644 index 0000000000..c51d85eef1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +2070 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation v4.0.3 by DragonSoull with help from Dre` - Updated by Ramon +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalação de $(^Name) +# ^UninstallCaption +Desinstalação de $(^Name) +# ^LicenseSubCaption +: Contrato de Licença +# ^ComponentsSubCaption +: Opções de instalação +# ^DirSubCaption +: Diretório de instalação +# ^InstallingSubCaption +: Instalando Ficheiros +# ^CompletedSubCaption +: Concluído +# ^UnComponentsSubCaption +: Opções de Desinstalação +# ^UnDirSubCaption +: Pasta de Desinstalação +# ^ConfirmSubCaption +: Confirmação +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Concluído +# ^BackBtn +< &Anterior +# ^NextBtn +&Seguinte > +# ^AgreeBtn +&Aceito +# ^AcceptBtn +Eu &aceito os termos do Contrato de Licença +# ^DontAcceptBtn +Eu &não aceito os termos do Contrato de Licença +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Cancelar +# ^CloseBtn +&Fechar +# ^BrowseBtn +&Procurar... +# ^ShowDetailsBtn +Ver &Detalhes +# ^ClickNext +Clique em 'Seguinte' para continuar. +# ^ClickInstall +Clique em 'Instalar' para iniciar a instalação. +# ^ClickUninstall +Clique em 'Desinstalar' para iniciar a desinstalação. +# ^Name +Nome +# ^Completed +Concluído +# ^LicenseText +Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, clique em 'Aceito'. +# ^LicenseTextCB +Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, clique na caixa de seleção abaixo. $_CLICK +# ^LicenseTextRB +Por favor reveja o acordo de licença antes de instalar $(^NameDA). Se concorda com todos os termos da licença, escolha a primeira opção abaixo. $_CLICK +# ^UnLicenseText +Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, clique em 'Aceito'. +# ^UnLicenseTextCB +Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, clique na caixa de seleção abaixo. $_CLICK +# ^UnLicenseTextRB +Por favor reveja o acordo de licença antes de desinstalar $(^NameDA). Se concorda com todos os termos da licença, escolha a primeira opção abaixo. $_CLICK +# ^Custom +Personalizado +# ^ComponentsText +Marque os componentes que deseja instalar e desmarque os componentes que não deseja instalar. $_CLICK +# ^ComponentsSubText1 +Escolha o tipo de instalação: +# ^ComponentsSubText2_NoInstTypes +Escolha os componentes para instalar: +# ^ComponentsSubText2 +Ou, escolha os componentes opcionais que deseja instalar: +# ^UnComponentsText +Marque os componentes que queira desinstalar e vice versa. $_CLICK +# ^UnComponentsSubText1 +Escolha o tipo de desinstalação: +# ^UnComponentsSubText2_NoInstTypes +Escolha os componentes para desinstalar: +# ^UnComponentsSubText2 +Ou, escolha os componentes opcionais que queira desinstalar: +# ^DirText +O $(^NameDA) será instalado na seguinte pasta. Para instalar numa pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK +# ^DirSubText +Pasta de Destino +# ^DirBrowseText +Escolha uma pasta para instalar o $(^NameDA): +# ^UnDirText +O $(^NameDA) será desinstalado da seguinte pasta. Para desinstalar de uma pasta diferente, clique em 'Procurar...' e escolha outra pasta. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Escolha uma pasta de onde será desinstalado o $(^NameDA): +# ^SpaceAvailable +"Espaço disponível: " +# ^SpaceRequired +"Espaço necessário: " +# ^UninstallingText +$(^NameDA) será desinstalado da seguinte pasta. $_CLICK +# ^UninstallingSubText +Desinstalando de: +# ^FileError +Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Abortar para abortar a instalação,\r\nRepetir para tentar novamente a escrita do ficheiro, ou\r\nIgnorar para ignorar este ficheiro. +# ^FileError_NoIgnore +Erro ao abrir ficheiro para escrita: \r\n\t"$0"\r\nClique em Repetir para tentar novamente a gravação do ficheiro, ou\r\nCancelar para abortar a instalação. +# ^CantWrite +"Não foi possível escrever: " +# ^CopyFailed +Falha ao copiar +# ^CopyTo +"Copiar para " +# ^Registering +"Registando: " +# ^Unregistering +"Desregistando: " +# ^SymbolNotFound +"Símbolo não encontrado: " +# ^CouldNotLoad +"Não foi possível carregar: " +# ^CreateFolder +"Criando diretório: " +# ^CreateShortcut +"Criando atalho: " +# ^CreatedUninstaller +"Criando desinstalador: " +# ^Delete +"Apagando ficheiro: " +# ^DeleteOnReboot +"Apagar ao reiniciar: " +# ^ErrorCreatingShortcut +"Erro ao criar atalho: " +# ^ErrorCreating +"Erro ao criar: " +# ^ErrorDecompressing +Erro ao descomprimir dados! Instalador corrompido? +# ^ErrorRegistering +Erro ao registar DLL +# ^ExecShell +"Executando pelo Shell: " +# ^Exec +"Executando: " +# ^Extract +"Extraindo: " +# ^ErrorWriting +"Extraindo: erro ao escrever ficheiro " +# ^InvalidOpcode +Instalador corrompido: código de operação inválido +# ^NoOLE +"Sem OLE para: " +# ^OutputFolder +"Pasta de destino: " +# ^RemoveFolder +"Removendo pasta: " +# ^RenameOnReboot +"Renomear ao reiniciar: " +# ^Rename +"Renomeando: " +# ^Skipped +"Ignorado: " +# ^CopyDetails +Copiar detalhes para a Área de Transfêrencia +# ^LogInstall +Registar processo de instalação +# ^Byte +B +# kilo + K +# mega + M +# giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nsh new file mode 100644 index 0000000000..46336888fb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Portuguese.nsh @@ -0,0 +1,129 @@ +;Language: Portuguese (2070) +;By Ramon + +!insertmacro LANGFILE "Portuguese" = "Português" "Portugues" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de Instalação do $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que feche todas as outras aplicações antes de iniciar a Instalação. Isto permitirá que o Instalador actualize ficheiros relacionados com o sistema sem necessidade de reiniciar o computador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem vindo ao Assistente de desinstalação do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente ajudá-lo-á durante a desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação, certifique-se de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contrato de Licença" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para instalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para instalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contrato de Licença" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor, verifique os termos da licença antes de desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se aceitar os termos da licença, clique em 'Aceito' para continuar. Deverá aceitar o contrato para desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se aceitar os termos da licença, clique na caixa de seleção abaixo. Deverá aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se aceitar os termos da licença, selecione a primeira opção abaixo. Você deve aceitar o contrato para desinstalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tecle Page Down para ver o restante da licença." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolha de Componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja instalar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais as características do $(^NameDA) que deseja desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione o rato sobre um componente para ver a sua descrição." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione um componente para ver a sua descrição." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolha do Local da Instalação" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual deseja instalar o $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolha o Local de desinstalação" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta de onde pretende desinstalar o $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo instalado." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalação foi concluída com sucesso." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalação não foi concluída com sucesso." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor, aguarde enquanto o $(^NameDA) está sendo desinstalado." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi concluída com sucesso." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi concluída com sucesso" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Concluindo o Assistente de Instalação do $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a instalação do $(^NameDA). Deseja reiniciar agora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Concluíndo o assistente de desisntalação do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) foi removido do seu computador.$\r$\n$\r$\nClique em Terminar para fechar este assistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "O seu computador deve ser reiniciado para concluír a desinstalação do $(^NameDA). Deseja reiniciar agora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar Agora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quero reiniciar manualmente depois" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Leiame" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolha uma Pasta do Menu Iniciar" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolha uma pasta do Menu Iniciar para os atalhos do programa." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione uma pasta do Menu Iniciar em que deseja criar os atalhos do programa. Você pode também digitar um nome para criar uma nova pasta. " + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Deseja realmente cancelar a instalação do $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Deseja realmente cancelar a desinstalação do $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escolha utilizadores" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escolha para quais utilizadores deseja instalar o $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Escolha se deseja instalar o $(^NameDA) apenas para si ou para todos os utilizadores. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalar para todos os utilizadores" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalar apenas para si" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nlf new file mode 100644 index 0000000000..8cc4c32b31 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1046 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Diego Pedroso and Felipe, reviewed by Georger Araújo +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalação do $(^Name) +# ^UninstallCaption +Desinstalação do $(^Name) +# ^LicenseSubCaption +: Acordo de Licença +# ^ComponentsSubCaption +: Opções da Instalação +# ^DirSubCaption +: Pasta da Instalação +# ^InstallingSubCaption +: Instalando +# ^CompletedSubCaption +: Completado +# ^UnComponentsSubCaption +: Opções da Desinstalação +# ^UnDirSubCaption +: Pasta da Desinstalação +# ^ConfirmSubCaption +: Confirmação +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Completado +# ^BackBtn +< &Voltar +# ^NextBtn +&Próximo > +# ^AgreeBtn +Eu &Concordo +# ^AcceptBtn +Eu &aceito os termos do Acordo de Licença +# ^DontAcceptBtn +Eu &não aceito os termos do Acordo de Licença +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Cancelar +# ^CloseBtn +&Fechar +# ^BrowseBtn +P&rocurar... +# ^ShowDetailsBtn +Mostrar &detalhes +# ^ClickNext +Clique em Próximo pra continuar. +# ^ClickInstall +Clique em Instalar pra iniciar a instalação. +# ^ClickUninstall +Clique em Desinstalar pra iniciar a desinstalação. +# ^Name +Nome +# ^Completed +Completado +# ^LicenseText +Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo clique em Eu Concordo. +# ^LicenseTextCB +Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo clique na caixa de seleção abaixo. $_CLICK +# ^LicenseTextRB +Por favor reveja o acordo de licença antes de instalar o $(^NameDA). Se você aceita todos os termos do acordo selecione a primeira opção abaixo. $_CLICK +# ^UnLicenseText +Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo clique em Eu Concordo. +# ^UnLicenseTextCB +Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo clique na caixa de seleção abaixo. $_CLICK +# ^UnLicenseTextRB +Por favor reveja o acordo de licença antes de desinstalar o $(^NameDA). Se você aceita todos os termos do acordo selecione a primeira opção abaixo. $_CLICK +# ^Custom +Personalizar +# ^ComponentsText +Marque os componentes que você quer instalar e desmarque os componentes que você não quer instalar. $_CLICK +# ^ComponentsSubText1 +Selecione o tipo de instalação: +# ^ComponentsSubText2_NoInstTypes +Selecione os componentes a instalar: +# ^ComponentsSubText2 +Ou selecione os componentes opcionais que você deseja instalar: +# ^UnComponentsText +Marque os componentes que você quer desinstalar e desmarque os componentes que você não quer desinstalar. $_CLICK +# ^UnComponentsSubText1 +Selecione o tipo de desinstalação: +# ^UnComponentsSubText2_NoInstTypes +Selecione os componentes a desinstalar: +# ^UnComponentsSubText2 +Ou selecione os componentes opcionais que você deseja desinstalar: +# ^DirText +O Instalador instalará o $(^NameDA) na seguinte pasta. Pra instalar em uma pasta diferente clique em Procurar e selecione outra pasta. $_CLICK +# ^DirSubText +Pasta Destino +# ^DirBrowseText +Selecione a pasta pra instalar o $(^NameDA): +# ^UnDirText +O Instalador desinstalará o $(^NameDA) da seguinte pasta. Pra desinstalar de uma pasta diferente clique em Procurar e selecione outra pasta. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Selecione a pasta pra desinstalar o $(^NameDA): +# ^SpaceAvailable +"Espaço disponível: " +# ^SpaceRequired +"Espaço requerido: " +# ^UninstallingText +O $(^NameDA) será desinstalado da seguinte pasta. $_CLICK +# ^UninstallingSubText +Desinstalando de: +# ^FileError +Erro ao abrir o arquivo pra gravação: \r\n\r\n$0\r\n\r\nClique em Abortar pra parar a instalação,\r\nRepetir pra tentar de novo ou em\r\nIgnorar pra ignorar este arquivo. +# ^FileError_NoIgnore +Erro ao abrir o arquivo pra gravação: \r\n\r\n$0\r\n\r\nClique em Repetir pra tentar de novo ou em\r\nCancelar pra parar a instalação. +# ^CantWrite +"Não pôde gravar: " +# ^CopyFailed +Falhou em copiar +# ^CopyTo +"Copiar para " +# ^Registering +"Registrando: " +# ^Unregistering +"Desfazendo o registro: " +# ^SymbolNotFound +"Não pôde achar o símbolo: " +# ^CouldNotLoad +"Não pôde carregar: " +# ^CreateFolder +"Criar pasta: " +# ^CreateShortcut +"Criar atalho: " +# ^CreatedUninstaller +"Desinstalador criado: " +# ^Delete +"Apagar o arquivo: " +# ^DeleteOnReboot +"Apagar ao reiniciar: " +# ^ErrorCreatingShortcut +"Erro ao criar o atalho: " +# ^ErrorCreating +"Erro ao criar: " +# ^ErrorDecompressing +Erro ao descomprimir os dados! Instalador corrompido? +# ^ErrorRegistering +Erro ao registar a DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Executar: " +# ^Extract +"Extrair: " +# ^ErrorWriting +"Extrair: erro ao gravar no arquivo " +# ^InvalidOpcode +Instalador corrompido: opcode inválido +# ^NoOLE +"Sem OLE para: " +# ^OutputFolder +"Pasta de saída: " +# ^RemoveFolder +"Remover a pasta: " +# ^RenameOnReboot +"Renomear ao reiniciar: " +# ^Rename +"Renomear: " +# ^Skipped +"Ignorado: " +# ^CopyDetails +Copiar os Detalhes pra Área de Transferência +# ^LogInstall +Gravar no log o processo de instalação +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nsh new file mode 100644 index 0000000000..ba5bcf230a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/PortugueseBR.nsh @@ -0,0 +1,129 @@ +;Language: Brazilian Portuguese (1046) +;By Diego Pedroso and Felipe + +!insertmacro LANGFILE "PortugueseBR" "Brazilian Portuguese" "Português Brasileiro" "Portugues Brasileiro" ; Veja \Include\LangFile.nsh pra uma descriçaõ destes parâmetros + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bem-vindo ao Instalador do $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "O instalador guiará você através da instalação do $(^NameDA).$\r$\n$\r$\nÉ recomendado que você feche todos os outros aplicativos antes de iniciar o instalador. Isto tornará possível atualizar os arquivos de sistema relevantes sem ter que reiniciar seu computador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bem-vindo ao Desinstalador do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este assistente guiará você através da desinstalação do $(^NameDA).$\r$\n$\r$\nAntes de iniciar a desinstalação tenha certeza de que o $(^NameDA) não está em execução.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acordo de Licença" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor reveja os termos da licença antes de instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo clique em Eu Concordo pra continuar. Você deve aceitar o acordo pra instalar o $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo clique na caixa de seleção abaixo. Você deve aceitar o acordo pra instalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo selecione a primeira opção abaixo. Você deve aceitar o acordo pra instalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acordo de Licença" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor reveja os termos da licença antes de desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Se você aceita os termos do acordo clique em Eu Concordo pra continuar. Você deve aceitar o acordo pra desinstalar o $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Se você aceita os termos do acordo clique na caixa de seleção abaixo. Você deve aceitar o acordo pra desinstalar o $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Se você aceita os termos do acordo selecione a primeira opção abaixo. Você deve aceitar o acordo pra desinstalar o $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pressione Page Down pra ver o resto do acordo." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Escolher Componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer instalar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Escolher Componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Escolha quais funções do $(^NameDA) você quer desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descrição" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Posicione seu mouse sobre um componente pra ver a descrição dele." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selecione um componente pra ver a descrição dele." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Escolha o Local da Instalação" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Escolha a pasta na qual instalar o $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Escolha o Local da Desinstalação" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Escolha a pasta da qual desinstalar o $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo instalado." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalação Completa" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "A instalação foi completada com sucesso." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalação Abortada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "A instalação não foi completada com sucesso." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere enquanto o $(^NameDA) está sendo desinstalado." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalação Completa" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "A desinstalação foi completada com sucesso." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalação Abortada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "A desinstalação não foi completada com sucesso." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando a instalação do $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "O $(^NameDA) foi instalado no seu computador.$\r$\n$\r$\nClique em Concluir pra fechar o instalador." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Seu computador deve ser reiniciado a fim de completar a instalação do $(^NameDA). Você quer reiniciar agora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando a desinstalação do $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "O $(^NameDA) foi desinstalado do seu computador.$\r$\n$\r$\nClique em Concluir pra fechar o instalador." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Seu computador deve ser reiniciado a fim de completar a desinstalação do $(^NameDA). Você quer reiniciar agora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar agora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Eu quero reiniciar manualmente mais tarde" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Executar o $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar o Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Concluir" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Escolha a Pasta do Menu Iniciar" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Escolha uma pasta do Menu Iniciar para os atalhos do $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selecione a pasta do Menu Iniciar na qual você gostaria de criar os atalhos do programa. Você pode também inserir um nome pra criar uma nova pasta." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Não criar atalhos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar o $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Remover o $(^NameDA) do seu computador." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Você tem certeza que você quer sair da Instalação do $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Você tem certeza que você quer sair da Desinstalação do $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Escolher Usuários" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Escolha pra quais usuários você quer instalar o $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Selecione se você quer instalar o $(^NameDA) só pra si mesmo ou pra todos os usuários deste computador. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instalar pra qualquer um usando este computador" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalar apenas pra mim" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nlf new file mode 100644 index 0000000000..545e0a8b35 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nlf @@ -0,0 +1,202 @@ +# Header, don't edit +NLF v6 +# Language ID +1048 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Cristian Pirvu (pcristip@yahoo.com) v6 +# Revision by Sorin Sbarnea (sorin@intersol.ro) v5.1 +# and Sorin Sbarnea INTERSOL SRL (sorin@intersol.ro) v4 +# New revision by George Radu (georadu@hotmail.com) +# New revision by Iulian Dogariu (iulian@jayomega.net) +# - Use Romanian letters ăâîşţ +# - Use imperative forms on buttons +# - Replace some neologisms +# New revision by Vlad Rusu (vlad@bitattack.ro) +# - "Rasfoieşte" replaced with "Alege" - more appropriate +# - "Elimină" related terms replaced with more appropriate "Dezinstalează" +# - Fixed: Wrong translation in ^FileError and ^FileError_NoIgnore -> no translation +# needed Abort/Retry/Ignore, as these are not translated into local language, OS related +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalare $(^Name) +# ^UninstallCaption +Dezinstalare $(^Name) +# ^LicenseSubCaption +: Contract de licenţă +# ^ComponentsSubCaption +: Opţiuni instalare +# ^DirSubCaption +: Directorul destinaţie +# ^InstallingSubCaption +: În curs de instalare +# ^CompletedSubCaption +: Instalare terminată +# ^UnComponentsSubCaption +: Opţiuni dezinstalare +# ^UnDirSubCaption +: Directorul de dezinstalare +# ^ConfirmSubCaption +: Confirmă +# ^UninstallingSubCaption +: În curs de dezinstalare +# ^UnCompletedSubCaption +: Termină +# ^BackBtn +< Îna&poi +# ^NextBtn +Îna&inte > +# ^AgreeBtn +&De acord +# ^AcceptBtn +&Accept termenii contractului de licenţă +# ^DontAcceptBtn +Nu accept termenii contractului de licenţă +# ^InstallBtn +&Instalează +# ^UninstallBtn +&Dezinstalează +# ^CancelBtn +&Renunţă +# ^CloseBtn +În&chide +# ^BrowseBtn +&Alege... +# ^ShowDetailsBtn +Arată &detalii +# ^ClickNext +Apăsaţi Înainte pentru a continua. +# ^ClickInstall +Apăsaţi Instalează pentru a începe instalarea. +# ^ClickUninstall +Apăsaţi Dezinstalează pentru a începe dezinstalarea. +# ^Name +Nume +# ^Completed +Terminat +# ^LicenseText +Citiţi cu atenţie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, apăsaţi butonul De acord. +# ^LicenseTextCB +Citiţi cu atenţie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, bifaţi căsuţa de mai jos. $_CLICK +# ^LicenseTextRB +Citiţi cu atenţie contractul de licenţă înainte de a instala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, selectaţi prima opţiune de mai jos. $_CLICK +# ^UnLicenseText +Citiţi cu atenţie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, apăsaţi butonul De acord. +# ^UnLicenseTextCB +Citiţi cu atenţie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, bifaţi căsuţa de mai jos. $_CLICK +# ^UnLicenseTextRB +Citiţi cu atenţie contractul de licenţă înainte de a dezinstala $(^NameDA). Dacă acceptaţi termenii contractului de licenţă, selectaţi prima opţiune de mai jos. $_CLICK +# ^Custom +Personalizată +# ^ComponentsText +Alegeţi componentele pe care doriţi să le instalaţi. $_CLICK +# ^ComponentsSubText1 +Alegeţi tipul instalării: +# ^ComponentsSubText2_NoInstTypes +Alegeţi componentele ce urmează a fi instalate: +# ^ComponentsSubText2 +Sau, alegeţi componentele opţionale pe care doriţi să le instalaţi: +# ^UnComponentsText +Alegeţi componentele pe care doriţi să le dezinstalaţi. $_CLICK +# ^UnComponentsSubText1 +Alegeţi tipul de dezinstalare: +# ^UnComponentsSubText2_NoInstTypes +Alegeţi componentele ce urmează a fi dezinstalate: +# ^UnComponentsSubText2 +Sau, alegeţi componentele opţionale pe care doriţi să le dezinstalaţi: +# ^DirText +$(^NameDA) se va instala în următorul director. Pentru a alege altă destinaţie, apăsaţi Alege şi alegeţi alt director. $_CLICK +# ^DirSubText +Director destinaţie +# ^DirBrowseText +Alegeţi directorul în care doriţi să instalaţi $(^NameDA): +# ^UnDirText +$(^NameDA) se va dezinstala din următorul director. Pentru a dezinstala din alt director, apăsaţi Alege şi alegeţi alt director. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Alegeţi directorul de dezinstalare al $(^NameDA): +# ^SpaceAvailable +"Spaţiu disponibil: " +# ^SpaceRequired +"Spaţiu necesar: " +# ^UninstallingText +Această aplicaţie va dezinstala $(^NameDA) din computerul Dv. $_CLICK +# ^UninstallingSubText +Dezinstalare din: +# ^FileError +Eroare la scrierea fişierului: \r\n\t"$0"\r\nApăsaţi Abort pentru oprirea instalării,\r\nRetry pentru a mai încerca o dată scrierea fişierului, \r\nIgnore pentru a trece peste acest fişier. +# ^FileError_NoIgnore +Eroare la scrierea fişierului: \r\n\t"$0"\r\nApăsaţi Retry pentru a mai încerca o dată, sau\r\nAbort pentru oprirea instalării. +# ^CantWrite +"Nu am putut scrie: " +# ^CopyFailed +Copierea a eşuat +# ^CopyTo +"Copiere în " +# ^Registering +"Se înregistrează: " +# ^Unregistering +"Se dezînregistrează din registru: " +# ^SymbolNotFound +"Simbolul nu a fost găsit: " +# ^CouldNotLoad +"Nu am putut încărca: " +# ^CreateFolder +"Creare director: " +# ^CreateShortcut +"Creare comandă rapidă: " +# ^CreatedUninstaller +"S-a creat aplicaţia de dezinstalare: " +# ^Delete +"Ştergere fişier: " +# ^DeleteOnReboot +"Ştergere la repornire: " +# ^ErrorCreatingShortcut +"Eroare la crearea comenzii rapide: " +# ^ErrorCreating +"Eroare la creare: " +# ^ErrorDecompressing +Eroare la dezarhivarea datelor! Aplicatia de instalare este defectă? +# ^ErrorRegistering +Eroare la Înregistrarea DLL-ului +# ^ExecShell +"ExecShell: " +# ^Exec +"Executare: " +# ^Extract +"Extragere: " +# ^ErrorWriting +"Extragere: eroare la scriere în fişier " +# ^InvalidOpcode +Aplicaţie de instalare defectă: opcode incorect +# ^NoOLE +"Nu există OLE pentru: " +# ^OutputFolder +"Directorul destinaţie: " +# ^RemoveFolder +"Ştergere destinaţie: " +# ^RenameOnReboot +"Redenumire la repornirea computerului: " +# ^Rename +"Redenumire: " +# ^Skipped +"Sărite: " +# ^CopyDetails +Copiere detalii în clipboard +# ^LogInstall +Jurnal proces instalare +# ^Byte +O +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nsh new file mode 100644 index 0000000000..e98dd0c41c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Romanian.nsh @@ -0,0 +1,128 @@ +;Language: Romanian (1048) +;Translated by Cristian Pirvu (pcristip@yahoo.com) +;Updates by Sorin Sbarnea - INTERSOL SRL (sbarneasorin@intersol.ro) - ROBO Design (www.robodesign.ro) +;New revision by George Radu (georadu@hotmail.com) http://mediatae.3x.ro +;New revision by Vlad Rusu (vlad@bitattack.ro) +; - Use Romanian letters ăâîşţ +; - ".. produsului" removed as unnecessary +; - "Elimină" related terms replaced with more appropriate "Dezinstalează" +; - Misc language tweaks + +!insertmacro LANGFILE "Romanian" = "Română" "Romana" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bine aţi venit la instalarea $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Această aplicaţie va instala $(^NameDA).$\r$\n$\r$\nEste recomandat să închideţi toate aplicaţiile înainte de începerea procesului de instalare. Acest lucru vă poate asigura un proces de instalare fără erori sau situaţii neprevăzute.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bine aţi venit la dezinstalarea $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Această aplicaţie va dezinstala $(^NameDA).$\r$\n$\r$\nEste recomandat să închideţi toate aplicaţiile înainte de începerea procesului de dezinstalare. Acest lucru vă poate asigura un proces de dezinstalare fără erori sau situaţii neprevăzute.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Contract de licenţă" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Citiţi cu atenţie termenii contractului de licenţă înainte de a instala $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Dacă acceptaţi termenii contractului de licenţă, apăsati De Acord. Pentru a instala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacă acceptaţi termenii contractului de licenţă, bifaţi căsuţa de mai jos. Pentru a instala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacă acceptaţi termenii contractului de licenţă, selectaţi prima opţiune de mai jos. Pentru a instala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Contract de licenţă" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Citiţi cu atenţie termenii contractului de licenţă înainte de a dezinstala $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Dacă acceptaţi termenii contractului de licenţă, apăsati De Acord. Pentru a dezinstala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Dacă acceptaţi termenii contractului de licenţă, bifaţi căsuţa de mai jos. Pentru a dezinstala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Dacă acceptaţi termenii contractului de licenţă, selectaţi prima opţiune de mai jos. Pentru a dezinstala $(^NameDA) trebuie să acceptaţi termenii din contractul de licenţă. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Apăsaţi Page Down pentru a vizualiza restul contractului de licenţă." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selectare componente" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Selectaţi componentele $(^NameDA) pe care doriţi să le instalaţi." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selectare componente" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Selectaţi componentele $(^NameDA) pe care doriţi să le dezinstalaţi." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descriere" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Aşezaţi mouse-ul deasupra fiecărei componente pentru a vizualiza descrierea acesteia." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Selectare director destinaţie" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Selectaţi directorul în care doriţi să instalaţi $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Selectare director de dezinstalat" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Selectaţi directorul din care doriţi să dezinstalaţi $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "În curs de instalare" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vă rugăm să aşteptaţi, $(^NameDA) se instalează." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalare terminată" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalarea s-a terminat cu succes." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalare anulată" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalarea a fost anulată de utilizator." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "În curs de dezinstalare" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vă rugăm să aşteptaţi, $(^NameDA) se dezinstalează." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dezinstalare terminată" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dezinstalarea s-a terminat cu succes." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Dezinstalare anulată" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Dezinstalarea fost anulată de utilizator." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Terminare instalare $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) a fost instalat.$\r$\n$\r$\nApăsaţi Terminare pentru a încheia instalarea." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Trebuie să reporniţi calculatorul pentru a termina instalarea. Doriţi să-l reporniţi acum?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Terminare dezinstalare $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) a fost dezinstalat.$\r$\n$\r$\nApăsaţi Terminare pentru a încheia dezinstalarea." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Trebuie să reporniţi calculatorul pentru a termina dezinstalarea. Doriţi să-l reporniţi acum?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reporneşte acum" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Repornesc eu mai târziu" + ${LangFileString} MUI_TEXT_FINISH_RUN "Executare $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Afişare fişier readme (citeşte-mă)." + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminare" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Selectare grup Meniul Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Selectaţi un grup in Meniul Start pentru a crea comenzi rapide pentru produs." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Selectaţi grupul din Meniul Start în care vor fi create comenzi rapide pentru produs. Puteţi de asemenea să creaţi un grup nou." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nu doresc comenzi rapide" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dezinstalare $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Dezinstalare $(^NameDA) din calculatorul dumneavoastră." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Sunteţi sigur(ă) că doriţi să anulaţi instalarea $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sunteţi sigur(ă) că doriţi să anulaţi dezinstalarea $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nlf new file mode 100644 index 0000000000..87642fcb12 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nlf @@ -0,0 +1,192 @@ +# Header, don't edit +NLF v6 +# Language ID +1049 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Timon [ timon@front.ru ] + 20030919 +# Translation updated by Dmitry Yerokhin [erodim@mail.ru] (20050424) +# Minor updates by Oleksandr Gavenko (20100514 - patch #226) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Установка $(^Name) +# ^UninstallCaption +Удаление $(^Name) +# ^LicenseSubCaption +: Лицензионное соглашение +# ^ComponentsSubCaption +: Параметры установки +# ^DirSubCaption +: Папка установки +# ^InstallingSubCaption +: Копирование файлов +# ^CompletedSubCaption +: Операция завершена +# ^UnComponentsSubCaption +: Параметры удаления +# ^UnDirSubCaption +: Папка удаления +# ^ConfirmSubCaption +: Подтверждение +# ^UninstallingSubCaption +: Удаление файлов +# ^UnCompletedSubCaption +: Операция завершена +# ^BackBtn +< &Назад +# ^NextBtn +&Далее > +# ^AgreeBtn +Принима&ю +# ^AcceptBtn +Я &принимаю условия соглашения +# ^DontAcceptBtn +Я &не принимаю условия соглашения +# ^InstallBtn +&Установить +# ^UninstallBtn +Уд&алить +# ^CancelBtn +Отмена +# ^CloseBtn +&Закрыть +# ^BrowseBtn +О&бзор ... +# ^ShowDetailsBtn +&Детали... +# ^ClickNext +Нажмите кнопку "Далее" для продолжения. +# ^ClickInstall +Нажмите кнопку "Установить", чтобы установить программу. +# ^ClickUninstall +Нажмите кнопку "Удалить", чтобы удалить программу. +# ^Name +Имя +# ^Completed +Готово +# ^LicenseText +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, нажмите кнопку "Принимаю". +# ^LicenseTextCB +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, установите флажок ниже. $_CLICK +# ^LicenseTextRB +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, выберите первый вариант из предложенных ниже. $_CLICK +# ^UnLicenseText +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, нажмите кнопку "Принимаю". +# ^UnLicenseTextCB +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, установите флажок ниже. $_CLICK +# ^UnLicenseTextRB +Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением. Если вы принимаете условия соглашения, выберите первый вариант из предложенных ниже. $_CLICK +# ^Custom +По выбору +# ^ComponentsText +Выберите компоненты программы, которые вы хотите установить. $_CLICK +# ^ComponentsSubText1 +Выберите тип установки: +# ^ComponentsSubText2_NoInstTypes +Выберите компоненты программы для установки: +# ^ComponentsSubText2 +или выберите дополнительные компоненты для установки: +# ^UnComponentsText +Выберите компоненты, которые вы хотите удалить. $_CLICK +# ^UnComponentsSubText1 +Выберите тип удаления: +# ^UnComponentsSubText2_NoInstTypes +Выберите компоненты для удаления: +# ^UnComponentsSubText2 +или выберите дополнительные компоненты для удаления: +# ^DirText +Программа установит $(^NameDA) в указанную папку. Чтобы установить приложение в другую папку, нажмите кнопку "Обзор" и укажите ее. $_CLICK +# ^DirSubText +Папка установки +# ^DirBrowseText +Укажите папку для установки $(^NameDA): +# ^UnDirText +Программа удалит $(^NameDA) из указанной папки. Чтобы выполнить удаление из другой папки, нажмите кнопку "Обзор" и укажите ее. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Укажите папку, из которой нужно удалить $(^NameDA): +# ^SpaceAvailable +"Доступно на диске: " +# ^SpaceRequired +"Требуется на диске: " +# ^UninstallingText +Программа $(^NameDA) будет удалена из вашего ПК. $_CLICK +# ^UninstallingSubText +Удаление из: +# ^FileError +Невозможно открыть файл для записи: \r\n\t"$0"\r\n"Прервать": остановить установку;\r\n"Повтор": повторить попытку;\r\n"Пропуск": пропустить это действие. +# ^FileError_NoIgnore +Невозможно открыть файл для записи: \r\n\t"$0"\r\n"Повтор": повторить попытку;\r\n"Отмена": прервать процесс установки. +# ^CantWrite +"Невозможно записать: " +# ^CopyFailed +Ошибка при копировании +# ^CopyTo +"Копирование в " +# ^Registering +"Регистрация: " +# ^Unregistering +"Де-регистрация: " +# ^SymbolNotFound +"Невозможно найти символ: " +# ^CouldNotLoad +"Невозможно загрузить: " +# ^CreateFolder +"Создание папки: " +# ^CreateShortcut +"Создание ярлыка: " +# ^CreatedUninstaller +"Создание программы удаления: " +# ^Delete +"Удаление файла: " +# ^DeleteOnReboot +"Удаление при перезагрузке ПК: " +# ^ErrorCreatingShortcut +"Ошибка создания ярлыка: " +# ^ErrorCreating +"Ошибка создания: " +# ^ErrorDecompressing +Ошибка распаковки данных! Возможно, повреждён дистрибутив. +# ^ErrorRegistering +Невозможно зарегистрировать библиотеку (DLL) +# ^ExecShell +"Выполнение команды оболочки: " +# ^Exec +"Выполнение: " +# ^Extract +"Извлечение: " +# ^ErrorWriting +"Извлечение: ошибка записи файла " +# ^InvalidOpcode +Дистрибутив поврежден: недопустимый код +# ^NoOLE +"Нет OLE для: " +# ^OutputFolder +"Папка установки: " +# ^RemoveFolder +"Удаление папки: " +# ^RenameOnReboot +"Переименование при перезагрузке ПК: " +# ^Rename +"Переименование: " +# ^Skipped +"Пропуск: " +# ^CopyDetails +Копировать сведения в буфер обмена +# ^LogInstall +Вести отчет установки +# byte +байт +# kilo + К +# mega + М +# giga + Г \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nsh new file mode 100644 index 0000000000..e14a0da9c2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Russian.nsh @@ -0,0 +1,129 @@ +;Language: Russian (1049) +;Translation updated by Dmitry Yerokhin [erodim@mail.ru] (050424) + +!insertmacro LANGFILE "Russian" = "Русский" "Russkij" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Вас приветствует мастер установки $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Эта программа установит $(^NameDA) на ваш компьютер.$\r$\n$\r$\nПеред началом установки рекомендуется закрыть все работающие приложения. Это позволит программе установки обновить системные файлы без перезагрузки компьютера.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Вас приветствует мастер удаления $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Эта программа удалит $(^NameDA) из вашего компьютера.$\r$\n$\r$\nПеред началом удаления убедитесь, что программа $(^NameDA) не запущена.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензионное соглашение" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Если вы принимаете условия соглашения, нажмите кнопку $\"Принимаю$\". Чтобы установить программу, необходимо принять соглашение." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Если вы принимаете условия соглашения, установите флажок ниже. Чтобы установить программу, необходимо принять соглашение. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Если вы принимаете условия соглашения, выберите первый вариант из предложенных ниже. Чтобы установить программу, необходимо принять соглашение. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензионное соглашение" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Перед удалением $(^NameDA) ознакомьтесь с лицензионным соглашением." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Если вы принимаете условия соглашения, нажмите кнопку $\"Принимаю$\". Для удаления необходимо принять соглашение. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Если вы принимаете условия соглашения, установите флажок ниже. Для удаления необходимо принять соглашение. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Если вы принимаете условия соглашения, выберите первый вариант из предложенных ниже. Для удаления необходимо принять соглашение. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Для перемещения по тексту используйте клавиши $\"PageUp$\" и $\"PageDown$\"." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Компоненты устанавливаемой программы" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Выберите компоненты $(^NameDA), которые вы хотите установить." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Компоненты программы" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Выберите компоненты $(^NameDA), которые вы хотите удалить." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Описание" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Наведите курсор мыши на название компонента, чтобы прочесть его описание." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Выберите компонент, чтобы увидеть его описание." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Выбор папки установки" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Выберите папку для установки $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Выбор папки для удаления" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Укажите папку, из которой нужно удалить $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Копирование файлов" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Подождите, идет копирование файлов $(^NameDA)..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Установка завершена" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Установка успешно завершена." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Установка прервана" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Установка не завершена." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Удаление" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Подождите, идет удаление файлов $(^NameDA)..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Удаление завершено" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Удаление программы успешно завершено." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Удаление прервано" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Удаление произведено не полностью." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завершение работы мастера установки $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Установка $(^NameDA) выполнена.$\r$\n$\r$\nНажмите кнопку $\"Готово$\" для выхода из программы установки." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Для завершения установки $(^NameDA) необходимо перезагрузить компьютер. Хотите сделать это сейчас?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завершение работы мастера удаления $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Программа $(^NameDA) удалена из вашего компьютера.$\r$\n$\r$\nНажмите кнопку $\"Готово$\"для выхода из программы удаления." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Для завершения удаления $(^NameDA) нужно перезагрузить компьютер. Хотите сделать это сейчас?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Да, перезагрузить ПК сейчас" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Нет, я перезагружу ПК позже" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Запустить $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Показать файл ReadMe" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Готово" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Папка в меню $\"Пуск$\"" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Выберите папку в меню $\"Пуск$\" для размещения ярлыков программы." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Выберите папку в меню $\"Пуск$\", куда будут помещены ярлыки программы. Вы также можете ввести другое имя папки." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Не создавать ярлыки" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Удаление $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Удаление $(^NameDA) из компьютера." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Вы действительно хотите отменить установку $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Вы действительно хотите отменить удаление $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Режим установки" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Выберите, для каких пользователей вы хотите установить $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Выберите, будете ли вы устанавливать $(^NameDA) только для себя или для всех пользователей данного компьютера. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Установить для всех пользователей" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Установить только для текущего пользователя" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nlf new file mode 100644 index 0000000000..60c3aae96c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1169 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by GunChleoc +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +A’ stàladh $(^Name) +# ^UninstallCaption +A’ dì-stàladh $(^Name) +# ^LicenseSubCaption +: Aonta ceadachais +# ^ComponentsSubCaption +: Roghainnean an stàlaidh +# ^DirSubCaption +: Pasgan an stàlaidh +# ^InstallingSubCaption +: ’Ga stàladh +# ^CompletedSubCaption +: Deiseil +# ^UnComponentsSubCaption +: Roghainnean an dì-stàlaidh +# ^UnDirSubCaption +: Pasgan an dì-stàlaidh +# ^ConfirmSubCaption +: Dearbhadh +# ^UninstallingSubCaption +: ’Ga dhì-stàladh +# ^UnCompletedSubCaption +: Deiseil +# ^BackBtn +< Air ai&s +# ^NextBtn +Air adha&rt > +# ^AgreeBtn +&Gabhaidh mi ris +# ^AcceptBtn +&Gabhaidh mi teirmichean an aonta cheadachais +# ^DontAcceptBtn +&Diùltaidh mi teirmichean an aonta ceadachais +# ^InstallBtn +&Stàlaich +# ^UninstallBtn +&Dì-stàlaich +# ^CancelBtn +Sguir dheth +# ^CloseBtn +&Dùin +# ^BrowseBtn +&Rùraich… +# ^ShowDetailsBtn +&Mion-fhiosrachadh +# ^ClickNext +Briog air “Air adhart” gus leantainn air adhart. +# ^ClickInstall +Briog air “Stàlaich” gus tòiseachadh air an stàladh. +# ^ClickUninstall +Briog air “Dì-stàlaich” gus tòiseachadh air an dì-stàladh. +# ^Name +Ainm +# ^Completed +Coileanta +# ^LicenseText +Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, briog air “Gabhaidh mi ris”. +# ^LicenseTextCB +Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK +# ^LicenseTextRB +Feuch an doir thu sùil air an aonta cheadachais mus stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK +# ^UnLicenseText +Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, Briog air “Gabhaidh mi ris”. +# ^UnLicenseTextCB +Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, cuir cromag sa bhogsa gu h-ìosal. $_CLICK +# ^UnLicenseTextRB +Feuch an doir thu sùil air an aonta cheadachais mus dì-stàlaich thu $(^NameDA). Ma ghabhas tu ris a h-uile teirm san aonta, tagh a’ chiad roghainn gu h-ìosal. $_CLICK +# ^Custom +Gnàthaichte +# ^ComponentsText +Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean nach eil thu ag iarraidh. $_CLICK +# ^ComponentsSubText1 +Tagh an seòrsa dhen stàladh: +# ^ComponentsSubText2_NoInstTypes +Tagh na co-phàirtean a tha thu airson stàladh: +# ^ComponentsSubText2 +No tagh na co-phàirtean roghainneil a tha thu airson stàladh: +# ^UnComponentsText +Thoir cromag ann am bogsaichean nan co-phàirtean a tha thu airson dì-stàladh is thoir air falbh i o bhogsaichean nan co-phàirtean a tha thu airson cumail. $_CLICK +# ^UnComponentsSubText1 +Tagh an seòrsa dhen dì-stàladh: +# ^UnComponentsSubText2_NoInstTypes +Tagh na co-phàirtean a tha thu airson dì-stàladh: +# ^UnComponentsSubText2 +No tagh na co-phàirtean roghainneil a tha thu airson dì-stàladh: +# ^DirText +Thèid $(^NameDA) a stàladh sa phasgan seo. Gus stàladh ann am pasgan eile, briog air “Rùraich” is tagh pasgan eile. $_CLICK +# ^DirSubText +Pasgan-uidhe +# ^DirBrowseText +Tagh am pasgan san dèid $(^NameDA) a stàladh: +# ^UnDirText +Thèid $(^NameDA) a dhì-stàladh on phasgan seo. Gus dì-stàladh o phasgan eile, briog air “Rùraich” is tagh pasgan eile. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Tagh am pasgan on a tha thu airson $(^NameDA) a dhì-stàladh: +# ^SpaceAvailable +"Àite ri fhaighinn: " +# ^SpaceRequired +"Àite air a bheil feum: " +# ^UninstallingText +Thèid $(^NameDA) a dhì-stàladh on phasgan seo. $_CLICK +# ^UninstallingSubText +’Ga dhì-stàladh o: +# ^FileError +Thachair mearachd a’ fosgladh an fhaidhle a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Sguir dheth” gus sgur dhen stàladh, air\r\n“Feuch ris a-rithist” gus feuchainn ris a-rithist no air\r\n“Leig seachad” gus leum a ghearradh thairis air an fhaidhle seo. +# ^FileError_NoIgnore +Thachair mearachd a’ fosgladh an fhaidhle seo a chum sgrìobhaidh: \r\n\r\n$0\r\n\r\nBriog air “Feuch ris a-rithist” gus feuchainn ris a-rithist no air\r\n“Sguir dheth” gus sgur dhen stàladh. +# ^CantWrite +"Cha ghabh sgrìobhadh ann: " +# ^CopyFailed +Cha deach leinn lethbhreac dheth a dhèanamh +# ^CopyTo +"Cuir lethbhreac gu " +# ^Registering +"A’ clàradh: " +# ^Unregistering +"A’ neo-chlàradh: " +# ^SymbolNotFound +"Cha deach an samhla a lorg: " +# ^CouldNotLoad +"Cha b’ urrainn dhuinn a luchdadh: " +# ^CreateFolder +"Cruthaich pasgan: " +# ^CreateShortcut +"Cruthaich ath-ghoirid: " +# ^CreatedUninstaller +"Dì-stàlaichear air a chruthachadh: " +# ^Delete +"Sguab às dhan fhaidhle: " +# ^DeleteOnReboot +"Sguab às leis an ath-thòiseachadh: " +# ^ErrorCreatingShortcut +"Mearachd le cruthachadh na h-ath-ghoirid: " +# ^ErrorCreating +"Mearachd le cruthachadh: " +# ^ErrorDecompressing +Thachair mearachd a’ dì-dhùmhlachadh an dàta! ’S dòcha gu bheil an t-inneal-stàlaidh coirbte. +# ^ErrorRegistering +Mearachd le clàradh DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Cuir àithne an gnìomh: " +# ^Extract +"Dì-dhùmhlaich: " +# ^ErrorWriting +"Dì-dhùmhlachadh: mearachd a’ sgrìobhadh gu faidhle " +# ^InvalidOpcode +Stàlaichear coirbte: opcode mì-dhligheach +# ^NoOLE +"Chan eil OLE ann airson: " +# ^OutputFolder +"Pasgan às-chuir: " +# ^RemoveFolder +"Thoir pasgan air falbh: " +# ^RenameOnReboot +"Cuir ainm ùr air leis an ath-thòiseachadh: " +# ^Rename +"Cuir ainm ùr air: " +# ^Skipped +"Air leum a ghearradh: " +# ^CopyDetails +Cuir lethbhreac dhen mhion-fhiosrachadh san stòr-bhòrd +# ^LogInstall +Dèan loga dhen stàladh +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nsh new file mode 100644 index 0000000000..be440fa4bb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/ScotsGaelic.nsh @@ -0,0 +1,129 @@ +;Language: Gàidhlig (1169) +;Le GunChleoc + +!insertmacro LANGFILE "ScotsGaelic" "Scottish Gaelic" "Gàidhlig" "Gaidhlig" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Fàilte gu stàladh $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMholamaid gun dùin thu a h-uile aplacaid eile mus tòisich thu air an stàladh. Mar sin, ’s urrainn dhuinn faidhlichean iomchaidh an t-siostaim ùrachadh gun fheum air ath-thòiseachadh a’ choimpiutair agad.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Fàilte gun dì-stàladh aig $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Stiùiridh sinn tron dì-stàladh aig $(^NameDA) thu.$\r$\n$\r$\nMus tòisich thu air an dì-stàladh, dèan cinnteach nach eil $(^NameDA) a’ ruith.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Aonta ceadachais" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus stàlaich thu $(^NameDA)?" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris” gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, thoir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a stàladh. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Aonta ceadachais" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "An doir thu sùil air teirmichean a’ cheadachais mus dì-stàlaich thu $(^NameDA)?" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ma ghabhas tu ri teirmichean an aonta, briog air “Gabhaidh mi ris” gus leantainn air adhart. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ma ghabhas tu ri teirmichean an aonta, cuir cromag sa bhogsa gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ma ghabhas tu ri teirmichean an aonta, tagh a’ chiad roghainn gu h-ìosal. Feumaidh tu gabhail ris an aonta mus urrainn dhut $(^NameDA) a dhì-stàladh. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Brùth air Page Down gus an corr dhen aonta a shealltainn." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Tagh co-phàirtean" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson stàladh." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Tagh co-phàirtean" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Tagh na gleusan aig $(^NameDA) a tha thu airson dì-stàladh." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Tuairisgeul" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Cuir an luchag agad air co-phàirt gus a tuairisgeul a shealltainn." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tagh co-phàirt gus a tuairisgeul a shealltainn." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Tagh ionad an stàlaidh" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Tagh am pasgan san dèid $(^NameDA) a stàladh." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Tagh ionad an dì-stàlaidh" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Tagh am pasgan on a thèid $(^NameDA) a dhì-stàladh." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "’Ga stàladh" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga stàladh." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Stàladh deiseil" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Tha an stàladh deiseil." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Chaidh sgur dhen stàladh" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Cha deach an stàladh a choileanadh." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "’Ga dhì-stàladh" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Fuirich ort fhad ’s a tha $(^NameDA) ’ga dhì-stàladh." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Dì-stàladh deiseil" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Chaidh a dhì-stàladh." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Chaidh sgur dhen dì-stàladh" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Cha deach an dì-stàladh a choileanadh." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "A’ coileanadh an stàlaidh aig $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a stàladh air a’ choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich” gus an t-inneal-stàlaidh a dhùnadh." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "A’ coileanadh an dì-stàlaidh aig $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Chaidh $(^NameDA) a dhì-stàladh on choimpiutair agad.$\r$\n$\r$\nBriog air “Crìochnaich” gus an t-inneal-stàlaidh a dhùnadh." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Tha ath-thòiseachadh a dhìth air a’ choimpiutair agad gus an dì-stàladh aig $(^NameDA) a choileanadh. A bheil thu airson ath-thòiseachadh an-dràsta?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ath-tòisich an-dràsta" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Nì mi fhìn ath-thòiseachadh a làimh uaireigin eile" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Ruith $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Seall am faidhle “Leughmi”" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Crìochnaich" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Tagh pasgan sa chlàr-taice tòiseachaidh" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Tagh pasgan sa chlàr-taice tòiseachaidh airson na h-ath-ghoiridean aig $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Tagh pasgan sa chlàr-taice tòiseachaidh sa bheil thu airson na h-ath-ghoiridean aig a’ phrògram a chruthachadh. ’S urrainn dhut cuideachd ainm a chur a-steach gus pasgan ùr a chruthachadh." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Na cruthaich ath-ghoiridean" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dì-stàlaich $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Thoir $(^NameDA) air falbh on choimpiutair agad." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "A bheil thu cinnteach gu bheil thu airson an stàladh aig $(^Name) fhàgail?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "A bheil thu cinnteach gu bheil thu airson an dì-stàladh aig $(^Name) fhàgail?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Tagh cleachdaichean" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Tagh na cleachdaichean dhan a thèid $(^NameDA) a stàladh." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Tagh an stàlaich thu $(^NameDA) air do shon fhìn a-mhàin no airson a h-uile cleachdaiche air a’ choimpiutair seo. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Stàlaich airson duine sam bith a chleachdas an coimpiutair seo" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Na stàlaich ach air mo shon-sa" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nlf new file mode 100644 index 0000000000..30786b2030 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +3098 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Срђан Обућина +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Инсталација +# ^UninstallCaption +$(^Name) Деинсталација +# ^LicenseSubCaption +: Договор о праву коришћења +# ^ComponentsSubCaption +: Опције инсталације +# ^DirSubCaption +: Избор фолдера за инсталацију +# ^InstallingSubCaption +: Инсталација +# ^CompletedSubCaption +: Завршена инсталација +# ^UnComponentsSubCaption +: Опције деинсталације +# ^UnDirSubCaption +: Избор фолдера за деинсталацију +# ^ConfirmSubCaption +: Потврђивање +# ^UninstallingSubCaption +: Деинсталација +# ^UnCompletedSubCaption +: Завршена деинсталација +# ^BackBtn +< Назад +# ^NextBtn +Напред > +# ^AgreeBtn +Прихватам +# ^AcceptBtn +Прихватам услове договора о праву коришћења +# ^DontAcceptBtn +Не прихватам услове договора о праву коришћења +# ^InstallBtn +Инсталирај +# ^UninstallBtn +Деинсталирај +# ^CancelBtn +Одустани +# ^CloseBtn +Затвори +# ^BrowseBtn +Избор... +# ^ShowDetailsBtn +Детаљи +# ^ClickNext +Притисните дугме „Напред“ за наставак. +# ^ClickInstall +Притисните дугме „Инсталирај“ за почетак инсталације. +# ^ClickUninstall +Притисните дугме „Деинсталирај“ за почетак деинсталације. +# ^Name +Име +# ^Completed +Завршено +# ^LicenseText +Пажљиво прочитајте договор о праву коришћења пре инсталације програма $(^NameDA). Ако прихватате све услове договора, притисните дугме „Прихватам“. +# ^LicenseTextCB +Пажљиво прочитајте договор о праву коришћења пре инсталације програма $(^NameDA). Ако прихватате све услове договора, обележите квадратић испод. $_CLICK +# ^LicenseTextRB +Пажљиво прочитајте договор о праву коришћења пре инсталације програма $(^NameDA). Ако прихватате све услове договора, изаберите прву опцију испод. $_CLICK +# ^UnLicenseText +Пажљиво прочитајте договор о праву коришћења пре деинсталације програма $(^NameDA). Ако прихватате све услове договора, притисните дугме „Прихватам“. +# ^UnLicenseTextCB +Пажљиво прочитајте договор о праву коришћења пре деинсталације програма $(^NameDA). Ако прихватате све услове договора, обележите квадратић испод. $_CLICK +# ^UnLicenseTextRB +Пажљиво прочитајте договор о праву коришћења пре деинсталације програма $(^NameDA). Ако прихватате све услове договора, изаберите прву опцију испод. $_CLICK +# ^Custom +Прилагођавање +# ^ComponentsText +Изаберите компоненте за инсталацију. Инсталирају се само означене компоненте. $_CLICK +# ^ComponentsSubText1 +Изаберите тип инсталације: +# ^ComponentsSubText2_NoInstTypes +Изаберите компоненте за инсталацију: +# ^ComponentsSubText2 +Или, изаберите опционе компоненте које желите да инсталирате: +# ^UnComponentsText +Изаберите компоненте за деинсталацију. Деинсталирају се само означене компоненте. $_CLICK +# ^UnComponentsSubText1 +Изаберите тип деинсталације: +# ^UnComponentsSubText2_NoInstTypes +Изаберите компоненте за деинсталацију: +# ^UnComponentsSubText2 +Или, изаберите опционе компоненте које желите да деинсталирате: +# ^DirText +Програм $(^NameDA) ће бити инсталиран у наведени фолдер. За инсталацију у други фолдер притисните дугме „Избор...“ и изаберите фолдер. $_CLICK +# ^DirSubText +Фолдер +# ^DirBrowseText +Изаберите фолдер у који ћете инсталирати програм $(^NameDA): +# ^UnDirText +Програм $(^NameDA) ће бити деинсталиран из наведеног фолдера. За деинсталацију из другог фолдера притисните дугме „Избор...“ и изаберите фолдер. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Изаберите фолдер из кога ћете деинсталирати програм $(^NameDA): +# ^SpaceAvailable +"Слободан простор: " +# ^SpaceRequired +"Потребан простор: " +# ^UninstallingText +Програм $(^NameDA) ће бити деинсталиран из наведеног фолдера. $_CLICK +# ^UninstallingSubText +Деинсталација из: +# ^FileError +Грешка при отварању фајла за писање: \r\n\t"$0"\r\nПритисните дугме „Одустани“ за прекид инсталације,\r\n„Понови“ за поновни покушај писања у фајл, или\r\n„Игнориши“ за прескакање овог фајла. +# ^FileError_NoIgnore +Грешка при отварању фајла за писање: \r\n\t"$0"\r\nПритисните дугме „Понови“ за поновни покушај писања у фајл, или\r\n„Одустани“ за прекид инсталирања. +# ^CantWrite +"Немогуће писање: " +# ^CopyFailed +Неуспешно копирање +# ^CopyTo +"Копирање у " +# ^Registering +"Регистровање: " +# ^Unregistering +"Дерегистровање: " +# ^SymbolNotFound +"Симбол није нађен: " +# ^CouldNotLoad +"Немогуће учитавање: " +# ^CreateFolder +"Креирање фолдера: " +# ^CreateShortcut +"Креирање пречице: " +# ^CreatedUninstaller +"Креирање деинсталера: " +# ^Delete +"Брисање фајла: " +# ^DeleteOnReboot +"Брисање при рестарту: " +# ^ErrorCreatingShortcut +"Грешка при креирању пречице: " +# ^ErrorCreating +"Грешка при креирању: " +# ^ErrorDecompressing +Грешка при отпакивању података! Оштећен инсталациони програм? +# ^ErrorRegistering +Грешка при регистровању библиотеке +# ^ExecShell +"Извршавање у окружењу: " +# ^Exec +"Извршавање: " +# ^Extract +"Отпакивање: " +# ^ErrorWriting +"Отпакивање: грешка при упису у фајл " +# ^InvalidOpcode +Оштећен инсталациони програм: неисправна команда +# ^NoOLE +"Нема OLE подршке за: " +# ^OutputFolder +"Излазни фолдер: " +# ^RemoveFolder +"Брисање фолдера: " +# ^RenameOnReboot +"Преименовање при рестартовању: " +# ^Rename +"Преименован: " +# ^Skipped +"Прескочен: " +# ^CopyDetails +Копирај детаље у клипборд +# ^LogInstall +Води записник о процесу инсталације +# ^Byte +B +# ^Kilo + k +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nsh new file mode 100644 index 0000000000..78a9141a2e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Serbian.nsh @@ -0,0 +1,121 @@ +;Language: Serbian (3098) +;Translation by Срђан Обућина + +!insertmacro LANGFILE "Serbian" "Serbian (Cyrillic)" "Српски" "Srpski (Cyrillic)" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Добродошли у водич за инсталацију програма $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Бићете вођени кроз процес инсталације програма $(^NameDA).$\r$\n$\r$\nПрепоручљиво је да искључите све друге програме пре почетка инсталације. Ово може омогућити ажурирање системских фајлова без потребе за поновним покретањем рачунара.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Добродошли у деинсталацију програма $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Бићете вођени кроз процес деинсталације програма $(^NameDA).$\r$\n$\r$\nПре почетка деинсталације, уверите се да је програм $(^NameDA) искључен. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Договор о праву коришћења" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Пажљиво прочитајте договор о праву коришћења пре инсталације програма $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ако прихватате све услове договора, притисните дугме „Прихватам“ за наставак. Морате прихватити договор да бисте инсталирали програм $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако прихватате све услове договора, обележите квадратић испод. Морате прихватити договор да бисте инсталирали програм $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако прихватате све услове договора, изаберите прву опцију испод. Морате прихватити договор да бисте инсталирали програм $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Договор о праву коришћења" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Пажљиво прочитајте договор о праву коришћења пре деинсталације програма $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ако прихватате све услове договора, притисните дугме „Прихватам“ за наставак. Морате прихватити договор да бисте деинсталирали програм $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ако прихватате све услове договора, обележите квадратић испод. Морате прихватити договор да бисте деинсталирали програм $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ако прихватате све услове договора, изаберите прву опцију испод. Морате прихватити договор да бисте деинсталирали програм $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Притисните Page Down да бисте видели остатак договора." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Избор компоненти за инсталацију" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Изаберите компоненте за инсталацију. Инсталирају се само означене компоненте." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Избор компоненти за деинсталацију" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Изаберите компоненте за деинсталацију. Деинсталирају се само означене компоненте." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Опис" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Пређите курсором миша преко имена компоненте да бисте видели њен опис." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Изаберите компоненту да бисте видели њен опис." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Избор фолдера за инсталацију" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Изаберите фолдер у који ћете инсталирати програм $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Избор фолдера за деинсталaцију" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Изаберите фолдер из кога ћете деинсталирати програм $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Инсталација" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Сачекајте док се програм $(^NameDA) инсталира." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Завршена инсталација" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Инсталација је успешно завршена." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Прекинута инсталација" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Инсталација је прекинута и није успешно завршена." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Деинсталација" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Сачекајте док се програм $(^NameDA) деинсталира." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Завршена деинсталација" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Деинсталација је успешно завршена." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Прекинута деинсталација" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Деинсталација је прекинута и није успешно завршена." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завршена инсталација програма $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Програм $(^NameDA) је инсталиран на рачунар.$\r$\n$\r$\nПритисните дугме „Крај“ за затварање овог прозора." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Рачунар мора бити поново покренут да би се процес инсталације програма $(^NameDA) успешно завршио. Желите ли то одмах да урадите?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завршена деинсталација програма $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Програм $(^NameDA) је деинсталиран са рачунара.$\r$\n$\r$\nПритисните дугме „Крај“ за затварање овог прозора." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Рачунар мора бити поново покренут да би се процес деинсталације програма $(^NameDA) успешно завршио. Желите ли то да урадите одмах?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Одмах поново покрени рачунар" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Без поновног покретања" + ${LangFileString} MUI_TEXT_FINISH_RUN "Покрени програм $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Прикажи ПрочитајМе фајл" + ${LangFileString} MUI_BUTTONTEXT_FINISH "Крај" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Избор фолдера у Старт менију" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Изаберите фолдер у Старт менију у коме ћете креирати пречице." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Изаберите фолдер у Старт менију у коме желите да буду креиране пречице програма. Можете уписати и име за креирање новог фолдера." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Без креирања пречица" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Деинсталација програма $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Деинсталација програма $(^NameDA) са рачунара." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Сигурно желите да прекинете инсталацију програма $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Сигурно желите да прекинете деинсталацију програма $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nlf new file mode 100644 index 0000000000..1d009fcec6 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +2074 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Srđan Obućina +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Instalacija +# ^UninstallCaption +$(^Name) Deinstalacija +# ^LicenseSubCaption +: Dogovor o pravu korišćenja +# ^ComponentsSubCaption +: Opcije instalacije +# ^DirSubCaption +: Izbor foldera za instalaciju +# ^InstallingSubCaption +: Instalacija +# ^CompletedSubCaption +: Završena instalacija +# ^UnComponentsSubCaption +: Opcije deinstalacije +# ^UnDirSubCaption +: Izbor foldera za deinstalaciju +# ^ConfirmSubCaption +: Potvrđivanje +# ^UninstallingSubCaption +: Deinstalacija +# ^UnCompletedSubCaption +: Završena deinstalacija +# ^BackBtn +< Nazad +# ^NextBtn +Napred > +# ^AgreeBtn +Prihvatam +# ^AcceptBtn +Prihvatam uslove dogovora o pravu korišćenja +# ^DontAcceptBtn +Ne prihvatam uslove dogovora o pravu korišćenja +# ^InstallBtn +Instaliraj +# ^UninstallBtn +Deinstaliraj +# ^CancelBtn +Odustani +# ^CloseBtn +Zatvori +# ^BrowseBtn +Izbor... +# ^ShowDetailsBtn +Detalji +# ^ClickNext +Pritisnite dugme „Napred“ za nastavak. +# ^ClickInstall +Pritisnite dugme „Instaliraj“ za početak instalacije. +# ^ClickUninstall +Pritisnite dugme „Deinstaliraj“ za početak deinstalacije. +# ^Name +Ime +# ^Completed +Završeno +# ^LicenseText +Pažlivo pročitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“. +# ^LicenseTextCB +Pažlivo pročitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. $_CLICK +# ^LicenseTextRB +Pažlivo pročitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK +# ^UnLicenseText +Pažlivo pročitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“. +# ^UnLicenseTextCB +Pažlivo pročitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. $_CLICK +# ^UnLicenseTextRB +Pažlivo pročitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA). Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. $_CLICK +# ^Custom +Prilagođavanje +# ^ComponentsText +Izaberite komponente za instalaciju. Instaliraju se samo označene komponente. $_CLICK +# ^ComponentsSubText1 +Izaberite tip instalacije: +# ^ComponentsSubText2_NoInstTypes +Izaberite komponente za instalaciju: +# ^ComponentsSubText2 +Ili, izaberite opcione komponente koje želite da instalirate: +# ^UnComponentsText +Izaberite komponente za deinstalaciju. Deinstaliraju se samo označene komponente. $_CLICK +# ^UnComponentsSubText1 +Izaberite tip deinstalacije: +# ^UnComponentsSubText2_NoInstTypes +Izaberite komponente za deinstalaciju: +# ^UnComponentsSubText2 +Ili, izaberite opcione komponente koje želite da deinstalirate: +# ^DirText +Program $(^NameDA) će biti instaliran u navedeni folder. Za instalaciju u drugi folder pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK +# ^DirSubText +Folder +# ^DirBrowseText +Izaberite folder u koji ćete instalirati program $(^NameDA): +# ^UnDirText +Program $(^NameDA) će biti deinstaliran iz navedenog foldera. Za deinstalaciju iz drugog foldera pritisnite dugme „Izbor...“ i izaberite folder. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Izaberite folder iz koga ćete deinstalirati program $(^NameDA): +# ^SpaceAvailable +"Slobodan prostor: " +# ^SpaceRequired +"Potreban prostor: " +# ^UninstallingText +Program $(^NameDA) će biti deinstaliran iz navedenog foldera. $_CLICK +# ^UninstallingSubText +Deinstalacija iz: +# ^FileError +Greška pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Odustani“ za prekid instalacije,\r\n„Ponovi“ za ponovni pokušaj pisanja u fajl, ili\r\n„Ignoriši“ za preskakanje ovog fajla. +# ^FileError_NoIgnore +Greška pri otvaranju fajla za pisanje: \r\n\t"$0"\r\nPritisnite dugme „Ponovi“ za ponovni pokušaj pisanja u fajl, ili\r\n„Odustani“ za prekid instaliranja. +# ^CantWrite +"Nemoguće pisanje: " +# ^CopyFailed +Neuspešno kopiranje +# ^CopyTo +"Kopiranje u " +# ^Registering +"Registrovanje: " +# ^Unregistering +"Deregistrovanje: " +# ^SymbolNotFound +"Simbol nije nađen: " +# ^CouldNotLoad +"Nemoguće učitavanje: " +# ^CreateFolder +"Kreiranje foldera: " +# ^CreateShortcut +"Kreiranje prečice: " +# ^CreatedUninstaller +"Kreiranje deinstalera: " +# ^Delete +"Brisanje fajla: " +# ^DeleteOnReboot +"Brisanje pri restartu: " +# ^ErrorCreatingShortcut +"Greška pri kreiranju prečice: " +# ^ErrorCreating +"Greška pri kreiranju: " +# ^ErrorDecompressing +Greška pri otpakivanju podataka! Oštećen instalacioni program? +# ^ErrorRegistering +Greška pri registrovanju biblioteke +# ^ExecShell +"Izvršavanje u okruženju: " +# ^Exec +"Izvršavanje: " +# ^Extract +"Otpakivanje: " +# ^ErrorWriting +"Otpakivanje: greška pri upisu u fajl " +# ^InvalidOpcode +Oštećen instalacioni program: neispravna komanda +# ^NoOLE +"Nema OLE podrške za: " +# ^OutputFolder +"Izlazni folder: " +# ^RemoveFolder +"Brisanje foldera: " +# ^RenameOnReboot +"Preimenovanje pri restartu: " +# ^Rename +"Preimenovan: " +# ^Skipped +"Preskočen: " +# ^CopyDetails +Kopiraj detalje u klipbord +# ^LogInstall +Vodi zapisnik o procesu instalacije +# ^Byte +B +# ^Kilo + k +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nsh new file mode 100644 index 0000000000..5ac473ffee --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SerbianLatin.nsh @@ -0,0 +1,121 @@ +;Language: Serbian Latin (2074) +;Translation by Srđan Obućina + +!insertmacro LANGFILE "SerbianLatin" "Serbian (Latin)" "Srpski" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli u vodič za instalaciju programa $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bićete vođeni kroz proces instalacije programa $(^NameDA).$\r$\n$\r$\nPreporučljivo je da isključite sve druge programe pre početka instalacije. Ovo može omogućiti ažuriranje sistemskih fajlova bez potrebe za ponovnim pokretanjem računara.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli u deinstalaciju programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bićete vođeni kroz proces deinstalacije programa $(^NameDA).$\r$\n$\r$\nPre početka deinstalacije, uverite se da je program $(^NameDA) isključen. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Dogovor o pravu korišćenja" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pažljivo pročitajte dogovor o pravu korišćenja pre instalacije programa $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste instalirali program $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste instalirali program $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Dogovor o pravu korišćenja" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pažlivo pročitajte dogovor o pravu korišćenja pre deinstalacije programa $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ako prihvatate sve uslove dogovora, pritisnite dugme „Prihvatam“ za nastavak. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ako prihvatate sve uslove dogovora, obeležite kvadratić ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ako prihvatate sve uslove dogovora, izaberite prvu opciju ispod. Morate prihvatiti dogovor da biste deinstalirali program $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pritisnite Page Down da biste videli ostatak dogovora." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponenti za instalaciju" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izaberite komponente za instalaciju. Instaliraju se samo označene komponente." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponenti za deinstalaciju" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izaberite komponente za deinstalaciju. Deinstaliraju se samo označene komponente." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pređite kursorom miša preko imena komponente da biste videli njen opis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Izaberite komponentu da biste videli njen opis." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izbor foldera za instalaciju" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izaberite folder u koji ćete instalirati program $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor foldera za deinstalaciju" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izaberite folder iz koga ćete deinstalirati program $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalacija" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Sačekajte dok se program $(^NameDA) instalira." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Završena instalacija" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Instalacija je uspešno završena." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinuta instalacija" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Instalacija je prekinuta i nije uspešno završena." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalacija" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Sačekajte dok se program $(^NameDA) deinstalira." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Završena deinstalacija" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Deinstalacija je uspešno završena." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Prekinuta deinstalacija" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Deinstalacija je prekinuta i nije uspešno završena." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Završena instalacija programa $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je instaliran na računar.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Računar mora biti ponovo pokrenut da bi se proces instalacije programa $(^NameDA) uspešno završio. Želite li to odmah da uradite?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Završena deinstalacija programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je deinstaliran sa računara.$\r$\n$\r$\nPritisnite dugme „Kraj“ za zatvaranje ovog prozora." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Računar mora biti ponovo pokrenut da bi se proces deinstalacije programa $(^NameDA) uspešno završio. Želite li to da uradite odmah?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Odmah ponovo pokreni računar" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bez ponovnog pokretanja" + ${LangFileString} MUI_TEXT_FINISH_RUN "Pokreni program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Prikaži PročitajMe fajl" + ${LangFileString} MUI_BUTTONTEXT_FINISH "Kraj" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izbor foldera u Start meniju" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izaberite folder u Start meniju u kome ćete kreirati prečice." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izaberite folder u Start meniju u kome želite da budu kreirane prečice programa. Možete upisati i ime za kreiranje novog foldera." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Bez kreiranja prečica" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Deinstalacija programa $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Deinstalacija programa $(^NameDA) sa računara." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Sigurno želite da prekinete instalaciju programa $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Sigurno želite da prekinete deinstalaciju programa $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nlf new file mode 100644 index 0000000000..a001985248 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nlf @@ -0,0 +1,192 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +2052 +# Font and size - dash (-) means default 字体名称与大小 +宋体 +9 +# Codepage - dash (-) means ASCII code page ASCII 字码页 +936 +# RTL - anything else than RTL means LTR 由右至左书写 +- +# Revision date: 2020-06-03 +# Translator: Kii Ali , , , Tyson Tan +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) 安装 +# ^UninstallCaption +$(^Name) 卸载 +# ^LicenseSubCaption +: 许可证协议 +# ^ComponentsSubCaption +: 安装选项 +# ^DirSubCaption +: 安装目录 +# ^InstallingSubCaption +: 正在安装 +# ^CompletedSubCaption +: 已完成 +# ^UnComponentsSubCaption +: 卸载选项 +# ^UnDirSubCaption +: 卸载文件夹 +# ^ConfirmSubCaption +: 确认 +# ^UninstallingSubCaption +: 正在卸载 +# ^UnCompletedSubCaption +: 完成 +# ^BackBtn +< 上一步(&P) +# ^NextBtn +下一步(&N) > +# ^AgreeBtn +我接受(&I) +# ^AcceptBtn +我接受许可证协议中的条款(&A) +# ^DontAcceptBtn +我不接受许可证协议中的条款(&N) +# ^InstallBtn +安装(&I) +# ^UninstallBtn +卸载(&U) +# ^CancelBtn +取消(&C) +# ^CloseBtn +关闭(&L) +# ^BrowseBtn +浏览(&B)... +# ^ShowDetailsBtn +显示详情(&D) +# ^ClickNext +点击 [下一步(N)] 继续。 +# ^ClickInstall +点击 [安装(I)] 开始安装。 +# ^ClickUninstall +点击 [卸载(U)] 开始卸载。 +# ^Name +名称 +# ^Completed +已完成 +# ^LicenseText +请在安装 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,点击 [我同意(I)] 。 +# ^LicenseTextCB +请在安装 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,点击下方的选框。 $_CLICK +# ^LicenseTextRB +请在安装 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,选择下方的第一个选项。 $_CLICK +# ^UnLicenseText +请在卸载 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,点击 [我同意(I)] 。 +# ^UnLicenseTextCB +请在卸载 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,点击下方的选框。 $_CLICK +# ^UnLicenseTextRB +请在卸载 $(^NameDA) 之前阅读许可证协议。如果你接受协议中所有条款,选择下方的第一个选项。 $_CLICK +# ^Custom +自定义 +# ^ComponentsText +请勾选你想安装的组件,并取消勾选你不想安装的组件。 $_CLICK +# ^ComponentsSubText1 +选定的安装的类型: +# ^ComponentsSubText2_NoInstTypes +选定安装的组件: +# ^ComponentsSubText2 +或者,自定义选定想安装的组件: +# ^UnComponentsText +请勾选你想卸载的组件,并取消勾选你不想卸载的组件。 $_CLICK +# ^UnComponentsSubText1 +选择卸载的类型: +# ^UnComponentsSubText2_NoInstTypes +选择要卸载的组件: +# ^UnComponentsSubText2 +或是,选择想要解除安装的可选项组件: +# ^DirText +安装程序将把 $(^NameDA) 安装到以下目录。要安装到另一个目录,请点击 [浏览(B)...] 并选择其他的文件夹。 $_CLICK +# ^DirSubText +安装目录 +# ^DirBrowseText +选择安装此软件的 $(^NameDA) 的位置: +# ^UnDirText +安装程序将把 $(^NameDA) 从以下目录卸载。要从另一个目录卸载,点击 [浏览(B)...] 并选择其他目录。 $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +选择要卸载 $(^NameDA) 的目录: +# ^SpaceAvailable +"可用空间: " +# ^SpaceRequired +"所需空间: " +# ^UninstallingText +此向导将从本机卸载 $(^NameDA) 。 $_CLICK +# ^UninstallingSubText +卸载目录: +# ^FileError +无法打开要写入的文件: \r\n\t"$0"\r\n点击 [Abort] 停止安装,\r\n [Retry] 重新尝试写入文件,或者\r\n [Ignore] 忽略这个文件。 +# ^FileError_NoIgnore +无法打开要写入的文件: \r\n\t"$0"\r\n点击 [Retry] 重新尝试写入文件,或者\r\n [Cancel] 停止安装。 +# ^CantWrite +"无法写入: " +# ^CopyFailed +"复制失败 " +# ^CopyTo +"复制到: " +# ^Registering +"正在注册: " +# ^Unregistering +"正在取消注册: " +# ^SymbolNotFound +"无法找到符号: " +# ^CouldNotLoad +"无法加载: " +# ^CreateFolder +"创建文件夹: " +# ^CreateShortcut +"创建快捷方式: " +# ^CreatedUninstaller +"创建卸载程序: " +# ^Delete +"删除文件: " +# ^DeleteOnReboot +"重新启动后删除: " +# ^ErrorCreatingShortcut +"创建快捷方式时发生错误: " +# ^ErrorCreating +"创建时发生错误: " +# ^ErrorDecompressing +"解压缩数据时发生错误!请检查安装程序是否损坏。" +# ^ErrorRegistering +"注册 DLL 时发生错误" +# ^ExecShell +"执行外壳程序: " +# ^Exec +"执行: " +# ^Extract +"解压缩: " +# ^ErrorWriting +"抽取: 无法写入文件 " +# ^InvalidOpcode +"安装程序损坏: 无效的操作代码 " +# ^NoOLE +"没有 OLE 用于: " +# ^OutputFolder +"输出目录: " +# ^RemoveFolder +"删除目录: " +# ^RenameOnReboot +"重新启动之后重命名: " +# ^Rename +"重命名: " +# ^Skipped +"已跳过: " +# ^CopyDetails +"复制详情到剪贴板 " +# ^LogInstall +"记录安装过程到日志" +# byte +B +# kilo + K +# mega + M +# giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nsh new file mode 100644 index 0000000000..a34f46912e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SimpChinese.nsh @@ -0,0 +1,130 @@ +;Language: 'Chinese (Simplified)' (2052) +;Translator: Kii Ali , , , Tyson Tan +;Revision date: 2020-06-03 + +!insertmacro LANGFILE "SimpChinese" "Chinese (Simplified)" "中文(简体)" "Hanyu (Jiantizi)" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "欢迎使用 $(^NameDA) 安装程序" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "此程序将引导你完成 $(^NameDA) 的安装。$\r$\n$\r$\n在安装之前,请先关闭其他所有应用程序。这将确保安装程序能够更新所需的系统文件,从而避免在安装后重新启动计算机。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "欢迎使用 $(^NameDA) 卸载程序" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "此程序将引导你完成 $(^NameDA) 的卸载。$\r$\n$\r$\n在卸载之前,请确认 $(^NameDA) 已经关闭。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "许可证协议" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "在安装 $(^NameDA) 之前,请阅读许可证条款。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "如果你接受许可证的条款,请点击 [我同意(I)] 继续安装。你必须在同意后才能安装 $(^NameDA) 。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果你接受许可证的条款,请点击勾选下方的选框。你必须在同意后才能安装 $(^NameDA)。$_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果你接受许可证的条款,请选择下方第一个选项。你必须在同意后才能安装 $(^NameDA)。$_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "许可证协议" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "在卸载 $(^NameDA) 之前,请阅读许可证条款。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "如果你接受许可证的条款,请点击 [我同意(I)] 继续卸载。如果你点击 [取消(C)] ,卸载程序将会关闭。你必须在同意后才能卸载 $(^NameDA) 。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果你接受许可证的条款,点击勾选下方的选框。你必须在同意后才能卸载 $(^NameDA)。$_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果你接受许可证的条款,请选择下方第一个选项。你必须在同意后才能卸载 $(^NameDA)。$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "要阅读协议的其余部分,请按 [PgDn] 键向下翻页。" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "选择组件" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "选择你想安装的 $(^NameDA) 功能组件。" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "选择组件" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "选择你想卸载的 $(^NameDA) 功能组件。" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "组件描述" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "将光标悬停在组件名称之上,即可显示它的功能描述。" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "点击选中组件,即可显示它的功能描述。" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "选择安装位置" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "选择 $(^NameDA) 的安装文件夹。" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "选择卸载位置" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "选择 $(^NameDA) 的卸载文件夹。" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "正在安装" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) 正在安装,请稍候。" + ${LangFileString} MUI_TEXT_FINISH_TITLE "安装完成" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "安装程序成功完成安装。" + ${LangFileString} MUI_TEXT_ABORT_TITLE "安装中止" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "安装程序未能完成安装。" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "正在卸载" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) 正在卸载,请稍候。" + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "卸载完成" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "卸载程序成功完成卸载。" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "卸载中止" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "卸载程序未能完成卸载。" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) 安装程序结束" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) 已经成功安装到本机。$\r$\n点击 [完成(F)] 关闭安装程序。" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "必须重新启动本机才能完成 $(^NameDA) 的安装。是否立即重新启动?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) 卸载程序结束" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) 已经成功从本机卸载。$\r$\n$\r$\n点击 [完成] 关闭卸载程序。" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "必须重新启动本机才能完成 $(^NameDA) 的卸载。是否立即重新启动?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "是,立即重新启动(&Y)" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "否,我会在之后重新启动(&N)" + ${LangFileString} MUI_TEXT_FINISH_RUN "运行 $(^NameDA)(&R)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "显示自述文件(&M)" + ${LangFileString} MUI_BUTTONTEXT_FINISH "完成(&F)" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "选择开始菜单文件夹" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "选择开始菜单文件夹,用于创建程序的快捷方式。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "选择开始菜单文件夹,用于创建程序的快捷方式。你也可以输入自定义名称,创建新文件夹。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "不要创建快捷方式(&N)" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "卸载 $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "从本机卸载 $(^NameDA) 。" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "确定要退出 $(^Name) 安装程序吗?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "确定要退出 $(^Name) 卸载程序吗?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "选择用户" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "选择为哪些用户安装 $(^NameDA) 。" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "选择只为自己安装 $(^NameDA) ,还是为本机的所有用户安装。 $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "为本机所有用户安装(&A)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "只为我自己安装(&M)" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nlf new file mode 100644 index 0000000000..b7e58bd14b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1051 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +#Translated by: Kypec (peter.dzugas@mahe.sk); edited by: Marián Hikaník (podnety@mojepreklady.net), Ivan Masár , 2008. +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Inštalácia programu $(^Name) +# ^UninstallCaption +Odinštalovanie programu $(^Name) +# ^LicenseSubCaption +: Licenčná zmluva +# ^ComponentsSubCaption +: Možnosti inštalácie +# ^DirSubCaption +: Inštalačný priečinok +# ^InstallingSubCaption +: Prebieha inštalácia +# ^CompletedSubCaption +: Hotovo +# ^UnComponentsSubCaption +: Možnosti odinštalovania +# ^UnDirSubCaption +: Priečinok s informáciami pre odinštalovanie +# ^ConfirmSubCaption +: Potvrdenie +# ^UninstallingSubCaption +: Prebieha odinštalácia +# ^UnCompletedSubCaption +: Hotovo +# ^BackBtn +< &Späť +# ^NextBtn +Ď&alej > +# ^AgreeBtn +&Súhlasím +# ^AcceptBtn +&Súhlasím s podmienkami licenčnej zmluvy +# ^DontAcceptBtn +N&esúhlasím s podmienkami licenčnej zmluvy +# ^InstallBtn +&Nainštalovať +# ^UninstallBtn +&Odinštalovať +# ^CancelBtn +Zrušiť +# ^CloseBtn +&Zatvoriť +# ^BrowseBtn +&Prehľadávať... +# ^ShowDetailsBtn +&Podrobnosti +# ^ClickNext +V inštalácii pokračujte kliknutím na tlačidlo Ďalej. +# ^ClickInstall +Pre spustenie inštalácie kliknite na tlačidlo Nainštalovať. +# ^ClickUninstall +Pre spustenie procesu odinštalovania kliknite na tlačidlo Odinštalovať. +# ^Name +Názov +# ^Completed +Hotovo +# ^LicenseText +Pred inštaláciou programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, kliknite na tlačidlo Súhlasím. +# ^LicenseTextCB +Pred inštaláciou programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, zaškrtnite nasledujúce políčko. $_CLICK +# ^LicenseTextRB +Pred inštaláciou programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, označte prvú z nasledujúcich možností. $_CLICK +# ^UnLicenseText +Pred odinštalovaním programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, kliknite na tlačidlo Súhlasím. +# ^UnLicenseTextCB +Pred odinštalovaním programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, zaškrtnite nasledujúce políčko. $_CLICK +# ^UnLicenseTextRB +Pred odinštalovaním programu si prosím dôkladne prečítajte licenčnú zmluvu $(^NameDA). Ak súhlasíte so všetkými jej podmienkami, označte prvú z nasledujúcich možností. $_CLICK +# ^Custom +Voliteľná +# ^ComponentsText +Označte súčasti programu, ktoré chcete nainštalovať a odznačte tie, ktoré nainštalovať nechcete. $_CLICK +# ^ComponentsSubText1 +Vyberte si typ inštalácie: +# ^ComponentsSubText2_NoInstTypes +Vyberte si tie súčasti programu, ktoré chcete nainštalovať: +# ^ComponentsSubText2 +Alebo označte voliteľné doplnky, ktoré chcete nainštalovať: +# ^UnComponentsText +Označte súčasti programu, ktoré chcete odinštalovať a odznačte tie, ktoré chcete ponechať nainštalované. $_CLICK +# ^UnComponentsSubText1 +Zvoľte typ deinštalácie: +# ^UnComponentsSubText2_NoInstTypes +Vyberte súčasti, ktoré chcete odinštalovať: +# ^UnComponentsSubText2 +Alebo označte voliteľné súčasti, ktoré chcete odinštalovať: +# ^DirText +$(^NameDA) bude nainštalovaný do nasledujúceho priečinka. Inštalovať do iného priečinka môžete po kliknutí na tlačidlo Prehľadávať a vybraní iného priečinka. $_CLICK +# ^DirSubText +Cieľový priečinok +# ^DirBrowseText +Zvoľte priečinok, do ktorého sa nainštaluje program $(^NameDA): +# ^UnDirText +Inštalátor odinštaluje program $(^NameDA) z nasledovného priečinka. Ak ho chcete odinštalovať z iného priečinka, kliknite na tlačidlo Prehľadávať a vyberte iný priečinok. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Zvoľte priečinok, z ktorého sa odinštaluje program $(^NameDA): +# ^SpaceAvailable +"Voľné miesto na disku: " +# ^SpaceRequired +"Potrebné miesto na disku: " +# ^UninstallingText +Program $(^NameDA) sa odinštaluje z nasledovného priečinka. $_CLICK +# ^UninstallingSubText +Prebieha odinštalovanie z: +# ^FileError +Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete inštaláciu ukončiť, kliknite na tlačidlo Ukončiť,\r\ ak chcete zápis súboru zopakovať, kliknite na tlačidlo Opakovať alebo kliknite na tlačidlo \r\nIgnorovať, ak chcete inštaláciu tohto súboru vynechať. +# ^FileError_NoIgnore +Chyba pri otváraní súboru na zápis: \r\n\r\n$0\r\n\r\n. Ak chcete zopakovať zápis súboru, kliknite na tlačidlo Opakovať, alebo kliknite na tlačidlo \r\nZrušiť, v prípade, že chcete inštaláciu ukončiť. +# ^CantWrite +"Nemožno zapísať súbor: " +# ^CopyFailed +Kopírovanie zlyhalo. +# ^CopyTo +"Kopírovať do " +# ^Registering +"Registruje sa: " +# ^Unregistering +"Vymazáva sa z registra: " +# ^SymbolNotFound +"Nemožno nájsť symbol: " +# ^CouldNotLoad +"Nemožno načítať: " +# ^CreateFolder +"Vytvorený priečinok: " +# ^CreateShortcut +"Vytvorený odkaz: " +# ^CreatedUninstaller +"Program pre odinštalovanie: " +# ^Delete +"Vymazaný súbor: " +# ^DeleteOnReboot +"Vymazať po reštartovaní systému: " +# ^ErrorCreatingShortcut +"Chyba pri vytváraní odkazu: " +# ^ErrorCreating +"Chyba pri vytváraní: " +# ^ErrorDecompressing +Chyba pri dekomprimovaní dát! Inštalátor je pravdepodobne poškodený... +# ^ErrorRegistering +Chyba pri registrácii súčasti +# ^ExecShell +"Vykonať príkaz: " +# ^Exec +"Spustiť: " +# ^Extract +"Extrahuje sa: " +# ^ErrorWriting +"Chyba pri zápise do súboru " +# ^InvalidOpcode +Inštalátor je pravdepodobne poškodený, pretože obsahuje neplatný operačný kód. +# ^NoOLE +"Žiadny zápis OLE pre: " +# ^OutputFolder +"Výstupný priečinok: " +# ^RemoveFolder +"Odstrániť priečinok: " +# ^RenameOnReboot +"Premenovať po reštartovaní systému: " +# ^Rename +"Premenovať: " +# ^Skipped +"Vynechané: " +# ^CopyDetails +Skopírovať podrobnosti do schránky +# ^LogInstall +Zaznamenať priebeh inštalácie +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nsh new file mode 100644 index 0000000000..fdba1a502d --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Slovak.nsh @@ -0,0 +1,133 @@ +;Language: Slovak (1051) +;Translated by: +; Kypec (peter.dzugas@mahe.sk) +;edited by: +; Marián Hikaník (podnety@mojepreklady.net) +; Ivan Masár , 2008. + +!insertmacro LANGFILE "Slovak" = "Slovenčina" "Slovencina" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi inštaláciou programu $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie inštaláciou $(^NameDA).$\r$\n$\r$\nPred začiatkom inštalácie sa odporúča ukončiť všetky ostatné programy. Tým umožníte aktualizovanie systémových súborov bez potreby reštartovania vášho počítača.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Vitajte v sprievodcovi odinštalovaním programu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Tento sprievodca vás prevedie procesom odinštalovania programu $(^NameDA).$\r$\n$\r$\nPred spustením procesu odinštalovania sa uistite, že program $(^NameDA) nie je práve aktívny.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenčná zmluva" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Pred inštaláciou $(^NameDA) si prosím preštudujte licenčné podmienky." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, kliknite na tlačidlo Súhlasím a môžete pokračovať v inštalácii. Ak chcete v inštalácii pokračovať, musíte odsúhlasiť podmienky licenčnej zmluvy $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaškrtnite nižšie uvedené políčko. Ak chcete v inštalácii pokračovať, musíte odsúhlasiť podmienky licenčnej zmluvy $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami zmluvy, označte prvú z nižšie uvedených možností. Ak chcete v inštalácii pokračovať, musíte odsúhlasiť podmienky licenčnej zmluvy $(^NameDA)." +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenčná zmluva" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Pred odinštalovaním programu $(^NameDA) si prosím prečítajte licenčné podmienky." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Ak súhlasíte s podmienkami zmluvy, zvoľte Súhlasím. Licenčnú zmluvu musíte odsúhlasiť, ak chcete v odinštalovaní programu $(^NameDA) pokračovať." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Ak súhlasíte s podmienkami zmluvy, zaškrtnite nižšie uvedené políčko. Licenčnú zmluvu musíte odsúhlasiť, ak chcete pokračovať v odinštalovaní programu $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Ak súhlasíte s podmienkami licenčnej zmluvy, označte prvú z nižšie uvedených možností. Licenčnú zmluvu musíte odsúhlasiť, ak chcete pokračovať v odinštalovaní programu $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Stlačením klávesu Page Down posuniete text licenčnej zmluvy." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Voľba súčastí programu" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Zvoľte si tie súčasti programu $(^NameDA), ktoré chcete nainštalovať." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Voľba súčastí" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Zvoľte súčasti programu $(^NameDA), ktoré chcete odinštalovať." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Popis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Pri prejdení kurzorom myši nad názvom súčasti sa zobrazí jej popis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Označte nejakú súčasť, ak chcete zobraziť jej podrobnejší popis." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Voľba umiestnenia programu" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Vyberte si priečinok, do ktorého chcete nainštalovať program $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Umiestenie programu pre odinštalovanie" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Vyberte si priečinok, z ktorého chcete odinštalovať program $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Inštalácia" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Počkajte prosím, kým prebehne inštalácia programu $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Ukončenie inštalácie" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Inštalácia bola dokončená úspešne." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Prerušenie inštalácie" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Inštaláciu sa nepodarilo dokončiť." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odinštalovanie" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Čakajte prosím, kým prebehne odinštalovanie programu $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Ukončenie odinštalovania" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odinštalovanie bolo úspešne dokončené." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Prerušenie odinštalovania" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odinštalovanie sa neukončilo úspešne." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Dokončenie inštalácie programu $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol nainštalovaný do vášho počítača.$\r$\nKliknite na tlačidlo Dokončiť a tento sprievodca sa ukončí." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Pre úplné dokončenie inštalácie programu $(^NameDA) je potrebné reštartovať váš počítač. Chcete ho reštartovať ihneď?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Dokončenie sprievodcu odinštalovaním" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) bol odinštalovaný z vášho počítača.$\r$\n$\r$\nKliknite na tlačidlo Dokončiť a tento sprievodca sa ukončí." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Pre úplné dokončenie odinštalovania programu $(^NameDA) je nutné reštartovať váš počítač. Chcete ho reštartovať ihneď?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reštartovať teraz" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Reštartovať neskôr (manuálne)" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Spustiť program $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Zobraziť súbor s informáciami" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Dokončiť" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Voľba umiestnenia v ponuke Štart" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Vyberte si priečinok v ponuke Štart, kam sa umiestnia odkazy na program $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Vyberte si priečinok v ponuke Štart, v ktorom chcete vytvoriť odkazy na program. Takisto môžete napísať názov nového priečinka." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Nevytvárať odkazy" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odinštalovanie programu $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstránenie programu $(^NameDA) z vášho počítača." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Naozaj chcete ukončiť inštaláciu programu $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Naozaj chcete ukončiť proces odinštalovania programu $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Vybrať používateľov" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Vyberte pre ktorých používateľov chcete nainštalovať $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Vyberte, či chcete nainštalovať program $(^NameDA) iba pre seba alebo pre všetkých používateľov tohto počítača. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Nainštalovať pre všetkých používateľov tohto počítača" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Nainštalovať iba pre mňa" +!endif \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nlf new file mode 100644 index 0000000000..581b149f6c --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1060 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1250 +# RTL - anything else than RTL means LTR +- +# Translation by Janez Dolinar, edited by Martin Srebotnjak - Lugos.si +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Namestitev $(^Name) +# ^UninstallCaption +Odstranitev $(^Name) +# ^LicenseSubCaption +: Licenčna pogodba +# ^ComponentsSubCaption +: Možnosti namestitve +# ^DirSubCaption +: Mapa namestitve +# ^InstallingSubCaption +: Nameščanje poteka +# ^CompletedSubCaption +: Dokončano +# ^UnComponentsSubCaption +: Možnosti odstranitve +# ^UnDirSubCaption +: Mapa odstranitve +# ^ConfirmSubCaption +: Potrditev +# ^UninstallingSubCaption +: Odstranjevanje poteka +# ^UnCompletedSubCaption +: Dokončano +# ^BackBtn +< &Nazaj +# ^NextBtn +N&aprej > +# ^AgreeBtn +Se &strinjam +# ^AcceptBtn +&Sprejmem pogoje licenčne pogodbe +# ^DontAcceptBtn +&Ne sprejmem pogojev licenčne pogodbe +# ^InstallBtn +&Namesti +# ^UninstallBtn +&Odstrani +# ^CancelBtn +Prekliči +# ^CloseBtn +&Zapri +# ^BrowseBtn +Prebrsk&aj ... +# ^ShowDetailsBtn +&Podrobnosti +# ^ClickNext +Kliknite Naprej za nadaljevanje. +# ^ClickInstall +Kliknite Namesti za začetek namestitve. +# ^ClickUninstall +Kliknite Odstrani za odstranitev. +# ^NameIme +Ime +# ^Completed +Dokončano +# ^LicenseText +Prosimo, da pred namestitvijo $(^NameDA) pregledate licenčno pogodbo. Če se z njo strinjate, pritisnite Se strinjam. +# ^LicenseTextCB +Prosimo, da pred namestitvijo $(^NameDA) pregledate licenčno pogodbo. Če sprejmete vse naštete pogoje, potrdite spodnje polje. $_CLICK +# ^LicenseTextRB +Prosimo, da pred namestitvijo $(^NameDA) pregledate licenčno pogodbo. Če sprejmete vse naštete pogoje, izberite prvo spodaj podano možnost. $_CLICK +# ^UnLicenseText +Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenčno pogodbo. Če se z njo strinjate, pritisnite Se strinjam. +# ^UnLicenseTextCB +Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenčno pogodbo. Če sprejmete vse naštete pogoje, potrdite spodnje polje. $_CLICK +# ^UnLicenseTextRB +Prosimo, da pred odstranitvijo $(^NameDA) pregledate licenčno pogodbo. Če sprejmete vse naštete pogoje, izberite prvo spodaj podano možnost. $_CLICK +# ^Custom +Po meri ... +# ^ComponentsText +Označite komponente, ki jih želite namestiti, in pustite neoznačene tiste, katerih ne želite namestiti. $_CLICK +# ^ComponentsSubText1 +Izberite vrsto namestitve: +# ^ComponentsSubText2_NoInstTypes +Izberite komponente namestitve: +# ^ComponentsSubText2 +Ali pa izberite komponente, ki jih želite namestiti: +# ^UnComponentsText +Označite komponente, ki jih želite odstraniti, in pustite neoznačene tiste, ki jih ne želite odstraniti. $_CLICK +# ^UnComponentsSubText1 +Izberite vrsto odstranitve: +# ^UnComponentsSubText2_NoInstTypes +Izberite komponente za odstranitev: +# ^UnComponentsSubText2 +Ali pa izberite komponente namestitve, ki jih želite odstraniti: +# ^DirText +$(^NameDA) boste namestili v sledečo mapo. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK +# ^DirSubText +Ciljna mapa +# ^DirBrowseText +Izberite mapo, kamor želite namestiti $(^NameDA): +# ^UnDirText +Odstranili boste $(^NameDA) iz sledeče mape. Za izbiro druge mape kliknite tipko Prebrskaj in izberite drugo mapo. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Izberite mapo, od koder želite odstraniti $(^NameDA): +# ^SpaceAvailable +"Prostor na disku: " +# ^SpaceRequired +"Potreben prostor: " +# ^UninstallingText +$(^NameDA) bo odstranjen iz naslednje mape. $_CLICK +# ^UninstallingSubText +Odstranjevanje iz: +# ^FileError +Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Prekini za prekinitev namestitve,\r\nPonovi za ponoven poskus ali\r\nPrezri za izpust te datoteke. +# ^FileError_NoIgnore +Napaka pri odpiranju datoteke za pisanje: \r\n\r\n$0\r\n\r\nPritisnite Ponovi za ponoven poskus pisanja ali\r\Prekliči za prekinitev namestitve. +# ^CantWrite +"Ni mogoče pisati: " +# ^CopyFailed +Kopiranje neuspešno +# ^CopyTo +"Kopiranje v " +# ^Registering +"Registracija: " +# ^Unregistering +"Preklic registracije: " +# ^SymbolNotFound +"Ni mogoče najti simbola: " +# ^CouldNotLoad +"Ni mogoče naložiti: " +# ^CreateFolder +"Ustvarjanje mape: " +# ^CreateShortcut +"Ustvarjanje bližnjice: " +# ^CreatedUninstaller +"Ustvarjena odstranitev: " +# ^Delete +"Brisanje datoteke: " +# ^DeleteOnReboot +"Brisanje ob ponovnem zagonu: " +# ^ErrorCreatingShortcut +"Napaka ustvarjanja bližnjice: " +# ^ErrorCreating +"Napaka ustvarjanja: " +# ^ErrorDecompressing +Napaka pri razširjanju podatkov! Je namestitvena datoteka okvarjena? +# ^ErrorRegistering +Napaka registracije DLL +# ^ExecShell +"Izvajanje v lupini: " +# ^Exec +"Izvajanje: " +# ^Extract +"Razširjanje: " +# ^ErrorWriting +"Razširjanje: napaka pri pisanju v datoteko " +# ^InvalidOpcode +Namestitev neveljavna: napačen ukaz +# ^NoOLE +"Neobstoječi OLE za: " +# ^OutputFolder +"Ciljna mapa: " +# ^RemoveFolder +"Odstranjevanje mape: " +# ^RenameOnReboot +"Preimenovanje ob zagonu: " +# ^Rename +"Preimenovanje: " +# ^Skipped +"Izpuščeno: " +# ^CopyDetails +Kopiraj podrobnosti v odložišče +# ^LogInstall +Shrani potek namestitve +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nsh new file mode 100644 index 0000000000..7a77901a19 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Slovenian.nsh @@ -0,0 +1,130 @@ +;Language: Slovenian (1060) +;By Janez Dolinar, edited by Martin Srebotnjak - Lugos.si + +# We use "slovenski", the other alternative is "slovenščina" (Note: "slovenčina" is the native name of Slovak) +!insertmacro LANGFILE "Slovenian" = "Slovenski" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Dobrodošli v čarovniku namestitve $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ta čarovnik vas vodi skozi namestitev programa $(^NameDA).$\r$\n$\r$\nPred namestitvijo je priporočeno zapreti vsa ostala okna in programe. S tem omogočite nemoteno namestitev programa in potrebnih sistemskih datotek brez ponovnega zagona računalnika.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Dobrodošli v čarovniku za odstranitev $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ta čarovnik vas bo vodil skozi odstranitev $(^NameDA).$\r$\n$\r$\nPreden pričnete z odstranitvijo, se prepričajte, da program $(^NameDA) ni zagnan.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licenčna pogodba" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Prosimo, da si ogledate pogoje licenčne pogodbe pred namestitvijo $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Če se strinjate s pogoji, pritisnite Se strinjam. Da bi lahko namestili $(^NameDA), se morate s pogodbo strinjati." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Če se strinjate z licenčnimi pogoji pogodbe, spodaj izberite ustrezno okence. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Če se strinjate z licenčnimi pogoji pogodbe, spodaj izberite prvo možnost. Za namestitev $(^NameDA) se morate strinjati s pogoji pogodbe. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licenčna pogodba" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Prosimo, da pred odstranitvijo $(^NameDA) pregledate pogoje licenčne pogodbe." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Če se strinjate s pogoji licenčne pogodbe, izberite Se strinjam. Za odstranitev $(^NameDA) se morate strinjati s pogoji." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Če se strinjate s pogoji licenčne pogodbe, kliknite na okence spodaj. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Če se strinjate s pogoji licenčne pogodbe, spodaj izberite prvo podano možnost. Za odstranitev $(^NameDA) se morate strinjati s pogoji. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Za preostali del pogodbe pritisnite tipko 'Page Down'." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Izbor komponent" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Izberite, katere komponente izdelka $(^NameDA) želite namestiti." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Izbor komponent" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Izberite komponente $(^NameDA), ki jih želite odstraniti." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Opis" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Povlecite miško nad komponento, da vidite njen opis." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Izberite komponento za prikaz njenega opisa." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Izberite pot namestive" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Izberite mapo, v katero želite namestiti $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Izbor mape" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Izberite mapo, iz katere želite odstraniti $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Nameščanje poteka" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Prosimo, počakajte, $(^NameDA) se namešča." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Dokončana namestitev" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Namestitev je uspešno zaključena." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Prekinjena namestitev" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Namestitev ni bila uspešno zaključena." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Odstranjevanje poteka" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Prosimo, počakajte, dokler se program $(^NameDA) odstranjuje." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Odstranitev končana" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Odstranitev je uspešno končana." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Odstranitev prekinjena" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Odstranitev ni bila končana uspešno." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Zaključevanje namestitve $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Program $(^NameDA) je bil nameščen na vaš računalnik.$\r$\n$\r$\nPritisnite Dokončaj za zaprtje čarovnika." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Za dokončanje namestitve $(^NameDA) morate ponovno zagnati računalnik. Želite zdaj ponovno zagnati računalnik?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Čarovnik za odstranitev $(^NameDA) se zaključuje" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Program $(^NameDA) je odstranjen z vašega računalnika.$\r$\n$\r$\nKliknite Dokončaj, da zaprete čarovnika." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Da bi se namestitev $(^NameDA) dokončala, morate ponovno zagnati računalnik. Želite zdaj znova zagnati računalnik?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ponovni zagon" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Računalnik želim znova zagnati kasneje" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Zaženi $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Pokaži BeriMe" + ${LangFileString} MUI_BUTTONTEXT_FINISH "Do&končaj" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Izberite mapo menija Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Izberite mapo menija Start za bližnjice do $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Izberite mapo menija Start, kjer želite ustvariti bližnjico do programa. Če vpišete novo ime, boste ustvarili istoimensko mapo." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Ne ustvari bližnjic" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Odstranitev $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Odstrani $(^NameDA) z vašega računalnika." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ste prepričani, da želite prekiniti namestitev $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ste prepričani, da želite zapustiti odstranitev $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Izberite uporabnike" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Izberite uporabnike, za katere želite namestiti $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Izberite, ali želite namestiti $(^NameDA) le zase ali za vse uporabnike tega računalnika. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Namesti za vse uporabnike tega računalnika" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Namesti le zame" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nlf new file mode 100644 index 0000000000..4f6e309b4a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nlf @@ -0,0 +1,191 @@ +# Header, don't edit ;Español - España (Alfabetización Tradicional) +NLF v6 +# Language ID +1034 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by MoNKi & Joel +# Review and minor corrections Darwin Rodrigo Toledo Cáceres (niwrad777@gmail.com) www.winamp-es.com +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalación de $(^Name) +# ^UninstallCaption +Desinstalación de $(^Name) +# ^LicenseSubCaption +: Acuerdo de Licencia +# ^ComponentsSubCaption +: Opciones de Instalación +# ^DirSubCaption +: Directorio de Instalación +# ^InstallingSubCaption +: Instalando +# ^CompletedSubCaption +: Completado +# ^UnComponentsSubCaption +: Opciones de Desinstalación +# ^UnDirSubCaption +: Directorio de Desinstalación +# ^ConfirmSubCaption +: Confirmación +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Completado +# ^BackBtn +< &Atrás +# ^NextBtn +&Siguiente > +# ^AgreeBtn +A&cepto +# ^AcceptBtn +A&cepto los términos de la licencia +# ^DontAcceptBtn +&No acepto los términos de la licencia +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Cancelar +# ^CloseBtn +&Cerrar +# ^BrowseBtn +&Examinar... +# ^ShowDetailsBtn +Ver &detalles +# ^ClickNext +Presione Siguiente para continuar. +# ^ClickInstall +Presione Instalar para comenzar la instalación. +# ^ClickUninstall +Presione Desinstalar para comenzar la desinstalación. +# ^Name +Nombre +# ^Completed +Completado +# ^LicenseText +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto. +# ^LicenseTextCB +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK +# ^LicenseTextRB +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK +# ^UnLicenseText +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, presione Acepto. +# ^UnLicenseTextCB +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, marque abajo la casilla. $_CLICK. +# ^UnLicenseTextRB +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si acepta todos los términos del acuerdo, seleccione abajo la primera opción. $_CLICK +# ^Custom +Personalizada +# ^ComponentsText +Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK +# ^ComponentsSubText1 +Tipos de instalación: +# ^ComponentsSubText2_NoInstTypes +Seleccione los componentes a instalar: +# ^ComponentsSubText2 +O seleccione los componentes opcionales que desee instalar: +# ^UnComponentsText +Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK +# ^UnComponentsSubText1 +Tipos de desinstalación: +# ^UnComponentsSubText2_NoInstTypes +Seleccione los componentes a desinstalar: +# ^UnComponentsSubText2 +O seleccione los componentes opcionales que desee desinstalar: +# ^DirText +El programa de instalación instalará $(^NameDA) en el siguiente directorio. Para instalar en un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK +# ^DirSubText +Directorio de Destino +# ^DirBrowseText +Seleccione el directorio en el que instalará $(^NameDA): +# ^UnDirText +El programa de instalación desinstalará $(^NameDA) del siguiente directorio. Para desinstalar de un directorio diferente, presione Examinar y seleccione otro directorio. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Seleccione el directorio desde el cual desinstalará $(^NameDA): +# ^SpaceAvailable +Espacio disponible: +# ^SpaceRequired +Espacio requerido: +# ^UninstallingText +$(^NameDA) será desinstalado del siguiente directorio. $_CLICK +# ^UninstallingSubText +Desinstalando desde: +# ^FileError +Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione abortar para anular la instalación,\r\nreintentar para volver a intentar escribir el archivo, u\r\nomitir para ignorar este archivo +# ^FileError_NoIgnore +Error abriendo archivo para escritura: \r\n\t"$0"\r\nPresione reintentar para volver a intentar escribir el archivo, o\r\ncancelar para anular la instalación +# ^CantWrite +"No pudo escribirse: " +# ^CopyFailed +Falló la copia +# ^CopyTo +"Copiar a " +# ^Registering +"Registrando: " +# ^Unregistering +"Eliminando registro: " +# ^SymbolNotFound +"No pudo encontrarse símbolo: " +# ^CouldNotLoad +"No pudo cargarse: " +# ^CreateFolder +"Creando directorio: " +# ^CreateShortcut +"Creando acceso directo: " +# ^CreatedUninstaller +"Creando desinstalador: " +# ^Delete +"Borrar archivo: " +# ^DeleteOnReboot +"Borrar al reinicio: " +# ^ErrorCreatingShortcut +"Error creando acceso directo: " +# ^ErrorCreating +"Error creando: " +# ^ErrorDecompressing +¡Error descomprimiendo datos! ¿Instalador corrupto? +# ^ErrorRegistering +Error registrando DLL +# ^ExecShell +"Extrayendo comando: " +# ^Exec +"Extrayendo : " +# ^Extract +"Extraer: " +# ^ErrorWriting +"Extraer: error escribiendo al archivo " +# ^InvalidOpcode +Instalador corrupto: código de operación no válido +# ^NoOLE +"Sin OLE para: " +# ^OutputFolder +"Directorio de salida: " +# ^RemoveFolder +"Eliminar directorio: " +# ^RenameOnReboot +"Renombrar al reinicio: " +# ^Rename +"Renombrar: " +# ^Skipped +"Omitido: " +# ^CopyDetails +Copiar Detalles al Portapapeles +# ^LogInstall +Registrar proceso de instalación +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nsh new file mode 100644 index 0000000000..679a4269dd --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Spanish.nsh @@ -0,0 +1,130 @@ +;Language: Spanish (1034) +;By MoNKi & Joel +;Updates & Review Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com + +!insertmacro LANGFILE "Spanish" = "Español" "Espanol" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este programa instalará $(^NameDA) en su ordenador.$\r$\n$\r$\nSe recomienda que cierre todas las demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos relacionados con el sistema sin tener que reiniciar su ordenador.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de comenzar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para instalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para instalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise los términos de la licencia antes de desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todos los términos del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver su descripción." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija el directorio para instalar $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija el directorio desde el cual se desinstalará $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Completada" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha completado correctamente." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Anulada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se completó correctamente." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Completada" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha completado correctamente." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Anulada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se completó correctamente." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Completando el Asistente de Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para que pueda completarse la instalación de $(^NameDA). ¿Desea reiniciar ahora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su ordenador debe ser reiniciado para completar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Ver Léame" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Seleccione si desea instalar $(^NameDA) sólo para Ud. o para todos los usuarios de este Ordenador.$(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de este ordenador" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nlf new file mode 100644 index 0000000000..281c576ae8 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nlf @@ -0,0 +1,191 @@ +# Header, don't edit ;Español (Alfabetización Internacional) +NLF v6 +# Language ID +3082 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - nwrad777@gmail.com +# Base traslation by MoNKi & Joel +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Instalación de $(^Name) +# ^UninstallCaption +Desinstalación de $(^Name) +# ^LicenseSubCaption +: Acuerdo de Licencia +# ^ComponentsSubCaption +: Opciones de Instalación +# ^DirSubCaption +: Carpeta de Instalación +# ^InstallingSubCaption +: Instalando +# ^CompletedSubCaption +: Finalizado +# ^UnComponentsSubCaption +: Opciones de Desinstalación +# ^UnDirSubCaption +: Carpeta de Desinstalación +# ^ConfirmSubCaption +: Confirmación +# ^UninstallingSubCaption +: Desinstalando +# ^UnCompletedSubCaption +: Finalizado +# ^BackBtn +< &Atrás +# ^NextBtn +&Siguiente > +# ^AgreeBtn +&Acepto +# ^AcceptBtn +&Acepto las condiciones del Acuerdo de Licencia +# ^DontAcceptBtn +No &acepto las condiciones del Acuerdo de Licencia +# ^InstallBtn +&Instalar +# ^UninstallBtn +&Desinstalar +# ^CancelBtn +Cancelar +# ^CloseBtn +&Cerrar +# ^BrowseBtn +&Examinar... +# ^ShowDetailsBtn +Mostrar &detalles +# ^ClickNext +Presione Siguiente para continuar. +# ^ClickInstall +Presione Instalar para iniciar la instalación. +# ^ClickUninstall +Presione Desinstalar para iniciar la desinstalación. +# ^Name +Nombre +# ^Completed +Finalizado +# ^LicenseText +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto. +# ^LicenseTextCB +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK +# ^LicenseTextRB +Por favor, revise el acuerdo de licencia antes de instalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK +# ^UnLicenseText +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, presione Acepto. +# ^UnLicenseTextCB +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, marque abajo la casilla. $_CLICK +# ^UnLicenseTextRB +Por favor, revise el acuerdo de licencia antes de desinstalar $(^NameDA). Si usted acepta todas las condiciones del acuerdo, seleccione abajo la primera opción. $_CLICK +# ^Custom +Personalizada +# ^ComponentsText +Marque los componentes que desee instalar y desmarque los componentes que no desee instalar. $_CLICK +# ^ComponentsSubText1 +Seleccione el tipo de instalación: +# ^ComponentsSubText2_NoInstTypes +Seleccione los componentes a instalar: +# ^ComponentsSubText2 +O seleccione los componentes opcionales que desee instalar: +# ^UnComponentsText +Marque los componentes que desee desinstalar y desmarque los componentes que no desee desinstalar. $_CLICK +# ^UnComponentsSubText1 +Seleccione el tipo de desinstalación: +# ^UnComponentsSubText2_NoInstTypes +Seleccione los componentes a desinstalar: +# ^UnComponentsSubText2 +O seleccione los componentes opcionales que desee desinstalar: +# ^DirText +El programa de instalación instalará $(^NameDA) en la siguiente carpeta. Para instalar en una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK +# ^DirSubText +Carpeta de Destino +# ^DirBrowseText +Seleccione la carpeta en la que instalará $(^NameDA): +# ^UnDirText +El programa de instalación desinstalará $(^NameDA) de la siguiente carpeta. Para desinstalar de una carpeta diferente, presione Examinar y seleccione otra carpeta. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Seleccione la carpeta desde la que desinstalará $(^NameDA): +# ^SpaceAvailable +Espacio disponible: +# ^SpaceRequired +Espacio requerido: +# ^UninstallingText +$(^NameDA) será desinstalado de la siguiente carpeta. $_CLICK +# ^UninstallingSubText +Desinstalando desde: +# ^FileError +Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Abortar para detener la instalación,\r\nReintentar para probar otra vez, o\r\nOmitir para ignorar este archivo. +# ^FileError_NoIgnore +Error abriendo archivo para escribir: \r\n\r\n$0\r\n\r\nPresione Reintentar para probar otra vez, o\r\nCancelar para detener la instalación. +# ^CantWrite +"No pudo escribirse: " +# ^CopyFailed +Copia fallida +# ^CopyTo +"Copiar a " +# ^Registering +"Registrando: " +# ^Unregistering +"Eliminando registro: " +# ^SymbolNotFound +"No se encontró simbolo: " +# ^CouldNotLoad +"No pudo cargarse: " +# ^CreateFolder +"Creando carpeta: " +# ^CreateShortcut +"Creando acceso directo: " +# ^CreatedUninstaller +"Creando desinstalador: " +# ^Delete +"Borrar archivo: " +# ^DeleteOnReboot +"Borrar al reinicio: " +# ^ErrorCreatingShortcut +"Error creando acceso directo: " +# ^ErrorCreating +"Error creando: " +# ^ErrorDecompressing +¡Error descomprimiendo datos! ¿Instalador corrupto? +# ^ErrorRegistering +Error registrando DLL +# ^ExecShell +"Ejecutando comando: " +# ^Exec +"Ejecutando: " +# ^Extract +"Extrayendo: " +# ^ErrorWriting +"Extrayendo: error escribiendo al archivo " +# ^InvalidOpcode +Instalador corrupto: código de operación no válido +# ^NoOLE +"Sin OLE para: " +# ^OutputFolder +"Carpeta de salida: " +# ^RemoveFolder +"Eliminar carpeta: " +# ^RenameOnReboot +"Renombrar al reinicio: " +# ^Rename +"Renombrar: " +# ^Skipped +"Omitido: " +# ^CopyDetails +Copiar Detalles al Portapapeles +# ^LogInstall +Registrar proceso de instalación +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nsh new file mode 100644 index 0000000000..24140c59f7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/SpanishInternational.nsh @@ -0,0 +1,130 @@ +;Language: Spanish International (3082) +;By Darwin Rodrigo Toledo Cáceres - www.winamp-es.com - niwrad777@gmail.com +;Base by Monki y Joel + +!insertmacro LANGFILE "SpanishInternational" "Spanish (International)" "Español (Alfabetización Internacional)" "Espanol (Alfabetizacion Internacional)" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Este asistente le guiará a través de la instalación de $(^NameDA).$\r$\n$\r$\nSe recomienda que cierre todas la demás aplicaciones antes de iniciar la instalación. Esto hará posible actualizar archivos de sistema sin tener que reiniciar su computadora.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Bienvenido al Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Este asistente le guiará durante la desinstalación de $(^NameDA).$\r$\n$\r$\nAntes de iniciar la desinstalación, asegúrese de que $(^NameDA) no se está ejecutando.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Acuerdo de licencia" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para instalar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta las condiciones del acuerdo, marque abajo la casilla. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta las condiciones del acuerdo, seleccione abajo la primera opción. Debe aceptar las condiciones para instalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Acuerdo de licencia" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Por favor revise el acuerdo de licencia antes de desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Si acepta todas las condiciones del acuerdo, seleccione Acepto para continuar. Debe aceptar el acuerdo para desinstalar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Si acepta los términos del acuerdo, marque abajo la casilla. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Si acepta los términos del acuerdo, seleccione abajo la primera opción. Debe aceptar los términos para desinstalar $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Presione Avanzar Página para ver el resto del acuerdo." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Selección de componentes" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea instalar." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Selección de componentes" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Seleccione qué características de $(^NameDA) desea desinstalar." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Descripción" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sitúe el ratón encima de un componente para ver su descripción." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Seleccione un componente para ver su descripción." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Elegir lugar de instalación" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Elija la carpeta para instalar $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Elegir lugar de desinstalación" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Elija la carpeta desde la cual desinstalará $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Instalando" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se instala." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Instalación Finalizada" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "La instalación se ha finalizado correctamente." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Instalación Abortada" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "La instalación no se terminó correctamente." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Desinstalando" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Por favor espere mientras $(^NameDA) se desinstala." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Desinstalación Finalizada" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "La desinstalación se ha finalizado correctamente." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Desinstalación Abortada" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "La desinstalación no se terminó correctamente." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Finalizando el Asistente de Instalación de $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido instalado en su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Su sistema debe ser reiniciado para poder finalizar la instalación de $(^NameDA). ¿Desea reiniciar ahora?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Completando el Asistente de Desinstalación de $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ha sido desinstalado de su sistema.$\r$\n$\r$\nPresione Terminar para cerrar este asistente." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Su computadora debe ser reiniciada para finalizar la desinstalación de $(^NameDA). ¿Desea reiniciar ahora?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Reiniciar ahora" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Deseo reiniciar manualmente más tarde" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Ejecutar $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Mostrar Léame" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Terminar" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Elegir Carpeta del Menú Inicio" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Elija una Carpeta del Menú Inicio para los accesos directos de $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Seleccione una carpeta del Menú Inicio en la que quiera crear los accesos directos del programa. También puede introducir un nombre para crear una nueva carpeta." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "No crear accesos directos" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Desinstalar $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Elimina $(^NameDA) de su sistema." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "¿Está seguro de que desea salir de la instalación de $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "¿Está seguro de que desea salir de la desinstalación de $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Elegir Usuarios" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Elija los usuarios para los cuales Ud. desea instalar $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Elija una opción si desea instalar $(^NameDA) para sólo para Ud., o para todos los usuarios de esta computadora.$(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Instación para cualquier usuario de esta computadora" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Instalación solo para mí" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nlf new file mode 100644 index 0000000000..87b9122e41 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1053 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Magnus Bonnevier (magnus.bonnevier@telia.com) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Installation +# ^UninstallCaption +$(^Name) Avinstallation +# ^LicenseSubCaption +: Licensavtal +# ^ComponentsSubCaption +: Installationsval +# ^DirSubCaption +: Installationskatalog +# ^InstallingSubCaption +: Installerar +# ^CompletedSubCaption +: Slutförd +# ^UnComponentsSubCaption +: Avinstallationsval +# ^UnDirSubCaption +: Avinstallationskatalog +# ^ConfirmSubCaption +: Bekräftelse +# ^UninstallingSubCaption +: Avinstallerar +# ^UnCompletedSubCaption +: Slutförd +# ^BackBtn +< &Tillbaka +# ^NextBtn +&Nästa > +# ^AgreeBtn +Jag &Godkänner +# ^AcceptBtn +Jag &Godkänner villkoren i licensavtalet +# ^DontAcceptBtn +Jag &Godkänner inte villkoren i licensavtalet +# ^InstallBtn +&Installera +# ^UninstallBtn +&Avinstallera +# ^CancelBtn +Avbryt +# ^CloseBtn +&Stäng +# ^BrowseBtn +B&läddra... +# ^ShowDetailsBtn +Visa &detaljer +# ^ClickNext +Klicka på Nästa för att fortsätta. +# ^ClickInstall +Klicka på Installera för att starta installationen. +# ^ClickUninstall +Klicka på Avinstallera för att starta avinstallationen. +# ^Name +Namn +# ^Completed +Slutförd +# ^LicenseText +Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner. +# ^LicenseTextCB +Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK +# ^LicenseTextRB +Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK +# ^UnLicenseText +Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka Jag Godkänner. +# ^UnLicenseTextCB +Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. $_CLICK +# ^UnLicenseTextRB +Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA). Om du accepterar villkoren i avtalet, välj det första alternativet nedan. $_CLICK +# ^Custom +Valfri +# ^ComponentsText +Markera de komponenter du vill installera och avmarkera de komponenter du inte vill installera. $_CLICK +# ^ComponentsSubText1 +Välj typ av installation: +# ^ComponentsSubText2_NoInstTypes +Välj komponenter att installera: +# ^ComponentsSubText2 +Eller, välj de alternativa komponenter du önskar installera: +# ^UnComponentsText +Markera de komponenter du vill avinstallera och avmarkera de komponenter du inte vill avinstallera. $_CLICK +# ^UnComponentsSubText1 +Välj typ av avinstallation: +# ^UnComponentsSubText2_NoInstTypes +Välj komponenter att avinstallera: +# ^UnComponentsSubText2 +Eller, välj de alternativa komponenter du önskar avinstallera: +# ^DirText +Guiden kommer att installera $(^NameDA) i följande katalog. För att installera i en annan katalog, klicka Bläddra och välj en alternativ katalog. $_CLICK +# ^DirSubText +Målkatalog +# ^DirBrowseText +Välj katalog att installera $(^NameDA) i: +# ^UnDirText +Installationsguiden kommer att avinstallera $(^NameDA) från följande katalog. För att avinstallera från en annan katalog, klicka Bläddra och välj en annan katalog. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Välj katalog att avinstallera $(^NameDA) från: +# ^SpaceAvailable +"Utrymme tillgängligt: " +# ^SpaceRequired +"Utrymme som behövs: " +# ^UninstallingText +$(^NameDA) kommer att avinstalleras från följande katalog. $_CLICK +# ^UninstallingSubText +Avinstallerar från: +# ^FileError +Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka på avbryt för att avbryta installationen,\r\nförsök igen för att försöka skriva till filen igen, eller\r\nIgnorera för att skippa denna fil +# ^FileError_NoIgnore +Fel vid Öppning av fil för skrivning: \r\n\t"$0"\r\nKlicka på försök igen för att skriva till filen igen, eller\r\navbryt för att avbryta installationen +# ^CantWrite +"Kan inte skriva: " +# ^CopyFailed +Kopiering misslyckades +# ^CopyTo +"Kopiera till " +# ^Registering +"Registrerar: " +# ^Unregistering +"Avregistrerar: " +# ^SymbolNotFound +"Kunde inte hitta symbol: " +# ^CouldNotLoad +"Kunde inte ladda: " +# ^CreateFolder +"Skapa katalog: " +# ^CreateShortcut +"Skapa genväg: " +# ^CreatedUninstaller +"Skapade avinstallationsprogram: " +# ^Delete +"Radera fil: " +# ^DeleteOnReboot +"Radera vid omstart: " +# ^ErrorCreatingShortcut +"Fel vid skapande av genväg: " +# ^ErrorCreating +"Fel vid skapande: " +# ^ErrorDecompressing +Fel vid uppackning av data! Skadat installationspaket? +# ^ErrorRegistering +Fel vid registrering av DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Kör: " +# ^Extract +"Extrahera: " +# ^ErrorWriting +"Extrahera: fel vid skrivning till fil " +# ^InvalidOpcode +Installationspaket skadat: ogiltig opcode +# ^NoOLE +"Ingen OLE för: " +# ^OutputFolder +"Målkatalog: " +# ^RemoveFolder +"Ta bort katalog: " +# ^RenameOnReboot +"Döp om vid omstart: " +# ^Rename +"Döp om: " +# ^Skipped +"Ignorerad: " +# ^CopyDetails +Kopiera detaljinformation till klippbordet +# ^LogInstall +Logga installationsförfarandet +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nsh new file mode 100644 index 0000000000..b8eb9cd5df --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Swedish.nsh @@ -0,0 +1,130 @@ +;Compatible with Modern UI 1.72 +;Language: Swedish (1053) +;By Magnus Bonnevier (magnus.bonnevier@telia.com), updated by Rickard Angbratt (r.angbratt@home.se), updated by Ulf Axelsson (ulf.axelsson@gmail.com) + +!insertmacro LANGFILE "Swedish" = "Svenska" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Välkommen till installationsguiden för $(^NameDA)." + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom installationen av $(^NameDA).$\r$\n$\r$\nDet rekommenderas att du avslutar alla andra program innan du fortsätter installationen. Detta tillåter att installationen uppdaterar nödvändiga systemfiler utan att behöva starta om din dator.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Välkommen till avinstallationsguiden för $(^NameDA)." + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Denna guide tar dig igenom avinstallationen av $(^NameDA).$\r$\n$\r$\nInnan du startar avinstallationen, försäkra dig om att $(^NameDA) inte körs.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Licensavtal" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du installerar $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du måste acceptera avtalet för att installera $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du måste acceptera avtalet för att installera $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du måste acceptera avtalet för att installera $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Licensavtal" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Var vänlig läs igenom licensvillkoren innan du avinstallerar $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Om du accepterar villkoren i avtalet, klicka Jag Godkänner för att fortsätta. Du måste acceptera avtalet för att avinstallera $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Om du accepterar villkoren i avtalet, klicka i checkrutan nedan. Du måste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Om du accepterar villkoren i avtalet, välj det första alternativet nedan. Du måste acceptera avtalet för att avinstallera $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Tryck Page Down för att se resten av licensavtalet." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Välj komponenter" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill installera." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Välj komponenter" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Välj vilka alternativ av $(^NameDA) som du vill avinstallera." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beskrivning" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Håll muspekaren över ett alternativ för att se dess beskrivning." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Välj ett alternativ för att se dess beskrivning." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Välj installationsväg" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Välj katalog att installera $(^NameDA) i." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Välj avinstallationsväg" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Välj katalog att avinstallera $(^NameDA) från." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Installerar" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) installeras." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Installationen är klar" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Guiden avslutades korrekt." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Installationen avbröts" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Guiden genomfördes inte korrekt." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Avinstallerar" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Var vänlig vänta medan $(^NameDA) avinstalleras." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Avinstallationen genomförd" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Avinstallationen genomfördes korrekt." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Avinstallationen avbruten" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Avinstallationen genomfördes inte korrekt." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Avslutar installationsguiden för $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) har installerats på din dator.$\r$\n$\r$\nKlicka på Slutför för att avsluta guiden." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Din dator måste startas om för att fullborda installationen av $(^NameDA). Vill du starta om nu?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Avslutar avinstallationsguiden för $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) komponenter har avinstallerats från din dator.$\r$\n$\r$\nKlicka på Slutför för att avsluta guiden." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Din dator måste startas om för att fullborda avinstallationen av $(^NameDA). Vill du starta om nu?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Starta om nu" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Jag vill starta om själv senare" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Kör $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Visa Readme-filen" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Slutför" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Välj Startmenykatalog" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Välj en Startmenykatalog för programmets genvägar." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Välj startmenykatalog i vilken du vill skapa programmets genvägar. Du kan ange ett eget namn för att skapa en ny katalog." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Skapa ej genvägar" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Avinstallera $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Ta bort $(^NameDA) från din dator." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Är du säker på att du vill avbryta installationen av $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Är du säker på att du vill avbryta avinstallationen av $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Välj användare" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Välj för vilka användare du vill installera $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Välj huruvida du vill installera $(^NameDA) enbart för dig själv eller för alla användare på denna dator. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Installera för alla som använder denna dator" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Installera bara för mig" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nlf new file mode 100644 index 0000000000..a46d6a37e5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1092 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- +# Translation by Bulat Azat uly [ bulat_ibrahim@mail.ru ] +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Урнаштыру $(^Name) +# ^UninstallCaption +Бетерү $(^Name) +# ^LicenseSubCaption +: Лицензия килешүе +# ^ComponentsSubCaption +: Урнаштыру шартлары +# ^DirSubCaption +: Урнаштыру папкасы +# ^InstallingSubCaption +: Файлларны күчермәләү +# ^CompletedSubCaption +: Гамәл тәмамланды +# ^UnComponentsSubCaption +: Бетерү шартлары +# ^UnDirSubCaption +: Бетерү папкасы +# ^ConfirmSubCaption +: Раслау +# ^UninstallingSubCaption +: Файлларны бетерү +# ^UnCompletedSubCaption +: Гамәл тәмамланды +# ^BackBtn +< &Артка +# ^NextBtn +&Алга > +# ^AgreeBtn +Кабул ит&әм +# ^AcceptBtn +Мин &килешү шартларын кабул итәм +# ^DontAcceptBtn +Мин &килешү шартларын кабул итими +# ^InstallBtn +&Урнаштырырга +# ^UninstallBtn +Бе&терергә +# ^CancelBtn +Баш тарту +# ^CloseBtn +&Ябарга +# ^BrowseBtn +К&арарга... +# ^ShowDetailsBtn +&Тулырак... +# ^ClickNext +Дәвам итү өчен 'Алга' төймәсенә басыгыз. +# ^ClickInstall +Программаны урнаштыру өчен 'Урнаштырырга' төймәсенә басыгыз. +# ^ClickUninstall +Программаны бетерү өчен 'Бетерергә' төймәсенә басыгыз. +# ^Name +Исем +# ^Completed +Әзер +# ^LicenseText +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, 'Кабул итәм' төймәсенә басыгыз. +# ^LicenseTextCB +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $_CLICK +# ^LicenseTextRB +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $_CLICK +# ^UnLicenseText +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, 'Кабул итәм' төймәсенә басыгыз. +# ^UnLicenseTextCB +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $_CLICK +# ^UnLicenseTextRB +$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз. Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $_CLICK +# ^Custom +Сайлап кына +# ^ComponentsText +Программаның урнаштырырга теләгән компонентларын сайлагыз. $_CLICK +# ^ComponentsSubText1 +Урнаштыру төрен сайлагыз: +# ^ComponentsSubText2_NoInstTypes +Урнаштыру өчен программаның компонентларын сайлагыз: +# ^ComponentsSubText2 +яки урнаштыру өчен өстәмә компонентлар сайлагыз: +# ^UnComponentsText +Бетерергә теләгән компонентларны сайлагыз. $_CLICK +# ^UnComponentsSubText1 +Бетерү төрен сайлагыз: +# ^UnComponentsSubText2_NoInstTypes +Бетерү өчен компонентларны сайлагыз: +# ^UnComponentsSubText2 +яки бетерү өчен өстәмә компонентларны сайлагыз: +# ^DirText +Программа $(^NameDA) программасын күрсәтерлән папкага урнаштырачак. Башка папкага урнаштыру өчен, 'Карарга' төймәсенә басыгыз һәм урын күрсәтегез. $_CLICK +# ^DirSubText +Урнаштыру папкасы +# ^DirBrowseText +$(^NameDA) урнаштыру өчен папка сайлагыз: +# ^UnDirText +Программа $(^NameDA) программасын күрсәтелгән папкадан бетерәчәк. Башка папкадан бетерү өчен, 'Карарга' төймәсенә басыгыз һәм урын күрсәтегез. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA) бетерергә кирәк булган папканы күрсәтегез: +# ^SpaceAvailable +"Дискта буш урын: " +# ^SpaceRequired +"Дискта кирәк урын: " +# ^UninstallingText +$(^NameDA) программасы санагыгыздан бетереләчәк. $_CLICK +# ^UninstallingSubText +Моннан бетерү: +# ^FileError +Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Туктату': урнаштыруны туктатырга;\r\n"Кабатлау": омтылышны кабатларга;\r\n"Калдыру": бу гамәлне төшереп калдырырга. +# ^FileError_NoIgnore +Яздыру өчен файлны ачып булмый: \r\n\t"$0"\r\n'Кабатлау': омтылышны кабатларга;\r\n'Баш тарту': урнаштыру барышын туктатырга. +# ^CantWrite +"Яздырып булмый: " +# ^CopyFailed +Күчермә ясауда хата +# ^CopyTo +"Монда күчермәләү: " +# ^Registering +"Теркәлү: " +# ^Unregistering +"Теркәүдән баш тарту: " +# ^SymbolNotFound +"Символны табып булмый: " +# ^CouldNotLoad +"Йөкләп булмый: " +# ^CreateFolder +"Папка ясау: " +# ^CreateShortcut +"Сылтама ясау: " +# ^CreatedUninstaller +"Бетерү программасын ясау: " +# ^Delete +"Файлны бетерү: " +# ^DeleteOnReboot +"Санак сүндереп кабызылганда бетерү: " +# ^ErrorCreatingShortcut +"Сылтама ясауда хата: " +# ^ErrorCreating +"Ясауда хата: " +# ^ErrorDecompressing +Мәгълүматларны чыгаруда хата! Урнаштыручы бозык булуы мөмкин. +# ^ErrorRegistering +DLL теркәүдә хата +# ^ExecShell +"Тышча командасын башкару: " +# ^Exec +"Башкару: " +# ^Extract +"Чыгару: " +# ^ErrorWriting +"Чыгару: файл яздыруда хата " +# ^InvalidOpcode +Урнаштыручы бозылган: мөмкин булмаган код +# ^NoOLE +"OLE моның өчен юк: " +# ^OutputFolder +"Урнаштыру папкасы: " +# ^RemoveFolder +"Папканы бетерү: " +# ^RenameOnReboot +"Санак сүндереп кабызылганда исемен үзгәртү: " +# ^Rename +"Исемен үзгәртү: " +# ^Skipped +"Калдыру: " +# ^CopyDetails +Мәгълүматларны алмашыну буферына күчермәләргә +# ^LogInstall +Урнаштыру хисабын алып барырга +# byte (байт) +б +# kilo + К +# mega + М +# giga + Г \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nsh new file mode 100644 index 0000000000..a42d365b5e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Tatar.nsh @@ -0,0 +1,129 @@ +;Language: Tatar (1092) +;Translation by Bulat Azat uly [bulat_ibrahim@mail.ru] + +!insertmacro LANGFILE "Tatar" = "Татарча" "Tatarcha" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) урнаштыручыга рәхим итегез" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программасын санагыгызга урнаштырыр.$\r$\n$\r$\nУрнаштыру алдыннан бөтен ачык кушымталарны ябарга тәкъдим ителә. Бу урнаштыру программасына система файлларын санакны сүндереп кабызмыйча яңартырга мөмкинлек бирә.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) бетерүчегә рәхим итегез" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Бу программа $(^NameDA) программасын санагыгыздан бетерер.$\r$\n$\r$\nДәвам итү алдыннан $(^NameDA) җибәрелмәгәнлеген тикшерегез.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Лицензия килешүе" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) урнаштыру алдыннан лицензия килешүе белән танышыгыз." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итсәгез, $\"Кабул итәм$\" төймәсенә басыгыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $(^NameDA) урнаштыру өчен, килешүне кабул итәргә кирәк. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Лицензия килешүе" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA) бетерү алдыннан лицензия килешүе белән танышыгыз." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Килешү шартларын кабул итсәгез, $\"Кабул итәм$\" төймәсенә басыгыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Килешү шартларын кабул итсәгез, түбәндә билге куегыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Килешү шартларын кабул итсәгез, түбәндәге вариантлардан беренчесен сайлагыз. $(^NameDA) бетерү өчен, килешүне кабул итәргә кирәк. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Текст буенча күчү өчен, $\"PageUp$\" һәм $\"PageDown$\" төймәләренә басыгыз." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Урнаштырылучы программаның компонентлары" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Урнаштырырга теләгән $(^NameDA) компонентларын сайлагыз." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Программа компонентлары" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Бетерергә теләгән $(^NameDA) компонентларын сайлагыз." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Тасвирлама" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның тасвирламасын уку өчен, аның исеменә тычкан курсорын китерегез." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Компонентның тасвирламасын уку өчен, аны билгеләгез." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Урнаштыру папкасын сайлау" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) урнаштыру өчен папка сайлагыз." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Бетерү папкасын сайлау" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) бетерергә кирәк булган папканы сайлагыз." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Файлларны күчермәләү" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) файллары күчермәләнә, көтегез..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Урнаштыру тәмамланды" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Урнаштыру уңышлы тәмамланды." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Урнаштыру туктатылды" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Урнаштыру уңышсыз тәмамланды." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Бетерү" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) файллары бетерелә, көтегез..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Бетерү тәмамланды" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Программаны бетерү уңышлы тәмамланды." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Бетерү туктатылды" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Бетерү тулысынча башкарылмады." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) урнаштыручы эшен тәмамлау" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) санагыгызга урнаштырылды.$\r$\n$\r$\nУрнаштыру программасыннан чыгу өчен $\"Тәмам$\" төймәсенә басыгыз." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) урнаштыруын тәмамлау өчен, санакны сүндереп кабызырга кирәк. Аны хәзер башкарыргамы?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) бетерүче эшен тәмамлау" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) санагыгыздан бетерелде.$\r$\n$\r$\nБетерү программасыннан чыгу өчен $\"Тәмам$\" төймәсенә басыгыз." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) бетерүен тәмамлау өчен, санакны сүндереп кабызырга кирәк. Аны хәзер башкарыргамы?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Әйе, санакны хәзер сүндереп кабызырга" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Юк, мин соңрак сүндереп кабызырмын" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) программасын җибәр&ергә" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&ReadMe файлын күрсәтергә" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Тәмам" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "$\"Башлау$\" менюсында папка" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$\"Башлау$\" менюсында программа сылтамаларын урнаштыру өчен папка сайлагыз." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Башлау$\" менюсында программа сылтамалары урнаштырылачак папканы сайлагыз. Шулай ук папкага башка исем бирә аласыз." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Сылтамалар ясамаска" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) бетерү" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Санактан $(^NameDA) бетерү." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Чыннан да $(^Name) урнаштыруын туктатыргамы?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Чыннан да $(^Name) бетерүен туктатыргамы?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Урнаштыру режимы" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Кайсы кулланучылар өчен $(^NameDA) урнаштырырга телисез, сайлагыз." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "$(^NameDA) программасын үзегезгә генә яки бөтен кулланучылар өчен дә урнаштырачагыгызны сайлагыз. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Бөтен кулланучылар өчен урнаштырырга" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Минем өчен генә урнаштырырга" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nlf new file mode 100644 index 0000000000..d866de39b0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1054 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +874 +# RTL - anything else than RTL means LTR +- +# Translation by SoKoOLz, TuW@nNu (asdfuae) +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) ติดตั้ง +# ^UninstallCaption +$(^Name) ยกเลิกการติดตั้ง +# ^LicenseSubCaption +: ข้อตกลงเรื่องลิขสิทธิ์ +# ^ComponentsSubCaption +: ตัวเลือกการติดตั้ง +# ^DirSubCaption +: แฟ้มที่ติดตั้ง +# ^InstallingSubCaption +: กำลังติดตั้ง +# ^CompletedSubCaption +: เสร็จสิ้น +# ^UnComponentsSubCaption +: ตัวเลือกยกเลิกการติดตั้ง +# ^UnDirSubCaption +: แฟ้มที่ยกเลิกการติดตั้ง +# ^ConfirmSubCaption +: ยืนยัน +# ^UninstallingSubCaption +: กำลังยกเลิกการติดตั้ง +# ^UnCompletedSubCaption +: เสร็จสิ้น +# ^BackBtn +< &กลับไป +# ^NextBtn +&ต่อไป > +# ^AgreeBtn +&ตกลง +# ^AcceptBtn +&ตกลงยอมรับข้อต่างๆในหัวข้อลิขสิทธิ์ +# ^DontAcceptBtn +&ไม่ยอมรับข้อต่างๆในหัวข้อลิขสิทธิ์ +# ^InstallBtn +&ติดตั้ง +# ^UninstallBtn +&ยกเลิกการติดตั้ง +# ^CancelBtn +ยกเลิก +# ^CloseBtn +&ปิด +# ^BrowseBtn +เ&รียกดู... +# ^ShowDetailsBtn +&รายละเอียด +# ^ClickNext +กด ต่อไป เพื่อเริ่มระบบอัติโนมัติ +# ^ClickInstall +กด ติดตั้ง เพื่อทำการติดตั้ง +# ^ClickUninstall +กด ยกเลิกการติดตั้ง เพื่อยกเลิกการติดตั้ง +# ^Name +ชื่อ +# ^Completed +เสร็จสิ้นแล้ว +# ^LicenseText +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, กด ฉันยอมรับ +# ^LicenseTextCB +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, กดเลือกที่กล่องด้านล่าง. $_CLICK +# ^LicenseTextRB +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, เลือกตัวเลือกแรกข้างล่าง. $_CLICK +# ^UnLicenseText +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการยกเลิกติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, กด ฉันยอมรับ +# ^UnLicenseTextCB +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการยกเลิกติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, กดเลือกที่กล่องด้านล่าง. $_CLICK +# ^UnLicenseTextRB +โปรดอ่านทวนเรื่องการยอมรับในลิขสิทธิ์ก่อนที่คุณจะทำการยกเลิกติดตั้ง $(^NameDA). ถ้าคุณยอมรับข้อตกลงในทุกๆด้าน, เลือกตัวเลือกแรกข้างล่าง. $_CLICK +# ^Custom +กำหนดเอง +# ^ComponentsText +เลื่อกสิ่งที่คุณต้องการติดตั้งและไม่เลือกสิ่งที่คุณไม่ต้องการติดตั้ง $_CLICK +# ^ComponentsSubText1 +เลือกวิธีการการติดตั้ง: +# ^ComponentsSubText2_NoInstTypes +เลือกสิ่งที่คุณต้องการติดตั้ง: +# ^ComponentsSubText2 +หรือ, เลือกตัวเลือกที่คุณต้องการติดตั้ง: +# ^UnComponentsText +เลือกตัวเลือกที่คุณต้องการจะยกเลิกการติดตั้งและไม่เลือกสิ่งที่คุณไม่ต้องการจะยกเลิกการติดตั้ง $_CLICK +# ^UnComponentsSubText1 +เลือกวิธีการยกเลิกการติดตั้ง: +# ^UnComponentsSubText2_NoInstTypes +เลือกตัวเลือกที่ต้องการจะยกเลิกการติดตั้ง: +# ^UnComponentsSubText2 +หรือ, เลือกจากตัวเลือกอื่นๆที่คุณต้องการจะยกเลิกการติดตั้ง: +# ^DirText +ตัวติดตั้งจะทำการติดตั้ง $(^NameDA) ลงในแฟ้มดังต่อไปนี้, ถ้าต้องการติดตั้งลงในแฟ้มอื่น, กด เรียกดูและเลือกแฟ้มอื่น $_CLICK +# ^DirSubText +แฟ้มที่ต้องการติดตั้ง +# ^DirBrowseText +เลือกแฟ้มที่ต้องการติดตั้ง $(^NameDA) ใน: +# ^UnDirText +ตัวติดตั้งจะทำการยกเลิกการติดตั้ง $(^NameDA) จากแฟ้มดังต่อไปนี้, ถ้าต้องการยกเลิกการติดตั้งจากแฟ้มอื่น, กด เรียกดู และเลือกแฟ้มอื่น $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +เลือกแฟ้มที่ต้องการยกเลิกการติดตั้ง $(^NameDA) จาก: +# ^SpaceAvailable +"มีพื้นที่เหลือ: " +# ^SpaceRequired +"ต้องการพื้นที่: " +# ^UninstallingText +$(^NameDA) จะถูกยกเลิกการติดตั้งจากแฟ้มต่อไปนี้. $_CLICK +# ^UninstallingSubText +ยกเลิกการติดตั้งจาก: +# ^FileError +ไม่สามารถเปิดไฟล์สำหรับเขียนได้: \r\n\r\n$0\r\n\r\nกด ยกเลิก เพื่อหยุดการติดตั้ง,\r\nลองอีกครั้ง เพื่อลองอีกครั้ง, หรือ\r\nเพิกเฉย เพื่อข้ามไฟล์นี้. +# ^FileError_NoIgnore +ไม่สามารถเปิดไฟล์สำหรับเขียนได้: \r\n\r\n$0\r\n\r\nกด ลองอีกครั้ง เพื่อลองอีกครั้ง, หรือ\r\nยกเลิกเพื่อหยุดการติดตั้ง +# ^CantWrite +"ไม่สามารถเขียน: " +# ^CopyFailed +คัดลอกผิดพลาด +# ^CopyTo +"คัดลอกไปยัง " +# ^Registering +"กำลังลงทะเบียน: " +# ^Unregistering +"ยกเลิกการลงทะเบียน: " +# ^SymbolNotFound +"ไม่สามารถหาสัญลักษณ์ได้: " +# ^CouldNotLoad +"ไม่สามารถโหลดได้: " +# ^CreateFolder +"สร้างแฟ้ม: " +# ^CreateShortcut +"สร้างชอร์ตคัท: " +# ^CreatedUninstaller +"สร้างตัวยกเลิกการติดตั้ง: " +# ^Delete +"ลบไฟล์: " +# ^DeleteOnReboot +"ลบตอนรีบูท: " +# ^ErrorCreatingShortcut +"มีปัญหาสร้างไฟล์ชอร์ตคัท: " +# ^ErrorCreating +"มีปัญหาในการสร้างไฟล์: " +# ^ErrorDecompressing +มีปัญหาในการคลายข้อมูล! เกิดข้อผิดพลาดจากตัวติดตั้ง? +# ^ErrorRegistering +มีปัญหาในการลงทะเบียน DLL +# ^ExecShell +"รันเชลล์ไฟล์: " +# ^Exec +"รันไฟล์: " +# ^Extract +"แตกไฟล์: " +# ^ErrorWriting +"แตกไฟล์: เกิดปัญหาในการเขียนไฟล์" +# ^InvalidOpcode +ตัวติดตั้งมีปัญหา: รหัส opcode ผิดพลาด +# ^NoOLE +"ไม่มี OLE สำหรับ: " +# ^OutputFolder +"แฟ้มทีติดตั้ง: " +# ^RemoveFolder +"ลบแฟ้ม: " +# ^RenameOnReboot +"เปลี่ยนชื่อตอนรีบูท: " +# ^Rename +"เปลี่ยนชื่อ: " +# ^Skipped +"ข้าม: " +# ^CopyDetails +คัดลอกรายละเอียดลงคลิปบอร์ด +# ^LogInstall +บันทึกการติดตั้ง +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nsh new file mode 100644 index 0000000000..99dc77dede --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Thai.nsh @@ -0,0 +1,121 @@ +;Language: Thai (1054) +;By SoKoOLz, TuW@nNu (asdfuae) + +!insertmacro LANGFILE "Thai" = "ไทย" /* TODO: ISO 11940? */ "Thai" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "ยินดีต้อนรับเข้าสู่การติดตั้งโปรแกรม $(^NameDA) " + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "ตัวติดตั้งอัติโนมัติจะนำคุณไปสู่การติดตั้งของ $(^NameDA).$\r$\n$\r$\nเราขอแนะนำให้ปิดโปรแกรมอื่นๆให้หมดก่อนที่จะเริ่มติดตั้ง, นี่จะเป็นการอัปเดทไฟล์ได้ง่ายขึ้นโดยคุณไม่จำเป็นต้องทำการรีบูทคอมพิวเตอร์ของคุณ$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "ยินดีต้อนรับสู่การยกเลิกการติดตั้งอัติโนมัติของ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "ตัวติดตั้งอัติโนมัตินี้จะนำคุณไปสู่การยกเลิกการติดตั้งของ $(^NameDA).$\r$\n$\r$\nการจะเริ่มการยกเลิกการติดตั้งนี้, โปรดตรวจสอบว่า $(^NameDA) ไม่ได้ใช้อยู่$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "ข้อตกลงเรื่องลิขสิทธิ์" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "โปรดอ่านทวนลิขสิทธิ์ในหัวข้อต่างๆอีกครั้งก่อนที่คุณจะทำการติดตั้ง $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "ถ้าคุณยอมรับข้อตกลงเรื่องลิขสิทธิ์, กด ฉันยอมรับ เพื่อทำต่อไป, คุณต้องยอมรับในข้อตกลงลิขสิทธิ์เพื่อที่จะทำการติดตั้ง $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "ถ้าคุณยอมรับข้อตกลงเรื่องลิขสิทธ, กดเลือกในกล่องข้างล่างนี้ คุณต้องยอมรับในข้อตกลงลิขสิทธิ์เพื่อที่จะทำการติดตั้ง $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ถ้าคุณยอมรับข้อตกลงเรื่องลิขสิทธ, เลือกตัวเลือกแรกด้านล่างนี้ คุณต้องยอมรับในข้อตกลงลิขสิทธิ์เพื่อที่จะทำการติดตั้ง $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "ข้อตกลงเรื่องลิขสิทธิ์" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "กรุณาอ่านข้อตกลงด้านลิขสิทธิ์ก่อนติดตั้งโปรแกรม $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "ถ้าคุณยอมรับในข้อตกลงนี้ กรุณากดปุ่ม ฉันยอมรับ และคุณจะต้องตกลงก่อนที่จะเริ่มการยกเลิกติดตั้งโปรแกรม $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "ถ้าคุณยอมรับข้อตกลงเรื่องลิขสิทธิ์, กดเลือกในกล่องข้างล่างนี้ คุณต้องยอมรับในข้อตกลงลิขสิทธิ์เพื่อที่จะทำการติดตั้ง $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "ถ้าคุณยอมรับข้อตกลงเรื่องลิขสิทธิ์, เลือกตัวเลือกแรกด้านล่างนี้ คุณต้องยอมรับในข้อตกลงลิขสิทธิ์เพื่อที่จะทำการติดตั้ง $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "กด Page Down เพื่ออ่านข้อตกลงทั้งหมด" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "เลือกส่วนประกอบ" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "เลือกสิ่งที่คุณต้องการใช้งานจาก $(^NameDA) ที่คุณต้องการติดตั้ง" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "เลือกส่วนประกอบ" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "เลือกสิ่งที่คุณต้องการใช้งานจาก $(^NameDA) ที่คุณต้องยกเลิกการติดตั้ง" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "รายละเอียด" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "ขยับเมาส์ของคุณเหนือส่วนประกอบเพื่อดูรายละเอียด" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "เลือกส่วนประกอบที่คุณต้องการดูรายละเอียด" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "เลือกที่ที่ต้องการติดตั้ง" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "เลือกแผ้มที่ต้องการติดตั้ง $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "เลือกแฟ้มที่ต้องการยกเลิกการติดตั้ง" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "เลือกแฟ้มที่คุณต้องการยกเลิกการติดตั้งของ $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "กำลังติดตั้ง" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "โปรดรอในขณะที่ $(^NameDA) กำลังถูกติดตั้ง" + ${LangFileString} MUI_TEXT_FINISH_TITLE "การติดตั้งเสร็จสิ้น" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "การติดตั้งเสร็จสมบูรณ์" + ${LangFileString} MUI_TEXT_ABORT_TITLE "การติดตั้งถูกยกเลิก" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "การติดตั้งไม่เสร็จสมบูรณ์" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "กำลังยกเลิกการติดตั้ง" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "โปรดรอในขณะที่ $(^NameDA) กำลังถูกยกเลิกการติดตั้ง." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "การยกเลิกการติดตั้งเสร็จสิ้น" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "การยกเลิกการติดตั้งเสร็จสิ้นโดยสมบูรณ์" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "การยกเลิกการติดตั้งถูกยกเลิก" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "การยกเลิกการติดตั้งไม่สำเร็จ" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "การติดตั้งอัติโนมัติของ $(^NameDA) กำลังเสร็จสิ้น" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) ได้ถูกติดตั้งลงในเครื่องคอมพิวเตอร์ของคุณแล้ว$\r$\n$\r$\nกด เสร็จสิ้นเพื่อปิดตัวติดตั้งอัติโนมัติ" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "เครื่องคอมพิวเตอร์ของคุณจำเป็นต้องรีสตารท์เพื่อการติดตั้งของ $(^NameDA) จะเรียบร้อย, คุณต้องการจะ รีบูท เดี๋ยวนี้ไหม?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "การยกเลิกการติดตั้งอัติโนมัติของ $(^NameDA) กำลังเสร็จสมบูรณ์" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ได้ถูกยกเลิกออกจากเครื่องคอมพิวเตอร์ของคุณแล้ว $\r$\n$\r$\nกด เสร็จสิ้น เพื่อปิดหน้าจอติดตั้งอัติโนมัติ" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "เครื่องคอมพิวเตอร์ของคุณจำเป็นต้องรีสตาร์ทในการที่จะทำการยกเลิกการติดตั้งของ $(^NameDA) เสร็จสิ้น, คุณต้องการจะรีบูทเดี๋ยวนี้ไหม?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "รีบูท เดี๋ยวนี้" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "ฉันต้องการ รีบูทด้วยตนเอง ทีหลัง" + ${LangFileString} MUI_TEXT_FINISH_RUN "&รัน $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&แสดงรายละเอียด" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&เสร็จสิ้น" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "เลือกแฟ้ม Start Menu" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "เลือกแฟ้ม Start Menu เพื่อสร้างชอร์ตคัทของ $(^NameDA). " + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "เลือกแผ้ม Start Menu ที่คุณต้องการจะสร้างชอร์ตคัทของโปรแกรม, คุณยังสามารถกำหนดชื่อเพื่อสร้างแฟ้มใหม่ได้อีกด้วย" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "ไม่ต้องสร้าง ชอร์ตคัท" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "ยกเลิกการติดตั้ง $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "ยกเลิกการติดตั้ง $(^NameDA) จากเครื่องคอมพิวเตอร์ของคุณ" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "คุณแน่ใจหรือว่าคุณต้องการจะออกจากการติดตั้งของ $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "คุณแน่ใจหรือว่าคุณต้องการออกจากการยกเลิกการติดตั้งของ $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nlf new file mode 100644 index 0000000000..45694dbae5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nlf @@ -0,0 +1,194 @@ +# Header, don't edit +NLF v6 +# Language ID +1028 +# Font and size - dash (-) means default 字型名稱與大小 +新細明體 +9 +# Codepage - dash (-) means ASCII code page ASCII 字碼頁 +950 +# RTL - anything else than RTL means LTR 由右至左書寫 +- +# Revision date: 2017-03-17 +# Translators: +## Kii Ali , , +## Walter Cheuk +# +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) 安裝 +# ^UninstallCaption +$(^Name) 解除安裝 +# ^LicenseSubCaption +: 授權協議 +# ^ComponentsSubCaption +: 安裝選項 +# ^DirSubCaption +: 安裝資料夾 +# ^InstallingSubCaption +: 正在安裝 +# ^CompletedSubCaption +: 已完成 +# ^UnComponentsSubCaption +: 解除安裝選項 +# ^UnDirSubCaption +: 解除安裝資料夾 +# ^ConfirmSubCaption +: 確認 +# ^UninstallingSubCaption +: 正在解除安裝 +# ^UnCompletedSubCaption +: 完成 +# ^BackBtn +< 上一步(&B) +# ^NextBtn +下一步(&N) > +# ^AgreeBtn +我同意(&A) +# ^AcceptBtn +我接受「授權協議」的條款(&A) +# ^DontAcceptBtn +我不接受「授權協議」的條款(&D) +# ^InstallBtn +安裝(&I) +# ^UninstallBtn +解除安裝(&U) +# ^CancelBtn +取消 +# ^CloseBtn +關閉(&C) +# ^BrowseBtn +瀏覽(&R)... +# ^ShowDetailsBtn +顯示細節(&D) +# ^ClickNext +按「下一步(N)」繼續。 +# ^ClickInstall +按「安裝(I)」開始安裝。 +# ^ClickUninstall +按「解除安裝(U)」開始解除安裝。 +# ^Name +名稱 +# ^Completed +已完成 +# ^LicenseText +在安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議所有條款,按「我同意(A)」。 +# ^LicenseTextCB +在安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議所有條款,按下方的勾選框。 $_CLICK +# ^LicenseTextRB +在安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議所有條款,選擇下方的第一個選項。 $_CLICK +# ^UnLicenseText +在解除安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議中所有條款,按「我同意(A)」。 +# ^UnLicenseTextCB +在解除安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議中所有條款,按下方的勾選框。 $_CLICK +# ^UnLicenseTextRB +在解除安裝 $(^NameDA) 之前請檢閱授權協議。如果接受協議中所有條款,選擇的第一個選項。 $_CLICK +# ^Custom +自訂 +# ^ComponentsText +勾選想要安裝的元件,並解除勾選不想安裝的元件。 $_CLICK +# ^ComponentsSubText1 +選取安裝的類型: +# ^ComponentsSubText2_NoInstTypes +選取安裝的元件: +# ^ComponentsSubText2 +又或者,自訂選取想安裝的元件: +# ^UnComponentsText +勾選想要解除安裝的元件,並解除勾選不想解除安裝的元件。 $_CLICK +# ^UnComponentsSubText1 +選取解除安裝的類型: +# ^UnComponentsSubText2_NoInstTypes +選取要解除安裝的元件: +# ^UnComponentsSubText2 +又或者,選擇想要解除安裝的可選項元件: +# ^DirText +安裝程式會將 $(^NameDA) 安裝在以下資料夾。要安裝到不同的資料夾,按「瀏覽(B)...」並選擇其他資料夾。 $_CLICK +# ^DirSubText +目標資料夾 +# ^DirBrowseText +選取要安裝 $(^NameDA) 的資料夾: +# ^UnDirText +安裝程式會自以下資料夾解除安裝 $(^NameDA) 。要解除安裝不同的資料夾,按「瀏覽(B)...」並選擇其他資料夾。 $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +選取要解除安裝 $(^NameDA) 的資料夾: +# ^SpaceAvailable +"可用空間: " +# ^SpaceRequired +"所需空間: " +# ^UninstallingText +會自以下資料夾解除安裝 $(^NameDA) 。 $_CLICK +# ^UninstallingSubText +解除安裝目錄: +# ^FileError +無法開啟要寫入的檔案: \r\n\t"$0"\r\n按「中止」停止安裝,\r\n「重試」重新嘗試寫入檔案,或\r\n「忽略」略過此檔案。 +# ^FileError_NoIgnore +無法開啟要寫入的檔案: \r\n\t"$0"\r\n按「重試」重新嘗試寫入檔案,或\r\n「取消」停止安裝。 +# ^CantWrite +"無法寫入: " +# ^CopyFailed +"複製失敗 " +# ^CopyTo +"複製到: " +# ^Registering +"正在註冊: " +# ^Unregistering +"正在解除註冊: " +# ^SymbolNotFound +"無法找到符號: " +# ^CouldNotLoad +"無法載入: " +# ^CreateFolder +"建立資料夾: " +# ^CreateShortcut +"建立捷徑: " +# ^CreatedUninstaller +"建立解除安裝程式: " +# ^Delete +"刪除檔案: " +# ^DeleteOnReboot +"重新開機後刪除: " +# ^ErrorCreatingShortcut +"建立捷徑時發生錯誤: " +# ^ErrorCreating +"建立時發生錯誤: " +# ^ErrorDecompressing +"解壓縮資料發生錯誤!安裝程式是否已損壞?" +# ^ErrorRegistering +"註冊 DLL 時發生錯誤" +# ^ExecShell +"執行殼層程式: " +# ^Exec +"執行: " +# ^Extract +"抽取: " +# ^ErrorWriting +"抽取: 無法寫入檔案 " +# ^InvalidOpcode +"安裝程式損毀: 無效的作業代碼 " +# ^NoOLE +"沒有 OLE 用於: " +# ^OutputFolder +"輸出資料夾: " +# ^RemoveFolder +"移除資料夾: " +# ^RenameOnReboot +"重新開機後重新命名: " +# ^Rename +"重新命名: " +# ^Skipped +"已略過: " +# ^CopyDetails +"複製細節到剪貼簿 " +# ^LogInstall +"將安裝進程記入日誌" +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nsh new file mode 100644 index 0000000000..2e8e28ed3f --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/TradChinese.nsh @@ -0,0 +1,131 @@ +;Language: 'Chinese (Traditional)' (1028) +;Translator: Kii Ali , , +;Translator: Walter Cheuk +;Revision date: 2017-03-17 + +!insertmacro LANGFILE "TradChinese" "Chinese (Traditional)" "中文(繁體)" "Hanyu (Fantizi)" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "歡迎使用 $(^NameDA) 安裝精靈" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "本精靈會引導您完成安裝 $(^NameDA)。$\r$\n$\r$\n在開始安裝之前,建議先關閉其他所有應用程式。這將允許安裝程式更新相關的系統檔案,而不需要重新啟動電腦。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "歡迎使用 $(^NameDA) 解除安裝精靈" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "本精靈會引導您解除安裝 $(^NameDA)。$\r$\n$\r$\n在開始解除安裝之前,請確認 $(^NameDA) 並未有執行。$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "授權協議" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "在安裝 $(^NameDA) 之前,請檢閱授權條款。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "如果接受協議的條款,按 [我同意(A)] 繼續安裝。必須要接受協議才能安裝 $(^NameDA) 。" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果接受協議的條款,按下方的勾選框。必須要接受協議才能安裝 $(^NameDA)。$_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果接受協議中的條款,選擇下方第一個選項。必須要接受協議才能安裝 $(^NameDA)。$_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "授權協議" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "在解除安裝 $(^NameDA) 之前,請檢閱授權條款。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "如果接受協議的條款,按 [我同意(A)] 繼續解除安裝。如果選取 [取消] ,安裝程式會關閉。必須要接受協議才能解除安裝 $(^NameDA) 。" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "如果接受協議的條款,按下方的勾選框。必須要接受協議才能解除安裝 $(^NameDA)。$_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "如果接受協議的條款,選擇下方第一個選項。必須要接受協議才能解除安裝 $(^NameDA)。$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "檢閱協議的其餘部分,按 [PgDn] 往下捲動頁面。" +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "選擇元件" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "選擇想要安裝 $(^NameDA) 的功能。" +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "選取元件" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "選取 $(^NameDA) 當中想要解除的功能。" +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "說明" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "將滑鼠指標停懸到元件之上,即可見到其說明。" + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "選取元件,即可見到其說明。" + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "選取安裝位置" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "選取 $(^NameDA) 要安裝的資料夾。" +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "選取解除安裝位置" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "選取 $(^NameDA) 要解除安裝的資料夾。" +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "安裝" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "$(^NameDA) 正在安裝,請稍候。" + ${LangFileString} MUI_TEXT_FINISH_TITLE "完成安裝" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "安裝已完成。" + ${LangFileString} MUI_TEXT_ABORT_TITLE "已中止安裝" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "安裝並未完成。" +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "解除安裝" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "$(^NameDA) 正在解除安裝,請稍候。" + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "完成解除安裝" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "解除安裝已完成。" + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "已中止解除安裝" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "解除安裝並未完成。" +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "即將完成安裝 $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "已在電腦安裝 $(^NameDA) 。$\r$\n按 [完成(F)] 關閉安裝程式。" + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "電腦需要重新開機,才能完成安裝 $(^NameDA) 。要馬上重新開機嗎?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "即將完成解除安裝 $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "已自電腦解除安裝 $(^NameDA) 。$\r$\n$\r$\n按 [完成(F)] 關閉安裝程式。" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "電腦需要重新開機,才能完成解除安裝 $(^NameDA) 。要馬上重新開機嗎?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "是,馬上重新開機(&Y)" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "否,我稍後再自行重新開機(&N)" + ${LangFileString} MUI_TEXT_FINISH_RUN "執行 $(^NameDA)(&R)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "顯示「讀我檔案」(&S)" + ${LangFileString} MUI_BUTTONTEXT_FINISH "完成(&F)" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "選擇「開始功能表」資料夾" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "選擇「開始功能表」資料夾,用於程式的捷徑。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "選擇「開始功能表」資料夾,以便建立程式的捷徑。你也可以輸入名稱,建立新資料夾。" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "不要建立捷徑(&N)" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "解除安裝 $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "自電腦解除安裝 $(^NameDA) 。" +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "確定要結束 $(^Name) 的安裝程式嗎?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "確定要結束 $(^Name) 的解除安裝程式嗎?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "選擇使用者" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "選擇要將 $(^NameDA) 安裝給哪位使用者。" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "選擇僅將 $(^NameDA) 安裝給自己使用,還是此電腦的所有使用者皆可使用。 $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "安裝給此電腦的所有使用者" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "僅安裝給自己" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nlf new file mode 100644 index 0000000000..6ec8dee384 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nlf @@ -0,0 +1,192 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1055 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1254 +# RTL - anything else than RTL means LTR +- +# Translation by ?atay Dilsiz(chagy) (amigos_cagi@hotmail.com) +# Corrections by Mozilla Türkiye Yerelleştirme Topluluğu tarafından çevrilmiştir. http://mozilla.org.tr +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +$(^Name) Kurulumu +# ^UninstallCaption +$(^Name) Kaldırma +# ^LicenseSubCaption +: Lisans Sözleşmesi +# ^ComponentsSubCaption +: Kurulum Seçenekleri +# ^DirSubCaption +: Kurulum Dizini +# ^InstallingSubCaption +: Kuruluyor +# ^CompletedSubCaption +: Tamamlandı +# ^UnComponentsSubCaption +: Kaldırma Seçenekleri +# ^UnDirSubCaption +: Kaldırılacak Dizin +# ^ConfirmSubCaption +: Onay +# ^UninstallingSubCaption +: Kaldırılıyor +# ^UnCompletedSubCaption +: Tamamlandı +# ^BackBtn +< &Geri +# ^NextBtn +İ&leri > +# ^AgreeBtn +&Katılıyorum +# ^AcceptBtn +Lisans Sözleşmesi'nin koşullarını &kabul ediyorum +# ^DontAcceptBtn +Lisans Sözleşmesi'nin koşullarını kabul et&miyorum +# ^InstallBtn +&Kur +# ^UninstallBtn +&Kaldır +# ^CancelBtn +Vazgeç +# ^CloseBtn +&Kapat +# ^BrowseBtn +&Gözat... +# ^ShowDetailsBtn +&Ayrıntıları göster +# ^ClickNext +Devam etmek için İleri düğmesine basın. +# ^ClickInstall +Kurulumu başlatmak için Kur düğmesine basın. +# ^ClickUninstall +Kaldırmayı başlatmak için Kaldır düğmesine basın. +# ^Name +Ad +# ^Completed +Tamamlandı +# ^LicenseText +Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız Kabul Ediyorum düğmesine basın. +# ^LicenseTextCB +Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız aşağıdaki kutuya işaret koyun. $_CLICK +# ^LicenseTextRB +Lütfen $(^NameDA) uygulamasını kurmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız aşağıdaki ilk seçeneği seçin. $_CLICK +# ^UnLicenseText +Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız Kabul Ediyorum düğmesine basın. +# ^UnLicenseTextCB +Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız aşağıdaki kutuya işaret koyun. $_CLICK +# ^UnLicenseTextRB +Lütfen $(^NameDA) uygulamasını kaldırmadan önce lisans sözleşmesini gözden geçirin. Sözleşmedeki bütün koşulları kabul ediyorsanız aşağıdaki ilk seçeneği seçin. $_CLICK +# ^Custom +Özel +# ^ComponentsText +Kurmak istediğiniz bileşenleri işaretleyip kurmak istemediklerinizi işaretlemeden bırakın. $_CLICK +# ^ComponentsSubText1 +Kurulum türünü seçin: +# ^ComponentsSubText2_NoInstTypes +Kurulacak bileşenleri seçin: +# ^ComponentsSubText2 +ya da isteğe bağlı olarak kurmak istediğiniz bileşenleri seçin: +# ^UnComponentsText +Kaldırmak istediğiniz bileşenleri işaretleyip kaldırmak istemediklerinizi işaretlemeden bırakın. $_CLICK +# ^UnComponentsSubText1 +Kaldırma türünü seçin: +# ^UnComponentsSubText2_NoInstTypes +Kaldırılacak bileşenleri seçin: +# ^UnComponentsSubText2 +ya da isteğe bağlı olarak kaldırmak istediğiniz bileşenleri seçin: +# ^DirText +$(^NameDA) aşağıdaki dizinde kurulacak. Farklı bir dizinde kurmak için Gözat düğmesine basıp başka bir dizin seçin. $_CLICK +# ^DirSubText +Hedef Dizin +# ^DirBrowseText +$(^NameDA) uygulamasının kurulacağı dizini seçin: +# ^UnDirText +$(^NameDA) aşağıdaki dizinden kaldırılacak. Farklı bir dizinden kaldırmak için Gözat düğmesine basıp başka bir dizin seçin. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA) uygulamasının kaldırılacağı dizini seçin: +# ^SpaceAvailable +"Kullanılabilir boş alan: " +# ^SpaceRequired +"Gereken boş alan: " +# ^UninstallingText +$(^NameDA) aşağıdaki dizinden kaldırılacak. $_CLICK +# ^UninstallingSubText +Kaldırılan yer: +# ^FileError +Dosya yazmak için açılırken hata meydana geldi: \r\n\r\n$0\r\n\r\nKurulumu durdurmak için Dur düğmesine,\r\nyeniden denemek için Yeniden Dene düğmesine,\r\nbu dosyayı atlamak için Yoksay düğmesine basın. +# ^FileError_NoIgnore +Dosya yazmak için açılırken hata meydana geldi: \r\n\r\n$0\r\n\r\nYeniden denemek için Yeniden Dene düğmesine,\r\nkurulumu durdurmak için Vazgeç düğmesine basın. +# ^CantWrite +"Yazılamadı: " +# ^CopyFailed +Kopyalama başarısız oldu +# ^CopyTo +"Kayıt: " +# ^Registering +"Kaydediliyor: " +# ^Unregistering +"Kayıt siliniyor: " +# ^SymbolNotFound +"Simge bulunamadı: " +# ^CouldNotLoad +"Yüklenemedi: " +# ^CreateFolder +"Dizin oluştur: " +# ^CreateShortcut +"Kısayol oluştur: " +# ^CreatedUninstaller +"Kaldırma uygulaması oluştur: " +# ^Delete +"Dosya sil: " +# ^DeleteOnReboot +"Açılışta sil: " +# ^ErrorCreatingShortcut +"Kısayol oluşturulurken hata meydana geldi: " +# ^ErrorCreating +"Oluşturma hatası: " +# ^ErrorDecompressing +Veriyi açarken hata meydana geldi! Acaba kurulum uygulaması mı bozuk? +# ^ErrorRegistering +DLL kaydedilirken hata meydana geldi +# ^ExecShell +"ExecShell: " +# ^Exec +"Çalıştır: " +# ^Extract +"Aç: " +# ^ErrorWriting +"Açma: Dosyaya yazarken hata meydana geldi " +# ^InvalidOpcode +Kurulum bozuk: Geçersiz kod +# ^NoOLE +"OLE yok: " +# ^OutputFolder +"Çıktı dizini: " +# ^RemoveFolder +"Dizini sil: " +# ^RenameOnReboot +"Açılışta adını değiştir: " +# ^Rename +"Ad değiştir: " +# ^Skipped +"Atlandı: " +# ^CopyDetails +Ayrıntıları panoya kopyala +# ^LogInstall +Kurulum sürecinin kaydını tut +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nsh new file mode 100644 index 0000000000..c4d1358454 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Turkish.nsh @@ -0,0 +1,122 @@ +;Language: Turkish (1055) +;By Çagatay Dilsiz(Chagy) +;Updated by Fatih BOY (fatih_boy@yahoo.com) + +!insertmacro LANGFILE "Turkish" = "Türkçe" "Turkce" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "$(^NameDA) Kurulum sihirbazına hoş geldiniz" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) kurulumu boyunca rehberlik edecektir.$\r$\n$\r$\nKurulumu başlatmadan önce çalışan diğer programlari kapatmanızı öneririz. Böylece bilgisayarınızı yeniden başlatmadan bazı sistem dosyaları sorunsuz kurulabilir.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "$(^NameDA) Programını Kaldırma Sihirbazına Hoş Geldiniz" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu sihirbaz size $(^NameDA) programının kadırılımı boyunca rehberlik edecektir.$\r$\n$\r$\nKaldırım işlemeni başlatmadan önce çalışan diğer programlari kapatmanızı öneririz. Böylece bilgisayarınızı yeniden başlatmadan bazı sistem dosyaları sorunsuz kaldırılabilir.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisans Sözleşmesi" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programını kurmadan önce sözleşmeyi okuyunuz." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Sözleşme koşullarını kabul ediyorsanız, 'Kabul Ediyorum'a basınız. $(^NameDA) programını kurmak için sözleşme koşullarını kabul etmelisiniz." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Sözleşme koşullarını kabul ediyorsanız, aşağıdaki onay kutusunu doldurunuz. $(^NameDA) programını kurmak için sözleşme koşullarını kabul etmelisiniz. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Sözleşme koşullarını kabul ediyorsanız, asagidaki onay düğmesini seçiniz. $(^NameDA) programını kurmak için sözleşme koşullarını kabul etmelisiniz. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisans Sözleşmesi" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Lütfen $(^NameDA) programını sisteminizden kaldırmadan önce sözleşmeyi okuyunuz." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Sözleşme koşullarını kabul ediyorsanız, 'Kabul Ediyorum'a basınız. $(^NameDA) programını sisteminizden kaldırmak için sözleşme koşullarını kabul etmelisiniz." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Sözleşme koşullarını kabul ediyorsanız, aşağıdaki onay kutusunu doldurunuz. $(^NameDA) programını sisteminizden kaldırmak için sözleşme koşullarını kabul etmelisiniz. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Sözleşme koşullarını kabul ediyorsanız, asagidaki onay düğmesini seçiniz. $(^NameDA) programını sisteminizden kaldırmak için sözleşme koşullarını kabul etmelisiniz. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Sözleşmenin geri kalanını okumak için 'page down' tuşuna basabilirsiniz." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Bileşen seçimi" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Lütfen $(^NameDA) için kurmak istediginiz bileşenleri seçiniz." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Bileşen Şeçimi" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Lütfen kaldırmak istediğiniz $(^NameDA) program bileşenini seçiniz." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Açıklama" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bileşenlerin açıklamalarını görmek için imleci bileşen üzerine götürün." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Hedef dizini seçimi" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA) programını kurmak istediğiniz dizini şeçiniz." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Kaldırılıcak Dizin Seçimi" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) programını kaldırmak istediginiz dizini seçiniz." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Kuruluyor" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Lütfen $(^NameDA) kurulurken bekleyiniz." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Kurulum Tamamlandı" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Kurulum başarıyla tamamlandı." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Kurulum İptal Edildi" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Kurulum tam olarak tamamlanmadı." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Kaldırılıyor" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Litfen $(^NameDA) programı sisteminizden kaldırılırken bekleyiniz." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Kaldırma İşlemi Tamamlandır" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Kaldırma işlemi başarıyla tamamlandı." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Kaldırma İşlemi İptal Edildi" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Kaldırma İşlemi tamamlanamadı." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA) Kurulum sihirbazı tamamlanıyor." + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) bilgisayariniza yüklendi.$\r$\n$\r$\nLütfen 'Bitir'e basarak kurulumu sonlandırın." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) kurulumunun tamamlanması için bilgisayarınızı yeniden başlatmanız gerekiyor.Bilgisayarınızı yeniden başlatmak istiyor musunuz?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA) Programı Kaldırma Sihirbazı Tamamlanıyor" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) programı sisteminizden kaldırıldı.$\r$\n$\r$\nSihirbazı kapatmak için 'bitir'e basınız." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) programını kaldırma işleminin tamamlanması için bilgisayarınızın yeniden başlatılması gerekiyor. Bilgisayarınızın şimdi yeniden başlatılmasını ister misiniz?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Yeniden başlat" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Bilgisayarımı daha sonra başlatacağım." + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) programını çalıştır" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "beni oku/readme dosyasını &göster" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Bitir" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Başlat Menüsü Klasör Seçimi" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "$(^NameDA) kısayollarının konulacagı başlat menüsü klasörünü seçiniz." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Programın kısayollarının konulacağı başlat menüsü klasörünü seçiniz. Farklı bir isim girerek yeni bir klasör yaratabilirsiniz." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Kısayolları oluşturmadan devam et" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA) Programını Kaldır" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) programını sisteminizden kaldırma." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "$(^Name) kurulumundan çıkmak istediğinize emin misiniz?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name) Programi Kaldırma işleminden çıkmak istediğinize emin misiniz?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nlf new file mode 100644 index 0000000000..186d963a7b --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nlf @@ -0,0 +1,192 @@ +# Header, don't edit +NLF v6 +# Language ID +1058 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1251 +# RTL - anything else than RTL means LTR +- + +# Translation by Yuri Holubow, Nash-Soft.com, Dmitriy Kononchuk [gri3ly.kiev.ua], Osidach Vitaly and others + +# ^Branding +Система встановлення Nullsoft %s +# ^SetupCaption +Встановлення $(^Name) +# ^UninstallCaption +Видалення $(^Name) +# ^LicenseSubCaption +: Ліцензійна угода +# ^ComponentsSubCaption +: Опції встановлення +# ^DirSubCaption +: Тека встановлення +# ^InstallingSubCaption +: Триває встановлення +# ^CompletedSubCaption +: Завершено +# ^UnComponentsSubCaption +: Опції видалення +# ^UnDirSubCaption +: Тека видалення +# ^ConfirmSubCaption +: Підтвердження +# ^UninstallingSubCaption +: Триває видалення +# ^UnCompletedSubCaption +: Завершено +# ^BackBtn +< &Назад +# ^NextBtn +&Далі > +# ^AgreeBtn +&Погоджуюся +# ^AcceptBtn +Я &приймаю умови Ліцензійної угоди +# ^DontAcceptBtn +Я &не приймаю умови Ліцензійної угоди +# ^InstallBtn +&Встановити +# ^UninstallBtn +&Видалити +# ^CancelBtn +Скасувати +# ^CloseBtn +&Закрити +# ^BrowseBtn +О&гляд... +# ^ShowDetailsBtn +&Подробиці +# ^ClickNext +Натисніть «Далі» для продовження. +# ^ClickInstall +Натисніть «Встановити», щоб запустити процес встановлення. +# ^ClickUninstall +Натисніть «Видалити», щоб запустити процес видалення. +# ^Name +Назва +# ^Completed +Завершено +# ^LicenseText +Ознайомтеся з ліцензійною угодою перед встановленням $(^NameDA). Якщо ви згодні з усіма умовами угоди, натисніть «Погоджуюся». +# ^LicenseTextCB +Ознайомтеся з ліцензійною угодою перед встановленням $(^NameDA). Якщо ви приймаєте умови угоди, встановіть прапорець нижче. $_CLICK +# ^LicenseTextRB +Ознайомтеся з ліцензійною угодою перед встановленням $(^NameDA). Якщо ви приймаєте умови угоди, оберіть перший варіант нижче. $_CLICK +# ^UnLicenseText +Ознайомтеся з ліцензійною угодою перед видаленням $(^NameDA). Якщо ви згодні з усіма умовами угоди, натисніть «Погоджуюся». +# ^UnLicenseTextCB +Ознайомтеся з ліцензійною угодою перед видаленням $(^NameDA). Якщо ви приймаєте умови угоди, встановіть прапорець нижче. $_CLICK +# ^UnLicenseTextRB +Ознайомтеся з ліцензійною угодою перед видаленням $(^NameDA). Якщо ви приймаєте умови угоди, оберіть перший варіант нижче. $_CLICK +# ^Custom +Власний вибір +# ^ComponentsText +Позначте компоненти, які ви хочете встановити, та приберіть позначки з непотрібних. $_CLICK +# ^ComponentsSubText1 +Виберіть тип встановлення: +# ^ComponentsSubText2_NoInstTypes +Виберіть компоненти для встановлення: +# ^ComponentsSubText2 +Або виберіть необов'язкові компоненти, які ви бажаєте встановити: +# ^UnComponentsText +Позначте компоненти, які ви хочете видалити, та приберіть позначки з тих, що потрібно залишити. $_CLICK +# ^UnComponentsSubText1 +Виберіть тип видалення: +# ^UnComponentsSubText2_NoInstTypes +Виберіть компоненти для видалення: +# ^UnComponentsSubText2 +Або виберіть необов'язкові компоненти, які ви бажаєте видалити: +# ^DirText +Програму $(^NameDA) буде встановлено в зазначену теку. Щоб встановити в іншу теку, натисніть «Огляд» і вкажіть потрібну теку. $_CLICK +# ^DirSubText +Тека призначення +# ^DirBrowseText +Виберіть теку для встановлення $(^NameDA): +# ^UnDirText +Програму $(^NameDA) буде видалено із зазначеної теки. Щоб виконати видалення з іншої теки, натисніть «Огляд» і вкажіть потрібну теку. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Виберіть теку, з якої потрібно видалити $(^NameDA): +# ^SpaceAvailable +"Доступно місця: " +# ^SpaceRequired +"Потрібно місця: " +# ^UninstallingText +$(^NameDA) буде видалено з вказаної теки. $_CLICK +# ^UninstallingSubText +Видалення з: +# ^FileError +Помилка під час відкриття файлу для запису: \r\n\r\n$0\r\n\r\nНатисніть «Перервати», щоб зупинити встановлення,\r\n«Повторити», щоб спробувати знову, або\r\n«Ігнорувати», щоб пропустити цей файл. +# ^FileError_NoIgnore +Помилка під час відкриття файлу для запису: \r\n\r\n$0\r\n\r\nНатисніть «Повторити», щоб спробувати знову, або\r\n«Скасувати», щоб зупинити встановлення. +# ^CantWrite +"Неможливо записати: " +# ^CopyFailed +Не вдалося копіювати +# ^CopyTo +"Копіювати до " +# ^Registering +"Реєстрація: " +# ^Unregistering +"Скасування реєстрації: " +# ^SymbolNotFound +"Неможливо знайти символ: " +# ^CouldNotLoad +"Неможливо завантажити: " +# ^CreateFolder +"Створення теки: " +# ^CreateShortcut +"Створення ярлика: " +# ^CreatedUninstaller +"Створення програми видалення: " +# ^Delete +"Видалення файлу: " +# ^DeleteOnReboot +"Видалення після перезавантаження: " +# ^ErrorCreatingShortcut +"Помилка створення ярлика: " +# ^ErrorCreating +"Помилка створення: " +# ^ErrorDecompressing +Помилка розпакування даних! Можливо, пошкоджений файл встановлення. +# ^ErrorRegistering +Помилка реєстрації бібліотеки (DLL) +# ^ExecShell +"Виконання команди оболонки: " +# ^Exec +"Виконання: " +# ^Extract +"Розпакування: " +# ^ErrorWriting +"Розпакування: помилка запису даних у файл " +# ^InvalidOpcode +Пошкоджений файл встановлення: неприпустимий код відповіді +# ^NoOLE +"Немає OLE для: " +# ^OutputFolder +"Тека призначення: " +# ^RemoveFolder +"Видалення теки: " +# ^RenameOnReboot +"Перейменувати після перезавантаження: " +# ^Rename +"Перейменування: " +# ^Skipped +"Пропущено: " +# ^CopyDetails +Копіювати подробиці до буфера обміну +# ^LogInstall +Зберегти журнал процесу встановлення +# ^Byte +Б +# ^Kilo + К +# ^Mega + М +# ^Giga + Г diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nsh new file mode 100644 index 0000000000..58ab77c126 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Ukrainian.nsh @@ -0,0 +1,130 @@ +;Language: Ukrainian (1058) +;By Yuri Holubow, Nash-Soft.com +;Corrections by Osidach Vitaly (Vit_Os2) and others + +!insertmacro LANGFILE "Ukrainian" = "Українська" "Ukrayins'ka" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Ласкаво просимо до встановлення $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Ця програма допоможе вам встановити $(^NameDA).$\r$\n$\r$\nРадимо закрити всі інші програми, перш ніж почати встановлення. Завдяки цьому будуть оновлені відповідні системні файли без потреби перезапускати комп’ютер.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Ласкаво просимо до видалення $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Ця програма допоможе вам видалити $(^NameDA).$\r$\n$\r$\nПеред початком видалення обов’язково закрийте $(^NameDA).$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Ліцензійна угода" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Ознайомтеся з умовами ліцензійної угоди перед встановленням $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Якщо ви згодні з умовами угоди, натисніть кнопку «Погоджуюся», щоб продовжити. Ви маєте погодитися з угодою для встановлення $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Якщо ви згодні з умовами угоди, встановіть позначку нижче. Ви маєте погодитися з угодою для встановлення $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Якщо ви згодні з умовами угоди, виберіть перший варіант нижче. Ви маєте погодитися з угодою для встановлення $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Ліцензійна угода" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Ознайомтеся з умовами ліцензійної угоди перед видаленням $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Якщо ви згодні з умовами угоди, натисніть «Погоджуюся» для продовження. Ви маєте погодитися з угодою для видалення $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Якщо ви згодні з умовами угоди, встановіть позначку нижче. Ви маєте погодитися з угодою для видалення $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Якщо ви згодні з умовами угоди, виберіть перший варіант нижче. Ви маєте погодитися з угодою для видалення $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Натисніть клавішу PageDown, щоб переглянути угоду далі." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Оберіть компоненти" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Оберіть, які компоненти $(^NameDA) ви хочете встановити." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Оберіть компоненти" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Оберіть, які компоненти $(^NameDA) ви хочете видалити." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Опис" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Наведіть мишу на компонент, щоб побачити його опис." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Оберіть компонент, щоб побачити його опис." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Оберіть теку встановлення" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Оберіть теку, в яку потрібно встановити $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Оберіть теку видалення" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Оберіть теку, з якої потрібно видалити $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Встановлення" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Будь ласка, зачекайте поки триває встановлення $(^NameDA)." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Встановлення завершено" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Встановлення успішно завершено." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Встановлення перервано" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Встановлення не було завершено." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Видалення" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Будь ласка, зачекайте поки триває видалення $(^NameDA)." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Видалення завершено" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Видалення успішно завершено." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Видалення перервано" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Видалення не було завершено." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Завершення встановлення $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) встановлено на ваш комп’ютер.$\r$\n$\r$\nНатисніть «Завершити» для виходу." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Щоб завершити встановлення $(^NameDA), потрібно перезапустити комп’ютер. Хочете перезапустити зараз?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Завершення видалення $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) видалено з вашого комп’ютера.$\r$\n$\r$\nНатисніть «Завершити» для виходу." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Щоб завершити видалення $(^NameDA), потрібно перезапустити комп’ютер. Хочете перезапустити зараз?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Перезапустити" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Я хочу перезапустити власноруч згодом" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Запустити $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Показати інформацію про програму" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Завершити" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Тека в меню Пуск" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Оберіть «Тека в меню Пуск» для ярликів програми $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Оберіть теку в меню Пуск, в якій ви бажаєте створити ярлики для встановленої програми. Можна також ввести назву для створення нової теки." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Не створювати ярлики" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Видалення $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Видалення $(^NameDA) з вашого комп’ютера." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ви дійсно хочете вийти з встановлення $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ви дійсно хочете вийти з видалення $(^Name)?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Оберіть користувачів" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Оберіть користувачів, для яких потрібно встановити $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Оберіть, чи хочете ви встановити $(^NameDA) лише для себе, чи для всіх користувачів цього комп’ютера. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Встановити для всіх користувачів цього комп’ютера" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Встановити лише для мене" +!endif \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nlf new file mode 100644 index 0000000000..66c90cc147 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nlf @@ -0,0 +1,190 @@ +# Header, don't edit +NLF v6 +# Language ID +1091 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Emil Garipov [emil.garipov@gmail.com] +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +O'rnatish $(^Name) +# ^UninstallCaption +O'chirish $(^Name) +# ^LicenseSubCaption +: Lisenzion kelishuv +# ^ComponentsSubCaption +: O'rnatish parametrlari +# ^DirSubCaption +: O'rnatish papkasi +# ^InstallingSubCaption +: Fayllarni kopiya qilish +# ^CompletedSubCaption +: Operatsiya yakunlandi +# ^UnComponentsSubCaption +: O'chirish parametrlari +# ^UnDirSubCaption +: O'chirsh papkasi +# ^ConfirmSubCaption +: Tasdiqlash +# ^UninstallingSubCaption +: Fayllarni o'chirish +# ^UnCompletedSubCaption +: Operatsiya yakunlandi +# ^BackBtn +< &Orqaga +# ^NextBtn +&Oldinga > +# ^AgreeBtn +&Qabul qilaman +# ^AcceptBtn +Men &kelishuv shartlarini qabul qilaman +# ^DontAcceptBtn +Men &kelishuv shartlarini qabul qilmayman +# ^InstallBtn +&O'rnatish +# ^UninstallBtn +&O'chirish +# ^CancelBtn +Bekor qilish +# ^CloseBtn +&Yopish +# ^BrowseBtn +&Ko'rish ... +# ^ShowDetailsBtn +&Äåòàëè... +# ^ClickNext +Davom etish uchun 'Oldinga'tugmachasini bosing. +# ^ClickInstall +Dasturni o'rnatish uchun'O'rnatish' tugmachasini bosing. +# ^ClickUninstall +Dasturni o'chirish uchun 'O'chirsh' tugmachasini bosing. +# ^Name +Ism +# ^Completed +Tayor +# ^LicenseText +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing. +# ^LicenseTextCB +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK +# ^LicenseTextRB +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK +# ^UnLicenseText +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz 'Qabul qilaman' tugmachasini bosing. +# ^UnLicenseTextCB +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz bayroqchani joylashtiring. $_CLICK +# ^UnLicenseTextRB +$(^NameDA)ni o'rnatishdan oldin lisenzion kelishuv bilan tanishib oling. Kelishuv shartlarini qabul qilsangiz quyida taklif etilganlardan birinchi variantni tanlang. $_CLICK +# ^Custom +Tanlash bo'icha +# ^ComponentsText +O'rnatish ucun dastur komponentlarini tanlang. $_CLICK +# ^ComponentsSubText1 +O'rnatish jarayonini tanlang: +# ^ComponentsSubText2_NoInstTypes +O'rnatish uchun dastur komponentlarini tanlang: +# ^ComponentsSubText2 +Yoki o'rnatish uchun qushimcha komponentlarini tanlang: +# ^UnComponentsText +O'chirish uchun dastur komponentlarini tanlang. $_CLICK +# ^UnComponentsSubText1 +O'chirish jarayonini tanlang: +# ^UnComponentsSubText2_NoInstTypes +O'chirish uchun dastur komponentlarini tanlang: +# ^UnComponentsSubText2 +Yoki o'chirish uchun qushimcha komponentlarini tanlang: +# ^DirText +Dastur $(^NameDA)ni ko'rsatilgan papkaga o'rnatadi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK +# ^DirSubText +O'rnatish papkasi +# ^DirBrowseText +O'rnatish papkasini ko'rsating $(^NameDA): +# ^UnDirText +Dastur $(^NameDA)ni ko'rsatilgan papkadan o'chiradi. Boshqa papkaga o'rnatish uchun, 'Ko'rish'tugmachasini bosing va uni ko'rsatib bering. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +$(^NameDA)ni o'chirish uchun papkani ko'rsating: +# ^SpaceAvailable +"Diskda joriy qilingan: " +# ^SpaceRequired +"Diskda talab qilinadigan: " +# ^UninstallingText +$(^NameDA) dasturi kompyuterizdan uchiriladi. $_CLICK +# ^UninstallingSubText +O'chirilish: +# ^FileError +Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Tuxtashish': O'rnatishni tuxtatish;\r\n"Takrorlash":yana bir o'rinib ko'rish;\r\n"Taylab ketish": shu xarakatni taylab ketish. +# ^FileError_NoIgnore +Yozish uchun faylni ochish imkoniyati yuq: \r\n\t"$0"\r\n'Takrorlash': yana bir o'rinib ko'rish;\r\n'Bekor qilish': o'rnatish protsessini bekor qilish. +# ^CantWrite +"Yozish uchun imkoniyat yuq: " +# ^CopyFailed +Kopiya qilganda xato bor +# ^CopyTo +"Kopiya qilish " +# ^Registering +"Ro'yxatga olish: " +# ^Unregistering +"Ro'xatdan chiqish: " +# ^SymbolNotFound +"Simvolni topish imkoniyati yuq: " +# ^CouldNotLoad +"Zagruzka qilish imkoniyati yuq: " +# ^CreateFolder +"Papkani yaratish: " +# ^CreateShortcut +"Belgini yaratish: " +# ^CreatedUninstaller +"O'chirish dasturini yaratish: " +# ^Delete +"Faylni o'chirish: " +# ^DeleteOnReboot +"Kompyuter qayta yuklash jaraonida o'chirish: " +# ^ErrorCreatingShortcut +"Belgini yaratish jarayonida xato: " +# ^ErrorCreating +"Yaratish xatosi: " +# ^ErrorDecompressing +Ma'lumotlarni asilga qaytarish xatosi! Distributiv ziyonlangan bulishi mumkin. +# ^ErrorRegistering +Kutubxonani ro'xatga olish imkoniyati yuq (DLL) +# ^ExecShell +"Qoplang'ich komandasini bajarish: " +# ^Exec +"Bajarish: " +# ^Extract +"Ichidan olish: " +# ^ErrorWriting +"Ichidan olish: fayl yozish xatosi " +# ^InvalidOpcode +Distributiv ziyonlangan: ruxsatlanmangan kod +# ^NoOLE +"Quydagilarga OLE yuq: " +# ^OutputFolder +"Papkani o'rnatish: " +# ^RemoveFolder +"Papkani o'chirish: " +# ^RenameOnReboot +"Kompyuter qayta yuklanish jarayonida ismni qaita quyish: " +# ^Rename +"Ismni qayta quyish: " +# ^Skipped +"O'tkazib yuborish: " +# ^CopyDetails +Bufer obmenaga ma'lumotlarni kopiya qilish +# ^LogInstall +O'rnatish xisobotini chiqorish +# byte +áàéò +# kilo + Ê +# mega + Ì +# giga + Ã \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nsh new file mode 100644 index 0000000000..b60afd5324 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Uzbek.nsh @@ -0,0 +1,121 @@ +;Language: Uzbek (1091) +;Translation updated by Emil Garipov [emil.garipov@gmail.com] + +!insertmacro LANGFILE "Uzbek" = "O‘zbek" "O'zbek" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Sizni o'rnatish dastur tabriklaydi $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bu dastur sizning komputeringizga $(^NameDA) dasturni o'rnatadi.$\r$\n$\r$\nO'rnatishdan oldin ishlayotgan barcha ilovalarni yopish tavsiya etiladi. Bu o'rnatuvchi dasturga kompyuterni qayta yuklamasdan sistemali fayllarni yangilash imkonini beradi.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Sizni $(^NameDA)ni o'chirish dasturi tabriklaydi" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bu dastur $(^NameDA)ni sizning kompyuteringizdan o'chiradi.$\r$\n$\r$\nO'chirishdan oldin $(^NameDA) dasturni ishlamayotganligini aniqlang.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Lisenzion kelishuv" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "$(^NameDA) dasturini o'rnatishdan oldin lisenzion kelishuv bilan tanishib chiking." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Agar kelishuv shartlariga rozi bo'lsangiz $\"Qabul kilaman$\" tugmasini bosing.Dasturni o'rnatish uchun,kelishuv shartlarini qabul qilish kerak." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar siz kelishuv shartlarini qabul kilsangiz,bayroqchani joylashtiring. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz quida taklif etilganlardan birinchi variantni tanlang. Dasturni o'rnatish uchun kelisuv shartlarini qabul qilish kerak. $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Lisenzion kelishuv" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "$(^NameDA)ni o'chirishdan oldin lesinzion kelishuv bilan tanishing." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Agar siz kelishuv shartlariniqabul qilsangiz $\"Qabul qilaman$\" tugmasini bosing. O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Agar shartlarni qabul qilsangiz, bayroqchani o'rnating.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Kelishuv shartlarini qabul qilsangiz, taklif etilganlardan birinchi variantni tanlang.O'chirish uchun kelishuv shartlarini qabul qilishingiz kerak. $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Matn bo'icha silgish uchun $\"PageUp$\" va $\"PageDown$\" tugmasidan foydalaning." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "O'rnatilayotgan dastur komponentlari" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "$(^NameDA) dasturning o'zingizga kerak bo'lgan komponentasini tanlang." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dastur komponentlari" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "$(^NameDA)ning o'chirish kerak bo'lgan komponentlarini tanlang." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Tasvir" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Sichqonchaning kursorini komponent tasvirini o'qish uchun ustiga quying." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Tasvirini o'qish o'chun, komponentni tanlang." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "O'rnatish papkasini tanlash" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "$(^NameDA)ni o'rnatish uchun papka tanlang." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "O'chiriladigan papkani tanlash" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "$(^NameDA) o'chiriladigan papkasini ko'rsating." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Fayllarni ko'chirish" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Biror kuting, $(^NameDA) fayllari ko'chirilmoqda..." + ${LangFileString} MUI_TEXT_FINISH_TITLE "O'rnatish jarayoni tugadi" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "O'rnatish jarayoni muvaffaqiyat bilan tugadi." + ${LangFileString} MUI_TEXT_ABORT_TITLE "O'rnatish jarayoni uzildi" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "O'rnatish jarayoni tugamadi." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "O'chirish" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Biror kutib turing, $(^NameDA) fayllarini o'chirish bajarilmoqda..." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "O'chirish tuganlandi" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Dasturni o'chirish muvaffaqiyatli yakunlandi." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "O'chirish jarayoni uzildi" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "O'chirish to'la bajarilmadi." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'rnatuvci dasturi o'z ishini tugatmoqda" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA)ni o'rnatish bajarildi.$\r$\n$\r$\nO'rnatuvchi dasturdan chiqish uchun $\"Tayor$\" tugmasini bosing." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'rnatish jarayonini tugatish uchun Kompyuterni qayta yuklash kerak.Shu ishni bajarishni xoziroq istaysizmi?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "$(^NameDA)ni o'chirish dasturi o'z ishini tugatdi." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) dasturi kompyuteringizdan o'chirildi.$\r$\n$\r$\nO'chirish dasturidan chiqish uchun $\"Tayor$\"tugmasini bosing." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "$(^NameDA) dasturini o'chirishni tugatish uchun kompyuterni qayta yuklash kerak.shu ishni xozir bajarasizmi?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ha, kompyuter hozir qayta yuklansin" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Yo'q, bu ishni keyinroq bajaraman" + ${LangFileString} MUI_TEXT_FINISH_RUN "$(^NameDA) &Ishga tushirilsin" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Readme fayli ko'rsatilsin" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Tayor" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Papka $\"Ïóñê$\" menyusida" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dastur belgilarini joylashtirish uchun $\"Ïóñê$\" menyusidan papka tanlang." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "$\"Ïóñê$\" menyusidan dastur belgilari joylashadigan papka tanlang. Siz papkaning boshqa ismini kiritishingiz mumkin" + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Belgilar yaratilmasin" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "$(^NameDA)ni o'chirish" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA)ni kompyuterdan o'chirish." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Haqiqatdan ham siz $(^Name)ni o'rnatishni bekor qilmoqchimisiz?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "$(^Name)ni o'chirish jarayonini bekor qilmoqchisizmi?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nlf new file mode 100644 index 0000000000..3e90576197 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1066 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1258 +# RTL - anything else than RTL means LTR +- +# Translation by NGUYỄN Mạnh Hùng +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Cài đặt $(^Name) +# ^UninstallCaption +Gỡ bỏ $(^Name) +# ^LicenseSubCaption +: Thỏa thuận Giấy phép +# ^ComponentsSubCaption +: Tùy chọn Cài đặt +# ^DirSubCaption +: Thư mục Cài đặt +# ^InstallingSubCaption +: Cài đặt +# ^CompletedSubCaption +: Hoàn thành +# ^UnComponentsSubCaption +: Tùy chọn Gỡ bỏ +# ^UnDirSubCaption +: Thư mục Gỡ bỏ +# ^ConfirmSubCaption +: Xác nhận +# ^UninstallingSubCaption +: Gỡ bỏ +# ^UnCompletedSubCaption +: Hoàn thành +# ^BackBtn +< &Lùi +# ^NextBtn +&Tiến > +# ^AgreeBtn +Tô&i đồng ý +# ^AcceptBtn +Tô&i chấp thuận các điều khoản của Thỏa thuận Giấy phép +# ^DontAcceptBtn +Tôi &không chấp thuận các điều khoản của Thỏa thuận Giấy phép +# ^InstallBtn +&Cài đặt +# ^UninstallBtn +&Gỡ bỏ +# ^CancelBtn +Hủy bỏ +# ^CloseBtn +Đón&g +# ^BrowseBtn +Du&yệt... +# ^ShowDetailsBtn +&Hiện chi tiết +# ^ClickNext +Nhấn Tiến để tiếp tục. +# ^ClickInstall +Nhấn “Cài đặt” để bắt đầu việc cài đặt. +# ^ClickUninstall +Nhấn “Gỡ bỏ” để bắt đầu việc gỡ bỏ. +# ^Name +Tên +# ^Completed +Hoàn thành +# ^LicenseText +Vui lòng xem xét thỏa thuận giấy phép trước khi cài đặt $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy nhấn “Tôi đồng ý”. +# ^LicenseTextCB +Vui lòng xem xét thỏa thuận giấy phép trước khi cài đặt $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy nhấn ô bên dưới. $_CLICK +# ^LicenseTextRB +Vui lòng xem xét thỏa thuận giấy phép trước khi cài đặt $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy chọn ô đầu tiên bên dưới. $_CLICK +# ^UnLicenseText +Vui lòng xem xét thỏa thuận giấy phép trước khi gỡ bỏ $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy nhấn “Tôi đồng ý”. +# ^UnLicenseTextCB +Vui lòng xem xét thỏa thuận giấy phép trước khi gỡ bỏ $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy nhấn ô bên dưới. $_CLICK +# ^UnLicenseTextRB +Vui lòng xem xét thỏa thuận giấy phép trước khi gỡ bỏ $(^NameDA). Nếu bạn chấp thuận tất cả các điều khoản của thỏa thuận, hãy chọn ô đầu tiên bên dưới. $_CLICK +# ^Custom +Tùy biến +# ^ComponentsText +Chọn thành phần mà bạn muốn cài đặt và không chọn các thành phần mà bạn không muốn cài đặt. $_CLICK +# ^ComponentsSubText1 +Chọn kiểu cài đặt: +# ^ComponentsSubText2_NoInstTypes +Chọn thành phần để cài đặt: +# ^ComponentsSubText2 +Hoặc, chọn thành phần phụ mà bạn muốn cài đặt: +# ^UnComponentsText +Chọn thành phần mà bạn muốn gỡ bỏ và không chọn các thành phần mà bạn không muốn gỡ bỏ. $_CLICK +# ^UnComponentsSubText1 +Chọn kiểu gỡ bỏ: +# ^UnComponentsSubText2_NoInstTypes +Chọn thành phần để gỡ bỏ: +# ^UnComponentsSubText2 +Hoặc, chọn thành phần phụ mà bạn muốn gỡ bỏ: +# ^DirText +Trình trợ lí sẽ cài đặt $(^NameDA) vào thư mục sau. Để cài đặt vào một thư mục khác, hãy nhấn Duyệt để chọn thư mục. $_CLICK +# ^DirSubText +Thư mục đích +# ^DirBrowseText +Chọn thư mục để cài đặt $(^NameDA): +# ^UnDirText +Trình trợ lí sẽ gỡ bỏ $(^NameDA) khỏi thư mục sau. Để gỡ bỏ khỏi một thư mục khác, hãy nhấn Duyệt để chọn thư mục. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Chọn thư mục để gỡ bỏ $(^NameDA): +# ^SpaceAvailable +"Dung lượng hiện có: " +# ^SpaceRequired +"Dung lượng yêu cầu: " +# ^UninstallingText +$(^NameDA) sẽ bị gỡ bỏ khỏi thư mục sau. $_CLICK +# ^UninstallingSubText +Đang gỡ bỏ khỏi: +# ^FileError +Lỗi khi mở tập tin để ghi: \r\n\r\n$0\r\n\r\nNhấn “Hủy bỏ” để ngừng việc cài đặt,\r\n“Thử lại” để thử lần nữa, hoặc\r\n“Bỏ qua” để bỏ qua tập tin này. +# ^FileError_NoIgnore +Lỗi khi mở tập tin để ghi: \r\n\r\n$0\r\n\r\nNhấn “Thử lại” để thử lần nữa, hoặc\r\n“Hủy bỏ” để ngừng việc cài đặt. +# ^CantWrite +"Không thể ghi: " +# ^CopyFailed +Sao chép bị thất bại +# ^CopyTo +"Sao chép vào " +# ^Registering +"Đang đăng kí: " +# ^Unregistering +"Đang hủy đăng kí: " +# ^SymbolNotFound +"Không thể tìm thấy biểu tượng: " +# ^CouldNotLoad +"Không thể nạp: " +# ^CreateFolder +"Tạo thư mục: " +# ^CreateShortcut +"Tạo lối tắt: " +# ^CreatedUninstaller +"Tạo trình gỡ bỏ: " +# ^Delete +"Xóa tập tin: " +# ^DeleteOnReboot +"Xóa khi khởi động lại: " +# ^ErrorCreatingShortcut +"Lỗi khi tạo lối tắt: " +# ^ErrorCreating +"Lỗi khi tạo: " +# ^ErrorDecompressing +Lỗi khi giải nén dữ liệu! Có thể trình cài đặt đã bị hỏng? +# ^ErrorRegistering +Lỗi khi đăng kí DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Thực thi: " +# ^Extract +"Trích xuất: " +# ^ErrorWriting +"Trích xuất: lôi khi ghi vào tập tin " +# ^InvalidOpcode +Trình cài đặt bị hỏng: mã tác vụ bất hợp lệ +# ^NoOLE +"Không có OLE cho: " +# ^OutputFolder +"Thư mục đầu ra: " +# ^RemoveFolder +"Xóa thư mục: " +# ^RenameOnReboot +"Đổi tên khi khởi động lại: " +# ^Rename +"Đổi tên: " +# ^Skipped +"Đã bỏ qua: " +# ^CopyDetails +Sao chép Chi tiết vào Clipboard +# ^LogInstall +Lưu kí quá trình cài đặt +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nsh new file mode 100644 index 0000000000..a9468c9ace --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Vietnamese.nsh @@ -0,0 +1,129 @@ +;Language: Vietnamese (1066) +;By NGUYỄN Mạnh Hùng + +!insertmacro LANGFILE "Vietnamese" = "Tiếng Việt" "Tieng Viet" + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Chào mừng đến với Trợ lí Cài đặt $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Trình trợ lí sẽ hướng dẫn bạn việc cài đặt $(^NameDA).$\r$\n$\r$\nBạn nên đóng tất cả các chương trình khác trước khi bắt đầu cài đặt. Điều này có thể giúp cập nhật các tập tin hệ thống mà không cần phải khởi động lại máy tính.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Chào mừng đến với Trợ lí Gỡ bỏ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Trình trợ lí sẽ hướng dẫn bạn việc gỡ bỏ $(^NameDA).$\r$\n$\r$\nTrước khi bắt đầu gỡ bỏ, hãy chắc chắn rằng $(^NameDA) đang không chạy.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Thỏa thuận Giấy phép" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Vui lòng xem xét các điều khoản giấy phép trước khi cài đặt $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy nhấn “Tôi đồng ý” để tiếp tục. Bạn phải chấp thuận bản thỏa thuận để cài đặt $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy nhấn ô bên dưới. Bạn phải chấp thuận bản thỏa thuận để cài đặt $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy chọn ô đầu tiên bên dưới. Bạn phải chấp thuận bản thỏa thuận để cài đặt $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Thỏa thuận Giấy phép" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Vui lòng xem xét các điều khoản giấy phép trước khi gỡ bỏ $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy nhấn “Tôi đồng ý” để tiếp tục. Bạn phải chấp thuận bản thỏa thuận để gỡ bỏ $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy nhấn ô bên dưới. Bạn phải chấp thuận bản thỏa thuận để gỡ bỏ $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Nếu bạn chấp thuận các điều khoản của thỏa thuận, hãy chọn ô đầu tiên bên dưới. Bạn phải chấp thuận bản thỏa thuận để gỡ bỏ $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Ấn Page Down để xem phần còn lại của thỏa thuận." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Chọn thành phần" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Chọn các tính năng của $(^NameDA) mà bạn muốn cài đặt." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Chọn thành phần" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Chọn các tính năng của $(^NameDA) mà bạn muốn gỡ bỏ." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Mô tả" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Rê chuột lên trên một thành phần để thấy mô tả của nó." + !else + #FIXME:MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Chọn thư mục cài đặt" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Chọn thư mục để cài đặt $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Chọn thư mục gỡ bỏ" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Chọn thư mục để gỡ bỏ $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Cài đặt" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Vui lòng đợi trong khi $(^NameDA) đang được cài đặt." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Cài đặt hoàn tất" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Việc cài đặt đã hoàn tất thành công." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Cài đặt bị hủy" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Việc cài đặt không hoàn tất thành công." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Gỡ bỏ" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Vui lòng đợi trong khi $(^NameDA) đang được gỡ bỏ." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Gỡ bỏ hoàn tất" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Việc gỡ bỏ đã hoàn tất thành công." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Gỡ bỏ bị hủy" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Việc gỡ bỏ không hoàn tất thành công." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Hoàn tất Cài đặt $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) đã được cài đặt vào máy tính của bạn.$\r$\n$\r$\nNhấn “Hoàn thành” để đóng Trình trợ lí." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Máy tính của bạn phải được khởi động lại để hoàn tất việc cài đặt $(^NameDA). Bạn có muốn khởi động lại ngay không?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Hoàn tất Gỡ bỏ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) đã được gỡ bỏ khỏi máy tính của bạn.$\r$\n$\r$\nNhấn “Hoàn thành” để đóng Trình trợ lí." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Máy tính của bạn phải được khởi động lại để hoàn tất việc gỡ bỏ $(^NameDA). Bạn có muốn khởi động lại ngay không?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Khởi động lại ngay" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Tôi muốn khởi động lại sau" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Chạy $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "Hiện &Readme" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Hoàn thành" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Chọn thư mục Trình đơn Start" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Chọn một thư mục trên Trình đơn Start để tạo lối tắt cho $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Chọn thư mục trên Trình đơn Start mà bạn muốn tạo lối tắt cho chương trình. Bạn cũng có thể nhập tên để tạo thư mục mới." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Không tạo lối tắt" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Gỡ bỏ $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Gỡ bỏ $(^NameDA) khỏi máy tính của bạn." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Bạn có thật sự muốn thoát trình Cài đặt $(^Name) không?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Bạn có thật sự muốn thoát trình Gỡ bỏ $(^Name) không?" +!endif + +!ifdef MULTIUSER_INSTALLMODEPAGE + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_TITLE "Chọn người dùng" + ${LangFileString} MULTIUSER_TEXT_INSTALLMODE_SUBTITLE "Chọn người dùng mà bạn muốn cài đặt $(^NameDA)." + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_TOP "Chọn giữa việc cài đặt $(^NameDA) cho riêng bạn hoặc cho tất cả người dùng của máy tính này. $(^ClickNext)" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS "Cài đặt cho bất kì người nào sử dụng máy tính này" + ${LangFileString} MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER "Chỉ cài đặt cho riêng tôi" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nlf b/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nlf new file mode 100644 index 0000000000..516e1e911a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nlf @@ -0,0 +1,191 @@ +# Header, don't edit +NLF v6 +# Start editing here +# Language ID +1106 +# Font and size - dash (-) means default +- +- +# Codepage - dash (-) means ASCII code page +1252 +# RTL - anything else than RTL means LTR +- +# Translation by Rhoslyn Prys, Meddal.com +# ^Branding +Nullsoft Install System %s +# ^SetupCaption +Rhaglen Osod $(^Name) +# ^UninstallCaption +Rhaglen Dadosod $(^Name) +# ^LicenseSubCaption +: Cytundeb Trwyddedu +# ^ComponentsSubCaption +: Dewisiadau Gosod +# ^DirSubCaption +: Ffolder Gosod +# ^InstallingSubCaption +: Gosod +# ^CompletedSubCaption +: Cwblhawyd +# ^UnComponentsSubCaption +: Dewisiadau Dadosod +# ^UnDirSubCaption +: Ffolder Dadosod +# ^ConfirmSubCaption +: Cadarnhad +# ^UninstallingSubCaption +: Dadosod +# ^UnCompletedSubCaption +: Cwblhawyd +# ^BackBtn +< &Nôl +# ^NextBtn +&Nesaf > +# ^AgreeBtn +&Cytuno +# ^AcceptBtn +Rwy'n &derbyn Amodau'r Drwydded +# ^DontAcceptBtn +Rwy'n &gwrthod Amodau'r Drwydded +# ^InstallBtn +&Gosod +# ^UninstallBtn +&Dadosod +# ^CancelBtn +Diddymu +# ^CloseBtn +C&au +# ^BrowseBtn +&Pori... +# ^ShowDetailsBtn +&Dangos manylion +# ^ClickNext +Cliciwch Nesaf i barhau. +# ^ClickInstall +Cliciwch Gosod i gychwyn gosod. +# ^ClickUninstall +Cliciwch Dadosod i gychwyn dadosod. +# ^Name +Enw +# ^Completed +Cwblhawyd +# ^LicenseText +Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno. +# ^LicenseTextCB +Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK +# ^LicenseTextRB +Darllenwch y cytundeb trwyddedu cyn gosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK +# ^UnLicenseText +Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch Cytuno. +# ^UnLicenseTextCB +Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, cliciwch y blwch ticio isod. $_CLICK +# ^UnLicenseTextRB +Darllenwch y cytundeb trwyddedu cyn dadosod $(^NameDA). Os ydych yn derbyn holl amodau'r cytundeb, ticiwch y dewis cyntaf isod. $_CLICK +# ^Custom +Addasu +# ^ComponentsText +Ticiwch y cydrannau rydych am eu gosod a dad-dicio'r cydrannau nad ydych am eu gosod. $_CLICK +# ^ComponentsSubText1 +Dewis y math o osod: +# ^ComponentsSubText2_NoInstTypes +Dewis cydrannau i'w gosod: +# ^ComponentsSubText2 +Neu, ddewis y cydrannau ychwanegol i'w gosod: +# ^UnComponentsText +Ticiwch y cydrannau rydych am eu dadosod a dad-dicio'r cydrannau nad ydych am eu dadosod. $_CLICK +# ^UnComponentsSubText1 +Dewis y math o ddadosod: +# ^UnComponentsSubText2_NoInstTypes +Dewis cydrannau i'w dadosod: +# ^UnComponentsSubText2 +Neu, ddewis y cydrannau ychwanegol i'w dadosod: +# ^DirText +Bydd y Rhaglen Osod yn gosod $(^NameDA) yn y ffolder canlynol. I'w osod mewn ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK +# ^DirSubText +Ffolder Cyrchfan +# ^DirBrowseText +Dewis y ffolder i osod $(^NameDA) ynddo: +# ^UnDirText +Bydd y Rhegen Osod yn dadosod $(^NameDA) o'r ffolder canlynol. I ddadosod o ffolder gwahanol, cliciwch Pori a dewis ffolder arall. $_CLICK +# ^UnDirSubText +"" +# ^UnDirBrowseText +Dewis ffolder i ddadosod $(^NameDA) ohono: +# ^SpaceAvailable +"Lle ar gael: " +# ^SpaceRequired +"Lle angenrheidiol: " +# ^UninstallingText +Bydd $(^NameDA) yn cael ei ddadosod o'r ffolder canlynol. $_CLICK +# ^UninstallingSubText +Dadosod o: +# ^FileError +Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Atal i atal y gosod,\r\nEto i geisio eto, neu\r\nAnwybyddu i hepgor y ffeil. +# ^FileError_NoIgnore +Gwall agor ffeil i'w hysgrifennu: \r\n\r\n$0\r\n\r\nCliciwch Eto i geisio eto, neu\r\nDiddymu i atal y gosod. +# ^CantWrite +"Methu ysgrifennu: " +# ^CopyFailed +Methu Copïo +# ^CopyTo +"Copïo i " +# ^Registering +"Cofrestru: " +# ^Unregistering +"Dadgofrestru: " +# ^SymbolNotFound +"Methu canfod symbol: " +# ^CouldNotLoad +"Methu llwytho: " +# ^CreateFolder +"Creu ffolder: " +# ^CreateShortcut +"Creu llwybr byr: " +# ^CreatedUninstaller +"Creu dadosodwr: " +# ^Delete +"Dileu ffeil: " +# ^DeleteOnReboot +"Dileu wrth ailgychwyn: " +# ^ErrorCreatingShortcut +"Gwall wrth greu llwybr byr: " +# ^ErrorCreating +"Gwall wrth greu: " +# ^ErrorDecompressing +Gwall wrth ddatgywasgu data! Gosodwr llwgr? +# ^ErrorRegistering +Gwall cofrestru DLL +# ^ExecShell +"ExecShell: " +# ^Exec +"Gweithredu: " +# ^Extract +"Echdynnu: " +# ^ErrorWriting +"Echdynnu: gwall ysgrifennu i ffeil " +# ^InvalidOpcode +Gosodwr llwgr: opcode annilys +# ^NoOLE +"Dim OLE ar gyfer: " +# ^OutputFolder +"Ffolder allbwn: " +# ^RemoveFolder +"Tynnu ffolder: " +# ^RenameOnReboot +"Ailenwi wrth ailgychwyn: " +# ^Rename +"Ailenwi: " +# ^Skipped +"Hepgor: " +# ^CopyDetails +Copïo Manylion i'r Clipfwrdd +# ^LogInstall +Cofnodi'r brosed gosod +# ^Byte +B +# ^Kilo + K +# ^Mega + M +# ^Giga + G diff --git a/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nsh b/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nsh new file mode 100644 index 0000000000..1aeabf1cdb --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Language files/Welsh.nsh @@ -0,0 +1,121 @@ +;Language: Welsh (1106) +;By Rhoslyn Prys, Meddal.com + +!insertmacro LANGFILE "Welsh" = "Cymraeg" = + +!ifdef MUI_WELCOMEPAGE + ${LangFileString} MUI_TEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Gosod $(^NameDA)" + ${LangFileString} MUI_TEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy osodiad $(^NameDA).$\r$\n$\r$\nCaewch pob rhaglen cyn cychwyn y rhaglen osod. Bydd hyn yn ei gwneud yn bosibl i ddiweddaru'r ffeiliau system berthnasol heb fod angen ailgychwyn eich cyfrifiadur.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_UNWELCOMEPAGE + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TITLE "Croeso i Ddewin Dadosod $(^NameDA)" + ${LangFileString} MUI_UNTEXT_WELCOME_INFO_TEXT "Bydd y dewin yn eich arwain drwy ddadosod $(^NameDA).$\r$\n$\r$\nCyn cychwyn dadosod, gwnewch yn siwr nad yw $(^NameDA) yn rhedeg.$\r$\n$\r$\n$_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE + ${LangFileString} MUI_TEXT_LICENSE_TITLE "Cytundeb Trwyddedu" + ${LangFileString} MUI_TEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn gosod $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK" + ${LangFileString} MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn gosod $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_UNLICENSEPAGE + ${LangFileString} MUI_UNTEXT_LICENSE_TITLE "Cytundeb Trwyddedu" + ${LangFileString} MUI_UNTEXT_LICENSE_SUBTITLE "Darllenwch amodau'r drwydded cyn dadosod $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM "Os ydych yn derbyn amodau'r cytundeb, cliciwch Cytuno i barhau. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA)." + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Os ydych yn derbyn amodau'r cytundeb, cliciwch y blwch ticio isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK" + ${LangFileString} MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Os ydych yn derbyn amodau'r cytundeb, cliciwch y dewis cyntaf isod. Mae'n rhaid i chi dderbyn amodau'r cytundeb er mwyn dadosod $(^NameDA). $_CLICK" +!endif + +!ifdef MUI_LICENSEPAGE | MUI_UNLICENSEPAGE + ${LangFileString} MUI_INNERTEXT_LICENSE_TOP "Pwyswch Page Down i ddarllen gweddill y cytundeb." +!endif + +!ifdef MUI_COMPONENTSPAGE + ${LangFileString} MUI_TEXT_COMPONENTS_TITLE "Dewis Cydrannau" + ${LangFileString} MUI_TEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) rydych am eu gosod." +!endif + +!ifdef MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_UNTEXT_COMPONENTS_TITLE "Dewis Cydrannau" + ${LangFileString} MUI_UNTEXT_COMPONENTS_SUBTITLE "Dewis pa nodweddion o $(^NameDA) i'w dadoso." +!endif + +!ifdef MUI_COMPONENTSPAGE | MUI_UNCOMPONENTSPAGE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Disgrifiad" + !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Gosod eich llygoden dros gydran i weld ei ddisgrifiad." + !else + ${LangFileString} MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Dewis cydran i weld ei ddisgrifiad." + !endif +!endif + +!ifdef MUI_DIRECTORYPAGE + ${LangFileString} MUI_TEXT_DIRECTORY_TITLE "Dewis Lleoliad Gosod" + ${LangFileString} MUI_TEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i osod $(^NameDA)." +!endif + +!ifdef MUI_UNDIRECTORYPAGE + ${LangFileString} MUI_UNTEXT_DIRECTORY_TITLE "Dewis Lleoliad Dadosod" + ${LangFileString} MUI_UNTEXT_DIRECTORY_SUBTITLE "Dewis y ffolder i ddadosod $(^NameDA)." +!endif + +!ifdef MUI_INSTFILESPAGE + ${LangFileString} MUI_TEXT_INSTALLING_TITLE "Gosod" + ${LangFileString} MUI_TEXT_INSTALLING_SUBTITLE "Arhoswch tra fo $(^NameDA) yn cael ei osod." + ${LangFileString} MUI_TEXT_FINISH_TITLE "Cwblhawyd y Gosod" + ${LangFileString} MUI_TEXT_FINISH_SUBTITLE "Mae'r Gosod wedi ei gwblhau'n llwyddiannus." + ${LangFileString} MUI_TEXT_ABORT_TITLE "Ataliwyd y Gosod" + ${LangFileString} MUI_TEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r gosod yn llwyddiannus." +!endif + +!ifdef MUI_UNINSTFILESPAGE + ${LangFileString} MUI_UNTEXT_UNINSTALLING_TITLE "Dadosod" + ${LangFileString} MUI_UNTEXT_UNINSTALLING_SUBTITLE "Arhoswch tra bo $(^NameDA) yn cael ei ddadosod." + ${LangFileString} MUI_UNTEXT_FINISH_TITLE "Cwblhawyd y Dadosod" + ${LangFileString} MUI_UNTEXT_FINISH_SUBTITLE "Mae'r Dadosod wedi ei gwblhau'n llwyddiannus." + ${LangFileString} MUI_UNTEXT_ABORT_TITLE "Ataliwyd y Dadosod" + ${LangFileString} MUI_UNTEXT_ABORT_SUBTITLE "Methwyd â chwblhau'r dadosod yn llwyddiannus." +!endif + +!ifdef MUI_FINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_INFO_TITLE "Cwblhau Dewin Gosod $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi cael ei osod ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin." + ${LangFileString} MUI_TEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?" +!endif + +!ifdef MUI_UNFINISHPAGE + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TITLE "Cwblhau Dewin Dadosod $(^NameDA)" + ${LangFileString} MUI_UNTEXT_FINISH_INFO_TEXT "Mae $(^NameDA) wedi ei ddadosod oddi ar eich cyfrifiadur.$\r$\n$\r$\nCliciwch Gorffen i gau'r dewin." + ${LangFileString} MUI_UNTEXT_FINISH_INFO_REBOOT "Rhaid ailgychwyn eich cyfrifiadur i gwblhau gosod $(^NameDA). Hoffech chi ailgychwyn?" +!endif + +!ifdef MUI_FINISHPAGE | MUI_UNFINISHPAGE + ${LangFileString} MUI_TEXT_FINISH_REBOOTNOW "Ailgychwyn" + ${LangFileString} MUI_TEXT_FINISH_REBOOTLATER "Rwyf am ailgychwyn yn hwyrach" + ${LangFileString} MUI_TEXT_FINISH_RUN "&Rhedeg $(^NameDA)" + ${LangFileString} MUI_TEXT_FINISH_SHOWREADME "&Dangos Darllenfi" + ${LangFileString} MUI_BUTTONTEXT_FINISH "&Gorffen" +!endif + +!ifdef MUI_STARTMENUPAGE + ${LangFileString} MUI_TEXT_STARTMENU_TITLE "Dewis Ffolder Dewislen Cychwyn" + ${LangFileString} MUI_TEXT_STARTMENU_SUBTITLE "Dewis ffolder Dewislen Cychwyn ar gyfer llwybrau byr $(^NameDA)." + ${LangFileString} MUI_INNERTEXT_STARTMENU_TOP "Dewis ffolder Dewislen Cychwyn i greu llwybrau byr y rhaglen. Gallwch roi enw i greu ffolder newydd." + ${LangFileString} MUI_INNERTEXT_STARTMENU_CHECKBOX "Peidio creu llwybrau byr" +!endif + +!ifdef MUI_UNCONFIRMPAGE + ${LangFileString} MUI_UNTEXT_CONFIRM_TITLE "Dadosod $(^NameDA)" + ${LangFileString} MUI_UNTEXT_CONFIRM_SUBTITLE "Tynnu $(^NameDA) oddiar eich cyfrifiadur." +!endif + +!ifdef MUI_ABORTWARNING + ${LangFileString} MUI_TEXT_ABORTWARNING "Ydych chi'n si?r eich bod am adael Rhaglen Osod $(^Name)?" +!endif + +!ifdef MUI_UNABORTWARNING + ${LangFileString} MUI_UNTEXT_ABORTWARNING "Ydych chi'n siwr eich bod am adael Rhaglen Dadosod $(^Name)?" +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Deprecated.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Deprecated.nsh new file mode 100644 index 0000000000..85339f2bb0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Deprecated.nsh @@ -0,0 +1,86 @@ +/* + +NSIS Modern User Interface +Deprecated code - display warnings + +*/ + + +!macro MUI_LEGACY_MAP_NOSTRETCH NAME R + !if "${R}" != "" + !ifdef ${NAME}NOSTRETCH + !define /IfNDef ${NAME}STRETCH NoStretchNoCropNoAlign + !endif + !else + !insertmacro ${__MACRO__} ${NAME}BITMAP_ 1 + !insertmacro ${__MACRO__} ${NAME}BITMAP_RTL_ 1 + !insertmacro ${__MACRO__} ${NAME}UNBITMAP_ 1 + !insertmacro ${__MACRO__} ${NAME}UNBITMAP_RTL_ 1 + !endif +!macroend + + +;-------------------------------- +;InstallOptions + +!define INSTALLOPTIONS_ERROR "MUI_INSTALLOPTIONS_* macros are no longer a part of MUI2. Include InstallOptions.nsh and use INSTALLOPTIONS_* macros instead. It is also recommended to upgrade to nsDialogs." + +!macro MUI_INSTALLOPTIONS_EXTRACT FILE + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_DISPLAY FILE + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_INITDIALOG FILE + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_SHOW + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_SHOW_RETURN + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE + + !error "${INSTALLOPTIONS_ERROR}" + +!macroend + +!macro MUI_RESERVEFILE_INSTALLOPTIONS + + !error `MUI_RESERVEFILE_INSTALLOPTIONS is no longer supported as InstallOptions is no longer used by MUI2. Instead, use "ReserveFile /plugin InstallOptions.dll". It is also recommended to upgrade to nsDialogs.` + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Interface.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Interface.nsh new file mode 100644 index 0000000000..ee858bd07a --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Interface.nsh @@ -0,0 +1,363 @@ +/* + +NSIS Modern User Interface +Interface code for all pages + +*/ + +;-------------------------------- +;Variables + +Var mui.Header.Text +Var mui.Header.Text.Font +Var mui.Header.SubText +Var mui.Header.Background +Var mui.Header.Image + +Var mui.Branding.Text +Var mui.Branding.Background + +Var mui.Line.Standard +Var mui.Line.FullWindow + +Var mui.Button.Next +Var mui.Button.Cancel +Var mui.Button.Back + + +;-------------------------------- +;General interface settings + +!macro MUI_INTERFACE + + !ifndef MUI_INTERFACE + + !define MUI_INTERFACE + + ;These values are set after the interface settings in the script, + ;so the script itself can override all values. + + ;Default interface settings in nsisconf.nsh + !ifdef MUI_INSERT_NSISCONF + !insertmacro MUI_NSISCONF + !endif + + ;Default interface settings + !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe" + !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" + !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe" + !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" + !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF" + !insertmacro MUI_DEFAULT MUI_TEXTCOLOR "000000" + + ;Map *_NOSTRETCH legacy define to the correct *_STRETCH value + !verbose push 2 + !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_HEADERIMAGE_ "" + !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_WELCOMEFINISHPAGE_ "" + !insertmacro MUI_LEGACY_MAP_NOSTRETCH MUI_UNWELCOMEFINISHPAGE_ "" + !verbose pop + + ;Default header images + !ifdef MUI_HEADERIMAGE + + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP_STRETCH "FitControl" + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} + + !ifndef MUI_HEADERIMAGE_UNBITMAP + !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}" + !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} + !endif + + !if "${MUI_HEADERIMAGE_BITMAP}" == "" + !error "Invalid MUI_HEADERIMAGE_BITMAP" + !endif + !if "${MUI_HEADERIMAGE_UNBITMAP}" == "" + !error "Invalid MUI_HEADERIMAGE_UNBITMAP" + !endif + + !ifdef MUI_HEADERIMAGE_BITMAP_RTL + !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL + !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}" + !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_RTL_STRETCH} + !endif + + !if "${MUI_HEADERIMAGE_BITMAP_RTL}" == "" + !error "Invalid MUI_HEADERIMAGE_BITMAP_RTL" + !endif + !if "${MUI_HEADERIMAGE_UNBITMAP_RTL}" == "" + !error "Invalid MUI_HEADERIMAGE_UNBITMAP_RTL" + !endif + !endif + + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_UNBITMAP_STRETCH ${MUI_HEADERIMAGE_BITMAP_STRETCH} + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH ${MUI_HEADERIMAGE_BITMAP_RTL_STRETCH} + + !endif + + ;Default texts + !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)" + !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)" + + ;Apply settings + + XPStyle On ;XP style setting in manifest resource + + ;Dialog resources + ChangeUI all "${MUI_UI}" + !ifdef MUI_HEADERIMAGE + !ifndef MUI_HEADERIMAGE_RIGHT + ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}" + !else + ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}" + !endif + !endif + + ;Icons + Icon "${MUI_ICON}" + UninstallIcon "${MUI_UNICON}" + + !endif + +!macroend + + +;-------------------------------- +;Abort warning message box + +!macro MUI_ABORTWARNING + + !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT + MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit + !else + MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.Quit + !endif + + Abort + mui.Quit: + +!macroend + +!macro MUI_UNABORTWARNING + + !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT + MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit + !else + MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.Quit + !endif + + Abort + mui.Quit: + +!macroend + + +;-------------------------------- +;Initialization of GUI + +!macro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO MACRO + + !ifdef MUI_HEADERIMAGE_RIGHT + !ifndef MUI_OPTIMIZE_ALWAYSLTR ; Undocumented + ${if} $(^RTL) == 1 + !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Left Leak + ${Else} + !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Right Leak + ${EndIf} + !else + !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Right Leak + !endif + !else + !insertmacro ${MACRO} $mui.Header.Image "${PATH}" Auto Leak + !endif + +!macroend +!macro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE UN RTL IMGRESID PATH + + GetDlgItem $mui.Header.Image $HWNDPARENT ${IMGRESID} ; This variable is not used by every mode but we have to reference it to avoid a compiler warning. + + !if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "NoStretchNoCropNoAlign" + + SetBrandingImage /IMGID=${IMGRESID} "${PATH}" + + !else if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "NoStretchNoCrop" + + !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO \ + MUI_LOADANDXALIGNIMAGE + + !else if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" == "AspectFitHeight" + + !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGEWITHMACRO \ + MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT + + !else + + !if "${MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH}" != "FitControl" + !warning 'MUI_HEADERIMAGE_${UN}BITMAP${RTL}_STRETCH set to unknown value, defaulting to FitControl' + !endif + SetBrandingImage /IMGID=${IMGRESID} /RESIZETOFIT "${PATH}" + + !endif + +!macroend + +!macro MUI_HEADERIMAGE_INIT UN IMGRESID + + ;Load and display header image + + !ifdef MUI_HEADERIMAGE + + InitPluginsDir + + !ifdef MUI_HEADERIMAGE_${UN}BITMAP_RTL + ${if} $(^RTL) == 1 + + File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UN}BITMAP_RTL}" + !pragma verifyloadimage "${MUI_HEADERIMAGE_${UN}BITMAP_RTL}" + !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE "${UN}" "_RTL" ${IMGRESID} "$PLUGINSDIR\modern-header.bmp" + + ${else} + !endif + + File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UN}BITMAP}" + !pragma verifyloadimage "${MUI_HEADERIMAGE_${UN}BITMAP}" + !insertmacro MUI_HEADERIMAGE_INITHELPER_LOADIMAGE "${UN}" "" ${IMGRESID} "$PLUGINSDIR\modern-header.bmp" + + !ifdef MUI_HEADERIMAGE_${UN}BITMAP_RTL + ${endif} + !endif + + !endif + +!macroend + +!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER + + ;Initialize outer dialog (fonts & colors) + + ;Header + GetDlgItem $mui.Header.Text $HWNDPARENT 1037 + CreateFont $mui.Header.Text.Font "$(^Font)" "$(^FontSize)" "700" + SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0 + + GetDlgItem $mui.Header.SubText $HWNDPARENT 1038 + + !ifndef MUI_HEADER_TRANSPARENT_TEXT + SetCtlColors $mui.Header.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + SetCtlColors $mui.Header.SubText "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !else + SetCtlColors $mui.Header.Text "${MUI_TEXTCOLOR}" "transparent" + SetCtlColors $mui.Header.SubText "${MUI_TEXTCOLOR}" "transparent" + !endif + + ;Header image + !insertmacro MUI_HEADERIMAGE_INIT "${UNINSTALLER}" 1046 + + ;Header background + GetDlgItem $mui.Header.Background $HWNDPARENT 1034 + SetCtlColors $mui.Header.Background "" "${MUI_BGCOLOR}" + + ;Header icon image background + !ifndef MUI_HEADERIMAGE + GetDlgItem $mui.Header.Image $HWNDPARENT 1039 + SetCtlColors $mui.Header.Image "" "${MUI_BGCOLOR}" + !endif + + ;Branding text + GetDlgItem $mui.Branding.Background $HWNDPARENT 1028 + SetCtlColors $mui.Branding.Background /BRANDING + GetDlgItem $mui.Branding.Text $HWNDPARENT 1256 + SetCtlColors $mui.Branding.Text /BRANDING + SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 "STR:$(^Branding) " + + ;Lines + GetDlgItem $mui.Line.Standard $HWNDPARENT 1035 + GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045 + + ;Buttons + GetDlgItem $mui.Button.Next $HWNDPARENT 1 + GetDlgItem $mui.Button.Cancel $HWNDPARENT 2 + GetDlgItem $mui.Button.Back $HWNDPARENT 3 + +!macroend + + +;-------------------------------- +;Interface functions + +!macro MUI_FUNCTION_GUIINIT + + Function .onGUIInit + + !insertmacro MUI_GUIINIT_OUTERDIALOG "" + + !ifdef MUI_PAGE_FUNCTION_GUIINIT + Call "${MUI_PAGE_FUNCTION_GUIINIT}" + !endif + + !ifdef MUI_CUSTOMFUNCTION_GUIINIT + Call "${MUI_CUSTOMFUNCTION_GUIINIT}" + !endif + + FunctionEnd + +!macroend + +!macro MUI_UNFUNCTION_GUIINIT + + Function un.onGUIInit + + !insertmacro MUI_GUIINIT_OUTERDIALOG UN + + !ifdef MUI_UNPAGE_FUNCTION_GUIINIT + Call "${MUI_UNPAGE_FUNCTION_GUIINIT}" + !endif + + !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT + Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}" + !endif + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_ABORTWARNING + + Function .onUserAbort + + !ifdef MUI_PAGE_FUNCTION_ABORTWARNING + Call ${MUI_PAGE_FUNCTION_ABORTWARNING} + !endif + + !ifdef MUI_ABORTWARNING + !insertmacro MUI_ABORTWARNING + !endif + + !ifdef MUI_CUSTOMFUNCTION_ABORT + Call "${MUI_CUSTOMFUNCTION_ABORT}" + !endif + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_UNABORTWARNING + + Function un.onUserAbort + + !ifdef MUI_UNPAGE_FUNCTION_ABORTWARNING + Call ${MUI_UNPAGE_FUNCTION_ABORTWARNING} + !endif + + !ifdef MUI_UNABORTWARNING + !insertmacro MUI_UNABORTWARNING + !endif + + !ifdef MUI_CUSTOMFUNCTION_UNABORT + Call "${MUI_CUSTOMFUNCTION_UNABORT}" + !endif + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Localization.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Localization.nsh new file mode 100644 index 0000000000..1f02b187a2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Localization.nsh @@ -0,0 +1,198 @@ +/* + +NSIS Modern User Interface +Localization + +*/ + +;-------------------------------- +;Variables + +!macro MUI_LANGDLL_VARIABLES + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + !ifndef MUI_LANGDLL_REGISTRY_VARIABLES + !define MUI_LANGDLL_REGISTRY_VARIABLES + + ;/GLOBAL because the macros are included in a function + Var /GLOBAL mui.LangDLL.RegistryLanguage + + !endif + !endif + +!macroend + + +;-------------------------------- +;Include language files + +!macro MUI_LANGUAGEEX LangDir NLFID + + !verbose push ${MUI_VERBOSE} + + !ifndef MUI_PAGE_UNINSTALLER_PREFIX + !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages + !warning "MUI_LANGUAGE[EX] should be inserted after the MUI_[UN]PAGE_* macros" + !endif + !endif + + !insertmacro MUI_INSERT + + ;Include a language + LoadLanguageFile "${LangDir}\${NLFID}.nlf" + + ;Include MUI language file + !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \ + "${LangDir}\${NLFID}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh" + + ;Add language to list of languages for selection dialog + !define /ifndef MUI_LANGDLL_LANGUAGES "" + !define /redef MUI_LANGDLL_LANGUAGES \ + `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" ${MUI_LANGDLL_LANGUAGES}` + !define /ifndef MUI_LANGDLL_LANGUAGES_CP "" + !define /redef MUI_LANGDLL_LANGUAGES_CP \ + `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" "${LANG_${NLFID}_CP}" ${MUI_LANGDLL_LANGUAGES_CP}` + + !verbose pop + +!macroend + +!macro MUI_LANGUAGE NLFID + + !verbose push ${MUI_VERBOSE} + + !insertmacro MUI_LANGUAGEEX "${NSISDIR}\Contrib\Language files" "${NLFID}" + + !verbose pop + +!macroend + + +;-------------------------------- +;Language selection + +!macro MUI_LANGDLL_DISPLAY + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifndef MUI_LANGDLL_LANGUAGES + !warning "MUI_LANGDLL_DISPLAY should only be used after inserting the MUI_LANGUAGE macro(s)" + !endif + + !insertmacro MUI_LANGDLL_VARIABLES + + !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language" + !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language." + + !ifdef MUI_LANGDLL_REGISTRY_VARIABLES + + ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" + + ${if} $mui.LangDLL.RegistryLanguage != "" + ;Set default language to registry language + StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage + ${endif} + + !endif + + !ifdef NSIS_CONFIG_SILENT_SUPPORT + ${unless} ${Silent} + !endif + + !ifndef MUI_LANGDLL_ALWAYSSHOW + !ifdef MUI_LANGDLL_REGISTRY_VARIABLES + ${if} $mui.LangDLL.RegistryLanguage == "" + !endif + !endif + + ;Show language selection dialog + !ifdef MUI_LANGDLL_ALLLANGUAGES + LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} "" + !else + LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} "" + !endif + + Pop $LANGUAGE + ${if} $LANGUAGE == "cancel" + Abort + ${endif} + + !ifndef MUI_LANGDLL_ALWAYSSHOW + !ifdef MUI_LANGDLL_REGISTRY_VARIABLES + ${endif} + !endif + !endif + + + !ifdef NSIS_CONFIG_SILENT_SUPPORT + ${endif} + !endif + + !verbose pop + +!macroend + +!macro MUI_LANGDLL_SAVELANGUAGE + + ;Save language in registry + + !ifndef MUI_PAGE_UNINSTALLER + + IfAbort mui.langdllsavelanguage_abort + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE + !endif + + mui.langdllsavelanguage_abort: + + !endif + +!macroend + +!macro MUI_UNGETLANGUAGE + + ;Get language from registry in uninstaller + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_LANGDLL_VARIABLES + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + + ReadRegStr $mui.LangDLL.RegistryLanguage "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" + + ${if} $mui.LangDLL.RegistryLanguage = "" + + !endif + + !insertmacro MUI_LANGDLL_DISPLAY + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + + ${else} + StrCpy $LANGUAGE $mui.LangDLL.RegistryLanguage + ${endif} + + !endif + + !verbose pop + +!macroend + + +;-------------------------------- +;Rerserve LangDLL file + +!macro MUI_RESERVEFILE_LANGDLL + + !verbose push + !verbose ${MUI_VERBOSE} + + ReserveFile /plugin LangDLL.dll + + !verbose pop + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/MUI2.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/MUI2.nsh new file mode 100644 index 0000000000..1a0ece4fd2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/MUI2.nsh @@ -0,0 +1,117 @@ +/* + +NSIS Modern User Interface - Version 2.1 +Copyright 2002-2026 Joost Verburg +Contributors: Amir Szekely, Anders Kjersem + +*/ + +!ifndef MUI_INCLUDED +!verbose push 3 +!define MUI_INCLUDED +!define MUI_SYSVERSION "2.1" +!verbose pop +!echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2026 Joost Verburg" + +;-------------------------------- +!verbose push 3 +!define /IfNDef MUI_VERBOSE 3 +!verbose ${MUI_VERBOSE} + +!addincludedir "${NSISDIR}\Contrib\Modern UI 2" + +;-------------------------------- +;Header files required by MUI + +!include WinMessages.nsh +!include LogicLib.nsh +!include nsDialogs.nsh +!include LangFile.nsh + + +;-------------------------------- +;Macros for compile-time defines + +!macro MUI_DEFAULT SYMBOL CONTENT + + ;Define symbol if not yet defined + ;For setting default values + + !ifndef "${SYMBOL}" + !define "${SYMBOL}" "${CONTENT}" + !endif + +!macroend + +!macro MUI_SET SYMBOL CONTENT + + ;Define symbol and undefine if necessary + + !insertmacro MUI_UNSET "${SYMBOL}" + !define "${SYMBOL}" "${CONTENT}" + +!macroend + +!macro MUI_UNSET SYMBOL + + ;Undefine symbol if defined + + !ifdef "${SYMBOL}" + !undef "${SYMBOL}" + !endif + +!macroend + + +;-------------------------------- +;MUI interface + +!include "Deprecated.nsh" +!include "Interface.nsh" +!include "Localization.nsh" +!include "Pages.nsh" + + +;-------------------------------- +;Pages + +!include "Pages\Components.nsh" +!include "Pages\Directory.nsh" +!include "Pages\Finish.nsh" +!include "Pages\InstallFiles.nsh" +!include "Pages\License.nsh" +!include "Pages\StartMenu.nsh" +!include "Pages\UninstallConfirm.nsh" +!include "Pages\Welcome.nsh" + + +;-------------------------------- +;Insert MUI code in script + +!macro MUI_INSERT + + !ifndef MUI_INSERT + !define MUI_INSERT + + ;This macro is included when the first language file is included, + ;after the pages. + + ;Interface settings + !insertmacro MUI_INTERFACE + + ;Interface functions - Installer + !insertmacro MUI_FUNCTION_GUIINIT + !insertmacro MUI_FUNCTION_ABORTWARNING + + ;Interface functions - Uninstaller + !ifdef MUI_UNINSTALLER + !insertmacro MUI_UNFUNCTION_GUIINIT + !insertmacro MUI_FUNCTION_UNABORTWARNING + !endif + + !endif + +!macroend + +!verbose pop +!endif ;~ MUI_INCLUDED diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages.nsh new file mode 100644 index 0000000000..7a3c377821 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages.nsh @@ -0,0 +1,324 @@ +/* + +NSIS Modern User Interface +Support code for all pages + +*/ + +;-------------------------------- +;Page initialization + +!macro MUI_PAGE_INIT + + !ifdef MUI_INSERT + !warning "MUI_PAGE_* inserted after MUI_LANGUAGE" + !endif + + ;Include interface settings if necessary + !insertmacro MUI_INTERFACE + + ;Define settings for installer page + !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER + !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX + !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX + + !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "" + !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "" + + ;Generate unique ID + !insertmacro MUI_UNSET MUI_UNIQUEID + !define MUI_UNIQUEID ${__LINE__} + +!macroend + +!macro MUI_UNPAGE_INIT + + !ifdef MUI_INSERT + !warning "MUI_UNPAGE_* inserted after MUI_LANGUAGE" + !endif + + ;Include interface settings + !insertmacro MUI_INTERFACE + + ;Define prefixes for uninstaller page + !insertmacro MUI_SET MUI_UNINSTALLER "" + + !insertmacro MUI_SET MUI_PAGE_UNINSTALLER "" + !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_PREFIX "UN" + !insertmacro MUI_SET MUI_PAGE_UNINSTALLER_FUNCPREFIX "un." + + ;Generate unique ID + !insertmacro MUI_UNSET MUI_UNIQUEID + !define MUI_UNIQUEID ${__LINE__} + +!macroend + + +;-------------------------------- +;Header text for standard MUI page + +!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT + + !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" + !else ifdef MUI_PAGE_HEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}" + !else ifdef MUI_PAGE_HEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}" + !endif + + !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT + !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT + +!macroend + + +;-------------------------------- +;Header text for custom page + +!macro MUI_HEADER_TEXT TEXT SUBTEXT ;Called from script + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + LockWindow on + !endif + + SendMessage $mui.Header.Text ${WM_SETTEXT} 0 "STR:${TEXT}" + SendMessage $mui.Header.SubText ${WM_SETTEXT} 0 "STR:${SUBTEXT}" + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + LockWindow off + !endif + + !verbose pop + +!macroend + + +;-------------------------------- +;Custom page functions + +!macro MUI_PAGE_FUNCTION_CUSTOM TYPE + + !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE} + Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}" + !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE} + !endif + +!macroend + + +;-------------------------------- +;Support for full window pages (like welcome/finish page) + +!macro MUI_PAGE_FUNCTION_FULLWINDOW + + !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW + !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_FULLWINDOW + + Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow + + LockWindow on + + ;The branding text needs to be hidden because the full windows page + ;overlaps with it. + ShowWindow $mui.Branding.Background ${SW_HIDE} + ShowWindow $mui.Branding.Text ${SW_HIDE} + + ;The texts need to be hidden because otherwise they may show through + ;the page above when the Alt key is pressed. + ShowWindow $mui.Header.Text ${SW_HIDE} + ShowWindow $mui.Header.SubText ${SW_HIDE} + ShowWindow $mui.Header.Image ${SW_HIDE} + + ;Show line below full width of page + ShowWindow $mui.Line.Standard ${SW_HIDE} + ShowWindow $mui.Line.FullWindow ${SW_NORMAL} + + LockWindow off + + FunctionEnd + + Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow + + ;Set everything back to normal again + + LockWindow on + + ShowWindow $mui.Branding.Background ${SW_NORMAL} + ShowWindow $mui.Branding.Text ${SW_NORMAL} + + ShowWindow $mui.Header.Text ${SW_NORMAL} + ShowWindow $mui.Header.SubText ${SW_NORMAL} + ShowWindow $mui.Header.Image ${SW_NORMAL} + + ShowWindow $mui.Line.Standard ${SW_NORMAL} + ShowWindow $mui.Line.FullWindow ${SW_HIDE} + + LockWindow off + + FunctionEnd + + !endif + +!macroend + +!macro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE _un _hwndImg _ImgPath _RetImgHandle + + !ifdef MUI_${_un}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH + !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH NoStretchNoCropNoAlign ; Legacy compatibility + !endif + !insertmacro MUI_DEFAULT MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH FitControl + + !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCropNoAlign" + + ${NSD_SetImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" + + !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "NoStretchNoCrop" + + !insertmacro MUI_LOADANDXALIGNIMAGE ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" + + !else if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" == "AspectFitHeight" + + !insertmacro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT ${_hwndImg} "${_ImgPath}" Auto "${_RetImgHandle}" + + !else + + !if "${MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH}" != "FitControl" + !warning 'MUI_${_un}WELCOMEFINISHPAGE_BITMAP_STRETCH set to unknown value, defaulting to FitControl' + !endif + ${NSD_SetStretchedImage} ${_hwndImg} "${_ImgPath}" "${_RetImgHandle}" + + !endif + +!macroend + + +;-------------------------------- +;Helper macros + +!include Util.nsh + +!macro MUI_INTERNAL_LOADANDSIZEIMAGE _macro _hwndImg _ImgPath _XAlign _RetImgHandle + !if "${_XAlign}" == "Auto" + ${if} $(^RTL) == 1 + Push "*${_ImgPath}" + ${Else} + Push "${_ImgPath}" + ${EndIf} + !else if "${_XAlign}" == "Right" + Push "*${_ImgPath}" + !else + Push "${_ImgPath}" + !endif + Push "${_hwndImg}" + ${CallArtificialFunction} ${_macro} + !if "${_RetImgHandle}" == "Leak" + !insertmacro _LOGICLIB_TEMP + Pop $_LOGICLIB_TEMP + !else if "${_RetImgHandle}" != "Stack" + Pop ${_RetImgHandle} + !endif +!macroend + +!macro MUI_LOADANDXALIGNIMAGE _hwndImg _ImgPath _XAlign _RetImgHandle +!insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ + MUI_INTERNAL_LOADANDXALIGNIMAGE "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" +!macroend +!macro MUI_INTERNAL_LOADANDXALIGNIMAGE + System::Store "S" + System::Call 'USER32::GetWindowRect(psr0,@r1)' + System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog + System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' + IntOp $7 $7 - $5 + IntOp $8 $8 - $6 + + Pop $1 + StrCpy $3 $1 1 + ${If} $3 == "*" ; Move control to the right? + StrCpy $1 $1 "" 1 + ${Endif} + System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' + SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 + Push $2 ; Return value + System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap + System::Call 'USER32::GetClientRect(pr0,@r1)' + System::Call '*$1(i,i,i.r1,i.r2)' + + ${If} $3 == "*" + ${AndIf} $1 < $7 ; ImgW < CtlW + IntOp $3 $7 - $1 + IntOp $5 $5 + $3 + System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,i,i,i0x15)' + ${EndIf} + + System::Store "L" +!macroend + +!macro MUI_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT _hwndImg _ImgPath _XAlign _RetImgHandle +!insertmacro MUI_INTERNAL_LOADANDSIZEIMAGE \ + MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT "${_hwndImg}" "${_ImgPath}" "${_XAlign}" "${_RetImgHandle}" +!macroend +!macro MUI_INTERNAL_LOADANDASPECTSTRETCHIMAGETOCONTROLHEIGHT + System::Store "S" + System::Call 'USER32::GetWindowRect(psr0,@r1)' + System::Call 'USER32::MapWindowPoints(p0,p$hwndparent,pr1,i2)' ; Note: Assuming control is not in inner dialog + System::Call '*$1(i.r5,i.r6,i.r7,i.r8)' + IntOp $7 $7 - $5 + IntOp $8 $8 - $6 + + Pop $1 + StrCpy $3 $1 1 + ${If} $3 == "*" ; Move control to the right? + StrCpy $1 $1 "" 1 + ${Endif} + System::Call 'USER32::LoadImage(p0,tr1,i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE})p.r2' + SendMessage $0 ${STM_SETIMAGE} ${IMAGE_BITMAP} $2 $1 + Push $2 ; Return value + System::Call 'GDI32::DeleteObject(pr1)' ; Note: Assuming the previous image (if any) was a bitmap + System::Call 'USER32::GetClientRect(pr0,@r1)' + System::Call '*$1(i,i,i.r1,i.r2)' + + IntOp $R7 $7 * 10000 + IntOp $R8 $8 * 10000 + IntOp $R1 $1 * 10000 + IntOp $R2 $2 * 10000 + IntOp $R3 $R1 / $2 + StrCpy $R4 10000 + ${If} $R1 > $R2 + StrCpy $R3 10000 + IntOp $R4 $R2 / $1 + ${EndIf} + + ${DoWhile} $R2 > $R8 ; ImgH > CtlH + IntOp $R1 $R1 - $R3 + IntOp $R2 $R2 - $R4 + ${Loop} + ${DoWhile} $R2 < $R8 ; ImgH < CtlH + IntOp $R1 $R1 + $R3 + IntOp $R2 $R2 + $R4 + ${Loop} + IntOp $1 $R1 / 10000 + IntOp $2 $R2 / 10000 + + ${If} $1 < $7 + ${AndIf} $3 == "*" + IntOp $R3 $7 - $1 + IntOp $5 $5 + $R3 + ${EndIf} + + ${DoWhile} $2 > $8 ; Non-aspect-maintained stretch to make it a pixel perfect match + IntOp $2 $2 - 1 + IntOp $1 $1 - 1 + ${IfThen} $3 == "*" ${|} IntOp $5 $5 + 1 ${|} + ${Loop} + + System::Call 'USER32::SetWindowPos(pr0,p0,ir5,ir6,ir1,ir2,i0x14)' + System::Store "L" +!macroend + + diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Components.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Components.nsh new file mode 100644 index 0000000000..5003e5efdf --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Components.nsh @@ -0,0 +1,242 @@ +/* + +NSIS Modern User Interface +Components page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_COMPONENTSPAGE_INTERFACE + + !ifndef MUI_COMPONENTSPAGE_INTERFACE + !define MUI_COMPONENTSPAGE_INTERFACE + Var mui.ComponentsPage + + Var mui.ComponentsPage.Text + Var mui.ComponentsPage.InstTypesText + Var mui.ComponentsPage.ComponentsText + + Var mui.ComponentsPage.InstTypes + Var mui.ComponentsPage.Components + + Var mui.ComponentsPage.DescriptionTitle + Var mui.ComponentsPage.DescriptionText.Info + Var mui.ComponentsPage.DescriptionText + + Var mui.ComponentsPage.SpaceRequired + + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" + + !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe" + !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe" + + ;Apply settings + + !ifdef MUI_COMPONENTSPAGE_SMALLDESC + ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}" + !else ifdef MUI_COMPONENTSPAGE_NODESC + ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}" + !endif + + CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}" + + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_COMPONENTS + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE "" + !insertmacro MUI_COMPONENTSPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} + + Caption " " + + ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}" + + PageExEnd + + !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} + + !undef MUI_COMPONENTSPAGE_TEXT_TOP + !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST + !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE + !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE + !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO + +!macroend + +!macro MUI_PAGE_COMPONENTS + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_COMPONENTS + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_COMPONENTS + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_COMPONENTS + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE + + Function "${PRE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE) + FunctionEnd + + Function "${SHOW}" + + ;Get control handles + FindWindow $mui.ComponentsPage "#32770" "" $HWNDPARENT + GetDlgItem $mui.ComponentsPage.Text $mui.ComponentsPage 1006 + GetDlgItem $mui.ComponentsPage.InstTypesText $mui.ComponentsPage 1021 + GetDlgItem $mui.ComponentsPage.ComponentsText $mui.ComponentsPage 1022 + GetDlgItem $mui.ComponentsPage.InstTypes $mui.ComponentsPage 1017 + GetDlgItem $mui.ComponentsPage.Components $mui.ComponentsPage 1032 + GetDlgItem $mui.ComponentsPage.DescriptionTitle $mui.ComponentsPage 1042 + GetDlgItem $mui.ComponentsPage.DescriptionText $mui.ComponentsPage 1043 + GetDlgItem $mui.ComponentsPage.SpaceRequired $mui.ComponentsPage 1023 + + ;Default text in description textbox + SendMessage $mui.ComponentsPage.DescriptionTitle ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}" + EnableWindow $mui.ComponentsPage.DescriptionText 0 + SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" + + StrCpy $mui.ComponentsPage.DescriptionText.Info "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" ;Text for current components page + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + + +;-------------------------------- +;Script functions for components descriptions + +!macro MUI_DESCRIPTION_BEGIN + + ${if} $0 == -1 + ;No mouse hover over component in list + SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:" + EnableWindow $mui.ComponentsPage.DescriptionText 0 + SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:$mui.ComponentsPage.DescriptionText.Info" + +!macroend + +!macro MUI_DESCRIPTION_TEXT VAR TEXT + + !verbose push + !verbose ${MUI_VERBOSE} + + ${elseif} $0 == ${VAR} + SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:" + EnableWindow $mui.ComponentsPage.DescriptionText 1 + SendMessage $mui.ComponentsPage.DescriptionText ${WM_SETTEXT} 0 "STR:${TEXT}" + + !verbose pop + +!macroend + +!macro MUI_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + ${endif} + + !verbose pop + +!macroend + +!macro MUI_FUNCTION_DESCRIPTION_BEGIN + + !verbose push + !verbose ${MUI_VERBOSE} + + Function .onMouseOverSection + !insertmacro MUI_DESCRIPTION_BEGIN + + !verbose pop + +!macroend + +!macro MUI_FUNCTION_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_DESCRIPTION_END + !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION + Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}" + !endif + FunctionEnd + + !verbose pop + +!macroend + +!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN + + !verbose push + !verbose ${MUI_VERBOSE} + + Function un.onMouseOverSection + !insertmacro MUI_DESCRIPTION_BEGIN + + !verbose pop + +!macroend + +!macro MUI_UNFUNCTION_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_DESCRIPTION_END + !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION + Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}" + !endif + FunctionEnd + + !verbose pop + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Directory.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Directory.nsh new file mode 100644 index 0000000000..6209357194 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Directory.nsh @@ -0,0 +1,126 @@ +/* + +NSIS Modern User Interface +Directory page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_DIRECTORYPAGE_INTERFACE + + !ifndef MUI_DIRECTORYPAGE_INTERFACE + !define MUI_DIRECTORYPAGE_INTERFACE + Var mui.DirectoryPage + + Var mui.DirectoryPage.Text + + Var mui.DirectoryPage.DirectoryBox + Var mui.DirectoryPage.Directory + Var mui.DirectoryPage.BrowseButton + + Var mui.DirectoryPage.SpaceRequired + Var mui.DirectoryPage.SpaceAvailable + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_DIRECTORY + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE "" + !insertmacro MUI_DIRECTORYPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION "" + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} + + Caption " " + + DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}" + + !ifdef MUI_DIRECTORYPAGE_VARIABLE + DirVar "${MUI_DIRECTORYPAGE_VARIABLE}" + !endif + + !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE + DirVerify leave + !endif + + PageExEnd + + !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} + + !undef MUI_DIRECTORYPAGE_TEXT_TOP + !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION + !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE + !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE + +!macroend + +!macro MUI_PAGE_DIRECTORY + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_DIRECTORY + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_DIRECTORY + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_DIRECTORY + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE + + Function "${PRE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE) + FunctionEnd + + Function "${SHOW}" + + ;Get control handles + FindWindow $mui.DirectoryPage "#32770" "" $HWNDPARENT + GetDlgItem $mui.DirectoryPage.Text $mui.DirectoryPage 1006 + GetDlgItem $mui.DirectoryPage.DirectoryBox $mui.DirectoryPage 1020 + GetDlgItem $mui.DirectoryPage.Directory $mui.DirectoryPage 1019 + GetDlgItem $mui.DirectoryPage.BrowseButton $mui.DirectoryPage 1001 + GetDlgItem $mui.DirectoryPage.SpaceRequired $mui.DirectoryPage 1023 + GetDlgItem $mui.DirectoryPage.SpaceAvailable $mui.DirectoryPage 1024 + + !ifdef MUI_DIRECTORYPAGE_BGCOLOR + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXTCOLOR "" + SetCtlColors $mui.DirectoryPage.Directory "${MUI_DIRECTORYPAGE_TEXTCOLOR}" "${MUI_DIRECTORYPAGE_BGCOLOR}" + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + FunctionEnd + + Function "${LEAVE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Finish.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Finish.nsh new file mode 100644 index 0000000000..493c1e06de --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Finish.nsh @@ -0,0 +1,510 @@ + /* + +NSIS Modern User Interface +Finish page (implemented using nsDialogs) + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_FINISHPAGE_INTERFACE + + !ifndef MUI_FINISHPAGE_INTERFACE + !define MUI_FINISHPAGE_INTERFACE + Var mui.FinishPage + + Var mui.FinishPage.Image + Var mui.FinishPage.Image.Bitmap + + Var mui.FinishPage.Title + Var mui.FinishPage.Title.Font + + Var mui.FinishPage.Text + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES + !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES + Var mui.FinishPage.ReturnValue + !endif + !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME + !ifndef MUI_FINISHPAGE_RETURNVALUE_VARIABLES + !define MUI_FINISHPAGE_RETURNVALUE_VARIABLES + Var mui.FinishPage.ReturnValue + !endif + !endif + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + !ifndef MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES + !define MUI_FINISHPAGE_CANCEL_ENABLED_VARIABLES + Var mui.FinishPage.DisableAbortWarning + !endif + !endif + + !ifdef MUI_FINISHPAGE_RUN + !ifndef MUI_FINISHPAGE_RUN_VARIABLES + !define MUI_FINISHPAGE_RUN_VARIABLES + Var mui.FinishPage.Run + !endif + !endif + + !ifdef MUI_FINISHPAGE_SHOWREADME + !ifndef MUI_FINISHPAGE_SHOWREADME_VARIABLES + !define MUI_FINISHPAGE_SHOWREADME_VARIABLES + Var mui.FinishPage.ShowReadme + !endif + !endif + + !ifdef MUI_FINISHPAGE_LINK + !ifndef MUI_FINISHPAGE_LINK_VARIABLES + !define MUI_FINISHPAGE_LINK_VARIABLES + Var mui.FinishPage.Link + !endif + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + !ifndef MUI_FINISHPAGE_REBOOT_VARIABLES + !define MUI_FINISHPAGE_REBOOT_VARIABLES + Var mui.FinishPage.RebootNow + Var mui.FinishPage.RebootLater + !endif + !endif + + !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" + !if "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" == "" + !error "Invalid MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP" + !endif + +!macroend + + +;-------------------------------- +;Interface initialization + +!macro MUI_FINISHPAGE_GUIINIT + + !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT + !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_GUINIT + + Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit + + InitPluginsDir + File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" + !pragma verifyloadimage "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" + + !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT + Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}" + !endif + + !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_NOAUTOCLOSE + SetAutoClose true + !endif + + FunctionEnd + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.GUIInit + + !endif + +!macroend + + +;-------------------------------- +;Abort warning + +!macro MUI_FINISHPAGE_ABORTWARNING + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + + !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING + !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE_ABORTWARNING + + Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning + + ${if} $mui.FinishPage.DisableAbortWarning == "1" + Quit + ${endif} + + !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING + Call ${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING} + !endif + + FunctionEnd + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_ABORTWARNING ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.AbortWarning + + !endif + + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_FINISH + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE "" + !insertmacro MUI_FINISHPAGE_INTERFACE + + !insertmacro MUI_FINISHPAGE_GUIINIT + !insertmacro MUI_FINISHPAGE_ABORTWARNING + + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080" + + !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \ + ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Pre_${MUI_UNIQUEID} \ + ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Leave_${MUI_UNIQUEID} \ + ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPage.Link_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE + !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE + !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON + !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER + !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR + !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT + + !insertmacro MUI_UNSET MUI_FINISHPAGE_ABORTWARNINGCHECK + !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM + +!macroend + +!macro MUI_PAGE_FINISH + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_FINISH + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_FINISH + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_FINISH + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE LINK + + !ifdef MUI_FINISHPAGE_LINK + + Function "${LINK}" + + ExecShell open "${MUI_FINISHPAGE_LINK_LOCATION}" + + FunctionEnd + + !endif + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + ;Set text on Next button + SendMessage $mui.Button.Next ${WM_SETTEXT} 0 "STR:${MUI_FINISHPAGE_BUTTON}" + + ;Enable cancel button if set in script + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + EnableWindow $mui.Button.Cancel 1 + !endif + + ;Create dialog + nsDialogs::Create 1044 + Pop $mui.FinishPage + nsDialogs::SetRTL $(^RTL) + SetCtlColors $mui.FinishPage "" "${MUI_BGCOLOR}" + + ;Image control + ${NSD_CreateBitmap} 0u 0u 109u 193u "" + Pop $mui.FinishPage.Image + !insertmacro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE "${MUI_PAGE_UNINSTALLER_PREFIX}" $mui.FinishPage.Image $PLUGINSDIR\modern-wizard.bmp $mui.FinishPage.Image.Bitmap + + ;Positiong of controls + + ;Title + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !define MUI_FINISHPAGE_TITLE_HEIGHT 28 + !else + !define MUI_FINISHPAGE_TITLE_HEIGHT 38 + !endif + + ;Text + ;17 = 10 (top margin) + 7 (distance between texts) + !define /math MUI_FINISHPAGE_TEXT_TOP 17 + ${MUI_FINISHPAGE_TITLE_HEIGHT} + + ;Height if space required for radio buttons or check boxes + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 40 + !else + !define MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS 60 + !endif + + !define /math MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS ${MUI_FINISHPAGE_TEXT_TOP} + ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS} + + ;Positioning of radio buttons to ask for a reboot + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + !define /math MUI_FINISHPAGE_REBOOTNOW_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options + ;25 = 10 (height of first radio button) + 15 (distance between buttons) + !define /math MUI_FINISHPAGE_REBOOTLATER_TOP ${MUI_FINISHPAGE_REBOOTNOW_TOP} + 25 + !endif + + ;Positioning of checkboxes + !ifdef MUI_FINISHPAGE_RUN + !define /math MUI_FINISHPAGE_RUN_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options + !endif + !ifdef MUI_FINISHPAGE_SHOWREADME + !ifdef MUI_FINISHPAGE_RUN + ;25 = 10 (height of run checkbox) + 10 (distance between checkboxes) + !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_RUN_TOP} + 20 + !else + !define /math MUI_FINISHPAGE_SHOWREADME_TOP ${MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS} + 5 ;Distance between text and options + !endif + !endif + + !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + ;Height if full space is available for text and link + !ifndef MUI_FINISHPAGE_LINK + !define MUI_FINISHPAGE_TEXT_HEIGHT 130 + !else + !define MUI_FINISHPAGE_TEXT_HEIGHT 120 + !endif + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + + ${if} ${RebootFlag} + + ;Title text + ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}" + Pop $mui.FinishPage.Title + SetCtlColors $mui.FinishPage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700" + SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0 + + ;Finish text + ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT_REBOOT}" + Pop $mui.FinishPage.Text + SetCtlColors $mui.FinishPage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + ;Radio buttons for reboot page + ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTNOW_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTNOW}" + Pop $mui.FinishPage.RebootNow + SetCtlColors $mui.FinishPage.RebootNow "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + ${NSD_CreateRadioButton} 120u ${MUI_FINISHPAGE_REBOOTLATER_TOP}u 195u 10u "${MUI_FINISHPAGE_TEXT_REBOOTLATER}" + Pop $mui.FinishPage.RebootLater + SetCtlColors $mui.FinishPage.RebootLater "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !ifndef MUI_FINISHPAGE_REBOOTLATER_DEFAULT + SendMessage $mui.FinishPage.RebootNow ${BM_SETCHECK} ${BST_CHECKED} 0 + !else + SendMessage $mui.FinishPage.RebootLater ${BM_SETCHECK} ${BST_CHECKED} 0 + !endif + ${NSD_SetFocus} $mui.FinishPage.RebootNow + + ${else} + + !endif + + ;Title text + ${NSD_CreateLabel} 120u 10u 195u ${MUI_FINISHPAGE_TITLE_HEIGHT}u "${MUI_FINISHPAGE_TITLE}" + Pop $mui.FinishPage.Title + SetCtlColors $mui.FinishPage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + CreateFont $mui.FinishPage.Title.Font "$(^Font)" "12" "700" + SendMessage $mui.FinishPage.Title ${WM_SETFONT} $mui.FinishPage.Title.Font 0 + + ;Finish text + !ifndef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT}u "${MUI_FINISHPAGE_TEXT}" + !else + ${NSD_CreateLabel} 120u ${MUI_FINISHPAGE_TEXT_TOP}u 195u ${MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS}u "${MUI_FINISHPAGE_TEXT}" + !endif + Pop $mui.FinishPage.Text + SetCtlColors $mui.FinishPage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + ;Checkboxes + !ifdef MUI_FINISHPAGE_RUN + ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_RUN_TOP}u 195u 10u "${MUI_FINISHPAGE_RUN_TEXT}" + Pop $mui.FinishPage.Run + SetCtlColors $mui.FinishPage.Run "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED + SendMessage $mui.FinishPage.Run ${BM_SETCHECK} ${BST_CHECKED} 0 + !endif + ${NSD_SetFocus} $mui.FinishPage.Run + !endif + !ifdef MUI_FINISHPAGE_SHOWREADME + ${NSD_CreateCheckbox} 120u ${MUI_FINISHPAGE_SHOWREADME_TOP}u 195u 10u "${MUI_FINISHPAGE_SHOWREADME_TEXT}" + Pop $mui.FinishPage.ShowReadme + SetCtlColors $mui.FinishPage.ShowReadme "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED + SendMessage $mui.FinishPage.ShowReadme ${BM_SETCHECK} ${BST_CHECKED} 0 + !endif + !ifndef MUI_FINISHPAGE_RUN + ${NSD_SetFocus} $mui.FinishPage.ShowReadme + !endif + !endif + + ;Link + !ifdef MUI_FINISHPAGE_LINK + ${NSD_CreateLink} 120u 175u 195u 10u "${MUI_FINISHPAGE_LINK}" + Pop $mui.FinishPage.Link + SetCtlColors $mui.FinishPage.Link "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}" + ${NSD_OnClick} $mui.FinishPage.Link "${LINK}" + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + ${endif} + !endif + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + StrCpy $mui.FinishPage.DisableAbortWarning "1" + !endif + + !ifndef MUI_FORCECLASSICCONTROLS + ${If} ${IsHighContrastModeActive} + !endif + ; SetCtlColors does not change the check/radio text color (bug #443) + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.RebootNow,w" ",w" ")' + System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.RebootLater,w" ",w" ")' + !endif + !ifdef MUI_FINISHPAGE_RUN + System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.Run,w" ",w" ")' + !endif + !ifdef MUI_FINISHPAGE_SHOWREADME + System::Call 'UXTHEME::SetWindowTheme(p$mui.FinishPage.ShowReadme,w" ",w" ")' + !endif + !ifndef MUI_FORCECLASSICCONTROLS + ${EndIf} + !endif + + ;Show page + Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + nsDialogs::Show + !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED + Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + StrCpy $mui.FinishPage.DisableAbortWarning "" + !endif + + ;Delete image from memory + ${NSD_FreeImage} $mui.FinishPage.Image.Bitmap + + !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_HEIGHT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_HEIGHT_BUTTONS + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_BOTTOM_BUTTONS + !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTNOW_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TOP + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + + ;Check whether the user has chosen to reboot the computer + ${if} ${RebootFlag} + SendMessage $mui.FinishPage.RebootNow ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue + ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} + Reboot + ${else} + Return + ${endif} + ${endif} + + !endif + + ;Run functions depending on checkbox state + + !ifdef MUI_FINISHPAGE_RUN + + SendMessage $mui.FinishPage.Run ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue + + ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} + !ifndef MUI_FINISHPAGE_RUN_FUNCTION + !ifndef MUI_FINISHPAGE_RUN_PARAMETERS + Exec "$\"${MUI_FINISHPAGE_RUN}$\"" + !else + Exec "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}" + !endif + !else + Call "${MUI_FINISHPAGE_RUN_FUNCTION}" + !endif + ${endif} + + !endif + + !ifdef MUI_FINISHPAGE_SHOWREADME + + SendMessage $mui.FinishPage.ShowReadme ${BM_GETCHECK} 0 0 $mui.FinishPage.ReturnValue + + ${if} $mui.FinishPage.ReturnValue = ${BST_CHECKED} + !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION + ExecShell open "${MUI_FINISHPAGE_SHOWREADME}" + !else + Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}" + !endif + ${endif} + + !endif + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/InstallFiles.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/InstallFiles.nsh new file mode 100644 index 0000000000..868ae17c24 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/InstallFiles.nsh @@ -0,0 +1,149 @@ +/* + +NSIS Modern User Interface +InstallFiles page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_INSTFILESPAGE_INTERFACE + + !ifndef MUI_INSTFILESYPAGE_INTERFACE + !define MUI_INSTFILESYPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows" + !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth" + + Var mui.InstFilesPage + + Var mui.InstFilesPage.Text + Var mui.InstFilesPage.ProgressBar + Var mui.InstFilesPage.ShowLogButton + Var mui.InstFilesPage.Log + + ;Apply settings + InstallColors ${MUI_INSTFILESPAGE_COLORS} + InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR} + SubCaption 4 " " + UninstallSubCaption 2 " " + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_INSTFILES + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE "" + !insertmacro MUI_INSTFILESPAGE_INTERFACE + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT + +!macroend + +!macro MUI_PAGE_INSTFILES + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_INSTFILES + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_INSTFILES + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_INSTFILES + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + ;Get controls handles + FindWindow $mui.InstFilesPage "#32770" "" $HWNDPARENT + GetDlgItem $mui.InstFilesPage.Text $mui.InstFilesPage 1006 + GetDlgItem $mui.InstFilesPage.ProgressBar $mui.InstFilesPage 1004 + GetDlgItem $mui.InstFilesPage.ShowLogButton $mui.InstFilesPage 1027 + GetDlgItem $mui.InstFilesPage.Log $mui.InstFilesPage 1016 + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + ;Set text on completed page header + + IfAbort mui.endheader_abort + + !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" + !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" + !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" + !endif + + Goto mui.endheader_done + + mui.endheader_abort: + + !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" + !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" + !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" + !endif + + mui.endheader_done: + + !insertmacro MUI_LANGDLL_SAVELANGUAGE + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/License.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/License.nsh new file mode 100644 index 0000000000..a74214a0a2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/License.nsh @@ -0,0 +1,143 @@ +/* + +NSIS Modern User Interface +License page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_LICENSEPAGE_INTERFACE + + !ifndef MUI_LICENSEPAGE_INTERFACE + !define MUI_LICENSEPAGE_INTERFACE + Var mui.LicensePage + + Var mui.Licensepage.TopText + Var mui.Licensepage.Text + Var mui.Licensepage.LicenseText + + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows" + + ;Apply settings + LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}" + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_LICENSE LICENSEDATA + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE "" + !insertmacro MUI_LICENSEPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE "" + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} + + Caption " " + + LicenseData "${LICENSEDATA}" + + !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM + !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}" + !else ifdef MUI_LICENSEPAGE_CHECKBOX + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}" + !else + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}" + !endif + !else + LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}" + !endif + + !ifdef MUI_LICENSEPAGE_CHECKBOX + LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}" + !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS + LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}" + !endif + + PageExEnd + + !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP + !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM + !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT + !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE + +!macroend + +!macro MUI_PAGE_LICENSE LICENSEDATA + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}" + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_LICENSE LICENSEDATA + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_LICENSE "${LICENSEDATA}" + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + ;Get control handles + FindWindow $mui.LicensePage "#32770" "" $HWNDPARENT + GetDlgItem $mui.LicensePage.TopText $mui.LicensePage 1040 + GetDlgItem $mui.LicensePage.Text $mui.LicensePage 1006 + GetDlgItem $mui.LicensePage.LicenseText $mui.LicensePage 1000 + + ;Top text + SendMessage $mui.LicensePage.TopText ${WM_SETTEXT} 0 "STR:${MUI_LICENSEPAGE_TEXT_TOP}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/StartMenu.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/StartMenu.nsh new file mode 100644 index 0000000000..71c41bb62f --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/StartMenu.nsh @@ -0,0 +1,236 @@ +/* + +NSIS Modern User Interface +Start Menu folder page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_STARTMENUPAGE_INTERFACE + + !ifndef MUI_STARTMENUPAGE_INTERFACE + !define MUI_STARTMENUPAGE_INTERFACE + Var mui.StartMenuPage + Var mui.StartMenuPage.Location + Var mui.StartMenuPage.FolderList + + Var mui.StartMenuPage.Temp + !endif + + !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME + !ifndef MUI_STARTMENUPAGE_REGISTRY_VARIABLES + !define MUI_STARTMENUPAGE_REGISTRY_VARIABLES + Var mui.StartMenuPage.RegistryLocation + !endif + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_STARTMENU ID VAR + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE "" + !insertmacro MUI_STARTMENUPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)" + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)" + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)" + + !define MUI_STARTMENUPAGE_VARIABLE "${VAR}" + !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}" + !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" + !endif + !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" + !endif + !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" + !endif + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} + + !undef MUI_STARTMENUPAGE_VARIABLE + !undef MUI_STARTMENUPAGE_TEXT_TOP + !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX + !undef MUI_STARTMENUPAGE_DEFAULTFOLDER + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME + +!macroend + +!macro MUI_PAGE_STARTMENU ID VAR + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_STARTMENU "${ID}" "${VAR}" + + !verbose pop + +!macroend + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME + + ;Get Start Menu location from registry + + ${if} "${MUI_STARTMENUPAGE_VARIABLE}" == "" + + ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" + ${if} $mui.StartMenuPage.RegistryLocation != "" + StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $mui.StartMenuPage.RegistryLocation + ${endif} + + ClearErrors + + ${endif} + + !endif + + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE) + + ${if} $(^RTL) == "0" + !ifndef MUI_STARTMENUPAGE_NODISABLE + StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !else + StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !endif + ${else} + !ifndef MUI_STARTMENUPAGE_NODISABLE + StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !else + StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !endif + ${endif} + + Pop $mui.StartMenuPage + + ;Get control handles + GetDlgItem $mui.StartMenuPage.Location $mui.StartMenuPage 1002 + GetDlgItem $mui.StartMenuPage.FolderList $mui.StartMenuPage 1004 + + !ifdef MUI_STARTMENUPAGE_BGCOLOR + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXTCOLOR "" + SetCtlColors $mui.StartMenuPage.Location "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" + SetCtlColors $mui.StartMenuMenu.FolderList "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + StartMenu::Show + !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED + + Pop $mui.StartMenuPage.Temp + ${if} $mui.StartMenuPage.Temp == "success" + Pop "${MUI_STARTMENUPAGE_VARIABLE}" + ${endif} + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + + +;-------------------------------- +;Script macros to get Start Menu folder + +!macro MUI_STARTMENU_GETFOLDER ID VAR + + !verbose push + !verbose ${MUI_VERBOSE} + + ;Get Start Menu folder from registry + ;Can be called from the script in the uninstaller + + !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME + + ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" + + ${if} $mui.StartMenuPage.RegistryLocation != "" + StrCpy "${VAR}" $mui.StartMenuPage.RegistryLocation + ${else} + StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" + ${endif} + + !else + + StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" + + !endif + + !verbose pop + +!macroend + +!macro MUI_STARTMENU_WRITE_BEGIN ID + + ;The code in the script to write the shortcuts should be put between the + ;MUI_STARTMENU_WRITE_BEGIN and MUI_STARTMENU_WRITE_END macros + + !verbose push + !verbose ${MUI_VERBOSE} + + !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}" + + StrCpy $mui.StartMenuPage.Temp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1 + + ;If the folder start with >, the user has chosen not to create a shortcut + ${if} $mui.StartMenuPage.Temp != ">" + + ${if} "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" == "" + ;Get folder from registry if the variable doesn't contain anything + !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" + ${endif} + + !verbose pop + +!macroend + +!macro MUI_STARTMENU_WRITE_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME + ;Write folder to registry + WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" + !endif + + ${endif} + + !undef MUI_STARTMENUPAGE_CURRENT_ID + + !verbose pop + +!macroend + diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh new file mode 100644 index 0000000000..1ebe927d41 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/UninstallConfirm.nsh @@ -0,0 +1,100 @@ +/* + +NSIS Modern User Interface +Uninstall confirmation page + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_UNCONFIRMPAGE_INTERFACE + + !ifndef MUI_UNCONFIRMPAGE_INTERFACE + !define MUI_UNCONFIRMPAGE_INTERFACE + Var mui.UnConfirmPage + + Var mui.UnConfirmPage.Text + Var mui.UnConfirmPage.DirectoryText + Var mui.UnConfirmPage.Directory + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_CONFIRM + + !insertmacro MUI_SET MUI_UNCONFIRMPAGE "" + !insertmacro MUI_UNCONFIRMPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" + + PageEx un.uninstConfirm + + PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} + + Caption " " + + UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}" + + !ifdef MUI_UNCONFIRMPAGE_VARIABLE + DirVar "${MUI_UNCONFIRMPAGE_VARIABLE}" + !endif + + PageExEnd + + !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP + !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION + +!macroend + +!macro MUI_UNPAGE_CONFIRM + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_CONFIRM + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + ;Get controls handles + FindWindow $mui.UnConfirmPage "#32770" "" $HWNDPARENT + GetDlgItem $mui.UnConfirmPage.Text $mui.UnConfirmPage 1006 + GetDlgItem $mui.UnConfirmPage.DirectoryText $mui.UnConfirmPage 1029 + GetDlgItem $mui.UnConfirmPage.Directory $mui.UnConfirmPage 1000 + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Welcome.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Welcome.nsh new file mode 100644 index 0000000000..0839b94924 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI 2/Pages/Welcome.nsh @@ -0,0 +1,181 @@ +/* + +NSIS Modern User Interface +Welcome page (implemented using nsDialogs) + +*/ + +;-------------------------------- +;Page interface settings and variables + +!macro MUI_WELCOMEPAGE_INTERFACE + + !ifndef MUI_WELCOMEPAGE_INTERFACE + !define MUI_WELCOMEPAGE_INTERFACE + Var mui.WelcomePage + + Var mui.WelcomePage.Image + Var mui.WelcomePage.Image.Bitmap + + Var mui.WelcomePage.Title + Var mui.WelcomePage.Title.Font + + Var mui.WelcomePage.Text + !endif + + !insertmacro MUI_DEFAULT MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" + !if "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" == "" + !error "Invalid MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP" + !endif + +!macroend + + +;-------------------------------- +;Interface initialization + +!macro MUI_WELCOMEPAGE_GUIINIT + + !ifndef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT + !define MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEWELCOMEPAGE_GUINIT + + Function ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit + + InitPluginsDir + File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" + !pragma verifyloadimage "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEFINISHPAGE_BITMAP}" + + !ifdef MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT + Call "${MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT}" + !endif + + FunctionEnd + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}PAGE_FUNCTION_GUIINIT ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePage.GUIInit + + !endif + +!macroend + + +;-------------------------------- +;Page declaration + +!macro MUI_PAGEDECLARATION_WELCOME + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE "" + !insertmacro MUI_WELCOMEPAGE_INTERFACE + + !insertmacro MUI_WELCOMEPAGE_GUIINIT + + !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)" + !insertmacro MUI_DEFAULT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)" + + !insertmacro MUI_PAGE_FUNCTION_FULLWINDOW + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} + + PageExEnd + + !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT + +!macroend + +!macro MUI_PAGE_WELCOME + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + !insertmacro MUI_PAGEDECLARATION_WELCOME + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_WELCOME + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + !insertmacro MUI_PAGEDECLARATION_WELCOME + + !verbose pop + +!macroend + + +;-------------------------------- +;Page functions + +!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + ;Create dialog + nsDialogs::Create 1044 + Pop $mui.WelcomePage + nsDialogs::SetRTL $(^RTL) + SetCtlColors $mui.WelcomePage "" "${MUI_BGCOLOR}" + + ;Image control + ${NSD_CreateBitmap} 0u 0u 109u 193u "" + Pop $mui.WelcomePage.Image + !insertmacro MUI_INTERNAL_FULLWINDOW_LOADWIZARDIMAGE "${MUI_PAGE_UNINSTALLER_PREFIX}" $mui.WelcomePage.Image $PLUGINSDIR\modern-wizard.bmp $mui.WelcomePage.Image.Bitmap + + ;Positiong of controls + + ;Title + !ifndef MUI_WELCOMEPAGE_TITLE_3LINES + !define MUI_WELCOMEPAGE_TITLE_HEIGHT 28 + !else + !define MUI_WELCOMEPAGE_TITLE_HEIGHT 38 + !endif + + ;Text + ;17 = 10 (top margin) + 7 (distance between texts) + !define /math MUI_WELCOMEPAGE_TEXT_TOP 17 + ${MUI_WELCOMEPAGE_TITLE_HEIGHT} + + ;Title + ${NSD_CreateLabel} 120u 10u 195u ${MUI_WELCOMEPAGE_TITLE_HEIGHT}u "${MUI_WELCOMEPAGE_TITLE}" + Pop $mui.WelcomePage.Title + SetCtlColors $mui.WelcomePage.Title "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + CreateFont $mui.WelcomePage.Title.Font "$(^Font)" "12" "700" + SendMessage $mui.WelcomePage.Title ${WM_SETFONT} $mui.WelcomePage.Title.Font 0 + + ;Welcome text + ${NSD_CreateLabel} 120u ${MUI_WELCOMEPAGE_TEXT_TOP}u 195u 130u "${MUI_WELCOMEPAGE_TEXT}" + Pop $mui.WelcomePage.Text + SetCtlColors $mui.WelcomePage.Text "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + ;Show page + Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageLoadFullWindow + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + nsDialogs::Show + !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED + Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}muiPageUnloadFullWindow + + ;Delete image from memory + ${NSD_FreeImage} $mui.WelcomePage.Image.Bitmap + + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_HEIGHT + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT_TOP + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI/System.nsh b/libs/NSIS/NSIS-source/Contrib/Modern UI/System.nsh new file mode 100644 index 0000000000..7aa35ccf82 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI/System.nsh @@ -0,0 +1,2255 @@ +/* + +NSIS Modern User Interface - Version 1.81 +Copyright 2002-2026 Joost Verburg + +*/ + +!ifndef MUI_INCLUDED +!verbose push 3 +!define MUI_INCLUDED +!define MUI_SYSVERSION "1.81" +!verbose pop +!echo "NSIS Modern User Interface version ${MUI_SYSVERSION} - Copyright 2002-2026 Joost Verburg" + +;-------------------------------- +!verbose push 3 +!define /IfNDef MUI_VERBOSE 3 +!verbose ${MUI_VERBOSE} + +;-------------------------------- +;HEADER FILES, DECLARATIONS + +!include InstallOptions.nsh +!include LangFile.nsh +!include WinMessages.nsh + +Var MUI_TEMP1 +Var MUI_TEMP2 + +;-------------------------------- +;INSERT CODE + +!macro MUI_INSERT + + !ifndef MUI_INSERT + !define MUI_INSERT + + !ifdef MUI_PRODUCT | MUI_VERSION + !warning "The MUI_PRODUCT and MUI_VERSION defines have been removed. Use a normal Name command now." + !endif + + !insertmacro MUI_INTERFACE + + !insertmacro MUI_FUNCTION_GUIINIT + !insertmacro MUI_FUNCTION_ABORTWARNING + + !ifdef MUI_IOCONVERT_USED + !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT + !endif + + !ifdef MUI_UNINSTALLER + !insertmacro MUI_UNFUNCTION_GUIINIT + !insertmacro MUI_FUNCTION_UNABORTWARNING + + !ifdef MUI_UNIOCONVERT_USED + !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT + !endif + !endif + + !endif + +!macroend + +;-------------------------------- +;GENERAL + +!macro MUI_DEFAULT SYMBOL CONTENT + + !ifndef "${SYMBOL}" + !define "${SYMBOL}" "${CONTENT}" + !endif + +!macroend + +!macro MUI_DEFAULT_IOCONVERT SYMBOL CONTENT + + !ifndef "${SYMBOL}" + !define "${SYMBOL}" "${CONTENT}" + !insertmacro MUI_SET "${SYMBOL}_DEFAULTSET" + !insertmacro MUI_SET "MUI_${MUI_PAGE_UNINSTALLER_PREFIX}IOCONVERT_USED" + !else + !insertmacro MUI_UNSET "${SYMBOL}_DEFAULTSET" + !endif + +!macroend + +!macro MUI_SET SYMBOL + + !ifndef "${SYMBOL}" + !define "${SYMBOL}" + !endif + +!macroend + +!macro MUI_UNSET SYMBOL + + !ifdef "${SYMBOL}" + !undef "${SYMBOL}" + !endif + +!macroend + +;-------------------------------- +;INTERFACE - COMPILE TIME SETTINGS + +!macro MUI_INTERFACE + + !ifndef MUI_INTERFACE + !define MUI_INTERFACE + + !ifdef MUI_INSERT_NSISCONF + !insertmacro MUI_NSISCONF + !endif + + !insertmacro MUI_DEFAULT MUI_UI "${NSISDIR}\Contrib\UIs\modern.exe" + !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" + !insertmacro MUI_DEFAULT MUI_UI_HEADERIMAGE_RIGHT "${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe" + !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_SMALLDESC "${NSISDIR}\Contrib\UIs\modern_smalldesc.exe" + !insertmacro MUI_DEFAULT MUI_UI_COMPONENTSPAGE_NODESC "${NSISDIR}\Contrib\UIs\modern_nodesc.exe" + !insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" + !insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BGCOLOR "/windows" + !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_COLORS "/windows" + !insertmacro MUI_DEFAULT MUI_INSTFILESPAGE_PROGRESSBAR "smooth" + !insertmacro MUI_DEFAULT MUI_BGCOLOR "FFFFFF" + !insertmacro MUI_DEFAULT MUI_TEXTCOLOR "000000" + !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini" + !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_INI "${NSISDIR}\Contrib\Modern UI\ioSpecial.ini" + !insertmacro MUI_DEFAULT MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" + !insertmacro MUI_DEFAULT MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\win.bmp" + !if "${MUI_WELCOMEFINISHPAGE_BITMAP}" == "" + !error "Invalid MUI_WELCOMEFINISHPAGE_BITMAP" + !endif + !if "${MUI_UNWELCOMEFINISHPAGE_BITMAP}" == "" + !error "Invalid MUI_UNWELCOMEFINISHPAGE_BITMAP" + !endif + + !ifdef MUI_HEADERIMAGE + + !insertmacro MUI_DEFAULT MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" + + !ifndef MUI_HEADERIMAGE_UNBITMAP + !define MUI_HEADERIMAGE_UNBITMAP "${MUI_HEADERIMAGE_BITMAP}" + !ifdef MUI_HEADERIMAGE_BITMAP_NOSTRETCH + !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH + !endif + !endif + + !if "${MUI_HEADERIMAGE_BITMAP}" == "" + !error "Invalid MUI_HEADERIMAGE_BITMAP" + !endif + !if "${MUI_HEADERIMAGE_UNBITMAP}" == "" + !error "Invalid MUI_HEADERIMAGE_UNBITMAP" + !endif + + !ifdef MUI_HEADERIMAGE_BITMAP_RTL + !ifndef MUI_HEADERIMAGE_UNBITMAP_RTL + !define MUI_HEADERIMAGE_UNBITMAP_RTL "${MUI_HEADERIMAGE_BITMAP_RTL}" + !ifdef MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH + !insertmacro MUI_SET MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH + !endif + !endif + + !if "${MUI_HEADERIMAGE_BITMAP_RTL}" == "" + !error "Invalid MUI_HEADERIMAGE_BITMAP_RTL" + !endif + !if "${MUI_HEADERIMAGE_UNBITMAP_RTL}" == "" + !error "Invalid MUI_HEADERIMAGE_UNBITMAP_RTL" + !endif + !endif + + !endif + + XPStyle On + + ChangeUI all "${MUI_UI}" + !ifdef MUI_HEADERIMAGE + !ifndef MUI_HEADERIMAGE_RIGHT + ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE}" + !else + ChangeUI IDD_INST "${MUI_UI_HEADERIMAGE_RIGHT}" + !endif + !endif + !ifdef MUI_COMPONENTSPAGE_SMALLDESC + ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_SMALLDESC}" + !else ifdef MUI_COMPONENTSPAGE_NODESC + ChangeUI IDD_SELCOM "${MUI_UI_COMPONENTSPAGE_NODESC}" + !endif + + Icon "${MUI_ICON}" + UninstallIcon "${MUI_UNICON}" + + CheckBitmap "${MUI_COMPONENTSPAGE_CHECKBITMAP}" + LicenseBkColor "${MUI_LICENSEPAGE_BGCOLOR}" + InstallColors ${MUI_INSTFILESPAGE_COLORS} + InstProgressFlags ${MUI_INSTFILESPAGE_PROGRESSBAR} + + SubCaption 4 " " + UninstallSubCaption 2 " " + + !insertmacro MUI_DEFAULT MUI_ABORTWARNING_TEXT "$(MUI_TEXT_ABORTWARNING)" + !insertmacro MUI_DEFAULT MUI_UNABORTWARNING_TEXT "$(MUI_UNTEXT_ABORTWARNING)" + + !endif + +!macroend + +;-------------------------------- +;INTERFACE - RUN-TIME + +!macro MUI_INNERDIALOG_TEXT CONTROL TEXT + + !verbose push + !verbose ${MUI_VERBOSE} + + FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT + GetDlgItem $MUI_TEMP1 $MUI_TEMP1 ${CONTROL} + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" + + !verbose pop + +!macroend + +!macro MUI_HEADER_TEXT_INTERNAL ID TEXT + + GetDlgItem $MUI_TEMP1 $HWNDPARENT "${ID}" + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + !endif + + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + + ShowWindow $MUI_TEMP1 ${SW_SHOWNA} + + !endif + +!macroend + +!macro MUI_HEADER_TEXT TEXT SUBTEXT + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + + LockWindow on + + !endif + + !insertmacro MUI_HEADER_TEXT_INTERNAL 1037 "${TEXT}" + !insertmacro MUI_HEADER_TEXT_INTERNAL 1038 "${SUBTEXT}" + + !ifdef MUI_HEADER_TRANSPARENT_TEXT + + LockWindow off + + !endif + + !verbose pop + +!macroend + +!macro MUI_HEADER_TEXT_PAGE TEXT SUBTEXT + + !ifdef MUI_PAGE_HEADER_TEXT & MUI_PAGE_HEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" + !else ifdef MUI_PAGE_HEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_PAGE_HEADER_TEXT}" "${SUBTEXT}" + !else ifdef MUI_PAGE_HEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${TEXT}" "${MUI_PAGE_HEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "${TEXT}" "${SUBTEXT}" + !endif + + !insertmacro MUI_UNSET MUI_PAGE_HEADER_TEXT + !insertmacro MUI_UNSET MUI_PAGE_HEADER_SUBTEXT + +!macroend + +!macro MUI_DESCRIPTION_BEGIN + + FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT + GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043 + + StrCmp $0 -1 0 mui.description_begin_done + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:" + EnableWindow $MUI_TEMP1 0 + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT" + Goto mui.description_done + mui.description_begin_done: + +!macroend + +!macro MUI_DESCRIPTION_TEXT VAR TEXT + + !verbose push + !verbose ${MUI_VERBOSE} + + StrCmp $0 ${VAR} 0 mui.description_${VAR}_done + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:" + EnableWindow $MUI_TEMP1 1 + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:${TEXT}" + Goto mui.description_done + mui.description_${VAR}_done: + + !verbose pop + +!macroend + +!macro MUI_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + mui.description_done: + + !verbose pop + +!macroend + +!macro MUI_ENDHEADER + + IfAbort mui.endheader_abort + + !ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT & MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" + !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_FINISHHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" + !else ifdef MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "${MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_SUBTITLE)" + !endif + + Goto mui.endheader_done + + mui.endheader_abort: + + !ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT & MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" + !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_TEXT + !insertmacro MUI_HEADER_TEXT "${MUI_INSTFILESPAGE_ABORTHEADER_TEXT}" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" + !else ifdef MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "${MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT}" + !else + !insertmacro MUI_HEADER_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_TITLE)" "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_ABORT_SUBTITLE)" + !endif + + mui.endheader_done: + +!macroend + +!macro MUI_ABORTWARNING + + !ifdef MUI_FINISHPAGE_ABORTWARNINGCHECK + StrCmp $MUI_NOABORTWARNING "1" mui.quit + !endif + + !ifdef MUI_ABORTWARNING_CANCEL_DEFAULT + MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit + !else + MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_ABORTWARNING_TEXT}" IDYES mui.quit + !endif + + Abort + mui.quit: + +!macroend + +!macro MUI_UNABORTWARNING + + !ifdef MUI_UNABORTWARNING_CANCEL_DEFAULT + MessageBox MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2 "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit + !else + MessageBox MB_YESNO|MB_ICONEXCLAMATION "${MUI_UNABORTWARNING_TEXT}" IDYES mui.quit + !endif + + Abort + mui.quit: + +!macroend + +!macro MUI_GUIINIT + + !insertmacro MUI_WELCOMEFINISHPAGE_INIT "" + !insertmacro MUI_HEADERIMAGE_INIT "" + + !insertmacro MUI_GUIINIT_BASIC + +!macroend + +!macro MUI_UNGUIINIT + + !insertmacro MUI_WELCOMEFINISHPAGE_INIT "UN" + !insertmacro MUI_HEADERIMAGE_INIT "UN" + + !insertmacro MUI_GUIINIT_BASIC + + !ifdef MUI_UNFINISHPAGE + !ifndef MUI_UNFINISHPAGE_NOAUTOCLOSE + SetAutoClose true + !endif + !endif + +!macroend + +!macro MUI_GUIINIT_BASIC + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 + CreateFont $MUI_TEMP2 "$(^Font)" "$(^FontSize)" "700" + SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 + + !ifndef MUI_HEADER_TRANSPARENT_TEXT + + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + !else + + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "transparent" + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "transparent" + + !endif + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1034 ; Header background + SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 ; Header image + SetCtlColors $MUI_TEMP1 "" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 + SetCtlColors $MUI_TEMP1 /BRANDING + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 + SetCtlColors $MUI_TEMP1 /BRANDING + SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$(^Branding) " + +!macroend + +!macro MUI_WELCOMEFINISHPAGE_INIT UNINSTALLER + + !ifdef MUI_${UNINSTALLER}WELCOMEPAGE | MUI_${UNINSTALLER}FINISHPAGE + + !insertmacro INSTALLOPTIONS_EXTRACT_AS "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_INI}" "ioSpecial.ini" + File "/oname=$PLUGINSDIR\modern-wizard.bmp" "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}" + !pragma verifyloadimage "${MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP}" + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Text" "$PLUGINSDIR\modern-wizard.bmp" + + !ifdef MUI_${UNINSTALLER}WELCOMEFINISHPAGE_BITMAP_NOSTRETCH + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Flags" "" + !endif + + !endif + +!macroend + +!macro MUI_HEADERIMAGE_INIT UNINSTALLER + + !ifdef MUI_HEADERIMAGE + + InitPluginsDir + + !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL + + StrCmp $(^RTL) 0 mui.headerimageinit_nortl + + File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}" + !pragma verifyloadimage "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL}" + + !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL_NOSTRETCH + SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp" + !else + SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp" + !endif + + Goto mui.headerimageinit_done + + mui.headerimageinit_nortl: + + !endif + + File "/oname=$PLUGINSDIR\modern-header.bmp" "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}" + !pragma verifyloadimage "${MUI_HEADERIMAGE_${UNINSTALLER}BITMAP}" + + !ifndef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_NOSTRETCH + SetBrandingImage /IMGID=1046 /RESIZETOFIT "$PLUGINSDIR\modern-header.bmp" + !else + SetBrandingImage /IMGID=1046 "$PLUGINSDIR\modern-header.bmp" + !endif + + !ifdef MUI_HEADERIMAGE_${UNINSTALLER}BITMAP_RTL + + mui.headerimageinit_done: + + !endif + + !endif + +!macroend + +;-------------------------------- +;INTERFACE - FUNCTIONS + +!macro MUI_FUNCTION_GUIINIT + + Function .onGUIInit + + !insertmacro MUI_GUIINIT + + !ifdef MUI_CUSTOMFUNCTION_GUIINIT + Call "${MUI_CUSTOMFUNCTION_GUIINIT}" + !endif + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_DESCRIPTION_BEGIN + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifndef MUI_VAR_TEXT + Var MUI_TEXT + !define MUI_VAR_TEXT + !endif + + Function .onMouseOverSection + !insertmacro MUI_DESCRIPTION_BEGIN + + !verbose pop + +!macroend + +!macro MUI_FUNCTION_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_DESCRIPTION_END + !ifdef MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION + Call "${MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION}" + !endif + FunctionEnd + + !verbose pop + +!macroend + +!macro MUI_UNFUNCTION_DESCRIPTION_BEGIN + + !verbose push + !verbose ${MUI_VERBOSE} + + Function un.onMouseOverSection + !insertmacro MUI_DESCRIPTION_BEGIN + + !verbose pop + +!macroend + +!macro MUI_UNFUNCTION_DESCRIPTION_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_DESCRIPTION_END + !ifdef MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION + Call "${MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION}" + !endif + FunctionEnd + + !verbose pop + +!macroend + +!macro MUI_FUNCTION_ABORTWARNING + + Function .onUserAbort + !ifdef MUI_ABORTWARNING + !insertmacro MUI_ABORTWARNING + !endif + !ifdef MUI_CUSTOMFUNCTION_ABORT + Call "${MUI_CUSTOMFUNCTION_ABORT}" + !endif + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_UNABORTWARNING + + Function un.onUserAbort + !ifdef MUI_UNABORTWARNING + !insertmacro MUI_UNABORTWARNING + !endif + !ifdef MUI_CUSTOMFUNCTION_UNABORT + Call "${MUI_CUSTOMFUNCTION_UNABORT}" + !endif + FunctionEnd + +!macroend + +!macro MUI_UNFUNCTION_GUIINIT + + Function un.onGUIInit + + !insertmacro MUI_UNGUIINIT + + !ifdef MUI_CUSTOMFUNCTION_UNGUIINIT + Call "${MUI_CUSTOMFUNCTION_UNGUIINIT}" + !endif + + FunctionEnd + +!macroend + +!macro MUI_FUNCTIONS_DESCRIPTION_BEGIN + + ;1.65 compatibility + + !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_BEGIN to MUI_FUNCTION_DESCRIPTION_BEGIN." + + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + +!macroend + +!macro MUI_FUNCTIONS_DESCRIPTION_END + + ;1.65 compatibility + + !warning "Modern UI macro name has changed. Please change MUI_FUNCTIONS_DESCRIPTION_END to MUI_FUNCTION_DESCRIPTION_END." + + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +!macroend + +;-------------------------------- +;START MENU FOLDER + +!macro MUI_STARTMENU_GETFOLDER ID VAR + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME + + ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}" + StrCmp $MUI_TEMP1 "" +3 + StrCpy "${VAR}" $MUI_TEMP1 + Goto +2 + + StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" + + !else + + StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}" + + !endif + + !verbose pop + +!macroend + +!macro MUI_STARTMENU_WRITE_BEGIN ID + + !verbose push + !verbose ${MUI_VERBOSE} + + !define MUI_STARTMENUPAGE_CURRENT_ID "${ID}" + + StrCpy $MUI_TEMP1 "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" 1 + StrCmp $MUI_TEMP1 ">" mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done + + StrCmp "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" "" 0 mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty + + !insertmacro MUI_STARTMENU_GETFOLDER "${MUI_STARTMENUPAGE_CURRENT_ID}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" + + mui.startmenu_writebegin_${MUI_STARTMENUPAGE_CURRENT_ID}_notempty: + + !verbose pop + +!macroend + +!macro MUI_STARTMENU_WRITE_END + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME + WriteRegStr "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_REGISTRY_VALUENAME}" "${MUI_STARTMENUPAGE_${MUI_STARTMENUPAGE_CURRENT_ID}_VARIABLE}" + !endif + + mui.startmenu_write_${MUI_STARTMENUPAGE_CURRENT_ID}_done: + + !undef MUI_STARTMENUPAGE_CURRENT_ID + + !verbose pop + +!macroend + +;-------------------------------- +;PAGES + +!macro MUI_PAGE_INIT + + !ifdef MUI_INSERT + !warning "MUI_[UN]PAGE_* inserted after MUI_LANGUAGE" + !endif + + !insertmacro MUI_INTERFACE + + !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_PREFIX "" + !insertmacro MUI_DEFAULT MUI_PAGE_UNINSTALLER_FUNCPREFIX "" + + !insertmacro MUI_UNSET MUI_UNIQUEID + + !define MUI_UNIQUEID ${__LINE__} + +!macroend + +!macro MUI_UNPAGE_INIT + + !ifndef MUI_UNINSTALLER + !define MUI_UNINSTALLER + !endif + + !define MUI_PAGE_UNINSTALLER + + !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_PREFIX + !insertmacro MUI_UNSET MUI_PAGE_UNINSTALLER_FUNCPREFIX + + !define MUI_PAGE_UNINSTALLER_PREFIX "UN" + !define MUI_PAGE_UNINSTALLER_FUNCPREFIX "un." + +!macroend + +!macro MUI_UNPAGE_END + + !undef MUI_PAGE_UNINSTALLER + !undef MUI_PAGE_UNINSTALLER_PREFIX + !undef MUI_PAGE_UNINSTALLER_FUNCPREFIX + +!macroend + +!macro MUI_PAGE_WELCOME + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}WELCOMEPAGE + + !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TITLE)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_WELCOMEPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_WELCOME_INFO_TEXT)" + + !ifndef MUI_VAR_HWND + Var MUI_HWND + !define MUI_VAR_HWND + !endif + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} + + PageExEnd + + !insertmacro MUI_FUNCTION_WELCOMEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.WelcomeLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES + !insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT + + !verbose pop + +!macroend + +!macro MUI_PAGE_LICENSE LICENSEDATA + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}LICENSEPAGE + + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_TEXT_TOP "$(MUI_INNERTEXT_LICENSE_TOP)" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_BUTTON "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_CHECKBOX_TEXT "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT "" + !insertmacro MUI_DEFAULT MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE "" + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}license + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} + + Caption " " + + LicenseData "${LICENSEDATA}" + + !ifndef MUI_LICENSEPAGE_TEXT_BOTTOM + !ifndef MUI_LICENSEPAGE_CHECKBOX & MUI_LICENSEPAGE_RADIOBUTTONS + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM)" "${MUI_LICENSEPAGE_BUTTON}" + !else ifdef MUI_LICENSEPAGE_CHECKBOX + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_CHECKBOX)" "${MUI_LICENSEPAGE_BUTTON}" + !else + LicenseText "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS)" "${MUI_LICENSEPAGE_BUTTON}" + !endif + !else + LicenseText "${MUI_LICENSEPAGE_TEXT_BOTTOM}" "${MUI_LICENSEPAGE_BUTTON}" + !endif + + !ifdef MUI_LICENSEPAGE_CHECKBOX + LicenseForceSelection checkbox "${MUI_LICENSEPAGE_CHECKBOX_TEXT}" + !else ifdef MUI_LICENSEPAGE_RADIOBUTTONS + LicenseForceSelection radiobuttons "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT}" "${MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE}" + !endif + + PageExEnd + + !insertmacro MUI_FUNCTION_LICENSEPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicensePre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.LicenseLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_TOP + !insertmacro MUI_UNSET MUI_LICENSEPAGE_TEXT_BOTTOM + !insertmacro MUI_UNSET MUI_LICENSEPAGE_BUTTON + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT + !insertmacro MUI_UNSET MUI_LICENSEPAGE_RADIOBUTTONS + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_ACCEPT + !insertmacro MUI_UNSET MUI_LICENSEPAGE_CHECKBOX_TEXT_DECLINE + + !verbose pop + +!macroend + +!macro MUI_PAGE_COMPONENTS + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}COMPONENTSPAGE + + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_COMPLIST "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_INSTTYPE "" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE)" + !insertmacro MUI_DEFAULT MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" + + !ifndef MUI_VAR_TEXT + Var MUI_TEXT + !define MUI_VAR_TEXT + !endif + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}components + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} + + Caption " " + + ComponentText "${MUI_COMPONENTSPAGE_TEXT_TOP}" "${MUI_COMPONENTSPAGE_TEXT_INSTTYPE}" "${MUI_COMPONENTSPAGE_TEXT_COMPLIST}" + + PageExEnd + + !insertmacro MUI_FUNCTION_COMPONENTSPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.ComponentsLeave_${MUI_UNIQUEID} + + !undef MUI_COMPONENTSPAGE_TEXT_TOP + !undef MUI_COMPONENTSPAGE_TEXT_COMPLIST + !undef MUI_COMPONENTSPAGE_TEXT_INSTTYPE + !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE + !insertmacro MUI_UNSET MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO + + !verbose pop + +!macroend + +!macro MUI_PAGE_DIRECTORY + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}DIRECTORYPAGE + + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXT_DESTINATION "" + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}directory + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} + + Caption " " + + DirText "${MUI_DIRECTORYPAGE_TEXT_TOP}" "${MUI_DIRECTORYPAGE_TEXT_DESTINATION}" + + !ifdef MUI_DIRECTORYPAGE_VARIABLE + DirVar "${MUI_DIRECTORYPAGE_VARIABLE}" + !endif + + !ifdef MUI_DIRECTORYPAGE_VERIFYONLEAVE + DirVerify leave + !endif + + PageExEnd + + !insertmacro MUI_FUNCTION_DIRECTORYPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.DirectoryLeave_${MUI_UNIQUEID} + + !undef MUI_DIRECTORYPAGE_TEXT_TOP + !undef MUI_DIRECTORYPAGE_TEXT_DESTINATION + !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_BGCOLOR + !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VARIABLE + !insertmacro MUI_UNSET MUI_DIRECTORYPAGE_VERIFYONLEAVE + + !verbose pop + +!macroend + +!macro MUI_PAGE_STARTMENU ID VAR + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}STARTMENUPAGE + + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_DEFAULTFOLDER "$(^Name)" + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_TOP "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_TOP)" + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXT_CHECKBOX "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INNERTEXT_STARTMENU_CHECKBOX)" + + !define MUI_STARTMENUPAGE_VARIABLE "${VAR}" + !define "MUI_STARTMENUPAGE_${ID}_VARIABLE" "${MUI_STARTMENUPAGE_VARIABLE}" + !define "MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT" "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" + !endif + !ifdef MUI_STARTMENUPAGE_REGISTRY_KEY + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" + !endif + !ifdef MUI_STARTMENUPAGE_REGISTRY_VALUENAME + !define "MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" + !endif + + !ifndef MUI_VAR_HWND + Var MUI_HWND + !define MUI_VAR_HWND + !endif + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_STARTMENUPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.StartmenuLeave_${MUI_UNIQUEID} + + !undef MUI_STARTMENUPAGE_VARIABLE + !undef MUI_STARTMENUPAGE_TEXT_TOP + !undef MUI_STARTMENUPAGE_TEXT_CHECKBOX + !undef MUI_STARTMENUPAGE_DEFAULTFOLDER + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_NODISABLE + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_ROOT + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_KEY + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_REGISTRY_VALUENAME + !insertmacro MUI_UNSET MUI_STARTMENUPAGE_BGCOLOR + + !verbose pop + +!macroend + +!macro MUI_PAGE_INSTFILES + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}INSTFILESPAGE + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}instfiles + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_INSTFILESPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesShow_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.InstFilesLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_TEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_TEXT + !insertmacro MUI_UNSET MUI_INSTFILESPAGE_ABORTWARNING_SUBTEXT + + !verbose pop + +!macroend + +!macro MUI_PAGE_FINISH + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_${MUI_PAGE_UNINSTALLER_PREFIX}FINISHPAGE + + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TITLE "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TITLE)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_TEXT)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_BUTTON "$(MUI_BUTTONTEXT_FINISH)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOT "$(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_FINISH_INFO_REBOOT)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTNOW "$(MUI_TEXT_FINISH_REBOOTNOW)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_TEXT_REBOOTLATER "$(MUI_TEXT_FINISH_REBOOTLATER)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_RUN_TEXT "$(MUI_TEXT_FINISH_RUN)" + !insertmacro MUI_DEFAULT_IOCONVERT MUI_FINISHPAGE_SHOWREADME_TEXT "$(MUI_TEXT_FINISH_SHOWREADME)" + !insertmacro MUI_DEFAULT MUI_FINISHPAGE_LINK_COLOR "000080" + + !ifndef MUI_VAR_HWND + Var MUI_HWND + !define MUI_VAR_HWND + !endif + + !ifndef MUI_PAGE_UNINSTALLER + !ifndef MUI_FINISHPAGE_NOAUTOCLOSE + AutoCloseWindow true + !endif + !endif + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + !ifndef MUI_VAR_NOABORTWARNING + !define MUI_VAR_NOABORTWARNING + Var MUI_NOABORTWARNING + !endif + !endif + + PageEx ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}custom + + PageCallbacks ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MUI_FUNCTION_FINISHPAGE ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishPre_${MUI_UNIQUEID} ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}mui.FinishLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE + !insertmacro MUI_UNSET MUI_FINISHPAGE_TITLE_3LINES + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_LARGE + !insertmacro MUI_UNSET MUI_FINISHPAGE_BUTTON + !insertmacro MUI_UNSET MUI_FINISHPAGE_CANCEL_ENABLED + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOT + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTNOW + !insertmacro MUI_UNSET MUI_FINISHPAGE_TEXT_REBOOTLATER + !insertmacro MUI_UNSET MUI_FINISHPAGE_REBOOTLATER_DEFAULT + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_PARAMETERS + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_NOTCHECKED + !insertmacro MUI_UNSET MUI_FINISHPAGE_RUN_FUNCTION + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_TEXT + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_NOTCHECKED + !insertmacro MUI_UNSET MUI_FINISHPAGE_SHOWREADME_FUNCTION + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_LOCATION + !insertmacro MUI_UNSET MUI_FINISHPAGE_LINK_COLOR + !insertmacro MUI_UNSET MUI_FINISHPAGE_NOREBOOTSUPPORT + + !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_TOP + !insertmacro MUI_UNSET MUI_FINISHPAGE_CURFIELD_BOTTOM + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_WELCOME + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_WELCOME + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_CONFIRM + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifndef MUI_UNINSTALLER + !define MUI_UNINSTALLER + !endif + + !insertmacro MUI_PAGE_INIT + + !insertmacro MUI_SET MUI_UNCONFIRMPAGE + + !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_TOP "" + !insertmacro MUI_DEFAULT MUI_UNCONFIRMPAGE_TEXT_LOCATION "" + + PageEx un.uninstConfirm + + PageCallbacks un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} + + Caption " " + + UninstallText "${MUI_UNCONFIRMPAGE_TEXT_TOP}" "${MUI_UNCONFIRMPAGE_TEXT_LOCATION}" + + !ifdef MUI_UNCONFIRMPAGE_VARIABLE + DirVar "${MUI_UNCONFIRMPAGE_VARIABLE}" + !endif + + PageExEnd + + !insertmacro MUI_UNFUNCTION_CONFIRMPAGE un.mui.ConfirmPre_${MUI_UNIQUEID} un.mui.ConfirmShow_${MUI_UNIQUEID} un.mui.ConfirmLeave_${MUI_UNIQUEID} + + !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_TOP + !insertmacro MUI_UNSET MUI_UNCONFIRMPAGE_TEXT_LOCATION + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_LICENSE LICENSEDATA + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_LICENSE "${LICENSEDATA}" + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_COMPONENTS + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_COMPONENTS + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_DIRECTORY + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_DIRECTORY + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_INSTFILES + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_INSTFILES + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +!macro MUI_UNPAGE_FINISH + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro MUI_UNPAGE_INIT + + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_END + + !verbose pop + +!macroend + +;-------------------------------- +;PAGE FUNCTIONS + +!macro MUI_PAGE_FUNCTION_CUSTOM TYPE + + !ifdef MUI_PAGE_CUSTOMFUNCTION_${TYPE} + Call "${MUI_PAGE_CUSTOMFUNCTION_${TYPE}}" + !undef MUI_PAGE_CUSTOMFUNCTION_${TYPE} + !endif + +!macroend + +!macro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM + + !ifdef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT + Call "${MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT}" + !undef MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT + !endif + +!macroend + +!macro MUI_FUNCTION_WELCOMEPAGE PRE LEAVE + + Function "${PRE}" + + !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NumFields" "3" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "NextButtonText" "" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" "" + + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_WELCOMEPAGE_TITLE + + !ifndef MUI_WELCOMEPAGE_TITLE_3LINES + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55" + !endif + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_WELCOMEPAGE_TEXT + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + LockWindow on + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + LockWindow off + + !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini" + Pop $MUI_HWND + SetCtlColors $MUI_HWND "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1201 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + CreateFont $MUI_TEMP2 "$(^Font)" "12" "700" + SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1202 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + !insertmacro INSTALLOPTIONS_SHOW + + LockWindow on + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + LockWindow off + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_LICENSEPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_LICENSE_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + !insertmacro MUI_INNERDIALOG_TEXT 1040 "${MUI_LICENSEPAGE_TEXT_TOP}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_COMPONENTSPAGE PRE SHOW LEAVE + + Function "${PRE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_COMPONENTS_SUBTITLE) + FunctionEnd + + Function "${SHOW}" + + !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}" + + FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT + GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043 + EnableWindow $MUI_TEMP1 0 + + !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" + StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_DIRECTORYPAGE PRE SHOW LEAVE + + Function "${PRE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_DIRECTORY_SUBTITLE) + FunctionEnd + + Function "${SHOW}" + !ifdef MUI_DIRECTORYPAGE_BGCOLOR + !insertmacro MUI_DEFAULT MUI_DIRECTORYPAGE_TEXTCOLOR "" + FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT + GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1019 + SetCtlColors $MUI_TEMP1 "${MUI_DIRECTORYPAGE_TEXTCOLOR}" "${MUI_DIRECTORYPAGE_BGCOLOR}" + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + FunctionEnd + + Function "${LEAVE}" + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_STARTMENUPAGE PRE LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + !ifdef MUI_STARTMENUPAGE_REGISTRY_ROOT & MUI_STARTMENUPAGE_REGISTRY_KEY & MUI_STARTMENUPAGE_REGISTRY_VALUENAME + + StrCmp "${MUI_STARTMENUPAGE_VARIABLE}" "" 0 +4 + + ReadRegStr $MUI_TEMP1 "${MUI_STARTMENUPAGE_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_REGISTRY_VALUENAME}" + StrCmp $MUI_TEMP1 "" +2 + StrCpy "${MUI_STARTMENUPAGE_VARIABLE}" $MUI_TEMP1 + + !endif + + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_TEXT_STARTMENU_TITLE) $(MUI_TEXT_STARTMENU_SUBTITLE) + + StrCmp $(^RTL) 0 mui.startmenu_nortl + !ifndef MUI_STARTMENUPAGE_NODISABLE + StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !else + StartMenu::Init /rtl /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !endif + Goto mui.startmenu_initdone + mui.startmenu_nortl: + !ifndef MUI_STARTMENUPAGE_NODISABLE + StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" /checknoshortcuts "${MUI_STARTMENUPAGE_TEXT_CHECKBOX}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !else + StartMenu::Init /noicon /autoadd /text "${MUI_STARTMENUPAGE_TEXT_TOP}" /lastused "${MUI_STARTMENUPAGE_VARIABLE}" "${MUI_STARTMENUPAGE_DEFAULTFOLDER}" + !endif + mui.startmenu_initdone: + + Pop $MUI_HWND + + !ifdef MUI_STARTMENUPAGE_BGCOLOR + !insertmacro MUI_DEFAULT MUI_STARTMENUPAGE_TEXTCOLOR "" + GetDlgItem $MUI_TEMP1 $MUI_HWND 1002 + SetCtlColors $MUI_TEMP1 "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" + GetDlgItem $MUI_TEMP1 $MUI_HWND 1004 + SetCtlColors $MUI_TEMP1 "${MUI_STARTMENUPAGE_TEXTCOLOR}" "${MUI_STARTMENUPAGE_BGCOLOR}" + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + StartMenu::Show + !insertmacro MUI_PAGE_FUNCTION_CUSTOM DESTROYED + + Pop $MUI_TEMP1 + StrCmp $MUI_TEMP1 "success" 0 +2 + Pop "${MUI_STARTMENUPAGE_VARIABLE}" + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_INSTFILESPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_TITLE) $(MUI_${MUI_PAGE_UNINSTALLER_PREFIX}TEXT_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLING_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + !insertmacro MUI_ENDHEADER + !insertmacro MUI_LANGDLL_SAVELANGUAGE + + FunctionEnd + +!macroend + +!macro MUI_FUNCTION_FINISHPAGE PRE LEAVE + + Function "${PRE}" + + !insertmacro MUI_WELCOMEFINISHPAGE_FUNCTION_CUSTOM + + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Settings" "NextButtonText" MUI_FINISHPAGE_BUTTON + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "CancelEnabled" "1" + !endif + + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "38" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "45" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 2" "Bottom" "48" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Top" "55" + !endif + + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 2" "Text" MUI_FINISHPAGE_TITLE + + !ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115" + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125" + !endif + !endif + !else + !ifndef MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "185" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "175" + !endif + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + + IfRebootFlag 0 mui.finish_noreboot_init + + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "85" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "115" + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "95" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 3" "Bottom" "125" + !endif + !endif + + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT_REBOOT + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "RadioButton" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_TEXT_REBOOTNOW + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "321" + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130" + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140" + !endif + !endif + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Type" "RadioButton" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 5" "Text" MUI_FINISHPAGE_TEXT_REBOOTLATER + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Left" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Right" "321" + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Top" "110" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "Bottom" "120" + !endif + !ifdef MUI_FINISHPAGE_REBOOTLATER_DEFAULT + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "0" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "1" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 5" "State" "0" + !endif + + Goto mui.finish_load + + mui.finish_noreboot_init: + + !endif + + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 3" "Text" MUI_FINISHPAGE_TEXT + + !ifdef MUI_FINISHPAGE_RUN + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Type" "CheckBox" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field 4" "Text" MUI_FINISHPAGE_RUN_TEXT + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Left" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Right" "315" + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "90" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "100" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "130" + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "100" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "110" + !else + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Top" "130" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "Bottom" "140" + !endif + !endif + !ifndef MUI_FINISHPAGE_RUN_NOTCHECKED + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 4" "State" "1" + !endif + + !endif + + !ifdef MUI_FINISHPAGE_SHOWREADME + + !ifdef MUI_FINISHPAGE_CURFIELD_NO + !undef MUI_FINISHPAGE_CURFIELD_NO + !endif + + !ifndef MUI_FINISHPAGE_RUN + !define MUI_FINISHPAGE_CURFIELD_NO 4 + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !define MUI_FINISHPAGE_CURFIELD_TOP 90 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 100 + !else + !define MUI_FINISHPAGE_CURFIELD_TOP 120 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130 + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !define MUI_FINISHPAGE_CURFIELD_TOP 100 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 110 + !else + !define MUI_FINISHPAGE_CURFIELD_TOP 130 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 140 + !endif + !endif + !else + !define MUI_FINISHPAGE_CURFIELD_NO 5 + !ifndef MUI_FINISHPAGE_TITLE_3LINES + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !define MUI_FINISHPAGE_CURFIELD_TOP 110 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 120 + !else + !define MUI_FINISHPAGE_CURFIELD_TOP 140 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 150 + !endif + !else + !ifndef MUI_FINISHPAGE_TEXT_LARGE + !define MUI_FINISHPAGE_CURFIELD_TOP 120 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 130 + !else + !define MUI_FINISHPAGE_CURFIELD_TOP 150 + !define MUI_FINISHPAGE_CURFIELD_BOTTOM 160 + !endif + !endif + !endif + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "CheckBox" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_SHOWREADME_TEXT + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" ${MUI_FINISHPAGE_CURFIELD_TOP} + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" ${MUI_FINISHPAGE_CURFIELD_BOTTOM} + !ifndef MUI_FINISHPAGE_SHOWREADME_NOTCHECKED + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" "1" + !endif + + !endif + + !ifdef MUI_FINISHPAGE_LINK + + !ifdef MUI_FINISHPAGE_CURFIELD_NO + !undef MUI_FINISHPAGE_CURFIELD_NO + !endif + + !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + !define MUI_FINISHPAGE_CURFIELD_NO 6 + !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME + !define MUI_FINISHPAGE_CURFIELD_NO 5 + !else + !define MUI_FINISHPAGE_CURFIELD_NO 4 + !endif + + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Type" "Link" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Text" MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Left" "120" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Right" "315" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Top" "175" + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "Bottom" "185" + !insertmacro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT "ioSpecial.ini" "Field ${MUI_FINISHPAGE_CURFIELD_NO}" "State" MUI_FINISHPAGE_LINK_LOCATION + + !endif + + !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "6" + !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" + !else ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" + !else ifdef MUI_FINISHPAGE_SHOWREADME & MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "5" + !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME | MUI_FINISHPAGE_LINK + !insertmacro INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "Numfields" "4" + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + mui.finish_load: + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + + LockWindow on + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + LockWindow off + + !insertmacro INSTALLOPTIONS_INITDIALOG "ioSpecial.ini" + Pop $MUI_HWND + SetCtlColors $MUI_HWND "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1201 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + CreateFont $MUI_TEMP2 "$(^Font)" "12" "700" + SendMessage $MUI_TEMP1 ${WM_SETFONT} $MUI_TEMP2 0 + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1202 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + + IfRebootFlag 0 mui.finish_noreboot_show + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + + Goto mui.finish_show + + mui.finish_noreboot_show: + + !endif + + !ifdef MUI_FINISHPAGE_RUN + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !endif + + !ifdef MUI_FINISHPAGE_SHOWREADME + !ifndef MUI_FINISHPAGE_RUN + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + !else + GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 + !endif + SetCtlColors $MUI_TEMP1 "${MUI_TEXTCOLOR}" "${MUI_BGCOLOR}" + !endif + + !ifdef MUI_FINISHPAGE_LINK + !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + GetDlgItem $MUI_TEMP1 $MUI_HWND 1205 + !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME + GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 + !else + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + !endif + SetCtlColors $MUI_TEMP1 "${MUI_FINISHPAGE_LINK_COLOR}" "${MUI_BGCOLOR}" + !endif + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + mui.finish_show: + !endif + + !ifndef MUI_FORCECLASSICCONTROLS + ${If} ${IsHighContrastModeActive} + !endif + ; SetCtlColors does not change the check/radio text color (bug #443) + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' + GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 + System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' + !else ifdef MUI_FINISHPAGE_RUN | MUI_FINISHPAGE_SHOWREADME + GetDlgItem $MUI_TEMP1 $MUI_HWND 1203 + System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' + !ifdef MUI_FINISHPAGE_RUN & MUI_FINISHPAGE_SHOWREADME + GetDlgItem $MUI_TEMP1 $MUI_HWND 1204 + System::Call 'UXTHEME::SetWindowTheme(p$MUI_TEMP1,w" ",w" ")' + !endif + !endif + !ifndef MUI_FORCECLASSICCONTROLS + ${EndIf} + !endif + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + StrCpy $MUI_NOABORTWARNING "1" + !endif + + !insertmacro INSTALLOPTIONS_SHOW + + !ifdef MUI_FINISHPAGE_CANCEL_ENABLED + StrCpy $MUI_NOABORTWARNING "" + !endif + + LockWindow on + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1028 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1256 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1035 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1037 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1038 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1039 + ShowWindow $MUI_TEMP1 ${SW_NORMAL} + + GetDlgItem $MUI_TEMP1 $HWNDPARENT 1045 + ShowWindow $MUI_TEMP1 ${SW_HIDE} + LockWindow off + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + !ifndef MUI_FINISHPAGE_NOREBOOTSUPPORT + + IfRebootFlag "" mui.finish_noreboot_end + + !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" + + StrCmp $MUI_TEMP1 "1" 0 +2 + Reboot + + Return + + mui.finish_noreboot_end: + + !endif + + !ifdef MUI_FINISHPAGE_RUN + + !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" + + StrCmp $MUI_TEMP1 "1" 0 mui.finish_norun + !ifndef MUI_FINISHPAGE_RUN_FUNCTION + !ifndef MUI_FINISHPAGE_RUN_PARAMETERS + StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\"" + !else + StrCpy $MUI_TEMP1 "$\"${MUI_FINISHPAGE_RUN}$\" ${MUI_FINISHPAGE_RUN_PARAMETERS}" + !endif + Exec "$MUI_TEMP1" + !else + Call "${MUI_FINISHPAGE_RUN_FUNCTION}" + !endif + + mui.finish_norun: + + !endif + + !ifdef MUI_FINISHPAGE_SHOWREADME + + !ifndef MUI_FINISHPAGE_RUN + !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 4" "State" + !else + !insertmacro INSTALLOPTIONS_READ $MUI_TEMP1 "ioSpecial.ini" "Field 5" "State" + !endif + + StrCmp $MUI_TEMP1 "1" 0 mui.finish_noshowreadme + !ifndef MUI_FINISHPAGE_SHOWREADME_FUNCTION + ExecShell "open" "${MUI_FINISHPAGE_SHOWREADME}" + !else + Call "${MUI_FINISHPAGE_SHOWREADME_FUNCTION}" + !endif + + mui.finish_noshowreadme: + + !endif + + FunctionEnd + +!macroend + +!macro MUI_UNFUNCTION_CONFIRMPAGE PRE SHOW LEAVE + + Function "${PRE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MUI_UNTEXT_CONFIRM_TITLE) $(MUI_UNTEXT_CONFIRM_SUBTITLE) + + FunctionEnd + + Function "${SHOW}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + + FunctionEnd + + Function "${LEAVE}" + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + + FunctionEnd + +!macroend + +;-------------------------------- +;INSTALL OPTIONS (CUSTOM PAGES) + +!macro MUI_INSTALLOPTIONS_EXTRACT FILE + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_EXTRACT "${FILE}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_EXTRACT_AS FILE FILENAME + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_EXTRACT_AS "${FILE}" "${FILENAME}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_DISPLAY FILE + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_DISPLAY "${FILE}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_DISPLAY_RETURN FILE + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_DISPLAY_RETURN "${FILE}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_INITDIALOG FILE + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_INITDIALOG "${FILE}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_SHOW + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_SHOW + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_SHOW_RETURN + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_SHOW_RETURN + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_READ VAR FILE SECTION KEY + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_READ "${VAR}" "${FILE}" "${SECTION}" "${KEY}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE + + !verbose push + !verbose ${MUI_VERBOSE} + + !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${VALUE}" + + !verbose pop + +!macroend + +!macro MUI_INSTALLOPTIONS_WRITE_DEFAULTCONVERT FILE SECTION KEY SYMBOL + + ;Converts default strings from language files to InstallOptions format + ;Only for use inside MUI + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifndef "${SYMBOL}_DEFAULTSET" + !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" "${${SYMBOL}}" + !else + Push "${${SYMBOL}}" + Call ${MUI_PAGE_UNINSTALLER_FUNCPREFIX}Nsis2Io + Pop $MUI_TEMP1 + !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "${SECTION}" "${KEY}" $MUI_TEMP1 + !endif + + !verbose pop + +!macroend + +;-------------------------------- +;RESERVE FILES + +!macro MUI_RESERVEFILE_INSTALLOPTIONS + + !verbose push + !verbose ${MUI_VERBOSE} + + ReserveFile /plugin InstallOptions.dll + + !verbose pop + +!macroend + +!macro MUI_RESERVEFILE_LANGDLL + + !verbose push + !verbose ${MUI_VERBOSE} + + ReserveFile /plugin LangDLL.dll + + !verbose pop + +!macroend + +;-------------------------------- +;LANGUAGES + +!macro MUI_LANGUAGE NLFID + + ;Include a language + + !verbose push + !verbose ${MUI_VERBOSE} + + ; MUI_PAGE_UNINSTALLER_PREFIX is undefined by uninstaller pages so we check MUI_UNINSTALLER as well + !ifndef MUI_PAGE_UNINSTALLER_PREFIX && MUI_UNINSTALLER + !ifndef MUI_DISABLE_INSERT_LANGUAGE_AFTER_PAGES_WARNING ; Define this to avoid the warning if you only have custom pages + !warning "MUI_LANGUAGE should be inserted after the MUI_[UN]PAGE_* macros" + !endif + !endif + + !insertmacro MUI_INSERT + + LoadLanguageFile "${NSISDIR}\Contrib\Language files\${NLFID}.nlf" + + ;Include language file + !insertmacro LANGFILE_INCLUDE_WITHDEFAULT \ + "${NSISDIR}\Contrib\Language files\${NLFID}.nsh" "${NSISDIR}\Contrib\Language files\English.nsh" + + ;Add language to list of languages for selection dialog + !define /ifndef MUI_LANGDLL_LANGUAGES "" + !define /redef MUI_LANGDLL_LANGUAGES \ + `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" ${MUI_LANGDLL_LANGUAGES}` + !define /ifndef MUI_LANGDLL_LANGUAGES_CP "" + !define /redef MUI_LANGDLL_LANGUAGES_CP \ + `"${LANGFILE_${NLFID}_LANGDLL}" "${LANG_${NLFID}}" "${LANG_${NLFID}_CP}" ${MUI_LANGDLL_LANGUAGES_CP}` + + !verbose pop + +!macroend + +;-------------------------------- +;LANGUAGE SELECTION DIALOG + +!macro MUI_LANGDLL_DISPLAY + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifndef MUI_LANGDLL_LANGUAGES + !warning "MUI_LANGDLL_DISPLAY should only be used after inserting the MUI_LANGUAGE macro(s)" + !endif + + !insertmacro MUI_DEFAULT MUI_LANGDLL_WINDOWTITLE "Installer Language" + !insertmacro MUI_DEFAULT MUI_LANGDLL_INFO "Please select a language." + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + + ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" + StrCmp $MUI_TEMP1 "" mui.langdll_show + StrCpy $LANGUAGE $MUI_TEMP1 + !ifndef MUI_LANGDLL_ALWAYSSHOW + Goto mui.langdll_done + !endif + mui.langdll_show: + + !endif + + !ifdef NSIS_CONFIG_SILENT_SUPPORT + IfSilent mui.langdll_done + !endif + + !ifdef MUI_LANGDLL_ALLLANGUAGES + LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" A ${MUI_LANGDLL_LANGUAGES} "" + !else + LangDLL::LangDialog "${MUI_LANGDLL_WINDOWTITLE}" "${MUI_LANGDLL_INFO}" AC ${MUI_LANGDLL_LANGUAGES_CP} "" + !endif + + Pop $LANGUAGE + StrCmp $LANGUAGE "cancel" 0 +2 + Abort + + !ifdef NSIS_CONFIG_SILENT_SUPPORT + mui.langdll_done: + !else ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + mui.langdll_done: + !endif + + !verbose pop + +!macroend + +!macro MUI_LANGDLL_SAVELANGUAGE + + !ifndef MUI_PAGE_UNINSTALLER + + IfAbort mui.langdllsavelanguage_abort + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + WriteRegStr "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" $LANGUAGE + !endif + + mui.langdllsavelanguage_abort: + + !endif + +!macroend + +!macro MUI_UNGETLANGUAGE + + !verbose push + !verbose ${MUI_VERBOSE} + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + + ReadRegStr $MUI_TEMP1 "${MUI_LANGDLL_REGISTRY_ROOT}" "${MUI_LANGDLL_REGISTRY_KEY}" "${MUI_LANGDLL_REGISTRY_VALUENAME}" + StrCmp $MUI_TEMP1 "" 0 mui.ungetlanguage_setlang + + !endif + + !insertmacro MUI_LANGDLL_DISPLAY + + !ifdef MUI_LANGDLL_REGISTRY_ROOT & MUI_LANGDLL_REGISTRY_KEY & MUI_LANGDLL_REGISTRY_VALUENAME + + Goto mui.ungetlanguage_done + + mui.ungetlanguage_setlang: + StrCpy $LANGUAGE $MUI_TEMP1 + + mui.ungetlanguage_done: + + !endif + + !verbose pop + +!macroend + +;-------------------------------- +;END + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Contrib/Modern UI/ioSpecial.ini b/libs/NSIS/NSIS-source/Contrib/Modern UI/ioSpecial.ini new file mode 100644 index 0000000000..c8dfe6ec50 --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/Modern UI/ioSpecial.ini @@ -0,0 +1,19 @@ +[Settings] +Rect=1044 +NumFields=3 +[Field 1] +Type=bitmap +Left=0 +Right=109 +Top=0 +Bottom=193 +Flags=RESIZETOFIT +[Field 2] +Type=label +Left=120 +Right=315 +Top=10 +[Field 3] +Type=label +Left=120 +Right=315 \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/default.exe b/libs/NSIS/NSIS-source/Contrib/UIs/default.exe new file mode 100644 index 0000000000000000000000000000000000000000..2c8363a0830778af9cce42484b3d6232d360e0b6 GIT binary patch literal 6144 zcmeHLZ){W76+h3h6DJ{wDR>QnF((Zh(?%2stW+VDOKfnogt~EXLR;z@`z6nwV|&lf z5T;Es1U6EWiB*x7RozC)K1|v^^h33xZK|SCu@+H@t!PDCweewpjGA^#AYdEo+wa_G zlSgpUY}&eg=&{bd_x!!*o_pTC@45H!6I4M&R-mpEokq{#7VYBAC5Y=k@#A`Wsrrqk z(^AhHP5nwN<4UWkVKqGBiiDHNl;+weyVPvb6-&B2j|N;Lsi@pqS69}mzqx+$KG4rK)l4>`-``A=tI_{@)1FC((6dcGguZv}W+DG=heh;#v53MxN)h|L zL_Ly~20H%`EAcK?*h%w8r)uK|O2Nol*D;>P`jSm2RlC&kT)y#UV9J&P;enmuzkDdaza({gw4l z80%z~O|8}IcyMJUc+i- z=4r5vEsX2R2@uN36>f@7V@c$Xj<4f>Y*q;b2gc<>`)|hg-i}*B1G;lPRQHV4-Npp^ zSRHLdr#n9jX1?w!c;ndTHbKn_YI-vhbjk|F!sihALm$5cL3Wukh3RzXR(4n56Gd4D zzG6pHxQ4l>3vBP5obXQi^)0^#G2wmQKjA$AJc%vy!%(rZ39-oxhx=;FbPrG0)^RPn zVyySJp6|UH9j}9kLQg&M`kC?U@u9JYo3q}En>@@{4t1Q-Du+6oDf_Mv*yagbwEx}l zy%#3D-@}ZJaDBsjLDE*BwlBWpfQ4)So5JFqYw?;ve=vY;SqUwF;fwF<`nY!rRz42M zJDa!XtH*nf`5!CrLA+)kv&VF&8}jq|IuAO1-8Qre;Sxq8QGxFxsJ73XIddMM zuWJ!nF0}s*z;rqG`<-UP`^hGvuRcKZ9FSoY{UC4$a4T>a z1Twr0Kkor^pf%t=U>|TBuobu#xD0q6I=6u(&;ff;B_qHV6aPhw9WJ7kCf+MN1}|aa zJqw?M;H@$7UINb!-ewaof%skEm4pAMob0yrq{7jj*giF^9vmS0yti+cx2JtmYc!D{ z>Uy-dtN#w=wglv4v{%k#!oxCjzXn!w|NsaIuEK$m!hYaeF z;UN@Gr$gGoH00+vvWT44LP|IpO~`6HQEwpF)z@$A+{*-CNu((;lqNdNdF@R_vkBQJ z)RD*2%nN8?Rm-NklS3)6J_H!T95{$*7#IhB0my()0|ESec2Ss;6d{>Vf`DBZjgm$# zdRWlgFxn2CNYQ#11*jW{lNFjOWhjRHC5yHt*>3Pz>Vj?(-grDDyvX2f0QQ5Ifg}bw z$Jd8Z1krjaO6|0XTG1zpF-gMvN6o*M0f}rdXe{0dbGFsk2_h6~j`MyDJ=e%d^!#y! zZ^j(g$_4aXF9r0XG9=33n4m`VDfDgV(V0M^YP>7??%6DZKezy2S%5#f0RPwm{HX=_ z-(P@#dIA1x;9q`Z?%SCcxZXqLG3lqhxcf}>i#woXrg!4bGSL@&M6a4MHMO1SmnJ&h zMf4*RJ=KkmIul(QO5&^DpnO(xSBPPabhxNs=U(a+PiFwn5f`ztH{k9t>E=3|9Lzd^A#x6r%#<=I1wt=Xw)9FiWQ#$I7-` zkNB80#k+8qykiUGZZ%OQ@q99rD|0BmD$_BK%#{ z$RUx5xkmDzLmfPbKM$@5d2UXGQE87Ct3&)ff&KXsRZEDnSgU3ySf|@gJ8>J;(A6?? z81^Y)uM7Fzbv#$+&1LJn3iC_!N&IKBmTu4UKR=Jq1(@pq<^QPpiu2>3-CLN}r-{ z(&J>uJ_YC??)QG&`!aq(-0m_R5I1{iReWUfzmx{}?B{a$HxJM#y)EyE-g( zA_ES;UEK}GvG;gSfW5u!-rC%U+=Tk9mK3@L|Hj_-U{CoCuKeEe3{YJ{-LlRa+Qxe) za+70I0rT?%G2q{MzIYDl1MfS+o9Tndfz7l>VoEeQ`yu~U`V9R7XC2>nx<3D`E8Um( io+IXUyk@5y*C5dgh{u4X);a13by!7{h_SLvjQ<4K3&80B literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/modern.exe b/libs/NSIS/NSIS-source/Contrib/UIs/modern.exe new file mode 100644 index 0000000000000000000000000000000000000000..2718fd09871f45f889d32db0984e7b92a9dc5551 GIT binary patch literal 6656 zcmeHLeQZonawW(|D=R9YQo!ZYy zkXFeM*oaIdR7Dl5x{Ziw>mU20e;^f2Rh5p3m5NHJMFVYB#UI^f*0e(c0oz#Le&@dD zhHYC;jqZBCOO^R+iP6uKS)D_|1w& z`(z%5*DRh~3i{>MWs}vw!)s`ACGhVy^-j8ko@4TH;PzFUh5W;9Hi0{$A(egPBldZT z+9W%5H~t}-=Ut^Lsa#rQB)in$-dqCg0?15zjK0lKVGhrWXg)km0%9~6vE3{-NoJwF zA`^{r$3rw!&Yk~IlZlRfj;lIN8Py>F1urVc$1%?)fj*i{^juvs9MpoQ9vDK$32bQ| zL|B?004&WzG+mcWB}3qeT)_}Ji-9f8BWA0#$_GM?rW?WfsMb`!wq*aIif*e|^j>MRF z-Ro-69&2gQsvB-~>1n6#4#QuU?pA@WwL+y~Ix_ZxORAcjo@gdra@51?fpT5oYwMvf z*2pYJvRtp^&b8&>P2EAS;nucu+9N*Q9fPkamUXG*Ld+Ou^AQ(lealULx`&{!?c6Cg zsyciL;Z1n2`_#XoB1A|U#BehT!~((l9*6;V7h=Atr>}SETi954A7-{QPdx+b+F|(f zXZxJp*~T8wY6gma{c?5-yH&%WR6FX;um9GkUsgLo50schGZT_YY-Yk{5CaaOlWpV? zU^d_o(V9Zos7o*le%+mce87R>0#7$gKYJd_p}Pq@ES6n;10GKqGvH!9Qa8F74Mg)3 z^Bma55)SCc=qY@XUEgWB4baiNqb9fb2qyvvhA$4DAKrw(w_){V}U@X;ZMf< zE>3uViV>^f`j+>iq%FhVzVxvR7V_}>!s6o_17$tFEpcVP1-;2hu*-~+%P z0o*=-pHBf9&>CPrpaZZSPzP8Ar~q7m&Rsyh>1e&!C4+z(3;#9rT{6*f3-3+tgBP># zUWCsc@E)`9PJ`zJZ?lCLL;Ny$h1wTsPWIW_62Wj=bbm6KJkU+F$J?>j+t#qDE*y&y zH9gth)HzFeYgbM2{gR5K%^bL5SO4I}yq8J(SpQPaUbzqccw-`C9%b|%v)wKX1&COL}T z&8?=w`xH<{qZ+kPpeHn>?TW@UB}uI|!K6P)fsxQ)I2OlY6bOv;E81W%8V@G>k!zI{ zh{mHD)CXw{(v+g5Qy_wxsw9&{KcYY|JdjRlfk-$yOgKgZfuTSklo;eUSfYeMM-1wq z;UN$l8VYC!h9G~3BMT`*T0jlP!!ae560T%S!8q&S60A#6dkz37dS zMlwAi=j_bW|C4A#r(xh+q`Ta_$-y78;3XUM}!vzybXX(@KTUO zA?Nry&z(AHJQ7PV)TJBjagWpqxuNL8t7U3T)!aq@j z|7sEbnIinR!N0nL=(HuX6FYIgSoF^{;a;-PE-yZ%Y;y+HyK$e+k>qL-^E=CV4fM@f zis;o=+_@Gy^KIO>7CPUR#8tw4R}>uI$bTgTkpDjl z#9uYD4 zPTUO&eqFc$6dDny|NLQj-rl1c>ctJQRIFQOz5?WzabxU-uVt2Xoj0$}cQVFb7<;4- zP3!xwmlEI4=sfoQV!Yb(-d;GqoT^N@uFsu#^Y($A zJWxS2V$Iz@HF?xAkQ**E~go6ltJw75YEdOZ~!-M5^qZVVz;Nj;kTUm z4fQVOsTT9F@C;>5hv%S&P@lC@obJHCQ9o^{8-A0zw|*Ap&3pG@^CtQR@^+G=!2D;N z2YowG*MG*j%=d+^FFcp?d99k4*ZlaVJ^a4%@bTTxeb)Mb_gNq2`riADqb$W;!~Y7` zN~PwW&M)B`yVjx{-Sx~jzr!@UPdh!&g*R_WsLpy zbNZ&4`Td@^I75BwQD>v5r9}ny8~oxupj^~Df5Y&3W36`{&hSwNA1-PG%{o3*qJpmw v{x*?u(*#jD{G~I3ccrM1$*3s>yfms+7Ih_qpMYi<6o0AIiJzI!7YzLqWTWY! literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/modern_headerbmp.exe b/libs/NSIS/NSIS-source/Contrib/UIs/modern_headerbmp.exe new file mode 100644 index 0000000000000000000000000000000000000000..165f70f3ed3a99692df2cc5f9fc4392de6f00494 GIT binary patch literal 4608 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 bv~wLE=PG}S`WmkBYwPfQ?ML$P?ZCeQr`69^ literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/modern_nodesc.exe b/libs/NSIS/NSIS-source/Contrib/UIs/modern_nodesc.exe new file mode 100644 index 0000000000000000000000000000000000000000..bc75610052cbf5f96664a2bec5e1b84abf8ef058 GIT binary patch literal 4096 zcmeHKU2Gdw7Cz(H#ch+urL{;^mYsxDDpDJzb-F4_gS?Fg5)l^@r%nQt>C`jMjMo`^ z$K(7+yHddIE|!T@AwK}(r%`$2fd?cigiu6K5vWL&sFrF$h==`gMPMtnYFSjce0OHt zdQpV5((bYkoao$h&Ub$9xj&xF#2-0HEkxu8Ge&d8UjymZ1`X0hsyioJ>OgebdX4Nw8v5vTk+xmI5FOyz;Y;x?t9!Y z3i37dg8AZG!A%q;TJEumRvMVIRsc@iCdej=I=j&X{H*@uJ5V0@ycg$E3hCXDEF2W0 zbecoeSa)#uew_OCi`$p4pT9f6!FNJ*xVlZMp%hqyG1kjQeT{QHp5URz#_5fcKvs5-xqIr7p@1e6Cj6tFh3 zHm+RS3T)|XXpw9EXYJb(ESy8FCGJb<6hhCKrtd@uHrscVkKqCW`p=%`N$tlkpuI)u zazg(GzX+!#8*Y@DgWwJa`yGsIIE9|CveM-g+sBhx_&A4y4eK#jmyV-evU(&qULBZ# ztuG)j$v&>`<7IUfmhQ*zEy@0rU?1yau(K_m5#xs78GYRFxkfhN#8e0P3`olcoNhfQ za`esEg(M3vz@H6ZI{DGa^5gI0I9Ql~;jsMrTc~*2-GLB~BYjVZi>%Sun4^H*Bg``W zBnN>)v=cPxIw4=2(14Ko!|S5i*S@$^=C013-9OU>imhKw*uFL80uFr_fnnb zOSMI*mSFq-0%K8nA+ac(1fRl@C6K85c?$8AW!~<)-Af~Uy59aPr7h+74OWd`Rx53A zk^K0h@2^x!PiM;ab(N%+>s+m_%k;0<>oNmfRQl3!1b*NUY39qyk@JhvE10nZrLRfn z1$ztb_JuD($Pi~fax%WSlHD+oNF{MBTM?D0|Mok^D$=va8sZH}tJPq2eI@=>;^8`f z5Km67RJA%QJ;lON_|LH&F$lKf07jkgPZ)zhb^iYdp^@d4m2)7rquYrRG5$9Q(=G72 zFLk-qPjwRg;clYm!JOtGC&2fE_k(wWJHUSM*T{Jrd=`8G{3-ZvU{0T+&R5_C*f#hW zcocj9+ylM~+zLL2m>b{*G0-G#$uzjT34aZGNF>_YguTsmV7Vsj8PuErc4rgzIiT3!CX-m`0vHW1p&`i8W*un#i z3Zq)urp?@r<)(&hZJH=WgO;Y)TFg*#`Kg40mp;t#9L2PvZRO{^Y5YDEw;wJUw$~Y* zCCOCXBzl=#~lc+yCBb|r`4Q^hmkDLPHFbEVwj3Gg|)T|vSAuF!l$VWZ&9;LMHq^$YnDay zBFT!HEfsA!qZ%`W$EYk9WI3Im=5Me>dDqUk))Q_8St%4`d%ghw2fVYiRS~!f1iV-kV$FM2v-nv2-+OkB+`A3eE`})#H79KLzJXpFrKW4w5Ui1 z_RsWk8@|K9xmQH2iE3QWI8`)YyTN0?itrfl^ZrJmrO~ZKDn)27^+4vlo&=}*&%?jB z0|Et*(Bb`0xRon7cLJ~f3%4+?3A7&XIz!NoMv=G1rVGwjC67g%pQ8Bs0__qS-!MUL z3UTLlBryxWQ#qV<3?o0|CQ5L9m#~e#YQcSEPd2%nPZIdIlT1PSb`5_Ebw)F^jaD$n zKOO&xf60e|{GG`EHGQ{6zUwdIhTTqV4gVeVL?VOy72W}V|D$=_)iK;*4Sy-zRE=hx LTl&Lke_H!{9(%KR literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/modern_smalldesc.exe b/libs/NSIS/NSIS-source/Contrib/UIs/modern_smalldesc.exe new file mode 100644 index 0000000000000000000000000000000000000000..e170cede521cbe334a0a322e3e582529011b3c75 GIT binary patch literal 4096 zcmeHKZD?EP6+Ty%QYEot9&~c=YH%*Az_SS=8@5oLZG1yZ5jQs4~4p2AR*~S+PBa9 zN=lSs3Wa_B=n>~V=RD`*J@1FEuA)z$rWPXdf*B(^56LMk#%~_3z`g1FzuQD_tbeET zyfpGo=a^~b<(!k9a{<$^t82Y=&qMO_H6o3+XuXr z2G4YDs%(M%TIYsJ2jol_Rdzsruz#`=5OKcBBaqPt`-K0`{T?Alt)$6oG&+tcL?e=y z#s~gtHL#DVUD_zEt1Z@FLvL(`41i^Bhikg07Qzv}FM?ti>jvB)B=NjEvTkw+^twzm z$CWVlRN~6NiDaUezoAr*Ys|Uu|Arqb?~nIg zEVo?)R>C>=3TstZOMTp+vt9&NA4cboeD4Yzg;w)bOvi!;dATZoqL{6~O+SX}bQA?wPk%N`;qG#YejeO3N*-me-~FSKM`}fi5b1DjdGAIb@pov~=v!qVj9Z*n!eF zl}nPl6?gmcCjn&0Gw+IwPp+poOvDm#9LqLD#i~F4lChHVDzb)nL&|E|UtV8|z7%_^ z${)m&lPhJT$_g*BU>N?3Y*z$=?K*_fB>V_tkf_Rkj}RJKURk*aV!OIUl#KB|L6~lV z*ZpNzt@@cxqMz<0dJW8J4srtgIQSrVH@E}r1%Hm5H^CRcm%$%_{|4st5$b#fUV!a_ zPk=|khrm7H2f?l2i-@@mZV&@a;+9N%z+l%PS!&|D*8X_@R)Ov6hb=J+{9jJ)e)=j+pWJt*!zRj}N8 zXLNxSTdyV2uc)RR&d${f9E~fZjrBcLpW(1m$eY8qZaKV*CnCf3fOknX<}8ckQaPd*`MyT8dLd&BiE!-Wd5*r9rod_NkHDPp*FX^eeh!jGHYLd*TtUzgXmjL}Opglt5VXUHN!GKEP@IOrc(NkW zp*&gGKf9jW@Erxty)t5LRO5O|R55_<1&;yC!(+kE`x}LpM7Ij*6r%mq1DUD!B#G+Z z4c~4DB=RAlqyC$4H&+sO0v>xv|L(qOJTpz_DGHY zFv6Ci;&#L_3%^qtoOJ{vKjS8faea@pojz;9ePk~-xx`-*_;-*>e)?h!e+zYnQ?#8{ z=m+#q;XidxJ`CjVM*d^;^MFhC6KFlfX?i rXja_Pd#Ak*^QPckp`Ek^d5kUG8vuWX3Um(hZWaD}*ZuY2Z)<-A22{N- literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/UIs/sdbarker_tiny.exe b/libs/NSIS/NSIS-source/Contrib/UIs/sdbarker_tiny.exe new file mode 100644 index 0000000000000000000000000000000000000000..31a263bf0d2ec5e783abe83ffa0754de81125e35 GIT binary patch literal 6656 zcmeHKeQZ?w4QJmyb~i5jlaTNpupF!7JLkHy5B@^y!~2qE{>4sXZxm zzEj(y#nPT3JvE?*2R)H+GMO?wdsUB~NqS;Qk8gXxGnk614OLZ@^@Y&8o{#_H@mA+} z5%<+C8eanb<=V>e8qj@pG`<}4*XwqUyM$fo_|u?WPp%jG-!?l0?T$q>j#125@e_4Q zPU>y_L#!yfNY&B;smz+}5=(k@F{lgZVcu)?9hM18xGn+|v;_ug0G!zG7A>$W0=(iO z8s?6dXj3J3J|XZB9lcAa216Y-p#KpsD(A;J-M;3b-B(9?PZGBH;Ogv}yQ8+b)EY=TGK|9S;RS}!(YT{14M9@KQp z9xt6>QO;K{ui1oEzkXr))b(>KOIi4H7wyPRk4(FA{)NFcE@-O{{TXv;uRfe$<~6^o z-B{7yZqzhg3z`|(bVm^{Xu36!OC2z2n(80VXBOpqEy|V5F5r zrTPN1iaVE!4S<(K66CqMEphlQs5LO7;*TBTxLF9bZ%v=td8`#-&A7ZgwHZvqxvI;Mjbfb}1vf3Y$@R?82`3Em8rE19JuT{q2K z*X8JF6;u@3{oLE9Ml(nIN1mz6_)D&HH&@o*e99>6Z>^)uheA<0OW~n?ACB%iH|GC7 zMyx^TYyNYRu@rmz{0A<0c=o+3JU+M*uk2HT0W8ZhSSk6her%ef{t0-sb3*>{PFcpmsZ@Q*--_YvnK zU>3Xq+zadmwg4M|PXZSL&%)*=um~n#Cw9pou-+#BG5RhK(K4It4emphu*qIT%s$9g z*krFlCPTK~CQBfH4`g$}|58nMI670|XlHD%9@Y=^5`D?vz0Kd*w5}nVND#Gc?`rG0 z#d#e8H5u(v)9LVl3fpgjH+o~qXlj2C{uMy-q9dTC_FE#Ho!fdPl_py22t;&MP4=YP z5-~N2zY&JCwHTpWjTp3;d0%3n!%zo_g4Cv~VMF!B!im&?62_lCjPWh92^*TK>qOtCP&gXTq>WI2G`5d$jfO%)p-?0>$p2u8QWoEDaR;pkq43a9 z$T%`y`TAAo+0fs2R+fN|hgfDHIF5WwfNjlz_q2&sfE2-t?+Fd5{bX9VAZ z-e%ZD3f|i&KpjBbtgzH6O)=CjS@13Dc0kTr4{Vc&#{GT~MTKk)um`d+peDyya%+E%JotgXW#3gNjTm z>2-XN{$1pB(4G?dl5&RX=<~FQE(v{hh907O&KsY@u=x~KNHX0NF=o!Yge33lv=R4Y zC0(9l4EC4k3-lAhEDN=@Ct>L~3cWc;eApK1zT}R&&#q&+2>jr6ETLMjPSrF)yXmhY zhr{+1@%PoLllva~gQyle>k0aJj(J#hTn4>N|Cm?bg11AayVs%mjyiC%k6|z9w1Qru z&ytKf2j~FalODV?DtgHCdI%c)G9An_$UOD~b5uNgJq z+Vl5o(SOGLaewgpKo4;a@gyiX`M4Vv&@>7#h{{KB<`bYHyev9abwI2{8WMiZXTnkJ zFT6|em*-sDQtv^pbp{*h2I5<5+le*he++Z4Esp@xd!BEY!Da=u@Y;#mWZ6}~?D{|r zc$o9WV@UVBUx}W=T_sbgZH>f`XtMG_WfT4>{StQ_->;@Q`>reA6LojgaP~YNcAf9H zp7-}oEWhVFQJi}P?s3Adsgx?Ha@HELjiql9`UN)q?0Nrd>-R~$kE`x`-gsLuZ);xm qdE4jpmP}c`Q;5EYSIUC>y|>_pd!?MlvFFO>*mH$&kI4UN1^x-=v%Qu8 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Contrib/zip2exe/Base.nsh b/libs/NSIS/NSIS-source/Contrib/zip2exe/Base.nsh new file mode 100644 index 0000000000..e72e2fcacd --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/zip2exe/Base.nsh @@ -0,0 +1,81 @@ +;Change this file to customize zip2exe generated installers + +Name "${ZIP2EXE_NAME}" +OutFile "${ZIP2EXE_OUTFILE}" + +AllowRootDirInstall true + + +!ifdef ZIP2EXE_COMPRESSOR_SOLID + !define SETCOMPRESSOR_SWITCH /SOLID +!else + !define SETCOMPRESSOR_SWITCH +!endif +SetCompressor ${SETCOMPRESSOR_SWITCH} ${ZIP2EXE_COMPRESSOR} + + +!ifdef ZIP2EXE_INSTALLDIR + + InstallDir "${ZIP2EXE_INSTALLDIR}" + + Function zip2exe.SetOutPath + SetOutPath "$INSTDIR" + FunctionEnd + +!else ifdef ZIP2EXE_INSTALLDIR_WINAMP + + InstallDir "$PROGRAMFILES\Winamp" + InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString" + + Function .onVerifyInstDir + IfFileExists $INSTDIR\winamp.exe WinampInstalled + Abort + WinampInstalled: + FunctionEnd + + !ifdef ZIP2EXE_INSTALLDIR_WINAMPMODE + + Var ZIP2EXE_TEMP1 + Var ZIP2EXE_TEMP2 + + Function zip2exe.SetOutPath + !ifdef ZIP2EXE_INSTALLDIR_SKINS + StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Skins" + !else + StrCpy $ZIP2EXE_TEMP1 "$INSTDIR\Plugins" + !endif + ReadINIStr $ZIP2EXE_TEMP2 "$INSTDIR\winamp.ini" "Winamp" "${ZIP2EXE_INSTALLDIR_WINAMPMODE}" + StrCmp $ZIP2EXE_TEMP2 "" End + IfFileExists $ZIP2EXE_TEMP2 0 End + StrCpy $ZIP2EXE_TEMP1 $ZIP2EXE_TEMP2 + End: + SetOutPath $ZIP2EXE_TEMP1 + FunctionEnd + + !else + + Function zip2exe.SetOutPath + !ifdef ZIP2EXE_INSTALLDIR_PLUGINS + SetOutPath "$INSTDIR\Plugins" + !else + SetOutPath "$INSTDIR" + !endif + FunctionEnd + + !endif + +!endif + +!macro SECTION_BEGIN + + Section "" + + Call zip2exe.SetOutPath + +!macroend + +!macro SECTION_END + + SectionEnd + +!macroend \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/zip2exe/Classic.nsh b/libs/NSIS/NSIS-source/Contrib/zip2exe/Classic.nsh new file mode 100644 index 0000000000..de86c4916e --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/zip2exe/Classic.nsh @@ -0,0 +1,4 @@ +;Change this file to customize zip2exe generated installers with a classic interface + +Page directory +Page instfiles \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Contrib/zip2exe/Modern.nsh b/libs/NSIS/NSIS-source/Contrib/zip2exe/Modern.nsh new file mode 100644 index 0000000000..7fcfa71ead --- /dev/null +++ b/libs/NSIS/NSIS-source/Contrib/zip2exe/Modern.nsh @@ -0,0 +1,8 @@ +;Change this file to customize zip2exe generated installers with a modern interface + +!include "MUI2.nsh" + +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_LANGUAGE "English" \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/AdvSplash/advsplash.txt b/libs/NSIS/NSIS-source/Docs/AdvSplash/advsplash.txt new file mode 100644 index 0000000000..91a6fdf116 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/AdvSplash/advsplash.txt @@ -0,0 +1,51 @@ +AdvSplash.dll - small (5.5k), simple plugin that lets you throw +up a splash screen in NSIS installers with cool +fading effects (Win2000+) and transparency. + +To use: + +Create a .BMP file of your splash screen. +Create a .WAV file to play while your splash screen shows. (optional) + +Add the following lines to your .NSI file: + +Function .onInit + InitPluginsDir + File "/oname=$PluginsDir\spltmp.bmp" "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" + +; optional +; File /oname=$PluginsDir\spltmp.wav "my_splashsound.wav" + + advsplash::show 1000 600 400 -1 $PluginsDir\spltmp + + Pop $0 ; $0 has '1' if the user closed the splash screen early, + ; '0' if everything closed normally, and '-1' if some error occurred. + +FunctionEnd + +Calling format + advsplash::show Delay FadeIn FadeOut KeyColor FileName + +Delay - length to show the screen for (in milliseconds) +FadeIn - length to show the fadein scene (in ms) (not included in Delay) +FadeOut - length to show the fadeout scene (in ms) (not included in Delay) +KeyColor - color used for transparency, could be any RGB value + (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410), + use KeyColor=-1 if there is no transparent color in your image. +FileName - splash bitmap filename (without the .bmp). The BMP file used will be + this parameter.bmp, and the wave file used (if present) will be this + parameter.wav. + +(If you already have an .onInit function, put that in it) + +Note 1: fadein/fadeout supported only on win2k/winxp systems, all other systems +will show simple splash screen with Delay = Delay + FadeIn + FadeOut. Also, I've +noted my winXP uses no transparent color at 16 bpp, so at bpps lower than 32 +for images with transparent color no fading effect will occur. + +Note 2: the return value of splash is 1 if the user closed the splash +screen early (pop it from the stack) + +-Justin +Converted to a plugin DLL by Amir Szekely (kichik) +Fading and transparency by Nik Medved (brainsucker) \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/Banner/Readme.txt b/libs/NSIS/NSIS-source/Docs/Banner/Readme.txt new file mode 100644 index 0000000000..b114e5e770 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Banner/Readme.txt @@ -0,0 +1,47 @@ +BANNER PLUG-IN +-------------- + +The Banner plug-in shows a banner with customizable text. It uses the IDD_VERIFY dialog of the UI. + +There are three functions - show, getWindow and destroy. + +Usage +----- + +Banner::show "Text to show" + +[optional] Banner::getWindow + +Banner::destroy + +See Example.nsi for an example. + +Modern UI +--------- + +The Modern UI has two labels on the IDD_VERIFY dialog. To change all the texts, use: + +Banner::show /set 76 "Text 1 (replaces Please wait while Setup is loading...)" "Normal text" + +Custom UI +--------- + +If you have more labels on your IDD_VERIFY dialog, you can use multiple /set parameters to change the texts. + +Example: + +Banner::show /set 76 "bah #1" /set 54 "bah #2" "Normal text" + +The second parameter for /set is the ID of the control. + +Some More Tricks +---------------- + +If you use /set to set the main string (IDC_STR, 1030) you can specify a different string for the window's caption and for the main string. + +If you use an empty string as the main string (Banner::show "") the banner window will not show on the taskbar. + +Credits +------- + +A joint effort of brainsucker and kichik in honor of the messages dropped during the battle \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/BgImage/BgImage.txt b/libs/NSIS/NSIS-source/Docs/BgImage/BgImage.txt new file mode 100644 index 0000000000..7018570040 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/BgImage/BgImage.txt @@ -0,0 +1,92 @@ +BgImage.DLL - NSIS extension DLL +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Displays an image or a gradient with user defined texts and/or images behind the NSIS window. +Can also play WAVs. + +See Example.nsi for a usage example. + +Usage +~~~~~ + +1) Call SetBg to set the background +2) Call AddText, or AddImage to add texts and images +3) Call Redraw to update the background window +4) Optional - repeat steps 2-3 to add more images + -or- + call Clear and repeat steps 1-3 for a completely new background. +5) Call Destroy when the background is no longer required (.onGUIEnd for example) + +Notes +~~~~~ + +* This plugin requires NSIS 2.42 and above. + +* Do not call SetBg (which creates the window) from a section or a function called by a section. + BgImge must be run from the GUI thread as the installation thread is not built to handle GUI. + +Available functions +~~~~~~~~~~~~~~ + +SetBg [/FILLSCREEN|/TILED] path_to_bitmap +SetBg /GRADIENT R G B R G B + Sets the background and creates the window if necessary + Use /FILLSCREEN to make the image fill the screen + Use /TILED to set a tiled background + Use /GRADIENT to set a gradient background + + If SetReturn on was called returns "success" on the stack + or an error string if there was an error + + Do not use in .onInit! + +AddImage [/TRANSPARENT R G B] path_to_bitmap X Y + Adds an image to the background window at (X,Y) + X and Y can be negative to specify distance from right/bottom + Use /TRANSPARENT to make BgImage draw the image transparently + Define the transparent color using R G B + + If SetReturn on was called returns "success" on the stack + or an error string if there was an error + +AddText text font_handle R G B X Y X Y + Adds text to the background window + Use NSIS's CreateFont to create a font and pass it as font_handle + Use R G B to set the text color + The first X Y is for the top left corner of the text box + The second X Y is for the bottom right corner of the text box + X and Y can be negative to specify distance from right/bottoms + + If SetReturn on was called returns "success" on the stack + or an error string if there was an error + +Clear + Clears all of the current background, images and texts + +Destroy + Destroys the current background window + Destroy calls Clear automatically + +Sound [/WAIT|/LOOP] path_to_wav +Sound /STOP + Plays a wave file + Use /WAIT to wait for the sound to finish playing + Use /LOOP to loop the sound + Use Sound /STOP to stop the loop + +SetReturn on|off + Enable return values from SetBg, AddImage and AddText + Default value is off because all of the possible errors + are either things you should handle when debugging your script + such as "can't load bitmap" or errors you can do nothing about + such as "memory allocation error" + +Credits +~~~~~~~ + +Coded by Amir Szekely, aka KiCHiK + +Ximon Eighteen, aka Sunjammer - Fixed window title bar issues +iceman_k - Text idea and original implementation +Lajos Molnar, aka orfanik - Tile idea and original implementation +Jason Reis - Coding help \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/Dialer/Dialer.txt b/libs/NSIS/NSIS-source/Docs/Dialer/Dialer.txt new file mode 100644 index 0000000000..7e067d7655 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Dialer/Dialer.txt @@ -0,0 +1,121 @@ +DIALER PLUGIN +------------- + +Written by Amir Szekely aka KiCHiK +Readme by Joost Verburg + +The Dialer plugin for NSIS provides five functions related to internet connections. + +To download files from the internet, use the NSISdl plugin. + +USAGE +----- + +Example of usage: + +ClearErrors ;Clear the error flag +Dialer::FunctionName ;Call Dialer function +IfErrors "" +3 ;Check for errors + MessageBox MB_OK "Function not available" + Quit +Pop $R0 ;Get the return value from the stack +MessageBox MB_OK $R0 ;Display the return value + +EXAMPLE FUNCTION +---------------- + +; ConnectInternet (uses Dialer plugin) +; Written by Joost Verburg +; +; This function attempts to make a connection to the internet if there is no +; connection available. If you are not sure that a system using the installer +; has an active internet connection, call this function before downloading +; files with NSISdl. +; +; The function requires Internet Explorer 3, but asks to connect manually if +; IE3 is not installed. + +Function ConnectInternet + + Push $R0 + + ClearErrors + Dialer::AttemptConnect + IfErrors noie3 + + Pop $R0 + StrCmp $R0 "online" connected + MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet." + Quit ;Remove to make error not fatal + + noie3: + + ; IE3 not installed + MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now." + + connected: + + Pop $R0 + +FunctionEnd + +FUNCTIONS +--------- + +If a function is not available on the system, the error flag will be set. + +* AttemptConnect + + Attempts to make a connection to the Internet if the system is not connected. + + online - already connected / connection successful + offline - connection failed + + Requires Internet Explorer 3 or later + +* AutodialOnline + + Causes the modem to automatically dial the default Internet connection if the system + is not connected to the internet. If the system is not set up to automatically + connect, it will prompt the user. + + Return values: + + online - already connected / connection successful + offline - connection failed + + Requires Internet Explorer 4 or later + +* AutodialUnattended + + Causes the modem to automatically dial the default Internet connection if the system + is not connected to the internet. The user will not be prompted. + + Return values: + + online - already connected / connection successful + offline - connection failed + + Requires Internet Explorer 4 or later + +* AutodialHangup + + Disconnects an automatic dial-up connection. + + Return values: + + success - disconnection successful + failure - disconnection failed + + Requires Internet Explorer 4 or later + +* GetConnectedState + + Checks whether the system is connected to the internet. + + Return values: + + online - system is online + offline - system is offline + + Requires Internet Explorer 4 or later \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/InstallOptions/Changelog.txt b/libs/NSIS/NSIS-source/Docs/InstallOptions/Changelog.txt new file mode 100644 index 0000000000..27e6952521 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/InstallOptions/Changelog.txt @@ -0,0 +1,144 @@ +DLL version 2.47 (4/27/2007) +* Line breaks support in Link control +* Added HLine and VLine controls + +DLL version 2.46 (3/31/2007) +* Use installer's name for message boxes + +DLL version 2.45 (1/23/2007) +* Added FOCUS flag for setting focus to a control other than the first + +DLL version 2.44 (10/11/2005) +* Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id + +DLL version 2.43 (10/4/2005) +* Fixed alteration of the working directory by FileRequest +* Added WS_EX_LEFTSCROLLBAR in RTL mode + +DLL version 2.42 (1/21/2005) +* Added TRANSPARENT flag for BITMAP fields (funded by Chris Morgan) + +DLL version 2.41 (8/5/2004) +* Bitmaps are now automatically centered +* Fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages +* Fixed a rare freeze + +DLL version 2.4 (1/4/2004) +* Initial focus is set in "initDialog" making it possible to override it from NSIS prior to calling "show" +* When initial focus is to a Text field InstallOptions now follows standard Windows behaviour by having the text selected +* Label and other static fields no longer have State= written to the INI file when leaving the dialog +* NOTIFY flag can now be used with Link fields (State should be omitted in this case) +* Likewise, State can now be used with Button fields (behaves the same as with Link fields) +* NOTIFY flag can also now be used with ListBox and DropList fields to have NSIS notified when the selection changes +* Meaning of RIGHT flag is now reversed in right-to-left language mode +* HSCROLL and VSCROLL flags are no longer restricted to Text fields +* Various Link field fixes + +DLL version 2.3 (12/4/2003) +* Added new control type "Button" +* Added new flag "NOTIFY" +* Added new flag "NOWORDWRAP" for multi-line text boxes +* Reduced size down to 12K +* Better RTL support + +DLL version 2.2 (6/10/2003) +* Added New control type LINK +* \r\n converts to newline in Multiline edit box +* Support for multiline edit box +* Better tab order in DirRequest and FileRequest +* Added READONLY option to text box +* Minor fixes + +DLL version 2.1 (3/15/2003) +* \r\n converts to newline in both label Text and ValidateText +* New browse dialog style (modern) +* Word wrapping for check boxes and radio buttons +* No ugly border for edit fields under XP +* Scroll bar for list boxes +* Works with SetStaticBkColor +* DISABLED dir and file request fields now disable the browse button too +* No more STATE value for labels +* Minor fixes + +DLL version 2.0 (1/4/2003) +* Supports custom font and DPI settings (by Joost Verburg) +* INI files should contain dialog units now, no pixels (by Joost Verburg) +* RESIZETOFIT flag for Bitmap control (by Amir Szekely) +* New documentation (by Joost Verburg) +* New GROUP/NOTABSTOP/DISABLED flags + +DLL version 1.7 beta (11/2/2002) +* Added initDialog and show DLL functions + +DLL version 1.6 beta (9/30/2002) +* CancelConfirmIcon becomes CancelConfirmFlags and can now take the other common MessageBox flags + +DLL version 1.5 beta (9/26/2002) +* Made close [x] button behave like Cancel (thanks brainsucker) + +DLL version 1.4 beta (9/4/2002) +* Added Icon and Bitmap controls (by Amir Szekely) + +DLL version 1.3 beta (8/15/2002) +* Added CancelShow (by ORTIM) +* Added pixel transformation for widgets (by ORTIM) + +DLL version 1.2 beta (7/31/2002) +* Added CancelEnabled (by ORTIM) +* Added CancelConfirmCaption and CancelConfirmIcon (by Amir Szekely) + +DLL version 1.1 beta (7/22/2002) +* Font is now taken from the main NSIS window (by Amir Szekely) + +DLL version 1.0 beta (12/16/2001) +* Moved to DLL, no longer need parentwnd ini writing +* Tons of changes - no longer fully compatible (see source for a big list) +* removed support for silent installers (it seems the old version would bring up it's own dialog) + +version 1.4 (11/18/2001) +* Added Listbox controls. +* Added MULTISELECT flag. +* Made the HWND list for the parent window controls dynamically allocated. This prevents a crash if NSIS ever gets more than 150 controls on it's main window. +* The TEXT property of DirRequest control can be used to specify an initial directory. The current directory is automatically selected when clicking the browse button of the DirRequest control. +* Added ROOT property to DirRequest which can be used to set the root directory (mostly due to felfert) +* Edit controls will now auto scroll (thanks felfert) +* Fixed a problem where the window wouldn't draw properly on some systems (thanks felfert) + +version 1.3 (11/03/2001) +* Got rid of the call to RedrawWindow() because it's no longer needed with the WS_CLIPCHILDREN flag for NSIS. +* Removed a few hardcoded limits of buffer sizes +* Added Checkbox and RadioButton controls +* Added RIGHT and CHECKED flags + +version 1.2.2 (10/30/2001) +* Additional size reductions. Further reduced the size down to 8k. +* The text parameter to a combobox can now be used to specify the initial value +* Changed from InvalidateRect() to RedrawWindow() to force a redraw after a browse dialog +* On startup, set the flags of the NSIS window to include WS_CLIPCHILDREN. Otherwise, our controls don't get drawn right. + +version 1.2.1 (10/28/2001) +* Bug fix. ControlID for the caption and the OK button were reused by the first two controls. (Thanks Schultz) + +version 1.2j (10/28/2001) +* 8.5kb from 44kb. heh. (by Justin Frankel) + +version 1.2 (10/28/2001) +* Still 44k +* Added the "FileRequest" and "DirRequest" control types (thanks Schultz) +* Added "MinLen", "MaxLen", and "ValidateText" properties to fields +* Added "Flags" as a way to specify additional parameters for controls +* Few more changes to the documentation +* Cleaned the code in a few places...still trying to make it smaller + +version 1.1 (10/27/2001) +* Added the "Title" option (thanks Alex) +* Moved the OK button so it is in the same location as the buttons on the main NSIS window (thanks Alex) +* Pressing "ENTER" will now automatically select the OK button (thanks Alex) +* Slightly improved the documentation + +version 1.01 (10/25/2001) +* Fixed the SetFocus loop so it exits after the first control like it was supposed to +* Added the license to the documentation + +version 1.0 (10/25/2001) +* Barely qualifies as a distribution diff --git a/libs/NSIS/NSIS-source/Docs/InstallOptions/Readme.html b/libs/NSIS/NSIS-source/Docs/InstallOptions/Readme.html new file mode 100644 index 0000000000..6388d5fddf --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/InstallOptions/Readme.html @@ -0,0 +1,909 @@ + + + + InstallOptions 2 + + + + + + + +
+

+ InstallOptions 2

+
+

+ The InstallOptions plug-in is deprecated. For new scripts, it is recommended to + use the new nsDialogs plug-in instead.

+
+
+

+ Introduction

+
+

+ InstallOptions is an NSIS plugin which allows you to create custom pages for NSIS + installers, to prompt the user for extra information.

+

+ The dialogs created by InstallOptions are based on INI files which define the controls + on the dialog and their properties. These INI files can be modified from the script + to adjust the dialogs at runtime.

+

+ The format of INI files is described in a + Wikipedia article.

+
+

+ INI file structure

+
+

+ The INI file has one required section. This section includes the number of controls + to be created as well as general window attributes. The INI file also includes a + variable number of Field sections which are used to create the controls to be displayed.

+

+ The required section is named "Settings". It can contain the + following values:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ NumFields + (required) + The number of control elements to be displayed on the dialog window.
+ Title + (optional) + If specified, gives the text to set the titlebar to. Otherwise, the titlebar text + is not changed.
+ CancelEnabled + (optional) + If specified, overrides NSIS settings and enables or disables the cancel button. + If set to 1, the cancel button will be enabled. If set to 0, the cancel button will + be disabled.
+ CancelShow + (optional) + If specified, overrides NSIS settings and shows or hides the cancel button If set + to 1, the cancel button will be shown. If set to 0, the cancel button will be hidden.
+ BackEnabled + (optional) + If specified, overrides NSIS settings and enables or disables the back button. If + set to 1, the back button will be enabled. If set to 0, the back button will be + disabled.
+ CancelButtonText + (optional) + Overrides the text for the cancel button. If not specified, the cancel button text + will not be changed.
+ NextButtonText + (optional) + Overrides the text for the next button. If not specified, the next button text will + not be changed.
+ BackButtonText + (optional) + Overrides the text for the back button. If not specified, the back button text will + not be changed.
+ Rect + (optional) + Overrides the default rect ID to run over. This will make IO resize itself according + to a different rect than NSIS's dialogs rect.
+ RTL + (optional) + If 1 is specified the dialog will be mirrored and all texts will be aligned to the + right. The INSTALLOPTIONS_EXTRACT macros automatically set this field to the right + value for the current installer language as given by the NSIS string $(^RTL).
+ State + (output) + This is not something you have to supply yourself but is set by InstallOptions, + before calling your custom page validation function, to the field number of the + custom Button control (or other control having the Notify flag) the user pressed, + if any.
+

+ Each field section has the heading "Field #" where # must be sequential + numbers from 1 to NumFields. Each Field section can contain the following values:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Type + (required) + Type of control to be created. Valid values are "Label", "Text", + "Password", "Combobox", "DropList", + "Listbox", "CheckBox", "RadioButton", + "FileRequest", "DirRequest" "Icon", + "Bitmap", "GroupBox", "HLine", + "VLine", "Link" or "Button".
+
+ A "Label" is used to display static text. (i.e. a caption for + a textbox)
+ A "Text" and "Password" accept text input + from the user. "Password" masks the input with * characters.
+ A "Combobox" allows the user to type text not in the popup list, + a "Droplist" only allows selection of items in the list.
+ A "Listbox" shows multiple items and can optionally allow the + user to select more than one item.
+ A "CheckBox" control displays a check box with label.
+ A "RadioButton" control displays a radio button with label.
+ A "FileRequest" control displays a textbox and a browse button. + Clicking the browse button will display a file requester where the user can browse + for a file.
+ A "DirRequest" control displays a textbox and a browse button. + Clicking the browse button will display a directory requester where the user can + browse for a directory.
+ An "Icon" control displays an icon. Use no Text to use the installer + icon.
+ A "Bitmap" control displays a bitmap.
+ A "GroupBox" control displays a frame to group controls.
+ A "HLine" control displays a horizontal line to separate controls.
+ A "VLine" control displays a vertical line to separate controls.
+ A "Link" control displays a static hot text. When the user clicks + the control the contents of State (e.g. http://...) will be executed + using ShellExecute. Alternatively State can be omitted and the + NOTIFY flag used to have your NSIS script called. See the "NOTIFY" + flag below for more information.
+ A "Button" control displays a push button that can be used in + the same way as the "Link" control above.
+ Text + (optional) + Specifies the caption of a label, checkbox, or radio button control. For DirRequest + control this specifies the title of the browse dialog. For icon and bitmaps control + this specifies the path to the image.
+
+ Note: For labels, \r\n will be converted to a newline. To use a + back-slash in your text you have to escape it using another back-slash - \\. Described + below are NSIS functions for converting text to/from this + format.
+ State + (optional) + Specifies the state of the control. This is updated when the user closes the window, + so you can read from it from NSIS. For edit texts and dir and file request boxes, + this is the string that is specified. For radio button and check boxes, this can + be '0' or '1' (for unchecked or checked). For list boxes, combo boxes and drop lists + this is the selected items separated by pipes ('|'). For Links and Buttons this + can specify something to be executed or opened (using ShellExecute).
+
+ Note: For Text fields with the MULTILINE flag, \r\n will be converted + to a newline. To use a back-slash in your text you have to escape it using another + back-slash - \\. Described below are NSIS functions for + converting text to/from this format.
+ ListItems + (optional) + A list of items to display in a combobox, droplist, or listbox.
+ This is a single line of text with each item separated by a pipe character '|'
+ MaxLen + (optional) + Causes validation on the selected control to limit the maximum length of text.
+ If the user specifies more text than this, a message box will appear when they click + "OK" and the dialog will not be dismissed.
+ You should not use this on a "combobox" since the user can not + control what is selected.
+ This should be set to a maximum of 260 for "FileRequest" and + "DirRequest" controls.
+ Ignored on "Label" controls.
+ MinLen + (optional) + Causes validation on the selected control to force the user to enter a minimum amount + of text.
+ If the user specifies less text than this, a message box will appear when they click + "OK" and the dialog will not be dismissed.
+ Unlike MaxLen, this is useful for "Combobox" controls. By setting + this to a value of "1" the program will force the user to select an item.
+ Ignored on "Label" controls.
+ ValidateText + (optional) + If the field fails the test for "MinLen" or "MaxLen", + a messagebox will be displayed with this text.
+
+ Note: \r\n will be converted to a newline, two back-slashes will + be converted to one - \\. Described below are NSIS functions + for converting text to/from this format.
+ Left
+ Right
+ Top
+ Bottom
+ (required) + The position on the dialog where this control appears. All sizes should be set in + dialog units. To get the right dimensions for your controls, design your dialog + using a resource editor and copy the dimensions to the INI file.
+
+ Note: You can specify negative coordinates to specify the distance + from the right or bottom edge.
+
+ Note (2): For combobox or droplist, the "bottom" + value is not used in the same way.
+ In this case, the bottom value is the maximum size of the window when the pop-up + list is being displayed. All other times, the combobox is automatically sized to + be one element tall. If you have trouble where you can not see the combobox drop-down, + then check the bottom value and ensure it is large enough. A rough guide for the + height required is the number of items in the list multiplied by 8, plus 20.
+
+ Note (3): FileRequest and DirRequest controls will allocate 15 + dialog units to the browse button. Make this control wide enough the contents of + the textbox can be seen.
+ Filter + (optional) + Specifies the filter to be used in the "FileRequest" control.
+ This is constructed by putting pairs of entries together, each item separated by + a | character.
+ The first value in each pair is the text to display for the filter.
+ The second value is the pattern to use to match files.
+ For example, you might specify:
+ Filter=Text Files|*.txt|Programs|*.exe;*.com|All Files|*.*
+ If not specified, then the filter defaults to All Files|*.*
+
+ Note: you should not put any extra spaces around the | characters.
+ Root + (optional) + Used by DirRequest controls to specify the root directory of the + search. By default, this allows the user to browse any directory on the computer. + This will limit the search to a particular directory on the system.
+ Flags + (optional) + This specifies additional flags for the display of different controls. Each value + should be separated by a | character, and you should be careful not to put any spaces + around the | character.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Value + Meaning
+ REQ_SAVE + This causes "FileRequest" controls to display a Save As dialog. + If not specified, an Open dialog is used.
+ FILE_MUST_EXIST + Used by "FileRequest" to determine if the selected file must + exist.
+ This only applies if an "Open" dialog is being displayed.
+ This currently does not force the file to exist other than through the browse button.
+ FILE_EXPLORER + Used by "FileRequest", enables new file request look (recommended)
+ FILE_HIDEREADONLY + Used by "FileRequest", hides "open read only" checkbox + in open dialog.
+ WARN_IF_EXIST + Used by "FileRequest" to display a warning message if the selected + file already exists.
+ The warning message is only displayed for files selected with the browse button.
+ PATH_MUST_EXIST + Used by "FileRequest" to force the path to exist. Prevents the + user from typing a non-existent path into the browse dialog window.
+ This only validates path's selected with the browse button.
+ PROMPT_CREATE + Used by "FileRequest" to display a warning if the selected file + does not exist. However, it still allows the user to select the file.
+ This only displays the warning for files selected with the browse button.
+ Doesn't work along with REQ_SAVE.
+ RIGHT + Used by "Checkbox" and "Radiobutton" controls + to specify you want the checkbox to the right of the text instead of the left as + is the default.
+ MULTISELECT + Used by "Listbox" controls. Turns string selection on or off + each time the user clicks or double-clicks a string in the list box. The user can + select any number of strings. If this flag and EXTENDEDSELCT are not specified, + only one item can be selected from the list.
+ EXTENDEDSELCT + Used by "Listbox" controls. Allows multiple items to be selected + by using the SHIFT key and the mouse or special key combinations. If this flag and + MULTISELECT are not specified, only one item can be selected from the list.
+ RESIZETOFIT + This causes "Bitmap" controls to resize the image to the size + of the control. Also useful to support custom DPI settings. Without this, the image + will be centered within the specified area.
+ TRANSPARENT + Used by "Bitmap" controls. Hides every pixel with the same color + as of the top left pixel. This allows to see-through to controls behind it. This + flag doesn't work well with a combination of the RESIZETOFIT flag and bitmaps with + more than 256 colors.
+ GROUP + Add this flag to the first control of a group of controls to group them. Grouping + controls allows you to create multiple groups of radio button and makes keyboard + navigation using arrow keys easier.
+ FOCUS + Sets focus on the specified control, instead of the first focusable control. If + more than one field is specified with this flag, only the first one will receive + focus.
+ NOTABSTOP + Do not stop on the control when the user pressed the Tab key. Add NOTABSTOP to all + controls of a group except the first one to allow navigation between groups with + the Tab key.
+ DISABLED + Causes a control to be disabled.
+ ONLY_NUMBERS + Used by "Text" controls. Forces the user to enter only numbers + into the edit box.
+ MULTILINE + Used by "Text" controls. Causes the control to accept multiple-lines.
+ WANTRETURN + Used by "Text" controls with multiple-line. Specifies that a + carriage return be inserted when the user presses the ENTER key while entering text + into the text box.
+ NOWORDWRAP + Used by "Text" controls with multiple-line. Disables the word-wrap + that occurs when long lines are entered. Long lines instead scroll off to the side. + Specifying the HSCROLL flag also has this effect.
+ HSCROLL + Show a horizontal scrollbar. When used by "Text" controls with + multiple-lines this also disables word-wrap.
+ VSCROLL + Show a vertical scrollbar.
+ READONLY + Used by "Text" controls. Prevents the user from entering or editing + text in the edit control, but allow the user to select and copy the text.
+ NOTIFY + Used by "Button", "Link", "CheckBox", + "RadioButton", "ListBox" and "DropList" + controls. Causes InstallOptions to call your NSIS custom page validation/leave function + whenever the control's selection changes. Your validation/leave function can read + the "State" value from the "Settings" section + to determine which control caused the notification, if any, and perform some appropriate + action followed by an Abort instruction (to tell NSIS to return to the page). The + Examples\InstallOptions folder contains an example script showing how this might + be used.
+
+ TxtColor + (optional) + Used by Link controls to specify the foreground color of the text. + Format: 0xBBGGRR (hexadecimal).
+ HWND
+ HWND2
+ (output) + After initDialog returns, this will contain the HWND of the control created by this + field. It can be used instead of FindWindow and GetDlgItem. HWND2 contains the HWND + of an additional control, such as the browse button.
+
+

+ Header file

+
+

+ The InstallOptions header files provides macros and functions to easily create custom + dialogs. You can include it on the top of your script as follows: +

+!include InstallOptions.nsh
+
+
+

+ Creating dialogs

+
+

+ Extracting the INI file

+
+

+ First, you have to extract your InstallOptions INI files in the .onInit function + (or un.onInit for the uninstaller) using the INSTALLOPTIONS_EXTRACT macro. The files + will be extracted to a temporary folder (the NSIS plug-ins folder) that is automatically + created.

+
+Function .onInit
+  !insertmacro INSTALLOPTIONS_EXTRACT "ioFile.ini"
+FunctionEnd
+
+

+ If the INI file is located in another directory, use INSTALLOPTIONS_EXTRACT_AS. + The second parameter is the filename in the temporary folder, which is the filename + that should be used as input for the other macros.

+
+Function .onInit
+  !insertmacro INSTALLOPTIONS_EXTRACT_AS "..\ioFile.ini" "ioFile.ini"
+FunctionEnd
+
+
+

+ Displaying the dialog

+
+

+ You can call InstallOptions in a page function defined with the Page or UninstPage + command. Check the NSIS documentation (Scripting Reference -> Pages) for information + about the page system.

+
+Page custom CustomPageFunction
+

+ To display the dialog, use the INSTALLOPTIONS_DISPLAY macro:

+Function CustomPageFunction ;Function name defined with Page command
+  !insertmacro INSTALLOPTIONS_DISPLAY "ioFile.ini"
+FunctionEnd
+
+
+
+

+ User input

+
+

+ To get the input of the user, read the State value of a Field using the INSTALLOPTIONS_READ + macro:

+
+!insertmacro INSTALLOPTIONS_READ $VAR "ioFile.ini" "Field #" "Name"
+
+
+

+ Writing to INI files

+
+

+ The INSTALLOPTIONS_WRITE macro allows you to write values to the INI file to change + texts or control settings at runtime: +

+!insertmacro INSTALLOPTIONS_WRITE "ioFile.ini" "Field #" "Name" "Value"
+
+
+

+ Escaped values

+
+

+ Some InstallOptions values are escaped (in a similar manner to "C" strings) + to allow characters to be used that are not normally valid in INI file values. The + affected values are:

+
    +
  • The ValidateText field
  • +
  • The Text value of Label fields
  • +
  • The State value of Text fields that have the MULTILINE flag
  • +
+

+ The escape character is the back-slash character ("\") and the available + escape sequences are:

+ + + + + + + + + + + + + + + + + +
+ "\\" + Back-slash
+ "\r" + Carriage return (ASCII 13)
+ "\n" + Line feed (ASCII 10)
+ "\t" + Tab (ASCII 9)
+

+ The INSTALLOPTIONS_READ_CONVERT and INSTALLOPTIONS_WRITE_CONVERT macros automatically + convert these characters in installer code. In uninstaller code, use INSTALLOPTIONS_READ_UNCONVERT + and INSTALLOPTIONS_WRITE_UNCONVERT.

+

+ To use these macros in your script, the conversion functions need to be included:

+
+;For INSTALLOPTIONS_READ_CONVERT
+  !insertmacro INSTALLOPTIONS_FUNCTION_READ_CONVERT
+;For INSTALLOPTIONS_WRITE_CONVERT
+  !insertmacro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT
+;For INSTALLOPTIONS_READ_UNCONVERT
+  !insertmacro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT
+;For INSTALLOPTIONS_WRITE_UNCONVERT
+  !insertmacro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT
+
+
+

+ Input validation

+
+

+ To validate the user input (for example, to check whether the user has filled in + a textbox) use the leave function of the Page command and Abort when the validation + has failed:

+
+Function ValidateCustom
+
+  !insertmacro INSTALLOPTIONS_READ $R0 "test.ini" "Field 1" "State"
+  StrCmp $R0 "" 0 +3
+    MessageBox MB_ICONEXCLAMATION|MB_OK "Please enter your name."
+    Abort
+
+FunctionEnd
+
+
+

+ Return value

+
+ After a dialog is created (using display or show), a return value is available:

+
    +
  • success - The user has pressed the Next button
  • +
  • back - The user has pressed the Back button
  • +
  • cancel - The user has pressed the Cancel button
  • +
  • error - An error has occurred, the dialog cannot be displayed.
  • +
+

+ You only have to check this value if you need something really special, such as + doing something when the user pressed the Back button.

+

+ If you need the return value, use the INSTALLOPTIONS_DISPLAY_RETURN or INSTALLOPTIONS_SHOW_RETURN + macro. The return value will be added to the stack, so you can use the Pop command + to get it.

+
+

+ Reserve files

+
+

+ When using solid compression, it's important that files which are being extracted + in user interface functions are located before other files in the data block. Otherwise + there may be a delay before a page can be displayed.

+

+ To ensure that this is the case, add ReserveFile commands for InstallOptions and + the INI files before all sections and functions:

+
+ReserveFile "test.ini"
+ReserveFile /plugin InstallOptions.dll
+
+
+

+ Fonts and colors

+
+

+ To customize fonts or colors on InstallOptions dialogs, the INSTALLOPTIONS_INITDIALOG + and INSTALLOPTIONS_SHOW macro can be used.

+

+ INSTALLOPTIONS_INITDIALOG creates the dialog in memory, but does not show it. After + inserting this macro, you can set the fonts and colors, and then insert INSTALLOPTIONS_SHOW + to show the dialog.

+

+ The INSTALLOPTIONS_INITDIALOG macro also pushes the HWND of the custom dialog to + the stack. Control HWND's are available for each control in the HWND entry of the + corresponding field in the INI file.

+

+ Example of using a custom font:

+
+Var HWND
+Var DLGITEM
+Var FONT
+
+Function FunctionName ;FunctionName defined with Page command
+
+  !insertmacro INSTALLOPTIONS_INITDIALOG "ioFile.ini"
+  Pop $HWND ;HWND of dialog
+    
+  !insertmacro INSTALLOPTIONS_READ $DLGITEM "ioFile.ini" "Field 1" "HWND"
+    
+  ;$DLGITEM contains the HWND of the first field
+  CreateFont $FONT "Tahoma" 10 700 
+  SendMessage $DLGITEM ${WM_SETFONT} $FONT 0
+        
+  !insertmacro INSTALLOPTIONS_SHOW
+
+FunctionEnd
+
+
+

+ Credits

+
+

+ Original version by Michael Bishop
+ DLL version by Nullsoft, Inc.
+ DLL version 2 by Amir Szekely, ORTIM, Joost Verburg
+ New documentation by Joost Verburg

+
+

+ License

+
+
+Original version Copyright © 2001 Michael Bishop
+DLL version 1 Copyright © 2001-2002 Nullsoft, Inc., ORTIM
+DLL version 2 Copyright © 2003-2026 Amir Szekely, Joost Verburg, Dave Laundon
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented;
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+ + diff --git a/libs/NSIS/NSIS-source/Docs/Math/Math.txt b/libs/NSIS/NSIS-source/Docs/Math/Math.txt new file mode 100644 index 0000000000..f351f75ad0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Math/Math.txt @@ -0,0 +1,197 @@ +Math::Script NSIS plugin. + +C-like style scripting (operators at least). +Tip1: plugin watches the case of the letters. +Tip2: plugin makes almost no error checks. So YOU should check your script +twice before run :) + +New HOW TO USE: run the MathTest.Exe, and try yourself. After spending +some minutes your should be able to write your script by yourself. +To include it to your NSIS script just insert that: + Math::Script "YourScript1" + Math::Script "YourScript2" + Math::Script "YourScriptFinal" + +How to use it? Simple: + Strcpy $0 "Brainsucker" + Math::Script "a = 'Math'; B = 'Script'; r0 += ' wants to use ' + a + '::' + b +'!'" + DetailPrint "$0" +That string will fill r0 with some stuff. + +Here are some other samples: + 10! (factorial, r0 will contain '10! = 362880'): + r0 = '10! = ' + (1*2*3*4*5*6*7*8*9) + the same: + a = b = 1; #{++a <= 10, b = b*a}; r0 = (a-1) + '! = ' + b + Some floating point: + Strcpy $R0 "1e1" + Math::Script "pi = 3.14159; R1 = 2*pi*R0; r0 = 'Length of circle with radius ' + R0 + ' is equal to ' + R1 + '.'" + Detailprint "$0" + +Ok. Variables. +NSIS: r0-r9 -> $0-$9. R0-R9 -> $R0-$R9. +Also CL ($CMDLINE), ID ($INSTDIR), OD ($OUTDIR), LG ($LANG), ED ($EXEDIR). +User definable: name starting from character, up to 28 letters long. + +Stacks. Two stacks are supported: NSIS stack and plugin's own stack. I see no +reasons for using plugin stack, but if you will, remember - the plugin stores +variables used at function to that stack before function execution, and restores +after execution. Even less I recommend you to use NSIS stack. You should use it +only for input/output. +How to use? It's variable styled. Plugins stack is associated with S variable, +and NSIS stack associated with NS variable. To push to stack just do "S=0" or +"NS=0", to pop from stack "a=S" or "b=NS". Combined operations supported too: +"S += 1.5" will increment value at the top of stack by 1.5. + +Supported types: int (in fact that is __int64), float (double in fact), +string. +Int: just numbers, may include sign. +Float: -123.456, 123.456e-78, 123e-45 +String: something in quotes ("", '', ``). + +There is also an array type. It is actually a reference type, so if b is array +and you will perform "a=b", the a and b will reference a single array. +To create a copy of array, use ca func: dest = ca(source). Btw - you couldn't +control dimensions of arrays - they are autosized. +To declare array: +a = {}; +To declare array and initialize some items with values: +{"Hello!", "Use", "mixed types", 1.01e23, "like that" ,1234}; +To access array: +a[index] = "Cool"; + +Also [] operation could be used to strings. str[x] gives you a single char with +index x (zero-based) as new string. str[-x] - the same, but x counts from the +string end (so the last char is -1). str[x,y] gives you characters in range x-y +(inclusive), both x and y could be <0 - in this case they counted from the end +of the string. + +The function could be useful - is conversion of arrays to strings and back. +Example: +a = a("Hello"); str = s(a); +After running such script array a will contain 6 integers (chars and last zero +- end of string), and str will contain your string back. + +Operators (some binary, some unary): +>>= <<= -= += /= *= |= &= ^= %= -- ++ >> << && || <= =< >= => != == += + - * / % < > & | ^ ~ ! +Only some are applicable to float (logic & arithmetic) and string (+ and logic) +of course. +Additional case: reference/de-reference operators (& and *). & will +give you the reference to argument which should be a variable (NSIS, user, array +item, stack), and * will convert it back to original variable. For example +(a=&b; *a=10) will set b to 10. Expression (*&a) is equal to simple (a). + +Script is set of expressions (mathematical in general) delimited with ';'. +Processing is mathematically right (2+2*2 will give 6), operations are performed +in a C like order (precedence). + +Flow control: + if-then-else like: #[if-expression, then-expr, else-expr] + example: + #[a==0, b=1; c=2, b *= (--c); c/=10] + C eq: + if (a==0) { b=1; c=2;} else { b*=(c++);c-=10; } + while (expr) do; like #{expr, do} + example: + #{(c<1.1e25)&&(b < 10), b++; c*=1.23} + C eq: + while ((c<1.1e25)&&(b<10)) { b++; c*=1.23; } + +WATCH OUT! Comma (,) separates if-expr, then-expr, and else-expr from each +other. All sub-expressions separated by (;) are the part of one expression, +and the result of the last one of these sub-exprs gives you the result of +expression. + +All the stuff (like variables and functions) will be saved between calls. + +Functions: + type conversions: + l(string) returns the length of string or array argument + s(source) converts source to string type + i(source) converts source to int type + f(source) converts source to float type + c(source) if source is string, returns int value of first + char, if source is int, returns string which consists + of a single char (source) (+0 terminator). + a(source) converts source to array (only string supported) + ff(float, format) converts float to string, with format + options. + options = precision + flags. + Precision shows how many digits after decimal point + will be shown. Flags: + 16 (or 0x10) - No Exponential View + (number will be shown as 123.123) + 32 (or 0x20) - Only exponential view + (number will be shown as 123.12e123) + 64 (or 0x40) - use 'E' character instead of 'e' + By default the plugin decides itself how to show your + number. + + math (description of all these functions is available at MSDN, use the + second given name for search): + sin(x), sin Sine of argument + cos(x), cos Cosine of argument + cel(x), ceil Ceil of argument (no fract. part) + csh(x), cosh Hyperbolic Cosine of Argument + exp(x), exp Exponential + abs(x), abs Absolute value (warning: float) + flr(x), floor Floor of argument (no fract. part) + asn(x), asin ArcSine of argument + acs(x), acos ArcCosine of argument + atn(x), atan ArcTangent of argument + ln(x), log Exponential Logarithm + log(x), log10 Decimal logarithm + snh(x), sinh Hyperbolic Sine of Argument + sqt(x), sqrt Square root of argument + tan(x), tan Tangent of argument + tnh(x), tanh Hyperbolic tangent of argument + + functions taking two arguments + at2(x, y) atan2 Arctangent of the value (y/x) + pow(x, y) pow power, x^y + fmd(x, y) fmod floating point remainder + fex(x, o) frexp Gets the mantissa (result = r) + and exponent (o) of floating-point + number (x): x = r*(2^o) + mdf(x, o) modf Splits a floating-point value into + fractional and integer parts. + +User-defined functions. +It's very simple. Example: + test(a,b) (a+b); +After that test(1,2) will give you 3. + test2(a,b) (a=a+b; b *= a); +The result of function is always the result of last expression. +As said before it better not to use stack (S) in between function calls. +It will be better to develop variable-safe functions, i.e. functions which will +not corrupt variables. For this you should either push/pop them to stack, or +declare as additional arguments, which will never be used. Example: + test3(a,b,c) (c=10; #{--c > 0, a=sqrt(a*b)}; a) +No matter how many arguments will be passed to function, the values of all three +vars (a,b,c) will be saved. +Such variable-safe functions could be recursive: + Math::Script 'rec(a) (#[a > 0, rec(a-1), 0]+a);' + Math::Script 'R1 = rec(10)' +will set R1 to right result 55. +Sometimes functions will need to return more than one value, in this case you +could declare argument as referent (b at example): + test4(a, &b) (*b = a*a; a*a*a) +In this case test4 will return a^3, and if we will call it like that test4(a,c), +it will place a^2 to c. BUT! Note: you should use de-referencer (*) with variable, +at example *b. CAUTION: never use the same variable as function internal reference +variable and external argument variable (for example test4(a,b)). It will surely +fail. Also: if you declared argument as reference - you should never supply +a constant expression to it. It could be either array item (array[1]), NSIS +register R0, any of the user variables (beside the variable with the same name:), +but never the constant. + +Another may-be-useful possibility is to redeclare the function (the usual +declaration at the time when function already defined will simply call that +function). For such task you could use "#name", like "func()(1); #func()(2);". +But beware, function declaration occurs at time of parsing, so it's not possible +to perform flow controlled declaration. +SUCH IS NOT POSSIBLE: "#[a<0, #func()(1), #func()(2)]" +IT WILL SIMPLY DEFINE #func as (2), as the latest variant. + +(c) Nik Medved (brainsucker) \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/License.txt b/libs/NSIS/NSIS-source/Docs/Modern UI 2/License.txt new file mode 100644 index 0000000000..4534e07f04 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Modern UI 2/License.txt @@ -0,0 +1,10 @@ +Copyright 2002-2026 Joost Verburg + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any distribution. \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/Readme.html b/libs/NSIS/NSIS-source/Docs/Modern UI 2/Readme.html new file mode 100644 index 0000000000..e33bc21c74 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Modern UI 2/Readme.html @@ -0,0 +1,1162 @@ + + + + NSIS Modern User Interface - Documentation + + + + + + + + + + + + +
+ +

+ [Expand all]   [Collapse + all]

+
+

+ Introduction

+
+

+ The Modern UI provides a user interface for NSIS installers with a modern wizard + style, similar to the wizards of recent Windows versions. It is based on the basic + user interface that is provided by the NSIS compiler itself and extends it with + more interface features and pages.

+

+ All standard NSIS pages (such as the pages to select components and the installation + folder) are supported as well as a number of additional pages. The welcome page + allows you to provide an introduction to the installation process, while the finish + page provides a way to let the user decide what steps should be performed after + the setup wizard is closed (for example, whether the application should be started + immediately). A finish page can also be used to ask for a system restart is necessary.

+

+ Open/Close section + Screenshots

+
+

+

+
+
+

+ Modern UI 2.1

+
+

+ This new version makes it easier to customize pages, because the same method can + be used to  change standard NSIS pages as well as additional pages provided + by the Modern UI. It is now also possible for other NSIS plug-ins to add new pages + to the Modern UI. You can expect to see examples of this soon.

+

+ The welcome and finish page are no longer implemented using InstallOptions. Instead, + the new nsDialogs plug-in is used. nsDialogs allows you to create custom pages or + customize existing pages directly from the script.

+

+ To upgrade a Modern UI 1.8 script, you should:

+
    +
  • Insert the MUI2.nsh header file instead of MUI.nsh.
  • +
  • The macros for InstallOptions have been moved to a separate header file unrelated + to the Modern UI. If you are still using InstallOptions for custom pages, insert + InstallOptions.nsh and use the INSTALLOPTIONS_* macros instead of the MUI_INSTALLOPTIONS_* + macros. The macros themselves have remained the same.
  • +
  • Rewrite customization code for the Modern UI 1.8 welcome and finish pages in which + the InstallOptions INI file is used. nsDialogs commands should be used instead.
  • +
  • Use the standard NSIS method to escape special characters in all texts. For example, + $\r$\n creates newline.
  • +
+
+

+ Script header

+
+

+ The settings for the Modern UI should be inserted in the header of the script file. + It's important to follow the same order as the items below. For example, + interface settings should be defined before you insert pages, because the pages + depend on the interface configuration. It may be useful to look at the + example scripts too see how this is done in actual script files.

+

+ Parameters are given in this format: required (option1 | option2) + [optional]

+
+

+ 1. Header file

+
+

+ First of all, add this line to the top of script to include the Modern UI:

+
+!include MUI2.nsh
+
+
+

+ 2. Interface configuration

+
+

+ Then, you may want to use interface settings to change the look and feel of the + installer. These settings apply to all pages.

+ The interface settings provided by the NSIS compiler itself (such as LicenseText, + Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern + UI provides equalivent or extended versions of these settings.

+ Examples:

+
+!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
+!define MUI_UI "myUI.exe" ;Value
+!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors
+
+

+ Open/Close section + Interface settings

+
+

+ Open/Close section + Page header

+
+

+ MUI_ICON icon_file
+ The icon for the installer.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico

+

+ MUI_UNICON icon_file
+ The icon for the uninstaller.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico

+

+ MUI_HEADERIMAGE
+ Display an image on the header of the page.

+
+

+ MUI_HEADERIMAGE_BITMAP bmp_file
+ Bitmap image to display on the header of installers pages (recommended size: 150x57 + pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp

+
+

+ MUI_HEADERIMAGE_BITMAP_STRETCH mode
+

    +
  • FitControl (Default)
    + Stretch the image to fit the image control.

    +
  • NoStretchNoCropNoAlign
    + Do not stretch the image to fit the size of the image control. + You should not use this option if you have a full size bitmap that fits exactly because + the size of the field will be different if the user has a custom DPI setting or + if the installer is using a CJK language.

    +
  • NoStretchNoCrop
    + This is similar to NoStretchNoCropNoAlign but will align the image to the right edge when + using a RTL language or if MUI_HEADERIMAGE_RIGHT is defined.

    +
  • AspectFitHeight
    + Scale the image up or down until it is the same height as the image control while + maintaining the image aspect ratio.

    +
+

+

+ MUI_HEADERIMAGE_BITMAP_RTL bmp_file
+ Bitmap image to display on the header of installers pages when using a RTL language + (recommended size: 150x57 pixels).
+ Default: Non-RTL bitmap

+
+

+ MUI_HEADERIMAGE_BITMAP_RTL_STRETCH mode
+ See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

+
+
+

+ MUI_HEADERIMAGE_UNBITMAP bmp_file
+ Bitmap image to display on the header of uninstaller pages (recommended size: 150x57 + pixels).
+ Default: Installer header bitmap

+
+

+ MUI_HEADERIMAGE_UNBITMAP_STRETCH mode
+ See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

+

+ MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
+ Bitmap image to display on the header of uninstallers pages when using a RTL language + (recommended size: 150x57 pixels).
+ Default: Installer RTL header bitmap

+
+

+ MUI_HEADERIMAGE_UNBITMAP_RTL_STRETCH mode
+ See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

+
+
+

+ MUI_HEADERIMAGE_RIGHT
+ Display the header image on the right side instead of the left side (when using + a RTL language it will be displayed on the left side instead of the right side).

+
+

+ MUI_BGCOLOR (color: RRGGBBR hexadecimal)
+ Background color for the header, the Welcome page and the Finish page.
+ Default: FFFFFF

+

+ MUI_HEADER_TRANSPARENT_TEXT
+ Set a transparent background for the header's label controls. Useful for custom + user interfaces that set a bigger header image.

+

+ MUI_TEXTCOLOR (color: RRGGBBR hexadecimal)
+ Text color for the header, the Welcome page and the Finish page.
+ Default: 000000

+
+

+ Open/Close section + Interface resources

+
+

+ MUI_UI ui_file
+ The interface file with the dialog resources. Change this if you have made your + own customized UI.
+ Default: ${NSISDIR}\Contrib\UIs\modern.exe

+

+ MUI_UI_HEADERIMAGE ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control + and space for the header bitmap.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe

+

+ MUI_UI_HEADERIMAGE_RIGHT ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control + and space for the header bitmap on the right side.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe

+

+ MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM with a small description + area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe

+

+ MUI_UI_COMPONENTSPAGE_NODESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM without a description + area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe

+
+

+ Open/Close section + Installer welcome/finish page

+
+

+ MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

+
+

+ MUI_WELCOMEFINISHPAGE_BITMAP_STRETCH mode
+ See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

+
+
+

+ Open/Close section + Uninstaller welcome/finish page

+
+

+ MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

+
+

+ MUI_UNWELCOMEFINISHPAGE_BITMAP_STRETCH mode
+ See MUI_HEADERIMAGE_BITMAP_STRETCH for a list of the available stretch modes.

+
+
+

+ Open/Close section + License page

+
+

+ MUI_LICENSEPAGE_BGCOLOR (/windows | /grey | + (color: RRGGBB hexadecimal))
+ The background color for the license textbox. Use /windows for the Windows text + background color (usually white). Use the /grey for the window background color + (usually grey).
+ Default: /windows

+
+

+ Open/Close section + Components page

+
+

+ MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
+ The bitmap with images for the checks of the component select treeview.
+ Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp

+

+ MUI_COMPONENTSPAGE_SMALLDESC
+ A small description area on the bottom of the page. Use this layout if you have + a lot of sections and don't need large descriptions.

+

+ MUI_COMPONENTSPAGE_NODESC
+ No description area.

+
+

+ Open/Close section + Directory page

+
+

+ MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the directory textbox.

+
+

+ Open/Close section + Start Menu folder page

+
+

+ MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the startmenu directory list and textbox.

+
+

+ Open/Close section + Installation page

+
+

+ MUI_INSTFILESPAGE_COLORS (/windows | "(foreground + color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
+ The colors of the details screen. Use /windows for the default Windows colors.
+ Default: /windows

+

+ MUI_INSTFILESPAGE_PROGRESSBAR ("" + | colored | smooth)
+ The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
+ Default: smooth

+
+

+ Open/Close section + Installer finish page

+
+

+ MUI_FINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the install + log.

+
+

+ Open/Close section + Uninstaller finish page

+
+

+ MUI_UNFINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the uninstall + log.

+
+

+ Open/Close section + Abort warning

+
+

+ MUI_ABORTWARNING
+ Show a message box with a warning when the user wants to close the installer.

+
+

+ MUI_ABORTWARNING_TEXT text
+ Text to display on the abort warning message box.

+

+ MUI_ABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.

+
+
+

+ Open/Close section + Uninstaller abort warning

+
+

+ MUI_UNABORTWARNING
+ Show a message box with a warning when the user wants to close the uninstaller.

+
+

+ MUI_UNABORTWARNING_TEXT text
+ Text to display on the abort warning message box.

+

+ MUI_UNABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.

+
+
+
+
+

+ 3. Pages

+
+

+ Insert the following macros to set the pages you want to use. The pages will appear + in the order in which you insert them in the script. You can also insert custom + Page commands between the macros to add custom pages.

+

+ You can add multiple pages of certain types (for example, if you want the user to + specify multiple folders).

+

+ Examples:

+
+!insertmacro MUI_PAGE_LICENSE "License.rtf"
+!insertmacro MUI_PAGE_COMPONENTS
+
+Var StartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder
+
+

+ You will need the page ID for the Start Menu folder page when using the Start Menu + folder macros. The folder will be stored in the specified variable.

+

+ Installer pages
+ MUI_PAGE_WELCOME
+ MUI_PAGE_LICENSE textfile
+ MUI_PAGE_COMPONENTS
+ MUI_PAGE_DIRECTORY
+ MUI_PAGE_STARTMENU pageid variable
+ MUI_PAGE_INSTFILES
+ MUI_PAGE_FINISH

+

+ Uninstaller pages
+ MUI_UNPAGE_WELCOME
+ MUI_UNPAGE_CONFIRM
+ MUI_UNPAGE_LICENSE textfile
+ MUI_UNPAGE_COMPONENTS
+ MUI_UNPAGE_DIRECTORY
+ MUI_UNPAGE_INSTFILES
+ MUI_UNPAGE_FINISH

+

+ Open/Close section + Page settings

+
+

+ Page settings apply to a single page and should be set before inserting a page macro. + The same settings can be used for installer and uninstaller pages. You have to repeat + the setting if you want it to apply to multiple pages. Example:

+
+;Add a directory page to let the user specify a plug-ins folder
+;Store the folder in $PluginsFolder
+
+Var PLUGINS_FOLDER
+!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
+!insertmacro MUI_PAGE_DIRECTORY
+
+

+

+ All standard texts in the user interface are loaded from language files, which are + available for all languages supported by NSIS. So you only need to define these + texts if you want to change the default.

+

+ If the parameter is a text that should be different for each language, define a + language string using LangString and use $(LangStringName) as value. For a license + text in multiple languages, LicenseLangString can be used. Refer the NSIS Users + Manual for more information about installers with multiple languages.

+

+ In all text settings, the doublequote character (") should be escaped in the + following form: $\"

+

+ Open/Close section + General page settings

+
+

+ MUI_PAGE_HEADER_TEXT text
+ Text to display on the header of the page.

+

+ MUI_PAGE_HEADER_SUBTEXT text
+ Subtext to display on the header of the page.

+
+

+ Open/Close section + Welcome page settings

+
+

+ MUI_WELCOMEPAGE_TITLE title
+ Title to display on the top of the page.

+

+ MUI_WELCOMEPAGE_TITLE_3LINES
+ Extra space for the title area.

+

+ MUI_WELCOMEPAGE_TEXT text
+ Text to display on the page.

+
+

+ Open/Close section + License page settings

+
+

+ MUI_LICENSEPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_LICENSEPAGE_TEXT_BOTTOM text
+ Text to display on the bottom of the page.

+

+ MUI_LICENSEPAGE_BUTTON button_text
+ Text to display on the 'I Agree' button.

+

+ MUI_LICENSEPAGE_CHECKBOX
+ Display a checkbox the user has to check to agree with the license terms.

+
+

+ MUI_LICENSEPAGE_CHECKBOX_TEXT text
+ Text to display next to the checkbox to agree with the license terms.

+
+

+ MUI_LICENSEPAGE_RADIOBUTTONS
+ Display two radio buttons to allow the user to choose between accepting the license + terms or not.

+
+

+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
+ Text to display next to the checkbox to accept the license terms.

+

+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
+ Text to display next to the checkbox to decline the license terms.

+
+
+

+ Open/Close section + Components page settings

+
+

+ MUI_COMPONENTSPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_COMPONENTSPAGE_TEXT_COMPLIST text
+ Text to display on next to the components list.

+

+ MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
+ Text to display on next to the installation type combo box.

+

+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
+ Text to display on the of the top of the description box.

+

+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
+ Text to display inside the description box when no section is selected.

+
+

+ Open/Close section + Directory page settings

+
+

+ MUI_DIRECTORYPAGE_TEXT_TOP text
+ Text to display on top of the page.

+

+ MUI_DIRECTORYPAGE_TEXT_DESTINATION text
+ Text to display on the destination folder frame.

+

+ MUI_DIRECTORYPAGE_VARIABLE variable
+ Variable in which to store the selected folder.
+ Default: $INSTDIR

+

+ MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ Does not disable the Next button when a folder is invalid but allows you to use + GetInstDirError in the leave function to handle an invalid folder.

+
+

+ Open/Close section + Start Menu folder page settings

+
+

+ MUI_STARTMENUPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_STARTMENUPAGE_TEXT_CHECKBOX text
+ Text to display next to the checkbox to disable the Start Menu folder creation.

+

+ MUI_STARTMENUPAGE_DEFAULTFOLDER folder
+ The default Start Menu Folder.

+

+ MUI_STARTMENUPAGE_NODISABLE
+ Do not display the checkbox to disable the creation of Start Menu shortcuts.

+

+ MUI_STARTMENUPAGE_REGISTRY_ROOT root
+ MUI_STARTMENUPAGE_REGISTRY_KEY key
+ MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
+ The registry key to store the Start Menu folder. The page will use it to remember + the users preference. You should also use for the uninstaller to remove the Start + Menu folders. Don't forget to remove this key during uninstallation.

+

+ For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu + folder:

+
+!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
+  Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"
+
+
+

+ Open/Close section + Installation page settings

+
+

+ MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has + been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

+

+ MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
+ Subtext to display on the header of the installation page when the installation + has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

+

+ MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has + been aborted.

+

+ MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
+ Subext to display on the header of the installation page when the installation has + been aborted.

+
+

+ Open/Close section + Finish page settings

+
+

+ MUI_FINISHPAGE_TITLE title
+ Title to display on the top of the page.

+

+ MUI_FINISHPAGE_TITLE_3LINES
+ Extra space for the title area.

+

+ MUI_FINISHPAGE_TEXT text
+ Text to display on the page.

+

+ MUI_FINISHPAGE_TEXT_LARGE
+ Extra space for the text area (if using checkboxes).

+

+ MUI_FINISHPAGE_BUTTON text
+ Text to display on the Finish button.

+

+ MUI_FINISHPAGE_CANCEL_ENABLED
+ Enable the Cancel button so the user can skip any options displayed on the finish + page.

+

+ MUI_FINISHPAGE_TEXT_REBOOT text
+ Text to display on the finish page when asking for a system reboot.

+

+ MUI_FINISHPAGE_TEXT_REBOOTNOW text
+ Text to display next to the 'Reboot now' option button.

+

+ MUI_FINISHPAGE_TEXT_REBOOTLATER text
+ Text to display next to the 'Reboot later' option button.

+

+ MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ Sets the 'Reboot later' option as the default option.

+

+ MUI_FINISHPAGE_RUN exe_file
+ Application which the user can select to run using a checkbox. You don't need to + put quotes around the filename when it contains spaces.

+
+

+ MUI_FINISHPAGE_RUN_TEXT text
+ Texts to display next to the 'Run program' checkbox.

+

+ MUI_FINISHPAGE_RUN_PARAMETERS parameters
+ Parameters for the application to run. Don't forget to escape double quotes in the + value (use $\").

+

+ MUI_FINISHPAGE_RUN_NOTCHECKED
+ Do not check the 'Run program' checkbox by default

+

+ MUI_FINISHPAGE_RUN_FUNCTION function
+ Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without + parameters). You can use the function to execute multiple applications or you can + change the checkbox name and use it for other things.

+
+

+ MUI_FINISHPAGE_SHOWREADME file/url
+ File or website which the user can select to view using a checkbox. You don't need + to put quotes around the filename when it contains spaces.

+
+

+ MUI_FINISHPAGE_SHOWREADME_TEXT text
+ Texts to display next to the 'Show Readme' checkbox.

+

+ MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ Do not check the 'Show Readme' checkbox by default

+

+ MUI_FINISHPAGE_SHOWREADME_FUNCTION function
+ Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without + parameters). You can use the function to show multiple files or you can change the + checkbox name and use it for other things.

+
+

+ MUI_FINISHPAGE_LINK link_text
+ Text for a link on the which the user can click to view a website or file.

+
+

+ MUI_FINISHPAGE_LINK_LOCATION file/url
+ Website or file which the user can select to view using the link. You don't need + to put quotes around the filename when it contains spaces.

+

+ MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
+ Text color for the link on the Finish page.
+ Default: 000080

+
+

+ MUI_FINISHPAGE_NOREBOOTSUPPORT
+ Disables support for the page that allows the user to reboot the system. Define + this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.

+
+

+ Open/Close section + Uninstall confirm page settings

+
+

+ MUI_UNCONFIRMPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_UNCONFIRMPAGE_TEXT_LOCATION text
+ Text to display next to the uninstall location text box.

+

+ MUI_UNCONFIRMPAGE_VARIABLE variable
+ Variable in which to store the uninstall source folder.
+ Default: $INSTDIR

+
+
+
+

+ 4. Language files

+
+

+ Insert the Modern UI language files for the languages to want to include.

+
+!insertmacro MUI_LANGUAGE "English"
+
+

+ The standard NSIS language files are loaded automatically, there is no need to use + LoadLanguageFile.

+
+

+ 5. Reserve files

+
+

+ If you are using solid compression, files that are required before the actual installation + should be stored first in the data block, because this will make your installer + start faster. Include reserve file commands for such files before your sections + and functions:

+
+ReserveFile /plugin MyPlugin.dll
+!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog
+...
+
+
+

+ Script code for pages

+
+

+ Some pages allow you to show additional information or can be used to get user input. + Here you can find the script code to use these features.

+

+ Components page descriptions

+
+

+ The Modern UI components page has a text box in which a description can be shown + when the user hovers the mouse over a component. If you don't want to use these + descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.

+

+ To set a description for a section, an additional parameter needs to be added to + Section command with a unique identifier for the section. This name can later be + used to set the description for this section.

+
+Section "Section Name 1" Section1
+   ...
+SectionEnd
+
+

+ After the sections, use these macros to set the descriptions:

+
+LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
+LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+

+ For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END + macros.

+
+

+ Start Menu folder

+
+

+ Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN + and MUI_STARTMENU_WRITE_END macros:

+
+!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
+  ...create shortcuts...
+!insertmacro MUI_STARTMENU_WRITE_END
+
+

+ The page ID should be the ID of the page on which the user has selected the folder + for the shortcuts you want to write.

+

+ The variable which contains the folder and the page ID are set as parameters of + the page macro.

+
+
+

+ Language selection dialog

+
+

+ If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example), + insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:

+
+Function .onInit
+
+  !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd
+
+

+ This macro can also be used in the un.onInit function.

+

+ Open/Close section + Settings for registry storage of selected language

+
+

+ To remember the user's preference, you can define a registry key. These defines + should be set before inserting the installation page macro.

+

+ MUI_LANGDLL_REGISTRY_ROOT root
+ MUI_LANGDLL_REGISTRY_KEY key
+ MUI_LANGDLL_REGISTRY_VALUENAME value_name
+ The registry key to store the language. The users preference will be remembered. + You can also use it for the uninstaller to display the right language. Don't forget + to remove this key in the uninstaller.

+

+ For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the + stored language preference:

+
+Function un.onInit
+
+  !insertmacro MUI_UNGETLANGUAGE
+
+FunctionEnd
+
+
+

+ Open/Close section + Interface settings for selection dialog

+
+

+ To customize the language selection dialog interface, use these defines before inserting + the MUI_LANGDLL_DISPLAY macro.

+

+ MUI_LANGDLL_WINDOWTITLE text
+ The window title of the language selection dialog.

+

+ MUI_LANGDLL_INFO text
+ The text to display on the language selection dialog.

+

+ MUI_LANGDLL_ALWAYSSHOW
+ Always show the language selection dialog, even if a language has been stored in + the registry. The language stored in the registry will be selected by default.

+

+ MUI_LANGDLL_ALLLANGUAGES
+ Always show all available languages and don't filter according to their codepage.

+
+
+

+ Custom pages

+
+

+ If you want add your custom pages to your installer, you can insert your own page + commands between the page macros.

+
+!insertmacro MUI_PAGE_WELCOME
+Page custom FunctionName ;Custom page
+!insertmacro MUI_PAGE_COMPONENTS
+ 
+;Uninstaller
+!insertmacro MUI_UNPAGE_CONFIRM
+UninstPage custom un.FunctionName ;Custom page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+

+ Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:

+
+LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
+LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"
+
+Function CustomPageFunction
+  !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
+  nsDialogs::...
+  ...
+FunctionEnd
+
+
+

+ Custom functions

+
+

+ Interface functions provided by NSIS, like the .onGUIInit function and the page + functions are automatically included by the Modern UI and filled with code to support + new interface features. If you want to add additional code to these function, create + a function with the custom script code in the script use the Modern UI functions + call them.

+

+ Example:

+
+!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
+
+Function myGUIInit
+  ...
+FunctionEnd
+

+ Modern UI pages can also customized using custom functions.

+

+ Open/Close section + General Custom Functions

+
+

+ These defines should be set before inserting the language macros.

+

+ MUI_CUSTOMFUNCTION_GUIINIT function
+ MUI_CUSTOMFUNCTION_UNGUIINIT function
+ MUI_CUSTOMFUNCTION_ABORT function
+ MUI_CUSTOMFUNCTION_UNABORT function
+ MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
+ MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function

+

+ Mouse over functions are only available when the description macros + (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not + used, regular .onMouseOverSection and un.onMouseOverSection must be used.

+
+

+ Open/Close section + Page Custom Functions

+
+

+ These defines should be set before inserting a page macro.

+

+ MUI_PAGE_CUSTOMFUNCTION_PRE function
+ MUI_PAGE_CUSTOMFUNCTION_SHOW function
+ MUI_PAGE_CUSTOMFUNCTION_LEAVE function
+ MUI_PAGE_CUSTOMFUNCTION_DESTROYED function
+

+

+ The pre function is called first and allows you to initialize variables or decide + whether the page should be skipped. Then, the show function is called, which can + be used to customize the interface. Finally, the user input can be validated in the + leave function. The NSIS Users Manual provides more information about these functions.

+

+ In the show function, the window handles of all controls on the page can be retrieved + from a Modern UI variable. A list of the variables names is not yet available. For + now, refer to the source files of the Modern UI 2. The variable declarations can + be found in the first lines of the header file for a certain page.

+

+ The destroyed function is called after a external/plug-in page has been destroyed. +

+
+

+ Example scripts

+
+

+ Basic: Basic.nsi
+ Welcome/Finish page: WelcomeFinish.nsi
+ Multiple languages: MultiLanguage.nsi
+ Header image: HeaderBitmap.nsi
+ Start Menu Folder page: StartMenu.nsi

+
+

+ Credits

+
+

+ Written by Joost Verburg.
+ Icons designed by Nikos Adamamas, aka adni18.
+ Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.

+
+

+ License

+
+

+ The zlib/libpng license applies to the Modern UI.

+

+ Open/Close section + License Terms

+
+
+Copyright © 2002-2026 Joost Verburg
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; 
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+
+
+ + diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/closed.gif b/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..b45054ee8154b36b64d0bdbb9fe2b40d03ba1489 GIT binary patch literal 203 zcmZ?wbhEHb-oE{eQPhQI&^#bmMe?*-1zn9?~XGM zzy0|A_wT=qNe8Yzc>D3|&sQJ59l7$Xa^CUlkKQfZeSPiWJMAmZ#&_>2nt5dX(Yycu z|7So2ia%Mv0y-cPWG4fw$AZM(6iX?I32Sq-6C#$LE%7~QRI6ha$J`vZMvUW9-bR+y ujS-e6C%BTGrn;;USkW)0z)`&U-S%Y_J=qycRvoPq)%&nRCXR!V!5RQGW?{Dg literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/header.gif b/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/header.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8810d30cf58ad6ef9c0b14a8be67aabd2065e81 GIT binary patch literal 6023 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/open.gif b/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/open.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fff60ed5c309677255f7c0abf53a6aec2f06f0f GIT binary patch literal 138 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/screen2.png b/libs/NSIS/NSIS-source/Docs/Modern UI 2/images/screen2.png new file mode 100644 index 0000000000000000000000000000000000000000..4fccd41c85c2b8ed59c1782801027f273245ccbb GIT binary patch literal 18437 zcmb5Wby%Chw=No_NTJ0Fw79#JQe4~OF2x-R6n6XT(7>qh1}|NWUrpo z#nD#WnQy_8anQP6*KU~iguWo%CU!MISJ7}g0CT!)9hAP0$i$#li0s_bGUKEmS~!0oiIK_JD;Q_sVj>6qp0EnGs* zhVc3h+o`Id1v=x?py^bt+Jhfo*7Gp=M_DGZr{|Mi>a?-4T7xbB;)j=too2mNi4%S~ zTwHjQlP3Q6J}ZS;zWqqpk+HVc*5#tJp6kIG-HTNw8R3Cf@@GNAT=1WYu5XetXL0vrsQBm*0oLPoWat3mVy#@lw{- zK8WkmhuW+7%~t@1K541o`qp+|F}E)gb4_KcLY>R|j={*Uo1ERo>R1=_1XY|qU*6oj zL%#JE2}rlnO1yKbzgxwRm3C{r*AYUeVs!>b#Mry>)O_zZdmK$a$1Fx<3#ErlwuVC0 z$fc>GVBrm~#8k5h#%;}$KOw=vS4b4G$Bf$4DycDwV9^#f<4gOM%4_Wv8lFF=SVQ z8>xx;!6(mgg6vf|)T{nh)g?x8-X4hq)k)2qB^r%B|65qVXf(*sgbK{Ie94{@AQo~n z@n`QSZ*|K2$3@K82S6nRHwlooj)ceu57}bV%H)4j!D#DH8$A51= z2knINglnB5e_$KeW;BvdzcV|oU@eIGZWVl~-7J{hxviz?hPy6svO(X>&EoEN zknqthV=*}du~<3CaDQ4g{qnk;EFp~|2{oF9*1(pz)0DDA%cK6{zm~YP%KmtcH=s6}Q;gK9)A`$0u)`A%dl?rw6go;E1|~oTB;p6WRVu}Kpf$}W5uhsQ znW-|{j%k`Us^e)DTrw13!>4H6zdBh_04qnoX(}yw$7WSm@P>*C`C9ms z1K~QxiCuX;RsZPzu_c;@gZ*IP@G)}O4dNg>SG9Tb!4l@PA&rH#G6&h6$+s*o$mR!e zFtZ7YV*sd~DG^pAR`hFLhnzbKd#iMnE?+K3W@6$;{{Iatdg9P=LYD_)|yBfZ`v!Iu0mkS%M7Fv zqyV+&$e;KWNHzdW)QR~0Z;)O~o)1xmN(QH^Ehf~wD~#^wUY?xIX{O(Eta%8=rNK_O zb#DilG|_}tb}R~kO^0Javt>_ z>)@9I$iM+%(U^Ornavxui@BvGC;
e?YPWN_&^zLmh&ePE2D5 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 M07*qoM6N<$g8wU>6aWAK literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/Changelog.txt b/libs/NSIS/NSIS-source/Docs/Modern UI/Changelog.txt new file mode 100644 index 0000000000..d827d7784a --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Modern UI/Changelog.txt @@ -0,0 +1,268 @@ +NSIS Modern User Interface +Version History + +1.81 +* Added MUI_TEXTCOLOR (2018-09-09) +* Added MUI_PAGE_CUSTOMFUNCTION_DESTROYED (2017-04-03) +* Added support for MUI_UNCONFIRMPAGE_VARIABLE (RFE #511) (2016-12-30) + +1.8 - August 9, 2007 +* Uses the new language files +* Updated documentation +* Although MUI_DIRECTORYPAGE_BGCOLOR and MUI_STARTMENUPAGE_BGCOLOR are documented as interface + settings that apply to every directory page or Start Menu folder page, they were actually + implemented as page specific settings. They have been changed to interface settings. +* MUI_LANGDLL_DISPLAY now also reads a previously saved language from the registry if the + installation is silent. +* InstallOptions macros have been moved to a separate header file (InstallOptions.nsh). + The MUI_INSTALLOPTIONS_* macros are still provided for backwards compatibility and insert the + equalivent INSTALLOPTIONS_* macros. +* Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION + +1.78 - June 8, 2007 +* Added MUI_STARTMENUPAGE_BGCOLOR +* Added MUI_DIRECTORYPAGE_BGCOLOR +* Added MUI_LANGDLL_ALLLANGUAGES + +1.77 - April 27, 2007 +* Added MUI_FINISHPAGE_CANCEL_ENABLED +* Added MUI_FINISHPAGE_REBOOTLATER_DEFAULT +* Block unsupported languages in the language selection dialog +* Cancel button no longer enabled by default on the finish page +* Reduced flicker caused by MUI_HEADER_TRANSPARENT_TEXT + +1.76 - September 23, 2006 +* Added MUI_ABORTWARNING_CANCEL_DEFAULT + +1.75 - April 1, 2006 +* Added show function for the start menu page +* Added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts + +1.74 - September 4, 2005 +* Fixed compile error when checkboxes are used on multiple finish page pages + +1.73 - August 6, 2005 +* The checkboxes to run an application or show a Readme file can now also be used on an uninstaller + finish pages or multiple finish pages + +1.72 - November 27, 2004 +* Fixed state of Finish page Cancel button when both an installer and uninstaller page is included + +1.71 - October 14, 2004 +* The selected language is only stored in the registry when installation was successful + +1.70 - February 6, 2004 +* Improved documentation +* New Init custom function for Welcome and Finish page + +1.69 - January 7, 2004 +* All uninstaller pages work without installer pages +* Fixed top text on uninstaller license page + +1.68 - November 24, 2003 +* New settings for extra space for title and text on Welcome and Finish page. +* Improved handling of verbose settings. Define MUI_VERBOSE the set the Modern UI verbose level (1-4). +* Language file string for uninstaller reboot information +* Setting for folder validation in leave function +* Fixed finish page text settings for multiple pages + +1.67 - November 18, 2003 +* Support for uninstaller Welcome pages and Finish pages +* Improved and changed text settings +* ID for Start Menu Folder pages, easier to use multiple pages +* Renamed a few settings +* Default header image +* Support for uninstaller abort warning +* Setting for 3 line text on Welcome and Finish page + (NOTE: New settings have been introduced in version 1.68) +* Language file backwards compatibility: English for missing strings +* Support for different uninstaller header image +* Language selection dialog not displayed if installer is silent +* Cancel button on Finish page when there are options +* Full RTL support + +1.66 - October 7, 2003 +* New system for page settings and custom pages +* Support for uninstaller components page +* Support for multiple pages of the same type +* New position for interface settings +* Changed macro and setting names +* Updated language system, new language files and settings +* Removed MUI_BRANDINGTEXT. You can use the standard BrandingText instruction. +* Removed MUI_PRODUCT and MUI VERSION. You can use the standard Name instruction. + +1.65 - July 16, 2003 +* New page configuration system, no different system for installers with custom pages +* Default windows color for the license text background +* Example script updates (new format, user variables) +* Improved registry storage for Start Menu folder +* ReserveFile macro for StartMenu plug-in +* Option to always show the language selection dialog (even if a language has been stored in the registry) +* Checkboxes on Finish page can be used to call a function +* Support for custom leave functions for Start Menu Folder, Welcome and Finish pages +* Support for a link on the Finish page +* New macro to get Start Menu folder in uninstaller +* Options to disable bitmap stretching +* Components page description box info text: always displayed + when mouse is outside box, disabled style + +1.64 - April 27, 2003 +* Support for license page with checkbox or radiobuttons to let the user accept the agreement or not +* Macros for finish headers don't have to be inserted anymore +* Language preference stored when installation has completed, no problems anymore when the users selects the wrong language +* Header text for aborted installation +* New macros: get language for uninstaller, delete shortcuts +* Language specific fonts +* Welcome/Finish page INI files can be modified in pre functions +* More texts can be customized + +1.63 - March 9, 2003 +* Support for a bitmap in the wizard header +* New defines to change the components page interface +* MUI_SYSTEM inserted automatically +* Single macro for language selection dialog +* Removed page description in window title +* Easier to customize resource files +* New system for custom functions +* Start Menu folder registry key automatically written +* New InstallOptions macros that do not remove the return value from the stack +* Support for custom pages before the finish page +* Renamed Start Menu page defines +* 'Do not create shortcuts' checkbox can be removed +* 'MS Shell Dlg' font for header title +* RTL support +* Documentation updates +* Minor fixes + +1.62 - February 2, 2003 +* New language strings for Finish page +* Possibility to let a Modern UI Function call your own function +* No problems anymore when using both 'Run program' and 'Show Readme' on the Finish page +* Default state of checkboxes on the finish page can be changed +* Welcome / Finish page compatible with custom DPI settings +* Converted Install Options INI files to use dialog units +* More ReserveFile macros + (NOTE: Some of these macros have been removed in later versions) +* Background color can be changed with a define +* Support for multilingual branding texts +* Start Menu / Finish page window titles also work when using custom page commands +* Language files should be inserted after inserting the MUI_SYSTEM macro + (NOTE: The MUI_SYSTEM macro has been removed in version 1.63) +* Define MUI_MANUALVERBOSE if you don't want the Modern UI to change the verbose settings during compilation + (NOTE: This setting has been changed in version 1.68) + +1.61 - December 5, 2002 +* modern3.exe UI without description area + (NOTE: This setting has been changed in version 1.63) +* Added define to show uninstall confirm page +* Added language string for finish page title and continue to uninstall +* Define for parameters for the application to run on the finish page +* Minor fixes + +1.6 - November 18, 2002 +* Welcome / Finish page +* Automatic ask for reboot on finish page +* Create no shortcut option on the Start Menu Folder selection page +* Customizing GUIInit functions easier +* Minor font / UI changes + +1.5 - November 11, 2002 +* New language file format +* Language strings can be changed in the script without editing languagefiles +* Start Menu Folder selection page +* 'Click Next to continue' and 'Click Install to start the installation' texts automatically change to the page order +* Install Options macros updated. MUI_INSTALLOPTIONS_DISPLAY is the standard macro now. + Use MUI_INSTALLOPTIONS_INITDIALOG and MUI_INSTALLOPTIONS_SHOW if you want to customize dialog controls. +* No more writing window titles & abort warnings to Install Options INI Files +* Compatible with updated paging system +* Renamed macros and defines +* Minor fixes + +1.4 - November 4, 2002 +* Uses new NSIS Page command +* Macro System updates (smaller) +* Macro System a lot easier +* Modern UI Language Files load NLF language files +* Renamed macros and defines + +1.3 - October 27, 2002 +* Easier macro system for basic scripts +* New MultiLanguage system using Modern UI Language Files +* New directory structure (header/language files in Contrib\Modern UI) +* Small bugfixes & typo corrections +* SetPage function should be set using defines +* Different NextPage/PrevPage/FinishHeader macros for install/uninstall + (NOTE: These macros have been removed in version 1.4) +* Interface settings can be defined (for example, MUI_ICON), no parameters for MUI_INTERFACE anymore +* New Install Options macros to read/write IO INI file value + +1.21 - September 30, 2002 +* Temp vars set in Modern UI header +* Currentpage & Install Options vars should be set using + parameters of the MUI_INTERFACE and * MUI_INSTALLOPTIONS macros + (NOTE: The MUI_INTERFACE macro has been removed in version 1.3) +* MultiLanguage.nsi uses the new language strings + +1.2 - September 22, 2002 + (NOTE: All macros mentioned here have been removed in version 1.4) + +* Lots of macro system updates & fixes +* InstallOptions support in macro system +* Added Modern UI + InstallOptions example (InstallOptions.nsi) +* MUI_NEXTPAGE_OUTER integrated in MUI_NEXTPAGE +* No hard-coded function names anymore (you should give + MUI_PREVPAGE a parameter with the set page function name + (for example, MUI_PREVPAGE SetPage) +* Examples use ReserveFile for faster startup + +1.19 - Semtember 19, 2002 +* Renamed some macros +* Custom code can be used between page start/stop macros + (NOTE: These macros have been removed in version 1.4) + +1.18 - Semtember 13, 2002 +* Uses the new Sendmessage string option + +1.17 - Semtember 10, 2002 +* Win9x font weight bug fixed (font of title in white rect) + +1.16 - Semtember 6, 2002 +* Change text 'Scroll down' on license page to 'Press Page Down', + because the RichEdit control has focus by default now + +1.15 - Semtember 4, 2002 +* Multilanguage example: changed LangDialog to LangDLL::LangDialog (using the DLL name is now required) + (NOTE: A new macro for the language selection dialog has been introduced in version 1.63) + +1.14 - Semtember 3, 2002 +* Small grammar fix (thanks eccles) +* UI files updated by Justin for better RichEdit usage + +1.13 - Semtember 2, 2002 +* Added 16 color icons + +1.12 - August 30, 2002 +* Verifying installer & Unpacking data dialog has no titlebar anymore + +1.11 - August 29, 2002 +* Finish header for uninstaller can also be set using MUI_FINISHHEADER + (NOTE: The MUI_FINISHHEADER macro has been removed in version 1.64) + +1.1 - August 29, 2002 + (NOTE: All settings mentioned here do not exist anymore) + +* Header file with macros, it's now very easy to use the UI in your scripts +* Added the modern2.exe UI, with an other location of the Description frame, for installers with a lot of subsections (thanks rainwater) +* Updated example scripts +* Added Multilanguage.nsi example (Multilanguage & LangDLL) +* Fixed background color issue with some custom XP themes +* Removed WS_VISIBLE from black rect for inner dialog (fixes display issues) +* Changed size of description area +* Example script: Added instructions for the user on the Description frame +* Auto sizing branding text +* Used modern.bmp for the checks (thanks rainwater) +* Using the new NSIS version, descriptions work using the keyboard and you can give descriptions to subsections +* Correct font size using High-DPI fonts + +1.0 - August 26, 2002 +* Initial release \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/License.txt b/libs/NSIS/NSIS-source/Docs/Modern UI/License.txt new file mode 100644 index 0000000000..4d2ea6bf34 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Modern UI/License.txt @@ -0,0 +1,10 @@ +Copyright 2002-2026 Joost Verburg + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. + If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any distribution. diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/Readme.html b/libs/NSIS/NSIS-source/Docs/Modern UI/Readme.html new file mode 100644 index 0000000000..19407c16c6 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Modern UI/Readme.html @@ -0,0 +1,1160 @@ + + + + NSIS Modern User Interface - Documentation + + + + + + + + + + + + +
+ +

+ [Expand all]   [Collapse + all]

+
+

+ Introduction

+
+

+ The Modern UI provides a user interface for NSIS installers with a modern wizard + style, similar to the wizards of recent Windows versions. It is based on the basic + user interface that is provided by the NSIS compiler itself and extends it with + more interface features and pages.

+

+ All standard NSIS pages (such as the pages to select components and the installation + folder) are supported as well as a number of additional pages. The welcome page + allows you to provide an introduction to the installation process, while the finish + page provides a way to let the user decide what steps should be performed after + the setup wizard is closed (for example, whether the application should be started + immediately). A finish page can also be used to ask for a system restart is necessary.

+

+ Open/Close section + Screenshots

+
+

+

+
+
+

+ Script header

+
+

+ The settings for the Modern UI should be inserted in the header of the script file. + It's important to follow the same order as the items below. For example, + interface settings should be defined before you insert pages, because the pages + depend on the interface configuration. It may be useful to look at the + example scripts too see how this is done in actual script files.

+

+ Parameters are given in this format: required (option1 | option2) + [optional]

+

+ 1. Header file

+
+

+ First of all, add this line to the top of script to include the Modern UI:

+
+!include "MUI.nsh"
+
+
+

+ 2. Interface configuration

+
+

+ Then, you may want to use interface settings to change the look and feel of the + installer. These settings apply to all pages.

+ The interface settings provided by the NSIS compiler itself (such as LicenseText, + Icon, CheckBitmap, InstallColors) should not be used in Modern UI scripts. The Modern + UI provides equalivent or extended versions of these settings.

+ Examples:

+
+!define MUI_COMPONENTSPAGE_SMALLDESC ;No value
+!define MUI_UI "myUI.exe" ;Value
+!define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors
+
+

+ Open/Close section + Interface settings

+
+

+ Open/Close section + Page header

+
+

+ MUI_ICON icon_file
+ The icon for the installer.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico

+

+ MUI_UNICON icon_file
+ The icon for the uninstaller.
+ Default: ${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico

+

+ MUI_HEADERIMAGE
+ Display an image on the header of the page.

+
+

+ MUI_HEADERIMAGE_BITMAP bmp_file
+ Bitmap image to display on the header of installers pages (recommended size: 150x57 + pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Header\nsis.bmp

+
+

+ MUI_HEADERIMAGE_BITMAP_NOSTRETCH
+ Do not stretch the installer header bitmap to fit the size of the field. Use this + option only if you have an image that does not use the whole space. If you have + a full size bitmap that fits exactly, you should not use this option because the + size of the field will be different if the user has a custom DPI setting.

+

+ MUI_HEADERIMAGE_BITMAP_RTL bmp_file
+ Bitmap image to display on the header of installers pages when using a RTL language + (recommended size: 150x57 pixels).
+ Default: Non-RTL bitmap

+
+

+ MUI_HEADERIMAGE_BITMAP_RTL_NOSTRETCH
+ Do not stretch the installer header bitmap when using a RTL language to fit the + size of the field. Use this option only if you have an image that does not use the + whole space. If you have a full size bitmap that fits exactly, you should not use + this option because the size of the field will be different if the user has a custom + DPI setting.

+
+
+

+ MUI_HEADERIMAGE_UNBITMAP bmp_file
+ Bitmap image to display on the header of uninstaller pages (recommended size: 150x57 + pixels).
+ Default: Installer header bitmap

+
+

+ MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
+ Do not stretch the uninstaller header bitmap to fit the size of the field. Use this + option only if you have an image that does not use the whole space. If you have + a full size bitmap that fits exactly, you should not use this option because the + size of the field will be different if the user has a custom DPI setting.

+

+ MUI_HEADERIMAGE_UNBITMAP_RTL bmp_file
+ Bitmap image to display on the header of uninstallers pages when using a RTL language + (recommended size: 150x57 pixels).
+ Default: Installer RTL header bitmap

+
+

+ MUI_HEADERIMAGE_UNBITMAP_RTL_NOSTRETCH
+ Do not stretch the uninstaller header bitmap when using a RTL language to fit the + size of the field. Use this option only if you have an image that does not use the + whole space. If you have a full size bitmap that fits exactly, you should not use + this option because the size of the field will be different if the user has a custom + DPI setting.

+
+
+

+ MUI_HEADERIMAGE_RIGHT
+ Display the header image on the right side instead of the left side (when using + a RTL language it will be displayed on the left side instead of the right side).

+
+

+ MUI_BGCOLOR (color: RRGGBBR hexadecimal)
+ Background color for the header, the Welcome page and the Finish page.
+ Default: FFFFFF

+

+ MUI_HEADER_TRANSPARENT_TEXT
+ Set a transparent background for the header's label controls. Useful for custom + user interfaces that set a bigger header image.

+

+ MUI_TEXTCOLOR (color: RRGGBBR hexadecimal)
+ Text color for the header, the Welcome page and the Finish page.
+ Default: 000000

+
+

+ Open/Close section + Interface resources

+
+

+ MUI_UI ui_file
+ The interface file with the dialog resources. Change this if you have made your + own customized UI.
+ Default: ${NSISDIR}\Contrib\UIs\modern.exe

+

+ MUI_UI_HEADERIMAGE ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control + and space for the header bitmap.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmp.exe

+

+ MUI_UI_HEADERIMAGE_RIGHT ui_file
+ The interface files with the dialog resource IDD_INST that contains a bitmap control + and space for the header bitmap on the right side.
+ Default: ${NSISDIR}\Contrib\UIs\modern_headerbmpr.exe

+

+ MUI_UI_COMPONENTSPAGE_SMALLDESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM with a small description + area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_smalldesc.exe

+

+ MUI_UI_COMPONENTSPAGE_NODESC ui_file
+ The interface files with a customized dialog resource IDD_SELCOM without a description + area.
+ Default: ${NSISDIR}\Contrib\UIs\modern_nodesc.exe

+
+

+ Open/Close section + Installer welcome/finish page

+
+

+ MUI_WELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

+
+

+ MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the + field. Use this option only if you have an image that does not use the whole space. + If you have a full size bitmap that fits exactly, you should not use this option + because the size of the field will be different if the user has a custom DPI setting.

+
+

+ MUI_WELCOMEFINISHPAGE_INI ini_file
+ InstallOptions INI file for the Welcome page and the Finish page.
+ Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini

+
+

+ Open/Close section + Uninstaller welcome/finish page

+
+

+ MUI_UNWELCOMEFINISHPAGE_BITMAP bmp_file
+ Bitmap for the Welcome page and the Finish page (recommended size: 164x314 pixels).
+ Default: ${NSISDIR}\Contrib\Graphics\Wizard\win.bmp

+
+

+ MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
+ Do not stretch the bitmap for the Welcome and Finish page to fit the size of the + field. Use this option only if you have an image that does not use the whole space. + If you have a full size bitmap that fits exactly, you should not use this option + because the size of the field will be different if the user has a custom DPI setting.

+
+

+ MUI_UNWELCOMEFINISHPAGE_INI ini_file
+ InstallOptions INI file for the uninstaller Welcome page and the Finish page.
+ Default: ${NSISDIR}\Contrib\Modern UI\ioSpecial.ini

+
+

+ Open/Close section + License page

+
+

+ MUI_LICENSEPAGE_BGCOLOR (/windows | /grey | + (color: RRGGBB hexadecimal))
+ The background color for the license textbox. Use /windows for the Windows text + background color (usually white). Use the /grey for the window background color + (usually grey).
+ Default: /windows

+
+

+ Open/Close section + Components page

+
+

+ MUI_COMPONENTSPAGE_CHECKBITMAP bitmap_file
+ The bitmap with images for the checks of the component select treeview.
+ Default: ${NSISDIR}\Contrib\Graphics\Checks\modern.bmp

+

+ MUI_COMPONENTSPAGE_SMALLDESC
+ A small description area on the bottom of the page. Use this layout if you have + a lot of sections and don't need large descriptions.

+

+ MUI_COMPONENTSPAGE_NODESC
+ No description area.

+
+

+ Open/Close section + Directory page

+
+

+ MUI_DIRECTORYPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the directory textbox.

+
+

+ Open/Close section + Start Menu folder page

+
+

+ MUI_STARTMENUPAGE_BGCOLOR (color: RRGGBB hexadecimal)
+ The background color for the startmenu directory list and textbox.

+
+

+ Open/Close section + Installation page

+
+

+ MUI_INSTFILESPAGE_COLORS (/windows | "(foreground + color: RRGGBB hexadecimal) (background color: RRGGBB hexadecimal)")
+ The colors of the details screen. Use /windows for the default Windows colors.
+ Default: /windows

+

+ MUI_INSTFILESPAGE_PROGRESSBAR ("" + | colored | smooth)
+ The style of the progress bar. Colored makes it use the MUI_INSTALLCOLORS.
+ Default: smooth

+
+

+ Open/Close section + Installer finish page

+
+

+ MUI_FINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the install + log.

+
+

+ Open/Close section + Uninstaller finish page

+
+

+ MUI_UNFINISHPAGE_NOAUTOCLOSE
+ Do not automatically jump to the finish page, to allow the user to check the uninstall + log.

+
+

+ Open/Close section + Abort warning

+
+

+ MUI_ABORTWARNING
+ Show a message box with a warning when the user wants to close the installer.

+
+

+ MUI_ABORTWARNING_TEXT text
+ Text to display on the abort warning message box.

+

+ MUI_ABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.

+
+
+

+ Open/Close section + Uninstaller abort warning

+
+

+ MUI_UNABORTWARNING
+ Show a message box with a warning when the user wants to close the uninstaller.

+
+

+ MUI_UNABORTWARNING_TEXT text
+ Text to display on the abort warning message box.

+

+ MUI_UNABORTWARNING_CANCEL_DEFAULT
+ Set the Cancel button as the default button on the message box.

+
+
+
+
+

+ 3. Pages

+
+

+ Insert the following macros to set the pages you want to use. The pages will appear + in the order in which you insert them in the script. You can also insert custom + Page commands between the macros to add custom pages.

+

+ You can add multiple pages of certain types (for example, if you want the user to + specify multiple folders).

+

+ Examples:

+
+!insertmacro MUI_PAGE_LICENSE "License.rtf"
+!insertmacro MUI_PAGE_COMPONENTS
+
+Var StartMenuFolder
+!insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder
+
+

+ You will need the page ID for the Start Menu folder page when using the Start Menu + folder macros. The folder will be stored in the specified variable.

+

+ Installer pages
+ MUI_PAGE_WELCOME
+ MUI_PAGE_LICENSE textfile
+ MUI_PAGE_COMPONENTS
+ MUI_PAGE_DIRECTORY
+ MUI_PAGE_STARTMENU pageid variable
+ MUI_PAGE_INSTFILES
+ MUI_PAGE_FINISH

+

+ Uninstaller pages
+ MUI_UNPAGE_WELCOME
+ MUI_UNPAGE_CONFIRM
+ MUI_UNPAGE_LICENSE textfile
+ MUI_UNPAGE_COMPONENTS
+ MUI_UNPAGE_DIRECTORY
+ MUI_UNPAGE_INSTFILES
+ MUI_UNPAGE_FINISH

+

+ Open/Close section + Page settings

+
+

+ Page settings apply to a single page and should be set before inserting a page macro. + The same settings can be used for installer and uninstaller pages. You have to repeat + the setting if you want it to apply to multiple pages. Example:

+
+;Add a directory page to let the user specify a plug-ins folder
+;Store the folder in $PluginsFolder
+
+Var PLUGINS_FOLDER
+!define MUI_DIRECTORYPAGE_VARIABLE $PluginsFolder
+!insertmacro MUI_PAGE_DIRECTORY
+
+

+

+ All standard texts in the user interface are loaded from language files, which are + available for all languages supported by NSIS. So you only need to define these + texts if you want to change the default.

+

+ If the parameter is a text that should be different for each language, define a + language string using LangString and use $(LangStringName) as value. For a license + text in multiple languages, LicenseLangString can be used. Refer the NSIS Users + Manual for more information about installers with multiple languages.

+

+ In all text settings, the doublequote character (") should be escaped in the + following form: $\"

+

+ Open/Close section + General page settings

+
+

+ MUI_PAGE_HEADER_TEXT text
+ Text to display on the header of the page.

+

+ MUI_PAGE_HEADER_SUBTEXT text
+ Subtext to display on the header of the page.

+
+

+ Open/Close section + Welcome page settings

+
+

+ To add a newline to any of these texts, use \r\n instead of $\r$\n.

+

+ MUI_WELCOMEPAGE_TITLE title
+ Title to display on the top of the page.

+

+ MUI_WELCOMEPAGE_TITLE_3LINES
+ Extra space for the title area.

+

+ MUI_WELCOMEPAGE_TEXT text
+ Text to display on the page.

+
+

+ Open/Close section + License page settings

+
+

+ MUI_LICENSEPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_LICENSEPAGE_TEXT_BOTTOM text
+ Text to display on the bottom of the page.

+

+ MUI_LICENSEPAGE_BUTTON button_text
+ Text to display on the 'I Agree' button.

+

+ MUI_LICENSEPAGE_CHECKBOX
+ Display a checkbox the user has to check to agree with the license terms.

+
+

+ MUI_LICENSEPAGE_CHECKBOX_TEXT text
+ Text to display next to the checkbox to agree with the license terms.

+
+

+ MUI_LICENSEPAGE_RADIOBUTTONS
+ Display two radio buttons to allow the user to choose between accepting the license + terms or not.

+
+

+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
+ Text to display next to the checkbox to accept the license terms.

+

+ MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
+ Text to display next to the checkbox to decline the license terms.

+
+
+

+ Open/Close section + Components page settings

+
+

+ MUI_COMPONENTSPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_COMPONENTSPAGE_TEXT_COMPLIST text
+ Text to display on next to the components list.

+

+ MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
+ Text to display on next to the installation type combo box.

+

+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
+ Text to display on the of the top of the description box.

+

+ MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
+ Text to display inside the description box when no section is selected.

+
+

+ Open/Close section + Directory page settings

+
+

+ MUI_DIRECTORYPAGE_TEXT_TOP text
+ Text to display on top of the page.

+

+ MUI_DIRECTORYPAGE_TEXT_DESTINATION text
+ Text to display on the destination folder frame.

+

+ MUI_DIRECTORYPAGE_VARIABLE variable
+ Variable in which to store the selected folder.
+ Default: $INSTDIR

+

+ MUI_DIRECTORYPAGE_VERIFYONLEAVE
+ Does not disable the Next button when a folder is invalid but allows you to use + GetInstDirError in the leave function to handle an invalid folder.

+
+

+ Open/Close section + Start Menu folder page settings

+
+

+ MUI_STARTMENUPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_STARTMENUPAGE_TEXT_CHECKBOX text
+ Text to display next to the checkbox to disable the Start Menu folder creation.

+

+ MUI_STARTMENUPAGE_DEFAULTFOLDER folder
+ The default Start Menu Folder.

+

+ MUI_STARTMENUPAGE_NODISABLE
+ Do not display the checkbox to disable the creation of Start Menu shortcuts.

+

+ MUI_STARTMENUPAGE_REGISTRY_ROOT root
+ MUI_STARTMENUPAGE_REGISTRY_KEY key
+ MUI_STARTMENUPAGE_REGISTRY_VALUENAME value_name
+ The registry key to store the Start Menu folder. The page will use it to remember + the users preference. You should also use for the uninstaller to remove the Start + Menu folders. Don't forget to remove this key during uninstallation.

+

+ For the uninstaller, use the MUI_STARTMENU_GETFOLDER macro to get the Start Menu + folder:

+
+!insertmacro MUI_STARTMENU_GETFOLDER page_id $R0
+  Delete "$SMPROGRAMS\$R0\Your Shortcut.lnk"
+
+
+

+ Open/Close section + Installation page settings

+
+

+ MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has + been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

+

+ MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
+ Subtext to display on the header of the installation page when the installation + has been completed (won't be displayed when using a Finish page without MUI_(UN)FINISHPAGE_NOAUTOCLOSE).

+

+ MUI_INSTFILESPAGE_ABORTHEADER_TEXT text
+ Text to display on the header of the installation page when the installation has + been aborted.

+

+ MUI_INSTFILESPAGE_ABORTHEADER_SUBTEXT text
+ Subext to display on the header of the installation page when the installation has + been aborted.

+
+

+ Open/Close section + Finish page settings

+
+

+ To add a newline to any of these texts, use \r\n instead of $\r$\n.

+

+ MUI_FINISHPAGE_TITLE title
+ Title to display on the top of the page.

+

+ MUI_FINISHPAGE_TITLE_3LINES
+ Extra space for the title area.

+

+ MUI_FINISHPAGE_TEXT text
+ Text to display on the page.

+

+ MUI_FINISHPAGE_TEXT_LARGE
+ Extra space for the text area (if using checkboxes).

+

+ MUI_FINISHPAGE_BUTTON text
+ Text to display on the Finish button.

+

+ MUI_FINISHPAGE_CANCEL_ENABLED
+ Enable the Cancel button so the user can skip any options displayed on the finish + page.

+

+ MUI_FINISHPAGE_TEXT_REBOOT text
+ Text to display on the finish page when asking for a system reboot.

+

+ MUI_FINISHPAGE_TEXT_REBOOTNOW text
+ Text to display next to the 'Reboot now' option button.

+

+ MUI_FINISHPAGE_TEXT_REBOOTLATER text
+ Text to display next to the 'Reboot later' option button.

+

+ MUI_FINISHPAGE_REBOOTLATER_DEFAULT
+ Sets the 'Reboot later' option as the default option.

+

+ MUI_FINISHPAGE_RUN exe_file
+ Application which the user can select to run using a checkbox. You don't need to + put quotes around the filename when it contains spaces.

+
+

+ MUI_FINISHPAGE_RUN_TEXT text
+ Texts to display next to the 'Run program' checkbox.

+

+ MUI_FINISHPAGE_RUN_PARAMETERS parameters
+ Parameters for the application to run. Don't forget to escape double quotes in the + value (use $\").

+

+ MUI_FINISHPAGE_RUN_NOTCHECKED
+ Do not check the 'Run program' checkbox by default

+

+ MUI_FINISHPAGE_RUN_FUNCTION function
+ Call a function instead of executing an application (define MUI_FINISHPAGE_RUN without + parameters). You can use the function to execute multiple applications or you can + change the checkbox name and use it for other things.

+
+

+ MUI_FINISHPAGE_SHOWREADME file/url
+ File or website which the user can select to view using a checkbox. You don't need + to put quotes around the filename when it contains spaces.

+
+

+ MUI_FINISHPAGE_SHOWREADME_TEXT text
+ Texts to display next to the 'Show Readme' checkbox.

+

+ MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+ Do not check the 'Show Readme' checkbox by default

+

+ MUI_FINISHPAGE_SHOWREADME_FUNCTION function
+ Call a function instead of showing a file (define MUI_FINISHPAGE_SHOWREADME without + parameters). You can use the function to show multiple files or you can change the + checkbox name and use it for other things.

+
+

+ MUI_FINISHPAGE_LINK link_text
+ Text for a link on the which the user can click to view a website or file.

+
+

+ MUI_FINISHPAGE_LINK_LOCATION file/url
+ Website or file which the user can select to view using the link. You don't need + to put quotes around the filename when it contains spaces.

+

+ MUI_FINISHPAGE_LINK_COLOR (color: RRGGBB hexadecimal)
+ Text color for the link on the Finish page.
+ Default: 000080

+
+

+ MUI_FINISHPAGE_NOREBOOTSUPPORT
+ Disables support for the page that allows the user to reboot the system. Define + this option to save some space if you are not using the /REBOOTOK flag or SetRebootFlag.

+
+

+ Open/Close section + Uninstall confirm page settings

+
+

+ MUI_UNCONFIRMPAGE_TEXT_TOP text
+ Text to display on the top of the page.

+

+ MUI_UNCONFIRMPAGE_TEXT_LOCATION text
+ Text to display next to the uninstall location text box.

+

+ MUI_UNCONFIRMPAGE_VARIABLE variable
+ Variable in which to store the uninstall source folder.
+ Default: $INSTDIR

+
+
+
+

+ 4. Language files

+
+

+ Insert the Modern UI language files for the languages to want to include.

+
+!insertmacro MUI_LANGUAGE "English"
+
+

+ The standard NSIS language files are loaded automatically, there is no need to use + LoadLanguageFile.

+
+

+ 5. Reserve files

+
+

+ If you are using solid compression, files that are required before the actual installation + should be stored first in the data block, because this will make your installer + start faster. Include reserve file commands for such files before your sections + and functions:

+
+ReserveFile "ioFile.ini" ;Your own InstallOptions INI files
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ;InstallOptions plug-in
+!insertmacro MUI_RESERVEFILE_LANGDLL ;Language selection dialog
+
+
+
+

+ Script code for pages

+
+

+ Some pages allow you to show additional information or can be used to get user input. + Here you can find the script code to use these features.

+

+ Components page descriptions

+
+

+ The Modern UI components page has a text box in which a description can be shown + when the user hovers the mouse over a component. If you don't want to use these + descriptions, insert the MUI_COMPONENTSPAGE_NODESC interface setting.

+

+ To set a description for a section, an additional parameter needs to be added to + Section command with a unique identifier for the section. This name can later be + used to set the description for this section.

+
+Section "Section Name 1" Section1
+   ...
+SectionEnd
+
+

+ After the sections, use these macros to set the descriptions:

+
+LangString DESC_Section1 ${LANG_ENGLISH} "Description of section 1."
+LangString DESC_Section2 ${LANG_ENGLISH} "Description of section 2."
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+  !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+

+ For the uninstaller, use the MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END + macros.

+
+

+ Start Menu folder

+
+

+ Put the code to write the shortcuts (using CreateShortcut) between the MUI_STARTMENU_WRITE_BEGIN + and MUI_STARTMENU_WRITE_END macros:

+
+!insertmacro MUI_STARTMENU_WRITE_BEGIN pageid
+  ...create shortcuts...
+!insertmacro MUI_STARTMENU_WRITE_END
+
+

+ The page ID should be the ID of the page on which the user has selected the folder + for the shortcuts you want to write.

+

+ The variable which contains the folder and the page ID are set as parameters of + the page macro.

+
+
+

+ Language selection dialog

+
+

+ If you want the installer to display a language selection dialog (see the the MultiLanguage.nsi example), + insert the MUI_LANGDLL_DISPLAY macro in the .onInit function:

+
+Function .onInit
+
+  !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd
+
+

+ This macro can also be used in the un.onInit function.

+

+ Open/Close section + Settings for registry storage of selected language

+
+

+ To remember the user's preference, you can define a registry key. These defines + should be set before inserting the installation page macro.

+

+ MUI_LANGDLL_REGISTRY_ROOT root
+ MUI_LANGDLL_REGISTRY_KEY key
+ MUI_LANGDLL_REGISTRY_VALUENAME value_name
+ The registry key to store the language. The users preference will be remembered. + You can also use it for the uninstaller to display the right language. Don't forget + to remove this key in the uninstaller.

+

+ For the uninstaller, insert the MUI_UNGETLANGUAGE macro in un.onInit to get the + stored language preference:

+
+Function un.onInit
+
+  !insertmacro MUI_UNGETLANGUAGE
+
+FunctionEnd
+
+
+

+ Open/Close section + Interface settings for selection dialog

+
+

+ To customize the language selection dialog interface, use these defines before inserting + the MUI_LANGDLL_DISPLAY macro.

+

+ MUI_LANGDLL_WINDOWTITLE text
+ The window title of the language selection dialog.

+

+ MUI_LANGDLL_INFO text
+ The text to display on the language selection dialog.

+

+ MUI_LANGDLL_ALWAYSSHOW
+ Always show the language selection dialog, even if a language has been stored in + the registry. The language stored in the registry will be selected by default.

+

+ MUI_LANGDLL_ALLLANGUAGES
+ Always show all available languages and don't filter according to their codepage.

+
+
+

+ Custom pages

+
+

+ If you want add your custom pages to your installer, you can insert your own page + commands between the page macros. The InstallOptions + documentation provides information about creating custom pages using InstallOptions.

+
+!insertmacro MUI_PAGE_WELCOME
+Page custom FunctionName ;Custom page
+!insertmacro MUI_PAGE_COMPONENTS
+ 
+;Uninstaller
+!insertmacro MUI_UNPAGE_CONFIRM
+UninstPage custom un.FunctionName ;Custom page
+!insertmacro MUI_UNPAGE_INSTFILES
+
+

+ Use the MUI_HEADER_TEXT macro to set the text on the page header in a page function:

+
+LangString PAGE_TITLE ${LANG_ENGLISH} "Title"
+LangString PAGE_SUBTITLE ${LANG_ENGLISH} "Subtitle"
+
+Function CustomPageFunction
+  !insertmacro MUI_HEADER_TEXT $(PAGE_TITLE) $(PAGE_SUBTITLE)
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "ioFile.ini"
+FunctionEnd
+
+
+

+ Custom functions

+
+

+ Interface functions provided by NSIS, like the .onGUIInit function and the page + functions are automatically included by the Modern UI and filled with code to support + new interface features. If you want to add additional code to these function, create + a function with the custom script code in the script use the Modern UI functions + call them.

+

+ Example:

+
+!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
+
+Function myGUIInit
+  ...your own code...
+FunctionEnd
+
+

+ Open/Close section + General Custom Functions

+
+

+ These defines should be set before inserting the language macros.

+

+ MUI_CUSTOMFUNCTION_GUIINIT function
+ MUI_CUSTOMFUNCTION_UNGUIINIT function
+ MUI_CUSTOMFUNCTION_ABORT function
+ MUI_CUSTOMFUNCTION_UNABORT function
+ MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION function
+ MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION function

+

+ Mouse over functions are only available when the description macros + (MUI_FUNCTION_DESCRIPTION_BEGIN) are used. When component page descriptions are not + used, regular .onMouseOverSection and un.onMouseOverSection must be used.

+
+

+ Open/Close section + Page Custom Functions

+
+

+ These defines should be set before inserting a page macro.

+

+ MUI_PAGE_CUSTOMFUNCTION_PRE function
+ MUI_PAGE_CUSTOMFUNCTION_SHOW function
+ MUI_PAGE_CUSTOMFUNCTION_LEAVE function

+

+ Notes:

+
    +
  • In the Pre function of the Welcome page and the Finish page, you can write to the + InstallOptions INI file of the page (ioSpecial.ini)
  • +
  • In the Show function of the Welcome, Finish and StartMenu pages, $MUI_HWND contains + the HWND of the inner dialog
  • +
+
+

+ Open/Close section + Welcome/Finish Page Custom Functions

+
+

+ This define should be inserted before a single Welcome or Finish page.

+

+ MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT function

+

+ This Init function is called before the InstallOptions INI file for the page is + written, so you can use it to initialize any variables used in the page settings.

+
+
+

+ Example scripts

+
+

+ Basic: Basic.nsi
+ Welcome/Finish page: WelcomeFinish.nsi
+ Multiple languages: MultiLanguage.nsi
+ Header image: HeaderBitmap.nsi
+ Custom pages: InstallOptions.nsi
+ Start Menu Folder page: StartMenu.nsi

+
+

+ Credits

+
+

+ Written by Joost Verburg.
+ Icons designed by Nikos Adamamas, aka adni18.
+ Thanks to Amir Szekely, aka KiCHiK, for his work on NSIS to make this possible.

+
+

+ License

+
+

+ The zlib/libpng license applies to the Modern UI.

+

+ Open/Close section + License Terms

+
+
+Copyright © 2002-2026 Joost Verburg
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; 
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+
+
+
+ + diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/images/closed.gif b/libs/NSIS/NSIS-source/Docs/Modern UI/images/closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..b45054ee8154b36b64d0bdbb9fe2b40d03ba1489 GIT binary patch literal 203 zcmZ?wbhEHb-oE{eQPhQI&^#bmMe?*-1zn9?~XGM zzy0|A_wT=qNe8Yzc>D3|&sQJ59l7$Xa^CUlkKQfZeSPiWJMAmZ#&_>2nt5dX(Yycu z|7So2ia%Mv0y-cPWG4fw$AZM(6iX?I32Sq-6C#$LE%7~QRI6ha$J`vZMvUW9-bR+y ujS-e6C%BTGrn;;USkW)0z)`&U-S%Y_J=qycRvoPq)%&nRCXR!V!5RQGW?{Dg literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/images/header.gif b/libs/NSIS/NSIS-source/Docs/Modern UI/images/header.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8810d30cf58ad6ef9c0b14a8be67aabd2065e81 GIT binary patch literal 6023 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/images/open.gif b/libs/NSIS/NSIS-source/Docs/Modern UI/images/open.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fff60ed5c309677255f7c0abf53a6aec2f06f0f GIT binary patch literal 138 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/Modern UI/images/screen2.png b/libs/NSIS/NSIS-source/Docs/Modern UI/images/screen2.png new file mode 100644 index 0000000000000000000000000000000000000000..4fccd41c85c2b8ed59c1782801027f273245ccbb GIT binary patch literal 18437 zcmb5Wby%Chw=No_NTJ0Fw79#JQe4~OF2x-R6n6XT(7>qh1}|NWUrpo z#nD#WnQy_8anQP6*KU~iguWo%CU!MISJ7}g0CT!)9hAP0$i$#li0s_bGUKEmS~!0oiIK_JD;Q_sVj>6qp0EnGs* zhVc3h+o`Id1v=x?py^bt+Jhfo*7Gp=M_DGZr{|Mi>a?-4T7xbB;)j=too2mNi4%S~ zTwHjQlP3Q6J}ZS;zWqqpk+HVc*5#tJp6kIG-HTNw8R3Cf@@GNAT=1WYu5XetXL0vrsQBm*0oLPoWat3mVy#@lw{- zK8WkmhuW+7%~t@1K541o`qp+|F}E)gb4_KcLY>R|j={*Uo1ERo>R1=_1XY|qU*6oj zL%#JE2}rlnO1yKbzgxwRm3C{r*AYUeVs!>b#Mry>)O_zZdmK$a$1Fx<3#ErlwuVC0 z$fc>GVBrm~#8k5h#%;}$KOw=vS4b4G$Bf$4DycDwV9^#f<4gOM%4_Wv8lFF=SVQ z8>xx;!6(mgg6vf|)T{nh)g?x8-X4hq)k)2qB^r%B|65qVXf(*sgbK{Ie94{@AQo~n z@n`QSZ*|K2$3@K82S6nRHwlooj)ceu57}bV%H)4j!D#DH8$A51= z2knINglnB5e_$KeW;BvdzcV|oU@eIGZWVl~-7J{hxviz?hPy6svO(X>&EoEN zknqthV=*}du~<3CaDQ4g{qnk;EFp~|2{oF9*1(pz)0DDA%cK6{zm~YP%KmtcH=s6}Q;gK9)A`$0u)`A%dl?rw6go;E1|~oTB;p6WRVu}Kpf$}W5uhsQ znW-|{j%k`Us^e)DTrw13!>4H6zdBh_04qnoX(}yw$7WSm@P>*C`C9ms z1K~QxiCuX;RsZPzu_c;@gZ*IP@G)}O4dNg>SG9Tb!4l@PA&rH#G6&h6$+s*o$mR!e zFtZ7YV*sd~DG^pAR`hFLhnzbKd#iMnE?+K3W@6$;{{Iatdg9P=LYD_)|yBfZ`v!Iu0mkS%M7Fv zqyV+&$e;KWNHzdW)QR~0Z;)O~o)1xmN(QH^Ehf~wD~#^wUY?xIX{O(Eta%8=rNK_O zb#DilG|_}tb}R~kO^0Javt>_ z>)@9I$iM+%(U^Ornavxui@BvGC;
e?YPWN_&^zLmh&ePE2D5 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 M07*qoM6N<$g8wU>6aWAK literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Docs/MultiUser/Readme.html b/libs/NSIS/NSIS-source/Docs/MultiUser/Readme.html new file mode 100644 index 0000000000..7e50d979ab --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/MultiUser/Readme.html @@ -0,0 +1,391 @@ + + + + + + + Multi-User Header File (MultiUser.nsh) + + + +

Multi-User Header File (MultiUser.nsh)

+

Installer configuration for multi-user Windows environments

+

Table of Contents

+
+

Introduction

+

+ Modern Windows versions support multiple users accounts on a single computer, each + with different privileges. For security reasons, the privileges of applications + can also be limited. For an installer, the execution level and installation + mode are important. The execution level determines the privileges of the + installer application. For example, to install hardware drivers, administrator privileges + are required. Applications can also be installed for a single user or for all users + on a computer, which is determined by the installation mode. Installation for all + users requires a higher execution level as compared with a single user setup. The + MultiUser.nsh header files provides the features to automatically handle all these + aspects related to user accounts and installer privileges.

+

+ Note that all settings need to be set before including the MultiUser.nsh header + file.

+

Initialization and Execution Level 

+

+ Before the MultiUser.nsh file is included, the MULTIUSER_EXECUTIONLEVEL define should + be set to one of the following values depending on the execution level that is required:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Value + + Description + + Typical application +
+ Admin + + Administrator privileges are required + + Access data of all users accounts +
+ Power + + Power User privileges are required
+ (Power Users no longer exist in Windows Vista. For Vista this is equivalent to Admin) +
+ Installation for all users (writing to "Program Files" or HKLM registry + keys), driver installation +
+ Highest + + Request the highest possible execution level for the current user + + Mixed-mode installer that can both be installed per-machine or per-user +
+ Standard + + No special rights required + + Installation for current user only +
+

+ Insert the MULTIUSER_INIT and MULTIUSER_UNINT macros in the .onInit and un.onInit + function to verify these privileges. If no uninstaller is created in the script, + define MULTIUSER_NOUNINSTALL.

+
!define MULTIUSER_EXECUTIONLEVEL Highest
+;!define MULTIUSER_NOUNINSTALL ;Uncomment if no uninstaller is created
+!include MultiUser.nsh
+
+...
+
+Function .onInit
+  !insertmacro MULTIUSER_INIT
+FunctionEnd
+
+Function un.onInit
+  !insertmacro MULTIUSER_UNINIT
+FunctionEnd
+

+ Whether the required privileges can be obtained depends on the user that starts + the installer:

+
    +
  • Windows NT 4/2000/XP/2003 give the installer the same privileges as the user itself. + If the privileges of the user are not sufficient (e.g. Admin level is required is + set but the user has no administrator rights), the macros will display an error + message and quit the installer. If is however possible to manually run the installer + with an administrator account.
  • +
  • Windows Vista restricts the privileges of all applications by default. Depending + on requested execution level, MultiUser.nsh will set the RequestExecutionLevel flag + to request privileges. The user will be asked for confirmation and (if necessary) + for an administrator password.
  • +
  • Windows 95/98/98 do not set any restrictions on users or applications. Administrator + rights are always available.
  • +
+

+ It is recommended to insert these initialization macros before macros that require + user intervention. For example, it does not make sense to ask a user for an installer + language if the installer will quit afterwards because the user account does not + have the required privileges. After the macros are inserted, the variable $MultiUser.Privileges + will contain the current execution level (Admin, Power, User or Guest).

+

+ The following additional settings are available to customize the initialization:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SettingDescription
+ MULTIUSER_INIT_TEXT_ADMINREQUIRED + + Error message to be displayed when administrator rights are required but not available. +
+ MULTIUSER_INIT_TEXT_POWERREQUIRED + + Error message to be displayed when Power User rights are required but not available. +
+ MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE + + Error message to be displayed when administrator or Power User rights are required + because of an installation mode setting on the command line (see below) but are + not available. +
+ MULTIUSER_USE_PROGRAMFILES64 + + Use $PROGRAMFILES64 instead of $PROGRAMFILES as the default all users directory. +
+ MULTIUSER_INIT_FUNCTIONQUIT
+ MULTIUSER_INIT_UNFUNCTIONQUIT +
+ A custom function to be called when the installer is closed due to insufficient + privileges. +
+

Installation Mode

+

+ As mentioned before, applications can both be installed for a single users or for + all users on a computer. Applications for all users are typically installed in the + Program Files folder and appear in the Start Menu of every user. On the contrary, + applications for a single user are usually installed in the local Application Data + folder and only a appear in the Start Menu of the user who installed the application.

+

+ By default, MultiUser.nsh will set the installation mode for a per-machine installation + if Administrator or Power User rights are available (this is always the case if + the execution level is set to Admin or Power, if Highest is set it depends on the + user account). For the Standard execution level the installation will always be + for a single user. On Windows 95/98/Me installation for a single user is not possible, a per-machine installation will be performed.

+

+ The following settings are available to change the default installation mode: + + + + + + + + + + + + + +
SettingDescription
+ MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + + Set default to a per-user installation, even if the rights for a per-machine installation + are available. +
+ MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME + + Non-empty registry key that is created during the installation in either HKCU or + HKLM. The default installation mode will automatically be set to the previously + selected mode depending on the location of the key. +
+

+ After initialization, the variable $MultiUser.InstallMode will contain the current + installation mode (AllUsers or CurrentUser). +

+

Mixed-Mode Installation

+

+ For the Admin and Power levels, both a per-machine as well as a per-user installation + is possible. If the Highest level is set and the user is an Administrator or Power + User, both options are also available.

+

+ Usually it's a good thing to give the user to choice between these options. For + users of the Modern UI version 2, a page is provided that asks the user for the + installation mode. To use this page, define MULTIUSER_MUI before including MultiUser.nsh. + Then, the MULTIUSER_PAGE_INSTALLMODE macro can be used just like a normal Modern + UI page (this page will automatically be skipped when running Windows 95/98/Me):

+
!define MULTIUSER_EXECUTIONLEVEL Highest
+!define MULTIUSER_MUI
+!define MULTIUSER_INSTALLMODE_COMMANDLINE
+!include MultiUser.nsh
+!include MUI2.nsh
+
+!insertmacro MULTIUSER_PAGE_INSTALLMODE
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES 
+
+!insertmacro MUI_LANGUAGE English
+
+...
+
+Function .onInit
+  !insertmacro MULTIUSER_INIT
+FunctionEnd
+
+Function un.onInit
+  !insertmacro MULTIUSER_UNINIT
+FunctionEnd
+

+ The MULTIUSER_INSTALLMODE_COMMANDLINE setting that also appears in this example + enables the installation mode to be set using the /AllUsers or /CurrentUser command + line parameters. This is especially useful for silent setup.

+

+ The following settings can be used to customize the texts on the page (in addition + to the general Modern UI page settings):

+ + + + + + + + + + + + + + + + + + + + + +
SettingDescription
MULTIUSER_INSTALLMODEPAGE_TEXT_TOPText to display on the top of the page.
MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERSText to display on the radio button for a per-machine installation.
MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSERText to display on the radio button for a per-user installation.
MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAMEAppend the username to the per-user radio button.
+

Installation Mode Initialization

+

+ The SetShellVarContext flag (which determines the folders for e.g. shortcuts, like + $DESKTOP) is automatically set depending on the installation mode. In addition, + the following settings can be used to perform additional actions when the installation + mode is initialized:

+ + + + + + + + + + + + + + + + +
SettingDescription
MULTIUSER_INSTALLMODE_INSTDIR + Name of the folder in which to install the application, without a path. This folder + will be located in Program Files for a per-machine installation and in the local + Application Data folder for a per-user installation (if supported). +
MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + Registry key from which to obtain a previously stored installation folder. It will + be retrieved from HKCU for per-user and HKLM for per-machine. +
+ MULTIUSER_INSTALLMODE_FUNCTION
+ MULTIUSER_INSTALLMODE_UNFUNCTION +
+ A custom function to be called during the initialization of the installation mode + to set additional installer settings that depend on the mode +
+

+ To set the installation mode manually, call one of these four functions:

+ + + + + + + + + + + + + + + + + + +
+ Function name + + Installation mode +
+ MultiUser.InstallMode.AllUsers + + Installer: Per-machine installation +
+ MultiUser.InstallMode.CurrentUser + + Installer: Per-user installation +
+ un.MultiUser.InstallMode.AllUsers + Uninstaller: Per-machine installation +
+ un.MultiUser.InstallMode.CurrentUser + Uninstaller: Per-user installation +
+ +

Example

+ Basic: MultiUser.nsi
+ + diff --git a/libs/NSIS/NSIS-source/Docs/NSISdl/License.txt b/libs/NSIS/NSIS-source/Docs/NSISdl/License.txt new file mode 100644 index 0000000000..642304fa0c --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/NSISdl/License.txt @@ -0,0 +1,18 @@ +NSISdl 1.1 - HTTP downloading plugin for NSIS +Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/NSISdl/ReadMe.txt b/libs/NSIS/NSIS-source/Docs/NSISdl/ReadMe.txt new file mode 100644 index 0000000000..4e1a706640 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/NSISdl/ReadMe.txt @@ -0,0 +1,92 @@ +NSISdl 1.3 - HTTP downloading plugin for NSIS +--------------------------------------------- + +Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel + +This plugin can be used from NSIS to download files via HTTP. +Note: HTTPS is not supported, only plain HTTP! + +To connect to the internet, use the Dialer plugin. + +USAGE +----- + +NSISdl::download http://www.domain.com/file localfile.exe + +You can also pass /TIMEOUT to set the timeout in milliseconds: + +NSISdl::download /TIMEOUT=30000 http://www.domain.com/file localfile.exe + +The return value is pushed to the stack: + + "cancel" if cancelled + "success" if success + otherwise, an error string describing the error + +If you don't want the progress window to appear, use NSISdl::download_quiet. + +Example of usage: + +NSISdl::download http://www.domain.com/file localfile.exe +Pop $R0 ;Get the return value + StrCmp $R0 "success" +3 + MessageBox MB_OK "Download failed: $R0" + Quit + +For another example, see waplugin.nsi in the examples directory. + +PROXIES +------- + +NSISdl supports only basic configurations of proxies. It doesn't support +proxies which require authentication, automatic configuration script, etc. +NSISdl reads the proxy configuration from Internet Explorer's registry key +under HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings. It +reads and parses ProxyEnable and ProxyServer. + +If you don't want NSISdl to use Internet Explorer's settings, use the +/NOIEPROXY flag. /NOIEPROXY should be used after /TRANSLATE and +/TIMEOUT. For example: + +If you want to specify a proxy on your own, use the /PROXY flag. + +NSISdl::download /NOIEPROXY http://www.domain.com/file localfile.exe +NSISdl::download /TIMEOUT=30000 /NOIEPROXY http://www.domain.com/file localfile.exe +NSISdl::download /PROXY proxy.whatever.com http://www.domain.com/file localfile.exe +NSISdl::download /PROXY proxy.whatever.com:8080 http://www.domain.com/file localfile.exe + +TRANSLATE +--------- + +To translate NSISdl add the following values to the call line: + +/TRANSLATE2 downloading connecting second minute hour seconds minutes hours progress + +Default values are: + + downloading - "Downloading %s" + connecting - "Connecting ..." + second - " (1 second remaining)" + minute - " (1 minute remaining)" + hour - " (1 hour remaining)" + seconds - " (%u seconds remaining)" + minutes - " (%u minutes remaining)" + hours - " (%u hours remaining)" + progress - "%skB (%d%%) of %skB @ %u.%01ukB/s" + +The old /TRANSLATE method still works for backward compatibility. + +/TRANSLATE downloading connecting second minute hour plural progress remaining + +Default values are: + + downloading - "Downloading %s" + connecting - "Connecting ..." + second - "second" + minute - "minute" + hour - "hour" + plural - "s" + progress - "%dkB (%d%%) of %ukB @ %d.%01dkB/s" + remaining - " (%d %s%s remaining)" + +/TRANSLATE and /TRANSLATE2 must come before /TIMEOUT. diff --git a/libs/NSIS/NSIS-source/Docs/Splash/splash.txt b/libs/NSIS/NSIS-source/Docs/Splash/splash.txt new file mode 100644 index 0000000000..44fc0e9dca --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/Splash/splash.txt @@ -0,0 +1,41 @@ +Splash.dll - small (4k), simple plugin that lets you throw +up a splash screen in NSIS installers. + +--- UPDATED in 2.0b0 - will break old scripts --- + +To use: + +Create a .BMP file of your splash screen. +(optional) Create a .WAV file to play while your splash screen shows. + +Add the following lines to your .NSI file: + +Function .onInit + SetOutPath $TEMP + File /oname=spltmp.bmp "my_splash.bmp" + +; optional +; File /oname=spltmp.wav "my_splashsound.wav" + + splash::show 1000 $TEMP\spltmp + + Pop $0 ; $0 has '1' if the user closed the splash screen early, + ; '0' if everything closed normally, and '-1' if some error occurred. + + Delete $TEMP\spltmp.bmp +; Delete $TEMP\spltmp.wav +FunctionEnd + +Note that the first parameter to splash.exe is the length to show the +screen for (in milliseconds), and the second is the splash bitmap filename (without +the .bmp). The BMP file used will be this parameter.bmp, and the wave file used +(if present) will be this parameter.wav. + +(If you already have an .onInit function, put that in it) + +Note: the return value of splash is 1 if the user closed the splash +screen early (pop it from the stack) + +-Justin + +Converted to a plugin DLL by Amir Szekely (kichik) diff --git a/libs/NSIS/NSIS-source/Docs/StartMenu/Readme.txt b/libs/NSIS/NSIS-source/Docs/StartMenu/Readme.txt new file mode 100644 index 0000000000..74329986a9 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/StartMenu/Readme.txt @@ -0,0 +1,47 @@ +StartMenu.dll shows a custom page that lets the user select a start menu program +folder to put shortcuts in. + +To show the dialog use the Select function. This function has one required parameter +which is the program group default name, and some more optional switches: + /autoadd - automatically adds the program name to the selected folder + /noicon - doesn't show the icon in the top left corner + /text [please select...] - sets the top text to something else than + "Select the Start Menu folder in which..." + /lastused [folder] - sets the edit box to a specific value folder. + Use this to make this plug-in remember the last + folder selected by the user + /checknoshortcuts text - Shows a check box with the text "text". If + the user checks this box, the return value + will have > as its first character and you + should not create the program group. + /rtl - sets the direction of every control on the selection dialog + to RTL. This means every text shown on the page will be + justified to the right. + +The order of the switches doesn't matter but the required parameter must come after +all of them. Every switch after the required parameter will be ignored and left +on the stack. + +The function pushes "success", "cancel" or an error to the stack. If there was no +error and the user didn't press on cancel it will push the selected folder name +after "success". If the user checked the no shortcuts checkbox the result will be +prefixed with '>'. The function does not push the full path but only the selected +sub-folder. It's up to you to decide if to put it in the current user or all +users start menu. + +To set properties of the controls on the page, such as colors and fonts use Init +and Show instead of Select. Init will push the HWND of the page on the stack, +or an error string. For example: + +StartMenu::Init "Test" +Pop $0 +IntCmp $0 0 failed +GetDlgItem $0 $0 1003 +SetCtlColors $0 "" FF0000 +StartMenu::Show +# continue as with Select here +failed: + +Look at Example.nsi for a full example (without Init and Select). + +Created by Amir Szekely (aka KiCHiK) \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/StrFunc/StrFunc.txt b/libs/NSIS/NSIS-source/Docs/StrFunc/StrFunc.txt new file mode 100644 index 0000000000..f479b7f4c1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/StrFunc/StrFunc.txt @@ -0,0 +1,705 @@ +String Functions Header File Readme +----------------------------------- + +String Functions Header File contains a set of good string manipulation +functions in a much simpler way to include and call in NSIS scripts. + +How to use +---------- + + Basic Syntax + ------------ + + Parameters are specified in this format: + required (required) (option1 | option2) [optional or add. options] + [option1 | option2] + + The stars in command titles (*****) are the function usefulness in my + opinion. The more starts, the more useful it is. 5 stars (*****) is the + most useful. + + Any time when is mentioned "Default is" means that you can use the value + mentioned or keep it blank, the result is the same. + + If you want a certain value (e.g. a text) to be language-specific, set a + language string (using LangString) and define $(STRINGNAME) as value. + + If you want to add ` to a string, you should always escape it using $\` + because the header file macro functions use ` to separate parameters. + + 1. Include Header file + ---------------------- + + !include "StrFunc.nsh" + + StrFunc.nsh is inside the Include directory, so you don't have to + specify a path. + + You have to put this command before any command used in this header file. + + 2. Defines + ---------- + + This header file contains defines that automate the life of some who + fear a lot of changes sometimes imposed in this header file, or who have + applications that put it to work at maximum capacity. Before you try + these, take a look at the information below: + + - Every item on a define value is separated by a "|", and every subitem + (items in an item) is separated by " ". + + - Use ${StrTok} $var "${DefineName}" "|" "$counter" "0" to get every + item inside the define. For subitems, use ${StrTok} $var2 "$var" " " + "$counter2" "0" after getting the value for a desired item. + + - ${StrFunc_List} is automatically made by the header file. The rest + is manually added to the header. + + 2.1 Defines List: + ----------------- + + StrFunc_List - Lists all function names currently available on StrFunc + header file. + + *_List - Lists all parameter names currently available for "*" + function. (* = function name - i.e. StrTok_List). + + *_TypeList - Lists the types of all parameters on "*" function. + (* = function name - i.e. StrTok_List). Possible types + for each parameter: + + - Output - Needs a variable to output a function result. + + - Text - Needs text or number to be input. + + - Mixed - Needs text, number or option to be input. + Each subitem following the "Mixed" word is an + option. The first option is ever the default + one. Two following spaces " " means that + that subitem is empty. + + - Option - Needs an option to be input. Each subitem + following the "Option" word is an option. + The first option is ever the default one. Two + following spaces " " means that that subitem + is empty. + + 3. Commands + ----------- + + Some commands have special specifications to work. Consult command's + documentation on "3.3 Commands" section. + + 3.1 How To Use Commands In Install Sections and Functions + --------------------------------------------------------- + + Every command used in install sections and functions have to be declared + before (and outside of) any sections and functions, and without + parameters. + + Example: + -------- + + ${UsingStrFunc} StrStr + + 3.2 How To Use Commands In Uninstall Sections and Functions + ----------------------------------------------------------- + + Commands for uninstall sections and functions have "Un" before + the name. + + Example: + -------- + + ${UsingStrFunc} UnStrStr + + A complete example with both Install and Uninstall Commands: + ------------------------------------------------------------ + + + !include "StrFunc.nsh" + + ${UsingStrFunc} StrStr # Supportable for Install Sections and Functions + + ${UsingStrFunc} UnStrStr # Supportable for Uninstall Sections and Functions + + Section + + ${StrStr} $0 "OK! Now what?" "wh" + + SectionEnd + + Section Uninstall + + ${UnStrStr} $0 "OK! Now what?" "wh" + + SectionEnd + + 3.3 Commands + ------------ + + ========================================================================= + ** ${StrCase} + ------------------------------------------------------------------------- + ResultVar String Type(|L|U|T|S|<>) + ========================================================================= + Converts "String" to "Type" Case. Uses LogicLib. + + Parameters: + + ResultVar + Destination where result is returned. + + String + String to convert to "Type" case. + + Type + Type of string case to convert to: + + - "" = Original Case (same as "String") + - L = Lower Case (this is just an example. a very simple one.) + - U = Upper Case (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.) + - T = Title Case (This Is Just An Example. A Very Simple One.) + - S = Sentence Case (This is just an example. A very simple one.) + - <> = Switch Case (This is just an example. A very simple one.) + + Default value is "" (Original Case). + + Result Value -> ResultVar: + + "String" in "Type" case. + + Example: + + ${StrCase} $0 '"Você" is "You" in English.' "U" + [__(_)__()___()__()__(____)_] + + $0 = '"VOCÊ" IS "YOU" IN ENGLISH.' + + ========================================================================= + * ${StrClb} + ------------------------------------------------------------------------- + ResultVar String Action(|>|<|<>) + ========================================================================= + Makes an action with the clipboard depending on value of parameter + "Action". Uses LogicLib. + + Parameters: + + String + If "Action" = ">" or "<>" - String to put on the clipboard. + + Action + Can be one of the following values: + + - "" = Cleans the clipboard. + - ">" = Set string to clipboard. + - "<" = Get string from clipboard. + - "<>" = Swap string with clipboard's. + + Result Value -> ResultVar: + + If "Action" = "<" or "<>" - String found on the clipboard. + + ========================================================================= + *** ${StrIOToNSIS} + ------------------------------------------------------------------------- + ResultVar String + ========================================================================= + Convert "String" from Install Options plugin to be supported by NSIS. + Escape, back-slash, carriage return, line feed and tab characters are + converted. + + Parameters: + + ResultVar + Destination where result is returned. + + String + String to convert to be supportable for NSIS. + + Result Value -> ResultVar: + + "String" supportable for NSIS. + + Example: + + ${StrIOToNSIS} $0 "\r\n\t\\This is just an example\\" + [()()()()_______________________()] + + $0 = "$\r$\n$\t\This is just an example\" + + ========================================================================= + * ${StrLoc} + ------------------------------------------------------------------------- + ResultVar String StrToSearchFor CounterDirection(>|<) + ========================================================================= + Searches for "StrToSearchFor" in "String" and returns its location, + according to "CounterDirection". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search "StrToSearchFor". + + StrToSearchFor + String to search in "String". + + CounterDirection(>|<) + Direction where the counter increases to. Default is ">". + (> = increases from left to right, < = increases from right to left) + + Result Value -> ResultVar: + + Where "StrToSearchFor" is, according to "OffsetDirection". + + Example: + + ${StrLoc} $0 "This is just an example" "just" "<" + (__)<<<<<<<<<<< + + $0 = "11" + + ========================================================================= + *** ${StrNSISToIO} + ------------------------------------------------------------------------- + ResultVar String + ========================================================================= + Converts "String" from NSIS to be supported by Install Options plugin. + Escape, back-slash, carriage return, line feed and tab characters are + converted. + + Parameters: + + ResultVar + Destination where result is returned. + + String + String to convert to be supportable for Install Options plugin. + + Result Value -> ResultVar: + + "String" supportable for Install Options plugin. + + Example: + + ${StrNSISToIO} $0 "$\r$\n$\t\This is just an example\" + [(_)(_)(_)^_______________________^] + + $0 = "\r\n\t\\This is just an example\\" + + ========================================================================= + ***** ${StrRep} + ------------------------------------------------------------------------- + ResultVar String StrToReplace ReplacementString + ========================================================================= + Searches for all "StrToReplace" in "String" replacing those with + "ReplacementString". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search "StrToReplace". + + StrToReplaceFor + String to search in "String". + + StringToBeReplacedWith + String to replace "StringToReplace" when it is found in "String". + + Result Value -> ResultVar: + + "String" with all occurrences of "StringToReplace" replaced with + "ReplacementString". + + Example: + + ${StrRep} $0 "This is just an example" "an" "one" + [____________()_______] + + $0 = "This is just one example" + + ========================================================================= + *** ${StrSort} + ------------------------------------------------------------------------- + ResultVar String CenterStr LeftStr RightStr IncludeLeftStr(1|0) + IncludeCenterStr(1|0) IncludeRightStr(1|0) + ========================================================================= + Searches for "CenterStr" in "String", and returns only the value + between "LeftStr" and "RightStr", including or not the "CenterStr" using + "IncludeCenterStr" and/or the "LeftStr" using "IncludeLeftStr" and + "RightStr" using "IncludeRightStr". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search "CenterStr". + + CenterStr + String to search in "String". + + LeftStr + The first occurrence of "LeftStr" on the left of "CenterStr". + If it is an empty value, or was not found, will return + everything on the left of "CenterStr". + + RightStr + The first occurrence of "RightStr" on the right of "CenterStr". + If it is an empty value, or was not found, will return + everything on the right of "CenterStr". + + IncludeLeftStr(1|0) + Include or not the "LeftStr" in the result value. Default is 1 + (True). (1 = True, 0 = False) + + IncludeCenterStr(1|0) + Include or not the "CenterStr" in the result value. Default is 1 + (True). (1 = True, 0 = False) + + IncludeRightStr(1|0) + Include or not the "RightStr" in the result value. Default is 1 + (True). (1 = True, 0 = False) + + Result Value -> ResultVar: + + String between "LeftStr" and "RightStr" of a found "CenterStr" + including or not the "LeftStr" and "RightStr" if + "IncludeLeftRightStr" is 1 and/or the "CenterStr" if + "IncludeCenterStr" is 1. + + Example: + + ${StrSort} $0 "This is just an example" " just" "" "ple" "0" "0" "0" + [_______(___)_______]( ) + C R + + $0 = "This is an exam" + + ========================================================================= + ***** ${StrStr} + ------------------------------------------------------------------------- + ResultVar String StrToSearchFor + ========================================================================= + Searches for "StrToSearchFor" in "String". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search "StrToSearchFor". + + StrToSearchFor + String to search in "String". + + Result Value -> ResultVar: + + "StrToSearchFor" + the string after where "StrToSearchFor" was found in + "String". + + Example: + + ${StrStr} $0 "This is just an example" "just" + >>>>>>>>>{_)____________] + + $0 = "just an example" + + ========================================================================= + ***** ${StrStrAdv} + ------------------------------------------------------------------------- + ResultVar String StrToSearchFor SearchDirection(>|<) + ResultStrDirection(>|<) DisplayStrToSearch(1|0) Loops CaseSensitive(0|1) + ========================================================================= + Searches for "StrToSearchFor" in "String" in the direction specified by + "SearchDirection" and looping "Loops" times. + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search "StrToSearchFor". + + StrToSearchFor + String to search in "String". + + SearchDirection (>|<) + Where do you want to direct the search. Default is ">" (to right). + (< = To left, > = To right) + + ResultStrDirection (>|<) + Where the result string will be based on in relation of + "StrToSearchFor" + position. Default is ">" (to right). (< = To left, > = To right) + + DisplayStrToSearch (1|0) + Display "StrToSearchFor" in the result. Default is "1" (True). + (1 = True, 0 = False) + + Loops + Number of times the code will search "StrToSearchFor" in "String" not + including the original execution. Default is "0" (1 code execution). + + CaseSensitive(0|1) + If "1" the search will be case-sensitive (differentiates between cases). + If "0" it is case-insensitive (does not differentiate between cases). + Default is "0" (Case-Insensitive). + + + Result Value -> ResultVar: + + "StrToSearchFor" if "DisplayStrToSearch" is 1 + the result string after + or before "StrToSearchFor", depending on "ResultStrDirection". + + Result with Errors: + + When "StrToSearchFor" was not found, will return an empty string. + + When you put nothing in "StrToSearchFor", will return "String" and set + error flag. + + When you put nothing in "String", will return an empty string and set + error flag. + + Example: + + ${StrStrAdv} $0 "This IS really just an example" "IS " ">" ">" "0" "0" "1" + >>>>>( )[____________________] + + + $0 = "really just an example" + + ========================================================================= + **** ${StrTok} + ------------------------------------------------------------------------- + ResultVar String Separators ResultPart[L] SkipEmptyParts(1|0) + ========================================================================= + Returns the part "ResultPart" between two "Separators" inside + "String". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search for "Separators". + + Separators + Characters to find on "String". + + ResultPart[L] + The part want to be found on "StrToTokenize" between two "Separators". + Can be any number, starting at 0, and "L" that is the last part. + Default is L (Last part). + + SkipEmptyParts(1|0) + Skips empty string parts between two "Separators". Default is 1 (True). + (1 = True, 0 = False) + + Result Value -> ResultVar: + + "String" part number "Part" between two "Separators". + + Examples: + + 1) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" + ( ) () () () [_] ( ) () ( ) + 0 1 2 3 4 5 6 7 + $0 = "not" + + 2) ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0" + ( ) () ^() [] ( ) ^( ) () ( ) + 0 1 23 4 5 67 8 9 + $0 = "is" + + ========================================================================= + * ${StrTrimNewLines} + ------------------------------------------------------------------------- + ResultVar String + ========================================================================= + Deletes unnecessary new lines at end of "String". + + Parameters: + + ResultVar + Destination where result is returned. + + String + String where to search unnecessary new lines at end of "String". + + Result Value -> ResultVar: + + "String" with unnecessary end new lines removed. + + Example: + + ${StrTrimNewLines} $0 "$\r$\nThis is just an example$\r$\n$\r$\n" + [_____________________________(_)(_)(_)(_)] + + $0 = "$\r$\nThis is just an example" + +Functions included and not included +-------------------------------------------------- + +11 functions have been included + They are not available on Archive + They are on LogicLib format + +15 functions have not been included + 12 were not included because of better functions + 6 were not included because of AdvStrTok (called here as StrTok) + First String Part Function + Save on Variables Function + Sort Strings (1, 2 and 3) Functions + StrTok Function + 2 were not included because of StrCase + StrLower Function + StrUpper Function + 2 were not included because of StrClb + StrClbSet Function + StrClbGet Function + 1 was not included because of NSISToIO and IOToNSIS + Convert / to // in Paths Function + 1 was not included because of original String Replace Function (called + here as StrRep) + Another String Replace Function + 2 were not included because they aren't useful anymore + Slash <-> Backslash Converter Function + Trim Function + 1 was not included because of bugs + Number to String Converter Function + +Version History +--------------- + +1.09 - 10/22/2004 + +- Fixed stack problems involving: StrCase, StrRep, StrSort, StrTok. +- Fixed StrClb: When "Action" = "<>", handle was wrongly output as text. +- Fixed StrSort, StrStrAdv documentation examples. +- Fixed StrIOToNSIS, StrLoc, StrNSISToIO, StrRep, StrStr: sometimes + didn't find "StrToSearch" at all. + +1.08 - 10/12/2004 + +- Converted all the functions to LogicLib. +- StrSort: Totally remade and it can break old scripts. See + documentation for details. +- StrTok: "ResultPart" has to start from 0 and it can break old scripts. + See documentation for details. +- Added defines: StrFunc_List, *_List and *_TypeList. +- Fixed StrStrAdv: Variables $R0-$R3 couldn't be used in scripts before calling. +- StrRep: Cut down some variables. +- Arranged correctly the order of StrSort on the documentation. + +1.07 - 09/21/2004 + +- Removed ${UnStrFunc} command. Now you can just include uninstall + functions commands like ${UnStrStr} to be supported by uninstall functions + and sections. +- Added case-sensitive comparison option for StrStrAdv. +- StrCase now uses System.dll which makes case conversions effective with +all latin letters (i.e. ê). +- Added switch case and original case for StrCase. +- StrClbSet and StrClbGet removed, added StrClb. +- Made compact the most usual operations inside the header file. File size +reduced. + +1.06 - 03/26/2004 + +- StrNumToStr removed due to complex number handling on some languages. +- Fixed the bug where the old string was attached to string returned by + StrCase when $R5 variable was used. + +1.05 - 03/17/2004 + +- Fixed a bug with StrCase, Title Case wasn't working as should be. +- Fixed a bug with StrStrAdv, previous fix created another bug, string not + returned correctly when using backwards search with "DisplayStrToSearch" as + "0". + +1.04 - 03/07/2004 + +- Added new StrCase, removed StrLower and StrUpper. +- Organized by name commands inside header and readme files. + +1.03 - 02/12/2004 + +- Added commands support for uninstall sections and functions. +- Fixed variables switch in "StrLoc" and "StrTok" after using these. + +1.02 - 02/07/2004 + +- Fixed StrLoc. +- Fixed Documentation about StrLoc. "Direction" is really "OffsetDirection". +- Added my new AdvStrSort, and removed the old one. + +1.01 - 02/05/2004 + +- Fixed Documentation about StrSort and StrTok. +- Fixed StrTok default value for the string part. Now it's "L". +- Fixed StrStrAdv fixed wrong search when had a combination of same + substrings one after another in a string. +- Fixed StrLoc: when a string isn't found, don't return any value at all. + +1.00 - 02/01/2004 + +- Added documentation. +- Renamed header file to "StrFunc.nsh". +- Added 1 function, StrLoc. +- Modified StrStrAdv, removed some lines. +- Fixed StrTok, 2 simple numbers made it loop every time. +- Fixed some small issues on the header file. + +0.02 - 01/24/2004 + +- Completed StrFunc.nsh file. Need some tests and the readme. + +0.01 - 01/22/2004 + +- First version to test ideas... + +Credits +------- + + Made by Diego Pedroso (aka deguix). + +Functions Credits +----------------- + +- All functions are made by Diego Pedroso on LogicLib format. They + are based on functions by Amir Szekely, Dave Laundon, Hendri + Adriaens, Nik Medved, Joost Verburg, Stuart Welch, Ximon Eighteen, + "bigmac666" and "bluenet". "bluenet"'s version of StrIOToNSIS and + StrNSISToIO on LogicLib format were included. + +License +------- + +This header file is provided 'as-is', without any express or implied +warranty. In no event will the author be held liable for any damages +arising from the use of this header file. + +Permission is granted to anyone to use this header file for any purpose, +including commercial applications, and to alter it and redistribute +it freely, subject to the following restrictions: + +1. The origin of this header file must not be misrepresented; + you must not claim that you wrote the original header file. + If you use this header file in a product, an acknowledgment in the + product documentation would be appreciated but is not required. +2. Altered versions must be plainly marked as such, + and must not be misrepresented as being the original header file. +3. This notice may not be removed or altered from any distribution. \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/System/System.html b/libs/NSIS/NSIS-source/Docs/System/System.html new file mode 100644 index 0000000000..3838936023 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/System/System.html @@ -0,0 +1,898 @@ + + + + + + +System Plug-in (NSIS) + + + +

NSIS System Plug-in

+

+Copyright © 2002 brainsucker (Nik Medved)
Copyright © 2002-2026 NSIS Contributors +

+ +

Table of Contents

+ + + +

Introduction

+ +

The System plug-in gives developers the ability to call any exported function from any DLL. For example, you can use it to call GetLogicalDriveStrings to get a list of available drives on the user's computer.

+ +

The System plug-in also allows the developer to allocate, free and copy memory; interact with COM objects and perform mathematical operations on 64-bit integers.

+ +

Programming knowledge is highly recommended for good understanding of the System plug-in.

+ +

Usage Examples From The Wiki

+ + + +

Available Functions

+ +

Memory Related Functions

+ +
+
    + +
  • +Alloc SIZE +
    +

    Allocates SIZE bytes and returns a memory address on the stack.

    +

    Usage Example

    +
    +System::Alloc 64
    +Pop $0
    +DetailPrint "64 bytes allocated at $0"
    +System::Free $0
    +
    +
    +
  • +
  • +StrAlloc SIZE +
    +

    Allocates a string buffer for SIZE TCHARs and returns a memory address on the stack. This is extremely useful if you want to write an NSI script that will work for both ANSI and Unicode NSIS.

    +

    Usage Example

    +
    +System::StrAlloc 64 ; String buffer for 63 characters and \0 termination.
    +Pop $0
    +DetailPrint "A string buffer for 64 characters allocated at $0"
    +System::Free $0
    +
    +
    +
  • +
  • +Copy [/SIZE] DESTINATION SOURCE +
    +

    Copies SIZE bytes from SOURCE to DESTINATION. If SIZE is not specified, SOURCE's size will queried using GlobalSize. This means that if you don't allocate SOURCE using System::Alloc, System::Call or GlobalAlloc, you must specify SIZE. If DESTINATION is zero it will be allocated and its address will be pushed on the stack.

    +

    Usage example

    +
    +# allocate a buffer and put 'test string' and an int in it
    +System::Call "*(&t1024 'test string', i 5) p .s"
    +Pop $0
    +# copy to an automatically created buffer
    +System::Copy 0 $0
    +Pop $1
    +# get string and int in $1 buffer
    +System::Call "*$1(&t1024 .r2, i .r3)"
    +# free buffer
    +System::Free $1
    +# print result
    +DetailPrint $2
    +DetailPrint $3
    +# copy to our own buffer
    +System::Alloc 1028
    +Pop $1
    +System::Copy $1 $0
    +# get string and int in $1 buffer
    +System::Call "*$1(&t1024 .r2, i .r3)"
    +# free
    +System::Free $0
    +System::Free $1
    +# print result
    +DetailPrint $2
    +DetailPrint $3
    +
    +
    + +
  • + +
  • +Free ADDRESS +
    +

    Frees ADDRESS.

    +

    Usage Example

    +
    +System::Alloc 64
    +Pop $0
    +DetailPrint "64 bytes allocated at $0"
    +System::Free $0
    +
    +
    +
  • + +
  • +Store "OPERATION [OPERATION [OPERATION ...]]" +
    +

    Performs stack operations. An operation can be pushing or popping a single register from the NSIS stack or pushing or popping all of the registers ($0-$9 and $R0-$R9) from System's private stack. Operations can be separated by any character.

    +

    Available Operations

    +
      +
    • To push $#, use p#, where # is a digit from 0 to 9.
    • +
    • To pop $#, use r#, where # is a digit from 0 to 9.
    • +
    • To push $R#, use P#, where # is a digit from 0 to 9.
    • +
    • To pop $R#, use R#, where # is a digit from 0 to 9.
    • +
    • To push $0-$9 and $R0-$R9 to System's private stack, use s or S.
    • +
    • To pop $0-$9 and $R0-$R9 from System's private stack, use l or L.
    • +
    • To push the internal NSIS flags state (exec_flags_t in api.h) to the stack, use F.
    • +
    • To pop the internal NSIS flags state (exec_flags_t in api.h) from the stack, use f.
    • +
    +

    Usage Examples

    +
    +StrCpy $0 "test"
    +System::Store "p0"
    +Pop $1
    +DetailPrint "$0 = $1"
    +
    +
    +StrCpy $2 "test"
    +System::Store "p2 R2"
    +DetailPrint "$2 = $R2"
    +
    +
    +StrCpy $3 "test"
    +System::Store "s"
    +StrCpy $3 "another test"
    +System::Store "l"
    +DetailPrint $3
    +
    +
    +System::Store "r4" "test"
    +DetailPrint $4
    +
    +
    +
  • +
+ +
+ +

Calling Functions

+ +
+ +
    +
  • Call PROC [( PARAMS ) [RETURN [? OPTIONS]]]
  • +
  • Get PROC [( PARAMS ) [RETURN [? OPTIONS]]] +
    +

    Call and get both share a common syntax. As the names suggest, Call calls and Get gets. What does it call or get? It depends on PROC's value.

    + +

    PARAMS is a list of parameters and what do to with them. You can pass data in the parameters and you can also get data from them. The parameters list is separated by commas. Each parameter is combined of three values: type, source and destination. Type can be an integer, a string, etc. Source, which is the source of the parameter value, can be a NSIS register ($0, $1, $INSTDIR), the NSIS stack, a concrete value (5, "test", etc.) or nothing (null). Destination, which is the destination of the parameter value after the call returns, can be a NSIS register, the NSIS stack or nothing which means no output is required. Either one of source or destination can also be a dot (`.') if it is not needed.

    + +

    RETURN is like a single parameter definition, but source is only used when creating callback functions. Normally source is a dot.

    + +

    OPTIONS is a list of options which control the way System plug-in behaves. Each option can be turned off by prefixing with an exclamation mark. For example: ?!e.

    + +

    PARAMS, RETURN and OPTIONS can be repeated many times in one Get/Call line. When repeating, a lot can be omitted, and only what you wish to change can be used. Type, source and/or destination can be omitted for each parameter, even the return value. Options can be added or removed. This allows you to define function prototypes and save on some typing. The last two examples show this.

    + +

    PROC can also be repeated but it must be prefixed with a hash sign (`#') except if the hash sign is preceded by a double colon (shell32::#18) in which case it is interpreted as a function ordinal.

    + +

    Possible PROC Values and Meanings

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ValueMeaningExample
    DLL::FUNCFUNC exported from DLLuser32::MessageBox
    ::ADDRFunction located at ADDRsee below
    *ADDRStructure located at ADDRsee below
    *New structuresee below
    IPTR->IDXMember indexed IDX from
    interface pointed by IPTR
    see below
    <nothing>New callback functionsee below
    PROCPROC returned by Getsee below
    +
    + +

    Available Parameter Types

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeMeaning
    vvoid (generally for return)
    ppointer (and other pointer sized types like handles and HWNDs)
    bint8, byte
    hint16, short
    iint32 (includes char, byte, short and so on when used as a pointer)
    lint64, large integer
    mANSI text, string. (FYI: 'm' for multibyte string or 'w' flipped over.)
    ttext, string (pointer to first character). Like TCHAR*, it is a Unicode string in Unicode NSIS.
    wWCHAR text, Unicode string
    gGUID
    kcallback
    @Direct register memory access (Buffer is limited to (NSIS_MAX_STRLEN - 24) * NSIS_CHAR_SIZE bytes)
    &vNN bytes padding (structures only)
    &iNinteger of N bytes (structures only)
    &lstructure size (structures only)
    &tNarray of N TCHAR text characters (structures only)
    &mNarray of N CHAR ANSI characters (structures only)
    &wNarray of N WCHAR Unicode characters (structures only)
    &g1616 bytes of GUID (structures only)
    +

    Additionally, each type (except b, h, k and @) can be prefixed with an asterisk to denote a pointer. When using an asterisk, the System plug-in still expects the value of the parameter, rather than the pointer's address. To pass a direct address, use `p' with no asterisk. A usage example is available. Alloc returns addresses and its return value should therefore be used with `p', without an asterisk.

    +
    + +

    Available Sources and Destinations

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeMeaning
    .ignored
    numberconcrete hex, decimal or octal integer value. several integers can be or'ed using the pipe symbol (`|')
    'string'
    "string"
    `string`
    concrete string value
    r0 through r9$0 through $9 respectively
    r10 through r19
    R0 through R9
    $R0 through $R9 respectively
    c$CMDLINE
    d$INSTDIR
    o$OUTDIR
    e$EXEDIR
    a$LANGUAGE
    sNSIS stack
    nnull for source, no output required for destination
    +

    Source is required when using the @ type and must be a register. When the call returns the source register already contains the memory address in string form so using destination is usually not necessary. +

    + +

    Callbacks

    + +
    +

    Callback functions are simply functions which are passed to a function and called back by it. They are frequently used to pass a possibly large set of data item by item. For example, EnumChildWindows uses a callback function. As NSIS functions are not quite regular functions, the System plug-in provides its own mechanism to support callback functions. It allows you to create callback functions and notifies you each time a callback function was called.

    + +

    Creation of callback functions is done using Get and the callback creation syntax. As you will not call the callbacks yourself, the source of the parameters should be omitted using a dot. When the callback is called, the destination of the parameters will be filled with the values passed on to the callback. The value the callback will return is set by the source of the return "parameter". The destination of the return "parameter" should always be set as that's where System will notify you the callback was called.

    + +
    System::Get "(i .r0, i .r1) iss"
    + +

    To pass a callback to a function, use the k type.

    + +
    System::Get "(i .r0, i .r1) isR0"
    +Pop $0
    +System::Call "dll::UseCallback(k r0)"
    + +

    Each time the callback is called, the string callback#, where # is the number of the callback, will be placed in the destination of the return "parameter". The number of the first callback created is 1, the second's is 2, the third's is 3 and so on. As System is single threaded, a callback can only be called while calling another function. For example, EnumChildWindows's callback can only be called when EnumChildWindows is being called. You should therefore check for callback# after each function call that might call your callback.

    + +
    System::Get "(i .r0, i .r1) isR0"
    +Pop $0
    +System::Call "dll::UseCallback(k r0)"
    +StrCmp $R0 "callback1" 0 +2
    +DetailPrint "UseCallback passed ($0, $1) to the callback"
    +
    + +

    After you've processed the callback call, you should use Call, passing it the value returned by Get - the callback. This tells System to return from the callback. Destination of the return "parameter" must be cleared prior to calling a function, to avoid false detection of a callback call. If you've specified a source for the return "parameter" when the callback was created, you should fill that source with the appropriate return value. Callbacks are not automatically freed, don't forget to free it after you've finished using it.

    + +
    System::Get "(i .r0, i .r1) isR0"
    +Pop $0
    +System::Call "dll::UseCallback(k r0)"
    +loop:
    +	StrCmp $R0 "callback1" 0 done
    +	DetailPrint "UseCallback passed ($0, $1) to the callback"
    +	Push 1 # return value of the callback
    +	StrCpy $R0 "" # clear $R0 in case there are no more callback calls
    +	System::Call $0 # tell system to return from the callback
    +	Goto loop
    +done:
    +System::Free $0
    +
    + +

    A complete working example is available in the usage examples section.

    + +
    + +

    Notes

    + +
    +
      +
    • To find out the index of a member in a COM interface, you need to search for the definition of this COM interface in the header files that come with Visual C/C++ or the Platform SDK. The index is zero based.
    • +
    • If a function can't be found or the t parameter type was used, an `A' or `W' will be appended to its name and it will be looked up again. This is done because a lot of Windows API functions have two versions, one for ANSI strings and one for Unicode strings. The ANSI version of the function is marked with `A' and the Unicode version is marked with `W'. For example: lstrcpyA and lstrcpyW.
    • +
    • Libraries in the system32 directory can be loaded without a path. All other libraries should be loaded with a quoted full path.
    • +
    +
    + +

    Available Options

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionMeaning
    ccdecl calling convention (the stack restored by caller). By default stdcall calling convention is used on x86 (the stack restored by callee).
    rAlways return (for GET means you should pop result and proc, for CALL means you should pop result (at least)). By default result is returned for errors only (for GET you will pop either error result or right proc, and for CALL you will get either your return or result at defined return place).
    nNo redefine. Whenever this proc will be used it will never be redefined either by GET or CALL. This options is never inherited to children.
    sUse general Stack. Whenever the first callback defined the system starts using the temporary stacks for function calls.
    eCall GetLastError() after procedure end and push result on stack.
    uUnload DLL after call (using FreeLibrary, so you'll be able to delete it for example).
    2Experimental v2 syntax
    +
    + +

    Experimental v2 syntax

    + +
      +
    • Struct types in uppercase are aligned to their natural alignment. Lowercased types are packed without alignment. +
    • Callback id based on the allocated callback +
    + +

    Usage Examples

    + +
    +System::Call 'user32::MessageBox(p $HWNDPARENT, t "NSIS System Plug-in", t "Test", i 0)'
    +System::Call '"$SysDir\MyLibrary.dll"::MyFunction(i 42)'
    +
    +
    +System::Call "kernel32::GetModuleHandle(t 'user32.dll') p .s"
    +System::Call "kernel32::GetProcAddress(p s, m 'MessageBoxA') p .r0"
    +System::Call "::$0(p $HWNDPARENT, m 'GetProcAddress test', m 'NSIS System Plug-in', i 0)"
    +
    +
    +System::Get "user32::MessageBox(p $HWNDPARENT, t 'This is a default text', t 'Default', i 0)"
    +Pop $0
    +System::Call "$0"
    +
    +
    +System::Get "user32::MessageBox(p $HWNDPARENT, t 'This is a default text', \
    +	t 'Default', i 0x1|0x10)"
    +Pop $0
    +System::Call "$0(, 'This is a System::Get test', 'NSIS System Plug-in',)"
    +
    +
    +System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
    +DetailPrint "User name - $0"
    +DetailPrint "String length - $1"
    +DetailPrint "Return value - $2"
    +
    +
    +System::Alloc 4
    +Pop $0
    +System::Call "*$0(i 5)" ; Write
    +System::Call "*$0(i .r1)" ; Read
    +System::Free $0
    +DetailPrint $1
    +
    +
    +System::Call "*(i 5) p .r0"
    +System::Call "*$0(i .r1)"
    +System::Free $0
    +DetailPrint $1
    +
    +
    +System::Call '*0(p, &l.r2, &t2)' ; &l. is not part of the struct
    +DetailPrint "Struct size=$2" 
    +
    +
    +System::Call '*(&l4,i,i,i,i,&t128)p.r1' ; Fills dwOSVersionInfoSize with the struct size as a int32
    +${If} $1 Z<> 0
    +	System::Call 'kernel32::GetVersionEx(pr1)i.r0'
    +	System::Call '*$1(i,i.R1,i.R2,i.R3)'
    +	System::Free $1
    +	${IfThen} $0 <> 0 ${|} DetailPrint "v$R1.$R2.$R3" ${|}
    +${EndIf}
    +
    +
    +System::Call "user32::GetClientRect(p $hwndparent, @ r0)"
    +System::Call "*$0(i,i,i.r1,i.r2)"
    +DetailPrint ClientRect=$1x$2
    +
    +
    +# defines
    +!define CLSCTX_INPROC_SERVER 1
    +!define CLSID_ActiveDesktop {75048700-EF1F-11D0-9888-006097DEACF9}
    +!define IID_IActiveDesktop {F490EB00-1240-11D1-9888-006097DEACF9}
    +# create IActiveDesktop interface
    +System::Call "ole32::CoCreateInstance( \
    +	g '${CLSID_ActiveDesktop}', p 0, \
    +	i ${CLSCTX_INPROC_SERVER}, \
    +	g '${IID_IActiveDesktop}', *p .r0) i.r1"
    +StrCmp $1 0 0 end
    +# call IActiveDesktop->GetWallpaper
    +System::Call "$0->4(w .r2, i ${NSIS_MAX_STRLEN}, i 0)"
    +# call IActiveDesktop->Release
    +System::Call "$0->2()"
    +# print result
    +DetailPrint $2
    +end:
    +
    +
    +InitPluginsDir
    +File "/oname=$PLUGINSDIR\MyDLL.dll" MyDLL.dll
    +System::Call 'KERNEL32::AddDllDirectory(w "$PLUGINSDIR")'
    +System::Call 'KERNEL32::LoadLibrary(t "$PLUGINSDIR\MyDLL.dll")p.r1'
    +System::Call 'MyDLL::MyFunc(i 5) ? u'
    +System::Call 'KERNEL32::FreeLibrary(pr1)'
    +Delete $PLUGINSDIR\MyDLL.dll
    +
    +
    +System::Get "(p.r1, p) iss"
    +Pop $R0
    +System::Call "user32::EnumChildWindows(p $HWNDPARENT, k R0, p) i.s"
    +loop:
    +	Pop $0
    +	StrCmp $0 "callback1" 0 done
    +	System::Call "user32::GetWindowText(pr1,t.r2,i${NSIS_MAX_STRLEN})"
    +	System::Call "user32::GetClassName(pr1,t.r3,i${NSIS_MAX_STRLEN})"
    +	IntFmt $1 "0x%X" $1
    +	DetailPrint "$1 - [$3] $2"
    +	Push 1 # callback's return value
    +	System::Call "$R0"
    +	Goto loop
    +done:
    +System::Free $R0
    +DetailPrint "EnumChildWindows returned $0"
    +
    +
    +System::Get '(m.r1)ir2r0 ?2' ; v2 syntax
    +Pop $9
    +System::Call 'kernel32::EnumSystemLocalesA(k r9, i 0)'
    +loop:
    +	StrCmp $0 "callback$9" 0 done
    +	DetailPrint "Locale: $1"
    +	StrCpy $2 1 ; EnumLocalesProc return value
    +	System::Call $9 ; return from EnumLocalesProc
    +	Goto loop
    +done:
    +System::Free $9
    +
    +
    +System::Call '*(&t50 "!")p.r2' ; DecimalSep
    +System::Call '*(&t50 "`")p.r3' ; ThousandSep
    +System::Call '*(i 2, i 0, i 3, P r2, P r3, i 1)p.r1 ?2'
    +System::Call 'kernel32::GetNumberFormat(i 0, i 0, t "1337.666" r4, p r1, t.r5, i ${NSIS_MAX_STRLEN})'
    +DetailPrint "Custom formatted $4: $5"
    +System::Free $3
    +System::Free $2
    +System::Free $1
    +
    +
    +!define MB "user32::MessageBox(p$HWNDPARENT,t,t'NSIS System Plug-in',i0)"
    +System::Call "${MB}(,'my message',,)"
    +System::Call "${MB}(,'another message',,) i.r0"
    +MessageBox MB_OK "last call returned $0"
    +
    +
    +System::Call "user32::SendMessage(p $HWNDPARENT, t 'test', t 'test', p 0) p.s ? \
    +	e (,t'test replacement',,) i.r0 ? !e #user32::MessageBox"
    +DetailPrint $0
    +ClearErrors
    +Pop $0
    +IfErrors good
    +MessageBox MB_OK "this message box will never be reached"
    +good:
    +
    +
    +
  • +
+ +
+ +

64-bit Functions

+ +
+ +
    + +
  • +Int64Op ARG1 OP [ARG2] +
    +

    Performs OP on ARG1 and optionally ARG2 and returns the result on the stack. Both ARG1 and ARG2 are 64-bit integers. This means they can range between -2^63 and 2^63 - 1.

    +

    Available Operations

    +
      +
    • Addition -- +
    • +
    • Subtraction -- -
    • +
    • Multiplication -- *
    • +
    • Division -- /
    • +
    • Modulo -- %
    • +
    • Shift left -- <<
    • +
    • Arithmetic shift right -- >>
    • +
    • Logical shift right -- >>>
    • +
    • Bitwise or -- |
    • +
    • Bitwise and -- &
    • +
    • Bitwise xor -- ^
    • +
    • Bitwise not (one argument) -- ~
    • +
    • Logical not (one argument) -- !
    • +
    • Logical or -- ||
    • +
    • Logical and -- &&
    • +
    • Less than -- <
    • +
    • Equals -- =
    • +
    • Greater than -- >
    • +
    + +

    Usage Examples

    + +
    +System::Int64Op 5 + 5
    +Pop $0
    +DetailPrint "5 + 5 = $0" # 10
    +
    +
    +System::Int64Op 526355 * 1565487
    +Pop $0
    +DetailPrint "526355 * 1565487 = $0" # 824001909885
    +
    +
    +System::Int64Op 5498449498849818 / 3
    +Pop $0
    +DetailPrint "5498449498849818 / 3 = $0" # 1832816499616606
    +
    +
    +System::Int64Op 0x89498A198E4566C % 157
    +Pop $0
    +DetailPrint "0x89498A198E4566C % 157 = $0" # 118
    +
    +
    +System::Int64Op 1 << 62
    +Pop $0
    +DetailPrint "1 << 62 = $0" # 4611686018427387904
    +
    +
    +System::Int64Op 0x4000000000000000 >> 62
    +Pop $0
    +DetailPrint "0x4000000000000000 >> 62 = $0" # 1
    +
    +System::Int64Op 0x8000000000000000 >> 1
    +Pop $0
    +DetailPrint "0x8000000000000000 >> 1 = $0" # -4611686018427387904 (0xC000000000000000)
    +
    +System::Int64Op 0x8000000000000000 >>> 1
    +Pop $0
    +DetailPrint "0x8000000000000000 >>> 1 = $0" # 4611686018427387904 (0x4000000000000000)
    +
    +
    +System::Int64Op 0x12345678 & 0xF0F0F0F0
    +Pop $0
    +# IntFmt is 32-bit, this is just for the example
    +IntFmt $0 "0x%X" $0
    +DetailPrint "0x12345678 & 0xF0F0F0F0 = $0" # 0x10305070
    +
    +
    +System::Int64Op 1 ^ 0
    +Pop $0
    +DetailPrint "1 ^ 0 = $0" # 1
    +
    +
    +System::Int64Op 1 || 0
    +Pop $0
    +DetailPrint "1 || 0 = $0" # 1
    +
    +
    +System::Int64Op 1 && 0
    +Pop $0
    +DetailPrint "1 && 0 = $0" # 0
    +
    +
    +System::Int64Op 9302157012375 < 570197509190760
    +Pop $0
    +DetailPrint "9302157012375 < 570197509190760 = $0" # 1
    +
    +
    +System::Int64Op 5168 > 89873
    +Pop $0
    +DetailPrint "5168 > 89873 = $0" # 0
    +
    +
    +System::Int64Op 189189 = 189189
    +Pop $0
    +DetailPrint "189189 = 189189 = $0" # 1
    +
    +
    +System::Int64Op 156545668489 ~
    +Pop $0
    +DetailPrint "156545668489 ~ = $0" # -156545668490
    +
    +
    +System::Int64Op 1 !
    +Pop $0
    +DetailPrint "1 ! = $0" # 0
    +
    +
    +
  • + +
+ +
+ +

FAQ

+ +
+ +
    + +
  • +Q: How can I pass structs to functions? +
    +

    A: First of all, you must allocate the struct. This can be done in two ways. You can either use Alloc or Call with the special struct allocation syntax. Next, if you need to pass data in the struct, you must fill it with data. Then you call the function with a pointer to the struct. Finally, if you want to read data from the struct which might have been written by the called function, you must use Call with the struct handling syntax. After all is done, it's important to remember to free the struct.

    + +

    Allocation

    + +

    To allocate the struct using Alloc, you must know the size of the struct in bytes. Therefore, it would normally be easier to use Call. In this case it's easy to see the required size is 16 bytes, but other cases might not be that trivial. In both cases, the struct address will be located on the top of the stack and should be retrieved using Pop.

    + +
    +System::Alloc 16
    +
    + +
    +System::Call "*(i, i, i, t)p.s"
    +
    + +
    + +

    Setting Data

    + +

    Setting data can be done using Call. It can be done in the allocation stage, or in another stage using the struct handling syntax.

    + +
    +System::Call "*(i 5, i 2, i 513, t 'test')p.s"
    +
    + +
    +# assuming the struct's memory address is kept in $0
    +System::Call "*$0(i 5, i 2, i 513, t 'test')"
    +
    + +
    + +

    Passing to the Function

    + +

    As all allocation methods return an address, the type of the passed data should be an integer, an address in memory.

    + +
    +# assuming the struct's memory address is kept in $0
    +System::Call "dll::func(p r0)"
    +
    + +
    + +

    Reading Data

    + +

    Reading data from the struct can be done using the same syntax as setting it. The only difference is that the destination part of the parameter will be set and the source part will be omitted using a dot.

    + +
    +# assuming the struct's memory address is kept in $0
    +System::Call "*$0(i .r0, i .r1, i .r2, t .r3)"
    +DetailPrint "first int = $0"
    +DetailPrint "second int = $1"
    +DetailPrint "third int = $2"
    +DetailPrint "string = $3"
    +
    + +
    + +

    Freeing Memory

    + +

    Memory is freed using Free.

    + +
    +# assuming the struct's memory address is kept in $0
    +System::Free $0
    +
    + +
    + +

    A Complete Example

    + +
    +# allocate
    +System::Call "*(i,i,p,p,p,p,p,p)p.r1"
    +# call
    +System::Call "Kernel32::GlobalMemoryStatus(p r1)"
    +# get
    +System::Call "*$1(i.r2, i.r3, p.r4, p.r5, p.r6, p.r7, p.r8, p.r9)"
    +# free
    +System::Free $1
    +# print
    +DetailPrint "Structure size: $2 bytes"
    +DetailPrint "Memory load: $3%"
    +DetailPrint "Total physical memory: $4 bytes"
    +DetailPrint "Free physical memory: $5 bytes"
    +DetailPrint "Total page file: $6 bytes"
    +DetailPrint "Free page file: $7 bytes"
    +DetailPrint "Total virtual: $8 bytes"
    +DetailPrint "Free virtual: $9 bytes"
    +
    + +
    +
  • + +
+ +
+ + + diff --git a/libs/NSIS/NSIS-source/Docs/System/WhatsNew.txt b/libs/NSIS/NSIS-source/Docs/System/WhatsNew.txt new file mode 100644 index 0000000000..959c734b04 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/System/WhatsNew.txt @@ -0,0 +1,46 @@ +release 2. +1. Syntax, with inline input +2. Int64 full support (conversion/operations/comparison) +3. Structures support +4. Callbacks support, including multilevel callbacks +5. Some useful routines (Alloc, Free, Copy) +6. CDecl and StdCall calling conventions + +release 3, 22 march 2003. +1. Custom Message Boxes (with icons etc) -> bug in case of GetModuleHandle and +call to FreeLibrary (sysfunc.nsh) +2. GetFileSysTime -> No SystemTimeToTzSpecificLocalTime at win9x bug, +changed to use FileTimeToLocalFileTime (sysfunc.nsh) +3. Incorrect automatic structure size (&l) bug, value actually never filled +into the structure (strange -> winxp takes no care of the structure size +members, such as cbSize, and win98 does...) (system.c) +4. Changed Secondary Stack Allocation behavior - now we just leave 65kb of the +stack NSIS give to us to the NSIS itself, and use the other part as the stack +for our calls. (system.c) +5. Secondary Stack Optimization - in case of no more pending callback procs - +"free" the secondary stack pointer. (system.c) +6. PlaySound("", 0, 0) plays the default windows sound at win9x, so changed to +PlaySound(NULL, 0, 0) for effective sound stopping after splash (sysfunc.nsh). + +release 4, 3 september 2003. +1. Division by zero fatal error at Int64Op killed. +2. bool type removed (use int instead). +3. GUID (g) and LPWSTR (w) types added. +4. Memory cleanup after using t (string), g (guid) and w (unicode string) added. +5. Automatic A-letter at proc name discovery. +6. COM optimized: new proc specification "x->y", where x is interface ptr, and +y is vtable member index. For such procs Interface pointer passed as first arg +automatically. + +release 5, 11 september 2003. +1. u flag - unload dll after procedure call. +2. some changes to asm to turn on Whole Program Optimization. +3. Dll shrunk by 1 kb. + +bug-fix-release, 4.06.2004 +1. System::Copy /SIZE fixed (Kichik). +2. System::Copy with destination auto-allocation now pushes destination +address on stack. +3. Callbacks fixed (Kichik's kick is awesome). +4. Bug with proc call parts redefinition, # for example (pointed by Kichik). +5. Bug with memory protection during callback processing (Kichik). \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Docs/VPatch/Readme.html b/libs/NSIS/NSIS-source/Docs/VPatch/Readme.html new file mode 100644 index 0000000000..57463799c3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/VPatch/Readme.html @@ -0,0 +1,310 @@ + + + + + + +VPatch 3 + + + +

VPatch 3.1

+
+

Introduction

+
+

VPatch allows to create a patch file to update previous versions + of your software. The GenPat utility generates the patch file. + The plug-in can use the patch to update a file. Using a patch, you can + reduce the download size of your updates because only the differences + between the files are included in the patch file.

+
+

How to use

+
+

Generate the patch file

+
+

Make sure you have the source file (original version) and the target + file (version to update to). For example, DATA.DTA (currently on user + system) and DATA_20.DTA (version 2.0 of this data file). Now call + the command line tool GenPat.exe:

+
GENPAT oldfile.txt newfile.txt patch.pat
+

Now, the patch will be generated, this will take some time.

+

Using the /B=(BlockSize) parameter of the GenPat utility (put it + after the filenames), you can use a different block size. A smaller + block size may result in a smaller patch, but the generation will + take more time (the default blocksize is 64).

+

If you have trouble using this command-line utility, you can download + a GUI (graphical user interface) for VPatch from its own website: + http://www.tibed.net/vpatch.

+
+

Update the file during installation

+
+

Use the VPatch plug-in to update a file using a patch file:

+
vpatch::vpatchfile "patch.pat" "oldfile.txt" "temporary_newfile.txt"
+

The result of the patch operating will be added to the stack and + can be one of the following texts:

+
    +
  • OK
  • +
  • OK, new version already installed
  • +
  • An error occurred while patching
  • +
  • Patch data is invalid or corrupt
  • +
  • No suitable patches were found
  • +
+

Check example.nsi for an example. + You +should check whether the stack string starts with "OK" + because then the patch has succeeded and you can rename "temporary_newfile.txt" + to "oldfile.txt" to replace the original, if you want.

+
+

Multiple patches in one file

+
+

GenPat appends a patch to the file you specified. If there is already + a patch for the same original file, with the same CRC/MD5, in the patch file, + + the patch will be replaced. For example, if you want to be able to upgrade + version 1 and 2 to version 3, + you can put a 1 > 3 and 2 > 3 patch in +one file.

+

You can also put patches for different files in one patch file, for + example, a patch from file A version 1 to file A version 2 and a patch + from file B version 1 to file B version 2. Just call the plug-in multiple + times with the same patch file. It will automatically select the right + patch (based on the file CRC).

+
+

Patch generator (GenPat) exit codes

+
+

In version 3 the following exit codes (known as error levels in + the DOS period) can be returned by GenPat. GenPat will return an + exit code based on success of the patch generation. Here is a list + of the possible exit codes:

+ + + + + + + + + + + + + + + + + + + + + +
Exit codeDescription
0Success
1Arguments missing
2Other error
3Source file already has a patch in specified patch file (ERROR), + use /R switch to override
+

These exit codes can be useful when you generate patch files through + a NSIS script.

+
+
+
+
+

Source code

+
+

Source code is available in the original package and in the SVN repository of NSIS.

+ +

NSIS plug-in (C++)

+
+

The source of the NSIS plug-in that applies patches can be found + in the Source\Plugin folder.

+
+

Patch Generator (C++)

+
+

The most interesting part of VPatch, the actual patch generation + algorithm, can be found in Source\GenPat\PatchGenerator.cpp. + The +header of that file contains a brief explanation of the algorithm as well. +

+
+

User interface (Delphi)

+
+

A user interface is included as well, which you will have to build + yourself because the GUI executable was too large to include. Besides + Borland Delphi 6 or higher (you can use the freely available Personal + edition), you will also need to install the VirtualTreeView component by Mike Lischke.

+
+
+

Version history

+
+
    +
  • 3.1 +
      +
    • GenPat now compiles on POSIX platforms (MinGW/GCC), Visual + C++ 6 and Borland C++.
    • +
    • More test cases to verify functionality of GenPat.
    • +
    +
  • +
  • 3.0 +
      +
    • Final: Updates to the GUI, installer
    • +
    • RC8: GenPat will now flag replacement of a patch (e.g. + the source file has the same contents as a previous patch inside + a patch file) as an error. You can specifically allow it using + the /R switch. Added license to source files.
    • +
    • RC7: Fixed critical bug in GenPat with multiple patches + in a single file. Fixed serious bug in stand-alone EXE runtime: + process kept on running forever. Included case testing through + a Python script to test common usage (and prevent bugs like + the one in GenPat in the future).
    • +
    • RC6: Upgraded to non-beta compiler. Added /A switch + to change block match limit and /O to deactivate the limit. + Updated GUI to support the /O switch.
    • +
    • RC4a to RC5a: input block size is now checked for power + of 2 and fixed if incorrect. When patch file does not yet exist, + no longer forgets to create the header. No longer tries to allocate + memory when there are no chunks. Fixed memory leaks.
    • +
    • Target file date is now preserved inside a patch and restored + on the user system.
    • +
    • MD5 checksums are now used instead of CRC32 checksums, unless + existing patches in a file already are in CRC32 mode.
    • +
    • The patch generator, GenPat, has been completely rewritten + in C++. It no longer needs to keep the entire files in memory, + instead memory usage is a certain percentage of the source file + size. The percentage is based on the block size, larger block + sizes will reduce memory usage.
    • +
    • All runtimes now share a common codebase, perform proper error + checking and don't leave behind files if the input file was + already up to date.
    • +
    • Bug Fix: The patch generator algorithm no longer reduces to + a quadratic runtime if there are many blocks with the same content + in the files to patch.
    • +
    • Bug Fix: The documentation of the command-line utilities was + incorrect and no warnings would be given by the runtimes, causing + the patch not to work (this does not apply to NSIS patches).
    • +
    +
  • +
  • 2.1 +
      +
    • Added argument checking and error handling to GenPat. Now + returns exit codes as well to indicate success/failure (and + the reason for failure). Only GenPat has changed in this version + compared to 2.0 final.
    • +
    • Bug Fix: GenPat no longer gives an Access Violation when attempting + to patch a file smaller than 64 bytes into a file larger than + 64 bytes.
    • +
    +
  • +
  • 2.0 final +
      +
    • Cleaned up source code for the patch generator, which is now + included (this code is written in Borland Delphi 6 and compiles + with the freely available Personal edition).
    • +
    +
  • +
  • 2.0 beta 2 +
      +
    • All new algorithm used in the patch generator: much faster + (up to 90%) while using smaller block sizes (higher compression)
    • +
    • Created a NSIS 2 plugin
    • +
    • Works with small files
    • +
    • Replaces existing patch in file if original file CRC is identical
    • +
    +
  • +
+
+

Credits

+
+

Written by Koen van de Sande.
+ C plug-in initially by Edgewize, updated by Koen van de Sande.
+ New documentation and example by Joost Verburg and Koen van de Sande.

+
+

License

+
+Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute
+it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; 
+   you must not claim that you wrote the original software.
+   If you use this software in a product, an acknowledgment in the
+   product documentation would be appreciated but is not required.
+2. Altered versions must be plainly marked as such,
+   and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any distribution.
+
+
+ + + diff --git a/libs/NSIS/NSIS-source/Docs/makensisw/License.txt b/libs/NSIS/NSIS-source/Docs/makensisw/License.txt new file mode 100644 index 0000000000..ccb71be8a2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/makensisw/License.txt @@ -0,0 +1,17 @@ +Copyright (c) 2002 Robert Rainwater + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. diff --git a/libs/NSIS/NSIS-source/Docs/makensisw/Readme.txt b/libs/NSIS/NSIS-source/Docs/makensisw/Readme.txt new file mode 100644 index 0000000000..192b252b3c --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/makensisw/Readme.txt @@ -0,0 +1,245 @@ +---------------------------------------------------- +MakeNSISW - MakeNSIS Windows Wrapper +---------------------------------------------------- + + +About MakeNSISW +--------------- +MakeNSISW is a wrapper for the NSIS compiler (MakeNSIS). +MakeNSISW allows you to compile NSIS scripts using a Windows GUI interface. + + +Requirements +------------ +MakeNSISW requires NSIS be installed on your system. The default +directory for this installation is $PROGRAMFILES\NSIS\Contrib\MakeNSISW. + + +Usage: +------ +If you installed the Shell Extensions option during the installation, then +all that is required is that you choose 'Compile NSI' from the right- +click menu on a NSIS script. This will invoke MakeNSISW. + +The format of the parameters when calling MakeNSISW from the commandline is: + makensisw [options] [script.nsi | - [...]] + +For the options, please see the MakeNSIS documentation. + + +Shortcut Keys +------------- +Ctrl+A: Select all text +Ctrl+B: Open Script Folder +Ctrl+C: Copy selected text +Ctrl+D: Open the Define Symbols dialog +Ctrl+E: Edit the script +Ctrl+F: Find text +Ctrl+K: Abort compiler +Ctrl+L: Load a script +Ctrl+R, F7: Recompile the script +Ctrl+T, Ctrl+F5: Test the installer +Ctrl+W: Clear log window +Ctrl+<+|-|0>: Zoom log window +Alt+X: Exit the application +F1: View Documentation +F5: Recompile and Test + + +Version History +--------------- +0.1 + - Initial Release + +0.2 + - Added ability to save output and copy output + +0.3 + - Added option to recompile script (F2 or File|Recompile) + - Added Help Menu + - Return code is now always set + - Added Accelerator key support for Exit and Recompile + - No longer uses NSIS's version string + - Made clearer status message in title bar + - Disabled menu/accelerator functions during compile + +0.4 + - Fixed Copy Selected bug + +0.5 + - Minor Makefile changes (mingw) + - Moved strings into global strings to make editing easier + - Added Clear Log Command under Edit menu + - Recompile no longer clears the log window (use F5) + - Close is now the default button when you hit enter + - added VC++ project, updated resources to work with VC++ + - rearranged directory structure + - makefiles now target ../../makensisw.exe + - removed makensisw home link in help menu (hope this is ok, + doesn't really seem needed to me) + - made display use a fixed width font (Some people may not like + this, but I do) + - added 'test' button (peeks output for 'Output' line) + - made it so that the log shows the most recent 32k. + - made it so that the log always clears on a recompile. + - compiled with VC++ so no longer needs msvcrt.dll + - made the compiler name be a full path (for more flexibility) + +0.6 + - print correct usage if unable to execute compiler + - removed mingw warnings + - set title/branding before errors + - some docs changes + - Added Edit|Edit Script function + +0.7 + - Edit Script should now work for output>32k + - Added resize support (thanks to felfert) + - Added window position saving (thanks to felfert) + - Disable some items when exec of makensis failed + +0.8 + - Added window size constraints (thanks to bcheck) + - Cleaned up the resource file + +0.9 + - Removed global strings (moved into #defines) + - Some GUI changes + - No longer focused Close button (its default anyways) + - Fixed resize bug on minimize/restore (thanks to felfert) + - Made window placement stored in HKLM instead of HKCU, cause + I hate things that get littered in HKCU. + +1.0 + - Fixed bug with large output causing crash + +1.1 + - Crash may actually be fixed + +1.2 + - XP visual style support + +1.3 + - Added Documentation menu item + - Fix GUI problem with About dialog + +1.4 + - Edit Script command will now work with or without file associations + - Added default filename for save dialog + - Use standard fonts + - Documentation menuitem caused recompile + +1.5 + - Fixed Copy All function + +1.6 + - Reduced size from 44k to 12k (kichik) + - Editbox not limited to 32k (now using richedit control) + - Made the log window font-size smaller. + +1.7 + - Added check for warnings + - Added sound for successful compilations + - Update home page and documentation menu items to Sourceforge page + +1.8 + - Contents of log window are now streamed in + - Empty log window check (to prevent random crashes) + +1.9 + - Text always scrolls to bottom (kichik) + - Updated link to new docs + - Makensisw now takes the same parameters as makensis.exe + - Fixed some random crashes + - Drag and Drop Support into the Makensisw window + - Updated icon to more sexy one + - Added Load Script option on File menu + - Added Search Dialog (Ctrl+F) (kichik) + - Added Select All (Ctrl+A), Copy (Ctrl+C), Exit (Alt+X) keys + - Branding text now reflects NSIS version + - Added some simple tool tips + - Added Context Menu in log window + - Added resize gripper + - Ctrl+L loads a script + - Added Clear Log (Ctrl+W) + - Browse Script (Ctrl+B) launches explorer in script directory + - Check for Update command + - Added link to the NSIS Forum under Help menu + - Bunch of other stuff not worth mentioning + - Define Symbols menu (Ctrl+D) + +2.0 + - Improved user interface + - Define Symbols is available even if a script is not loaded + - Defined Symbols are saved on exit and reloaded on start + - Added NSIS Update menu + - Added toolbar for commonly used menus + - Made the Toolbar style flat + - Added option for compile & run + - Added compressor setting option + - Added support for lzma compression + - Added named Symbols sets. + +2.1 + - Added "Cancel compilation" menu item + +2.2 +- Settings saved in HKCU instead of HKLM +- Added menu accelerators to MRU list + +2.3 +- Escape button closes MakeNSISw + +2.3.1 +- Fixed broken command line parameter handling + +2.3.2 +- The size gripper can be used to resize the window + +2.3.3 +- Update check switched from JNetLib to WinInet +- New file type icons + +2.3.4 +- Added Window Info/Spy feature +- System DPI aware +- New toolbar images + +2.3.5 +- Added log window colors +- Basic AppEvents custom sound support for BuildComplete, BuildWarning and BuildError + +2.3.6 +- Added GUID generator tool + +2.4 +- Added Lookup tool +- Use Consolas font if it exists + +2.4.1 +- Close button transforms to Abort when appropriate +- Prevent user from modifying the log +- Log zoom + + +Copyright Information +--------------------- +Copyright (c) 2002 Robert Rainwater +Contributors: Justin Frankel, Fritz Elfert, Amir Szekely, + Sunil Kamath, Joost Verburg, Anders Kjersem. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. diff --git a/libs/NSIS/NSIS-source/Docs/nsDialogs/Readme.html b/libs/NSIS/NSIS-source/Docs/nsDialogs/Readme.html new file mode 100644 index 0000000000..dd5ddd5280 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/nsDialogs/Readme.html @@ -0,0 +1,880 @@ + + + + + + +nsDialogs + + + + +

NSIS nsDialogs Plug-in

+

Next generation of user interface design

+ +

Table of Contents

+ + + +

Introduction

+ +

nsDialogs allows creation of custom pages in the installer. On top of the built-in pages, nsDialogs can create pages with any type of controls in any order and arrangement. It can create everything from a simple page with one label to form which reacts to user's actions. Modern UI 2, for example, uses nsDialogs to create the welcome and finish pages.

+ +

nsDialogs is a NSIS plug-in, introduced in version 2.29 as a replacement for InstallOptions. nsDialogs doesn't use INI files, so it's way faster than InstallOptions. Integration with the script is tighter and more natural - creating controls is done using plug-in functions and notification is done by directly calling a function in the script. Unlike InstallOptions, there isn't a predefined set of available control type and by providing a lower level access to Windows API, every type of control can be created and pages can be more customizable.

+ +

The same thing that makes nsDialogs more flexible can also make it more complicated for users with no knowledge of Win32 API. This is solved by creating a library of predefined functions, defined in script, that allow creation and handling of controls. This way, novices get easy access to the flexibility, while advanced users still get access to the core functionality by modifying the library or simply avoid using it.

+ +

Step-by-Step Tutorial

+ +

Custom Page

+ +

Before you can start adding controls you need to create a nsDialogs custom page. nsDialogs pages can only be created in a custom page's creator function, not in sections nor regular functions. Lets create a basic script with a empty nsDialogs page as our skeleton:

+ +
!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+XPStyle on
+
+
+Var Dialog
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	nsDialogs::Show
+FunctionEnd
+
+Section
+SectionEnd
+ +

The first call must always be to nsDialogs::Create. It will create a new dialog in the page and return its HWND on the stack. The result must be popped from the stack to prevent stack corruption. If the result is error, the dialog couldn't be created and the page must be aborted!

+

nsDialogs::Create accepts one parameter. It has a very specific function, but to keep things simple for this tutorial, it must always be 1018.

+

HWND is a number that uniquely identifies the dialog and can be used with SendMessage, SetCtlColors and Win32 API functions.

+

The dialog is not fully constructed at this point and you can make modifications to it before it is displayed. To finalize and display the dialog you must call nsDialogs::Show. This function will not return until the user clicks Next, Back or Cancel.

+
+ + +

Adding Controls

+ + +

Compiling the last script and running it results in an empty page which is not very useful. So now we'll add some controls to it to. To do so, we'll use ${NSD_Create*} macros from nsDialogs.nsh. Each of those macros takes 5 parameters - x, y, width, height and text. Each macro also returns one value on the stack, which is the new control's HWND. Like the dialogs HWND, it must be popped from the stack and saved.

+ +

Each of the measurements that the macros take can use one of three unit types - pixels, dialog units or percentage of the dialog's size. It can also be negative to indicate it should be measured from the end. To use dialog units, the measurement must be suffixed with the letter u. To use percentage, the measurement must be suffixed with the percentage sign - %. Any other suffix, or no suffix, means pixels.

+ +

Dialog units allow creation of dialogs that scale well when different fonts or DPI is used. Its size in pixels is determined at runtime based on the font and the DPI. For example, standard pages in the classic NSIS user interface are 266 dialog units wide and 130 dialog units high. Pages in Modern UI are 300 dialogs units wide and 140 dialog units high. In different resolutions, using different fonts or DPI settings, the dialogs will always have the same size in dialog units, but different size in pixels.

+
+
!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage
+Page instfiles
+
+Function nsDialogsPage
+
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+	Pop $Label
+
+	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+	Pop $Text
+
+	nsDialogs::Show
+
+FunctionEnd
+
+Section
+SectionEnd
+ +

Available control types that can be created with ${NSD_Create*} are: +HLine, +VLine, +Label, +Icon, +Bitmap, +BrowseButton, +Link, +Button, +GroupBox, +CheckBox, +RadioButton (FirstRadioButton and AdditionalRadioButton), +Text, +MLText, +Password, +Number, +FileRequest, +DirRequest, +RichEdit, +ComboBox, +DropList, +ListBox, +SortedListBox, +ProgressBar, +Animation, +HTrackBar, +VTrackBar, +UpDown, +HotKey, +DatePicker, +IPAddress, +NetAddress. +

+ +

Control State

+ + +

Now that we have some controls that the user can interact with, it's time to see what the user actually does with them. For that, we'll first add a "leave callback function" to our page. In that function, we'll query the state of the text control we've created and display it to the user. To do so, we'll use the ${NSD_GetText} macro. Use the ${NSD_GetState} macro for RadioButton and CheckBox controls.

+ +

Note that not all controls support ${NSD_GetText} and some require special handling with specific messages defined in WinMessages.nsh. For example, the ListBox control requires usage of LB_GETCURSEL and LB_GETTEXT. With time, the library of macros in nsDialogs.nsh will fill with more and more macros that'll handle more cases like this.

+
+
!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page instfiles
+
+Function nsDialogsPage
+
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+	Pop $Label
+
+	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+	Pop $Text
+
+	nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+	${NSD_GetText} $Text $0
+	MessageBox MB_OK "You typed:$\n$\n$0"
+
+FunctionEnd
+
+Section
+SectionEnd
+ +

Real-time Notification

+ + +

One of the more exciting new features of nsDialogs is callback function notification of changes to the dialog. nsDialogs can call a function defined in a script in response to a user action such as changing of a text field or click of a button. To make nsDialogs notify us of events, we'll use ${NSD_OnClick} and ${NSD_OnChange}. Not every control supports both of the events. For example, there is nothing to notify about label changes, only clicks.

+ +

When the callback function is called, the control's HWND will be waiting on the stack and must be popped to prevent stack corruption. In this simple example, this is not so useful. But in case of a bigger script where several controls are associated with the same callback function, the HWND can shed some light on which control originated the event.

+ +

The new example will respond to the user typing "hello" in the text box.

+
+
!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page instfiles
+
+Function nsDialogsPage
+
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+	Pop $Label
+
+	${NSD_CreateText} 0 13u 100% -13u "Type something here..."
+	Pop $Text
+	${NSD_OnChange} $Text nsDialogsPageTextChange
+
+	nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+	${NSD_GetText} $Text $0
+	MessageBox MB_OK "You typed:$\n$\n$0"
+
+FunctionEnd
+
+Function nsDialogsPageTextChange
+
+	Pop $1 # $1 == $ Text
+
+	${NSD_GetText} $Text $0
+
+	${If} $0 == "hello"
+
+		MessageBox MB_OK "right back at ya!"
+
+	${EndIf}
+
+FunctionEnd
+
+Section
+SectionEnd
+ +

Memory

+ +

So far we have a page that has some basic input controls. But what happens when the user goes to the next page and comes back? With the current code, the user's input will not be remembered. To remember, we'll use the already present leave callback function to store the user's choice in variables and pass these values when creating the controls the next time. For a better example, we'll also add a checkbox to the page and use ${NSD_GetState} and ${NSD_SetState} to get and set its state.

+ +

For clarity, we'll remove some of the notifications from the previous step.

+ +
!include nsDialogs.nsh
+!include LogicLib.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+XPStyle on
+
+Var Dialog
+Var Label
+Var Text
+Var Text_State
+Var Checkbox
+Var Checkbox_State
+
+Page custom nsDialogsPage nsDialogsPageLeave
+Page license
+Page instfiles
+
+Function .onInit
+
+	StrCpy $Text_State "Type something here..."
+
+FunctionEnd
+
+Function nsDialogsPage
+
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
+	Pop $Label
+
+	${NSD_CreateText} 0 13u 100% 12u $Text_State
+	Pop $Text
+
+	${NSD_CreateCheckbox} 0 30u 100% 10u "&Something"
+	Pop $Checkbox
+
+	${If} $Checkbox_State == ${BST_CHECKED}
+		${NSD_Check} $Checkbox
+	${EndIf}
+
+	# alternative for the above ${If}:
+	#${NSD_SetState} $Checkbox_State
+
+	nsDialogs::Show
+
+FunctionEnd
+
+Function nsDialogsPageLeave
+
+	${NSD_GetText} $Text $Text_State
+	${NSD_GetState} $Checkbox $Checkbox_State
+
+FunctionEnd
+
+Section
+SectionEnd
+ +

Function Reference

+ +

Create

+

nsDialogs::Create rect

+

Creates a new dialog. rect specific the identifier of the control whose location will be mimiced. This should usually be 1018, which is control mimiced for creation of built-in pages. The Modern UI also has control 1044 for the welcome and the finish page.

+

Returns the new dialog's HWND on the stack or error.

+ +

CreateControl

+

nsDialogs::CreateControl class style extended_style x y width height text

+

Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.

+

Returns the new control's HWND on the stack or error.

+ +

Show

+

nsDialogs::Show

+

Displays the page. Call this once finished with nsDialogs::Create, nsDialogs::CreateControl and the rest.

+

Returns nothing.

+ +

SelectFileDialog

+

nsDialogs::SelectFileDialog mode initial_selection filter

+

Displays a file selection dialog to the user. If mode is set to save, displays a file save dialog. If mode is set to open, displays a file open dialog. +

initial_selection can be used to provide the user with a default file to look for and/or a default folder to look in. If initial_selection is empty no default filename will be provided for the user and the dialog will start in the current working directory. If initial_selection specifies just a filename, for example "test.exe", the dialog will be set up to look for a file called test.exe in the current working directory. If initial_selection specifies just a directory, for example "C:\Program Files", the dialog starts in the provided directory with no file name provided. If initial_selection specifies a directory and a filename, for example "C:\Windows\System32\calc.exe", the dialog will be set up to look for a file called calc.exe in the directory C:\Windows\System32.

+

filter is a list of available file filter pairs separated by pipes. A filter pair consists of a display string and a DOS-style wildcard pattern. If an empty string is passed, the default is used ("All Files|*.*").

+

Returns the selected file on the stack or an empty string if the user canceled the operation.

+
+nsDialogs::SelectFileDialog open "$DOCUMENTS\Config.ini" ".ini files|*.ini|All Files|*.*"
+Pop $0
+StrCmp $0 "" ...
+
+ +

SelectFolderDialog

+

nsDialogs::SelectFolderDialog title initial_selection

+

Displays a directory selection dialog to the user.

+

Returns the selected directory on the stack or "error" in case the user canceled the operation or an error occurred.

+ +

SetRTL

+

nsDialogs::SetRTL rtl_setting

+

Sets right-to-left mode on or off. If rtl_setting is 0, it's set to off. If rtl_setting is 1, it's set to on. This function must be called before any calls to nsDialogs::CreateControl.

+

Returns nothing.

+ +

GetUserData

+

nsDialogs::GetUserData control_HWND

+

Returns user data associated with the control on the stack. Use nsDialogs::SetUserData to set this data.

+ +

SetUserData

+

nsDialogs::SetUserData control_HWND data

+

Associates data with the control. Use nsDialogs::GetUserData to get this data.

+

Returns nothing.

+ +

OnBack

+

nsDialogs::OnBack function_address

+

Sets the callback function for the Back button. This function will be called when the user clicks the back button. Call Abort in this function to prevent the user from going back to the last page.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

OnChange

+

nsDialogs::OnChange control_HWND function_address

+

Sets a change notification callback function for the given control. Whenever the control changes, the function will be called and the control's HWND will be waiting on its stack.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

OnClick

+

nsDialogs::OnClick control_HWND function_address

+

Sets a click notification callback function for the given control. Whenever the control is clicked, the function will be called and the control's HWND will be waiting on its stack.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

OnNotify

+

nsDialogs::OnNotify control_HWND function_address

+

Sets a notification callback function for the given control. Whenever the control receives the WM_NOTIFY message, the function will be called and the control's HWND, notification code and a pointer to the NMHDR structure will be waiting on its stack. Use ${NSD_Return} to return a value.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

CreateTimer

+

nsDialogs::CreateTimer function_address timer_interval

+

Sets a timer that'd call the callback function for the given control every in a constant interval. Interval times are specified in milliseconds.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

KillTimer

+

nsDialogs::KillTimer function_address

+

Kills a previously set timer.

+

Use GetFunctionAddress to get the address of the desired callback function.

+

Returns nothing.

+ +

Macro Reference

+

nsDialogs.nsh contains a lot of macros that can make nsDialogs usage a lot easier. Below is a description of each of those macros including purpose, syntax, input and output.

+ +

NSD_Create*

+

${NSD_Create*} x y width height text

+

Create a new control in the current dialog. A dialog must exist for this to work, so nsDialogs::Create must be called prior to this function.

+

Available variants:

+
    +
  • ${NSD_CreateHLine}
  • +
  • ${NSD_CreateVLine}
  • +
  • ${NSD_CreateLabel}
  • +
  • ${NSD_CreateIcon}
  • +
  • ${NSD_CreateBitmap}
  • +
  • ${NSD_CreateBrowseButton}
  • +
  • ${NSD_CreateLink}
  • +
  • ${NSD_CreateButton}
  • +
  • ${NSD_CreateGroupBox}
  • +
  • ${NSD_CreateCheckBox}
  • +
  • ${NSD_CreateRadioButton} (${NSD_CreateFirstRadioButton} and ${NSD_CreateAdditionalRadioButton})
  • +
  • ${NSD_CreateText}
  • +
  • ${NSD_CreateMLText}
  • +
  • ${NSD_CreatePassword}
  • +
  • ${NSD_CreateNumber}
  • +
  • ${NSD_CreateFileRequest}
  • +
  • ${NSD_CreateDirRequest}
  • +
  • ${NSD_CreateRichEdit}
  • +
  • ${NSD_CreateComboBox}
  • +
  • ${NSD_CreateDropList}
  • +
  • ${NSD_CreateListBox}
  • +
  • ${NSD_CreateSortedListBox}
  • +
  • ${NSD_CreateProgressBar}
  • +
  • ${NSD_CreateAnimation}
  • +
  • ${NSD_CreateHTrackBar}
  • +
  • ${NSD_CreateVTrackBar}
  • +
  • ${NSD_CreateUpDown}
  • +
  • ${NSD_CreateHotKey}
  • +
  • ${NSD_CreateDatePicker} (Requires IE 3.1 and ${NSD_InitCommonControlsEx})
  • +
  • ${NSD_CreateIPAddress} (Requires IE 4 and ${NSD_InitCommonControl_IPAddress})
  • +
  • ${NSD_CreateNetAddress} (Requires Vista and ${NSD_InitCommonControl_NetAddress})
  • +
+

Returns the new control's HWND on the stack or error

+ +

NSD_OnBack

+

${NSD_OnBack} function_name

+

See OnBack for more details.

+ +

NSD_OnChange

+

${NSD_OnChange} control_HWND function_name

+

See OnChange for more details.

+

See Real-time Notification for usage example.

+ +

NSD_OnClick

+

${NSD_OnClick} control_HWND function_name

+

See OnClick for more details.

+ +

NSD_OnNotify

+

${NSD_OnNotify} control_HWND function_name

+

See OnNotify for more details.

+ +

NSD_Return

+

${NSD_Return} value

+

Used to return a value back to Windows from a OnNotify callback.

+ +

NSD_SetFocus

+

${NSD_SetFocus} control_HWND

+

Sets focus to a control.

+ +

NSD_CreateTimer

+

${NSD_CreateTimer} function_name timer_interval

+

See CreateTimer for more details.

+ +

NSD_KillTimer

+

${NSD_KillTimer} function_name

+

See KillTimer for more details.

+ +

NSD_AddStyle

+

${NSD_AddStyle} control_HWND style

+

Adds one or more window styles to a control. Multiple styles should be separated with pipes `|'.

+

See MSDN for shared and per-control style descriptions.

+ +

NSD_AddExStyle

+

${NSD_AddExStyle} control_HWND style

+

Adds one or more extended window styles to a control. Multiple styles should be separated with pipes `|'.

+

See MSDN for style descriptions.

+ +

NSD_RemoveStyle

+

${NSD_RemoveStyle} control_HWND style

+

Removes one or more window styles from a control.

+ +

NSD_RemoveExStyle

+

${NSD_RemoveExStyle} control_HWND style

+

Removes one or more extended window styles from a control.

+ +

NSD_GetText

+

${NSD_GetText} control_HWND $output_variable

+

Retrieves the text of a control and stores it into output_variable. Especially useful for textual controls.

+

See Control State for usage example.

+ +

NSD_SetText

+

${NSD_SetText} control_HWND text

+

Sets the text of a control.

+ +

NSD_Edit_SetTextLimit

+

${NSD_Edit_SetTextLimit} control_HWND limit

+

Sets the input length limit for a text control.

+ +

NSD_Edit_SetReadOnly

+

${NSD_Edit_SetReadOnly} control_HWND readonly

+

1 to make the text control read-only or 0 to allow the user to input data.

+ +

NSD_Edit_SetCueBannerText

+

${NSD_Edit_SetCueBannerText} control_HWND displaywhenfocused text

+

Set a text hint displayed when the control is empty. The text is only visible on WinXP and later. Requires XPStyle on.

+ +

NSD_RichEd_SetTextLimit

+

${NSD_RichEd_SetTextLimit} control_HWND limit

+

Sets the input length limit.

+ +

NSD_RichEd_SetEventMask

+

${NSD_RichEd_SetEventMask} control_HWND eventmask

+ +

NSD_RichEd_SetCustomBackgroundColor

+

${NSD_RichEd_SetCustomBackgroundColor} control_HWND COLORREF

+ +

NSD_GetState

+

${NSD_GetState} control_HWND $output_variable

+

Retrieves the state of a check box or a radio button control. Possible outputs are ${BST_CHECKED} and ${BST_UNCHECKED}.

+

See Memory for usage example.

+ +

NSD_SetState

+

${NSD_SetState} control_HWND state

+

Sets the state of a check box or a radio button control. Possible values for state are ${BST_CHECKED} and ${BST_UNCHECKED}.

+

See Memory for usage example.

+ +

NSD_Check

+

${NSD_Check} control_HWND

+

Checks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_CHECKED}.

+ +

NSD_Uncheck

+

${NSD_Uncheck} control_HWND

+

Unchecks a check box or a radio button control. Same as calling ${NSD_SetState} with ${BST_UNCHECKED}.

+

See Memory for usage example.

+ +

NSD_CB_AddString

+

${NSD_CB_AddString} combo_HWND string

+

Adds a string to a combo box.

+ +

NSD_CB_InsertString

+

${NSD_CB_InsertString} combo_HWND index string

+

${NSD_CB_PrependString} combo_HWND string

+

${NSD_CB_AppendString} combo_HWND string

+

Insert a string in a specified position in a combo box.

+ +

NSD_CB_SelectString

+

${NSD_CB_SelectString} combo_HWND string

+ +

Selects an item that begins with the characters in the string. Use NSD_CB_SelectStringExact to match the complete string.

+
+ +

NSD_CB_GetCount

+

${NSD_CB_GetCount} combo_HWND $output_variable

+ +

NSD_LB_AddString

+

${NSD_LB_AddString} listbox_HWND string

+

Adds a string to a list box.

+ +

NSD_LB_InsertString

+

${NSD_LB_InsertString} listbox_HWND index string

+

${NSD_LB_PrependString} listbox_HWND string

+

${NSD_LB_AppendString} listbox_HWND string

+

Insert a string in a specified position in a list box.

+ +

NSD_LB_DelString

+

${NSD_LB_DelString} listbox_HWND string

+

Deletes a string from a list box.

+ +

NSD_LB_DelItem

+

${NSD_LB_DelItem} listbox_HWND itemindex

+

Deletes a string from a list box.

+ +

NSD_LB_Clear

+

${NSD_LB_Clear} listbox_HWND

+

Deletes all strings from a list box.

+ +

NSD_LB_GetCount

+

${NSD_LB_GetCount} listbox_HWND $output_variable

+

Retrieves the number of strings from a list box.

+ +

NSD_LB_SelectString

+

${NSD_LB_SelectString} listbox_HWND string

+

Selects a string in a list box.

+ +

NSD_LB_GetSelection

+

${NSD_LB_GetSelection} listbox_HWND $output_variable

+

Retrieves the selected string from a list box. Returns an empty string if no string is selected.

+ +

NSD_Anim_OpenFile

+

${NSD_Anim_OpenFile} anim_HWND avi_path

+

Opens the specified (silent) .AVI movie clip.

+ +

NSD_Anim_Play

+

${NSD_Anim_Play} anim_HWND

+

Plays the movie clip repeatedly.

+ +

NSD_Anim_Stop

+

${NSD_Anim_Stop} anim_HWND

+

Stops playback.

+ +

NSD_TrackBar_GetPos

+

${NSD_TrackBar_GetPos} track_HWND $output

+ +

NSD_TrackBar_SetPos

+

${NSD_TrackBar_SetPos} track_HWND pos

+ +

NSD_TrackBar_SetRangeMin

+

${NSD_TrackBar_SetRangeMin} track_HWND minpos

+ +

NSD_TrackBar_SetRangeMax

+

${NSD_TrackBar_SetRangeMax} track_HWND maxpos

+ +

NSD_TrackBar_SetTicFreq

+

${NSD_TrackBar_SetTicFreq} track_HWND frequency

+

Sets the interval frequency for tick marks.

+ +

NSD_UD_SetBuddy

+

${NSD_UD_SetBuddy} ud_HWND buddy_HWND

+ +

NSD_UD_GetPos

+

${NSD_UD_GetPos} ud_HWND $output

+ +

NSD_UD_SetPos

+

${NSD_UD_SetPos} ud_HWND pos

+ +

NSD_UD_SetPackedRange

+

${NSD_UD_SetPackedRange} ud_HWND packedrange

+

Sets the min-max range. Two signed 16-bit numbers packed into 32-bits.

+ +

NSD_HK_GetHotKey

+

${NSD_HK_GetHotKey} hk_HWND $output

+

Bits 0..7 specify the virtual key code and bits 8..15 specify the HOTKEYF modifier flags.

+ +

NSD_HK_SetHotKey

+

${NSD_HK_SetHotKey} hk_HWND packedhotkey

+ +

NSD_Date_GetDateFields

+

${NSD_Date_GetDateFields} HWND

+

Returns the month, day and year on the stack.

+ +

NSD_SetBitmap

+

${NSD_SetBitmap} control_HWND image_path $output_variable

+

Loads a bitmap from image_path and displays it on control_HWND created by ${NSD_CreateBitmap}. The image handle is stored in output_variable and should be freed using ${NSD_FreeBitmap} once no longer necessary.

+

The image must be extracted to the user's computer prior to calling this macro. A good place to extract images is $PLUGINSDIR.

+
!include nsDialogs.nsh
+
+Name nsDialogs
+OutFile nsDialogs.exe
+
+Page custom nsDialogsImage
+Page instfiles
+
+Var Dialog
+Var ImageCtrl
+Var BmpHandle
+
+Function .onInit
+	InitPluginsDir
+	File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
+FunctionEnd
+
+Function nsDialogsImage
+	nsDialogs::Create 1018
+	Pop $Dialog
+
+	${If} $Dialog == error
+		Abort
+	${EndIf}
+
+	${NSD_CreateBitmap} 0 0 100% 100% ""
+	Pop $ImageCtrl
+	${NSD_SetBitmap} $ImageCtrl $PLUGINSDIR\image.bmp $BmpHandle
+
+	nsDialogs::Show
+
+	${NSD_FreeBitmap} $BmpHandle
+FunctionEnd
+
+Section
+SectionEnd
+ +

NSD_SetStretchedBitmap

+

${NSD_SetStretchedBitmap} control_HWND image_path $output_variable

+

Loads and displays a bitmap just like ${NSD_SetImage} but stretches the image to fit the control.

+ +

NSD_ClearBitmap

+

${NSD_ClearBitmap} control_HWND

+

Clears a bitmap from a image control.

+ +

NSD_FreeBitmap

+

${NSD_FreeImage} image_handle

+

Frees an image handle previously loaded with ${NSD_SetImage} or ${NSD_SetStretchedBitmap}.

+ +

NSD_SetIcon

+

${NSD_SetIcon} control_HWND image_path $output_variable

+

Same as ${NSD_SetImage}, but used for loading and setting an icon in a control created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.

+ +

NSD_SetIconFromInstaller

+

${NSD_SetIconFromInstaller} control_HWND $output_variable

+

Loads the icon used in the installer and displays it on control_HWND created by ${NSD_CreateIcon}. The image handle is stored in output_variable and should be freed using ${NSD_FreeIcon} once no longer necessary.

+ +

NSD_ClearIcon

+

${NSD_ClearIcon} control_HWND

+

Clears an icon from a control.

+ +

NSD_FreeIcon

+

${NSD_FreeIcon} icon_handle

+

Frees an icon handle previously loaded with ${NSD_SetIcon} or ${NSD_SetIconFromInstaller}.

+ + +

FAQ

+
+
    +
  • +Q: Can nsDialogs handle InstallOptions INI files? +
    +

    A: nsDialogs.nsh contains a function called CreateDialogFromINI that can create nsDialogs' dialog from an INI file. It can handle every type of control InstallOptions supports, but doesn't handle the flags or notifications. Examples\nsDialogs\InstallOptions.nsi shows a usage example of this function.

    +
    +
  • +
+
+ + + diff --git a/libs/NSIS/NSIS-source/Docs/nsExec/nsExec.txt b/libs/NSIS/NSIS-source/Docs/nsExec/nsExec.txt new file mode 100644 index 0000000000..c87923d912 --- /dev/null +++ b/libs/NSIS/NSIS-source/Docs/nsExec/nsExec.txt @@ -0,0 +1,55 @@ +nsExec +------ +nsExec will execute command-line based programs and capture the output +without opening a dos box. + + +Usage +----- +nsExec::Exec [/MBCS] [/OEM] [/TIMEOUT=x] path +Pop $0 + +-or- + +nsExec::ExecToLog [/MBCS] [/OEM] [/TIMEOUT=x] path +Pop $0 + +-or- + +nsExec::ExecToStack [/MBCS] [/OEM] [/TIMEOUT=x] path +Pop $0 ; Return +Pop $1 ; Output + +All functions are the same except ExecToLog will print the output +to the log window and ExecToStack will push up to ${NSIS_MAX_STRLEN} +characters of output onto the stack after the return value. + +Use the /MBCS switch to disable Unicode detection and always treat the text as ANSI. + +Use the /OEM switch to convert the output text from OEM to ANSI. + +The timeout value is optional. The timeout is the time in +milliseconds nsExec will wait for output. If output from the +process is received, the timeout value is reset and it will +again wait for more output using the timeout value. See Return +Value for how to check if there was a timeout. + +To ensure that command are executed without problems on all windows versions, +is recommended to use the following syntax: + + nsExec::ExecToStack [OPTIONS] '"PATH" param1 param2 paramN' + +This way the application path may contain non 8.3 paths (with spaces) + +Return Value +------------ +If nsExec is unable to execute the process, it will return "error" +on the top of the stack, if the process timed out it will return +"timeout", else it will return the return code from the +executed process. + + +Copyright Info +-------------- +Copyright (c) 2002 Robert Rainwater +Thanks to Justin Frankel and Amir Szekely \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/AdvSplash/Example.nsi b/libs/NSIS/NSIS-source/Examples/AdvSplash/Example.nsi new file mode 100644 index 0000000000..751c8361cb --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/AdvSplash/Example.nsi @@ -0,0 +1,35 @@ +Name "AdvSplash.dll test" + +OutFile "AdvSplash Test.exe" + +XPStyle on + +Function .onInit + # the plugins dir is automatically deleted when the installer exits + InitPluginsDir + File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" + #optional + #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav" + + MessageBox MB_OK "Fading" + + advsplash::show 1000 600 400 -1 $PLUGINSDIR\splash + + Pop $0 ; $0 has '1' if the user closed the splash screen early, + ; '0' if everything closed normally, and '-1' if some error occurred. + + MessageBox MB_OK "Transparency" + File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall.bmp" + advsplash::show 2000 0 0 0x1856B1 $PLUGINSDIR\splash + Pop $0 + + MessageBox MB_OK "Transparency/Fading" + File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" + advsplash::show 1000 600 400 0x04025C $PLUGINSDIR\splash + Pop $0 + + Delete $PLUGINSDIR\splash.bmp +FunctionEnd + +Section +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/AppGen.nsi b/libs/NSIS/NSIS-source/Examples/AppGen.nsi new file mode 100644 index 0000000000..d0fd977ddf --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/AppGen.nsi @@ -0,0 +1,78 @@ +/* +Note: This is not a installer example script, it's a script for a simple application used by some of the other examples. +*/ + +!define /math ARCBITS ${NSIS_PTR_SIZE} * 8 +Name "${NAME}" +!define /IfNDef OUTFILE "" +OutFile "${OUTFILE}" +Unicode True +!define /IfNDef REL User +RequestExecutionLevel ${REL} +XPStyle On +ManifestDPIAware True +AutoCloseWindow True +BrandingText " " +Caption "$(^Name) (${ARCBITS}-bit)" +MiscButtonText " " " " "E&xit" " " +LicenseBkColor /windows + +!ifdef COMPANY +!ifndef NOPEVI +!define /IfNDef VER 1.2.3.4 +VIProductVersion ${VER} +VIAddVersionKey /LANG=0 "FileVersion" "${VER}" +VIAddVersionKey /LANG=0 "CompanyName" "${COMPANY}" +VIAddVersionKey /LANG=0 "LegalCopyright" "${U+00A9} ${COMPANY}" +VIAddVersionKey /LANG=0 "FileDescription" "${NAME}" +!endif +!endif + +!include WinMessages.nsh +!include LogicLib.nsh + +PageEx License + Caption " " + LicenseText "$ExeFile$\n$ExePath" "E&xit" + PageCallbacks "" OnShow +PageExEnd +Page InstFiles + + +Function .onInit +!ifdef AUMI +System::Call 'SHELL32::SetCurrentProcessExplicitAppUserModelID(ws)' "${AUMI}" +!endif +FunctionEnd + + +Function OnShow +FindWindow $0 "#32770" "" $hWndParent +GetDlgItem $R9 $0 0x3E8 + +!ifdef MSG +SendMessage $R9 ${EM_REPLACESEL} "" "STR:${MSG}$\r$\n$\r$\n" +!endif + +!ifdef TMPLDATA +${IfNot} ${FileExists} "$AppData\${NAME}\*" + ; Copy template data from the shared source to this users profile + CreateDirectory "$AppData\${NAME}" + CopyFiles /Silent "${TMPLDATA}\*" "$AppData\${NAME}" +${EndIf} +ReadIniStr $2 "$AppData\${NAME}\Data.ini" Example Count +IntOp $2 $2 + 1 +WriteIniStr "$AppData\${NAME}\Data.ini" Example Count $2 +SendMessage $R9 ${EM_REPLACESEL} "" "STR:Launch Count=$2$\r$\n$\r$\n" +!endif + +SendMessage $R9 ${EM_REPLACESEL} "" "STR:CmdLine=$CmdLine$\r$\n" +ReadEnvStr $2 "USERNAME" +SendMessage $R9 ${EM_REPLACESEL} "" "STR:%USERNAME%=$2$\r$\n" +ReadEnvStr $2 "__COMPAT_LAYER" +StrCmp $2 "" +2 +SendMessage $R9 ${EM_REPLACESEL} "" "STR:Compatibility=$2$\r$\n" +FunctionEnd + +Section +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/Banner/Example.nsi b/libs/NSIS/NSIS-source/Examples/Banner/Example.nsi new file mode 100644 index 0000000000..2a98e875f0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Banner/Example.nsi @@ -0,0 +1,38 @@ +# Look at Readme.txt for usage alongside with the Modern UI + +!include "WinMessages.nsh" + +Name "Banner.dll test" + +OutFile "Banner Test.exe" + +ShowInstDetails show + +Function .onInit + Banner::show "Calculating important stuff..." + + Banner::getWindow + Pop $1 + + again: + IntOp $0 $0 + 1 + Sleep 1 + StrCmp $0 100 0 again + + GetDlgItem $2 $1 1030 + SendMessage $2 ${WM_SETTEXT} 0 "STR:Calculating more important stuff..." + + again2: + IntOp $0 $0 + 1 + Sleep 1 + StrCmp $0 200 0 again2 + + Banner::destroy +FunctionEnd + +Section + DetailPrint "Using previous calculations to quickly calculate 1*2000..." + Sleep 1000 + DetailPrint "Eureka! It's $0!!!" + DetailPrint "" +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/BgImage/Example.nsi b/libs/NSIS/NSIS-source/Examples/BgImage/Example.nsi new file mode 100644 index 0000000000..a0dc2ce91d --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/BgImage/Example.nsi @@ -0,0 +1,101 @@ +Name "BgImage.dll test" + +OutFile "BgImage Test.exe" + +XPStyle on +RequestExecutionLevel user + +!define DEBUG +!macro GetReturnValue +!ifdef DEBUG + Pop $R9 + StrCmp $R9 success +2 + DetailPrint "Error: $R9" +!endif +!macroend + +Function .onGUIInit + # the plugins dir is automatically deleted when the installer exits + InitPluginsDir + # lets extract some bitmaps... + File /oname=$PLUGINSDIR\1.bmp "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" + File /oname=$PLUGINSDIR\2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" + +!ifdef DEBUG + # turn return values on if in debug mode + BgImage::SetReturn on +!endif + + # set the initial background for images to be drawn on + # we will use a gradient from drak green to dark red + BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0 + !insertmacro GetReturnValue + # add an image @ (150,0) + BgImage::AddImage $PLUGINSDIR\2.bmp 150 0 + !insertmacro GetReturnValue + # add the same image only transparent (magenta wiped) @ (150,16) + BgImage::AddImage /TRANSPARENT 255 0 255 $PLUGINSDIR\2.bmp 150 16 + !insertmacro GetReturnValue + # create the font for the following text + CreateFont $R0 "Comic Sans MS" 50 700 + # add a blue shadow for the text + BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 48 48 798 198 + !insertmacro GetReturnValue + # add a green shadow for the text + BgImage::AddText "Testing 1... 2... 3..." $R0 0 255 0 52 52 802 202 + !insertmacro GetReturnValue + # add the text + BgImage::AddText "Testing 1... 2... 3..." $R0 255 0 0 50 50 800 200 + !insertmacro GetReturnValue + # show our creation to the world! + BgImage::Redraw + # Refresh doesn't return any value + +FunctionEnd + +ShowInstDetails show + +Section + # play some sounds + FindFirst $0 $1 $WINDIR\Media\*.wav + StrCmp $0 "" skipSound + moreSounds: + StrCmp $1 "" noMoreSounds + BgImage::Sound /WAIT $WINDIR\Media\$1 + # Sound doesn't return any value either + MessageBox MB_YESNO "Another sound?" IDNO noMoreSounds + FindNext $0 $1 + Goto moreSounds + + noMoreSounds: + FindClose $0 + skipSound: + + # change the background image to Mike, tiled + BgImage::SetBg /TILED $PLUGINSDIR\1.bmp + !insertmacro GetReturnValue + # we have to redraw to reflect the changes + BgImage::Redraw + + MessageBox MB_OK "Mike the llama" + + # clear everything + BgImage::Clear + # Clear doesn't return any value + # set another gradient + BgImage::SetBg /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65 + !insertmacro GetReturnValue + # add some text + BgImage::AddText "A Desert for Mike" $R0 0 0 0 50 50 800 150 + !insertmacro GetReturnValue + # add mike as an image + BgImage::AddImage $PLUGINSDIR\1.bmp 50 150 + !insertmacro GetReturnValue + # again, we have to call redraw to reflect changes + BgImage::Redraw +SectionEnd + +Function .onGUIEnd + BgImage::Destroy + # Destroy doesn't return any value +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/FileFunc.ini b/libs/NSIS/NSIS-source/Examples/FileFunc.ini new file mode 100644 index 0000000000..5b227f4152 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/FileFunc.ini @@ -0,0 +1,91 @@ +[Settings] +NumFields=11 +NextButtonText=&Enter + +[Field 1] +Type=Droplist +Flags=NOTIFY +State=" 1. Locate" +ListItems=| 1. Locate| 2. GetSize (file)| (directory)| (no size, no subdir)| 3. DriveSpace| 4. GetDrives (by type)| (all by letter)| 5. GetTime (local time)| (file time)| 6. GetFileAttributes| 7. GetFileVersion| 8. GetExeName| 9. GetExePath|10. GetParameters|11. GetOptions|12. GetRoot|13. GetParent|14. GetFileName|15. GetBaseName|16. GetFileExt|17. BannerTrimPath|18. DirState|19. RefreshShellIcons +Left=44 +Right=190 +Top=1 +Bottom=210 + +[Field 2] +Type=FileRequest +Left=44 +Right=-10 +Top=22 +Bottom=33 + +[Field 3] +Type=DirRequest +Left=44 +Right=-10 +Top=22 +Bottom=33 + +[Field 4] +Type=Text +Left=44 +Right=-10 +Top=36 +Bottom=49 + +[Field 5] +Type=Text +State=LocateCallback +Left=44 +Right=232 +Top=53 +Bottom=66 + +[Field 6] +Type=Button +Text=view +Flags=NOTIFY +Left=236 +Right=255 +Top=54 +Bottom=65 + +[Field 7] +Type=Text +Flags=MULTILINE|VSCROLL|HSCROLL|READONLY +Left=44 +Right=-10 +Top=73 +Bottom=128 + +[Field 8] +Type=Label +Text=Path +Left=10 +Right=43 +Top=24 +Bottom=36 + +[Field 9] +Type=Label +Text=Options +Left=10 +Right=43 +Top=40 +Bottom=52 + +[Field 10] +Type=Label +Text=Function +Left=10 +Right=44 +Top=56 +Bottom=67 + +[Field 11] +Type=Label +Text=Result: +Left=12 +Right=42 +Top=94 +Bottom=102 diff --git a/libs/NSIS/NSIS-source/Examples/FileFunc.nsi b/libs/NSIS/NSIS-source/Examples/FileFunc.nsi new file mode 100644 index 0000000000..f109ec7ca5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/FileFunc.nsi @@ -0,0 +1,732 @@ +;_____________________________________________________________________________ +; +; File Functions +;_____________________________________________________________________________ +; +; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "File Functions" +OutFile "FileFunc.exe" +Caption "$(^Name)" +XPStyle on +RequestExecutionLevel user + +!include "WinMessages.nsh" +!include "FileFunc.nsh" + +Var INI +Var HWND +Var STATE +Var FUNCTION +Var LOCATE1 +Var LOCATE2 +Var GETSIZE1 +Var GETSIZE2 +Var GETSIZE3 +Var GETSIZE4 +Var GETSIZE5 +Var GETSIZE6 +Var DRIVESPACE1 +Var DRIVESPACE2 +Var GETDRIVES1 +Var GETTIME1 +Var GETTIME2 +Var GETFILEATTRIBUTES1 +Var GETFILEATTRIBUTES2 +Var GETFILEVERSION1 +Var GETOPTIONS1 +Var GETOPTIONS2 +Var GETROOT1 +Var GETPARENT1 +Var GETFILENAME1 +Var GETBASENAME1 +Var GETFILEEXT1 +Var BANNERTRIMPATH1 +Var BANNERTRIMPATH2 +Var DIRSTATE1 + +Page Custom ShowCustom LeaveCustom + +Function ShowCustom + InstallOptions::initDialog "$INI" + Pop $hwnd + GetDlgItem $1 $HWND 1201 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1202 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1206 + EnableWindow $1 0 + SendMessage $1 ${WM_ENABLE} 1 0 + StrCpy $LOCATE1 $DOCUMENTS + StrCpy $LOCATE2 '/L=FD /M=*.* /S=0B /G=1 /B=0' + StrCpy $GETSIZE1 '$WINDIR' + StrCpy $GETSIZE2 '/M=Explorer.exe /S=0K /G=0' + StrCpy $GETSIZE3 '$PROGRAMFILES\Common Files' + StrCpy $GETSIZE4 '/S=0M' + StrCpy $GETSIZE5 '$WINDIR' + StrCpy $GETSIZE6 '/G=0' + StrCpy $DRIVESPACE1 'C:\' + StrCpy $DRIVESPACE2 '/D=F /S=M' + StrCpy $GETDRIVES1 'FDD+CDROM' + StrCpy $GETTIME1 '$WINDIR\Explorer.exe' + StrCpy $GETTIME2 'C' + StrCpy $GETFILEATTRIBUTES1 'C:\IO.SYS' + StrCpy $GETFILEATTRIBUTES2 'ALL' + StrCpy $GETFILEVERSION1 '$WINDIR\Explorer.exe' + StrCpy $GETOPTIONS1 '/SILENT=yes /INSTDIR="$PROGRAMFILES\Common Files"' + StrCpy $GETOPTIONS2 '/INSTDIR=' + StrCpy $GETROOT1 'C:\path\file.dll' + StrCpy $GETPARENT1 'C:\path\file.dll' + StrCpy $GETFILENAME1 'C:\path\file.dll' + StrCpy $GETBASENAME1 'C:\path\file.dll' + StrCpy $GETFILEEXT1 'C:\path\file.dll' + StrCpy $BANNERTRIMPATH1 'C:\Server\Documents\Terminal\license.htm' + StrCpy $BANNERTRIMPATH2 '34A' + StrCpy $DIRSTATE1 '$TEMP' + + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1" + GetDlgItem $1 $HWND 1205 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2" + InstallOptions::show + Pop $0 +FunctionEnd + +Function LeaveCustom + ReadINIStr $STATE $INI "Field 1" "State" + ReadINIStr $R1 $INI "Field 2" "State" + ReadINIStr $R2 $INI "Field 3" "State" + ReadINIStr $R3 $INI "Field 4" "State" + ReadINIStr $R4 $INI "Field 5" "State" + ReadINIStr $0 $INI "Settings" "State" + StrCmp $0 6 view + StrCmp $0 0 Enter + goto main + + view: + StrCpy $0 '$$' + StrCpy $1 'n' + StrCpy $2 'r' + StrCmp $R4 "LocateCallback" 0 +3 + StrCpy $R0 `Function LocateCallback$\r$\n MessageBox MB_OKCANCEL '$0$$R9 "path\name"=[$$R9]$0\$1$0$$R8 "path" =[$$R8]$0\$1$0$$R7 "name" =[$$R7]$0\$1$0$$R6 "size" =[$$R6]' IDOK +2$\r$\n StrCpy $$R0 StopLocate$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd` + goto send + StrCmp $R4 "GetDrivesCallback" 0 error + StrCpy $R0 `Function GetDrivesCallback$\r$\n MessageBox MB_OKCANCEL '$0$$9 "drive letter"=[$$9]$0\$1$0$$8 "drive type" =[$$8]' IDOK +2$\r$\n StrCpy $$R0 StopGetDrives$\r$\n StrCpy $$R5 '$$R5$$9 [$$8 Drive]$$\$2$$\$1'$\r$\n$\r$\n Push $$R0$\r$\nFunctionEnd` + goto send + + main: + StrCmp $FUNCTION '' DefaultSend + StrCmp $FUNCTION Locate 0 +4 + StrCpy $LOCATE1 $R2 + StrCpy $LOCATE2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetSize1 0 +4 + StrCpy $GETSIZE1 $R2 + StrCpy $GETSIZE2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetSize2 0 +4 + StrCpy $GETSIZE3 $R2 + StrCpy $GETSIZE4 $R3 + goto DefaultSend + StrCmp $FUNCTION GetSize3 0 +4 + StrCpy $GETSIZE5 $R2 + StrCpy $GETSIZE6 $R3 + goto DefaultSend + StrCmp $FUNCTION DriveSpace 0 +4 + StrCpy $DRIVESPACE1 $R1 + StrCpy $DRIVESPACE2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetDrives 0 +3 + StrCpy $GETDRIVES1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetTime 0 +4 + StrCpy $GETTIME1 $R1 + StrCpy $GETTIME2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetFileAttributes 0 +4 + StrCpy $GETFILEATTRIBUTES1 $R1 + StrCpy $GETFILEATTRIBUTES2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetFileVersion 0 +3 + StrCpy $GETFILEVERSION1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetOptions 0 +4 + StrCpy $GETOPTIONS1 $R1 + StrCpy $GETOPTIONS2 $R3 + goto DefaultSend + StrCmp $FUNCTION GetRoot 0 +3 + StrCpy $GETROOT1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetParent 0 +3 + StrCpy $GETPARENT1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetFileName 0 +3 + StrCpy $GETFILENAME1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetBaseName 0 +3 + StrCpy $GETBASENAME1 $R1 + goto DefaultSend + StrCmp $FUNCTION GetFileExt 0 +3 + StrCpy $GETFILEEXT1 $R1 + goto DefaultSend + StrCmp $FUNCTION BannerTrimPath 0 +4 + StrCpy $BANNERTRIMPATH1 $R1 + StrCpy $BANNERTRIMPATH2 $R3 + goto DefaultSend + StrCmp $FUNCTION DirState 0 +2 + StrCpy $DIRSTATE1 $R2 + + DefaultSend: + GetDlgItem $1 $HWND 1201 + EnableWindow $1 1 + ShowWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1202 + EnableWindow $1 1 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1203 + EnableWindow $1 1 + ShowWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1204 + EnableWindow $1 1 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1205 + EnableWindow $1 1 + GetDlgItem $1 $HWND 1206 + ShowWindow $1 0 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1207 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + + ReadINIStr $0 $INI "Field 1" "State" + StrCmp $0 " 1. Locate" 0 GetSize1Send + StrCpy $FUNCTION Locate + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE1" + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$LOCATE2" + GetDlgItem $1 $HWND 1206 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:LocateCallback" + GetDlgItem $1 $HWND 1207 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Path" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" + abort + + GetSize1Send: + StrCmp $0 " 2. GetSize (file)" 0 GetSize2Send + StrCpy $FUNCTION 'GetSize1' + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE1" + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:File" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" + Abort + + GetSize2Send: + StrCmp $0 " (directory)" 0 GetSize3Send + StrCpy $FUNCTION 'GetSize2' + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE3" + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE4" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" + Abort + + GetSize3Send: + StrCmp $0 " (no size, no subdir)" 0 DriveSpaceSend + StrCpy $FUNCTION 'GetSize3' + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE5" + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETSIZE6" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" + Abort + + DriveSpaceSend: + StrCmp $0 " 3. DriveSpace" 0 GetDrivesSend + StrCpy $FUNCTION DriveSpace + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$DRIVESPACE2" + GetDlgItem $1 $HWND 1206 + ShowWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1207 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Drive" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Options" + abort + + GetDrivesSend: + StrCmp $0 " 4. GetDrives (by type)" 0 GetDrives2Send + StrCpy $FUNCTION GetDrives + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETDRIVES1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1206 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback" + GetDlgItem $1 $HWND 1207 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" + abort + + GetDrives2Send: + StrCmp $0 " (all by letter)" 0 GetTime1Send + StrCpy $FUNCTION '' + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + EnableWindow $1 0 + SendMessage $1 ${WM_ENABLE} 1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:ALL" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1206 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:GetDrivesCallback" + GetDlgItem $1 $HWND 1207 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Function" + abort + + GetTime1Send: + StrCmp $0 " 5. GetTime (local time)" 0 GetTime2Send + StrCpy $FUNCTION '' + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + EnableWindow $1 0 + SendMessage $1 ${WM_ENABLE} 1 0 + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + EnableWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:L" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + Abort + + GetTime2Send: + StrCmp $0 " (file time)" 0 GetFileAttributesSend + StrCpy $FUNCTION GetTime + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETTIME2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:File" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + Abort + + GetFileAttributesSend: + StrCmp $0 " 6. GetFileAttributes" 0 GetFileVersionSend + StrCpy $FUNCTION GetFileAttributes + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEATTRIBUTES2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Path" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Attrib" + Abort + + GetFileVersionSend: + StrCmp $0 " 7. GetFileVersion" 0 GetCmdSend + StrCpy $FUNCTION GetFileVersion + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEVERSION1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:File" + Abort + + GetCmdSend: + StrCmp $0 " 8. GetExeName" +3 + StrCmp $0 " 9. GetExePath" +2 + StrCmp $0 "10. GetParameters" 0 GetOptionsSend + StrCpy $FUNCTION '' + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + Abort + + GetOptionsSend: + StrCmp $0 "11. GetOptions" 0 GetRootSend + StrCpy $FUNCTION GetOptions + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETOPTIONS2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Parameters" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + Abort + + GetRootSend: + StrCmp $0 "12. GetRoot" 0 GetParentSend + StrCpy $FUNCTION GetRoot + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETROOT1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:FullPath" + Abort + + GetParentSend: + StrCmp $0 "13. GetParent" 0 GetFileNameSend + StrCpy $FUNCTION GetParent + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETPARENT1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" + Abort + + GetFileNameSend: + StrCmp $0 "14. GetFileName" 0 GetBaseNameSend + StrCpy $FUNCTION GetFileName + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILENAME1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" + Abort + + GetBaseNameSend: + StrCmp $0 "15. GetBaseName" 0 GetFileExtSend + StrCpy $FUNCTION GetBaseName + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETBASENAME1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString" + Abort + + GetFileExtSend: + StrCmp $0 "16. GetFileExt" 0 BannerTrimPathSend + StrCpy $FUNCTION GetFileExt + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$GETFILEEXT1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:FileString" + Abort + + BannerTrimPathSend: + StrCmp $0 "17. BannerTrimPath" 0 DirStateSend + StrCpy $FUNCTION BannerTrimPath + GetDlgItem $1 $HWND 1201 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH1" + GetDlgItem $1 $HWND 1202 + ShowWindow $1 1 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$BANNERTRIMPATH2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:PathString" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + Abort + + DirStateSend: + StrCmp $0 "18. DirState" 0 RefreshShellIconsSend + StrCpy $FUNCTION DirState + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$DIRSTATE1" + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Directory" + Abort + + RefreshShellIconsSend: + StrCmp $0 "19. RefreshShellIcons" 0 Abort + StrCpy $FUNCTION '' + GetDlgItem $1 $HWND 1205 + ShowWindow $1 0 + + Abort: + Abort + +;=Enter= + Enter: + StrCpy $R0 '' + StrCpy $R5 '' + + StrCmp $STATE " 1. Locate" Locate + StrCmp $STATE " 2. GetSize (file)" GetSize + StrCmp $STATE " (directory)" GetSize + StrCmp $STATE " (no size, no subdir)" GetSize + StrCmp $STATE " 3. DriveSpace" DriveSpace + StrCmp $STATE " 4. GetDrives (by type)" GetDrives + StrCmp $STATE " (all by letter)" GetDrives + StrCmp $STATE " 5. GetTime (local time)" GetTime + StrCmp $STATE " (file time)" GetTime + StrCmp $STATE " 6. GetFileAttributes" GetFileAttributes + StrCmp $STATE " 7. GetFileVersion" GetFileVersion + StrCmp $STATE " 8. GetExeName" GetExeName + StrCmp $STATE " 9. GetExePath" GetExePath + StrCmp $STATE "10. GetParameters" GetParameters + StrCmp $STATE "11. GetOptions" GetOptions + StrCmp $STATE "12. GetRoot" GetRoot + StrCmp $STATE "13. GetParent" GetParent + StrCmp $STATE "14. GetFileName" GetFileName + StrCmp $STATE "15. GetBaseName" GetBaseName + StrCmp $STATE "16. GetFileExt" GetFileExt + StrCmp $STATE "17. BannerTrimPath" BannerTrimPath + StrCmp $STATE "18. DirState" DirState + StrCmp $STATE "19. RefreshShellIcons" RefreshShellIcons + Abort + + Locate: + ${Locate} "$R2" "$R3" "LocateCallback" + IfErrors error + StrCmp $R0 StopLocate 0 +3 + StrCpy $R0 'stopped' + goto send + StrCpy $R0 'done' + goto send + + GetSize: + ${GetSize} "$R2" "$R3" $0 $1 $2 + IfErrors error + StrCpy $R0 "Size=$0$\r$\nFiles=$1$\r$\nFolders=$2" + goto send + + DriveSpace: + ${DriveSpace} "$R1" "$R3" $0 + IfErrors error + StrCpy $R0 "$0" + goto send + + GetDrives: + ${GetDrives} "$R1" "GetDrivesCallback" + StrCmp $R0 StopGetDrives 0 +3 + StrCpy $R0 '$R5stopped' + goto send + StrCpy $R0 '$R5done' + goto send + + GetTime: + ${GetTime} "$R1" "$R3" $0 $1 $2 $3 $4 $5 $6 + IfErrors error + StrCpy $R0 'Date=$0/$1/$2 ($3)$\r$\nTime=$4:$5:$6' + goto send + + GetFileAttributes: + ${GetFileAttributes} "$R1" "$R3" $0 + IfErrors error + StrCpy $R0 '$0' + goto send + + GetFileVersion: + ${GetFileVersion} "$R1" $0 + IfErrors error + StrCpy $R0 '$0' + goto send + + GetExeName: + ${GetExeName} $0 + StrCpy $R0 '$0' + goto send + + GetExePath: + ${GetExePath} $0 + StrCpy $R0 '$0' + goto send + + GetParameters: + ${GetParameters} $0 + StrCpy $R0 '$0' + StrCmp $R0 '' 0 send + StrCpy $R0 'no parameters' + goto send + + GetOptions: + ${GetOptions} "$R1" "$R3" $0 + IfErrors error + StrCpy $R0 '$0' + goto send + + GetRoot: + ${GetRoot} "$R1" $0 + StrCpy $R0 '$0' + goto send + + GetParent: + ${GetParent} "$R1" $0 + StrCpy $R0 '$0' + goto send + + GetFileName: + ${GetFileName} "$R1" $0 + StrCpy $R0 '$0' + goto send + + GetBaseName: + ${GetBaseName} "$R1" $0 + StrCpy $R0 '$0' + goto send + + GetFileExt: + ${GetFileExt} "$R1" $0 + StrCpy $R0 '$0' + goto send + + BannerTrimPath: + ${BannerTrimPath} "$R1" "$R3" $0 + StrCpy $R0 '$0' + goto send + + DirState: + ${DirState} "$R2" $0 + StrCpy $R0 '$0' + goto send + + RefreshShellIcons: + ${RefreshShellIcons} + StrCpy $R0 'done' + goto send + + error: + StrCpy $R0 'error' + + send: + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0" + + abort +FunctionEnd + +Function LocateCallback + MessageBox MB_OKCANCEL '$$R9 "path\name"=[$R9]$\n$$R8 "path" =[$R8]$\n$$R7 "name" =[$R7]$\n$$R6 "size" =[$R6]' IDOK +2 + StrCpy $R0 StopLocate + + Push $R0 +FunctionEnd + +Function GetDrivesCallback + MessageBox MB_OKCANCEL '$$9 "drive letter"=[$9]$\n$$8 "drive type" =[$8]' IDOK +2 + StrCpy $R0 StopGetDrives + StrCpy $R5 '$R5$9 [$8 Drive]$\r$\n' + + Push $R0 +FunctionEnd + +Function .onInit + InitPluginsDir + GetTempFileName $INI $PLUGINSDIR + File /oname=$INI "FileFunc.ini" +FunctionEnd + +Page instfiles + +Section "Empty" +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/FileFuncTest.nsi b/libs/NSIS/NSIS-source/Examples/FileFuncTest.nsi new file mode 100644 index 0000000000..0a2db35b1a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/FileFuncTest.nsi @@ -0,0 +1,572 @@ +;_____________________________________________________________________________ +; +; File Functions Test +;_____________________________________________________________________________ +; +; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "File Functions Test" +OutFile "FileFuncTest.exe" +Caption "$(^Name)" +ShowInstDetails show +XPStyle on +RequestExecutionLevel user + +Var FUNCTION +Var OUT1 +Var OUT2 +Var OUT3 +Var OUT4 +Var OUT5 +Var OUT6 +Var OUT7 + +!include "FileFunc.nsh" +!include "LogicLib.nsh" + +;############### INSTALL ############### + +!define StackVerificationStart `!insertmacro StackVerificationStart` +!macro StackVerificationStart _FUNCTION + StrCpy $FUNCTION ${_FUNCTION} + Call StackVerificationStart +!macroend + +!define StackVerificationEnd `!insertmacro StackVerificationEnd` +!macro StackVerificationEnd + Call StackVerificationEnd +!macroend + +Function StackVerificationStart + StrCpy $0 !0 + StrCpy $1 !1 + StrCpy $2 !2 + StrCpy $3 !3 + StrCpy $4 !4 + StrCpy $5 !5 + StrCpy $6 !6 + StrCpy $7 !7 + StrCpy $8 !8 + StrCpy $9 !9 + StrCpy $R0 !R0 + StrCpy $R1 !R1 + StrCpy $R2 !R2 + StrCpy $R3 !R3 + StrCpy $R4 !R4 + StrCpy $R5 !R5 + StrCpy $R6 !R6 + StrCpy $R7 !R7 + StrCpy $R8 !R8 + StrCpy $R9 !R9 +FunctionEnd + +Function StackVerificationEnd + IfErrors +3 + DetailPrint 'PASSED $FUNCTION no errors' + goto +2 + DetailPrint 'FAILED $FUNCTION error' + + StrCmp $0 '!0' 0 error + StrCmp $1 '!1' 0 error + StrCmp $2 '!2' 0 error + StrCmp $3 '!3' 0 error + StrCmp $4 '!4' 0 error + StrCmp $5 '!5' 0 error + StrCmp $6 '!6' 0 error + StrCmp $7 '!7' 0 error + StrCmp $8 '!8' 0 error + StrCmp $9 '!9' 0 error + StrCmp $R0 '!R0' 0 error + StrCmp $R1 '!R1' 0 error + StrCmp $R2 '!R2' 0 error + StrCmp $R3 '!R3' 0 error + StrCmp $R4 '!R4' 0 error + StrCmp $R5 '!R5' 0 error + StrCmp $R6 '!R6' 0 error + StrCmp $R7 '!R7' 0 error + StrCmp $R8 '!R8' 0 error + StrCmp $R9 '!R9' 0 error + DetailPrint 'PASSED $FUNCTION stack' + goto end + + error: + DetailPrint 'FAILED $FUNCTION stack' +; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 +; quit + + end: +FunctionEnd + + + +Section Locate + ${StackVerificationStart} Locate + + ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'LocateCallback' + + ${StackVerificationEnd} +SectionEnd + +Function LocateCallback +; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 +; StrCpy $0 StopLocate + + Push $0 +FunctionEnd + + +Section GetSize + ${StackVerificationStart} GetSize + + ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 + + ${StackVerificationEnd} +SectionEnd + + +Section DriveSpace + ${StackVerificationStart} DriveSpace + + ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section GetDrives + ${StackVerificationStart} GetDrives + + ${GetDrives} 'FDD+CDROM' 'GetDrivesCallback' + + ${StackVerificationEnd} +SectionEnd + +Function GetDrivesCallback +; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 +; StrCpy $0 StopGetDrives + + Push $0 +FunctionEnd + + +Section GetTime + ${StackVerificationStart} GetTime + + ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 + + ${StackVerificationEnd} +SectionEnd + + +Section GetFileAttributes + ${StackVerificationStart} GetFileAttributes + + ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section GetFileVersion + ${StackVerificationStart} GetFileVersion + + ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section GetExeName + ${StackVerificationStart} GetExeName + + ${GetExeName} $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section GetExePath + ${StackVerificationStart} GetExePath + + ${GetExePath} $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section GetParameters + ${StackVerificationStart} GetParameters + + # basic stuff + + StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe"' + ${GetParameters} $OUT1 + StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" test' + ${GetParameters} $OUT2 + StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" "test"' + ${GetParameters} $OUT3 + StrCpy $CMDLINE 'C:\Hello.exe' + ${GetParameters} $OUT4 + StrCpy $CMDLINE 'C:\Hello.exe test' + ${GetParameters} $OUT5 + StrCpy $CMDLINE 'C:\Hello.exe "test"' + ${GetParameters} $OUT6 + StrCpy $CMDLINE 'C:\Hello.exe test test ' + ${GetParameters} $OUT7 + + ${If} $OUT1 != "" + ${OrIf} $OUT2 != "test" + ${OrIf} $OUT3 != '"test"' + ${OrIf} $OUT4 != "" + ${OrIf} $OUT5 != "test" + ${OrIf} $OUT6 != '"test"' + ${OrIf} $OUT7 != 'test test' + SetErrors + ${EndIf} + + # some corner cases + + StrCpy $CMDLINE '' + ${GetParameters} $OUT1 + StrCpy $CMDLINE '"' + ${GetParameters} $OUT2 + StrCpy $CMDLINE '""' + ${GetParameters} $OUT3 + StrCpy $CMDLINE '"" test' + ${GetParameters} $OUT4 + StrCpy $CMDLINE ' test' + ${GetParameters} $OUT5 + StrCpy $CMDLINE ' test' # left over bug(?) from old GetParameters + # it starts looking for ' ' from the third char + ${GetParameters} $OUT6 + StrCpy $CMDLINE ' ' + ${GetParameters} $OUT7 + + ${If} $OUT1 != "" + ${OrIf} $OUT2 != "" + ${OrIf} $OUT3 != "" + ${OrIf} $OUT4 != "" + ${OrIf} $OUT5 != "" + ${OrIf} $OUT6 != "" + ${OrIf} $OUT7 != "" + SetErrors + ${EndIf} + + ${StackVerificationEnd} +SectionEnd + + +Section GetOptions + ${StackVerificationStart} GetOptions + + ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 + StrCmp $OUT1 'C:\Program Files\Common Files' 0 error + + ${GetOptions} '-TMP=temp.tmp -INSTDIR="C:/Program Files/Common Files" -SILENT=yes' '-INSTDIR=' $OUT1 + StrCmp $OUT1 'C:/Program Files/Common Files' 0 error + + ${GetOptions} "/INSTDIR='C:/Program Files/Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 + StrCmp $OUT1 'C:/Program Files/Common Files' 0 error + + StrCpy $OUT1 '/INSTDIR=`C:/Program Files/Common Files` /SILENT=yes' + ${GetOptions} '$OUT1' '/INSTDIR=' $OUT1 + StrCmp $OUT1 'C:/Program Files/Common Files' 0 error + + ${GetOptions} '/SILENT=yes /INSTDIR=C:\Program Files\Common Files' '/INSTDIR=' $OUT1 + StrCmp $OUT1 'C:\Program Files\Common Files' 0 error + + ${GetOptions} "/INSTDIR=common directory: 'C:\Program Files\Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 + StrCmp $OUT1 "common directory: 'C:\Program Files\Common Files'" 0 error + + ${GetOptions} '/INSTDIR=WxxxW /SILENT=yes' '/INSTDIR=' $OUT1 + StrCmp $OUT1 'WxxxW' 0 error + + ${GetOptions} "/Prm='/D=True' /D=1" '/D=' $OUT1 + StrCmp $OUT1 "1" 0 error + + ${GetOptions} "/D=1 /Prm='/D=True'" '/Prm=' $OUT1 + StrCmp $OUT1 "/D=True" 0 error + + ${GetOptions} `/D=1 /Prm='/D="True" /S="/Temp"'` '/Prm=' $OUT1 + StrCmp $OUT1 '/D="True" /S="/Temp"' 0 error + + ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR=' $OUT1 + StrCmp $OUT1 '"C:/Program Files/Common Files"' 0 error + + ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR*=' $OUT1 + IfErrors 0 error + StrCmp $OUT1 '' 0 error + + ${GetOptions} `/INSTDIR="C:/Program Files/Common Files" /SILENT=yes` '' $OUT1 + IfErrors 0 error + StrCmp $OUT1 '' 0 error + + ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 + IfErrors error + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetOptionsS + ${StackVerificationStart} GetOptionsS + + ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 + IfErrors error + StrCmp $OUT1 'C:\Program Files\Common Files' 0 error + + ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/Instdir=' $OUT1 + IfErrors 0 error + StrCmp $OUT1 '' 0 error + + ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 + IfErrors error + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetRoot + ${StackVerificationStart} GetRoot + + ${GetRoot} 'C:\Program Files\NSIS' $OUT1 + StrCmp $OUT1 'C:' 0 error + + ${GetRoot} '\\SuperPimp\NSIS\Source\exehead\Ui.c' $OUT1 + StrCmp $OUT1 '\\SuperPimp\NSIS' 0 error + + ${GetRoot} '\\Program Files\NSIS' $OUT1 + StrCmp $OUT1 '\\Program Files\NSIS' 0 error + + ${GetRoot} '\\Program Files\NSIS\' $OUT1 + StrCmp $OUT1 '\\Program Files\NSIS' 0 error + + ${GetRoot} '\\Program Files\NSIS\Source\exehead\Ui.c' $OUT1 + StrCmp $OUT1 '\\Program Files\NSIS' 0 error + + ${GetRoot} '\Program Files\NSIS' $OUT1 + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetParent + ${StackVerificationStart} GetParent + + ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + StrCmp $OUT1 'C:\Program Files\Winamp' 0 error + + ${GetParent} 'C:\Program Files\Winamp\plugins' $OUT1 + StrCmp $OUT1 'C:\Program Files\Winamp' 0 error + + ${GetParent} 'C:\Program Files\Winamp\plugins\' $OUT1 + StrCmp $OUT1 'C:\Program Files\Winamp' 0 error + + ${GetParent} 'C:\' $OUT1 + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetFileName + ${StackVerificationStart} GetFileName + + ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + StrCmp $OUT1 'uninstwa.exe' 0 error + + ${GetFileName} 'uninstwa.exe' $OUT1 + StrCmp $OUT1 'uninstwa.exe' 0 error + + ${GetFileName} 'C:\Program Files\Winamp\plugins' $OUT1 + StrCmp $OUT1 'plugins' 0 error + + ${GetFileName} 'C:\Program Files\Winamp\plugins\' $OUT1 + StrCmp $OUT1 'plugins' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetBaseName + ${StackVerificationStart} GetBaseName + + ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + StrCmp $OUT1 'uninstwa' 0 error + + ${GetBaseName} 'uninstwa.exe' $OUT1 + StrCmp $OUT1 'uninstwa' 0 error + + ${GetBaseName} 'C:\Program Files\Winamp\plugins' $OUT1 + StrCmp $OUT1 'plugins' 0 error + + ${GetBaseName} 'C:\Program Files\Winamp\plugins\' $OUT1 + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section GetFileExt + ${StackVerificationStart} GetFileExt + + ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + StrCmp $OUT1 'exe' 0 error + + ${GetFileExt} 'uninstwa.exe' $OUT1 + StrCmp $OUT1 'exe' 0 error + + ${GetFileExt} 'C:\Program Files\Winamp\plugins' $OUT1 + StrCmp $OUT1 '' 0 error + + ${GetFileExt} 'C:\Program Files\Winamp\plugins\' $OUT1 + StrCmp $OUT1 '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section BannerTrimPath + ${StackVerificationStart} BannerTrimPath + + ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 + StrCmp $OUT1 'C:\Server\...\Terminal\license.htm' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '3A' $OUT1 + StrCmp $OUT1 '' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '4A' $OUT1 + StrCmp $OUT1 'C...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '11A' $OUT1 + StrCmp $OUT1 'C:\12\...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '13A' $OUT1 + StrCmp $OUT1 'C:\12\...\789' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 + StrCmp $OUT1 'C:\12\3456\789' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 + StrCmp $OUT1 'C:\12\3456\789' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '11B' $OUT1 + StrCmp $OUT1 'C:\12\...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 + StrCmp $OUT1 'C:...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 + StrCmp $OUT1 'C:...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '11C' $OUT1 + StrCmp $OUT1 'C:\12\34...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '9D' $OUT1 + StrCmp $OUT1 'C:\12\...' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '10D' $OUT1 + StrCmp $OUT1 'C:\...\789' 0 error + + ${BannerTrimPath} 'C:\12\3456\789' '11D' $OUT1 + StrCmp $OUT1 'C:\1...\789' 0 error + + ${BannerTrimPath} '123456789' '5D' $OUT1 + StrCmp $OUT1 '12...' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section DirState + ${StackVerificationStart} DirState + + ${DirState} '$TEMP' $OUT1 + + ${StackVerificationEnd} +SectionEnd + + +Section RefreshShellIcons + ${StackVerificationStart} RefreshShellIcons + + ${RefreshShellIcons} + + ${StackVerificationEnd} +SectionEnd + + +Section WriteUninstaller + goto +2 + WriteUninstaller '$EXEDIR\un.FileFuncTest.exe' +SectionEnd + + + +;############### UNINSTALL ############### + +Section un.Uninstall + ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback' + ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 + ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 + ${GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback' + ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 + ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 + ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 + ${GetExeName} $OUT1 + ${GetExePath} $OUT1 + ${GetParameters} $OUT1 + ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 + ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 + ${GetRoot} 'C:\Program Files\NSIS' $OUT1 + ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 + ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 + ${DirState} '$TEMP' $OUT1 + ${RefreshShellIcons} +SectionEnd + +Function un.LocateCallback + Push $0 +FunctionEnd + +Function un.GetDrivesCallback + Push $0 +FunctionEnd diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/test.ini b/libs/NSIS/NSIS-source/Examples/InstallOptions/test.ini new file mode 100644 index 0000000000..da743e8405 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/test.ini @@ -0,0 +1,76 @@ +[Settings] +NumFields=8 + +[Field 1] +Type=GroupBox +Left=0 +Right=-1 +Top=0 +Bottom=-5 +Text=" This is a group box... " + +[Field 2] +Type=checkbox +Text=Install support for X +Left=10 +Right=-10 +Top=17 +Bottom=25 +State=0 +Flags=GROUP + +[Field 3] +Type=checkbox +Text=Install support for Y +Left=10 +Right=-10 +Top=30 +Bottom=38 +State=1 +Flags=NOTABSTOP + +[Field 4] +Type=checkbox +Text=Install support for Z +Left=10 +Right=-10 +Top=43 +Bottom=51 +State=0 +Flags=NOTABSTOP + +[Field 5] +Type=FileRequest +State=C:\dummy.xyz +Left=10 +Right=-10 +Top=56 +Bottom=68 +Filter=XYZ Files|*.xyz|All files|*.* +Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY + +[Field 6] +Type=DirRequest +Left=10 +Right=-10 +Top=73 +Bottom=85 +Text=Select a directory... +State=C:\Program Files\NSIS + +[Field 7] +Type=Label +Left=10 +Right=-10 +Top=90 +Bottom=98 +Text=This is a label... + +[Field 8] +Type=Text +Left=10 +Right=-10 +Top=98 +Bottom=120 +State="Multiline\r\nedit..." +Flags=MULTILINE|VSCROLL|WANTRETURN \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/test.nsi b/libs/NSIS/NSIS-source/Examples/InstallOptions/test.nsi new file mode 100644 index 0000000000..30b15c4be1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/test.nsi @@ -0,0 +1,84 @@ +;InstallOptions Test Script +;Written by Joost Verburg +;-------------------------- + +!define TEMP1 $R0 ;Temp variable + +;The name of the installer +Name "InstallOptions Test" + +;The file to write +OutFile "Test.exe" + +; Show install details +ShowInstDetails show + +;Things that need to be extracted on startup (keep these lines before any File command!) +;Only useful for BZIP2 compression +;Use ReserveFile for your own InstallOptions INI files too! + +ReserveFile /plugin InstallOptions.dll +ReserveFile "test.ini" + +;Order of pages +Page custom SetCustom ValidateCustom ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom. +Page instfiles + +Section "Components" + + ;Get Install Options dialog user input + + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State" + DetailPrint "Install X=${TEMP1}" + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State" + DetailPrint "Install Y=${TEMP1}" + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State" + DetailPrint "Install Z=${TEMP1}" + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 5" "State" + DetailPrint "File=${TEMP1}" + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 6" "State" + DetailPrint "Dir=${TEMP1}" + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 8" "State" + DetailPrint "Info=${TEMP1}" + +SectionEnd + +Function .onInit + + ;Extract InstallOptions files + ;$PLUGINSDIR will automatically be removed when the installer closes + + InitPluginsDir + File /oname=$PLUGINSDIR\test.ini "test.ini" + +FunctionEnd + +Function SetCustom + + ;Display the InstallOptions dialog + + Push ${TEMP1} + + InstallOptions::dialog "$PLUGINSDIR\test.ini" + Pop ${TEMP1} + + Pop ${TEMP1} + +FunctionEnd + +Function ValidateCustom + + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 2" "State" + StrCmp ${TEMP1} 1 done + + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 3" "State" + StrCmp ${TEMP1} 1 done + + ReadINIStr ${TEMP1} "$PLUGINSDIR\test.ini" "Field 4" "State" + StrCmp ${TEMP1} 1 done + MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!" + Abort + + done: + +FunctionEnd diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.ini b/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.ini new file mode 100644 index 0000000000..381a986176 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.ini @@ -0,0 +1,65 @@ +[Settings] +NumFields=8 + +[Field 1] +Type=GroupBox +Left=0 +Right=-1 +Top=0 +Bottom=-5 +Text=" Images " + +[Field 2] +Type=Bitmap +Left=10 +Right=-10 +Top=10 +Bottom=30 +Flags=TRANSPARENT + +[Field 3] +Type=Bitmap +Left=10 +Right=-10 +Top=35 +Bottom=45 +Flags=TRANSPARENT + +[Field 4] +Type=Bitmap +Left=10 +Right=-10 +Top=50 +Bottom=70 +Flags=RESIZETOFIT|TRANSPARENT + +[Field 5] +Type=Bitmap +Left=10 +Right=-10 +Top=75 +Bottom=95 +Flags=RESIZETOFIT|TRANSPARENT + +[Field 6] +Type=Icon +Left=10 +Right=40 +Top=100 +Bottom=120 + +[Field 7] +Type=Icon +Left=50 +Right=80 +Top=100 +Bottom=120 + +[Field 8] +Type=Label +Left=10 +Right=-10 +Top=10 +Bottom=-10 +Text=ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ + diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.nsi b/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.nsi new file mode 100644 index 0000000000..3d0f4ec76a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testimgs.nsi @@ -0,0 +1,59 @@ +;InstallOptions Test Script +;Written by Joost Verburg +;-------------------------- + +;The name of the installer +Name "InstallOptions Test" + +;The file to write +OutFile "Test.exe" + +; Show install details +ShowInstDetails show + +;Things that need to be extracted on startup (keep these lines before any File command!) +;Only useful for BZIP2 compression +;Use ReserveFile for your own InstallOptions INI files too! + +ReserveFile /plugin InstallOptions.dll +ReserveFile "testimgs.ini" +ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp" +ReserveFile "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" +ReserveFile "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico" + +;Order of pages +Page custom SetCustom "" ": Testing InstallOptions" ;Custom page. InstallOptions gets called in SetCustom. +Page instfiles + +Section +SectionEnd + +Function .onInit + + ;Extract InstallOptions files + ;$PLUGINSDIR will automatically be removed when the installer closes + + InitPluginsDir + File /oname=$PLUGINSDIR\testimgs.ini "testimgs.ini" + File /oname=$PLUGINSDIR\image.bmp "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp" + File /oname=$PLUGINSDIR\image2.bmp "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" + File /oname=$PLUGINSDIR\icon.ico "${NSISDIR}\Contrib\Graphics\Icons\pixel-install.ico" + + ;Write image paths to the INI file + + WriteINIStr $PLUGINSDIR\testimgs.ini "Field 2" "Text" $PLUGINSDIR\image.bmp + WriteINIStr $PLUGINSDIR\testimgs.ini "Field 3" "Text" $PLUGINSDIR\image2.bmp + WriteINIStr $PLUGINSDIR\testimgs.ini "Field 4" "Text" $PLUGINSDIR\image.bmp + WriteINIStr $PLUGINSDIR\testimgs.ini "Field 5" "Text" $PLUGINSDIR\image2.bmp + WriteINIStr $PLUGINSDIR\testimgs.ini "Field 6" "Text" $PLUGINSDIR\icon.ico + ;No Text for Field 7 so it'll show the installer's icon + +FunctionEnd + +Function SetCustom + + ;Display the InstallOptions dialog + InstallOptions::dialog "$PLUGINSDIR\testimgs.ini" + Pop $0 + +FunctionEnd diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.ini b/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.ini new file mode 100644 index 0000000000..77078a4905 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.ini @@ -0,0 +1,44 @@ +[Settings] +NumFields=5 + +[Field 1] +Type=Label +Left=10 +Right=-40 +Top=10 +Bottom=18 +Text=This custom page demonstrates the "Link" control + +[Field 2] +Type=Link +Left=20 +Right=-40 +Top=40 +Bottom=50 +Text=* Run notepad + +[Field 3] +Type=Link +Left=20 +Right=-40 +Top=55 +Bottom=65 +State=mailto:someone@anywhere.com +Text=* Send E-mail + +[Field 4] +Type=Link +Left=20 +Right=-40 +Top=70 +Bottom=80 +State=https://nsis.sourceforge.io/ +Text=* Homepage https://nsis.sourceforge.io/ + +[Field 5] +Type=Text +Left=20 +Right=-40 +Top=85 +Bottom=98 +State=Just to test proper interaction with the other fields diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.nsi b/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.nsi new file mode 100644 index 0000000000..9096590609 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testlink.nsi @@ -0,0 +1,58 @@ +;InstallOptions Test Script +;Written by Ramon +;This script demonstrates the power of the new control "LINK" +;that allows you to execute files, send mails, open wepsites, etc. +;-------------------------- + +!define TEMP1 $R0 ;Temp variable + +;The name of the installer +Name "InstallOptions Test Link" + +;The file to write +OutFile "TestLink.exe" + +; Show install details +ShowInstDetails show + +;Things that need to be extracted on startup (keep these lines before any File command!) +;Only useful for BZIP2 compression +;Use ReserveFile for your own InstallOptions INI files too! + +ReserveFile /plugin InstallOptions.dll +ReserveFile "testlink.ini" + +;Order of pages +Page custom SetCustom +Page instfiles + +Section "Components" + + ;Get Install Options dialog user input + +SectionEnd + +Function .onInit + + ;Extract InstallOptions files + ;$PLUGINSDIR will automatically be removed when the installer closes + + InitPluginsDir + File /oname=$PLUGINSDIR\test.ini "testlink.ini" + WriteIniStr $PLUGINSDIR\test.ini "Field 2" "State" "$WINDIR\Notepad.exe" + +FunctionEnd + +Function SetCustom + + ;Display the InstallOptions dialog + + Push ${TEMP1} + + InstallOptions::dialog "$PLUGINSDIR\test.ini" + Pop ${TEMP1} + + Pop ${TEMP1} + +FunctionEnd + diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.ini b/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.ini new file mode 100644 index 0000000000..956e8cd95e --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.ini @@ -0,0 +1,105 @@ +[Settings] +NumFields=11 + +[Field 1] +Type=Groupbox +Text="This is a group box..." +Left=0 +Right=-1 +Top=0 +Bottom=-4 + +[Field 2] +Type=Checkbox +Text=Install support for X +Flags=NOTIFY +State=1 +Left=10 +Right=100 +Top=17 +Bottom=25 + +[Field 3] +Type=Checkbox +Text=Install support for Y +State=0 +Left=10 +Right=100 +Top=30 +Bottom=38 + +[Field 4] +Type=Checkbox +Text=Install support for Z +Flags=RIGHT +State=0 +Left=10 +Right=100 +Top=43 +Bottom=51 + +[Field 5] +Type=FileRequest +Flags=GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY +State=C:\dummy.xyz +Filter=XYZ Files|*.xyz|All files|*.* +Left=10 +Right=-10 +Top=56 +Bottom=69 + +[Field 6] +Type=DirRequest +Text=Select a directory... +State=C:\Program Files\NSIS +Left=10 +Right=-10 +Top=74 +Bottom=87 + +[Field 7] +Type=Label +Text=This is a label... +Left=10 +Right=-10 +Top=89 +Bottom=97 + +[Field 8] +Type=Text +Flags=MULTILINE|VSCROLL|WANTRETURN|NOWORDWRAP +State="Multiline\r\nedit..." +Left=10 +Right=-10 +Top=97 +Bottom=118 +MinLen=1 +ValidateText=Please enter some text before proceeding. + +[Field 9] +Type=Button +Flags=NOTIFY +Text=&Clear +Left=-60 +Right=-10 +Top=19 +Bottom=33 + +[Field 10] +Type=Button +Text=&Email +State=mailto:someone@anywhere.com +Left=-60 +Right=-10 +Top=35 +Bottom=49 + +[Field 11] +Type=DROPLIST +ListItems=Show|Hide +State=Show +Flags=NOTIFY +Left=120 +Right=-80 +Top=20 +Bottom=56 diff --git a/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.nsi b/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.nsi new file mode 100644 index 0000000000..a8ab734a91 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/InstallOptions/testnotify.nsi @@ -0,0 +1,133 @@ +; InstallOptions script demonstrating custom buttons +;---------------------------------------------------- + +!include WinMessages.nsh + +; The name of the installer +Name "InstallOptions Test" + +; The file to write +OutFile "TestNotify.exe" + +; Show install details +ShowInstDetails show + +; Called before anything else as installer initialises +Function .onInit + + ; Extract InstallOptions files + ; $PLUGINSDIR will automatically be removed when the installer closes + InitPluginsDir + File /oname=$PLUGINSDIR\test.ini "testnotify.ini" + +FunctionEnd + +; Our custom page +Page custom ShowCustom LeaveCustom ": Testing InstallOptions" + +Function ShowCustom + + ; Initialise the dialog but don't show it yet + MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDNO +2 + WriteINIStr "$PLUGINSDIR\test.ini" "Settings" "RTL" "1" + InstallOptions::initDialog "$PLUGINSDIR\test.ini" + ; In this mode InstallOptions returns the window handle so we can use it + Pop $0 + ; Now show the dialog and wait for it to finish + InstallOptions::show + ; Finally fetch the InstallOptions status value (we don't care what it is though) + Pop $0 + +FunctionEnd + +Function LeaveCustom + + ; At this point the user has either pressed Next or one of our custom buttons + ; We find out which by reading from the INI file + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Settings" "State" + StrCmp $0 0 validate ; Next button? + StrCmp $0 2 supportx ; "Install support for X"? + StrCmp $0 9 clearbtn ; "Clear" button? + StrCmp $0 11 droplist ; "Show|Hide" drop-list? + Abort ; Return to the page + +supportx: + ; Make the FileRequest field depend on the first checkbox + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND" + EnableWindow $1 $0 + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND2" + EnableWindow $1 $0 + ; Add the disabled flag too so when we return to this page it's disabled again + StrCmp $0 0 0 +3 + + WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY|DISABLED" + Goto +2 + + WriteINIStr "$PLUGINSDIR\test.ini" "Field 5" "Flags" "GROUP|FILE_MUST_EXIST|FILE_EXPLORER|FILE_HIDEREADONLY" + Abort ; Return to the page + +clearbtn: + ; Clear all text fields + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 5" "HWND" + SendMessage $1 ${WM_SETTEXT} 0 "STR:" + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND" + SendMessage $1 ${WM_SETTEXT} 0 "STR:" + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 8" "HWND" + SendMessage $1 ${WM_SETTEXT} 0 "STR:" + Abort ; Return to the page + +droplist: + ; Make the DirRequest field depend on the droplist + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 11" "State" + StrCmp $0 "Show" +3 + StrCpy $0 0 + Goto +2 + StrCpy $0 1 + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND" + EnableWindow $1 $0 + ReadINIStr $1 "$PLUGINSDIR\test.ini" "Field 6" "HWND2" + EnableWindow $1 $0 + ; Add the disabled flag too so when we return to this page it's disabled again + StrCmp $0 0 0 +3 + + WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" "DISABLED" + Goto +2 + + WriteINIStr "$PLUGINSDIR\test.ini" "Field 6" "Flags" "" + Abort ; Return to the page + +validate: + ; At this point we know the Next button was pressed, so perform any validation + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" + StrCmp $0 1 done + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State" + StrCmp $0 1 done + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State" + StrCmp $0 1 done + MessageBox MB_ICONEXCLAMATION|MB_OK "You must select at least one install option!" + Abort +done: + +FunctionEnd + +; Installation page +Page instfiles + +Section + + ;Get Install Options dialog user input + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 2" "State" + DetailPrint "Install X=$0" + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 3" "State" + DetailPrint "Install Y=$0" + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 4" "State" + DetailPrint "Install Z=$0" + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 5" "State" + DetailPrint "File=$0" + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 6" "State" + DetailPrint "Dir=$0" + ReadINIStr $0 "$PLUGINSDIR\test.ini" "Field 8" "State" + DetailPrint "Info=$0" + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/Library.nsi b/libs/NSIS/NSIS-source/Examples/Library.nsi new file mode 100644 index 0000000000..cffc973f5f --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Library.nsi @@ -0,0 +1,130 @@ +# This example tests the compile time aspect of the Library macros +# more than the runtime aspect. It is more of a syntax example, +# rather than a usage example. + +!include "Library.nsh" + +Name "Library Test" +OutFile "Library Test.exe" + +InstallDir "$TEMP\Library Test" + +Page directory +Page instfiles + +XPStyle on + +RequestExecutionLevel user + + +!define TestDLL '"${NSISDIR}\Plugins\${NSIS_CPU}-unicode\LangDLL.dll"' +!define TestEXE '"${NSISDIR}\Contrib\UIs\default.exe"' + +Section + +!insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib TLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib DLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib DLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib REGDLL $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLL $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib TLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib TLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib REGDLLTLB $0 REBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_PROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB $0 REBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR +!insertmacro InstallLib REGDLLTLB $0 NOREBOOT_NOTPROTECTED ${TestDLL} $INSTDIR\test.dll $INSTDIR + +!insertmacro InstallLib REGEXE $0 REBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR +!insertmacro InstallLib REGEXE $0 NOREBOOT_PROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR +!insertmacro InstallLib REGEXE $0 REBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR +!insertmacro InstallLib REGEXE $0 NOREBOOT_NOTPROTECTED ${TestEXE} $INSTDIR\test.exe $INSTDIR + +WriteUninstaller $INSTDIR\uninstall.exe + +SectionEnd + +Section uninstall + +!insertmacro UninstallLib DLL NOTSHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib DLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib REGDLL NOTSHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib TLB NOTSHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib TLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB NOTSHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB NOTSHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib DLL SHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib DLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib DLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib REGDLL SHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL SHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLL SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib TLB SHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib TLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib TLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib REGDLLTLB SHARED NOREMOVE $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_PROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB SHARED REBOOT_NOTPROTECTED $INSTDIR\test.dll +!insertmacro UninstallLib REGDLLTLB SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.dll + +!insertmacro UninstallLib REGEXE SHARED NOREMOVE $INSTDIR\test.exe +!insertmacro UninstallLib REGEXE SHARED REBOOT_PROTECTED $INSTDIR\test.exe +!insertmacro UninstallLib REGEXE SHARED NOREBOOT_PROTECTED $INSTDIR\test.exe +!insertmacro UninstallLib REGEXE SHARED REBOOT_NOTPROTECTED $INSTDIR\test.exe +!insertmacro UninstallLib REGEXE SHARED NOREBOOT_NOTPROTECTED $INSTDIR\test.exe + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/LogicLib.nsi b/libs/NSIS/NSIS-source/Examples/LogicLib.nsi new file mode 100644 index 0000000000..f938b92a24 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/LogicLib.nsi @@ -0,0 +1,638 @@ +!verbose 2 + +Name "NSIS LogicLib Example" +OutFile "LogicLib.exe" +ShowInstDetails show +RequestExecutionLevel user + +!include "LogicLib.nsh" + +;!undef LOGICLIB_VERBOSITY +;!define LOGICLIB_VERBOSITY 4 ; For debugging - watch what logiclib does with your code! + +Page components "" "" ComponentsLeave +Page instfiles + +Section /o "Run tests" TESTS + + ; kinds of if other than "value1 comparison value2" + ClearErrors + FindFirst $R1 $R2 "$PROGRAMFILES\*" + ${Unless} ${Errors} + ${Do} + ${Select} $R2 + ${Case2} "." ".." + ; Do nothing + ${CaseElse} + DetailPrint "Found $PROGRAMFILES\$R2" + ${EndSelect} + FindNext $R1 $R2 + ${LoopUntil} ${Errors} + FindClose $R1 + ${EndUnless} + + ${If} ${FileExists} "${__FILE__}" + DetailPrint 'Source file "${__FILE__}" still exists' + ${Else} + DetailPrint 'Source file "${__FILE__}" has gone' + ${EndIf} + + ; if..endif + StrCpy $R1 1 + StrCpy $R2 "" + ${If} $R1 = 1 + StrCpy $R2 $R2A + ${EndIf} + ${If} $R1 = 2 + StrCpy $R2 $R2B + ${EndIf} + ${If} $R1 < 2 + StrCpy $R2 $R2C + ${EndIf} + ${If} $R1 < -2 + StrCpy $R2 $R2D + ${EndIf} + ${If} $R1 > 2 + StrCpy $R2 $R2E + ${EndIf} + ${If} $R1 > -2 + StrCpy $R2 $R2F + ${EndIf} + ${If} $R1 <> 1 + StrCpy $R2 $R2G + ${EndIf} + ${If} $R1 <> 2 + StrCpy $R2 $R2H + ${EndIf} + ${If} $R1 >= 2 + StrCpy $R2 $R2I + ${EndIf} + ${If} $R1 >= -2 + StrCpy $R2 $R2J + ${EndIf} + ${If} $R1 <= 2 + StrCpy $R2 $R2K + ${EndIf} + ${If} $R1 <= -2 + StrCpy $R2 $R2L + ${EndIf} + ${If} $R2 == "ACFHJK" + DetailPrint "PASSED If..EndIf test" + ${Else} + DetailPrint "FAILED If..EndIf test" + ${EndIf} + + ; if..elseif..else..endif + StrCpy $R1 A + StrCpy $R2 "" + ${If} $R1 == A + StrCpy $R2 $R2A + ${ElseIf} $R1 == B + StrCpy $R2 $R2B + ${ElseUnless} $R1 != C + StrCpy $R2 $R2C + ${Else} + StrCpy $R2 $R2D + ${EndIf} + ${If} $R1 == D + StrCpy $R2 $R2D + ${ElseIf} $R1 == A + StrCpy $R2 $R2A + ${ElseUnless} $R1 != B + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2C + ${EndIf} + ${If} $R1 == C + StrCpy $R2 $R2C + ${ElseIf} $R1 == D + StrCpy $R2 $R2D + ${ElseUnless} $R1 != A + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} $R1 == B + StrCpy $R2 $R2B + ${ElseIf} $R1 == C + StrCpy $R2 $R2C + ${ElseUnless} $R1 != D + StrCpy $R2 $R2D + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} $R2 == "$R1$R1$R1$R1" + DetailPrint "PASSED If..ElseIf..Else..EndIf test" + ${Else} + DetailPrint "FAILED If..ElseIf..Else..EndIf test" + ${EndIf} + + ; if..andif..orif..endif + StrCpy $R2 "" + ${If} 1 = 1 + ${AndIf} 2 = 2 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${AndIf} 2 = 3 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 2 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 3 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + + ${If} 1 = 1 + ${OrIf} 2 = 2 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${OrIf} 2 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 2 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 3 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + + ${If} 1 = 1 + ${AndIf} 2 = 2 + ${OrIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${AndIf} 2 = 3 + ${OrIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 2 + ${OrIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 3 + ${OrIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${AndIf} 2 = 2 + ${OrIf} 3 = 4 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${AndIf} 2 = 3 + ${OrIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 2 + ${OrIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${AndIf} 2 = 3 + ${OrIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + + ${If} 1 = 1 + ${OrIf} 2 = 2 + ${AndIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 1 + ${OrIf} 2 = 3 + ${AndIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 2 + ${AndIf} 3 = 3 + StrCpy $R2 $R2A + ${Else} + StrCpy $R2 $R2B + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 3 + ${AndIf} 3 = 3 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 1 + ${OrIf} 2 = 2 + ${AndIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 1 + ${OrIf} 2 = 3 + ${AndIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 2 + ${AndIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + ${If} 1 = 2 + ${OrIf} 2 = 3 + ${AndIf} 3 = 4 + StrCpy $R2 $R2B + ${Else} + StrCpy $R2 $R2A + ${EndIf} + + ${If} $R2 == "AAAAAAAAAAAAAAAAAAAAAAAA" + DetailPrint "PASSED If..AndIf..OrIf..Else..EndIf test" + ${Else} + DetailPrint "FAILED If..AndIf..OrIf..Else..EndIf test" + ${EndIf} + + ; ifthen..|..| + StrCpy $R1 1 + StrCpy $R2 "" + ${IfThen} $R1 = 1 ${|} StrCpy $R2 $R2A ${|} + ${IfThen} $R1 = 2 ${|} StrCpy $R2 $R2B ${|} + ${IfNotThen} $R1 = 1 ${|} StrCpy $R2 $R2C ${|} + ${IfNotThen} $R1 = 2 ${|} StrCpy $R2 $R2D ${|} + ${If} $R2 == "AD" + DetailPrint "PASSED IfThen test" + ${Else} + DetailPrint "FAILED IfThen test" + ${EndIf} + + ; ifcmd..||..| and if/unless cmd + StrCpy $R2 "" + ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|} + ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES` + StrCpy $R2 $R2B + ${EndUnless} + ${If} $R2 == "AB" + DetailPrint "PASSED IfCmd/If Cmd test" + ${Else} + DetailPrint "FAILED IfCmd/If Cmd test" + ${EndIf} + + ; select..case..case2..case3..case4..case5..caseelse..endselect + StrCpy $R1 1 + StrCpy $R2 "" + ${Select} $R1 + ${Case} "1" + StrCpy $R2 $R2A + ${Case} "2" + StrCpy $R2 $R2B + ${Case2} "3" "4" + StrCpy $R2 $R2C + ${CaseElse} + StrCpy $R2 $R2D + ${EndSelect} + ${Select} $R1 + ${Case} "2" + StrCpy $R2 $R2A + ${Case} "3" + StrCpy $R2 $R2B + ${Case2} "4" "5" + StrCpy $R2 $R2C + ${CaseElse} + StrCpy $R2 $R2D + ${EndSelect} + ${Select} $R1 + ${Case} "3" + StrCpy $R2 $R2A + ${Case} "4" + StrCpy $R2 $R2B + ${Case2} "5" "1" + StrCpy $R2 $R2C + ${CaseElse} + StrCpy $R2 $R2D + ${EndSelect} + ${Select} $R1 + ${Case} "4" + StrCpy $R2 $R2A + ${Case} "5" + StrCpy $R2 $R2B + ${Case2} "1" "2" + StrCpy $R2 $R2C + ${CaseElse} + StrCpy $R2 $R2D + ${EndSelect} + ${If} $R2 == "ADCC" + DetailPrint "PASSED Select..Case*..EndSelect test" + ${Else} + DetailPrint "FAILED Select..Case*..EndSelect test" + ${EndIf} + + ; switch..case..caseelse..endswitch + StrCpy $R2 "" + ${For} $R1 1 10 + ${Switch} $R1 + ${Case} 3 + StrCpy $R2 $R2A + ${Case} 4 + StrCpy $R2 $R2B + ${Break} + ${Case} 5 + StrCpy $R2 $R2C + ${EndSwitch} + ${Switch} $R1 + ${Case} 1 + StrCpy $R2 $R2D + ${Default} + StrCpy $R2 $R2E + ${Break} + ${Case} 2 + StrCpy $R2 $R2F + ${EndSwitch} + ${Switch} $R1 + ${Case} 6 + ${Case} 7 + StrCpy $R2 $R2G + ${If} $R1 = 6 + ${Case} 8 + StrCpy $R2 $R2H + ${Switch} $R1 + ${Case} 6 + StrCpy $R2 $R2I + ${Break} + ${Case} 8 + StrCpy $R2 $R2J + ${EndSwitch} + ${EndIf} + StrCpy $R2 $R2K + ${Break} + ${Default} + StrCpy $R2 $R2L + ${Case} 9 + StrCpy $R2 $R2M + ${EndSwitch} + ${Next} + ${If} $R2 == "DELMFLMABELMBELMCELMEGHIKEGKEHJKEMELM" + DetailPrint "PASSED Switch..Case*..EndSwitch test" + ${Else} + DetailPrint "FAILED Switch..Case*..EndSwitch test" + ${EndIf} + + ; for[each]..exitfor..next + StrCpy $R2 "" + ${For} $R1 1 5 + StrCpy $R2 $R2$R1 + ${Next} + ${ForEach} $R1 10 1 - 1 + StrCpy $R2 $R2$R1 + ${Next} + ${For} $R1 1 0 + StrCpy $R2 $R2$R1 + ${Next} + ${If} $R2 == "1234510987654321" + DetailPrint "PASSED For[Each]..Next test" + ${Else} + DetailPrint "FAILED For[Each]..Next test" + ${EndIf} + + ; do..loop + StrCpy $R1 0 + Call DoLoop + ${If} $R1 == 5 + DetailPrint "PASSED Do..Loop test" + ${Else} + DetailPrint "FAILED Do..Loop test" + ${EndIf} + + ; do..exitdo..loop + StrCpy $R1 0 + StrCpy $R2 "" + ${Do} + StrCpy $R2 $R2$R1 + IntOp $R1 $R1 + 1 + ${If} $R1 > 10 + ${ExitDo} + ${EndIf} + ${Loop} + ${If} $R2 == "012345678910" + DetailPrint "PASSED Do..ExitDo..Loop test" + ${Else} + DetailPrint "FAILED Do..ExitDo..Loop test" + ${EndIf} + + ; do..exitdo..loopuntil + StrCpy $R1 0 + StrCpy $R2 "" + ${Do} + StrCpy $R2 $R2$R1 + IntOp $R1 $R1 + 1 + ${LoopUntil} $R1 >= 5 + ${If} $R2 == "01234" + DetailPrint "PASSED Do..ExitDo..LoopUntil test" + ${Else} + DetailPrint "FAILED Do..ExitDo..LoopUntil test" + ${EndIf} + + ; dountil..exitdo..loop + StrCpy $R1 0 + StrCpy $R2 "" + ${DoUntil} $R1 >= 5 + StrCpy $R2 $R2$R1 + IntOp $R1 $R1 + 1 + ${Loop} + ${If} $R2 == "01234" + DetailPrint "PASSED DoUntil..ExitDo..Loop test" + ${Else} + DetailPrint "FAILED DoUntil..ExitDo..Loop test" + ${EndIf} + + ; nested do test + StrCpy $R1 0 + StrCpy $R2 0 + StrCpy $R3 "" + ${Do} + StrCpy $R3 $R3$R1$R2 + IntOp $R1 $R1 + 1 + ${If} $R1 > 5 + ${ExitDo} + ${EndIf} + StrCpy $R2 0 + ${Do} + StrCpy $R3 $R3$R1$R2 + IntOp $R2 $R2 + 1 + ${If} $R2 >= 5 + ${ExitDo} + ${EndIf} + ${Loop} + ${Loop} + ${If} $R3 == "00101112131415202122232425303132333435404142434445505152535455" + DetailPrint "PASSED nested Do test" + ${Else} + DetailPrint "FAILED nested Do test" + ${EndIf} + + ; while..exitwhile..endwhile (exact replica of dowhile..enddo} + StrCpy $R1 0 + StrCpy $R2 "" + ${While} $R1 < 5 + StrCpy $R2 $R2$R1 + IntOp $R1 $R1 + 1 + ${EndWhile} + ${If} $R2 == "01234" + DetailPrint "PASSED While..ExitWhile..EndWhile test" + ${Else} + DetailPrint "FAILED While..ExitWhile..EndWhile test" + ${EndIf} + + ; Unsigned integer tests + StrCpy $R2 "" + ${If} -1 < 1 + StrCpy $R2 $R2A + ${EndIf} + ${If} -1 U< 1 + StrCpy $R2 $R2B + ${EndIf} + ${If} 0xFFFFFFFF > 1 + StrCpy $R2 $R2C + ${EndIf} + ${If} 0xFFFFFFFF U> 1 + StrCpy $R2 $R2D + ${EndIf} + ${If} $R2 == "AD" + DetailPrint "PASSED unsigned integer test" + ${Else} + DetailPrint "FAILED unsigned integer test" + ${EndIf} + + ; 64-bit integer tests (uses System.dll) + StrCpy $R2 "" + ${If} 0x100000000 L= 4294967296 + StrCpy $R2 $R2A + ${EndIf} + ${If} 0x100000000 L< 0x200000000 + StrCpy $R2 $R2B + ${EndIf} + ${If} 0x500000000 L>= 0x500000000 + StrCpy $R2 $R2C + ${EndIf} + ${If} $R2 == "ABC" + DetailPrint "PASSED 64-bit integer test" + ${Else} + DetailPrint "FAILED 64-bit integer test" + ${EndIf} + + ; Complex string tests + StrCpy $R2 "" + ${IfThen} "ABC" ${StartsWith} "a" ${|} StrCpy $R2 A$R2 ${|} + ${IfThen} "ABC" ${StartsWithS} "a" ${|} StrCpy $R2 A!1$R2 ${|} + ${IfThen} "ABC" ${StartsWith} "X" ${|} StrCpy $R2 A!2$R2 ${|} + ${IfThen} "ABC" ${StartsWith} "ABC" ${|} StrCpy $R2 B$R2 ${|} + ${IfThen} "ABC" ${EndsWith} "ABC" ${|} StrCpy $R2 C$R2 ${|} + ${IfThen} "ABC" ${EndsWithS} "BC" ${|} StrCpy $R2 D$R2 ${|} + ${IfThen} "ABC" ${EndsWithS} "bc" ${|} StrCpy $R2 D!1$R2 ${|} + ${IfThen} "ABCD" ${Contains} "AB" ${|} StrCpy $R2 E$R2 ${|} + ${IfThen} "ABCD" ${Contains} "bc" ${|} StrCpy $R2 F$R2 ${|} + ${IfThen} "ABCD" ${ContainsS} "bc" ${|} StrCpy $R2 F!1$R2 ${|} + ${IfThen} "ABCD" ${Contains} "CD" ${|} StrCpy $R2 G$R2 ${|} + ${If} $R2 == "GFEDCBA" + DetailPrint "PASSED complex string test" + ${Else} + DetailPrint "FAILED complex string test" + ${EndIf} + + ; Extra string tests (uses System.dll) + StrCpy $R2 "" + ${If} "A" S< "B" + StrCpy $R2 $R2A + ${EndIf} + ${If} "b" S> "A" + StrCpy $R2 $R2B + ${EndIf} + ${If} "a" S<= "B" + StrCpy $R2 $R2C + ${EndIf} + ${If} "B" S< "B" + StrCpy $R2 $R2D + ${EndIf} + ${If} "A" S== "A" + StrCpy $R2 $R2E + ${EndIf} + ${If} "A" S== "a" + StrCpy $R2 $R2F + ${EndIf} + ${If} "A" S!= "a" + StrCpy $R2 $R2G + ${EndIf} + ${If} $R2 == "ABCEG" + DetailPrint "PASSED extra string test" + ${Else} + DetailPrint "FAILED extra string test" + ${EndIf} + +SectionEnd + +Function ComponentsLeave + ; Section flags tests (requires sections.nsh be included) + ${Unless} ${SectionIsSelected} ${TESTS} + MessageBox MB_OK "Please select the component" + Abort + ${EndIf} +FunctionEnd + +Function DoLoop + + ${Do} + IntOp $R1 $R1 + 1 + ${If} $R1 == 5 + Return + ${EndIf} + ${Loop} + +FunctionEnd + +!verbose 3 diff --git a/libs/NSIS/NSIS-source/Examples/Math/math.nsi b/libs/NSIS/NSIS-source/Examples/Math/math.nsi new file mode 100644 index 0000000000..a32ab3c033 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Math/math.nsi @@ -0,0 +1,33 @@ +; This is just an example of Math plugin +; +; (c) brainsucker, 2002 +; (r) BSForce + +Name "Math Plugin Example" +OutFile "math.exe" +ShowInstDetails show +XPStyle on + +Section "ThisNameIsIgnoredSoWhyBother?" + Math::Script 'SaR(s,fa,ra, i,f,r,e,p) (i=0;#{i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])" + + Math::Script "a = 'Hello \r\n World \r\n!!!'; a = SaR(a,{'\r','\n'},{'$\r','$\n'}); R0 = a" + Math::Script "NS = '$\"In quotes$\"'; TQ(); R1=NS; R3=P(s(R1),'qu')" + Math::Script "NS = 'No quotes'; TQ(); R2=NS" + Math::Script "NS='123\r\n456\r\n789'; DL(); R4=NS; DL(); R5=NS; DL(); R6=NS; R7=NS" + + + DetailPrint "'$R0'" + DetailPrint "'$R1'" + DetailPrint "'$R2'" + DetailPrint "'$R3'" + DetailPrint "'$R4'" + DetailPrint "'$R5'" + DetailPrint "'$R6'" + DetailPrint "'$R7'" +SectionEnd + +; eof diff --git a/libs/NSIS/NSIS-source/Examples/Math/mathtest.ini b/libs/NSIS/NSIS-source/Examples/Math/mathtest.ini new file mode 100644 index 0000000000..f18075b7f3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Math/mathtest.ini @@ -0,0 +1,101 @@ +[Settings] +NumFields=10 +NextButtonText=Execute +CancelButtonText=Quit +BackButtonText=Readme + +[Field 1] +Type=label +Text=Enter your script here: +Left=0 +Right=-1 +Top=0 +Bottom=8 + +[Field 2] +Type=text +Left=0 +Right=-1 +Top=9 +Bottom=55 +flags=MULTILINE|WANTRETURN|HSCROLL +State="" + +[Field 3] +Type=text +Left=53 +Right=175 +Top=56 +Bottom=140 +flags=MULTILINE|READONLY +State="" + +[Field 4] +Type=text +Left=175 +Right=-1 +Top=56 +Bottom=140 +flags=MULTILINE|READONLY +State="" + +[Field 5] +Type=RadioButton +Left=0 +Right=-1 +Top=70 +Bottom=80 +flags=GROUP +Text="Your script" +State=1 + +[Field 6] +Type=RadioButton +Left=0 +Right=-1 +Top=80 +Bottom=90 +flags= +Text="Sample 1" +State=0 + +[Field 7] +Type=RadioButton +Left=0 +Right=-1 +Top=90 +Bottom=100 +flags= +Text="Sample 2" +State=0 + +[Field 8] +Type=RadioButton +Left=0 +Right=-1 +Top=100 +Bottom=110 +flags= +Text="Sample 3" +State=0 + +[Field 9] +Type=RadioButton +Left=0 +Right=-1 +Top=110 +Bottom=120 +flags= +Text="Sample 4" +State=0 + +[Field 10] +Type=RadioButton +Left=0 +Right=-1 +Top=120 +Bottom=130 +flags= +Text="Sample 5" +State=0 + diff --git a/libs/NSIS/NSIS-source/Examples/Math/mathtest.nsi b/libs/NSIS/NSIS-source/Examples/Math/mathtest.nsi new file mode 100644 index 0000000000..191fa8ba59 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Math/mathtest.nsi @@ -0,0 +1,171 @@ +;NSIS Modern User Interface version 1.65 +;InstallOptions Example Script +;Written by Joost Verburg + + !define MUI_BUTTONTEXT_NEXT "Execute" + +;--------------------- +;Include Modern UI + + !include "MUI.nsh" + +;-------------------------------- +;Product Info + +Name "Math::Script Test" + +;-------------------------------- +;Configuration + + ;General + OutFile "MathTest.exe" + +;-------------------------------- +;Variables + + Var TEMP1 + Var TEMP2 + Var TEMP3 + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_LICENSE "mathtest.txt" + Page custom ScriptPageEnter + Page instfiles + +;-------------------------------- +;Modern UI Configuration + +; !define MUI_ABORTWARNING + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Reserve Files + + ;Things that need to be extracted on first (keep these lines before any File command!) + ;Only for BZIP2 compression + + ReserveFile "MathTest.ini" + !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + +;-------------------------------- +;Installer Functions + +LangString SCRIPTSAMPLE0 ${LANG_ENGLISH} "r0 = 'Hello'; r1 = 'Math::Script'\r\nr0 += ' from the ' + r1 + '!'; r1=''" +LangString SCRIPTSAMPLE1 ${LANG_ENGLISH} "a =0; b=1.0\r\n#{a++ < 100, b *= a}\r\nr0 = a; R0 = b; R1 = ff(b, 15)\r\nr1 = (a-1) + '! = ' + b" +LangString SCRIPTSAMPLE2 ${LANG_ENGLISH} 'pi=3.14159; \r\nangle = pi/4;\r\ntext = "x = " + ff(angle,16+3) \r\nr0 = text += ", sin x = " + sin(angle)' +LangString SCRIPTSAMPLE3 ${LANG_ENGLISH} "v1 = 123.456; v2 = 123456789.1011\r\nr0 = v1; r1 = v2\r\nr2 = ff(v1, 3); r3 = ff(v2, 3); r4 = ff(v1, 3+16); r5 = ff(v2, 3+16)\r\nr6 = ff(v1, 3+32); r7 = ff(v2, 3+32); r8 = ff(v1, 3+32+64); r9 = ff(v2, 3+32+64)\r\n" +LangString SCRIPTSAMPLE4 ${LANG_ENGLISH} "a = 10000; b = 0; #{--a > 0, b+= a}; r0 = a; r1 = b\r\nz = 1.55; r2 = #[z > 1.5, 'Its greater', 'Its lower']\r\nz = 1.45; r3 = #[z > 1.5, 'Its greater', 'Its lower']" +LangString SCRIPTSAMPLE5 ${LANG_ENGLISH} 'r0 = "123a123"\r\nr1 = r0; \r\nr2 = s(r0); r3 = f(r0); r4 = i(r0); r5 = l(r0)' + +Function .onInit + + ;Extract InstallOptions INI files + !insertmacro MUI_INSTALLOPTIONS_EXTRACT "MathTest.ini" + + Strcpy "$TEMP1" "$(SCRIPTSAMPLE0)" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" $TEMP1 + +FunctionEnd + +LangString TEXT_IO_TITLE ${LANG_ENGLISH} "MathTest Script Page" +LangString TEXT_IO_SUBTITLE ${LANG_ENGLISH} "Try your scripting capapibilites or test one of sample scripts" + + +Function DumpVariables + Strcpy "$TEMP1" "$$0='$0'\r\n$$1='$1'\r\n$$2='$2'\r\n$$3='$3'\r\n$$4='$4'\r\n$$5='$5'\r\n$$6='$6'\r\n$$7='$7'\r\n$$8='$8'\r\n$$9='$9'" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 3" "State" $TEMP1 + Strcpy "$TEMP1" "$$R0='$R0'\r\n$$R1='$R1'\r\n$$R2='$R2'\r\n$$R3='$R3'\r\n$$R4='$R4'\r\n$$R5='$R5'\r\n$$R6='$R6'\r\n$$R7='$R7'\r\n$$R8='$R8'\r\n$$R9='$R9'" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 4" "State" $TEMP1 +FunctionEnd + +Function ClearVariables + Math::Script "r0=r1=r2=r3=r4=r5=r6=r7=r8=r9=R0=R1=R2=R3=R4=R5=R6=R7=R8=R9=''" +FunctionEnd + +Function GetLine + push $TEMP1 + Math::Script "mtsDL()" + pop $TEMP2 + pop $TEMP1 +FunctionEnd + +Function ExecuteScript + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 2" "State" + + Math::Script "mtsTQ(s) (s = s(NS); #[s[0]=='$\"',s=s[1,]]; #[s[-1]=='$\"',s=s[,-2]]; NS = s)" + Math::Script "mtsP(s,e, p,i) (p=-1;i=0; #{(i=0, (NS=s[p+4,]; NS=#[p>0,s[,p-1],'']), (NS='';NS=s)])" + + push $TEMP1 + ; remove "" + Math::Script "mtsTQ()" + pop $TEMP1 + + ; script at $TEMP1 +Go: + StrLen $TEMP3 $TEMP1 + IntCmp $TEMP3 0 End + ; get single line to $TEMP2 + Call GetLine +; MessageBox MB_OK "'$TEMP2' '$TEMP1'" + Math::Script "$TEMP2" + goto Go +End: + Math::Script "" +FunctionEnd + +Function ScriptPageEnter + + !insertmacro MUI_HEADER_TEXT "$(TEXT_IO_TITLE)" "$(TEXT_IO_SUBTITLE)" + +Again: + Call ClearVariables + Call ExecuteScript + Call DumpVariables + + !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "mathtest.ini" + pop $TEMP3 + + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 5" "State" + IntCmp $TEMP1 1 Test + + Strcpy "$TEMP2" "$(SCRIPTSAMPLE1)" + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 6" "State" + IntCmp $TEMP1 1 Write + + Strcpy "$TEMP2" "$(SCRIPTSAMPLE2)" + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 7" "State" + IntCmp $TEMP1 1 Write + + Strcpy "$TEMP2" "$(SCRIPTSAMPLE3)" + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 8" "State" + IntCmp $TEMP1 1 Write + + Strcpy "$TEMP2" "$(SCRIPTSAMPLE4)" + !insertmacro MUI_INSTALLOPTIONS_READ $TEMP1 "MathTest.ini" "Field 9" "State" + IntCmp $TEMP1 1 Write + + Strcpy "$TEMP2" "$(SCRIPTSAMPLE5)" + +Write: + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 2" "State" "$TEMP2" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 5" "State" "1" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 6" "State" "0" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 7" "State" "0" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 8" "State" "0" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 9" "State" "0" + !insertmacro MUI_INSTALLOPTIONS_WRITE "MathTest.ini" "Field 10" "State" "0" + +Test: + Strcmp $TEMP3 "success" Again + +FunctionEnd + +Section "Dummy Section" SecDummy +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/Math/mathtest.txt b/libs/NSIS/NSIS-source/Examples/Math/mathtest.txt new file mode 100644 index 0000000000..f911e66def --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Math/mathtest.txt @@ -0,0 +1,7 @@ +Math Tester. + +This demo allows you to test your Math::Script expressions without need to compile anything. Just enter your expressions into multiline editbox (every single line is a separate call to Math::Script) or select one of sample expressions and press Execute. + +Every call to Math::Script can accept up to 1kb of script, but this demo is limited to the summ of 1 kb at all lines. And... watch your scripts. No.... Watch your errors at scripts! + +(c) Brainsucker, 2003. diff --git a/libs/NSIS/NSIS-source/Examples/Memento.nsi b/libs/NSIS/NSIS-source/Examples/Memento.nsi new file mode 100644 index 0000000000..531bc57576 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Memento.nsi @@ -0,0 +1,79 @@ +!include LogicLib.nsh +!include Memento.nsh + +Name Memento +OutFile Memento.exe + +XPStyle on + +ShowInstDetails show + +Page components +Page instfiles + +RequestExecutionLevel user + +# settings + +!define MEMENTO_REGISTRY_ROOT HKCU +!define MEMENTO_REGISTRY_KEY "Software\NSIS\Memento Test" + +# restore + +Function .onInit + + ${If} ${Cmd} `MessageBox MB_YESNO "Would you like to load an example state?" IDYES` + + DeleteRegKey HKCU "Software\NSIS\Memento Test" + + WriteRegStr HKCU "Software\NSIS\Memento Test" MementoSectionUsed "" + WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_horse 1 + WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_chicken 1 + WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_donkey 0 + WriteRegDWORD HKCU "Software\NSIS\Memento Test" MementoSection_sec_croc 0 + + ${EndIf} + + ${MementoSectionRestore} + +FunctionEnd + +# sections + +${MementoSection} horse sec_horse +${MementoSectionEnd} + +${MementoSection} donkey sec_donkey +${MementoSectionEnd} + +${MementoSection} chicken sec_chicken +${MementoSectionEnd} + +SectionGroup /e group + + SectionGroup /e group + + ${MementoSection} croc sec_croc + ${MementoSectionEnd} + + ${MementoSection} cow sec_cow + ${MementoSectionEnd} + + SectionGroupEnd + +SectionGroupEnd + +${MementoUnselectedSection} dinosaur sec_dinosaur +${MementoSectionEnd} + +# done... + +${MementoSectionDone} + +# save + +Function .onInstSuccess + + ${MementoSectionSave} + +FunctionEnd diff --git a/libs/NSIS/NSIS-source/Examples/Modern UI/Basic.nsi b/libs/NSIS/NSIS-source/Examples/Modern UI/Basic.nsi new file mode 100644 index 0000000000..eb76d2baa3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Modern UI/Basic.nsi @@ -0,0 +1,89 @@ +;NSIS Modern User Interface +;Basic Example Script +;Written by Joost Verburg + +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + +;-------------------------------- +;General + + ;Name and file + Name "Modern UI Test" + OutFile "Basic.exe" + Unicode True + + ;Default installation folder + InstallDir "$LOCALAPPDATA\Modern UI Test" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\Modern UI Test" "" + + ;Request application privileges for Windows Vista + RequestExecutionLevel user + +;-------------------------------- +;Interface Settings + + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetOutPath "$INSTDIR" + + ;ADD YOUR OWN FILES HERE... + + ;Store installation folder + WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + +SectionEnd + +;-------------------------------- +;Descriptions + + ;Language strings + LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + ;ADD YOUR OWN FILES HERE... + + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + DeleteRegKey /ifempty HKCU "Software\Modern UI Test" + +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/Modern UI/HeaderBitmap.nsi b/libs/NSIS/NSIS-source/Examples/Modern UI/HeaderBitmap.nsi new file mode 100644 index 0000000000..0aa9ea1ccf --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Modern UI/HeaderBitmap.nsi @@ -0,0 +1,91 @@ +;NSIS Modern User Interface +;Header Bitmap Example Script +;Written by Joost Verburg + +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + +;-------------------------------- +;General + + ;Name and file + Name "Modern UI Test" + OutFile "HeaderBitmap.exe" + Unicode True + + ;Default installation folder + InstallDir "$LOCALAPPDATA\Modern UI Test" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\Modern UI Test" "" + + ;Request application privileges for Windows Vista + RequestExecutionLevel user + +;-------------------------------- +;Interface Configuration + + !define MUI_HEADERIMAGE + !define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" ; optional + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetOutPath "$INSTDIR" + + ;ADD YOUR OWN FILES HERE... + + ;Store installation folder + WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + +SectionEnd + +;-------------------------------- +;Descriptions + + ;Language strings + LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + ;ADD YOUR OWN FILES HERE... + + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + DeleteRegKey /ifempty HKCU "Software\Modern UI Test" + +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/Modern UI/MultiLanguage.nsi b/libs/NSIS/NSIS-source/Examples/Modern UI/MultiLanguage.nsi new file mode 100644 index 0000000000..0014a994cc --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Modern UI/MultiLanguage.nsi @@ -0,0 +1,204 @@ +;NSIS Modern User Interface +;Multilingual Example Script +;Written by Joost Verburg + +!pragma warning error all + +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + +;-------------------------------- +;General + + ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!) + Unicode true + + ;Name and file + Name "Modern UI Test" + OutFile "MultiLanguage.exe" + + ;Default installation folder + InstallDir "$LOCALAPPDATA\Modern UI Test" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\Modern UI Test" "" + + ;Request application privileges for Windows Vista + RequestExecutionLevel user + +;-------------------------------- +;Interface Settings + + !define MUI_ABORTWARNING + + ;Show all languages, despite user's codepage + !define MUI_LANGDLL_ALLLANGUAGES + +;-------------------------------- +;Language Selection Dialog Settings + + ;Remember the installer language + !define MUI_LANGDLL_REGISTRY_ROOT "HKCU" + !define MUI_LANGDLL_REGISTRY_KEY "Software\Modern UI Test" + !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_UNPAGE_COMPONENTS + !insertmacro MUI_UNPAGE_DIRECTORY + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" ; The first language is the default language + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "SpanishInternational" + !insertmacro MUI_LANGUAGE "SimpChinese" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_LANGUAGE "Japanese" + !insertmacro MUI_LANGUAGE "Korean" + !insertmacro MUI_LANGUAGE "Italian" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro MUI_LANGUAGE "Norwegian" + !insertmacro MUI_LANGUAGE "NorwegianNynorsk" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "Greek" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "Portuguese" + !insertmacro MUI_LANGUAGE "PortugueseBR" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Ukrainian" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Slovak" + !insertmacro MUI_LANGUAGE "Croatian" + !insertmacro MUI_LANGUAGE "Bulgarian" + !insertmacro MUI_LANGUAGE "Hungarian" + !insertmacro MUI_LANGUAGE "Thai" + !insertmacro MUI_LANGUAGE "Romanian" + !insertmacro MUI_LANGUAGE "Latvian" + !insertmacro MUI_LANGUAGE "Macedonian" + !insertmacro MUI_LANGUAGE "Estonian" + !insertmacro MUI_LANGUAGE "Turkish" + !insertmacro MUI_LANGUAGE "Lithuanian" + !insertmacro MUI_LANGUAGE "Slovenian" + !insertmacro MUI_LANGUAGE "Serbian" + !insertmacro MUI_LANGUAGE "SerbianLatin" + !insertmacro MUI_LANGUAGE "Arabic" + !insertmacro MUI_LANGUAGE "Farsi" + !insertmacro MUI_LANGUAGE "Hebrew" + !insertmacro MUI_LANGUAGE "Indonesian" + !insertmacro MUI_LANGUAGE "Mongolian" + !insertmacro MUI_LANGUAGE "Luxembourgish" + !insertmacro MUI_LANGUAGE "Albanian" + !insertmacro MUI_LANGUAGE "Breton" + !insertmacro MUI_LANGUAGE "Belarusian" + !insertmacro MUI_LANGUAGE "Icelandic" + !insertmacro MUI_LANGUAGE "Malay" + !insertmacro MUI_LANGUAGE "Bosnian" + !insertmacro MUI_LANGUAGE "Kurdish" + !insertmacro MUI_LANGUAGE "Irish" + !insertmacro MUI_LANGUAGE "Uzbek" + !insertmacro MUI_LANGUAGE "Galician" + !insertmacro MUI_LANGUAGE "Afrikaans" + !insertmacro MUI_LANGUAGE "Catalan" + !insertmacro MUI_LANGUAGE "Esperanto" + !insertmacro MUI_LANGUAGE "Asturian" + !insertmacro MUI_LANGUAGE "Basque" + !insertmacro MUI_LANGUAGE "Pashto" + !insertmacro MUI_LANGUAGE "ScotsGaelic" + !insertmacro MUI_LANGUAGE "Georgian" + !insertmacro MUI_LANGUAGE "Vietnamese" + !insertmacro MUI_LANGUAGE "Welsh" + !insertmacro MUI_LANGUAGE "Armenian" + !insertmacro MUI_LANGUAGE "Corsican" + !insertmacro MUI_LANGUAGE "Tatar" + !insertmacro MUI_LANGUAGE "Hindi" + +;-------------------------------- +;Reserve Files + + ;If you are using solid compression, files that are required before + ;the actual installation should be stored first in the data block, + ;because this will make your installer start faster. + + !insertmacro MUI_RESERVEFILE_LANGDLL + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetOutPath "$INSTDIR" + + ;ADD YOUR OWN FILES HERE... + + ;Store installation folder + WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + +SectionEnd + +;-------------------------------- +;Installer Functions + +Function .onInit + + !insertmacro MUI_LANGDLL_DISPLAY + +FunctionEnd + +;-------------------------------- +;Descriptions + + ;USE A LANGUAGE STRING IF YOU WANT YOUR DESCRIPTIONS TO BE LANGUAGE SPECIFIC + + ;Assign descriptions to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} "A test section." + !insertmacro MUI_FUNCTION_DESCRIPTION_END + + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + ;ADD YOUR OWN FILES HERE... + + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + DeleteRegKey /ifempty HKCU "Software\Modern UI Test" + +SectionEnd + +;-------------------------------- +;Uninstaller Functions + +Function un.onInit + + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/Modern UI/StartMenu.nsi b/libs/NSIS/NSIS-source/Examples/Modern UI/StartMenu.nsi new file mode 100644 index 0000000000..fad6df5297 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Modern UI/StartMenu.nsi @@ -0,0 +1,115 @@ +;NSIS Modern User Interface +;Start Menu Folder Selection Example Script +;Written by Joost Verburg + +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + +;-------------------------------- +;General + + ;Name and file + Name "Modern UI Test" + OutFile "StartMenu.exe" + Unicode True + + ;Default installation folder + InstallDir "$LOCALAPPDATA\Modern UI Test" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\Modern UI Test" "" + + ;Request application privileges for Windows Vista + RequestExecutionLevel user + +;-------------------------------- +;Variables + + Var StartMenuFolder + +;-------------------------------- +;Interface Settings + + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page Configuration + !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" + !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Modern UI Test" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + + !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder + + !insertmacro MUI_PAGE_INSTFILES + + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetOutPath "$INSTDIR" + + ;ADD YOUR OWN FILES HERE... + + ;Store installation folder + WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + + ;Create shortcuts + CreateDirectory "$SMPROGRAMS\$StartMenuFolder" + CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + + !insertmacro MUI_STARTMENU_WRITE_END + +SectionEnd + +;-------------------------------- +;Descriptions + + ;Language strings + LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + ;ADD YOUR OWN FILES HERE... + + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder + + Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" + RMDir "$SMPROGRAMS\$StartMenuFolder" + + DeleteRegKey /ifempty HKCU "Software\Modern UI Test" + +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/Modern UI/WelcomeFinish.nsi b/libs/NSIS/NSIS-source/Examples/Modern UI/WelcomeFinish.nsi new file mode 100644 index 0000000000..7fa92e57a5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Modern UI/WelcomeFinish.nsi @@ -0,0 +1,93 @@ +;NSIS Modern User Interface +;Welcome/Finish Page Example Script +;Written by Joost Verburg + +;-------------------------------- +;Include Modern UI + + !include "MUI2.nsh" + +;-------------------------------- +;General + + ;Name and file + Name "Modern UI Test" + OutFile "WelcomeFinish.exe" + Unicode True + + ;Default installation folder + InstallDir "$LOCALAPPDATA\Modern UI Test" + + ;Get installation folder from registry if available + InstallDirRegKey HKCU "Software\Modern UI Test" "" + + ;Request application privileges for Windows Vista + RequestExecutionLevel user + +;-------------------------------- +;Interface Settings + + !define MUI_ABORTWARNING + +;-------------------------------- +;Pages + + !insertmacro MUI_PAGE_WELCOME + !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt" + !insertmacro MUI_PAGE_COMPONENTS + !insertmacro MUI_PAGE_DIRECTORY + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_PAGE_FINISH + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +;Languages + + !insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Installer Sections + +Section "Dummy Section" SecDummy + + SetOutPath "$INSTDIR" + + ;ADD YOUR OWN FILES HERE... + + ;Store installation folder + WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR + + ;Create uninstaller + WriteUninstaller "$INSTDIR\Uninstall.exe" + +SectionEnd + +;-------------------------------- +;Descriptions + + ;Language strings + LangString DESC_SecDummy ${LANG_ENGLISH} "A test section." + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecDummy} $(DESC_SecDummy) + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + + ;ADD YOUR OWN FILES HERE... + + Delete "$INSTDIR\Uninstall.exe" + + RMDir "$INSTDIR" + + DeleteRegKey /ifempty HKCU "Software\Modern UI Test" + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/MultiUser.nsi b/libs/NSIS/NSIS-source/Examples/MultiUser.nsi new file mode 100644 index 0000000000..80286a3e15 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/MultiUser.nsi @@ -0,0 +1,58 @@ +Name "MultiUser example" +OutFile "MultiUser.exe" + +!define UNINSTKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" +!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY "${UNINSTKEY}" +!define MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME "CurrentUser" +!define MULTIUSER_INSTALLMODE_INSTDIR "$(^Name)" +!define MULTIUSER_INSTALLMODE_COMMANDLINE +!define MULTIUSER_EXECUTIONLEVEL Highest +!define MULTIUSER_MUI + +!include "LogicLib.nsh" +!include "MultiUser.nsh" +!include "MUI2.nsh" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MULTIUSER_PAGE_INSTALLMODE +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_LANGUAGE "English" + +Function .onInit + !insertmacro MULTIUSER_INIT +FunctionEnd + +Function un.onInit + !insertmacro MULTIUSER_UNINIT +FunctionEnd + +Section + SetOutPath "$InstDir" + WriteUninstaller "$InstDir\Uninstall.exe" + WriteRegStr ShCtx "${UNINSTKEY}" DisplayName "$(^Name)" + WriteRegStr ShCtx "${UNINSTKEY}" UninstallString '"$InstDir\Uninstall.exe"' + WriteRegStr ShCtx "${UNINSTKEY}" $MultiUser.InstallMode 1 ; Write MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME so the correct context can be detected in the uninstaller. + + !tempfile APP + !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NsisMultiUserExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 + File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install + !delfile "${APP}" +SectionEnd + +Section "Start Menu shortcut" + CreateShortcut /NoWorkingDir "$SMPrograms\$(^Name).lnk" "$InstDir\MyApp.exe" +SectionEnd + +Section "-Uninstall" + Delete "$SMPrograms\$(^Name).lnk" + + Delete "$InstDir\MyApp.exe" + Delete "$InstDir\Uninstall.exe" + DeleteRegKey ShCtx "${UNINSTKEY}" + RMDir $InstDir +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/NSISMenu.nsi b/libs/NSIS/NSIS-source/Examples/NSISMenu.nsi new file mode 100644 index 0000000000..9fbf977ba2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/NSISMenu.nsi @@ -0,0 +1,358 @@ +OutFile "NSIS.exe" +Name "NSIS Menu" +Unicode True +RequestExecutionLevel User +XPStyle On +ManifestDPIAware System +SetCompressor LZMA +ChangeUI IDD_INST "${NSISDIR}\Contrib\UIs\modern_headerbmp.exe" +Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis-menu.ico" +BrandingText " " +MiscButtonText " " " " " " " " +InstallButtonText " " +CompletedText " " +LangString ^ClickInstall 0 " " +Caption "$(^Name)" + +!macro UNPACKVERFIELD out in shr mask fmt +!define /redef /math ${out} ${in} >>> ${shr} +!define /redef /math ${out} ${${out}} & ${mask} +!define /redef /intfmt ${out} "${fmt}" ${${out}} +!macroend + +!ifndef VER_MAJOR & VER_MINOR +!ifdef NSIS_PACKEDVERSION +!insertmacro UNPACKVERFIELD VER_MAJOR ${NSIS_PACKEDVERSION} 24 0x0ff "%X" +!insertmacro UNPACKVERFIELD VER_MINOR ${NSIS_PACKEDVERSION} 12 0xfff "%X" +!insertmacro UNPACKVERFIELD VER_REVISION ${NSIS_PACKEDVERSION} 4 255 "%X" +!insertmacro UNPACKVERFIELD VER_BUILD ${NSIS_PACKEDVERSION} 00 0x00f "%X" +!endif +!endif +!ifdef VER_MAJOR & VER_MINOR +!define /ifndef VER_REVISION 0 +!define /ifndef VER_BUILD 0 +!searchreplace VERSTR "${NSIS_VERSION}" "v" "" +VIProductVersion ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} +VIAddVersionKey "ProductName" "NSIS" +VIAddVersionKey "ProductVersion" "${VERSTR}" +VIAddVersionKey "FileVersion" "${VERSTR}" +VIAddVersionKey "FileDescription" "NSIS Menu" +VIAddVersionKey "LegalCopyright" "http://nsis.sf.net/License" +!endif + +!include nsDialogs.nsh +!include WinMessages.nsh +!include LogicLib.nsh +!define /IfNDef IDC_CHILDRECT 1018 +!define QUIT_ON_EXECUTE +!define PR $ExeDir ; Local root path +!define PD "Docs" ; Local with WWW fallback (located at the same relative path) +!define WWW "http://nsis.sf.net" + +!define CB_HEADER '0x755585 0x222222' +!define UY_HEADER 28 +!define CT_PAGE '0x000000 0xaaaaaa' +!define CB_PAGE '0xffffff 0x111111' +!define CT_SECTION '0x666666 0xeeeeee' +!define CB_SECTION '${CB_PAGE}' +!define UY_SECTION 11 ; Height of a section +!define UY_SECTIONBPAD 2 ; Extra padding on the bottom of section headers +!define UY_TXT 9 ; Height of a normal item +!define UY_TXTBPAD 1 ; Extra padding on the bottom of normal items +!define UX_COLPAD 7 ; Spacing between columns +!define UY_ROW2 104 ; Absolute position of the 2nd row +!define CT_LINK '0x0c6e97 0x0c6e97' ; SYSCLR:HOTLIGHT +!define /Math UX_PAGE 00 + ${UX_COLPAD} +!define /Math UY_PAGE ${UY_HEADER} + 20 +!define UX ${UX_PAGE} +!define CB_FOOTERLINE '0xc4c4c4 0x333333' +!define CT_FOOTER '0xbbbbbb 0x444444' + +Var UseLightTheme + +Function .onGUIInit +ReadRegDWORD $UseLightTheme HKCU "Software\NSIS" "UseLightTheme" +StrCmp $UseLightTheme "" 0 +2 +ReadRegDWORD $UseLightTheme HKCU "Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" "AppsUseLightTheme" +StrCmp $UseLightTheme "" 0 +2 +StrCpy $UseLightTheme 1 ; Default + +StrCmp $UseLightTheme "0" 0 +5 +System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i20,*i1,i4)i.r0' ; 20H1 +IntCmp $0 0 +3 +3 +System::Call 'DWMAPI::DwmSetWindowAttribute(p$hWndParent,i19,*i1,i4)i.r0' ; ; 19H1 +System::Call 'USER32::SetProp(p$hWndParent,t"UseImmersiveDarkModeColors",i1)' ; 1809 +FunctionEnd + +!define SetCtlColors "!insertmacro SetCtlColors " +!macro SetCtlColors hWnd ctlig ctdar cblig cbdar +StrCmp $UseLightTheme "0" 0 +3 +SetCtlColors ${hWnd} "${ctdar}" ${cbdar} +Goto +2 +SetCtlColors ${hWnd} "${ctlig}" ${cblig} +!macroend + + +Function PageLeave +System::Call 'USER32::GetFocus()p.r0' +System::Call 'USER32::GetDlgCtrlID(pr0)i.r1' +System::Call 'USER32::GetParent(pr0)p.r2' +SendMessage $2 ${WM_COMMAND} $1 $0 ; Handle in dialog by pretending it was a click on the active control +Abort +FunctionEnd + +Function PageCreate +GetDlgItem $0 $hWndParent 1 +ShowWindow $0 0 +GetDlgItem $0 $hWndParent 2 +ShowWindow $0 0 + +System::Call 'USER32::GetClientRect(p$hWndParent,@r0)' +System::Call '*$0(i,i,i.r3,i.r4)' +GetDlgItem $0 $hWndParent ${IDC_CHILDRECT} +System::Call 'USER32::MoveWindow(pr0,i0,i0,ir3,ir4,i0)' + +nsDialogs::Create ${IDC_CHILDRECT} +Pop $R9 +${SetCtlColors} $R9 ${CT_PAGE} ${CB_PAGE} + +!macro StartColumn W +!define /ReDef UY ${UY_PAGE} +!define /ReDef UX_W ${W} +!ifdef UX_INTERNAL_PREV_W +!define /ReDef /Math UX ${UX} + ${UX_INTERNAL_PREV_W} +!define /ReDef /Math UX ${UX} + ${UX_COLPAD} +!define /ReDef UX_INTERNAL_PREV_W ${UX_W} +!else +!define /Math UX_INTERNAL_PREV_W 0 + ${UX_W} +!endif +!macroend +!macro CreateHeader Txt W +!define /ReDef /Math W ${W} + 4 ; Make it slightly wider +${NSD_CreateLabel} ${UX}u ${UY}u ${W}u ${UY_SECTION}u "${Txt}" +Pop $0 +${SetCtlColors} $0 ${CT_SECTION} transparent transparent +SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1 +!define /ReDef /Math UY ${UY} + ${UY_SECTION} +!define /ReDef /Math UY ${UY} + ${UY_SECTIONBPAD} +!macroend +!macro CreateControl Class Txt W H +${NSD_Create${Class}} ${UX}u ${UY}u ${W}u ${H}u "${Txt}" +!define /ReDef /Math UY ${UY} + ${H} +!define /ReDef /Math UY ${UY} + ${UY_TXTBPAD} +!macroend +!macro CreateSimpleLinkHelper Txt Url W +!insertmacro CreateControl Link "${Txt}|${Url}" ${W} ${UY_TXT} +!macroend +!macro CreateSimpleLink Txt Url W +!insertmacro CreateSimpleLinkHelper "${Txt}" "${Url}" ${W} +Call ConfigureLink +!macroend + + +; --- Header --- +!define HF_HEADER $R8 +CreateFont ${HF_HEADER} "Arial" ${UY_SECTION} 700 + +nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u "" +Pop $0 +${SetCtlColors} $0 0xffffff 0xffffff ${CB_HEADER} + +; CCv5 does not paint the background outside of the icon correctly when SS_CENTERIMAGE is used so we have to overlay a small icon on top of the background +nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE} ${__NSD_Icon_EXSTYLE} 4u 4u 33u ${UY_HEADER}u "" +Pop $0 +${SetCtlColors} $0 "" "" ${CB_HEADER} +${NSD_SetIconFromInstaller} $0 $1 +nsDialogs::CreateControl ${__NSD_Icon_CLASS} ${__NSD_Icon_STYLE}|${SS_CENTERIMAGE}|${SS_CENTER} ${__NSD_Icon_EXSTYLE} 0 0 33u ${UY_HEADER}u "" +Pop $0 +${SetCtlColors} $0 "" "" ${CB_HEADER} + +CreateFont $1 "Trebuchet MS" 17 +!searchreplace VERSTR "${NSIS_VERSION}" "v" "" +nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 34u 1u -34u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}" +Pop $0 +SetCtlColors $0 0x3A2A42 transparent +SendMessage $0 ${WM_SETFONT} $1 1 +nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_ENDELLIPSIS} ${__NSD_Label_EXSTYLE} 33u 0 -33u ${UY_HEADER}u "nullsoft scriptable install system ${VERSTR}" +Pop $0 +SetCtlColors $0 0xffffff transparent +SendMessage $0 ${WM_SETFONT} $1 1 + + +; --- Page --- +!insertmacro StartColumn 90 +!insertmacro CreateHeader "Compiler" ${UX_W} +!insertmacro CreateSimpleLink "Compile NSI scripts" "${PR}\MakeNSISW" ${UX_W} +!insertmacro CreateSimpleLink "Installer based on .ZIP file" "${PR}\bin\Zip2Exe" ${UX_W} + + +!define /ReDef UY ${UY_ROW2} +!insertmacro CreateHeader "Developer Center" ${UX_W} +!define /ReDef UY_MULTILINE 42 +!insertmacro CreateControl Label "Many more examples, tutorials, plug-ins and NSIS-related software are available at the online Developer Center." ${UX_W} ${UY_MULTILINE} +Pop $0 +${SetCtlColors} $0 ${CT_PAGE} ${CB_PAGE} + + +!insertmacro StartColumn 80 +!insertmacro CreateHeader "Documentation" ${UX_W} +!insertmacro CreateSimpleLink "NSIS Users Manual" "${PR}\NSIS.chm|${WWW}/Docs/" ${UX_W} +!insertmacro CreateSimpleLink "Example scripts" "${PR}\Examples|${WWW}/Examples" ${UX_W} +!insertmacro CreateSimpleLink "Modern UI 2" "${PD}\Modern UI 2\Readme.html" ${UX_W} + + +!define /ReDef UY ${UY_ROW2} +!insertmacro CreateHeader "Online Help" ${UX_W} +!insertmacro CreateSimpleLink "Developer Center" "${WWW}/Developer_Center" ${UX_W} +!insertmacro CreateSimpleLink "FAQ" "${WWW}/FAQ" ${UX_W} +!insertmacro CreateSimpleLink "Forum" "http://forums.winamp.com/forumdisplay.php?forumid=65" ${UX_W} +;"Project Tracker" "http://sourceforge.net/tracker/?group_id=22049" +!insertmacro CreateSimpleLink "Bug Tracker" "http://sourceforge.net/tracker/?group_id=22049&atid=373085" ${UX_W} +!insertmacro CreateSimpleLink "Stackoverflow" "http://stackoverflow.com/questions/tagged/nsis" ${UX_W} +!insertmacro CreateSimpleLink "Chat" "${WWW}/r/Chat" ${UX_W} +;insertmacro CreateSimpleLink "IRC channel" "irc://irc.landoleet.org/nsis" ${UX_W} +;"Pastebin" "http://nsis.pastebin.com/index/1FtyKP89" +;"Search" "http://www.google.com/cse/home?cx=005317984255499820329:c_glv1-6a6a" + + +!insertmacro StartColumn 130 +!insertmacro CreateHeader "Plug-ins" ${UX_W} +!macro CreatePluginLink Name Desc Url +!define /ReDef SAVE_UY ${UY} +!insertmacro CreateSimpleLinkHelper "${Name}" "${Url}" ${UX_W} ; AdjustLinkPair will configure this link +!define /ReDef UY ${SAVE_UY} +!insertmacro CreateControl Label "${Name} - ${Desc}" ${UX_W} ${UY_TXT} +Call AdjustLinkPair +!macroend +!insertmacro CreatePluginLink "AdvSplash" "splash with fade in/out" "${PD}\AdvSplash\advsplash.txt" +!insertmacro CreatePluginLink "Banner" "banner with custom text" "${PD}\Banner\Readme.txt" +!insertmacro CreatePluginLink "BgImage" "background image" "${PD}\BgImage\BgImage.txt" +!insertmacro CreatePluginLink "Dialer" "internet connection" "${PD}\Dialer\Dialer.txt" +!insertmacro CreatePluginLink "Math" "math operations" "${PD}\Math\Math.txt" +!insertmacro CreatePluginLink "nsDialogs" "custom wizard pages" "${PD}\nsDialogs\Readme.html" +!insertmacro CreatePluginLink "nsExec" "launch command line tools" "${PD}\nsExec\nsExec.txt" +!insertmacro CreatePluginLink "NSISdl" "download files" "${PD}\NSISdl\Readme.txt" +!insertmacro CreatePluginLink "Splash" "splash screen" "${PD}\Splash\splash.txt" +!insertmacro CreatePluginLink "StartMenu" "Start Menu folder selection" "${PD}\StartMenu\Readme.txt" +!insertmacro CreatePluginLink "System" "Windows API calls" "${PD}\System\System.html" +!insertmacro CreatePluginLink "VPatch" "update existing files" "${PD}\VPatch\Readme.html" + + +; --- Footer --- +${NSD_CreateLabel} 0 -22u 100% 1 "" +Pop $0 +${SetCtlColors} $0 000000 000000 ${CB_FOOTERLINE} + +nsDialogs::CreateControl ${__NSD_Label_CLASS} ${__NSD_Label_STYLE}|${SS_CENTERIMAGE}|${SS_NOTIFY} ${__NSD_Label_EXSTYLE} -110u -20u 100% 20u "nsis.sourceforge.net" +Pop $0 +${SetCtlColors} $0 ${CT_FOOTER} transparent transparent +SendMessage $0 ${WM_SETFONT} ${HF_HEADER} 1 +nsDialogs::SetUserData $0 "https://nsis.sourceforge.io" +${NSD_OnClick} $0 OnLinkClick + +nsDialogs::Show +FunctionEnd + +Function OnLinkClick +Pop $1 ; HWND +nsDialogs::GetUserData $1 +Call SplitPipe +Pop $0 ; First URL in UserData from SplitPipe +StrCpy $3 "" +StrCpy $1 $0 4 ; Copy length of ${PD} +${IfThen} $1 == "${PD}" ${|} StrCpy $3 "${PR}\" ${|} +!ifdef QUIT_ON_EXECUTE +System::Call 'USER32::GetKeyState(i0x11)i.r9' ; VK_CONTROL +!endif +ClearErrors +ExecShell "" "$3$0" +Pop $1 ; ... the rest of SplitPipe ... +${If} $1 != "" ; ... might contain a fallback location + StrCpy $0 $1 + StrCpy $3 "" +${ElseIf} $3 != "" ; Local docs path failed, use WWW fallback + StrCpy $3 0 + slashconvloop: + StrCpy $2 $0 1 $3 + ${If} $2 == "\" + StrCpy $2 $0 $3 + IntOp $3 $3 + 1 + StrCpy $0 $0 "" $3 + StrCpy $0 "$2/$0" + ${Else} + IntOp $3 $3 + 1 + ${EndIf} + StrCmp $2 "" 0 slashconvloop + StrCpy $3 "${WWW}/" +${EndIf} +${If} "$3$1" != "" +${AndIf} ${Errors} + ExecShell "" "$3$0" +${EndIf} +${If} ${Errors} + !ifdef QUIT_ON_EXECUTE + StrCpy $9 0 ; Don't allow close + !endif + MessageBox MB_IconStop 'Error: Unable to open "$0"!' +${EndIf} +!ifdef QUIT_ON_EXECUTE +${IfThen} $9 & 0x8000 ${|} SendMessage $hWndParent ${WM_CLOSE} 0 0 ${|} +!endif +FunctionEnd + +Function ConfigureLink +Pop $1 ; HWND +${NSD_OnClick} $1 OnLinkClick +${SetCtlColors} $1 ${CT_LINK} ${CB_PAGE} +${NSD_GetText} $1 $4 +Push $4 +Call SplitPipe +Pop $4 +Pop $2 +${NSD_SetText} $1 $4 +nsDialogs::SetUserData $1 $2 +System::Call 'USER32::GetDC(pr1)p.r3' +SendMessage $1 ${WM_GETFONT} 0 0 $5 +System::Call 'GDI32::SelectObject(pr3,pr5)p.s' +StrLen $5 $4 +System::Call 'GDI32::GetTextExtentPoint32(pr3,tr4,ir5,@r5)' +System::Call '*$5(i.r6)' +System::Call 'GDI32::SelectObject(pr3,ps)' +System::Call 'USER32::ReleaseDC(pr1,pr3)' +System::Call 'USER32::GetWindowRect(pr1,@r3)' +System::Call '*$3(i,i.r5,i,i.r7)' +IntOp $7 $7 - $5 +IntOp $6 $6 + 4 ; Padding for focus rect +System::Call 'USER32::SetWindowPos(pr1,p,i,i,ir6,ir7,i0x16)' +FunctionEnd + +Function AdjustLinkPair +Pop $2 ; Label +${SetCtlColors} $2 ${CT_PAGE} ${CB_PAGE} +Call ConfigureLink +FunctionEnd + +Function SplitPipe +Exch $0 +Push $1 +Push $2 +StrCpy $2 0 +findSep: +StrCpy $1 $0 1 $2 +IntOp $2 $2 + 1 +StrCmp $1 "" +2 +StrCmp $1 "|" "" findSep +StrCpy $1 $0 "" $2 +IntOp $2 $2 - 1 +StrCpy $0 $0 $2 +Pop $2 +Exch $1 +Exch +Exch $0 +FunctionEnd + +Section +SectionEnd + +Page Custom PageCreate PageLeave +!pragma warning disable 8000 ; Page instfiles not used \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.sln b/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.sln new file mode 100644 index 0000000000..7b03ddcc9b --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exdll", "exdll-vs2008.vcproj", "{5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Debug|Win32.Build.0 = Debug|Win32 + {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.ActiveCfg = Release|Win32 + {5E3E2AFD-1D6B-4997-A9B5-8ECBC8F6C31A}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.vcproj b/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.vcproj new file mode 100644 index 0000000000..e4bb417afa --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll-vs2008.vcproj @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll.c b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.c new file mode 100644 index 0000000000..e4e807e7f6 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.c @@ -0,0 +1,42 @@ +#include +#include // nsis plugin + +HINSTANCE g_hInstance; +HWND g_hwndParent; + +// To work with Unicode version of NSIS, please use TCHAR-type +// functions for accessing the variables and the stack. + +void __declspec(dllexport) myFunction(HWND hwndParent, int string_size, + LPTSTR variables, stack_t **stacktop, + extra_parameters *extra, ...) +{ + EXDLL_INIT(); + g_hwndParent = hwndParent; + + + // note if you want parameters from the stack, pop them off in order. + // i.e. if you are called via exdll::myFunction file.dat read.txt + // calling popstring() the first time would give you file.dat, + // and the second time would give you read.txt. + // you should empty the stack of your parameters, and ONLY your + // parameters. + + // do your stuff here + { + LPTSTR msgbuf = (LPTSTR) GlobalAlloc(GPTR, (3 + string_size + 1) * sizeof(*msgbuf)); + if (msgbuf) + { + wsprintf(msgbuf, TEXT("$0=%s"), getuservariable(INST_0)); + MessageBox(g_hwndParent, msgbuf, TEXT("Message from example plugin"), MB_OK); + GlobalFree(msgbuf); + } + } +} + + +BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) +{ + g_hInstance = hInst; + return TRUE; +} diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dpr b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dpr new file mode 100644 index 0000000000..ec70b1082a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dpr @@ -0,0 +1,118 @@ +{ + NSIS ExDLL example + (C) 2001 - Peter Windridge + + Fixed and formatted by Brett Dever + http://editor.nfscheats.com/ + + Tested in Delphi 7.0 +} + +library exdll; + +uses Windows; + +type + VarConstants = ( + INST_0, + INST_1, // $1 + INST_2, // $2 + INST_3, // $3 + INST_4, // $4 + INST_5, // $5 + INST_6, // $6 + INST_7, // $7 + INST_8, // $8 + INST_9, // $9 + INST_R0, // $R0 + INST_R1, // $R1 + INST_R2, // $R2 + INST_R3, // $R3 + INST_R4, // $R4 + INST_R5, // $R5 + INST_R6, // $R6 + INST_R7, // $R7 + INST_R8, // $R8 + INST_R9, // $R9 + INST_CMDLINE, // $CMDLINE + INST_INSTDIR, // $INSTDIR + INST_OUTDIR, // $OUTDIR + INST_EXEDIR, // $EXEDIR + INST_LANG, // $LANGUAGE + __INST_LAST + ); + TVariableList = INST_0..__INST_LAST; + pstack_t = ^stack_t; + stack_t = record + next: pstack_t; + text: PChar; + end; + +var + g_stringsize: integer; + g_stacktop: ^pstack_t; + g_variables: PChar; + g_hwndParent: HWND; + +function PopString(): string; +var + th: pstack_t; +begin + if integer(g_stacktop^) <> 0 then begin + th := g_stacktop^; + Result := PChar(@th.text); + g_stacktop^ := th.next; + GlobalFree(HGLOBAL(th)); + end; +end; + +procedure PushString(const str: string=''); +var + th: pstack_t; +begin + if integer(g_stacktop) <> 0 then begin + th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize)); + lstrcpyn(@th.text, PChar(str), g_stringsize); + th.next := g_stacktop^; + g_stacktop^ := th; + end; +end; + +function GetUserVariable(const varnum: TVariableList): string; +begin + if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then + Result := g_variables + integer(varnum) * g_stringsize + else + Result := ''; +end; + +procedure SetUserVariable(const varnum: TVariableList; const value: string); +begin + if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then + lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value)) +end; + +procedure NSISDialog(const text, caption: string; const buttons: integer); +begin + MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons); +end; + +procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl; +begin + // setup global variables + g_stringsize := string_size; + g_hwndParent := hwndParent; + g_stacktop := stacktop; + g_variables := variables; + // end global variable setup + + NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK); + NSISDialog(PopString, 'pop', MB_OK); + PushString('Hello, this is a push'); + SetUserVariable(INST_0, 'This is user var $0'); +end; + +exports ex_dll; + +begin +end. diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsp b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsp new file mode 100644 index 0000000000..81dc4a4ffb --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsp @@ -0,0 +1,112 @@ +# Microsoft Developer Studio Project File - Name="exdll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=exdll - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "exdll.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "exdll.mak" CFG="exdll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "exdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "exdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "exdll - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O1 /I "." /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /machine:I386 +# ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "exdll - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /D NSISCALL=__stdcall /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib nsis\pluginapi.lib /nologo /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "exdll - Win32 Release" +# Name "exdll - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\exdll.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\nsis\pluginapi.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsw b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsw new file mode 100644 index 0000000000..e8a07c1a24 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "exdll"=.\exdll.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/exdll_with_unit.dpr b/libs/NSIS/NSIS-source/Examples/Plugin/exdll_with_unit.dpr new file mode 100644 index 0000000000..d9268d539a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/exdll_with_unit.dpr @@ -0,0 +1,100 @@ +{ + NSIS ExDLL2 example + Original is ExDLL + (C) 2001 - Peter Windridge + + Changed with delphi unit nsis.pas + by bernhard mayer + + Tested in Delphi 7.0 +} + +// Example NSIS code +{ +Section + exdll_with_unit::registerplugincallback + + StrCpy $3 "Hello" + Push "World" + exdll_with_unit::pop_dlg_push + Pop $1 + DetailPrint $$1=$1 + DetailPrint $$3=$3 + + GetFunctionAddress $0 nsistest + Push $0 + exdll_with_unit::callnsisfunc +SectionEnd + +Function nsistest + DetailPrint "Hello from NSIS function" +FunctionEnd +} + + +library exdll; + +uses + nsis, windows; + +{$IFDEF UNICODE} +type TString = System.WideString; // UnicodeString? +type PTChar = PWideChar; +{$ELSE} +type TString = AnsiString; +type PTChar = PAnsiChar; +{$ENDIF} + +procedure pop_dlg_push(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer); cdecl; +begin + // set up global variables + Init(hwndParent, string_size, variables, stacktop); + + NSISDialog(GetUserVariable(INST_3), 'The value of $3', MB_OK); + NSISDialog(PopString, 'pop', MB_OK); + PushString('Hello, this is a push'); + SetUserVariable(INST_3, 'This is user var $3'); +end; + + +procedure callnsisfunc(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer; const extraparameters: pointer); cdecl; +var + FuncAddr : TString; +begin + Init(hwndParent, string_size, variables, stacktop, extraparameters); + + FuncAddr := PopString(); + Call(FuncAddr); +end; + + +function mynsiscallback(const NSPIM: TNSPIM): Pointer; cdecl; +begin + Result := nil; + if NSPIM = NSPIM_UNLOAD then + begin + NSISDialog(PTChar('NSPIM_UNLOAD is the final callback, goodbye...'), PTChar('mynsiscallback'), MB_OK); + end; +end; + + +procedure registerplugincallback(const hwndParent: HWND; const string_size: integer; const variables: PTChar; const stacktop: pointer; const extraparameters: pointer); cdecl; +var + ThisDllInstance : HMODULE; +begin + Init(hwndParent, string_size, variables, stacktop, extraparameters); + + if g_extraparameters <> nil then + begin + ThisDllInstance := hInstance; + TRegisterPluginCallback(g_extraparameters.RegisterPluginCallback)(ThisDllInstance, @mynsiscallback); + end; +end; + + +exports pop_dlg_push; +exports callnsisfunc; +exports registerplugincallback; + +begin +end. diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/extdll.inc b/libs/NSIS/NSIS-source/Examples/Plugin/extdll.inc new file mode 100644 index 0000000000..e3b7476ca2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/extdll.inc @@ -0,0 +1,145 @@ +;################################################################ +; ExtDLL header for MASM32 +; +; Author: Ramon +; +; Obs: This header must be included after windows.inc and kernel32.inc +; because it need the prototypes for lstrcpy, lstrcpyn, +; GlobalAlloc and GlobalFree +; +;################################################################ +stack_t struct + next dd ? + text dd ? ; 1 DUP(?) ; this should be the length of string_size +stack_t ends + +.const +; For page showing plug-ins +WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8) +WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd) +NOTIFY_BYE_BYE equ 'x' + +INST_0 EQU 0 ; $0 +INST_1 EQU 1 ; $1 +INST_2 EQU 2 ; $2 +INST_3 EQU 3 ; $3 +INST_4 EQU 4 ; $4 +INST_5 EQU 5 ; $5 +INST_6 EQU 6 ; $6 +INST_7 EQU 7 ; $7 +INST_8 EQU 8 ; $8 +INST_9 EQU 9 ; $9 +INST_R0 EQU 10 ; $R0 +INST_R1 EQU 11 ; $R1 +INST_R2 EQU 12 ; $R2 +INST_R3 EQU 13 ; $R3 +INST_R4 EQU 14 ; $R4 +INST_R5 EQU 15 ; $R5 +INST_R6 EQU 16 ; $R6 +INST_R7 EQU 17 ; $R7 +INST_R8 EQU 18 ; $R8 +INST_R9 EQU 19 ; $R9 +INST_CMDLINE EQU 20 ; $CMDLINE +INST_INSTDIR EQU 21 ; $INSTDIR +INST_OUTDIR EQU 22 ; $OUTDIR +INST_EXEDIR EQU 23 ; $EXEDIR +INST_LANG EQU 24 ; $LANGUAGE +__INST_LAST EQU 25 + +.data? +g_stringsize dd ? +g_stacktop dd ? +g_variables dd ? + +m2m MACRO M1, M2 + push M2 + pop M1 +ENDM + +EXDLL_INIT MACRO + m2m g_stringsize, string_size + m2m g_stacktop, stacktop + m2m g_variables, variables +ENDM + +.code + +; utility functions (not required but often useful) +popstring proc uses edi pStr:DWORD + + LOCAL th:DWORD + + mov edi, g_stacktop + cmp edi, 0 + jz STACK_ERR + mov edi, [edi] + cmp edi, 0 + jz STACK_ERR + + ASSUME edi:PTR stack_t + invoke lstrcpy, pStr, ADDR [edi].text + mov th , edi + mov edi, [edi].next + mov eax, g_stacktop + mov [eax], edi + invoke GlobalFree, th + ASSUME edi:PTR NOTHING + mov eax, 0 + ret + +STACK_ERR: + mov eax, 1 + ret + +popstring endp + +pushstring proc uses edi pStr:DWORD + + cmp g_stacktop, 0 + jz STACK_ERR + + mov eax, sizeof stack_t + add eax, g_stringsize + invoke GlobalAlloc, GPTR, eax + + mov edi, eax + assume edi:PTR stack_t + + invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize + mov eax, g_stacktop + push DWORD PTR[eax] + mov [eax], edi + pop eax + ;lea edi, [edi].next ; Not needed [edi].next == edi + mov DWORD PTR[edi], eax + ASSUME edi:PTR NOTHING + +STACK_ERR: + ret + +pushstring endp + +getuservariable proc varnum:DWORD + + .if varnum < 0 || varnum >= __INST_LAST + xor eax, eax + .else + mov eax, varnum + imul eax, g_stringsize + add eax, g_variables + .endif + ret + +getuservariable endp + +setuservariable proc varnum:DWORD, var:DWORD + + .if (var != NULL && varnum >= 0 && varnum < __INST_LAST) + mov eax, varnum + imul eax, g_stringsize + add eax, g_variables + invoke lstrcpy, eax, var + .endif + ret + +setuservariable endp diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/nsis.pas b/libs/NSIS/NSIS-source/Examples/Plugin/nsis.pas new file mode 100644 index 0000000000..164847211b --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/nsis.pas @@ -0,0 +1,236 @@ +{ + Original Code from + (C) 2001 - Peter Windridge + + Code in separate unit and some changes + 2003 by Bernhard Mayer + + Fixed and formatted by Brett Dever + http://editor.nfscheats.com/ + + simply include this unit in your plugin project and export + functions as needed +} + +unit nsis; + +interface + +uses + windows, SysUtils +{$IFNDEF FPC} + ,CommCtrl +{$ENDIF} +{$IF FPC_FULLVERSION < 30000} ; This is probably wrong + ,CommCtrl +{$ENDIF} + ; + +{$IFDEF UNICODE} +type NSISTString = System.WideString; // UnicodeString? +type NSISPTChar = PWideChar; +{$ELSE} +type NSISTString = AnsiString; +type NSISPTChar = PAnsiChar; +{$ENDIF} + +type + VarConstants = ( + INST_0, // $0 + INST_1, // $1 + INST_2, // $2 + INST_3, // $3 + INST_4, // $4 + INST_5, // $5 + INST_6, // $6 + INST_7, // $7 + INST_8, // $8 + INST_9, // $9 + INST_R0, // $R0 + INST_R1, // $R1 + INST_R2, // $R2 + INST_R3, // $R3 + INST_R4, // $R4 + INST_R5, // $R5 + INST_R6, // $R6 + INST_R7, // $R7 + INST_R8, // $R8 + INST_R9, // $R9 + INST_CMDLINE, // $CMDLINE + INST_INSTDIR, // $INSTDIR + INST_OUTDIR, // $OUTDIR + INST_EXEDIR, // $EXEDIR + INST_LANG, // $LANGUAGE + __INST_LAST + ); + TVariableList = INST_0..__INST_LAST; + +type + PluginCallbackMessages = ( + NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup + NSPIM_GUIUNLOAD // Called after .onGUIEnd + ); + TNSPIM = NSPIM_UNLOAD..NSPIM_GUIUNLOAD; + + //TPluginCallback = function (const NSPIM: Integer): Pointer; cdecl; + + TExecuteCodeSegment = function (const funct_id: Integer; const parent: HWND): Integer; stdcall; + Tvalidate_filename = procedure (const filename: NSISPTChar); stdcall; + TRegisterPluginCallback = function (const DllInstance: HMODULE; const CallbackFunction: Pointer): Integer; stdcall; + + pexec_flags_t = ^exec_flags_t; + exec_flags_t = record + autoclose: Integer; + all_user_var: Integer; + exec_error: Integer; + abort: Integer; + exec_reboot: Integer; + reboot_called: Integer; + XXX_cur_insttype: Integer; + plugin_api_version: Integer; + silent: Integer; + instdir_error: Integer; + rtl: Integer; + errlvl: Integer; + alter_reg_view: Integer; + status_update: Integer; + end; + + pextrap_t = ^extrap_t; + extrap_t = record + exec_flags: Pointer; // exec_flags_t; + exec_code_segment: TExecuteCodeSegment; // TFarProc; + validate_filename: Pointer; // Tvalidate_filename; + RegisterPluginCallback: Pointer; //TRegisterPluginCallback; + end; + + pstack_t = ^stack_t; + stack_t = record + next: pstack_t; + text: NSISPTChar; + end; + +var + g_stringsize: integer; + g_stacktop: ^pstack_t; + g_variables: NSISPTChar; + g_hwndParent: HWND; + g_hwndList: HWND; + g_hwndLogList: HWND; + g_extraparameters: pextrap_t; + +procedure Init(const hwndParent: HWND; const string_size: integer; const variables: NSISPTChar; const stacktop: pointer; const extraparameters: pointer = nil); +function LogMessage(Msg : String): BOOL; +function Call(NSIS_func : String) : Integer; +function PopString(): NSISTString; +procedure PushString(const str: NSISTString=''); +function GetUserVariable(const varnum: TVariableList): NSISTString; +procedure SetUserVariable(const varnum: TVariableList; const value: NSISTString); +procedure NSISDialog(const text, caption: NSISTString; const buttons: integer); + +implementation + +procedure Init(const hwndParent: HWND; const string_size: integer; const variables: NSISPTChar; const stacktop: pointer; const extraparameters: pointer = nil); +begin + g_stringsize := string_size; + g_hwndParent := hwndParent; + g_stacktop := stacktop; + g_variables := variables; + g_hwndList := FindWindowEx(FindWindowEx(g_hwndParent, 0, '#32770', nil), 0,'SysListView32', nil); + g_extraparameters := extraparameters; +end; + + +function Call(NSIS_func : String) : Integer; +var + codeoffset: Integer; //The ID of nsis function +begin + Result := 0; + codeoffset := StrToIntDef(NSIS_func, 0); + if (codeoffset <> 0) and (g_extraparameters <> nil) then + begin + codeoffset := codeoffset - 1; + Result := g_extraparameters.exec_code_segment(codeoffset, g_hwndParent); + end; +end; + +function LogMessage(Msg : String): BOOL; +var + ItemCount : Integer; + item: TLVItem; +begin + Result := FAlse; + if g_hwndList = 0 then exit; + FillChar( item, sizeof(item), 0 ); + ItemCount := SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); + item.iItem := ItemCount; + item.mask := LVIF_TEXT; + item.pszText := PChar(Msg); // Unicode bug? + ListView_InsertItem(g_hwndList, item); + ListView_EnsureVisible(g_hwndList, ItemCount, not 0); +end; + +function PopString(): NSISTString; +var + th: pstack_t; +begin + if NativeUInt(g_stacktop^) <> 0 then begin + th := g_stacktop^; + Result := NSISPTChar(@th.text); + g_stacktop^ := th.next; + GlobalFree(HGLOBAL(th)); + end; +end; + +procedure PushString(const str: NSISTString=''); +var + th: pstack_t; +begin + if NativeUInt(g_stacktop) <> 0 then begin +{$IFDEF UNICODE} + th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + (g_stringsize * 2))); + lstrcpynW(@th.text, PWideChar(str), g_stringsize); +{$ELSE} + th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + (g_stringsize ))); + lstrcpynA(@th.text, PAnsiChar(str), g_stringsize); +{$ENDIF} + th.next := g_stacktop^; + g_stacktop^ := th; + end; +end; + +function GetUserVariable(const varnum: TVariableList): NSISTString; +begin + if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then + Result := g_variables + integer(varnum) * g_stringsize + else + Result := ''; +end; + +procedure SetUserVariable(const varnum: TVariableList; const value: NSISTString); +begin + if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then +{$IFDEF UNICODE} + lstrcpyW(g_variables + integer(varnum) * (g_stringsize), PWideChar(value)) +{$ELSE} + lstrcpyA(g_variables + integer(varnum) * (g_stringsize), PAnsiChar(value)) +{$ENDIF} +end; + +procedure NSISDialog(const text, caption: NSISTString; const buttons: integer); +var + hwndOwner: HWND; +begin + hwndOwner := g_hwndParent; + if not IsWindow(g_hwndParent) then hwndOwner := 0; // g_hwndParent is not valid in NSPIM_[GUI]UNLOAD +{$IFDEF UNICODE} + MessageBoxW(hwndOwner, PWideChar(text), PWideChar(caption), buttons); +{$ELSE} + MessageBoxA(hwndOwner, PAnsiChar(text), PAnsiChar(caption), buttons); +{$ENDIF} +end; + +begin + +end. + diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/nsis/api.h b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/api.h new file mode 100644 index 0000000000..8d7b557e92 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/api.h @@ -0,0 +1,85 @@ +/* + * apih + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2026 Nullsoft and Contributors + * + * Licensed under the zlib/libpng license (the "License"); + * you may not use this file except in compliance with the License. + * + * Licence details can be found in the file COPYING. + * + * This software is provided 'as-is', without any express or implied + * warranty. + */ + +#ifndef _NSIS_EXEHEAD_API_H_ +#define _NSIS_EXEHEAD_API_H_ + +// Starting with NSIS 2.42, you can check the version of the plugin API in exec_flags->plugin_api_version +// The format is 0xXXXXYYYY where X is the major version and Y is the minor version (MAKELONG(y,x)) +// When doing version checks, always remember to use >=, ex: if (pX->exec_flags->plugin_api_version >= NSISPIAPIVER_1_0) {} + +#define NSISPIAPIVER_1_0 0x00010000 +#define NSISPIAPIVER_CURR NSISPIAPIVER_1_0 + +// NSIS Plug-In Callback Messages +enum NSPIM +{ + NSPIM_UNLOAD, // This is the last message a plugin gets, do final cleanup + NSPIM_GUIUNLOAD, // Called after .onGUIEnd +}; + +// Prototype for callbacks registered with extra_parameters->RegisterPluginCallback() +// Return NULL for unknown messages +// Should always be __cdecl for future expansion possibilities +typedef UINT_PTR (*NSISPLUGINCALLBACK)(enum NSPIM); + +// extra_parameters data structure containing other interesting stuff +// besides the stack, variables and HWND passed on to plug-ins. +typedef struct +{ + int autoclose; // SetAutoClose + int all_user_var; // SetShellVarContext: User context = 0, Machine context = 1 + int exec_error; // IfErrors/ClearErrors/SetErrors + int abort; // IfAbort + int exec_reboot; // IfRebootFlag/SetRebootFlag (NSIS_SUPPORT_REBOOT) + int reboot_called; // NSIS_SUPPORT_REBOOT + int XXX_cur_insttype; // Deprecated + int plugin_api_version; // Plug-in ABI. See NSISPIAPIVER_CURR (Note: used to be XXX_insttype_changed) + int silent; // IfSilent/SetSilent (NSIS_CONFIG_SILENT_SUPPORT) + int instdir_error; // GetInstDirError + int rtl; // IfRtlLanguage: 1 if $LANGUAGE is a RTL language + int errlvl; // SetErrorLevel + int alter_reg_view; // SetRegView: Default View = 0, Alternative View = (sizeof(void*) > 4 ? KEY_WOW64_32KEY : KEY_WOW64_64KEY) + int status_update; // SetDetailsPrint +} exec_flags_t; + +#ifndef NSISCALL +# define NSISCALL __stdcall +#endif +#if !defined(_WIN32) && !defined(LPTSTR) +# define LPTSTR TCHAR* +#endif + +typedef struct { + exec_flags_t *exec_flags; + int (NSISCALL *ExecuteCodeSegment)(int, HWND); + void (NSISCALL *validate_filename)(LPTSTR); + int (NSISCALL *RegisterPluginCallback)(HMODULE, NSISPLUGINCALLBACK); // returns 0 on success, 1 if already registered and < 0 on errors +} extra_parameters; + +// Definitions for page showing plug-ins +// See Ui.c to understand better how they're used + +// sent to the outer window to tell it to go to the next inner window +#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8) + +// custom pages should send this message to let NSIS know they're ready +#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd) + +// sent as wParam with WM_NOTIFY_OUTER_NEXT when user cancels - heed its warning +#define NOTIFY_BYE_BYE 'x' + +#endif /* _NSIS_EXEHEAD_API_H_ */ diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/nsis/nsis_tchar.h b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/nsis_tchar.h new file mode 100644 index 0000000000..5013e356b5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/nsis_tchar.h @@ -0,0 +1,229 @@ +/* + * nsis_tchar.h + * + * This file is a part of NSIS. + * + * Copyright (C) 1999-2026 Nullsoft and Contributors + * + * This software is provided 'as-is', without any express or implied + * warranty. + * + * For Unicode support by Jim Park -- 08/30/2007 + */ + +// Jim Park: Only those we use are listed here. + +#pragma once + +#ifdef _UNICODE + +#ifndef _T +#define __T(x) L ## x +#define _T(x) __T(x) +#define _TEXT(x) __T(x) +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +#if !defined(_NATIVE_WCHAR_T_DEFINED) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short TCHAR; +#else +typedef wchar_t TCHAR; +#endif +#endif + + +// program +#define _tenviron _wenviron +#define __targv __wargv + +// printfs +#define _ftprintf fwprintf +#define _sntprintf _snwprintf +#if (defined(_MSC_VER) && (_MSC_VER<=1310||_MSC_FULL_VER<=140040310)) || defined(__MINGW32__) +# define _stprintf swprintf +#else +# define _stprintf _swprintf +#endif +#define _tprintf wprintf +#define _vftprintf vfwprintf +#define _vsntprintf _vsnwprintf +#if defined(_MSC_VER) && (_MSC_VER<=1310) +# define _vstprintf vswprintf +#else +# define _vstprintf _vswprintf +#endif + +// scanfs +#define _tscanf wscanf +#define _stscanf swscanf + +// string manipulations +#define _tcscat wcscat +#define _tcschr wcschr +#define _tcsclen wcslen +#define _tcscpy wcscpy +#define _tcsdup _wcsdup +#define _tcslen wcslen +#define _tcsnccpy wcsncpy +#define _tcsncpy wcsncpy +#define _tcsrchr wcsrchr +#define _tcsstr wcsstr +#define _tcstok wcstok + +// string comparisons +#define _tcscmp wcscmp +#define _tcsicmp _wcsicmp +#define _tcsncicmp _wcsnicmp +#define _tcsncmp wcsncmp +#define _tcsnicmp _wcsnicmp + +// upper / lower +#define _tcslwr _wcslwr +#define _tcsupr _wcsupr +#define _totlower towlower +#define _totupper towupper + +// conversions to numbers +#define _tcstoi64 _wcstoi64 +#define _tcstol wcstol +#define _tcstoul wcstoul +#define _tstof _wtof +#define _tstoi _wtoi +#define _tstoi64 _wtoi64 +#define _ttoi _wtoi +#define _ttoi64 _wtoi64 +#define _ttol _wtol + +// conversion from numbers to strings +#define _itot _itow +#define _ltot _ltow +#define _i64tot _i64tow +#define _ui64tot _ui64tow + +// file manipulations +#define _tfopen _wfopen +#define _topen _wopen +#define _tremove _wremove +#define _tunlink _wunlink + +// reading and writing to i/o +#define _fgettc fgetwc +#define _fgetts fgetws +#define _fputts fputws +#define _gettchar getwchar + +// directory +#define _tchdir _wchdir + +// environment +#define _tgetenv _wgetenv +#define _tsystem _wsystem + +// time +#define _tcsftime wcsftime + +#else // ANSI + +#ifndef _T +#define _T(x) x +#define _TEXT(x) x +#endif + +#ifndef _TCHAR_DEFINED +#define _TCHAR_DEFINED +typedef char TCHAR; +#endif + +// program +#define _tenviron environ +#define __targv __argv + +// printfs +#define _ftprintf fprintf +#define _sntprintf _snprintf +#define _stprintf sprintf +#define _tprintf printf +#define _vftprintf vfprintf +#define _vsntprintf _vsnprintf +#define _vstprintf vsprintf + +// scanfs +#define _tscanf scanf +#define _stscanf sscanf + +// string manipulations +#define _tcscat strcat +#define _tcschr strchr +#define _tcsclen strlen +#define _tcscnlen strnlen +#define _tcscpy strcpy +#define _tcsdup _strdup +#define _tcslen strlen +#define _tcsnccpy strncpy +#define _tcsrchr strrchr +#define _tcsstr strstr +#define _tcstok strtok + +// string comparisons +#define _tcscmp strcmp +#define _tcsicmp _stricmp +#define _tcsncmp strncmp +#define _tcsncicmp _strnicmp +#define _tcsnicmp _strnicmp + +// upper / lower +#define _tcslwr _strlwr +#define _tcsupr _strupr + +#define _totupper toupper +#define _totlower tolower + +// conversions to numbers +#define _tcstol strtol +#define _tcstoul strtoul +#define _tstof atof +#define _tstoi atoi +#define _tstoi64 _atoi64 +#define _tstoi64 _atoi64 +#define _ttoi atoi +#define _ttoi64 _atoi64 +#define _ttol atol + +// conversion from numbers to strings +#define _i64tot _i64toa +#define _itot _itoa +#define _ltot _ltoa +#define _ui64tot _ui64toa + +// file manipulations +#define _tfopen fopen +#define _topen _open +#define _tremove remove +#define _tunlink _unlink + +// reading and writing to i/o +#define _fgettc fgetc +#define _fgetts fgets +#define _fputts fputs +#define _gettchar getchar + +// directory +#define _tchdir _chdir + +// environment +#define _tgetenv getenv +#define _tsystem system + +// time +#define _tcsftime strftime + +#endif + +// is functions (the same in Unicode / ANSI) +#define _istgraph isgraph +#define _istascii __isascii + +#define __TFILE__ _T(__FILE__) +#define __TDATE__ _T(__DATE__) +#define __TTIME__ _T(__TIME__) diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi-x86-ansi.lib b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi-x86-ansi.lib new file mode 100644 index 0000000000000000000000000000000000000000..032b2fb36707afb95bc3c418fb730f8969ae5b00 GIT binary patch literal 7004 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi.h b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi.h new file mode 100644 index 0000000000..63fe7901ab --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Plugin/nsis/pluginapi.h @@ -0,0 +1,108 @@ +#ifndef ___NSIS_PLUGIN__H___ +#define ___NSIS_PLUGIN__H___ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "api.h" +#include "nsis_tchar.h" // BUGBUG: Why cannot our plugins use the compilers tchar.h? + +#ifndef NSISCALL +# define NSISCALL WINAPI +#endif + +#define EXDLL_INIT() { \ + g_stringsize=string_size; \ + g_stacktop=stacktop; \ + g_variables=variables; } + +typedef struct _stack_t { + struct _stack_t *next; +#ifdef UNICODE + WCHAR text[1]; // this should be the length of g_stringsize when allocating +#else + char text[1]; +#endif +} stack_t; + +enum +{ +INST_0, // $0 +INST_1, // $1 +INST_2, // $2 +INST_3, // $3 +INST_4, // $4 +INST_5, // $5 +INST_6, // $6 +INST_7, // $7 +INST_8, // $8 +INST_9, // $9 +INST_R0, // $R0 +INST_R1, // $R1 +INST_R2, // $R2 +INST_R3, // $R3 +INST_R4, // $R4 +INST_R5, // $R5 +INST_R6, // $R6 +INST_R7, // $R7 +INST_R8, // $R8 +INST_R9, // $R9 +INST_CMDLINE, // $CMDLINE +INST_INSTDIR, // $INSTDIR +INST_OUTDIR, // $OUTDIR +INST_EXEDIR, // $EXEDIR +INST_LANG, // $LANGUAGE +__INST_LAST +}; + +extern unsigned int g_stringsize; +extern stack_t **g_stacktop; +extern LPTSTR g_variables; + +void NSISCALL pushstring(LPCTSTR str); +void NSISCALL pushintptr(INT_PTR value); +#define pushint(v) pushintptr((INT_PTR)(v)) +int NSISCALL popstring(LPTSTR str); // 0 on success, 1 on empty stack +int NSISCALL popstringn(LPTSTR str, int maxlen); // with length limit, pass 0 for g_stringsize +INT_PTR NSISCALL popintptr(); +#define popint() ( (int) popintptr() ) +int NSISCALL popint_or(); // with support for or'ing (2|4|8) +INT_PTR NSISCALL nsishelper_str_to_ptr(LPCTSTR s); +#define myatoi(s) ( (int) nsishelper_str_to_ptr(s) ) // converts a string to an integer +unsigned int NSISCALL myatou(LPCTSTR s); // converts a string to an unsigned integer, decimal only +int NSISCALL myatoi_or(LPCTSTR s); // with support for or'ing (2|4|8) +LPTSTR NSISCALL getuservariable(const int varnum); +void NSISCALL setuservariable(const int varnum, LPCTSTR var); + +#ifdef UNICODE +#define PopStringW(x) popstring(x) +#define PushStringW(x) pushstring(x) +#define SetUserVariableW(x,y) setuservariable(x,y) + +int NSISCALL PopStringA(LPSTR ansiStr); +void NSISCALL PushStringA(LPCSTR ansiStr); +void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr); +void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr); +void NSISCALL SetUserVariableA(const int varnum, LPCSTR ansiStr); + +#else +// ANSI defs + +#define PopStringA(x) popstring(x) +#define PushStringA(x) pushstring(x) +#define SetUserVariableA(x,y) setuservariable(x,y) + +int NSISCALL PopStringW(LPWSTR wideStr); +void NSISCALL PushStringW(LPWSTR wideStr); +void NSISCALL GetUserVariableW(const int varnum, LPWSTR wideStr); +void NSISCALL GetUserVariableA(const int varnum, LPSTR ansiStr); +void NSISCALL SetUserVariableW(const int varnum, LPCWSTR wideStr); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif//!___NSIS_PLUGIN__H___ diff --git a/libs/NSIS/NSIS-source/Examples/Splash/Example.nsi b/libs/NSIS/NSIS-source/Examples/Splash/Example.nsi new file mode 100644 index 0000000000..2cc62b52cd --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/Splash/Example.nsi @@ -0,0 +1,21 @@ +Name "Splash.dll test" + +OutFile "Splash Test.exe" + +XPStyle on + +Function .onInit + # the plugins dir is automatically deleted when the installer exits + InitPluginsDir + File /oname=$PLUGINSDIR\splash.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp" + #optional + #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav" + + splash::show 1000 $PLUGINSDIR\splash + + Pop $0 ; $0 has '1' if the user closed the splash screen early, + ; '0' if everything closed normally, and '-1' if some error occurred. +FunctionEnd + +Section +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/StartMenu/Example.nsi b/libs/NSIS/NSIS-source/Examples/StartMenu/Example.nsi new file mode 100644 index 0000000000..c5c9d04b5d --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/StartMenu/Example.nsi @@ -0,0 +1,50 @@ +Name "StartMenu.dll test" + +OutFile "StartMenu Test.exe" + +XPStyle on + +Page directory +DirText "This installer will create some shortcuts to MakeNSIS in the start menu.$\nFor this it needs NSIS's path." \ + "Please specify the path in which you have installed NSIS:" +InstallDir "${NSISDIR}" +Function .onVerifyInstDir + IfFileExists $INSTDIR\makensis.exe +2 + Abort +FunctionEnd + +Page custom StartMenuGroupSelect "" ": Start Menu Folder" +Function StartMenuGroupSelect + Push $R1 + + StartMenu::Select /checknoshortcuts "Don't create a start menu folder" /autoadd /lastused $R0 "StartMenu.dll test" + Pop $R1 + + StrCmp $R1 "success" success + StrCmp $R1 "cancel" done + ; error + MessageBox MB_OK $R1 + StrCpy $R0 "StartMenu.dll test" # use default + Return + success: + Pop $R0 + + done: + Pop $R1 +FunctionEnd + +Page instfiles +Section + # this part is only necessary if you used /checknoshortcuts + StrCpy $R1 $R0 1 + StrCmp $R1 ">" skip + + CreateDirectory $SMPROGRAMS\$R0 + CreateShortcut $SMPROGRAMS\$R0\MakeNSISw.lnk $INSTDIR\makensisw.exe + + SetShellVarContext All + CreateDirectory $SMPROGRAMS\$R0 + CreateShortcut "$SMPROGRAMS\$R0\All users MakeNSISw.lnk" $INSTDIR\makensisw.exe + + skip: +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/StrFunc.nsi b/libs/NSIS/NSIS-source/Examples/StrFunc.nsi new file mode 100644 index 0000000000..2c52231bab --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/StrFunc.nsi @@ -0,0 +1,562 @@ +Name "NSIS StrFunc Example" +OutFile "StrFunc.exe" +ShowInstDetails show +ShowUninstDetails show +XPStyle on +RequestExecutionLevel user + +!include "StrFunc.nsh" + +# Declare used functions +${StrCase} +${StrClb} +${StrIOToNSIS} +${StrLoc} +${StrNSISToIO} +${StrRep} +${StrStr} +${StrStrAdv} +${StrTok} +${StrTrimNewLines} +${StrSort} + +${UnStrCase} +${UnStrClb} +${UnStrIOToNSIS} +${UnStrLoc} +${UnStrNSISToIO} +${UnStrRep} +${UnStrStr} +${UnStrStrAdv} +${UnStrTok} +${UnStrTrimNewLines} +${UnStrSort} + + +Var SFPass +Var SFTotl +!macro EndStrFuncTestEx lbl name + IfErrors ${lbl} + DetailPrint "PASSED ${name} test" + IntOp $SFPass $SFPass + 1 + IntOp $SFTotl $SFTotl + 1 + Goto +3 +${lbl}: + DetailPrint "FAILED ${name} test" + IntOp $SFTotl $SFTotl + 1 +!macroend +!macro EndStrFuncTest name + !insertmacro EndStrFuncTestEx "${name}error" "${name}" +!macroend + +CompletedText "Passed $SFPass of $SFTotl tests" +!macro CompletedAllTests + StrCmp $SFPass $SFTotl +2 + SetErrorLevel 42 +!macroend + +!macro StackVerificationStart + StrCpy $0 S0 + StrCpy $1 S1 + StrCpy $2 S2 + StrCpy $3 S3 + StrCpy $4 S4 + StrCpy $5 S5 + StrCpy $6 S6 + StrCpy $7 S7 + StrCpy $8 S8 + StrCpy $9 S9 + StrCpy $R0 SR0 + StrCpy $R1 SR1 + StrCpy $R2 SR2 + StrCpy $R3 SR3 + StrCpy $R4 SR4 + StrCpy $R5 SR5 + StrCpy $R6 SR6 + StrCpy $R7 SR7 + StrCpy $R8 SR8 + StrCpy $R9 SR9 +!macroend + +!macro StackVerificationEnd + ClearErrors + ${If} $1 != "S1" + ${OrIf} $2 != "S2" + ${OrIf} $3 != "S3" + ${OrIf} $4 != "S4" + ${OrIf} $5 != "S5" + ${OrIf} $6 != "S6" + ${OrIf} $7 != "S7" + ${OrIf} $8 != "S8" + ${OrIf} $9 != "S9" + ${OrIf} $R0 != "SR0" + ${OrIf} $R1 != "SR1" + ${OrIf} $R2 != "SR2" + ${OrIf} $R3 != "SR3" + ${OrIf} $R4 != "SR4" + ${OrIf} $R5 != "SR5" + ${OrIf} $R6 != "SR6" + ${OrIf} $R7 != "SR7" + ${OrIf} $R8 != "SR8" + ${OrIf} $R9 != "SR9" + SetErrors + ${EndIf} +!macroend + +Section + + # Test case conversion + !insertmacro StackVerificationStart + ${StrCase} $0 "This is just an example. A very simple one." "" + StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror + ${StrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" + StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror + ${StrCase} $0 "This is just an example. A very simple one." "L" + StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror + ${StrCase} $0 "This is just an example. A very simple one." "U" + StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror + ${StrCase} $0 "This is just an example. A very simple one." "T" + StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror + ${StrCase} $0 "This is just an example. A very simple one." "<>" + StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror + ${StrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" + StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror + ${StrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" + StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror + ${StrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" + StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrCase + + # Test clipboard function + !insertmacro StackVerificationStart + !verbose push 4 + ${StrClb} $0 "StrFunc clipboard test" ">" + !verbose pop + StrCmp $0 "" 0 strclberror + ${StrClb} $0 "StrFunc clipboard test #2" "<>" + StrCmp $0 "StrFunc clipboard test" 0 strclberror + ${StrClb} $0 "" "<" + StrCmp $0 "StrFunc clipboard test #2" 0 strclberror + ${StrClb} $0 "" "" + StrCmp $0 "" 0 strclberror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrClb + + # Test IO functions + !insertmacro StackVerificationStart + !macro testio str + ${StrNSISToIO} $0 "${str}" + ${StrIOToNSIS} $0 $0 + StrCmp $0 "${str}" 0 ioerror + !macroend + !insertmacro testio "$\rtest$\n" + !insertmacro testio "test$\n" + !insertmacro testio "$\rtest" + !insertmacro testio "test" + !insertmacro testio "$\r\$\t$\n" + !insertmacro testio "$\r \ $\t $\n $$" + !insertmacro testio "" + !insertmacro testio " " + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTestEx ioerror "StrNSISToIO/StrIOToNSIS" + + # Test string search functions + !insertmacro StackVerificationStart + ${StrLoc} $0 "This is just an example" "just" "<" + StrCmp $0 "11" 0 strlocerror + ${StrLoc} $0 a abc < + StrCmp $0 "" 0 strlocerror + ${StrLoc} $0 a abc > + StrCmp $0 "" 0 strlocerror + ${StrLoc} $0 abc a > + StrCmp $0 "0" 0 strlocerror + ${StrLoc} $0 abc b > + StrCmp $0 "1" 0 strlocerror + ${StrLoc} $0 abc c > + StrCmp $0 "2" 0 strlocerror + ${StrLoc} $0 abc a < + StrCmp $0 "2" 0 strlocerror + ${StrLoc} $0 abc b < + StrCmp $0 "1" 0 strlocerror + ${StrLoc} $0 abc c < + StrCmp $0 "0" 0 strlocerror + ${StrLoc} $0 abc d < + StrCmp $0 "" 0 strlocerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrLoc + + # Test string replacement + !insertmacro StackVerificationStart + ${StrRep} $0 "This is just an example" "an" "one" + StrCmp $0 "This is just one example" 0 strreperror + ${StrRep} $0 "test... test... 1 2 3..." "test" "testing" + StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror + ${StrRep} $0 "" "test" "testing" + StrCmp $0 "" 0 strreperror + ${StrRep} $0 "test" "test" "testing" + StrCmp $0 "testing" 0 strreperror + ${StrRep} $0 "test" "test" "" + StrCmp $0 "" 0 strreperror + ${StrRep} $0 "test" "" "abc" + StrCmp $0 "test" 0 strreperror + ${StrRep} $0 "test" "" "" + StrCmp $0 "test" 0 strreperror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrRep + + # Test sorting + !insertmacro StackVerificationStart + ${StrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" + StrCmp $0 "This is an exam" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "j" " " "0" "" "0" + StrCmp $0 "just" 0 strsorterror + ${StrSort} $0 "This is just an example" "" "j" "" "0" "1" "0" + StrCmp $0 "This is just an example" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "us" "" "0" "1" "0" + StrCmp $0 "just an example" 0 strsorterror + ${StrSort} $0 "This is just an example" "" "u" " " "0" "1" "0" + StrCmp $0 "This is just" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "just" " " "0" "1" "0" + StrCmp $0 "just" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "t" " " "0" "1" "0" + StrCmp $0 "This" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "le" " " "0" "1" "0" + StrCmp $0 "example" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "le" " " "1" "0" "0" + StrCmp $0 " examp" 0 strsorterror + ${StrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0" + StrCmp $0 "error" 0 strsorterror + ${StrSort} $0 "" " " "something" " " "0" "1" "0" + StrCmp $0 "" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "j" " " "" "" "" + StrCmp $0 " just " 0 strsorterror + ${StrSort} $0 "This is just an example" " " "j" " " "1" "0" "1" + StrCmp $0 " ust " 0 strsorterror + ${StrSort} $0 "This is just an example" "" "j" "" "0" "0" "1" + StrCmp $0 "This is ust an example" 0 strsorterror + ${StrSort} $0 "This is just an example" " " "us" "" "1" "0" "0" + StrCmp $0 " jt an example" 0 strsorterror + ${StrSort} $0 "This is just an example" "" "u" " " "0" "0" "1" + StrCmp $0 "This is jst " 0 strsorterror + ${StrSort} $0 "This is just an example" " " "just" " " "1" "0" "1" + StrCmp $0 " " 0 strsorterror + ${StrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0" + StrCmp $0 " rror " 0 strsorterror + ${StrSort} $0 "" " " "something" " " "1" "0" "1" + StrCmp $0 "" 0 strsorterror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrSort + + !insertmacro StackVerificationStart + ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" + StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror + ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" + StrCmp $0 "" 0 strstrerror + ${StrStr} $0 "abcefghijklmnopqrstuvwxyz" "" + StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror + ${StrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" + StrCmp $0 "" 0 strstrerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrStr + + !insertmacro StackVerificationStart + ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" + StrCmp $0 "abcabcabc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0" + StrCmp $0 "abc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0" + StrCmp $0 "" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0" + StrCmp $0 "abc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0" + StrCmp $0 "abcabcabc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0" + StrCmp $0 "" 0 strstradverror + ${StrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" + StrCmp $0 "abc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" + StrCmp $0 "abcabc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" + StrCmp $0 "abc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1" + StrCmp $0 "" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1" + StrCmp $0 "" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1" + StrCmp $0 "ABCabcabc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1" + StrCmp $0 "ABCabc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1" + StrCmp $0 "ABCabcabc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1" + StrCmp $0 "ABCabc" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1" + StrCmp $0 "" 0 strstradverror + ${StrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" + StrCmp $0 "abc" 0 strstradverror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrStrAdv + + # Test tokenizer + !insertmacro StackVerificationStart + ${StrTok} $0 "This is, or is not, just an example" " ," "4" "1" + StrCmp $0 "not" 0 strtokerror + ${StrTok} $0 "This is, or is not, just an example" " ," "4" "0" + StrCmp $0 "is" 0 strtokerror + ${StrTok} $0 "This is, or is not, just an example" " ," "152" "0" + StrCmp $0 "" 0 strtokerror + ${StrTok} $0 "This is, or is not, just an example" " ," "" "0" + StrCmp $0 "example" 0 strtokerror + ${StrTok} $0 "This is, or is not, just an example" " ," "L" "0" + StrCmp $0 "example" 0 strtokerror + ${StrTok} $0 "This is, or is not, just an example" " ," "0" "0" + StrCmp $0 "This" 0 strtokerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrTok + + # Test trim new lines + !insertmacro StackVerificationStart + ${StrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" + StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrTrimNewlines + + InitPluginsDir + WriteUninstaller $PluginsDir\UnStrFunc.exe + ExecWait '"$PluginsDir\UnStrFunc.exe" _?=$PluginsDir' + + !insertmacro CompletedAllTests +SectionEnd + +Section Uninstall + + # Test case conversion + !insertmacro StackVerificationStart + ${UnStrCase} $0 "This is just an example. A very simple one." "" + StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror + ${UnStrCase} $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." "S" + StrCmp $0 "This is just an example. A very simple one." 0 strcaseerror + ${UnStrCase} $0 "This is just an example. A very simple one." "L" + StrCmp $0 "this is just an example. a very simple one." 0 strcaseerror + ${UnStrCase} $0 "This is just an example. A very simple one." "U" + StrCmp $0 "THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE." 0 strcaseerror + ${UnStrCase} $0 "This is just an example. A very simple one." "T" + StrCmp $0 "This Is Just An Example. A Very Simple One." 0 strcaseerror + ${UnStrCase} $0 "This is just an example. A very simple one." "<>" + StrCmp $0 "tHIS IS JUST AN EXAMPLE. a VERY SIMPLE ONE." 0 strcaseerror + ${UnStrCase} $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" "S" + StrCmp $0 "123456789!@#%^&*()-_=+[]{};:,./<>?" 0 strcaseerror + ${UnStrCase} $0 "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#%^&*()abcdefghijklmnopqrstuvwxyz-_=+[]{};:,./<>?" "<>" + StrCmp $0 "123456789abcdefghijklmnopqrstuvwxyz!@#%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+[]{};:,./<>?" 0 strcaseerror + ${UnStrCase} $0 "what about taking a shower tomorrow? it's late to do so now! try to sleep now. Good Night!" "S" + StrCmp $0 "What about taking a shower tomorrow? It's late to do so now! Try to sleep now. Good night!" 0 strcaseerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrCase + + # Test clipboard function + !insertmacro StackVerificationStart + ${UnStrClb} $0 "StrFunc clipboard test" ">" + StrCmp $0 "" 0 strclberror + ${UnStrClb} $0 "StrFunc clipboard test #2" "<>" + StrCmp $0 "StrFunc clipboard test" 0 strclberror + ${UnStrClb} $0 "" "<" + StrCmp $0 "StrFunc clipboard test #2" 0 strclberror + ${UnStrClb} $0 "" "" + StrCmp $0 "" 0 strclberror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrClb + + # Test IO functions + !insertmacro StackVerificationStart + !macro untestio str + ${UnStrNSISToIO} $0 "${str}" + ${UnStrIOToNSIS} $0 $0 + StrCmp $0 "${str}" 0 ioerror + !macroend + !insertmacro untestio "$\rtest$\n" + !insertmacro untestio "test$\n" + !insertmacro untestio "$\rtest" + !insertmacro untestio "test" + !insertmacro untestio "$\r\$\t$\n" + !insertmacro untestio "$\r \ $\t $\n $$" + !insertmacro untestio "" + !insertmacro untestio " " + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTestEx ioerror "StrNSISToIO/StrIOToNSIS" + + # Test string search functions + !insertmacro StackVerificationStart + ${UnStrLoc} $0 "This is just an example" "just" "<" + StrCmp $0 "11" 0 strlocerror + ${UnStrLoc} $0 a abc < + StrCmp $0 "" 0 strlocerror + ${UnStrLoc} $0 a abc > + StrCmp $0 "" 0 strlocerror + ${UnStrLoc} $0 abc a > + StrCmp $0 "0" 0 strlocerror + ${UnStrLoc} $0 abc b > + StrCmp $0 "1" 0 strlocerror + ${UnStrLoc} $0 abc c > + StrCmp $0 "2" 0 strlocerror + ${UnStrLoc} $0 abc a < + StrCmp $0 "2" 0 strlocerror + ${UnStrLoc} $0 abc b < + StrCmp $0 "1" 0 strlocerror + ${UnStrLoc} $0 abc c < + StrCmp $0 "0" 0 strlocerror + ${UnStrLoc} $0 abc d < + StrCmp $0 "" 0 strlocerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrLoc + + # Test string replacement + !insertmacro StackVerificationStart + ${UnStrRep} $0 "This is just an example" "an" "one" + StrCmp $0 "This is just one example" 0 strreperror + ${UnStrRep} $0 "test... test... 1 2 3..." "test" "testing" + StrCmp $0 "testing... testing... 1 2 3..." 0 strreperror + ${UnStrRep} $0 "" "test" "testing" + StrCmp $0 "" 0 strreperror + ${UnStrRep} $0 "test" "test" "testing" + StrCmp $0 "testing" 0 strreperror + ${UnStrRep} $0 "test" "test" "" + StrCmp $0 "" 0 strreperror + ${UnStrRep} $0 "test" "" "abc" + StrCmp $0 "test" 0 strreperror + ${UnStrRep} $0 "test" "" "" + StrCmp $0 "test" 0 strreperror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrRep + + # Test sorting + !insertmacro StackVerificationStart + ${UnStrSort} $0 "This is just an example" "" " just" "ple" "0" "0" "0" + StrCmp $0 "This is an exam" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "j" " " "0" "" "0" + StrCmp $0 "just" 0 strsorterror + ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "1" "0" + StrCmp $0 "This is just an example" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "us" "" "0" "1" "0" + StrCmp $0 "just an example" 0 strsorterror + ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "1" "0" + StrCmp $0 "This is just" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "just" " " "0" "1" "0" + StrCmp $0 "just" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "t" " " "0" "1" "0" + StrCmp $0 "This" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "le" " " "0" "1" "0" + StrCmp $0 "example" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "le" " " "1" "0" "0" + StrCmp $0 " examp" 0 strsorterror + ${UnStrSort} $0 "an error has occurred" " " "e" " " "0" "1" "0" + StrCmp $0 "error" 0 strsorterror + ${UnStrSort} $0 "" " " "something" " " "0" "1" "0" + StrCmp $0 "" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "j" " " "" "" "" + StrCmp $0 " just " 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "j" " " "1" "0" "1" + StrCmp $0 " ust " 0 strsorterror + ${UnStrSort} $0 "This is just an example" "" "j" "" "0" "0" "1" + StrCmp $0 "This is ust an example" 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "us" "" "1" "0" "0" + StrCmp $0 " jt an example" 0 strsorterror + ${UnStrSort} $0 "This is just an example" "" "u" " " "0" "0" "1" + StrCmp $0 "This is jst " 0 strsorterror + ${UnStrSort} $0 "This is just an example" " " "just" " " "1" "0" "1" + StrCmp $0 " " 0 strsorterror + ${UnStrSort} $0 "an error has occurred" " " "e" "h" "1" "0" "0" + StrCmp $0 " rror " 0 strsorterror + ${UnStrSort} $0 "" " " "something" " " "1" "0" "1" + StrCmp $0 "" 0 strsorterror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrSort + + !insertmacro StackVerificationStart + ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "g" + StrCmp $0 "ghijklmnopqrstuvwxyz" 0 strstrerror + ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "ga" + StrCmp $0 "" 0 strstrerror + ${UnStrStr} $0 "abcefghijklmnopqrstuvwxyz" "" + StrCmp $0 "abcefghijklmnopqrstuvwxyz" 0 strstrerror + ${UnStrStr} $0 "a" "abcefghijklmnopqrstuvwxyz" + StrCmp $0 "" 0 strstrerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrStr + + !insertmacro StackVerificationStart + ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "0" "0" + StrCmp $0 "abcabcabc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "1" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "2" "0" + StrCmp $0 "abc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "a" ">" ">" "1" "3" "0" + StrCmp $0 "" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "1" "1" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" ">" "<" "0" "1" "0" + StrCmp $0 "abc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "1" "0" "0" + StrCmp $0 "abcabcabc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" "<" "0" "0" "0" + StrCmp $0 "abcabc" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "0" "0" + StrCmp $0 "" 0 strstradverror + ${UnStrStrAdv} $0 "abcabcabc" "abc" "<" ">" "0" "1" "0" + StrCmp $0 "abc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "0" "1" + StrCmp $0 "abcabc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "1" "1" + StrCmp $0 "abc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "2" "1" + StrCmp $0 "" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "a" ">" ">" "1" "3" "1" + StrCmp $0 "" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "1" "1" "1" + StrCmp $0 "ABCabcabc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" ">" "<" "0" "1" "1" + StrCmp $0 "ABCabc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "1" "0" "1" + StrCmp $0 "ABCabcabc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" "<" "0" "0" "1" + StrCmp $0 "ABCabc" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "0" "1" + StrCmp $0 "" 0 strstradverror + ${UnStrStrAdv} $0 "ABCabcabc" "abc" "<" ">" "0" "1" "1" + StrCmp $0 "abc" 0 strstradverror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrStrAdv + + # Test tokenizer + !insertmacro StackVerificationStart + ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "1" + StrCmp $0 "not" 0 strtokerror + ${UnStrTok} $0 "This is, or is not, just an example" " ," "4" "0" + StrCmp $0 "is" 0 strtokerror + ${UnStrTok} $0 "This is, or is not, just an example" " ," "152" "0" + StrCmp $0 "" 0 strtokerror + ${UnStrTok} $0 "This is, or is not, just an example" " ," "" "0" + StrCmp $0 "example" 0 strtokerror + ${UnStrTok} $0 "This is, or is not, just an example" " ," "L" "0" + StrCmp $0 "example" 0 strtokerror + ${UnStrTok} $0 "This is, or is not, just an example" " ," "0" "0" + StrCmp $0 "This" 0 strtokerror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrTok + + # Test trim new lines + !insertmacro StackVerificationStart + ${UnStrTrimNewLines} $0 "$\r$\ntest$\r$\ntest$\r$\n" + StrCmp $0 "$\r$\ntest$\r$\ntest" 0 strtrimnewlineserror + !insertmacro StackVerificationEnd + !insertmacro EndStrFuncTest StrTrimNewLines + + !insertmacro CompletedAllTests +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/System/Resource.dll b/libs/NSIS/NSIS-source/Examples/System/Resource.dll new file mode 100644 index 0000000000000000000000000000000000000000..02d533d2d2b8f2d90c139c6cf2cfa7f8f39ccd54 GIT binary patch literal 31744 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 Fe*o#*q?rH! literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Examples/System/SysFunc.nsh b/libs/NSIS/NSIS-source/Examples/System/SysFunc.nsh new file mode 100644 index 0000000000..7a3e307917 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/System/SysFunc.nsh @@ -0,0 +1,395 @@ +; Some useful functions based on System plugin +; +; (c) brainsucker, 2002 +; (r) BSForce + + +!verbose push 3 +!ifndef SysFunc.NSH.Included +!define SysFunc.NSH.Included + +!include "System.nsh" +!include "WinMessages.nsh" + +; ================= GetInstallerExeName implementation ================= + +; Adopted Get Parameter function -> now it gets full installer.exe path +; input - nothing, output -> full path at the top of the stack +Function GetInstallerExeName + Push $R0 + Push $R1 + Push $R2 + StrCpy $R0 $CMDLINE 1 + StrCpy $R1 '"' + StrCpy $R2 1 + StrCmp $R0 '"' loop + StrCpy $R1 ' ' ; we're scanning for a space instead of a quote + loop: + StrCpy $R0 $CMDLINE 1 $R2 + StrCmp $R0 $R1 loop2 + StrCmp $R0 "" loop2 + IntOp $R2 $R2 + 1 + Goto loop + loop2: + + ; Ok, have we found last exename character or string end? + StrCmp $R0 "" "" +2 + IntOp $R2 $R2 - 1 ; last exename char + StrCmp $R1 ' ' +3 ; was first character the '"', or something other? + StrCpy $R1 1 ; it was quote + Goto +2 + StrCpy $R1 0 + IntOp $R2 $R2 - $R1 + StrCpy $R0 $CMDLINE $R2 $R1 + + SearchPath $R0 $R0 ; expand file name to full path + + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +; ================= systemGetFileSysTime implementation ================= + +!macro smGetFileSysTime FILENAME + Push ${FILENAME} + Call systemGetFileSysTime + Pop $R0 +!macroend + +; ----------------------------------------------------------------- +; systemGetFileSysTime (params on stack): +; FILENAME - name of file to get file time +; returns to stack (SYSTEMTIME struct addr) +; ----------------------------------------------------------------- + +; uses original method from NSIS +Function systemGetFileSysTime + System::Store "s r1" + + StrCpy $R0 0 + + ; create WIN32_FIND_DATA struct + System::Call '*${stWIN32_FIND_DATA} .r2' + + ; Find file info + System::Call '${sysFindFirstFile}(r1, r2) .r3' + + ; ok? + IntCmp $3 ${INVALID_HANDLE_VALUE} sgfst_exit + + ; close file search + System::Call '${sysFindClose}(r3)' + + ; Create systemtime struct for local time + System::Call '*${stSYSTEMTIME} .R0' + + ; Get File time + System::Call '*$2${stWIN32_FIND_DATA} (,,, .r3)' + + ; Convert file time (UTC) to local file time + System::Call '${sysFileTimeToLocalFileTime}(r3, .r1)' + + ; Convert file time to system time + System::Call '${sysFileTimeToSystemTime}(r1, R0)' + +sgfst_exit: + ; free used memory for WIN32_FIND_DATA struct + System::Free $2 + + System::Store "P0 l" +FunctionEnd + +; ================= systemMessageBox implementation ================= + +; return to $R0 +!macro smMessageBox MODULE MSG CAPTION STYLE ICON + Push "${ICON}" + Push "${STYLE}" + Push "${CAPTION}" + Push "${MSG}" + Push "${MODULE}" + Call systemMessageBox + Pop $R0 +!macroend + +; ----------------------------------------------------------------- +; systemMessageBox (params on stack): +; Module: either handle ("i HANDLE", HANDLE could be 0) or "modulename" +; Msg: text of message +; Caption: caption of message box window +; Style: style, buttons etc +; Icon: either icon handle ("i HANDLE") or resource name +; returns to stack +; ----------------------------------------------------------------- +Function systemMessageBox + System::Store "s r2r3r4r5r6" + + ; may be Module is module handle? + StrCpy $1 $2 + IntCmp $1 0 0 smbnext smbnext + + ; Get module handle + System::Call '${sysGetModuleHandle}($2) .r1' + IntCmp $1 0 loadlib libnotloaded libnotloaded + +loadlib: + ; Load module and get handle + System::Call '${sysLoadLibrary}($2) .r1' + IntCmp $1 0 0 smbnext smbnext + +libnotloaded: + ; Indicate that LoadLibrary wasn't used + StrCpy $2 1 + +smbnext: + ; Create MSGBOXPARAMS structure + System::Call '*${stMSGBOXPARAMS}(, $HWNDPARENT, r1, r3, r4, "$5|${MB_USERICON}", $6, _) .r0' + ; call MessageBoxIndirect + System::Call '${sysMessageBoxIndirect}(r0) .R0' + ; free MSGBOXPARAMS structure + + System::Free $0 + + ; have we used load library at start? + IntCmp $2 0 0 smbskipfree smbskipfree + ; No, then free the module + System::Call '${sysFreeLibrary}(r1)' + +smbskipfree: + System::Store "P0 l" +FunctionEnd + +; ================= systemSplash implementation ================= + +; returns to $R0 +!macro smSystemSplash DELAY FILE + Push ${FILE} + Push ${DELAY} + call systemSplash + Pop $R0 +!macroend + +; ----------------------------------------------------------------- +; systemSplash (params on stack): +; Delay - time in ms to show the splash +; File - bitmap (& audio) file name (without extension) +; returns to stack +; ----------------------------------------------------------------- + +Function _systemSplashWndCB + ; Callback receives 4 values + System::Store "s r2r5r7r9" + + ; Message branching + IntCmp $5 ${WM_CLOSE} m_Close + IntCmp $5 ${WM_TIMER} m_Timer + IntCmp $5 ${WM_LBUTTONDOWN} m_Lbtn + IntCmp $5 ${WM_CREATE} m_Create + IntCmp $5 ${WM_PAINT} m_Paint + goto default + +m_Create: + ; Create structures + System::Call "*${stRECT} (_) .R8" + System::Call "*${stBITMAP} (_, &l0 .R7) .R9" + + ; Get bitmap info + System::Call "${sysGetObject} (r6, R7, R9)" + + ; Get desktop info + System::Call "${sysSystemParametersInfo} (${SPI_GETWORKAREA}, 0, R8, 0)" + + ; Style (callbacked) + System::Call "${sysSetWindowLong} (r2, ${GWL_STYLE}, 0) .s" + !insertmacro SINGLE_CALLBACK 5 $R7 1 _systemSplashWndCB + + ; Calculate and set window pos + + ; Get bmWidth(R2) and bmHeight(R3) + System::Call "*$R9${stBITMAP} (,.R2,.R3)" + ; Get left(R4), top(R5), right(R6), bottom(R7) + System::Call "*$R8${stRECT} (.R4,.R5,.R6,.R7)" + + ; Left pos + IntOp $R0 $R6 - $R4 + IntOp $R0 $R0 - $R2 + IntOp $R0 $R0 / 2 + IntOp $R0 $R0 + $R4 + + ; Top pos + IntOp $R1 $R7 - $R5 + IntOp $R1 $R1 - $R3 + IntOp $R1 $R1 / 2 + IntOp $R1 $R1 + $R5 + + System::Call "${sysSetWindowPos} (r2, 0, R0, R1, R2, R3, ${SWP_NOZORDER}) .s" + !insertmacro SINGLE_CALLBACK 6 $R7 1 _systemSplashWndCB + + ; Show window + System::Call "${sysShowWindow} (r2, ${SW_SHOW}) .s" + !insertmacro SINGLE_CALLBACK 7 $R7 1 _systemSplashWndCB + + ; Set Timer + System::Call "${sysSetTimer} (r2, 1, r8,)" + + ; Free used memory + System::Free $R8 + System::Free $R9 + + StrCpy $R0 0 + goto exit + +m_Paint: + ; Create structures + System::Call "*${stRECT} (_) .R8" + System::Call "*${stPAINTSTRUCT} (_) .R9" + + ; Begin Paint + System::Call "${sysBeginPaint} (r2, R9) .R7" + + ; CreateCompatibleDC + System::Call "${sysCreateCompatibleDC} (R7) .R6" + + ; GetClientRect + System::Call "${sysGetClientRect} (r2, R8)" + + ; Select new bitmap + System::Call "${sysSelectObject} (R6, r6) .R5" + + ; Get left(R0), top(R1), right(R2), bottom(R3) + System::Call "*$R8${stRECT} (.R0,.R1,.R2,.R3)" + + ; width=right-left + IntOp $R2 $R2 - $R0 + ; height=bottom-top + IntOp $R3 $R3 - $R1 + + System::Call "${sysBitBlt} (R7, R0, R1, R2, R3, R6, 0, 0, ${SRCCOPY})" + + ; Select old bitmap + System::Call "${sysSelectObject} (R6, R5)" + + ; Delete compatible DC + System::Call "${sysDeleteDC} (R6)" + + ; End Paint + System::Call "${sysEndPaint} (r2, R9)" + + ; Free used memory + System::Free $R8 + System::Free $R9 + + StrCpy $R0 0 + goto exit + +m_Timer: +m_Lbtn: + StrCpy $4 0 + IntCmp $5 ${WM_TIMER} destroy + StrCpy $4 1 + +destroy: + System::Call "${sysDestroyWindow} (r2) .s" + !insertmacro SINGLE_CALLBACK 12 $R4 1 _systemSplashWndCB + +default: + ; Default + System::Call "${sysDefWindowProc} (r2, r5, r7, r9) .s" + !insertmacro SINGLE_CALLBACK 14 $R0 1 _systemSplashWndCB + goto exit + +m_Close: + StrCpy $R0 0 + goto exit + +exit: + ; Restore + System::Store "p4P0 l R0r4" + + ; Return from callback + System::Call "$3" $R0 +FunctionEnd + +Function systemSplash + + ; Save registers and get input + System::Store "s r8r9" + + ; Get module instance + System::Call "${sysGetModuleHandle} (p) .r7" + + ; Get arrow cursor + System::Call "${sysLoadCursor} (0, p ${IDC_ARROW}) .R9" + + ; Get callback + System::Get "${sysWNDPROC}" + Pop $3 + + ; Create window class + System::Call "*${stWNDCLASS} (0,r3,0,0,r7,0,R9,0,p 0,'_sp') .R9" + + ; Register window class + System::Call "${sysRegisterClass} (R9) .R9" + IntCmp $R9 0 errorexit ; Class registered ok? + + ; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010) + System::Call '${sysLoadImage} (, s, ${IMAGE_BITMAP}, 0, 0, ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) .r6' "$9.bmp" + IntCmp $6 0 errorexit ; Image loaded ok? + + ; Start the sound (SND_ASYNC|SND_FILENAME|SND_NODEFAULT = 0x20003) + System::Call "${sysPlaySound} (s,,${SND_ASYNC}|${SND_FILENAME}|${SND_NODEFAULT})" "$9.wav" + + ; Create window + System::Call "${sysCreateWindowEx} (${WS_EX_TOOLWINDOW}, s, s,,,,,, $HWNDPARENT,,r7,) .s" "_sp" "_sp" + !insertmacro SINGLE_CALLBACK 1 $5 1 _systemSplashWndCB + + ; Create MSG struct + System::Call "*${stMSG} (_) p.R9" + + ; ------------------------- +repeat: + ; Check for window + System::Call "${sysIsWindow} (r5) .s" + !insertmacro SINGLE_CALLBACK 2 $R8 1 _systemSplashWndCB + IntCmp $R8 0 finish + + ; Get message + System::Call "${sysGetMessage} (R9, r5,_) .s" + !insertmacro SINGLE_CALLBACK 3 $R8 1 _systemSplashWndCB + IntCmp $R8 0 finish + + ; Dispatch message + System::Call "${sysDispatchMessage} (R9) .s" + !insertmacro SINGLE_CALLBACK 4 $R8 1 _systemSplashWndCB + + ; Repeat dispatch cycle + goto repeat + ; ------------------------- + +finish: + ; Stop the sound + System::Call "${sysPlaySound} (p 0, p 0, i 0)" + + ; Delete bitmap object + System::Call "${sysDeleteObject} (r6)" + + ; Delete the callback queue + System::Free $3 + + ; Dialog return + StrCpy $R0 $4 + goto exit + +; Exit in case of error +errorexit: + StrCpy $R0 -1 + goto exit + +exit: + ; Restore register and put output + System::Store "P0 l" +FunctionEnd + +!endif +!verbose pop \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/System/System.nsh b/libs/NSIS/NSIS-source/Examples/System/System.nsh new file mode 100644 index 0000000000..ec1506b7ba --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/System/System.nsh @@ -0,0 +1,413 @@ +; Some useful functions, structures, constants +; +; (c) brainsucker, 2002 +; (r) BSForce + +!verbose push 3 +!ifndef System.NSH.Included +!define System.NSH.Included + +!include WinCore.nsh + +; ------------- Functions -------------- + +; LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +!define sysWNDPROC "(p.s, i.s, p.s, p.s) pss" + +; LRESULT DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +!define sysDefWindowProc "user32::DefWindowProc(p, i, p, p) p" + +!define sysMessageBox "user32::MessageBox(p, t, t, i) i" + +!define sysMessageBeep "user32::MessageBeep(i) i" + +!define sysMessageBoxIndirect 'user32::MessageBoxIndirect(p) i' + +; HMODULE GetModuleHandle(LPCTSTR lpModuleName); +!define sysGetModuleHandle "kernel32::GetModuleHandle(t) i" + +; HMODULE LoadLibrary(LPCTSTR lpFileName); +!define sysLoadLibrary "kernel32::LoadLibrary(t) p" + +; BOOL FreeLibrary(HMODULE hModule); +!define sysFreeLibrary "kernel32::FreeLibrary(p) i" + +; HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName); +!define sysLoadCursor "user32::LoadCursor(p, t) p" + +; ATOM RegisterClass(CONST WNDCLASS *lpWndClass); +!define sysRegisterClass "user32::RegisterClass(p) i" + +; HANDLE LoadImage(HINSTANCE hinst, LPCTSTR lpszName, UINT uType, +; int cxDesired, int cyDesired, UINT fuLoad); +!define sysLoadImage "user32::LoadImage(p, t, i, i, i, i) p" + +; BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); +!define sysPlaySound "winmm.dll::PlaySound(t, p, i) i" + +; HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, +; DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, +; HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); +!define sysCreateWindowEx "user32::CreateWindowEx(i, t, t, i, i, i, i, i, p, p, p, p) p" + +; BOOL IsWindow(HWND hWnd); +!define sysIsWindow "user32::IsWindow(p) i" + +; LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong); +!define sysSetWindowLong "user32::SetWindowLong(p, i, p) p" + +; BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags); +!define sysSetWindowPos "user32::SetWindowPos(p, p, i, i, i, i, i) i" + +; BOOL ShowWindow(HWND hWnd, int nCmdShow); +!define sysShowWindow "user32::ShowWindow(p, i) i" + +; BOOL DestroyWindow(HWND hWnd); +!define sysDestroyWindow "user32::DestroyWindow(p) i" + +; BOOL GetClientRect(HWND hWnd, LPRECT lpRect); +!define sysGetClientRect "user32::GetClientRect(p, p) i" + +; BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); +!define sysGetMessage "user32::GetMessage(p, p, i, i) i" + +; LRESULT DispatchMessage(CONST MSG *lpmsg); +!define sysDispatchMessage "user32::DispatchMessage(p) p" + +; BOOL DeleteObject(HGDIOBJ hObject); +!define sysDeleteObject "gdi32::DeleteObject(p) i" + +; int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject); +!define sysGetObject "gdi32::GetObject(p, i, p) i" + +; HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj); +!define sysSelectObject "gdi32::SelectObject(p, p) p" + +; HDC CreateCompatibleDC(HDC hdc); +!define sysCreateCompatibleDC "gdi32::CreateCompatibleDC(p) p" + +; BOOL DeleteDC(HDC hdc); +!define sysDeleteDC "gdi32::DeleteDC(p) i" + +; BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, +; HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop); +!define sysBitBlt "gdi32::BitBlt(p, i, i, i, i, p, i, i, i) i" + +; proposed by abgandar +; int AddFontResource(LPCTSTR lpszFilename); +!define sysAddFontResource "gdi32::AddFontResource(t) i" + +; HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint); +!define sysBeginPaint "user32::BeginPaint(p, p) p" + +; BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint); +!define sysEndPaint "user32::EndPaint(p, p) i" + +; BOOL SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); +!define sysSystemParametersInfo "user32::SystemParametersInfo(i, i, p, i) i" + +; UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); +!define sysSetTimer "user32::SetTimer(p, p, i, k) i" + +; DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR LpBuffer); +!define sysGetLogicalDriveStrings 'kernel32::GetLogicalDriveStrings(i, p) i' + +!define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l) i' + +; UINT GetDriveType(LPCTSTR lpRootPathName); +!define sysGetDriveType 'kernel32::GetDriveType(t) i' + +; HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData); +!define sysFindFirstFile 'kernel32::FindFirstFile(t, p) p' + +; BOOL FindClose(HANDLE hFindFile); +!define sysFindClose 'kernel32::FindClose(p) i' + +; BOOL FileTimeToSystemTime(CONST FILETIME *lpFileTime, +; LPSYSTEMTIME lpSystemTime); +!define sysFileTimeToSystemTime 'kernel32::FileTimeToSystemTime(*l, p) i' + +; BOOL FileTimeToLocalFileTime( +; CONST FILETIME *lpFileTime, +; LPFILETIME lpLocalFileTime); +!define sysFileTimeToLocalFileTime 'kernel32::FileTimeToLocalFileTime(*l, *l) i' + +; BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone, +; LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime); +!define sysSystemTimeToTzSpecificLocalTime 'kernel32::SystemTimeToTzSpecificLocalTime(p, p, p) i' + +!define syslstrlen 'kernel32::lstrlen(t) i' + +; int wsprintf(LPTSTR lpOut, LPCTSTR lpFmt, ...); +!define syswsprintf "user32::wsprintf(t, t) i ? c" + +; ------------- Structures -------------- + +; typedef struct _WNDCLASS { +; UINT style; +; WNDPROC lpfnWndProc; +; int cbClsExtra; +; int cbWndExtra; +; HINSTANCE hInstance; +; HICON hIcon; +; HCURSOR hCursor; +; HBRUSH hbrBackground; +; LPCTSTR lpszMenuName; +; LPCTSTR lpszClassName; +; } WNDCLASS, *PWNDCLASS; +!define stWNDCLASS "(i, k, i, i, p, p, p, p, t, t) p" + +; typedef struct tagMSG { +; HWND hwnd; +; UINT message; +; WPARAM wParam; +; LPARAM lParam; +; DWORD time; +; POINT pt; -> will be presented as two separate px and py +; } MSG, *PMSG; +!define stMSG "(p, i, p, p, i, i, i) p" + +; typedef struct tagBITMAP { +; LONG bmType; +; LONG bmWidth; +; LONG bmHeight; +; LONG bmWidthBytes; +; WORD bmPlanes; +; WORD bmBitsPixel; +; LPVOID bmBits; +; } BITMAP, *PBITMAP; +!define stBITMAP "(i, i, i, i, i, i, p) p" + +; typedef struct _RECT { +; LONG left; +; LONG top; +; LONG right; +; LONG bottom; +; } RECT, *PRECT; +!define stRECT "(i, i, i, i) p" + +; typedef struct tagPAINTSTRUCT { +; HDC hdc; +; BOOL fErase; +; RECT rcPaint; (rcl, rct, rcr, rcb) +; BOOL fRestore; +; BOOL fIncUpdate; +; BYTE rgbReserved[32]; +; } PAINTSTRUCT, *PPAINTSTRUCT; +!define stPAINTSTRUCT "(p, i, i, i, i, i, i, i, &v32) p" + +; typedef struct { +; UINT cbSize; +; HWND hwndOwner; +; HINSTANCE hInstance; +; LPCTSTR lpszText; +; LPCTSTR lpszCaption; +; DWORD dwStyle; +; LPCTSTR lpszIcon; +; DWORD_PTR dwContextHelpId; +; MSGBOXCALLBACK lpfnMsgBoxCallback; +; DWORD dwLanguageId; +; } MSGBOXPARAMS, *PMSGBOXPARAMS; +!define stMSGBOXPARAMS '(&l4, p, p, t, t, i, t, p, k, i) p' + +; typedef struct _SYSTEMTIME { +; WORD wYear; +; WORD wMonth; +; WORD wDayOfWeek; +; WORD wDay; +; WORD wHour; +; WORD wMinute; +; WORD wSecond; +; WORD wMilliseconds; +; } SYSTEMTIME, *PSYSTEMTIME; +!define stSYSTEMTIME '(&i2, &i2, &i2, &i2, &i2, &i2, &i2, &i2) p' + +; Maximal windows path +!define /ifndef MAX_PATH 260 + +; typedef struct _WIN32_FIND_DATA { +; DWORD dwFileAttributes; +; FILETIME ftCreationTime; +; FILETIME ftLastAccessTime; +; FILETIME ftLastWriteTime; +; DWORD nFileSizeHigh; +; DWORD nFileSizeLow; +; DWORD dwReserved0; +; DWORD dwReserved1; +; TCHAR cFileName[ MAX_PATH ]; +; TCHAR cAlternateFileName[ 14 ]; +; } WIN32_FIND_DATA, *PWIN32_FIND_DATA; +!define stWIN32_FIND_DATA '(i, l, l, l, i, i, i, i, &t${MAX_PATH}, &t14) p' + +; ------------- Constants -------------- + +; == Other == +!define /ifndef INVALID_HANDLE_VALUE -1 + +; == Sounds == + +!define SND_SYNC 0x0000 +!define SND_ASYNC 0x0001 +!define SND_NODEFAULT 0x0002 +!define SND_MEMORY 0x0004 +!define SND_LOOP 0x0008 +!define SND_NOSTOP 0x0010 + +!define SND_NOWAIT 0x00002000 +!define SND_ALIAS 0x00010000 +!define SND_ALIAS_ID 0x00110000 +!define SND_FILENAME 0x00020000 +!define SND_RESOURCE 0x00040004 +!define SND_PURGE 0x0040 +!define SND_APPLICATION 0x0080 + +; == Windows == + +!define /ifndef WS_OVERLAPPED 0x00000000 +!define /ifndef WS_POPUP 0x80000000 +!define /ifndef WS_CHILD 0x40000000 +!define /ifndef WS_MINIMIZE 0x20000000 +!define /ifndef WS_VISIBLE 0x10000000 +!define /ifndef WS_DISABLED 0x08000000 +!define /ifndef WS_CLIPSIBLINGS 0x04000000 +!define /ifndef WS_CLIPCHILDREN 0x02000000 +!define /ifndef WS_MAXIMIZE 0x01000000 +!define /ifndef WS_CAPTION 0x00C00000 +!define /ifndef WS_BORDER 0x00800000 +!define /ifndef WS_DLGFRAME 0x00400000 +!define /ifndef WS_VSCROLL 0x00200000 +!define /ifndef WS_HSCROLL 0x00100000 +!define /ifndef WS_SYSMENU 0x00080000 +!define /ifndef WS_THICKFRAME 0x00040000 +!define /ifndef WS_GROUP 0x00020000 +!define /ifndef WS_TABSTOP 0x00010000 +!define /ifndef WS_MINIMIZEBOX 0x00020000 +!define /ifndef WS_MAXIMIZEBOX 0x00010000 +!define /ifndef WS_TILED ${WS_OVERLAPPED} +!define /ifndef WS_ICONIC ${WS_MINIMIZE} +!define /ifndef WS_SIZEBOX ${WS_THICKFRAME} +!define /ifndef WS_OVERLAPPEDWINDOW 0x00CF0000 +!define /ifndef WS_TILEDWINDOW ${WS_OVERLAPPEDWINDOW} +!define /ifndef WS_POPUPWINDOW 0x80880000 +!define /ifndef WS_CHILDWINDOW ${WS_CHILD} +!define /ifndef WS_EX_DLGMODALFRAME 0x00000001 +!define /ifndef WS_EX_NOPARENTNOTIFY 0x00000004 +!define /ifndef WS_EX_TOPMOST 0x00000008 +!define /ifndef WS_EX_ACCEPTFILES 0x00000010 +!define /ifndef WS_EX_TRANSPARENT 0x00000020 +!define /ifndef WS_EX_MDICHILD 0x00000040 +!define /ifndef WS_EX_TOOLWINDOW 0x00000080 +!define /ifndef WS_EX_WINDOWEDGE 0x00000100 +!define /ifndef WS_EX_CLIENTEDGE 0x00000200 +!define /ifndef WS_EX_CONTEXTHELP 0x00000400 +!define /ifndef WS_EX_RIGHT 0x00001000 +!define /ifndef WS_EX_LEFT 0x00000000 +!define /ifndef WS_EX_RTLREADING 0x00002000 +!define /ifndef WS_EX_LTRREADING 0x00000000 +!define /ifndef WS_EX_LEFTSCROLLBAR 0x00004000 +!define /ifndef WS_EX_RIGHTSCROLLBAR 0x00000000 +!define /ifndef WS_EX_CONTROLPARENT 0x00010000 +!define /ifndef WS_EX_STATICEDGE 0x00020000 +!define /ifndef WS_EX_APPWINDOW 0x00040000 +!define /ifndef WS_EX_OVERLAPPEDWINDOW 0x00000300 +!define /ifndef WS_EX_PALETTEWINDOW 0x00000188 +!define /ifndef WS_EX_LAYERED 0x00080000 +!define /ifndef WS_EX_NOINHERITLAYOUT 0x00100000 +!define /ifndef WS_EX_LAYOUTRTL 0x00400000 +!define /ifndef WS_EX_COMPOSITED 0x02000000 +!define /ifndef WS_EX_NOACTIVATE 0x08000000 + + +; == System Parameters Info == + +!define SPI_GETWORKAREA 0x0030 + +; == Window swap == + +!define SWP_NOSIZE 0x0001 +!define SWP_NOMOVE 0x0002 +!define SWP_NOZORDER 0x0004 +!define SWP_NOREDRAW 0x0008 +!define SWP_NOACTIVATE 0x0010 +!define SWP_FRAMECHANGED 0x0020 +!define SWP_SHOWWINDOW 0x0040 +!define SWP_HIDEWINDOW 0x0080 +!define SWP_NOCOPYBITS 0x0100 +!define SWP_NOOWNERZORDER 0x0200 +!define SWP_NOSENDCHANGING 0x0400 + +!define SWP_DRAWFRAME ${SWP_FRAMECHANGED} +!define SWP_NOREPOSITION ${SWP_NOOWNERZORDER} +!define SWP_DEFERERASE 0x2000 +!define SWP_ASYNCWINDOWPOS 0x4000 + +; == Bit Copy == + +!define SRCCOPY 0x00CC0020 +!define SRCPAINT 0x00EE0086 +!define SRCAND 0x008800C6 +!define SRCINVERT 0x00660046 +!define SRCERASE 0x00440328 +!define NOTSRCCOPY 0x00330008 +!define NOTSRCERASE 0x001100A6 +!define MERGECOPY 0x00C000CA +!define MERGEPAINT 0x00BB0226 +!define PATCOPY 0x00F00021 +!define PATPAINT 0x00FB0A09 +!define PATINVERT 0x005A0049 +!define DSTINVERT 0x00550009 +!define BLACKNESS 0x00000042 +!define WHITENESS 0x00FF0062 + +; == Message Box == + +!define MB_OK 0x00000000 +!define MB_OKCANCEL 0x00000001 +!define MB_ABORTRETRYIGNORE 0x00000002 +!define MB_YESNOCANCEL 0x00000003 +!define MB_YESNO 0x00000004 +!define MB_RETRYCANCEL 0x00000005 +!define MB_CANCELTRYCONTINUE 0x00000006 +!define MB_ICONHAND 0x00000010 +!define MB_ICONQUESTION 0x00000020 +!define MB_ICONEXCLAMATION 0x00000030 +!define MB_ICONASTERISK 0x00000040 +!define MB_USERICON 0x00000080 +!define MB_ICONWARNING ${MB_ICONEXCLAMATION} +!define MB_ICONERROR ${MB_ICONHAND} + +!define MB_ICONINFORMATION ${MB_ICONASTERISK} +!define MB_ICONSTOP ${MB_ICONHAND} + +!define MB_DEFBUTTON1 0x00000000 +!define MB_DEFBUTTON2 0x00000100 +!define MB_DEFBUTTON3 0x00000200 +!define MB_DEFBUTTON4 0x00000300 + +!define MB_APPLMODAL 0x00000000 +!define MB_SYSTEMMODAL 0x00001000 +!define MB_TASKMODAL 0x00002000 +!define MB_HELP 0x00004000 + +!define MB_NOFOCUS 0x00008000 +!define MB_SETFOREGROUND 0x00010000 +!define MB_DEFAULT_DESKTOP_ONLY 0x00020000 + +!define MB_TOPMOST 0x00040000 +!define MB_RIGHT 0x00080000 +!define MB_RTLREADING 0x00100000 + + +; == Callbacks == + +!macro SINGLE_CALLBACK CHKN RES INDEX FUNC +CheckCB_${CHKN}: + Pop ${RES} + StrCmp ${RES} "callback${INDEX}" 0 ExitCB_${CHKN} + Call ${FUNC} + Goto CheckCB_${CHKN} +ExitCB_${CHKN}: +!macroend + +!endif +!verbose pop \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/System/System.nsi b/libs/NSIS/NSIS-source/Examples/System/System.nsi new file mode 100644 index 0000000000..7725fc42bb --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/System/System.nsi @@ -0,0 +1,161 @@ +; This is just an example of System Plugin +; +; (c) brainsucker, 2002 +; (r) BSForce + +Name "System Plugin Example" +OutFile "System.exe" +RequestExecutionLevel User +Unicode True + +!include "SysFunc.nsh" + +Section "ThisNameIsIgnoredSoWhyBother?" + SetOutPath $TEMP + + ; ----- Sample 1 ----- Message box with custom icon ----- + + ; there are no default beeps for custom message boxes, use sysMessageBeep + ; in case you need it (see next message box example) + !insertmacro smMessageBox "i 0" "Message box with custom icon!" "System Example 1a" ${MB_OK} "i 103" + ; i 0 - installer exe as module + ; i 103 - icon ID + + ; The same example but using icon from resource.dll. + ; You could use this dll for storing your resources, just replace FAR icon + ; with something you really need. + File "Resource.dll" + System::Call '${sysMessageBeep} (${MB_ICONHAND})' ; custom beep + !insertmacro smMessageBox "`$TEMP\resource.dll`" "Message box with custom icon from resource.dll!" "System Example 1b" ${MB_OKCANCEL} "i 103" + Delete $TEMP\resource.dll + + ; ----- Sample 2 ----- Fixed disks size/space ----- + + StrCpy $7 ' Disk, Size, Free, Free for user:$\n$\n' + + ; Memory for paths + System::StrAlloc 1024 + Pop $1 + ; Get drives + System::Call '${sysGetLogicalDriveStrings}(1024, r1)' +enumok: + ; One more drive? + System::Call '${syslstrlen}(i r1) .r2' + IntCmp $2 0 enumex + + ; Is it DRIVE_FIXED? + System::Call '${sysGetDriveType} (i r1) .r3' + StrCmp $3 ${DRIVE_FIXED} 0 enumnext + + ; Drive space + System::Call '${sysGetDiskFreeSpaceEx}(i r1, .r3, .r4, .r5)' + + ; Pretty KBs will be saved on stack + System::Int64Op $3 / 1048576 + System::Int64Op $5 / 1048576 + System::Int64Op $4 / 1048576 + + ; Get pretty drive path string + System::Call '*$1(&t1024 .r6)' + System::Call '${syswsprintf} (.r7, "%s%20s %20s mb %20s mb %20s mb$\n", tr7, tr6, ts, ts, ts)' + +enumnext: + ; Next drive path + IntOp $2 $2 * ${NSIS_CHAR_SIZE} + IntOp $1 $1 + $2 + IntOp $1 $1 + ${NSIS_CHAR_SIZE} + goto enumok +enumex: ; End of drives or user cancel + ; Free memory for paths + System::Free $1 + + ; Message box + System::Call '${sysMessageBox}($HWNDPARENT, s, "System Example 2", ${MB_OKCANCEL})' "$7" + + ; ----- Sample 3 ----- Direct proc definition ----- + + ; Direct specification demo + System::Call 'user32::MessageBox(p $HWNDPARENT, t "Just direct MessageBox specification demo ;)", t "System Example 3", i ${MB_OK}) i.s' + Pop $0 + + ; ----- Sample 4 ----- Int64, mixed definition demo ----- + + ; Long int demo + StrCpy $2 "12312312" + StrCpy $3 "12345678903" + System::Int64Op $2 "*" $3 + Pop $4 + + ; Cdecl demo (uses 3 definitions (simple example)) + System::Call "${syswsprintf}(.R1, s,,, t, ir0) .R0 (,,tr2,tr3,$4_)" "Int64 ops and strange definition demo, %s x %s == %s, and previous msgbox result = %d" + MessageBox MB_OKCANCEL "Cool: '$R1'" + + ; ----- Sample 5 ----- Small structure example ----- + + ; Create & Fill structure + System::Call "*(i 123123123, &t10 'Hello', &i1 0x123dd, &i2 0xffeeddccaa) i.s" + Pop $1 + ; Read data from structure + System::Call "*$1(i .r2, &t10 .r3, &i1 .r4, &i2 .r5, &l0 .r6)" + ; Show data and delete structure + MessageBox MB_OK "Structure example: $\nint == $2 $\nstring == $3 $\nbyte == $4 $\nshort == $5 $\nsize == $6" + System::Free $1 + + ; ----- Sample 6 ----- systemGetFileSysTime demo ----- + Call GetInstallerExeName + pop $0 + + !insertmacro smGetFileSysTime $0 + System::Call '*$R0${stSYSTEMTIME}(.r1, .r2, .r3, .r4, .r5, .r6, .r7, .r8)' + + MessageBox MB_OK "GetFileSysTime example: file '$0', year $1, month $2, dow $3, day $4, hour $5, min $6, sec $7, ms $8" + + ; free memory from SYSTEMTIME + System::Free $R0 + + ; ----- Sample 7 ----- systemSplash -> Callbacks demonstration ----- + + ; Logo + File /oname=spltmp.bmp "${NSISDIR}\Contrib\Graphics\Header\orange-nsis.bmp" +; File /oname=spltmp.wav "d:\Windows\Media\tada.wav" + + ; I. systemSplash variant + !insertmacro smSystemSplash 2000 "$TEMP\spltmp" + + ; II. Splash Plugin variant +; splash::show 2000 $TEMP\spltmp +; Pop $R0 ; $R0 has '1' if the user closed the splash screen early, + + ; remove logo + Delete $TEMP\spltmp.bmp +; Delete $TEMP\spltmp.wav + + ; Display splash result + pop $0 + MessageBox MB_OK "Splash (callbacks) demo result $R0" + +SectionEnd + + +Section "Quoted path" + + !define /IfNDef CSIDL_FONTS 0x14 + StrCpy $9 "$PluginsDir\N(S # I)S" ; Directory with '(', ' ', '#' or ')' needs to be quoted + CreateDirectory "$9" + CopyFiles /Silent /FilesOnly "$sysdir\shfolder.dll" "$9\" ; This could fail on 95 & NT4? + + System::Call '"$9\shfolder.dll"::SHGetFolderPathA(p $hWndParent, i ${CSIDL_FONTS}, p 0, i 0, m "?" r1) ?u' + DetailPrint Fonts=$1 + +SectionEnd + + +Section "Ordinal" + + System::Call 'OLEAUT32::#2(w "OLE string")p.r0' ; SysAllocString + System::Call 'USER32::MessageBoxW(p $hWndParent, p r0, w "OLE:", i 0)' + System::Call 'OLEAUT32::#6(p r0)' + +SectionEnd + +; eof diff --git a/libs/NSIS/NSIS-source/Examples/TextFunc.ini b/libs/NSIS/NSIS-source/Examples/TextFunc.ini new file mode 100644 index 0000000000..5b9a7bc47c --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/TextFunc.ini @@ -0,0 +1,130 @@ +[Settings] +NumFields=15 +NextButtonText=&Enter + +[Field 1] +Type=Droplist +Flags=NOTIFY +State=1. LineFind +ListItems=1. LineFind|2. LineRead|3. FileReadFromEnd|4. LineSum|5. FileJoin|6. TextCompare|7. ConfigRead|8. ConfigWrite|9. FileRecode +Left=44 +Right=139 +Top=9 +Bottom=100 + +[Field 2] +Type=FileRequest +Left=44 +Right=-17 +Top=30 +Bottom=41 + +[Field 3] +Type=FileRequest +Left=44 +Right=-17 +Top=46 +Bottom=57 + +[Field 4] +Type=FileRequest +State=3:-1 +Left=44 +Right=-17 +Top=62 +Bottom=75 + +[Field 5] +Type=Droplist +Flags=NOTIFY +State=Example1 (delete first two symbols) +ListItems=Example1 (delete first two symbols)|Example2 (show changed lines)|Example3 (delete lines)|Example4 (insert lines)|Example5 (replace in file - WordFunc.nsh required)|Example6 (line string to cut or delete)|Example7 (read lines) +Left=44 +Right=-36 +Top=81 +Bottom=155 + +[Field 6] +Type=Droplist +Flags=NOTIFY +State=Example1 (Different or Equal) +ListItems=Example1 (Different or Equal)|Example2 (Compare line-by-line - Different)|Example3 (Compare line-by-line - Equal)|Example4 (Compare all lines - Different)|Example5 (Compare all lines - Equal) +Left=44 +Right=-36 +Top=81 +Bottom=140 + +[Field 7] +Type=Droplist +State=FileReadFromEndCallback +ListItems=FileReadFromEndCallback +Left=44 +Right=-36 +Top=81 +Bottom=92 + +[Field 8] +Type=Text +Flags=READONLY +Left=9 +Right=-36 +Top=108 +Bottom=120 + +[Field 9] +Type=Button +Text=Edit +Flags=NOTIFY +Left=234 +Right=256 +Top=81 +Bottom=92 + +[Field 10] +Type=Button +Text=Log +Flags=NOTIFY|DISABLED +Left=234 +Right=256 +Top=108 +Bottom=120 + +[Field 11] +Type=Label +Text=InputFile +Left=10 +Right=43 +Top=32 +Bottom=44 + +[Field 12] +Type=Label +Text=OutputFile +Left=10 +Right=43 +Top=48 +Bottom=60 + +[Field 13] +Type=Label +Text=Range +Left=10 +Right=44 +Top=65 +Bottom=75 + +[Field 14] +Type=Label +Text=Function +Left=10 +Right=43 +Top=81 +Bottom=92 + +[Field 15] +Type=Label +Text=Result: +Left=10 +Right=229 +Top=97 +Bottom=105 diff --git a/libs/NSIS/NSIS-source/Examples/TextFunc.nsi b/libs/NSIS/NSIS-source/Examples/TextFunc.nsi new file mode 100644 index 0000000000..e05b7f7e1b --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/TextFunc.nsi @@ -0,0 +1,834 @@ +;_____________________________________________________________________________ +; +; Text Functions +;_____________________________________________________________________________ +; +; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "Text Functions" +OutFile "TextFunc.exe" +Caption "$(^Name)" +XPStyle on +RequestExecutionLevel user + +!include "WinMessages.nsh" +!include "TextFunc.nsh" + +Var HWND +Var INI +Var LOG +Var PROJECT +Var CALLBACK +Var VIEW +Var FUNCTION +Var LINEFIND1 +Var LINEFIND2 +Var LINEFIND3 +Var LINEREAD1 +Var LINEREAD2 +Var FILEREADFROMEND1 +Var LINESUM1 +Var FILEJOIN1 +Var FILEJOIN2 +Var FILEJOIN3 +Var TEXTCOMPARE1 +Var TEXTCOMPARE2 +Var TEXTCOMPARE3 +Var CONFIGREAD1 +Var CONFIGREAD2 +Var CONFIGWRITE1 +Var CONFIGWRITE2 +Var CONFIGWRITE3 +Var FILERECODE1 +Var FILERECODE2 + +Page Custom ShowCustom LeaveCustom + +Function ShowCustom + InstallOptions::initDialog "$INI" + Pop $hwnd + GetDlgItem $0 $HWND 1206 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1208 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1209 + ShowWindow $0 0 + StrCpy $FUNCTION LineFind + StrCpy $LINEREAD2 10 + StrCpy $TEXTCOMPARE3 FastDiff + StrCpy $CONFIGREAD1 "$WINDIR\system.ini" + StrCpy $CONFIGREAD2 "shell=" + StrCpy $FILERECODE2 CharToOem + InstallOptions::show + Pop $0 +FunctionEnd + +Function LeaveCustom + ReadINIStr $0 $INI "Settings" "State" + ReadINIStr $R0 $INI "Field 1" "State" + ReadINIStr $R1 $INI "Field 2" "State" + ReadINIStr $R2 $INI "Field 3" "State" + ReadINIStr $R3 $INI "Field 4" "State" + ReadINIStr $R4 $INI "Field 5" "State" + ReadINIStr $R5 $INI "Field 6" "State" + StrCpy $R4 $R4 8 + StrCpy $R5 $R5 8 + StrCpy $6 0 + StrCpy $7 '$${' + StrCpy $8 'r' + StrCpy $9 'n' + + StrCmp $0 10 Log + StrCmp $0 9 ViewOrEdit + StrCmp $0 0 Enter + goto MainSend + + Log: + Exec 'notepad.exe $LOG' + Abort + + ViewOrEdit: + StrCmp $FUNCTION FileReadFromEnd 0 Edit + StrCmp $VIEW '' 0 ViewFileReadFromEndCallback + GetTempFileName $VIEW $PLUGINSDIR + StrCpy $7 '$$' + FileOpen $0 $VIEW w + FileWrite $0 `Function FileReadFromEndCallback$\r$\n` + FileWrite $0 ` MessageBox MB_OKCANCEL '$7$$9 "Line"=[$$9]$7\$9$7$$8 "#"=[$$8]$7\$9$7$$7 "-#"=[$$7]' IDOK +2$\r$\n` + FileWrite $0 ` StrCpy $$R0 StopFileReadFromEnd$\r$\n$\r$\n` + FileWrite $0 ` Push $$R0$\r$\n` + FileWrite $0 `FunctionEnd$\r$\n` + FileClose $0 + StrCpy $7 '$${' + SetFileAttributes $VIEW READONLY + ViewFileReadFromEndCallback: + Exec 'notepad.exe $VIEW' + Abort + + Edit: + StrCmp $CALLBACK '' +5 + StrCmp $6$R6 '0$R0$R4$R5' showproject + StrCmp $R6 '$R0$R4$R5' +3 + Delete $CALLBACK + StrCpy $CALLBACK '' + StrCpy $R6 '$R0$R4$R5' + + #Project# + StrCmp $6$R0 "01. LineFind" 0 +5 + IfFileExists $CALLBACK +2 + GetTempFileName $CALLBACK $PLUGINSDIR + FileOpen $0 $CALLBACK w + goto function + IfFileExists $PROJECT +2 + GetTempFileName $PROJECT $PLUGINSDIR + FileOpen $0 $PROJECT w + + #Name# + FileWrite $0 'Name "$FUNCTION"$\r$\n' + FileWrite $0 'OutFile "$PROJECT.exe"$\r$\n$\r$\n' + + #!include# + StrCmp $R0$R4 '1. LineFindExample5' 0 TextFuncInclude + IfFileExists '$EXEDIR\WordFunc.nsh' 0 +3 + FileWrite $0 '!include "$EXEDIR\WordFunc.nsh"$\r$\n' + goto +2 + FileWrite $0 '!include "WordFunc.nsh"$\r$\n' + FileWrite $0 '!insertmacro WordFind$\r$\n' + FileWrite $0 '!insertmacro WordFindS$\r$\n' + FileWrite $0 '!insertmacro WordFind2X$\r$\n' + FileWrite $0 '!insertmacro WordFind2XS$\r$\n' + FileWrite $0 '!insertmacro WordFind3X$\r$\n' + FileWrite $0 '!insertmacro WordFind3XS$\r$\n' + FileWrite $0 '!insertmacro WordReplace$\r$\n' + FileWrite $0 '!insertmacro WordReplaceS$\r$\n' + FileWrite $0 '!insertmacro WordAdd$\r$\n' + FileWrite $0 '!insertmacro WordAddS$\r$\n' + FileWrite $0 '!insertmacro WordInsert$\r$\n' + FileWrite $0 '!insertmacro WordInsertS$\r$\n' + FileWrite $0 '!insertmacro StrFilter$\r$\n' + FileWrite $0 '!insertmacro StrFilterS$\r$\n' + TextFuncInclude: + IfFileExists '$EXEDIR\TextFunc.nsh' 0 +3 + FileWrite $0 '!include "$EXEDIR\TextFunc.nsh"$\r$\n' + goto +2 + FileWrite $0 '!include "TextFunc.nsh"$\r$\n' + FileWrite $0 '!insertmacro $FUNCTION$\r$\n' + StrCmp $FUNCTION TextCompare +2 + FileWrite $0 '!insertmacro TrimNewLines$\r$\n' + + #Section# + FileWrite $0 '$\r$\nSection -empty$\r$\n' + FileWrite $0 'SectionEnd$\r$\n$\r$\n' + + #Function .onInit# + FileWrite $0 'Function .onInit$\r$\n' + StrCmp $R0$R5 "6. TextCompareExample1" 0 TextCompareExample235 + FileWrite $0 ' StrCpy $$R0 ""$\r$\n' + FileWrite $0 ' $7TextCompare} "$R1" "$R2" "$R3" "$R5"$\r$\n' + FileWrite $0 ' IfErrors error$\r$\n' + FileWrite $0 ' StrCmp $$R0 NotEqual 0 +2$\r$\n' + FileWrite $0 ' MessageBox MB_OK " Files differ" IDOK +2$\r$\n' + FileWrite $0 ' MessageBox MB_OK " Files identical"$\r$\n' + FileWrite $0 ' goto end$\r$\n$\r$\n' + goto endoninit + TextCompareExample235: + StrCmp $R0$R5 "6. TextCompareExample2" +3 + StrCmp $R0$R5 "6. TextCompareExample3" +2 + StrCmp $R0$R5 "6. TextCompareExample5" 0 TextCompareExample4 + FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n' + FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n' + FileWrite $0 ' GetTempFileName $$R2$\r$\n' + FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n' + FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n' + FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n' + FileWrite $0 ' IfErrors error$\r$\n' + FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n' + FileWrite $0 ' goto end$\r$\n$\r$\n' + goto endoninit + TextCompareExample4: + StrCmp $R0$R5 "6. TextCompareExample4" 0 LineFindExample123456 + FileWrite $0 ' StrCpy $$R0 "$R1"$\r$\n' + FileWrite $0 ' StrCpy $$R1 "$R2"$\r$\n$\r$\n' + FileWrite $0 ' GetTempFileName $$R2$\r$\n' + FileWrite $0 ' FileOpen $$R3 $$R2 w$\r$\n' + FileWrite $0 ' FileWrite $$R3 "$$R0 | $$R1$$\$8$$\$9"$\r$\n' + FileWrite $0 ' $7TextCompare} "$$R0" "$$R1" "$R3" "$R5"$\r$\n' + FileWrite $0 ' IfErrors error$\r$\n' + FileWrite $0 ' FileWrite $$R3 "$$\$8$$\$9$$R1 | $$R0$$\$8$$\$9"$\r$\n' + FileWrite $0 ' $7TextCompare} "$$R1" "$$R0" "$R3" "$R5"$\r$\n' + FileWrite $0 ' FileClose $$R3$\r$\n' + FileWrite $0 ' IfErrors error$\r$\n' + FileWrite $0 ' Exec "notepad.exe $$R2"$\r$\n$\r$\n' + FileWrite $0 ' goto end$\r$\n$\r$\n' + goto endoninit + LineFindExample123456: + FileWrite $0 ' $7$FUNCTION} "$R1" "$R2" "$R3" "$R4"$\r$\n' + FileWrite $0 ' IfErrors error$\r$\n' + FileWrite $0 ' MessageBox MB_YESNO " Open output file?" IDNO end$\r$\n' + FileWrite $0 ' StrCmp "$R2" "" 0 +3$\r$\n' + FileWrite $0 ` Exec 'notepad.exe "$R1"'$\r$\n` + FileWrite $0 ' goto end$\r$\n' + FileWrite $0 ' SearchPath $$R2 "$R2"$\r$\n' + FileWrite $0 ` Exec 'notepad.exe "$$R2"'$\r$\n` + FileWrite $0 ' goto end$\r$\n$\r$\n' + endoninit: + FileWrite $0 ' error:$\r$\n' + FileWrite $0 ' MessageBox MB_OK "Error"$\r$\n$\r$\n' + FileWrite $0 ' end:$\r$\n' + FileWrite $0 ' Quit$\r$\n' + FileWrite $0 'FunctionEnd$\r$\n$\r$\n' + #FunctionEnd# + + + #Function CallBack# + StrCmp $CALLBACK '' 0 close + function: + StrCmp $R0 '1. LineFind' 0 +8 + FileWrite $0 'Function $R4$\r$\n' + StrCmp $R4 "Example1" Example1LF + StrCmp $R4 "Example2" Example2LF + StrCmp $R4 "Example3" Example3LF + StrCmp $R4 "Example4" Example4LF + StrCmp $R4 "Example5" Example5LF + StrCmp $R4 "Example6" Example6LF + + FileWrite $0 'Function $R5$\r$\n' + StrCmp $R5 "Example1" Example1TC + StrCmp $R5 "Example2" Example2TC + StrCmp $R5 "Example3" Example3TC + StrCmp $R5 "Example4" Example4TC + StrCmp $R5 "Example5" Example3TC + + Example1LF: + FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n" + FileWrite $0 " StrCpy $$R9 $$R9 '' 2 ;delete first two symbols$\r$\n" + FileWrite $0 " StrCpy $$R9 '$$R9$$\$8$$\$9'$\r$\n$\r$\n" + goto endwrite + Example2LF: + FileWrite $0 " $7TrimNewLines} '$$R9' $$R9$\r$\n" + FileWrite $0 " StrCpy $$R9 '$$R9 ~Changed line ($$R8)~$$\$8$$\$9'$\r$\n$\r$\n" + goto endwrite + Example3LF: + FileWrite $0 " StrCpy $$0 SkipWrite$\r$\n$\r$\n" + goto endwrite + Example4LF: + FileWrite $0 " FileWrite $$R4 '---First Line---$$\$8$$\$9'$\r$\n" + FileWrite $0 " FileWrite $$R4 '---Second Line ...---$$\$8$$\$9'$\r$\n$\r$\n" + goto endwrite + Example5LF: + FileWrite $0 " ; You can use:$\r$\n" + FileWrite $0 " ; $7WordFind}|$7WordFindS}|$7WordFind2X}|$7WordFind2XS}|$\r$\n" + FileWrite $0 " ; $7WordFind3X}|$7WordFind3XS}|$7WordReplace}|$7WordReplaceS}|$\r$\n" + FileWrite $0 " ; $7WordAdd}|$7WordAddS}|$7WordInsert}|$7WordInsertS}|$\r$\n" + FileWrite $0 " ; $7StrFilter}|$7StrFilterS}$\r$\n$\r$\n" + FileWrite $0 " $7WordReplace} '$$R9' ' ' '_' '+*' $$R9$\r$\n$\r$\n" + goto endwrite + Example6LF: + FileWrite $0 ' ;(Cut lines from a line to another line (also including that line))$\r$\n' + FileWrite $0 ' StrCmp $$R0 finish stop$\r$\n' + FileWrite $0 ' StrCmp $$R0 start finish$\r$\n' + FileWrite $0 ' StrCmp $$R9 "Start Line$$\$8$$\$9" 0 skip$\r$\n' + FileWrite $0 ' StrCpy $$R0 start$\r$\n' + FileWrite $0 ' StrCpy $$R1 $$R9$\r$\n' + FileWrite $0 ' goto code$\r$\n' + FileWrite $0 ' finish:$\r$\n' + FileWrite $0 ' StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 code$\r$\n' + FileWrite $0 ' StrCpy $$R0 finish$\r$\n' + FileWrite $0 ' StrCpy $$R2 $$R8$\r$\n' + FileWrite $0 ' goto code$\r$\n' + FileWrite $0 ' skip:$\r$\n' + FileWrite $0 ' StrCpy $$0 SkipWrite$\r$\n' + FileWrite $0 ' goto output$\r$\n' + FileWrite $0 ' stop:$\r$\n' + FileWrite $0 ' StrCpy $$0 StopLineFind$\r$\n' + FileWrite $0 ' goto output$\r$\n$\r$\n' + FileWrite $0 ' ;;(Delete lines from a line to another line (also including that line))$\r$\n' + FileWrite $0 ' ; StrCmp $$R0 finish code$\r$\n' + FileWrite $0 ' ; StrCmp $$R0 start finish$\r$\n' + FileWrite $0 ' ; StrCmp $$R9 "Start Line$$\$8$$\$9" 0 code$\r$\n' + FileWrite $0 ' ; StrCpy $$R0 start$\r$\n' + FileWrite $0 ' ; StrCpy $$R1 $$R8$\r$\n' + FileWrite $0 ' ; goto skip$\r$\n' + FileWrite $0 ' ; finish:$\r$\n' + FileWrite $0 ' ; StrCmp $$R9 "Finish Line$$\$8$$\$9" 0 skip$\r$\n' + FileWrite $0 ' ; StrCpy $$R0 finish$\r$\n' + FileWrite $0 ' ; StrCpy $$R2 $$R8$\r$\n' + FileWrite $0 ' ; skip:$\r$\n' + FileWrite $0 ' ; StrCpy $$0 SkipWrite$\r$\n' + FileWrite $0 ' ; goto output$\r$\n$\r$\n' + FileWrite $0 ' code:$\r$\n' + FileWrite $0 ' ;...$\r$\n$\r$\n' + FileWrite $0 ' output:$\r$\n' + goto endwrite + Example1TC: + FileWrite $0 " StrCpy $$R0 NotEqual$\r$\n" + FileWrite $0 " StrCpy $$0 StopTextCompare$\r$\n$\r$\n" + goto endwrite + Example2TC: + FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n" + FileWrite $0 " FileWrite $$R3 '$$6=$$7$$\$8$$\$9'$\r$\n$\r$\n" + goto endwrite + Example3TC: + FileWrite $0 " FileWrite $$R3 '$$8|$$6=$$9'$\r$\n$\r$\n" + goto endwrite + Example4TC: + FileWrite $0 " FileWrite $$R3 '$$8=$$9'$\r$\n$\r$\n" + goto endwrite + endwrite: + FileWrite $0 ' Push $$0$\r$\n' + FileWrite $0 'FunctionEnd$\r$\n' + close: + FileClose $0 + goto $6 + #FunctionEnd# + + showproject: + StrCmp $R0 '1. LineFind' 0 +3 + ExecWait 'notepad.exe $CALLBACK' + goto +4 + SetFileAttributes $PROJECT READONLY + ExecWait 'notepad.exe $PROJECT' + SetFileAttributes $PROJECT NORMAL + Abort + + MainSend: + GetDlgItem $0 $HWND 1210 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + EnableWindow $0 1 + GetDlgItem $0 $HWND 1204 + ShowWindow $0 1 + EnableWindow $0 1 + GetDlgItem $0 $HWND 1205 + EnableWindow $0 1 + GetDlgItem $0 $HWND 1206 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1207 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1208 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1209 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1211 + EnableWindow $0 1 + + StrCmp $FUNCTION LineFind 0 +5 + StrCpy $LINEFIND1 $R1 + StrCpy $LINEFIND2 $R2 + StrCpy $LINEFIND3 $R3 + goto LineFindSend + StrCmp $FUNCTION LineRead 0 +4 + StrCpy $LINEREAD1 $R1 + StrCpy $LINEREAD2 $R2 + goto LineFindSend + StrCmp $FUNCTION FileReadFromEnd 0 +3 + StrCpy $FILEREADFROMEND1 $R1 + goto LineFindSend + StrCmp $FUNCTION LineSum 0 +3 + StrCpy $LINESUM1 $R1 + goto LineFindSend + StrCmp $FUNCTION FileJoin 0 +5 + StrCpy $FILEJOIN1 $R1 + StrCpy $FILEJOIN2 $R2 + StrCpy $FILEJOIN3 $R3 + goto LineFindSend + StrCmp $FUNCTION TextCompare 0 +5 + StrCpy $TEXTCOMPARE1 $R1 + StrCpy $TEXTCOMPARE2 $R2 + StrCpy $TEXTCOMPARE3 $R3 + goto LineFindSend + StrCmp $FUNCTION ConfigRead 0 +4 + StrCpy $CONFIGREAD1 $R1 + StrCpy $CONFIGREAD2 $R2 + goto LineFindSend + StrCmp $FUNCTION ConfigWrite 0 +5 + StrCpy $CONFIGWRITE1 $R1 + StrCpy $CONFIGWRITE2 $R2 + StrCpy $CONFIGWRITE3 $R3 + goto LineFindSend + StrCmp $FUNCTION FileRecode 0 +3 + StrCpy $FILERECODE1 $R1 + StrCpy $FILERECODE2 $R2 + + LineFindSend: + StrCmp $R0 "1. LineFind" 0 LineReadSend + StrCmp $FUNCTION LineFind 0 LineFindSend2 + StrCmp $R4 "Example1" 0 +3 + StrCpy $LINEFIND3 "3:-1" + goto LineFindSend2 + StrCmp $R4 "Example2" 0 +3 + StrCpy $LINEFIND3 "{5:12 15 -6:-5 -1}" + goto LineFindSend2 + StrCmp $R4 "Example3" 0 +3 + StrCpy $LINEFIND3 "2:3 10:-5 -3:-2" + goto LineFindSend2 + StrCmp $R4 "Example4" 0 +3 + StrCpy $LINEFIND3 "10" + goto LineFindSend2 + StrCmp $R4 "Example5" 0 +3 + StrCpy $LINEFIND3 "1:-1" + goto LineFindSend2 + StrCmp $R4 "Example6" 0 +3 + StrCpy $LINEFIND3 "" + goto LineFindSend2 + StrCmp $R4 "Example7" 0 +2 + StrCpy $LINEFIND3 "1:-1" + + LineFindSend2: + StrCpy $FUNCTION LineFind + StrCmp $LINEFIND2 '/NUL' 0 +2 + StrCpy $LINEFIND2 '' + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND1" + GetDlgItem $0 $HWND 1203 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND2" + GetDlgItem $0 $HWND 1205 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEFIND3" + GetDlgItem $0 $HWND 1207 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Edit" + GetDlgItem $0 $HWND 1212 + ShowWindow $0 1 + StrCmp $LOG '' +2 + EnableWindow $0 1 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Range" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" + + StrCmp $R4 "Example7" 0 +9 + GetDlgItem $0 $HWND 1203 + EnableWindow $0 0 + SendMessage $0 ${WM_ENABLE} 1 0 + SendMessage $0 ${WM_SETTEXT} 1 "STR:/NUL" + GetDlgItem $0 $HWND 1204 + EnableWindow $0 0 + GetDlgItem $0 $HWND 1211 + EnableWindow $0 0 + abort + + + LineReadSend: + StrCmp $R0 "2. LineRead" 0 FileReadFromEndSend + StrCpy $FUNCTION LineRead + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINEREAD2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Line #" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + + FileReadFromEndSend: + StrCmp $R0 "3. FileReadFromEnd" 0 LineSumSend + StrCpy $FUNCTION FileReadFromEnd + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEREADFROMEND1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1209 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:View" + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" + Abort + + LineSumSend: + StrCmp $R0 "4. LineSum" 0 FileJoinSend + StrCpy $FUNCTION LineSum + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$LINESUM1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + + FileJoinSend: + StrCmp $R0 "5. FileJoin" 0 TextCompareSend + StrCpy $FUNCTION FileJoin + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 1 + EnableWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILEJOIN3" + GetDlgItem $0 $HWND 1206 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile1" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile2" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:OutputFile" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + + TextCompareSend: + StrCmp $R0 "6. TextCompare" 0 ConfigReadSend + StrCmp $FUNCTION TextCompare 0 TextCompareSend2 + StrCmp $R5 "Example1" 0 +3 + StrCpy $TEXTCOMPARE3 "FastDiff" + goto TextCompareSend2 + StrCmp $R5 "Example2" 0 +3 + StrCpy $TEXTCOMPARE3 "FastDiff" + goto TextCompareSend2 + StrCmp $R5 "Example3" 0 +3 + StrCpy $TEXTCOMPARE3 "FastEqual" + goto TextCompareSend2 + StrCmp $R5 "Example4" 0 +3 + StrCpy $TEXTCOMPARE3 "SlowDiff" + goto TextCompareSend2 + StrCmp $R5 "Example5" 0 +2 + StrCpy $TEXTCOMPARE3 "SlowEqual" + + TextCompareSend2: + StrCpy $FUNCTION TextCompare + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE1" + GetDlgItem $0 $HWND 1203 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 1 + EnableWindow $0 0 + SendMessage $0 ${WM_ENABLE} 1 0 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$TEXTCOMPARE3" + GetDlgItem $0 $HWND 1208 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:View" + GetDlgItem $0 $HWND 1212 + ShowWindow $0 1 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile1" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:TextFile2" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Option" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Function" + abort + + ConfigReadSend: + StrCmp $R0 "7. ConfigRead" 0 ConfigWriteSend + StrCpy $FUNCTION ConfigRead + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGREAD2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + + ConfigWriteSend: + StrCmp $R0 "8. ConfigWrite" 0 FileRecodeSend + StrCpy $FUNCTION ConfigWrite + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$CONFIGWRITE3" + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Entry" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Value" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + + FileRecodeSend: + StrCmp $R0 "9. FileRecode" 0 Abort + StrCpy $FUNCTION FileRecode + GetDlgItem $0 $HWND 1201 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE1" + GetDlgItem $0 $HWND 1203 + ShowWindow $0 1 + SendMessage $0 ${WM_SETTEXT} 1 "STR:$FILERECODE2" + GetDlgItem $0 $HWND 1204 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1205 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1211 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1212 + ShowWindow $0 0 + GetDlgItem $0 $HWND 1213 + SendMessage $0 ${WM_SETTEXT} 1 "STR:InputFile" + GetDlgItem $0 $HWND 1214 + SendMessage $0 ${WM_SETTEXT} 1 "STR:Format" + GetDlgItem $0 $HWND 1215 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $0 $HWND 1216 + SendMessage $0 ${WM_SETTEXT} 1 "STR:" + Abort + +;=Enter= + Enter: + StrCmp $R1 '' 0 +3 + StrCpy $0 'Choose InputFile' + goto send + IfFileExists $R1 +3 + StrCpy $0 'InputFile is not exist' + goto send + + StrCmp $R0 "1. LineFind" LineFindRead + StrCmp $R0 "2. LineRead" LineRead + StrCmp $R0 "3. FileReadFromEnd" FileReadFromEnd + StrCmp $R0 "4. LineSum" LineSum + StrCmp $R0 "5. FileJoin" FileJoin + StrCmp $R0 "6. TextCompare" LineFind-TextCompare + StrCmp $R0 "7. ConfigRead" ConfigRead + StrCmp $R0 "8. ConfigWrite" ConfigWrite + StrCmp $R0 "9. FileRecode" FileRecode + Abort + + LineFindRead: + StrCmp $R4 "Example7" 0 LineFind-TextCompare + ${LineFind} '$R1' '/NUL' '$R3' LineFindCallback + IfErrors error + StrCmp $R0 StopLineFind 0 done + StrCpy $0 'stopped' + goto send + + LineFind-TextCompare: + GetLabelAddress $6 LineFindBack + goto Edit + LineFindBack: + FileClose $0 + StrCmp $R0 "6. TextCompare" Compile + StrCmp $CALLBACK '' Compile + ${FileJoin} "$PROJECT" "$CALLBACK" "" + + Compile: + StrCmp $LOG '' 0 +4 + GetTempFileName $LOG $PLUGINSDIR + GetDlgItem $0 $HWND 1212 + EnableWindow $0 1 + ReadRegStr $0 HKLM "SOFTWARE\NSIS" "" + IfErrors 0 +2 + StrCpy $0 "${NSISDIR}" + nsExec::Exec '"$0\makensis.exe" /O$LOG $PROJECT' + Pop $0 + StrCmp $0 0 0 +6 + ExecWait '$PROJECT.exe' $0 + Delete $PROJECT + Delete $PROJECT.exe + StrCpy $PROJECT '' + goto done + MessageBox MB_YESNO|MB_ICONEXCLAMATION "Compile error. Open log?" IDNO +2 + Exec 'notepad.exe $LOG' + StrCpy $0 "Compile Error" + goto send + + LineRead: + ${LineRead} "$R1" "$R2" $0 + IfErrors error send + + FileReadFromEnd: + ${FileReadFromEnd} "$R1" "FileReadFromEndCallback" + IfErrors error + StrCmp $R0 StopFileReadFromEnd 0 done + StrCpy $0 'stopped' + goto send + + LineSum: + ${LineSum} "$R1" $0 + IfErrors error send + + FileJoin: + ${FileJoin} "$R1" "$R2" "$R3" + IfErrors error + MessageBox MB_YESNO " Open output file?" IDNO done + StrCmp $R3 '' 0 +3 + Exec '"notepad.exe" "$R1"' + goto done + Exec '"notepad.exe" "$R3"' + goto done + + ConfigRead: + ${ConfigRead} "$R1" "$R2" $0 + IfErrors error send + + ConfigWrite: + ${ConfigWrite} "$R1" "$R2" "$R3" $0 + IfErrors error + MessageBox MB_YESNO " Open output file?" IDNO send + Exec '"notepad.exe" "$R1"' + goto send + + FileRecode: + ${FileRecode} "$R1" "$R2" + IfErrors error + MessageBox MB_YESNO " Open output file?" IDNO done + Exec '"notepad.exe" "$R1"' + goto done + + error: + StrCpy $0 'error' + goto send + + done: + StrCpy $0 'Done' + + send: + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$0" + + abort: + Abort +FunctionEnd + +Function LineFindCallback + MessageBox MB_OKCANCEL '$$R9 "Line"=[$R9]$\n$$R8 "#"=[$R8]$\n$$R7 "-#"=[$R7]$\n$$R6 "Range"=[$R6]$\n$$R5 "Read"=[$R5]$\n$$R4 "Write"=[$R4]' IDOK +2 + StrCpy $R0 StopLineFind + + Push $R0 +FunctionEnd + +Function FileReadFromEndCallback + MessageBox MB_OKCANCEL '$$9 "Line"=[$9]$\n$$8 "#"=[$8]$\n$$7 "-#"=[$7]' IDOK +2 + StrCpy $R0 StopFileReadFromEnd + + Push $R0 +FunctionEnd + +Function .onInit + InitPluginsDir + GetTempFileName $INI $PLUGINSDIR + File /oname=$INI "TextFunc.ini" +FunctionEnd + +Page instfiles + +Section -Empty +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/TextFuncTest.nsi b/libs/NSIS/NSIS-source/Examples/TextFuncTest.nsi new file mode 100644 index 0000000000..359cdec8b7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/TextFuncTest.nsi @@ -0,0 +1,414 @@ +;_____________________________________________________________________________ +; +; Text Functions Test +;_____________________________________________________________________________ +; +; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "Text Functions Test" +OutFile "TextFuncTest.exe" +Caption "$(^Name)" +ShowInstDetails show +XPStyle on +RequestExecutionLevel user + +Var FUNCTION +Var TEMPFILE1 +Var TEMPFILE2 +Var TEMPFILE3 +Var HANDLE +Var OUT + +!include "TextFunc.nsh" + +;############### INSTALL ############### + +!define StackVerificationStart `!insertmacro StackVerificationStart` +!macro StackVerificationStart _FUNCTION + StrCpy $FUNCTION ${_FUNCTION} + Call StackVerificationStart +!macroend + +!define StackVerificationEnd `!insertmacro StackVerificationEnd` +!macro StackVerificationEnd + Call StackVerificationEnd +!macroend + +Function StackVerificationStart + StrCpy $0 !0 + StrCpy $1 !1 + StrCpy $2 !2 + StrCpy $3 !3 + StrCpy $4 !4 + StrCpy $5 !5 + StrCpy $6 !6 + StrCpy $7 !7 + StrCpy $8 !8 + StrCpy $9 !9 + StrCpy $R0 !R0 + StrCpy $R1 !R1 + StrCpy $R2 !R2 + StrCpy $R3 !R3 + StrCpy $R4 !R4 + StrCpy $R5 !R5 + StrCpy $R6 !R6 + StrCpy $R7 !R7 + StrCpy $R8 !R8 + StrCpy $R9 !R9 +FunctionEnd + +Function StackVerificationEnd + IfErrors +3 + DetailPrint 'PASSED $FUNCTION no errors' + goto +2 + DetailPrint 'FAILED $FUNCTION error' + + StrCmp $0 '!0' 0 error + StrCmp $1 '!1' 0 error + StrCmp $2 '!2' 0 error + StrCmp $3 '!3' 0 error + StrCmp $4 '!4' 0 error + StrCmp $5 '!5' 0 error + StrCmp $6 '!6' 0 error + StrCmp $7 '!7' 0 error + StrCmp $8 '!8' 0 error + StrCmp $9 '!9' 0 error + StrCmp $R0 '!R0' 0 error + StrCmp $R1 '!R1' 0 error + StrCmp $R2 '!R2' 0 error + StrCmp $R3 '!R3' 0 error + StrCmp $R4 '!R4' 0 error + StrCmp $R5 '!R5' 0 error + StrCmp $R6 '!R6' 0 error + StrCmp $R7 '!R7' 0 error + StrCmp $R8 '!R8' 0 error + StrCmp $R9 '!R9' 0 error + DetailPrint 'PASSED $FUNCTION stack' + goto end + + error: + DetailPrint 'FAILED $FUNCTION stack' +; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 +; quit + + end: +FunctionEnd + + + +Section CreateTestFile + GetTempFileName $TEMPFILE1 + FileOpen $HANDLE $TEMPFILE1 w + FileWrite $HANDLE '1A=a$\r$\n' + FileWrite $HANDLE '2B=b$\r$\n' + FileWrite $HANDLE '3C=c$\r$\n' + FileWrite $HANDLE '4D=d$\r$\n' + FileWrite $HANDLE '5E=e$\r$\n' + FileClose $HANDLE + GetTempFileName $TEMPFILE2 + GetTempFileName $TEMPFILE3 +SectionEnd + + +Section LineFind + ${StackVerificationStart} LineFind + + ${LineFind} '$TEMPFILE1' '/NUL' '1:-4 3 -1' 'LineFindCallback1' + IfErrors error + StrCmp $OUT '|1:2|-5|1|1A=a$\r$\n|1:2|-4|2|2B=b$\r$\n|3:3|-3|3|3C=c$\r$\n' 0 error + + StrCpy $OUT '' + SetDetailsPrint none + ${LineFind} '$TEMPFILE1' '$TEMPFILE2' '1:-1' 'LineFindCallback2' + SetDetailsPrint both + IfErrors error + StrCmp $OUT '|1:-1||1|1A=a$\r$\n|1:-1||2|4D=d$\r$\n|1:-1||3|3C=c$\r$\n|1:-1||4|2B=B$\r$\n|1:-1||5|5E=e$\r$\n' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + +Function LineFindCallback1 + StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9' + StrCmp $R8 3 0 +2 + StrCpy $0 StopLineFind + + Push $0 +FunctionEnd + +Function LineFindCallback2 + StrCmp $R8 2 0 +2 + StrCpy $R9 '4D=d$\r$\n' + StrCmp $R8 4 0 +2 + StrCpy $R9 '2B=B$\r$\n' + + StrCpy $OUT '$OUT|$R6|$R7|$R8|$R9' + + Push $0 +FunctionEnd + + +Section LineRead + ${StackVerificationStart} LineRead + + ${LineRead} '$TEMPFILE1' '-1' $OUT + IfErrors error + StrCmp $OUT '5E=e$\r$\n' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section FileReadFromEnd + ${StackVerificationStart} FileReadFromEnd + + StrCpy $OUT '' + ${FileReadFromEnd} '$TEMPFILE1' 'FileReadFromEndCallback' + IfErrors error + StrCmp $OUT '|-1|5|5E=e$\r$\n|-2|4|4D=d$\r$\n|-3|3|3C=c$\r$\n|-4|2|2B=b$\r$\n' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + +Function FileReadFromEndCallback + StrCpy $OUT '$OUT|$7|$8|$9' + StrCmp $8 2 0 +2 + StrCpy $0 StopFileReadFromEnd + + Push $0 +FunctionEnd + + +Section LineSum + ${StackVerificationStart} LineSum + + ${LineSum} '$TEMPFILE1' $OUT + IfErrors error + StrCmp $OUT '5' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section FileJoin + ${StackVerificationStart} FileJoin + + SetDetailsPrint none + ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3' + SetDetailsPrint both + + ${StackVerificationEnd} +SectionEnd + + +Section TextCompare + ${StackVerificationStart} TextCompare + + StrCpy $OUT '' + ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'TextCompareCallback' + StrCmp $OUT '|2|4D=d$\r$\n|2|2B=b$\r$\n|4|2B=B$\r$\n|4|4D=d$\r$\n' 0 error + + StrCpy $OUT '' + ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastEqual' 'TextCompareCallback' + StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error + + StrCpy $OUT '' + ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback' + StrCmp $OUT '' 0 error + + StrCpy $OUT '' + ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback' + StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|4|2B=B$\r$\n|2|2B=b$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + +Section TextCompareS + ${StackVerificationStart} TextCompareS + + StrCpy $OUT '' + ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowDiff' 'TextCompareCallback' + StrCmp $OUT '|||2|2B=b$\r$\n' 0 error + + StrCpy $OUT '' + ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'SlowEqual' 'TextCompareCallback' + StrCmp $OUT '|1|1A=a$\r$\n|1|1A=a$\r$\n|3|3C=c$\r$\n|3|3C=c$\r$\n|2|4D=d$\r$\n|4|4D=d$\r$\n|5|5E=e$\r$\n|5|5E=e$\r$\n' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + +Function TextCompareCallback + StrCpy $OUT '$OUT|$6|$7|$8|$9' + + Push $0 +FunctionEnd + + +Section ConfigRead + ${StackVerificationStart} ConfigRead + + ${ConfigRead} '$TEMPFILE1' '3c=' $OUT + StrCmp $OUT 'c' 0 error + + ${ConfigRead} '$TEMPFILE1' '6F=' $OUT + StrCmp $OUT '' 0 error + + ${ConfigRead} '$TEMPFILE1' 'FF=' $OUT + IfErrors 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section ConfigReadS + ${StackVerificationStart} ConfigReadS + + ${ConfigReadS} '$TEMPFILE1' '3C=' $OUT + StrCmp $OUT 'c' 0 error + + ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT + IfErrors 0 error + StrCmp $OUT '' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section ConfigWrite + ${StackVerificationStart} ConfigWrite + + ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT + StrCmp $OUT 'CHANGED' 0 error + + ${ConfigWrite} '$TEMPFILE1' '2B=' '' $OUT + StrCmp $OUT 'DELETED' 0 error + + ${ConfigWrite} '$TEMPFILE1' '3c=' 'c' $OUT + StrCmp $OUT 'SAME' 0 error + + ${ConfigWrite} '$TEMPFILE1' '6F=' '*' $OUT + StrCmp $OUT 'ADDED' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section ConfigWriteS + ${StackVerificationStart} ConfigWriteS + + ${ConfigWriteS} '$TEMPFILE1' '5e=' 'e**' $OUT + StrCmp $OUT 'ADDED' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section FileRecode + ${StackVerificationStart} FileRecode + + ${FileRecode} '$TEMPFILE1' 'CharToOem' + + ${StackVerificationEnd} +SectionEnd + + +Section TrimNewLines + ${StackVerificationStart} TrimNewLines + + ${TrimNewLines} 'Text Line$\r$\n' $OUT + StrCmp $OUT 'Text Line' 0 error + + ${TrimNewLines} 'Text Line' $OUT + StrCmp $OUT 'Text Line' 0 error + + ${TrimNewLines} 'Text Line$\n' $OUT + StrCmp $OUT 'Text Line' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WriteUninstaller + SetDetailsPrint none + Delete $TEMPFILE1 + Delete $TEMPFILE2 + Delete $TEMPFILE3 + SetDetailsPrint both + goto +2 + WriteUninstaller '$EXEDIR\un.TextFuncTest.exe' +SectionEnd + + + +;############### UNINSTALL ############### + +Section un.Uninstall + ${LineFind} '$TEMPFILE1' '/NUL' '1:-1' 'un.LineFindCallback' + ${LineRead} '$TEMPFILE1' '-1' $OUT + ${FileReadFromEnd} '$TEMPFILE1' 'un.FileReadFromEndCallback' + ${LineSum} '$TEMPFILE1' $OUT + ${FileJoin} '$TEMPFILE1' '$TEMPFILE2' '$TEMPFILE3' + ${TextCompare} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback' + ${TextCompareS} '$TEMPFILE1' '$TEMPFILE2' 'FastDiff' 'un.TextCompareCallback' + ${ConfigRead} '$TEMPFILE1' '3c=' $OUT + ${ConfigReadS} '$TEMPFILE1' '3c=' $OUT + ${ConfigWrite} '$TEMPFILE1' '5E=' 'e**' $OUT + ${ConfigWriteS} '$TEMPFILE1' '5E=' 'e**' $OUT + ${FileRecode} '$TEMPFILE1' 'CharToOem' + ${TrimNewLines} 'Text Line$\r$\n' $OUT +SectionEnd + +Function un.LineFindCallback + Push $0 +FunctionEnd + +Function un.FileReadFromEndCallback + Push $0 +FunctionEnd + +Function un.TextCompareCallback + Push $0 +FunctionEnd diff --git a/libs/NSIS/NSIS-source/Examples/UserInfo/UserInfo.nsi b/libs/NSIS/NSIS-source/Examples/UserInfo/UserInfo.nsi new file mode 100644 index 0000000000..427f0c3c2e --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/UserInfo/UserInfo.nsi @@ -0,0 +1,45 @@ +Name "UserInfo.dll test" +OutFile UserInfo.exe +RequestExecutionLevel Highest + +!define REALMSG "$\nOriginal non-restricted account type: $2" + +Section + ClearErrors + UserInfo::GetName + IfErrors PluginFail + Pop $0 + StrCmp $0 "" 0 +2 ; GetName can return a empty string on Win9x + StrCpy $0 "?" + UserInfo::GetAccountType + Pop $1 + # GetOriginalAccountType will check the tokens of the original user of the + # current thread/process. If the user tokens were elevated or limited for + # this process, GetOriginalAccountType will return the non-restricted + # account type. + # On Vista with UAC, for example, this is not the same value when running + # with `RequestExecutionLevel user`. GetOriginalAccountType will return + # "admin" while GetAccountType will return "user". + UserInfo::GetOriginalAccountType + Pop $2 + StrCmp $1 "Admin" 0 +3 ; Note: Win9x always returns "Admin" + MessageBox MB_OK 'User "$0" is in the Administrators group${REALMSG}' + Goto done + StrCmp $1 "Power" 0 +3 + MessageBox MB_OK 'User "$0" is in the Power Users group${REALMSG}' + Goto done + StrCmp $1 "User" 0 +3 + MessageBox MB_OK 'User "$0" is just a regular user${REALMSG}' + Goto done + StrCmp $1 "Guest" 0 +3 + MessageBox MB_OK 'User "$0" is a guest${REALMSG}' + Goto done + MessageBox MB_OK "Unknown error" + Goto done + + PluginFail: + MessageBox MB_OK "Error! Unable to call plug-in!" + + done: +SectionEnd + diff --git a/libs/NSIS/NSIS-source/Examples/VPatch/example.nsi b/libs/NSIS/NSIS-source/Examples/VPatch/example.nsi new file mode 100644 index 0000000000..081420e465 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/VPatch/example.nsi @@ -0,0 +1,62 @@ +;VPatch example +;Written by Joost Verburg + +;-------------------------------- + +; The name of the installer +Name "VPatch Test" + +; The file to write +OutFile "vpatchtest.exe" + +; The default installation directory +InstallDir "$PROGRAMFILES\VPatch Test" + +; The text to prompt the user to enter a directory +DirText "Choose a folder in which to install the VPatch Test!" + +; Show details +ShowInstDetails show + +;-------------------------------- +; The normal way to use VPatch +;-------------------------------- +!include "VPatchLib.nsh" + +Section "Update file" + ; Set output path to the installation directory + SetOutPath $INSTDIR + + ; Extract the old file under name 'updatefile.txt' + File /oname=updatefile.txt oldfile.txt + + ; Update the file - it will be replaced with the new version + DetailPrint "Updating updatefile.txt using patch..." + !insertmacro VPatchFile "patch.pat" "$INSTDIR\updatefile.txt" "$INSTDIR\temporaryfile.txt" + +SectionEnd + +;------------------------------- +; The hard way to use VPatch +;------------------------------- +Section "New version in separate file" + + ; Set output path to the installation directory + SetOutPath $INSTDIR + + ; Extract the old file + File oldfile.txt + + ; Extract the patch to the plug-ins folder (temporary) + InitPluginsDir + File /oname=$PLUGINSDIR\patch.pat patch.pat + + ; Update the old file to the new file using the patch + DetailPrint "Updating oldfile.txt using patch to newfile.txt..." + vpatch::vpatchfile "$PLUGINSDIR\patch.pat" "$INSTDIR\oldfile.txt" "$INSTDIR\newfile.txt" + + ; Show result + Pop $R0 + DetailPrint "Result: $R0" + +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/VPatch/newfile.txt b/libs/NSIS/NSIS-source/Examples/VPatch/newfile.txt new file mode 100644 index 0000000000..2369a70757 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/VPatch/newfile.txt @@ -0,0 +1,6 @@ +*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE *** +*** COMPILE EXAMPLE.NSI TO TEST *** + +newfile - vpatch + +67890 - GHIJKL \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/VPatch/oldfile.txt b/libs/NSIS/NSIS-source/Examples/VPatch/oldfile.txt new file mode 100644 index 0000000000..a378cf30f4 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/VPatch/oldfile.txt @@ -0,0 +1,6 @@ +*** THIS IS A TEST FILE FOR THE VPATCH EXAMPLE *** +*** COMPILE EXAMPLE.NSI TO TEST *** + +oldfile - vpatch + +12345 - ABCDEF \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/VPatch/patch.pat b/libs/NSIS/NSIS-source/Examples/VPatch/patch.pat new file mode 100644 index 0000000000000000000000000000000000000000..e1e5304adc80a6aa747187ac77e8c0a26b57f568 GIT binary patch literal 99 zcmWFwa13E&U}#`wU|_iOTl*qw*q`1@4eOWHW{G6oGq&|s-;v{Uzpwrm3+v$wW1t$w zXduDBs+5;no|c)Ds-UY-R*+bdoWaY*%VlP6VQByqarf}_^7i@9&@A56Eq|C10Cj91 AO8@`> literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Examples/VersionInfo.nsi b/libs/NSIS/NSIS-source/Examples/VersionInfo.nsi new file mode 100644 index 0000000000..1ff449d1e5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/VersionInfo.nsi @@ -0,0 +1,29 @@ +; VersionInfo.nsi +; +; This script shows you how to add version information to an installer. +; Windows shows this information on the Version tab of the File properties. + +;-------------------------------- + +Name "Version Info" + +OutFile "VersionInfo.exe" + +LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" +;-------------------------------- +;Version Information + + VIProductVersion "1.2.3.4" + VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application" + VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment" + VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company" + VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company" + VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright Fake company" + VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application" + VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3" + +;-------------------------------- + +Section "" + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/WordFunc.ini b/libs/NSIS/NSIS-source/Examples/WordFunc.ini new file mode 100644 index 0000000000..38c748d876 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/WordFunc.ini @@ -0,0 +1,107 @@ +[Settings] +NumFields=13 +NextButtonText=&Enter + +[Field 1] +Type=Droplist +Flags=NOTIFY +State=1. WordFind (Find word by number) +ListItems=1. WordFind (Find word by number)| (Delimiter exclude)| (Sum of words)| (Sum of delimiters)| (Find word number)| ( }} )| ( {} )| ( *} )|2. WordFind2X|3. WordReplace (Replace)| (Delete)| (Multiple-replace)|4. WordAdd (Add)| (Delete) |5. WordInsert|6. StrFilter (UpperCase)| (LowerCase)| (Filter)|7. VersionCompare|8. VersionConvert +Left=44 +Right=190 +Top=10 +Bottom=191 + +[Field 2] +Type=Text +State=C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS +Left=44 +Right=-10 +Top=30 +Bottom=41 + +[Field 3] +Type=Text +State=|C:\ +Left=44 +Right=-10 +Top=46 +Bottom=59 + +[Field 4] +Type=Text +Flags=DISABLED +Left=44 +Right=-10 +Top=62 +Bottom=75 + +[Field 5] +Type=Text +State=-4 +Left=44 +Right=-10 +Top=80 +Bottom=92 + +[Field 6] +Type=Text +Left=10 +Right=-30 +Top=108 +Bottom=120 + +[Field 7] +Type=Text +Left=-22 +Right=-10 +Top=108 +Bottom=120 + +[Field 8] +Type=Label +Text=String +Left=10 +Right=43 +Top=32 +Bottom=44 + +[Field 9] +Type=Label +Text=Delimiter +Left=10 +Right=43 +Top=48 +Bottom=60 + +[Field 10] +Type=Label +Left=10 +Right=44 +Top=65 +Bottom=76 + +[Field 11] +Type=Label +Text=Word # +Left=10 +Right=43 +Top=81 +Bottom=94 + +[Field 12] +Type=Label +Text=Result (Word): +Left=10 +Right=236 +Top=97 +Bottom=110 + +[Field 13] +Type=Label +Text=EL +Left=-21 +Right=-10 +Top=97 +Bottom=110 + diff --git a/libs/NSIS/NSIS-source/Examples/WordFunc.nsi b/libs/NSIS/NSIS-source/Examples/WordFunc.nsi new file mode 100644 index 0000000000..a0e9f9972f --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/WordFunc.nsi @@ -0,0 +1,535 @@ +;_____________________________________________________________________________ +; +; Word Functions +;_____________________________________________________________________________ +; +; 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "Word Functions" +OutFile "WordFunc.exe" +Caption "$(^Name)" +XPStyle on +RequestExecutionLevel user + +Var INI +Var HWND +Var STATE + +!include "WinMessages.nsh" +!include "WordFunc.nsh" + +Page Custom ShowCustom LeaveCustom + +Function ShowCustom + InstallOptions::initDialog "$INI" + Pop $hwnd + InstallOptions::show + Pop $0 +FunctionEnd + +Function LeaveCustom + ReadINIStr $0 $INI "Settings" "State" + StrCmp $0 0 Enter + + GetDlgItem $1 $HWND 1202 + EnableWindow $1 1 + GetDlgItem $1 $HWND 1203 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1204 + ShowWindow $1 1 + GetDlgItem $1 $HWND 1206 + EnableWindow $1 1 + GetDlgItem $1 $HWND 1205 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1206 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + + ReadINIStr $0 $INI "Field 1" "State" + StrCmp $0 "1. WordFind (Find word by number)" 0 WordFind2Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:-4" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):" + goto WordFindSend + + WordFind2Send: + StrCmp $0 " (Delimiter exclude)" 0 WordFind3Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E-2{" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{ or }after delimiter):" + goto WordFindSend + + WordFind3Send: + StrCmp $0 " (Sum of words)" 0 WordFind4Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:#" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of words):" + goto WordFindSend + + WordFind4Send: + StrCmp $0 " (Sum of delimiters)" 0 WordFind5Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E*" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Option" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Sum of delimiters):" + goto WordFindSend + + WordFind5Send: + StrCmp $0 " (Find word number)" 0 WordFind6Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:/Program Files" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:/Word" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word #):" + goto WordFindSend + + WordFind6Send: + StrCmp $0 " ( }} )" 0 WordFind7Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2}}" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{{ or }}after word):" + goto WordFindSend + + WordFind7Send: + StrCmp $0 " ( {} )" 0 WordFind8Send + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+2{}" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Without word):" + goto WordFindSend + + WordFind8Send: + StrCmp $0 " ( *} )" 0 WordFind2XSend + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|C:\" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2*}" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Before{* or *}after word with word):" + goto WordFindSend + + WordFind2XSend: + StrCmp $0 "2. WordFind2X" 0 WordReplace1Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:[C:\" + GetDlgItem $1 $HWND 1203 + EnableWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:];" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2" + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter1" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter2" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (Word):" + abort + + WordReplace1Send: + StrCmp $0 "3. WordReplace (Replace)" 0 WordReplace2Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:bmp" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+2" + goto WordReplaceSend + + WordReplace2Send: + StrCmp $0 " (Delete)" 0 WordReplace3Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:SYS" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E+" + goto WordReplaceSend + + WordReplace3Send: + StrCmp $0 " (Multiple-replace)" 0 WordAdd1Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys||||||C:\logo.sys|||C:\WINDOWS" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+1*" + goto WordReplaceSend + + WordAdd1Send: + StrCmp $0 "4. WordAdd (Add)" 0 WordAdd2Send + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+C:\WINDOWS|C:\config.sys|C:\IO.SYS" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 + String2):" + goto WordAddSend + + WordAdd2Send: + StrCmp $0 " (Delete) " 0 WordInsertSend + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E-C:\WINDOWS|C:\config.sys|C:\IO.SYS" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String1 - String2):" + goto WordAddSend + + WordInsertSend: + StrCmp $0 "5. WordInsert" 0 StrFilter1Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\WINDOWS" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|" + GetDlgItem $1 $HWND 1203 + EnableWindow $1 1 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\logo.sys" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:E+2" + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:" + abort + + StrFilter1Send: + StrCmp $0 "6. StrFilter (UpperCase)" 0 StrFilter2Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in uppercase):" + goto StrFilterSend + + StrFilter2Send: + StrCmp $0 " (LowerCase)" 0 StrFilter3Send + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:-" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:ef" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String in lowercase except EF):" + goto StrFilterSend + + StrFilter3Send: + StrCmp $0 " (Filter)" 0 VersionCompareSend + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:123abc 456DEF 7890|%#" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:+12" + GetDlgItem $1 $HWND 1203 + SendMessage $1 ${WM_SETTEXT} 1 "STR:b" + GetDlgItem $1 $HWND 1204 + SendMessage $1 ${WM_SETTEXT} 1 "STR:def" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (String Digits + Letters + b - def):" + goto StrFilterSend + + VersionCompareSend: + StrCmp $0 "7. VersionCompare" 0 VersionConvertSend + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.9" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:1.1.1.01" + GetDlgItem $1 $HWND 1203 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1204 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1206 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Version1" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Version2" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (0-equal 1-newer 2-older):" + abort + + VersionConvertSend: + StrCmp $0 "8. VersionConvert" 0 Abort + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:9.0c" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1203 + ShowWindow $1 0 + GetDlgItem $1 $HWND 1204 + ShowWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1206 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Version" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:CharList" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result (numerical version format):" + abort + + Abort: + Abort + + WordFindSend: + GetDlgItem $1 $HWND 1203 + EnableWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\Program Files|C:\WINDOWS" + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + Abort + + WordReplaceSend: + GetDlgItem $1 $HWND 1203 + EnableWindow $1 1 + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Replace it" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR: with" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Word #" + GetDlgItem $1 $HWND 1211 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Result:" + Abort + + WordAddSend: + GetDlgItem $1 $HWND 1203 + EnableWindow $1 0 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1201 + SendMessage $1 ${WM_SETTEXT} 1 "STR:C:\io.sys|C:\logo.sys|C:\WINDOWS" + GetDlgItem $1 $HWND 1202 + SendMessage $1 ${WM_SETTEXT} 1 "STR:|" + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String1" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Delimiter" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String2" + Abort + + StrFilterSend: + GetDlgItem $1 $HWND 1203 + EnableWindow $1 1 + GetDlgItem $1 $HWND 1206 + EnableWindow $1 0 + GetDlgItem $1 $HWND 1207 + SendMessage $1 ${WM_SETTEXT} 1 "STR:String" + GetDlgItem $1 $HWND 1208 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Filter" + GetDlgItem $1 $HWND 1209 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Include" + GetDlgItem $1 $HWND 1210 + SendMessage $1 ${WM_SETTEXT} 1 "STR:Exclude" + Abort + +;=Enter= + Enter: + StrCpy $0 '' + ReadINIStr $STATE $INI "Field 1" "State" + ReadINIStr $R1 $INI "Field 2" "State" + ReadINIStr $R2 $INI "Field 3" "State" + ReadINIStr $R3 $INI "Field 4" "State" + ReadINIStr $R4 $INI "Field 5" "State" + + StrCmp $STATE "1. WordFind (Find word by number)" WordFind + StrCmp $STATE " (Delimiter exclude)" WordFind + StrCmp $STATE " (Find in string)" WordFind + StrCmp $STATE " (Sum of words)" WordFind + StrCmp $STATE " (Sum of delimiters)" WordFind + StrCmp $STATE " (Find word number)" WordFind + StrCmp $STATE " ( }} )" WordFind + StrCmp $STATE " ( {} )" WordFind + StrCmp $STATE " ( *} )" WordFind + StrCmp $STATE "2. WordFind2X" WordFind2X + StrCmp $STATE "3. WordReplace (Replace)" WordReplace + StrCmp $STATE " (Delete)" WordReplace + StrCmp $STATE " (Multiple-replace)" WordReplace + StrCmp $STATE "4. WordAdd (Add)" WordAdd + StrCmp $STATE " (Delete) " WordAdd + StrCmp $STATE "5. WordInsert" WordInsert + StrCmp $STATE "6. StrFilter (UpperCase)" StrFilter + StrCmp $STATE " (LowerCase)" StrFilter + StrCmp $STATE " (Filter)" StrFilter + StrCmp $STATE "7. VersionCompare" VersionCompare + StrCmp $STATE "8. VersionConvert" VersionConvert + Abort + + WordFind: + ${WordFind} "$R1" "$R2" "$R4" $R0 + IfErrors 0 Send + StrCpy $0 $R0 + StrCmp $R0 3 0 +3 + StrCpy $3 '"+1" "-1" "+1}" "+1{" "#" "/word"' + goto error3 + StrCmp $R0 2 0 error1 + StrCpy $R4 $R4 '' 1 + StrCpy $1 $R4 1 + StrCmp $1 / 0 error2 + StrCpy $R4 $R4 '' 1 + StrCpy $R0 '"$R4" no such word.' + goto Send + + WordFind2X: + ${WordFind2X} "$R1" "$R2" "$R3" "$R4" $R0 + IfErrors 0 Send + StrCpy $0 $R0 + StrCmp $R0 3 0 +3 + StrCpy $3 '"+1" "-1"' + goto error3 + StrCmp $R0 2 +3 + StrCpy $R0 '"$R2...$R3" no words found.' + goto Send + StrCpy $R4 $R4 '' 1 + StrCpy $1 $R4 1 + StrCmp $1 / 0 +2 + StrCpy $R4 $R4 '' 1 + StrCpy $R0 '"$R4" no such word.' + goto Send + + WordReplace: + ${WordReplace} "$R1" "$R2" "$R3" "$R4" $R0 + IfErrors 0 Send + StrCpy $0 $R0 + StrCmp $R0 3 0 +3 + StrCpy $3 '"+1" "+1*" "+" "+*" "{}"' + goto error3 + StrCmp $R0 2 0 error1 + StrCpy $R4 $R4 '' 1 + goto error2 + + WordAdd: + ${WordAdd} "$R1" "$R2" "$R4" $R0 + IfErrors 0 Send + StrCpy $0 $R0 + StrCmp $R0 3 0 error1empty + StrCpy $3 '"+text" "-text"' + goto error3 + + WordInsert: + ${WordInsert} "$R1" "$R2" "$R3" "$R4" $R0 + IfErrors 0 Send + StrCpy $0 $R0 + StrCmp $R0 3 0 +3 + StrCpy $3 '"+1" "-1"' + goto error3 + StrCmp $R0 2 0 error1empty + StrCpy $R4 $R4 '' 1 + goto error2 + + StrFilter: + ${StrFilter} "$R1" "$R2" "$R3" "$R4" $R0 + IfErrors 0 Send + StrCpy $R0 'Syntax error' + goto Send + + VersionCompare: + ${VersionCompare} "$R1" "$R2" $R0 + goto Send + + VersionConvert: + ${VersionConvert} "$R1" "$R2" $R0 + goto Send + + error3: + StrCpy $R0 '"$R4" syntax error ($3)' + goto Send + error2: + StrCpy $R0 '"$R4" no such word number' + goto Send + error1empty: + StrCpy $R0 '"$R2" delimiter is empty' + goto Send + error1: + StrCpy $R0 '"$R2" delimiter not found in string' + goto Send + + Send: + GetDlgItem $1 $HWND 1205 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$R0" + GetDlgItem $1 $HWND 1206 + SendMessage $1 ${WM_SETTEXT} 1 "STR:$0" + abort +FunctionEnd + +Function .onInit + InitPluginsDir + GetTempFileName $INI $PLUGINSDIR + File /oname=$INI "WordFunc.ini" +FunctionEnd + +Page instfiles + +Section "Empty" +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/WordFuncTest.nsi b/libs/NSIS/NSIS-source/Examples/WordFuncTest.nsi new file mode 100644 index 0000000000..e9d1160bbb --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/WordFuncTest.nsi @@ -0,0 +1,610 @@ +;_____________________________________________________________________________ +; +; Word Functions Test +;_____________________________________________________________________________ +; +; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + +Name "Word Functions Test" +OutFile "WordFuncTest.exe" +Caption "$(^Name)" +ShowInstDetails show +XPStyle on +RequestExecutionLevel user + +Var FUNCTION +Var OUT + +!include "WordFunc.nsh" + +;############### INSTALL ############### + +!define StackVerificationStart `!insertmacro StackVerificationStart` +!macro StackVerificationStart _FUNCTION + StrCpy $FUNCTION ${_FUNCTION} + Call StackVerificationStart +!macroend + +!define StackVerificationEnd `!insertmacro StackVerificationEnd` +!macro StackVerificationEnd + Call StackVerificationEnd +!macroend + +Function StackVerificationStart + StrCpy $0 !0 + StrCpy $1 !1 + StrCpy $2 !2 + StrCpy $3 !3 + StrCpy $4 !4 + StrCpy $5 !5 + StrCpy $6 !6 + StrCpy $7 !7 + StrCpy $8 !8 + StrCpy $9 !9 + StrCpy $R0 !R0 + StrCpy $R1 !R1 + StrCpy $R2 !R2 + StrCpy $R3 !R3 + StrCpy $R4 !R4 + StrCpy $R5 !R5 + StrCpy $R6 !R6 + StrCpy $R7 !R7 + StrCpy $R8 !R8 + StrCpy $R9 !R9 +FunctionEnd + +Function StackVerificationEnd + IfErrors +3 + DetailPrint 'PASSED $FUNCTION no errors' + goto +2 + DetailPrint 'FAILED $FUNCTION error' + + StrCmp $0 '!0' 0 error + StrCmp $1 '!1' 0 error + StrCmp $2 '!2' 0 error + StrCmp $3 '!3' 0 error + StrCmp $4 '!4' 0 error + StrCmp $5 '!5' 0 error + StrCmp $6 '!6' 0 error + StrCmp $7 '!7' 0 error + StrCmp $8 '!8' 0 error + StrCmp $9 '!9' 0 error + StrCmp $R0 '!R0' 0 error + StrCmp $R1 '!R1' 0 error + StrCmp $R2 '!R2' 0 error + StrCmp $R3 '!R3' 0 error + StrCmp $R4 '!R4' 0 error + StrCmp $R5 '!R5' 0 error + StrCmp $R6 '!R6' 0 error + StrCmp $R7 '!R7' 0 error + StrCmp $R8 '!R8' 0 error + StrCmp $R9 '!R9' 0 error + DetailPrint 'PASSED $FUNCTION stack' + goto end + + error: + DetailPrint 'FAILED $FUNCTION stack' +; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 +; quit + + end: +FunctionEnd + + + +Section WordFind + ${StackVerificationStart} WordFind + + ${WordFind} '||io.sys|||Program Files|||WINDOWS' '||' '-02' $OUT + StrCmp $OUT '|Program Files' 0 error + + ${WordFind} '||io.sys||||Program Files||||WINDOWS' '||' '-2' $OUT + StrCmp $OUT 'Program Files' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '-2}' $OUT + StrCmp $OUT '|logo.sys|||WINDOWS' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '#' $OUT + StrCmp $OUT '3' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '*' $OUT + StrCmp $OUT '2' 0 error + + ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT + StrCmp $OUT '2' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2}}' $OUT + StrCmp $OUT '|||WINDOWS' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2{}' $OUT + StrCmp $OUT 'C:\io.sys|||WINDOWS' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||WINDOWS' '||' '+2*}' $OUT + StrCmp $OUT '|logo.sys|||WINDOWS' 0 error + + ${WordFind} 'C:\\Program Files\\NSIS\\NSIS.chm' '\' '-2{*' $OUT + StrCmp $OUT 'C:\\Program Files\\NSIS' 0 error + + ${WordFind} 'C:\io.sys|||Program Files|||WINDOWS|||' '||' '-1' $OUT + StrCmp $OUT '|' 0 error + + ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '-1}' $OUT + StrCmp $OUT '' 0 error + + ${WordFind} '||C:\io.sys|||logo.sys|||WINDOWS||' '||' '+1{' $OUT + StrCmp $OUT '' 0 error + + ${WordFind} 'C:\io.sys|||logo.sys' '_' 'E+1' $OUT + IfErrors 0 error + StrCmp $OUT 1 0 error + + ${WordFind} 'C:\io.sys|||logo.sys|||' '\' 'E+3' $OUT + IfErrors 0 error + StrCmp $OUT 2 0 error + + ${WordFind} 'C:\io.sys|||logo.sys' '\' 'E1' $OUT + IfErrors 0 error + StrCmp $OUT 3 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordFindS + ${StackVerificationStart} WordFindS + + ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|PROGRAM FILES' $OUT + StrCmp $OUT 'C:\io.sys|||Program Files|||WINDOWS' 0 error + + ${WordFindS} 'C:\io.sys|||Program Files|||WINDOWS' '||' '/|Program Files' $OUT + StrCmp $OUT '2' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordFind2X + ${StackVerificationStart} WordFind2X + + ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT + StrCmp $OUT 'logo.sys' 0 error + + ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1' $OUT + StrCmp $OUT 'logo' 0 error + + ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{{' $OUT + StrCmp $OUT 'C:\WINDOWS C:\io.sys C:' 0 error + + ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{}' $OUT + StrCmp $OUT 'C:\WINDOWS C:\io.sys C:sys' 0 error + + ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '-1{*' $OUT + StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.' 0 error + + ${WordFind2X} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT + StrCmp $OUT '2' 0 error + + ${WordFind2X} '||a||b||c' '||' '||' 'E+1' $OUT + StrCmp $OUT 'a' 0 error + + ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E+1' $OUT + IfErrors 0 error + StrCmp $OUT 1 0 error + + ${WordFind2X} '[io.sys];[C:\logo.sys]' '[' '];' 'E+2' $OUT + IfErrors 0 error + StrCmp $OUT 2 0 error + + ${WordFind2X} '[io.sys];[C:\logo.sys]' '\' '];' 'E2' $OUT + IfErrors 0 error + StrCmp $OUT 3 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordFind2XS + ${StackVerificationStart} WordFind2XS + + ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/LOGO' $OUT + StrCmp $OUT 'C:\WINDOWS C:\io.sys C:\logo.sys' 0 error + + ${WordFind2XS} 'C:\WINDOWS C:\io.sys C:\logo.sys' '\' '.' '/logo' $OUT + StrCmp $OUT '2' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordFind3X + ${StackVerificationStart} WordFind3X + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT + StrCmp $OUT '1.AAB' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1' $OUT + StrCmp $OUT '2.BAA' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{{' $OUT + StrCmp $OUT '[1.AAB];' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{}' $OUT + StrCmp $OUT '[1.AAB];[3.BBB];' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '-1{*' $OUT + StrCmp $OUT '[1.AAB];[2.BAA];' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT + StrCmp $OUT '2' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'XX' '];' 'E+1' $OUT + IfErrors 0 error + StrCmp $OUT '1' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E+3' $OUT + IfErrors 0 error + StrCmp $OUT '2' 0 error + + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' 'E3' $OUT + IfErrors 0 error + StrCmp $OUT '3' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordFind3XS + ${StackVerificationStart} WordFind3XS + + ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.baa' $OUT + StrCmp $OUT '[1.AAB];[2.BAA];[3.BBB];' 0 error + + ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '/2.BAA' $OUT + StrCmp $OUT '2' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordReplace + ${StackVerificationStart} WordReplace + + ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' '' '+' $OUT + StrCmp $OUT 'C:\io. C:\logo. C:\WINDOWS' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'C:\io.sys' '' '+' $OUT + StrCmp $OUT ' C:\logo.sys C:\WINDOWS' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' ' ' '+1*' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sysSYSsys C:\WINDOWS' 'sys' 'bmp' '+*' $OUT + StrCmp $OUT 'C:\io.bmp C:\logo.bmp C:\WINDOWS' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{' $OUT + StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}' $OUT + StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}' $OUT + StrCmp $OUT '||C:\io.sys C:\logo.sys C:\WINDOWS|||' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{*' $OUT + StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '}*' $OUT + StrCmp $OUT 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWS|' 0 error + + ${WordReplace} 'SYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT + StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error + + ${WordReplace} 'sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys' 'sys' '|' '{}*' $OUT + StrCmp $OUT '|C:\io.sys C:\logo.sys C:\WINDOWS|' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys' '#sys' '|sys|' 'E+1' $OUT + IfErrors 0 error + StrCmp $OUT '1' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E+3' $OUT + IfErrors 0 error + StrCmp $OUT '2' 0 error + + ${WordReplace} 'C:\io.sys C:\logo.sys' '.sys' '|sys|' 'E3' $OUT + IfErrors 0 error + StrCmp $OUT '3' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordReplaceS + ${StackVerificationStart} WordReplaceS + + ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error + + ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'sys' 'bmp' '+2' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.bmp C:\WINDOWS' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordAdd + ${StackVerificationStart} WordAdd + + ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT + StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error + + ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT + StrCmp $OUT 'C:\logo.sys' 0 error + + ${WordAdd} 'C:\io.sys' ' ' '+C:\WINDOWS C:\config.sys C:\IO.SYS' $OUT + StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error + + ${WordAdd} 'C:\io.sys C:\logo.sys C:\WINDOWS' ' ' '-C:\WINDOWS' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error + + ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' '+C:\logo.sys' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error + + ${WordAdd} 'C:\io.sys C:\logo.sys' ' ' 'E-' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys' 0 error + IfErrors error + + ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'E-C:\logo.sys' $OUT + IfErrors 0 error + StrCmp $OUT '1' 0 error + + ${WordAdd} 'C:\io.sys C:\logo.sys' '' 'EC:\logo.sys' $OUT + IfErrors 0 error + StrCmp $OUT '3' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordAddS + ${StackVerificationStart} WordAddS + + ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\windows C:\config.sys' $OUT + StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\windows C:\config.sys' 0 error + + ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT + StrCmp $OUT 'C:\io.sys C:\WINDOWS C:\config.sys' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordInsert + ${StackVerificationStart} WordInsert + + ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT + StrCmp $OUT 'C:\io.sys C:\logo.sys C:\WINDOWS' 0 error + + ${WordInsert} 'C:\io.sys' ' ' 'C:\WINDOWS' '+2' $OUT + StrCmp $OUT 'C:\io.sys C:\WINDOWS' 0 error + + ${WordInsert} '' ' ' 'C:\WINDOWS' '+1' $OUT + StrCmp $OUT 'C:\WINDOWS ' 0 error + + ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E+1' $OUT + IfErrors 0 error + StrCmp $OUT '1' 0 error + + ${WordInsert} 'C:\io.sys C:\logo.sys' ' ' 'C:\logo.sys' 'E+4' $OUT + IfErrors 0 error + StrCmp $OUT '2' 0 error + + ${WordInsert} 'C:\io.sys C:\logo.sys' '' 'C:\logo.sys' 'E1' $OUT + IfErrors 0 error + StrCmp $OUT '3' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WordInsertS + ${StackVerificationStart} WordInsertS + + ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' X ' 'C:\NTLDR' '+2' $OUT + StrCmp $OUT 'C:\io.sys x C:\logo.sys X C:\NTLDR' 0 error + + ${WordInsertS} 'C:\io.sys x C:\logo.sys' ' x ' 'C:\NTLDR' '+2' $OUT + StrCmp $OUT 'C:\io.sys x C:\NTLDR x C:\logo.sys' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section StrFilter + ${StackVerificationStart} StrFilter + + ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT + IfErrors error + StrCmp $OUT '123ABC 456DEF 7890|%#' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '-' 'ef' '' $OUT + IfErrors error + StrCmp $OUT '123abc 456dEF 7890|%#' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '2' '|%' '' $OUT + IfErrors error + StrCmp $OUT 'abcDEF|%' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT + IfErrors error + StrCmp $OUT '123a 6F 78|%#' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT + IfErrors error + StrCmp $OUT '123AbC4567890' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '+12' 'b' 'def' $OUT + IfErrors error + StrCmp $OUT '123AbC4567890' 0 error + + ${StrFilter} '123abc 456DEF 7890|%#' '123' 'b' 'def' $OUT + IfErrors 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section StrFilterS + ${StackVerificationStart} StrFilterS + + ${StrFilterS} '123abc 456DEF 7890|%#' '13' 'af' '4590' $OUT + IfErrors error + StrCmp $OUT '123a 6 78|%#' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section VersionCompare + ${StackVerificationStart} VersionCompare + + ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT + StrCmp $OUT '1' 0 error + + ${VersionCompare} '1.1.1.1' '1.1.1.10' $OUT + StrCmp $OUT '2' 0 error + + ${VersionCompare} '91.1.1.1' '101.1.1.9' $OUT + StrCmp $OUT '2' 0 error + + ${VersionCompare} '1.1.1.1' '1.1.1.1' $OUT + StrCmp $OUT '0' 0 error + + ${VersionCompare} '1.1.1.9' '1.1.1.10' $OUT + StrCmp $OUT '2' 0 error + + ${VersionCompare} '1.1.1.0' '1.1.1' $OUT + StrCmp $OUT '0' 0 error + + ${VersionCompare} '1.1.0.0' '1.1' $OUT + StrCmp $OUT '0' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section VersionConvert + ${StackVerificationStart} VersionConvert + + ${VersionConvert} '9.0a' '' $OUT + StrCmp $OUT '9.0.01' 0 error + + ${VersionConvert} '9.0c' '' $OUT + StrCmp $OUT '9.0.03' 0 error + + ${VersionConvert} '0.15c-9m' '' $OUT + StrCmp $OUT '0.15.03.9.13' 0 error + + ${VersionConvert} '0.15c+' 'abcdefghijklmnopqrstuvwxyz+' $OUT + StrCmp $OUT '0.15.0327' 0 error + + ${VersionConvert} '0.0xa12.x.ax|.|.|x|a|.3|a.4.||5.|' '' $OUT + StrCmp $OUT '0.0.2401.12.24.0124.24.01.3.01.4.5' 0 error + + goto +2 + error: + SetErrors + + ${StackVerificationEnd} +SectionEnd + + +Section WriteUninstaller + goto +2 + WriteUninstaller '$EXEDIR\un.WordFuncTest.exe' +SectionEnd + + + +;############### UNINSTALL ############### + +Section un.Uninstall + ${WordFind} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT + ${WordFindS} 'C:\io.sys C:\Program Files C:\WINDOWS' ' C:\' '-02' $OUT + ${WordFind2X} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT + ${WordFind2XS} '[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]' '[C:\' '];' '+2' $OUT + ${WordFind3X} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT + ${WordFind3XS} '[1.AAB];[2.BAA];[3.BBB];' '[' 'AA' '];' '+1' $OUT + ${WordReplace} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT + ${WordReplaceS} 'C:\io.sys C:\logo.sys C:\WINDOWS' 'SYS' 'bmp' '+2' $OUT + ${WordAdd} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT + ${WordAddS} 'C:\io.sys C:\WINDOWS' ' ' '+C:\WINDOWS C:\config.sys' $OUT + ${WordInsert} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT + ${WordInsertS} 'C:\io.sys C:\WINDOWS' ' ' 'C:\logo.sys' '-2' $OUT + ${StrFilter} '123abc 456DEF 7890|%#' '+' '' '' $OUT + ${StrFilterS} '123abc 456DEF 7890|%#' '+' '' '' $OUT + ${VersionCompare} '1.1.1.9' '1.1.1.01' $OUT + ${VersionConvert} '9.0a' '' $OUT +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/bigtest.nsi b/libs/NSIS/NSIS-source/Examples/bigtest.nsi new file mode 100644 index 0000000000..c4bcb0418b --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/bigtest.nsi @@ -0,0 +1,330 @@ +; bigtest.nsi +; +; This script attempts to test most of the functionality of the NSIS exehead. + +;-------------------------------- + +!ifdef HAVE_UPX +!packhdr tmp.dat "upx\upx -9 tmp.dat" +!endif + +!ifdef NOCOMPRESS +SetCompress off +!endif + +;-------------------------------- + +Name "BigNSISTest" +Caption "NSIS Big Test" +Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico" +OutFile "bigtest.exe" + +SetDateSave on +SetDatablockOptimize on +CRCCheck on +SilentInstall normal +BGGradient 000000 800000 FFFFFF +InstallColors FF8080 000030 +XPStyle on + +InstallDir "$PROGRAMFILES\NSISTest\BigNSISTest" +InstallDirRegKey HKLM "Software\NSISTest\BigNSISTest" "Install_Dir" + +CheckBitmap "${NSISDIR}\Contrib\Graphics\Checks\classic-cross.bmp" + +LicenseText "A test text, make sure it's all there" +LicenseData "bigtest.nsi" + +RequestExecutionLevel admin +ManifestSupportedOS all + +;-------------------------------- + +Page license +Page components +Page directory +Page instfiles + +UninstPage uninstConfirm +UninstPage instfiles + +;-------------------------------- + +!ifndef NOINSTTYPES ; only if not defined + InstType "Most" + InstType "Full" + InstType "More" + InstType "Base" + ;InstType /NOCUSTOM + ;InstType /COMPONENTSONLYONCUSTOM +!endif + +AutoCloseWindow false +ShowInstDetails show + +;-------------------------------- + +Section "" ; empty string makes it hidden, so would starting with - + + ; write reg info + StrCpy $1 "Hello World" + DetailPrint "I like to be able to see what is going on (debug) $1" + WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "Install_Dir" "$INSTDIR" + + ; write uninstall strings + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "DisplayName" "BigNSISTest (remove only)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "UninstallString" '"$INSTDIR\bt-uninst.exe"' + + SetOutPath $INSTDIR + File /a "silent.nsi" + CreateDirectory "$INSTDIR\MyProjectFamily\MyProject" ; 2 recursively create a directory for fun. + WriteUninstaller "$INSTDIR\bt-uninst.exe" + + Nop ; for fun + +SectionEnd + +Section "TempTest" + +SectionIn 1 2 3 + Start: MessageBox MB_OK "Start:" + + MessageBox MB_YESNO "Goto MyLabel" IDYES MyLabel + + MessageBox MB_OK "Right before MyLabel:" + + MyLabel: MessageBox MB_OK "MyLabel:" + + MessageBox MB_OK "Right after MyLabel:" + + MessageBox MB_YESNO "Goto Start:?" IDYES Start + +SectionEnd + +SectionGroup /e SectionGroup1 + +Section "Test Registry/INI functions" + +SectionIn 1 4 3 + + WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "StrTest_INSTDIR" "$INSTDIR" + WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0xDEADBEEF" 0xdeadbeef + WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_123456" 123456 + WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0123" 0123 + WriteRegBin HKLM SOFTWARE\NSISTest\BigNSISTest "BinTest_deadbeef01f00dbeef" "DEADBEEF01F00DBEEF" + StrCpy $8 "$SYSDIR\IniTest" + WriteINIStr "$INSTDIR\test.ini" "MySection" "Value1" $8 + WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value1" $8 + WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value2" $8 + WriteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" $8 + + Call MyFunctionTest + + DeleteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" + DeleteINISec "$INSTDIR\test.ini" "MySectionIni" + + ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1" + StrCmp $1 "" INIDelSuccess + MessageBox MB_OK "DeleteINISec failed" + INIDelSuccess: + + ClearErrors + ReadRegStr $1 HKCR "software\microsoft" xyz_cc_does_not_exist + IfErrors 0 NoError + MessageBox MB_OK "could not read from HKCR\software\microsoft\xyz_cc_does_not_exist" + Goto ErrorYay + NoError: + MessageBox MB_OK "read '$1' from HKCR\software\microsoft\xyz_cc_does_not_exist" + ErrorYay: + +SectionEnd + +Section "Test CreateShortcut" + + SectionIn 1 2 3 + + Call CSCTest + +SectionEnd + +SectionGroup Group2 + +!define ASSERT `!insertmacro ASSERT "${U+24}{__FILE__}" ${U+24}{__LINE__} ` +!macro ASSERT __file __line __xpr +${__xpr} +2 +MessageBox MB_ICONSTOP `ASSERT: ${__xpr} (${__file}:${__line})` +!macroend + +Section "Integer" +IntOp $0 0xffffffff >> 31 +${ASSERT} `IntCmpU $0 -1` +IntOp $0 0xffffffff >>> 31 +${ASSERT} `IntCmpU $0 1` +IntOp $0 1 << 31 +${ASSERT} `IntCmpU $0 0x80000000` +IntOp $0 0x80000000 ^ 0x40000000 +${ASSERT} `IntCmpU $0 0xC0000000` +ClearErrors +IntOp $0 1 / 0 +${ASSERT} `IfErrors ` ; Division by zero must set the error flag +${ASSERT} `IntCmpU $0 0` ; Unspecified result, hopefully it's zero +SectionEnd + +Section "Test Branching" + + BeginTestSection: + SectionIn 1 2 3 + + SetOutPath $INSTDIR + + IfFileExists "$INSTDIR\LogicLib.nsi" 0 BranchTest69 + + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to overwrite $INSTDIR\LogicLib.nsi?" IDNO NoOverwrite ; skipped if file doesn't exist + + BranchTest69: + + SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS + + NoOverwrite: + + File "LogicLib.nsi" ; skipped if answered no + SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS + + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to skip the rest of this section?" IDYES EndTestBranch + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to go back to the beginning of this section?" IDYES BeginTestSection + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to hide the installer and wait five seconds?" IDNO NoHide + + HideWindow + Sleep 5000 + BringToFront + + NoHide: + + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to call the function 5 times?" IDNO NoRecurse + + StrCpy $1 "x" + + LoopTest: + + Call myfunc + StrCpy $1 "x$1" + StrCmp $1 "xxxxxx" 0 LoopTest + + NoRecurse: + + EndTestBranch: + +SectionEnd + +SectionGroupEnd + +Section "Test CopyFiles" + + SectionIn 1 2 3 + + SetOutPath $INSTDIR\cpdest + CopyFiles "$WINDIR\*.ini" "$INSTDIR\cpdest" 0 + +SectionEnd + +SectionGroupEnd + +Section "Test Exec functions" TESTIDX + + SectionIn 1 2 3 + + SearchPath $1 notepad.exe + + MessageBox MB_OK "notepad.exe=$1" + Exec '"$1"' + ExecShell "open" '"$INSTDIR"' + Sleep 500 + BringToFront + +SectionEnd + +Section "Test ActiveX control registration" + + SectionIn 2 + + UnRegDLL "$SYSDIR\spin32.ocx" + Sleep 1000 + RegDLL "$SYSDIR\spin32.ocx" + Sleep 1000 + +SectionEnd + +;-------------------------------- + +Function "CSCTest" + + CreateDirectory "$SMPROGRAMS\Big NSIS Test" + SetOutPath $INSTDIR ; for working directory + CreateShortcut "$SMPROGRAMS\Big NSIS Test\Uninstall BIG NSIS Test.lnk" "$INSTDIR\bt-uninst.exe" ; use defaults for parameters, icon, etc. + ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q) + CreateShortcut "$SMPROGRAMS\Big NSIS Test\silent.nsi.lnk" "$INSTDIR\silent.nsi" "" "$WINDIR\notepad.exe" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q + CreateShortcut "$SMPROGRAMS\Big NSIS Test\TheDir.lnk" "$INSTDIR\" "" "" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z + +FunctionEnd + +Function myfunc + + StrCpy $2 "MyTestVar=$1" + MessageBox MB_OK "myfunc: $2" + +FunctionEnd + +Function MyFunctionTest + + ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1" + StrCmp $1 $8 NoFailedMsg + MessageBox MB_OK "WriteINIStr failed" + + NoFailedMsg: + +FunctionEnd + +Function .onSelChange + + SectionGetText ${TESTIDX} $0 + StrCmp $0 "" e + SectionSetText ${TESTIDX} "" + Goto e2 +e: + SectionSetText ${TESTIDX} "TextInSection" +e2: + +FunctionEnd + +;-------------------------------- + +; Uninstaller + +UninstallText "This will uninstall example2. Hit next to continue." +UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-uninstall.ico" + +Section "Uninstall" + + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" + DeleteRegKey HKLM "SOFTWARE\NSISTest\BigNSISTest" + Delete "$INSTDIR\silent.nsi" + Delete "$INSTDIR\LogicLib.nsi" + Delete "$INSTDIR\bt-uninst.exe" + Delete "$INSTDIR\test.ini" + Delete "$SMPROGRAMS\Big NSIS Test\*.*" + RMDir "$SMPROGRAMS\BiG NSIS Test" + + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to remove the directory $INSTDIR\cpdest?" IDNO NoDelete + Delete "$INSTDIR\cpdest\*.*" + RMDir "$INSTDIR\cpdest" ; skipped if no + NoDelete: + + RMDir "$INSTDIR\MyProjectFamily\MyProject" + RMDir "$INSTDIR\MyProjectFamily" + RMDir "$INSTDIR" + + IfFileExists "$INSTDIR" 0 NoErrorMsg + MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist + NoErrorMsg: + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/example1.nsi b/libs/NSIS/NSIS-source/Examples/example1.nsi new file mode 100644 index 0000000000..e2a3802caa --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/example1.nsi @@ -0,0 +1,45 @@ +; example1.nsi +; +; This script is perhaps one of the simplest NSIs you can make. All of the +; optional settings are left to their default settings. The installer simply +; prompts the user asking them where to install, and drops a copy of example1.nsi +; there. +; +; example2.nsi expands on this by adding a uninstaller and start menu shortcuts. + +;-------------------------------- + +; The name of the installer +Name "Example1" + +; The file to write +OutFile "example1.exe" + +; Request application privileges for Windows Vista +RequestExecutionLevel user + +; Build Unicode installer +Unicode True + +; The default installation directory +InstallDir $DESKTOP\Example1 + +;-------------------------------- + +; Pages + +Page directory +Page instfiles + +;-------------------------------- + +; The stuff to install +Section "" ;No components page, name is not important + + ; Set output path to the installation directory. + SetOutPath $INSTDIR + + ; Put file there + File example1.nsi + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/example2.nsi b/libs/NSIS/NSIS-source/Examples/example2.nsi new file mode 100644 index 0000000000..0e179ef950 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/example2.nsi @@ -0,0 +1,98 @@ +; example2.nsi +; +; This script is based on example1.nsi but it remembers the directory, +; has uninstall support and (optionally) installs start menu shortcuts. +; +; It will install example2.nsi into a directory that the user selects. +; +; See install-shared.nsi for a more robust way of checking for administrator rights. +; See install-per-user.nsi for a file association example. + +;-------------------------------- + +; The name of the installer +Name "Example2" + +; The file to write +OutFile "example2.exe" + +; Request application privileges for Windows Vista and higher +RequestExecutionLevel admin + +; Build Unicode installer +Unicode True + +; The default installation directory +InstallDir $PROGRAMFILES\Example2 + +; Registry key to check for directory (so if you install again, it will +; overwrite the old one automatically) +InstallDirRegKey HKLM "Software\NSIS_Example2" "Install_Dir" + +;-------------------------------- + +; Pages + +Page components +Page directory +Page instfiles + +UninstPage uninstConfirm +UninstPage instfiles + +;-------------------------------- + +; The stuff to install +Section "Example2 (required)" + + SectionIn RO + + ; Set output path to the installation directory. + SetOutPath $INSTDIR + + ; Put file there + File "example2.nsi" + + ; Write the installation path into the registry + WriteRegStr HKLM SOFTWARE\NSIS_Example2 "Install_Dir" "$INSTDIR" + + ; Write the uninstall keys for Windows + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "DisplayName" "NSIS Example2" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "UninstallString" '"$INSTDIR\uninstall.exe"' + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" "NoRepair" 1 + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + +; Optional section (can be disabled by the user) +Section "Start Menu Shortcuts" + + CreateDirectory "$SMPROGRAMS\Example2" + CreateShortcut "$SMPROGRAMS\Example2\Uninstall.lnk" "$INSTDIR\uninstall.exe" + CreateShortcut "$SMPROGRAMS\Example2\Example2 (MakeNSISW).lnk" "$INSTDIR\example2.nsi" + +SectionEnd + +;-------------------------------- + +; Uninstaller + +Section "Uninstall" + + ; Remove registry keys + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Example2" + DeleteRegKey HKLM SOFTWARE\NSIS_Example2 + + ; Remove files and uninstaller + Delete $INSTDIR\example2.nsi + Delete $INSTDIR\uninstall.exe + + ; Remove shortcuts, if any + Delete "$SMPROGRAMS\Example2\*.lnk" + + ; Remove directories + RMDir "$SMPROGRAMS\Example2" + RMDir "$INSTDIR" + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/gfx.nsi b/libs/NSIS/NSIS-source/Examples/gfx.nsi new file mode 100644 index 0000000000..05af85295a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/gfx.nsi @@ -0,0 +1,123 @@ +; gfx.nsi +; +; This script shows some examples of using all of the new +; graphic related additions introduced in NSIS 2 +; +; Written by Amir Szkeley 22nd July 2002 + +;-------------------------------- + +!macro BIMAGE IMAGE PARMS + Push $0 + GetTempFileName $0 + File /oname=$0 "${IMAGE}" + SetBrandingImage ${PARMS} $0 + Delete $0 + Pop $0 +!macroend + +;-------------------------------- + +Name "Graphical effects" + +OutFile "gfx.exe" + +; Adds an XP manifest to the installer +XPStyle on + +; Add branding image to the installer (an image placeholder on the side). +; It is not enough to just add the placeholder, we must set the image too... +; We will later set the image in every pre-page function. +; We can also set just one persistent image in .onGUIInit +AddBrandingImage left 100u + +; Sets the font of the installer +SetFont "Comic Sans MS" 8 + +; Just to make it three pages... +SubCaption 0 ": Yet another page..." +SubCaption 2 ": Yet another page..." +LicenseText "License page" +LicenseData "gfx.nsi" +DirText "Lets make a third page!" + +; Install dir +InstallDir "${NSISDIR}\Examples" + +; Request application privileges for Windows Vista +RequestExecutionLevel user + +;-------------------------------- + +; Pages +Page license licenseImage +Page custom customPage +Page directory dirImage +Page instfiles instImage + +;-------------------------------- + +Section "" + ; You can also use the BI_NEXT macro here... + MessageBox MB_YESNO "We can change the branding image from within a section too!$\nDo you want me to change it?" IDNO done + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\nsis.bmp" "" + done: + WriteUninstaller $INSTDIR\uninst.exe +SectionEnd + +;-------------------------------- + +Function licenseImage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp" /RESIZETOFIT + MessageBox MB_YESNO 'Would you like to skip the license page?' IDNO no + Abort + no: +FunctionEnd + +Function customPage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT + MessageBox MB_OK 'This is a nice custom "page" with yet another image :P' + #insert install options/start menu/ here +FunctionEnd + +Function dirImage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT +FunctionEnd + +Function instImage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT +FunctionEnd + +;-------------------------------- + +; Uninstall pages + +UninstPage uninstConfirm un.uninstImage +UninstPage custom un.customPage +UninstPage instfiles un.instImage + +Function un.uninstImage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Checks\modern.bmp" /RESIZETOFIT +FunctionEnd + +Function un.customPage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Header\win.bmp" /RESIZETOFIT + MessageBox MB_OK 'This is a nice uninstaller custom "page" with yet another image :P' + #insert install options/start menu/ here +FunctionEnd + +Function un.instImage + !insertmacro BIMAGE "${NSISDIR}\Contrib\Graphics\Wizard\llama.bmp" /RESIZETOFIT +FunctionEnd + +;-------------------------------- + +; Uninstaller + +; Another page for uninstaller +UninstallText "Another page..." + +Section uninstall + MessageBox MB_OK "Bla" +SectionEnd + diff --git a/libs/NSIS/NSIS-source/Examples/install-per-user.nsi b/libs/NSIS/NSIS-source/Examples/install-per-user.nsi new file mode 100644 index 0000000000..f925ac1fbc --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/install-per-user.nsi @@ -0,0 +1,181 @@ +/* + +This example script installs a simple application for a single user. + +If multiple users on the same machine run this installer, each user +will end up with a separate install that is not affected by +update/removal operations performed by other users. + +Per-user installers should only write to HKCU and +folders inside the users profile. + +*/ + +!define NAME "Per-user example" +!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" +Name "${NAME}" +OutFile "Install ${NAME}.exe" +Unicode True +RequestExecutionLevel User ; We don't need UAC elevation +InstallDir "" ; Don't set a default $InstDir so we can detect /D= and InstallDirRegKey +InstallDirRegKey HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" + +!include LogicLib.nsh +!include WinCore.nsh +!include Integration.nsh + + +Page Directory +Page InstFiles + +Uninstpage UninstConfirm +Uninstpage InstFiles + + +Function .onInit + SetShellVarContext Current + + ${If} $InstDir == "" ; No /D= nor InstallDirRegKey? + GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This folder only exists on Win7+ + StrCmp $InstDir "" 0 +2 + StrCpy $InstDir "$LocalAppData\Programs" ; Fallback directory + + StrCpy $InstDir "$InstDir\$(^Name)" + ${EndIf} +FunctionEnd + +Function un.onInit + SetShellVarContext Current +FunctionEnd + + +Section "Program files (Required)" + SectionIn Ro + + SetOutPath $InstDir + WriteUninstaller "$InstDir\Uninst.exe" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' + WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "QuietUninstallString" '"$InstDir\Uninst.exe" /S' + WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 + WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 + + !tempfile APP + !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NSISPerUserAppExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 + File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install + !delfile "${APP}" +SectionEnd + +Section "Start Menu shortcut" + CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" +SectionEnd + +/* +This Section registers a fictional .test-nullsoft file extension and the Nullsoft.Test ProgId. +Proprietary file types are encouraged (by Microsoft) to use long file extensions and ProgIds that include the company name. + +When registering with "Open With" your executable should ideally have a somewhat unique name, +otherwise there could be a naming collision with a different application (with the same name) installed on the same machine. + +REGISTER_DEFAULTPROGRAMS is not defined because proprietary file types do not typically use the Default Programs functionality. +If your application registers a standard file type such as .mp3 or .html or a protocol like HTTP it should register as a Default Program. +It should also register as a client (https://docs.microsoft.com/en-us/windows/win32/shell/reg-middleware-apps#common-registration-elements-for-all-client-types). +*/ +!define ASSOC_EXT ".test-nullsoft" +!define ASSOC_PROGID "Nullsoft.Test" +!define ASSOC_VERB "MyApp" +!define ASSOC_APPEXE "MyApp.exe" +Section -ShellAssoc + # Register file type + WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" "" "$InstDir\${ASSOC_APPEXE},0" + ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "" "Nullsoft Test App" [Optional] + ;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "MUIVerb" "@$InstDir\${ASSOC_APPEXE},-42" ; WinXP+ [Optional] Localizable verb display name + WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' + WriteRegStr ShCtx "Software\Classes\${ASSOC_EXT}" "" "${ASSOC_PROGID}" + + # Register "Open With" [Optional] + WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" ; Win2000+ [Optional] + ;WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" ; WinXP+ [Optional] + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\shell\open\command" "" '"$InstDir\${ASSOC_APPEXE}" "%1"' + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "FriendlyAppName" "Nullsoft Test App" ; [Optional] + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" "ApplicationCompany" "Nullsoft" ; [Optional] + WriteRegNone ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\SupportedTypes" "${ASSOC_EXT}" ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+ + + # Register "Default Programs" [Optional] + !ifdef REGISTER_DEFAULTPROGRAMS + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" "ApplicationDescription" "Shell association example test application" + WriteRegStr ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities\FileAssociations" "${ASSOC_EXT}" "${ASSOC_PROGID}" + WriteRegStr ShCtx "Software\RegisteredApplications" "Nullsoft Test App" "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" + !endif + + ${NotifyShell_AssocChanged} +SectionEnd + + +Section -un.ShellAssoc + # Unregister file type + ClearErrors + DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}\shell" + ${IfNot} ${Errors} + DeleteRegKey ShCtx "Software\Classes\${ASSOC_PROGID}\DefaultIcon" + ${EndIf} + ReadRegStr $0 ShCtx "Software\Classes\${ASSOC_EXT}" "" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_PROGID}" + ${IfNot} ${Errors} + ${AndIf} $0 == "${ASSOC_PROGID}" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}" "" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" + ${EndIf} + + # Unregister "Open With" + DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" "${ASSOC_APPEXE}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithList" + DeleteRegValue ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\${ASSOC_EXT}" + + # Unregister "Default Programs" + !ifdef REGISTER_DEFAULTPROGRAMS + DeleteRegValue ShCtx "Software\RegisteredApplications" "Nullsoft Test App" + DeleteRegKey ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities" + DeleteRegKey /IfEmpty ShCtx "Software\Classes\Applications\${ASSOC_APPEXE}" + !endif + + # Attempt to clean up junk left behind by the Windows shell + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Search\JumplistData" "$InstDir\${ASSOC_APPEXE}" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.FriendlyAppName" + DeleteRegValue HKCU "Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache" "$InstDir\${ASSOC_APPEXE}.ApplicationCompany" + DeleteRegValue HKCU "Software\Microsoft\Windows\ShellNoRoam\MUICache" "$InstDir\${ASSOC_APPEXE}" ; WinXP + DeleteRegValue HKCU "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store" "$InstDir\${ASSOC_APPEXE}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "${ASSOC_PROGID}_${ASSOC_EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts" "Applications\${ASSOC_APPEXE}_${ASSOC_EXT}" + DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithList" + DeleteRegKey /IfEmpty HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\${ASSOC_EXT}" + ;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\${ASSOC_EXT}" + + ${NotifyShell_AssocChanged} +SectionEnd + +!macro DeleteFileOrAskAbort path + ClearErrors + Delete "${path}" + IfErrors 0 +3 + MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP 'Unable to delete "${path}"!' IDRETRY -3 IDIGNORE +2 + Abort "Aborted" +!macroend + +Section -Uninstall + !insertmacro DeleteFileOrAskAbort "$InstDir\MyApp.exe" + Delete "$InstDir\Uninst.exe" + RMDir "$InstDir" + DeleteRegKey HKCU "${REGPATH_UNINSTSUBKEY}" + + ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" + Delete "$SMPrograms\${NAME}.lnk" +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/install-shared.nsi b/libs/NSIS/NSIS-source/Examples/install-shared.nsi new file mode 100644 index 0000000000..01e1fe1d5b --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/install-shared.nsi @@ -0,0 +1,95 @@ +/* + +This example script installs a simple application for all users on a machine. + +All-users installers should only write to HKLM, $ProgramFiles, $CommonFiles and the +"All context" versions of $LocalAppData, $Templates, $SMPrograms etc. + +It should not write to HKCU nor any folders in the users profile! +If the application requires writable template data in $AppData it +must copy the required files from a shared location the +first time a user launches the application. + +*/ + +!define NAME "All-users example" +!define REGPATH_UNINSTSUBKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" +Name "${NAME}" +OutFile "Install ${NAME}.exe" +Unicode True +RequestExecutionLevel Admin ; Request admin rights on WinVista+ (when UAC is turned on) +InstallDir "$ProgramFiles\$(^Name)" +InstallDirRegKey HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" + +!include LogicLib.nsh +!include Integration.nsh + + +Page Directory +Page InstFiles + +Uninstpage UninstConfirm +Uninstpage InstFiles + + +!macro EnsureAdminRights + UserInfo::GetAccountType + Pop $0 + ${If} $0 != "admin" ; Require admin rights on WinNT4+ + MessageBox MB_IconStop "Administrator rights required!" + SetErrorLevel 740 ; ERROR_ELEVATION_REQUIRED + Quit + ${EndIf} +!macroend + +Function .onInit + SetShellVarContext All + !insertmacro EnsureAdminRights +FunctionEnd + +Function un.onInit + SetShellVarContext All + !insertmacro EnsureAdminRights +FunctionEnd + + +Section "Program files (Required)" + SectionIn Ro + + SetOutPath $InstDir + WriteUninstaller "$InstDir\Uninst.exe" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayName" "${NAME}" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "DisplayIcon" "$InstDir\MyApp.exe,0" + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "UninstallString" '"$InstDir\Uninst.exe"' + WriteRegStr HKLM "${REGPATH_UNINSTSUBKEY}" "QuietUninstallString" '"$InstDir\Uninst.exe" /S' + WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoModify" 1 + WriteRegDWORD HKLM "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1 + + !tempfile APP + !makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NSISSharedAppExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0 + File "/oname=$InstDir\MyApp.exe" "${APP}" ; Pretend that we have a real application to install + !delfile "${APP}" +SectionEnd + +Section "Start Menu shortcut" + CreateShortcut /NoWorkingDir "$SMPrograms\${NAME}.lnk" "$InstDir\MyApp.exe" +SectionEnd + + +!macro DeleteFileOrAskAbort path + ClearErrors + Delete "${path}" + IfErrors 0 +3 + MessageBox MB_ABORTRETRYIGNORE|MB_ICONSTOP 'Unable to delete "${path}"!' IDRETRY -3 IDIGNORE +2 + Abort "Aborted" +!macroend + +Section -Uninstall + !insertmacro DeleteFileOrAskAbort "$InstDir\MyApp.exe" + Delete "$InstDir\Uninst.exe" + RMDir "$InstDir" + DeleteRegKey HKLM "${REGPATH_UNINSTSUBKEY}" + + ${UnpinShortcut} "$SMPrograms\${NAME}.lnk" + Delete "$SMPrograms\${NAME}.lnk" +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/languages.nsi b/libs/NSIS/NSIS-source/Examples/languages.nsi new file mode 100644 index 0000000000..f6bd39ccd0 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/languages.nsi @@ -0,0 +1,192 @@ +; languages.nsi +; +; This is an example of a multilingual installer +; The user can select the language on startup + +!pragma warning error all + +;-------------------------------- + +OutFile languages.exe + +XPStyle on + +RequestExecutionLevel user + +Unicode True +;-------------------------------- + +Page license +Page components +Page instfiles + +;-------------------------------- + +; First is default +LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Czech.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Dutch.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Spanish.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Swedish.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" +LoadLanguageFile "${NSISDIR}\Contrib\Language files\Slovak.nlf" + +; License data +; Not exactly translated, but it shows what's needed +LicenseLangString myLicenseData ${LANG_ENGLISH} "bigtest.nsi" +LicenseLangString myLicenseData ${LANG_CZECH} "WordFuncTest.nsi" +LicenseLangString myLicenseData ${LANG_DUTCH} "waplugin.nsi" +LicenseLangString myLicenseData ${LANG_FRENCH} "example1.nsi" +LicenseLangString myLicenseData ${LANG_GERMAN} "example2.nsi" +LicenseLangString myLicenseData ${LANG_KOREAN} "gfx.nsi" +LicenseLangString myLicenseData ${LANG_RUSSIAN} "languages.nsi" +LicenseLangString myLicenseData ${LANG_SPANISH} "LogicLib.nsi" +LicenseLangString myLicenseData ${LANG_SWEDISH} "makensis.nsi" +LicenseLangString myLicenseData ${LANG_TRADCHINESE} "one-section.nsi" +LicenseLangString myLicenseData ${LANG_SIMPCHINESE} "primes.nsi" +LicenseLangString myLicenseData ${LANG_SLOVAK} "silent.nsi" + +LicenseData $(myLicenseData) + +; Set name using the normal interface (Name command) +LangString Name ${LANG_ENGLISH} "English" +LangString Name ${LANG_CZECH} "Czech" +LangString Name ${LANG_DUTCH} "Dutch" +LangString Name ${LANG_FRENCH} "French" +LangString Name ${LANG_GERMAN} "German" +LangString Name ${LANG_KOREAN} "Korean" +LangString Name ${LANG_RUSSIAN} "Russian" +LangString Name ${LANG_SPANISH} "Spanish" +LangString Name ${LANG_SWEDISH} "Swedish" +LangString Name ${LANG_TRADCHINESE} "Traditional Chinese" +LangString Name ${LANG_SIMPCHINESE} "Simplified Chinese" +LangString Name ${LANG_SLOVAK} "Slovak" + +Name $(Name) + +; Directly change the inner lang strings (Same as ComponentText) +LangString ^ComponentsText ${LANG_ENGLISH} "English component page" +LangString ^ComponentsText ${LANG_CZECH} "Czech component page" +LangString ^ComponentsText ${LANG_DUTCH} "Dutch component page" +LangString ^ComponentsText ${LANG_FRENCH} "French component page" +LangString ^ComponentsText ${LANG_GERMAN} "German component page" +LangString ^ComponentsText ${LANG_KOREAN} "Korean component page" +LangString ^ComponentsText ${LANG_RUSSIAN} "Russian component page" +LangString ^ComponentsText ${LANG_SPANISH} "Spanish component page" +LangString ^ComponentsText ${LANG_SWEDISH} "Swedish component page" +LangString ^ComponentsText ${LANG_TRADCHINESE} "Traditional Chinese component page" +LangString ^ComponentsText ${LANG_SIMPCHINESE} "Simplified Chinese component page" +LangString ^ComponentsText ${LANG_SLOVAK} "Slovak component page" + +; Set one text for all languages (simply don't use a LangString) +CompletedText "Languages example completed" + +; A LangString for the section name +LangString Sec1Name ${LANG_ENGLISH} "English section #1" +LangString Sec1Name ${LANG_CZECH} "Czech section #1" +LangString Sec1Name ${LANG_DUTCH} "Dutch section #1" +LangString Sec1Name ${LANG_FRENCH} "French section #1" +LangString Sec1Name ${LANG_GERMAN} "German section #1" +LangString Sec1Name ${LANG_KOREAN} "Korean section #1" +LangString Sec1Name ${LANG_RUSSIAN} "Russian section #1" +LangString Sec1Name ${LANG_SPANISH} "Spanish section #1" +LangString Sec1Name ${LANG_SWEDISH} "Swedish section #1" +LangString Sec1Name ${LANG_TRADCHINESE} "Traditional Chinese section #1" +LangString Sec1Name ${LANG_SIMPCHINESE} "Simplified Chinese section #1" +LangString Sec1Name ${LANG_SLOVAK} "Slovak section #1" + +; A multilingual message +LangString Message ${LANG_ENGLISH} "English message" +LangString Message ${LANG_CZECH} "Czech message" +LangString Message ${LANG_DUTCH} "Dutch message" +LangString Message ${LANG_FRENCH} "French message" +LangString Message ${LANG_GERMAN} "German message" +LangString Message ${LANG_KOREAN} "Korean message" +LangString Message ${LANG_RUSSIAN} "Russian message" +LangString Message ${LANG_SPANISH} "Spanish message" +LangString Message ${LANG_SWEDISH} "Swedish message" +LangString Message ${LANG_TRADCHINESE} "Traditional Chinese message" +LangString Message ${LANG_SIMPCHINESE} "Simplified Chinese message" +LangString Message ${LANG_SLOVAK} "Slovak message" + +;-------------------------------- + +;Section names set by Language strings +;It works with ! too +Section !$(Sec1Name) sec1 + MessageBox MB_OK $(Message) +SectionEnd + +; The old, slow, wasteful way +; Look at this section and see why LangString is so much easier +Section "Section number two" + StrCmp $LANGUAGE ${LANG_ENGLISH} 0 +2 + MessageBox MB_OK "Installing English stuff" + StrCmp $LANGUAGE ${LANG_CZECH} 0 +2 + MessageBox MB_OK "Installing Czech stuff" + StrCmp $LANGUAGE ${LANG_DUTCH} 0 +2 + MessageBox MB_OK "Installing Dutch stuff" + StrCmp $LANGUAGE ${LANG_FRENCH} 0 +2 + MessageBox MB_OK "Installing French stuff" + StrCmp $LANGUAGE ${LANG_GERMAN} 0 +2 + MessageBox MB_OK "Installing German stuff" + StrCmp $LANGUAGE ${LANG_KOREAN} 0 +2 + MessageBox MB_OK "Installing Korean stuff" + StrCmp $LANGUAGE ${LANG_RUSSIAN} 0 +2 + MessageBox MB_OK "Installing Russian stuff" + StrCmp $LANGUAGE ${LANG_SPANISH} 0 +2 + MessageBox MB_OK "Installing Spanish stuff" + StrCmp $LANGUAGE ${LANG_SWEDISH} 0 +2 + MessageBox MB_OK "Installing Swedish stuff" + StrCmp $LANGUAGE ${LANG_TRADCHINESE} 0 +2 + MessageBox MB_OK "Installing Traditional Chinese stuff" + StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +2 + MessageBox MB_OK "Installing Simplified Chinese stuff" + StrCmp $LANGUAGE ${LANG_SLOVAK} 0 +2 + MessageBox MB_OK "Installing Slovak stuff" +SectionEnd + +;-------------------------------- + +Function .onInit + + ;Language selection dialog + + Push "" + Push ${LANG_ENGLISH} + Push English + Push ${LANG_CZECH} + Push Czech + Push ${LANG_DUTCH} + Push Dutch + Push ${LANG_FRENCH} + Push French + Push ${LANG_GERMAN} + Push German + Push ${LANG_KOREAN} + Push Korean + Push ${LANG_RUSSIAN} + Push Russian + Push ${LANG_SPANISH} + Push Spanish + Push ${LANG_SWEDISH} + Push Swedish + Push ${LANG_TRADCHINESE} + Push "Traditional Chinese" + Push ${LANG_SIMPCHINESE} + Push "Simplified Chinese" + Push ${LANG_SLOVAK} + Push Slovak + Push A ; A means auto count languages + ; for the auto count to work the first empty push (Push "") must remain + LangDLL::LangDialog "Installer Language" "Please select the language of the installer" + + Pop $LANGUAGE + StrCmp $LANGUAGE "cancel" 0 +2 + Abort +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/makensis.nsi b/libs/NSIS/NSIS-source/Examples/makensis.nsi new file mode 100644 index 0000000000..e1f8ea3def --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/makensis.nsi @@ -0,0 +1,1115 @@ +;NSIS Setup Script +;-------------------------------- + +!pragma warning error all +!pragma warning warning 7010 ; File /NonFatal + +!ifdef VER_MAJOR & VER_MINOR + !define /ifndef VER_REVISION 0 + !define /ifndef VER_BUILD 0 +!endif + +!define /ifndef VERSION 'anonymous-build' + +;-------------------------------- +;Configuration + +!if ${NSIS_PTR_SIZE} > 4 + !define BITS 64 + !define NAMESUFFIX " (64 bit)" +!else + !define BITS 32 + !define NAMESUFFIX "" +!endif + +!ifndef OUTFILE + !define OUTFILE "..\nsis${BITS}-${VERSION}-setup.exe" + !searchreplace OUTFILE "${OUTFILE}" nsis32 nsis +!endif + +OutFile "${OUTFILE}" +Unicode true +SetCompressor /SOLID lzma + +InstType "Full" +InstType "Lite" +InstType "Minimal" + +InstallDir $PROGRAMFILES${BITS}\NSIS +InstallDirRegKey HKLM Software\NSIS "" + +RequestExecutionLevel admin + +;-------------------------------- +;Header Files + +!include "MUI2.nsh" +!include "Sections.nsh" +!include "LogicLib.nsh" +!include "Memento.nsh" +!include "WordFunc.nsh" +!include "Util.nsh" +!include "Integration.nsh" + +;-------------------------------- +;Configuration + +;Names +Name "NSIS" +Caption "NSIS ${VERSION}${NAMESUFFIX} Setup" + +!define REG_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" + +;Memento Settings +!define MEMENTO_REGISTRY_ROOT HKLM +!define MEMENTO_REGISTRY_KEY "${REG_UNINST_KEY}" + +;Interface Settings +!define MUI_ABORTWARNING + +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-uninstall.ico" + +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_RIGHT +!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis3-branding-r.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\nsis3-branding.bmp" + +!define MUI_COMPONENTSPAGE_SMALLDESC + +;Pages +!define MUI_WELCOMEPAGE_TITLE "Welcome to the NSIS ${VERSION} Setup Wizard" +!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of NSIS (Nullsoft Scriptable Install System) ${VERSION}, the next generation of the Windows installer and uninstaller system that doesn't suck and isn't huge.$\r$\n$\r$\nNSIS includes a Modern User Interface, LZMA compression, support for multiple languages and an easy plug-in system.$\r$\n$\r$\n$_CLICK" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\COPYING" +!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD +Page custom PageReinstall PageLeaveReinstall +!endif +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_LINK "Visit the NSIS site for the latest news, FAQs and support" +!define MUI_FINISHPAGE_LINK_LOCATION "http://nsis.sf.net/" + +!define MUI_FINISHPAGE_RUN "$INSTDIR\NSIS.exe" +!define MUI_FINISHPAGE_NOREBOOTSUPPORT + +!define MUI_FINISHPAGE_SHOWREADME +!define MUI_FINISHPAGE_SHOWREADME_TEXT "Show release notes" +!define MUI_FINISHPAGE_SHOWREADME_FUNCTION ShowReleaseNotes + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +;-------------------------------- +;Languages + +!insertmacro MUI_LANGUAGE "English" + +;-------------------------------- +;Version information + +!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD +VIProductVersion ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "FileDescription" "NSIS Setup" +VIAddVersionKey "LegalCopyright" "http://nsis.sf.net/License" +!endif + +;-------------------------------- +;Installer Sections + +!macro OptionalFile src options eval + !if '${eval}' == '' + !define /ReDef eval 1 + !endif + !if ${eval} + !if /FileExists "${src}" + File ${options} "${src}" + !endif + !endif +!macroend + +!macro InstallPlugin pi + !if ${BITS} >= 64 + File "/oname=$InstDir\Plugins\${NSIS_CPU}-unicode\${pi}.dll" ..\Plugins\${NSIS_CPU}-unicode\${pi}.dll + !insertmacro OptionalFile ..\Plugins\amd64-unicode\${pi}.dll "/oname=$InstDir\Plugins\amd64-unicode\${pi}.dll" 'amd64 != ${NSIS_CPU}' + !insertmacro OptionalFile ..\Plugins\arm64-unicode\${pi}.dll "/oname=$InstDir\Plugins\arm64-unicode\${pi}.dll" 'arm64 != ${NSIS_CPU}' + !insertmacro OptionalFile ..\Plugins\x86-ansi\${pi}.dll "/oname=$InstDir\Plugins\x86-ansi\${pi}.dll" '' + !insertmacro OptionalFile ..\Plugins\x86-unicode\${pi}.dll "/oname=$InstDir\Plugins\x86-unicode\${pi}.dll" '' + !else + File "/oname=$InstDir\Plugins\x86-ansi\${pi}.dll" ..\Plugins\x86-ansi\${pi}.dll + File "/oname=$InstDir\Plugins\x86-unicode\${pi}.dll" ..\Plugins\x86-unicode\${pi}.dll + !endif +!macroend + +!macro InstallStub stub + !if ${BITS} >= 64 + File ..\Stubs\${stub}-${NSIS_CPU}-unicode + !insertmacro OptionalFile ..\Stubs\${stub}-amd64-unicode '' 'amd64 != ${NSIS_CPU}' + !insertmacro OptionalFile ..\Stubs\${stub}-arm64-unicode '' 'arm64 != ${NSIS_CPU}' + !else + File ..\Stubs\${stub}-x86-ansi + File ..\Stubs\${stub}-x86-unicode + !endif +!macroend + +${MementoSection} "NSIS Core Files (required)" SecCore + + SetDetailsPrint textonly + DetailPrint "Installing NSIS Core Files..." + SetDetailsPrint listonly + + SectionIn 1 2 3 RO + SetOutPath $INSTDIR + + IfFileExists $INSTDIR\nsisconf.nsi "" +2 + Rename $INSTDIR\nsisconf.nsi $INSTDIR\nsisconf.nsh + SetOverwrite off + File ..\nsisconf.nsh + + SetOverwrite on + File ..\makensis.exe + File ..\makensisw.exe + File ..\COPYING + File ..\NSIS.chm + !pragma verifychm "..\NSIS.chm" + !if /FileExists "..\NSIS.exe" + !if /FileExists "..\NSIS.exe.manifest" + File "..\NSIS.exe.manifest" + !endif + !else + !define NO_NSISMENU_HTML 1 + !makensis '-v2 "NSISMenu.nsi" "-XOutFile ..\NSIS.exe"' = 0 + !endif + File ..\NSIS.exe + + SetOutPath $INSTDIR\Bin + File ..\Bin\makensis.exe +!ifdef USE_NEW_ZLIB + File ..\Bin\zlib.dll +!else + File ..\Bin\zlib1.dll +!endif + + SetOutPath $INSTDIR\Stubs + File ..\Stubs\uninst + !insertmacro InstallStub bzip2 + !insertmacro InstallStub bzip2_solid + !insertmacro InstallStub lzma + !insertmacro InstallStub lzma_solid + !insertmacro InstallStub zlib + !insertmacro InstallStub zlib_solid + + + SetOutPath $INSTDIR\Include + File ..\Include\WinMessages.nsh + File ..\Include\Sections.nsh + File ..\Include\Library.nsh + File ..\Include\UpgradeDLL.nsh + File ..\Include\LogicLib.nsh + File ..\Include\StrFunc.nsh + File ..\Include\Colors.nsh + File ..\Include\FileFunc.nsh + File ..\Include\TextFunc.nsh + File ..\Include\WordFunc.nsh + File ..\Include\WinVer.nsh + File ..\Include\x64.nsh + File ..\Include\Memento.nsh + File ..\Include\LangFile.nsh + File ..\Include\InstallOptions.nsh + File ..\Include\MultiUser.nsh + File ..\Include\VB6RunTime.nsh + File ..\Include\Util.nsh + File ..\Include\Integration.nsh + File ..\Include\WinCore.nsh + + SetOutPath $INSTDIR\Include\Win + File ..\Include\Win\WinDef.nsh + File ..\Include\Win\WinError.nsh + File ..\Include\Win\WinNT.nsh + File ..\Include\Win\WinUser.nsh + File ..\Include\Win\COM.nsh + File ..\Include\Win\Propkey.nsh + File ..\Include\Win\RestartManager.nsh + + SetOutPath $INSTDIR\Docs\StrFunc + File ..\Docs\StrFunc\StrFunc.txt + + SetOutPath $INSTDIR\Docs\MultiUser + File ..\Docs\MultiUser\Readme.html + + SetOutPath $INSTDIR\Docs\makensisw + File ..\Docs\makensisw\*.txt + + !ifndef NO_NSISMENU_HTML + SetOutPath $INSTDIR\Menu + File ..\Menu\*.html + SetOutPath $INSTDIR\Menu\images + File ..\Menu\images\header.gif + File ..\Menu\images\line.gif + File ..\Menu\images\site.gif + !endif + + Delete $INSTDIR\makensis.htm + Delete $INSTDIR\Docs\*.html + Delete $INSTDIR\Docs\style.css + RMDir $INSTDIR\Docs + + SetOutPath $INSTDIR\Bin + !if ${BITS} >= 64 + !insertmacro OptionalFile ..\Bin\RegTool-x86.bin '' '' + !ifdef NSIS_ARM64 + File ..\Bin\RegTool-arm64.bin + !else + File ..\Bin\RegTool-amd64.bin + !endif + !else + File ..\Bin\RegTool-x86.bin + !insertmacro OptionalFile ..\Bin\RegTool-amd64.bin '' '' ; It's unlikely that this exists, avoid the /NonFatal warning. + !endif + + CreateDirectory $INSTDIR\Plugins\x86-ansi + CreateDirectory $INSTDIR\Plugins\x86-unicode + !if ${BITS} >= 64 + CreateDirectory $INSTDIR\Plugins\amd64-unicode + !ifdef NSIS_ARM64 + CreateDirectory $INSTDIR\Plugins\arm64-unicode + !endif + !endif + !insertmacro InstallPlugin TypeLib + + ReadRegStr $R0 HKCR ".nsi" "" + StrCmp $R0 "NSISFile" 0 +2 + DeleteRegKey HKCR "NSISFile" + + WriteRegStr HKCR ".nsi" "" "NSIS.Script" + WriteRegStr HKCR ".nsi" "PerceivedType" "text" + WriteRegStr HKCR "NSIS.Script" "" "NSIS Script File" + WriteRegStr HKCR "NSIS.Script\DefaultIcon" "" "$INSTDIR\makensisw.exe,1" + ReadRegStr $R0 HKCR "NSIS.Script\shell\open\command" "" + ${If} $R0 == "" + WriteRegStr HKCR "NSIS.Script\shell" "" "open" + WriteRegStr HKCR "NSIS.Script\shell\open\command" "" 'notepad.exe "%1"' + ${EndIf} + WriteRegStr HKCR "NSIS.Script\shell\compile" "" "Compile NSIS Script" + WriteRegStr HKCR "NSIS.Script\shell\compile\command" "" '"$INSTDIR\makensisw.exe" "%1"' + WriteRegStr HKCR "NSIS.Script\shell\compile-compressor" "" "Compile NSIS Script (Choose Compressor)" + WriteRegStr HKCR "NSIS.Script\shell\compile-compressor\command" "" '"$INSTDIR\makensisw.exe" /ChooseCompressor "%1"' + + ReadRegStr $R0 HKCR ".nsh" "" + StrCmp $R0 "NSHFile" 0 +2 + DeleteRegKey HKCR "NSHFile" + + WriteRegStr HKCR ".nsh" "" "NSIS.Header" + WriteRegStr HKCR ".nsh" "PerceivedType" "text" + WriteRegStr HKCR "NSIS.Header" "" "NSIS Header File" + WriteRegStr HKCR "NSIS.Header\DefaultIcon" "" "$INSTDIR\makensisw.exe,2" + ReadRegStr $R0 HKCR "NSIS.Header\shell\open\command" "" + ${If} $R0 == "" + WriteRegStr HKCR "NSIS.Header\shell" "" "open" + WriteRegStr HKCR "NSIS.Header\shell\open\command" "" 'notepad.exe "%1"' + ${EndIf} + + ${NotifyShell_AssocChanged} + +${MementoSectionEnd} + +${MementoSection} "Script Examples" SecExample + + SetDetailsPrint textonly + DetailPrint "Installing Script Examples..." + SetDetailsPrint listonly + + SectionIn 1 2 + SetOutPath $INSTDIR\Examples + File ..\Examples\makensis.nsi + File ..\Examples\example1.nsi + File ..\Examples\example2.nsi + File ..\Examples\AppGen.nsi + File ..\Examples\install-per-user.nsi + File ..\Examples\install-shared.nsi + File ..\Examples\waplugin.nsi + File ..\Examples\bigtest.nsi + File ..\Examples\primes.nsi + File ..\Examples\rtest.nsi + File ..\Examples\gfx.nsi + File ..\Examples\one-section.nsi + File ..\Examples\languages.nsi + File ..\Examples\Library.nsi + File ..\Examples\VersionInfo.nsi + File ..\Examples\LogicLib.nsi + File ..\Examples\silent.nsi + File ..\Examples\StrFunc.nsi + File ..\Examples\FileFunc.nsi + File ..\Examples\FileFunc.ini + File ..\Examples\FileFuncTest.nsi + File ..\Examples\TextFunc.nsi + File ..\Examples\TextFunc.ini + File ..\Examples\TextFuncTest.nsi + File ..\Examples\WordFunc.nsi + File ..\Examples\WordFunc.ini + File ..\Examples\WordFuncTest.nsi + File ..\Examples\Memento.nsi + File ..\Examples\MultiUser.nsi + File ..\Examples\unicode.nsi + File ..\Examples\NSISMenu.nsi + + SetOutPath $INSTDIR\Examples\Plugin + File ..\Examples\Plugin\exdll.c + File ..\Examples\Plugin\exdll.dpr + File ..\Examples\Plugin\exdll.dsp + File ..\Examples\Plugin\exdll.dsw + File ..\Examples\Plugin\exdll_with_unit.dpr + File ..\Examples\Plugin\exdll-vs2008.sln + File ..\Examples\Plugin\exdll-vs2008.vcproj + File ..\Examples\Plugin\extdll.inc + File ..\Examples\Plugin\nsis.pas + + SetOutPath $INSTDIR\Examples\Plugin\nsis + File ..\Examples\Plugin\nsis\pluginapi.h + File /nonfatal ..\Examples\Plugin\nsis\pluginapi*.lib + File ..\Examples\Plugin\nsis\api.h + File ..\Examples\Plugin\nsis\nsis_tchar.h + +${MementoSectionEnd} + +${MementoSection} "Start Menu Shortcut" SecShortcuts + + SetDetailsPrint textonly + DetailPrint "Installing Start Menu shortcut..." + SetDetailsPrint listonly + + SectionIn 1 2 + SetOutPath $INSTDIR + CreateShortcut "$SMPROGRAMS\NSIS${NAMESUFFIX}.lnk" "$INSTDIR\NSIS.exe" + +${MementoSectionEnd} + +SectionGroup "User Interfaces" SecInterfaces + +${MementoSection} "Modern User Interface" SecInterfacesModernUI + + SetDetailsPrint textonly + DetailPrint "Installing User Interfaces | Modern User Interface..." + SetDetailsPrint listonly + + SectionIn 1 2 + + SetOutPath "$INSTDIR\Examples\Modern UI" + File "..\Examples\Modern UI\Basic.nsi" + File "..\Examples\Modern UI\HeaderBitmap.nsi" + File "..\Examples\Modern UI\MultiLanguage.nsi" + File "..\Examples\Modern UI\StartMenu.nsi" + File "..\Examples\Modern UI\WelcomeFinish.nsi" + + SetOutPath "$INSTDIR\Contrib\Modern UI" + File "..\Contrib\Modern UI\System.nsh" + File "..\Contrib\Modern UI\ioSpecial.ini" + + SetOutPath "$INSTDIR\Docs\Modern UI" + File "..\Docs\Modern UI\Readme.html" + File "..\Docs\Modern UI\Changelog.txt" + File "..\Docs\Modern UI\License.txt" + + SetOutPath "$INSTDIR\Docs\Modern UI\images" + File "..\Docs\Modern UI\images\header.gif" + File "..\Docs\Modern UI\images\screen1.png" + File "..\Docs\Modern UI\images\screen2.png" + File "..\Docs\Modern UI\images\open.gif" + File "..\Docs\Modern UI\images\closed.gif" + + SetOutPath $INSTDIR\Contrib\UIs + File "..\Contrib\UIs\modern.exe" + File "..\Contrib\UIs\modern_headerbmp.exe" + File "..\Contrib\UIs\modern_headerbmpr.exe" + File "..\Contrib\UIs\modern_nodesc.exe" + File "..\Contrib\UIs\modern_smalldesc.exe" + + SetOutPath $INSTDIR\Include + File "..\Include\MUI.nsh" + + SetOutPath "$INSTDIR\Contrib\Modern UI 2" + File "..\Contrib\Modern UI 2\Deprecated.nsh" + File "..\Contrib\Modern UI 2\Interface.nsh" + File "..\Contrib\Modern UI 2\Localization.nsh" + File "..\Contrib\Modern UI 2\MUI2.nsh" + File "..\Contrib\Modern UI 2\Pages.nsh" + + SetOutPath "$INSTDIR\Contrib\Modern UI 2\Pages" + File "..\Contrib\Modern UI 2\Pages\Components.nsh" + File "..\Contrib\Modern UI 2\Pages\Directory.nsh" + File "..\Contrib\Modern UI 2\Pages\Finish.nsh" + File "..\Contrib\Modern UI 2\Pages\InstallFiles.nsh" + File "..\Contrib\Modern UI 2\Pages\License.nsh" + File "..\Contrib\Modern UI 2\Pages\StartMenu.nsh" + File "..\Contrib\Modern UI 2\Pages\UninstallConfirm.nsh" + File "..\Contrib\Modern UI 2\Pages\Welcome.nsh" + + SetOutPath "$INSTDIR\Docs\Modern UI 2" + File "..\Docs\Modern UI 2\Readme.html" + File "..\Docs\Modern UI 2\License.txt" + + SetOutPath "$INSTDIR\Docs\Modern UI 2\images" + File "..\Docs\Modern UI 2\images\header.gif" + File "..\Docs\Modern UI 2\images\screen1.png" + File "..\Docs\Modern UI 2\images\screen2.png" + File "..\Docs\Modern UI 2\images\open.gif" + File "..\Docs\Modern UI 2\images\closed.gif" + + SetOutPath $INSTDIR\Include + File "..\Include\MUI2.nsh" + +${MementoSectionEnd} + +${MementoSection} "Default User Interface" SecInterfacesDefaultUI + + SetDetailsPrint textonly + DetailPrint "Installing User Interfaces | Default User Interface..." + SetDetailsPrint listonly + + SectionIn 1 + + SetOutPath "$INSTDIR\Contrib\UIs" + File "..\Contrib\UIs\default.exe" + +${MementoSectionEnd} + +${MementoSection} "Tiny User Interface" SecInterfacesTinyUI + + SetDetailsPrint textonly + DetailPrint "Installing User Interfaces | Tiny User Interface..." + SetDetailsPrint listonly + + SectionIn 1 + + SetOutPath "$INSTDIR\Contrib\UIs" + File "..\Contrib\UIs\sdbarker_tiny.exe" + +${MementoSectionEnd} + +SectionGroupEnd + +${MementoSection} "Graphics" SecGraphics + + SetDetailsPrint textonly + DetailPrint "Installing Graphics..." + SetDetailsPrint listonly + + SectionIn 1 + + Delete $INSTDIR\Contrib\Icons\*.ico + Delete $INSTDIR\Contrib\Icons\*.bmp + RMDir $INSTDIR\Contrib\Icons + SetOutPath $INSTDIR\Contrib\Graphics + File /r "..\Contrib\Graphics\*.ico" + File /r "..\Contrib\Graphics\*.bmp" +${MementoSectionEnd} + +${MementoSection} "Language Files" SecLangFiles + + SetDetailsPrint textonly + DetailPrint "Installing Language Files..." + SetDetailsPrint listonly + + SectionIn 1 + + SetOutPath "$INSTDIR\Contrib\Language files" + File "..\Contrib\Language files\*.nlf" + + SetOutPath $INSTDIR\Bin + File ..\Bin\MakeLangID.exe + + ${If} ${SectionIsSelected} ${SecInterfacesModernUI} + SetOutPath "$INSTDIR\Contrib\Language files" + File "..\Contrib\Language files\*.nsh" + ${EndIf} + +${MementoSectionEnd} + +SectionGroup "Tools" SecTools + +${MementoSection} "Zip2Exe" SecToolsZ2E + + SetDetailsPrint textonly + DetailPrint "Installing Tools | Zip2Exe..." + SetDetailsPrint listonly + + SectionIn 1 + + SetOutPath $INSTDIR\Bin + File ..\Bin\zip2exe.exe + SetOutPath $INSTDIR\Contrib\zip2exe + File ..\Contrib\zip2exe\Base.nsh + File ..\Contrib\zip2exe\Modern.nsh + File ..\Contrib\zip2exe\Classic.nsh + +${MementoSectionEnd} + +SectionGroupEnd + +SectionGroup "Plug-ins" SecPluginsPlugins + +${MementoSection} "Banner" SecPluginsBanner + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | Banner..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin Banner + SetOutPath $INSTDIR\Docs\Banner + File ..\Docs\Banner\Readme.txt + SetOutPath $INSTDIR\Examples\Banner + File ..\Examples\Banner\Example.nsi +${MementoSectionEnd} + +${MementoSection} "Language DLL" SecPluginsLangDLL + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | Language DLL..." + SetDetailsPrint listonly + + SectionIn 1 + !insertmacro InstallPlugin LangDLL +${MementoSectionEnd} + +${MementoSection} "nsExec" SecPluginsnsExec + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | nsExec..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin nsExec + SetOutPath $INSTDIR\Docs\nsExec + File ..\Docs\nsExec\nsExec.txt + SetOutPath $INSTDIR\Examples\nsExec + File ..\Examples\nsExec\test.nsi +${MementoSectionEnd} + +${MementoSection} "Splash" SecPluginsSplash + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | Splash..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin Splash + SetOutPath $INSTDIR\Docs\Splash + File ..\Docs\Splash\splash.txt + SetOutPath $INSTDIR\Examples\Splash + File ..\Examples\Splash\Example.nsi +${MementoSectionEnd} + +${MementoSection} "AdvSplash" SecPluginsSplashT + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | AdvSplash..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin AdvSplash + SetOutPath $INSTDIR\Docs\AdvSplash + File ..\Docs\AdvSplash\advsplash.txt + SetOutPath $INSTDIR\Examples\AdvSplash + File ..\Examples\AdvSplash\Example.nsi +${MementoSectionEnd} + +${MementoSection} "BgImage" SecPluginsBgImage + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | BgImage..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin BgImage + SetOutPath $INSTDIR\Docs\BgImage + File ..\Docs\BgImage\BgImage.txt + SetOutPath $INSTDIR\Examples\BgImage + File ..\Examples\BgImage\Example.nsi +${MementoSectionEnd} + +${MementoSection} "InstallOptions" SecPluginsIO + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | InstallOptions..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin InstallOptions + SetOutPath $INSTDIR\Docs\InstallOptions + File ..\Docs\InstallOptions\Readme.html + File ..\Docs\InstallOptions\Changelog.txt + SetOutPath $INSTDIR\Examples\InstallOptions + File ..\Examples\InstallOptions\test.ini + File ..\Examples\InstallOptions\test.nsi + File ..\Examples\InstallOptions\testimgs.ini + File ..\Examples\InstallOptions\testimgs.nsi + File ..\Examples\InstallOptions\testlink.ini + File ..\Examples\InstallOptions\testlink.nsi + File ..\Examples\InstallOptions\testnotify.ini + File ..\Examples\InstallOptions\testnotify.nsi +${MementoSectionEnd} + +${MementoSection} "nsDialogs" SecPluginsDialogs + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | nsDialogs..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin nsDialogs + SetOutPath $INSTDIR\Examples\nsDialogs + File ..\Examples\nsDialogs\example.nsi + File ..\Examples\nsDialogs\InstallOptions.nsi + File ..\Examples\nsDialogs\timer.nsi + File ..\Examples\nsDialogs\welcome.nsi + SetOutPath $INSTDIR\Include + File ..\Include\nsDialogs.nsh + SetOutPath $INSTDIR\Docs\nsDialogs + File ..\Docs\nsDialogs\Readme.html +${MementoSectionEnd} + +${MementoSection} "Math" SecPluginsMath + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | Math..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin Math + SetOutPath $INSTDIR\Docs\Math + File ..\Docs\Math\Math.txt + SetOutPath $INSTDIR\Examples\Math + File ..\Examples\Math\math.nsi + File ..\Examples\Math\mathtest.txt + File ..\Examples\Math\mathtest.nsi + File ..\Examples\Math\mathtest.ini + +${MementoSectionEnd} + +${MementoSection} "NSISdl" SecPluginsNSISDL + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | NSISdl..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin NSISdl + SetOutPath $INSTDIR\Docs\NSISdl + File ..\Docs\NSISdl\ReadMe.txt + File ..\Docs\NSISdl\License.txt +${MementoSectionEnd} + +${MementoSection} "System" SecPluginsSystem + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | System..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin System + SetOutPath $INSTDIR\Docs\System + File ..\Docs\System\System.html + File ..\Docs\System\WhatsNew.txt + SetOutPath $INSTDIR\Examples\System + File ..\Examples\System\Resource.dll + File ..\Examples\System\SysFunc.nsh + File ..\Examples\System\System.nsh + File ..\Examples\System\System.nsi +${MementoSectionEnd} + +${MementoSection} "StartMenu" SecPluginsStartMenu + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | StartMenu..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin StartMenu + SetOutPath $INSTDIR\Docs\StartMenu + File ..\Docs\StartMenu\Readme.txt + SetOutPath $INSTDIR\Examples\StartMenu + File ..\Examples\StartMenu\Example.nsi +${MementoSectionEnd} + +${MementoSection} "UserInfo" SecPluginsUserInfo + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | UserInfo..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin UserInfo + SetOutPath $INSTDIR\Examples\UserInfo + File ..\Examples\UserInfo\UserInfo.nsi +${MementoSectionEnd} + +${MementoSection} "Dialer" SecPluginsDialer + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | Dialer..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin Dialer + SetOutPath $INSTDIR\Docs\Dialer + File ..\Docs\Dialer\Dialer.txt +${MementoSectionEnd} + +${MementoSection} "VPatch" SecPluginsVPatch + + SetDetailsPrint textonly + DetailPrint "Installing Plug-ins | VPatch..." + SetDetailsPrint listonly + + SectionIn 1 + + !insertmacro InstallPlugin VPatch + SetOutPath $INSTDIR\Examples\VPatch + File ..\Examples\VPatch\example.nsi + File ..\Examples\VPatch\oldfile.txt + File ..\Examples\VPatch\newfile.txt + File ..\Examples\VPatch\patch.pat + SetOutPath $INSTDIR\Docs\VPatch + File ..\Docs\VPatch\Readme.html + SetOutPath $INSTDIR\Bin + File ..\Bin\GenPat.exe + SetOutPath $INSTDIR\Include + File ..\Include\VPatchLib.nsh +${MementoSectionEnd} + +${MementoSectionDone} + +SectionGroupEnd + +Section -post + + ; When Modern UI is installed: + ; * Always install the English language file + ; * Always install default icons / bitmaps + + ${If} ${SectionIsSelected} ${SecInterfacesModernUI} + + SetDetailsPrint textonly + DetailPrint "Configuring Modern UI..." + SetDetailsPrint listonly + + ${IfNot} ${SectionIsSelected} ${SecLangFiles} + SetOutPath "$INSTDIR\Contrib\Language files" + File "..\Contrib\Language files\English.nlf" + File "..\Contrib\Language files\English.nsh" + ${EndIf} + + ${IfNot} ${SectionIsSelected} ${SecGraphics} + SetOutPath $INSTDIR\Contrib\Graphics\Checks + File "..\Contrib\Graphics\Checks\modern.bmp" + SetOutPath $INSTDIR\Contrib\Graphics\Icons + File "..\Contrib\Graphics\Icons\modern-install.ico" + File "..\Contrib\Graphics\Icons\modern-uninstall.ico" + SetOutPath $INSTDIR\Contrib\Graphics\Header + File "..\Contrib\Graphics\Header\nsis.bmp" + SetOutPath $INSTDIR\Contrib\Graphics\Wizard + File "..\Contrib\Graphics\Wizard\win.bmp" + ${EndIf} + + ${EndIf} + + SetDetailsPrint textonly + DetailPrint "Creating Registry Keys..." + SetDetailsPrint listonly + + SetOutPath $INSTDIR + + WriteRegStr HKLM "Software\NSIS" "" $INSTDIR +!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD + WriteRegDword HKLM "Software\NSIS" "VersionMajor" "${VER_MAJOR}" + WriteRegDword HKLM "Software\NSIS" "VersionMinor" "${VER_MINOR}" + WriteRegDword HKLM "Software\NSIS" "VersionRevision" "${VER_REVISION}" + WriteRegDword HKLM "Software\NSIS" "VersionBuild" "${VER_BUILD}" +!endif + + WriteRegStr HKLM "${REG_UNINST_KEY}" "UninstallString" '"$INSTDIR\uninst-nsis.exe"' + WriteRegStr HKLM "${REG_UNINST_KEY}" "QuietUninstallString" '"$INSTDIR\uninst-nsis.exe" /S' + WriteRegStr HKLM "${REG_UNINST_KEY}" "InstallLocation" "$INSTDIR" + WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayName" "Nullsoft Install System${NAMESUFFIX}" + WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayIcon" "$INSTDIR\NSIS.exe" + WriteRegStr HKLM "${REG_UNINST_KEY}" "DisplayVersion" "${VERSION}" +!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD + WriteRegDWORD HKLM "${REG_UNINST_KEY}" "VersionMajor" "${VER_MAJOR}" ; Required by WACK + WriteRegDWORD HKLM "${REG_UNINST_KEY}" "VersionMinor" "${VER_MINOR}" ; Required by WACK +!endif + WriteRegStr HKLM "${REG_UNINST_KEY}" "Publisher" "Nullsoft and Contributors" ; Required by WACK + WriteRegStr HKLM "${REG_UNINST_KEY}" "URLInfoAbout" "https://nsis.sourceforge.io/" + WriteRegStr HKLM "${REG_UNINST_KEY}" "HelpLink" "https://nsis.sourceforge.io/Support" + WriteRegDWORD HKLM "${REG_UNINST_KEY}" "NoModify" "1" + WriteRegDWORD HKLM "${REG_UNINST_KEY}" "NoRepair" "1" + ${MakeARPInstallDate} $1 + WriteRegStr HKLM "${REG_UNINST_KEY}" "InstallDate" $1 + + WriteUninstaller $INSTDIR\uninst-nsis.exe + + ${MementoSectionSave} + + SetDetailsPrint both + +SectionEnd + +;-------------------------------- +;Descriptions + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SecCore} "The core files required to use NSIS (compiler etc.)" + !insertmacro MUI_DESCRIPTION_TEXT ${SecExample} "Example installation scripts that show you how to use NSIS" + !insertmacro MUI_DESCRIPTION_TEXT ${SecShortcuts} "Add icon to your start menu for easy access" + !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfaces} "User interface designs that can be used to change the installer look and feel" + !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesModernUI} "A modern user interface like the wizards of recent Windows versions" + !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesDefaultUI} "The default NSIS user interface which you can customize to make your own UI" + !insertmacro MUI_DESCRIPTION_TEXT ${SecInterfacesTinyUI} "A tiny version of the default user interface" + !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} "Tools that help you with NSIS development" + !insertmacro MUI_DESCRIPTION_TEXT ${SecToolsZ2E} "A utility that converts a ZIP file to a NSIS installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecGraphics} "Icons, checkbox images and other graphics" + !insertmacro MUI_DESCRIPTION_TEXT ${SecLangFiles} "Language files used to support multiple languages in an installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsPlugins} "Useful plugins that extend NSIS's functionality" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBanner} "Plugin that lets you show a banner before installation starts" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsLangDLL} "Plugin that lets you add a language select dialog to your installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsnsExec} "Plugin that executes console programs and prints its output in the NSIS log window or hides it" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplash} "Splash screen add-on that lets you add a splash screen to an installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSplashT} "Splash screen add-on with transparency support that lets you add a splash screen to an installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsSystem} "Plugin that lets you call Win32 API or external DLLs" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsMath} "Plugin that lets you evaluate complicated mathematical expressions" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialer} "Plugin that provides internet connection functions" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsIO} "Plugin that lets you add custom pages to an installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsDialogs} "Plugin that lets you add custom pages to an installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsStartMenu} "Plugin that lets the user select the start menu folder" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsBgImage} "Plugin that lets you show a persistent background image plugin and play sounds" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsUserInfo} "Plugin that that gives you the user name and the user account type" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsNSISDL} "Plugin that lets you create a web based installer" + !insertmacro MUI_DESCRIPTION_TEXT ${SecPluginsVPatch} "Plugin that lets you create patches to upgrade older files" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- +;Installer Functions + +Function .onInit + + ${MementoSectionRestore} + +FunctionEnd + +!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD + +Var ReinstallPageCheck + +Function PageReinstall + + ReadRegStr $R0 HKLM "Software\NSIS" "" + ReadRegStr $R1 HKLM "${REG_UNINST_KEY}" "UninstallString" + ${IfThen} "$R0$R1" == "" ${|} Abort ${|} + + StrCpy $R4 "older" + ReadRegDWORD $R0 HKLM "Software\NSIS" "VersionMajor" + ReadRegDWORD $R1 HKLM "Software\NSIS" "VersionMinor" + ReadRegDWORD $R2 HKLM "Software\NSIS" "VersionRevision" + ReadRegDWORD $R3 HKLM "Software\NSIS" "VersionBuild" + ${IfThen} $R0 = 0 ${|} StrCpy $R4 "unknown" ${|} ; Anonymous builds have no version number + StrCpy $R0 $R0.$R1.$R2.$R3 + + ${VersionCompare} ${VER_MAJOR}.${VER_MINOR}.${VER_REVISION}.${VER_BUILD} $R0 $R0 + ${If} $R0 == 0 + StrCpy $R1 "NSIS ${VERSION} is already installed. Select the operation you want to perform and click Next to continue." + StrCpy $R2 "Add/Reinstall components" + StrCpy $R3 "Uninstall NSIS" + !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform." + StrCpy $R0 "2" + ${ElseIf} $R0 == 1 + StrCpy $R1 "An $R4 version of NSIS is installed on your system. It's recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue." + StrCpy $R2 "Uninstall before installing" + StrCpy $R3 "Do not uninstall" + !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS." + StrCpy $R0 "1" + ${ElseIf} $R0 == 2 + StrCpy $R1 "A newer version of NSIS is already installed! It is not recommended that you install an older version. If you really want to install this older version, it's better to uninstall the current version first. Select the operation you want to perform and click Next to continue." + StrCpy $R2 "Uninstall before installing" + StrCpy $R3 "Do not uninstall" + !insertmacro MUI_HEADER_TEXT "Already Installed" "Choose how you want to install NSIS." + StrCpy $R0 "1" + ${Else} + Abort + ${EndIf} + + nsDialogs::Create 1018 + Pop $R4 + + ${NSD_CreateLabel} 0 0 100% 24u $R1 + Pop $R1 + + ${NSD_CreateRadioButton} 30u 50u -30u 8u $R2 + Pop $R2 + ${NSD_OnClick} $R2 PageReinstallUpdateSelection + + ${NSD_CreateRadioButton} 30u 70u -30u 8u $R3 + Pop $R3 + ${NSD_OnClick} $R3 PageReinstallUpdateSelection + + ${If} $ReinstallPageCheck != 2 + SendMessage $R2 ${BM_SETCHECK} ${BST_CHECKED} 0 + ${Else} + SendMessage $R3 ${BM_SETCHECK} ${BST_CHECKED} 0 + ${EndIf} + + ${NSD_SetFocus} $R2 + + nsDialogs::Show + +FunctionEnd + +Function PageReinstallUpdateSelection + + Pop $R1 + + ${NSD_GetState} $R2 $R1 + + ${If} $R1 == ${BST_CHECKED} + StrCpy $ReinstallPageCheck 1 + ${Else} + StrCpy $ReinstallPageCheck 2 + ${EndIf} + +FunctionEnd + +Function PageLeaveReinstall + + ${NSD_GetState} $R2 $R1 + + StrCmp $R0 "1" 0 +2 ; Existing install is not the same version? + StrCmp $R1 "1" reinst_uninstall reinst_done + + StrCmp $R1 "1" reinst_done ; Same version, skip to add/reinstall components? + + reinst_uninstall: + ReadRegStr $R1 HKLM "${REG_UNINST_KEY}" "UninstallString" + + ;Run uninstaller + HideWindow + + ClearErrors + ExecWait '$R1 _?=$INSTDIR' $0 + + BringToFront + + ${IfThen} ${Errors} ${|} StrCpy $0 2 ${|} ; ExecWait failed, set fake exit code + + ${If} $0 <> 0 + ${OrIf} ${FileExists} "$INSTDIR\Bin\makensis.exe" + ${If} $0 = 1 ; User aborted uninstaller? + StrCmp $R0 "2" 0 +2 ; Is the existing install the same version? + Quit ; ...yes, already installed, we are done + Abort + ${EndIf} + MessageBox MB_ICONEXCLAMATION "Unable to uninstall!" + Abort + ${Else} + StrCpy $0 $R1 1 + ${IfThen} $0 == '"' ${|} StrCpy $R1 $R1 -1 1 ${|} ; Strip quotes from UninstallString + Delete $R1 + RMDir $INSTDIR + ${EndIf} + + reinst_done: + +FunctionEnd + +!endif # VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD + +Function ShowReleaseNotes + StrCpy $0 $WINDIR\hh.exe + ${IfNotThen} ${FileExists} $0 ${|} SearchPath $0 hh.exe ${|} + ${If} ${FileExists} $0 + Exec '"$0" mk:@MSITStore:$INSTDIR\NSIS.chm::/SectionF.1.html' + ${Else} + ExecShell "" "https://nsis.sourceforge.io/Docs/AppendixF.html#F.1" + ${EndIf} +FunctionEnd + +;-------------------------------- +;Uninstaller Section + +Section Uninstall + + SetDetailsPrint textonly + DetailPrint "Uninstalling NSI Development Shell Extensions..." + SetDetailsPrint listonly + + IfFileExists $INSTDIR\Bin\makensis.exe nsis_installed + MessageBox MB_YESNO "It does not appear that NSIS is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" IDYES nsis_installed + Abort "Uninstall aborted by user" + nsis_installed: + + SetDetailsPrint textonly + DetailPrint "Deleting Registry Keys..." + SetDetailsPrint listonly + + !macro AssocDeleteFileExtAndProgId _hkey _dotext _pid + ReadRegStr $R0 ${_hkey} "Software\Classes\${_dotext}" "" + StrCmp $R0 "${_pid}" 0 +2 + DeleteRegKey ${_hkey} "Software\Classes\${_dotext}" + + DeleteRegKey ${_hkey} "Software\Classes\${_pid}" + !macroend + + !insertmacro AssocDeleteFileExtAndProgId HKLM ".nsi" "NSIS.Script" + !insertmacro AssocDeleteFileExtAndProgId HKLM ".nsh" "NSIS.Header" + + ${NotifyShell_AssocChanged} + + DeleteRegKey HKLM "${REG_UNINST_KEY}" + DeleteRegKey HKLM "Software\NSIS" + + SetDetailsPrint textonly + DetailPrint "Deleting Files..." + SetDetailsPrint listonly + + Delete "$SMPROGRAMS\NSIS${NAMESUFFIX}.lnk" + Delete "$DESKTOP\NSIS${NAMESUFFIX}.lnk" ; Remove legacy shortcut + Delete $INSTDIR\makensis.exe + Delete $INSTDIR\makensisw.exe + Delete $INSTDIR\NSIS.exe + Delete $INSTDIR\NSIS.exe.manifest + Delete $INSTDIR\license.txt + Delete $INSTDIR\COPYING + Delete $INSTDIR\uninst-nsis.exe + Delete $INSTDIR\nsisconf.nsi + Delete $INSTDIR\nsisconf.nsh + Delete $INSTDIR\NSIS.chm + RMDir /r $INSTDIR\Bin + RMDir /r $INSTDIR\Contrib + RMDir /r $INSTDIR\Docs + RMDir /r $INSTDIR\Examples + RMDir /r $INSTDIR\Include + RMDir /r $INSTDIR\Menu + RMDir /r $INSTDIR\Plugins + RMDir /r $INSTDIR\Stubs + RMDir $INSTDIR + + SetDetailsPrint both + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/nsDialogs/InstallOptions.nsi b/libs/NSIS/NSIS-source/Examples/nsDialogs/InstallOptions.nsi new file mode 100644 index 0000000000..68a68f9f3d --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/nsDialogs/InstallOptions.nsi @@ -0,0 +1,47 @@ +!include LogicLib.nsh +!include WinMessages.nsh + +Name "nsDialogs IO" +OutFile "nsDialogs IO.exe" + +Page custom nsDialogsIO UpdateINIState +Page instfiles + +XPStyle on + +ShowInstDetails show + +!include nsDialogs.nsh +!insertmacro NSD_FUNCTION_INIFILE + +Function nsDialogsIO + + InitPluginsDir + File /oname=$PLUGINSDIR\io.ini "..\InstallOptions\test.ini" + + ${If} ${Cmd} `MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Test the right-to-left version?" IDYES` + WriteINIStr $PLUGINSDIR\io.ini Settings RTL 1 + ${EndIf} + + StrCpy $0 $PLUGINSDIR\io.ini + + Call CreateDialogFromINI + +FunctionEnd + +Section + + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 2" "State" + DetailPrint "Install X=$0" + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 3" "State" + DetailPrint "Install Y=$0" + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 4" "State" + DetailPrint "Install Z=$0" + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 5" "State" + DetailPrint "File=$0" + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 6" "State" + DetailPrint "Dir=$0" + ReadINIStr $0 "$PLUGINSDIR\io.ini" "Field 8" "State" + DetailPrint "Info=$0" + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/nsDialogs/example.nsi b/libs/NSIS/NSIS-source/Examples/nsDialogs/example.nsi new file mode 100644 index 0000000000..766a0d0eab --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/nsDialogs/example.nsi @@ -0,0 +1,299 @@ +Name "nsDialogs Example" +OutFile "nsDialogs Example.exe" +Caption "$(^Name)" + +Unicode True +XPStyle on +RequestExecutionLevel user + +!include nsDialogs.nsh +!include LogicLib.nsh +!include WinCore.nsh ; MAKELONG + +LicenseText "All the action takes place on the next page..." "Start" +SubCaption 0 ": Ready?" + +Page license +Page custom nsDialogsPage +Page custom LBPage +Page custom RangesPage +Page custom NotifyPage +Page custom RadioPage RadioLeave +!pragma warning disable 8000 ; "Page instfiles not used, no sections will be executed!" + +Var BUTTON +Var EDIT +Var CHECKBOX + +Function nsDialogsPage + nsDialogs::Create 1018 + Pop $0 + + GetFunctionAddress $0 OnBack + nsDialogs::OnBack $0 + + ${NSD_CreateButton} 0 0 100% 12u Test + Pop $BUTTON + GetFunctionAddress $0 OnClick + nsDialogs::OnClick $BUTTON $0 + + ${NSD_CreateText} 0 35 100% 12u hello + Pop $EDIT + GetFunctionAddress $0 OnChange + nsDialogs::OnChange $EDIT $0 + ${NSD_Edit_SetCueBannerText} $EDIT 0 "Type 'hello there' and get a free surprise" + + ${NSD_CreateCheckbox} 0 -50 100% 8u Test + Pop $CHECKBOX + GetFunctionAddress $0 OnCheckbox + nsDialogs::OnClick $CHECKBOX $0 + + ${NSD_CreateLabel} 0 40u 75% 40u "* Type `hello there` above.$\n* Click the button.$\n* Check the checkbox.$\n* Hit the Back button." + Pop $0 + + nsDialogs::Show +FunctionEnd + +Function OnClick + Pop $0 # HWND + MessageBox MB_OK clicky +FunctionEnd + +Function OnChange + Pop $0 # HWND + + System::Call user32::GetWindowText(p$EDIT,t.r0,i${NSIS_MAX_STRLEN}) + ${If} $0 == "hello there" + MessageBox MB_OK "right back at ya" + ${EndIf} +FunctionEnd + +Function OnBack + MessageBox MB_YESNO "are you sure?" IDYES +2 + Abort +FunctionEnd + +Function OnCheckbox + Pop $0 # HWND + MessageBox MB_OK "checkbox clicked" +FunctionEnd + +!macro BeginControlsTestPage title + nsDialogs::Create 1018 + Pop $0 + ${NSD_SetText} $hWndParent "$(^Name): ${title}" +!macroend + +!macro CreateButton x y w h txt var handler data + ${NSD_CreateButton} ${x} ${y} ${w} ${h} "${txt}" + Pop ${var} + nsDialogs::SetUserData ${var} ${data} + ${NSD_OnClick} ${var} ${handler} +!macroend + + +Function LBPage + !insertmacro BeginControlsTestPage "ListBox" + + ${NSD_CreateSortedListBox} 1u 0 -2u 70u "" + Pop $1 + ${NSD_LB_AddString} $1 "Foo" + ${NSD_LB_AddString} $1 "Bar" + + StrCpy $9 1 + ${NSD_CreateText} 1u 75u -2u 12u "New item #$9" + Pop $EDIT + !insertmacro CreateButton 1u 90u 50u 12u "Add (&Sorted)" $0 LBAction Add + !insertmacro CreateButton 53u 90u 50u 12u "&Prepend" $0 LBAction Prepend + !insertmacro CreateButton 105u 90u 50u 12u "&Append" $0 LBAction Append + !insertmacro CreateButton 160u 90u 50u 12u "&Delete Last" $0 LBAction DL + !insertmacro CreateButton 215u 90u 50u 12u "&Clear" $0 LBAction Clear + + nsDialogs::Show +FunctionEnd + +Function LBAction + Pop $0 + nsDialogs::GetUserData $0 + Pop $0 + ${NSD_GetText} $EDIT $8 + + ${Select} $0 + ${Case} "Add" + ${NSD_LB_AddString} $1 $8 + ${Case} "Prepend" + ${NSD_LB_PrependString} $1 $8 + ${Case} "Append" + ${NSD_LB_AppendString} $1 $8 + ${Case} "DL" + ${NSD_LB_GetCount} $1 $8 + ${If} $8 U> 0 + IntOp $8 $8 - 1 + ${NSD_LB_DelItem} $1 $8 + ${EndIf} + Return + ${Case} "Clear" + ${NSD_LB_Clear} $1 + Return + ${EndSelect} + + IntOp $9 $9 + 1 + ${NSD_SetText} $EDIT "New item #$9" +FunctionEnd + + +Function RangesPage + !insertmacro BeginControlsTestPage "Ranges" + + ${NSD_CreateHTrackBar} 1 0 -2 20u "" + Pop $1 + ${NSD_TrackBar_SetRangeMax} $1 10 + ${NSD_TrackBar_SetTicFreq} $1 1 + ${NSD_TrackBar_SetPos} $1 3 + + StrCpy $9 20 ; Progress pos + ${NSD_CreateProgressBar} 1 25u -2 8u "" + Pop $2 + ${NSD_CreateTimer} RangesTimer 1000 + + ${NSD_CreateNumber} 1 40u 50u 12u "42" + Pop $3 + ${NSD_CreateUpDown} 0 0 0 0 "" + Pop $4 + ${NSD_UD_SetBuddy} $4 $3 + ${MAKELONG} $5 $0 50 0 ; 0..50 + ${NSD_UD_SetPackedRange} $4 $5 + + nsDialogs::Show +FunctionEnd + +Function RangesTimer + IntOp $9 $9 + 5 + ${IfThen} $9 > 100 ${|} StrCpy $9 0 ${|} + ${NSD_ProgressBar_SetPos} $2 $9 +FunctionEnd + + +Function NotifyPage + !insertmacro BeginControlsTestPage "WM_NOTIFY" + + nsDialogs::CreateControl "${__NSD_RichEdit_CLASS_20A}" "${__NSD_RichEdit_STYLE}" "${__NSD_RichEdit_EXSTYLE}" 1 1 -2 50u "" ; Forcing ANSI control, see forums.winamp.com/showthread.php?p=3169999 + Pop $9 + ${NSD_OnNotify} $9 OnNotify + IntOp $8 ${ENM_LINK} | ${ENM_KEYEVENTS} + ${NSD_RichEd_SetEventMask} $9 $8 + SendMessage $9 ${EM_AUTOURLDETECT} 1 0 + ${NSD_SetText} $9 "{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard http://nsis.sf.net\par {\b Click the link!}\par\par Type something and I will block every other character...}" + + ${NSD_InitCommonControlsEx} ${ICC_DATE_CLASSES} + ${NSD_CreateDatePicker} 1% 55u 48% 12u "" + Pop $1 + ${NSD_OnNotify} $1 onDateTimeNotify + ${NSD_CreateLabel} 51% 56u 48% 12u "Change the date..." + Pop $9 + + /* + ${NSD_CreateCalendar} 1% 23% 150u 90u "" + Pop $1 + ${NSD_AddStyle} $1 ${MCS_NOTODAY} + System::Call 'USER32::SendMessage(p$1, i${MCM_GETMINREQRECT}, p0, @r2)' + System::Call '*$2(i,i,i.r2,i.r3)' + #System::Call 'USER32::SendMessage(p$1, i${MCM_GETMAXTODAYWIDTH}, p0, *i0r4)' + #${IfThen} $4 > $2 ${|} StrCpy $2 $4 ${|} + System::Call 'USER32::SetWindowPos(p$1,p0,i,i,ir2,ir3,i0x16)' + */ + + nsDialogs::Show +FunctionEnd + +Function OnNotify + Pop $1 ; HWND + Pop $2 ; Code + Pop $3 ; NMHDR* + ${If} $2 = ${EN_LINK} + System::Call '*$3(p,p,p,p.r2,p,p,i.r4,i.r5)' ; Extract from ENLINK* + ${IfThen} $2 <> ${WM_LBUTTONDOWN} ${|} Return ${|} + IntOp $2 $5 - $4 + System::Call '*(ir4,ir5,l,&t$2,i)p.r2' ; Create TEXTRANGE and a text buffer + ${If} $2 P<> 0 + IntPtrOp $3 $2 + 16 ; Find buffer + System::Call '*$2(i,i,p$3)' ; Set buffer in TEXTRANGE + SendMessage $1 ${EM_GETTEXTRANGE} "" $2 $4 + ${If} $4 <> 0 + System::Call 'SHELL32::ShellExecute(p$hWndParent, p0, pr3, p0, p0, i 1)' + ${EndIf} + System::Free $2 + ${EndIf} + ${ElseIf} $2 = ${EN_MSGFILTER} + Var /Global Toggle + System::Call '*$3(p,i,i,i.r4)' ; MSGFILTER->msg + ${If} $4 = ${WM_CHAR} + IntOp $Toggle $Toggle ^ 1 + ${If} $Toggle & 1 + ${NSD_Return} 1 + ${EndIf} + ${EndIf} + ${EndIf} +FunctionEnd + +Function onDateTimeNotify +Pop $1 ; HWND +Pop $2 ; Code +Pop $3 ; NMHDR* +${If} $2 = ${DTN_DATETIMECHANGE} + System::Call 'USER32::SendMessage(p$1, i${DTM_GETSYSTEMTIME}, p0, @r3)i.r0' + ${If} $0 = ${GDT_VALID} + System::Call '*$3(&i2.R1, &i2.R2, &i2, &i2.R3, &i2, &i2, &i2, &i2)' ; SYSTEMTIME + StrCpy $0 "$R1/$R2/$R3" + ${Else} + StrCpy $0 "N/A" + ${EndIf} + ${NSD_SetText} $9 $0 +${EndIf} +FunctionEnd + + +Function RadioPage + !insertmacro BeginControlsTestPage "Radio buttons" + + ; Group 1 + ${NSD_CreateFirstRadioButton} 4u 0 40% 6% "NPR" + Pop $1 + ${NSD_OnClick} $1 onStationChanged + ${NSD_CreateAdditionalRadioButton} 4u 12% 40% 6% "BBC" + Pop $2 + ${NSD_OnClick} $2 onStationChanged + ${NSD_CreateLabel} 4u 30u 80% 12u "" + Pop $3 + + ; Group 2 + ${NSD_CreateFirstRadioButton} 4u 50u 50% 12u "FM" + Pop $4 + ${NSD_CreateAdditionalRadioButton} 4u 64u 50% 12u "AM" + Pop $5 + + SendMessage $4 ${BM_CLICK} "" "" ; Must select a default + SendMessage $2 ${BM_CLICK} "" "" ; Must select a default + nsDialogs::Show +FunctionEnd + +Function onStationChanged +Pop $0 +${NSD_GetText} $0 $0 +${If} $0 == "NPR" + ${NSD_SetText} $3 "America, f*(# yeah!" +${Else} + ${NSD_SetText} $3 "Keep Calm and Carry On" +${EndIf} +FunctionEnd + +Function RadioLeave +${NSD_GetChecked} $5 $0 +${If} $0 <> 0 + MessageBox MB_YESNO "Are you sure you want to keep living in the past?" IDYES +2 + Abort +${EndIf} +FunctionEnd + +Section +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/nsDialogs/timer.nsi b/libs/NSIS/NSIS-source/Examples/nsDialogs/timer.nsi new file mode 100644 index 0000000000..c24ef2c0bb --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/nsDialogs/timer.nsi @@ -0,0 +1,107 @@ +!include LogicLib.nsh +!include nsDialogs.nsh +!include WinMessages.nsh + +Name "nsDialogs Timer Example" +OutFile "nsDialogs Timer Example.exe" +XPStyle on +RequestExecutionLevel user + +Var DIALOG +Var TEXT +Var PROGBAR +Var PROGBAR2 +Var PROGBAR3 +Var BUTTON +Var BUTTON2 + +Page custom nsDialogsPage +!pragma warning disable 8000 ; "Page instfiles not used, no sections will be executed!" + +Function OnTimer + + SendMessage $PROGBAR ${PBM_GETPOS} 0 0 $1 + ${If} $1 = 100 + SendMessage $PROGBAR ${PBM_SETPOS} 0 0 + ${Else} + SendMessage $PROGBAR ${PBM_DELTAPOS} 10 0 + ${EndIf} + +FunctionEnd + +Function OnTimer2 + + SendMessage $PROGBAR2 ${PBM_GETPOS} 0 0 $1 + ${If} $1 = 100 + SendMessage $PROGBAR2 ${PBM_SETPOS} 0 0 + ${Else} + SendMessage $PROGBAR2 ${PBM_DELTAPOS} 5 0 + ${EndIf} + +FunctionEnd + +Function OnTimer3 + + SendMessage $PROGBAR3 ${PBM_GETPOS} 0 0 $1 + ${If} $1 >= 100 + ${NSD_KillTimer} OnTimer3 + MessageBox MB_OK "Timer 3 killed" + ${Else} + SendMessage $PROGBAR3 ${PBM_DELTAPOS} 2 0 + ${EndIf} + +FunctionEnd + +Function OnClick + + Pop $0 + + ${NSD_KillTimer} OnTimer + +FunctionEnd + +Function OnClick2 + + Pop $0 + + ${NSD_KillTimer} OnTimer2 + +FunctionEnd + +Function nsDialogsPage + + nsDialogs::Create 1018 + Pop $DIALOG + + ${NSD_CreateLabel} 0u 0u 100% 9u "nsDialogs timer example" + Pop $TEXT + + ${NSD_CreateProgressBar} 0u 10u 100% 12u "" + Pop $PROGBAR + + ${NSD_CreateButton} 0u 25u 100u 14u "Kill Timer 1" + Pop $BUTTON + ${NSD_OnClick} $BUTTON OnClick + + ${NSD_CreateProgressBar} 0u 52u 100% 12u "" + Pop $PROGBAR2 + SendMessage $PROGBAR2 ${PBM_SETBARCOLOR} 0 0x0000FF ; No visual styles + SendMessage $PROGBAR2 ${PBM_SETSTATE} ${PBST_ERROR} 0 ; Vista+ + + ${NSD_CreateButton} 0u 67u 100u 14u "Kill Timer 2" + Pop $BUTTON2 + ${NSD_OnClick} $BUTTON2 OnClick2 + + ${NSD_CreateProgressBar} 0u 114u 100% 12u "" + Pop $PROGBAR3 + + ${NSD_CreateTimer} OnTimer 1000 + ${NSD_CreateTimer} OnTimer2 100 + ${NSD_CreateTimer} OnTimer3 200 + + nsDialogs::Show + +FunctionEnd + +Section +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/nsDialogs/welcome.nsi b/libs/NSIS/NSIS-source/Examples/nsDialogs/welcome.nsi new file mode 100644 index 0000000000..d8c2cd7d10 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/nsDialogs/welcome.nsi @@ -0,0 +1,214 @@ +!include MUI.nsh +!include LogicLib.nsh +!include nsDialogs.nsh +!include WinMessages.nsh +!include FileFunc.nsh + +Name "nsDialogs Welcome" +OutFile "nsDialogs Welcome.exe" + +Page custom nsDialogsWelcome +Page custom nsDialogsDirectory +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_LANGUAGE English + + +Var DIALOG +Var HEADLINE +Var TEXT +Var IMAGECTL +Var IMAGE +Var DIRECTORY +Var FREESPACE + +Var HEADLINE_FONT + +Function .onInit + + CreateFont $HEADLINE_FONT "$(^Font)" "14" "700" + + InitPluginsDir + File /oname=$PLUGINSDIR\welcome.bmp "${NSISDIR}\Contrib\Graphics\Wizard\orange-nsis.bmp" + +FunctionEnd + +Function HideControls + + LockWindow on + GetDlgItem $0 $HWNDPARENT 1028 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1256 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1035 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1037 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1038 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1039 + ShowWindow $0 ${SW_HIDE} + + GetDlgItem $0 $HWNDPARENT 1045 + ShowWindow $0 ${SW_NORMAL} + LockWindow off + +FunctionEnd + +Function ShowControls + + LockWindow on + GetDlgItem $0 $HWNDPARENT 1028 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1256 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1035 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1037 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1038 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1039 + ShowWindow $0 ${SW_NORMAL} + + GetDlgItem $0 $HWNDPARENT 1045 + ShowWindow $0 ${SW_HIDE} + LockWindow off + +FunctionEnd + +Function nsDialogsWelcome + + nsDialogs::Create 1044 + Pop $DIALOG + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 0 0 109u 193u "" + Pop $IMAGECTL + + StrCpy $0 $PLUGINSDIR\welcome.bmp + System::Call 'user32::LoadImage(p 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE})p.s' + Pop $IMAGE + + SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 10u -130u 20u "Welcome to nsDialogs!" + Pop $HEADLINE + + SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0 + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 120u 32u -130u -32u "nsDialogs is the next generation of user interfaces in NSIS. It gives the developer full control over custom pages. Some of the features include control text containing variables, callbacks directly into script functions and creation of any type of control. Create boring old edit boxes or load some external library and create custom controls with no need of creating your own plug-in.$\r$\n$\r$\nUnlike InstallOptions, nsDialogs doesn't use INI files to communicate with the script. By interacting directly with the script, nsDialogs can perform much faster without the need of costly, old and inefficient INI operations. Direct interaction also allows direct calls to functions defined in the script and removes the need of conversion functions like Io2Nsis.$\r$\n$\r$\nHit the Next button to see how it all fits into a mock directory page." + Pop $TEXT + + SetCtlColors $DIALOG 0 0xffffff + SetCtlColors $HEADLINE 0 0xffffff + SetCtlColors $TEXT 0 0xffffff + + Call HideControls + + nsDialogs::Show + + Call ShowControls + + System::Call gdi32::DeleteObject(p$IMAGE) + +FunctionEnd + +!define SHACF_FILESYSTEM 1 + +Function nsDialogsDirectory + + !insertmacro MUI_HEADER_TEXT "Choose Install Location" "Choose the folder in which to install $(^NameDA)." + + GetDlgItem $0 $HWNDPARENT 1 + EnableWindow $0 0 + + nsDialogs::Create 1018 + Pop $DIALOG + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_CENTER} 0 0 0 100% 30 "Directory page" + Pop $HEADLINE + + SendMessage $HEADLINE ${WM_SETFONT} $HEADLINE_FONT 0 + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 30 100% 40 "Select the installation directory of NSIS to continue. $_CLICK" + Pop $TEXT + + nsDialogs::CreateControl EDIT ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${ES_AUTOHSCROLL}|${WS_TABSTOP} ${WS_EX_CLIENTEDGE} 0 75 100% 12u "" + Pop $DIRECTORY + + SendMessage $HWNDPARENT ${WM_NEXTDLGCTL} $DIRECTORY 1 + + GetFunctionAddress $0 DirChange + nsDialogs::OnChange $DIRECTORY $0 + + System::Call shlwapi::SHAutoComplete(p$DIRECTORY,i${SHACF_FILESYSTEM}) + + nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS} 0 0 -10u 100% 10u "" + Pop $FREESPACE + + Call UpdateFreeSpace + + nsDialogs::Show + +FunctionEnd + +Function UpdateFreeSpace + + ${GetRoot} $INSTDIR $0 + StrCpy $1 " bytes" + + System::Call kernel32::GetDiskFreeSpaceEx(tr0,*l,*l,*l.r0) + + ${If} $0 > 1024 + ${OrIf} $0 < 0 + System::Int64Op $0 / 1024 + Pop $0 + StrCpy $1 "kb" + ${If} $0 > 1024 + ${OrIf} $0 < 0 + System::Int64Op $0 / 1024 + Pop $0 + StrCpy $1 "mb" + ${If} $0 > 1024 + ${OrIf} $0 < 0 + System::Int64Op $0 / 1024 + Pop $0 + StrCpy $1 "gb" + ${EndIf} + ${EndIf} + ${EndIf} + + SendMessage $FREESPACE ${WM_SETTEXT} 0 "STR:Free space: $0$1" + +FunctionEnd + +Function DirChange + + Pop $0 # dir hwnd + + GetDlgItem $0 $HWNDPARENT 1 + + System::Call user32::GetWindowText(p$DIRECTORY,t.d,i${NSIS_MAX_STRLEN}) + + ${If} ${FileExists} $INSTDIR\makensis.exe + EnableWindow $0 1 + ${Else} + EnableWindow $0 0 + ${EndIf} + + Call UpdateFreeSpace + +FunctionEnd + +Section +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/nsExec/test.nsi b/libs/NSIS/NSIS-source/Examples/nsExec/test.nsi new file mode 100644 index 0000000000..5a0c9317d7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/nsExec/test.nsi @@ -0,0 +1,31 @@ +Name "nsExec Test" + +OutFile "nsExec Test.exe" + +ShowInstDetails show + +Section "Silent MakeNSIS" + nsExec::Exec '"${NSISDIR}\makensis.exe"' + Pop $0 # return value/error/timeout + DetailPrint "" + DetailPrint " Return value: $0" + DetailPrint "" +SectionEnd + +Section "MakeNSIS commands help" + nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP' + Pop $0 # return value/error/timeout + DetailPrint "" + DetailPrint " Return value: $0" + DetailPrint "" +SectionEnd + +Section "Output to variable" + nsExec::ExecToStack '"${NSISDIR}\makensis.exe" /VERSION' + Pop $0 # return value/error/timeout + Pop $1 # printed text, up to ${NSIS_MAX_STRLEN} + DetailPrint '"${NSISDIR}\makensis.exe" /VERSION printed: $1' + DetailPrint "" + DetailPrint " Return value: $0" + DetailPrint "" +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/one-section.nsi b/libs/NSIS/NSIS-source/Examples/one-section.nsi new file mode 100644 index 0000000000..ef3779b144 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/one-section.nsi @@ -0,0 +1,80 @@ +; one-section.nsi +; +; This example demonstrates how to control section selection. +; It allows only one of the sections of a group to be selected. + +;-------------------------------- + +; Section define/macro header file +; See this header file for more info + +!include "Sections.nsh" + +;-------------------------------- + +Name "One Section" +OutFile "one-section.exe" +RequestExecutionLevel user + +;-------------------------------- + +; Pages + +Page Components +Page InstFiles + +;-------------------------------- + +; Sections + +Section !Required + SectionIn RO +SectionEnd + +Section "Group 1 - Option 1" g1o1 +SectionEnd + +Section /o "Group 1 - Option 2" g1o2 +SectionEnd + +Section /o "Group 1 - Option 3" g1o3 +SectionEnd + +Section "Group 2 - Option 1" g2o1 +SectionEnd + +Section /o "Group 2 - Option 2" g2o2 +SectionEnd + +Section /o "Group 2 - Option 3" g2o3 +SectionEnd + +;-------------------------------- + +; Functions + +; $1 stores the status of group 1 +; $2 stores the status of group 2 + +Function .onInit + + StrCpy $1 ${g1o1} ; Group 1 - Option 1 is selected by default + StrCpy $2 ${g2o1} ; Group 2 - Option 1 is selected by default + +FunctionEnd + +Function .onSelChange + + !insertmacro StartRadioButtons $1 + !insertmacro RadioButton ${g1o1} + !insertmacro RadioButton ${g1o2} + !insertmacro RadioButton ${g1o3} + !insertmacro EndRadioButtons + + !insertmacro StartRadioButtons $2 + !insertmacro RadioButton ${g2o1} + !insertmacro RadioButton ${g2o2} + !insertmacro RadioButton ${g2o3} + !insertmacro EndRadioButtons + +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/primes.nsi b/libs/NSIS/NSIS-source/Examples/primes.nsi new file mode 100644 index 0000000000..1d8f196cd8 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/primes.nsi @@ -0,0 +1,70 @@ +; primes.nsi +; +; This is an example of the possibilities of the NSIS Script language. +; It calculates prime numbers. + +;-------------------------------- + +Name "primes" +AllowRootDirInstall true +OutFile "primes.exe" +Caption "Prime number generator" +ShowInstDetails show +AllowRootDirInstall true +InstallDir "$EXEDIR" +RequestExecutionLevel user + +DirText "Select a directory to write primes.txt. $_CLICK" + +;-------------------------------- + +;Pages + +Page directory +Page instfiles + +;-------------------------------- + +Section "" + SetOutPath $INSTDIR + Call DoPrimes +SectionEnd + +;-------------------------------- + +Function DoPrimes + +; we put this in here so it doesn't update the progress bar (faster) + +!define PPOS $0 ; position in prime searching +!define PDIV $1 ; divisor +!define PMOD $2 ; the result of the modulus +!define PCNT $3 ; count of how many we've printed + FileOpen $9 $INSTDIR\primes.txt w + + DetailPrint "2 is prime!" + FileWrite $9 "2 is prime!$\r$\n" + DetailPrint "3 is prime!" + FileWrite $9 "3 is prime!$\r$\n" + Strcpy ${PPOS} 3 + Strcpy ${PCNT} 2 +outerloop: + StrCpy ${PDIV} 3 + innerloop: + IntOp ${PMOD} ${PPOS} % ${PDIV} + IntCmp ${PMOD} 0 notprime + IntOp ${PDIV} ${PDIV} + 2 + IntCmp ${PDIV} ${PPOS} 0 innerloop 0 + DetailPrint "${PPOS} is prime!" + FileWrite $9 "${PPOS} is prime!$\r$\n" + IntOp ${PCNT} ${PCNT} + 1 + IntCmp ${PCNT} 100 0 innerloop + StrCpy ${PCNT} 0 + MessageBox MB_YESNO "Process more?" IDNO stop + notprime: + IntOp ${PPOS} ${PPOS} + 2 + Goto outerloop + stop: + FileClose $9 + +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/rtest.nsi b/libs/NSIS/NSIS-source/Examples/rtest.nsi new file mode 100644 index 0000000000..0a9451505a --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/rtest.nsi @@ -0,0 +1,93 @@ +; rtest.nsi +; +; This script tests some advanced NSIS functions. + +;-------------------------------- + +Name "rtest" +OutFile "rtest.exe" + +ComponentText "Select tests!" +ShowInstDetails show + +RequestExecutionLevel user + +;-------------------------------- + +Section "Test 1" + + StrCpy $R0 "a" + + GetFunctionAddress $R1 test1 + Call $R1 + + StrCmp $R0 "a182345678" success + + DetailPrint "Test 1 failed (output: $R0)" + Goto end + + success: + DetailPrint "Test 1 succeeded (output: $R0)" + + end: + +SectionEnd + +Function test1 + + GetLabelAddress $9 skip + + IntOp $9 $9 - 1 + StrCpy $R0 $R01 + + Call $9 + + StrCpy $R0 $R02 + StrCpy $R0 $R03 + StrCpy $R0 $R04 + StrCpy $R0 $R05 + StrCpy $R0 $R06 + StrCpy $R0 $R07 + StrCpy $R0 $R08 + + skip: + +FunctionEnd + +;-------------------------------- + +Section "Test 2" + + StrCpy $R0 "0" + StrCpy $R1 "11" + + Call test2 + + StrCmp $R1 "11,10,9,8,7,6,5,4,3,2,1" success + + DetailPrint "Test 2 failed (output: $R1)" + Goto end + + success: + DetailPrint "Test 2 succeeded (output: $R1)" + + end: + +SectionEnd + +Function test2 + + IntOp $R0 $R0 + 1 + IntCmp $R0 10 done + + Push $R0 + + GetFunctionAddress $R2 test2 + Call $R2 + + Pop $R0 + + done: + StrCpy $R1 "$R1,$R0" + +FunctionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/silent.nsi b/libs/NSIS/NSIS-source/Examples/silent.nsi new file mode 100644 index 0000000000..d0492ce146 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/silent.nsi @@ -0,0 +1,63 @@ +# This example shows how to handle silent installers. +# In short, you need IfSilent and the /SD switch for MessageBox to make your installer +# really silent when the /S switch is used. + +Name "Silent" +OutFile "silent.exe" +RequestExecutionLevel user + +# uncomment the following line to make the installer silent by default. +; SilentInstall silent + +Function .onInit + # `/SD IDYES' tells MessageBox to automatically choose IDYES if the installer is silent + # in this case, the installer can only be silent if the user used the /S switch or if + # you've uncommented line number 5 + MessageBox MB_YESNO|MB_ICONQUESTION "Would you like the installer to be silent from now on?" \ + /SD IDYES IDNO no IDYES yes + + # SetSilent can only be used in .onInit and doesn't work well along with `SetSilent silent' + + yes: + SetSilent silent + Goto done + no: + SetSilent normal + done: +FunctionEnd + +Section + IfSilent 0 +2 + MessageBox MB_OK|MB_ICONINFORMATION 'This is a "silent" installer' + + # there is no need to use IfSilent for this one because the /SD switch takes care of that + MessageBox MB_OK|MB_ICONINFORMATION "This is not a silent installer" /SD IDOK + + # when `SetOverwrite on' (which is the default) is used, the installer will show a message + # if it can't open a file for writing. On silent installers, the ignore option will be + # automatically selected. if `AllowSkipFiles off' (default is on) was used, there is no + # ignore option and the cancel option will be automatically selected. + + # on is default + ; AllowSkipFiles on + + # lock file + FileOpen $0 $TEMP\silentOverwrite w + # try to extract - will fail + File /oname=$TEMP\silentOverwrite silent.nsi + # unlcok + FileClose $0 + + # this will always show on silent installers because ignore is the option automatically + # selected when a file can't be opened for writing on a silent installer + MessageBox MB_OK|MB_ICONINFORMATION "This message box always shows if the installer is silent" + + AllowSkipFiles off + + # lock file + FileOpen $0 $TEMP\silentOverwrite w + # try to extract - will fail + File /oname=$TEMP\silentOverwrite silent.nsi + # unlcok + FileClose $0 +SectionEnd \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Examples/unicode.nsi b/libs/NSIS/NSIS-source/Examples/unicode.nsi new file mode 100644 index 0000000000..6c604f3566 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/unicode.nsi @@ -0,0 +1,47 @@ +; Unicode installers will not be able to run on Windows 9x! +Unicode true + +Name "Unicode Games" +OutFile "unicode.exe" +RequestExecutionLevel User +ShowInstDetails show +XPStyle on + + +Section "Unicode in UI" + + DetailPrint "Hello World!" + DetailPrint "שלום עולם!" + DetailPrint "مرحبا العالم!" + DetailPrint "こんにちは、世界!" + DetailPrint "你好世界!" + DetailPrint "привет мир!" + DetailPrint "안녕하세요!" + + DetailPrint "${U+00A9}" # arbitrary unicode chars + +SectionEnd + + +Section "Unicode in Files" + + Var /Global Message + + InitPluginsDir + FileOpen $0 "$PluginsDir\Test.txt" w + IfErrors done + FileWriteUTF16LE /BOM $0 "Hello World " + FileWriteWord $0 0xD83C # Manually write ${U+1F30D} + FileWriteWord $0 0xDF0D # as surrogate-pair + FileWriteUTF16LE $0 " and Sun ${U+2600}$\r$\n" + FileClose $0 + + FileOpen $0 "$PluginsDir\Test.txt" r + IfErrors done + FileReadUTF16LE $0 $Message + FileClose $0 + + DetailPrint "Message: $Message" + done: + +SectionEnd diff --git a/libs/NSIS/NSIS-source/Examples/waplugin.nsi b/libs/NSIS/NSIS-source/Examples/waplugin.nsi new file mode 100644 index 0000000000..37d74d55a5 --- /dev/null +++ b/libs/NSIS/NSIS-source/Examples/waplugin.nsi @@ -0,0 +1,205 @@ +; waplugin.nsi +; +; This script will generate an installer that installs a Winamp 2 plug-in. +; +; This installer will automatically alert the user that installation was +; successful, and ask them whether or not they would like to make the +; plug-in the default and run Winamp. + +;-------------------------------- + +; Uncomment the next line to enable auto Winamp download +; !define WINAMP_AUTOINSTALL + +; The name of the installer +Name "TinyVis Plug-in" + +; The file to write +OutFile "waplugin.exe" + +; The default installation directory +InstallDir $PROGRAMFILES\Winamp + +; detect winamp path from uninstall string if available +InstallDirRegKey HKLM \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \ + "UninstallString" + +; The text to prompt the user to enter a directory +DirText "Please select your Winamp path below (you will be able to proceed when Winamp is detected):" +# currently doesn't work - DirShow hide + +; automatically close the installer when done. +AutoCloseWindow true + +; hide the "show details" box +ShowInstDetails nevershow + +; Request application privileges for Windows Vista +RequestExecutionLevel admin + +;-------------------------------- + +;Pages + +Page directory +Page instfiles + +;-------------------------------- + +; The stuff to install + +Section "" + +!ifdef WINAMP_AUTOINSTALL + Call MakeSureIGotWinamp +!endif + + Call QueryWinampVisPath + SetOutPath $1 + + ; File to extract + #File "C:\program files\winamp\plugins\vis_nsfs.dll" + File /oname=vis_nsfs.dll "${NSISDIR}\Plugins\x86-ansi\TypeLib.dll" # dummy plug-in + + ; prompt user, and if they select no, go to NoWinamp + MessageBox MB_YESNO|MB_ICONQUESTION \ + "The plug-in was installed. Would you like to run Winamp now with TinyVis as the default plug-in?" \ + IDNO NoWinamp + WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_name" "vis_nsfs.dll" + WriteINIStr "$INSTDIR\Winamp.ini" "Winamp" "visplugin_num" "0" + Exec '"$INSTDIR\Winamp.exe"' + NoWinamp: + +SectionEnd + +;-------------------------------- + +Function .onVerifyInstDir + +!ifndef WINAMP_AUTOINSTALL + + ;Check for Winamp installation + + IfFileExists $INSTDIR\Winamp.exe Good + Abort + Good: + +!endif ; WINAMP_AUTOINSTALL + +FunctionEnd + +Function QueryWinampVisPath ; sets $1 with vis path + + StrCpy $1 $INSTDIR\Plugins + ; use DSPDir instead of VISDir to get DSP plugins directory + ReadINIStr $9 $INSTDIR\winamp.ini Winamp VisDir + StrCmp $9 "" End + IfFileExists $9 0 End + StrCpy $1 $9 ; update dir + End: + +FunctionEnd + +!ifdef WINAMP_AUTOINSTALL + +Function GetWinampInstPath + + Push $0 + Push $1 + Push $2 + ReadRegStr $0 HKLM \ + "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" \ + "UninstallString" + StrCmp $0 "" fin + + StrCpy $1 $0 1 0 ; get firstchar + StrCmp $1 '"' "" getparent + ; if first char is ", let's remove "'s first. + StrCpy $0 $0 "" 1 + StrCpy $1 0 + rqloop: + StrCpy $2 $0 1 $1 + StrCmp $2 '"' rqdone + StrCmp $2 "" rqdone + IntOp $1 $1 + 1 + Goto rqloop + rqdone: + StrCpy $0 $0 $1 + getparent: + ; the uninstall string goes to an EXE, let's get the directory. + StrCpy $1 -1 + gploop: + StrCpy $2 $0 1 $1 + StrCmp $2 "" gpexit + StrCmp $2 "\" gpexit + IntOp $1 $1 - 1 + Goto gploop + gpexit: + StrCpy $0 $0 $1 + + StrCmp $0 "" fin + IfFileExists $0\winamp.exe fin + StrCpy $0 "" + fin: + Pop $2 + Pop $1 + Exch $0 + +FunctionEnd + +Function MakeSureIGotWinamp + + Call GetWinampInstPath + + Pop $0 + StrCmp $0 "" getwinamp + Return + + getwinamp: + + Call ConnectInternet ;Make an internet connection (if no connection available) + + StrCpy $2 "$TEMP\Winamp Installer.exe" + NSISdl::download http://download.nullsoft.com/winamp/client/winamp281_lite.exe $2 + Pop $0 + StrCmp $0 success success + SetDetailsView show + DetailPrint "download failed: $0" + Abort + success: + ExecWait '"$2" /S' + Delete $2 + Call GetWinampInstPath + Pop $0 + StrCmp $0 "" skip + StrCpy $INSTDIR $0 + skip: + +FunctionEnd + +Function ConnectInternet + + Push $R0 + + ClearErrors + Dialer::AttemptConnect + IfErrors noie3 + + Pop $R0 + StrCmp $R0 "online" connected + MessageBox MB_OK|MB_ICONSTOP "Cannot connect to the internet." + Quit + + noie3: + + ; IE3 not installed + MessageBox MB_OK|MB_ICONINFORMATION "Please connect to the internet now." + + connected: + + Pop $R0 + +FunctionEnd + +!endif ; WINAMP_AUTOINSTALL \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/Colors.nsh b/libs/NSIS/NSIS-source/Include/Colors.nsh new file mode 100644 index 0000000000..64ca3a1e33 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Colors.nsh @@ -0,0 +1,75 @@ +!ifndef COLORS_NSH +!define COLORS_NSH + +!verbose push +!verbose 3 + +# Squad +# Rob Segal +# Joel +# Yathosho + + +# Predefined HTML Hex colors +!define WHITE "FFFFFF" +!define BLACK "000000" +!define YELLOW "FFFF00" +!define RED "FF0000" +!define GREEN "00FF00" +!define BLUE "0000FF" +!define MAGENTA "FF00FF" +!define CYAN "00FFFF" + +# Function to convert red , green and blue integer values to HTML Hex format +!define RGB '!insertmacro rgb2hex' + +# Function to convert red, green and blue integer values to Hexadecimal (0xRRGGBB) format +!define HEX '!insertmacro rgb2hex2' + +# Function to get the r value from a RGB number +!define GetRvalue '!insertmacro redvalue' + +# Function to get the g value from a RGB number +!define GetGvalue '!insertmacro greenvalue' + +# Function to get the b value from a RGB number +!define GetBvalue '!insertmacro bluevalue' + +# Function to get the r value from a Hex number +!define GetRvalueX '!insertmacro bluevalue' + +# Function to get the g value from a Hex number +!define GetGvalueX '!insertmacro greenvalue' + +# Function to get the r value from a HEX number +!define GetBvalueX '!insertmacro redvalue' + +!macro rgb2hex output R G B +IntFmt "${output}" "%02X" "${R}" +IntFmt "${output}" "${output}%02X" "${G}" +IntFmt "${output}" "${output}%02X" "${B}" +!macroend + +!macro rgb2hex2 output R G B +IntFmt "${output}" "%02X" "${B}" +IntFmt "${output}" "${output}%02X" "${G}" +IntFmt "${output}" "${output}%02X" "${R}" +!macroend + +!macro redvalue output hexval +StrCpy ${output} ${hexval} 2 0 +IntFmt "${output}" "%02i" "0x${output}" +!macroend + +!macro greenvalue output hexval +StrCpy ${output} ${hexval} 2 2 +IntFmt "${output}" "%02i" "0x${output}" +!macroend + +!macro bluevalue output hexval +StrCpy ${output} ${hexval} 2 4 +IntFmt "${output}" "%02i" "0x${output}" +!macroend + +!verbose pop +!endif \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/FileFunc.nsh b/libs/NSIS/NSIS-source/Include/FileFunc.nsh new file mode 100644 index 0000000000..f993da4ead --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/FileFunc.nsh @@ -0,0 +1,2012 @@ +/* +_____________________________________________________________________________ + + File Functions Header v3.4 +_____________________________________________________________________________ + + 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + + See documentation for more information about the following functions. + + Usage in script: + 1. !include "FileFunc.nsh" + 2. [Section|Function] + ${FileFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + + FileFunction=[Locate|GetSize|DriveSpace|GetDrives|GetTime|GetFileAttributes| + GetFileVersion|GetExeName|GetExePath|GetParameters|GetOptions| + GetOptionsS|GetRoot|GetParent|GetFileName|GetBaseName|GetFileExt| + BannerTrimPath|DirState|RefreshShellIcons] + +_____________________________________________________________________________ + + Thanks to: +_____________________________________________________________________________ + +GetSize + KiCHiK (Function "FindFiles") +DriveSpace + sunjammer (Function "CheckSpaceFree") +GetDrives + deguix (Based on his idea of Function "DetectDrives") +GetTime + Takhir (Script "StatTest") and deguix (Function "FileModifiedDate") +GetFileVersion + KiCHiK (Based on his example for command "GetDLLVersion") +GetParameters + sunjammer (Based on his Function "GetParameters") +GetRoot + KiCHiK (Based on his Function "GetRoot") +GetParent + sunjammer (Based on his Function "GetParent") +GetFileName + KiCHiK (Based on his Function "GetFileName") +GetBaseName + comperio (Based on his idea of Function "GetBaseName") +GetFileExt + opher (author) +RefreshShellIcons + jerome tremblay (author) +*/ + + +;_____________________________________________________________________________ +; +; Macros +;_____________________________________________________________________________ +; +; Change log window verbosity (default: 3=no script) +; +; Example: +; !include "FileFunc.nsh" +; !insertmacro Locate +; ${FILEFUNC_VERBOSE} 4 # all verbosity +; !insertmacro VersionCompare +; ${FILEFUNC_VERBOSE} 3 # no script + +!ifndef FILEFUNC_INCLUDED + +!verbose push 3 +!define /IfNDef _FILEFUNC_VERBOSE 3 +!verbose ${_FILEFUNC_VERBOSE} +!define FILEFUNC_VERBOSE `!insertmacro FILEFUNC_VERBOSE` + +!define FILEFUNC_INCLUDED + +!include Util.nsh + + +!macro FILEFUNC_VERBOSE _VERBOSE + !verbose push 3 + !define /ReDef _FILEFUNC_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + +!macro LocateCall _PATH _OPTIONS _FUNC + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push $0 + Push `${_PATH}` + Push `${_OPTIONS}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} Locate_ + Pop $0 + !verbose pop +!macroend + +!macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3 + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATH}` + Push `${_OPTIONS}` + ${CallArtificialFunction} GetSize_ + Pop ${_RESULT1} + Pop ${_RESULT2} + Pop ${_RESULT3} + !verbose pop +!macroend + +!macro DriveSpaceCall _DRIVE _OPTIONS _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_DRIVE}` + Push `${_OPTIONS}` + ${CallArtificialFunction} DriveSpace_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetDrivesCall _DRV _FUNC + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push $0 + Push `${_DRV}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} GetDrives_ + Pop $0 + !verbose pop +!macroend + +!macro GetTimeCall _FILE _OPTION _RESULT1 _RESULT2 _RESULT3 _RESULT4 _RESULT5 _RESULT6 _RESULT7 + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_FILE}` + Push `${_OPTION}` + ${CallArtificialFunction} GetTime_ + Pop ${_RESULT1} + Pop ${_RESULT2} + Pop ${_RESULT3} + Pop ${_RESULT4} + Pop ${_RESULT5} + Pop ${_RESULT6} + Pop ${_RESULT7} + !verbose pop +!macroend + +!macro GetFileAttributesCall _PATH _ATTR _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATH}` + Push `${_ATTR}` + ${CallArtificialFunction} GetFileAttributes_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetFileVersionCall _FILE _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_FILE}` + ${CallArtificialFunction} GetFileVersion_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetExeNameCall _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + ${CallArtificialFunction} GetExeName_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetExePathCall _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + ${CallArtificialFunction} GetExePath_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetParametersCall _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + ${CallArtificialFunction} GetParameters_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetOptionsCall _PARAMETERS _OPTION _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PARAMETERS}` + Push `${_OPTION}` + ${CallArtificialFunction} GetOptions_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetOptionsSCall _PARAMETERS _OPTION _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PARAMETERS}` + Push `${_OPTION}` + ${CallArtificialFunction} GetOptionsS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetRootCall _FULLPATH _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_FULLPATH}` + ${CallArtificialFunction} GetRoot_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetParentCall _PATHSTRING _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATHSTRING}` + ${CallArtificialFunction} GetParent_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetFileNameCall _PATHSTRING _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATHSTRING}` + ${CallArtificialFunction} GetFileName_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetBaseNameCall _FILESTRING _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_FILESTRING}` + ${CallArtificialFunction} GetBaseName_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro GetFileExtCall _FILESTRING _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_FILESTRING}` + ${CallArtificialFunction} GetFileExt_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro BannerTrimPathCall _PATH _LENGHT _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATH}` + Push `${_LENGHT}` + ${CallArtificialFunction} BannerTrimPath_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro DirStateCall _PATH _RESULT + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + Push `${_PATH}` + ${CallArtificialFunction} DirState_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro RefreshShellIconsCall + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + ${CallArtificialFunction} RefreshShellIcons_ + !verbose pop +!macroend + +!define Locate `!insertmacro LocateCall` +!define un.Locate `!insertmacro LocateCall` + +!macro Locate +!macroend + +!macro un.Locate +!macroend + +!macro Locate_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R6 + Push $R7 + Push $R8 + Push $R9 + ClearErrors + + StrCpy $3 '' + StrCpy $4 '' + StrCpy $5 '' + StrCpy $6 '' + StrCpy $7 '' + StrCpy $8 0 + StrCpy $R7 '' + + StrCpy $R9 $0 1 -1 + StrCmp $R9 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + IfFileExists '$0\*.*' 0 FileFunc_Locate_error + + FileFunc_Locate_option: + StrCpy $R9 $1 1 + StrCpy $1 $1 '' 1 + StrCmp $R9 ' ' -2 + StrCmp $R9 '' FileFunc_Locate_sizeset + StrCmp $R9 '/' 0 -4 + StrCpy $9 -1 + IntOp $9 $9 + 1 + StrCpy $R9 $1 1 $9 + StrCmp $R9 '' +2 + StrCmp $R9 '/' 0 -3 + StrCpy $R8 $1 $9 + StrCpy $R8 $R8 '' 2 + StrCpy $R9 $R8 '' -1 + StrCmp $R9 ' ' 0 +3 + StrCpy $R8 $R8 -1 + goto -3 + StrCpy $R9 $1 2 + StrCpy $1 $1 '' $9 + + StrCmp $R9 'L=' 0 FileFunc_Locate_mask + StrCpy $3 $R8 + StrCmp $3 '' +6 + StrCmp $3 'FD' +5 + StrCmp $3 'F' +4 + StrCmp $3 'D' +3 + StrCmp $3 'DE' +2 + StrCmp $3 'FDE' 0 FileFunc_Locate_error + goto FileFunc_Locate_option + + FileFunc_Locate_mask: + StrCmp $R9 'M=' 0 FileFunc_Locate_size + StrCpy $4 $R8 + goto FileFunc_Locate_option + + FileFunc_Locate_size: + StrCmp $R9 'S=' 0 FileFunc_Locate_gotosubdir + StrCpy $6 $R8 + goto FileFunc_Locate_option + + FileFunc_Locate_gotosubdir: + StrCmp $R9 'G=' 0 FileFunc_Locate_banner + StrCpy $7 $R8 + StrCmp $7 '' +3 + StrCmp $7 '1' +2 + StrCmp $7 '0' 0 FileFunc_Locate_error + goto FileFunc_Locate_option + + FileFunc_Locate_banner: + StrCmp $R9 'B=' 0 FileFunc_Locate_error + StrCpy $R7 $R8 + StrCmp $R7 '' +3 + StrCmp $R7 '1' +2 + StrCmp $R7 '0' 0 FileFunc_Locate_error + goto FileFunc_Locate_option + + FileFunc_Locate_sizeset: + StrCmp $6 '' FileFunc_Locate_default + StrCpy $9 0 + StrCpy $R9 $6 1 $9 + StrCmp $R9 '' +4 + StrCmp $R9 ':' +3 + IntOp $9 $9 + 1 + goto -4 + StrCpy $5 $6 $9 + IntOp $9 $9 + 1 + StrCpy $1 $6 1 -1 + StrCpy $6 $6 -1 $9 + StrCmp $5 '' +2 + IntOp $5 $5 + 0 + StrCmp $6 '' +2 + IntOp $6 $6 + 0 + + StrCmp $1 'B' 0 +3 + StrCpy $1 1 + goto FileFunc_Locate_default + StrCmp $1 'K' 0 +3 + StrCpy $1 1024 + goto FileFunc_Locate_default + StrCmp $1 'M' 0 +3 + StrCpy $1 1048576 + goto FileFunc_Locate_default + StrCmp $1 'G' 0 FileFunc_Locate_error + StrCpy $1 1073741824 + + FileFunc_Locate_default: + StrCmp $3 '' 0 +2 + StrCpy $3 'FD' + StrCmp $4 '' 0 +2 + StrCpy $4 '*.*' + StrCmp $7 '' 0 +2 + StrCpy $7 '1' + StrCmp $R7 '' 0 +2 + StrCpy $R7 '0' + StrCpy $7 'G$7B$R7' + + StrCpy $8 1 + Push $0 + SetDetailsPrint textonly + + FileFunc_Locate_nextdir: + IntOp $8 $8 - 1 + Pop $R8 + + StrCpy $9 $7 2 2 + StrCmp $9 'B0' +3 + GetLabelAddress $9 FileFunc_Locate_findfirst + goto call + DetailPrint 'Search in: $R8' + + FileFunc_Locate_findfirst: + FindFirst $0 $R7 '$R8\$4' + IfErrors FileFunc_Locate_subdir + StrCmp $R7 '.' 0 FileFunc_Locate_dir + FindNext $0 $R7 + StrCmp $R7 '..' 0 FileFunc_Locate_dir + FindNext $0 $R7 + IfErrors 0 FileFunc_Locate_dir + FindClose $0 + goto FileFunc_Locate_subdir + + FileFunc_Locate_dir: + IfFileExists '$R8\$R7\*.*' 0 FileFunc_Locate_file + StrCpy $R6 '' + StrCmp $3 'DE' +4 + StrCmp $3 'FDE' +3 + StrCmp $3 'FD' FileFunc_Locate_precall + StrCmp $3 'F' FileFunc_Locate_findnext FileFunc_Locate_precall + FindFirst $9 $R9 '$R8\$R7\*.*' + StrCmp $R9 '.' 0 +4 + FindNext $9 $R9 + StrCmp $R9 '..' 0 +2 + FindNext $9 $R9 + FindClose $9 + IfErrors FileFunc_Locate_precall FileFunc_Locate_findnext + + FileFunc_Locate_file: + StrCmp $3 'FDE' +3 + StrCmp $3 'FD' +2 + StrCmp $3 'F' 0 FileFunc_Locate_findnext + StrCpy $R6 0 + StrCmp $5$6 '' FileFunc_Locate_precall + FileOpen $9 '$R8\$R7' r + IfErrors +3 + FileSeek $9 0 END $R6 + FileClose $9 + System::Int64Op $R6 / $1 + Pop $R6 + StrCmp $5 '' +2 + IntCmp $R6 $5 0 FileFunc_Locate_findnext + StrCmp $6 '' +2 + IntCmp $R6 $6 0 0 FileFunc_Locate_findnext + + FileFunc_Locate_precall: + StrCpy $9 0 + StrCpy $R9 '$R8\$R7' + + call: + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R7 + Push $R8 + StrCmp $9 0 +4 + StrCpy $R6 '' + StrCpy $R7 '' + StrCpy $R9 '' + Call $2 + Pop $R9 + Pop $R8 + Pop $R7 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + IfErrors 0 +3 + FindClose $0 + goto FileFunc_Locate_error + StrCmp $R9 'StopLocate' 0 +3 + FindClose $0 + goto FileFunc_Locate_clearstack + goto $9 + + FileFunc_Locate_findnext: + FindNext $0 $R7 + IfErrors 0 FileFunc_Locate_dir + FindClose $0 + + FileFunc_Locate_subdir: + StrCpy $9 $7 2 + StrCmp $9 'G0' FileFunc_Locate_end + FindFirst $0 $R7 '$R8\*.*' + StrCmp $R7 '.' 0 FileFunc_Locate_pushdir + FindNext $0 $R7 + StrCmp $R7 '..' 0 FileFunc_Locate_pushdir + FindNext $0 $R7 + IfErrors 0 FileFunc_Locate_pushdir + FindClose $0 + StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir + + FileFunc_Locate_pushdir: + IfFileExists '$R8\$R7\*.*' 0 +3 + Push '$R8\$R7' + IntOp $8 $8 + 1 + FindNext $0 $R7 + IfErrors 0 FileFunc_Locate_pushdir + FindClose $0 + StrCmp $8 0 FileFunc_Locate_end FileFunc_Locate_nextdir + + FileFunc_Locate_error: + SetErrors + + FileFunc_Locate_clearstack: + StrCmp $8 0 FileFunc_Locate_end + IntOp $8 $8 - 1 + Pop $R8 + goto FileFunc_Locate_clearstack + + FileFunc_Locate_end: + SetDetailsPrint both + Pop $R9 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!define GetSize `!insertmacro GetSizeCall` +!define un.GetSize `!insertmacro GetSizeCall` + +!macro GetSize +!macroend + +!macro un.GetSize +!macroend + +!macro GetSize_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + Push $R9 + ClearErrors + + StrCpy $R9 $0 1 -1 + StrCmp $R9 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + IfFileExists '$0\*.*' 0 FileFunc_GetSize_error + + StrCpy $3 '' + StrCpy $4 '' + StrCpy $5 '' + StrCpy $6 '' + StrCpy $8 0 + StrCpy $R3 '' + StrCpy $R4 '' + StrCpy $R5 '' + + FileFunc_GetSize_option: + StrCpy $R9 $1 1 + StrCpy $1 $1 '' 1 + StrCmp $R9 ' ' -2 + StrCmp $R9 '' FileFunc_GetSize_sizeset + StrCmp $R9 '/' 0 -4 + + StrCpy $9 -1 + IntOp $9 $9 + 1 + StrCpy $R9 $1 1 $9 + StrCmp $R9 '' +2 + StrCmp $R9 '/' 0 -3 + StrCpy $8 $1 $9 + StrCpy $8 $8 '' 2 + StrCpy $R9 $8 '' -1 + StrCmp $R9 ' ' 0 +3 + StrCpy $8 $8 -1 + goto -3 + StrCpy $R9 $1 2 + StrCpy $1 $1 '' $9 + + StrCmp $R9 'M=' 0 FileFunc_GetSize_size + StrCpy $4 $8 + goto FileFunc_GetSize_option + + FileFunc_GetSize_size: + StrCmp $R9 'S=' 0 FileFunc_GetSize_gotosubdir + StrCpy $6 $8 + goto FileFunc_GetSize_option + + FileFunc_GetSize_gotosubdir: + StrCmp $R9 'G=' 0 FileFunc_GetSize_error + StrCpy $7 $8 + StrCmp $7 '' +3 + StrCmp $7 '1' +2 + StrCmp $7 '0' 0 FileFunc_GetSize_error + goto FileFunc_GetSize_option + + FileFunc_GetSize_sizeset: + StrCmp $6 '' FileFunc_GetSize_default + StrCpy $9 0 + StrCpy $R9 $6 1 $9 + StrCmp $R9 '' +4 + StrCmp $R9 ':' +3 + IntOp $9 $9 + 1 + goto -4 + StrCpy $5 $6 $9 + IntOp $9 $9 + 1 + StrCpy $1 $6 1 -1 + StrCpy $6 $6 -1 $9 + StrCmp $5 '' +2 + IntOp $5 $5 + 0 + StrCmp $6 '' +2 + IntOp $6 $6 + 0 + + StrCmp $1 'B' 0 +4 + StrCpy $1 1 + StrCpy $2 bytes + goto FileFunc_GetSize_default + StrCmp $1 'K' 0 +4 + StrCpy $1 1024 + StrCpy $2 Kb + goto FileFunc_GetSize_default + StrCmp $1 'M' 0 +4 + StrCpy $1 1048576 + StrCpy $2 Mb + goto FileFunc_GetSize_default + StrCmp $1 'G' 0 FileFunc_GetSize_error + StrCpy $1 1073741824 + StrCpy $2 Gb + + FileFunc_GetSize_default: + StrCmp $4 '' 0 +2 + StrCpy $4 '*.*' + StrCmp $7 '' 0 +2 + StrCpy $7 '1' + + StrCpy $8 1 + Push $0 + SetDetailsPrint textonly + + FileFunc_GetSize_nextdir: + IntOp $8 $8 - 1 + Pop $R8 + FindFirst $0 $R7 '$R8\$4' + IfErrors FileFunc_GetSize_show + StrCmp $R7 '.' 0 FileFunc_GetSize_dir + FindNext $0 $R7 + StrCmp $R7 '..' 0 FileFunc_GetSize_dir + FindNext $0 $R7 + IfErrors 0 FileFunc_GetSize_dir + FindClose $0 + goto FileFunc_GetSize_show + + FileFunc_GetSize_dir: + IfFileExists '$R8\$R7\*.*' 0 FileFunc_GetSize_file + IntOp $R5 $R5 + 1 + goto FileFunc_GetSize_findnext + + FileFunc_GetSize_file: + StrCpy $R6 0 + StrCmp $5$6 '' 0 +3 + IntOp $R4 $R4 + 1 + goto FileFunc_GetSize_findnext + FileOpen $9 '$R8\$R7' r + IfErrors +3 + FileSeek $9 0 END $R6 + FileClose $9 + StrCmp $5 '' +2 + IntCmp $R6 $5 0 FileFunc_GetSize_findnext + StrCmp $6 '' +2 + IntCmp $R6 $6 0 0 FileFunc_GetSize_findnext + IntOp $R4 $R4 + 1 + System::Int64Op $R3 + $R6 + Pop $R3 + + FileFunc_GetSize_findnext: + FindNext $0 $R7 + IfErrors 0 FileFunc_GetSize_dir + FindClose $0 + + FileFunc_GetSize_show: + StrCmp $5$6 '' FileFunc_GetSize_nosize + System::Int64Op $R3 / $1 + Pop $9 + DetailPrint 'Size:$9 $2 Files:$R4 Folders:$R5' + goto FileFunc_GetSize_subdir + FileFunc_GetSize_nosize: + DetailPrint 'Files:$R4 Folders:$R5' + + FileFunc_GetSize_subdir: + StrCmp $7 0 FileFunc_GetSize_preend + FindFirst $0 $R7 '$R8\*.*' + StrCmp $R7 '.' 0 FileFunc_GetSize_pushdir + FindNext $0 $R7 + StrCmp $R7 '..' 0 FileFunc_GetSize_pushdir + FindNext $0 $R7 + IfErrors 0 FileFunc_GetSize_pushdir + FindClose $0 + StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir + + FileFunc_GetSize_pushdir: + IfFileExists '$R8\$R7\*.*' 0 +3 + Push '$R8\$R7' + IntOp $8 $8 + 1 + FindNext $0 $R7 + IfErrors 0 FileFunc_GetSize_pushdir + FindClose $0 + StrCmp $8 0 FileFunc_GetSize_preend FileFunc_GetSize_nextdir + + FileFunc_GetSize_preend: + StrCmp $R3 '' FileFunc_GetSize_nosizeend + System::Int64Op $R3 / $1 + Pop $R3 + FileFunc_GetSize_nosizeend: + StrCpy $2 $R4 + StrCpy $1 $R5 + StrCpy $0 $R3 + goto FileFunc_GetSize_end + + FileFunc_GetSize_error: + SetErrors + StrCpy $0 '' + StrCpy $1 '' + StrCpy $2 '' + + FileFunc_GetSize_end: + SetDetailsPrint both + Pop $R9 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Exch $2 + Exch + Exch $1 + Exch 2 + Exch $0 + + !verbose pop +!macroend + +!define DriveSpace `!insertmacro DriveSpaceCall` +!define un.DriveSpace `!insertmacro DriveSpaceCall` + +!macro DriveSpace +!macroend + +!macro un.DriveSpace +!macroend + +!macro DriveSpace_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + ClearErrors + + StrCpy $2 $0 1 -1 + StrCmp $2 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + IfFileExists '$0\NUL' 0 FileFunc_DriveSpace_error + + StrCpy $5 '' + StrCpy $6 '' + + FileFunc_DriveSpace_option: + StrCpy $2 $1 1 + StrCpy $1 $1 '' 1 + StrCmp $2 ' ' -2 + StrCmp $2 '' FileFunc_DriveSpace_default + StrCmp $2 '/' 0 -4 + StrCpy $3 -1 + IntOp $3 $3 + 1 + StrCpy $2 $1 1 $3 + StrCmp $2 '' +2 + StrCmp $2 '/' 0 -3 + StrCpy $4 $1 $3 + StrCpy $4 $4 '' 2 + StrCpy $2 $4 1 -1 + StrCmp $2 ' ' 0 +3 + StrCpy $4 $4 -1 + goto -3 + StrCpy $2 $1 2 + StrCpy $1 $1 '' $3 + + StrCmp $2 'D=' 0 FileFunc_DriveSpace_unit + StrCpy $5 $4 + StrCmp $5 '' +4 + StrCmp $5 'T' +3 + StrCmp $5 'O' +2 + StrCmp $5 'F' 0 FileFunc_DriveSpace_error + goto FileFunc_DriveSpace_option + + FileFunc_DriveSpace_unit: + StrCmp $2 'S=' 0 FileFunc_DriveSpace_error + StrCpy $6 $4 + goto FileFunc_DriveSpace_option + + FileFunc_DriveSpace_default: + StrCmp $5 '' 0 +2 + StrCpy $5 'T' + StrCmp $6 '' 0 +3 + StrCpy $6 '1' + goto FileFunc_DriveSpace_getspace + + StrCmp $6 'B' 0 +3 + StrCpy $6 1 + goto FileFunc_DriveSpace_getspace + StrCmp $6 'K' 0 +3 + StrCpy $6 1024 + goto FileFunc_DriveSpace_getspace + StrCmp $6 'M' 0 +3 + StrCpy $6 1048576 + goto FileFunc_DriveSpace_getspace + StrCmp $6 'G' 0 FileFunc_DriveSpace_error + StrCpy $6 1073741824 + + FileFunc_DriveSpace_getspace: + System::Call 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l)i(r0,.r2,.r3,.)' + + StrCmp $5 T 0 +3 + StrCpy $0 $3 + goto FileFunc_DriveSpace_getsize + StrCmp $5 O 0 +4 + System::Int64Op $3 - $2 + Pop $0 + goto FileFunc_DriveSpace_getsize + StrCmp $5 F 0 +2 + StrCpy $0 $2 + + FileFunc_DriveSpace_getsize: + System::Int64Op $0 / $6 + Pop $0 + goto FileFunc_DriveSpace_end + + FileFunc_DriveSpace_error: + SetErrors + StrCpy $0 '' + + FileFunc_DriveSpace_end: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetDrives `!insertmacro GetDrivesCall` +!define un.GetDrives `!insertmacro GetDrivesCall` + +!macro GetDrives +!macroend + +!macro un.GetDrives +!macroend + +!macro GetDrives_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $8 + Push $9 + + System::StrAlloc 1024 + Pop $2 + System::Call 'kernel32::GetLogicalDriveStrings(i,i) i(1024, r2)' + + StrCmp $0 ALL FileFunc_GetDrives_drivestring + StrCmp $0 '' 0 FileFunc_GetDrives_typeset + StrCpy $0 ALL + goto FileFunc_GetDrives_drivestring + + FileFunc_GetDrives_typeset: + StrCpy $6 -1 + IntOp $6 $6 + 1 + StrCpy $8 $0 1 $6 + StrCmp $8$0 '' FileFunc_GetDrives_enumex + StrCmp $8 '' +2 + StrCmp $8 '+' 0 -4 + StrCpy $8 $0 $6 + IntOp $6 $6 + 1 + StrCpy $0 $0 '' $6 + + StrCmp $8 'FDD' 0 +3 + StrCpy $6 2 + goto FileFunc_GetDrives_drivestring + StrCmp $8 'HDD' 0 +3 + StrCpy $6 3 + goto FileFunc_GetDrives_drivestring + StrCmp $8 'NET' 0 +3 + StrCpy $6 4 + goto FileFunc_GetDrives_drivestring + StrCmp $8 'CDROM' 0 +3 + StrCpy $6 5 + goto FileFunc_GetDrives_drivestring + StrCmp $8 'RAM' 0 FileFunc_GetDrives_typeset + StrCpy $6 6 + + FileFunc_GetDrives_drivestring: + StrCpy $3 $2 + + FileFunc_GetDrives_enumok: + System::Call 'kernel32::lstrlen(t) i(i r3) .r4' + StrCmp $4$0 '0ALL' FileFunc_GetDrives_enumex + StrCmp $4 0 FileFunc_GetDrives_typeset + System::Call 'kernel32::GetDriveType(t) i(i r3) .r5' + + StrCmp $0 ALL +2 + StrCmp $5 $6 FileFunc_GetDrives_letter FileFunc_GetDrives_enumnext + StrCmp $5 2 0 +3 + StrCpy $8 FDD + goto FileFunc_GetDrives_letter + StrCmp $5 3 0 +3 + StrCpy $8 HDD + goto FileFunc_GetDrives_letter + StrCmp $5 4 0 +3 + StrCpy $8 NET + goto FileFunc_GetDrives_letter + StrCmp $5 5 0 +3 + StrCpy $8 CDROM + goto FileFunc_GetDrives_letter + StrCmp $5 6 0 FileFunc_GetDrives_enumex + StrCpy $8 RAM + + FileFunc_GetDrives_letter: + System::Call '*$3(&t1024 .r9)' + + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $8 + Call $1 + Pop $9 + Pop $8 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + StrCmp $9 'StopGetDrives' FileFunc_GetDrives_enumex + + FileFunc_GetDrives_enumnext: + IntOp $4 $4 * ${NSIS_CHAR_SIZE} + IntOp $3 $3 + $4 + IntOp $3 $3 + ${NSIS_CHAR_SIZE} + goto FileFunc_GetDrives_enumok + + FileFunc_GetDrives_enumex: + System::Free $2 + + Pop $9 + Pop $8 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!define GetTime `!insertmacro GetTimeCall` +!define un.GetTime `!insertmacro GetTimeCall` + +!macro GetTime +!macroend + +!macro un.GetTime +!macroend + +!macro GetTime_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + ClearErrors + + StrCmp $1 'L' FileFunc_GetTime_gettime + StrCmp $1 'A' FileFunc_GetTime_getfile + StrCmp $1 'C' FileFunc_GetTime_getfile + StrCmp $1 'M' FileFunc_GetTime_getfile + StrCmp $1 'LS' FileFunc_GetTime_gettime + StrCmp $1 'AS' FileFunc_GetTime_getfile + StrCmp $1 'CS' FileFunc_GetTime_getfile + StrCmp $1 'MS' FileFunc_GetTime_getfile + goto FileFunc_GetTime_error + + FileFunc_GetTime_getfile: + IfFileExists $0 0 FileFunc_GetTime_error + System::Call '*(i,l,l,l,i,i,i,i,&t260,&t14) p .r6' + System::Call 'kernel32::FindFirstFile(t,p)p(r0,r6) .r2' + System::Call 'kernel32::FindClose(i)i(r2)' + + FileFunc_GetTime_gettime: + System::Call '*(&i2,&i2,&i2,&i2,&i2,&i2,&i2,&i2) p .r7' + StrCmp $1 'L' 0 FileFunc_GetTime_systemtime + System::Call 'kernel32::GetLocalTime(p)i(r7)' + goto FileFunc_GetTime_convert + FileFunc_GetTime_systemtime: + StrCmp $1 'LS' 0 FileFunc_GetTime_filetime + System::Call 'kernel32::GetSystemTime(p)i(r7)' + goto FileFunc_GetTime_convert + + FileFunc_GetTime_filetime: + System::Call '*$6(i,l,l,l,i,i,i,i,&t260,&t14)p(,.r4,.r3,.r2)' + System::Free $6 + StrCmp $1 'A' 0 +3 + StrCpy $2 $3 + goto FileFunc_GetTime_tolocal + StrCmp $1 'C' 0 +3 + StrCpy $2 $4 + goto FileFunc_GetTime_tolocal + StrCmp $1 'M' FileFunc_GetTime_tolocal + + StrCmp $1 'AS' FileFunc_GetTime_tosystem + StrCmp $1 'CS' 0 +3 + StrCpy $3 $4 + goto FileFunc_GetTime_tosystem + StrCmp $1 'MS' 0 +3 + StrCpy $3 $2 + goto FileFunc_GetTime_tosystem + + FileFunc_GetTime_tolocal: + System::Call 'kernel32::FileTimeToLocalFileTime(*l,*l)i(r2,.r3)' + FileFunc_GetTime_tosystem: + System::Call 'kernel32::FileTimeToSystemTime(*l,i)i(r3,r7)' + + FileFunc_GetTime_convert: + System::Call '*$7(&i2.r5,&i2.r6,&i2.r4,&i2.r0,&i2.r3,&i2.r2,&i2.r1,&i2)' + System::Free $7 + + IntFmt $6 "%.2u" $6 ; Month + IntFmt $0 "%.2u" $0 ; Day + IntFmt $3 "%.2u" $3 ; Hour + IntFmt $2 "%.2u" $2 ; Minute + IntFmt $1 "%.2u" $1 ; Second + + StrCmp $4 0 0 +3 + StrCpy $4 Sunday + goto FileFunc_GetTime_end + StrCmp $4 1 0 +3 + StrCpy $4 Monday + goto FileFunc_GetTime_end + StrCmp $4 2 0 +3 + StrCpy $4 Tuesday + goto FileFunc_GetTime_end + StrCmp $4 3 0 +3 + StrCpy $4 Wednesday + goto FileFunc_GetTime_end + StrCmp $4 4 0 +3 + StrCpy $4 Thursday + goto FileFunc_GetTime_end + StrCmp $4 5 0 +3 + StrCpy $4 Friday + goto FileFunc_GetTime_end + StrCmp $4 6 0 FileFunc_GetTime_error + StrCpy $4 Saturday + goto FileFunc_GetTime_end + + FileFunc_GetTime_error: + SetErrors + StrCpy $0 '' + StrCpy $1 '' + StrCpy $2 '' + StrCpy $3 '' + StrCpy $4 '' + StrCpy $5 '' + StrCpy $6 '' + + FileFunc_GetTime_end: + Pop $7 + Exch $6 + Exch + Exch $5 + Exch 2 + Exch $4 + Exch 3 + Exch $3 + Exch 4 + Exch $2 + Exch 5 + Exch $1 + Exch 6 + Exch $0 + + !verbose pop +!macroend + +!define GetFileAttributes `!insertmacro GetFileAttributesCall` +!define un.GetFileAttributes `!insertmacro GetFileAttributesCall` + +!macro GetFileAttributes +!macroend + +!macro un.GetFileAttributes +!macroend + +!macro GetFileAttributes_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + + System::Call 'kernel32::GetFileAttributes(t r0)i .r2' + StrCmp $2 -1 FileFunc_GetFileAttributes_error + StrCpy $3 '' + + IntOp $0 $2 & 0x4000 + IntCmp $0 0 +2 + StrCpy $3 'ENCRYPTED|' + + IntOp $0 $2 & 0x2000 + IntCmp $0 0 +2 + StrCpy $3 'NOT_CONTENT_INDEXED|$3' + + IntOp $0 $2 & 0x1000 + IntCmp $0 0 +2 + StrCpy $3 'OFFLINE|$3' + + IntOp $0 $2 & 0x0800 + IntCmp $0 0 +2 + StrCpy $3 'COMPRESSED|$3' + + IntOp $0 $2 & 0x0400 + IntCmp $0 0 +2 + StrCpy $3 'REPARSE_POINT|$3' + + IntOp $0 $2 & 0x0200 + IntCmp $0 0 +2 + StrCpy $3 'SPARSE_FILE|$3' + + IntOp $0 $2 & 0x0100 + IntCmp $0 0 +2 + StrCpy $3 'TEMPORARY|$3' + + IntOp $0 $2 & 0x0080 + IntCmp $0 0 +2 + StrCpy $3 'NORMAL|$3' + + IntOp $0 $2 & 0x0040 + IntCmp $0 0 +2 + StrCpy $3 'DEVICE|$3' + + IntOp $0 $2 & 0x0020 + IntCmp $0 0 +2 + StrCpy $3 'ARCHIVE|$3' + + IntOp $0 $2 & 0x0010 + IntCmp $0 0 +2 + StrCpy $3 'DIRECTORY|$3' + + IntOp $0 $2 & 0x0004 + IntCmp $0 0 +2 + StrCpy $3 'SYSTEM|$3' + + IntOp $0 $2 & 0x0002 + IntCmp $0 0 +2 + StrCpy $3 'HIDDEN|$3' + + IntOp $0 $2 & 0x0001 + IntCmp $0 0 +2 + StrCpy $3 'READONLY|$3' + + StrCpy $0 $3 -1 + StrCmp $1 '' FileFunc_GetFileAttributes_end + StrCmp $1 'ALL' FileFunc_GetFileAttributes_end + + FileFunc_GetFileAttributes_attrcmp: + StrCpy $5 0 + IntOp $5 $5 + 1 + StrCpy $4 $1 1 $5 + StrCmp $4 '' +2 + StrCmp $4 '|' 0 -3 + StrCpy $2 $1 $5 + IntOp $5 $5 + 1 + StrCpy $1 $1 '' $5 + StrLen $3 $2 + StrCpy $5 -1 + IntOp $5 $5 + 1 + StrCpy $4 $0 $3 $5 + StrCmp $4 '' FileFunc_GetFileAttributes_notfound + StrCmp $4 $2 0 -3 + StrCmp $1 '' 0 FileFunc_GetFileAttributes_attrcmp + StrCpy $0 1 + goto FileFunc_GetFileAttributes_end + + FileFunc_GetFileAttributes_notfound: + StrCpy $0 0 + goto FileFunc_GetFileAttributes_end + + FileFunc_GetFileAttributes_error: + SetErrors + StrCpy $0 '' + + FileFunc_GetFileAttributes_end: + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetFileVersion `!insertmacro GetFileVersionCall` +!define un.GetFileVersion `!insertmacro GetFileVersionCall` + +!macro GetFileVersion +!macroend + +!macro un.GetFileVersion +!macroend + +!macro GetFileVersion_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + ClearErrors + + GetDllVersion '$0' $1 $2 + IfErrors FileFunc_GetFileVersion_error + IntOp $3 $1 >> 16 + IntOp $3 $3 & 0x0000FFFF + IntOp $4 $1 & 0x0000FFFF + IntOp $5 $2 >> 16 + IntOp $5 $5 & 0x0000FFFF + IntOp $6 $2 & 0x0000FFFF + StrCpy $0 '$3.$4.$5.$6' + goto FileFunc_GetFileVersion_end + + FileFunc_GetFileVersion_error: + SetErrors + StrCpy $0 '' + + FileFunc_GetFileVersion_end: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetExeName `!insertmacro GetExeNameCall` +!define un.GetExeName `!insertmacro GetExeNameCall` + +!macro GetExeName +!macroend + +!macro un.GetExeName +!macroend + +!macro GetExeName_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Push $0 + Push $1 + Push $2 + System::Call 'kernel32::GetModuleFileName(p 0, t.r0, i ${NSIS_MAX_STRLEN})' + System::Call 'kernel32::GetLongPathName(t r0, t.r1, i ${NSIS_MAX_STRLEN})i.r2' + StrCmp $2 error +2 + StrCpy $0 $1 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetExePath `!insertmacro GetExePathCall` +!define un.GetExePath `!insertmacro GetExePathCall` + +!macro GetExePath +!macroend + +!macro un.GetExePath +!macroend + +!macro GetExePath_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Push $0 + Push $1 + Push $2 + StrCpy $0 $EXEDIR + System::Call 'kernel32::GetLongPathName(t r0, t.r1, i ${NSIS_MAX_STRLEN})i.r2' + StrCmp $2 error +2 + StrCpy $0 $1 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetParameters `!insertmacro GetParametersCall` +!define un.GetParameters `!insertmacro GetParametersCall` + +!macro GetParameters +!macroend + +!macro un.GetParameters +!macroend + +!macro GetParameters_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + ;cmdline-check + StrCmp $CMDLINE "" 0 +3 + Push "" + Return + + ;vars + Push $0 ;tmp + Push $1 ;length + Push $2 ;parameter offset + Push $3 ;separator + + ;length/offset + StrLen $1 $CMDLINE + StrCpy $2 2 ;start with third character + + ;separator + StrCpy $3 $CMDLINE 1 ;first character + StrCmp $3 '"' +2 + StrCpy $3 ' ' + + FileFunc_GetParameters_token: ;finding second separator + IntCmp $2 $1 FileFunc_GetParameters_strip 0 FileFunc_GetParameters_strip + StrCpy $0 $CMDLINE 1 $2 + IntOp $2 $2 + 1 + StrCmp $3 $0 0 FileFunc_GetParameters_token + + FileFunc_GetParameters_strip: ;strip white space + IntCmp $2 $1 FileFunc_GetParameters_copy 0 FileFunc_GetParameters_copy + StrCpy $0 $CMDLINE 1 $2 + StrCmp $0 ' ' 0 FileFunc_GetParameters_copy + IntOp $2 $2 + 1 + Goto FileFunc_GetParameters_strip + + FileFunc_GetParameters_copy: + StrCpy $0 $CMDLINE "" $2 + + ;strip white spaces from end + FileFunc_GetParameters_rstrip: + StrCpy $1 $0 1 -1 + StrCmp $1 ' ' 0 FileFunc_GetParameters_done + StrCpy $0 $0 -1 + Goto FileFunc_GetParameters_rstrip + + FileFunc_GetParameters_done: + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!macro GetOptionsBody _FILEFUNC_S + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + ClearErrors + + StrCpy $2 $1 '' 1 + StrCpy $1 $1 1 + StrLen $3 $2 + StrCpy $7 0 + + FileFunc_GetOptions${_FILEFUNC_S}_begin: + StrCpy $4 -1 + StrCpy $6 '' + + FileFunc_GetOptions${_FILEFUNC_S}_quote: + IntOp $4 $4 + 1 + StrCpy $5 $0 1 $4 + StrCmp${_FILEFUNC_S} $5$7 '0' FileFunc_GetOptions${_FILEFUNC_S}_notfound + StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_trimright + StrCmp${_FILEFUNC_S} $5 '"' 0 +7 + StrCmp${_FILEFUNC_S} $6 '' 0 +3 + StrCpy $6 '"' + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 '"' 0 +3 + StrCpy $6 '' + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $5 `'` 0 +7 + StrCmp${_FILEFUNC_S} $6 `` 0 +3 + StrCpy $6 `'` + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 `'` 0 +3 + StrCpy $6 `` + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $5 '`' 0 +7 + StrCmp${_FILEFUNC_S} $6 '' 0 +3 + StrCpy $6 '`' + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 '`' 0 +3 + StrCpy $6 '' + goto FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 '"' FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 `'` FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $6 '`' FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $5 $1 0 FileFunc_GetOptions${_FILEFUNC_S}_quote + StrCmp${_FILEFUNC_S} $7 0 FileFunc_GetOptions${_FILEFUNC_S}_trimleft FileFunc_GetOptions${_FILEFUNC_S}_trimright + + FileFunc_GetOptions${_FILEFUNC_S}_trimleft: + IntOp $4 $4 + 1 + StrCpy $5 $0 $3 $4 + StrCmp${_FILEFUNC_S} $5 '' FileFunc_GetOptions${_FILEFUNC_S}_notfound + StrCmp${_FILEFUNC_S} $5 $2 0 FileFunc_GetOptions${_FILEFUNC_S}_quote + IntOp $4 $4 + $3 + StrCpy $0 $0 '' $4 + StrCpy $4 $0 1 + StrCmp${_FILEFUNC_S} $4 ' ' 0 +3 + StrCpy $0 $0 '' 1 + goto -3 + StrCpy $7 1 + goto FileFunc_GetOptions${_FILEFUNC_S}_begin + + FileFunc_GetOptions${_FILEFUNC_S}_trimright: + StrCpy $0 $0 $4 + StrCpy $4 $0 1 -1 + StrCmp${_FILEFUNC_S} $4 ' ' 0 +3 + StrCpy $0 $0 -1 + goto -3 + StrCpy $3 $0 1 + StrCpy $4 $0 1 -1 + StrCmp${_FILEFUNC_S} $3 $4 0 FileFunc_GetOptions${_FILEFUNC_S}_end + StrCmp${_FILEFUNC_S} $3 '"' +3 + StrCmp${_FILEFUNC_S} $3 `'` +2 + StrCmp${_FILEFUNC_S} $3 '`' 0 FileFunc_GetOptions${_FILEFUNC_S}_end + StrCpy $0 $0 -1 1 + goto FileFunc_GetOptions${_FILEFUNC_S}_end + + FileFunc_GetOptions${_FILEFUNC_S}_notfound: + SetErrors + StrCpy $0 '' + + FileFunc_GetOptions${_FILEFUNC_S}_end: + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + +!macroend + +!define GetOptions `!insertmacro GetOptionsCall` +!define un.GetOptions `!insertmacro GetOptionsCall` + +!macro GetOptions +!macroend + +!macro un.GetOptions +!macroend + +!macro GetOptions_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + !insertmacro GetOptionsBody '' + + !verbose pop +!macroend + +!define GetOptionsS `!insertmacro GetOptionsSCall` +!define un.GetOptionsS `!insertmacro GetOptionsSCall` + +!macro GetOptionsS +!macroend + +!macro un.GetOptionsS +!macroend + +!macro GetOptionsS_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + !insertmacro GetOptionsBody 'S' + + !verbose pop +!macroend + +!define GetRoot `!insertmacro GetRootCall` +!define un.GetRoot `!insertmacro GetRootCall` + +!macro GetRoot +!macroend + +!macro un.GetRoot +!macroend + +!macro GetRoot_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + Push $3 + + StrCpy $1 $0 2 + StrCmp $1 '\\' FileFunc_GetRoot_UNC + StrCpy $2 $1 1 1 + StrCmp $2 ':' 0 FileFunc_GetRoot_empty + StrCpy $0 $1 + goto FileFunc_GetRoot_end + + FileFunc_GetRoot_UNC: + StrCpy $2 1 + StrCpy $3 '' + + FileFunc_GetRoot_loop: + IntOp $2 $2 + 1 + StrCpy $1 $0 1 $2 + StrCmp $1$3 '' FileFunc_GetRoot_empty + StrCmp $1 '' +5 + StrCmp $1 '\' 0 FileFunc_GetRoot_loop + StrCmp $3 '1' +3 + StrCpy $3 '1' + goto FileFunc_GetRoot_loop + StrCpy $0 $0 $2 + StrCpy $2 $0 1 -1 + StrCmp $2 '\' 0 FileFunc_GetRoot_end + + FileFunc_GetRoot_empty: + StrCpy $0 '' + + FileFunc_GetRoot_end: + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetParent `!insertmacro GetParentCall` +!define un.GetParent `!insertmacro GetParentCall` + +!macro GetParent +!macroend + +!macro un.GetParent +!macroend + +!macro GetParent_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + + StrCpy $2 $0 1 -1 + StrCmp $2 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + + StrCpy $1 0 + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '\' +2 + StrCmp $2 '' 0 -3 + StrCpy $0 $0 $1 + + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetFileName `!insertmacro GetFileNameCall` +!define un.GetFileName `!insertmacro GetFileNameCall` + +!macro GetFileName +!macroend + +!macro un.GetFileName +!macroend + +!macro GetFileName_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + + StrCpy $2 $0 1 -1 + StrCmp $2 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + + StrCpy $1 0 + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '' FileFunc_GetFileName_end + StrCmp $2 '\' 0 -3 + IntOp $1 $1 + 1 + StrCpy $0 $0 '' $1 + + FileFunc_GetFileName_end: + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetBaseName `!insertmacro GetBaseNameCall` +!define un.GetBaseName `!insertmacro GetBaseNameCall` + +!macro GetBaseName +!macroend + +!macro un.GetBaseName +!macroend + +!macro GetBaseName_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + Push $3 + + StrCpy $1 0 + StrCpy $3 '' + + FileFunc_GetBaseName_loop: + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '' FileFunc_GetBaseName_trimpath + StrCmp $2 '\' FileFunc_GetBaseName_trimpath + StrCmp $3 'noext' FileFunc_GetBaseName_loop + StrCmp $2 '.' 0 FileFunc_GetBaseName_loop + StrCpy $0 $0 $1 + StrCpy $3 'noext' + StrCpy $1 0 + goto FileFunc_GetBaseName_loop + + FileFunc_GetBaseName_trimpath: + StrCmp $1 -1 FileFunc_GetBaseName_empty + IntOp $1 $1 + 1 + StrCpy $0 $0 '' $1 + goto FileFunc_GetBaseName_end + + FileFunc_GetBaseName_empty: + StrCpy $0 '' + + FileFunc_GetBaseName_end: + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define GetFileExt `!insertmacro GetFileExtCall` +!define un.GetFileExt `!insertmacro GetFileExtCall` + +!macro GetFileExt +!macroend + +!macro un.GetFileExt +!macroend + +!macro GetFileExt_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + + StrCpy $1 0 + + FileFunc_GetFileExt_loop: + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '' FileFunc_GetFileExt_empty + StrCmp $2 '\' FileFunc_GetFileExt_empty + StrCmp $2 '.' 0 FileFunc_GetFileExt_loop + + StrCmp $1 -1 FileFunc_GetFileExt_empty + IntOp $1 $1 + 1 + StrCpy $0 $0 '' $1 + goto FileFunc_GetFileExt_end + + FileFunc_GetFileExt_empty: + StrCpy $0 '' + + FileFunc_GetFileExt_end: + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define BannerTrimPath `!insertmacro BannerTrimPathCall` +!define un.BannerTrimPath `!insertmacro BannerTrimPathCall` + +!macro BannerTrimPath +!macroend + +!macro un.BannerTrimPath +!macroend + +!macro BannerTrimPath_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + + StrCpy $3 $1 1 -1 + IntOp $1 $1 + 0 + StrLen $2 $0 + IntCmp $2 $1 FileFunc_BannerTrimPath_end FileFunc_BannerTrimPath_end + IntOp $1 $1 - 3 + IntCmp $1 0 FileFunc_BannerTrimPath_empty FileFunc_BannerTrimPath_empty + StrCmp $3 'A' FileFunc_BannerTrimPath_A-trim + StrCmp $3 'B' FileFunc_BannerTrimPath_B-trim + StrCmp $3 'C' FileFunc_BannerTrimPath_C-trim + StrCmp $3 'D' FileFunc_BannerTrimPath_D-trim + + FileFunc_BannerTrimPath_A-trim: + StrCpy $3 $0 1 1 + StrCpy $2 0 + StrCmp $3 ':' 0 +2 + IntOp $2 $2 + 2 + + FileFunc_BannerTrimPath_loopleft: + IntOp $2 $2 + 1 + StrCpy $3 $0 1 $2 + StrCmp $2 $1 FileFunc_BannerTrimPath_C-trim + StrCmp $3 '\' 0 FileFunc_BannerTrimPath_loopleft + StrCpy $3 $0 $2 + IntOp $2 $2 - $1 + IntCmp $2 0 FileFunc_BannerTrimPath_B-trim 0 FileFunc_BannerTrimPath_B-trim + + FileFunc_BannerTrimPath_loopright: + IntOp $2 $2 + 1 + StrCpy $4 $0 1 $2 + StrCmp $2 0 FileFunc_BannerTrimPath_B-trim + StrCmp $4 '\' 0 FileFunc_BannerTrimPath_loopright + StrCpy $4 $0 '' $2 + StrCpy $0 '$3\...$4' + goto FileFunc_BannerTrimPath_end + + FileFunc_BannerTrimPath_B-trim: + StrCpy $2 $1 + IntOp $2 $2 - 1 + StrCmp $2 -1 FileFunc_BannerTrimPath_C-trim + StrCpy $3 $0 1 $2 + StrCmp $3 '\' 0 -3 + StrCpy $0 $0 $2 + StrCpy $0 '$0\...' + goto FileFunc_BannerTrimPath_end + + FileFunc_BannerTrimPath_C-trim: + StrCpy $0 $0 $1 + StrCpy $0 '$0...' + goto FileFunc_BannerTrimPath_end + + FileFunc_BannerTrimPath_D-trim: + StrCpy $3 -1 + IntOp $3 $3 - 1 + StrCmp $3 -$2 FileFunc_BannerTrimPath_C-trim + StrCpy $4 $0 1 $3 + StrCmp $4 '\' 0 -3 + StrCpy $4 $0 '' $3 + IntOp $3 $1 + $3 + IntCmp $3 2 FileFunc_BannerTrimPath_C-trim FileFunc_BannerTrimPath_C-trim + StrCpy $0 $0 $3 + StrCpy $0 '$0...$4' + goto FileFunc_BannerTrimPath_end + + FileFunc_BannerTrimPath_empty: + StrCpy $0 '' + + FileFunc_BannerTrimPath_end: + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define DirState `!insertmacro DirStateCall` +!define un.DirState `!insertmacro DirStateCall` + +!macro DirState +!macroend + +!macro un.DirState +!macroend + +!macro DirState_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + Exch $0 + Push $1 + ClearErrors + + FindFirst $1 $0 '$0\*.*' + IfErrors 0 +3 + StrCpy $0 -1 + goto FileFunc_DirState_end + StrCmp $0 '.' 0 +4 + FindNext $1 $0 + StrCmp $0 '..' 0 +2 + FindNext $1 $0 + FindClose $1 + IfErrors 0 +3 + StrCpy $0 0 + goto FileFunc_DirState_end + StrCpy $0 1 + + FileFunc_DirState_end: + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define RefreshShellIcons `!insertmacro RefreshShellIconsCall` +!define un.RefreshShellIcons `!insertmacro RefreshShellIconsCall` + +!macro RefreshShellIcons +!macroend + +!macro un.RefreshShellIcons +!macroend + +!macro RefreshShellIcons_ + !verbose push + !verbose ${_FILEFUNC_VERBOSE} + + System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)' + + !verbose pop +!macroend + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/InstallOptions.nsh b/libs/NSIS/NSIS-source/Include/InstallOptions.nsh new file mode 100644 index 0000000000..04cd5b94bb --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/InstallOptions.nsh @@ -0,0 +1,244 @@ +/* + +InstallOptions.nsh +Macros and conversion functions for InstallOptions + +*/ + +!ifndef ___NSIS__INSTALL_OPTIONS__NSH___ +!define ___NSIS__INSTALL_OPTIONS__NSH___ + +!include LogicLib.nsh + +!macro INSTALLOPTIONS_FUNCTION_READ_CONVERT + !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS "" +!macroend + +!macro INSTALLOPTIONS_UNFUNCTION_READ_CONVERT + !insertmacro INSTALLOPTIONS_FUNCTION_IO2NSIS un. +!macroend + +!macro INSTALLOPTIONS_FUNCTION_WRITE_CONVERT + !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO "" +!macroend + +!macro INSTALLOPTIONS_UNFUNCTION_WRITE_CONVERT + !insertmacro INSTALLOPTIONS_FUNCTION_NSIS2IO un. +!macroend + +!macro INSTALLOPTIONS_FUNCTION_NSIS2IO UNINSTALLER_FUNCPREFIX + + ; Convert an NSIS string to a form suitable for use by InstallOptions + ; Usage: + ; Push + ; Call Nsis2Io + ; Pop + + Function ${UNINSTALLER_FUNCPREFIX}Nsis2Io + + Exch $0 ; The source + Push $1 ; The output + Push $2 ; Temporary char + Push $3 ; Length + Push $4 ; Loop index + StrCpy $1 "" ; Initialise the output + + StrLen $3 $0 + IntOp $3 $3 - 1 + + ${For} $4 0 $3 + StrCpy $2 $0 1 $4 + ${If} $2 == '\' + StrCpy $2 '\\' + ${ElseIf} $2 == '$\r' + StrCpy $2 '\r' + ${ElseIf} $2 == '$\n' + StrCpy $2 '\n' + ${ElseIf} $2 == '$\t' + StrCpy $2 '\t' + ${EndIf} + StrCpy $1 $1$2 + ${Next} + + StrCpy $0 $1 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + FunctionEnd + +!macroend + +!macro INSTALLOPTIONS_FUNCTION_IO2NSIS UNINSTALLER_FUNCPREFIX + + ; Convert an InstallOptions string to a form suitable for use by NSIS + ; Usage: + ; Push + ; Call Io2Nsis + ; Pop + + Function ${UNINSTALLER_FUNCPREFIX}Io2Nsis + + Exch $0 ; The source + Push $1 ; The output + Push $2 ; Temporary char + Push $3 ; Length + Push $4 ; Loop index + StrCpy $1 "" ; Initialise the output + + StrLen $3 $0 + IntOp $3 $3 - 1 + + ${For} $4 0 $3 + StrCpy $2 $0 2 $4 + ${If} $2 == '\\' + StrCpy $2 '\' + IntOp $4 $4 + 1 + ${ElseIf} $2 == '\r' + StrCpy $2 '$\r' + IntOp $4 $4 + 1 + ${ElseIf} $2 == '\n' + StrCpy $2 '$\n' + IntOp $4 $4 + 1 + ${ElseIf} $2 == '\t' + StrCpy $2 '$\t' + IntOp $4 $4 + 1 + ${EndIf} + StrCpy $2 $2 1 + StrCpy $1 $1$2 + ${Next} + + StrCpy $0 $1 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + FunctionEnd + +!macroend + +!macro INSTALLOPTIONS_EXTRACT FILE + + InitPluginsDir + File "/oname=$PLUGINSDIR\${FILE}" "${FILE}" +!ifdef NSIS_UNICODE + InstallOptions::make_unicode "$PLUGINSDIR\${FILE}" +!endif + !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "Settings" "RTL" "$(^RTL)" + +!macroend + +!macro INSTALLOPTIONS_EXTRACT_AS FILE FILENAME + + InitPluginsDir + File "/oname=$PLUGINSDIR\${FILENAME}" "${FILE}" +!ifdef NSIS_UNICODE + InstallOptions::make_unicode "$PLUGINSDIR\${FILENAME}" +!endif + !insertmacro INSTALLOPTIONS_WRITE "${FILENAME}" "Settings" "RTL" "$(^RTL)" + +!macroend + +!macro INSTALLOPTIONS_DISPLAY FILE + + Push $0 + + InstallOptions::dialog "$PLUGINSDIR\${FILE}" + Pop $0 + + Pop $0 + +!macroend + +!macro INSTALLOPTIONS_DISPLAY_RETURN FILE + + InstallOptions::dialog "$PLUGINSDIR\${FILE}" + +!macroend + +!macro INSTALLOPTIONS_INITDIALOG FILE + + InstallOptions::initDialog "$PLUGINSDIR\${FILE}" + +!macroend + +!macro INSTALLOPTIONS_SHOW + + Push $0 + + InstallOptions::show + Pop $0 + + Pop $0 + +!macroend + +!macro INSTALLOPTIONS_SHOW_RETURN + + InstallOptions::show + +!macroend + +!macro INSTALLOPTIONS_READ VAR FILE SECTION KEY + + ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" + +!macroend + +!macro INSTALLOPTIONS_WRITE FILE SECTION KEY VALUE + + WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" "${VALUE}" + +!macroend + +!macro INSTALLOPTIONS_READ_CONVERT VAR FILE SECTION KEY + + ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" + Push ${VAR} + Call Io2Nsis + Pop ${VAR} + +!macroend + +!macro INSTALLOPTIONS_READ_UNCONVERT VAR FILE SECTION KEY + + ReadIniStr ${VAR} "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" + Push ${VAR} + Call un.Io2Nsis + Pop ${VAR} + +!macroend + +!macro INSTALLOPTIONS_WRITE_CONVERT FILE SECTION KEY VALUE + + Push $0 + StrCpy $0 "${VALUE}" + Push $0 + Call Nsis2Io + Pop $0 + + WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0 + + Pop $0 + +!macroend + +!macro INSTALLOPTIONS_WRITE_UNCONVERT FILE SECTION KEY VALUE + + Push $0 + StrCpy $0 "${VALUE}" + Push $0 + Call un.Nsis2Io + Pop $0 + + WriteIniStr "$PLUGINSDIR\${FILE}" "${SECTION}" "${KEY}" $0 + + Pop $0 + +!macroend + +!endif # ___NSIS__INSTALL_OPTIONS__NSH___ diff --git a/libs/NSIS/NSIS-source/Include/Integration.nsh b/libs/NSIS/NSIS-source/Include/Integration.nsh new file mode 100644 index 0000000000..f25c312324 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Integration.nsh @@ -0,0 +1,44 @@ +!verbose push 3 +!ifndef INTEGRATION_INCLUDED +!define INTEGRATION_INCLUDED 1 + +!include "Util.nsh" + + +!define NotifyShell_AssocChanged `System::Call 'SHELL32::SHChangeNotify(i0x8000000,i0,p0,p0)'` ; Notify the shell with SHCNE_ASSOCCHANGED + + +!define UnpinShortcut "!insertmacro UnpinShortcut " +!macro UnpinShortcut lnkpath +Push "${lnkpath}" +${CallArtificialFunction} UnpinShortcut_Implementation +!macroend +!macro UnpinShortcut_Implementation +!include "LogicLib.nsh" +!include "Win\COM.nsh" +Exch $0 +Push $1 +!insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} ${IID_IStartMenuPinnedList} r1 "" +${If} $1 P<> 0 + System::Call 'SHELL32::SHCreateItemFromParsingName(wr0,p0,g"${IID_IShellItem}",*p0r0)' + ${If} $0 P<> 0 + ${IStartMenuPinnedList::RemoveFromList} $1 '(r0)' + ${IUnknown::Release} $0 "" + ${EndIf} + ${IUnknown::Release} $1 "" +!ifdef NSIS_IX86 | NSIS_AMD64 +${Else} + !insertmacro ComHlpr_CreateInProcInstance ${CLSID_StartMenuPin} "{ec35e37a-6579-4f3c-93cd-6e62c4ef7636}" r1 "" + ${If} $1 P<> 0 + ExecShellWait /INVOKEIDLIST "unpin" $0 ; WinXP + ${IUnknown::Release} $1 "" + ${EndIf} +!endif +${EndIf} +Pop $1 +Pop $0 +!macroend + + +!endif #!INCLUDED +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/LangFile.nsh b/libs/NSIS/NSIS-source/Include/LangFile.nsh new file mode 100644 index 0000000000..8ea4c0b61f --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/LangFile.nsh @@ -0,0 +1,191 @@ +/* + +LangFile.nsh + +Header file to create language files that can be +included with a single command. + +Copyright 2008-2026 Joost Verburg, Anders Kjersem + +* Either LANGFILE_INCLUDE or LANGFILE_INCLUDE_WITHDEFAULT + can be called from the script to include a language file. + + - LANGFILE_INCLUDE takes the language file name as parameter. + - LANGFILE_INCLUDE_WITHDEFAULT takes as additional second + parameter, the default language file to load missing strings from. + +* Language strings in the language file have the format: + ${LangFileString} LANGSTRING_NAME "Text" + +* There are two types of language header files: + + - NSIS multi-lang support; these must start with the LANGFILE macro and + provide strings for features like MUI and MultiUser. If you are adding + support for a new language to NSIS you should make a copy of English.nsh + and translate this .nsh along with the .nlf. + - Custom installer strings; these must start with the LANGFILE_EXT macro and + contain translated versions of + custom strings used in a particular installer. + This is useful if you want to put the translations for each language in + their own separate file. + +* Example: + + ; Setup.nsi + !include "MUI.nsh" + !insertmacro MUI_PAGE_INSTFILES + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro LANGFILE_INCLUDE "DanishExtra.nsh" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro LANGFILE_INCLUDE "SwedishExtra.nsh" + Section + MessageBox MB_OK "$(myCustomString)" + SectionEnd + + ; SwedishExtra.nsh + !insertmacro LANGFILE_EXT Swedish + ${LangFileString} myCustomString "Bork bork" + +*/ + +!ifndef LANGFILE_INCLUDED +!define LANGFILE_INCLUDED + +!macro LANGFILE_INCLUDE FILENAME + + ;Called from script: include a language file + + !ifdef LangFileString + !undef LangFileString + !endif + + !define LangFileString "!insertmacro LANGFILE_SETSTRING" + + !define LANGFILE_SETNAMES + !include "${FILENAME}" + !undef LANGFILE_SETNAMES + + ;Create language strings + !define /redef LangFileString "!insertmacro LANGFILE_LANGSTRING" + !include "${FILENAME}" + +!macroend + +!macro LANGFILE_INCLUDE_WITHDEFAULT FILENAME FILENAME_DEFAULT + + ;Called from script: include a language file + ;Obtains missing strings from a default file + + !ifdef LangFileString + !undef LangFileString + !endif + + !define LangFileString "!insertmacro LANGFILE_SETSTRING" + + !define LANGFILE_SETNAMES + !include "${FILENAME}" + !undef LANGFILE_SETNAMES + + ;Include default language for missing strings + !define LANGFILE_PRIV_INCLUDEISFALLBACK "${FILENAME_DEFAULT}" + !include "${FILENAME_DEFAULT}" + !undef LANGFILE_PRIV_INCLUDEISFALLBACK + + ;Create language strings + !define /redef LangFileString "!insertmacro LANGFILE_LANGSTRING" + !include "${FILENAME_DEFAULT}" + +!macroend + +!macro LANGFILE NLFID ENGNAME NATIVENAME NATIVEASCIINAME + + ;Start of standard NSIS language file + + ; NLFID: Must match the name of the .nlf file + ; ENGNAME: English name of language, "=" if it is the same as NLFID + ; NATIVENAME: Native name of language. (In Unicode) + ; NATIVEASCIINAME: Native name of language using only ASCII, "=" if it is the same as NATIVENAME + + ; Example: LANGFILE "Swedish" = "Svenska" = (This is the same as LANGFILE "Swedish" "Swedish" "Svenska" "Svenska") + ; For more examples, see French.nsh, Greek.nsh and PortugueseBR.nsh + + !ifdef LANGFILE_SETNAMES + + !ifdef LANGFILE_IDNAME + !undef LANGFILE_IDNAME + !endif + + !define LANGFILE_IDNAME "${NLFID}" + + ; ModernUI or the .nsi can change LANGFILE_LANGDLL_FMT if desired + !ifndef LANGFILE_LANGDLL_FMT + !ifndef NSIS_UNICODE + !define LANGFILE_LANGDLL_FMT "%ENGNAME% / %NATIVEASCIINAME%" + !endif + !define /ifndef LANGFILE_LANGDLL_FMT "%NATIVENAME%" + !endif + + !ifndef "LANGFILE_${NLFID}_NAME" + !if "${ENGNAME}" == "=" + !define /redef ENGNAME "${NLFID}" + !endif + !if "${NATIVEASCIINAME}" == "=" + !define /redef NATIVEASCIINAME "${NATIVENAME}" + !endif + + !define "LANGFILE_${NLFID}_ENGLISHNAME" "${ENGNAME}" + !ifdef NSIS_UNICODE + !define "LANGFILE_${NLFID}_NAME" "${NATIVENAME}" + !else + !define "LANGFILE_${NLFID}_NAME" "${NATIVEASCIINAME}" + !endif + + !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_LANGDLL_FMT}" %NATIVEASCIINAME% "${NATIVEASCIINAME}" + !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_${NLFID}_LANGDLL}" %NATIVENAME% "${NATIVENAME}" + !searchreplace LANGFILE_${NLFID}_LANGDLL "${LANGFILE_${NLFID}_LANGDLL}" %ENGNAME% "${ENGNAME}" + + !endif + + !endif + +!macroend + +!macro LANGFILE_EXT IDNAME + + ;Start of installer language file + + !ifdef LANGFILE_SETNAMES + + !ifdef LANGFILE_IDNAME + !undef LANGFILE_IDNAME + !endif + + !define LANGFILE_IDNAME "${IDNAME}" + + !endif + +!macroend + +!macro LANGFILE_SETSTRING NAME VALUE + + ;Set define with translated string + + !ifndef ${NAME} + !define "${NAME}" "${VALUE}" + !ifdef LANGFILE_PRIV_INCLUDEISFALLBACK + !warning 'LangString "${NAME}" for language ${LANGFILE_IDNAME} is missing, using fallback from "${LANGFILE_PRIV_INCLUDEISFALLBACK}"' + !endif + !endif + +!macroend + +!macro LANGFILE_LANGSTRING NAME DUMMY + + ;Create a language string from a define and undefine + + LangString "${NAME}" "${LANG_${LANGFILE_IDNAME}}" "${${NAME}}" + !undef "${NAME}" + +!macroend + +!endif diff --git a/libs/NSIS/NSIS-source/Include/Library.nsh b/libs/NSIS/NSIS-source/Include/Library.nsh new file mode 100644 index 0000000000..ff3ee33746 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Library.nsh @@ -0,0 +1,885 @@ +# +# Library.nsh +# +# A system for the installation and uninstallation of dynamic +# link libraries (DLL) and type libraries (TLB). Using this +# system you can handle the complete setup with one single +# line of code: +# +# * File copying +# * File copying on reboot +# * Version checks +# * Registration and unregistration +# * Registration and unregistration on reboot +# * Shared DLL counting +# * Windows File Protection checks +# +# For more information, read appendix B in the documentation. +# + +!verbose push +!verbose 3 + +!ifndef LIB_INCLUDED + +!define LIB_INCLUDED + +!ifndef SHCNE_ASSOCCHANGED + !define SHCNE_ASSOCCHANGED 0x08000000 +!endif +!ifndef SHCNF_IDLIST + !define SHCNF_IDLIST 0x0000 +!endif + +!define REGTOOL_VERSION v3 +!define REGTOOL_KEY NSIS.Library.RegTool.${REGTOOL_VERSION} + +!include LogicLib.nsh +!include x64.nsh + +### GetParent macro, don't pass $1 or $2 as INPUT or OUTPUT +!macro __InstallLib_Helper_GetParent INPUT OUTPUT + + # Copied from FileFunc.nsh + + StrCpy ${OUTPUT} ${INPUT} + + Push $1 + Push $2 + + StrCpy $2 ${OUTPUT} 1 -1 + StrCmp $2 '\' 0 +3 + StrCpy ${OUTPUT} ${OUTPUT} -1 + goto -3 + + StrCpy $1 0 + IntOp $1 $1 - 1 + StrCpy $2 ${OUTPUT} 1 $1 + StrCmp $2 '\' +2 + StrCmp $2 '' 0 -3 + StrCpy ${OUTPUT} ${OUTPUT} $1 + + Pop $2 + Pop $1 + +!macroend + +### Initialize session id (GUID) +!macro __InstallLib_Helper_InitSession + + !ifndef __InstallLib_SessionGUID_Defined + + !define __InstallLib_SessionGUID_Defined + + Var /GLOBAL __INSTALLLLIB_SESSIONGUID + + !endif + + !define __InstallLib_Helper_InitSession_Label "Library_${__FILE__}${__LINE__}" + + StrCmp $__INSTALLLLIB_SESSIONGUID '' 0 "${__InstallLib_Helper_InitSession_Label}" + + System::Call 'ole32::CoCreateGuid(g .s)' + Pop $__INSTALLLLIB_SESSIONGUID + + "${__InstallLib_Helper_InitSession_Label}:" + + !undef __InstallLib_Helper_InitSession_Label + +!macroend + +### Add a RegTool entry to register after reboot +!macro __InstallLib_Helper_AddRegToolEntry mode filename tempdir + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + ;------------------------ + ;Copy the parameters + + Push "${filename}" + Push "${tempdir}" + + Pop $R2 ; temporary directory + Pop $R1 ; file name to register + + ;------------------------ + ;Initialize session id + + !insertmacro __InstallLib_Helper_InitSession + + ;------------------------ + ;Advance counter + + StrCpy $R0 0 + ReadRegDWORD $R0 HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "count" "$R0" + + ;------------------------ + ;Setup RegTool + + !if ! /FileExists "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" + !error "Missing RegTool for ${NSIS_CPU}!" + !endif + + ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "${REGTOOL_KEY}" + StrCpy $R3 $R3 -4 1 + IfFileExists $R3 +3 + + File /oname=$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "${REGTOOL_KEY}" '"$R2\${REGTOOL_KEY}.$__INSTALLLLIB_SESSIONGUID.exe" /S' + + ;------------------------ + ;Add RegTool entry + + WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.file" "$R1" + WriteRegStr HKLM "Software\${REGTOOL_KEY}\$__INSTALLLLIB_SESSIONGUID" "$R0.mode" "${mode}" + + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +!macro __InstallLib_Helper_CmpPackedVer64 oldhi oldlo newhi newlo jeq jle jgt + + IntCmpU ${oldhi} ${newhi} "0" "${jle}" "${jgt}" + IntCmpU ${oldlo} ${newlo} "${jeq}" "${jle}" "${jgt}" + +!macroend + +### Get library version +!macro __InstallLib_Helper_GetVersion TYPE FILE + + !if "${TYPE}" == "D" + !getdllversion /NoErrors /Packed "${FILE}" LIBRARY_VERSION_ + !else if "${TYPE}" == "T" + !gettlbversion /NoErrors /Packed "${FILE}" LIBRARY_VERSION_ + !endif + + ; Emulate the old LibraryLocal defines + !ifndef LIBRARY_VERSION_HIGH + !define LIBRARY_VERSION_FILENOTFOUND + !else if "${LIBRARY_VERSION_HIGH}" == "" + !define LIBRARY_VERSION_NONE + !undef LIBRARY_VERSION_HIGH + !undef LIBRARY_VERSION_LOW + !endif + +!macroend + +### Install library +!macro InstallLib libtype shared install localfile destfile tempbasedir + + !verbose push + !verbose 3 + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + ;------------------------ + ;Define + + !define INSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" + + !define INSTALLLIB_LIBTYPE_${libtype} + !define INSTALLLIB_LIBTYPE_SET INSTALLLIB_LIBTYPE_${libtype} + !define INSTALLLIB_SHARED_${shared} + !define INSTALLLIB_SHARED_SET INSTALLLIB_SHARED_${shared} + !define INSTALLLIB_INSTALL_${install} + !define INSTALLLIB_INSTALL_SET INSTALLLIB_INSTALL_${install} + + ;------------------------ + ;Validate + + !ifndef INSTALLLIB_LIBTYPE_DLL & INSTALLLIB_LIBTYPE_REGDLL & INSTALLLIB_LIBTYPE_TLB & \ + INSTALLLIB_LIBTYPE_REGDLLTLB & INSTALLLIB_LIBTYPE_REGEXE + !error "InstallLib: Incorrect setting for parameter: libtype" + !endif + + !ifndef INSTALLLIB_INSTALL_REBOOT_PROTECTED & INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED & \ + INSTALLLIB_INSTALL_NOREBOOT_PROTECTED & INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED + !error "InstallLib: Incorrect setting for parameter: install" + !endif + + ;------------------------ + ;x64 settings + + !ifdef LIBRARY_X64 + + ${DisableX64FSRedirection} + + !endif + + ;------------------------ + ;Copy the parameters used on run-time to a variable + ;This allows the usage of variables as parameter + + StrCpy $R4 "${destfile}" + StrCpy $R5 "${tempbasedir}" + + ;------------------------ + ;Shared library count + + !ifndef INSTALLLIB_SHARED_NOTSHARED + + StrCmp ${shared} "" 0 "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}" + + !ifdef LIBRARY_X64 + + SetRegView 64 + + !endif + + ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 + ClearErrors + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R4 $R0 + + !ifdef LIBRARY_X64 + + SetRegView lastused + + !endif + + "installlib.noshareddllincrease_${INSTALLLIB_UNIQUE}:" + + !endif + + ;------------------------ + ;Check Windows File Protection + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_PROTECTED + + !define LIBRARY_DEFINE_DONE_LABEL + + System::Call "sfc::SfcIsFileProtected(i 0, w R4) i.R0" + + StrCmp $R0 "error" "installlib.notprotected_${INSTALLLIB_UNIQUE}" + StrCmp $R0 "0" "installlib.notprotected_${INSTALLLIB_UNIQUE}" + + Goto "installlib.done_${INSTALLLIB_UNIQUE}" + + "installlib.notprotected_${INSTALLLIB_UNIQUE}:" + + !endif + + ;------------------------ + ;Check file + + IfFileExists $R4 0 "installlib.copy_${INSTALLLIB_UNIQUE}" + + ;------------------------ + ;Get version information + + !ifndef LIBRARY_IGNORE_VERSION + + !insertmacro __InstallLib_Helper_GetVersion D "${LOCALFILE}" + + !ifdef LIBRARY_VERSION_FILENOTFOUND + !error "InstallLib: The library ${LOCALFILE} could not be found." + !endif + + !ifndef LIBRARY_VERSION_NONE + + !define LIBRARY_DEFINE_UPGRADE_LABEL + !define LIBRARY_DEFINE_REGISTER_LABEL + + StrCpy $R0 ${LIBRARY_VERSION_HIGH} + StrCpy $R1 ${LIBRARY_VERSION_LOW} + + GetDLLVersion $R4 $R2 $R3 + + !undef LIBRARY_VERSION_HIGH + !undef LIBRARY_VERSION_LOW + + !ifndef INSTALLLIB_LIBTYPE_TLB & INSTALLLIB_LIBTYPE_REGDLLTLB + + !ifdef LIBRARY_INSTALL_EQUAL_VERSION + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !else + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !endif + + !else + + !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" + + !ifdef LIBRARY_VERSION_FILENOTFOUND + !error "InstallLib: The library ${LOCALFILE} could not be found." + !endif + + !ifndef LIBRARY_VERSION_NONE + + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 0 \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + + !else + + !ifdef LIBRARY_INSTALL_EQUAL_VERSION + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !else + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !endif + + !endif + + !endif + + !else + + !undef LIBRARY_VERSION_NONE + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + !insertmacro __InstallLib_Helper_GetVersion T "${LOCALFILE}" + + !endif + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + !ifndef LIBRARY_VERSION_NONE + + !ifndef LIBRARY_DEFINE_UPGRADE_LABEL + + !define LIBRARY_DEFINE_UPGRADE_LABEL + + !endif + + !ifndef LIBRARY_DEFINE_REGISTER_LABEL + + !define LIBRARY_DEFINE_REGISTER_LABEL + + !endif + + StrCpy $R0 ${LIBRARY_VERSION_HIGH} + StrCpy $R1 ${LIBRARY_VERSION_LOW} + + TypeLib::GetLibVersion $R4 + Pop $R3 + Pop $R2 + + !ifdef LIBRARY_INSTALL_EQUAL_VERSION + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.upgrade_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !else + !insertmacro __InstallLib_Helper_CmpPackedVer64 $R0 $R1 $R2 $R3 "installlib.register_${INSTALLLIB_UNIQUE}" \ + "installlib.register_${INSTALLLIB_UNIQUE}" "installlib.upgrade_${INSTALLLIB_UNIQUE}" + !endif + + !undef LIBRARY_VERSION_HIGH + !undef LIBRARY_VERSION_LOW + + !else + + !undef LIBRARY_VERSION_NONE + + !endif + + !endif + + !endif ;~LIBRARY_IGNORE_VERSION + + ;------------------------ + ;Upgrade + + !ifdef LIBRARY_DEFINE_UPGRADE_LABEL + + !undef LIBRARY_DEFINE_UPGRADE_LABEL + + "installlib.upgrade_${INSTALLLIB_UNIQUE}:" + + !endif + + ;------------------------ + ;Copy + + !ifdef INSTALLLIB_INSTALL_NOREBOOT_PROTECTED | INSTALLLIB_INSTALL_NOREBOOT_NOTPROTECTED + + "installlib.copy_${INSTALLLIB_UNIQUE}:" + + StrCpy $R0 $R4 + Call ":installlib.file_${INSTALLLIB_UNIQUE}" + + !else + + !ifndef LIBRARY_DEFINE_REGISTER_LABEL + + !define LIBRARY_DEFINE_REGISTER_LABEL + + !endif + + !ifndef LIBRARY_DEFINE_DONE_LABEL + + !define LIBRARY_DEFINE_DONE_LABEL + + !endif + + ClearErrors + + StrCpy $R0 $R4 + Call ":installlib.file_${INSTALLLIB_UNIQUE}" + + IfErrors 0 "installlib.register_${INSTALLLIB_UNIQUE}" + + SetOverwrite lastused + + ;------------------------ + ;Copy on reboot + + GetTempFileName $R0 $R5 + Call ":installlib.file_${INSTALLLIB_UNIQUE}" + Rename /REBOOTOK $R0 $R4 + + ;------------------------ + ;Register on reboot + + Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" + + Goto "installlib.done_${INSTALLLIB_UNIQUE}" + + "installlib.copy_${INSTALLLIB_UNIQUE}:" + StrCpy $R0 $R4 + Call ":installlib.file_${INSTALLLIB_UNIQUE}" + + !endif + + ;------------------------ + ;Register + + !ifdef LIBRARY_DEFINE_REGISTER_LABEL + + !undef LIBRARY_DEFINE_REGISTER_LABEL + + "installlib.register_${INSTALLLIB_UNIQUE}:" + + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB | INSTALLLIB_LIBTYPE_REGEXE + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + IfRebootFlag 0 "installlib.regnoreboot_${INSTALLLIB_UNIQUE}" + + Call ":installlib.regonreboot_${INSTALLLIB_UNIQUE}" + + Goto "installlib.registerfinish_${INSTALLLIB_UNIQUE}" + + "installlib.regnoreboot_${INSTALLLIB_UNIQUE}:" + + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + + TypeLib::Register $R4 + + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + + !ifndef LIBRARY_X64 + + RegDll $R4 + + !else + + ExecWait '"$SYSDIR\regsvr32.exe" /s "$R4"' + + !endif + + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGEXE + + ExecWait '"$R4" /regserver' + + !endif + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + "installlib.registerfinish_${INSTALLLIB_UNIQUE}:" + + !endif + + !endif + + !ifdef LIBRARY_SHELL_EXTENSION + + System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' + + !endif + + !ifdef LIBRARY_COM + + System::Call 'Ole32::CoFreeUnusedLibraries()' + + !endif + + ;------------------------ + ;Done + + !ifdef LIBRARY_DEFINE_DONE_LABEL + + !undef LIBRARY_DEFINE_DONE_LABEL + + "installlib.done_${INSTALLLIB_UNIQUE}:" + + !endif + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + + ;------------------------ + ;End + + Goto "installlib.end_${INSTALLLIB_UNIQUE}" + + ;------------------------ + ;Extract + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + SetOverwrite try + + !else + + SetOverwrite on + + !endif + + "installlib.file_${INSTALLLIB_UNIQUE}:" + SetFileAttributes $R0 FILE_ATTRIBUTE_NORMAL + ClearErrors + File /oname=$R0 "${LOCALFILE}" + Return + + SetOverwrite lastused + + ;------------------------ + ;Register on reboot + + !ifdef INSTALLLIB_INSTALL_REBOOT_PROTECTED | INSTALLLIB_INSTALL_REBOOT_NOTPROTECTED + + "installlib.regonreboot_${INSTALLLIB_UNIQUE}:" + + !ifdef INSTALLLIB_LIBTYPE_REGDLL | INSTALLLIB_LIBTYPE_REGDLLTLB + !ifndef LIBRARY_X64 + !insertmacro __InstallLib_Helper_AddRegToolEntry 'D' "$R4" "$R5" + !else + !insertmacro __InstallLib_Helper_AddRegToolEntry 'DX' "$R4" "$R5" + !endif + !endif + + !ifdef INSTALLLIB_LIBTYPE_TLB | INSTALLLIB_LIBTYPE_REGDLLTLB + !insertmacro __InstallLib_Helper_AddRegToolEntry 'T' "$R4" "$R5" + !endif + + !ifdef INSTALLLIB_LIBTYPE_REGEXE + !insertmacro __InstallLib_Helper_AddRegToolEntry 'E' "$R4" "$R5" + !endif + + Return + + !endif + + ;------------------------ + ;End label + + "installlib.end_${INSTALLLIB_UNIQUE}:" + + !ifdef LIBRARY_X64 + + ${EnableX64FSRedirection} + + !endif + + ;------------------------ + ;Undefine + + !undef INSTALLLIB_UNIQUE + + !undef ${INSTALLLIB_LIBTYPE_SET} + !undef INSTALLLIB_LIBTYPE_SET + !undef ${INSTALLLIB_SHARED_SET} + !undef INSTALLLIB_SHARED_SET + !undef ${INSTALLLIB_INSTALL_SET} + !undef INSTALLLIB_INSTALL_SET + + !verbose pop + +!macroend + +### Uninstall library +!macro UnInstallLib libtype shared uninstall file + + !verbose push + !verbose 3 + + Push $R0 + Push $R1 + + ;------------------------ + ;Define + + !define UNINSTALLLIB_UNIQUE "${__FILE__}${__LINE__}" + + !define UNINSTALLLIB_LIBTYPE_${libtype} + !define UNINSTALLLIB_LIBTYPE_SET UNINSTALLLIB_LIBTYPE_${libtype} + !define UNINSTALLLIB_SHARED_${shared} + !define UNINSTALLLIB_SHARED_SET UNINSTALLLIB_SHARED_${shared} + !define UNINSTALLLIB_UNINSTALL_${uninstall} + !define UNINSTALLLIB_UNINSTALL_SET UNINSTALLLIB_UNINSTALL_${uninstall} + + ;------------------------ + ;Validate + + !ifndef UNINSTALLLIB_LIBTYPE_DLL & UNINSTALLLIB_LIBTYPE_REGDLL & UNINSTALLLIB_LIBTYPE_TLB & \ + UNINSTALLLIB_LIBTYPE_REGDLLTLB & UNINSTALLLIB_LIBTYPE_REGEXE + !error "UnInstallLib: Incorrect setting for parameter: libtype" + !endif + + !ifndef UNINSTALLLIB_SHARED_NOTSHARED & UNINSTALLLIB_SHARED_SHARED + !error "UnInstallLib: Incorrect setting for parameter: shared" + !endif + + !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE & UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED & \ + UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED & UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED & \ + UNINSTALLLIB_UNINSTALL_NOREBOOT_NOTPROTECTED + !error "UnInstallLib: Incorrect setting for parameter: uninstall" + !endif + + ;------------------------ + ;x64 settings + + !ifdef LIBRARY_X64 + + ${DisableX64FSRedirection} + + !endif + + ;------------------------ + ;Copy the parameters used on run-time to a variable + ;This allows the usage of variables as parameter + + StrCpy $R1 "${file}" + + ;------------------------ + ;Shared library count + + !ifdef UNINSTALLLIB_SHARED_SHARED + + !define UNINSTALLLIB_DONE_LABEL + + !ifdef LIBRARY_X64 + + SetRegView 64 + + !endif + + ReadRegDword $R0 HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 + StrCmp $R0 "" "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" + + IntOp $R0 $R0 - 1 + IntCmp $R0 0 "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" \ + "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}" "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}" + + "uninstalllib.shareddllremove_${UNINSTALLLIB_UNIQUE}:" + DeleteRegValue HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 + !ifndef UNINSTALLLIB_SHARED_SHAREDNOREMOVE + Goto "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}" + !endif + + "uninstalllib.shareddllinuse_${UNINSTALLLIB_UNIQUE}:" + WriteRegDWORD HKLM Software\Microsoft\Windows\CurrentVersion\SharedDLLs $R1 $R0 + + !ifdef LIBRARY_X64 + + SetRegView lastused + + !endif + + Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" + + "uninstalllib.shareddlldone_${UNINSTALLLIB_UNIQUE}:" + + !ifdef LIBRARY_X64 + + SetRegView lastused + + !endif + + !endif + + ;------------------------ + ;Remove + + !ifndef UNINSTALLLIB_UNINSTALL_NOREMOVE + + ;------------------------ + ;Check Windows File Protection + + !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_NOREBOOT_PROTECTED + + !ifndef UNINSTALLLIB_DONE_LABEL + + !define UNINSTALLLIB_DONE_LABEL + + !endif + + System::Call "sfc::SfcIsFileProtected(i 0, w $R1) i.R0" + + StrCmp $R0 "error" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" + StrCmp $R0 "0" "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}" + + Goto "uninstalllib.done_${UNINSTALLLIB_UNIQUE}" + + "uninstalllib.notprotected_${UNINSTALLLIB_UNIQUE}:" + + !endif + + ;------------------------ + ;Unregister + + !ifdef UNINSTALLLIB_LIBTYPE_REGDLL | UNINSTALLLIB_LIBTYPE_REGDLLTLB + + !ifndef LIBRARY_X64 + + UnRegDLL $R1 + + !else + + ExecWait '"$SYSDIR\regsvr32.exe" /s /u "$R1"' + + !endif + + !endif + + !ifdef UNINSTALLLIB_LIBTYPE_REGEXE + + ExecWait '"$R1" /unregserver' + + !endif + + !ifdef UNINSTALLLIB_LIBTYPE_TLB | UNINSTALLLIB_LIBTYPE_REGDLLTLB + + TypeLib::UnRegister $R1 + + !endif + + !ifdef LIBRARY_SHELL_EXTENSION + + System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' + + !endif + + !ifdef LIBRARY_COM + + System::Call 'Ole32::CoFreeUnusedLibraries()' + + !endif + + ;------------------------ + ;Delete + + Delete $R1 + + !ifdef UNINSTALLLIB_UNINSTALL_REBOOT_PROTECTED | UNINSTALLLIB_UNINSTALL_REBOOT_NOTPROTECTED + + ${If} ${FileExists} $R1 + # File is in use, can't just delete. + # Move file to another location before using Delete /REBOOTOK. This way, if + # the user installs a new version of the DLL, it won't be deleted after + # reboot. See bug #1097642 for more information on this. + + # Try moving to $TEMP. + GetTempFileName $R0 + Delete $R0 + Rename $R1 $R0 + + ${If} ${FileExists} $R1 + # Still here, delete temporary file, in case the file was copied + # and not deleted. This happens when moving from network drives, + # for example. + Delete $R0 + + # Try moving to directory containing the file. + !insertmacro __InstallLib_Helper_GetParent $R1 $R0 + GetTempFileName $R0 $R0 + Delete $R0 + Rename $R1 $R0 + + ${If} ${FileExists} $R1 + # Still here, delete temporary file. + Delete $R0 + + # Give up moving, simply Delete /REBOOTOK the file. + StrCpy $R0 $R1 + ${EndIf} + ${EndIf} + + # Delete the moved file. + Delete /REBOOTOK $R0 + ${EndIf} + + !endif + + !endif + + ;------------------------ + ;Done + + !ifdef UNINSTALLLIB_DONE_LABEL + + !undef UNINSTALLLIB_DONE_LABEL + + "uninstalllib.done_${UNINSTALLLIB_UNIQUE}:" + + !endif + + !ifdef LIBRARY_X64 + + ${EnableX64FSRedirection} + + !endif + + Pop $R1 + Pop $R0 + + ;------------------------ + ;Undefine + + !undef UNINSTALLLIB_UNIQUE + + !undef ${UNINSTALLLIB_LIBTYPE_SET} + !undef UNINSTALLLIB_LIBTYPE_SET + !undef ${UNINSTALLLIB_SHARED_SET} + !undef UNINSTALLLIB_SHARED_SET + !undef ${UNINSTALLLIB_UNINSTALL_SET} + !undef UNINSTALLLIB_UNINSTALL_SET + + !verbose pop + +!macroend + +!endif + +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/LogicLib.nsh b/libs/NSIS/NSIS-source/Include/LogicLib.nsh new file mode 100644 index 0000000000..9d4e614118 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/LogicLib.nsh @@ -0,0 +1,968 @@ +; NSIS LOGIC LIBRARY - LogicLib.nsh +; Version 2.6 - 08/12/2007 +; By dselkirk@hotmail.com +; and eccles@users.sf.net +; with IfNot support added by Message +; +; Questions/Comments - +; See http://forums.winamp.com/showthread.php?s=&postid=1116241 +; +; Description: +; Provides the use of various logic statements within NSIS. +; +; Usage: +; The following "statements" are available: +; If|IfNot|Unless..{ElseIf|ElseIfNot|ElseUnless}..[Else]..EndIf|EndUnless +; - Conditionally executes a block of statements, depending on the value +; of an expression. IfNot and Unless are equivalent and +; interchangeable, as are ElseIfNot and ElseUnless. +; AndIf|AndIfNot|AndUnless|OrIf|OrIfNot|OrUnless +; - Adds any number of extra conditions to If, IfNot, Unless, ElseIf, +; ElseIfNot and ElseUnless statements. +; IfThen|IfNotThen..|..| +; - Conditionally executes an inline statement, depending on the value +; of an expression. +; IfCmd..||..| +; - Conditionally executes an inline statement, depending on a true +; value of the provided NSIS function. +; Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect +; - Executes one of several blocks of statements, depending on the value +; of an expression. +; Switch..{Case|CaseElse|Default}..EndSwitch +; - Jumps to one of several labels, depending on the value of an +; expression. +; Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until] +; - Repeats a block of statements until stopped, or depending on the +; value of an expression. +; While..{ExitWhile|Continue|Break}..EndWhile +; - An alias for DoWhile..Loop (for backwards-compatibility) +; For[Each]..{ExitFor|Continue|Break}..Next +; - Repeats a block of statements varying the value of a variable. +; +; The following "expressions" are available: +; Standard (built-in) string tests (which are case-insensitive): +; a == b; a != b +; Additional case-insensitive string tests (using System.dll): +; a S< b; a S>= b; a S> b; a S<= b +; Case-sensitive string tests: +; a S== b; a S!= b +; Standard (built-in) signed integer tests: +; a = b; a <> b; a < b; a >= b; a > b; a <= b; a & b +; Standard (built-in) unsigned integer tests: +; a U< b; a U>= b; a U> b; a U<= b +; 64-bit integer tests (using System.dll): +; a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b +; ptrdiff_t integer tests +; a P= b; a P<> b; a P< b; a P>= b; a P> b; a P<= b +; size_t integer tests +; a Z= b; a Z<> b; a Z< b; a Z>= b; a Z> b; a Z<= b +; Built-in NSIS flag tests: +; ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}; ${RtlLanguage}; +; ${ShellVarContextAll} +; Built-in NSIS other tests: +; ${FileExists} a +; Complex string tests: +; a ${StartsWith} b; a ${StartsWithS} b; a ${EndsWith} b; a ${EndsWithS} b; +; a ${Contains} b; a ${ContainsS} b; ${IsLowerCase} b; ${IsUpperCase} b +; Any conditional NSIS instruction test: +; ${Cmd} a +; Section flag tests: +; ${SectionIsSelected} a; ${SectionIsSectionGroup} a; +; ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a; +; ${SectionIsReadOnly} a; ${SectionIsExpanded} a; +; ${SectionIsPartiallySelected} a +; Additional tests: +; HK ${RegKeyIsEmpty} SubKey +; +; Examples: +; See LogicLib.nsi in the Examples folder for lots of example usage. + +!verbose push +!verbose 3 +!ifndef LOGICLIB_VERBOSITY + !define LOGICLIB_VERBOSITY 3 +!endif +!define _LOGICLIB_VERBOSITY ${LOGICLIB_VERBOSITY} +!undef LOGICLIB_VERBOSITY +!verbose ${_LOGICLIB_VERBOSITY} + +!ifndef LOGICLIB + !define LOGICLIB 20260419 + !define | "'" + !define || "' '" + !define LOGICLIB_COUNTER 0 + + !include Sections.nsh + + !macro _LOGICLIB_TEMP + !ifndef _LOGICLIB_TEMP + !define _LOGICLIB_TEMP + Var /GLOBAL _LOGICLIB_TEMP ; Temporary variable to aid the more elaborate logic tests + !endif + !macroend + + !macro LogicLib_JumpToBranch _Jump _Skip + !if `${_Jump}${_Skip}` != `` + StrCmp "" "" `${_Jump}` ${_Skip} + !endif + !macroend + + !macro _IncreaseCounter + !define /redef /math LOGICLIB_COUNTER `${LOGICLIB_COUNTER}` + 1 + !macroend + + !macro _PushLogic + !insertmacro _PushScope Logic _LogicLib_Label_${LOGICLIB_COUNTER} + !insertmacro _IncreaseCounter + !macroend + + !macro _PopLogic + !insertmacro _PopScope Logic + !macroend + + !macro _PushScope Type label + !ifdef _${Type} ; If we already have a statement + !define _Cur${Type} ${_${Type}} + !undef _${Type} + !define _${Type} ${label} + !define ${_${Type}}Prev${Type} ${_Cur${Type}} ; Save the current logic + !undef _Cur${Type} + !else + !define _${Type} ${label} ; Initialise for first statement + !endif + !macroend + + !macro _PopScope Type + !ifndef _${Type} + !error "Cannot use _Pop${Type} without a preceding _Push${Type}" + !endif + !ifdef ${_${Type}}Prev${Type} ; If a previous statement was active then restore it + !define _Cur${Type} ${_${Type}} + !undef _${Type} + !define _${Type} ${${_Cur${Type}}Prev${Type}} + !undef ${_Cur${Type}}Prev${Type} + !undef _Cur${Type} + !else + !undef _${Type} + !endif + !macroend + + !macro _LogicLib_AlwaysTrue _a _b _t _f + !insertmacro LogicLib_JumpToBranch `${_t}` `${_f}` + !macroend + !macro _LogicLib_AlwaysFalse _a _b _t _f + !insertmacro LogicLib_JumpToBranch `${_f}` `${_t}` + !macroend + + ; String tests + !macro _== _a _b _t _f + StrCmp `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + + !macro _!= _a _b _t _f + !insertmacro _== `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + ; Case-sensitive string tests + !macro _S== _a _b _t _f + StrCmpS `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + + !macro _S!= _a _b _t _f + !insertmacro _S== `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + ; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case) + !macro _StrCmpI _a _b _e _l _m + !insertmacro _LOGICLIB_TEMP + System::Call `kernel32::lstrcmpi(ts, ts) i.s` `${_a}` `${_b}` + Pop $_LOGICLIB_TEMP + IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}` + !macroend + + !macro _S< _a _b _t _f + !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` + !macroend + + !macro _S>= _a _b _t _f + !insertmacro _S< `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _S> _a _b _t _f + !insertmacro _StrCmpI `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` + !macroend + + !macro _S<= _a _b _t _f + !insertmacro _S> `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + ; Integer tests + !macro _= _a _b _t _f + IntCmp `${_a}` `${_b}` `${_t}` `${_f}` `${_f}` + !macroend + + !macro _<> _a _b _t _f + !insertmacro _= `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _< _a _b _t _f + IntCmp `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` + !macroend + + !macro _>= _a _b _t _f + !insertmacro _< `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _> _a _b _t _f + IntCmp `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` + !macroend + + !macro _<= _a _b _t _f + !insertmacro _> `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _& _a _b _t _f + !insertmacro _LOGICLIB_TEMP + IntOp $_LOGICLIB_TEMP `${_a}` & `${_b}` + !insertmacro _<> $_LOGICLIB_TEMP 0 `${_t}` `${_f}` + !macroend + + ; Unsigned integer tests (NB: no need for extra equality tests) + !macro _U< _a _b _t _f + IntCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` + !macroend + + !macro _U>= _a _b _t _f + !insertmacro _U< `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _U> _a _b _t _f + IntCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` + !macroend + + !macro _U<= _a _b _t _f + !insertmacro _U> `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + ; Int64 tests + !macro _Int64Cmp _a _o _b _t _f + !insertmacro _LOGICLIB_TEMP + System::Int64Op `${_a}` `${_o}` `${_b}` + Pop $_LOGICLIB_TEMP + !insertmacro _= $_LOGICLIB_TEMP 0 `${_f}` `${_t}` + !macroend + + !macro _L= _a _b _t _f + !insertmacro _Int64Cmp `${_a}` = `${_b}` `${_t}` `${_f}` + !macroend + + !macro _L<> _a _b _t _f + !insertmacro _L= `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _L< _a _b _t _f + !insertmacro _Int64Cmp `${_a}` < `${_b}` `${_t}` `${_f}` + !macroend + + !macro _L>= _a _b _t _f + !insertmacro _L< `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + !macro _L> _a _b _t _f + !insertmacro _Int64Cmp `${_a}` > `${_b}` `${_t}` `${_f}` + !macroend + + !macro _L<= _a _b _t _f + !insertmacro _L> `${_a}` `${_b}` `${_f}` `${_t}` + !macroend + + ; ptrdiff_t & size_t tests + !macro LogicLib_PtrDiffTest _o _a _b _t _f + !if "${NSIS_PTR_SIZE}" <= 4 + !insertmacro _${_o} `${_a}` `${_b}` `${_t}` `${_f}` + !else + !insertmacro _L${_o} `${_a}` `${_b}` `${_t}` `${_f}` + !endif + !macroend + !macro _P= _a _b _t _f + !insertmacro LogicLib_PtrDiffTest = `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _P<> _a _b _t _f + !insertmacro LogicLib_PtrDiffTest <> `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _P< _a _b _t _f + !insertmacro LogicLib_PtrDiffTest < `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _P>= _a _b _t _f + !insertmacro LogicLib_PtrDiffTest >= `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _P> _a _b _t _f + !insertmacro LogicLib_PtrDiffTest > `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _P<= _a _b _t _f + !insertmacro LogicLib_PtrDiffTest <= `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !include Util.nsh + !macro _Z= _a _b _t _f + !insertmacro LogicLib_PtrDiffTest = `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _Z<> _a _b _t _f + !insertmacro LogicLib_PtrDiffTest <> `${_a}` `${_b}` `${_t}` `${_f}` + !macroend + !macro _Z< _a _b _t _f + !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_f}` `${_t}` `${_f}` + !macroend + !macro _Z>= _a _b _t _f + !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_t}` `${_f}` `${_t}` + !macroend + !macro _Z> _a _b _t _f + !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_f}` `${_f}` `${_t}` + !macroend + !macro _Z<= _a _b _t _f + !insertmacro IntPtrCmpU `${_a}` `${_b}` `${_t}` `${_t}` `${_f}` + !macroend + + ; Flag tests + !macro _Abort _a _b _t _f + IfAbort `${_t}` `${_f}` + !macroend + !define Abort `"" Abort ""` + + !macro _Errors _a _b _t _f + IfErrors `${_t}` `${_f}` + !macroend + !define Errors `"" Errors ""` + + !macro _FileExists _a _b _t _f + IfFileExists `${_b}` `${_t}` `${_f}` + !macroend + !define FileExists `"" FileExists` + + !macro _RebootFlag _a _b _t _f + IfRebootFlag `${_t}` `${_f}` + !macroend + !define RebootFlag `"" RebootFlag ""` + + !macro _Silent _a _b _t _f + IfSilent `${_t}` `${_f}` + !macroend + !define Silent `"" Silent ""` + + !macro _ShellVarContextAll _a _b _t _f + IfShellVarContextAll `${_t}` `${_f}` + !macroend + !define ShellVarContextAll `"" ShellVarContextAll ""` + + !macro _RtlLanguage _a _b _t _f + IfRtlLanguage `${_t}` `${_f}` + !macroend + !define RtlLanguage `"" RtlLanguage ""` + + !macro _AltRegView _a _b _t _f + IfAltRegView `${_t}` `${_f}` + !macroend + !define AltRegView `"" AltRegView ""` + + ; Complex string tests + !macro _LL_StartsWith _op _a _b _t _f + !insertmacro _LOGICLIB_TEMP + StrLen $_LOGICLIB_TEMP `${_b}` + StrCpy $_LOGICLIB_TEMP `${_a}` $_LOGICLIB_TEMP + ${_op} $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` + !macroend + !define StartsWith `"LL_StartsWith StrCmp"` + !define StartsWithS `"LL_StartsWith StrCmpS"` + + !macro _LL_EndsWith _op _a _b _t _f + !insertmacro _LOGICLIB_TEMP + StrLen $_LOGICLIB_TEMP `${_b}` + StrCpy $_LOGICLIB_TEMP `${_a}` "" -$_LOGICLIB_TEMP + ${_op} $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` + !macroend + !define EndsWith `"LL_EndsWith StrCmp"` + !define EndsWithS `"LL_EndsWith StrCmpS"` + + !macro _LL_StrContains _op _a _b _t _f + !insertmacro _LOGICLIB_TEMP + Push $0 + Push $1 + Push $2 + StrCpy $0 `${_b}` + StrCpy $1 `${_a}` + StrLen $_LOGICLIB_TEMP $0 + _LL${LOGICLIB_COUNTER}_Loop: + StrCpy $2 $1 $_LOGICLIB_TEMP + StrCmp $2 "" _LL${LOGICLIB_COUNTER}_Done + StrCpy $1 $1 "" 1 + ${_op} $2 $0 ""_LL${LOGICLIB_COUNTER}_Loop + StrCpy $_LOGICLIB_TEMP "" + _LL${LOGICLIB_COUNTER}_Done: + Pop $2 + Pop $1 + Pop $0 + StrCmp $_LOGICLIB_TEMP "" `${_t}` `${_f}` + !insertmacro _IncreaseCounter + !macroend + !define Contains `"LL_StrContains StrCmp"` + !define ContainsS `"LL_StrContains StrCmpS"` + + !macro _LL_IsCase _func _a _b _t _f + !insertmacro _LOGICLIB_TEMP + System::Call USER32::${_func}(tss) `${_b}` + Pop $_LOGICLIB_TEMP + StrCmpS $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` + !macroend + !define IsLowerCase `"" "LL_IsCase CharLower"` + !define IsUpperCase `"" "LL_IsCase CharUpper"` + + ; Registry tests + !macro _RegKeyIsEmpty _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ClearErrors + EnumRegValue $_LOGICLIB_TEMP ${_a} `${_b}` "" + !if `${_f}` != `` + IfErrors "" `${_f}` ; Skip calls to EnumRegKey and _== if possible + !else + IfErrors +3 + StrCpy $_LOGICLIB_TEMP "1" ; The default value is also named "", make sure we don't mistake it as empty + Goto +2 + !endif + EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` "" + !insertmacro _== $_LOGICLIB_TEMP "" `${_t}` `${_f}` + !macroend + !define RegKeyIsEmpty `RegKeyIsEmpty` + + ; "Any instruction" test + !macro _Cmd _a _b _t _f + !define _t=${_t} + !ifdef _t= ; If no true label then make one + !define __t _LogicLib_Label_${LOGICLIB_COUNTER} + !insertmacro _IncreaseCounter + !else + !define __t ${_t} + !endif + ${_b} ${__t} + !define _f=${_f} + !ifndef _f= ; If a false label then go there + Goto ${_f} + !endif + !undef _f=${_f} + !ifdef _t= ; If we made our own true label then place it + ${__t}: + !endif + !undef __t + !undef _t=${_t} + !macroend + !define Cmd `"" Cmd` + + ; Section flag test + !macro _SectionFlagIsSet _a _b _t _f + !insertmacro _LOGICLIB_TEMP + SectionGetFlags `${_b}` $_LOGICLIB_TEMP + IntOp $_LOGICLIB_TEMP $_LOGICLIB_TEMP & `${_a}` + !insertmacro _= $_LOGICLIB_TEMP `${_a}` `${_t}` `${_f}` + !macroend + !define SectionIsSelected `${SF_SELECTED} SectionFlagIsSet` + !define SectionIsSubSection `${SF_SUBSEC} SectionFlagIsSet` + !define SectionIsSubSectionEnd `${SF_SUBSECEND} SectionFlagIsSet` + !define SectionIsSectionGroup `${SF_SECGRP} SectionFlagIsSet` + !define SectionIsSectionGroupEnd `${SF_SECGRPEND} SectionFlagIsSet` + !define SectionIsBold `${SF_BOLD} SectionFlagIsSet` + !define SectionIsReadOnly `${SF_RO} SectionFlagIsSet` + !define SectionIsExpanded `${SF_EXPAND} SectionFlagIsSet` + !define SectionIsPartiallySelected `${SF_PSELECTED} SectionFlagIsSet` + + !define IfCmd `!insertmacro _IfThen "" Cmd ${|}` + + !macro _If _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !insertmacro _PushLogic + !define ${_Logic}If + !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the Else + !insertmacro _IncreaseCounter + !define _c=${_c} + !ifdef _c=true ; If is true + !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" + !endif + !undef _c=${_c} + !verbose pop + !macroend + !define If `!insertmacro _If true` + !define Unless `!insertmacro _If false` + !define IfNot `!insertmacro _If false` + + !macro _And _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}If + !error "Cannot use And without a preceding If or IfNot/Unless" + !endif + !ifndef ${_Logic}Else + !error "Cannot use And following an Else" + !endif + !define _c=${_c} + !ifdef _c=true ; If is true + !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" + !endif + !undef _c=${_c} + !verbose pop + !macroend + !define AndIf `!insertmacro _And true` + !define AndUnless `!insertmacro _And false` + !define AndIfNot `!insertmacro _And false` + + !macro _Or _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}If + !error "Cannot use Or without a preceding If or IfNot/Unless" + !endif + !ifndef ${_Logic}Else + !error "Cannot use Or following an Else" + !endif + !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Skip this test as we already + !insertmacro _IncreaseCounter + Goto ${_label} ; have a successful result + ${${_Logic}Else}: ; Place the Else label + !undef ${_Logic}Else ; and remove it + !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If + !insertmacro _IncreaseCounter + !define _c=${_c} + !ifdef _c=true ; If is true + !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" + !endif + !undef _c=${_c} + ${_label}: + !undef _label + !verbose pop + !macroend + !define OrIf `!insertmacro _Or true` + !define OrUnless `!insertmacro _Or false` + !define OrIfNot `!insertmacro _Or false` + + !macro _Else + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}If + !error "Cannot use Else without a preceding If or IfNot/Unless" + !endif + !ifndef ${_Logic}Else + !error "Cannot use Else following an Else" + !endif + !ifndef ${_Logic}EndIf ; First Else for this If? + !define ${_Logic}EndIf _LogicLib_EndIfLabel_${LOGICLIB_COUNTER} ; Get a label for the EndIf + !insertmacro _IncreaseCounter + !endif + Goto ${${_Logic}EndIf} ; Go to the EndIf + ${${_Logic}Else}: ; Place the Else label + !undef ${_Logic}Else ; and remove it + !verbose pop + !macroend + !define Else `!insertmacro _Else` + + !macro _ElseIf _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${Else} ; Perform the Else + !define ${_Logic}Else _LogicLib_ElseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new If + !insertmacro _IncreaseCounter + !define _c=${_c} + !ifdef _c=true ; If is true + !insertmacro _${_o} `${_a}` `${_b}` "" ${${_Logic}Else} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}Else} "" + !endif + !undef _c=${_c} + !verbose pop + !macroend + !define ElseIf `!insertmacro _ElseIf true` + !define ElseUnless `!insertmacro _ElseIf false` + !define ElseIfNot `!insertmacro _ElseIf false` + + !macro _EndIf _n + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}If + !error "Cannot use End${_n} without a preceding If or IfNot/Unless" + !endif + !ifdef ${_Logic}Else + ${${_Logic}Else}: ; Place the Else label + !undef ${_Logic}Else ; and remove it + !endif + !ifdef ${_Logic}EndIf + ${${_Logic}EndIf}: ; Place the EndIf + !undef ${_Logic}EndIf ; and remove it + !endif + !undef ${_Logic}If + !insertmacro _PopLogic + !verbose pop + !macroend + !define EndIf `!insertmacro _EndIf If` + !define EndUnless `!insertmacro _EndIf Unless` + + !macro _IfThen _a _o _b _t + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${If} `${_a}` `${_o}` `${_b}` + ${_t} + ${EndIf} + !verbose pop + !macroend + !define IfThen `!insertmacro _IfThen` + + !macro _IfNotThen _a _o _b _t + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${IfNot} `${_a}` `${_o}` `${_b}` + ${_t} + ${EndIf} + !verbose pop + !macroend + !define IfNotThen `!insertmacro _IfNotThen` + + !macro _ForEach _v _f _t _o _s + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + StrCpy "${_v}" "${_f}" ; Assign the initial value + Goto +2 ; Skip the loop expression for the first iteration + !define _DoLoopExpression `IntOp "${_v}" "${_v}" "${_o}" "${_s}"` ; Define the loop expression + !define _o=${_o} + !ifdef _o=+ ; Check the loop expression operator + !define __o > ; to determine the correct loop condition + !else ifdef _o=- + !define __o < + !else + !error "Unsupported ForEach step operator (must be + or -)" + !endif + !undef _o=${_o} + !insertmacro _Do For false `${_v}` `${__o}` `${_t}` ; Let Do do the rest + !undef __o + !verbose pop + !macroend + !define ForEach `!insertmacro _ForEach` + + !macro _For _v _f _t + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${ForEach} `${_v}` `${_f}` `${_t}` + 1 ; Pass on to ForEach + !verbose pop + !macroend + !define For `!insertmacro _For` + + !define ExitFor `!insertmacro _Goto ExitFor For` + + !define Next `!insertmacro _Loop For Next "" "" "" ""` + + !define While `!insertmacro _Do While true` + + !define ExitWhile `!insertmacro _Goto ExitWhile While` + + !define EndWhile `!insertmacro _Loop While EndWhile "" "" "" ""` + + !macro _Do _n _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !insertmacro _PushLogic + !define ${_Logic}${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the start of the loop + !insertmacro _IncreaseCounter + ${${_Logic}${_n}}: + !insertmacro _PushScope Exit${_n} _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the loop + !insertmacro _IncreaseCounter + !insertmacro _PushScope Break ${_Exit${_n}} ; Break goes to the end of the loop + !ifdef _DoLoopExpression + ${_DoLoopExpression} ; Special extra parameter for inserting code + !undef _DoLoopExpression ; between the Continue label and the loop condition + !endif + !define _c=${_c} + !ifdef _c= ; No starting condition + !insertmacro _PushScope Continue _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for Continue at the end of the loop + !insertmacro _IncreaseCounter + !else + !insertmacro _PushScope Continue ${${_Logic}${_n}} ; Continue goes to the start of the loop + !ifdef _c=true ; If is true + !insertmacro _${_o} `${_a}` `${_b}` "" ${_Exit${_n}} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} "" + !endif + !endif + !undef _c=${_c} + !define ${_Logic}Condition ${_c} ; Remember the condition used + !verbose pop + !macroend + !define Do `!insertmacro _Do Do "" "" "" ""` + !define DoWhile `!insertmacro _Do Do true` + !define DoUntil `!insertmacro _Do Do false` + + !macro _Goto _n _s + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _${_n} + !error "Cannot use ${_n} without a preceding ${_s}" + !endif + Goto ${_${_n}} + !verbose pop + !macroend + !define ExitDo `!insertmacro _Goto ExitDo Do` + + !macro _Loop _n _e _c _a _o _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}${_n} + !error "Cannot use ${_e} without a preceding ${_n}" + !endif + !define _c=${${_Logic}Condition} + !ifdef _c= ; If Do had no condition place the Continue label + ${_Continue}: + !endif + !undef _c=${${_Logic}Condition} + !define _c=${_c} + !ifdef _c= ; No ending condition + Goto ${${_Logic}${_n}} + !else ifdef _c=true ; If condition is true + !insertmacro _${_o} `${_a}` `${_b}` ${${_Logic}${_n}} ${_Exit${_n}} + !else ; If condition is false + !insertmacro _${_o} `${_a}` `${_b}` ${_Exit${_n}} ${${_Logic}${_n}} + !endif + !undef _c=${_c} + Goto ${_Continue} ; Just to ensure it is referenced at least once + Goto ${_Exit${_n}} ; Just to ensure it is referenced at least once + ${_Exit${_n}}: ; Place the loop exit point + !undef ${_Logic}Condition + !insertmacro _PopScope Continue + !insertmacro _PopScope Break + !insertmacro _PopScope Exit${_n} + !undef ${_Logic}${_n} + !insertmacro _PopLogic + !verbose pop + !macroend + !define Loop `!insertmacro _Loop Do Loop "" "" "" ""` + !define LoopWhile `!insertmacro _Loop Do LoopWhile true` + !define LoopUntil `!insertmacro _Loop Do LoopUntil false` + + !define Continue `!insertmacro _Goto Continue "For or Do or While"` + !define Break `!insertmacro _Goto Break "For or Do or While"` + + !macro _Select _a + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !insertmacro _PushLogic + !define ${_Logic}Select `${_a}` ; Remember the left hand side of the comparison + !verbose pop + !macroend + !define Select `!insertmacro _Select` + + !macro _Select_CaseElse + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}Select + !error "Cannot use Case without a preceding Select" + !endif + !ifdef ${_Logic}EndSelect ; This is set only after the first case + !ifndef ${_Logic}Else + !error "Cannot use Case following a CaseElse" + !endif + Goto ${${_Logic}EndSelect} ; Go to EndSelect (Ends the previous Case) + !define /IfNDef _LogicLib_EndSelectLabelUsed_${_Logic} + ${${_Logic}Else}: ; Place the Else label + !undef ${_Logic}Else ; and remove it + !else + !define ${_Logic}EndSelect _LogicLib_EndSelectLabel_${LOGICLIB_COUNTER} ; Get a label for the EndSelect + !insertmacro _IncreaseCounter + !endif + !verbose pop + !macroend + !define CaseElse `!insertmacro _CaseElse` + !define Case_Else `!insertmacro _CaseElse` ; Compatibility with 2.2 and earlier + !define Default `!insertmacro _CaseElse` ; For the C-minded + + !macro _Select_Case _a + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${CaseElse} ; Perform the CaseElse + !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case + !insertmacro _IncreaseCounter + !insertmacro _== `${${_Logic}Select}` `${_a}` "" ${${_Logic}Else} + !verbose pop + !macroend + !define Case `!insertmacro _Case` + + !macro _Case2 _a _b + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${CaseElse} ; Perform the CaseElse + !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case + !insertmacro _IncreaseCounter + !insertmacro _== `${${_Logic}Select}` `${_a}` +2 "" + !insertmacro _== `${${_Logic}Select}` `${_b}` "" ${${_Logic}Else} + !verbose pop + !macroend + !define Case2 `!insertmacro _Case2` + + !macro _Case3 _a _b _c + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${CaseElse} ; Perform the CaseElse + !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case + !insertmacro _IncreaseCounter + !insertmacro _== `${${_Logic}Select}` `${_a}` +3 "" + !insertmacro _== `${${_Logic}Select}` `${_b}` +2 "" + !insertmacro _== `${${_Logic}Select}` `${_c}` "" ${${_Logic}Else} + !verbose pop + !macroend + !define Case3 `!insertmacro _Case3` + + !macro _Case4 _a _b _c _d + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${CaseElse} ; Perform the CaseElse + !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case + !insertmacro _IncreaseCounter + !insertmacro _== `${${_Logic}Select}` `${_a}` +4 "" + !insertmacro _== `${${_Logic}Select}` `${_b}` +3 "" + !insertmacro _== `${${_Logic}Select}` `${_c}` +2 "" + !insertmacro _== `${${_Logic}Select}` `${_d}` "" ${${_Logic}Else} + !verbose pop + !macroend + !define Case4 `!insertmacro _Case4` + + !macro _Case5 _a _b _c _d _e + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + ${CaseElse} ; Perform the CaseElse + !define ${_Logic}Else _LogicLib_NextSelectCaseLabel_${LOGICLIB_COUNTER} ; Get a label for the next Else and perform the new Case + !insertmacro _IncreaseCounter + !insertmacro _== `${${_Logic}Select}` `${_a}` +5 "" + !insertmacro _== `${${_Logic}Select}` `${_b}` +4 "" + !insertmacro _== `${${_Logic}Select}` `${_c}` +3 "" + !insertmacro _== `${${_Logic}Select}` `${_d}` +2 "" + !insertmacro _== `${${_Logic}Select}` `${_e}` "" ${${_Logic}Else} + !verbose pop + !macroend + !define Case5 `!insertmacro _Case5` + + !macro _EndSelect + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}Select + !error "Cannot use EndSelect without a preceding Select" + !endif + !ifdef ${_Logic}Else + ${${_Logic}Else}: ; Place the Else label + !undef ${_Logic}Else ; and remove it + !endif + !ifdef ${_Logic}EndSelect ; This won't be set if there weren't any cases + !ifdef _LogicLib_EndSelectLabelUsed_${_Logic} ; There is no jump to ${${_Logic}EndSelect}: if there is only one Case + ${${_Logic}EndSelect}: ; Place the EndSelect + !undef _LogicLib_EndSelectLabelUsed_${_Logic} + !endif + !undef ${_Logic}EndSelect ; and remove it + !endif + !undef ${_Logic}Select + !insertmacro _PopLogic + !verbose pop + !macroend + !define EndSelect `!insertmacro _EndSelect` + + !macro _Switch _a + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !insertmacro _PushLogic + !insertmacro _PushScope Switch ${_Logic} ; Keep a separate stack for switch data + !insertmacro _PushScope Break _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for beyond the end of the switch + !insertmacro _IncreaseCounter + !define ${_Switch}Var `${_a}` ; Remember the left hand side of the comparison + !ifdef LL_NOAPPENDMEMFILE + !tempfile ${_Switch}Tmp ; Create a temporary file + !if "${NSIS_CHAR_SIZE}" > 1 + !appendfile /CHARSET=UTF8SIG "${${_Switch}Tmp}" "" ; Make sure the file uses Unicode + !endif + !else + !appendmemfile ${_Switch}Tmp ; Create a temporary file + !endif + !define ${_Logic}Switch _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the end of the switch + !insertmacro _IncreaseCounter + Goto ${${_Logic}Switch} ; and go there + !verbose pop + !macroend + !define Switch `!insertmacro _Switch` + + !macro _Case _a + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifdef _Logic & ${_Logic}Select ; Check for an active Select + !insertmacro _Select_Case `${_a}` + !else ifndef _Switch ; If not then check for an active Switch + !error "Cannot use Case without a preceding Select or Switch" + !else + !define _label _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for this case, + !insertmacro _IncreaseCounter + ${_label}: ; place it and add it's check to the temp file + !ifdef LL_NOAPPENDMEMFILE + !appendfile "${${_Switch}Tmp}" `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n` + !else + !appendmemfile ${_Switch}Tmp `!insertmacro _== $\`${${_Switch}Var}$\` $\`${_a}$\` ${_label} ""$\n` + !endif + !undef _label + !endif + !verbose pop + !macroend + + !macro _CaseElse + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifdef _Logic & ${_Logic}Select ; Check for an active Select + !insertmacro _Select_CaseElse + !else ifndef _Switch ; If not then check for an active Switch + !error "Cannot use Case without a preceding Select or Switch" + !else ifdef ${_Switch}Else ; Already had a default case? + !error "Cannot use CaseElse following a CaseElse" + !else + !define ${_Switch}Else _LogicLib_Label_${LOGICLIB_COUNTER} ; Get a label for the default case, + !insertmacro _IncreaseCounter + ${${_Switch}Else}: ; and place it + !endif + !verbose pop + !macroend + + !macro _EndSwitch + !verbose push + !verbose ${LOGICLIB_VERBOSITY} + !ifndef _Logic | ${_Logic}Switch + !error "Cannot use EndSwitch without a preceding Switch" + !endif + Goto ${_Break} ; Skip the jump table + ${${_Logic}Switch}: ; Place the end of the switch + !undef ${_Logic}Switch + !ifdef LL_NOAPPENDMEMFILE + !include "${${_Switch}Tmp}" ; Include the jump table + !delfile "${${_Switch}Tmp}" ; and delete it + !undef ${_Switch}Tmp + !else + !include /memfile ${_Switch}Tmp ; Include the jump table + !appendmemfile '' ${_Switch}Tmp ; and delete it + !endif + !ifdef ${_Switch}Else ; Was there a default case? + Goto ${${_Switch}Else} ; then go there if all else fails + !undef ${_Switch}Else + !endif + !undef ${_Switch}Var + ${_Break}: ; Place the break label + !insertmacro _PopScope Break + !insertmacro _PopScope Switch + !insertmacro _PopLogic + !verbose pop + !macroend + !define EndSwitch `!insertmacro _EndSwitch` + +!endif ; LOGICLIB +!verbose 3 +!define LOGICLIB_VERBOSITY ${_LOGICLIB_VERBOSITY} +!undef _LOGICLIB_VERBOSITY +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/MUI.nsh b/libs/NSIS/NSIS-source/Include/MUI.nsh new file mode 100644 index 0000000000..c2b2a71cd1 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/MUI.nsh @@ -0,0 +1 @@ +!include "${NSISDIR}\Contrib\Modern UI\System.nsh" \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/MUI2.nsh b/libs/NSIS/NSIS-source/Include/MUI2.nsh new file mode 100644 index 0000000000..0e76adbf21 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/MUI2.nsh @@ -0,0 +1 @@ +!include "${NSISDIR}\Contrib\Modern UI 2\MUI2.nsh" \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/Memento.nsh b/libs/NSIS/NSIS-source/Include/Memento.nsh new file mode 100644 index 0000000000..1c277122b2 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Memento.nsh @@ -0,0 +1,570 @@ +!verbose push +!verbose 3 + +!include LogicLib.nsh +!include Sections.nsh + +!ifndef ___MEMENTO_NSH___ +!define ___MEMENTO_NSH___ + +##################################### +### Memento ### +##################################### + +/* + +Memento is a set of macros that allow installers to remember user selection +across separate runs of the installer. Currently, it can remember the state +of sections and mark new sections as bold. In the future, it'll integrate +InstallOptions and maybe even the Modern UI. + +A usage example can be found in `Examples\Memento.nsi`. + +*/ + +##################################### +### Usage Instructions ### +##################################### + +/* + +1. Declare usage of Memento by including Memento.nsh at the top of the script. + + !include Memento.nsh + +2. Define MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY with the a registry key + where sections' state should be saved. + + !define MEMENTO_REGISTRY_ROOT HKLM + !define MEMENTO_REGISTRY_KEY \ + Software\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram + +3. Replace Section with ${MementoSection} and SectionEnd with ${MementoSectionEnd} + for sections that whose state should be remembered by Memento. + + For sections that should be unselected by default, use ${MementoSection}'s + brother - ${MementoUnselectedSection}. + + Sections that don't already have an identifier must be assigned one. + + Section identifiers must stay the same across different versions of the + installer or their state will be forgotten. + +4. Use ${MementoSectionDone} after the last ${MementoSection}. + +5. Add a call to ${MementoSectionRestore} to .onInit to restore the state + of all sections from the registry. + + Function .onInit + + ${MementoSectionRestore} + + FunctionEnd + +6. Add a call to ${MementoSectionSave} to .onInstSuccess to save the state + of all sections to the registry. + + Function .onInstSuccess + + ${MementoSectionSave} + + FunctionEnd + +7. Tattoo the location of the chosen registry key on your arm. + +*/ + +##################################### +### User API ### +##################################### + +; +; ${MementoSection} +; +; Defines a section whose state is remembered by Memento. +; +; Usage is similar to Section. +; +; ${MementoSection} "name" "id" +; +; ${MementoSectionEx} "[flags]" "name" "memento_id" "section_id" +; + +!define MementoSection "!insertmacro MementoSection" +!define MementoSectionEx "!insertmacro MementoSectionEx" + +; +; ${MementoSectionEnd} +; +; Ends a section previously opened using ${MementoSection}. +; +; Usage is similar to SectionEnd. +; +; ${MementoSection} "name" "id" +; # some code... +; ${MementoSectionEnd} +; + +; +; ${MementoUnselectedSection} +; +; Defines a section whose state is remembered by Memento and is +; unselected by default. +; +; Usage is similar to Section with the /o switch. +; +; ${MementoUnselectedSection} "name" "id" +; + +!define MementoUnselectedSection "!insertmacro MementoUnselectedSection" + +; +; ${MementoSectionEnd} +; +; Ends a section previously opened using ${MementoSection}. +; +; Usage is similar to SectionEnd. +; +; ${MementoSection} "name" "id" +; # some code... +; ${MementoSectionEnd} +; + +!define MementoSectionEnd "!insertmacro MementoSectionEnd" + +; +; ${MementoSectionDone} +; +; Used after all ${MementoSection} have been set. +; +; ${MementoSection} "name1" "some_id1" +; # some code... +; ${MementoSectionEnd} +; +; ${MementoSection} "name2" "some_id2" +; # some code... +; ${MementoSectionEnd} +; +; ${MementoSection} "name3" "some_id3" +; # some code... +; ${MementoSectionEnd} +; +; ${MementoSectionDone} +; + +!define MementoSectionDone "!insertmacro MementoSectionDone" + +; +; ${MementoSectionRestore} +; +; Restores the state of all Memento sections from the registry. +; +; Commonly used in .onInit. +; +; Function .onInit +; +; ${MementoSectionRestore} +; +; FunctionEnd +; + +!define MementoSectionRestore "!insertmacro MementoSectionRestore" + +; +; ${MementoSectionSave} +; +; Saves the state of all Memento sections to the registry. +; +; Commonly used in .onInstSuccess. +; +; Function .onInstSuccess +; +; ${MementoSectionSave} +; +; FunctionEnd +; + +!define MementoSectionSave "!insertmacro MementoSectionSave" + +; +; MementoSection +; +; Replaceable macros that allow custom storage methods to be used. +; +!define /IfNDef MementoSectionStorageSeparator '_' + +!ifmacrondef MementoSectionReadInt +!define __MementoSectionStdRegReadWrite +!define /IfNDef MementoSectionStoragePrefix "MementoSection" + +!macro MementoSectionReadInt outvar name +ReadRegDWord ${outvar} ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` +!macroend + +!macro MementoSectionWriteInt name val +WriteRegDWord ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` `${val}` +!macroend + +!macro MementoSectionReadMarker outvar name +ReadRegStr ${outvar} ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` +!macroend + +!macro MementoSectionWriteMarker name +WriteRegStr ${MEMENTO_REGISTRY_ROOT} `${MEMENTO_REGISTRY_KEY}` `${MementoSectionStoragePrefix}${name}` `` +!macroend + +!endif + +##################################### +### Internal Defines ### +##################################### + +!define __MementoSectionIndex 1 + +##################################### +### Internal Macros ### +##################################### + +!macro __MementoCheckSettings + + !ifdef __MementoSectionStdRegReadWrite + !ifndef MEMENTO_REGISTRY_ROOT | MEMENTO_REGISTRY_KEY + + !error "MEMENTO_REGISTRY_ROOT and MEMENTO_REGISTRY_KEY must be defined before using any of Memento's macros" + + !endif + !endif + +!macroend + +!macro __MementoSection flags name mementoid sectionid + + !insertmacro __MementoCheckSettings + + !ifndef __MementoSectionIndex + + !error "MementoSectionDone already used!" + + !endif + + !define __MementoSectionLastMementoId `${mementoid}` + !define __MementoSectionLastSectionId `${sectionid}` + !define __MementoSectionLastFlags `${flags}` + + !verbose pop + + Section ${flags} `${name}` `${sectionid}` + + !verbose push + !verbose 3 + +!macroend + +##################################### +### User Macros ### +##################################### + +!macro MementoSectionEx flags name mid sid + + !verbose push 3 + + !insertmacro __MementoSection `${flags}` `${name}` `${mid}` `${sid}` + + !verbose pop + +!macroend + +!macro MementoSection name id + + !verbose push 3 + + !insertmacro __MementoSection "" `${name}` `${id}` `${id}` + + !verbose pop + +!macroend + +!macro MementoUnselectedSection name id + + !verbose push 3 + + !insertmacro __MementoSection /o `${name}` `${id}` `${id}` + + !verbose pop + +!macroend + +!macro MementoSectionEnd + + SectionEnd + + !verbose push + !verbose 3 + + !insertmacro __MementoCheckSettings + + !ifndef __MementoSectionIndex + + !error "MementoSectionDone already used!" + + !endif + + !define /MATH __MementoSectionIndexNext \ + ${__MementoSectionIndex} + 1 + + Function __MementoSectionMarkNew${__MementoSectionIndex} + + ClearErrors + !insertmacro MementoSectionReadInt $0 `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` + + ${If} ${Errors} + + !insertmacro SetSectionFlag `${${__MementoSectionLastSectionId}}` ${SF_BOLD} + + ${EndIf} + + GetFunctionAddress $0 __MementoSectionMarkNew${__MementoSectionIndexNext} + Goto $0 + + FunctionEnd + + Function __MementoSectionRestoreStatus${__MementoSectionIndex} + + ClearErrors + !insertmacro MementoSectionReadInt $0 `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` + + !searchparse /ignorecase /noerrors `${__MementoSectionLastFlags}-` `/o` __MementoSectionUnselected + + !ifndef __MementoSectionUnselected + + ${If} ${Errors} + ${OrIf} $0 != 0 + + !insertmacro SelectSection `${${__MementoSectionLastSectionId}}` + + ${Else} + + !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}` + + ${EndIf} + + !else + + !undef __MementoSectionUnselected + + ${If} ${Errors} + ${OrIf} $0 == 0 + + !insertmacro UnselectSection `${${__MementoSectionLastSectionId}}` + + ${Else} + + !insertmacro SelectSection `${${__MementoSectionLastSectionId}}` + + ${EndIf} + + !endif + + GetFunctionAddress $0 __MementoSectionRestoreStatus${__MementoSectionIndexNext} + Goto $0 + + FunctionEnd + + Function __MementoSectionSaveStatus${__MementoSectionIndex} + + ${If} ${SectionIsSelected} `${${__MementoSectionLastSectionId}}` + + !insertmacro MementoSectionWriteInt `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` 1 + + ${Else} + + !insertmacro MementoSectionWriteInt `${MementoSectionStorageSeparator}${__MementoSectionLastMementoId}` 0 + + ${EndIf} + + GetFunctionAddress $0 __MementoSectionSaveStatus${__MementoSectionIndexNext} + Goto $0 + + FunctionEnd + + !undef __MementoSectionIndex + !define __MementoSectionIndex ${__MementoSectionIndexNext} + !undef __MementoSectionIndexNext + + !undef __MementoSectionLastMementoId + !undef __MementoSectionLastSectionId + !undef __MementoSectionLastFlags + + !verbose pop + +!macroend + +!macro MementoSectionDone + + !verbose push + !verbose 3 + + !insertmacro __MementoCheckSettings + + Function __MementoSectionMarkNew${__MementoSectionIndex} + FunctionEnd + + Function __MementoSectionRestoreStatus${__MementoSectionIndex} + FunctionEnd + + Function __MementoSectionSaveStatus${__MementoSectionIndex} + FunctionEnd + + !undef __MementoSectionIndex + + !verbose pop + +!macroend + +!macro MementoSectionRestore + + !verbose push + !verbose 3 + + !insertmacro __MementoCheckSettings + + Push $0 + Push $1 + Push $2 + Push $3 + + # check for first usage + + ClearErrors + !insertmacro MementoSectionReadMarker $0 `Used` + + ${If} ${Errors} + + # use script defaults on first run + Goto done + + ${EndIf} + + # mark new components in bold + + Call __MementoSectionMarkNew1 + + # mark section groups in bold + + StrCpy $0 0 + StrCpy $1 "" + StrCpy $2 "" + StrCpy $3 "" + + loop: + + ClearErrors + + ${If} ${SectionIsBold} $0 + + ${If} $1 != "" + + !insertmacro SetSectionFlag $1 ${SF_BOLD} + + ${EndIf} + + ${If} $2 != "" + + !insertmacro SetSectionFlag $2 ${SF_BOLD} + + ${EndIf} + + ${If} $3 != "" + + !insertmacro SetSectionFlag $3 ${SF_BOLD} + + ${EndIf} + + ${ElseIf} ${Errors} + + Goto loop_end + + ${EndIf} + + ${If} ${SectionIsSectionGroup} $0 + + ${If} $1 == "" + + StrCpy $1 $0 + + ${ElseIf} $2 == "" + + StrCpy $2 $0 + + ${ElseIf} $3 == "" + + StrCpy $3 $0 + + ${EndIf} + + ${EndIf} + + ${If} ${SectionIsSectionGroupEnd} $0 + + ${If} $3 != "" + + StrCpy $3 "" + + ${ElseIf} $2 != "" + + StrCpy $2 "" + + ${ElseIf} $1 != "" + + StrCpy $1 "" + + ${EndIf} + + ${EndIf} + + IntOp $0 $0 + 1 + + Goto loop + loop_end: + + # restore sections' status + + Call __MementoSectionRestoreStatus1 + + # all done + + done: + + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop + +!macroend + +!macro MementoSectionSave + + !verbose push + !verbose 3 + + !insertmacro __MementoCheckSettings + + Push $0 + + !insertmacro MementoSectionWriteMarker `Used` + + Call __MementoSectionSaveStatus1 + + Pop $0 + + !verbose pop + +!macroend + + + +!endif # ___MEMENTO_NSH___ + +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/MultiUser.nsh b/libs/NSIS/NSIS-source/Include/MultiUser.nsh new file mode 100644 index 0000000000..cda418ef90 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/MultiUser.nsh @@ -0,0 +1,505 @@ +/* + +MultiUser.nsh + +Installer configuration for multi-user Windows environments + +Copyright 2008-2026 Joost Verburg + +*/ + +!ifndef MULTIUSER_INCLUDED +!define MULTIUSER_INCLUDED 20210216 +!verbose push 3 + +;Standard NSIS header files + +!ifdef MULTIUSER_MUI + !include MUI2.nsh +!endif +!include LogicLib.nsh +!include WinVer.nsh +!include FileFunc.nsh + +!if ${NSIS_PTR_SIZE} > 4 +!define /IfNDef MULTIUSER_MINWIN 0x501 +!else +!define /IfNDef MULTIUSER_MINWIN 0x400 +!endif + +;Variables + +Var MultiUser.Privileges +Var MultiUser.InstallMode + +;Command line installation mode setting + +!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE + !include StrFunc.nsh + ${Using:StrFunc} StrStr + !ifndef MULTIUSER_NOUNINSTALL + ${Using:StrFunc} UnStrStr + !endif + + Var MultiUser.Parameters + Var MultiUser.Result +!endif + +;Installation folder stored in registry + +!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + Var MultiUser.InstDir +!endif + +!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME + Var MultiUser.DefaultKeyValue +!endif + +;Windows Vista UAC setting + +!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin + RequestExecutionLevel admin + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power + RequestExecutionLevel admin + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest + RequestExecutionLevel highest + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else + RequestExecutionLevel user + !ifndef MULTIUSER_EXECUTIONLEVEL + !warning "MULTIUSER_EXECUTIONLEVEL not set!" + !endif +!endif + +/* + +Install modes + +*/ + +!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Install mode initialization - per-machine + + ${ifnot} ${IsNT} + ${orif} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + + StrCpy $MultiUser.InstallMode AllUsers + + SetShellVarContext all + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + !ifdef MULTIUSER_INSTALLMODE_INSTDIR + !ifdef MULTIUSER_USE_PROGRAMFILES64 + StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}" + !else + StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" + !endif + !endif + !endif + + !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + + ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + + ${if} $MultiUser.InstDir != "" + StrCpy $INSTDIR $MultiUser.InstDir + ${endif} + + !endif + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif + + ${endif} + +!macroend + +!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Install mode initialization - per-user + + !if ${MULTIUSER_MINWIN} < 0x500 + ${if} ${IsNT} + !endif + + StrCpy $MultiUser.InstallMode CurrentUser + SetShellVarContext current + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + !ifdef MULTIUSER_INSTALLMODE_INSTDIR + !if ${MULTIUSER_MINWIN} < 0x490 + ${if} ${AtLeastWin2000} + !endif + GetKnownFolderPath $INSTDIR {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; FOLDERID_UserProgramFiles + StrCmp $INSTDIR "" 0 +2 + StrCpy $INSTDIR "$LocalAppData\Programs" ; Fallback directory + StrCpy $INSTDIR "$INSTDIR\${MULTIUSER_INSTALLMODE_INSTDIR}" + !if ${MULTIUSER_MINWIN} < 0x490 + ${else} + StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${endif} + !endif + !endif + !endif + + !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + ${if} $MultiUser.InstDir != "" + StrCpy $INSTDIR $MultiUser.InstDir + ${endif} + !endif + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif + + !if ${MULTIUSER_MINWIN} < 0x500 + ${endif} + !endif + +!macroend + +Function MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" "" +FunctionEnd + +Function MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" "" +FunctionEnd + +!ifndef MULTIUSER_NOUNINSTALL + +Function un.MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un +FunctionEnd + +Function un.MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un +FunctionEnd + +!endif + +/* + +Installer/uninstaller initialization + +*/ + +!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX + + !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT + Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT}" + !else + Quit + !endif + +!macroend + +!macro MULTIUSER_INIT_TEXTS UNINSTALLER_PREFIX + + !if "${UNINSTALLER_PREFIX}" == "" + !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^SetupCaption)" + !else + !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^Name)" + !endif + + !define /IfNDef MULTIUSER_INIT_TEXT_ADMINREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires administrator privileges." + !define /IfNDef MULTIUSER_INIT_TEXT_POWERREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires at least Power User privileges." + !define /IfNDef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer." + + !undef MULTIUSER_TMPSTR_CAPTION + +!macroend + +!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Installer initialization - check privileges and set install mode + + !insertmacro MULTIUSER_INIT_TEXTS "${UNINSTALLER_PREFIX}" + + UserInfo::GetAccountType + Pop $MultiUser.Privileges + + !if ${MULTIUSER_MINWIN} < 0x500 + ${if} ${IsNT} + !endif + + ;Check privileges + + !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin + + ${if} $MultiUser.Privileges != "Admin" + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" + !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" + ${endif} + + !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power + + ${if} $MultiUser.Privileges != "Power" + ${andif} $MultiUser.Privileges != "Admin" + ${if} ${AtMostWinXP} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}" + ${else} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" + ${endif} + !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" + ${endif} + + !endif + + !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS + + ;Default to per-machine installation if possible + + ${if} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + !else + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + !endif + + !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME + + ;Set installation mode to setting from a previous installation + + !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue == "" + ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + ${endif} + !else + ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue == "" + ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${endif} + ${endif} + !endif + + !endif + + ${else} + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + + !else + + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + + !endif + + !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE + + ;Check for install mode setting on command line + + ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters + + ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser" + + ${if} $MultiUser.Result != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + + ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers" + + ${if} $MultiUser.Result != "" + ${if} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${else} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}" + !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" + ${endif} + ${endif} + + !endif + + !if ${MULTIUSER_MINWIN} < 0x500 + ${else} + + ;Not running Windows NT, per-user installation not supported + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + + ${endif} + !endif + +!macroend + +!macro MULTIUSER_INIT + !verbose push 3 + !ifdef __UNINSTALL__ + !insertmacro MULTIUSER_UNINIT + !else + !insertmacro MULTIUSER_INIT_CHECKS "" "" + !endif + !verbose pop +!macroend + +!ifndef MULTIUSER_NOUNINSTALL +!macro MULTIUSER_UNINIT + !verbose push 3 + !insertmacro MULTIUSER_INIT_CHECKS Un un. + !verbose pop +!macroend +!endif + +/* + +Mode selection page + +*/ + +!macro MULTIUSER_PAGE_FUNCTION_CUSTOM TYPE + !ifmacrodef MUI_PAGE_FUNCTION_CUSTOM + !insertmacro MUI_PAGE_FUNCTION_CUSTOM "${TYPE}" + !endif + !ifdef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} + Call "${MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}}" + !undef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE} + !endif +!macroend + +!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE + + !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE + !define MULTIUSER_INSTALLMODEPAGE_INTERFACE + Var MultiUser.InstallModePage + + Var MultiUser.InstallModePage.Text + + Var MultiUser.InstallModePage.AllUsers + Var MultiUser.InstallModePage.CurrentUser + + !endif + +!macroend + +!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE UNPREFIX UNIQUEID + + !define /ReDef MULTIUSER_${UNPREFIX}INSTALLMODEPAGE "" ; Unlock strings in the language file(s) + !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE + + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)" + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)" + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)" + + PageEx custom + + PageCallbacks MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} + + !define /IfNDef MULTIUSER_INSTALLMODEPAGE_CAPTION " " + Caption "${MULTIUSER_INSTALLMODEPAGE_CAPTION}" + + PageExEnd + + !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID} + + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER + +!macroend + +!macro MULTIUSER_PAGE_INSTALLMODE + + !verbose push 3 + + !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS + !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest." + !endif + + !ifmacrodef MUI_PAGE_INIT + !insertmacro MUI_PAGE_INIT + !endif + !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE "" ${__COUNTER__} + + !verbose pop + +!macroend + +!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE + + !include nsDialogs.nsh + + Function "${PRE}" + + !if ${MULTIUSER_MINWIN} < 0x500 + ${ifnot} ${IsNT} + Abort + ${endif} + !endif + + ${if} $MultiUser.Privileges != "Power" + ${andif} $MultiUser.Privileges != "Admin" + Abort + ${endif} + + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM PRE + !ifmacrodef MUI_HEADER_TEXT_PAGE + !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) + !endif + + nsDialogs::Create 1018 + Pop $MultiUser.InstallModePage + + ${NSD_CreateLabel} 0 2u 100% 42u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}" + Pop $MultiUser.InstallModePage.Text + + ${NSD_CreateRadioButton} 15u 50u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}" + Pop $MultiUser.InstallModePage.AllUsers + + !ifdef MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME + !ifdef NOSYSTEMCALLS + ReadEnvStr $0 USERNAME + !else + System::Call 'ADVAPI32::GetUserName(t""r0,*i${NSIS_MAX_STRLEN})' + !endif + StrCmp $0 "" +2 + StrCpy $0 " ($0)" + ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}$0" + !else + ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}" + !endif + Pop $MultiUser.InstallModePage.CurrentUser + + ${if} $MultiUser.InstallMode == "AllUsers" + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 + ${else} + SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 + ${endif} + + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM SHOW + nsDialogs::Show + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM DESTROYED + + FunctionEnd + + Function "${LEAVE}" + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $0 + + ${if} $0 = ${BST_CHECKED} + Call MultiUser.InstallMode.AllUsers + ${else} + Call MultiUser.InstallMode.CurrentUser + ${endif} + + !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM LEAVE + FunctionEnd + +!macroend + + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/Sections.nsh b/libs/NSIS/NSIS-source/Include/Sections.nsh new file mode 100644 index 0000000000..7ae9f6824f --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Sections.nsh @@ -0,0 +1,310 @@ +; Sections.nsh +; +; Defines and macros for section control +; +; Include in your script using: +; !include "Sections.nsh" + +;-------------------------------- + +!ifndef SECTIONS_INCLUDED + +!define SECTIONS_INCLUDED + +;-------------------------------- + +; Generic section defines + +# section or section group is selected +!define SF_SELECTED 1 +# section group +!define SF_SECGRP 2 +!define SF_SUBSEC 2 # deprecated +# section group end marker +!define SF_SECGRPEND 4 +!define SF_SUBSECEND 4 # deprecated +# bold text (Section !blah) +!define SF_BOLD 8 +# read only (SectionIn RO) +!define SF_RO 16 +# expanded section group (SectionGroup /e blah) +!define SF_EXPAND 32 +# section group is partially selected +!define SF_PSELECTED 64 # internal +# internal +!define SF_TOGGLED 128 # internal +!define SF_NAMECHG 256 # internal + +# mask to toggle off the selected flag +!define SECTION_OFF 0xFFFFFFFE + +;-------------------------------- + +; Select / unselect / reserve section + +!macro SelectSection SECTION + + Push $0 + Push $1 + StrCpy $1 "${SECTION}" + SectionGetFlags $1 $0 + IntOp $0 $0 | ${SF_SELECTED} + SectionSetFlags $1 $0 + Pop $1 + Pop $0 + +!macroend + +!macro UnselectSection SECTION + + Push $0 + Push $1 + StrCpy $1 "${SECTION}" + SectionGetFlags $1 $0 + IntOp $0 $0 & ${SECTION_OFF} + SectionSetFlags $1 $0 + Pop $1 + Pop $0 + +!macroend + +; If section selected, will unselect, if unselected, will select + +!macro ReverseSection SECTION + + Push $0 + Push $1 + StrCpy $1 "${SECTION}" + SectionGetFlags $1 $0 + IntOp $0 $0 ^ ${SF_SELECTED} + SectionSetFlags $1 $0 + Pop $1 + Pop $0 + +!macroend + +;-------------------------------- + +; Macros for mutually exclusive section selection +; Written by Tim Gallagher +; +; See one-section.nsi for an example of usage + +; Starts the Radio Button Block +; You should pass a variable that keeps the selected section +; as the first parameter for this macro. This variable should +; be initialized to the default section's index. +; +; As this macro uses $R0 and $R1 you can't use those two as the +; variable which will keep the selected section. + +!macro StartRadioButtons var + + !define StartRadioButtons_Var "${var}" + + Push $R0 + + SectionGetFlags "${StartRadioButtons_Var}" $R0 + IntOp $R0 $R0 & ${SECTION_OFF} + SectionSetFlags "${StartRadioButtons_Var}" $R0 + + Push $R1 + + StrCpy $R1 "${StartRadioButtons_Var}" + +!macroend + +; A radio button + +!macro RadioButton SECTION_NAME + + SectionGetFlags ${SECTION_NAME} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} 0 +2 +2 + StrCpy "${StartRadioButtons_Var}" ${SECTION_NAME} + +!macroend + +; Ends the radio button block + +!macro EndRadioButtons + + StrCmp $R1 "${StartRadioButtons_Var}" 0 +4 ; selection hasn't changed + SectionGetFlags "${StartRadioButtons_Var}" $R0 + IntOp $R0 $R0 | ${SF_SELECTED} + SectionSetFlags "${StartRadioButtons_Var}" $R0 + + Pop $R1 + Pop $R0 + + !undef StartRadioButtons_Var + +!macroend + +;-------------------------------- + +; These are two macros you can use to set a Section in an InstType +; or clear it from an InstType. +; +; Written by Robert Kehl +; +; For details, see https://nsis.sourceforge.io/wiki/SetSectionInInstType%2C_ClearSectionInInstType +; +; Use the defines below for the WANTED_INSTTYPE parameter. + +!define INSTTYPE_1 1 +!define INSTTYPE_2 2 +!define INSTTYPE_3 4 +!define INSTTYPE_4 8 +!define INSTTYPE_5 16 +!define INSTTYPE_6 32 +!define INSTTYPE_7 64 +!define INSTTYPE_8 128 +!define INSTTYPE_9 256 +!define INSTTYPE_10 512 +!define INSTTYPE_11 1024 +!define INSTTYPE_12 2048 +!define INSTTYPE_13 4096 +!define INSTTYPE_14 8192 +!define INSTTYPE_15 16384 +!define INSTTYPE_16 32768 +!define INSTTYPE_17 65536 +!define INSTTYPE_18 131072 +!define INSTTYPE_19 262144 +!define INSTTYPE_20 524288 +!define INSTTYPE_21 1048576 +!define INSTTYPE_22 2097152 +!define INSTTYPE_23 4194304 +!define INSTTYPE_24 8388608 +!define INSTTYPE_25 16777216 +!define INSTTYPE_26 33554432 +!define INSTTYPE_27 67108864 +!define INSTTYPE_28 134217728 +!define INSTTYPE_29 268435456 +!define INSTTYPE_30 536870912 +!define INSTTYPE_31 1073741824 +!define INSTTYPE_32 2147483648 + +!macro SetSectionInInstType SECTION_NAME WANTED_INSTTYPE + + Push $0 + Push $1 + StrCpy $1 "${SECTION_NAME}" + SectionGetInstTypes $1 $0 + IntOp $0 $0 | ${WANTED_INSTTYPE} + SectionSetInstTypes $1 $0 + Pop $1 + Pop $0 + +!macroend + +!macro ClearSectionInInstType SECTION_NAME WANTED_INSTTYPE + + Push $0 + Push $1 + Push $2 + StrCpy $2 "${SECTION_NAME}" + SectionGetInstTypes $2 $0 + StrCpy $1 ${WANTED_INSTTYPE} + IntOp $1 $1 ~ + IntOp $0 $0 & $1 + SectionSetInstTypes $2 $0 + Pop $2 + Pop $1 + Pop $0 + +!macroend + +;-------------------------------- + +; Set / clear / check bits in a section's flags +; Written by derekrprice + +; Set one or more bits in a sections's flags + +!macro SetSectionFlag SECTION BITS + + Push $R0 + Push $R1 + StrCpy $R1 "${SECTION}" + SectionGetFlags $R1 $R0 + IntOp $R0 $R0 | "${BITS}" + SectionSetFlags $R1 $R0 + Pop $R1 + Pop $R0 + +!macroend + +; Clear one or more bits in section's flags + +!macro ClearSectionFlag SECTION BITS + + Push $R0 + Push $R1 + Push $R2 + StrCpy $R2 "${SECTION}" + SectionGetFlags $R2 $R0 + IntOp $R1 "${BITS}" ~ + IntOp $R0 $R0 & $R1 + SectionSetFlags $R2 $R0 + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +; Check if one or more bits in section's flags are set +; If they are, jump to JUMPIFSET +; If not, jump to JUMPIFNOTSET + +!macro SectionFlagIsSet SECTION BITS JUMPIFSET JUMPIFNOTSET + Push $R0 + SectionGetFlags "${SECTION}" $R0 + IntOp $R0 $R0 & "${BITS}" + IntCmp $R0 "${BITS}" +3 + Pop $R0 + StrCmp "" "${JUMPIFNOTSET}" +3 "${JUMPIFNOTSET}" + Pop $R0 + Goto "${JUMPIFSET}" +!macroend + +;-------------------------------- + +; Removes a section by unselecting and hiding it + +!macro RemoveSection SECTION + + Push $R0 + Push $R1 + StrCpy $R1 `${SECTION}` + SectionGetFlags $R1 $R0 + IntOp $R0 $R0 & ${SECTION_OFF} + SectionSetFlags $R1 $R0 + SectionSetText $R1 `` + Pop $R1 + Pop $R0 + +!macroend + +; Undoes the RemoveSection action + +!macro UnremoveSection SECTION SECTION_TEXT + + Push $R0 + Push $R1 + Push $R2 + StrCpy $R1 `${SECTION}` + StrCpy $R2 `${SECTION_TEXT}` + SectionGetFlags $R1 $R0 + IntOp $R0 $R0 | ${SF_SELECTED} + SectionSetFlags $R1 $R0 + SectionSetText $R1 $R2 + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +;-------------------------------- + +!endif \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/StrFunc.nsh b/libs/NSIS/NSIS-source/Include/StrFunc.nsh new file mode 100644 index 0000000000..d47f6509ae --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/StrFunc.nsh @@ -0,0 +1,1627 @@ +/* +o-----------------------------------------------------------------------------o +|String Functions Header File 1.10 | +(-----------------------------------------------------------------------------) +| By deguix / A Header file for NSIS 2.01 | +| -------------------------------| +| | +| This header file contains NSIS functions for string manipulation. | +| ---------| +| !include "StrFunc.nsh" / Example | +| ${Using:StrFunc} StrRep -----------| +| | +| Section | +| ${StrRep} $0 "Hello world!" "world" "everyone" | +| MessageBox mb_ok $0 | +| SectionEnd | +| | +o-----------------------------------------------------------------------------o +*/ + +!verbose push 3 +!define /IfNDef STRFUNC_VERBOSITY 3 +!define /IfNDef _STRFUNC_VERBOSITY ${STRFUNC_VERBOSITY} +!define /IfNDef _STRFUNC_CREDITVERBOSITY ${STRFUNC_VERBOSITY} +!undef STRFUNC_VERBOSITY +!verbose ${_STRFUNC_VERBOSITY} + +!include LogicLib.nsh + +!ifndef STRFUNC + + !define /IfNDef FALSE 0 + !define /IfNDef TRUE 1 + + ;Header File Identification + + !define STRFUNC `String Functions Header File` + ;define STRFUNC_SHORT `StrFunc` + !define STRFUNC_CREDITS `2004 Diego Pedroso` + + ;Header File Version + + !define STRFUNC_VERMAJ 1 + !define STRFUNC_VERMED 10 + ;!define STRFUNC_VERMIN 0 + ;!define STRFUNC_VERBLD 0 + + !define STRFUNC_VER `${STRFUNC_VERMAJ}.${STRFUNC_VERMED}` + + ;Header File Init Message Prefix and Postfix + + !define STRFUNC_INITMSGPRE `----------------------------------------------------------------------$\r$\n` + !define STRFUNC_INITMSGPOST `$\r$\n----------------------------------------------------------------------$\r$\n` + + ;Header File Init Message + + !verbose push ${_STRFUNC_CREDITVERBOSITY} + !echo `${STRFUNC_INITMSGPRE}NSIS ${STRFUNC} ${STRFUNC_VER} - Copyright ${STRFUNC_CREDITS}${STRFUNC_INITMSGPOST}` + !verbose pop + + ;Header File Function Macros + + !ifdef STRFUNC_USECALLARTIFICIALFUNCTION + !include Util.nsh + !endif + + !define "Using:StrFunc" `!insertmacro STRFUNC_USING ` + !macro STRFUNC_USING Name + !if "${STRFUNC_VERBOSITY}" > 4 + !verbose push 4 + !endif + !ifndef ${Name}_INCLUDED + !ifndef STRFUNC_USECALLARTIFICIALFUNCTION + ${${Name}} ; Invoke !insertmacro STRFUNC_MAKEFUNC + !endif + !endif + !if "${STRFUNC_VERBOSITY}" > 4 + !verbose pop + !endif + !macroend + + !macro STRFUNC_FUNCLIST_INSERT Name + !ifdef StrFunc_List + !define /ReDef StrFunc_List `${StrFunc_List}|${Name}` + !else + !define StrFunc_List `${Name}` + !endif + !macroend + + !macro STRFUNC_DEFFUNC Name List TypeList + !insertmacro STRFUNC_FUNCLIST_INSERT ${Name} + !define `${Name}_List` `${List}` + !define `${Name}_TypeList` `${TypeList}` + !ifdef STRFUNC_USECALLARTIFICIALFUNCTION + !define `${Name}` `!insertmacro STRFUNC_CALL_${Name} "" ` + !define `Un${Name}` `!insertmacro STRFUNC_CALL_${Name} Un ` + !else + !define `${Name}` `!insertmacro STRFUNC_MAKEFUNC ${Name} "" #` + !define `Un${Name}` `!insertmacro STRFUNC_MAKEFUNC ${Name} Un #` + !endif + !macroend + + !macro STRFUNC_MAKEFUNC basename un + !ifndef __GLOBAL__ + !error "You forgot ${U+24}{Using:StrFunc} ${un}${basename}" + !endif + !insertmacro STRFUNC_MAKEFUNC_${basename} + !macroend + + !macro STRFUNC_BEGINFUNC basename un credits + !verbose push ${_STRFUNC_CREDITVERBOSITY} + !echo `${U+24}{${un}${basename}} - Copyright ${credits}` + !verbose pop + !define /IfNDef ${un}${basename}_INCLUDED + !ifndef STRFUNC_USECALLARTIFICIALFUNCTION + !define /ReDef ${un}${basename} `!insertmacro STRFUNC_CALL_${basename} "${un}" ` + !if "${un}" != "" + Function un.${basename} + !else + Function ${basename} + !endif + !endif + !macroend + !macro STRFUNC_ENDFUNC + !ifndef STRFUNC_USECALLARTIFICIALFUNCTION + FunctionEnd + !endif + !macroend + + !macro STRFUNC_CALL basename un + !ifdef STRFUNC_USECALLARTIFICIALFUNCTION + ${CallArtificialFunction} STRFUNC_MAKEFUNC_${basename} + !else + !if "${un}" != "" + Call un.${basename} + !else + Call ${basename} + !endif + !endif + !macroend + + + ############################################################################ + # StrCase + !insertmacro STRFUNC_DEFFUNC StrCase `ResultVar|String|Type` `Output|Text|Option U L T S <>` + + !macro STRFUNC_CALL_StrCase un ResultVar String Type + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrCase} "${ResultVar}" "${String}" "${Type}"` + !verbose 2 + Push `${String}` + Push `${Type}` + !insertmacro STRFUNC_CALL StrCase "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrCase + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Dave Laundon` + /*After this point: + ------------------------------------------ + $0 = String (input) + $1 = Type (input) + $2 = StrLength (temp) + $3 = StartChar (temp) + $4 = EndChar (temp) + $5 = ResultStr (temp) + $6 = CurrentChar (temp) + $7 = LastChar (temp) + $8 = Temp (temp)*/ + + ;Get input from user + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + + ;Initialize variables + StrCpy $2 "" + StrCpy $3 "" + StrCpy $4 "" + StrCpy $5 "" + StrCpy $6 "" + StrCpy $7 "" + StrCpy $8 "" + + ;Upper and lower cases are simple to use + ${If} $1 == "U" + + ;Upper Case System: + ;------------------ + ; Convert all characters to upper case. + + System::Call "User32::CharUpper(t r0 r5)i" + Goto StrCase_End + ${ElseIf} $1 == "L" + + ;Lower Case System: + ;------------------ + ; Convert all characters to lower case. + + System::Call "User32::CharLower(t r0 r5)i" + Goto StrCase_End + ${EndIf} + + ;For the rest of cases: + ;Get "String" length + StrLen $2 $0 + + ;Make a loop until the end of "String" + ${For} $3 0 $2 + ;Add 1 to "EndChar" counter also + IntOp $4 $3 + 1 + + # Step 1: Detect one character at a time + + ;Remove characters before "StartChar" except when + ;"StartChar" is the first character of "String" + ${If} $3 <> 0 + StrCpy $6 $0 `` $3 + ${EndIf} + + ;Remove characters after "EndChar" except when + ;"EndChar" is the last character of "String" + ${If} $4 <> $2 + ${If} $3 = 0 + StrCpy $6 $0 1 + ${Else} + StrCpy $6 $6 1 + ${EndIf} + ${EndIf} + + # Step 2: Convert to the advanced case user chose: + + ${If} $1 == "T" + + ;Title Case System: + ;------------------ + ; Convert all characters after a non-alphabetic character to upper case. + ; Else convert to lower case. + + ;Use "IsCharAlpha" for the job + System::Call "*(&t1 r7) p .r8" + System::Call "*$8(&i1 .r7)" + System::Free $8 + System::Call "user32::IsCharAlpha(i r7) i .r8" + + ;Verify "IsCharAlpha" result and convert the character + ${If} $8 = 0 + System::Call "User32::CharUpper(t r6 r6)i" + ${Else} + System::Call "User32::CharLower(t r6 r6)i" + ${EndIf} + ${ElseIf} $1 == "S" + + ;Sentence Case System: + ;------------------ + ; Convert all characters after a ".", "!" or "?" character to upper case. + ; Else convert to lower case. Spaces or tabs after these marks are ignored. + + ;Detect current characters and ignore if necessary + ${If} $6 == " " + ${OrIf} $6 == "$\t" + Goto IgnoreLetter + ${EndIf} + + ;Detect last characters and convert + ${If} $7 == "." + ${OrIf} $7 == "!" + ${OrIf} $7 == "?" + ${OrIf} $7 == "" + System::Call "User32::CharUpper(t r6 r6)i" + ${Else} + System::Call "User32::CharLower(t r6 r6)i" + ${EndIf} + ${ElseIf} $1 == "<>" + + ;Switch Case System: + ;------------------ + ; Switch all characters cases to their inverse case. + + ;Use "IsCharUpper" for the job + System::Call "*(&t1 r6) p .r8" + System::Call "*$8(&i1 .r7)" + System::Free $8 + System::Call "user32::IsCharUpper(i r7) i .r8" + + ;Verify "IsCharUpper" result and convert the character + ${If} $8 = 0 + System::Call "User32::CharUpper(t r6 r6)i" + ${Else} + System::Call "User32::CharLower(t r6 r6)i" + ${EndIf} + ${EndIf} + + ;Write the character to "LastChar" + StrCpy $7 $6 + + IgnoreLetter: + ;Add this character to "ResultStr" + StrCpy $5 `$5$6` + ${Next} + + StrCase_End: + + /*After this point: + ------------------------------------------ + $0 = OutVar (output)*/ + + ; Copy "ResultStr" to "OutVar" + StrCpy $0 $5 + + ;Return output to user + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrClb + !insertmacro STRFUNC_DEFFUNC StrClb `ResultVar|String|Action` `Output|Text|Option > < <>` + + !macro STRFUNC_CALL_StrClb un ResultVar String Action + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrClb} "${ResultVar}" "${String}" "${Action}"` + !verbose 2 + Push `${String}` + Push `${Action}` + !insertmacro STRFUNC_CALL StrClb "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrClb + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Nik Medved` + + /*After this point: + ------------------------------------------ + $0 = String (input) + $1 = Action (input) + $2 = Lock/Unlock (temp) + $3 = Temp (temp) + $4 = Temp2 (temp)*/ + + ;Get input from user + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + + StrCpy $2 "" + StrCpy $3 "" + StrCpy $4 "" + + ;Open the clipboard to do the operations the user chose (kichik's fix) + System::Call 'user32::OpenClipboard(p $HWNDPARENT)' + + ${If} $1 == ">" ;Set + + ;Step 1: Clear the clipboard + System::Call 'user32::EmptyClipboard()' + + ;Step 2: Allocate global heap + StrLen $2 $0 + IntOp $2 $2 + 1 + !if "${NSIS_CHAR_SIZE}" > 1 + IntOp $2 $2 * ${NSIS_CHAR_SIZE} + !endif + System::Call 'kernel32::GlobalAlloc(i 2, i r2) p.r2' + + ;Step 3: Lock the handle + System::Call 'kernel32::GlobalLock(p r2) i.r3' + + ;Step 4: Copy the text to locked clipboard buffer + System::Call 'kernel32::lstrcpy(p r3, t r0)' + + ;Step 5: Unlock the handle again + System::Call 'kernel32::GlobalUnlock(p r2)' + + ;Step 6: Set the information to the clipboard + !if "${NSIS_CHAR_SIZE}" > 1 + System::Call 'user32::SetClipboardData(i 13, p r2)' + !else + System::Call 'user32::SetClipboardData(i 1, p r2)' + !endif + + StrCpy $0 "" + + ${ElseIf} $1 == "<" ;Get + + ;Step 1: Get clipboard data + !if "${NSIS_CHAR_SIZE}" > 1 + System::Call 'user32::GetClipboardData(i 13)p.r2' + !else + System::Call 'user32::GetClipboardData(i 1)p.r2' + !endif + + ;Step 2: Lock and copy data (kichik's fix) + System::Call 'kernel32::GlobalLock(p r2) t .r0' + + ;Step 3: Unlock (kichik's fix) + System::Call 'kernel32::GlobalUnlock(p r2)' + + ${ElseIf} $1 == "<>" ;Swap + + ;Step 1: Get clipboard data + !if "${NSIS_CHAR_SIZE}" > 1 + System::Call 'user32::GetClipboardData(i 13)p.r2' + !else + System::Call 'user32::GetClipboardData(i 1)p.r2' + !endif + + ;Step 2: Lock and copy data (kichik's fix) + System::Call 'kernel32::GlobalLock(p r2) t .r4' + + ;Step 3: Unlock (kichik's fix) + System::Call 'kernel32::GlobalUnlock(p r2)' + + ;Step 4: Clear the clipboard + System::Call 'user32::EmptyClipboard()' + + ;Step 5: Allocate global heap + StrLen $2 $0 + IntOp $2 $2 + 1 + !if "${NSIS_CHAR_SIZE}" > 1 + IntOp $2 $2 * ${NSIS_CHAR_SIZE} + !endif + System::Call 'kernel32::GlobalAlloc(i 2, i r2) p.r2' + + ;Step 6: Lock the handle + System::Call 'kernel32::GlobalLock(p r2) i.r3' + + ;Step 7: Copy the text to locked clipboard buffer + System::Call 'kernel32::lstrcpy(p r3, t r0)' + + ;Step 8: Unlock the handle again + System::Call 'kernel32::GlobalUnlock(p r2)' + + ;Step 9: Set the information to the clipboard + !if "${NSIS_CHAR_SIZE}" > 1 + System::Call 'user32::SetClipboardData(i 13, p r2)' + !else + System::Call 'user32::SetClipboardData(i 1, p r2)' + !endif + + StrCpy $0 $4 + ${Else} ;Clear + + ;Step 1: Clear the clipboard + System::Call 'user32::EmptyClipboard()' + + StrCpy $0 "" + ${EndIf} + + ;Close the clipboard + System::Call 'user32::CloseClipboard()' + + /*After this point: + ------------------------------------------ + $0 = OutVar (output)*/ + + ;Return result to user + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrIOToNSIS + !insertmacro STRFUNC_DEFFUNC StrIOToNSIS `ResultVar|String` `Output|Text` + + !macro STRFUNC_CALL_StrIOToNSIS un ResultVar String + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrIOToNSIS} "${ResultVar}" "${String}"` + !verbose 2 + Push `${String}` + !insertmacro STRFUNC_CALL StrIOToNSIS "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrIOToNSIS + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` + + /*After this point: + ------------------------------------------ + $R0 = String (input/output) + $R1 = StartCharPos (temp) + $R2 = StrLen (temp) + $R3 = TempStr (temp) + $R4 = TempRepStr (temp)*/ + + ;Get input from user + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + + ;Get "String" length + StrLen $R2 $R0 + + ;Loop until "String" end is reached + ${For} $R1 0 $R2 + ;Get the next "String" characters + StrCpy $R3 $R0 2 $R1 + + ;Detect if current character is: + ${If} $R3 == "\\" ;Back-slash + StrCpy $R4 "\" + ${ElseIf} $R3 == "\r" ;Carriage return + StrCpy $R4 "$\r" + ${ElseIf} $R3 == "\n" ;Line feed + StrCpy $R4 "$\n" + ${ElseIf} $R3 == "\t" ;Tab + StrCpy $R4 "$\t" + ${Else} ;Anything else + StrCpy $R4 "" + ${EndIf} + + ;Detect if "TempRepStr" is not empty + ${If} $R4 != "" + ;Replace the old characters with the new one + StrCpy $R3 $R0 $R1 + IntOp $R1 $R1 + 2 + StrCpy $R0 $R0 "" $R1 + StrCpy $R0 "$R3$R4$R0" + IntOp $R2 $R2 - 1 ;Decrease "StrLen" + IntOp $R1 $R1 - 2 ;Go back to the next character + ${EndIf} + ${Next} + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + !macroend + + ############################################################################ + # StrLoc + !insertmacro STRFUNC_DEFFUNC StrLoc `ResultVar|String|StrToSearchFor|CounterDirection` `Output|Text|Text|Option > <` + + !macro STRFUNC_CALL_StrLoc un ResultVar String StrToSearchFor OffsetDirection + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrLoc} "${ResultVar}" "${String}" "${StrToSearchFor}" "${OffsetDirection}"` + !verbose 2 + Push `${String}` + Push `${StrToSearchFor}` + Push `${OffsetDirection}` + !insertmacro STRFUNC_CALL StrLoc "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrLoc + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` + + /*After this point: + ------------------------------------------ + $R0 = OffsetDirection (input) + $R1 = StrToSearch (input) + $R2 = String (input) + $R3 = StrToSearchLen (temp) + $R4 = StrLen (temp) + $R5 = StartCharPos (temp) + $R6 = TempStr (temp)*/ + + ;Get input from user + Exch $R0 + Exch + Exch $R1 + Exch 2 + Exch $R2 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + + ;Get "String" and "StrToSearch" length + StrLen $R3 $R1 + StrLen $R4 $R2 + ;Start "StartCharPos" counter + StrCpy $R5 0 + + ;Loop until "StrToSearch" is found or "String" reaches its end + ${Do} + ;Remove everything before and after the searched part ("TempStr") + StrCpy $R6 $R2 $R3 $R5 + + ;Compare "TempStr" with "StrToSearch" + ${If} $R6 == $R1 + ${If} $R0 == `<` + IntOp $R6 $R3 + $R5 + IntOp $R0 $R4 - $R6 + ${Else} + StrCpy $R0 $R5 + ${EndIf} + ${ExitDo} + ${EndIf} + ;If not "StrToSearch", this could be "String" end + ${If} $R5 >= $R4 + StrCpy $R0 `` + ${ExitDo} + ${EndIf} + ;If not, continue the loop + IntOp $R5 $R5 + 1 + ${Loop} + + ;Return output to user + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrNSISToIO + !insertmacro STRFUNC_DEFFUNC StrNSISToIO `ResultVar|String` `Output|Text` + + !macro STRFUNC_CALL_StrNSISToIO un ResultVar String + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrNSISToIO} "${ResultVar}" "${String}"` + !verbose 2 + Push `${String}` + !insertmacro STRFUNC_CALL StrNSISToIO "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrNSISToIO + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 "bluenet" - Based on functions by Amir Szekely, Joost Verburg, Dave Laundon and Diego Pedroso` + + /*After this point: + ------------------------------------------ + $R0 = String (input/output) + $R1 = StartCharPos (temp) + $R2 = StrLen (temp) + $R3 = TempStr (temp) + $R4 = TempRepStr (temp)*/ + + ;Get input from user + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + + ;Get "String" length + StrLen $R2 $R0 + + ;Loop until "String" end is reached + ${For} $R1 0 $R2 + ;Get the next "String" character + StrCpy $R3 $R0 1 $R1 + + ;Detect if current character is: + ${If} $R3 == "$\r" ;Back-slash + StrCpy $R4 "\r" + ${ElseIf} $R3 == "$\n" ;Carriage return + StrCpy $R4 "\n" + ${ElseIf} $R3 == "$\t" ;Line feed + StrCpy $R4 "\t" + ${ElseIf} $R3 == "\" ;Tab + StrCpy $R4 "\\" + ${Else} ;Anything else + StrCpy $R4 "" + ${EndIf} + + ;Detect if "TempRepStr" is not empty + ${If} $R4 != "" + ;Replace the old character with the new ones + StrCpy $R3 $R0 $R1 + IntOp $R1 $R1 + 1 + StrCpy $R0 $R0 "" $R1 + StrCpy $R0 "$R3$R4$R0" + IntOp $R2 $R2 + 1 ;Increase "StrLen" + ${EndIf} + ${Next} + + ;Return output to user + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + !macroend + + ############################################################################ + # StrRep + !insertmacro STRFUNC_DEFFUNC StrRep `ResultVar|String|StrToReplace|ReplacementString` `Output|Text|Text|Text` + + !macro STRFUNC_CALL_StrRep un ResultVar String StringToReplace ReplacementString + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrRep} "${ResultVar}" "${String}" "${StringToReplace}" "${ReplacementString}"` + !verbose 2 + Push `${String}` + Push `${StringToReplace}` + Push `${ReplacementString}` + !insertmacro STRFUNC_CALL StrRep "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrRep + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Hendri Adriaens` + + /*After this point: + ------------------------------------------ + $R0 = ReplacementString (input) + $R1 = StrToSearch (input) + $R2 = String (input) + $R3 = RepStrLen (temp) + $R4 = StrToSearchLen (temp) + $R5 = StrLen (temp) + $R6 = StartCharPos (temp) + $R7 = TempStrL (temp) + $R8 = TempStrR (temp)*/ + + ;Get input from user + Exch $R0 + Exch + Exch $R1 + Exch + Exch 2 + Exch $R2 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + + ;Return "String" if "StrToSearch" is "" + ${IfThen} $R1 == "" ${|} Goto Done ${|} + + ;Get "ReplacementString", "String" and "StrToSearch" length + StrLen $R3 $R0 + StrLen $R4 $R1 + StrLen $R5 $R2 + ;Start "StartCharPos" counter + StrCpy $R6 0 + + ;Loop until "StrToSearch" is found or "String" reaches its end + ${Do} + ;Remove everything before and after the searched part ("TempStrL") + StrCpy $R7 $R2 $R4 $R6 + + ;Compare "TempStrL" with "StrToSearch" + ${If} $R7 == $R1 + ;Split "String" to replace the string wanted + StrCpy $R7 $R2 $R6 ;TempStrL + + ;Calc: "StartCharPos" + "StrToSearchLen" = EndCharPos + IntOp $R8 $R6 + $R4 + + StrCpy $R8 $R2 "" $R8 ;TempStrR + + ;Insert the new string between the two separated parts of "String" + StrCpy $R2 $R7$R0$R8 + ;Now calculate the new "StrLen" and "StartCharPos" + StrLen $R5 $R2 + IntOp $R6 $R6 + $R3 + ${Continue} + ${EndIf} + + ;If not "StrToSearch", this could be "String" end + ${IfThen} $R6 >= $R5 ${|} ${ExitDo} ${|} + ;If not, continue the loop + IntOp $R6 $R6 + 1 + ${Loop} + + Done: + + /*After this point: + ------------------------------------------ + $R0 = OutVar (output)*/ + + ;Return output to user + StrCpy $R0 $R2 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrSort + !insertmacro STRFUNC_DEFFUNC StrSort `ResultVar|String|CenterStr|LeftStr|RightStr|IncludeLeftStr|IncludeCenterStr|IncludeRightStr` `Output|Text|Text|Text|Text|Option 1 0|Option 1 0|Option 1 0` + + !macro STRFUNC_CALL_StrSort un ResultVar String CenterStr LeftStr RightStr IncludeCenterStr IncludeLeftStr IncludeRightStr + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrSort} "${ResultVar}" "${String}" "${CenterStr}" "${LeftStr}" "${RightStr}" "${IncludeCenterStr}" "${IncludeLeftStr}" "${IncludeRightStr}"` + !verbose 2 + Push `${String}` + Push `${CenterStr}` + Push `${LeftStr}` + Push `${RightStr}` + Push `${IncludeCenterStr}` + Push `${IncludeLeftStr}` + Push `${IncludeRightStr}` + !insertmacro STRFUNC_CALL StrSort "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrSort + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Stuart Welch` + + /*After this point: + ------------------------------------------ + $R0 = String (input) + $R1 = LeftStr (input) + $R2 = CenterStr (input) + $R3 = RightStr (input) + $R4 = IncludeLeftStr (input) + $R5 = IncludeCenterStr (input) + $R6 = IncludeRightStr (input) + + $0 = StrLen (temp) + $1 = LeftStrLen (temp) + $2 = CenterStrLen (temp) + $3 = RightStrLen (temp) + $4 = StartPos (temp) + $5 = EndPos (temp) + $6 = StartCharPos (temp) + $7 = EndCharPos (temp) + $8 = TempStr (temp)*/ + + ;Get input from user + Exch $R6 + Exch + Exch $R5 + Exch + Exch 2 + Exch $R4 + Exch 2 + Exch 3 + Exch $R3 + Exch 3 + Exch 4 + Exch $R2 + Exch 4 + Exch 5 + Exch $R1 + Exch 5 + Exch 6 + Exch $R0 + Exch 6 + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + + ;Parameter defaults + ${IfThen} $R4 == `` ${|} StrCpy $R4 `1` ${|} + ${IfThen} $R5 == `` ${|} StrCpy $R5 `1` ${|} + ${IfThen} $R6 == `` ${|} StrCpy $R6 `1` ${|} + + ;Get "String", "CenterStr", "LeftStr" and "RightStr" length + StrLen $0 $R0 + StrLen $1 $R1 + StrLen $2 $R2 + StrLen $3 $R3 + ;Start "StartCharPos" counter + StrCpy $6 0 + ;Start "EndCharPos" counter based on "CenterStr" length + IntOp $7 $6 + $2 + + ;Loop until "CenterStr" is found or "String" reaches its end + ${Do} + ;Remove everything before and after the searched part ("TempStr") + StrCpy $8 $R0 $2 $6 + + ;Compare "TempStr" with "CenterStr" + ${IfThen} $8 == $R2 ${|} ${ExitDo} ${|} + ;If not, this could be "String" end + ${IfThen} $7 >= $0 ${|} Goto Done ${|} + ;If not, continue the loop + IntOp $6 $6 + 1 + IntOp $7 $7 + 1 + ${Loop} + + # "CenterStr" was found + + ;Remove "CenterStr" from "String" if the user wants + ${If} $R5 = ${FALSE} + StrCpy $8 $R0 $6 + StrCpy $R0 $R0 `` $7 + StrCpy $R0 $8$R0 + ${EndIf} + + ;"StartPos" and "EndPos" will record "CenterStr" coordinates for now + StrCpy $4 $6 + StrCpy $5 $7 + ;"StartCharPos" and "EndCharPos" should be before "CenterStr" + IntOp $6 $6 - $1 + IntOp $7 $6 + $1 + + ;Loop until "LeftStr" is found or "String" reaches its start + ${Do} + ;Remove everything before and after the searched part ("TempStr") + StrCpy $8 $R0 $1 $6 + + ;If "LeftStr" is empty + ${If} $R1 == `` + StrCpy $6 0 + StrCpy $7 0 + ${ExitDo} + ${EndIf} + + ;Compare "TempStr" with "LeftStr" + ${IfThen} $8 == $R1 ${|} ${ExitDo} ${|} + ;If not, this could be "String" start + ${IfThen} $6 <= 0 ${|} ${ExitDo} ${|} + ;If not, continue the loop + IntOp $6 $6 - 1 + IntOp $7 $7 - 1 + ${Loop} + + # "LeftStr" is found or "String" start was reached + + ;Remove "LeftStr" from "String" if the user wants + ${If} $R4 = ${FALSE} + IntOp $6 $6 + $1 + ${EndIf} + + ;Record "LeftStr" first character position on "TempStr" (temporarily) + StrCpy $8 $6 + + ;"StartCharPos" and "EndCharPos" should be after "CenterStr" + ${If} $R5 = ${FALSE} + StrCpy $6 $4 + ${Else} + IntOp $6 $4 + $2 + ${EndIf} + IntOp $7 $6 + $3 + + ;Record "LeftStr" first character position on "StartPos" + StrCpy $4 $8 + + ;Loop until "RightStr" is found or "String" reaches its end + ${Do} + ;Remove everything before and after the searched part ("TempStr") + StrCpy $8 $R0 $3 $6 + + ;If "RightStr" is empty + ${If} $R3 == `` + StrCpy $6 $0 + StrCpy $7 $0 + ${ExitDo} + ${EndIf} + + ;Compare "TempStr" with "RightStr" + ${IfThen} $8 == $R3 ${|} ${ExitDo} ${|} + ;If not, this could be "String" end + ${IfThen} $7 >= $0 ${|} ${ExitDo} ${|} + ;If not, continue the loop + IntOp $6 $6 + 1 + IntOp $7 $7 + 1 + ${Loop} + + ;Remove "RightStr" from "String" if the user wants + ${If} $R6 = ${FALSE} + IntOp $7 $7 - $3 + ${EndIf} + + ;Record "RightStr" last character position on "StartPos" + StrCpy $5 $7 + + ;As the positionment is relative... + IntOp $5 $5 - $4 + + ;Write the string and finish the job + StrCpy $R0 $R0 $5 $4 + Goto +2 + + Done: + StrCpy $R0 `` + + /*After this point: + ------------------------------------------ + $R0 = OutVar (output)*/ + + ;Return output to user + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrStr + !insertmacro STRFUNC_DEFFUNC StrStr `ResultVar|String|StrToSearchFor` `Output|Text|Text` + + !macro STRFUNC_CALL_StrStr un ResultVar String StrToSearchFor + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrStr} "${ResultVar}" "${String}" "${StrToSearchFor}"` + !verbose 2 + Push `${String}` + Push `${StrToSearchFor}` + !insertmacro STRFUNC_CALL StrStr "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrStr + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` + + /*After this point: + ------------------------------------------ + $R0 = StrToSearch (input) + $R1 = String (input) + $R2 = StrToSearchLen (temp) + $R3 = StrLen (temp) + $R4 = StartCharPos (temp) + $R5 = TempStr (temp)*/ + + ;Get input from user + Exch $R0 + Exch + Exch $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + ;Get "String" and "StrToSearch" length + StrLen $R2 $R0 + StrLen $R3 $R1 + ;Start "StartCharPos" counter + StrCpy $R4 0 + + ;Loop until "StrToSearch" is found or "String" reaches its end + ${Do} + ;Remove everything before and after the searched part ("TempStr") + StrCpy $R5 $R1 $R2 $R4 + + ;Compare "TempStr" with "StrToSearch" + ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|} + ;If not "StrToSearch", this could be "String" end + ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|} + ;If not, continue the loop + IntOp $R4 $R4 + 1 + ${Loop} + + /*After this point: + ------------------------------------------ + $R0 = OutVar (output)*/ + + ;Remove part before "StrToSearch" on "String" (if there has one) + StrCpy $R0 $R1 `` $R4 + + ;Return output to user + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrStrAdv + !insertmacro STRFUNC_DEFFUNC StrStrAdv `ResultVar|String|StrToSearchFor|SearchDirection|ResultStrDirection|DisplayStrToSearch|Loops|CaseSensitive` `Output|Text|Text|Option > <|Option > <|Option 1 0|Text|Option 0 1` + + !macro STRFUNC_CALL_StrStrAdv un ResultVar String StrToSearchFor SearchDirection ResultStrDirection DisplayStrToSearch Loops CaseSensitive + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrStrAdv} "${ResultVar}" "${String}" "${StrToSearchFor}" "${SearchDirection}" "${ResultStrDirection}" "${DisplayStrToSearch}" "${Loops}" "${CaseSensitive}"` + !verbose 2 + Push `${String}` + Push `${StrToSearchFor}` + Push `${SearchDirection}` + Push `${ResultStrDirection}` + Push `${DisplayStrToSearch}` + Push `${Loops}` + Push `${CaseSensitive}` + !insertmacro STRFUNC_CALL StrStrAdv "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrStrAdv + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2003-2004 Diego Pedroso` + + /*After this point: + ------------------------------------------ + $0 = String (input) + $1 = StringToSearch (input) + $2 = DirectionOfSearch (input) + $3 = DirectionOfReturn (input) + $4 = ShowStrToSearch (input) + $5 = NumLoops (input) + $6 = CaseSensitive (input) + $7 = StringLength (temp) + $8 = StrToSearchLength (temp) + $9 = CurrentLoop (temp) + $R0 = EndCharPos (temp) + $R1 = StartCharPos (temp) + $R2 = OutVar (output) + $R3 = Temp (temp)*/ + + ;Get input from user + + Exch $6 + Exch + Exch $5 + Exch + Exch 2 + Exch $4 + Exch 2 + Exch 3 + Exch $3 + Exch 3 + Exch 4 + Exch $2 + Exch 4 + Exch 5 + Exch $1 + Exch 5 + Exch 6 + Exch $0 + Exch 6 + Push $7 + Push $8 + Push $9 + Push $R3 + Push $R2 + Push $R1 + Push $R0 + + ; Clean $R0-$R3 variables + StrCpy $R0 "" + StrCpy $R1 "" + StrCpy $R2 "" + StrCpy $R3 "" + + ; Verify if we have the correct values on the variables + ${If} $0 == `` + SetErrors ;AdvStrStr_StrToSearch not found + Goto AdvStrStr_End + ${EndIf} + + ${If} $1 == `` + SetErrors ;No text to search + Goto AdvStrStr_End + ${EndIf} + + ${If} $2 != < + StrCpy $2 > + ${EndIf} + + ${If} $3 != < + StrCpy $3 > + ${EndIf} + + ${If} $4 <> 0 + StrCpy $4 1 + ${EndIf} + + ${If} $5 <= 0 + StrCpy $5 0 + ${EndIf} + + ${If} $6 <> 1 + StrCpy $6 0 + ${EndIf} + + ; Find "AdvStrStr_String" length + StrLen $7 $0 + + ; Then find "AdvStrStr_StrToSearch" length + StrLen $8 $1 + + ; Now set up basic variables + + ${If} $2 == < + IntOp $R1 $7 - $8 + StrCpy $R2 $7 + ${Else} + StrCpy $R1 0 + StrCpy $R2 $8 + ${EndIf} + + StrCpy $9 0 ; First loop + + ;Let's begin the search + + ${Do} + ; Step 1: If the starting or ending numbers are negative + ; or more than AdvStrStr_StringLen, we return + ; error + + ${If} $R1 < 0 + StrCpy $R1 `` + StrCpy $R2 `` + StrCpy $R3 `` + SetErrors ;AdvStrStr_StrToSearch not found + Goto AdvStrStr_End + ${ElseIf} $R2 > $7 + StrCpy $R1 `` + StrCpy $R2 `` + StrCpy $R3 `` + SetErrors ;AdvStrStr_StrToSearch not found + Goto AdvStrStr_End + ${EndIf} + + ; Step 2: Start the search depending on + ; AdvStrStr_DirectionOfSearch. Chop down not needed + ; characters. + + ${If} $R1 <> 0 + StrCpy $R3 $0 `` $R1 + ${EndIf} + + ${If} $R2 <> $7 + ${If} $R1 = 0 + StrCpy $R3 $0 $8 + ${Else} + StrCpy $R3 $R3 $8 + ${EndIf} + ${EndIf} + + ; Step 3: Make sure that's the string we want + + ; Case-Sensitive Support <- Use "AdvStrStr_Temp" + ; variable because it won't be used anymore + + ${If} $6 == 1 + System::Call `kernel32::lstrcmp(ts, ts) i.s` `$R3` `$1` + Pop $R3 + ${If} $R3 = 0 + StrCpy $R3 1 ; Continue + ${Else} + StrCpy $R3 0 ; Break + ${EndIf} + ${Else} + ${If} $R3 == $1 + StrCpy $R3 1 ; Continue + ${Else} + StrCpy $R3 0 ; Break + ${EndIf} + ${EndIf} + + ; After the comparison, confirm that it is the + ; value we want. + + ${If} $R3 = 1 + + ;We found it, return except if the user has set up to + ;search for another one: + ${If} $9 >= $5 + + ;Now, let's see if the user wants + ;AdvStrStr_StrToSearch to appear: + ${If} $4 == 0 + ;Return depends on AdvStrStr_DirectionOfReturn + ${If} $3 == < + ; RTL + StrCpy $R0 $0 $R1 + ${Else} + ; LTR + StrCpy $R0 $0 `` $R2 + ${EndIf} + ${Break} + ${Else} + ;Return depends on AdvStrStr_DirectionOfReturn + ${If} $3 == < + ; RTL + StrCpy $R0 $0 $R2 + ${Else} + ; LTR + StrCpy $R0 $0 `` $R1 + ${EndIf} + ${Break} + ${EndIf} + ${Else} + ;If the user wants to have more loops, let's do it so! + IntOp $9 $9 + 1 + + ${If} $2 == < + IntOp $R1 $R1 - 1 + IntOp $R2 $R2 - 1 + ${Else} + IntOp $R1 $R1 + 1 + IntOp $R2 $R2 + 1 + ${EndIf} + ${EndIf} + ${Else} + ; Step 4: We didn't find it, so do steps 1 thru 3 again + + ${If} $2 == < + IntOp $R1 $R1 - 1 + IntOp $R2 $R2 - 1 + ${Else} + IntOp $R1 $R1 + 1 + IntOp $R2 $R2 + 1 + ${EndIf} + ${EndIf} + ${Loop} + + AdvStrStr_End: + + ;Add 1 to AdvStrStr_EndCharPos to be supportable + ;by "StrCpy" + + IntOp $R2 $R2 - 1 + + ;Return output to user + + Exch $R0 + Exch + Pop $R1 + Exch + Pop $R2 + Exch + Pop $R3 + Exch + Pop $9 + Exch + Pop $8 + Exch + Pop $7 + Exch + Pop $6 + Exch + Pop $5 + Exch + Pop $4 + Exch + Pop $3 + Exch + Pop $2 + Exch + Pop $1 + Exch + Pop $0 + + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrTok + !insertmacro STRFUNC_DEFFUNC StrTok `ResultVar|String|Separators|ResultPart|SkipEmptyParts` `Output|Text|Text|Mixed L|Option 1 0` + + !macro STRFUNC_CALL_StrTok un ResultVar String Separators ResultPart SkipEmptyParts + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrTok} "${ResultVar}" "${String}" "${Separators}" "${ResultPart}" "${SkipEmptyParts}"` + !verbose 2 + Push `${String}` + Push `${Separators}` + Push `${ResultPart}` + Push `${SkipEmptyParts}` + !insertmacro STRFUNC_CALL StrTok "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrTok + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by "bigmac666"` + /*After this point: + ------------------------------------------ + $0 = SkipEmptyParts (input) + $1 = ResultPart (input) + $2 = Separators (input) + $3 = String (input) + $4 = StrToSearchLen (temp) + $5 = StrLen (temp) + $6 = StartCharPos (temp) + $7 = TempStr (temp) + $8 = CurrentLoop + $9 = CurrentSepChar + $R0 = CurrentSepCharNum + */ + + ;Get input from user + Exch $0 + Exch + Exch $1 + Exch + Exch 2 + Exch $2 + Exch 2 + Exch 3 + Exch $3 + Exch 3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R0 + + ;Parameter defaults + ${IfThen} $2 == `` ${|} StrCpy $2 `|` ${|} + ${IfThen} $1 == `` ${|} StrCpy $1 `L` ${|} + ${IfThen} $0 == `` ${|} StrCpy $0 `0` ${|} + + ;Get "String" and "StrToSearch" length + StrLen $4 $2 + StrLen $5 $3 + ;Start "StartCharPos" and "ResultPart" counters + StrCpy $6 0 + StrCpy $8 -1 + + ;Loop until "ResultPart" is met, "StrToSearch" is found or + ;"String" reaches its end + ResultPartLoop: ;"CurrentLoop" Loop + + ;Increase "CurrentLoop" counter + IntOp $8 $8 + 1 + + StrSearchLoop: + ${Do} ;"String" Loop + ;Remove everything before and after the searched part ("TempStr") + StrCpy $7 $3 1 $6 + + ;Verify if it's the "String" end + ${If} $6 >= $5 + ;If "CurrentLoop" is what the user wants, remove the part + ;after "TempStr" and itself and get out of here + ${If} $8 == $1 + ${OrIf} $1 == `L` + StrCpy $3 $3 $6 + ${Else} ;If not, empty "String" and get out of here + StrCpy $3 `` + ${EndIf} + StrCpy $R0 `End` + ${ExitDo} + ${EndIf} + + ;Start "CurrentSepCharNum" counter (for "Separators" Loop) + StrCpy $R0 0 + + ${Do} ;"Separators" Loop + ;Use one "Separators" character at a time + ${If} $R0 <> 0 + StrCpy $9 $2 1 $R0 + ${Else} + StrCpy $9 $2 1 + ${EndIf} + + ;Go to the next "String" char if it's "Separators" end + ${IfThen} $R0 >= $4 ${|} ${ExitDo} ${|} + + ;Or, if "TempStr" equals "CurrentSepChar", then... + ${If} $7 == $9 + StrCpy $7 $3 $6 + + ;If "String" is empty because this result part doesn't + ;contain data, verify if "SkipEmptyParts" is activated, + ;so we don't return the output to user yet + + ${If} $7 == `` + ${AndIf} $0 = ${TRUE} + IntOp $6 $6 + 1 + StrCpy $3 $3 `` $6 + StrCpy $6 0 + Goto StrSearchLoop + ${ElseIf} $8 == $1 + StrCpy $3 $3 $6 + StrCpy $R0 "End" + ${ExitDo} + ${EndIf} ;If not, go to the next result part + IntOp $6 $6 + 1 + StrCpy $3 $3 `` $6 + StrCpy $6 0 + Goto ResultPartLoop + ${EndIf} + + ;Increase "CurrentSepCharNum" counter + IntOp $R0 $R0 + 1 + ${Loop} + ${IfThen} $R0 == "End" ${|} ${ExitDo} ${|} + + ;Increase "StartCharPos" counter + IntOp $6 $6 + 1 + ${Loop} + + /*After this point: + ------------------------------------------ + $3 = OutVar (output)*/ + + ;Return output to user + + Pop $R0 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $0 + Pop $1 + Pop $2 + Exch $3 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + # StrTrimNewLines + !insertmacro STRFUNC_DEFFUNC StrTrimNewLines `ResultVar|String` `Output|Text` + + !macro STRFUNC_CALL_StrTrimNewLines un ResultVar String + !verbose push ${STRFUNC_VERBOSITY} + !echo `${U+24}{${un}StrTrimNewLines} "${ResultVar}" "${String}"` + !verbose 2 + Push `${String}` + !insertmacro STRFUNC_CALL StrTrimNewLines "${un}" + Pop ${ResultVar} + !verbose pop + !macroend + + !macro STRFUNC_MAKEFUNC_StrTrimNewLines + !insertmacro STRFUNC_BEGINFUNC ${basename} `${un}` `2004 Diego Pedroso - Based on functions by Ximon Eighteen` + + /*After this point: + ------------------------------------------ + $R0 = String (input) + $R1 = TrimCounter (temp) + $R2 = Temp (temp)*/ + + ;Get input from user + Exch $R0 + Push $R1 + Push $R2 + + ;Initialize trim counter + StrCpy $R1 0 + + loop: + ;Subtract to get "String"'s last characters + IntOp $R1 $R1 - 1 + + ;Verify if they are either $\r or $\n + StrCpy $R2 $R0 1 $R1 + ${If} $R2 == `$\r` + ${OrIf} $R2 == `$\n` + Goto loop + ${EndIf} + + ;Trim characters (if needed) + IntOp $R1 $R1 + 1 + ${If} $R1 < 0 + StrCpy $R0 $R0 $R1 + ${EndIf} + + /*After this point: + ------------------------------------------ + $R0 = OutVar (output)*/ + + ;Return output to user + Pop $R2 + Pop $R1 + Exch $R0 + !insertmacro STRFUNC_ENDFUNC + + !macroend + + ############################################################################ + +!endif +!verbose 3 +!define STRFUNC_VERBOSITY ${_STRFUNC_VERBOSITY} +!undef _STRFUNC_VERBOSITY +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/TextFunc.nsh b/libs/NSIS/NSIS-source/Include/TextFunc.nsh new file mode 100644 index 0000000000..230835b6a3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/TextFunc.nsh @@ -0,0 +1,1211 @@ +/* +_____________________________________________________________________________ + + Text Functions Header v2.4 +_____________________________________________________________________________ + + 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + + See documentation for more information about the following functions. + + Usage in script: + 1. !include "TextFunc.nsh" + 2. [Section|Function] + ${TextFunction} "File" "..." $var + [SectionEnd|FunctionEnd] + + + TextFunction=[LineFind|LineRead|FileReadFromEnd|LineSum|FileJoin| + TextCompare|TextCompareS|ConfigRead|ConfigReadS| + ConfigWrite|ConfigWriteS|FileRecode|TrimNewLines] + +_____________________________________________________________________________ + + Thanks to: +_____________________________________________________________________________ + +LineRead + Afrow UK (Based on his idea of Function "ReadFileLine") +LineSum + Afrow UK (Based on his idea of Function "LineCount") +FileJoin + Afrow UK (Based on his idea of Function "JoinFiles") +ConfigRead + vbgunz (His idea) +ConfigWrite + vbgunz (His idea) +TrimNewLines + sunjammer (Based on his Function "TrimNewLines") +*/ + + +;_____________________________________________________________________________ +; +; Macros +;_____________________________________________________________________________ +; +; Change log window verbosity (default: 3=no script) +; +; Example: +; !include "TextFunc.nsh" +; !insertmacro LineFind +; ${TEXTFUNC_VERBOSE} 4 # all verbosity +; !insertmacro LineSum +; ${TEXTFUNC_VERBOSE} 3 # no script + +!ifndef TEXTFUNC_INCLUDED + +!verbose push 3 +!define /IfNDef _TEXTFUNC_VERBOSE 3 +!verbose ${_TEXTFUNC_VERBOSE} +!define TEXTFUNC_VERBOSE `!insertmacro TEXTFUNC_VERBOSE` + +!define TEXTFUNC_INCLUDED + +!include FileFunc.nsh +!include Util.nsh + + +!macro TEXTFUNC_VERBOSE _VERBOSE + !verbose push 3 + !define /ReDef _TEXTFUNC_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + +!macro LineFindCall _INPUT _OUTPUT _RANGE _FUNC + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push $0 + Push `${_INPUT}` + Push `${_OUTPUT}` + Push `${_RANGE}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} LineFind_ + Pop $0 + !verbose pop +!macroend + +!macro LineReadCall _FILE _NUMBER _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_NUMBER}` + ${CallArtificialFunction} LineRead_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro FileReadFromEndCall _FILE _FUNC + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push $0 + Push `${_FILE}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} FileReadFromEnd_ + Pop $0 + !verbose pop +!macroend + +!macro LineSumCall _FILE _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + ${CallArtificialFunction} LineSum_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro FileJoinCall _FILE1 _FILE2 _FILE3 + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE1}` + Push `${_FILE2}` + Push `${_FILE3}` + ${CallArtificialFunction} FileJoin_ + !verbose pop +!macroend + +!macro TextCompareCall _FILE1 _FILE2 _OPTION _FUNC + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push $0 + Push `${_FILE1}` + Push `${_FILE2}` + Push `${_OPTION}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} TextCompare_ + Pop $0 + !verbose pop +!macroend + +!macro TextCompareSCall _FILE1 _FILE2 _OPTION _FUNC + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push $0 + Push `${_FILE1}` + Push `${_FILE2}` + Push `${_OPTION}` + GetFunctionAddress $0 `${_FUNC}` + Push `$0` + ${CallArtificialFunction} TextCompareS_ + Pop $0 + !verbose pop +!macroend + +!macro ConfigReadCall _FILE _ENTRY _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_ENTRY}` + ${CallArtificialFunction} ConfigRead_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro ConfigReadSCall _FILE _ENTRY _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_ENTRY}` + ${CallArtificialFunction} ConfigReadS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro ConfigWriteCall _FILE _ENTRY _VALUE _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_ENTRY}` + Push `${_VALUE}` + ${CallArtificialFunction} ConfigWrite_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro ConfigWriteSCall _FILE _ENTRY _VALUE _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_ENTRY}` + Push `${_VALUE}` + ${CallArtificialFunction} ConfigWriteS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro FileRecodeCall _FILE _FORMAT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + Push `${_FORMAT}` + ${CallArtificialFunction} FileRecode_ + !verbose pop +!macroend + +!macro TrimNewLinesCall _FILE _RESULT + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + Push `${_FILE}` + ${CallArtificialFunction} TrimNewLines_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro _TextFunc_TempFileForFile _FILE _RESULT + # XXX replace with GetParent + Push `${_FILE}` + Exch $0 + Push $1 + Push $2 + + StrCpy $2 $0 1 -1 + StrCmp $2 '\' 0 +3 + StrCpy $0 $0 -1 + goto -3 + + StrCpy $1 0 + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '\' +2 + StrCmp $2 '' 0 -3 + StrCpy $0 $0 $1 + + Pop $2 + Pop $1 + Exch $0 + Pop ${_RESULT} + # XXX + StrCmp ${_RESULT} "" 0 +2 + StrCpy ${_RESULT} $EXEDIR + GetTempFileName ${_RESULT} ${_RESULT} + StrCmp ${_RESULT} "" 0 +2 + GetTempFileName ${_RESULT} + ClearErrors +!macroend + +!define LineFind `!insertmacro LineFindCall` +!define un.LineFind `!insertmacro LineFindCall` + +!macro LineFind +!macroend + +!macro un.LineFind +!macroend + +!macro LineFind_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $3 + Exch + Exch $2 + Exch + Exch 2 + Exch $1 + Exch 2 + Exch 3 + Exch $0 + Exch 3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + Push $R9 + ClearErrors + + IfFileExists '$0' 0 TextFunc_LineFind_error + StrCmp $1 '/NUL' TextFunc_LineFind_begin + StrCpy $8 0 + IntOp $8 $8 - 1 + StrCpy $9 $1 1 $8 + StrCmp $9 \ +2 + StrCmp $9 '' +3 -3 + StrCpy $9 $1 $8 + IfFileExists '$9\*.*' 0 TextFunc_LineFind_error + + TextFunc_LineFind_begin: + StrCpy $4 1 + StrCpy $5 -1 + StrCpy $6 0 + StrCpy $7 0 + StrCpy $R4 '' + StrCpy $R6 '' + StrCpy $R7 '' + StrCpy $R8 0 + + StrCpy $8 $2 1 + StrCmp $8 '{' 0 TextFunc_LineFind_delspaces + StrCpy $2 $2 '' 1 + StrCpy $8 $2 1 -1 + StrCmp $8 '}' 0 TextFunc_LineFind_delspaces + StrCpy $2 $2 -1 + StrCpy $R6 TextFunc_LineFind_cut + + TextFunc_LineFind_delspaces: + StrCpy $8 $2 1 + StrCmp $8 ' ' 0 +3 + StrCpy $2 $2 '' 1 + goto -3 + StrCmp $2$7 '0' TextFunc_LineFind_file + StrCpy $4 '' + StrCpy $5 '' + StrCmp $2 '' TextFunc_LineFind_writechk + + TextFunc_LineFind_range: + StrCpy $8 0 + StrCpy $9 $2 1 $8 + StrCmp $9 '' +5 + StrCmp $9 ' ' +4 + StrCmp $9 ':' +3 + IntOp $8 $8 + 1 + goto -5 + StrCpy $5 $2 $8 + IntOp $5 $5 + 0 + IntOp $8 $8 + 1 + StrCpy $2 $2 '' $8 + StrCmp $4 '' 0 +2 + StrCpy $4 $5 + StrCmp $9 ':' TextFunc_LineFind_range + + IntCmp $4 0 0 +2 + IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp + StrCmp $R7 '' 0 TextFunc_LineFind_minus2plus + StrCpy $R7 0 + FileOpen $8 $0 r + FileRead $8 $9 + IfErrors +3 + IntOp $R7 $R7 + 1 + Goto -3 + FileClose $8 + + TextFunc_LineFind_minus2plus: + IntCmp $4 0 +5 0 +5 + IntOp $4 $R7 + $4 + IntOp $4 $4 + 1 + IntCmp $4 0 +2 0 +2 + StrCpy $4 0 + IntCmp $5 -1 TextFunc_LineFind_goto 0 TextFunc_LineFind_growthcmp + IntOp $5 $R7 + $5 + IntOp $5 $5 + 1 + TextFunc_LineFind_growthcmp: + IntCmp $4 $5 TextFunc_LineFind_goto TextFunc_LineFind_goto + StrCpy $5 $4 + TextFunc_LineFind_goto: + goto $7 + + TextFunc_LineFind_file: + StrCmp $1 '/NUL' TextFunc_LineFind_notemp + !insertmacro _TextFunc_TempFileForFile $1 $R4 + Push $R4 + FileOpen $R4 $R4 w + TextFunc_LineFind_notemp: + FileOpen $R5 $0 r + IfErrors TextFunc_LineFind_preerror + + TextFunc_LineFind_loop: + IntOp $R8 $R8 + 1 + FileRead $R5 $R9 + IfErrors TextFunc_LineFind_handleclose + + TextFunc_LineFind_cmp: + StrCmp $2$4$5 '' TextFunc_LineFind_writechk + IntCmp $4 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_writechk + StrCmp $5 -1 TextFunc_LineFind_call + IntCmp $5 $R8 TextFunc_LineFind_call 0 TextFunc_LineFind_call + + GetLabelAddress $7 TextFunc_LineFind_cmp + goto TextFunc_LineFind_delspaces + + TextFunc_LineFind_call: + StrCpy $7 $R9 + Push $0 + Push $1 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + StrCpy $R6 '$4:$5' + StrCmp $R7 '' +3 + IntOp $R7 $R8 - $R7 + IntOp $R7 $R7 - 1 + Call $3 + Pop $9 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + IfErrors TextFunc_LineFind_preerror + StrCmp $9 'StopLineFind' 0 +3 + IntOp $6 $6 + 1 + goto TextFunc_LineFind_handleclose + StrCmp $1 '/NUL' TextFunc_LineFind_loop + StrCmp $9 'SkipWrite' 0 +3 + IntOp $6 $6 + 1 + goto TextFunc_LineFind_loop + StrCmp $7 $R9 TextFunc_LineFind_write + IntOp $6 $6 + 1 + goto TextFunc_LineFind_write + + TextFunc_LineFind_writechk: + StrCmp $1 '/NUL' TextFunc_LineFind_loop + StrCmp $R6 TextFunc_LineFind_cut 0 TextFunc_LineFind_write + IntOp $6 $6 + 1 + goto TextFunc_LineFind_loop + + TextFunc_LineFind_write: + FileWrite $R4 $R9 + goto TextFunc_LineFind_loop + + TextFunc_LineFind_preerror: + SetErrors + + TextFunc_LineFind_handleclose: + StrCmp $1 '/NUL' +3 + FileClose $R4 + Pop $R4 + FileClose $R5 + IfErrors TextFunc_LineFind_error + + StrCmp $1 '/NUL' TextFunc_LineFind_end + StrCmp $1 '' 0 +2 + StrCpy $1 $0 + StrCmp $6 0 0 TextFunc_LineFind_rename + FileOpen $7 $0 r + FileSeek $7 0 END $8 + FileClose $7 + FileOpen $7 $R4 r + FileSeek $7 0 END $9 + FileClose $7 + IntCmp $8 $9 0 TextFunc_LineFind_rename + Delete $R4 + StrCmp $1 $0 TextFunc_LineFind_end + CopyFiles /SILENT $0 $1 + goto TextFunc_LineFind_end + + TextFunc_LineFind_rename: + Delete '$EXEDIR\$1' + Rename $R4 '$EXEDIR\$1' + IfErrors 0 TextFunc_LineFind_end + Delete $1 + Rename $R4 $1 + IfErrors 0 TextFunc_LineFind_end + + TextFunc_LineFind_error: + SetErrors + + TextFunc_LineFind_end: + Pop $R9 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!define LineRead `!insertmacro LineReadCall` +!define un.LineRead `!insertmacro LineReadCall` + +!macro LineRead +!macroend + +!macro un.LineRead +!macroend + +!macro LineRead_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + ClearErrors + + IfFileExists $0 0 TextFunc_LineRead_error + IntOp $1 $1 + 0 + IntCmp $1 0 TextFunc_LineRead_error 0 TextFunc_LineRead_plus + StrCpy $4 0 + FileOpen $2 $0 r + IfErrors TextFunc_LineRead_error + FileRead $2 $3 + IfErrors +3 + IntOp $4 $4 + 1 + Goto -3 + FileClose $2 + IntOp $1 $4 + $1 + IntOp $1 $1 + 1 + IntCmp $1 0 TextFunc_LineRead_error TextFunc_LineRead_error + + TextFunc_LineRead_plus: + FileOpen $2 $0 r + IfErrors TextFunc_LineRead_error + StrCpy $3 0 + IntOp $3 $3 + 1 + FileRead $2 $0 + IfErrors +4 + StrCmp $3 $1 0 -3 + FileClose $2 + goto TextFunc_LineRead_end + FileClose $2 + + TextFunc_LineRead_error: + SetErrors + StrCpy $0 '' + + TextFunc_LineRead_end: + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define FileReadFromEnd `!insertmacro FileReadFromEndCall` +!define un.FileReadFromEnd `!insertmacro FileReadFromEndCall` + +!macro FileReadFromEnd +!macroend + +!macro un.FileReadFromEnd +!macroend + +!macro FileReadFromEnd_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $7 + Push $8 + Push $9 + ClearErrors + + StrCpy $7 -1 + StrCpy $8 0 + IfFileExists $0 0 TextFunc_FileReadFromEnd_error + FileOpen $0 $0 r + IfErrors TextFunc_FileReadFromEnd_error + FileRead $0 $9 + IfErrors +4 + Push $9 + IntOp $8 $8 + 1 + goto -4 + FileClose $0 + + TextFunc_FileReadFromEnd_nextline: + StrCmp $8 0 TextFunc_FileReadFromEnd_end + Pop $9 + Push $1 + Push $7 + Push $8 + Call $1 + Pop $0 + Pop $8 + Pop $7 + Pop $1 + IntOp $7 $7 - 1 + IntOp $8 $8 - 1 + IfErrors TextFunc_FileReadFromEnd_error + StrCmp $0 'StopFileReadFromEnd' TextFunc_FileReadFromEnd_clearstack TextFunc_FileReadFromEnd_nextline + + TextFunc_FileReadFromEnd_error: + SetErrors + + TextFunc_FileReadFromEnd_clearstack: + StrCmp $8 0 TextFunc_FileReadFromEnd_end + Pop $9 + IntOp $8 $8 - 1 + goto TextFunc_FileReadFromEnd_clearstack + + TextFunc_FileReadFromEnd_end: + Pop $9 + Pop $8 + Pop $7 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!define LineSum `!insertmacro LineSumCall` +!define un.LineSum `!insertmacro LineSumCall` + +!macro LineSum +!macroend + +!macro un.LineSum +!macroend + +!macro LineSum_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + ClearErrors + + IfFileExists $0 0 TextFunc_LineSum_error + StrCpy $2 0 + FileOpen $0 $0 r + IfErrors TextFunc_LineSum_error + FileRead $0 $1 + IfErrors +3 + IntOp $2 $2 + 1 + Goto -3 + FileClose $0 + StrCpy $0 $2 + goto TextFunc_LineSum_end + + TextFunc_LineSum_error: + SetErrors + StrCpy $0 '' + + TextFunc_LineSum_end: + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define FileJoin `!insertmacro FileJoinCall` +!define un.FileJoin `!insertmacro FileJoinCall` + +!macro FileJoin +!macroend + +!macro un.FileJoin +!macroend + +!macro FileJoin_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Push $3 + Push $4 + Push $5 + ClearErrors + + IfFileExists $0 0 TextFunc_FileJoin_error + IfFileExists $1 0 TextFunc_FileJoin_error + StrCpy $3 0 + IntOp $3 $3 - 1 + StrCpy $4 $2 1 $3 + StrCmp $4 \ +2 + StrCmp $4 '' +3 -3 + StrCpy $4 $2 $3 + IfFileExists '$4\*.*' 0 TextFunc_FileJoin_error + + StrCmp $2 $0 0 +2 + StrCpy $2 '' + StrCmp $2 '' 0 +3 + StrCpy $4 $0 + Goto TextFunc_FileJoin_notemp + !insertmacro _TextFunc_TempFileForFile $2 $4 + CopyFiles /SILENT $0 $4 + TextFunc_FileJoin_notemp: + FileOpen $3 $4 a + IfErrors TextFunc_FileJoin_error + FileSeek $3 -1 END + FileRead $3 $5 + StrCmp $5 '$\r' +3 + StrCmp $5 '$\n' +2 + FileWrite $3 '$\r$\n' + + ;FileWrite $3 '$\r$\n--Divider--$\r$\n' + + FileOpen $0 $1 r + IfErrors TextFunc_FileJoin_error + FileRead $0 $5 + IfErrors +3 + FileWrite $3 $5 + goto -3 + FileClose $0 + FileClose $3 + StrCmp $2 '' TextFunc_FileJoin_end + Delete '$EXEDIR\$2' + Rename $4 '$EXEDIR\$2' + IfErrors 0 TextFunc_FileJoin_end + Delete $2 + Rename $4 $2 + IfErrors 0 TextFunc_FileJoin_end + + TextFunc_FileJoin_error: + SetErrors + + TextFunc_FileJoin_end: + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!macro TextCompareBody _TEXTFUNC_S + Exch $3 + Exch + Exch $2 + Exch + Exch 2 + Exch $1 + Exch 2 + Exch 3 + Exch $0 + Exch 3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + ClearErrors + + IfFileExists $0 0 TextFunc_TextCompare${_TEXTFUNC_S}_error + IfFileExists $1 0 TextFunc_TextCompare${_TEXTFUNC_S}_error + StrCmp $2 'FastDiff' +5 + StrCmp $2 'FastEqual' +4 + StrCmp $2 'SlowDiff' +3 + StrCmp $2 'SlowEqual' +2 + goto TextFunc_TextCompare${_TEXTFUNC_S}_error + + FileOpen $4 $0 r + IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error + FileOpen $5 $1 r + IfErrors TextFunc_TextCompare${_TEXTFUNC_S}_error + SetDetailsPrint textonly + + StrCpy $6 0 + StrCpy $8 0 + + TextFunc_TextCompare${_TEXTFUNC_S}_nextline: + StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_fast + IntOp $8 $8 + 1 + FileRead $4 $9 + IfErrors 0 +4 + FileClose $4 + StrCpy $4 '' + StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_end + StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_fast + StrCmp $2 'FastEqual' TextFunc_TextCompare${_TEXTFUNC_S}_fast TextFunc_TextCompare${_TEXTFUNC_S}_slow + + TextFunc_TextCompare${_TEXTFUNC_S}_fast: + StrCmp${_TEXTFUNC_S} $5 '' TextFunc_TextCompare${_TEXTFUNC_S}_call + IntOp $6 $6 + 1 + FileRead $5 $7 + IfErrors 0 +5 + FileClose $5 + StrCpy $5 '' + StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_end + StrCmp $2 'FastDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_close + StrCmp $2 'FastDiff' 0 +2 + StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_call + StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline + + TextFunc_TextCompare${_TEXTFUNC_S}_slow: + StrCmp${_TEXTFUNC_S} $4 '' TextFunc_TextCompare${_TEXTFUNC_S}_close + StrCpy $6 '' + DetailPrint '$8. $9' + FileSeek $5 0 + + TextFunc_TextCompare${_TEXTFUNC_S}_slownext: + FileRead $5 $7 + IfErrors 0 +2 + StrCmp $2 'SlowDiff' TextFunc_TextCompare${_TEXTFUNC_S}_call TextFunc_TextCompare${_TEXTFUNC_S}_nextline + StrCmp $2 'SlowDiff' 0 +2 + StrCmp${_TEXTFUNC_S} $7 $9 TextFunc_TextCompare${_TEXTFUNC_S}_nextline TextFunc_TextCompare${_TEXTFUNC_S}_slownext + IntOp $6 $6 + 1 + StrCmp${_TEXTFUNC_S} $7 $9 0 TextFunc_TextCompare${_TEXTFUNC_S}_slownext + + TextFunc_TextCompare${_TEXTFUNC_S}_call: + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Call $3 + Pop $0 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + StrCmp $0 'StopTextCompare' 0 TextFunc_TextCompare${_TEXTFUNC_S}_nextline + + TextFunc_TextCompare${_TEXTFUNC_S}_close: + FileClose $4 + FileClose $5 + goto TextFunc_TextCompare${_TEXTFUNC_S}_end + + TextFunc_TextCompare${_TEXTFUNC_S}_error: + SetErrors + + TextFunc_TextCompare${_TEXTFUNC_S}_end: + SetDetailsPrint both + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 +!macroend + +!define TextCompare `!insertmacro TextCompareCall` +!define un.TextCompare `!insertmacro TextCompareCall` + +!macro TextCompare +!macroend + +!macro un.TextCompare +!macroend + +!macro TextCompare_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro TextCompareBody '' + + !verbose pop +!macroend + +!define TextCompareS `!insertmacro TextCompareSCall` +!define un.TextCompareS `!insertmacro TextCompareSCall` + +!macro TextCompareS +!macroend + +!macro un.TextCompareS +!macroend + +!macro TextCompareS_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro TextCompareBody 'S' + + !verbose pop +!macroend + +!macro ConfigReadBody _TEXTFUNC_S + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + ClearErrors + + FileOpen $2 $0 r + IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error + StrLen $0 $1 + StrCmp${_TEXTFUNC_S} $0 0 TextFunc_ConfigRead${_TEXTFUNC_S}_error + + TextFunc_ConfigRead${_TEXTFUNC_S}_readnext: + FileRead $2 $3 + IfErrors TextFunc_ConfigRead${_TEXTFUNC_S}_error + StrCpy $4 $3 $0 + StrCmp${_TEXTFUNC_S} $4 $1 0 TextFunc_ConfigRead${_TEXTFUNC_S}_readnext + StrCpy $0 $3 '' $0 + StrCpy $4 $0 1 -1 + StrCmp${_TEXTFUNC_S} $4 '$\r' +2 + StrCmp${_TEXTFUNC_S} $4 '$\n' 0 TextFunc_ConfigRead${_TEXTFUNC_S}_close + StrCpy $0 $0 -1 + goto -4 + + TextFunc_ConfigRead${_TEXTFUNC_S}_error: + SetErrors + StrCpy $0 '' + + TextFunc_ConfigRead${_TEXTFUNC_S}_close: + FileClose $2 + + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 +!macroend + +!define ConfigRead `!insertmacro ConfigReadCall` +!define un.ConfigRead `!insertmacro ConfigReadCall` + +!macro ConfigRead +!macroend + +!macro un.ConfigRead +!macroend + +!macro ConfigRead_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro ConfigReadBody '' + + !verbose pop +!macroend + +!define ConfigReadS `!insertmacro ConfigReadSCall` +!define un.ConfigReadS `!insertmacro ConfigReadSCall` + +!macro ConfigReadS +!macroend + +!macro un.ConfigReadS +!macroend + +!macro ConfigReadS_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro ConfigReadBody 'S' + + !verbose pop +!macroend + +!macro ConfigWriteBody _TEXTFUNC_S + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Push $3 + Push $4 + Push $5 + Push $6 + ClearErrors + + IfFileExists $0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_error + FileOpen $3 $0 a + IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_error + + StrLen $0 $1 + StrCmp${_TEXTFUNC_S} $0 0 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext + StrCpy $0 '' + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close + + TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext: + FileRead $3 $4 + IfErrors TextFunc_ConfigWrite${_TEXTFUNC_S}_add + StrCpy $5 $4 $0 + StrCmp${_TEXTFUNC_S} $5 $1 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_readnext + + StrCpy $5 0 + IntOp $5 $5 - 1 + StrCpy $6 $4 1 $5 + StrCmp${_TEXTFUNC_S} $6 '$\r' -2 + StrCmp${_TEXTFUNC_S} $6 '$\n' -3 + StrCpy $6 $4 + StrCmp${_TEXTFUNC_S} $5 -1 +3 + IntOp $5 $5 + 1 + StrCpy $6 $4 $5 + + StrCmp${_TEXTFUNC_S} $2 '' TextFunc_ConfigWrite${_TEXTFUNC_S}_change + StrCmp${_TEXTFUNC_S} $6 '$1$2' 0 TextFunc_ConfigWrite${_TEXTFUNC_S}_change + StrCpy $0 SAME + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close + + TextFunc_ConfigWrite${_TEXTFUNC_S}_change: + FileSeek $3 0 CUR $5 + StrLen $4 $4 + IntOp $4 $5 - $4 + FileSeek $3 0 END $6 + IntOp $6 $6 - $5 + + System::Alloc $6 + Pop $0 + FileSeek $3 $5 SET + System::Call 'kernel32::ReadFile(p r3, p r0, i $6, t.,)' + FileSeek $3 $4 SET + StrCmp${_TEXTFUNC_S} $2 '' +2 + FileWrite $3 '$1$2$\r$\n' + System::Call 'kernel32::WriteFile(p r3, p r0, i $6, t.,)' + System::Call 'kernel32::SetEndOfFile(p r3)' + System::Free $0 + StrCmp${_TEXTFUNC_S} $2 '' +3 + StrCpy $0 CHANGED + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close + StrCpy $0 DELETED + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close + + TextFunc_ConfigWrite${_TEXTFUNC_S}_add: + StrCmp${_TEXTFUNC_S} $2 '' 0 +3 + StrCpy $0 SAME + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_close + FileSeek $3 -1 END + FileRead $3 $4 + IfErrors +4 + StrCmp${_TEXTFUNC_S} $4 '$\r' +3 + StrCmp${_TEXTFUNC_S} $4 '$\n' +2 + FileWrite $3 '$\r$\n' + FileWrite $3 '$1$2$\r$\n' + StrCpy $0 ADDED + + TextFunc_ConfigWrite${_TEXTFUNC_S}_close: + FileClose $3 + goto TextFunc_ConfigWrite${_TEXTFUNC_S}_end + + TextFunc_ConfigWrite${_TEXTFUNC_S}_error: + SetErrors + StrCpy $0 '' + + TextFunc_ConfigWrite${_TEXTFUNC_S}_end: + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 +!macroend + +!define ConfigWrite `!insertmacro ConfigWriteCall` +!define un.ConfigWrite `!insertmacro ConfigWriteCall` + +!macro ConfigWrite +!macroend + +!macro un.ConfigWrite +!macroend + +!macro ConfigWrite_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro ConfigWriteBody '' + + !verbose pop +!macroend + +!define ConfigWriteS `!insertmacro ConfigWriteSCall` +!define un.ConfigWriteS `!insertmacro ConfigWriteSCall` + +!macro ConfigWriteS +!macroend + +!macro un.ConfigWriteS +!macroend + +!macro ConfigWriteS_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + !insertmacro ConfigWriteBody 'S' + + !verbose pop +!macroend + +!define FileRecode `!insertmacro FileRecodeCall` +!define un.FileRecode `!insertmacro FileRecodeCall` + +!macro FileRecode +!macroend + +!macro un.FileRecode +!macroend + +!macro FileRecode_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + + IfFileExists $0 0 TextFunc_FileRecode_error + StrCmp $1 OemToChar +2 + StrCmp $1 CharToOem 0 TextFunc_FileRecode_error + + FileOpen $2 $0 a + FileSeek $2 0 END $3 + System::Alloc $3 + Pop $4 + FileSeek $2 0 SET + System::Call 'kernel32::ReadFile(p r2, p r4, i $3, t.,)' + System::Call 'user32::$1Buff(p r4, p r4, i $3)' + FileSeek $2 0 SET + System::Call 'kernel32::WriteFile(p r2, p r4, i $3, t.,)' + System::Free $4 + FileClose $2 + goto TextFunc_FileRecode_end + + TextFunc_FileRecode_error: + SetErrors + + TextFunc_FileRecode_end: + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + + !verbose pop +!macroend + +!define TrimNewLines `!insertmacro TrimNewLinesCall` +!define un.TrimNewLines `!insertmacro TrimNewLinesCall` + +!macro TrimNewLines +!macroend + +!macro un.TrimNewLines +!macroend + +!macro TrimNewLines_ + !verbose push + !verbose ${_TEXTFUNC_VERBOSE} + + Exch $0 + Push $1 + Push $2 + + StrCpy $1 0 + IntOp $1 $1 - 1 + StrCpy $2 $0 1 $1 + StrCmp $2 '$\r' -2 + StrCmp $2 '$\n' -3 + StrCmp $1 -1 +3 + IntOp $1 $1 + 1 + StrCpy $0 $0 $1 + + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/UpgradeDLL.nsh b/libs/NSIS/NSIS-source/Include/UpgradeDLL.nsh new file mode 100644 index 0000000000..cfb294719e --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/UpgradeDLL.nsh @@ -0,0 +1,207 @@ +/* + +NOTE: +----- +This macro is provided for backwards compatibility with NSIS 2.0 scripts. +It's recommended you update your scripts to use the new Library.nsh macros. + + +Macro - Upgrade DLL File +Written by Joost Verburg +------------------------ + +Parameters: +LOCALFILE Location of the new DLL file (on the compiler system) +DESTFILE Location of the DLL file that should be upgraded (on the user's system) +TEMPBASEDIR Directory on the user's system to store a temporary file when the system has + to be rebooted. + For Win9x/ME support, this should be on the same volume as DESTFILE. + The Windows temp directory could be located on any volume, so you cannot use + this directory. + +Define UPGRADEDLL_NOREGISTER if you want to upgrade a DLL that does not have to be registered. + +Notes: + +* If you want to support Windows 9x/ME, you can only use short filenames (8.3). + +* This macro uses the GetDLLVersionLocal command to retrieve the version of local libraries. + This command is only supported when compiling on a Windows system. + +------------------------ + +Example: + +!insertmacro UpgradeDLL "dllname.dll" "$SYSDIR\dllname.dll" "$SYSDIR" + +*/ + +!ifndef UPGRADEDLL_INCLUDED + +!define UPGRADEDLL_INCLUDED + +!macro __UpgradeDLL_Helper_AddRegToolEntry mode filename tempdir + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + ;------------------------ + ;Copy the parameters + + Push "${filename}" + Push "${tempdir}" + + Pop $R2 ; temporary directory + Pop $R1 ; file name to register + + ;------------------------ + ;Advance counter + + StrCpy $R0 0 + ReadRegDWORD $R0 HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "count" + IntOp $R0 $R0 + 1 + WriteRegDWORD HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "count" "$R0" + + ;------------------------ + ;Setup RegTool + + !if ! /FileExists "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" + !error "Missing RegTool for ${NSIS_CPU}!" + !endif + + ReadRegStr $R3 HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" "NSIS.Library.RegTool.v3" + StrCpy $R3 $R3 -4 1 + IfFileExists $R3 +3 + + File /oname=$R2\NSIS.Library.RegTool.v3.$HWNDPARENT.exe "${NSISDIR}\Bin\RegTool-${NSIS_CPU}.bin" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\RunOnce" \ + "NSIS.Library.RegTool.v3" '"$R2\NSIS.Library.RegTool.v3.$HWNDPARENT.exe" /S' + + ;------------------------ + ;Add RegTool entry + + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "$R0.file" "$R1" + WriteRegStr HKLM "Software\NSIS.Library.RegTool.v3\UpgradeDLLSession" "$R0.mode" "${mode}" + + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + +!macroend + +!macro UpgradeDLL LOCALFILE DESTFILE TEMPBASEDIR + + Push $R0 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + !define UPGRADEDLL_UNIQUE "${__FILE__}${__LINE__}" + + SetOverwrite try + + ;------------------------ + ;Copy the macro parameters to a run-time to a variable, + ;this allows the usage of variables as parameter + + StrCpy $R4 "${DESTFILE}" + StrCpy $R5 "${TEMPBASEDIR}" + + ;------------------------ + ;Get version information + + IfFileExists $R4 0 "upgradedll.copy_${UPGRADEDLL_UNIQUE}" + + ClearErrors + GetDLLVersionLocal "${LOCALFILE}" $R0 $R1 + GetDLLVersion $R4 $R2 $R3 + IfErrors "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + + IntCmpU $R0 $R2 0 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + IntCmpU $R1 $R3 "upgradedll.done_${UPGRADEDLL_UNIQUE}" "upgradedll.done_${UPGRADEDLL_UNIQUE}" \ + "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Upgrade + + "upgradedll.upgrade_${UPGRADEDLL_UNIQUE}:" + !ifndef UPGRADEDLL_NOREGISTER + ;Unregister the DLL + UnRegDLL $R4 + !endif + + ;------------------------ + ;Copy + + ClearErrors + StrCpy $R0 $R4 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + IfErrors 0 "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Copy on reboot + + GetTempFileName $R0 $R5 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + Rename /REBOOTOK $R0 $R4 + + ;------------------------ + ;Register on reboot + + !insertmacro __UpgradeDLL_Helper_AddRegToolEntry 'D' $R4 $R5 + + Goto "upgradedll.done_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;DLL does not exist + + "upgradedll.copy_${UPGRADEDLL_UNIQUE}:" + StrCpy $R0 $R4 + Call ":upgradedll.file_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Register + + "upgradedll.noreboot_${UPGRADEDLL_UNIQUE}:" + !ifndef UPGRADEDLL_NOREGISTER + RegDLL $R4 + !endif + + ;------------------------ + ;Done + + "upgradedll.done_${UPGRADEDLL_UNIQUE}:" + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + + ;------------------------ + ;End + + Goto "upgradedll.end_${UPGRADEDLL_UNIQUE}" + + ;------------------------ + ;Extract + + "upgradedll.file_${UPGRADEDLL_UNIQUE}:" + File /oname=$R0 "${LOCALFILE}" + Return + + "upgradedll.end_${UPGRADEDLL_UNIQUE}:" + + SetOverwrite lastused + + !undef UPGRADEDLL_UNIQUE + +!macroend + +!endif diff --git a/libs/NSIS/NSIS-source/Include/Util.nsh b/libs/NSIS/NSIS-source/Include/Util.nsh new file mode 100644 index 0000000000..30d03a5037 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Util.nsh @@ -0,0 +1,184 @@ +; --------------------- +; Util.nsh +; --------------------- +; +; Voodoo macros to make end-user usage easier. This may be documented someday. + +!verbose push 3 +!ifndef ___UTIL__NSH___ +!define ___UTIL__NSH___ + +# CallArtificialFunction, see WinVer.nsh and *Func.nsh for usage examples +!macro CallArtificialFunctionHelper TYPE NAME + !verbose pop + Call :.${NAME}${TYPE} + !ifndef ${NAME}${TYPE}_DEFINED + !verbose push 2 + Goto ${NAME}${TYPE}_DONE + !define ${NAME}${TYPE}_DEFINED + !verbose pop + .${NAME}${TYPE}: + !insertmacro ${NAME} + Return + ${NAME}${TYPE}_DONE: + !endif + !verbose push 2 +!macroend + +!macro CallArtificialFunction NAME + !verbose push 2 + !ifdef __UNINSTALL__ + !insertmacro CallArtificialFunctionHelper uninst ${NAME} + !else + !insertmacro CallArtificialFunctionHelper inst ${NAME} + !endif + !verbose pop +!macroend +!define CallArtificialFunction `!insertmacro CallArtificialFunction` + +!macro CallArtificialFunction2 NAME ; Retained for v2.4x..v3.0b0 compatibility + ${CallArtificialFunction} ${NAME} +!macroend +!define CallArtificialFunction2 `!insertmacro CallArtificialFunction` + + +!define Int32Op '!insertmacro Int32Op ' +!define Int64Op '!insertmacro Int64Op ' +!define IntPtrOp '!insertmacro IntPtrOp ' +!macro Int32Op r a o b +IntOp `${r}` `${a}` `${o}` ${b} +!macroend +!macro Int64Op r a o b +!echo "Int64Op ${r}=${a}${o}${b}" +!verbose push 2 +System::Int64Op `${a}` `${o}` ${b} +Pop ${r} +!verbose pop +!macroend +!macro IntPtrOp r a o b +IntPtrOp `${r}` `${a}` `${o}` `${b}` +!macroend + +!define Int32Cmp '!insertmacro Int32Cmp ' +!define Int64Cmp '!insertmacro Int64Cmp ' +!define IntPtrCmp '!insertmacro IntPtrCmp ' +!macro Int32Cmp a b jeek jles jgtr +IntCmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!macroend +!macro Int64Cmp a b jeek jles jgtr +!if ${NSIS_PTR_SIZE} <= 4 +!ifmacrondef _LOGICLIB_TEMP +!include LogicLib.nsh +!endif +!echo "Int64Cmp ${a}:${b} =${jeek}, <${jles}, >${jgtr}" +!verbose push 2 +${IfThen} ${a} L= ${b} ${|} Goto ${jeek} ${|} +!insertmacro _L< ${a} ${b} `${jles}` `${jgtr}` +!verbose pop +!else +Int64Cmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!endif +!macroend +!macro IntPtrCmp a b jeek jles jgtr +IntPtrCmp `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!macroend + +!define Int32CmpU '!insertmacro Int32CmpU ' +!define Int64CmpU '!insertmacro Int64CmpU ' +!define IntPtrCmpU '!insertmacro IntPtrCmpU ' +!macro Int32CmpU a b jeek jles jgtr +IntCmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!macroend +!macro Int64CmpUHelper +; This macro performs "$_LOGICLIB_TEMP = a < b ? -1 : a > b ? 1 : 0" but System::Int64Op does not support unsigned operations so we have to perform multiple steps +!ifmacrondef _LOGICLIB_TEMP +!include LogicLib.nsh +!endif +!insertmacro _LOGICLIB_TEMP +Exch $2 ; b +Exch +Exch $1 ; a +; if (a == b) return 0; +; if (a < 0) +; { +; if (b >= 0) return 1 +; } +; else +; { +; if (b < 0) return -1 +; } +; return a < b ? -1 : 1 +System::Int64Op $1 ^ $2 ; Using xor so $_LOGICLIB_TEMP ends up as 0 when they are equal +Pop $_LOGICLIB_TEMP +StrCmp $_LOGICLIB_TEMP 0 ret ; NOTE: Must use StrCmp, IntCmp fails on "0x8000000000000001 Z> 1" +System::Int64Op $1 < 0 +Pop $_LOGICLIB_TEMP +StrCmp $_LOGICLIB_TEMP 0 checkNegOther +System::Int64Op $2 < 0 ; System::Int64Op does not support the >= operator so we invert the operation +Pop $_LOGICLIB_TEMP +StrCmp $_LOGICLIB_TEMP 0 retPos finalCmp +retPos: +StrCpy $_LOGICLIB_TEMP "1" +Goto ret +checkNegOther: +System::Int64Op $2 < 0 +Pop $_LOGICLIB_TEMP +StrCmp $_LOGICLIB_TEMP 0 finalCmp retNeg +retNeg: +StrCpy $_LOGICLIB_TEMP "-1" +Goto ret +finalCmp: +System::Int64Op $1 < $2 +Pop $_LOGICLIB_TEMP +StrCmp $_LOGICLIB_TEMP 0 retPos retNeg +ret: +Pop $1 +Pop $2 +!macroend +!macro Int64CmpU a b jeek jles jgtr +!if ${NSIS_PTR_SIZE} <= 4 +!echo "Int64CmpU ${a}:${b} =${jeek}, <${jles}, >${jgtr}" +!verbose push 2 +Push `${a}` +Push `${b}` +!insertmacro CallArtificialFunction Int64CmpUHelper +IntCmp $_LOGICLIB_TEMP 0 `${jeek}` `${jles}` `${jgtr}` +!verbose pop +!else +Int64CmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!endif +!macroend +!macro IntPtrCmpU a b jeek jles jgtr +IntPtrCmpU `${a}` `${b}` `${jeek}` `${jles}` `${jgtr}` +!macroend + + +!define MakeARPInstallDate "!insertmacro MakeARPInstallDate " +!macro MakeARPInstallDate _outvar +System::Call 'KERNEL32::GetDateFormat(i0x409,i0,p0,t"yyyyMMdd",t.s,i${NSIS_MAX_STRLEN})' +Pop ${_outvar} +!macroend + + +!define /IfNDef SPI_GETHIGHCONTRAST 0x42 +!define /IfNDef HCF_HIGHCONTRASTON 0x01 +!define /IfNDef /math SYSSIZEOF_HIGHCONTRAST 8 + ${NSIS_PTR_SIZE} +!define IsHighContrastModeActive '"" IsHighContrastModeActive ""' +!macro _IsHighContrastModeActive _lhs _rhs _t _f +!ifmacrondef _LOGICLIB_TEMP +!include LogicLib.nsh +!endif +!insertmacro _LOGICLIB_TEMP +Push $1 +System::Call '*(i${SYSSIZEOF_HIGHCONTRAST},i0,p)p.r1' +System::Call 'USER32::SystemParametersInfo(i${SPI_GETHIGHCONTRAST},i${SYSSIZEOF_HIGHCONTRAST},pr1,i0)' +System::Call '*$1(i,i.s)' +Pop $_LOGICLIB_TEMP +System::Free $1 +Pop $1 +!insertmacro _& $_LOGICLIB_TEMP ${HCF_HIGHCONTRASTON} `${_t}` `${_f}` +!macroend + + +!endif # !___UTIL__NSH___ +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/VB6RunTime.nsh b/libs/NSIS/NSIS-source/Include/VB6RunTime.nsh new file mode 100644 index 0000000000..be8460b727 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/VB6RunTime.nsh @@ -0,0 +1,90 @@ +/* + +VB6RunTime.nsh + +Setup of Visual Basic 6.0 run-time files, including the Oleaut32.dll security update + +Copyright 2008-2026 Joost Verburg + +To obtain the run-time files, download and extract +https://nsis.sourceforge.io/vb6runtime.zip + +Script code for installation: + +!insertmacro InstallVB6RunTime FOLDER ALREADY_INSTALLED + +in which FOLDER is the location of the run-time files and ALREADY_INSTALLED is the +name of a variable that is empty when the application is installed for the first time +and non-empty otherwise + +Script code for uninstallation: + +!insertmacro UnInstallVB6RunTime + +Remarks: + +* You may have to install additional files for such Visual Basic application to work, + such as OCX files for user interface controls. + +* Installation of the run-time files requires Administrator or Power User privileges. + Use the Multi-User header file to verify whether these privileges are available. + +* Add a Modern UI finish page or another check (see IfRebootFlag in the NSIS Users + Manual) to allow the user to restart the computer when necessary. + +*/ + +!ifndef VB6_INCLUDED +!define VB6_INCLUDED +!verbose push +!verbose 3 + +!include Library.nsh +!include WinVer.nsh + +!macro VB6RunTimeInstall FOLDER ALREADY_INSTALLED + + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\msvbvm60.dll" "$SYSDIR\msvbvm60.dll" "$SYSDIR" + + ;The files below will only be installed on Win9x/NT4 + + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\olepro32.dll" "$SYSDIR\olepro32.dll" "$SYSDIR" + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\comcat.dll" "$SYSDIR\comcat.dll" "$SYSDIR" + !insertmacro InstallLib DLL "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\asycfilt.dll" "$SYSDIR\asycfilt.dll" "$SYSDIR" + !insertmacro InstallLib TLB "${ALREADY_INSTALLED}" REBOOT_PROTECTED "${FOLDER}\stdole2.tlb" "$SYSDIR\stdole2.tlb" "$SYSDIR" + + Push $R0 + + ${if} ${IsNT} + ${if} ${IsWinNT4} + ReadRegStr $R0 HKLM "System\CurrentControlSet\Control" "ProductOptions" + ${if} $R0 == "Terminal Server" + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4TS\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" + ${else} + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" + ${endif} + ${endif} + ${else} + ;No Oleaut32.dll with the security update has been released for Windows 9x. + ;The NT4 version is used because NT4 and Win9x used to share the same 2.40 version + ;and version 2.40.4519.0 is reported to work fine on Win9x. + !insertmacro InstallLib REGDLL "${ALREADY_INSTALLED}" REBOOT_NOTPROTECTED "${FOLDER}\NT4\oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR" + ${endif} + + Pop $R0 + +!macroend + +!macro VB6RunTimeUnInstall + + !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\msvbvm60.dll" + !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\oleaut32.dll" + !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\olepro32.dll" + !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\comcat.dll" + !insertmacro UnInstallLib DLL SHARED NOREMOVE "$SYSDIR\asycfilt.dll" + !insertmacro UnInstallLib TLB SHARED NOREMOVE "$SYSDIR\stdole2.tlb" + +!macroend + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/VPatchLib.nsh b/libs/NSIS/NSIS-source/Include/VPatchLib.nsh new file mode 100644 index 0000000000..1e01bc8c72 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/VPatchLib.nsh @@ -0,0 +1,47 @@ +; PatchLib v3.0 +; ============= +; +; Library with macro for use with VPatch (DLL version) in NSIS 2.0.5+ +; Created by Koen van de Sande + +!include LogicLib.nsh + +!macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE + + Push $1 + Push $2 + Push $3 + Push $4 + + Push ${SOURCEFILE} + Push ${TEMPFILE} + + Pop $2 # temp file + Pop $3 # source file + + InitPluginsDir + GetTempFileName $1 $PLUGINSDIR + File /oname=$1 ${PATCHDATA} + + vpatch::vpatchfile $1 $3 $2 + Pop $4 + DetailPrint $4 + + StrCpy $4 $4 2 + ${Unless} $4 == "OK" + SetErrors + ${EndIf} + + ${If} ${FileExists} $2 + Delete $3 + Rename /REBOOTOK $2 $3 + ${EndIf} + + Delete $1 + + Pop $4 + Pop $3 + Pop $2 + Pop $1 + +!macroend diff --git a/libs/NSIS/NSIS-source/Include/Win/COM.nsh b/libs/NSIS/NSIS-source/Include/Win/COM.nsh new file mode 100644 index 0000000000..3b2a0115b8 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/COM.nsh @@ -0,0 +1,392 @@ +/* +------------- + COM.nsh +------------- + +COM defines and helper macros + +; Example usage: +!include LogicLib.nsh +!include Win\COM.nsh +!include Win\Propkey.nsh +!insertmacro ComHlpr_CreateInProcInstance ${CLSID_ShellLink} ${IID_IShellLink} r0 "" +${If} $0 P<> 0 + ${IShellLink::SetPath} $0 '("%COMSPEC%").r1' + ${IShellLink::SetArguments} $0 '("/k echo HelloWorld").r2' + ${If} $1 = 0 + ${AndIf} $2 = 0 + ${IUnknown::QueryInterface} $0 '("${IID_IPropertyStore}",.r1)' + ${If} $1 P<> 0 + System::Call '*${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_StartPinOption})p.r2' + System::Call '*${SYSSTRUCT_PROPVARIANT}(${VT_UI4},,&i4 ${APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL})p.r3' + ${IPropertyStore::SetValue} $1 '($2,$3)' + + ; Reuse the PROPERTYKEY & PROPVARIANT buffers to set another property + System::Call '*$2${SYSSTRUCT_PROPERTYKEY}(${PKEY_AppUserModel_ExcludeFromShowInNewInstall})' + System::Call '*$3${SYSSTRUCT_PROPVARIANT}(${VT_BOOL},,&i2 ${VARIANT_TRUE})' + ${IPropertyStore::SetValue} $1 '($2,$3)' + + System::Free $2 + System::Free $3 + ${IPropertyStore::Commit} $1 "" + ${IUnknown::Release} $1 "" + ${EndIf} + ${IUnknown::QueryInterface} $0 '("${IID_IPersistFile}",.r1)' + ${If} $1 P<> 0 + ${IPersistFile::Save} $1 '("$SMPrograms\nsis_test.lnk",1)' + ${IUnknown::Release} $1 "" + ${EndIf} + ${EndIf} + ${IUnknown::Release} $0 "" +${EndIf} + +*/ + + +!ifndef __WIN_COM__INC +!define __WIN_COM__INC ${NSIS_CHAR_SIZE} +!verbose push +!verbose 3 + +!define /ifndef STGM_READ 0 +!define /ifndef STGM_WRITE 1 +!define /ifndef STGM_READWRITE 2 +!define /ifndef STGM_SHARE_DENY_NONE 0x00000040 +!define /ifndef STGM_SHARE_DENY_READ 0x00000030 +!define /ifndef STGM_SHARE_DENY_WRITE 0x00000020 +!define /ifndef STGM_SHARE_EXCLUSIVE 0x00000010 +!define /ifndef STGM_PRIORITY 0x00040000 +!define /ifndef STGM_CREATE 0x00001000 +!define /ifndef STGM_CONVERT 0x00020000 +!define /ifndef STGM_FAILIFTHERE 0 +!define /ifndef STGM_DELETEONRELEASE 0x04000000 + +!define /ifndef CLSCTX_INPROC_SERVER 0x1 +!define /ifndef CLSCTX_INPROC_HANDLER 0x2 +!define /ifndef CLSCTX_LOCAL_SERVER 0x4 +!define /ifndef CLSCTX_REMOTE_SERVER 0x10 +!define /ifndef CLSCTX_ACTIVATE_32_BIT_SERVER 0x40000 +!define /ifndef CLSCTX_ACTIVATE_64_BIT_SERVER 0x80000 +!define /ifndef CLSCTX_ENABLE_CLOAKING 0x100000 + +!define NSISCOMCALL "!insertmacro NSISCOMCALL " +!macro NSISCOMCALL vtblidx decl ptr params +!if ${NSIS_CHAR_SIZE} <> ${__WIN_COM__INC} +; Warn if QueryInterface() for IID_IShellLink etc will return the wrong interface +!warning "NSIS_CHAR_SIZE changed, existing defines and macros might not work correctly!" +!endif +System::Call `${ptr}->${vtblidx}${decl}${params}` +!macroend +!define NSISCOMIFACEDECL "!insertmacro NSISCOMIFACEDECL " +!macro NSISCOMIFACEDECL iface method vtblidx decl +!define ${iface}::${method} `${NSISCOMCALL} ${vtblidx} ${decl} ` +!macroend + +!macro ComHlpr_CreateInstance clsid iid sysoutvarIFacePtr sysret +System::Call 'OLE32::CoCreateInstance(g"${clsid}",i0,i23,g"${iid}",*p.${sysoutvarIFacePtr})i${sysret}' +!macroend +!macro ComHlpr_CreateInProcInstance clsid iid sysoutvarIFacePtr sysret +System::Call 'OLE32::CoCreateInstance(g"${clsid}",i0,i${CLSCTX_INPROC_SERVER},g"${iid}",*p.${sysoutvarIFacePtr})i${sysret}' +!macroend + +!macro ComHlpr_SafeRelease _p +${If} ${_p} P<> 0 + ${IUnknown::Release} ${_p} "" +${EndIf} +!macroend +!macro ComHlpr_SafeReleaseAndNull _p +${If} ${_p} P<> 0 + ${IUnknown::Release} ${_p} "" + StrCpy ${_p} 0 +${EndIf} +!macroend + + +!ifndef IID_IUnknown +!define IID_IUnknown {00000000-0000-0000-C000-000000000046} +${NSISCOMIFACEDECL}IUnknown QueryInterface 0 (g,*p)i +${NSISCOMIFACEDECL}IUnknown AddRef 1 ()i +${NSISCOMIFACEDECL}IUnknown Release 2 ()i +!endif + +!ifndef IID_IPersist +!define IID_IPersist {0000010c-0000-0000-C000-000000000046} +${NSISCOMIFACEDECL}IPersist GetClassID 3 (g)i +!endif + +!ifndef IID_IPersistStream +!define IID_IPersistStream {00000109-0000-0000-C000-000000000046} ; IPersist> +${NSISCOMIFACEDECL}IPersistStream IsDirty 4 ()i +${NSISCOMIFACEDECL}IPersistStream Load 5 (p,i)i +${NSISCOMIFACEDECL}IPersistStream Save 6 (p,i)i +${NSISCOMIFACEDECL}IPersistStream GetSizeMax 7 (*l)i +!endif +!ifndef IID_IPersistStreamInit +!define IID_IPersistStreamInit {7FD52380-4E07-101B-AE2D-08002B2EC713} ; IPersist> +${NSISCOMIFACEDECL}IPersistStreamInit IsDirty 4 ()i +${NSISCOMIFACEDECL}IPersistStreamInit Load 5 (p,i)i +${NSISCOMIFACEDECL}IPersistStreamInit Save 6 (p,i)i +${NSISCOMIFACEDECL}IPersistStreamInit GetSizeMax 7 (*l)i +${NSISCOMIFACEDECL}IPersistStreamInit InitNew 8 ()i +!endif + +!ifndef IID_IPersistFile +!define IID_IPersistFile {0000010b-0000-0000-C000-000000000046} ; IPersist> +${NSISCOMIFACEDECL}IPersistFile IsDirty 4 ()i +${NSISCOMIFACEDECL}IPersistFile Load 5 (w,i)i +${NSISCOMIFACEDECL}IPersistFile Save 6 (w,i)i +${NSISCOMIFACEDECL}IPersistFile SaveCompleted 7 (w)i +${NSISCOMIFACEDECL}IPersistFile GetCurFile 8 (*w)i +!endif + +!ifndef CLSID_ShellLink +!define CLSID_ShellLink {00021401-0000-0000-c000-000000000046} +!endif +!ifndef IID_IShellLink +!define IID_IShellLinkA {000214ee-0000-0000-c000-000000000046} +!define IID_IShellLinkW {000214f9-0000-0000-c000-000000000046} +!ifdef NSIS_UNICODE +!define IID_IShellLink ${IID_IShellLinkW} +!else +!define IID_IShellLink ${IID_IShellLinkA} +!endif +${NSISCOMIFACEDECL}IShellLink GetPath 3 (t,i,p,i)i +${NSISCOMIFACEDECL}IShellLink GetIDList 4 (*p)i +${NSISCOMIFACEDECL}IShellLink SetIDList 5 (p)i +${NSISCOMIFACEDECL}IShellLink GetDescription 6 (t,i)i +${NSISCOMIFACEDECL}IShellLink SetDescription 7 (t)i +${NSISCOMIFACEDECL}IShellLink GetWorkingDirectory 8 (t,i)i +${NSISCOMIFACEDECL}IShellLink SetWorkingDirectory 9 (t)i +${NSISCOMIFACEDECL}IShellLink GetArguments 10 (t,i)i +${NSISCOMIFACEDECL}IShellLink SetArguments 11 (t)i +${NSISCOMIFACEDECL}IShellLink GetHotkey 12 (*i0)i +${NSISCOMIFACEDECL}IShellLink SetHotkey 13 (&i2)i +${NSISCOMIFACEDECL}IShellLink GetShowCmd 14 (*i)i +${NSISCOMIFACEDECL}IShellLink SetShowCmd 15 (i)i +${NSISCOMIFACEDECL}IShellLink GetIconLocation 16 (t,i,*i)i +${NSISCOMIFACEDECL}IShellLink SetIconLocation 17 (t,i)i +${NSISCOMIFACEDECL}IShellLink SetRelativePath 18 (t,i)i +${NSISCOMIFACEDECL}IShellLink Resolve 19 (p,i)i +${NSISCOMIFACEDECL}IShellLink SetPath 20 (t)i +!endif + +!ifndef IID_IShellLinkDataList +!define IID_IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1} +${NSISCOMIFACEDECL}IShellLinkDataList AddDataBlock 3 (p)i +${NSISCOMIFACEDECL}IShellLinkDataList CopyDataBlock 4 (i,*p)i +${NSISCOMIFACEDECL}IShellLinkDataList RemoveDataBlock 5 (i)i +${NSISCOMIFACEDECL}IShellLinkDataList GetFlags 6 (*i)i +${NSISCOMIFACEDECL}IShellLinkDataList SetFlags 7 (i)i +!endif +!define /ifndef EXP_SZ_LINK_SIG 0xA0000001 +!define /ifndef NT_CONSOLE_PROPS_SIG 0xA0000002 +!define /ifndef NT_FE_CONSOLE_PROPS_SIG 0xA0000004 +!define /ifndef EXP_SPECIAL_FOLDER_SIG 0xA0000005 +!define /ifndef EXP_DARWIN_ID_SIG 0xA0000006 +!define /ifndef EXP_SZ_ICON_SIG 0xA0000007 +!define /ifndef EXP_PROPERTYSTORAGE_SIG 0xA0000009 +;SHELL_LINK_DATA_FLAGS +!define /ifndef SLDF_HAS_ID_LIST 0x00000001 +!define /ifndef SLDF_HAS_LINK_INFO 0x00000002 +!define /ifndef SLDF_HAS_NAME 0x00000004 +!define /ifndef SLDF_HAS_RELPATH 0x00000008 +!define /ifndef SLDF_HAS_WORKINGDIR 0x00000010 +!define /ifndef SLDF_HAS_ARGS 0x00000020 +!define /ifndef SLDF_HAS_ICONLOCATION 0x00000040 +!define /ifndef SLDF_UNICODE 0x00000080 +!define /ifndef SLDF_FORCE_NO_LINKINFO 0x00000100 +!define /ifndef SLDF_HAS_EXP_SZ 0x00000200 +!define /ifndef SLDF_RUN_IN_SEPARATE 0x00000400 +!define /ifndef SLDF_HAS_LOGO3ID 0x00000800 +!define /ifndef SLDF_HAS_DARWINID 0x00001000 +!define /ifndef SLDF_RUNAS_USER 0x00002000 +!define /ifndef SLDF_HAS_EXP_ICON_SZ 0x00004000 +!define /ifndef SLDF_NO_PIDL_ALIAS 0x00008000 +!define /ifndef SLDF_FORCE_UNCNAME 0x00010000 +!define /ifndef SLDF_RUN_WITH_SHIMLAYER 0x00020000 +!define /ifndef SLDF_FORCE_NO_LINKTRACK 0x00040000 ;[Vista+] +!define /ifndef SLDF_ENABLE_TARGET_METADATA 0x00080000 +!define /ifndef SLDF_DISABLE_LINK_PATH_TRACKING 0x00100000 ;[Seven+] +!define /ifndef SLDF_DISABLE_KNOWNFOLDER_RELATIVE_TRACKING 0x00200000 +!define /ifndef SLDF_NO_KF_ALIAS 0x00400000 +!define /ifndef SLDF_ALLOW_LINK_TO_LINK 0x00800000 +!define /ifndef SLDF_UNALIAS_ON_SAVE 0x01000000 +!define /ifndef SLDF_PREFER_ENVIRONMENT_PATH 0x02000000 +!define /ifndef SLDF_KEEP_LOCAL_IDLIST_FOR_UNC_TARGET 0x04000000 +!define /ifndef SLDF_PERSIST_VOLUME_ID_RELATIVE 0x08000000 ;[Eight+] + +!ifndef IID_IShellItem +!define IID_IShellItem {43826d1e-e718-42ee-bc55-a1e261c37bfe} +${NSISCOMIFACEDECL}IShellItem BindToHandler 3 (p,g,g,*p)i +${NSISCOMIFACEDECL}IShellItem GetParent 4 (*p)i +${NSISCOMIFACEDECL}IShellItem GetDisplayName 5 (i,*p)i +${NSISCOMIFACEDECL}IShellItem GetAttributes 6 (i,*i)i +${NSISCOMIFACEDECL}IShellItem Compare 7 (p,i,*i)i +!endif + +!ifndef CLSID_StartMenuPin +!define CLSID_StartMenuPin {a2a9545d-a0c2-42b4-9708-a0b2badd77c8} +!endif +!ifndef IID_IStartMenuPinnedList +!define IID_IStartMenuPinnedList {4CD19ADA-25A5-4A32-B3B7-347BEE5BE36B} +${NSISCOMIFACEDECL}IStartMenuPinnedList RemoveFromList 3 (p)i +!endif + +!ifndef CLSID_ApplicationDestinations +!define CLSID_ApplicationDestinations {86c14003-4d6b-4ef3-a7b4-0506663b2e68} +!endif +!ifndef IID_IApplicationDestinations +!define IID_IApplicationDestinations {12337D35-94C6-48A0-BCE7-6A9C69D4D600} ;[Seven+] +${NSISCOMIFACEDECL}IApplicationDestinations SetAppID 3 (w)i +${NSISCOMIFACEDECL}IApplicationDestinations RemoveDestination 4 (p)i ; IShellItem or IShellLink +${NSISCOMIFACEDECL}IApplicationDestinations RemoveAllDestinations 5 ()i +!endif + +!ifndef CLSID_DestinationList +!define CLSID_DestinationList {77f10cf0-3db5-4966-b520-b7c54fd35ed6} +!endif +!ifndef IID_ICustomDestinationList +!define IID_ICustomDestinationList {6332debf-87b5-4670-90c0-5e57b408a49e} ;[Seven+] +${NSISCOMIFACEDECL}ICustomDestinationList SetAppID 3 (w)i +${NSISCOMIFACEDECL}ICustomDestinationList BeginList 4 (*i,g,*p)i ; IObjectArray or IEnumObjects +${NSISCOMIFACEDECL}ICustomDestinationList AppendCategory 5 (w,p)i ; IObjectArray* +${NSISCOMIFACEDECL}ICustomDestinationList AppendKnownCategory 6 (i)i +${NSISCOMIFACEDECL}ICustomDestinationList AddUserTasks 7 (p)i ; IObjectArray* +${NSISCOMIFACEDECL}ICustomDestinationList CommitList 8 ()i +${NSISCOMIFACEDECL}ICustomDestinationList GetRemovedDestinations 9 (g,*p)i ; IObjectCollection +${NSISCOMIFACEDECL}ICustomDestinationList DeleteList 10 (w)i +${NSISCOMIFACEDECL}ICustomDestinationList AbortList 11 ()i +!endif + +!ifndef CLSID_EnumerableObjectCollection +!define CLSID_EnumerableObjectCollection {2d3468c1-36a7-43b6-ac24-d3f02fd9607a} +!endif +!ifndef IID_IObjectArray +!define IID_IObjectArray {92CA9DCD-5622-4bba-A805-5E9F541BD8C9} +${NSISCOMIFACEDECL}IObjectArray GetCount 3 (*i)i +${NSISCOMIFACEDECL}IObjectArray GetAt 4 (i,g,*p)i +!endif + +!ifndef IID_IObjectCollection +!define IID_IObjectCollection {5632b1a4-e38a-400a-928a-d4cd63230295} ; IObjectArray> +${NSISCOMIFACEDECL}IObjectCollection AddObject 5 (p)i ; IUnknown* +${NSISCOMIFACEDECL}IObjectCollection AddFromArray 6 (p)i ; IObjectArray* +${NSISCOMIFACEDECL}IObjectCollection RemoveObjectAt 7 (i)i +${NSISCOMIFACEDECL}IObjectCollection Clear 8 ()i +!endif + +!ifndef IID_IEnumObjects +!define IID_IEnumObjects {2c1c7e2e-2d0e-4059-831e-1e6f82335c2e} +${NSISCOMIFACEDECL}IEnumObjects Next 3 (i,g,*p,*i)i +${NSISCOMIFACEDECL}IEnumObjects Skip 4 (i)i +${NSISCOMIFACEDECL}IEnumObjects Reset 5 ()i +${NSISCOMIFACEDECL}IEnumObjects Clone 6 (*p)i +!endif + +!ifndef IID_IEnumUnknown +!define IID_IEnumUnknown {00000100-0000-0000-C000-000000000046} +${NSISCOMIFACEDECL}IEnumUnknown Next 3 (i,*p,*i)i +${NSISCOMIFACEDECL}IEnumUnknown Skip 4 (i)i +${NSISCOMIFACEDECL}IEnumUnknown Reset 5 ()i +${NSISCOMIFACEDECL}IEnumUnknown Clone 6 (*p)i +!endif + +!ifndef IID_IPropertyStore +!define IID_IPropertyStore {886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99} +${NSISCOMIFACEDECL}IPropertyStore GetCount 3 (*i)i +${NSISCOMIFACEDECL}IPropertyStore GetAt 4 (i,p)i +${NSISCOMIFACEDECL}IPropertyStore GetValue 5 (p,p)i +${NSISCOMIFACEDECL}IPropertyStore SetValue 6 (p,p)i +${NSISCOMIFACEDECL}IPropertyStore Commit 7 ()i +!endif + +!ifndef IID_IPropertyStorage +!define IID_IPropertyStorage {00000138-0000-0000-C000-000000000046} +${NSISCOMIFACEDECL}IPropertyStorage ReadMultiple 3 (i,p,p)i +${NSISCOMIFACEDECL}IPropertyStorage WriteMultiple 4 (i,p,p,i)i +${NSISCOMIFACEDECL}IPropertyStorage DeleteMultiple 5 (i,p)i +${NSISCOMIFACEDECL}IPropertyStorage ReadPropertyNames 6 (p,p)i +${NSISCOMIFACEDECL}IPropertyStorage WritePropertyNames 7 (i,p,p)i +${NSISCOMIFACEDECL}IPropertyStorage DeletePropertyNames 8 (i,p)i +${NSISCOMIFACEDECL}IPropertyStorage Commit 9 (i)i ; Note: Some implementations might return E_NOTIMPL +${NSISCOMIFACEDECL}IPropertyStorage Revert 10 ()i +${NSISCOMIFACEDECL}IPropertyStorage Enum 11 (*p)i +${NSISCOMIFACEDECL}IPropertyStorage SetTimes 12 (p,p,p)i +${NSISCOMIFACEDECL}IPropertyStorage SetClass 13 (g)i +${NSISCOMIFACEDECL}IPropertyStorage Stat 14 (p)i +!endif + +!ifndef IID_IPropertySetStorage +!define IID_IPropertySetStorage {0000013A-0000-0000-C000-000000000046} +${NSISCOMIFACEDECL}IPropertySetStorage Create 3 (g,g,i,i,*p)i +${NSISCOMIFACEDECL}IPropertySetStorage Open 4 (g,i,*p)i +${NSISCOMIFACEDECL}IPropertySetStorage Delete 5 (g)i +${NSISCOMIFACEDECL}IPropertySetStorage Enum 6 (*p)i +!endif + +!ifndef CLSID_ApplicationAssociationRegistration +!define CLSID_ApplicationAssociationRegistration {591209c7-767b-42b2-9fba-44ee4615f2c7} +!endif +!ifndef IID_IApplicationAssociationRegistration +!define IID_IApplicationAssociationRegistration {4e530b0a-e611-4c77-a3ac-9031d022281b} ;[Vista+] +${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryCurrentDefault 3 (w,i,i,*p)i +${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryAppIsDefault 4 (w,i,i,w,*i)i +${NSISCOMIFACEDECL}IApplicationAssociationRegistration QueryAppIsDefaultAll 5 (i,w,*i)i +${NSISCOMIFACEDECL}IApplicationAssociationRegistration SetAppAsDefault 6 (w,w,i)i +${NSISCOMIFACEDECL}IApplicationAssociationRegistration SetAppAsDefaultAll 7 (w)i +${NSISCOMIFACEDECL}IApplicationAssociationRegistration ClearUserAssociations 8 ()i +!endif +!ifndef CLSID_ApplicationAssociationRegistrationUI +!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1} +!endif +!ifndef IID_IApplicationAssociationRegistrationUI +!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+] +${NSISCOMIFACEDECL}IApplicationAssociationRegistrationUI LaunchAdvancedAssociationUI 3 (w)i +!endif + +!ifndef CLSID_GameExplorer +!define CLSID_GameExplorer {9A5EA990-3034-4D6F-9128-01F3C61022BC} +!endif +!ifndef IID_IGameExplorer +!define IID_IGameExplorer {E7B2FB72-D728-49B3-A5F2-18EBF5F1349E} ;[Vista+] +${NSISCOMIFACEDECL}IGameExplorer AddGame 3 (p,p,i,g)i +${NSISCOMIFACEDECL}IGameExplorer RemoveGame 4 (i,i,i,i)i ; The parameter is a GUID, not REFGUID so the 'g' type cannot be used! +${NSISCOMIFACEDECL}IGameExplorer UpdateGame 5 (i,i,i,i)i +${NSISCOMIFACEDECL}IGameExplorer VerifyAccess 6 (p,*i)i +!endif +!define /ifndef GIS_NOT_INSTALLED 1 +!define /ifndef GIS_CURRENT_USER 2 +!define /ifndef GIS_ALL_USERS 3 +!ifndef IID_IGameExplorer2 +!define IID_IGameExplorer2 {86874AA7-A1ED-450d-A7EB-B89E20B2FFF3} ;[Seven+] +${NSISCOMIFACEDECL}IGameExplorer2 InstallGame 3 (w,w,i)i +${NSISCOMIFACEDECL}IGameExplorer2 UninstallGame 4 (w)i +${NSISCOMIFACEDECL}IGameExplorer2 CheckAccess 5 (w,*i)i +!endif +!ifndef CLSID_GameStatistics +!define CLSID_GameStatistics {DBC85A2C-C0DC-4961-B6E2-D28B62C11AD4} +!endif +!ifndef IID_IGameStatisticsMgr +!define IID_IGameStatisticsMgr {AFF3EA11-E70E-407d-95DD-35E612C41CE2} ;[Seven+] +${NSISCOMIFACEDECL}IGameStatisticsMgr GetGameStatistics 3 (w,i,*i,*p)i +${NSISCOMIFACEDECL}IGameStatisticsMgr RemoveGameStatistics 4 (w)i +!endif + +!ifndef CLSID_InternetShortcut +!define CLSID_InternetShortcut {FBF23B40-E3F0-101B-8488-00AA003E56F8} +!endif +!ifndef IID_IUniformResourceLocator +!define IID_IUniformResourceLocatorA {FBF23B80-E3F0-101B-8488-00AA003E56F8} +!define IID_IUniformResourceLocatorW {CABB0DA0-DA57-11CF-9974-0020AFD79762} +!ifdef NSIS_UNICODE +!define IID_IUniformResourceLocator ${IID_IUniformResourceLocatorW} +!else +!define IID_IUniformResourceLocator ${IID_IUniformResourceLocatorA} +!endif +${NSISCOMIFACEDECL}IUniformResourceLocator SetURL 3 (t,i)i +${NSISCOMIFACEDECL}IUniformResourceLocator GetURL 4 (*p)i +${NSISCOMIFACEDECL}IUniformResourceLocator InvokeCommand 5 (p)i +!endif + +!verbose pop +!endif /* __WIN_COM__INC */ diff --git a/libs/NSIS/NSIS-source/Include/Win/Propkey.nsh b/libs/NSIS/NSIS-source/Include/Win/Propkey.nsh new file mode 100644 index 0000000000..6d61d9a733 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/Propkey.nsh @@ -0,0 +1,216 @@ +!ifndef __WIN_PROPKEY__INC +!define __WIN_PROPKEY__INC +!verbose push +!verbose 3 + + +/************************************************** +WTypes.h +**************************************************/ +;NOTE: This list is incomplete +!define VT_EMPTY 0 +!define VT_NULL 1 +!define VT_I2 2 +!define VT_I4 3 +!define VT_BSTR 8 +!define VT_BOOL 11 +!define VT_I1 16 +!define VT_UI1 17 +!define VT_UI2 18 +!define VT_UI4 19 +!define VT_I8 20 +!define VT_UI8 21 +!define VT_INT 22 +!define VT_UINT 23 +!define VT_HRESULT 25 +!define VT_PTR 26 +!define VT_SAFEARRAY 27 +!define VT_LPSTR 30 ; SHStrDupA +!define VT_LPWSTR 31 ; SHStrDupW +!define VT_FILETIME 64 +!define VT_STREAM 66 +!define VT_CLSID 72 ; Pointer to CoTaskMem allocated GUID +!define VT_TYPEMASK 0xFFF +!define VT_VECTOR 0x1000 +!define VT_ARRAY 0x2000 +!define VT_BYREF 0x4000 + +!define /ifndef VARIANT_TRUE -1 +!define /ifndef VARIANT_FALSE 0 + +!define SYSSIZEOF_PROPERTYKEY 20 +!define SYSSTRUCT_PROPERTYKEY (&g16,&i4) ;System.dll is buggy when it comes to g and forces us to specify the size + +!define STGC_DEFAULT 0 +!define STGC_OVERWRITE 1 +!define STGC_ONLYIFCURRENT 2 +!define STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE 4 +!define STGC_CONSOLIDATE 8 + + +/************************************************** +OAIdl.h +**************************************************/ +!if "${NSIS_PTR_SIZE}" > 4 +!define SYSSIZEOF_VARIANT 24 +!define SYSSTRUCT_VARIANT (&i2,&i6,&i8,&i8) +!else +!define SYSSIZEOF_VARIANT 16 +!define SYSSTRUCT_VARIANT (&i2,&i6,&i8) +!endif + + +/************************************************** +PropIdl.h +**************************************************/ +!if "${NSIS_PTR_SIZE}" > 4 +!define SYSSIZEOF_PROPVARIANT 24 +!define SYSSTRUCT_PROPVARIANT (&i2,&i6,&i8,&i8) +!else +!define SYSSIZEOF_PROPVARIANT 16 +!define SYSSTRUCT_PROPVARIANT (&i2,&i6,&i8) +!endif + +!define PRSPEC_LPWSTR 0 +!define PRSPEC_PROPID 1 +!define SYSSTRUCT_PROPSPEC (p,p) + + +/************************************************** +Propkey.h +**************************************************/ +!define PKEY_AppUserModel_RelaunchCommand '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",2' ; VT_LPWSTR (SHGetPropertyStoreForWindow) +!define PKEY_AppUserModel_RelaunchIconResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",3' ; VT_LPWSTR (SHGetPropertyStoreForWindow, optional. Path to icon or module, with resource ID or index.) +!define PKEY_AppUserModel_RelaunchDisplayNameResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",4' ; VT_LPWSTR (SHGetPropertyStoreForWindow. @ style indirect resource string or a plain string.) +!define PKEY_AppUserModel_ID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",5' ; VT_LPWSTR +!define PKEY_AppUserModel_IsDestListSeparator '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",6' ; VT_BOOL +!define PKEY_AppUserModel_ExcludeFromShowInNewInstall '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",8' ; VT_BOOL +!define PKEY_AppUserModel_PreventPinning '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",9' ; VT_BOOL +!define PKEY_AppUserModel_IsDualMode '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",11' ; [Eight+] VT_BOOL +!define APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL 1 +!define APPUSERMODEL_STARTPINOPTION_USERPINNED 2 +!define PKEY_AppUserModel_StartPinOption '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",12' ; [Eight+] VT_UI4 +!define PKEY_AppUserModel_ToastActivatorCLSID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",26' ; [10FU1507+] VT_CLSID +!define PKEY_EdgeGesture_DisableTouchWhenFullscreen '"{32CE38B2-2C9A-41B1-9BC5-B3784394AA44}",2' ; [Eight+] VT_BOOL (SHGetPropertyStoreForWindow) + + +/************************************************** +ShlGuid.h & ShlObj.h +**************************************************/ +!define FMTID_Intshcut {000214A0-0000-0000-C000-000000000046} +!define PID_IS_URL 2 ; VT_LPWSTR +!define PID_IS_HOTKEY 6 ; VT_UI2 +!define PID_IS_ICONINDEX 8 ; VT_I4 +!define PID_IS_ICONFILE 9 ; VT_LPWSTR +!define PKEY_Intshcut_Url '"${FMTID_Intshcut}",${PID_IS_URL}' ; Undocumented +!define FMTID_InternetSite {000214A1-0000-0000-C000-000000000046} +!define PID_INTSITE_LASTVISIT 4 ; VT_FILETIME +!define PID_INTSITE_VISITCOUNT 6 ; VT_UI4 + + +/************************************************** +Helper macros +**************************************************/ +!define V_GetVT '!insertmacro V_GetVT ' +!macro V_GetVT pPV sysdst +System::Call '*${pPV}(&i2.${sysdst})' +!macroend +!define V_SetVT '!insertmacro V_SetVT ' +!macro V_SetVT pPV syssrc +System::Call '*${pPV}(&i2 ${syssrc})' +!macroend +!macro V_GetHelper sysvaltyp pPV sysdst +System::Call '*${pPV}(l,${sysvaltyp}.${sysdst})' +!macroend +!macro V_GenericSetHelper sysvaltyp pPV VT syssrc +!if "${VT}" != "" ; Setting the VT is optional + System::Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})' +!else + System::Call '*${pPV}(l,${sysvaltyp}${syssrc})' +!endif +!macroend +!macro V_SpecificSetHelper VT sysvaltyp pPV syssrc +System::Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})' +!macroend +!macro Make_V_GetterSetter name sysvaltyp setsep +!define V_Get${name} '!insertmacro V_GetHelper "${sysvaltyp}" ' +!ifdef VT_${name} + !define V_Set${name} '!insertmacro V_SpecificSetHelper ${VT_${name}} "${sysvaltyp}${setsep}" ' +!else + !define V_Set${name} '!insertmacro V_GenericSetHelper "${sysvaltyp}${setsep}" ' +!endif +!macroend +!insertmacro Make_V_GetterSetter Int8 "&i1" " " ; Generic +!insertmacro Make_V_GetterSetter Int16 "&i2" " " ; Generic +!insertmacro Make_V_GetterSetter Int32 "i" "" ; Generic +!insertmacro Make_V_GetterSetter Int64 "l" "" ; Generic +!insertmacro Make_V_GetterSetter Pointer "p" "" ; Generic +!insertmacro Make_V_GetterSetter I4 "i" " " +!insertmacro Make_V_GetterSetter BOOL "&i2" " " +!insertmacro Make_V_GetterSetter FILETIME "l" "" + +!macro VariantInit pV +${V_SetVT} ${pV} ${VT_EMPTY} +!macroend +!macro VariantClear pV +System::Call 'OLEAUT32::#9(p${pV})' +!macroend +!macro VariantCopy pDstV pSrcV sysretHR +System::Call 'OLEAUT32::#10(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source) +!macroend +!macro VariantCopyInd pDstV pSrcV sysretHR +System::Call 'OLEAUT32::#11(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source) +!macroend +!macro VariantChangeType pDstV pSrcV Flags VT sysretHR +System::Call 'OLEAUT32::#12(p${pDstV},p${pSrcV},i${Flags},i${VT})i.${sysretHR}' ; (Might free the destination on success) +!macroend + + +!macro PropVariantClear pPV +System::Call 'OLE32::PropVariantClear(p${pPV})' ; WinNT4.SP0+, Win98+, IE4+ +!macroend +!macro PropVariantCopy pDstPV pSrcPV sysretHR +System::Call 'OLE32::PropVariantCopy(p${pDstPV},p${pSrcPV})i.${sysretHR}' ; WinNT4.SP0+, Win98+, IE4+ (Does NOT free the destination before it copies the source) +!macroend +!macro PropVariantChangeType pDstPV pSrcPV VT sysretHR +!ifdef NSIS_ARM | NSIS_ARM32 | NSIS_ARMNT | NSIS_ARM64 + System::Call 'PROPSYS::PropVariantChangeType(p${pDstPV},p${pSrcPV},i0,i${VT})i.${sysretHR}' +!else + Push "${VT}" + Push ${pSrcPV} + Push ${pDstPV} + !include Util.nsh + ${CallArtificialFunction} TryPropVariantChangeType + System::Call 'KERNEL32::SetLastError(is${sysretHR})' ; A hack to move the result from the stack to somewhere with System variable syntax +!endif +!macroend +!macro TryPropVariantChangeType +System::Store S +System::Call 'PROPSYS::PropVariantChangeType(psr1,psr2,i0,isr3)i.r0' ; Vista+ (Source and destination cannot be the same address) +StrCmp $0 error "" done +System::Call 'OLE32::PropVariantChangeType(pr1,pr2,i0,i0,ir3})i.r0' ; 2000+ (Source and destination cannot be the same address) +!if ${NSIS_PTR_SIZE} < 8 + StrCmp $0 error "" done + !insertmacro VariantChangeType $1 $2 0 $3 r0 ; This is not really correct but there is no PROPVARIANT support on these platforms. Might free the destination! +!endif +done: +Push $0 +System::Store L +!macroend + + +!macro IPropertyStorage_ReadPropById pPS ID pPV sysoutHR +System::Call '*(p${PRSPEC_PROPID},p${ID})p.s' +${IPropertyStorage::ReadMultiple} ${pPS} '(1,pss,p${pPV})${sysoutHR}' +System::Free +!macroend + +!macro IPropertyStorage_WritePropById pPS ID pPV sysoutHR +System::Call '*(p${PRSPEC_PROPID},p${ID})p.s' +${IPropertyStorage::WriteMultiple} ${pPS} '(1,pss,p${pPV},2)${sysoutHR}' +System::Free +!macroend + + +!verbose pop +!endif /* __WIN_PROPKEY__INC */ diff --git a/libs/NSIS/NSIS-source/Include/Win/RestartManager.nsh b/libs/NSIS/NSIS-source/Include/Win/RestartManager.nsh new file mode 100644 index 0000000000..6557b7d4e3 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/RestartManager.nsh @@ -0,0 +1,117 @@ +!ifndef __WIN_RESTARTMANAGER__INC +!define __WIN_RESTARTMANAGER__INC 1 + +/************************************************** +WinBase.h +**************************************************/ +!define /IfNDef RESTART_MAX_CMD_LINE 1024 + +!define /IfNDef RESTART_NO_CRASH 1 +!define /IfNDef RESTART_NO_HANG 2 +!define /IfNDef RESTART_NO_PATCH 4 +!define /IfNDef RESTART_NO_REBOOT 8 ; Do not restart the process when the system is rebooted due to patch installations + +!define /IfNDef RECOVERY_DEFAULT_PING_INTERVAL 5000 +!define /IfNDef /math RECOVERY_MAX_PING_INTERVAL 5000 * 60 + + +/************************************************** +RestartManager.h +**************************************************/ +!define RM_SESSION_KEY_LEN 16 +!define CCH_RM_SESSION_KEY 32 +!define CCH_RM_MAX_APP_NAME 255 +!define CCH_RM_MAX_SVC_NAME 63 +!define RM_INVALID_TS_SESSION -1 +!define RM_INVALID_PROCESS -1 + +!define RmUnknownApp 0 +!define RmMainWindow 1 +!define RmOtherWindow 2 +!define RmService 3 +!define RmExplorer 4 +!define RmConsole 5 +!define RmCritical 1000 ; Application is critical system process where a reboot is required to restart + +!define RmForceShutdown 0x1 ; Force unresponsive applications and services to shut down after the timeout period +!define RmShutdownOnlyRegistered 0x10 ; Only shutdown apps if all apps registered for restart (RegisterApplicationRestart) + +!define RmStatusUnknown 0 +!define RmStatusRunning 1 +!define RmStatusStopped 2 ; Application stopped by Restart Manager +!define RmStatusStoppedOther 4 +!define RmStatusRestarted 8 +!define RmStatusErrorOnStop 0x10 +!define RmStatusErrorOnRestart 0x20 +!define RmStatusShutdownMasked 0x40 +!define RmStatusRestartMasked 0x80 + +!define RmRebootReasonNone 0 +!define RmRebootReasonPermissionDenied 1 +!define RmRebootReasonSessionMismatch 2 +!define RmRebootReasonCriticalProcess 4 +!define RmRebootReasonCriticalService 8 +!define RmRebootReasonDetectedSelf 0x10 + + +!define SYSSIZEOF_RM_UNIQUE_PROCESS 12 +!define SYSSTRUCT_RM_UNIQUE_PROCESS (i,l) + + +!include LogicLib.nsh +!include Util.nsh + + +!macro RestartManager_StartSession outvarhandle +System::Call 'RSTRTMGR::RmStartSession(*i-1s, i0, w)i.s' +Pop ${outvarhandle} +${If} ${outvarhandle} <> 0 +${OrIf} ${outvarhandle} == error + Pop ${outvarhandle} + Push "" +${EndIf} +Pop ${outvarhandle} +!macroend + +!macro RestartManager_EndSession handle +System::Call 'RSTRTMGR::RmEndSession(i${handle})' +!macroend + +!macro RestartManager_RegisterFile handle path +System::Call 'RSTRTMGR::RmRegisterResources(i${handle},i1,*ws,i0,p0,i0,p0)i.r0' "${path}" +!macroend + +!macro RestartManager_Shutdown handle +System::Call 'RSTRTMGR::RmShutdown(i${handle}, i${RmForceShutdown}, p0)' +!macroend + +!macro RestartManager_Restart handle +System::Call 'RSTRTMGR::RmRestart(i${handle}, i0, p0)' +!macroend + + +!macro RestartManager_ShutdownFile fullpath outvar_errcode +Push "${fullpath}" +!insertmacro CallArtificialFunction RestartManager_ShutdownFileImp +Pop ${outvar_errcode} +!macroend +!macro RestartManager_ShutdownFileImp +Exch $1 +Push $0 +System::Call 'RSTRTMGR::RmStartSession(*i-1s, i0, w)i.r0' +${If} $0 == error + Pop $0 + StrCpy $0 1150 +${Else} + System::Call 'RSTRTMGR::RmRegisterResources(isr1,i1,*wr1,i0,p0,i0,p0)i.r0' + ${If} $0 = 0 + System::Call 'RSTRTMGR::RmShutdown(ir1, i${RmForceShutdown}, p0)i.r0' + ${EndIf} + System::Call 'RSTRTMGR::RmEndSession(ir1)' +${EndIf} +Exch +Pop $1 +Exch $0 +!macroend + +!endif ;~ Include guard diff --git a/libs/NSIS/NSIS-source/Include/Win/WinDef.nsh b/libs/NSIS/NSIS-source/Include/Win/WinDef.nsh new file mode 100644 index 0000000000..a91d685685 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/WinDef.nsh @@ -0,0 +1,67 @@ +!ifndef __WIN_WINDEF__INC +!define __WIN_WINDEF__INC +!verbose push +!verbose 3 +!ifndef __WIN_NOINC_WINDEF + + +!define /ifndef MAX_PATH 260 +#define NULL 0 + + +!macro _Win_MINMAX _intcmp _j1 _j2 _outvar _a _b +${_intcmp} "${_a}" "${_b}" ${_j1} ${_j1} ${_j2} +StrCpy ${_outvar} "${_a}" +goto +2 +StrCpy ${_outvar} "${_b}" +!macroend +!ifndef __WIN_MS_NOMINMAX & min & max & min_u & max_u +!define min "!insertmacro _Win_MINMAX IntCmp +1 +3 " +!define max "!insertmacro _Win_MINMAX IntCmp +3 +1 " +!define min_u "!insertmacro _Win_MINMAX IntCmpU +1 +3 " +!define max_u "!insertmacro _Win_MINMAX IntCmpU +3 +1 " +!endif + +!macro _Win_LOBYTE _outvar _in +IntOp ${_outvar} "${_in}" & 0xFF +!macroend +!define LOBYTE "!insertmacro _Win_LOBYTE " + +!macro _Win_HIBYTE _outvar _in +IntOp ${_outvar} "${_in}" >> 8 +${LOBYTE} ${_outvar} ${_outvar} +!macroend +!define HIBYTE "!insertmacro _Win_HIBYTE " + +!macro _Win_LOWORD _outvar _in +IntOp ${_outvar} "${_in}" & 0xFFFF +!macroend +!define LOWORD "!insertmacro _Win_LOWORD " + +!macro _Win_HIWORD _outvar _in +IntOp ${_outvar} "${_in}" >>> 16 +!macroend +!define HIWORD "!insertmacro _Win_HIWORD " + +!macro _Win_MAKEWORD _outvar _tmpvar _lo _hi +${LOBYTE} ${_outvar} "${_hi}" +${LOBYTE} ${_tmpvar} "${_lo}" +IntOp ${_outvar} ${_outvar} << 8 +IntOp ${_outvar} ${_outvar} | ${_tmpvar} +!macroend +!define MAKEWORD "!insertmacro _Win_MAKEWORD " + +!macro _Win_MAKELONG32 _outvar _tmpvar _wlo _whi +${LOWORD} ${_outvar} "${_wlo}" +IntOp ${_tmpvar} "${_whi}" << 16 +IntOp ${_outvar} ${_outvar} | ${_tmpvar} +!macroend +!define MAKELONG "!insertmacro _Win_MAKELONG32 " +!define MAKEWPARAM "${MAKELONG}" +!define MAKELPARAM "${MAKELONG}" +!define MAKELRESULT "${MAKELONG}" + + +!endif /* __WIN_NOINC_WINDEF */ +!verbose pop +!endif /* __WIN_WINDEF__INC */ \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/Win/WinError.nsh b/libs/NSIS/NSIS-source/Include/Win/WinError.nsh new file mode 100644 index 0000000000..16b0ecff84 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/WinError.nsh @@ -0,0 +1,155 @@ +!ifndef __WIN_WINERROR__INC +!define __WIN_WINERROR__INC +!verbose push +!verbose 3 + +!ifndef __WIN_NOINC_WINERROR +#define NO_ERROR 0 +!define ERROR_SUCCESS 0 +!define ERROR_INVALID_FUNCTION 1 +!define ERROR_FILE_NOT_FOUND 2 +!define ERROR_PATH_NOT_FOUND 3 +!define ERROR_TOO_MANY_OPEN_FILES 4 +!define ERROR_ACCESS_DENIED 5 +!define ERROR_INVALID_HANDLE 6 +!define ERROR_ARENA_TRASHED 7 +!define ERROR_NOT_ENOUGH_MEMORY 8 +!define ERROR_INVALID_BLOCK 9 +!define ERROR_BAD_ENVIRONMENT 10 +!define ERROR_BAD_FORMAT 11 +!define ERROR_INVALID_ACCESS 12 +!define ERROR_INVALID_DATA 13 +!define ERROR_OUTOFMEMORY 14 +!define ERROR_INVALID_DRIVE 15 +!define ERROR_CURRENT_DIRECTORY 16 +!define ERROR_NOT_SAME_DEVICE 17 +!define ERROR_NO_MORE_FILES 18 +!define ERROR_WRITE_PROTECT 19 +!define ERROR_BAD_UNIT 20 +!define ERROR_NOT_READY 21 +!define ERROR_BAD_COMMAND 22 +!define ERROR_CRC 23 +!define ERROR_BAD_LENGTH 24 +!define ERROR_SEEK 25 +!define ERROR_NOT_DOS_DISK 26 +!define ERROR_SECTOR_NOT_FOUND 27 +!define ERROR_OUT_OF_PAPER 28 +!define ERROR_WRITE_FAULT 29 +!define ERROR_READ_FAULT 30 +!define ERROR_GEN_FAILURE 31 +!define ERROR_SHARING_VIOLATION 32 +!define ERROR_LOCK_VIOLATION 33 +!define ERROR_WRONG_DISK 34 +!define ERROR_SHARING_BUFFER_EXCEEDED 36 +!define ERROR_HANDLE_EOF 38 +!define ERROR_HANDLE_DISK_FULL 39 +!define ERROR_NOT_SUPPORTED 50 +!define ERROR_CANNOT_MAKE 82 ; "The directory or file cannot be created" +!define ERROR_INVALID_PARAMETER 87 +!define ERROR_DISK_FULL 112 +!define ERROR_CALL_NOT_IMPLEMENTED 120 ; "This function is not supported on this system" +!define ERROR_INSUFFICIENT_BUFFER 122 +!define ERROR_INVALID_NAME 123 ; "The filename, directory name, or volume label syntax is incorrect" +!define ERROR_MOD_NOT_FOUND 126 ; "The specified module could not be found" +!define ERROR_BAD_ARGUMENTS 160 +!define ERROR_BAD_PATHNAME 161 +!define ERROR_LOCK_FAILED 167 ; "Unable to lock a region of a file" +!define ERROR_BUSY 170 ; "The requested resource is in use" +!define ERROR_ALREADY_EXISTS 183 ; "Cannot create a file when that file already exists" +!define ERROR_FILENAME_EXCED_RANGE 206 ; "The filename or extension is too long" +!define ERROR_EXE_MACHINE_TYPE_MISMATCH 216 ; "This version of %1 is not compatible with the version of Windows you're running" +!define ERROR_IMAGE_SUBSYSTEM_NOT_PRESENT 308 +!define ERROR_DATA_CHECKSUM_ERROR 323 +!define ERROR_ELEVATION_REQUIRED 740 +!define ERROR_SERVICE_DOES_NOT_EXIST 1060 +!define ERROR_NO_MEDIA_IN_DRIVE 1112 +!define ERROR_NO_UNICODE_TRANSLATION 1113 +!define ERROR_DLL_INIT_FAILED 1114 +!define ERROR_SHUTDOWN_IN_PROGRESS 1115 +!define ERROR_OLD_WIN_VERSION 1150 ; "The specified program requires a newer version of Windows" +!define ERROR_APP_WRONG_OS 1151 ; "The specified program is not a Windows or MS-DOS program" +!define ERROR_SINGLE_INSTANCE_APP 1152 ; "Cannot start more than one instance of the specified program" +!define ERROR_RMODE_APP 1153 ; "The specified program was written for an earlier version of Windows" +!define ERROR_INVALID_DLL 1154 +!define ERROR_NO_ASSOCIATION 1155 +!define ERROR_DDE_FAIL 1156 +!define ERROR_DLL_NOT_FOUND 1157 +!define ERROR_NOT_FOUND 1168 ; "Element not found" +!define ERROR_NO_MATCH 1169 ; "There was no match for the specified key in the index" +!define ERROR_NO_VOLUME_ID 1173 +!define ERROR_UNABLE_TO_REMOVE_REPLACED 1175 ; "Unable to remove the file to be replaced" +!define ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176 +!define ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177 +!define ERROR_SHUTDOWN_IS_SCHEDULED 1190 +!define ERROR_SHUTDOWN_USERS_LOGGED_ON 1191 ; "The system shutdown cannot be initiated because there are other users logged on to the computer" +!define ERROR_NO_NETWORK 1222 +!define ERROR_CANCELLED 1223 ; "The operation was canceled by the user" +!define ERROR_RETRY 1237 +!define ERROR_SERVICE_NOT_FOUND 1243 +!define ERROR_NOT_AUTHENTICATED 1244 +!define ERROR_UNIDENTIFIED_ERROR 1287 +!define ERROR_PRIVILEGE_NOT_HELD 1314 +!define ERROR_LOGON_FAILURE 1326 ; "The user name or password is incorrect" +!define ERROR_INTERNAL_ERROR 1359 ; "An internal error occurred" +!define ERROR_FILE_CORRUPT 1392 ; "The file or directory is corrupted and unreadable" +!define ERROR_INVALID_WINDOW_HANDLE 1400 ; "Invalid window handle" +!define ERROR_INVALID_INDEX 1413 +!define ERROR_TIMEOUT 1460 +!define ERROR_SYMLINK_NOT_SUPPORTED 1464 +!define ERROR_XML_PARSE_ERROR 1465 +!define ERROR_RESTART_APPLICATION 1467 ; "This application must be restarted" +!define ERROR_INSTALL_USEREXIT 1602 ; "User cancelled installation" +!define ERROR_INSTALL_FAILURE 1603 ; "Fatal error during installation" +!define ERROR_INSTALL_SUSPEND 1604 ; "Installation suspended, incomplete" +!define ERROR_UNKNOWN_PRODUCT 1605 ; "This action is only valid for products that are currently installed" +!define ERROR_BAD_CONFIGURATION 1610 +!define ERROR_INSTALL_SOURCE_ABSENT 1612 +!define ERROR_PRODUCT_UNINSTALLED 1614 +!define ERROR_INSTALL_ALREADY_RUNNING 1618 ; "Another installation is already in progress. Complete that installation before proceeding with this install." +!define ERROR_INSTALL_PACKAGE_INVALID 1620 +!define ERROR_INSTALL_LOG_FAILURE 1622 +!define ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623 +!define ERROR_FUNCTION_FAILED 1627 +!define ERROR_DATATYPE_MISMATCH 1629 +!define ERROR_UNSUPPORTED_TYPE 1630 +!define ERROR_INSTALL_TEMP_UNWRITABLE 1632 ; "The Temp folder is on a drive that is full or is inaccessible" +!define ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633 ; "This installation package is not supported by this processor type. Contact your product vendor." +!define ERROR_PRODUCT_VERSION 1638 ; "Another version of this product is already installed" +!define ERROR_SUCCESS_REBOOT_INITIATED 1641 ; "The requested operation completed successfully. The system will be restarted so the changes can take effect." +!define ERROR_INSTALL_REJECTED 1654 ; "The app that you are trying to run is not supported on this version of Windows" +!define ERROR_TAG_NOT_FOUND 2012 +!define ERROR_BAD_USERNAME 2202 ; "The user name or group name parameter is invalid" +!define ERROR_SUCCESS_REBOOT_REQUIRED 3010 +!define ERROR_SUCCESS_RESTART_REQUIRED 3011 +!define ERROR_INSTALL_INVALID_PACKAGE 15602 +!define ERROR_INSTALL_OUT_OF_DISK_SPACE 15604 +!define ERROR_INSTALL_CANCEL 15608 ; "User cancelled the install request" +!define ERROR_INSTALL_FAILED 15609 +!define ERROR_REMOVE_FAILED 15610 +!define ERROR_NEEDS_REMEDIATION 15612 ; "The application cannot be started. Try reinstalling the application to fix the problem." + +!define SEVERITY_SUCCESS 0 +!define SEVERITY_ERROR 1 +!define FACILITY_STORAGE 3 +!define FACILITY_WIN32 7 +!define FACILITY_SECURITY 9 +!define FACILITY_SETUPAPI 15 +!define FACILITY_SXS 23 +!define /IfNDef S_OK 0 +!define /IfNDef S_FALSE 1 +!define E_UNEXPECTED 0x8000FFFF +!define E_NOTIMPL 0x80004001 +!define E_OUTOFMEMORY 0x8007000E +!define E_INVALIDARG 0x80070057 +!define E_NOINTERFACE 0x80004002 +!define E_POINTER 0x80004003 +!define E_HANDLE 0x80070006 +!define E_ABORT 0x80004004 +!define E_FAIL 0x80004005 +!define E_ACCESSDENIED 0x80070005 +!define E_PENDING 0x8000000A + +!endif /* __WIN_NOINC_WINERROR */ + +!verbose pop +!endif /* __WIN_WINERROR__INC */ diff --git a/libs/NSIS/NSIS-source/Include/Win/WinNT.nsh b/libs/NSIS/NSIS-source/Include/Win/WinNT.nsh new file mode 100644 index 0000000000..09e9aaf48b --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/WinNT.nsh @@ -0,0 +1,224 @@ +!ifndef __WIN_WINNT__INC +!define __WIN_WINNT__INC +!verbose push +!verbose 3 +!ifndef __WIN_NOINC_WINNT + + +#define MINCHAR 0x80 +#define MAXCHAR 0x7f +!define MINSHORT 0x8000 +!define MAXSHORT 0x7fff +!define MINLONG 0x80000000 +!define MAXLONG 0x7fffffff +!define MAXBYTE 0xff +!define MAXWORD 0xffff +!define MAXDWORD 0xffffffff + +!ifndef WIN32_NO_STATUS +!define STATUS_WAIT_0 0x00000000 +!define STATUS_ABANDONED_WAIT_0 0x00000080 +!define STATUS_USER_APC 0x000000C0 +!define STATUS_TIMEOUT 0x00000102 +!define STATUS_PENDING 0x00000103 +!define DBG_EXCEPTION_HANDLED 0x00010001 +!define DBG_CONTINUE 0x00010002 +!define STATUS_SEGMENT_NOTIFICATION 0x40000005 +!define DBG_TERMINATE_THREAD 0x40010003 +!define DBG_TERMINATE_PROCESS 0x40010004 +!define DBG_CONTROL_C 0x40010005 +!define DBG_CONTROL_BREAK 0x40010008 +!define DBG_COMMAND_EXCEPTION 0x40010009 +!define STATUS_GUARD_PAGE_VIOLATION 0x80000001 +!define STATUS_DATATYPE_MISALIGNMENT 0x80000002 +!define STATUS_BREAKPOINT 0x80000003 +!define STATUS_SINGLE_STEP 0x80000004 +!define DBG_EXCEPTION_NOT_HANDLED 0x80010001 +!define STATUS_ACCESS_VIOLATION 0xC0000005 +!define STATUS_IN_PAGE_ERROR 0xC0000006 +!define STATUS_INVALID_HANDLE 0xC0000008 +!define STATUS_NO_MEMORY 0xC0000017 +!define STATUS_ILLEGAL_INSTRUCTION 0xC000001D +!define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025 +!define STATUS_INVALID_DISPOSITION 0xC0000026 +!define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C +!define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D +!define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E +!define STATUS_FLOAT_INEXACT_RESULT 0xC000008F +!define STATUS_FLOAT_INVALID_OPERATION 0xC0000090 +!define STATUS_FLOAT_OVERFLOW 0xC0000091 +!define STATUS_FLOAT_STACK_CHECK 0xC0000092 +!define STATUS_FLOAT_UNDERFLOW 0xC0000093 +!define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 +!define STATUS_INTEGER_OVERFLOW 0xC0000095 +!define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 +!define STATUS_STACK_OVERFLOW 0xC00000FD +!define STATUS_CONTROL_C_EXIT 0xC000013A +!define STATUS_FLOAT_MULTIPLE_FAULTS 0xC00002B4 +!define STATUS_FLOAT_MULTIPLE_TRAPS 0xC00002B5 +!define STATUS_REG_NAT_CONSUMPTION 0xC00002C9 +!define STATUS_SXS_EARLY_DEACTIVATION 0xC015000F +!define STATUS_SXS_INVALID_DEACTIVATION 0xC0150010 +!endif /*WIN32_NO_STATUS*/ + +#define MAXIMUM_WAIT_OBJECTS 64 + +!define DELETE 0x00010000 +!define READ_CONTROL 0x00020000 +!define WRITE_DAC 0x00040000 +!define WRITE_OWNER 0x00080000 +!define SYNCHRONIZE 0x00100000 +!define STANDARD_RIGHTS_REQUIRED 0x000F0000 +!define STANDARD_RIGHTS_READ ${READ_CONTROL} +!define STANDARD_RIGHTS_WRITE ${READ_CONTROL} +!define STANDARD_RIGHTS_EXECUTE ${READ_CONTROL} +!define STANDARD_RIGHTS_ALL 0x001F0000 +!define SPECIFIC_RIGHTS_ALL 0x0000FFFF +!define ACCESS_SYSTEM_SECURITY 0x01000000 +!define MAXIMUM_ALLOWED 0x02000000 +!define GENERIC_READ 0x80000000 +!define GENERIC_WRITE 0x40000000 +!define GENERIC_EXECUTE 0x20000000 +!define GENERIC_ALL 0x10000000 + +!define SE_PRIVILEGE_ENABLED_BY_DEFAULT 0x00000001 +!define SE_PRIVILEGE_ENABLED 0x00000002 +!define SE_PRIVILEGE_REMOVED 0x00000004 +!define SE_PRIVILEGE_USED_FOR_ACCESS 0x80000000 + +!define SE_CREATE_TOKEN_NAME "SeCreateTokenPrivilege" +!define SE_ASSIGNPRIMARYTOKEN_NAME "SeAssignPrimaryTokenPrivilege" +!define SE_LOCK_MEMORY_NAME "SeLockMemoryPrivilege" +!define SE_INCREASE_QUOTA_NAME "SeIncreaseQuotaPrivilege" +!define SE_UNSOLICITED_INPUT_NAME "SeUnsolicitedInputPrivilege" +!define SE_MACHINE_ACCOUNT_NAME "SeMachineAccountPrivilege" +!define SE_TCB_NAME "SeTcbPrivilege" +!define SE_SECURITY_NAME "SeSecurityPrivilege" +!define SE_TAKE_OWNERSHIP_NAME "SeTakeOwnershipPrivilege" +!define SE_LOAD_DRIVER_NAME "SeLoadDriverPrivilege" +!define SE_SYSTEM_PROFILE_NAME "SeSystemProfilePrivilege" +!define SE_SYSTEMTIME_NAME "SeSystemtimePrivilege" +!define SE_PROF_SINGLE_PROCESS_NAME "SeProfileSingleProcessPrivilege" +!define SE_INC_BASE_PRIORITY_NAME "SeIncreaseBasePriorityPrivilege" +!define SE_CREATE_PAGEFILE_NAME "SeCreatePagefilePrivilege" +!define SE_CREATE_PERMANENT_NAME "SeCreatePermanentPrivilege" +!define SE_BACKUP_NAME "SeBackupPrivilege" +!define SE_RESTORE_NAME "SeRestorePrivilege" +!define SE_SHUTDOWN_NAME "SeShutdownPrivilege" +!define SE_DEBUG_NAME "SeDebugPrivilege" +!define SE_AUDIT_NAME "SeAuditPrivilege" +!define SE_SYSTEM_ENVIRONMENT_NAME "SeSystemEnvironmentPrivilege" +!define SE_CHANGE_NOTIFY_NAME "SeChangeNotifyPrivilege" +!define SE_REMOTE_SHUTDOWN_NAME "SeRemoteShutdownPrivilege" +!define SE_UNDOCK_NAME "SeUndockPrivilege" +!define SE_SYNC_AGENT_NAME "SeSyncAgentPrivilege" +!define SE_ENABLE_DELEGATION_NAME "SeEnableDelegationPrivilege" +!define SE_MANAGE_VOLUME_NAME "SeManageVolumePrivilege" +!define SE_IMPERSONATE_NAME "SeImpersonatePrivilege" +!define SE_CREATE_GLOBAL_NAME "SeCreateGlobalPrivilege" + +!define TOKEN_ASSIGN_PRIMARY 0x0001 +!define TOKEN_DUPLICATE 0x0002 +!define TOKEN_IMPERSONATE 0x0004 +!define TOKEN_QUERY 0x0008 +!define TOKEN_QUERY_SOURCE 0x0010 +!define TOKEN_ADJUST_PRIVILEGES 0x0020 +!define TOKEN_ADJUST_GROUPS 0x0040 +!define TOKEN_ADJUST_DEFAULT 0x0080 +!define TOKEN_ADJUST_SESSIONID 0x0100 +!define TOKEN_ALL_ACCESS_P 0xF00FF +!define /math TOKEN_ALL_ACCESS ${TOKEN_ALL_ACCESS_P} | ${TOKEN_ADJUST_SESSIONID} +!define /math TOKEN_READ ${STANDARD_RIGHTS_READ} | ${TOKEN_QUERY} +!define TOKEN_WRITE 0x200E0 ;(STANDARD_RIGHTS_WRITE|TOKEN_ADJUST_PRIVILEGES|TOKEN_ADJUST_GROUPS|TOKEN_ADJUST_DEFAULT) +!define TOKEN_EXECUTE ${STANDARD_RIGHTS_EXECUTE} + +!define PROCESS_TERMINATE 0x0001 +!define PROCESS_CREATE_THREAD 0x0002 +!define PROCESS_SET_SESSIONID 0x0004 +!define PROCESS_VM_OPERATION 0x0008 +!define PROCESS_VM_READ 0x0010 +!define PROCESS_VM_WRITE 0x0020 +!define PROCESS_DUP_HANDLE 0x0040 +!define PROCESS_CREATE_PROCESS 0x0080 +!define PROCESS_SET_QUOTA 0x0100 +!define PROCESS_SET_INFORMATION 0x0200 +!define PROCESS_QUERY_INFORMATION 0x0400 +!define PROCESS_SUSPEND_RESUME 0x0800 +!define PROCESS_ALL_ACCESS 0x1F0FFF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF) +!define THREAD_TERMINATE 0x0001 +!define THREAD_SUSPEND_RESUME 0x0002 +!define THREAD_GET_CONTEXT 0x0008 +!define THREAD_SET_CONTEXT 0x0010 +!define THREAD_SET_INFORMATION 0x0020 +!define THREAD_QUERY_INFORMATION 0x0040 +!define THREAD_SET_THREAD_TOKEN 0x0080 +!define THREAD_IMPERSONATE 0x0100 +!define THREAD_DIRECT_IMPERSONATION 0x0200 +!define THREAD_ALL_ACCESS 0x1F03FF ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) +!define JOB_OBJECT_ASSIGN_PROCESS 0x0001 +!define JOB_OBJECT_SET_ATTRIBUTES 0x0002 +!define JOB_OBJECT_QUERY 0x0004 +!define JOB_OBJECT_TERMINATE 0x0008 +!define JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x0010 +!define JOB_OBJECT_ALL_ACCESS 0x1F001F ;(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F ) +!define EVENT_MODIFY_STATE 0x0002 +!define EVENT_ALL_ACCESS 0x1F0003 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) +!define MUTANT_QUERY_STATE 0x0001 +!define MUTANT_ALL_ACCESS 0x1F0001 ;(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|MUTANT_QUERY_STATE) + +!define FILE_SHARE_READ 0x00000001 +!define FILE_SHARE_WRITE 0x00000002 +!define FILE_SHARE_DELETE 0x00000004 +!define FILE_ATTRIBUTE_READONLY 0x00000001 +!define FILE_ATTRIBUTE_HIDDEN 0x00000002 +!define FILE_ATTRIBUTE_SYSTEM 0x00000004 +!define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +!define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +!define FILE_ATTRIBUTE_DEVICE 0x00000040 +!define FILE_ATTRIBUTE_NORMAL 0x00000080 +!define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +!define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +!define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +!define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +!define FILE_ATTRIBUTE_OFFLINE 0x00001000 +!define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +!define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 + +!define DUPLICATE_CLOSE_SOURCE 0x00000001 +!define DUPLICATE_SAME_ACCESS 0x00000002 + +!define /ifndef VER_PLATFORM_WIN32s 0 +!define /ifndef VER_PLATFORM_WIN32_WINDOWS 1 +!define /ifndef VER_PLATFORM_WIN32_NT 2 + +!ifndef REG_SZ & NSIS_WINDOWS__NO_REGTYPES +!define REG_NONE 0 +!define REG_SZ 1 +!define REG_EXPAND_SZ 2 +!define REG_BINARY 3 +!define REG_DWORD 4 +!define REG_DWORD_LITTLE_ENDIAN 4 +!define REG_DWORD_BIG_ENDIAN 5 +!define REG_LINK 6 +!define REG_MULTI_SZ 7 +!endif + +!define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF +!define PROCESSOR_ARCHITECTURE_INTEL 0 ; x86 +!define PROCESSOR_ARCHITECTURE_ARM 5 +!define PROCESSOR_ARCHITECTURE_IA64 6 ; Itanium +!define PROCESSOR_ARCHITECTURE_AMD64 9 ; x86-64/x64 +!define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 +!define PROCESSOR_ARCHITECTURE_ARM64 12 +!define PROCESSOR_ARCHITECTURE_ARM32_ON_WIN64 13 + +!define IMAGE_FILE_MACHINE_UNKNOWN 0 +!define IMAGE_FILE_MACHINE_I386 332 ; x86 +!define IMAGE_FILE_MACHINE_ARMNT 452 +!define IMAGE_FILE_MACHINE_IA64 512 ; Itanium +!define IMAGE_FILE_MACHINE_AMD64 34404 ; x86-64/x64 +!define IMAGE_FILE_MACHINE_ARM64 43620 + +!endif /* __WIN_NOINC_WINNT */ +!verbose pop +!endif /* __WIN_WINNT__INC */ \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/Win/WinUser.nsh b/libs/NSIS/NSIS-source/Include/Win/WinUser.nsh new file mode 100644 index 0000000000..50a9921c6d --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/Win/WinUser.nsh @@ -0,0 +1,199 @@ +!ifndef __WIN_WINUSER__INC +!define __WIN_WINUSER__INC +!verbose push +!verbose 3 +!ifndef __WIN_MS_NOUSER & __WIN_NOINC_WINUSER + +!ifndef __WIN_MS_NOVIRTUALKEYCODES +!define VK_LBUTTON 0x01 +!define VK_RBUTTON 0x02 +!define VK_CANCEL 0x03 +!define VK_MBUTTON 0x04 /* NOT contiguous with L & RBUTTON */ +!define VK_XBUTTON1 0x05 /* NOT contiguous with L & RBUTTON */ +!define VK_XBUTTON2 0x06 /* NOT contiguous with L & RBUTTON */ +!define VK_BACK 0x08 +!define VK_TAB 0x09 +!define VK_CLEAR 0x0C +!define VK_RETURN 0x0D +!define VK_SHIFT 0x10 +!define VK_CONTROL 0x11 +!define VK_MENU 0x12 +!define VK_PAUSE 0x13 +!define VK_CAPITAL 0x14 +!define VK_ESCAPE 0x1B +!define VK_CONVERT 0x1C +!define VK_NONCONVERT 0x1D +!define VK_ACCEPT 0x1E +!define VK_MODECHANGE 0x1F +!define VK_SPACE 0x20 +!define VK_PRIOR 0x21 +!define VK_NEXT 0x22 +!define VK_END 0x23 +!define VK_HOME 0x24 +!define VK_LEFT 0x25 +!define VK_UP 0x26 +!define VK_RIGHT 0x27 +!define VK_DOWN 0x28 +!define VK_SELECT 0x29 +!define VK_PRINT 0x2A +!define VK_EXECUTE 0x2B +!define VK_SNAPSHOT 0x2C +!define VK_INSERT 0x2D +!define VK_DELETE 0x2E +!define VK_HELP 0x2F +; VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39) +; VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A) +!define VK_LWIN 0x5B +!define VK_RWIN 0x5C +!define VK_APPS 0x5D +!define VK_SLEEP 0x5F +!define VK_NUMPAD0 0x60 +!define VK_NUMPAD1 0x61 +!define VK_NUMPAD2 0x62 +!define VK_NUMPAD3 0x63 +!define VK_NUMPAD4 0x64 +!define VK_NUMPAD5 0x65 +!define VK_NUMPAD6 0x66 +!define VK_NUMPAD7 0x67 +!define VK_NUMPAD8 0x68 +!define VK_NUMPAD9 0x69 +!define VK_MULTIPLY 0x6A +!define VK_ADD 0x6B +!define VK_SEPARATOR 0x6C +!define VK_SUBTRACT 0x6D +!define VK_DECIMAL 0x6E +!define VK_DIVIDE 0x6F +!define VK_F1 0x70 +!define VK_F2 0x71 +!define VK_F3 0x72 +!define VK_F4 0x73 +!define VK_F5 0x74 +!define VK_F6 0x75 +!define VK_F7 0x76 +!define VK_F8 0x77 +!define VK_F9 0x78 +!define VK_F10 0x79 +!define VK_F11 0x7A +!define VK_F12 0x7B +!define VK_NUMLOCK 0x90 +!define VK_SCROLL 0x91 +!define VK_OEM_NEC_EQUAL 0x92 ; '=' key on numpad +!define VK_LSHIFT 0xA0 +!define VK_RSHIFT 0xA1 +!define VK_LCONTROL 0xA2 +!define VK_RCONTROL 0xA3 +!define VK_LMENU 0xA4 +!define VK_RMENU 0xA5 +!endif + +!ifndef __WIN_MS_NOWINOFFSETS +!define /ifndef GWL_STYLE -16 +!define /ifndef GWL_EXSTYLE -20 +!define /ifndef GWLP_WNDPROC -4 +!define /ifndef GWLP_HINSTANCE -6 +!define /ifndef GWLP_HWNDPARENT -8 +!define /ifndef GWLP_USERDATA -21 +!define /ifndef GWLP_ID -12 +!define DWLP_MSGRESULT 0 +!define /math DWLP_DLGPROC ${DWLP_MSGRESULT} + ${NSIS_PTR_SIZE} ;DWLP_MSGRESULT + sizeof(LRESULT) +!define /math DWLP_USER ${DWLP_DLGPROC} + ${NSIS_PTR_SIZE} ;DWLP_DLGPROC + sizeof(DLGPROC) +!endif + +!ifndef __WIN_MS_NONCMESSAGES +!define HTERROR -2 +!define HTTRANSPARENT -1 +!define HTNOWHERE 0 +!define HTCLIENT 1 +!define HTCAPTION 2 +!define HTSYSMENU 3 +!define HTGROWBOX 4 +!define HTSIZE ${HTGROWBOX} +!define HTMENU 5 +!define HTHSCROLL 6 +!define HTVSCROLL 7 +!define HTMINBUTTON 8 +!define HTMAXBUTTON 9 +!define HTLEFT 10 +!define HTRIGHT 11 +!define HTTOP 12 +!define HTTOPLEFT 13 +!define HTTOPRIGHT 14 +!define HTBOTTOM 15 +!define HTBOTTOMLEFT 16 +!define HTBOTTOMRIGHT 17 +!define HTBORDER 18 +!define HTREDUCE ${HTMINBUTTON} +!define HTZOOM ${HTMAXBUTTON} +!define HTSIZEFIRST ${HTLEFT} +!define HTSIZELAST ${HTBOTTOMRIGHT} +!define HTOBJECT 19 +!define HTCLOSE 20 +!define HTHELP 21 +!endif + +!ifndef __WIN_MS_NOSYSCOMMANDS +!define SC_SIZE 0xF000 +!define SC_MOVE 0xF010 +!define SC_MINIMIZE 0xF020 +!define SC_MAXIMIZE 0xF030 +!define SC_NEXTWINDOW 0xF040 +!define SC_PREVWINDOW 0xF050 +!define SC_CLOSE 0xF060 +!define SC_VSCROLL 0xF070 +!define SC_HSCROLL 0xF080 +!define SC_MOUSEMENU 0xF090 +!define SC_KEYMENU 0xF100 +!define SC_ARRANGE 0xF110 +!define SC_RESTORE 0xF120 +!define SC_TASKLIST 0xF130 +!define SC_SCREENSAVE 0xF140 +!define SC_HOTKEY 0xF150 +!define SC_DEFAULT 0xF160 +!define SC_MONITORPOWER 0xF170 +!define SC_CONTEXTHELP 0xF180 +!define SC_SEPARATOR 0xF00F +!endif + +!define /ifndef IDC_ARROW 32512 +!define /ifndef IDC_IBEAM 32513 +!define /ifndef IDC_WAIT 32514 +!define /ifndef IDC_CROSS 32515 +!define /ifndef IDC_UPARROW 32516 +!define /ifndef IDC_SIZE 32640 +!define /ifndef IDC_ICON 32641 +!define /ifndef IDC_SIZENWSE 32642 +!define /ifndef IDC_SIZENESW 32643 +!define /ifndef IDC_SIZEWE 32644 +!define /ifndef IDC_SIZENS 32645 +!define /ifndef IDC_SIZEALL 32646 +!define /ifndef IDC_NO 32648 +!define /ifndef IDC_HAND 32649 +!define /ifndef IDC_APPSTARTING 32650 +!define /ifndef IDC_HELP 32651 + +!define /ifndef IMAGE_BITMAP 0 +!define /ifndef IMAGE_ICON 1 +!define /ifndef IMAGE_CURSOR 2 +!define /ifndef IMAGE_ENHMETAFILE 3 + +!define /ifndef LR_DEFAULTCOLOR 0x0000 +!define /ifndef LR_MONOCHROME 0x0001 +!define /ifndef LR_COLOR 0x0002 +!define /ifndef LR_COPYRETURNORG 0x0004 +!define /ifndef LR_COPYDELETEORG 0x0008 +!define /ifndef LR_LOADFROMFILE 0x0010 +!define /ifndef LR_LOADTRANSPARENT 0x0020 +!define /ifndef LR_DEFAULTSIZE 0x0040 +!define /ifndef LR_VGACOLOR 0x0080 +!define /ifndef LR_LOADMAP3DCOLORS 0x1000 +!define /ifndef LR_CREATEDIBSECTION 0x2000 +!define /ifndef LR_COPYFROMRESOURCE 0x4000 +!define /ifndef LR_SHARED 0x8000 + +!define GA_PARENT 1 +!define GA_ROOT 2 +!define GA_ROOTOWNER 3 + +!endif /* __WIN_MS_NOUSER & __WIN_NOINC_WINUSER */ +!verbose pop +!endif /* __WIN_WINUSER__INC */ \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/WinCore.nsh b/libs/NSIS/NSIS-source/Include/WinCore.nsh new file mode 100644 index 0000000000..2a1431474a --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/WinCore.nsh @@ -0,0 +1,263 @@ +/* + +WinCore.nsh & Win\*.nsh - Collection of common windows defines + +!define __WIN_NOINC_xxx to exclude a windows header file +!define __WIN_MS_xxx to exclude specific things (The original #ifdef xxx checks can be found in the official Microsoft headers) + +*/ + +!ifndef __WIN_WINDOWS__INC +!define __WIN_WINDOWS__INC +!verbose push +!verbose 3 + + + +!include Win\WinDef.nsh +!include Win\WinError.nsh +!include Win\WinNT.nsh +!include Win\WinUser.nsh + +!ifndef __WIN_MS_NOWINMESSAGES +!include WinMessages.nsh +!endif + + + + + +/************************************************** +WinBase.h +**************************************************/ +!ifndef __WIN_NOINC_WINBASE +!define /ifndef INVALID_HANDLE_VALUE -1 +!define /ifndef INVALID_FILE_SIZE 0xFFFFFFFF +!define /ifndef INVALID_SET_FILE_POINTER -1 +!define /ifndef INVALID_FILE_ATTRIBUTES -1 + +!define WAIT_FAILED 0xFFFFFFFF +!define WAIT_OBJECT_0 0 ;((STATUS_WAIT_0 ) + 0 ) + +!define WAIT_ABANDONED 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 ) +!define WAIT_ABANDONED_0 0x80 ;((STATUS_ABANDONED_WAIT_0 ) + 0 ) + +!define DRIVE_UNKNOWN 0 +!define DRIVE_NO_ROOT_DIR 1 +!define DRIVE_REMOVABLE 2 +!define DRIVE_FIXED 3 +!define DRIVE_REMOTE 4 +!define DRIVE_CDROM 5 +!define DRIVE_RAMDISK 6 + +!define FILE_TYPE_UNKNOWN 0x0000 +!define FILE_TYPE_DISK 0x0001 +!define FILE_TYPE_CHAR 0x0002 +!define FILE_TYPE_PIPE 0x0003 +!define FILE_TYPE_REMOTE 0x8000 + +!define STD_INPUT_HANDLE -10 +!define STD_OUTPUT_HANDLE -11 +!define STD_ERROR_HANDLE -12 + +#define IGNORE 0 ; Ignore signal +!define INFINITE 0xFFFFFFFF ; Infinite timeout + +!endif /* __WIN_NOINC_WINBASE */ + + + + + +/************************************************** +WinGDI.h +**************************************************/ +!ifndef __WIN_MS_NOGDI & __WIN_NOINC_WINGDI +!define HORZRES 8 +!define VERTRES 10 +!define BITSPIXEL 12 +!define LOGPIXELSX 88 +!define LOGPIXELSY 90 +!define COLORRES 108 +!define VREFRESH 116 +!define DESKTOPVERTRES 117 +!define DESKTOPHORZRES 118 +!endif /* __WIN_MS_NOGDI & __WIN_NOINC_WINGDI */ + + + + + +/************************************************** +WinReg.h +**************************************************/ +!ifndef __WIN_NOINC_WINREG +!ifndef __WIN_NOHKEY & HKEY_CLASSES_ROOT & HKEY_CURRENT_USER & HKEY_LOCAL_MACHINE & HKEY_USERS +!define HKEY_CLASSES_ROOT 0x80000000 +!define HKEY_CURRENT_USER 0x80000001 +!define HKEY_LOCAL_MACHINE 0x80000002 +!define HKEY_USERS 0x80000003 +!define HKEY_PERFORMANCE_DATA 0x80000004 +!define HKEY_PERFORMANCE_TEXT 0x80000050 +!define HKEY_PERFORMANCE_NLSTEXT 0x80000060 +!define HKEY_CURRENT_CONFIG 0x80000005 +!define HKEY_DYN_DATA 0x80000006 +!ifndef __WIN_NOSHORTHKEY & HKCR & HKCU & HKLM +!define HKCR ${HKEY_CLASSES_ROOT} +!define HKCU ${HKEY_CURRENT_USER} +!define HKLM ${HKEY_LOCAL_MACHINE} +!endif +!endif +!endif /* __WIN_NOINC_WINREG */ + + + + + +/************************************************** +WindowsX.h +**************************************************/ +!ifndef __WIN_NOINC_WINDOWSX +!ifndef GET_X_LPARAM & GET_Y_LPARAM +!macro _Win_GET_X_LPARAM _outvar _in +IntOp ${_outvar} "${_in}" << 16 ;We can't just use LOWORD, we need to keep the sign, +IntOp ${_outvar} ${_outvar} >> 16 ;so we let NSIS sign extend for us +!macroend +!define GET_X_LPARAM "!insertmacro _Win_GET_X_LPARAM " +!macro _Win_GET_Y_LPARAM _outvar _in +IntOp ${_outvar} "${_in}" >> 16 +!macroend +!define GET_Y_LPARAM "!insertmacro _Win_GET_Y_LPARAM " +!endif +!endif /* __WIN_NOINC_WINDOWSX */ + + + + + +/************************************************** +ShlObj.h +**************************************************/ +!ifndef __WIN_NOINC_SHLOBJ +!ifndef __WIN_NOSHELLFOLDERCSIDL +!define CSIDL_DESKTOP 0x0000 +!define CSIDL_INTERNET 0x0001 ;Internet Explorer (icon on desktop) +!define CSIDL_PROGRAMS 0x0002 ;Start Menu\Programs +!define CSIDL_CONTROLS 0x0003 ;My Computer\Control Panel +!define CSIDL_PRINTERS 0x0004 ;My Computer\Printers +!define CSIDL_PERSONAL 0x0005 ;My Documents +!define CSIDL_FAVORITES 0x0006 ;\Favorites +!define CSIDL_STARTUP 0x0007 ;Start Menu\Programs\Startup +!define CSIDL_RECENT 0x0008 ;\Recent +!define CSIDL_SENDTO 0x0009 ;\SendTo +!define CSIDL_BITBUCKET 0x000a ;\Recycle Bin +!define CSIDL_STARTMENU 0x000b ;\Start Menu +!define CSIDL_MYDOCUMENTS 0x000c ;logical "My Documents" desktop icon +!define CSIDL_MYMUSIC 0x000d ;"My Music" folder +!define CSIDL_MYVIDEO 0x000e ;"My Videos" folder +!define CSIDL_DESKTOPDIRECTORY 0x0010 ;\Desktop +!define CSIDL_DRIVES 0x0011 ;My Computer +!define CSIDL_NETWORK 0x0012 ;Network Neighborhood +!define CSIDL_NETHOOD 0x0013 ;\nethood +!define CSIDL_FONTS 0x0014 ;windows\fonts +!define CSIDL_TEMPLATES 0x0015 +!define CSIDL_COMMON_STARTMENU 0x0016 ;All Users\Start Menu +!define CSIDL_COMMON_PROGRAMS 0x0017 ;All Users\Start Menu\Programs +!define CSIDL_COMMON_STARTUP 0x0018 ;All Users\Startup +!define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 ;All Users\Desktop +!define CSIDL_APPDATA 0x001a ;\Application Data +!define CSIDL_PRINTHOOD 0x001b ;\PrintHood +!define CSIDL_LOCAL_APPDATA 0x001c ;\Local Settings\Application Data (non roaming) +!define CSIDL_ALTSTARTUP 0x001d ;non localized startup +!define CSIDL_COMMON_ALTSTARTUP 0x001e ;non localized common startup +!define CSIDL_COMMON_FAVORITES 0x001f +!define CSIDL_INTERNET_CACHE 0x0020 +!define CSIDL_COOKIES 0x0021 +!define CSIDL_HISTORY 0x0022 +!define CSIDL_COMMON_APPDATA 0x0023 ;All Users\Application Data +!define CSIDL_WINDOWS 0x0024 ;GetWindowsDirectory +!define CSIDL_SYSTEM 0x0025 ;GetSystemDirectory +!define CSIDL_PROGRAM_FILES 0x0026 ;C:\Program Files +!define CSIDL_MYPICTURES 0x0027 +!define CSIDL_PROFILE 0x0028 ;USERPROFILE +!define CSIDL_SYSTEMX86 0x0029 ;x86 system directory on RISC +!define CSIDL_PROGRAM_FILESX86 0x002a ;x86 C:\Program Files on RISC +!define CSIDL_PROGRAM_FILES_COMMON 0x002b ;C:\Program Files\Common +!define CSIDL_PROGRAM_FILES_COMMONX86 0x002c ;x86 Program Files\Common on RISC +!define CSIDL_COMMON_TEMPLATES 0x002d ;All Users\Templates +!define CSIDL_COMMON_DOCUMENTS 0x002e ;All Users\Documents +!define CSIDL_COMMON_ADMINTOOLS 0x002f ;All Users\Start Menu\Programs\Administrative Tools +!define CSIDL_ADMINTOOLS 0x0030 ;\Start Menu\Programs\Administrative Tools +!define CSIDL_CONNECTIONS 0x0031 ;Network and Dial-up Connections +!define CSIDL_COMMON_MUSIC 0x0035 ;All Users\My Music +!define CSIDL_COMMON_PICTURES 0x0036 ;All Users\My Pictures +!define CSIDL_COMMON_VIDEO 0x0037 ;All Users\My Video +!define CSIDL_RESOURCES 0x0038 ;Resource Directory +!define CSIDL_RESOURCES_LOCALIZED 0x0039 ;Localized Resource Directory +!define CSIDL_COMMON_OEM_LINKS 0x003a ;Links to All Users OEM specific apps +!define CSIDL_CDBURN_AREA 0x003b ;USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning +!define CSIDL_COMPUTERSNEARME 0x003d ;Computers Near Me (computered from Workgroup membership) +!define CSIDL_FLAG_CREATE 0x8000 ;combine with CSIDL_ value to force folder creation in SHGetFolderPath() +!define CSIDL_FLAG_DONT_VERIFY 0x4000 ;combine with CSIDL_ value to return an unverified folder path +!define CSIDL_FLAG_NO_ALIAS 0x1000 ;combine with CSIDL_ value to insure non-alias versions of the pidl +!define CSIDL_FLAG_PER_USER_INIT 0x0800 ;combine with CSIDL_ value to indicate per-user init (eg. upgrade) +!define CSIDL_FLAG_MASK 0xFF00 +!endif /* __WIN_NOSHELLFOLDERCSIDL */ +!endif /* __WIN_NOINC_SHLOBJ */ + + + + + +/************************************************** +Shobjidl.h +**************************************************/ +!ifndef __WIN_NOINC_SHOBJIDL +; ASSOCIATIONLEVEL +!define AL_MACHINE 0 +!define AL_EFFECTIVE 1 +!define AL_USER 2 + +; ASSOCIATIONTYPE +!define AT_FILEEXTENSION 0 +!define AT_URLPROTOCOL 1 +!define AT_STARTMENUCLIENT 2 +!define AT_MIMETYPE 3 +!endif /* __WIN_NOINC_SHOBJIDL */ + + + + + +/************************************************** +ShlGuid.h +**************************************************/ +!ifndef __WIN_NOINC_SHLGUID +!define FOLDERID_Public {DFDF76A2-C82A-4D63-906A-5644AC457385} ; Vista+ Fixed=%SystemDrive%\Users\Public +!define FOLDERID_Games {CAC52C1A-B53D-4edc-92D7-6B2E8AC19434} ; Vista+ && < 10 (1803) Virtual +!define FOLDERID_SavedGames {4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4} ; Vista+ PerUser=%USERPROFILE%\Saved Games +!define FOLDERID_GameTasks {054FAE61-4DD8-4787-80B6-090220C4B700} ; Vista+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\GameExplorer +!define FOLDERID_PublicGameTasks {DEBF2536-E1A8-4c59-B6A2-414586476AEA} ; Vista+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\GameExplorer +!define FOLDERID_Contacts {56784854-C6CB-462b-8169-88E350ACB882} ; Vista+ PerUser=%USERPROFILE%\Contacts +!define FOLDERID_Downloads {374DE290-123F-4565-9164-39C4925E467B} ; Vista+ PerUser=%USERPROFILE%\Downloads +!define FOLDERID_PublicDownloads {3D644C9B-1FB8-4f30-9B45-F670235F79C0} ; Vista+ Common=%PUBLIC%\Downloads +!define FOLDERID_UserProfiles {0762D272-C50A-4BB0-A382-697DCD729B80} ; Vista+ Fixed=%SystemDrive%\Users +!define FOLDERID_UserProgramFiles {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; 7+ PerUser=%LOCALAPPDATA%\Programs +!define FOLDERID_UserProgramFilesCommon {BCBD3057-CA5C-4622-B42D-BC56DB0AE516} ; 7+ PerUser=%LOCALAPPDATA%\Programs\Common +!define FOLDERID_PublicLibraries {48DAF80B-E6CF-4F4E-B800-0E69D84EE384} ; 7+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\Libraries +!define FOLDERID_UserPinned {9E3995AB-1F9C-4F13-B827-48B24B6C7174} ; 7+ PerUser=%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned +!define FOLDERID_ImplicitAppShortcuts {BCB5256F-79F6-4CEE-B725-DC34E402FD46} ; 7+ PerUser=%APPDATA%\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts +!define FOLDERID_DeviceMetadataStore {5CE4A5E9-E4EB-479D-B89F-130C02886155} ; 7+ Common=%ALLUSERSPROFILE%\Microsoft\Windows\DeviceMetadataStore +!define FOLDERID_ApplicationShortcuts {A3918781-E5F2-4890-B3D9-A7E54332328C} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\Application Shortcuts +!define FOLDERID_RoamingTiles {00BCFC5A-ED94-4e48-96A1-3F6217F21990} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamingTiles +!define FOLDERID_RoamedTileImages {AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E} ; 8.0+ PerUser=%LOCALAPPDATA%\Microsoft\Windows\RoamedTileImages +!define FOLDERID_PublicUserTiles {0482af6c-08f1-4c34-8c90-e17ec98b1e17} ; 8.0+ Common=%PUBLIC%\AccountPictures +!define FOLDERID_AccountPictures {008ca0b1-55b4-4c56-b8a8-4de4b299d3be} ; 8.0+ PerUser=%APPDATA%\Microsoft\Windows\AccountPictures +!define FOLDERID_Screenshots {b7bede81-df94-4682-a7d8-57a52620b86f} ; 8.0+ PerUser=%USERPROFILE%\Pictures\Screenshots +!define FOLDERID_SkyDrive {A52BBA46-E9E1-435f-B3D9-28DAA648C0F6} ; 8.1+ PerUser=%USERPROFILE%\OneDrive +!define FOLDERID_AppDataProgramData {559D40A3-A036-40FA-AF61-84CB430A4D34} ; 10 (1709)+ PerUser=%LOCALAPPDATA%\ProgramData +!endif /* __WIN_NOINC_SHLGUID */ + + +!verbose pop +!endif /* __WIN_WINDOWS__INC */ \ No newline at end of file diff --git a/libs/NSIS/NSIS-source/Include/WinMessages.nsh b/libs/NSIS/NSIS-source/Include/WinMessages.nsh new file mode 100644 index 0000000000..47d09dcde7 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/WinMessages.nsh @@ -0,0 +1,890 @@ +/* +_____________________________________________________________________________ + + List of common Windows Messages +_____________________________________________________________________________ + + 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + + +Usage example: +--------------------------------------------------- +Name "Output" +OutFile "Output.exe" + +!include "WinMessages.nsh" + +Section + FindWindow $0 '#32770' '' $HWNDPARENT + GetDlgItem $1 $0 1027 + SendMessage $1 ${WM_SETTEXT} 0 'STR:MyText' +SectionEnd +--------------------------------------------------- + + +Prefix Message category +------------------------- +SW ShowWindow Commands +CCM Generic Common Control +BM Button control +CB Combo box control +EM Edit control +LB List box control +WM General window +ABM Application desktop toolbar +DBT Device +DM Default push button control +HDM Header control +LVM List view control +SB Status bar window +SBM Scroll bar control +STM Static control +TCM Tab control +PBM Progress bar +ACM Animation control +TBM Track bar +UDM Up-down control +HKM Hot key control +IPM IP address control +NCM Network address control +----------------------------------- + +NOT included messages (WM_USER + X) +----------------------------------- +CBEM Extended combo box control +CDM Common dialog box +DL Drag list box +PGM Pager control +PSM Property sheet +RB Rebar control +TB Toolbar +TTM Tooltip control +TVM Tree-view control +----------------------------------- +*/ + + +!ifndef WINMESSAGES_INCLUDED +!define WINMESSAGES_INCLUDED +!verbose push +!verbose 3 + +!define _NSIS_DEFAW '!insertmacro _NSIS_DEFAW ' +!macro _NSIS_DEFAW d +!ifdef NSIS_UNICODE +!define ${d} "${${d}W}" +!else +!define ${d} "${${d}A}" +!endif +!macroend + +!define HWND_BROADCAST 0xFFFF + +#ShowWindow Commands# +!define SW_HIDE 0 +!define SW_SHOWNORMAL 1 +!define SW_NORMAL 1 +!define SW_SHOWMINIMIZED 2 +!define SW_SHOWMAXIMIZED 3 +!define SW_MAXIMIZE 3 +!define SW_SHOWNOACTIVATE 4 +!define SW_SHOW 5 +!define SW_MINIMIZE 6 +!define SW_SHOWMINNOACTIVE 7 +!define SW_SHOWNA 8 +!define SW_RESTORE 9 +!define SW_SHOWDEFAULT 10 +!define SW_FORCEMINIMIZE 11 +!define SW_MAX 11 + +#Generic Common Control Messages# +!define CCM_FIRST 0x2000 +!define /math CCM_SETBKCOLOR ${CCM_FIRST} + 0x1 ; IE4 +!define /math CCM_SETUNICODEFORMAT ${CCM_FIRST} + 0x5 +!define /math CCM_GETUNICODEFORMAT ${CCM_FIRST} + 0x6 +!define /math CCM_SETVERSION ${CCM_FIRST} + 0x7 ; IE5 +!define /math CCM_GETVERSION ${CCM_FIRST} + 0x8 +!define /math CCM_SETWINDOWTHEME ${CCM_FIRST} + 0xB ; WinXP +!define /math CCM_DPISCALE ${CCM_FIRST} + 0xC +!define WM_USER 0x400 + +!define CCS_TOP 1 +!define CCS_BOTTOM 3 +!define CCS_NODIVIDER 64 +!define CCS_LEFT 129 +!define CCS_RIGHT 131 + +!define I_IMAGENONE -2 + +#Button Control Messages# +!define BM_CLICK 0x00F5 +!define BM_GETCHECK 0x00F0 +!define BM_GETIMAGE 0x00F6 +!define BM_GETSTATE 0x00F2 +!define BM_SETCHECK 0x00F1 +!define BM_SETIMAGE 0x00F7 +!define BM_SETSTATE 0x00F3 +!define BM_SETSTYLE 0x00F4 +!define BCM_SETSHIELD 0x160C ; WinVista + ComCtl32 v6 + +!define BST_UNCHECKED 0 +!define BST_CHECKED 1 +!define BST_INDETERMINATE 2 +!define BST_PUSHED 4 +!define BST_FOCUS 8 + +#Combo Box Messages# +!define CB_ADDSTRING 0x0143 +!define CB_DELETESTRING 0x0144 +!define CB_DIR 0x0145 +!define CB_FINDSTRING 0x014C +!define CB_FINDSTRINGEXACT 0x0158 +!define CB_GETCOUNT 0x0146 +!define CB_GETCURSEL 0x0147 +!define CB_GETDROPPEDCONTROLRECT 0x0152 +!define CB_GETDROPPEDSTATE 0x0157 +!define CB_GETDROPPEDWIDTH 0x015f +!define CB_GETEDITSEL 0x0140 +!define CB_GETEXTENDEDUI 0x0156 +!define CB_GETHORIZONTALEXTENT 0x015d +!define CB_GETITEMDATA 0x0150 +!define CB_GETITEMHEIGHT 0x0154 +!define CB_GETLBTEXT 0x0148 +!define CB_GETLBTEXTLEN 0x0149 +!define CB_GETLOCALE 0x015A +!define CB_GETTOPINDEX 0x015b +!define CB_INITSTORAGE 0x0161 +!define CB_INSERTSTRING 0x014A +!define CB_LIMITTEXT 0x0141 +!define CB_MSGMAX 0x015B # 0x0162 0x0163 +!define CB_MULTIPLEADDSTRING 0x0163 +!define CB_RESETCONTENT 0x014B +!define CB_SELECTSTRING 0x014D +!define CB_SETCURSEL 0x014E +!define CB_SETDROPPEDWIDTH 0x0160 +!define CB_SETEDITSEL 0x0142 +!define CB_SETEXTENDEDUI 0x0155 +!define CB_SETHORIZONTALEXTENT 0x015e +!define CB_SETITEMDATA 0x0151 +!define CB_SETITEMHEIGHT 0x0153 +!define CB_SETLOCALE 0x0159 +!define CB_SETTOPINDEX 0x015c +!define CB_SHOWDROPDOWN 0x014F +!define CBM_FIRST 0x1700 ; Vista+ +!define /math CB_SETMINVISIBLE ${CBM_FIRST} + 1 +!define /math CB_GETMINVISIBLE ${CBM_FIRST} + 2 +!define /math CB_SETCUEBANNER ${CBM_FIRST} + 3 +!define /math CB_GETCUEBANNER ${CBM_FIRST} + 4 + +!define CB_ERR -1 + +#Edit Control Messages# +!define EM_CANUNDO 0x00C6 +!define EM_CHARFROMPOS 0x00D7 +!define EM_EMPTYUNDOBUFFER 0x00CD +!define EM_FMTLINES 0x00C8 +!define EM_GETFIRSTVISIBLELINE 0x00CE +!define EM_GETHANDLE 0x00BD +!define EM_GETIMESTATUS 0x00D9 +!define EM_GETLIMITTEXT 0x00D5 +!define EM_GETLINE 0x00C4 +!define EM_GETLINECOUNT 0x00BA +!define EM_GETMARGINS 0x00D4 +!define EM_GETMODIFY 0x00B8 +!define EM_GETPASSWORDCHAR 0x00D2 +!define EM_GETRECT 0x00B2 +!define EM_GETSEL 0x00B0 +!define EM_GETTHUMB 0x00BE +!define EM_GETWORDBREAKPROC 0x00D1 +!define EM_LIMITTEXT 0x00C5 +!define EM_LINEFROMCHAR 0x00C9 +!define EM_LINEINDEX 0x00BB +!define EM_LINELENGTH 0x00C1 +!define EM_LINESCROLL 0x00B6 +!define EM_POSFROMCHAR 0x00D6 +!define EM_REPLACESEL 0x00C2 +!define EM_SCROLL 0x00B5 +!define EM_SCROLLCARET 0x00B7 +!define EM_SETHANDLE 0x00BC +!define EM_SETIMESTATUS 0x00D8 +!define EM_SETLIMITTEXT 0x00C5 # Same as EM_LIMITTEXT +!define EM_SETMARGINS 0x00D3 +!define EM_SETMODIFY 0x00B9 +!define EM_SETPASSWORDCHAR 0x00CC +!define EM_SETREADONLY 0x00CF +!define EM_SETRECT 0x00B3 +!define EM_SETRECTNP 0x00B4 +!define EM_SETSEL 0x00B1 +!define EM_SETTABSTOPS 0x00CB +!define EM_SETWORDBREAKPROC 0x00D0 +!define EM_UNDO 0x00C7 +!define ECM_FIRST 0x1500 ; CC6+ +!define /math EM_SETCUEBANNER ${ECM_FIRST} + 1 + +#RichEdit Messages# +!define /math EM_EXGETSEL ${WM_USER} + 52 +!define /math EM_EXLIMITTEXT ${WM_USER} + 53 +!define /math EM_EXLINEFROMCHAR ${WM_USER} + 54 +!define /math EM_GETEVENTMASK ${WM_USER} + 59 +!define /math EM_GETOLEINTERFACE ${WM_USER} + 60 +!define /math EM_HIDESELECTION ${WM_USER} + 63 +!define /math EM_SETBKGNDCOLOR ${WM_USER} + 67 +!define /math EM_SETEVENTMASK ${WM_USER} + 69 +!define /math EM_STREAMIN ${WM_USER} + 73 +!define /math EM_STREAMOUT ${WM_USER} + 74 +!define /math EM_GETTEXTRANGE ${WM_USER} + 75 +!define /math EM_SETOPTIONS ${WM_USER} + 77 +!define /math EM_GETOPTIONS ${WM_USER} + 78 +!define /math EM_SETUNDOLIMIT ${WM_USER} + 82 ; v2+ +!define /math EM_AUTOURLDETECT ${WM_USER} + 91 +!define /Math EM_SETTEXTEX ${WM_USER} + 97 ; v3+ +!define /math EM_SETEDITSTYLE ${WM_USER} + 204 +!define /math EM_SETFONTSIZE ${WM_USER} + 223 + +!define EN_MSGFILTER 0x0700 +!define EN_SELCHANGE 0x0702 +!define EN_LINK 0x070b + +!define ENM_NONE 0x00000000 +!define ENM_CHANGE 0x00000001 +!define ENM_UPDATE 0x00000002 +!define ENM_SCROLL 0x00000004 +!define ENM_SCROLLEVENTS 0x00000008 +!define ENM_KEYEVENTS 0x00010000 +!define ENM_MOUSEEVENTS 0x00020000 +!define ENM_SELCHANGE 0x00080000 +!define ENM_LINK 0x04000000 ; v2+ + +#Listbox Messages# +!define LB_ADDFILE 0x0196 +!define LB_ADDSTRING 0x0180 +!define LB_DELETESTRING 0x0182 +!define LB_DIR 0x018D +!define LB_FINDSTRING 0x018F +!define LB_FINDSTRINGEXACT 0x01A2 +!define LB_GETANCHORINDEX 0x019D +!define LB_GETCARETINDEX 0x019F +!define LB_GETCOUNT 0x018B +!define LB_GETCURSEL 0x0188 +!define LB_GETHORIZONTALEXTENT 0x0193 +!define LB_GETITEMDATA 0x0199 +!define LB_GETITEMHEIGHT 0x01A1 +!define LB_GETITEMRECT 0x0198 +!define LB_GETLOCALE 0x01A6 +!define LB_GETSEL 0x0187 +!define LB_GETSELCOUNT 0x0190 +!define LB_GETSELITEMS 0x0191 +!define LB_GETTEXT 0x0189 +!define LB_GETTEXTLEN 0x018A +!define LB_GETTOPINDEX 0x018E +!define LB_INITSTORAGE 0x01A8 +!define LB_INSERTSTRING 0x0181 +!define LB_ITEMFROMPOINT 0x01A9 +!define LB_MSGMAX 0x01A8 # 0x01B0 0x01B1 +!define LB_MULTIPLEADDSTRING 0x01B1 +!define LB_RESETCONTENT 0x0184 +!define LB_SELECTSTRING 0x018C +!define LB_SELITEMRANGE 0x019B +!define LB_SELITEMRANGEEX 0x0183 +!define LB_SETANCHORINDEX 0x019C +!define LB_SETCARETINDEX 0x019E +!define LB_SETCOLUMNWIDTH 0x0195 +!define LB_SETCOUNT 0x01A7 +!define LB_SETCURSEL 0x0186 +!define LB_SETHORIZONTALEXTENT 0x0194 +!define LB_SETITEMDATA 0x019A +!define LB_SETITEMHEIGHT 0x01A0 +!define LB_SETLOCALE 0x01A5 +!define LB_SETSEL 0x0185 +!define LB_SETTABSTOPS 0x0192 +!define LB_SETTOPINDEX 0x0197 + +!define LB_ERR -1 + +#Window Messages# +!define WM_ACTIVATE 0x0006 +!define WM_ACTIVATEAPP 0x001C +!define WM_AFXFIRST 0x0360 +!define WM_AFXLAST 0x037F +!define WM_APP 0x8000 +!define WM_APPCOMMAND 0x0319 +!define WM_ASKCBFORMATNAME 0x030C +!define WM_CANCELJOURNAL 0x004B +!define WM_CANCELMODE 0x001F +!define WM_CAPTURECHANGED 0x0215 +!define WM_CHANGECBCHAIN 0x030D +!define WM_CHANGEUISTATE 0x0127 +!define WM_CHAR 0x0102 +!define WM_CHARTOITEM 0x002F +!define WM_CHILDACTIVATE 0x0022 +!define WM_CLEAR 0x0303 +!define WM_CLOSE 0x0010 +!define WM_COMMAND 0x0111 +!define WM_COMMNOTIFY 0x0044 # no longer supported +!define WM_COMPACTING 0x0041 +!define WM_COMPAREITEM 0x0039 +!define WM_CONTEXTMENU 0x007B +!define WM_CONVERTREQUESTEX 0x108 +!define WM_COPY 0x0301 +!define WM_COPYDATA 0x004A +!define WM_CREATE 0x0001 +!define WM_CTLCOLOR 0x0019 +!define WM_CTLCOLORBTN 0x0135 +!define WM_CTLCOLORDLG 0x0136 +!define WM_CTLCOLOREDIT 0x0133 +!define WM_CTLCOLORLISTBOX 0x0134 +!define WM_CTLCOLORMSGBOX 0x0132 +!define WM_CTLCOLORSCROLLBAR 0x0137 +!define WM_CTLCOLORSTATIC 0x0138 +!define WM_CUT 0x0300 +!define WM_DDE_FIRST 0x3E0 +!define WM_DEADCHAR 0x0103 +!define WM_DELETEITEM 0x002D +!define WM_DESTROY 0x0002 +!define WM_DESTROYCLIPBOARD 0x0307 +!define WM_DEVICECHANGE 0x0219 +!define WM_DEVMODECHANGE 0x001B +!define WM_DISPLAYCHANGE 0x007E +!define WM_DRAWCLIPBOARD 0x0308 +!define WM_DRAWITEM 0x002B +!define WM_DROPFILES 0x0233 +!define WM_ENABLE 0x000A +!define WM_ENDSESSION 0x0016 +!define WM_ENTERIDLE 0x0121 +!define WM_ENTERMENULOOP 0x0211 +!define WM_ENTERSIZEMOVE 0x0231 +!define WM_ERASEBKGND 0x0014 +!define WM_EXITMENULOOP 0x0212 +!define WM_EXITSIZEMOVE 0x0232 +!define WM_FONTCHANGE 0x001D +!define WM_GETDLGCODE 0x0087 +!define WM_GETFONT 0x0031 +!define WM_GETHOTKEY 0x0033 +!define WM_GETICON 0x007F +!define WM_GETMINMAXINFO 0x0024 +!define WM_GETOBJECT 0x003D +!define WM_GETTEXT 0x000D +!define WM_GETTEXTLENGTH 0x000E +!define WM_HANDHELDFIRST 0x0358 +!define WM_HANDHELDLAST 0x035F +!define WM_HELP 0x0053 +!define WM_HOTKEY 0x0312 +!define WM_HSCROLL 0x0114 +!define WM_HSCROLLCLIPBOARD 0x030E +!define WM_ICONERASEBKGND 0x0027 +!define WM_IME_CHAR 0x0286 +!define WM_IME_COMPOSITION 0x010F +!define WM_IME_COMPOSITIONFULL 0x0284 +!define WM_IME_CONTROL 0x0283 +!define WM_IME_ENDCOMPOSITION 0x010E +!define WM_IME_KEYDOWN 0x0290 +!define WM_IME_KEYLAST 0x010F +!define WM_IME_KEYUP 0x0291 +!define WM_IME_NOTIFY 0x0282 +!define WM_IME_REQUEST 0x0288 +!define WM_IME_SELECT 0x0285 +!define WM_IME_SETCONTEXT 0x0281 +!define WM_IME_STARTCOMPOSITION 0x010D +!define WM_INITDIALOG 0x0110 +!define WM_INITMENU 0x0116 +!define WM_INITMENUPOPUP 0x0117 +!define WM_INPUT 0x00FF +!define WM_INPUTLANGCHANGE 0x0051 +!define WM_INPUTLANGCHANGEREQUEST 0x0050 +!define WM_KEYDOWN 0x0100 +!define WM_KEYFIRST 0x0100 +!define WM_KEYLAST 0x0108 +!define WM_KEYUP 0x0101 +!define WM_KILLFOCUS 0x0008 +!define WM_LBUTTONDBLCLK 0x0203 +!define WM_LBUTTONDOWN 0x0201 +!define WM_LBUTTONUP 0x0202 +!define WM_MBUTTONDBLCLK 0x0209 +!define WM_MBUTTONDOWN 0x0207 +!define WM_MBUTTONUP 0x0208 +!define WM_MDIACTIVATE 0x0222 +!define WM_MDICASCADE 0x0227 +!define WM_MDICREATE 0x0220 +!define WM_MDIDESTROY 0x0221 +!define WM_MDIGETACTIVE 0x0229 +!define WM_MDIICONARRANGE 0x0228 +!define WM_MDIMAXIMIZE 0x0225 +!define WM_MDINEXT 0x0224 +!define WM_MDIREFRESHMENU 0x0234 +!define WM_MDIRESTORE 0x0223 +!define WM_MDISETMENU 0x0230 +!define WM_MDITILE 0x0226 +!define WM_MEASUREITEM 0x002C +!define WM_MENUCHAR 0x0120 +!define WM_MENUCOMMAND 0x0126 +!define WM_MENUDRAG 0x0123 +!define WM_MENUGETOBJECT 0x0124 +!define WM_MENURBUTTONUP 0x0122 +!define WM_MENUSELECT 0x011F +!define WM_MOUSEACTIVATE 0x0021 +!define WM_MOUSEFIRST 0x0200 +!define WM_MOUSEHOVER 0x02A1 +!define WM_MOUSELAST 0x0209 # 0x020A 0x020D +!define WM_MOUSELEAVE 0x02A3 +!define WM_MOUSEMOVE 0x0200 +!define WM_MOUSEWHEEL 0x020A +!define WM_MOVE 0x0003 +!define WM_MOVING 0x0216 +!define WM_NCACTIVATE 0x0086 +!define WM_NCCALCSIZE 0x0083 +!define WM_NCCREATE 0x0081 +!define WM_NCDESTROY 0x0082 +!define WM_NCHITTEST 0x0084 +!define WM_NCLBUTTONDBLCLK 0x00A3 +!define WM_NCLBUTTONDOWN 0x00A1 +!define WM_NCLBUTTONUP 0x00A2 +!define WM_NCMBUTTONDBLCLK 0x00A9 +!define WM_NCMBUTTONDOWN 0x00A7 +!define WM_NCMBUTTONUP 0x00A8 +!define WM_NCMOUSEHOVER 0x02A0 +!define WM_NCMOUSELEAVE 0x02A2 +!define WM_NCMOUSEMOVE 0x00A0 +!define WM_NCPAINT 0x0085 +!define WM_NCRBUTTONDBLCLK 0x00A6 +!define WM_NCRBUTTONDOWN 0x00A4 +!define WM_NCRBUTTONUP 0x00A5 +!define WM_NCXBUTTONDBLCLK 0x00AD +!define WM_NCXBUTTONDOWN 0x00AB +!define WM_NCXBUTTONUP 0x00AC +!define WM_NEXTDLGCTL 0x0028 +!define WM_NEXTMENU 0x0213 +!define WM_NOTIFY 0x004E +!define WM_NOTIFYFORMAT 0x0055 +!define WM_NULL 0x0000 +!define WM_PAINT 0x000F +!define WM_PAINTCLIPBOARD 0x0309 +!define WM_PAINTICON 0x0026 +!define WM_PALETTECHANGED 0x0311 +!define WM_PALETTEISCHANGING 0x0310 +!define WM_PARENTNOTIFY 0x0210 +!define WM_PASTE 0x0302 +!define WM_PENWINFIRST 0x0380 +!define WM_PENWINLAST 0x038F +!define WM_POWER 0x0048 +!define WM_POWERBROADCAST 0x0218 +!define WM_PRINT 0x0317 +!define WM_PRINTCLIENT 0x0318 +!define WM_QUERYDRAGICON 0x0037 +!define WM_QUERYENDSESSION 0x0011 +!define WM_QUERYNEWPALETTE 0x030F +!define WM_QUERYOPEN 0x0013 +!define WM_QUERYUISTATE 0x0129 +!define WM_QUEUESYNC 0x0023 +!define WM_QUIT 0x0012 +!define WM_RBUTTONDBLCLK 0x0206 +!define WM_RBUTTONDOWN 0x0204 +!define WM_RBUTTONUP 0x0205 +!define WM_RASDIALEVENT 0xCCCD +!define WM_RENDERALLFORMATS 0x0306 +!define WM_RENDERFORMAT 0x0305 +!define WM_SETCURSOR 0x0020 +!define WM_SETFOCUS 0x0007 +!define WM_SETFONT 0x0030 +!define WM_SETHOTKEY 0x0032 +!define WM_SETICON 0x0080 +!define WM_SETREDRAW 0x000B +!define WM_SETTEXT 0x000C +!define WM_SETTINGCHANGE 0x001A # Same as WM_WININICHANGE +!define WM_SHOWWINDOW 0x0018 +!define WM_SIZE 0x0005 +!define WM_SIZECLIPBOARD 0x030B +!define WM_SIZING 0x0214 +!define WM_SPOOLERSTATUS 0x002A +!define WM_STYLECHANGED 0x007D +!define WM_STYLECHANGING 0x007C +!define WM_SYNCPAINT 0x0088 +!define WM_SYSCHAR 0x0106 +!define WM_SYSCOLORCHANGE 0x0015 +!define WM_SYSCOMMAND 0x0112 +!define WM_SYSDEADCHAR 0x0107 +!define WM_SYSKEYDOWN 0x0104 +!define WM_SYSKEYUP 0x0105 +!define WM_TABLET_FIRST 0x02C0 +!define WM_TABLET_LAST 0x02DF +!define WM_THEMECHANGED 0x031A +!define WM_TCARD 0x0052 +!define WM_TIMECHANGE 0x001E +!define WM_TIMER 0x0113 +!define WM_UNDO 0x0304 +!define WM_UNICHAR 0x0109 +!define WM_UNINITMENUPOPUP 0x0125 +!define WM_UPDATEUISTATE 0x0128 +!define WM_USERCHANGED 0x0054 +!define WM_VKEYTOITEM 0x002E +!define WM_VSCROLL 0x0115 +!define WM_VSCROLLCLIPBOARD 0x030A +!define WM_WINDOWPOSCHANGED 0x0047 +!define WM_WINDOWPOSCHANGING 0x0046 +!define WM_WININICHANGE 0x001A +!define WM_WTSSESSION_CHANGE 0x02B1 +!define WM_XBUTTONDBLCLK 0x020D +!define WM_XBUTTONDOWN 0x020B +!define WM_XBUTTONUP 0x020C + + +#Application desktop toolbar# +!define ABM_ACTIVATE 0x00000006 # lParam == TRUE/FALSE means activate/deactivate +!define ABM_GETAUTOHIDEBAR 0x00000007 +!define ABM_GETSTATE 0x00000004 +!define ABM_GETTASKBARPOS 0x00000005 +!define ABM_NEW 0x00000000 +!define ABM_QUERYPOS 0x00000002 +!define ABM_REMOVE 0x00000001 +!define ABM_SETAUTOHIDEBAR 0x00000008 # This can fail, you MUST check the result +!define ABM_SETPOS 0x00000003 +!define ABM_WINDOWPOSCHANGED 0x0000009 + +#Device# +!define DBT_APPYBEGIN 0x0000 +!define DBT_APPYEND 0x0001 +!define DBT_CONFIGCHANGECANCELED 0x0019 +!define DBT_CONFIGCHANGED 0x0018 +!define DBT_CONFIGMGAPI32 0x0022 +!define DBT_CONFIGMGPRIVATE 0x7FFF +!define DBT_CUSTOMEVENT 0x8006 # User-defined event +!define DBT_DEVICEARRIVAL 0x8000 # System detected a new device +!define DBT_DEVICEQUERYREMOVE 0x8001 # Wants to remove, may fail +!define DBT_DEVICEQUERYREMOVEFAILED 0x8002 # Removal aborted +!define DBT_DEVICEREMOVECOMPLETE 0x8004 # Device is gone +!define DBT_DEVICEREMOVEPENDING 0x8003 # About to remove, still avail. +!define DBT_DEVICETYPESPECIFIC 0x8005 # Type specific event +!define DBT_DEVNODES_CHANGED 0x0007 +!define DBT_DEVTYP_DEVICEINTERFACE 0x00000005 # Device interface class +!define DBT_DEVTYP_DEVNODE 0x00000001 # Devnode number +!define DBT_DEVTYP_HANDLE 0x00000006 # File system handle +!define DBT_DEVTYP_NET 0x00000004 # Network resource +!define DBT_DEVTYP_OEM 0x00000000 # Oem-defined device type +!define DBT_DEVTYP_PORT 0x00000003 # Serial, parallel +!define DBT_DEVTYP_VOLUME 0x00000002 # Logical volume +!define DBT_LOW_DISK_SPACE 0x0048 +!define DBT_MONITORCHANGE 0x001B +!define DBT_NO_DISK_SPACE 0x0047 +!define DBT_QUERYCHANGECONFIG 0x0017 +!define DBT_SHELLLOGGEDON 0x0020 +!define DBT_USERDEFINED 0xFFFF +!define DBT_VOLLOCKLOCKFAILED 0x8043 +!define DBT_VOLLOCKLOCKRELEASED 0x8045 +!define DBT_VOLLOCKLOCKTAKEN 0x8042 +!define DBT_VOLLOCKQUERYLOCK 0x8041 +!define DBT_VOLLOCKQUERYUNLOCK 0x8044 +!define DBT_VOLLOCKUNLOCKFAILED 0x8046 +!define DBT_VPOWERDAPI 0x8100 # VPOWERD API for Win95 +!define DBT_VXDINITCOMPLETE 0x0023 + +#Default push button control# +!define DM_BITSPERPEL 0x00040000 +!define DM_COLLATE 0x00008000 +!define DM_COLOR 0x00000800 +!define DM_COPIES 0x00000100 +!define DM_DEFAULTSOURCE 0x00000200 +!define DM_DISPLAYFLAGS 0x00200000 +!define DM_DISPLAYFREQUENCY 0x00400000 +!define DM_DITHERTYPE 0x04000000 +!define DM_DUPLEX 0x00001000 +!define DM_FORMNAME 0x00010000 +!define DM_GRAYSCALE 0x00000001 # This flag is no longer valid +!define DM_ICMINTENT 0x01000000 +!define DM_ICMMETHOD 0x00800000 +!define DM_INTERLACED 0x00000002 # This flag is no longer valid +!define DM_LOGPIXELS 0x00020000 +!define DM_MEDIATYPE 0x02000000 +!define DM_NUP 0x00000040 +!define DM_ORIENTATION 0x00000001 +!define DM_PANNINGHEIGHT 0x10000000 +!define DM_PANNINGWIDTH 0x08000000 +!define DM_PAPERLENGTH 0x00000004 +!define DM_PAPERSIZE 0x00000002 +!define DM_PAPERWIDTH 0x00000008 +!define DM_PELSHEIGHT 0x00100000 +!define DM_PELSWIDTH 0x00080000 +!define DM_POSITION 0x00000020 +!define DM_PRINTQUALITY 0x00000400 +!define DM_SCALE 0x00000010 +!define DM_SPECVERSION 0x0320 # 0x0400 0x0401 +!define DM_TTOPTION 0x00004000 +!define DM_YRESOLUTION 0x00002000 + +#Header control# +!define HDM_FIRST 0x1200 + +#List view control# +!define LVS_SINGLESEL 4 +!define LVS_SHOWSELALWAYS 8 +!define LVS_SORTASCENDING 0x10 +!define LVS_SORTDESCENDING 0x20 +!define LVS_SHAREIMAGELISTS 0x40 +!define LVS_EDITLABELS 0x200 +!define LVS_NOSCROLL 0x2000 +!define LVS_NOCOLUMNHEADER 0x4000 +!define LVS_NOSORTHEADER 0x8000 +!define LVS_ICON 0 +!define LVS_REPORT 1 +!define LVS_SMALLICON 2 +!define LVS_LIST 3 +!define LVS_EX_CHECKBOXES 4 +!define LVS_EX_FULLROWSELECT 0x20 +!define LVS_EX_INFOTIP 0x400 +!define LVS_EX_LABELTIP 0x4000 +!define LVS_EX_DOUBLEBUFFER 0x10000 +!define LVIF_TEXT 1 +!define LVIF_IMAGE 2 +!define LVIF_PARAM 4 +!define LVIF_STATE 8 +!define LVIS_STATEIMAGEMASK 0xF000 +!define LVCF_FMT 1 +!define LVCF_WIDTH 2 +!define LVCF_TEXT 4 +!define LVCF_SUBITEM 8 +!define SYSSTRUCT_LVITEM_V1 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p) +!define SYSSTRUCT_LVITEM_V2 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i) ; IE3 +!define SYSSTRUCT_LVITEM_V3 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i,i,i,i) ; WinXP + ComCtl32 v6 +!define SYSSTRUCT_LVITEM_V4 (i,i,i,i,&i${NSIS_PTR_SIZE},t,i,i,p,i,i,i,i,i,i) ; WinVista + ComCtl32 v6 +!define LVSCW_AUTOSIZE -1 +!define LVSCW_AUTOSIZE_USEHEADER -2 +!define LVM_FIRST 0x00001000 +!define /math LVM_GETIMAGELIST ${LVM_FIRST} + 2 +!define /math LVM_SETIMAGELIST ${LVM_FIRST} + 3 +!define /math LVM_GETITEMCOUNT ${LVM_FIRST} + 4 +!define /math LVM_GETITEMA ${LVM_FIRST} + 5 +!define /math LVM_SETITEMA ${LVM_FIRST} + 6 +!define /math LVM_INSERTITEMA ${LVM_FIRST} + 7 +!define /math LVM_DELETEITEM ${LVM_FIRST} + 8 +!define /math LVM_DELETEALLITEMS ${LVM_FIRST} + 9 +!define /math LVM_INSERTCOLUMNA ${LVM_FIRST} + 27 +!define /math LVM_SETCOLUMNWIDTH ${LVM_FIRST} + 30 +!define /math LVM_SETITEMSTATE ${LVM_FIRST} + 43 +!define /math LVM_GETITEMSTATE ${LVM_FIRST} + 44 +!define /math LVM_GETITEMTEXTA ${LVM_FIRST} + 45 +!define /math LVM_SETITEMTEXTA ${LVM_FIRST} + 46 +!define /math LVM_SETITEMCOUNT ${LVM_FIRST} + 47 +!define /math LVM_SORTITEMS ${LVM_FIRST} + 48 +!define /math LVM_SETEXTENDEDLISTVIEWSTYLE ${LVM_FIRST} + 54 +!define /math LVM_GETEXTENDEDLISTVIEWSTYLE ${LVM_FIRST} + 55 +!define /math LVM_GETITEMW ${LVM_FIRST} + 75 +!define /math LVM_SETITEMW ${LVM_FIRST} + 76 +!define /math LVM_INSERTITEMW ${LVM_FIRST} + 77 +!define /math LVM_INSERTCOLUMNW ${LVM_FIRST} + 97 +!define /math LVM_GETITEMTEXTW ${LVM_FIRST} + 115 +!define /math LVM_SETITEMTEXTW ${LVM_FIRST} + 116 +!define /math LVM_SETSELECTEDCOLUMN ${LVM_FIRST} + 140 +${_NSIS_DEFAW} LVM_GETITEM +${_NSIS_DEFAW} LVM_SETITEM +${_NSIS_DEFAW} LVM_INSERTITEM +${_NSIS_DEFAW} LVM_INSERTCOLUMN +${_NSIS_DEFAW} LVM_GETITEMTEXT +${_NSIS_DEFAW} LVM_SETITEMTEXT + +#Status bar window# +!define SB_SIMPLEID 0x00ff + +#Scroll bar control# +!define SBM_ENABLE_ARROWS 0x00E4 # Not in win3.1 +!define SBM_GETPOS 0x00E1 # Not in win3.1 +!define SBM_GETRANGE 0x00E3 # Not in win3.1 +!define SBM_GETSCROLLINFO 0x00EA +!define SBM_SETPOS 0x00E0 # Not in win3.1 +!define SBM_SETRANGE 0x00E2 # Not in win3.1 +!define SBM_SETRANGEREDRAW 0x00E6 # Not in win3.1 +!define SBM_SETSCROLLINFO 0x00E9 + +#Static control# +!define STM_SETICON 0x0170 +!define STM_GETICON 0x0171 +!define STM_SETIMAGE 0x0172 +!define STM_GETIMAGE 0x0173 +!define STM_MSGMAX 0x0174 + +#Tab control# +!define TCS_SCROLLOPPOSITE 0x0001 +!define TCIF_TEXT 1 +!define TCIF_PARAM 8 +!define SYSSTRUCT_TCITEM (i,i,&i${NSIS_PTR_SIZE},t,i,i,p) +!define TCM_FIRST 0x1300 +!define /math TCM_INSERTITEMA ${TCM_FIRST} + 7 +!define /math TCM_GETCURSEL ${TCM_FIRST} + 11 +!define /math TCM_ADJUSTRECT ${TCM_FIRST} + 40 +!define /math TCM_INSERTITEMW ${TCM_FIRST} + 62 +!define TCN_SELCHANGE -551 +!define TCN_SELCHANGING -552 +${_NSIS_DEFAW} TCM_INSERTITEM + +#Progress bar control# +!define PBM_SETRANGE 0x401 +!define PBM_SETPOS 0x402 +!define PBM_DELTAPOS 0x403 +!define PBM_SETSTEP 0x404 +!define PBM_STEPIT 0x405 +!define PBM_SETRANGE32 0x406 ; IE3 + ComCtl32 v4.70 +!define PBM_GETRANGE 0x407 +!define PBM_GETPOS 0x408 +!define PBM_SETBARCOLOR 0x409 ; IE4 + ComCtl32 v4.71 +!define PBM_SETBKCOLOR ${CCM_SETBKCOLOR} +!define PBM_SETMARQUEE 0x40A ; WinXP + ComCtl32 v6 +!define PBM_GETSTEP 0x40D ; WinVista +!define PBM_GETBKCOLOR 0x40E +!define PBM_GETBARCOLOR 0x40F +!define PBM_SETSTATE 0x410 +!define PBM_GETSTATE 0x411 + +!define PBST_NORMAL 1 +!define PBST_ERROR 2 +!define PBST_PAUSED 3 + +#Animation control# +!define /math ACM_OPENA ${WM_USER} + 100 +!define /math ACM_PLAY ${WM_USER} + 101 +!define /math ACM_STOP ${WM_USER} + 102 +!define /math ACM_OPENW ${WM_USER} + 103 +${_NSIS_DEFAW} ACM_OPEN + +#TrackBar control# +!define /math TBM_GETPOS ${WM_USER} + 0 +!define /math TBM_GETRANGEMIN ${WM_USER} + 1 +!define /math TBM_GETRANGEMAX ${WM_USER} + 2 +!define /math TBM_GETTIC ${WM_USER} + 3 +!define /math TBM_SETTIC ${WM_USER} + 4 +!define /math TBM_SETPOS ${WM_USER} + 5 +!define /math TBM_SETRANGE ${WM_USER} + 6 +!define /math TBM_SETRANGEMIN ${WM_USER} + 7 +!define /math TBM_SETRANGEMAX ${WM_USER} + 8 +!define /math TBM_CLEARTICS ${WM_USER} + 9 +!define /math TBM_SETSEL ${WM_USER} + 10 +!define /math TBM_SETSELSTART ${WM_USER} + 11 +!define /math TBM_SETSELEND ${WM_USER} + 12 +!define /math TBM_GETPTICS ${WM_USER} + 14 +!define /math TBM_GETTICPOS ${WM_USER} + 15 +!define /math TBM_GETNUMTICS ${WM_USER} + 16 +!define /math TBM_GETSELSTART ${WM_USER} + 17 +!define /math TBM_GETSELEND ${WM_USER} + 18 +!define /math TBM_CLEARSEL ${WM_USER} + 19 +!define /math TBM_SETTICFREQ ${WM_USER} + 20 ; TBS_AUTOTICKS required +!define /math TBM_SETPAGESIZE ${WM_USER} + 21 +!define /math TBM_GETPAGESIZE ${WM_USER} + 22 +!define /math TBM_SETLINESIZE ${WM_USER} + 23 +!define /math TBM_GETLINESIZE ${WM_USER} + 24 +!define /math TBM_GETTHUMBRECT ${WM_USER} + 25 +!define /math TBM_GETCHANNELRECT ${WM_USER} + 26 +!define /math TBM_SETTHUMBLENGTH ${WM_USER} + 27 +!define /math TBM_GETTHUMBLENGTH ${WM_USER} + 28 +!define /math TBM_SETTOOLTIPS ${WM_USER} + 29 ; IE3 +!define /math TBM_GETTOOLTIPS ${WM_USER} + 30 ; IE3 +!define /math TBM_SETTIPSIDE ${WM_USER} + 31 ; IE3 +!define /math TBM_SETBUDDY ${WM_USER} + 32 ; IE3 +!define /math TBM_GETBUDDY ${WM_USER} + 33 ; IE3 +!define TBM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4 +!define TBM_GETUNICODEFORMAT ${CCM_GETUNICODEFORMAT} ; IE4 +!define /math TBM_SETPOSNOTIFY ${WM_USER} + 34 ; 7? + +#UpDown controls# +!define /math UDM_SETRANGE ${WM_USER} + 101 +!define /math UDM_GETRANGE ${WM_USER} + 102 +!define /math UDM_SETPOS ${WM_USER} + 103 +!define /math UDM_GETPOS ${WM_USER} + 104 +!define /math UDM_SETBUDDY ${WM_USER} + 105 +!define /math UDM_GETBUDDY ${WM_USER} + 106 +!define /math UDM_SETACCEL ${WM_USER} + 107 +!define /math UDM_GETACCEL ${WM_USER} + 108 +!define /math UDM_SETBASE ${WM_USER} + 109 +!define /math UDM_GETBASE ${WM_USER} + 110 +!define /math UDM_SETRANGE32 ${WM_USER} + 111 ; IE4 +!define /math UDM_GETRANGE32 ${WM_USER} + 112 ; IE4 +!define UDM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4 +!define UDM_GETUNICODEFORMAT ${CCM_GETUNICODEFORMAT} ; IE4 +!define /math UDM_SETPOS32 ${WM_USER} + 113 ; IE5 +!define /math UDM_GETPOS32 ${WM_USER} + 114 ; IE5 + +#HotKey control# +!define /math HKM_SETHOTKEY ${WM_USER} + 1 +!define /math HKM_GETHOTKEY ${WM_USER} + 2 +!define /math HKM_SETRULES ${WM_USER} + 3 +!define /IfNDef HOTKEYF_SHIFT 0x01 +!define /IfNDef HOTKEYF_CONTROL 0x02 +!define /IfNDef HOTKEYF_ALT 0x04 +!define /IfNDef HOTKEYF_EXT 0x08 +!define HKCOMB_NONE 0x01 +!define HKCOMB_S 0x02 +!define HKCOMB_C 0x04 +!define HKCOMB_A 0x08 +!define HKCOMB_SC 0x10 +!define HKCOMB_SA 0x20 +!define HKCOMB_CA 0x40 +!define HKCOMB_SCA 0x80 + +#IPAddress control# +!define /math IPM_CLEARADDRESS ${WM_USER} + 100 +!define /math IPM_SETADDRESS ${WM_USER} + 101 +!define /math IPM_GETADDRESS ${WM_USER} + 102 +!define /math IPM_SETRANGE ${WM_USER} + 103 +!define /math IPM_SETFOCUS ${WM_USER} + 104 +!define /math IPM_ISBLANK ${WM_USER} + 105 + +#NetworkAddress control# +!define /math NCM_GETADDRESS ${WM_USER} + 1 ; Vista+ +!define /math NCM_SETALLOWTYPE ${WM_USER} + 2 +!define /math NCM_GETALLOWTYPE ${WM_USER} + 3 +!define /math NCM_DISPLAYERRORTIP ${WM_USER} + 4 + +#Month calendar control# +!define MCM_FIRST 0x1000 +!define /math MCM_GETCURSEL ${MCM_FIRST} + 1 +!define /math MCM_SETCURSEL ${MCM_FIRST} + 2 +!define /math MCM_GETMAXSELCOUNT ${MCM_FIRST} + 3 +!define /math MCM_SETMAXSELCOUNT ${MCM_FIRST} + 4 +!define /math MCM_GETSELRANGE ${MCM_FIRST} + 5 +!define /math MCM_SETSELRANGE ${MCM_FIRST} + 6 +!define /math MCM_GETMONTHRANGE ${MCM_FIRST} + 7 +!define /math MCM_SETDAYSTATE ${MCM_FIRST} + 8 +!define /math MCM_GETMINREQRECT ${MCM_FIRST} + 9 +!define /math MCM_SETCOLOR ${MCM_FIRST} + 10 +!define /math MCM_GETCOLOR ${MCM_FIRST} + 11 +!define /math MCM_SETTODAY ${MCM_FIRST} + 12 +!define /math MCM_GETTODAY ${MCM_FIRST} + 13 +!define /math MCM_HITTEST ${MCM_FIRST} + 14 +!define /math MCM_SETFIRSTDAYOFWEEK ${MCM_FIRST} + 15 +!define /math MCM_GETFIRSTDAYOFWEEK ${MCM_FIRST} + 16 +!define /math MCM_GETRANGE ${MCM_FIRST} + 17 +!define /math MCM_SETRANGE ${MCM_FIRST} + 18 +!define /math MCM_GETMONTHDELTA ${MCM_FIRST} + 19 +!define /math MCM_SETMONTHDELTA ${MCM_FIRST} + 20 +!define /math MCM_GETMAXTODAYWIDTH ${MCM_FIRST} + 21 +!define MCM_SETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4+ +!define MCM_GETUNICODEFORMAT ${CCM_SETUNICODEFORMAT} ; IE4+ +!define /math MCM_GETCURRENTVIEW ${MCM_FIRST} + 22 ; Vista+ +!define /math MCM_GETCALENDARCOUNT ${MCM_FIRST} + 23 +!define /math MCM_GETCALENDARGRIDINFO ${MCM_FIRST} + 24 +!define /math MCM_GETCALID ${MCM_FIRST} + 27 +!define /math MCM_SETCALID ${MCM_FIRST} + 28 +!define /math MCM_SIZERECTTOMIN ${MCM_FIRST} + 29 +!define /math MCM_SETCALENDARBORDER ${MCM_FIRST} + 30 +!define /math MCM_GETCALENDARBORDER ${MCM_FIRST} + 31 +!define /math MCM_SETCURRENTVIEW ${MCM_FIRST} + 32 +!define MCN_SELCHANGE -749 +!define MCN_GETDAYSTATE -747 +!define MCN_SELECT -746 +!define MCN_VIEWCHANGE -750 ; Vista+? + +#DateTime control# +!define DTM_FIRST 0x1000 +!define /math DTM_GETSYSTEMTIME ${DTM_FIRST} + 1 +!define /math DTM_SETSYSTEMTIME ${DTM_FIRST} + 2 +!define /math DTM_SETFORMATA ${DTM_FIRST} + 5 +!define /math DTM_SETFORMATW ${DTM_FIRST} + 50 +${_NSIS_DEFAW} DTM_SETFORMAT +!define /math DTM_GETMONTHCAL ${DTM_FIRST} + 8 +!define /math DTM_SETMCFONT ${DTM_FIRST} + 9 ; IE4+? +!define /math DTM_GETMCFONT ${DTM_FIRST} + 10 ; IE4+? +!define /math DTM_SETMCSTYLE ${DTM_FIRST} + 11 ; Vista+? +!define /math DTM_GETMCSTYLE ${DTM_FIRST} + 12 ; Vista+? +!define /math DTM_CLOSEMONTHCAL ${DTM_FIRST} + 13 ; Vista+? +!define DTN_DATETIMECHANGE -759 +!define /IfNDef GDT_ERROR -1 +!define /IfNDef GDT_VALID 0 +!define /IfNDef GDT_NONE 1 + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/WinVer.nsh b/libs/NSIS/NSIS-source/Include/WinVer.nsh new file mode 100644 index 0000000000..6a55da06eb --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/WinVer.nsh @@ -0,0 +1,705 @@ +; --------------------- +; WinVer.nsh +; --------------------- +; +; LogicLib extensions for handling Windows versions and service packs. +; +; IsNT checks if the installer is running on Windows NT family (NT4, 2000, XP, etc.) +; +; ${If} ${IsNT} +; DetailPrint "Running on NT. Installing Unicode enabled application." +; ${Else} +; DetailPrint "Not running on NT. Installing ANSI application." +; ${EndIf} +; +; IsServerOS checks if the installer is running on a server version of Windows (2000, 2003, 2008, etc.) +; IsDomainController checks if the server is a domain controller +; +; AtLeastWin checks if the installer is running on Windows version at least as specified. +; IsWin checks if the installer is running on Windows version exactly as specified. +; AtMostWin checks if the installer is running on Windows version at most as specified. +; AtLeastBuild checks if the installer is running on a Windows version with a minimum build number. +; AtMostBuild checks if the installer is running on a Windows version with a maximum build number. +; AtLeastWaaS and AtMostWaaS checks Windows 10 "friendly names" against the build number. +; +; can be replaced with the following values: +; +; 95 +; 98 +; ME +; +; NT4 +; 2000 +; XP +; 2003 +; Vista +; 2008 +; 7 +; 2008R2 +; 8 +; 2012 +; 8.1 +; 2012R2 +; 10 +; 11 +; +; Note: Windows 8.1 and later will be detected as Windows 8 unless ManifestSupportedOS is set correctly! +; +; AtLeastServicePack checks if the installer is running on Windows service pack version at least as specified. +; IsServicePack checks if the installer is running on Windows service pack version exactly as specified. +; AtMostServicePack checks if the installer is running on Windows service version pack at most as specified. +; +; Usage examples: +; +; ${If} ${IsNT} +; DetailPrint "Running on NT family." +; DetailPrint "Surely not running on 95, 98 or ME." +; ${AndIf} ${AtLeastWinNT4} +; DetailPrint "Running on NT4 or better. Could even be 2003." +; ${EndIf} +; +; ${If} ${AtLeastWinXP} +; DetailPrint "Running on XP or better." +; ${EndIf} +; +; ${If} ${IsWin2000} +; DetailPrint "Running on 2000." +; ${EndIf} +; +; ${If} ${IsWin2000} +; ${AndIf} ${AtLeastServicePack} 3 +; ${OrIf} ${AtLeastWinXP} +; DetailPrint "Running Win2000 SP3 or above" +; ${EndIf} +; +; ${If} ${AtMostWinXP} +; DetailPrint "Running on XP or older. Surely not running on Vista. Maybe 98, or even 95." +; ${EndIf} +; +; Warning: +; +; Windows 95 and NT both use the same version number. To avoid getting NT4 misidentified +; as Windows 95 and vice-versa or 98 as a version higher than NT4, always use IsNT to +; check if running on the NT family. +; +; ${If} ${AtLeastWin95} +; ${AndIf} ${AtMostWinME} +; DetailPrint "Running 95, 98 or ME." +; DetailPrint "Actually, maybe it's NT4?" +; ${If} ${IsNT} +; DetailPrint "Yes, it's NT4! oops..." +; ${Else} +; DetailPrint "Nope, not NT4. phew..." +; ${EndIf} +; ${EndIf} +; +; +; Other useful extensions are: +; +; * IsWin2003R2 +; * IsStarterEdition +; * OSHasMediaCenter +; * OSHasTabletSupport +; + +!verbose push +!verbose 3 + +!ifndef ___WINVER__NSH___ +!define ___WINVER__NSH___ + +!include LogicLib.nsh +!include Util.nsh + +# masks for our variables + +!define _WINVER_VERXBIT 0x00000001 ; Used to boost $__WINVERV +!define _WINVER_MASKVMAJ 0x7F000000 ; $__WINVERV mask +!define _WINVER_MASKVMIN 0x00FF0000 ; $__WINVERV mask +!define _WINVER_NTMASK 0x7FFFFFFF ; $__WINVERV mask used by AtMost/AtLeast +!define _WINVER_NTBIT 0x80000000 ; $__WINVERV bit used by Is and $__WINVERSP bit used by IsNT +!define _WINVER_NTSRVBIT 0x40000000 ; $__WINVERSP bit for !VER_NT_WORKSTATION +!define _WINVER_NTDCBIT 0x20000000 ; $__WINVERSP bit for VER_NT_DOMAIN_CONTROLLER +!define _WINVER_MASKVBLD 0x0000FFFF ; $__WINVERSP mask for OS build number +!define _WINVER_MASKSP 0x000F0000 ; $__WINVERSP mask for OS service pack + +# possible variable values for different versions + +!define WINVER_95_NT 0x04000000 ;4.00.0950 +!define WINVER_95 0x04000000 ;4.00.0950 +!define WINVER_98_NT 0x040a0000 ;4.10.1998 +!define WINVER_98 0x040a0000 ;4.10.1998 +;define WINVER_98SE 0x040a0000 ;4.10.2222 +!define WINVER_ME_NT 0x045a0000 ;4.90.3000 +!define WINVER_ME 0x045a0000 ;4.90.3000 +;define WINVER_NT3.51 ;3.51.1057 +!define WINVER_NT4_NT 0x84000000 ;4.00.1381 +!define WINVER_NT4 0x04000000 ;4.00.1381 +!define WINVER_2000_NT 0x85000000 ;5.00.2195 +!define WINVER_2000 0x05000000 ;5.00.2195 +!define WINVER_XP_NT 0x85010000 ;5.01.2600 +!define WINVER_XP 0x05010000 ;5.01.2600 +;define WINVER_XP64 ;5.02.3790 +!define WINVER_2003_NT 0x85020000 ;5.02.3790 +!define WINVER_2003 0x05020000 ;5.02.3790 +!define WINVER_VISTA_NT 0x86000000 ;6.00.6000 +!define WINVER_VISTA 0x06000000 ;6.00.6000 +!define WINVER_2008_NT 0x86000001 ;6.00.6001 +!define WINVER_2008 0x06000001 ;6.00.6001 +!define WINVER_7_NT 0x86010000 ;6.01.7600 +!define WINVER_7 0x06010000 ;6.01.7600 +!define WINVER_2008R2_NT 0x86010001 ;6.01.7600 +!define WINVER_2008R2 0x06010001 ;6.01.7600 +!define WINVER_8_NT 0x86020000 ;6.02.9200 +!define WINVER_8 0x06020000 ;6.02.9200 +!define WINVER_2012_NT 0x86020001 ;6.02.9200 +!define WINVER_2012 0x06020001 ;6.02.9200 +!define WINVER_8.1_NT 0x86030000 ;6.03.9600 +!define WINVER_8.1 0x06030000 ;6.03.9600 +!define WINVER_2012R2_NT 0x86030001 ;6.03.9600 +!define WINVER_2012R2 0x06030001 ;6.03.9600 +!define WINVER_10_NT 0x8A000000 ;10.0.10240 +!define WINVER_10 0x0A000000 ;10.0.10240 +!define WINVER_2016_NT 0x8A000001 ;10.0.14393 +!define WINVER_2016 0x0A000001 ;10.0.14393 + + +# use this to make all nt > 9x + +!ifdef WINVER_NT4_OVER_W95 + !define /redef /math WINVER_NT4 ${WINVER_NT4} | ${_WINVER_VERXBIT} +!endif + +# some definitions from header files + +!define OSVERSIONINFOW_SIZE 276 +!define OSVERSIONINFOEXW_SIZE 284 +!define OSVERSIONINFOA_SIZE 148 +!define OSVERSIONINFOEXA_SIZE 156 +!define /ifndef VER_PLATFORM_WIN32_NT 2 +!define /ifndef VER_NT_WORKSTATION 1 +!define /ifndef VER_NT_DOMAIN_CONTROLLER 2 +!define /ifndef VER_NT_SERVER 3 + +!define SM_TABLETPC 86 +!define SM_MEDIACENTER 87 +!define SM_STARTER 88 +!define SM_SERVERR2 89 + +# variable declaration + +!macro __WinVer_DeclareVars + + !ifndef __WINVER_VARS_DECLARED + + !define __WINVER_VARS_DECLARED + + Var /GLOBAL __WINVERV + Var /GLOBAL __WINVERSP + + !endif + +!macroend + +!macro __WinVer_Optimize +!ifndef __WINVER_NOOPTIMIZE +!if "${NSIS_CHAR_SIZE}" > 1 +!define /ReDef AtMostWin95 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWin98 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWinME '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' +!endif +!if "${NSIS_PTR_SIZE}" > 4 +!define /ReDef AtMostWin95 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWin98 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWinME '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWinNT4 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinNT4 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtLeastWin95 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin98 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinME '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinNT4 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin2000 '"" LogicLib_AlwaysTrue ""' +!endif +!ifdef NSIS_ARM | NSIS_ARM32 | NSIS_ARMNT | NSIS_ARM64 +!define /ReDef AtMostWin2000 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWinXP '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWin2003 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWinVista '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtMostWin7 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin95 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin98 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinME '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinNT4 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin2000 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinXP '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin2003 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWinVista '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin2008 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin7 '"" LogicLib_AlwaysFalse ""' +!define /ReDef IsWin2008R2 '"" LogicLib_AlwaysFalse ""' +!define /ReDef AtLeastWin95 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin98 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinME '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinNT4 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin2000 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinXP '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin2003 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWinVista '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin2008 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin7 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin2008R2 '"" LogicLib_AlwaysTrue ""' +!define /ReDef AtLeastWin8 '"" LogicLib_AlwaysTrue ""' +!endif +!endif +!macroend + +# lazy initialization macro + +!define /IfNDef __WinVer_GWV GetWinVer + +!macro __WinVer_InitVars_NEW + !insertmacro __WinVer_DeclareVars + !insertmacro __WinVer_Optimize + + # only calculate version once + StrCmp $__WINVERV "" _winver_noveryet + Return + _winver_noveryet: + + Push $0 + ${__WinVer_GWV} $0 Product + ${__WinVer_GWV} $__WINVERV NTDDIMajMin + IntOp $__WINVERV $__WINVERV << 16 ; _WINVER_MASKVMAJ & _WINVER_MASKVMIN + IntOp $__WINVERSP $0 & 2 + IntOp $__WINVERSP $__WINVERSP << 29 ; _WINVER_NTSRVBIT & _WINVER_NTDCBIT + !ifndef NSIS_ARM64 + IntCmp $__WINVERSP 0 notServer + IntCmpU 0x06000000 $__WINVERV "" "" not2008 ; ${If} $__WINVERV U>= 0x06000000 + IntCmpU 0x09000000 $__WINVERV not2008 not2008 "" ; ${AndIf} $__WINVERV U< 0x09000000 + IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; Extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2 + not2008: + Goto endServer + notServer: + IntCmp $__WINVERV 0x05020000 "" notXP64 notXP64 + StrCpy $__WINVERV 0x05010000 ; Change XP 64-bit from 5.2 to 5.1 so it's still XP + notXP64: + endServer: + !endif + + IntCmp $0 0 notNT +!if "${NSIS_PTR_SIZE}" <= 4 +!ifdef WINVER_NT4_OVER_W95 + IntCmp $__WINVERV 0x04000000 "" nt4eq95 nt4eq95 + IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; change NT 4.0.reserved.0 to 4.0.reserved.1 + nt4eq95: +!endif +!endif + IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT} ; _WINVER_NTBIT + IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT} ; _WINVER_NTBIT + notNT: + + ${__WinVer_GWV} $0 Build + IntOp $__WINVERSP $__WINVERSP | $0 ; _WINVER_MASKVBLD + ${__WinVer_GWV} $0 ServicePack + IntOp $0 $0 << 16 + IntOp $__WINVERSP $__WINVERSP | $0 ; _WINVER_MASKSP + Pop $0 +!macroend + +!ifmacrondef __WinVer_Call_GetVersionEx + + !macro __WinVer_Call_GetVersionEx STRUCT_SIZE + + System::Call '*$0(i ${STRUCT_SIZE})' + System::Call kernel32::GetVersionEx(pr0)i.r3 + + !macroend + +!endif + +!macro __WinVer_InitVars_OLD + # variables + !insertmacro __WinVer_DeclareVars + !insertmacro __WinVer_Optimize + + # only calculate version once + StrCmp $__WINVERV "" _winver_noveryet + Return + _winver_noveryet: + + # push used registers on the stack + Push $0 + Push $1 ;maj + Push $2 ;min + Push $3 ;bld + Push $R0 ;temp + + # a plugin call will lock the Unicode mode, it is now safe to set the struct size + !ifdef NSIS_UNICODE + !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOW_SIZE} + !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXW_SIZE} + !else + !define /redef OSVERSIONINFO_SIZE ${OSVERSIONINFOA_SIZE} + !define /redef OSVERSIONINFOEX_SIZE ${OSVERSIONINFOEXA_SIZE} + !endif + + # allocate memory + System::Call '*(&i${OSVERSIONINFOEX_SIZE})p.r0' + + # use OSVERSIONINFOEX + !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEX_SIZE} + + IntCmp $3 0 "" _winver_ex _winver_ex + # OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO + !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFO_SIZE} + _winver_ex: + + # get results from struct + System::Call '*$0(i.s,i.r1,i.r2,i.r3,i.s,&t128.s,&i2.s,&i2,&i2,&i1.s,&i1)' + + # free struct + System::Free $0 + + # win9x has major and minor info in high word of dwBuildNumber - remove it + IntOp $3 $3 & 0xFFFF + + # get dwOSVersionInfoSize + Pop $R0 + + # get dwPlatformId + Pop $0 + + # NT? + IntCmp $0 ${VER_PLATFORM_WIN32_NT} "" _winver_notnt _winver_notnt + IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTBIT} + IntOp $__WINVERV $__WINVERV | ${_WINVER_NTBIT} + _winver_notnt: +!ifndef NSIS_UNICODE +!if "${NSIS_PTR_SIZE}" <= 4 + # get service pack information + IntCmp $0 ${VER_PLATFORM_WIN32_NT} _winver_nt "" _winver_nt # win9x + + # get szCSDVersion + Pop $0 + + # copy second char + StrCpy $0 $0 1 1 + + # discard invalid wServicePackMajor and wProductType + Pop $R0 + Pop $R0 + + # switch + StrCmp $0 'A' "" +3 + StrCpy $0 1 + Goto _winver_sp_done + StrCmp $0 'B' "" +3 + StrCpy $0 2 + Goto _winver_sp_done + StrCmp $0 'C' "" +3 + StrCpy $0 3 + Goto _winver_sp_done + StrCpy $0 0 + Goto _winver_sp_done + + _winver_nt: # nt +!endif #~ 32-bit +!endif #~ ANSI + IntCmp $R0 ${OSVERSIONINFOEX_SIZE} "" _winver_sp_noex _winver_sp_noex + + # discard szCSDVersion + Pop $0 + + # get wProductType + Exch + Pop $0 + + # is server? + IntCmp $0 ${VER_NT_WORKSTATION} _winver_nt_notsrv + IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTSRVBIT} + IntCmp $0 ${VER_NT_DOMAIN_CONTROLLER} "" _winver_nt_notdc _winver_nt_notdc + IntOp $__WINVERSP $__WINVERSP | ${_WINVER_NTDCBIT} + _winver_nt_notdc: + _winver_nt_notsrv: + + # get wServicePackMajor + Pop $0 + + # done with sp + Goto _winver_sp_done + + _winver_sp_noex: # OSVERSIONINFO, not OSVERSIONINFOEX + + #### TODO + ## For IsServerOS to support < NT4SP6, we need to check the registry + ## here to see if we are a server and/or DC + + # get szCSDVersion + Pop $0 + + # discard invalid wServicePackMajor and wProductType + Pop $R0 + Pop $R0 + + # get service pack number from text + StrCpy $R0 $0 13 + StrCmp $R0 "Service Pack " "" +3 + StrCpy $0 $0 "" 13 # cut "Service Pack " + Goto +2 + StrCpy $0 0 # no service pack + +!ifdef WINVER_NT4_OVER_W95 + IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} ; change NT 4.0.reserved.0 to 4.0.reserved.1 +!endif + + _winver_sp_done: + + # store service pack + IntOp $0 $0 << 16 + IntOp $__WINVERSP $__WINVERSP | $0 + + ### now for the version + + # is server? + IntOp $0 $__WINVERSP & ${_WINVER_NTSRVBIT} + + # windows xp x64? + IntCmp $0 0 "" _winver_not_xp_x64 _winver_not_xp_x64 # not server + IntCmp $1 5 "" _winver_not_xp_x64 _winver_not_xp_x64 # maj 5 + IntCmp $2 2 "" _winver_not_xp_x64 _winver_not_xp_x64 # min 2 + # change XP x64 from 5.2 to 5.1 so it's still XP + StrCpy $2 1 + _winver_not_xp_x64: + + # server 2008? + IntCmp $0 0 _winver_not_ntserver # server + IntCmp 6 $1 "" "" _winver_not_ntserver # maj 6 + # extra bit so Server 2008 comes after Vista SP1 that has the same minor version, same for Win7 vs 2008R2 + IntOp $__WINVERV $__WINVERV | ${_WINVER_VERXBIT} + _winver_not_ntserver: + + # pack version + IntOp $1 $1 << 24 # VerMajor + IntOp $__WINVERV $__WINVERV | $1 + IntOp $0 $2 << 16 + IntOp $__WINVERV $__WINVERV | $0 # VerMinor + IntOp $__WINVERSP $__WINVERSP | $3 # VerBuild + + # restore registers + Pop $R0 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + +!macroend + +!macro __WinVer_InitVars + !ifndef WinVer_v3_7 + !insertmacro __WinVer_InitVars_NEW + !else + !insertmacro __WinVer_InitVars_OLD + !endif +!macroend + +# version comparison LogicLib macros + +!macro _WinVerAtLeast _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ${CallArtificialFunction} __WinVer_InitVars + IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} + !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` +!macroend +!macro _WinVerIs _a _b _t _f + ${CallArtificialFunction} __WinVer_InitVars + !insertmacro _= $__WINVERV `${_b}` `${_t}` `${_f}` +!macroend +!macro _WinVerAtMost _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ${CallArtificialFunction} __WinVer_InitVars + IntOp $_LOGICLIB_TEMP $__WINVERV & ${_WINVER_NTMASK} + !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` +!macroend + +!macro __WinVer_DefineOSTest Test OS Suffix + !define ${Test}Win${OS} `"" WinVer${Test} ${WINVER_${OS}${Suffix}}` +!macroend + +!macro __WinVer_DefineOSTests Test Suffix + !insertmacro __WinVer_DefineOSTest ${Test} 95 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 98 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} ME '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} NT4 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2000 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} XP '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2003 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} VISTA '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2008 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 7 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2008R2 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 8 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2012 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 8.1 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2012R2 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 10 '${Suffix}' + !insertmacro __WinVer_DefineOSTest ${Test} 2016 '${Suffix}' + !define /IfNDef AtLeastWin11 'U>= WinVer_BuildNumCheck 22000' + !define /IfNDef AtMostWin11 'U<= WinVer_BuildNumCheck 22000' +!macroend + +!insertmacro __WinVer_DefineOSTests AtLeast "" +!insertmacro __WinVer_DefineOSTests Is _NT +!insertmacro __WinVer_DefineOSTests AtMost "" + +# version feature LogicLib macros + +!macro __WinVer_LL_IsBitSet _v _b _t _f + !insertmacro _LOGICLIB_TEMP + ${CallArtificialFunction} __WinVer_InitVars + IntOp $_LOGICLIB_TEMP ${_v} & ${_b} + !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` +!macroend + +!define IsNT `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTBIT}` +!define IsServerOS `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTSRVBIT}` +!define IsDomainController `$__WINVERSP _WinVer_LL_IsBitSet ${_WINVER_NTDCBIT}` + +# service pack macros + +!macro _WinVer_GetServicePackLevel OUTVAR + !ifndef WinVer_v3_7 + ${__WinVer_GWV} ${OUTVAR} ServicePack + !else + ${CallArtificialFunction} __WinVer_InitVars + IntOp ${OUTVAR} $__WINVERSP & ${_WINVER_MASKSP} + IntOp ${OUTVAR} ${OUTVAR} >> 16 + !endif +!macroend +!define WinVerGetServicePackLevel '!insertmacro _WinVer_GetServicePackLevel ' + +!macro _AtLeastServicePack _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP + !insertmacro _>= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` +!macroend +!define AtLeastServicePack `"" AtLeastServicePack` + +!macro _AtMostServicePack _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP + !insertmacro _<= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` +!macroend +!define AtMostServicePack `"" AtMostServicePack` + +!macro _IsServicePack _a _b _t _f + !insertmacro _LOGICLIB_TEMP + ${WinVerGetServicePackLevel} $_LOGICLIB_TEMP + !insertmacro _= $_LOGICLIB_TEMP `${_b}` `${_t}` `${_f}` +!macroend +!define IsServicePack `"" IsServicePack` + +# special feature LogicLib macros + +!macro _WinVer_SysMetricCheck m _b _t _f + !insertmacro _LOGICLIB_TEMP + System::Call user32::GetSystemMetrics(i${m})i.s + pop $_LOGICLIB_TEMP + !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` +!macroend + +!define IsWin2003R2 `${SM_SERVERR2} WinVer_SysMetricCheck ""` +!define IsStarterEdition `${SM_STARTER} WinVer_SysMetricCheck ""` +!define OSHasMediaCenter `${SM_MEDIACENTER} WinVer_SysMetricCheck ""` +!define OSHasTabletSupport `${SM_TABLETPC} WinVer_SysMetricCheck ""` +!define IsSafeBootMode `67 WinVer_SysMetricCheck ""` + +# version retrieval macros + +!macro __WinVer_GetVer var rshift mask outvar + ${CallArtificialFunction} __WinVer_InitVars + !if "${mask}" != "" + IntOp ${outvar} ${var} & ${mask} + !if "${rshift}" != "" + IntOp ${outvar} ${outvar} >> ${rshift} + !endif + !else + IntOp ${outvar} ${var} >> ${rshift} + !endif +!macroend + +!define WinVerGetMajor '!insertmacro __WinVer_GetVer $__WINVERV 24 ${_WINVER_MASKVMAJ}' +!define WinVerGetMinor '!insertmacro __WinVer_GetVer $__WINVERV 16 ${_WINVER_MASKVMIN}' +!ifndef WinVer_v3_7 +!macro __WinVer_GetVerBuild outvar + ${__WinVer_GWV} ${outvar} Build +!macroend +!define WinVerGetBuild '!insertmacro __WinVer_GetVerBuild ' +!else +!define WinVerGetBuild '!insertmacro __WinVer_GetVer $__WINVERSP "" ${_WINVER_MASKVBLD}' +!endif + +!macro _WinVer_BuildNumCheck op num _t _f + !insertmacro _LOGICLIB_TEMP + ${WinVerGetBuild} $_LOGICLIB_TEMP + !insertmacro _${op} $_LOGICLIB_TEMP ${num} `${_t}` `${_f}` +!macroend +!define AtLeastBuild `U>= WinVer_BuildNumCheck ` +!define AtMostBuild `U<= WinVer_BuildNumCheck ` + +# Windows as a Service macros + +!macro WinVer_WaaS id build fu codename marketingname + !if "${id}" == "?" + # Ignore + !else if "${id}" == ${fu} + !define WinVer_WaaS_Build ${build} + !else if "${id}" == "${codename}" + !define WinVer_WaaS_Build ${build} + !else if "${id}" == "${marketingname}" + !define WinVer_WaaS_Build ${build} + !endif +!macroend + +!macro _WinVer_WaaS op id _t _f + !insertmacro WinVer_WaaS "${id}" 10240 1507 "Threshold" "Windows 10" ; 10240.16384 + !insertmacro WinVer_WaaS "${id}" 10586 1511 "Threshold 2" "November Update" ; 10586.0? + !insertmacro WinVer_WaaS "${id}" 14393 1607 "Redstone" "Anniversary Update" ; 14393.10 + !insertmacro WinVer_WaaS "${id}" 15063 1703 "Redstone 2" "Creators Update" ; 15063.13 + !insertmacro WinVer_WaaS "${id}" 16299 1709 "Redstone 3" "Fall Creators Update" ; 16299.19 + !insertmacro WinVer_WaaS "${id}" 17134 1803 "Redstone 4" "April 2018 Update" ; 17134.1 + !insertmacro WinVer_WaaS "${id}" 17763 1809 "Redstone 5" "October 2018 Update" ; 17763.1 + !insertmacro WinVer_WaaS "${id}" 18362 1903 "19H1" "May 2019 Update" ; 18362.116 + !insertmacro WinVer_WaaS "${id}" 18363 1909 "19H2" "November 2019 Update" ; 18363.418 + !insertmacro WinVer_WaaS "${id}" 19041 2004 "20H1" "May 2020 Update" ; 19041.264? + !insertmacro WinVer_WaaS "${id}" 19042 20H2 "20H2" "October 2020 Update" ; 19042.572? A.K.A. 2009 + !insertmacro WinVer_WaaS "${id}" 19043 21H1 "21H1" "May 2021 Update" ; 19043.928 + !insertmacro WinVer_WaaS "${id}" 19044 21H2 "21H2" "November 2021 Update" ; 19044.1288 + !insertmacro WinVer_WaaS "${id}" 19045 "?" "?" "October 2022 Update" ; 19045.2130 22H2 + !insertmacro WinVer_WaaS "${id}" 22000 "?" "Sun Valley" "Windows 11" ; 10.0.22000.194 21H2 + !insertmacro WinVer_WaaS "${id}" 22621 22H2 "Sun Valley 2" "2022 Update" ; 10.0.22621.521 + !insertmacro WinVer_WaaS "${id}" 22631 23H2 "Sun Valley 3" "2023 Update" + !insertmacro WinVer_WaaS "${id}" 26100 24H2 "Hudson Valley" "2024 Update" + + !ifmacrodef WinVerExternal_WaaS_MapToBuild + !insertmacro WinVerExternal_WaaS_MapToBuild ${op} "${id}" WinVer_WaaS_Build + !endif + !define /IfNDef WinVer_WaaS_Build 0 + !if "${WinVer_WaaS_Build}" <= 9600 + !error 'WinVer: Unknown WaaS name: ${id}' + !endif + !insertmacro _WinVer_BuildNumCheck ${op} ${WinVer_WaaS_Build} `${_t}` `${_f}` + !undef WinVer_WaaS_Build +!macroend + +!define AtLeastWaaS `U>= WinVer_WaaS ` +!define AtMostWaaS `U<= WinVer_WaaS ` + +!endif # !___WINVER__NSH___ + +!verbose pop diff --git a/libs/NSIS/NSIS-source/Include/WordFunc.nsh b/libs/NSIS/NSIS-source/Include/WordFunc.nsh new file mode 100644 index 0000000000..0cb645a0d8 --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/WordFunc.nsh @@ -0,0 +1,1800 @@ +/* +_____________________________________________________________________________ + + Word Functions Header v3.3 +_____________________________________________________________________________ + + 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) + + See documentation for more information about the following functions. + + Usage in script: + 1. !include "WordFunc.nsh" + 2. [Section|Function] + ${WordFunction} "Param1" "Param2" "..." $var + [SectionEnd|FunctionEnd] + + + WordFunction=[WordFind|WordFindS|WordFind2X|WordFind2XS|WordFind3X|WordFind3XS| + WordReplace|WordReplaceS|WordAdd|WordAddS|WordInsert|WordInsertS| + StrFilter|StrFilterS|VersionCompare|VersionConvert] + +_____________________________________________________________________________ + + Thanks to: +_____________________________________________________________________________ + +WordFind3X + Afrow UK (Based on his idea of Function "StrSortLR") +StrFilter + sunjammer (Function "StrUpper") +VersionCompare + Afrow UK (Based on his Function "VersionCheckNew2") +VersionConvert + Afrow UK (Based on his idea of Function "CharIndexReplace") +*/ + + +;_____________________________________________________________________________ +; +; Macros +;_____________________________________________________________________________ +; +; Change log window verbosity (default: 3=no script) +; +; Example: +; !include "WordFunc.nsh" +; !insertmacro WordFind +; ${WORDFUNC_VERBOSE} 4 # all verbosity +; !insertmacro WordReplace +; ${WORDFUNC_VERBOSE} 3 # no script + +!ifndef WORDFUNC_INCLUDED + +!verbose push 3 +!define /IfNDef _WORDFUNC_VERBOSE 3 +!verbose ${_WORDFUNC_VERBOSE} +!define WORDFUNC_VERBOSE `!insertmacro WORDFUNC_VERBOSE` + +!define WORDFUNC_INCLUDED + +!include Util.nsh + + +!macro WORDFUNC_VERBOSE _VERBOSE + !verbose push 3 + !define /ReDef _WORDFUNC_VERBOSE ${_VERBOSE} + !verbose pop +!macroend + + +!macro WordFindCall _ART _STRING _DELIMITER _OPTION _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER}` + Push `${_OPTION}` + ${CallArtificialFunction}${_ART} WordFind_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFindSCall _ART _STRING _DELIMITER _OPTION _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER}` + Push `${_OPTION}` + ${CallArtificialFunction}${_ART} WordFindS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFind2XCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER1}` + Push `${_DELIMITER2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordFind2X_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFind2XSCall _STRING _DELIMITER1 _DELIMITER2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER1}` + Push `${_DELIMITER2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordFind2XS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFind3XCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER1}` + Push `${_CENTER}` + Push `${_DELIMITER2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordFind3X_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFind3XSCall _STRING _DELIMITER1 _CENTER _DELIMITER2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER1}` + Push `${_CENTER}` + Push `${_DELIMITER2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordFind3XS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordReplaceCall _STRING _WORD1 _WORD2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_WORD1}` + Push `${_WORD2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordReplace_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordReplaceSCall _STRING _WORD1 _WORD2 _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_WORD1}` + Push `${_WORD2}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordReplaceS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordAddCall _STRING1 _DELIMITER _STRING2 _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING1}` + Push `${_DELIMITER}` + Push `${_STRING2}` + ${CallArtificialFunction} WordAdd_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordAddSCall _STRING1 _DELIMITER _STRING2 _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING1}` + Push `${_DELIMITER}` + Push `${_STRING2}` + ${CallArtificialFunction} WordAddS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordInsertCall _STRING _DELIMITER _WORD _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER}` + Push `${_WORD}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordInsert_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordInsertSCall _STRING _DELIMITER _WORD _NUMBER _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_DELIMITER}` + Push `${_WORD}` + Push `${_NUMBER}` + ${CallArtificialFunction} WordInsertS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro StrFilterCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_FILTER}` + Push `${_INCLUDE}` + Push `${_EXCLUDE}` + ${CallArtificialFunction} StrFilter_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro StrFilterSCall _STRING _FILTER _INCLUDE _EXCLUDE _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_STRING}` + Push `${_FILTER}` + Push `${_INCLUDE}` + Push `${_EXCLUDE}` + ${CallArtificialFunction} StrFilterS_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro VersionCompareCall _VER1 _VER2 _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_VER1}` + Push `${_VER2}` + ${CallArtificialFunction} VersionCompare_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro VersionConvertCall _VERSION _CHARLIST _RESULT + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + Push `${_VERSION}` + Push `${_CHARLIST}` + ${CallArtificialFunction} VersionConvert_ + Pop ${_RESULT} + !verbose pop +!macroend + +!macro WordFindBody _WORDFUNC_S + Exch $1 + Exch + Exch $0 + Exch + Exch 2 + Exch $R0 + Exch 2 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R1 + Push $R2 + ClearErrors + + StrCpy $9 '' + StrCpy $2 $1 1 + StrCpy $1 $1 '' 1 + StrCmp $2 'E' 0 +3 + StrCpy $9 E + goto -4 + + StrCpy $3 '' + StrCmp${_WORDFUNC_S} $2 '+' +6 + StrCmp${_WORDFUNC_S} $2 '-' +5 + StrCmp${_WORDFUNC_S} $2 '/' WordFunc_WordFind${_WORDFUNC_S}_restart + StrCmp${_WORDFUNC_S} $2 '#' WordFunc_WordFind${_WORDFUNC_S}_restart + StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_restart + goto WordFunc_WordFind${_WORDFUNC_S}_error3 + + StrCpy $4 $1 1 -1 + StrCmp${_WORDFUNC_S} $4 '*' +4 + StrCmp${_WORDFUNC_S} $4 '}' +3 + StrCmp${_WORDFUNC_S} $4 '{' +2 + goto +4 + StrCpy $1 $1 -1 + StrCpy $3 '$4$3' + goto -7 + StrCmp${_WORDFUNC_S} $3 '*' WordFunc_WordFind${_WORDFUNC_S}_error3 + StrCmp${_WORDFUNC_S} $3 '**' WordFunc_WordFind${_WORDFUNC_S}_error3 + StrCmp${_WORDFUNC_S} $3 '}{' WordFunc_WordFind${_WORDFUNC_S}_error3 + IntOp $1 $1 + 0 + StrCmp${_WORDFUNC_S} $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 + + WordFunc_WordFind${_WORDFUNC_S}_restart: + StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind${_WORDFUNC_S}_error1 + StrCpy $4 0 + StrCpy $5 0 + StrCpy $6 0 + StrLen $7 $0 + goto WordFunc_WordFind${_WORDFUNC_S}_loop + + WordFunc_WordFind${_WORDFUNC_S}_preloop: + IntOp $6 $6 + 1 + + WordFunc_WordFind${_WORDFUNC_S}_loop: + StrCpy $8 $R0 $7 $6 + StrCmp${_WORDFUNC_S} $8$5 0 WordFunc_WordFind${_WORDFUNC_S}_error1 + StrLen $R2 $8 + IntCmp $R2 0 +2 + StrCmp${_WORDFUNC_S} $8 $0 +5 WordFunc_WordFind${_WORDFUNC_S}_preloop + StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordFind${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordFind${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $2 '*' WordFunc_WordFind${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_minus +5 + StrCmp${_WORDFUNC_S} $3 '{' +4 + StrCmp${_WORDFUNC_S} $3 '}' +3 + StrCmp${_WORDFUNC_S} $2 '*' +2 + StrCmp${_WORDFUNC_S} $5 $6 WordFunc_WordFind${_WORDFUNC_S}_nextword + IntOp $4 $4 + 1 + StrCmp${_WORDFUNC_S} $2$4 +$1 WordFunc_WordFind${_WORDFUNC_S}_plus + StrCmp${_WORDFUNC_S} $2 '/' 0 WordFunc_WordFind${_WORDFUNC_S}_nextword + IntOp $8 $6 - $5 + StrCpy $8 $R0 $8 $5 + StrCmp${_WORDFUNC_S} $1 $8 0 WordFunc_WordFind${_WORDFUNC_S}_nextword + StrCpy $R1 $4 + goto WordFunc_WordFind${_WORDFUNC_S}_end + WordFunc_WordFind${_WORDFUNC_S}_nextword: + IntOp $6 $6 + $7 + StrCpy $5 $6 + goto WordFunc_WordFind${_WORDFUNC_S}_loop + + WordFunc_WordFind${_WORDFUNC_S}_minus: + StrCmp${_WORDFUNC_S} $2 '-' 0 WordFunc_WordFind${_WORDFUNC_S}_sum + StrCpy $2 '+' + IntOp $1 $4 - $1 + IntOp $1 $1 + 1 + IntCmp $1 0 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_error2 WordFunc_WordFind${_WORDFUNC_S}_restart + WordFunc_WordFind${_WORDFUNC_S}_sum: + StrCmp${_WORDFUNC_S} $2 '#' 0 WordFunc_WordFind${_WORDFUNC_S}_sumdelim + StrCpy $R1 $4 + goto WordFunc_WordFind${_WORDFUNC_S}_end + WordFunc_WordFind${_WORDFUNC_S}_sumdelim: + StrCmp${_WORDFUNC_S} $2 '*' 0 WordFunc_WordFind${_WORDFUNC_S}_error2 + StrCpy $R1 $4 + goto WordFunc_WordFind${_WORDFUNC_S}_end + + WordFunc_WordFind${_WORDFUNC_S}_plus: + StrCmp${_WORDFUNC_S} $3 '' 0 +4 + IntOp $6 $6 - $5 + StrCpy $R1 $R0 $6 $5 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '{' 0 +3 + StrCpy $R1 $R0 $6 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '}' 0 +4 + IntOp $6 $6 + $7 + StrCpy $R1 $R0 '' $6 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '{*' +2 + StrCmp${_WORDFUNC_S} $3 '*{' 0 +3 + StrCpy $R1 $R0 $6 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '*}' +2 + StrCmp${_WORDFUNC_S} $3 '}*' 0 +3 + StrCpy $R1 $R0 '' $5 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '}}' 0 +3 + StrCpy $R1 $R0 '' $6 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '{{' 0 +3 + StrCpy $R1 $R0 $5 + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $3 '{}' 0 WordFunc_WordFind${_WORDFUNC_S}_error3 + StrLen $3 $R0 + StrCmp${_WORDFUNC_S} $3 $6 0 +3 + StrCpy $0 '' + goto +2 + IntOp $6 $6 + $7 + StrCpy $8 $R0 '' $6 + StrCmp${_WORDFUNC_S} $4$8 1 +6 + StrCmp${_WORDFUNC_S} $4 1 +2 +7 + IntOp $6 $6 + $7 + StrCpy $3 $R0 $7 $6 + StrCmp${_WORDFUNC_S} $3 '' +2 + StrCmp${_WORDFUNC_S} $3 $0 -3 +3 + StrCpy $R1 '' + goto WordFunc_WordFind${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $5 0 0 +3 + StrCpy $0 '' + goto +2 + IntOp $5 $5 - $7 + StrCpy $3 $R0 $5 + StrCpy $R1 '$3$0$8' + goto WordFunc_WordFind${_WORDFUNC_S}_end + + WordFunc_WordFind${_WORDFUNC_S}_error3: + StrCpy $R1 3 + goto WordFunc_WordFind${_WORDFUNC_S}_error + WordFunc_WordFind${_WORDFUNC_S}_error2: + StrCpy $R1 2 + goto WordFunc_WordFind${_WORDFUNC_S}_error + WordFunc_WordFind${_WORDFUNC_S}_error1: + StrCpy $R1 1 + WordFunc_WordFind${_WORDFUNC_S}_error: + StrCmp $9 'E' 0 +3 + SetErrors + + WordFunc_WordFind${_WORDFUNC_S}_end: + StrCpy $R0 $R1 + + Pop $R2 + Pop $R1 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordFind `!insertmacro WordFindCall ''` +!define un.WordFind `!insertmacro WordFindCall ''` + +!macro WordFind +!macroend + +!macro un.WordFind +!macroend + +!macro WordFind_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFindBody '' + + !verbose pop +!macroend + +!define WordFindS `!insertmacro WordFindSCall ''` +!define un.WordFindS `!insertmacro WordFindSCall ''` + +!macro WordFindS +!macroend + +!macro un.WordFindS +!macroend + +!macro WordFindS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFindBody 'S' + + !verbose pop +!macroend + +!macro WordFind2XBody _WORDFUNC_S + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Exch 3 + Exch $R0 + Exch 3 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R1 + Push $R2 + ClearErrors + + StrCpy $R2 '' + StrCpy $3 $2 1 + StrCpy $2 $2 '' 1 + StrCmp $3 'E' 0 +3 + StrCpy $R2 E + goto -4 + + StrCmp${_WORDFUNC_S} $3 '+' +5 + StrCmp${_WORDFUNC_S} $3 '-' +4 + StrCmp${_WORDFUNC_S} $3 '#' WordFunc_WordFind2X${_WORDFUNC_S}_restart + StrCmp${_WORDFUNC_S} $3 '/' WordFunc_WordFind2X${_WORDFUNC_S}_restart + goto WordFunc_WordFind2X${_WORDFUNC_S}_error3 + + StrCpy $4 $2 2 -2 + StrCmp${_WORDFUNC_S} $4 '{{' +9 + StrCmp${_WORDFUNC_S} $4 '}}' +8 + StrCmp${_WORDFUNC_S} $4 '{*' +7 + StrCmp${_WORDFUNC_S} $4 '*{' +6 + StrCmp${_WORDFUNC_S} $4 '*}' +5 + StrCmp${_WORDFUNC_S} $4 '}*' +4 + StrCmp${_WORDFUNC_S} $4 '{}' +3 + StrCpy $4 '' + goto +2 + StrCpy $2 $2 -2 + IntOp $2 $2 + 0 + StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 + + WordFunc_WordFind2X${_WORDFUNC_S}_restart: + StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind2X${_WORDFUNC_S}_error1 + StrCpy $5 -1 + StrCpy $6 0 + StrCpy $7 '' + StrLen $8 $0 + StrLen $9 $1 + + WordFunc_WordFind2X${_WORDFUNC_S}_loop: + IntOp $5 $5 + 1 + + WordFunc_WordFind2X${_WORDFUNC_S}_delim1: + StrCpy $R1 $R0 $8 $5 + StrCmp${_WORDFUNC_S} $R1$6 0 WordFunc_WordFind2X${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $R1 '' WordFunc_WordFind2X${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $R1 $0 +2 + StrCmp${_WORDFUNC_S} $7 '' WordFunc_WordFind2X${_WORDFUNC_S}_loop WordFunc_WordFind2X${_WORDFUNC_S}_delim2 + StrCmp${_WORDFUNC_S} $0 $1 0 +2 + StrCmp${_WORDFUNC_S} $7 '' 0 WordFunc_WordFind2X${_WORDFUNC_S}_delim2 + IntOp $7 $5 + $8 + StrCpy $5 $7 + goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1 + + WordFunc_WordFind2X${_WORDFUNC_S}_delim2: + StrCpy $R1 $R0 $9 $5 + StrCmp${_WORDFUNC_S} $R1 $1 0 WordFunc_WordFind2X${_WORDFUNC_S}_loop + IntOp $6 $6 + 1 + StrCmp${_WORDFUNC_S} $3$6 '+$2' WordFunc_WordFind2X${_WORDFUNC_S}_plus + StrCmp${_WORDFUNC_S} $3 '/' 0 WordFunc_WordFind2X${_WORDFUNC_S}_nextword + IntOp $R1 $5 - $7 + StrCpy $R1 $R0 $R1 $7 + StrCmp${_WORDFUNC_S} $R1 $2 0 +3 + StrCpy $R1 $6 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + WordFunc_WordFind2X${_WORDFUNC_S}_nextword: + IntOp $5 $5 + $9 + StrCpy $7 '' + goto WordFunc_WordFind2X${_WORDFUNC_S}_delim1 + + WordFunc_WordFind2X${_WORDFUNC_S}_minus: + StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordFind2X${_WORDFUNC_S}_sum + StrCpy $3 + + IntOp $2 $6 - $2 + IntOp $2 $2 + 1 + IntCmp $2 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_error2 WordFunc_WordFind2X${_WORDFUNC_S}_restart + WordFunc_WordFind2X${_WORDFUNC_S}_sum: + StrCmp${_WORDFUNC_S} $3 '#' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error2 + StrCpy $R1 $6 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + + WordFunc_WordFind2X${_WORDFUNC_S}_plus: + StrCmp${_WORDFUNC_S} $4 '' 0 +4 + IntOp $R1 $5 - $7 + StrCpy $R1 $R0 $R1 $7 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + IntOp $5 $5 + $9 + IntOp $7 $7 - $8 + StrCmp${_WORDFUNC_S} $4 '{*' +2 + StrCmp${_WORDFUNC_S} $4 '*{' 0 +3 + StrCpy $R1 $R0 $5 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $4 '*}' +2 + StrCmp${_WORDFUNC_S} $4 '}*' 0 +3 + StrCpy $R1 $R0 '' $7 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $4 '}}' 0 +3 + StrCpy $R1 $R0 '' $5 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $4 '{{' 0 +3 + StrCpy $R1 $R0 $7 + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $4 '{}' 0 WordFunc_WordFind2X${_WORDFUNC_S}_error3 + StrCpy $5 $R0 '' $5 + StrCpy $7 $R0 $7 + StrCpy $R1 '$7$5' + goto WordFunc_WordFind2X${_WORDFUNC_S}_end + + WordFunc_WordFind2X${_WORDFUNC_S}_error3: + StrCpy $R1 3 + goto WordFunc_WordFind2X${_WORDFUNC_S}_error + WordFunc_WordFind2X${_WORDFUNC_S}_error2: + StrCpy $R1 2 + goto WordFunc_WordFind2X${_WORDFUNC_S}_error + WordFunc_WordFind2X${_WORDFUNC_S}_error1: + StrCpy $R1 1 + WordFunc_WordFind2X${_WORDFUNC_S}_error: + StrCmp $R2 'E' 0 +3 + SetErrors + + WordFunc_WordFind2X${_WORDFUNC_S}_end: + StrCpy $R0 $R1 + + Pop $R2 + Pop $R1 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordFind2X `!insertmacro WordFind2XCall` +!define un.WordFind2X `!insertmacro WordFind2XCall` + +!macro WordFind2X +!macroend + +!macro un.WordFind2X +!macroend + +!macro WordFind2X_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFind2XBody '' + + !verbose pop +!macroend + +!define WordFind2XS `!insertmacro WordFind2XSCall` +!define un.WordFind2XS `!insertmacro WordFind2XSCall` + +!macro WordFind2XS +!macroend + +!macro un.WordFind2XS +!macroend + +!macro WordFind2XS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFind2XBody 'S' + + !verbose pop +!macroend + +!macro WordFind3XBody _WORDFUNC_S + Exch $3 + Exch + Exch $2 + Exch + Exch 2 + Exch $1 + Exch 2 + Exch 3 + Exch $0 + Exch 3 + Exch 4 + Exch $R0 + Exch 4 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + ClearErrors + + StrCpy $R5 '' + StrCpy $4 $3 1 + StrCpy $3 $3 '' 1 + StrCmp $4 'E' 0 +3 + StrCpy $R5 E + goto -4 + + StrCmp${_WORDFUNC_S} $4 '+' +5 + StrCmp${_WORDFUNC_S} $4 '-' +4 + StrCmp${_WORDFUNC_S} $4 '#' WordFunc_WordFind3X${_WORDFUNC_S}_restart + StrCmp${_WORDFUNC_S} $4 '/' WordFunc_WordFind3X${_WORDFUNC_S}_restart + goto WordFunc_WordFind3X${_WORDFUNC_S}_error3 + + StrCpy $5 $3 2 -2 + StrCmp${_WORDFUNC_S} $5 '{{' +9 + StrCmp${_WORDFUNC_S} $5 '}}' +8 + StrCmp${_WORDFUNC_S} $5 '{*' +7 + StrCmp${_WORDFUNC_S} $5 '*{' +6 + StrCmp${_WORDFUNC_S} $5 '*}' +5 + StrCmp${_WORDFUNC_S} $5 '}*' +4 + StrCmp${_WORDFUNC_S} $5 '{}' +3 + StrCpy $5 '' + goto +2 + StrCpy $3 $3 -2 + IntOp $3 $3 + 0 + StrCmp${_WORDFUNC_S} $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 + + WordFunc_WordFind3X${_WORDFUNC_S}_restart: + StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordFind3X${_WORDFUNC_S}_error1 + StrCpy $6 -1 + StrCpy $7 0 + StrCpy $8 '' + StrCpy $9 '' + StrLen $R1 $0 + StrLen $R2 $1 + StrLen $R3 $2 + + WordFunc_WordFind3X${_WORDFUNC_S}_loop: + IntOp $6 $6 + 1 + + WordFunc_WordFind3X${_WORDFUNC_S}_delim1: + StrCpy $R4 $R0 $R1 $6 + StrCmp${_WORDFUNC_S} $R4$7 0 WordFunc_WordFind3X${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $R4 '' WordFunc_WordFind3X${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $R4 $0 +2 + StrCmp${_WORDFUNC_S} $8 '' WordFunc_WordFind3X${_WORDFUNC_S}_loop WordFunc_WordFind3X${_WORDFUNC_S}_center + StrCmp${_WORDFUNC_S} $0 $1 +2 + StrCmp${_WORDFUNC_S} $0 $2 0 +2 + StrCmp${_WORDFUNC_S} $8 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_center + IntOp $8 $6 + $R1 + StrCpy $6 $8 + goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 + + WordFunc_WordFind3X${_WORDFUNC_S}_center: + StrCmp${_WORDFUNC_S} $9 '' 0 WordFunc_WordFind3X${_WORDFUNC_S}_delim2 + StrCpy $R4 $R0 $R2 $6 + StrCmp${_WORDFUNC_S} $R4 $1 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop + IntOp $9 $6 + $R2 + StrCpy $6 $9 + goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 + + WordFunc_WordFind3X${_WORDFUNC_S}_delim2: + StrCpy $R4 $R0 $R3 $6 + StrCmp${_WORDFUNC_S} $R4 $2 0 WordFunc_WordFind3X${_WORDFUNC_S}_loop + IntOp $7 $7 + 1 + StrCmp${_WORDFUNC_S} $4$7 '+$3' WordFunc_WordFind3X${_WORDFUNC_S}_plus + StrCmp${_WORDFUNC_S} $4 '/' 0 WordFunc_WordFind3X${_WORDFUNC_S}_nextword + IntOp $R4 $6 - $8 + StrCpy $R4 $R0 $R4 $8 + StrCmp${_WORDFUNC_S} $R4 $3 0 +3 + StrCpy $R4 $7 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + WordFunc_WordFind3X${_WORDFUNC_S}_nextword: + IntOp $6 $6 + $R3 + StrCpy $8 '' + StrCpy $9 '' + goto WordFunc_WordFind3X${_WORDFUNC_S}_delim1 + + WordFunc_WordFind3X${_WORDFUNC_S}_minus: + StrCmp${_WORDFUNC_S} $4 '-' 0 WordFunc_WordFind3X${_WORDFUNC_S}_sum + StrCpy $4 + + IntOp $3 $7 - $3 + IntOp $3 $3 + 1 + IntCmp $3 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_error2 WordFunc_WordFind3X${_WORDFUNC_S}_restart + WordFunc_WordFind3X${_WORDFUNC_S}_sum: + StrCmp${_WORDFUNC_S} $4 '#' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error2 + StrCpy $R4 $7 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + + WordFunc_WordFind3X${_WORDFUNC_S}_plus: + StrCmp${_WORDFUNC_S} $5 '' 0 +4 + IntOp $R4 $6 - $8 + StrCpy $R4 $R0 $R4 $8 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + IntOp $6 $6 + $R3 + IntOp $8 $8 - $R1 + StrCmp${_WORDFUNC_S} $5 '{*' +2 + StrCmp${_WORDFUNC_S} $5 '*{' 0 +3 + StrCpy $R4 $R0 $6 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $5 '*}' +2 + StrCmp${_WORDFUNC_S} $5 '}*' 0 +3 + StrCpy $R4 $R0 '' $8 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $5 '}}' 0 +3 + StrCpy $R4 $R0 '' $6 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $5 '{{' 0 +3 + StrCpy $R4 $R0 $8 + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $5 '{}' 0 WordFunc_WordFind3X${_WORDFUNC_S}_error3 + StrCpy $6 $R0 '' $6 + StrCpy $8 $R0 $8 + StrCpy $R4 '$8$6' + goto WordFunc_WordFind3X${_WORDFUNC_S}_end + + WordFunc_WordFind3X${_WORDFUNC_S}_error3: + StrCpy $R4 3 + goto WordFunc_WordFind3X${_WORDFUNC_S}_error + WordFunc_WordFind3X${_WORDFUNC_S}_error2: + StrCpy $R4 2 + goto WordFunc_WordFind3X${_WORDFUNC_S}_error + WordFunc_WordFind3X${_WORDFUNC_S}_error1: + StrCpy $R4 1 + WordFunc_WordFind3X${_WORDFUNC_S}_error: + StrCmp $R5 'E' 0 +3 + SetErrors + + WordFunc_WordFind3X${_WORDFUNC_S}_end: + StrCpy $R0 $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordFind3X `!insertmacro WordFind3XCall` +!define un.WordFind3X `!insertmacro WordFind3XCall` + +!macro WordFind3X +!macroend + +!macro un.WordFind3X +!macroend + +!macro WordFind3X_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFind3XBody '' + + !verbose pop +!macroend + +!define WordFind3XS `!insertmacro WordFind3XSCall` +!define un.WordFind3XS `!insertmacro WordFind3XSCall` + +!macro WordFind3XS +!macroend + +!macro un.WordFind3XS +!macroend + +!macro WordFind3XS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordFind3XBody 'S' + + !verbose pop +!macroend + +!macro WordReplaceBody _WORDFUNC_S + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Exch 3 + Exch $R0 + Exch 3 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R1 + ClearErrors + + StrCpy $R1 $R0 + StrCpy $9 '' + StrCpy $3 $2 1 + StrCpy $2 $2 '' 1 + StrCmp $3 'E' 0 +3 + StrCpy $9 E + goto -4 + + StrCpy $4 $2 1 -1 + StrCpy $5 '' + StrCpy $6 '' + StrLen $7 $0 + + StrCmp${_WORDFUNC_S} $7 0 WordFunc_WordReplace${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $R0 '' WordFunc_WordReplace${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $3 '{' WordFunc_WordReplace${_WORDFUNC_S}_beginning + StrCmp${_WORDFUNC_S} $3 '}' WordFunc_WordReplace${_WORDFUNC_S}_ending WordFunc_WordReplace${_WORDFUNC_S}_errorchk + + WordFunc_WordReplace${_WORDFUNC_S}_beginning: + StrCpy $8 $R0 $7 + StrCmp${_WORDFUNC_S} $8 $0 0 +4 + StrCpy $R0 $R0 '' $7 + StrCpy $5 '$5$1' + goto -4 + StrCpy $3 $2 1 + StrCmp${_WORDFUNC_S} $3 '}' 0 WordFunc_WordReplace${_WORDFUNC_S}_merge + + WordFunc_WordReplace${_WORDFUNC_S}_ending: + StrCpy $8 $R0 '' -$7 + StrCmp${_WORDFUNC_S} $8 $0 0 +4 + StrCpy $R0 $R0 -$7 + StrCpy $6 '$6$1' + goto -4 + + WordFunc_WordReplace${_WORDFUNC_S}_merge: + StrCmp${_WORDFUNC_S} $4 '*' 0 +5 + StrCmp${_WORDFUNC_S} $5 '' +2 + StrCpy $5 $1 + StrCmp${_WORDFUNC_S} $6 '' +2 + StrCpy $6 $1 + StrCpy $R0 '$5$R0$6' + goto WordFunc_WordReplace${_WORDFUNC_S}_end + + WordFunc_WordReplace${_WORDFUNC_S}_errorchk: + StrCmp${_WORDFUNC_S} $3 '+' +2 + StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error3 + + StrCpy $5 $2 1 + IntOp $2 $2 + 0 + StrCmp${_WORDFUNC_S} $2 0 0 WordFunc_WordReplace${_WORDFUNC_S}_one + StrCmp${_WORDFUNC_S} $5 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 + StrCpy $3 '' + + WordFunc_WordReplace${_WORDFUNC_S}_all: + StrCpy $5 0 + StrCpy $2 $R0 $7 $5 + StrCmp${_WORDFUNC_S} $2 '' +4 + StrCmp${_WORDFUNC_S} $2 $0 +6 + IntOp $5 $5 + 1 + goto -4 + StrCmp${_WORDFUNC_S} $R0 $R1 WordFunc_WordReplace${_WORDFUNC_S}_error1 + StrCpy $R0 '$3$R0' + goto WordFunc_WordReplace${_WORDFUNC_S}_end + StrCpy $2 $R0 $5 + IntOp $5 $5 + $7 + StrCmp${_WORDFUNC_S} $4 '*' 0 +3 + StrCpy $6 $R0 $7 $5 + StrCmp${_WORDFUNC_S} $6 $0 -3 + StrCpy $R0 $R0 '' $5 + StrCpy $3 '$3$2$1' + goto WordFunc_WordReplace${_WORDFUNC_S}_all + + WordFunc_WordReplace${_WORDFUNC_S}_one: + StrCpy $5 0 + StrCpy $8 0 + goto WordFunc_WordReplace${_WORDFUNC_S}_loop + + WordFunc_WordReplace${_WORDFUNC_S}_preloop: + IntOp $5 $5 + 1 + + WordFunc_WordReplace${_WORDFUNC_S}_loop: + StrCpy $6 $R0 $7 $5 + StrCmp${_WORDFUNC_S} $6$8 0 WordFunc_WordReplace${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $6 '' WordFunc_WordReplace${_WORDFUNC_S}_minus + StrCmp${_WORDFUNC_S} $6 $0 0 WordFunc_WordReplace${_WORDFUNC_S}_preloop + IntOp $8 $8 + 1 + StrCmp${_WORDFUNC_S} $3$8 +$2 WordFunc_WordReplace${_WORDFUNC_S}_found + IntOp $5 $5 + $7 + goto WordFunc_WordReplace${_WORDFUNC_S}_loop + + WordFunc_WordReplace${_WORDFUNC_S}_minus: + StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 + StrCpy $3 + + IntOp $2 $8 - $2 + IntOp $2 $2 + 1 + IntCmp $2 0 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_error2 WordFunc_WordReplace${_WORDFUNC_S}_one + + WordFunc_WordReplace${_WORDFUNC_S}_found: + StrCpy $3 $R0 $5 + StrCmp${_WORDFUNC_S} $4 '*' 0 +5 + StrCpy $6 $3 '' -$7 + StrCmp${_WORDFUNC_S} $6 $0 0 +3 + StrCpy $3 $3 -$7 + goto -3 + IntOp $5 $5 + $7 + StrCmp${_WORDFUNC_S} $4 '*' 0 +3 + StrCpy $6 $R0 $7 $5 + StrCmp${_WORDFUNC_S} $6 $0 -3 + StrCpy $R0 $R0 '' $5 + StrCpy $R0 '$3$1$R0' + goto WordFunc_WordReplace${_WORDFUNC_S}_end + + WordFunc_WordReplace${_WORDFUNC_S}_error3: + StrCpy $R0 3 + goto WordFunc_WordReplace${_WORDFUNC_S}_error + WordFunc_WordReplace${_WORDFUNC_S}_error2: + StrCpy $R0 2 + goto WordFunc_WordReplace${_WORDFUNC_S}_error + WordFunc_WordReplace${_WORDFUNC_S}_error1: + StrCpy $R0 1 + WordFunc_WordReplace${_WORDFUNC_S}_error: + StrCmp $9 'E' +3 + StrCpy $R0 $R1 + goto +2 + SetErrors + + WordFunc_WordReplace${_WORDFUNC_S}_end: + Pop $R1 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordReplace `!insertmacro WordReplaceCall` +!define un.WordReplace `!insertmacro WordReplaceCall` + +!macro WordReplace +!macroend + +!macro un.WordReplace +!macroend + +!macro WordReplace_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordReplaceBody '' + + !verbose pop +!macroend + +!define WordReplaceS `!insertmacro WordReplaceSCall` +!define un.WordReplaceS `!insertmacro WordReplaceSCall` + +!macro WordReplaceS +!macroend + +!macro un.WordReplaceS +!macroend + +!macro WordReplaceS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordReplaceBody 'S' + + !verbose pop +!macroend + +!macro WordAddBody _WORDFUNC_S + Exch $1 + Exch + Exch $0 + Exch + Exch 2 + Exch $R0 + Exch 2 + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $R1 + ClearErrors + + StrCpy $7 '' + StrCpy $2 $1 1 + StrCmp $2 'E' 0 +4 + StrCpy $7 E + StrCpy $1 $1 '' 1 + goto -4 + + StrCpy $5 0 + StrCpy $R1 $R0 + StrCpy $2 $1 '' 1 + StrCpy $1 $1 1 + StrCmp${_WORDFUNC_S} $1 '+' +2 + StrCmp${_WORDFUNC_S} $1 '-' 0 WordFunc_WordAdd${_WORDFUNC_S}_error3 + + StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordAdd${_WORDFUNC_S}_error1 + StrCmp${_WORDFUNC_S} $2 '' WordFunc_WordAdd${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $R0 '' 0 +5 + StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $1 '+' 0 +3 + StrCpy $R0 $2 + goto WordFunc_WordAdd${_WORDFUNC_S}_end + + WordFunc_WordAdd${_WORDFUNC_S}_loop: + IntOp $5 $5 + 1 + !insertmacro WordFind${_WORDFUNC_S}Call 2 $2 $0 E+$5 $3 + IfErrors 0 WordFunc_WordAdd${_WORDFUNC_S}_/word + StrCmp${_WORDFUNC_S} $3 2 +4 + StrCmp${_WORDFUNC_S} $3$5 11 0 +3 + StrCpy $3 $2 + goto WordFunc_WordAdd${_WORDFUNC_S}_/word + StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_end WordFunc_WordAdd${_WORDFUNC_S}_preend + + WordFunc_WordAdd${_WORDFUNC_S}_/word: + !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E/$3 $4 + IfErrors +2 + StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_delete WordFunc_WordAdd${_WORDFUNC_S}_loop + StrCmp${_WORDFUNC_S} $1$4 '-1' +2 + StrCmp${_WORDFUNC_S} $1 '-' WordFunc_WordAdd${_WORDFUNC_S}_loop +4 + StrCmp${_WORDFUNC_S} $R0 $3 0 WordFunc_WordAdd${_WORDFUNC_S}_loop + StrCpy $R0 '' + goto WordFunc_WordAdd${_WORDFUNC_S}_end + StrCmp${_WORDFUNC_S} $1$4 '+1' 0 +2 + StrCmp${_WORDFUNC_S} $R0 $3 WordFunc_WordAdd${_WORDFUNC_S}_loop + StrCmp${_WORDFUNC_S} $R0 $R1 +3 + StrCpy $R1 '$R1$0$3' + goto WordFunc_WordAdd${_WORDFUNC_S}_loop + StrLen $6 $0 + StrCpy $6 $R0 '' -$6 + StrCmp${_WORDFUNC_S} $6 $0 0 -4 + StrCpy $R1 '$R1$3' + goto WordFunc_WordAdd${_WORDFUNC_S}_loop + + WordFunc_WordAdd${_WORDFUNC_S}_delete: + !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E+$4{} $R0 + goto WordFunc_WordAdd${_WORDFUNC_S}_/word + + WordFunc_WordAdd${_WORDFUNC_S}_error3: + StrCpy $R1 3 + goto WordFunc_WordAdd${_WORDFUNC_S}_error + WordFunc_WordAdd${_WORDFUNC_S}_error1: + StrCpy $R1 1 + WordFunc_WordAdd${_WORDFUNC_S}_error: + StrCmp $7 'E' 0 WordFunc_WordAdd${_WORDFUNC_S}_end + SetErrors + + WordFunc_WordAdd${_WORDFUNC_S}_preend: + StrCpy $R0 $R1 + + WordFunc_WordAdd${_WORDFUNC_S}_end: + Pop $R1 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordAdd `!insertmacro WordAddCall` +!define un.WordAdd `!insertmacro WordAddCall` + +!macro WordAdd +!macroend + +!macro un.WordAdd +!macroend + +!macro WordAdd_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordAddBody '' + + !verbose pop +!macroend + +!define WordAddS `!insertmacro WordAddSCall` +!define un.WordAddS `!insertmacro WordAddSCall` + +!macro WordAddS +!macroend + +!macro un.WordAddS +!macroend + +!macro WordAddS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordAddBody 'S' + + !verbose pop +!macroend + +!macro WordInsertBody _WORDFUNC_S + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Exch 3 + Exch $R0 + Exch 3 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $8 + Push $9 + Push $R1 + ClearErrors + + StrCpy $5 '' + StrCpy $6 $0 + StrCpy $7 } + + StrCpy $9 '' + StrCpy $R1 $R0 + StrCpy $3 $2 1 + StrCpy $2 $2 '' 1 + StrCmp $3 'E' 0 +3 + StrCpy $9 'E' + goto -4 + + StrCmp${_WORDFUNC_S} $3 '+' +2 + StrCmp${_WORDFUNC_S} $3 '-' 0 WordFunc_WordInsert${_WORDFUNC_S}_error3 + IntOp $2 $2 + 0 + StrCmp${_WORDFUNC_S} $2 0 WordFunc_WordInsert${_WORDFUNC_S}_error2 + StrCmp${_WORDFUNC_S} $0 '' WordFunc_WordInsert${_WORDFUNC_S}_error1 + + StrCmp${_WORDFUNC_S} $2 1 0 WordFunc_WordInsert${_WORDFUNC_S}_two + GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_oneback + StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call + StrCpy $7 { + goto WordFunc_WordInsert${_WORDFUNC_S}_call + WordFunc_WordInsert${_WORDFUNC_S}_oneback: + IfErrors 0 +2 + StrCpy $4 $R0 + StrCmp${_WORDFUNC_S} $3 '+' 0 +3 + StrCpy $R0 '$1$0$4' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + StrCpy $R0 '$4$0$1' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + + WordFunc_WordInsert${_WORDFUNC_S}_two: + IntOp $2 $2 - 1 + GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_twoback + StrCmp${_WORDFUNC_S} $3 '+' 0 WordFunc_WordInsert${_WORDFUNC_S}_call + StrCpy $7 { + goto WordFunc_WordInsert${_WORDFUNC_S}_call + WordFunc_WordInsert${_WORDFUNC_S}_twoback: + IfErrors 0 WordFunc_WordInsert${_WORDFUNC_S}_tree + StrCmp${_WORDFUNC_S} $2$4 11 0 WordFunc_WordInsert${_WORDFUNC_S}_error2 + StrCmp${_WORDFUNC_S} $3 '+' 0 +3 + StrCpy $R0 '$R0$0$1' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + StrCpy $R0 '$1$0$R0' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + + WordFunc_WordInsert${_WORDFUNC_S}_tree: + StrCpy $7 } + StrCpy $5 $4 + IntOp $2 $2 + 1 + GetLabelAddress $8 WordFunc_WordInsert${_WORDFUNC_S}_treeback + StrCmp${_WORDFUNC_S} $3 '+' WordFunc_WordInsert${_WORDFUNC_S}_call + StrCpy $7 { + goto WordFunc_WordInsert${_WORDFUNC_S}_call + WordFunc_WordInsert${_WORDFUNC_S}_treeback: + IfErrors 0 +3 + StrCpy $4 '' + StrCpy $6 '' + StrCmp${_WORDFUNC_S} $3 '+' 0 +3 + StrCpy $R0 '$5$0$1$6$4' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + StrCpy $R0 '$4$6$1$0$5' + goto WordFunc_WordInsert${_WORDFUNC_S}_end + + WordFunc_WordInsert${_WORDFUNC_S}_call: + !insertmacro WordFind${_WORDFUNC_S}Call 2 $R0 $0 E$3$2*$7 $4 + goto $8 + + WordFunc_WordInsert${_WORDFUNC_S}_error3: + StrCpy $R0 3 + goto WordFunc_WordInsert${_WORDFUNC_S}_error + WordFunc_WordInsert${_WORDFUNC_S}_error2: + StrCpy $R0 2 + goto WordFunc_WordInsert${_WORDFUNC_S}_error + WordFunc_WordInsert${_WORDFUNC_S}_error1: + StrCpy $R0 1 + WordFunc_WordInsert${_WORDFUNC_S}_error: + StrCmp $9 'E' +3 + StrCpy $R0 $R1 + goto +2 + SetErrors + + WordFunc_WordInsert${_WORDFUNC_S}_end: + Pop $R1 + Pop $9 + Pop $8 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define WordInsert `!insertmacro WordInsertCall` +!define un.WordInsert `!insertmacro WordInsertCall` + +!macro WordInsert +!macroend + +!macro un.WordInsert +!macroend + +!macro WordInsert_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordInsertBody '' + + !verbose pop +!macroend + + +!define WordInsertS `!insertmacro WordInsertSCall` +!define un.WordInsertS `!insertmacro WordInsertSCall` + +!macro WordInsertS +!macroend + +!macro un.WordInsertS +!macroend + +!macro WordInsertS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro WordInsertBody 'S' + + !verbose pop +!macroend + +!macro StrFilterBody _WORDFUNC_S + Exch $2 + Exch + Exch $1 + Exch + Exch 2 + Exch $0 + Exch 2 + Exch 3 + Exch $R0 + Exch 3 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + Push $R6 + Push $R7 + Push $R8 + ClearErrors + + StrCpy $R2 $0 '' -3 + StrCmp $R2 "eng" WordFunc_StrFilter${_WORDFUNC_S}_eng + StrCmp $R2 "rus" WordFunc_StrFilter${_WORDFUNC_S}_rus + WordFunc_StrFilter${_WORDFUNC_S}_eng: + StrCpy $4 65 + StrCpy $5 90 + StrCpy $6 97 + StrCpy $7 122 + goto WordFunc_StrFilter${_WORDFUNC_S}_langend + WordFunc_StrFilter${_WORDFUNC_S}_rus: + StrCpy $4 192 + StrCpy $5 223 + StrCpy $6 224 + StrCpy $7 255 + goto WordFunc_StrFilter${_WORDFUNC_S}_langend + ;... + + WordFunc_StrFilter${_WORDFUNC_S}_langend: + StrCpy $R7 '' + StrCpy $R8 '' + + StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_begin + + WordFunc_StrFilter${_WORDFUNC_S}_restart1: + StrCpy $2 '' + StrCpy $3 $0 1 + StrCmp${_WORDFUNC_S} $3 '+' +2 + StrCmp${_WORDFUNC_S} $3 '-' 0 +3 + StrCpy $0 $0 '' 1 + goto +2 + StrCpy $3 '' + + IntOp $0 $0 + 0 + StrCmp${_WORDFUNC_S} $0 0 +5 + StrCpy $R7 $0 1 0 + StrCpy $R8 $0 1 1 + StrCpy $R2 $0 1 2 + StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_filter WordFunc_StrFilter${_WORDFUNC_S}_error + + WordFunc_StrFilter${_WORDFUNC_S}_restart2: + StrCmp${_WORDFUNC_S} $3 '' WordFunc_StrFilter${_WORDFUNC_S}_end + StrCpy $R7 '' + StrCpy $R8 '+-' + goto WordFunc_StrFilter${_WORDFUNC_S}_begin + + WordFunc_StrFilter${_WORDFUNC_S}_filter: + StrCmp${_WORDFUNC_S} $R7 '1' +3 + StrCmp${_WORDFUNC_S} $R7 '2' +2 + StrCmp${_WORDFUNC_S} $R7 '3' 0 WordFunc_StrFilter${_WORDFUNC_S}_error + + StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_begin + StrCmp${_WORDFUNC_S} $R7$R8 '23' +2 + StrCmp${_WORDFUNC_S} $R7$R8 '32' 0 +3 + StrCpy $R7 -1 + goto WordFunc_StrFilter${_WORDFUNC_S}_begin + StrCmp${_WORDFUNC_S} $R7$R8 '13' +2 + StrCmp${_WORDFUNC_S} $R7$R8 '31' 0 +3 + StrCpy $R7 -2 + goto WordFunc_StrFilter${_WORDFUNC_S}_begin + StrCmp${_WORDFUNC_S} $R7$R8 '12' +2 + StrCmp${_WORDFUNC_S} $R7$R8 '21' 0 WordFunc_StrFilter${_WORDFUNC_S}_error + StrCpy $R7 -3 + + WordFunc_StrFilter${_WORDFUNC_S}_begin: + StrCpy $R6 0 + StrCpy $R1 '' + + WordFunc_StrFilter${_WORDFUNC_S}_loop: + StrCpy $R2 $R0 1 $R6 + StrCmp${_WORDFUNC_S} $R2 '' WordFunc_StrFilter${_WORDFUNC_S}_restartchk + + StrCmp${_WORDFUNC_S} $2 '' +7 + StrCpy $R4 0 + StrCpy $R5 $2 1 $R4 + StrCmp${_WORDFUNC_S} $R5 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol + StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol + IntOp $R4 $R4 + 1 + goto -4 + + StrCmp${_WORDFUNC_S} $1 '' +7 + StrCpy $R4 0 + StrCpy $R5 $1 1 $R4 + StrCmp${_WORDFUNC_S} $R5 '' +4 + StrCmp${_WORDFUNC_S} $R5 $R2 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol + IntOp $R4 $R4 + 1 + goto -4 + + StrCmp${_WORDFUNC_S} $R7 '1' +2 + StrCmp${_WORDFUNC_S} $R7 '-1' 0 +4 + StrCpy $R4 48 + StrCpy $R5 57 + goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 + StrCmp${_WORDFUNC_S} $R8 '+-' 0 +2 + StrCmp${_WORDFUNC_S} $3 '+' 0 +4 + StrCpy $R4 $4 + StrCpy $R5 $5 + goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 + StrCpy $R4 $6 + StrCpy $R5 $7 + + WordFunc_StrFilter${_WORDFUNC_S}_loop2: + IntFmt $R3 '%c' $R4 + StrCmp $R2 $R3 WordFunc_StrFilter${_WORDFUNC_S}_found + StrCmp $R4 $R5 WordFunc_StrFilter${_WORDFUNC_S}_notfound + IntOp $R4 $R4 + 1 + goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 + + WordFunc_StrFilter${_WORDFUNC_S}_found: + StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_setcase + StrCmp${_WORDFUNC_S} $R7 '3' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol + StrCmp${_WORDFUNC_S} $R7 '-3' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol + StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol + + WordFunc_StrFilter${_WORDFUNC_S}_notfound: + StrCmp${_WORDFUNC_S} $R8 '+-' WordFunc_StrFilter${_WORDFUNC_S}_addsymbol + StrCmp${_WORDFUNC_S} $R7 '3' 0 +2 + StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_addsymbol +3 + StrCmp${_WORDFUNC_S} $R7 '-3' 0 +5 + StrCmp${_WORDFUNC_S} $R5 57 WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol + StrCpy $R4 48 + StrCpy $R5 57 + goto WordFunc_StrFilter${_WORDFUNC_S}_loop2 + StrCmp${_WORDFUNC_S} $R8 '' WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol WordFunc_StrFilter${_WORDFUNC_S}_addsymbol + + WordFunc_StrFilter${_WORDFUNC_S}_setcase: + StrCpy $R2 $R3 + WordFunc_StrFilter${_WORDFUNC_S}_addsymbol: + StrCpy $R1 $R1$R2 + WordFunc_StrFilter${_WORDFUNC_S}_skipsymbol: + IntOp $R6 $R6 + 1 + goto WordFunc_StrFilter${_WORDFUNC_S}_loop + + WordFunc_StrFilter${_WORDFUNC_S}_error: + SetErrors + StrCpy $R0 '' + goto WordFunc_StrFilter${_WORDFUNC_S}_end + + WordFunc_StrFilter${_WORDFUNC_S}_restartchk: + StrCpy $R0 $R1 + StrCmp${_WORDFUNC_S} $2 '' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart1 + StrCmp${_WORDFUNC_S} $R8 '+-' 0 WordFunc_StrFilter${_WORDFUNC_S}_restart2 + + WordFunc_StrFilter${_WORDFUNC_S}_end: + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R0 +!macroend + +!define StrFilter `!insertmacro StrFilterCall` +!define un.StrFilter `!insertmacro StrFilterCall` + +!macro StrFilter +!macroend + +!macro un.StrFilter +!macroend + +!macro StrFilter_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro StrFilterBody '' + + !verbose pop +!macroend + + +!define StrFilterS `!insertmacro StrFilterSCall` +!define un.StrFilterS `!insertmacro StrFilterSCall` + +!macro StrFilterS +!macroend + +!macro un.StrFilterS +!macroend + +!macro StrFilterS_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + !insertmacro StrFilterBody 'S' + + !verbose pop +!macroend + +!define VersionCompare `!insertmacro VersionCompareCall` +!define un.VersionCompare `!insertmacro VersionCompareCall` + +!macro VersionCompare +!macroend + +!macro un.VersionCompare +!macroend + +!macro VersionCompare_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + + WordFunc_VersionCompare_begin: + StrCpy $2 -1 + IntOp $2 $2 + 1 + StrCpy $3 $0 1 $2 + StrCmp $3 '' +2 + StrCmp $3 '.' 0 -3 + StrCpy $4 $0 $2 + IntOp $2 $2 + 1 + StrCpy $0 $0 '' $2 + + StrCpy $2 -1 + IntOp $2 $2 + 1 + StrCpy $3 $1 1 $2 + StrCmp $3 '' +2 + StrCmp $3 '.' 0 -3 + StrCpy $5 $1 $2 + IntOp $2 $2 + 1 + StrCpy $1 $1 '' $2 + + StrCmp $4$5 '' WordFunc_VersionCompare_equal + + StrCpy $6 -1 + IntOp $6 $6 + 1 + StrCpy $3 $4 1 $6 + StrCmp $3 '0' -2 + StrCmp $3 '' 0 +2 + StrCpy $4 0 + + StrCpy $7 -1 + IntOp $7 $7 + 1 + StrCpy $3 $5 1 $7 + StrCmp $3 '0' -2 + StrCmp $3 '' 0 +2 + StrCpy $5 0 + + StrCmp $4 0 0 +2 + StrCmp $5 0 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 + StrCmp $5 0 WordFunc_VersionCompare_newer1 + IntCmp $6 $7 0 WordFunc_VersionCompare_newer1 WordFunc_VersionCompare_newer2 + + StrCpy $4 '1$4' + StrCpy $5 '1$5' + IntCmp $4 $5 WordFunc_VersionCompare_begin WordFunc_VersionCompare_newer2 WordFunc_VersionCompare_newer1 + + WordFunc_VersionCompare_equal: + StrCpy $0 0 + goto WordFunc_VersionCompare_end + WordFunc_VersionCompare_newer1: + StrCpy $0 1 + goto WordFunc_VersionCompare_end + WordFunc_VersionCompare_newer2: + StrCpy $0 2 + + WordFunc_VersionCompare_end: + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!define VersionConvert `!insertmacro VersionConvertCall` +!define un.VersionConvert `!insertmacro VersionConvertCall` + +!macro VersionConvert +!macroend + +!macro un.VersionConvert +!macroend + +!macro VersionConvert_ + !verbose push + !verbose ${_WORDFUNC_VERBOSE} + + Exch $1 + Exch + Exch $0 + Exch + Push $2 + Push $3 + Push $4 + Push $5 + Push $6 + Push $7 + + StrCmp $1 '' 0 +2 + StrCpy $1 'abcdefghijklmnopqrstuvwxyz' + StrCpy $1 $1 99 + + StrCpy $2 0 + StrCpy $7 'dot' + goto WordFunc_VersionConvert_loop + + WordFunc_VersionConvert_preloop: + IntOp $2 $2 + 1 + + WordFunc_VersionConvert_loop: + StrCpy $3 $0 1 $2 + StrCmp $3 '' WordFunc_VersionConvert_endcheck + StrCmp $3 '.' WordFunc_VersionConvert_dot + StrCmp $3 '0' WordFunc_VersionConvert_digit + IntCmp $3 '0' WordFunc_VersionConvert_letter WordFunc_VersionConvert_letter WordFunc_VersionConvert_digit + + WordFunc_VersionConvert_dot: + StrCmp $7 'dot' WordFunc_VersionConvert_replacespecial + StrCpy $7 'dot' + goto WordFunc_VersionConvert_preloop + + WordFunc_VersionConvert_digit: + StrCmp $7 'letter' WordFunc_VersionConvert_insertdot + StrCpy $7 'digit' + goto WordFunc_VersionConvert_preloop + + WordFunc_VersionConvert_letter: + StrCpy $5 0 + StrCpy $4 $1 1 $5 + IntOp $5 $5 + 1 + StrCmp $4 '' WordFunc_VersionConvert_replacespecial + StrCmp $4 $3 0 -3 + IntCmp $5 9 0 0 +2 + StrCpy $5 '0$5' + + StrCmp $7 'letter' +2 + StrCmp $7 'dot' 0 +3 + StrCpy $6 '' + goto +2 + StrCpy $6 '.' + + StrCpy $4 $0 $2 + IntOp $2 $2 + 1 + StrCpy $0 $0 '' $2 + StrCpy $0 '$4$6$5$0' + StrLen $4 '$6$5' + IntOp $2 $2 + $4 + IntOp $2 $2 - 1 + StrCpy $7 'letter' + goto WordFunc_VersionConvert_loop + + WordFunc_VersionConvert_replacespecial: + StrCmp $7 'dot' 0 +3 + StrCpy $6 '' + goto +2 + StrCpy $6 '.' + + StrCpy $4 $0 $2 + IntOp $2 $2 + 1 + StrCpy $0 $0 '' $2 + StrCpy $0 '$4$6$0' + StrLen $4 $6 + IntOp $2 $2 + $4 + IntOp $2 $2 - 1 + StrCpy $7 'dot' + goto WordFunc_VersionConvert_loop + + WordFunc_VersionConvert_insertdot: + StrCpy $4 $0 $2 + StrCpy $0 $0 '' $2 + StrCpy $0 '$4.$0' + StrCpy $7 'dot' + goto WordFunc_VersionConvert_preloop + + WordFunc_VersionConvert_endcheck: + StrCpy $4 $0 1 -1 + StrCmp $4 '.' 0 WordFunc_VersionConvert_end + StrCpy $0 $0 -1 + goto -3 + + WordFunc_VersionConvert_end: + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Exch $0 + + !verbose pop +!macroend + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/nsDialogs.nsh b/libs/NSIS/NSIS-source/Include/nsDialogs.nsh new file mode 100644 index 0000000000..17feef3f6a --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/nsDialogs.nsh @@ -0,0 +1,1264 @@ +/* + +nsDialogs.nsh +Header file for creating custom installer pages with nsDialogs + +*/ + +!ifndef NSDIALOGS_INCLUDED +!verbose push 2 +!define NSDIALOGS_INCLUDED +!verbose 3 + +!include LogicLib.nsh +!include WinMessages.nsh + +!define /ifndef WS_EX_DLGMODALFRAME 0x00000001 +!define /ifndef WS_EX_NOPARENTNOTIFY 0x00000004 +!define /ifndef WS_EX_TOPMOST 0x00000008 +!define /ifndef WS_EX_ACCEPTFILES 0x00000010 +!define /ifndef WS_EX_TRANSPARENT 0x00000020 +!define /ifndef WS_EX_MDICHILD 0x00000040 +!define /ifndef WS_EX_TOOLWINDOW 0x00000080 +!define /ifndef WS_EX_WINDOWEDGE 0x00000100 +!define /ifndef WS_EX_CLIENTEDGE 0x00000200 +!define /ifndef WS_EX_CONTEXTHELP 0x00000400 +!define /ifndef WS_EX_RIGHT 0x00001000 +!define /ifndef WS_EX_LEFT 0x00000000 +!define /ifndef WS_EX_RTLREADING 0x00002000 +!define /ifndef WS_EX_LTRREADING 0x00000000 +!define /ifndef WS_EX_LEFTSCROLLBAR 0x00004000 +!define /ifndef WS_EX_RIGHTSCROLLBAR 0x00000000 +!define /ifndef WS_EX_CONTROLPARENT 0x00010000 +!define /ifndef WS_EX_STATICEDGE 0x00020000 +!define /ifndef WS_EX_APPWINDOW 0x00040000 + +!define /ifndef WS_CHILD 0x40000000 +!define /ifndef WS_VISIBLE 0x10000000 +!define /ifndef WS_DISABLED 0x08000000 +!define /ifndef WS_CLIPSIBLINGS 0x04000000 +!define /ifndef WS_CLIPCHILDREN 0x02000000 +!define /ifndef WS_MAXIMIZE 0x01000000 +!define /ifndef WS_BORDER 0x00800000 +!define /ifndef WS_VSCROLL 0x00200000 +!define /ifndef WS_HSCROLL 0x00100000 +!define /ifndef WS_GROUP 0x00020000 +!define /ifndef WS_MINIMIZEBOX 0x00020000 +!define /ifndef WS_MAXIMIZEBOX 0x00010000 +!define /ifndef WS_TABSTOP 0x00010000 + +!define ES_LEFT 0x00000000 +!define ES_CENTER 0x00000001 +!define ES_RIGHT 0x00000002 +!define ES_MULTILINE 0x00000004 +!define ES_UPPERCASE 0x00000008 +!define ES_LOWERCASE 0x00000010 +!define ES_PASSWORD 0x00000020 +!define ES_AUTOVSCROLL 0x00000040 +!define ES_AUTOHSCROLL 0x00000080 +!define ES_NOHIDESEL 0x00000100 +!define ES_OEMCONVERT 0x00000400 +!define ES_READONLY 0x00000800 +!define ES_WANTRETURN 0x00001000 +!define ES_NUMBER 0x00002000 +!define ES_SAVESEL 0x00008000 + +!define SS_LEFT 0x00000000 +!define SS_CENTER 0x00000001 +!define SS_RIGHT 0x00000002 +!define SS_ICON 0x00000003 +!define SS_BLACKRECT 0x00000004 +!define SS_GRAYRECT 0x00000005 +!define SS_WHITERECT 0x00000006 +!define SS_BLACKFRAME 0x00000007 +!define SS_GRAYFRAME 0x00000008 +!define SS_WHITEFRAME 0x00000009 +!define SS_USERITEM 0x0000000A +!define SS_SIMPLE 0x0000000B +!define SS_LEFTNOWORDWRAP 0x0000000C +!define SS_OWNERDRAW 0x0000000D +!define SS_BITMAP 0x0000000E +!define SS_ENHMETAFILE 0x0000000F +!define SS_ETCHEDHORZ 0x00000010 +!define SS_ETCHEDVERT 0x00000011 +!define SS_ETCHEDFRAME 0x00000012 +!define SS_TYPEMASK 0x0000001F +!define SS_REALSIZECONTROL 0x00000040 +!define SS_NOPREFIX 0x00000080 +!define SS_NOTIFY 0x00000100 +!define SS_CENTERIMAGE 0x00000200 +!define SS_RIGHTJUST 0x00000400 +!define SS_REALSIZEIMAGE 0x00000800 +!define SS_SUNKEN 0x00001000 +!define SS_EDITCONTROL 0x00002000 +!define SS_ENDELLIPSIS 0x00004000 +!define SS_PATHELLIPSIS 0x00008000 +!define SS_WORDELLIPSIS 0x0000C000 +!define SS_ELLIPSISMASK 0x0000C000 + +!define BS_PUSHBUTTON 0x00000000 +!define BS_DEFPUSHBUTTON 0x00000001 +!define BS_CHECKBOX 0x00000002 +!define BS_AUTOCHECKBOX 0x00000003 +!define BS_RADIOBUTTON 0x00000004 +!define BS_3STATE 0x00000005 +!define BS_AUTO3STATE 0x00000006 +!define BS_GROUPBOX 0x00000007 +!define BS_USERBUTTON 0x00000008 +!define BS_AUTORADIOBUTTON 0x00000009 +!define BS_PUSHBOX 0x0000000A +!define BS_OWNERDRAW 0x0000000B +!define BS_TYPEMASK 0x0000000F +!define BS_LEFTTEXT 0x00000020 +!define BS_TEXT 0x00000000 +!define BS_ICON 0x00000040 +!define BS_BITMAP 0x00000080 +!define BS_LEFT 0x00000100 +!define BS_RIGHT 0x00000200 +!define BS_CENTER 0x00000300 +!define BS_TOP 0x00000400 +!define BS_BOTTOM 0x00000800 +!define BS_VCENTER 0x00000C00 +!define BS_PUSHLIKE 0x00001000 +!define BS_MULTILINE 0x00002000 +!define BS_NOTIFY 0x00004000 +!define BS_FLAT 0x00008000 +!define BS_RIGHTBUTTON ${BS_LEFTTEXT} + +!define CBS_SIMPLE 0x0001 +!define CBS_DROPDOWN 0x0002 +!define CBS_DROPDOWNLIST 0x0003 +!define CBS_OWNERDRAWFIXED 0x0010 +!define CBS_OWNERDRAWVARIABLE 0x0020 +!define CBS_AUTOHSCROLL 0x0040 +!define CBS_OEMCONVERT 0x0080 +!define CBS_SORT 0x0100 +!define CBS_HASSTRINGS 0x0200 +!define CBS_NOINTEGRALHEIGHT 0x0400 +!define CBS_DISABLENOSCROLL 0x0800 +!define CBS_UPPERCASE 0x2000 +!define CBS_LOWERCASE 0x4000 + +!define LBS_NOTIFY 0x0001 +!define LBS_SORT 0x0002 +!define LBS_NOREDRAW 0x0004 +!define LBS_MULTIPLESEL 0x0008 +!define LBS_OWNERDRAWFIXED 0x0010 +!define LBS_OWNERDRAWVARIABLE 0x0020 +!define LBS_HASSTRINGS 0x0040 +!define LBS_USETABSTOPS 0x0080 +!define LBS_NOINTEGRALHEIGHT 0x0100 +!define LBS_MULTICOLUMN 0x0200 +!define LBS_WANTKEYBOARDINPUT 0x0400 +!define LBS_EXTENDEDSEL 0x0800 +!define LBS_DISABLENOSCROLL 0x1000 +!define LBS_NODATA 0x2000 +!define LBS_NOSEL 0x4000 +!define LBS_COMBOBOX 0x8000 + +!define ACS_CENTER 0x0001 +!define ACS_TRANSPARENT 0x0002 ; The parent of the animation control must not have the WS_CLIPCHILDREN style +!define ACS_AUTOPLAY 0x0004 +!define ACS_TIMER 0x0008 ; < CC6 + +!define TBS_AUTOTICKS 0x0001 +!define TBS_VERT 0x0002 +!define TBS_HORZ 0x0000 +!define TBS_TOP 0x0004 +!define TBS_BOTTOM 0x0000 +!define TBS_LEFT 0x0004 +!define TBS_RIGHT 0x0000 +!define TBS_BOTH 0x0008 +!define TBS_NOTICKS 0x0010 +!define TBS_ENABLESELRANGE 0x0020 +!define TBS_FIXEDLENGTH 0x0040 +!define TBS_NOTHUMB 0x0080 +!define TBS_TOOLTIPS 0x0100 ; IE3 +!define TBS_REVERSED 0x0200 ; IE5 +!define TBS_DOWNISLEFT 0x0400 ; _WIN32_IE >= 0x0501 +!define TBS_NOTIFYBEFOREMOVE 0x0800 ; IE6? +!define TBS_TRANSPARENTBKGND 0x1000 ; Vista + +!define UDS_WRAP 0x0001 +!define UDS_SETBUDDYINT 0x0002 +!define UDS_ALIGNRIGHT 0x0004 +!define UDS_ALIGNLEFT 0x0008 +!define UDS_AUTOBUDDY 0x0010 +!define UDS_ARROWKEYS 0x0020 +!define UDS_HORZ 0x0040 +!define UDS_NOTHOUSANDS 0x0080 +!define UDS_HOTTRACK 0x0100 ; 98+ + +!define MCS_DAYSTATE 0x0001 +!define MCS_MULTISELECT 0x0002 +!define MCS_WEEKNUMBERS 0x0004 +!define MCS_NOTODAYCIRCLE 0x0008 +!define MCS_NOTODAY 0x0010 ; IE4+? +!define MCS_NOTRAILINGDATES 0x0040 ; Vista+ +!define MCS_SHORTDAYSOFWEEK 0x0080 ; Vista+ +!define MCS_NOSELCHANGEONNAV 0x0100 ; Vista+ + +!define DTS_UPDOWN 0x01 +!define DTS_SHOWNONE 0x02 +!define DTS_SHORTDATEFORMAT 0x00 +!define DTS_LONGDATEFORMAT 0x04 +!define DTS_SHORTDATECENTURYFORMAT 0x0C +!define DTS_TIMEFORMAT 0x09 +!define DTS_APPCANPARSE 0x10 +!define DTS_RIGHTALIGN 0x20 + +!define /ifndef LR_DEFAULTCOLOR 0x0000 +!define /ifndef LR_MONOCHROME 0x0001 +!define /ifndef LR_COLOR 0x0002 +!define /ifndef LR_COPYRETURNORG 0x0004 +!define /ifndef LR_COPYDELETEORG 0x0008 +!define /ifndef LR_LOADFROMFILE 0x0010 +!define /ifndef LR_LOADTRANSPARENT 0x0020 +!define /ifndef LR_DEFAULTSIZE 0x0040 +!define /ifndef LR_VGACOLOR 0x0080 +!define /ifndef LR_LOADMAP3DCOLORS 0x1000 +!define /ifndef LR_CREATEDIBSECTION 0x2000 +!define /ifndef LR_COPYFROMRESOURCE 0x4000 +!define /ifndef LR_SHARED 0x8000 + +!define /ifndef IMAGE_BITMAP 0 +!define /ifndef IMAGE_ICON 1 +!define /ifndef IMAGE_CURSOR 2 +!define /ifndef IMAGE_ENHMETAFILE 3 + +!define /ifndef GWL_STYLE -16 +!define /ifndef GWL_EXSTYLE -20 + +#define /ifndef ICC_LISTVIEW_CLASSES 0x0001 ; SysListView32 and SysHeader32 +#define /ifndef ICC_TREEVIEW_CLASSES 0x0002 ; SysTabControl32 and tooltips_class32 +#define /ifndef ICC_BAR_CLASSES 0x0004 ; ToolbarWindow32, msctls_statusbar32, msctls_trackbar32 and tooltips_class32 +#define /ifndef ICC_TAB_CLASSES 0x0008 ; SysTabControl32 and tooltips_class32 +#define /ifndef ICC_UPDOWN_CLASS 0x0010 ; msctls_updown32 +#define /ifndef ICC_PROGRESS_CLASS 0x0020 ; msctls_progress32 +#define /ifndef ICC_HOTKEY_CLASS 0x0040 ; msctls_hotkey32 +#define /ifndef ICC_ANIMATE_CLASS 0x0080 ; SysAnimate32 +#define /ifndef ICC_WIN95_CLASSES 0x00FF +!define /ifndef ICC_DATE_CLASSES 0x0100 ; CC4.70+ (NT4+/IE3.1+/Win95 OSR2) SysDateTimePick32, SysMonthCal32 and CC6.10+(Vista+) DropDown +!define /ifndef ICC_USEREX_CLASSES 0x0200 ; CC4.??+ (NT4+/IE3.?+/Win95 OSR2) ComboBoxEx32 +!define /ifndef ICC_COOL_CLASSES 0x0400 ; CC4.70+ (NT4+/IE3.1+/Win95 OSR2) ReBarWindow32 +!define /ifndef ICC_INTERNET_CLASSES 0x0800 ; CC4.71+ (IE4+) SysIPAddress32 +!define /ifndef ICC_PAGESCROLLER_CLASS 0x1000 ; CC4.71+ (IE4+) SysPager +!define /ifndef ICC_NATIVEFNTCTL_CLASS 0x2000 ; CC4.71+ (IE4+) NativeFontCtl +!define /ifndef ICC_STANDARD_CLASSES 0x4000 ; WinXP+ Button, Static, Edit, ListBox, ComboBox, ComboLBox, ScrollBar and ReaderModeCtl +!define /ifndef ICC_LINK_CLASS 0x8000 ; WinXP+ SysLink + + +!define DEFAULT_STYLES ${WS_CHILD}|${WS_VISIBLE}|${WS_CLIPSIBLINGS} + +!define __NSD_HLine_CLASS STATIC +!define __NSD_HLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDHORZ}|${SS_SUNKEN} +!define __NSD_HLine_EXSTYLE ${WS_EX_TRANSPARENT} + +!define __NSD_VLine_CLASS STATIC +!define __NSD_VLine_STYLE ${DEFAULT_STYLES}|${SS_ETCHEDVERT}|${SS_SUNKEN} +!define __NSD_VLine_EXSTYLE ${WS_EX_TRANSPARENT} + +!define __NSD_Label_CLASS STATIC +!define __NSD_Label_STYLE ${DEFAULT_STYLES}|${SS_NOTIFY} +!define __NSD_Label_EXSTYLE ${WS_EX_TRANSPARENT} + +!define __NSD_Icon_CLASS STATIC +!define __NSD_Icon_STYLE ${DEFAULT_STYLES}|${SS_ICON}|${SS_NOTIFY} +!define __NSD_Icon_EXSTYLE 0 + +!define __NSD_Bitmap_CLASS STATIC +!define __NSD_Bitmap_STYLE ${DEFAULT_STYLES}|${SS_BITMAP}|${SS_NOTIFY} +!define __NSD_Bitmap_EXSTYLE 0 + +!define __NSD_BrowseButton_CLASS BUTTON +!define __NSD_BrowseButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_BrowseButton_EXSTYLE 0 + +!define __NSD_Link_CLASS LINK +!define __NSD_Link_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_OWNERDRAW} +!define __NSD_Link_EXSTYLE 0 + +!define __NSD_Button_CLASS BUTTON +!define __NSD_Button_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_Button_EXSTYLE 0 + +!define __NSD_GroupBox_CLASS BUTTON +!define __NSD_GroupBox_STYLE ${DEFAULT_STYLES}|${BS_GROUPBOX} +!define __NSD_GroupBox_EXSTYLE ${WS_EX_TRANSPARENT} + +!define __NSD_CheckBox_CLASS BUTTON +!define __NSD_CheckBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTOCHECKBOX}|${BS_MULTILINE} +!define __NSD_CheckBox_EXSTYLE 0 + +!define __NSD_RadioButton_CLASS BUTTON +!define __NSD_RadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} +!define __NSD_RadioButton_EXSTYLE 0 + +!define __NSD_FirstRadioButton_CLASS ${__NSD_RadioButton_CLASS} +!define __NSD_FirstRadioButton_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_GROUP}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} +!define __NSD_FirstRadioButton_EXSTYLE ${__NSD_RadioButton_EXSTYLE} + +!define __NSD_AdditionalRadioButton_CLASS ${__NSD_RadioButton_CLASS} +!define __NSD_AdditionalRadioButton_STYLE ${DEFAULT_STYLES}|${BS_TEXT}|${BS_VCENTER}|${BS_AUTORADIOBUTTON}|${BS_MULTILINE} +!define __NSD_AdditionalRadioButton_EXSTYLE ${__NSD_RadioButton_EXSTYLE} + +!define __NSD_Text_CLASS EDIT +!define __NSD_Text_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} +!define __NSD_Text_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_MLText_CLASS EDIT +!define __NSD_MLText_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_AUTOVSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${WS_HSCROLL}|${WS_VSCROLL} +!define __NSD_MLText_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_Password_CLASS EDIT +!define __NSD_Password_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_PASSWORD} +!define __NSD_Password_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_Number_CLASS EDIT +!define __NSD_Number_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_NUMBER} +!define __NSD_Number_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_FileRequest_CLASS EDIT +!define __NSD_FileRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} +!define __NSD_FileRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_DirRequest_CLASS EDIT +!define __NSD_DirRequest_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL} +!define __NSD_DirRequest_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_RichEdit_CLASS_10 "RICHEDIT" ; 1.0 (Riched32.dll) Win95/NT4 +!define __NSD_RichEdit_CLASS_20A "RICHEDIT20A" ; 2.0 (Riched20.dll) Win98/NT4 (NSIS makes sure this is registered even on Windows 95) +!define __NSD_RichEdit_CLASS_20W "RICHEDIT20W" +!define __NSD_RichEdit_CLASS_41W "RICHEDIT50W" ; 4.1 (MsftEdit.DLL) WinXP.SP1 +!ifdef NSIS_UNICODE +!define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20W} +!else +!define /ifndef __NSD_RichEdit_CLASS ${__NSD_RichEdit_CLASS_20A} +!endif +!define __NSD_RichEdit_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_AUTOVSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_SAVESEL}|${WS_HSCROLL}|${WS_VSCROLL} +!define __NSD_RichEdit_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_ComboBox_CLASS COMBOBOX +!define __NSD_ComboBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWN} +!define __NSD_ComboBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_DropList_CLASS COMBOBOX +!define __NSD_DropList_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${WS_CLIPCHILDREN}|${CBS_AUTOHSCROLL}|${CBS_HASSTRINGS}|${CBS_DROPDOWNLIST} +!define __NSD_DropList_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_ListBox_CLASS LISTBOX +!define __NSD_ListBox_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${WS_VSCROLL}|${LBS_DISABLENOSCROLL}|${LBS_HASSTRINGS}|${LBS_NOINTEGRALHEIGHT}|${LBS_NOTIFY} +!define __NSD_ListBox_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_SortedListBox_CLASS LISTBOX +!define __NSD_SortedListBox_STYLE ${__NSD_ListBox_STYLE}|${LBS_SORT} +!define __NSD_SortedListBox_EXSTYLE ${__NSD_ListBox_EXSTYLE} + +!define __NSD_ProgressBar_CLASS msctls_progress32 +!define __NSD_ProgressBar_STYLE ${DEFAULT_STYLES} +!define __NSD_ProgressBar_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_Animation_CLASS SysAnimate32 +!define __NSD_Animation_STYLE ${DEFAULT_STYLES}|${ACS_TRANSPARENT}|${ACS_AUTOPLAY} +!define __NSD_Animation_EXSTYLE 0 + +!define __NSD_HTrackBar_CLASS msctls_trackbar32 +!define __NSD_HTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_HORZ}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS} +!define __NSD_HTrackBar_EXSTYLE 0 + +!define __NSD_VTrackBar_CLASS msctls_trackbar32 +!define __NSD_VTrackBar_STYLE ${DEFAULT_STYLES}|${TBS_VERT}|${TBS_AUTOTICKS}|${TBS_TOOLTIPS} +!define __NSD_VTrackBar_EXSTYLE 0 + +!define __NSD_UpDown_CLASS msctls_updown32 +!define __NSD_UpDown_STYLE ${DEFAULT_STYLES}|${UDS_SETBUDDYINT}|${UDS_ARROWKEYS}|${UDS_NOTHOUSANDS}|${UDS_ALIGNRIGHT} +!define __NSD_UpDown_EXSTYLE 0 + +!define __NSD_AutoUpDown_CLASS msctls_updown32 +!define __NSD_AutoUpDown_STYLE ${__NSD_UpDown_STYLE}|${UDS_AUTOBUDDY} +!define __NSD_AutoUpDown_EXSTYLE ${__NSD_UpDown_EXSTYLE} + +!define __NSD_HotKey_CLASS msctls_hotkey32 +!define __NSD_HotKey_STYLE ${DEFAULT_STYLES} +!define __NSD_HotKey_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_Calendar_CLASS SysMonthCal32 +!define __NSD_Calendar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_Calendar_EXSTYLE 0 + +!define __NSD_DatePicker_CLASS SysDateTimePick32 +!define __NSD_DatePicker_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_DatePicker_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_TimePicker_CLASS SysDateTimePick32 +!define __NSD_TimePicker_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${DTS_TIMEFORMAT} +!define __NSD_TimePicker_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + +!define __NSD_IPAddress_CLASS SysIPAddress32 ; IE4+/CC4.71+ +!define __NSD_IPAddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_IPAddress_EXSTYLE 0 + +!define __NSD_NetAddress_CLASS msctls_netaddress ; Vista+ +!define __NSD_NetAddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP} +!define __NSD_NetAddress_EXSTYLE ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} + + +!macro __NSD_DefineControl NAME + !define NSD_Create${NAME} "nsDialogs::CreateControl ${__NSD_${Name}_CLASS} ${__NSD_${Name}_STYLE} ${__NSD_${Name}_EXSTYLE}" +!macroend +!insertmacro __NSD_DefineControl HLine +!insertmacro __NSD_DefineControl VLine +!insertmacro __NSD_DefineControl Label +!insertmacro __NSD_DefineControl Icon +!insertmacro __NSD_DefineControl Bitmap +!insertmacro __NSD_DefineControl BrowseButton +!insertmacro __NSD_DefineControl Link +!insertmacro __NSD_DefineControl Button +!insertmacro __NSD_DefineControl GroupBox +!insertmacro __NSD_DefineControl CheckBox +!insertmacro __NSD_DefineControl RadioButton +!insertmacro __NSD_DefineControl FirstRadioButton +!insertmacro __NSD_DefineControl AdditionalRadioButton +!insertmacro __NSD_DefineControl Text +!insertmacro __NSD_DefineControl MLText +!insertmacro __NSD_DefineControl Password +!insertmacro __NSD_DefineControl Number +!insertmacro __NSD_DefineControl FileRequest +!insertmacro __NSD_DefineControl DirRequest +!insertmacro __NSD_DefineControl RichEdit +!insertmacro __NSD_DefineControl ComboBox +!insertmacro __NSD_DefineControl DropList +!insertmacro __NSD_DefineControl ListBox +!insertmacro __NSD_DefineControl SortedListBox +!insertmacro __NSD_DefineControl ProgressBar +!insertmacro __NSD_DefineControl Animation +!insertmacro __NSD_DefineControl HTrackBar +!insertmacro __NSD_DefineControl VTrackBar +!insertmacro __NSD_DefineControl UpDown +!insertmacro __NSD_DefineControl AutoUpDown +!insertmacro __NSD_DefineControl HotKey +!insertmacro __NSD_DefineControl Calendar +!insertmacro __NSD_DefineControl DatePicker +!insertmacro __NSD_DefineControl TimePicker +!insertmacro __NSD_DefineControl IPAddress +!insertmacro __NSD_DefineControl NetAddress + + +!macro __NSD_OnControlEvent EVENT HWND FUNCTION + Push $0 + Push $1 + + StrCpy $1 "${HWND}" + + GetFunctionAddress $0 "${FUNCTION}" + nsDialogs::On${EVENT} $1 $0 + + Pop $1 + Pop $0 +!macroend + +!macro __NSD_DefineControlCallback EVENT + !define NSD_On${EVENT} `!insertmacro __NSD_OnControlEvent ${EVENT} ` +!macroend + +!macro __NSD_OnDialogEvent EVENT FUNCTION + Push $0 + + GetFunctionAddress $0 "${FUNCTION}" + nsDialogs::On${EVENT} $0 + + Pop $0 +!macroend + +!macro __NSD_DefineDialogCallback EVENT + !define NSD_On${EVENT} `!insertmacro __NSD_OnDialogEvent ${EVENT} ` +!macroend +!insertmacro __NSD_DefineControlCallback Click +!insertmacro __NSD_DefineControlCallback Change +!insertmacro __NSD_DefineControlCallback Notify +!insertmacro __NSD_DefineDialogCallback Back + +!define NSD_Return "!insertmacro NSD_Return " +!macro NSD_Return val +StrCpy $_OUTDIR ${val} +SetSilent silent +Return +!macroend + + +!define __NSD_MkCtlCmd "!insertmacro __NSD_MkCtlCmd " +!macro __NSD_MkCtlCmd msg wp lp hCtl +SendMessage ${hCtl} ${${msg}} ${wp} ${lp} +!macroend +!define __NSD_MkCtlCmd_WP "!insertmacro __NSD_MkCtlCmd_WP " +!macro __NSD_MkCtlCmd_WP msg lp hCtl wp +SendMessage ${hCtl} ${${msg}} ${wp} ${lp} +!macroend +!define __NSD_MkCtlCmd_LP "!insertmacro __NSD_MkCtlCmd_LP " +!macro __NSD_MkCtlCmd_LP msg wp hCtl lp +SendMessage ${hCtl} ${${msg}} ${wp} ${lp} +!macroend +!define __NSD_MkCtlCmd_WPLP "!insertmacro __NSD_MkCtlCmd_WPLP " +!macro __NSD_MkCtlCmd_WPLP msg hCtl wp lp +SendMessage ${hCtl} ${${msg}} ${wp} ${lp} +!macroend +!define __NSD_MkCtlCmd_RV "!insertmacro __NSD_MkCtlCmd_RV " +!macro __NSD_MkCtlCmd_RV msg wp lp hCtl VAR +SendMessage ${hCtl} ${${msg}} ${wp} ${lp} ${VAR} +!macroend + + +!define NSD_InitCommonControlsEx "!insertmacro __NSD_InitCommonControlsEx " +!macro __NSD_InitCommonControlsEx ICC +!pragma warning push +!pragma warning disable 7070 ; Invalid number +!if ${ICC} <> 0 +!define /ReDef /IntFmt NSD_InitCommonControlsEx_TEMP "0x%X" ${ICC} +System::Call 'COMCTL32::InitCommonControlsEx(*l${NSD_InitCommonControlsEx_TEMP}00000008)' +!undef NSD_InitCommonControlsEx_TEMP +!else +System::Int64Op ${ICC} << 32 +System::Int64Op 8 | +System::Call 'COMCTL32::InitCommonControlsEx(*ls)' ; INITCOMMONCONTROLSEX as UINT64 +!endif +!pragma warning pop +!macroend +!define NSD_InitCommonControl_IPAddress `${NSD_InitCommonControlsEx} ${ICC_INTERNET_CLASSES}` +!define NSD_InitCommonControl_NetAddress `System::Call SHELL32::InitNetworkAddressControl()i` +!define NSD_InitCommonControl_SysLink `${NSD_InitCommonControlsEx} ${ICC_LINK_CLASS}` + + +!define NSD_CreateTimer `!insertmacro _NSD_CreateTimer ` +!macro _NSD_CreateTimer FUNCTION INTERVAL + Push $0 + + GetFunctionAddress $0 "${FUNCTION}" + nsDialogs::CreateTimer $0 "${INTERVAL}" + + Pop $0 +!macroend + + +!define NSD_KillTimer `!insertmacro _NSD_KillTimer ` +!macro _NSD_KillTimer FUNCTION + Push $0 + + GetFunctionAddress $0 "${FUNCTION}" + nsDialogs::KillTimer $0 + + Pop $0 +!macroend + + +!define NSD_AddStyle "!insertmacro _NSD_GWLAddFlags ${GWL_STYLE} " +!define NSD_AddExStyle "!insertmacro _NSD_GWLAddFlags ${GWL_EXSTYLE} " +!macro _NSD_GWLAddFlags GWL HWND DATA + System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" + System::Int64Op "${DATA}" | + System::Call "user32::SetWindowLong(p${HWND},p${GWL},ps)" +!macroend + +!define NSD_RemoveStyle "!insertmacro _NSD_GWLRemoveFlags ${GWL_STYLE} " +!define NSD_RemoveExStyle "!insertmacro _NSD_GWLRemoveFlags ${GWL_EXSTYLE} " +!macro _NSD_GWLRemoveFlags GWL HWND DATA +System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" +System::Int64Op "${DATA}" ~ & ; Perform ~ and prepare the stack for & +System::Int64Op ; Perform & +System::Call "user32::SetWindowLong(p${HWND},i${GWL},ps)" +!macroend + +!define NSD_GetStyle "!insertmacro _NSD_GWLGetFlags ${GWL_STYLE} " +!define NSD_GetExStyle "!insertmacro _NSD_GWLGetFlags ${GWL_EXSTYLE} " +!macro _NSD_GWLGetFlags GWL HWND RET +System::Call "user32::GetWindowLong(p${HWND},i${GWL})p.s" +Pop ${RET} +!macroend + +!macro __NSD_GetStyleBit GWL BIT HWND RET +!insertmacro _NSD_GWLGetFlags ${GWL} ${HWND} ${RET} +IntOp ${RET} ${RET} & ${BIT} +!macroend + + +!define NSD_SetFocus `!insertmacro __NSD_SetFocus ` +!macro __NSD_SetFocus HWND + System::Call "user32::SetFocus(p${HWND})" +!macroend + + +!define NSD_GetText "!insertmacro __NSD_GetText " +!macro __NSD_GetText CONTROL VAR + System::Call user32::GetWindowText(p${CONTROL},t.s,i${NSIS_MAX_STRLEN}) + Pop ${VAR} +!macroend + + +!define NSD_SetText "!insertmacro __NSD_SetText " +!macro __NSD_SetText CONTROL TEXT + SendMessage ${CONTROL} ${WM_SETTEXT} 0 `STR:${TEXT}` +!macroend + + +### Edit ### + +!define NSD_Edit_GetTextLimit `${__NSD_MkCtlCmd_RV} EM_GETLIMITTEXT 0 0 ` +!define NSD_Edit_SetTextLimit `${__NSD_MkCtlCmd_WP} EM_SETLIMITTEXT 0 ` +!define NSD_Edit_SetPasswordChar `${__NSD_MkCtlCmd_WP} EM_SETPASSWORDCHAR 0 ` +!define NSD_Edit_GetReadOnly `!insertmacro __NSD_GetStyleBit ${GWL_STYLE} ${ES_READONLY} ` ; Non-zero if read-only +!define NSD_Edit_SetReadOnly `${__NSD_MkCtlCmd_WP} EM_SETREADONLY 0 ` ; Toggles the ES_READONLY style +!define NSD_Edit_GetModify `${__NSD_MkCtlCmd_RV} EM_GETMODIFY 0 0 ` +!define NSD_Edit_SetModify `${__NSD_MkCtlCmd_WP} EM_SETMODIFY 0 ` +!define NSD_Edit_EmptyUndoBuffer `${__NSD_MkCtlCmd} EM_EMPTYUNDOBUFFER 0 0 ` +!define NSD_Edit_CanUndo `${__NSD_MkCtlCmd_RV} EM_CANUNDO 0 0 ` +!define NSD_Edit_ScrollCaret `${__NSD_MkCtlCmd} EM_SCROLLCARET 0 0 ` +!define NSD_Edit_LineScroll `${__NSD_MkCtlCmd_WPLP} EM_LINESCROLL ` +!define NSD_Edit_SetSel `${__NSD_MkCtlCmd_WPLP} EM_SETSEL ` ; WP:Start LP:End + +!define NSD_Edit_SetCueBannerText "!insertmacro __NSD_Edit_SetCueBannerText " ; CC6+ +!macro __NSD_Edit_SetCueBannerText CONTROL SHOWWHENFOCUSED TEXT +!if ${NSIS_CHAR_SIZE} > 1 + SendMessage ${CONTROL} ${EM_SETCUEBANNER} ${SHOWWHENFOCUSED} `STR:${TEXT}` +!else + System::Call 'USER32::SendMessage(p${CONTROL},i${EM_SETCUEBANNER},p${SHOWWHENFOCUSED},ws)' `${TEXT}` ; Must be PWSTR +!endif +!macroend + +!define NSD_Edit_GetLineCount `${__NSD_MkCtlCmd_RV} EM_GETLINECOUNT 0 0 ` +!define NSD_Edit_GetLine "!insertmacro __NSD_Edit_GetLine " +!macro __NSD_Edit_GetLine CONTROL LINEINDEX OUTPUT + System::Call '*(&i2 ${NSIS_MAX_STRLEN},&t${NSIS_MAX_STRLEN})p.s' + System::Call 'USER32::SendMessage(p${CONTROL},i${EM_GETLINE},p${LINEINDEX},pss)' + System::Call 'KERNEL32::lstrcpyn(t.s,pss,i${NSIS_MAX_STRLEN})' + Pop ${OUTPUT} + System::Free +!macroend + +!define NSD_SetTextLimit `${NSD_Edit_SetTextLimit} ` ; Legacy alias + + +### RichEdit ### + +!define NSD_RichEd_SetTextLimit `${__NSD_MkCtlCmd_LP} EM_EXLIMITTEXT 0 ` +!define NSD_RichEd_GetEventMask `${__NSD_MkCtlCmd_RV} EM_GETEVENTMASK 0 0 ` +!define NSD_RichEd_SetEventMask `${__NSD_MkCtlCmd_LP} EM_SETEVENTMASK 0 ` ; LP:ENM_* +!define NSD_RichEd_SetSystemBackgroundColor `${__NSD_MkCtlCmd} EM_SETBKGNDCOLOR 1 0 ` ; COLOR_WINDOW +!define NSD_RichEd_SetCustomBackgroundColor `${__NSD_MkCtlCmd_LP} EM_SETBKGNDCOLOR 0 ` ; LP:COLORREF +!define NSD_RichEd_SetHideSelection `${__NSD_MkCtlCmd_WP} EM_HIDESELECTION 0 ` ; WP(BOOL):HideSelWithoutFocus (Toggles ES_NOHIDESEL & TXTBIT_HIDESELECTION) + + +### CheckBox ### + +!define NSD_GetState `!insertmacro __NSD_GetState ` +!macro __NSD_GetState CONTROL VAR + SendMessage ${CONTROL} ${BM_GETCHECK} 0 0 ${VAR} +!macroend + + +!define NSD_SetState `!insertmacro __NSD_SetState ` +!macro __NSD_SetState CONTROL STATE + SendMessage ${CONTROL} ${BM_SETCHECK} ${STATE} 0 +!macroend + +!define NSD_Check `!insertmacro __NSD_Check ` +!macro __NSD_Check CONTROL + ${NSD_SetState} ${CONTROL} ${BST_CHECKED} +!macroend + + +!define NSD_Uncheck `!insertmacro __NSD_Uncheck ` +!macro __NSD_Uncheck CONTROL + ${NSD_SetState} ${CONTROL} ${BST_UNCHECKED} +!macroend + +!define NSD_GetChecked `!insertmacro __NSD_GetState ` +!define NSD_SetChecked `!insertmacro __NSD_SetState ` + + +### ComboBox ### + +!define NSD_CB_AddString "!insertmacro _NSD_CB_AddString " +!macro _NSD_CB_AddString CONTROL STRING + SendMessage ${CONTROL} ${CB_ADDSTRING} 0 `STR:${STRING}` +!macroend + + +!define NSD_CB_InsertString "!insertmacro _NSD_CB_InsertString " +!macro _NSD_CB_InsertString CONTROL INDEX STRING +SendMessage ${CONTROL} ${CB_INSERTSTRING} ${INDEX} `STR:${STRING}` +!macroend + +!define NSD_CB_PrependString "!insertmacro _NSD_CB_PrependString " +!macro _NSD_CB_PrependString CONTROL STRING +SendMessage ${CONTROL} ${CB_INSERTSTRING} 0 `STR:${STRING}` +!macroend + +!define NSD_CB_AppendString "!insertmacro _NSD_CB_AppendString " +!macro _NSD_CB_AppendString CONTROL STRING +SendMessage ${CONTROL} ${CB_INSERTSTRING} -1 `STR:${STRING}` +!macroend + + +!define NSD_CB_SelectString "!insertmacro _NSD_CB_SelectString " +!macro _NSD_CB_SelectString CONTROL STRING + SendMessage ${CONTROL} ${CB_SELECTSTRING} -1 `STR:${STRING}` +!macroend + + +!define NSD_CB_SelectStringExact "!insertmacro _NSD_CB_SelectStringExact " +!macro _NSD_CB_SelectStringExact CONTROL STRING + !insertmacro _LOGICLIB_TEMP + SendMessage ${CONTROL} ${CB_FINDSTRINGEXACT} -1 `STR:${STRING}` $_LOGICLIB_TEMP + StrCmp $_LOGICLIB_TEMP -1 +2 + SendMessage ${CONTROL} ${CB_SETCURSEL} $_LOGICLIB_TEMP 0 +!macroend + + +!define NSD_CB_FindStringExact "!insertmacro _NSD_CB_FindStringExact " +!macro _NSD_CB_FindStringExact CONTROL STRING VAR + SendMessage ${CONTROL} ${CB_FINDSTRINGEXACT} -1 `STR:${STRING}` ${VAR} +!macroend + + +!define NSD_CB_GetSelectionIndex `!insertmacro __NSD_CB_GetSelectionIndex ` +!macro __NSD_CB_GetSelectionIndex CONTROL VAR + SendMessage ${CONTROL} ${CB_GETCURSEL} 0 0 ${VAR} +!macroend + + +!define NSD_CB_SetSelectionIndex `!insertmacro __NSD_CB_SetSelectionIndex ` +!macro __NSD_CB_SetSelectionIndex CONTROL INDEX + SendMessage ${CONTROL} ${CB_SETCURSEL} ${INDEX} 0 +!macroend + + +!define NSD_CB_GetItemData `!insertmacro __NSD_CB_GetItemData ` +!macro __NSD_CB_GetItemData CONTROL INDEX VAR +SendMessage ${CONTROL} ${CB_GETITEMDATA} ${INDEX} 0 ${VAR} +!macroend +!define NSD_CB_SetItemData `${__NSD_MkCtlCmd_WPLP} CB_SETITEMDATA ` ; Index Data + + +!define NSD_CB_DelItem `${__NSD_MkCtlCmd_WP} CB_DELETESTRING 0 ` +!define NSD_CB_LimitText `${__NSD_MkCtlCmd_WP} CB_LIMITTEXT 0 ` +!define /IfNDef NSD_CB_Clear `${__NSD_MkCtlCmd} CB_RESETCONTENT 0 0 ` +!define /IfNDef NSD_CB_GetCount `${__NSD_MkCtlCmd_RV} CB_GETCOUNT 0 0 ` +!ifndef NSD_CB_DelString +!define NSD_CB_DelString `!insertmacro __NSD_CB_DelString ` +!macro __NSD_CB_DelString CONTROL STRING + System::Call 'USER32::SendMessage(p${CONTROL},i${CB_FINDSTRINGEXACT},p-1,ts)p.s' `${STRING}` + System::Call 'USER32::SendMessage(p${CONTROL},i${CB_DELETESTRING},ps,p0)' +!macroend +!endif +;define /IfNDef NSD_CB_GetSelection + + +### ListBox ### + +!define NSD_LB_AddString "!insertmacro _NSD_LB_AddString " +!macro _NSD_LB_AddString CONTROL STRING + SendMessage ${CONTROL} ${LB_ADDSTRING} 0 `STR:${STRING}` +!macroend + + +!define NSD_LB_InsertString "!insertmacro _NSD_LB_InsertString " +!macro _NSD_LB_InsertString CONTROL INDEX STRING +SendMessage ${CONTROL} ${LB_INSERTSTRING} ${INDEX} `STR:${STRING}` +!macroend + +!define NSD_LB_PrependString "!insertmacro _NSD_LB_PrependString " +!macro _NSD_LB_PrependString CONTROL STRING +SendMessage ${CONTROL} ${LB_INSERTSTRING} 0 `STR:${STRING}` +!macroend + +!define NSD_LB_AppendString "!insertmacro _NSD_LB_AppendString " +!macro _NSD_LB_AppendString CONTROL STRING +SendMessage ${CONTROL} ${LB_INSERTSTRING} -1 `STR:${STRING}` +!macroend + + +!define NSD_LB_DelString `!insertmacro __NSD_LB_DelString ` +!macro __NSD_LB_DelString CONTROL STRING + System::Call 'USER32::SendMessage(p${CONTROL},i${LB_FINDSTRINGEXACT},p-1,ts)p.s' `${STRING}` + System::Call 'USER32::SendMessage(p${CONTROL},i${LB_DELETESTRING},ps,p0)' +!macroend + + +!define NSD_LB_DelItem "!insertmacro __NSD_LB_DelItem " +!macro __NSD_LB_DelItem CONTROL INDEX + SendMessage ${CONTROL} ${LB_DELETESTRING} ${INDEX} 0 +!macroend + + +!define NSD_LB_Clear `${__NSD_MkCtlCmd} LB_RESETCONTENT 0 0 ` + + +!define NSD_LB_GetCount `!insertmacro __NSD_LB_GetCount ` +!macro __NSD_LB_GetCount CONTROL VAR + SendMessage ${CONTROL} ${LB_GETCOUNT} 0 0 ${VAR} +!macroend + + +!define NSD_LB_SelectString "!insertmacro _NSD_LB_SelectString " +!macro _NSD_LB_SelectString CONTROL STRING + SendMessage ${CONTROL} ${LB_SELECTSTRING} -1 `STR:${STRING}` +!macroend + + +!define NSD_LB_GetSelection `!insertmacro __NSD_LB_GetSelection ` +!macro __NSD_LB_GetSelection CONTROL VAR + SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR} + System::Call 'user32::SendMessage(p ${CONTROL}, i ${LB_GETTEXT}, p ${VAR}, t .s)' + Pop ${VAR} +!macroend + + +!define NSD_LB_GetSelectionIndex `!insertmacro __NSD_LB_GetSelectionIndex ` +!macro __NSD_LB_GetSelectionIndex CONTROL VAR + SendMessage ${CONTROL} ${LB_GETCURSEL} 0 0 ${VAR} +!macroend + + +!define NSD_LB_SetSelectionIndex `!insertmacro __NSD_LB_SetSelectionIndex ` +!macro __NSD_LB_SetSelectionIndex CONTROL INDEX + SendMessage ${CONTROL} ${LB_SETCURSEL} ${INDEX} 0 +!macroend + + +!define NSD_LB_GetSelectionCount `!insertmacro __NSD_LB_GetSelectionCount ` +!macro __NSD_LB_GetSelectionCount CONTROL VAR + SendMessage ${CONTROL} ${LB_GETSELCOUNT} 0 0 ${VAR} +!macroend + + +!define NSD_LB_GetItemText `!insertmacro __NSD_LB_GetItemText ` +!macro __NSD_LB_GetItemText CONTROL INDEX VAR + System::Call 'user32::SendMessage(p${CONTROL}, i${LB_GETTEXT}, p${INDEX}, t.s)' + Pop ${VAR} +!macroend + + +!define NSD_LB_GetItemData `!insertmacro __NSD_LB_GetItemData ` +!macro __NSD_LB_GetItemData CONTROL INDEX VAR +SendMessage ${CONTROL} ${LB_GETITEMDATA} ${INDEX} 0 ${VAR} +!macroend +!define NSD_LB_SetItemData `${__NSD_MkCtlCmd_WPLP} LB_SETITEMDATA ` ; Index Data + + +!define NSD_LB_FindStringPrefix `!insertmacro __NSD_LB_FindStringPrefix ` +!macro __NSD_LB_FindStringPrefix CONTROL STRING VAR + SendMessage ${CONTROL} ${LB_FINDSTRING} -1 `STR:${STRING}` ${VAR} +!macroend + + +!define NSD_LB_FindStringExact `!insertmacro __NSD_LB_FindStringExact ` +!macro __NSD_LB_FindStringExact CONTROL STRING VAR + SendMessage ${CONTROL} ${LB_FINDSTRINGEXACT} -1 `STR:${STRING}` ${VAR} +!macroend + + +### ProgressBar ### + +!define NSD_ProgressBar_SetPos `${__NSD_MkCtlCmd_WP} PBM_SETPOS 0 ` +!define NSD_ProgressBar_SetStep `${__NSD_MkCtlCmd_WP} PBM_SETSTEP 0 ` +!define NSD_ProgressBar_StepIt `${__NSD_MkCtlCmd} PBM_STEPIT 0 0 ` +!define NSD_ProgressBar_AdvanceBy `${__NSD_MkCtlCmd_WP} PBM_DELTAPOS 0 ` +!define NSD_ProgressBar_SetPackedRange `${__NSD_MkCtlCmd_LP} PBM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max) +!define NSD_ProgressBar_SetRange32 `${__NSD_MkCtlCmd_WPLP} PBM_SETRANGE32 ` ; [IE3+] WP:min LP:max +!define NSD_ProgressBar_GetPos `${__NSD_MkCtlCmd_RV} PBM_GETPOS 0 0 ` ; [IE3+] + + +### Animation ### + +!define NSD_Anim_Close `${__NSD_MkCtlCmd} ACM_OPEN 0 0 ` +!define NSD_Anim_Play `${__NSD_MkCtlCmd} ACM_PLAY -1 0xFFFF0000 ` +!define NSD_Anim_PlayLoops `${__NSD_MkCtlCmd_WP} ACM_PLAY 0xFFFF0000 ` ; WP(UINT16):LoopCount +!define NSD_Anim_Stop `${__NSD_MkCtlCmd} ACM_STOP 0 0 ` +!define NSD_Anim_IsPlaying `${__NSD_MkCtlCmd_RV} ACM_ISPLAYING 0 0 ` + +!define NSD_Anim_OpenFile `!insertmacro __NSD_Anim_OpenFile ` +!macro __NSD_Anim_OpenFile CONTROL PATH + SendMessage ${CONTROL} ${ACM_OPEN} 0 "STR:${PATH}" +!macroend + +!define NSD_Anim_OpenResource `!insertmacro __NSD_Anim_OpenResource ` +!macro __NSD_Anim_OpenResource CONTROL HINSTANCE_CC471 RESID + SendMessage ${CONTROL} ${ACM_OPEN} "${HINSTANCE_CC471}" "${RESID}" +!macroend + + +### TrackBar ### + +!define NSD_TrackBar_GetPos `${__NSD_MkCtlCmd_RV} TBM_GETPOS 0 0 ` +!define NSD_TrackBar_SetPos `${__NSD_MkCtlCmd_LP} TBM_SETPOS 1 ` +!define NSD_TrackBar_SetRangeMin `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMIN 1 ` +!define NSD_TrackBar_SetRangeMax `${__NSD_MkCtlCmd_LP} TBM_SETRANGEMAX 1 ` +!define NSD_TrackBar_GetLineSize `${__NSD_MkCtlCmd_RV} TBM_GETLINESIZE 0 0 ` +!define NSD_TrackBar_SetLineSize `${__NSD_MkCtlCmd_LP} TBM_SETLINESIZE 0 ` +!define NSD_TrackBar_GetPageSize `${__NSD_MkCtlCmd_RV} TBM_GETPAGESIZE 0 0 ` +!define NSD_TrackBar_SetPageSize `${__NSD_MkCtlCmd_LP} TBM_SETPAGESIZE 0 ` +!define NSD_TrackBar_ClearTics `${__NSD_MkCtlCmd} TBM_CLEARTICS 0 0 ` +!define NSD_TrackBar_GetNumTics `${__NSD_MkCtlCmd_RV} TBM_GETNUMTICS 0 0 ` +!define NSD_TrackBar_SetTic `${__NSD_MkCtlCmd_LP} TBM_SETTIC 0 ` +!define NSD_TrackBar_SetTicFreq `${__NSD_MkCtlCmd_WP} TBM_SETTICFREQ 0 ` +!define NSD_TrackBar_GetThumbLength `${__NSD_MkCtlCmd_RV} TBM_GETTHUMBLENGTH 0 0 ` +!define NSD_TrackBar_SetBuddy `${__NSD_MkCtlCmd_WPLP} TBM_SETBUDDY ` ; WP(BOOL):Left/Right LP:HWND + + +### UpDown ### + +!define NSD_UD_SetBuddy `${__NSD_MkCtlCmd_WP} UDM_SETBUDDY 0 ` +!define NSD_UD_GetPos `${__NSD_MkCtlCmd_RV} UDM_GETPOS 0 0 ` +!define NSD_UD_SetPos `${__NSD_MkCtlCmd_LP} UDM_SETPOS 0 ` +!define NSD_UD_GetPackedRange `${__NSD_MkCtlCmd_RV} UDM_GETRANGE 0 0 ` +!define NSD_UD_SetPackedRange `${__NSD_MkCtlCmd_LP} UDM_SETRANGE 0 ` ; LP(DWORD):MAKELONG(min,max) +!define NSD_UD_GetPos32 `${__NSD_MkCtlCmd_RV} UDM_GETPOS32 0 0 ` +!define NSD_UD_SetPos32 `${__NSD_MkCtlCmd_LP} UDM_SETPOS32 0 ` +!define NSD_UD_SetRange32 `${__NSD_MkCtlCmd_WPLP} UDM_SETRANGE32 ` ; WP(INT32):min LP(INT32):max + +!define NSD_UD_GetRange32 `!insertmacro __NSD_UD_GetRange32 ` +!macro __NSD_UD_GetRange32 CONTROL OUTLO OUTHI + System::Call 'USER32::SendMessage(p${CONTROL},i${UDM_GETRANGE32},*i.s,*i.s)' + Pop ${OUTLO} + Pop ${OUTHI} +!macroend + +!define NSD_UD_SetStaticRange `!insertmacro __NSD_UD_SetStaticRange ` +!macro __NSD_UD_SetStaticRange CONTROL MI MA + !define /redef /math MI ${MI} << 16 + !define /redef /math MA ${MA} & 0xffff + !define /redef /math MA ${MI} | ${MA} + SendMessage ${CONTROL} ${UDM_SETRANGE} 0 ${MA} +!macroend + + +### HotKey ### + +!define NSD_HK_GetHotKey `${__NSD_MkCtlCmd_RV} HKM_GETHOTKEY 0 0 ` ; RV(WORD):MAKEWORD(VK,HOTKEYF) +!define NSD_HK_SetHotKey `${__NSD_MkCtlCmd_WP} HKM_SETHOTKEY 0 ` +!define NSD_HK_SetRules `${__NSD_MkCtlCmd_WPLP} HKM_SETRULES ` + + +### IP Address ### + +!define NSD_IPAddress_Clear `${__NSD_MkCtlCmd} IPM_CLEARADDRESS 0 0 ` +!define NSD_IPAddress_SetPackedIPv4 `${__NSD_MkCtlCmd_LP} IPM_SETADDRESS 0 ` +!define NSD_IPAddress_IsBlank `${__NSD_MkCtlCmd_RV} IPM_ISBLANK 0 0 ` + +!define NSD_IPAddress_GetPackedIPv4 `!insertmacro __NSD_IPAddress_GetPackedIPv4 ` +!macro __NSD_IPAddress_GetPackedIPv4 CONTROL VAR +System::Call 'USER32::SendMessage(p${CONTROL},i${IPM_GETADDRESS},p0,*i0s)' +Pop ${VAR} +!macroend + + +### Date ### +!define NSD_Date_GetDateFields `!insertmacro __NSD_Date_GetDateFields ` +!macro __NSD_Date_GetDateFields CONTROL +Push $0 +System::Call 'USER32::SendMessage(p${CONTROL},i${DTM_GETSYSTEMTIME},p0,@r0)' +System::Call '*$0(&i2.s,&i2.s,&i2,&i2.s)' +Exch 3 +Pop $0 +!macroend + +!define NSD_Time_GetTimeFields `!insertmacro __NSD_Time_GetTimeFields ` +!macro __NSD_Time_GetTimeFields CONTROL +Push $0 +System::Call 'USER32::SendMessage(p${CONTROL},i${DTM_GETSYSTEMTIME},p0,@r0)' +System::Call '*$0(&i2,&i2,&i2,&i2,&i2.s,&i2.s,&i2.s)' +Exch 3 +Pop $0 +Exch +!macroend + + +### Static ### + +!macro __NSD_LoadAndSetImage _LIHINSTMODE _IMGTYPE _LIHINSTSRC _LIFLAGS CONTROL IMAGE HANDLE + !if "${_LIHINSTMODE}" == "exeresource" + LoadAndSetImage /EXERESOURCE /STRINGID "${CONTROL}" ${_IMGTYPE} ${_LIFLAGS} "${IMAGE}" ${HANDLE} + !else #if "${_LIHINSTMODE}" == "file" + LoadAndSetImage /STRINGID "${CONTROL}" ${_IMGTYPE} ${_LIFLAGS} "${IMAGE}" ${HANDLE} + !endif +!macroend + +!macro __NSD_SetIconFromExeResource CONTROL IMAGE HANDLE + LoadAndSetImage /EXERESOURCE /STRINGID "${CONTROL}" ${IMAGE_ICON} ${LR_DEFAULTSIZE} "${IMAGE}" ${HANDLE} +!macroend + +!macro __NSD_SetIconFromInstaller CONTROL HANDLE + LoadAndSetImage /EXERESOURCE "${CONTROL}" ${IMAGE_ICON} ${LR_DEFAULTSIZE} 103 ${HANDLE} +!macroend + +!define NSD_SetImage `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_BITMAP} 0 "${LR_LOADFROMFILE}" ` +!define NSD_SetBitmap `${NSD_SetImage} ` + +!define NSD_SetIcon `!insertmacro __NSD_LoadAndSetImage file ${IMAGE_ICON} 0 "${LR_LOADFROMFILE}|${LR_DEFAULTSIZE}" ` +!define NSD_SetIconFromExeResource `!insertmacro __NSD_SetIconFromExeResource ` +!define NSD_SetIconFromInstaller `!insertmacro __NSD_SetIconFromInstaller ` + + +!define NSD_SetStretchedImage `!insertmacro __NSD_SetStretchedImage ` +!define NSD_SetStretchedBitmap `!insertmacro __NSD_SetStretchedImage ` +!macro __NSD_SetStretchedImage CONTROL IMAGE HANDLE + LoadAndSetImage /STRINGID /RESIZETOFIT "${CONTROL}" ${IMAGE_BITMAP} ${LR_LOADFROMFILE} "${IMAGE}" ${HANDLE} +!macroend + + +!define NSD_FreeImage `!insertmacro __NSD_FreeImage ` +!define NSD_FreeBitmap `${NSD_FreeImage} ` +!macro __NSD_FreeImage IMAGE + ${If} ${IMAGE} P<> 0 + System::Call gdi32::DeleteObject(ps) ${IMAGE} + ${EndIf} +!macroend + + +!define NSD_FreeIcon `!insertmacro __NSD_FreeIcon ` +!macro __NSD_FreeIcon IMAGE + System::Call user32::DestroyIcon(ps) ${IMAGE} +!macroend + + +!define NSD_ClearImage `!insertmacro __NSD_ClearImage ${IMAGE_BITMAP} ` +!define NSD_ClearBitmap `${NSD_ClearImage} ` +!define NSD_ClearIcon `!insertmacro __NSD_ClearImage ${IMAGE_ICON} ` +!macro __NSD_ClearImage _IMGTYPE CONTROL + SendMessage ${CONTROL} ${STM_SETIMAGE} ${_IMGTYPE} 0 +!macroend + + +### INI ### + +!define /IfNDef NSD_Debug `System::Call kernel32::OutputDebugString(ts)` + +!macro __NSD_ControlCase TYPE + ${Case} ${TYPE} + ${NSD_Create${TYPE}} $R3u $R4u $R5u $R6u $R7 + Pop $R9 + ${Break} +!macroend + +!macro __NSD_ControlCaseEx TYPE + ${Case} ${TYPE} + Call ${TYPE} + ${Break} +!macroend + +!macro NSD_FUNCTION_INIFILE + !insertmacro NSD_INIFILE "" +!macroend + +!macro NSD_UNFUNCTION_INIFILE + !insertmacro NSD_INIFILE un. +!macroend + +!macro NSD_INIFILE UNINSTALLER_FUNCPREFIX + + ;Functions to create dialogs based on old InstallOptions INI files + + Function ${UNINSTALLER_FUNCPREFIX}CreateDialogFromINI + + # $0 = ini + + ReadINIStr $R0 $0 Settings RECT + ${If} $R0 == "" + StrCpy $R0 1018 + ${EndIf} + + nsDialogs::Create $R0 + Pop $R9 + + ReadINIStr $R0 $0 Settings RTL + nsDialogs::SetRTL $R0 + + ReadINIStr $R0 $0 Settings NumFields + + ${NSD_Debug} "NumFields = $R0" + + ${For} $R1 1 $R0 + ${NSD_Debug} "Creating field $R1" + ReadINIStr $R2 $0 "Field $R1" Type + ${NSD_Debug} " Type = $R2" + ReadINIStr $R3 $0 "Field $R1" Left + ${NSD_Debug} " Left = $R3" + ReadINIStr $R4 $0 "Field $R1" Top + ${NSD_Debug} " Top = $R4" + ReadINIStr $R5 $0 "Field $R1" Right + ${NSD_Debug} " Right = $R5" + ReadINIStr $R6 $0 "Field $R1" Bottom + ${NSD_Debug} " Bottom = $R6" + IntOp $R5 $R5 - $R3 + ${NSD_Debug} " Width = $R5" + IntOp $R6 $R6 - $R4 + ${NSD_Debug} " Height = $R6" + ReadINIStr $R7 $0 "Field $R1" Text + ${NSD_Debug} " Text = $R7" + ${Switch} $R2 + !insertmacro __NSD_ControlCase HLine + !insertmacro __NSD_ControlCase VLine + !insertmacro __NSD_ControlCase Label + !insertmacro __NSD_ControlCase Icon + !insertmacro __NSD_ControlCase Bitmap + !insertmacro __NSD_ControlCaseEx Link + !insertmacro __NSD_ControlCase Button + !insertmacro __NSD_ControlCase GroupBox + !insertmacro __NSD_ControlCase CheckBox + !insertmacro __NSD_ControlCase RadioButton + !insertmacro __NSD_ControlCase Text + !insertmacro __NSD_ControlCase Password + !insertmacro __NSD_ControlCaseEx FileRequest + !insertmacro __NSD_ControlCaseEx DirRequest + !insertmacro __NSD_ControlCase ComboBox + !insertmacro __NSD_ControlCase DropList + !insertmacro __NSD_ControlCase ListBox + ${EndSwitch} + + WriteINIStr $0 "Field $R1" HWND $R9 + ${Next} + + nsDialogs::Show + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}UpdateINIState + + ${NSD_Debug} "Updating INI state" + + ReadINIStr $R0 $0 Settings NumFields + + ${NSD_Debug} "NumField = $R0" + + ${For} $R1 1 $R0 + ReadINIStr $R2 $0 "Field $R1" HWND + ReadINIStr $R3 $0 "Field $R1" "Type" + ${Switch} $R3 + ${Case} "CheckBox" + ${Case} "RadioButton" + ${NSD_Debug} " HWND = $R2" + ${NSD_GetState} $R2 $R2 + ${NSD_Debug} " Window selection = $R2" + ${Break} + ${CaseElse} + ${NSD_Debug} " HWND = $R2" + ${NSD_GetText} $R2 $R2 + ${NSD_Debug} " Window text = $R2" + ${Break} + ${EndSwitch} + WriteINIStr $0 "Field $R1" STATE $R2 + ${Next} + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}FileRequest + + IntOp $R5 $R5 - 15 + IntOp $R8 $R3 + $R5 + + ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ... + Pop $R8 + + nsDialogs::SetUserData $R8 $R1 # remember field id + + WriteINIStr $0 "Field $R1" HWND2 $R8 + + ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton + + ReadINIStr $R9 $0 "Field $R1" State + + ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9 + Pop $R9 + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}DirRequest + + IntOp $R5 $R5 - 15 + IntOp $R8 $R3 + $R5 + + ${NSD_CreateBrowseButton} $R8u $R4u 15u $R6u ... + Pop $R8 + + nsDialogs::SetUserData $R8 $R1 # remember field id + + WriteINIStr $0 "Field $R1" HWND2 $R8 + + ${NSD_OnClick} $R8 ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton + + ReadINIStr $R9 $0 "Field $R1" State + + ${NSD_CreateFileRequest} $R3u $R4u $R5u $R6u $R9 + Pop $R9 + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}OnFileBrowseButton + + Pop $R0 + + nsDialogs::GetUserData $R0 + Pop $R1 + + ReadINIStr $R2 $0 "Field $R1" HWND + ReadINIStr $R4 $0 "Field $R1" Filter + + ${NSD_GetText} $R2 $R3 + + nsDialogs::SelectFileDialog save $R3 $R4 + Pop $R3 + + ${If} $R3 != "" + SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3 + ${EndIf} + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}OnDirBrowseButton + + Pop $R0 + + nsDialogs::GetUserData $R0 + Pop $R1 + + ReadINIStr $R2 $0 "Field $R1" HWND + ReadINIStr $R3 $0 "Field $R1" Text + + ${NSD_GetText} $R2 $R4 + + nsDialogs::SelectFolderDialog $R3 $R4 + Pop $R3 + + ${If} $R3 != error + SendMessage $R2 ${WM_SETTEXT} 0 STR:$R3 + ${EndIf} + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}Link + + ${NSD_CreateLink} $R3u $R4u $R5u $R6u $R7 + Pop $R9 + + nsDialogs::SetUserData $R9 $R1 # remember field id + + ${NSD_OnClick} $R9 ${UNINSTALLER_FUNCPREFIX}OnLink + + FunctionEnd + + Function ${UNINSTALLER_FUNCPREFIX}OnLink + + Pop $R0 + + nsDialogs::GetUserData $R0 + Pop $R1 + + ReadINIStr $R1 $0 "Field $R1" STATE + + ExecShell "" $R1 + + FunctionEnd + +!macroend + +!verbose pop +!endif diff --git a/libs/NSIS/NSIS-source/Include/x64.nsh b/libs/NSIS/NSIS-source/Include/x64.nsh new file mode 100644 index 0000000000..59d9e8c28a --- /dev/null +++ b/libs/NSIS/NSIS-source/Include/x64.nsh @@ -0,0 +1,120 @@ +; --------------------- +; x64.nsh +; --------------------- +; +; A few simple macros to handle installations on x64 machines. +; +; RunningX64 checks if the installer is running on a 64-bit OS. +; IsWow64 checks if the installer is a 32-bit application running on a 64-bit OS. +; +; ${If} ${RunningX64} +; MessageBox MB_OK "Running on 64-bit Windows" +; ${EndIf} +; +; IsNative* checks the OS native CPU architecture. +; +; ${If} ${IsNativeAMD64} +; ; Install AMD64 64-bit driver/library +; ${ElseIf} ${IsNativeARM64} +; ; Install ARM64 64-bit driver/library +; ${ElseIf} ${IsNativeIA32} +; ; Install i386 32-bit driver/library +; ${Else} +; Abort "Unsupported CPU architecture!" +; ${EndIf} +; +; ${If} ${IsNativeAMD64} +; File "amd64\myapp.exe" +; ${ElseIf} ${IsNativeIA32} +; ${OrIf} ${IsWow64} +; File "x86\myapp.exe" +; ${Else} +; Abort "Unsupported CPU architecture!" +; ${EndIf} +; +; DisableX64FSRedirection disables file system redirection. +; EnableX64FSRedirection enables file system redirection. +; +; SetOutPath $SYSDIR +; ${DisableX64FSRedirection} +; File something.bin # extracts to C:\Windows\System32 +; ${EnableX64FSRedirection} +; File something.bin # extracts to C:\Windows\SysWOW64 +; + +!ifndef ___X64__NSH___ +!define ___X64__NSH___ + +!include LogicLib.nsh + + +!define IsWow64 `"" IsWow64 ""` +!macro _IsWow64 _a _b _t _f + !insertmacro _LOGICLIB_TEMP + System::Call kernel32::GetCurrentProcess()p.s + System::Call kernel32::IsWow64Process2(ps,*i0s,*i) ; [Win10.1511+] 0 if not WOW64 + Push | + System::Call kernel32::IsWow64Process(p-1,*i0s) ; [WinXP+] FALSE for a 32-bit application on ARM64! + System::Int64Op + Pop $_LOGICLIB_TEMP + !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}` +!macroend + + +!define RunningX64 `"" RunningX64 ""` +!macro _RunningX64 _a _b _t _f + !if ${NSIS_PTR_SIZE} > 4 + !insertmacro LogicLib_JumpToBranch `${_t}` `${_f}` + !else + !insertmacro _IsWow64 `${_a}` `${_b}` `${_t}` `${_f}` + !endif +!macroend + + +!define GetNativeMachineArchitecture "!insertmacro GetNativeMachineArchitecture " +!macro GetNativeMachineArchitecture outvar + !define GetNativeMachineArchitecture_lbl lbl_GNMA_${__COUNTER__} + System::Call kernel32::GetCurrentProcess()p.s + System::Call kernel32::IsWow64Process2(ps,*i,*i0s) + Pop ${outvar} + IntCmp ${outvar} 0 "" ${GetNativeMachineArchitecture_lbl}_done ${GetNativeMachineArchitecture_lbl}_done + !if "${NSIS_PTR_SIZE}" <= 4 + !if "${NSIS_CHAR_SIZE}" <= 1 + System::Call 'USER32::CharNextW(w"")p.s' + Pop ${outvar} + IntPtrCmpU ${outvar} 0 "" ${GetNativeMachineArchitecture_lbl}_oldnt ${GetNativeMachineArchitecture_lbl}_oldnt + StrCpy ${outvar} 332 ; Always IMAGE_FILE_MACHINE_I386 on Win9x + Goto ${GetNativeMachineArchitecture_lbl}_done + ${GetNativeMachineArchitecture_lbl}_oldnt: + !endif + !endif + System::Call '*0x7FFE002E(&i2.s)' + Pop ${outvar} + ${GetNativeMachineArchitecture_lbl}_done: + !undef GetNativeMachineArchitecture_lbl +!macroend + +!macro _IsNativeMachineArchitecture _ignore _arc _t _f + !insertmacro _LOGICLIB_TEMP + ${GetNativeMachineArchitecture} $_LOGICLIB_TEMP + !insertmacro _= $_LOGICLIB_TEMP ${_arc} `${_t}` `${_f}` +!macroend + +!define IsNativeMachineArchitecture `"" IsNativeMachineArchitecture ` +!define IsNativeIA32 '${IsNativeMachineArchitecture} 332' ; Intel x86 +!define IsNativeAMD64 '${IsNativeMachineArchitecture} 34404' ; x86-64/x64 +!define IsNativeARM64 '${IsNativeMachineArchitecture} 43620' + + +!define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection" +!macro DisableX64FSRedirection + System::Call kernel32::Wow64EnableWow64FsRedirection(i0) +!macroend + +!define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection" +!macro EnableX64FSRedirection + System::Call kernel32::Wow64EnableWow64FsRedirection(i1) +!macroend + + +!endif # !___X64__NSH___ diff --git a/libs/NSIS/NSIS-source/NSIS.chm b/libs/NSIS/NSIS-source/NSIS.chm new file mode 100644 index 0000000000000000000000000000000000000000..e3498eb6ef935ee08f54b806b6d6dc2a6c40f1ca GIT binary patch literal 415492 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�tLDSbIR>POLTD}ht%&V4n#8S&m<8`># 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%0D#Kia$(mmZU_} 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

EST-xA9p= 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

cTcbjnFG1je<0^eOnJdHm9S)b&mp2zI_uoO$2N7 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

2G_^nod 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π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�<5KI;pDWQa}?qbONN95IaRB&mmxe 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/AdvSplash.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/AdvSplash.dll new file mode 100644 index 0000000000000000000000000000000000000000..956a558a76c506caa9eb267e5d6d9ddb769965eb GIT binary patch literal 5632 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 esVMy_IlP>Ap?8UQwYSdOjT7 zdDAW>V(O8+4Y#1Wp$_yrPjof(W3GH-Uc)17Hn91b*K66_-rX6eI)w;>JRvPQJ&Dx* zvb(?=BP*89*UdqY;FvY;-HS1s09Hnu7+$31PdT&>Yy|Pl6GfzMkSS3;s=#J#nnWTw zaF1FE>B9V#qmGc*bYHpp)eBbG{_0h-LWu1UuX7n^Oe~r1BqT}K!C*e`!aQr#5mG;k z{3H7RumbVPYGP6?4_k@pNFMK^xZGH22oEpz5)&|Ud=oCpuoaZbDK^Hls==~Dlfc8u zyfQ-KI4q{HYS{$kYv;e7>!=$xK>SE{XQf^z8lAZy9m-2Mn%SdfXYR;D@}=yhI+-sE z<=yb+$Zc-;3V2c0tE%d}>gCE{&^UMyRg}MD@O>sNsQ^PPjkmz{IBqD}Ph&fL*+NWl zvYU|bF+N9oo3!hwBp#QFUOxM&xnxm*mY-E%hcXq0YjJ z2Noypj+f1r5tQsQ>J$-CuVjca(@<3=+Y+pC06JHfIPX>Qu`*T4j!%?MYRr zEE@{wgQ{gcxcjN1Or$vsk!&3w>Iplj72$|-YDQHP%L@kN$-%2QCOhDH{Cn`6ZL3fZ zPlAe!&M8u^q89NurL-%7ExBWKPO(x2enbjXDE|V4Rxm*lM9Iyim6HN`aUQlXh(IR% zLysCFiVsrq+z;rM7xR~-fJqLN74wr)z`Xw=coQY^aoJx9FIr zaU_JW?*c9_p*geQPtOi~4+3XFkIvCY6h944wXB9{9WB&pEvAJmN##`-E=0F3f`YX` zE~1oCB_)8T6j-c0h)j^)P{0sW9tA!WFa;G6h+IwsexGK7s7K`0m4hb`bx%I(W*Eob zjrZSB)wm7^f!0N3H(s?oPh&R}s24!7#Qczzm(Xe*re@`9d*{>?Wh!cl`{vi^MU&d6 zS5HsOqmzYRuc1Jt{HbiqT8ZzUh2piy?yC67Qg#oiXZ1SLles4$8F8xgSV*<>P^xDK zbHbwi^zQnO3FX1W4A#urjn0QeB}|b>0*8v8Th;OuHA06}OBqrv)mB!cjiL8x?Id1D zZCjp&`b)>N&V7ZkU)8R-VUF{DlG& z2PgXzgR&dUP=dst)%dg#-#3b_`Vn)pL2J4_A+%4VN-t1EW)b>66Tg++RaPP{lzG!? zs+Juq3F0i!Vq>96G&ysLg|vl-!KHUj70oJ&ES7~-j;5ztdcYmOj0TUUo>h!O(`unQ ztGETrEKy663Y~xujuNf)V9vPbeWqj1uC6diJ^Jz2L84{uppt(LoVI?t6UIHyfKt9S zt*S%(vq6aLgh;-j%C#;K@{$Mel=w2SA6YL4t~FSRHwV>oUXC?Q(bU&UZPM1#w=!-e zA8V%#3C(I}VJ$oLbTMQ4n0V$C>Qh`odzr6<8RJcvcW8c=N;n(;CGOLH+H~b|YTbBX z(s8eK!)VSYttiRMG`-S<)3Nt zRlKRdodNe>3tV%7JGq~RGk5|&YmaW0d9(Ax$W-ZG1>w^9xIBuFBRxD2WN@!j?e<*YGI*(t( z+aGS7Ui2k&%*B z;x7#G=aDQikBoF24*O#FikT>FEW)Y6h(Ans>J|HTJU;c&K#>ska1W@ z6uqLJX0=C#1VZrf+vR2;C&GVT4nhXvB-Fx;mI_6u)YHs|+E=Fb8E7`l59`Y~@28

K3!J1WV_ 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 Z+MO$%tDWu6jn24pxASHz_RW{iKLND~Z+`#) literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/Math.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/Math.dll new file mode 100644 index 0000000000000000000000000000000000000000..84e8d22d6281f876160b51520202ea08e2d72dcc GIT binary patch literal 67584 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 N*8S_Iz<(DC{11EyGh6@w literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/NSISdl.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/NSISdl.dll new file mode 100644 index 0000000000000000000000000000000000000000..75543fd013d00191b129b3a9ffd71c6a89faf4bc GIT binary patch literal 15360 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/Splash.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/Splash.dll new file mode 100644 index 0000000000000000000000000000000000000000..5a03736796e9fc9a2f07d80060ffbd5bf97dc6b0 GIT binary patch literal 4096 zcmeHKeQZNPuoVTibL!OM8xh zVi@UaoV`_4{EQ~fn)neke((o=*J0EdG5QY}^$%kF;9j^%lWWX~-o5wtp3?#`%0K!C zF+SPvJm1gzywCfd^sIN|9%?2cH^3Ot0dP(s`+4?974Fu{-)N=%a}O;#;OaTFXk9Xu z7e;f&a4tR~492rr!xRQ|A!lWUR91-Iq6s5LLJ!QFcYb@lbjPun&zM*qIgMqJwb1w7 zm52<1cfBw-G6KHm`4y2YcwcHT$zvOxsR~h#%T2Kr-=!M1qZC+lf$KbHQ!RC?51d1= zb)PLaIU(G__ivMmXI*KcP|;4}c|5`94ja3IXeF%w6o?Ys{d*K5y8HKhXR`~aeHMSf z)VG`PzsV1e_r-fYwF$@|foN+Wmx!BjqA4B+gB{bD2~rr8augs*CpO}rpxZJ zRpn^-vwK>{PKuQtmZgDPjVr6C1l&LgMFx2^^Sj!0oS`J7oYeanqvONaF#lk;OTghKIEwE zuoIAMakQjQAks7^L{l~9zX2It2PDtF{`btJcGtEFcz!k#f~-#4K8-LShc=H5q5-i^0k@2 zjeG1BcwOc

qc;-TeOt-TbcY*801A>$J7O zx<;)&r1X!ZZ>hgGqzp-_MyqeW*Ua{9M4e{Yfd%T-^N^RM)V#)~mU=2FZ%C@DzOi1d z&)|IhJjBF0L8)95)mqf0O?TI?^EWqaXlSgztG-3?+ZHu7-L0)Z2g=lc!nS0+6l_{u z-_l}MQk0Jbr+~pIWF0nXXs)kQg$RLERs~s1O0S!~rV$nWk4j*{eA=N(bDi4Iw2q$q z9N10us(=@+3pWAzHjuf^P4~3a&u?m;-_*FKz8UDVRylv28kyhRw02?DqJ|a~cn+UT zuWxMhZLD9dsrAxkfaPparpbC`UenULmbjpEO;EorQ;UDvR#L2amOZ1{G)^05MB;rVn^V|@nyY-Qovy1VLymfNf9 zTh!*Jds#2e!z$OTsiyh*HOe+V^~ zKSdc*-c?{u#t@!A9R z>(*2=WKc=^?`#X#ZJ<;9Ta)z`#{INfcV}b0RSkO%$!e^xYpJiAr{vjajb}G9QMbnI z6*$_#sanMsHLbe~$XK&n<6R5Y`n8OxZDGp@wm(Aqx;0ix#^%Ng=~>#aw!TTDhsW&q zw5(@5)Nn}ozC93Wx@V+*NZLXS>hEf9(nb&|PP@OUMXk{q)J)Hm2hY=FF-`flK%|9c z>?XzHcopN>beF%5e_R!+e+akC5z938j^f+ckm*>9Z=*6*nHQ;RUTluRj}@!#+@_70 z>YrO9QPkFcF(GB`<-)cOfwK&GQ^uiyuA+P^gL7U}V^gzIZDQ1#TZlhvO2a%e5mIKurTW!(S2f->S5wudb&4`aYGwvT zP)$(g)ipL+9k9gmm*?mSHncP#d+fu;YsPfC+3G_kU1k1TtKEuk?Rxdz z3rY=|TIoFCar@Hdy4834o7QXVO;+GwuUwCYVh*g+LdvSlD4j2`@q&CJh`@^w>Y{LS?nLdw_9$xo&7`Z)=&RDOaiwXCmG zS4YmzOPk$aUyqg=nWtiKrhoIB z)~V;I`f3I`w^?h6jDQu<7P3H$;Jw@IWBrDP)%El0*0(5y7T!!NH&uotP{W#fnTpEGjz%VIWBs~HMfoS8Ru(BV8B!Idnx)fe_g@{M<^}=( z)!ZRPmV!kMcQ)5G-^*BwZp)-ZMJW#mX1J*})-R}Aw??|g8hle@)17sVm5q%}tCe&n zWiBbKOumilDd=0bp`p2H-CA_BMF~^8+oX8)+V$YrKN4>Uu|}9&u<$EajPOGAl~Tr< zw03=6bG@*_gdAri>Y7(aWbq3rPYZo0$!1m3i|f`xU{ql9`F`nnkn%V7>ZT1Ql8}-s zEih%9A+E}l)uv`l3#HDiM>~}&vVSKlsOY0hN9g$rXwVU8tgm0Mye)N>HmtsT9x9nN zY4r$>fUK2&BdJAoEvm1%8D*i|CuxhD(jSXlWv)Oo^ki%b<=3YE9ZAiH3+wNdDj}sn z=(&Ks!Mf%KbInpt2_8$ev|QM)*95+_e(idTW!4G>Th}s9iyGE}^Ft{SL@8s2$gmfh zZ3xZgL{eTEku~`7qBU~s@5Nx*>KGBnrA_B#6srkrOzXQvBm(Q}R?|X`-IAHwb;!)! zY!ox;MP{lgGbfiuFh9_Di!xnvF= zMu=QNz`dE?VD7jZ*#F;a?(gqXip^&WJ9F__G@AL}1S;NwtNBkcJsf|TZ`DyLdl&n6 z@w41Z4cW2RXLj)su(bdS^K3A&uEDQTYOd z9f-*e0u~b!A-tf`ghU@2R77i&K9ERws=l-&ZhY|p6CcVGn~1L8ckWDg_K#LgeDG}V zoVn+md+xdSp8GqyQ`rK^9^hf5+=6-f0chii$`G^+q2`)Z`!MLw;LN5Cp%Z5(JcFTj ziQFep8^u!-T35YYdA7w*v~_tN)Q!-iQrJWqHQWlt&I9^8qZVL6~30Jl3xl|ZRlf;1RsaPIXalh2owr$oh)Dl0-spw5lo zg=M90&`(%1Jk_E$iTO?2m>>0hF zHmf1*N8j(jPlk5kq`xgGJNG8#0&pj+e+d%JNbMpJ=oLIMBWy%&&3fGky$l961-Kj? zDkF4#nv@m<;>`hG4ID?ve`4@2z&{~e4)A##pE3SCbbSZ>m1XefxIc$*0^uEmz5wqF za4RsTqT(JOqb|l$j?uvkW%d}AG)}pD<+<&rPtC)_1tOqi19odrNNHW&V7jY^Tq3 zuyfB)_aHW-2eFFV)7E~l|Ii3FpaHLBp5$zU**%bL>BGvBOX-2ZUK~aM!dZd$2e77Y zMj){F9t3XKFS37kcR!XvFRsMkyRmQRaRlB%a;vlO5R^cjF9-XWm1z-*|^ zz`ek&z^?*#0b{`-E-*`Y3K$!6IS)JlJOvCC0SluJo_|!K^9O))G^PYBA>AB|M;V6R zWR8&|3`5uR@(7g$p`Oh(tjKss{ZW=vO9V`kvIV7+1cH$@Pf* z_=OnTc^>j##-t@uf60q6?2zZ#;(d+8(KsIEuaCsfeG`+*MRDo*A|^jZ;z{Vg7>W15 zo~}rI9QLk`#4W5$!f0!qBJRe`TYm7tu-xIBfmM}y2&$-|@{(DZz#Y|&FfEuo)p zsOsl7^0(w3iR0B@x61UF*CS*Bf4?4=$lb|7StqA4L-1WV_{Ml>oMMm`)nD-x4n2LF z=&KjX`m3pjyTFeNUn5&t56oi#pF8CC^|Y>PJ*|N+49dOop}Zh*v{MIGjYC++as}Cq zy=^b9jyx<6MM_pufAOo{GUctcJ`Q9S>xb~9jUn@x|;hS?mxME94c!AqUWhKjZz;1LD?PNG){V!c3gz_!HsGK1FXmw_INyof zkFhE)d^*w$z z_@ONyAcg)Ts-TZ=f{p}262ami38-8jDH#m?6A#!#Jdp4KVQOj$1=By2k9;wyZL zOAniS)FRmK$=oRub@OvLOB(ZYXAEI<%uCzZ{2$lO_$mN?)^deAmfl^Vj_2 z;}js@b=`FR@d=Fwe31$LNrU106A*OMlqcVvI5uu)v!2EabJ@d}&Q2CWeqqjaj!jJF zZ)VAsQSh^8CvszBZk%8CLfrQcPv(5u?WaxL&g6X0cAPNYc++u4+3C~bIBDMpO93Wm zTs8CJ+4zlW+_!xLS+FSpssc?w+PICp0F7!A1WMu%W_+$O;4_PoICLOhD9oAk)L9X4 zEPxc{vn`|XV*Ww;5`M&93TiP}6e;{^7pC%7VJa-W!*;#`ZzMc$3W>|ZUlbKOe8wcXEv&a{aSqO*vXIC=i zbfyBUtEMxv0iM@il*gT>%P20&XW@65O8wKQ1Io`hrSh&%`AYpFD^(taC!W{u``N1c z1sPDkgA7XKkwI1cIa#UlIVV#h@A%nj_QPtSd@eWRMCBdF^{eSei30gtnLLJvD)j^T uX`??kQ>x!_Yv|YVvgXR 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 a50nBZmvskJTnk?aK^I#))@uBF;=ce_wvB55 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Stubs/lzma_solid-x86-unicode b/libs/NSIS/NSIS-source/Stubs/lzma_solid-x86-unicode new file mode 100644 index 0000000000000000000000000000000000000000..9cd5cb4d8b5766e695d3d7d9efdcaf48bbb361e0 GIT binary patch literal 38912 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Stubs/uninst b/libs/NSIS/NSIS-source/Stubs/uninst new file mode 100644 index 0000000000000000000000000000000000000000..90d7d2252e639536b55140563ae45a294c61420e GIT binary patch literal 766 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Stubs/zlib-x86-unicode b/libs/NSIS/NSIS-source/Stubs/zlib-x86-unicode new file mode 100644 index 0000000000000000000000000000000000000000..0495d95f181b3bb85526848a7d2de0169fea3dc6 GIT binary patch literal 39936 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 z%0D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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/makensis.exe b/libs/NSIS/NSIS-source/makensis.exe new file mode 100644 index 0000000000000000000000000000000000000000..c2307f15f66a92f341f5ac4635c1a2db03967911 GIT binary patch literal 2560 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 qtL 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

QyW4%a+gF`V%s2>(A$&o%G@R@2*<0{MCi?=e#sq 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/nsisconf.nsh b/libs/NSIS/NSIS-source/nsisconf.nsh new file mode 100644 index 0000000000..48a4915908 --- /dev/null +++ b/libs/NSIS/NSIS-source/nsisconf.nsh @@ -0,0 +1,62 @@ +;------------------------ +;DEFAULT NSIS CONFIG FILE +;------------------------ + +;This header file will be included when compiling any NSIS installer, +;you can use it to add script code to every installer you compile. + +;This file is treated as if it is in the directory of your script. +;When using relative paths, the files have to be in your build directory. + +;------------------------ +;EXAMPLES +;------------------------ + +;Compress installer exehead with an executable compressor (such as UPX / Petite). + +;Paths should be absolute to allow building from any location. +;Note that your executable compressor should not compress the first icon. + +;!packhdr temp.dat '"C:\Program Files\upx\upx" -9 -q temp.dat' +;!packhdr temp.dat '"C:\Program Files\petite\petite" -9 -b0 -r** -p0 -y temp.dat' + +;------------------------ + +;Set default compressor + +;SetCompressor bzip2 + +;------------------------ + +;Change the default icons + +;Icon "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" +;UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico" + +;------------------------ + +;Define symbols + +;!define COMPANYNAME "bla" + +;------------------------ +;MODERN UI +;------------------------ + +;The Modern UI will insert the MUI_NSISCONF macro just before processing the settings. +;Here you can set default settings for the Modern UI. + +;------------------------ + +!define MUI_INSERT_NSISCONF + +!macro MUI_NSISCONF + + ;Example: Change the default Modern UI icons + + ;!ifndef MUI_ICON & MUI_UNICON + ; !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico" + ; !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico" + ;!endif + +!macroend \ No newline at end of file diff --git a/libs/oboe b/libs/oboe deleted file mode 160000 index 8740d0fc32..0000000000 --- a/libs/oboe +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8740d0fc321a55489dbbf6067298201b7d2e106d diff --git a/linux/debian/copyright b/linux/debian/copyright index 748f0c551a..4f15121552 100644 --- a/linux/debian/copyright +++ b/linux/debian/copyright @@ -7,28 +7,55 @@ Files: * Copyright: 2021-2026 The Jamulus Development Team and contributors 2004-2021 Volker Fischer and contributors -License: GPL-2+ +Comment: + As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + under AGPL 3.0 or any later version. + . + Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + This code will be licensed under GPL 3.0 (or any later version) from + 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern the + combined work, including network use provisions. +License: AGPL-3+ Files: debian/* Copyright: 2020 Tormod Volden 2020 Olivier Humbert 2019 Marc Landolt jr -License: GPL-2+ +License: GPL-3+ -License: GPL-2+ - This package is free software; you can redistribute it and/or modify +License: AGPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + . + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see + . + --------------------------------------------------------------------------- + . +License: GPL-3+ + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. . - This package is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -Comment: + . You should have received a copy of the GNU General Public License - along with this program. If not, see + along with this program. If not, see + . + On Debian systems, the complete text of the GNU Affero General Public License + version 3 can be found in "/usr/share/common-licenses/AGPL-3". . - On Debian systems, the complete text of the GNU General - Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + On Debian systems, the complete text of the GNU General Public License + version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/mac/Info-make.plist b/mac/Info-make.plist index 564a40419a..76b1e0e03e 100644 --- a/mac/Info-make.plist +++ b/mac/Info-make.plist @@ -1,5 +1,52 @@ + CFBundleName diff --git a/mac/Info-xcode.plist b/mac/Info-xcode.plist index 7efef51c0f..986bb838ed 100644 --- a/mac/Info-xcode.plist +++ b/mac/Info-xcode.plist @@ -1,5 +1,52 @@ + CFBundleName diff --git a/mac/Jamulus.entitlements b/mac/Jamulus.entitlements index 6a3a486a6f..879caa964d 100644 --- a/mac/Jamulus.entitlements +++ b/mac/Jamulus.entitlements @@ -1,5 +1,52 @@ + com.apple.security.app-sandbox diff --git a/mac/deploy_mac.sh b/mac/deploy_mac.sh index 26a338051c..caa299429c 100755 --- a/mac/deploy_mac.sh +++ b/mac/deploy_mac.sh @@ -1,4 +1,50 @@ #!/bin/bash +############################################################################## +# Copyright (c) 2010-2026 +# +# Author(s): +# Volker Fischer +# The Jamulus Development Team +# +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# +############################################################################## +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## set -eu -o pipefail # Dependency versions diff --git a/src/analyzerconsole.cpp b/src/analyzerconsole.cpp index fbc33df7d7..9ae2b75d02 100644 --- a/src/analyzerconsole.cpp +++ b/src/analyzerconsole.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -55,7 +77,7 @@ CAnalyzerConsole::CAnalyzerConsole ( CClient* pNCliP, QWidget* parent ) : setLayout ( pMainLayout ); - // error rate gaph tab + // error rate graph tab pTabWidgetBufErrRate = new QWidget(); QVBoxLayout* pTabErrRateLayout = new QVBoxLayout ( pTabWidgetBufErrRate ); diff --git a/src/analyzerconsole.h b/src/analyzerconsole.h index 4800dc1f77..c52d917fe6 100644 --- a/src/analyzerconsole.h +++ b/src/analyzerconsole.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/android/androiddebug.cpp b/src/android/androiddebug.cpp index 6aad13abce..5b53fec1bb 100644 --- a/src/android/androiddebug.cpp +++ b/src/android/androiddebug.cpp @@ -4,21 +4,43 @@ * Author(s): * Simon Tomlinson * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index d5be75a215..37ca0ff968 100644 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -481,9 +503,9 @@ void CChannelFader::SetupFaderTag ( const ESkillLevel eSkillLevel ) case SL_PROFESSIONAL: strStile += QString ( "background-color: rgb(%1, %2, %3); }" ) - .arg ( RGBCOL_R_SL_SL_PROFESSIONAL ) - .arg ( RGBCOL_G_SL_SL_PROFESSIONAL ) - .arg ( RGBCOL_B_SL_SL_PROFESSIONAL ); + .arg ( RGBCOL_R_SL_PROFESSIONAL ) + .arg ( RGBCOL_G_SL_PROFESSIONAL ) + .arg ( RGBCOL_B_SL_PROFESSIONAL ); break; default: diff --git a/src/audiomixerboard.h b/src/audiomixerboard.h index b163b17389..025feafeb6 100644 --- a/src/audiomixerboard.h +++ b/src/audiomixerboard.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/buffer.cpp b/src/buffer.cpp index 9f11e07da1..441b4121e4 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -4,24 +4,46 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Note: We are assuming here that put and get operations are secured by a mutex * and accessing does not occur at the same time. * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -42,11 +64,13 @@ void CNetBuf::Init ( const int iNewBlockSize, const int iNewNumBlocks, const boo // extract all data from buffer in temporary storage CVector> vecvecTempMemory = vecvecMemory; // allocate worst case memory by copying + int iTempSize = vecvecTempMemory.size(); // for bounds checking + if ( !bNUseSequenceNumber ) { int iPreviousDataCnt = 0; - while ( Get ( vecvecTempMemory[iPreviousDataCnt], iBlockSize ) ) + while ( iPreviousDataCnt < iTempSize && Get ( vecvecTempMemory[iPreviousDataCnt], iBlockSize ) ) { iPreviousDataCnt++; } @@ -58,6 +82,7 @@ void CNetBuf::Init ( const int iNewBlockSize, const int iNewNumBlocks, const boo // data back as the new buffer size can hold) int iDataCnt = 0; + // iPreviousDataCnt will be at most iTempSize, so an additional check on iDataCnt is not needed while ( ( iDataCnt < iPreviousDataCnt ) && Put ( vecvecTempMemory[iDataCnt], iBlockSize ) ) { iDataCnt++; @@ -66,19 +91,18 @@ void CNetBuf::Init ( const int iNewBlockSize, const int iNewNumBlocks, const boo else { // store current complete buffer state in temporary memory - CVector veciTempBlockValid ( iNumBlocksMemory ); - const uint8_t iOldSequenceNumberAtGetPos = iSequenceNumberAtGetPos; - const int iOldNumBlocksMemory = iNumBlocksMemory; - const int iOldBlockGetPos = iBlockGetPos; - int iCurBlockPos = 0; + CVector veciTempBlockValid ( iNumBlocksMemory ); + const int iOldNumBlocksMemory = iNumBlocksMemory; + const int iOldBlockGetPos = iBlockGetPos; + int iCurBlockPos = 0; - while ( iBlockGetPos < iNumBlocksMemory ) + while ( iBlockGetPos < iNumBlocksMemory && iCurBlockPos < iTempSize ) { veciTempBlockValid[iCurBlockPos] = veciBlockValid[iBlockGetPos]; vecvecTempMemory[iCurBlockPos++] = vecvecMemory[iBlockGetPos++]; } - for ( iBlockGetPos = 0; iBlockGetPos < iOldBlockGetPos; iBlockGetPos++ ) + for ( iBlockGetPos = 0; iBlockGetPos < iOldBlockGetPos && iCurBlockPos < iTempSize; iBlockGetPos++ ) { veciTempBlockValid[iCurBlockPos] = veciBlockValid[iBlockGetPos]; vecvecTempMemory[iCurBlockPos++] = vecvecMemory[iBlockGetPos]; @@ -88,10 +112,9 @@ void CNetBuf::Init ( const int iNewBlockSize, const int iNewNumBlocks, const boo Resize ( iNewNumBlocks, iNewBlockSize ); // write back the temporary data in new memory - iSequenceNumberAtGetPos = iOldSequenceNumberAtGetPos; - iBlockGetPos = 0; // per definition + iBlockGetPos = 0; // per definition - for ( int iCurPos = 0; iCurPos < std::min ( iNewNumBlocks, iOldNumBlocksMemory ); iCurPos++ ) + for ( int iCurPos = 0; iCurPos < std::min ( iNewNumBlocks, iOldNumBlocksMemory ) && iCurPos < iTempSize; iCurPos++ ) { veciBlockValid[iCurPos] = veciTempBlockValid[iCurPos]; vecvecMemory[iCurPos] = vecvecTempMemory[iCurPos]; diff --git a/src/buffer.h b/src/buffer.h index 0a30943112..0a9a4545ac 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/channel.cpp b/src/channel.cpp index 9bd409889a..7755b7ec92 100644 --- a/src/channel.cpp +++ b/src/channel.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -83,6 +105,8 @@ CChannel::CChannel ( const bool bNIsServer ) : QObject::connect ( &Protocol, &CProtocol::ClientIDReceived, this, &CChannel::ClientIDReceived ); + QObject::connect ( &Protocol, &CProtocol::RawAudioSupported, this, &CChannel::RawAudioSupported ); + QObject::connect ( &Protocol, &CProtocol::MuteStateHasChangedReceived, this, &CChannel::MuteStateHasChangedReceived ); QObject::connect ( &Protocol, &CProtocol::ChangeChanInfo, this, &CChannel::OnChangeChanInfo ); diff --git a/src/channel.h b/src/channel.h index 1567268307..eea8b0c8e2 100644 --- a/src/channel.h +++ b/src/channel.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -149,6 +171,7 @@ class CChannel : public QObject } } void CreateClientIDMes ( const int iChanID ) { Protocol.CreateClientIDMes ( iChanID ); } + void CreateRawAudioSupportedMes() { Protocol.CreateRawAudioSupportedMes(); } void CreateReqNetwTranspPropsMes() { Protocol.CreateReqNetwTranspPropsMes(); } void CreateReqSplitMessSupportMes() { Protocol.CreateReqSplitMessSupportMes(); } void CreateReqJitBufMes() { Protocol.CreateReqJitBufMes(); } @@ -272,6 +295,7 @@ public slots: void ConClientListMesReceived ( CVector vecChanInfo ); void ChanInfoHasChanged(); void ClientIDReceived ( int iChanID ); + void RawAudioSupported(); void MuteStateHasChanged ( int iChanID, bool bIsMuted ); void MuteStateHasChangedReceived ( int iChanID, bool bIsMuted ); void ReqChanInfo(); diff --git a/src/chatdlg.cpp b/src/chatdlg.cpp index b0096e5917..d49a716fb9 100644 --- a/src/chatdlg.cpp +++ b/src/chatdlg.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/chatdlg.h b/src/chatdlg.h index 1519a05265..eaad2c1cbe 100644 --- a/src/chatdlg.h +++ b/src/chatdlg.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/client.cpp b/src/client.cpp index 417f08a404..303e18781a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -4,35 +4,58 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #include "client.h" #include "settings.h" #include "util.h" +#include +#include /* Implementation *************************************************************/ CClient::CClient ( const quint16 iPortNumber, const quint16 iQosNumber, - const QString& strConnOnStartupAddress, const bool bNoAutoJackConnect, const QString& strNClientName, - const bool bNEnableIPv6, + const bool bNDisableIPv6, const bool bNMuteMeInPersonalMix ) : ChannelInfo(), strClientName ( strNClientName ), @@ -50,7 +73,8 @@ CClient::CClient ( const quint16 iPortNumber, bIsInitializationPhase ( true ), bMuteOutStream ( false ), fMuteOutStreamGain ( 1.0f ), - Socket ( &Channel, iPortNumber, iQosNumber, "", bNEnableIPv6 ), + bIPv6Available ( false ), + Socket ( &Channel, iPortNumber, iQosNumber, "", bNDisableIPv6, bIPv6Available ), Sound ( AudioCallback, this, bNoAutoJackConnect, strNClientName ), iAudioInFader ( AUD_FADER_IN_MIDDLE ), bReverbOnLeftChan ( false ), @@ -68,9 +92,10 @@ CClient::CClient ( const quint16 iPortNumber, bEnableAudioAlerts ( false ), bEnableOPUS64 ( false ), bJitterBufferOK ( true ), - bEnableIPv6 ( bNEnableIPv6 ), bMuteMeInPersonalMix ( bNMuteMeInPersonalMix ), - iServerSockBufNumFrames ( DEF_NET_BUF_SIZE_NUM_BL ) + iServerSockBufNumFrames ( DEF_NET_BUF_SIZE_NUM_BL ), + bRawAudioIsSupported ( false ), + iMyChannelID ( INVALID_INDEX ) { int iOpusError; @@ -131,6 +156,8 @@ CClient::CClient ( const quint16 iPortNumber, QObject::connect ( &Channel, &CChannel::ClientIDReceived, this, &CClient::OnClientIDReceived ); + QObject::connect ( &Channel, &CChannel::RawAudioSupported, this, &CClient::OnRawAudioSupported ); + QObject::connect ( &Channel, &CChannel::MuteStateHasChangedReceived, this, &CClient::OnMuteStateHasChangedReceived ); QObject::connect ( &Channel, &CChannel::LicenceRequired, this, &CClient::LicenceRequired ); @@ -187,13 +214,6 @@ CClient::CClient ( const quint16 iPortNumber, // start the socket (it is important to start the socket after all // initializations and connections) Socket.Start(); - - // do an immediate start if a server address is given - if ( !strConnOnStartupAddress.isEmpty() ) - { - SetServerAddr ( strConnOnStartupAddress ); - Start(); - } } // MIDI setup will be handled after settings are assigned @@ -596,7 +616,7 @@ void CClient::SetRemoteChanPan ( const int iId, const float fPan ) bool CClient::SetServerAddr ( QString strNAddr ) { CHostAddress HostAddress; - if ( NetworkUtil::ParseNetworkAddress ( strNAddr, HostAddress, bEnableIPv6 ) ) + if ( NetworkUtil::ParseNetworkAddress ( strNAddr, HostAddress, bIPv6Available ) ) { // apply address to the channel Channel.SetAddress ( HostAddress ); @@ -986,9 +1006,32 @@ void CClient::OnClientIDReceived ( int iServerChanID ) SetRemoteChanGain ( iChanID, 0, false ); } + iMyChannelID = iChanID; + emit ClientIDReceived ( iChanID ); } +void CClient::OnRawAudioSupported() +{ + if ( !bRawAudioIsSupported ) + { + const bool bWasRunning = Sound.IsRunning(); + + if ( bWasRunning ) + { + Sound.Stop(); + } + + bRawAudioIsSupported = true; + Init(); + + if ( bWasRunning ) + { + Sound.Start(); + } + } +} + void CClient::Start() { // init object @@ -1017,6 +1060,13 @@ void CClient::Stop() // disable channel Channel.SetEnable ( false ); + // Fall back to opus in case raw was used + bRawAudioIsSupported = false; + Init(); + + // no longer connected, so no valid channel ID (see GetMyChannelID()) + iMyChannelID = INVALID_INDEX; + // wait for approx. 100 ms to make sure no audio packet is still in the // network queue causing the channel to be reconnected right after having // received the disconnect message (seems not to gain much, disconnect is @@ -1046,6 +1096,118 @@ void CClient::Stop() // Allow hibernation or display dimming if the app is running again (Windows) SetThreadExecutionState ( ES_CONTINUOUS ); #endif + + // Let every caller of Stop() (the UI's Disconnect button, the JSON-RPC API, or our own + // ConnectToServer() dropping a stale connection before reconnecting) rely on this single + // signal for post-disconnect cleanup, instead of each having to duplicate it. This is in + // addition to the same signal being emitted when the channel notices a timeout on its own. + emit Disconnected(); +} + +CClient::EConnectResult CClient::ConnectToServer ( const QString& strServerAddress, QString* pstrErrorMessage ) +{ + if ( IsRunning() ) + { + Stop(); + } + + if ( !SetServerAddr ( strServerAddress ) ) + { + return CR_INVALID_ADDRESS; + } + + // Wait for the connection attempt to resolve into a known outcome, collecting the result from + // whichever signal the connection process triggers first. On success, we wait for both the client + // ID and the version info so a server that turns out to require a newer client is still caught + // rather than being missed because we already quit the loop. + bool bGotClientID = false; + bool bGotVersion = false; + EConnectResult eResult = CR_OK; + QEventLoop loop; + + auto conClientID = connect ( this, &CClient::ClientIDReceived, [&] ( int /* unused */ ) { + bGotClientID = true; + if ( bGotVersion ) + { + loop.quit(); + } + } ); + + auto conVersion = connect ( this, &CClient::VersionAndOSReceived, [&] ( COSUtil::EOpSystemType /* unused */, QString strServerVersion ) { + int iServerSuffixIndex; + QVersionNumber serverVersion = QVersionNumber::fromString ( strServerVersion, &iServerSuffixIndex ); + + int iMySuffixIndex; + QVersionNumber myVersion = QVersionNumber::fromString ( VERSION, &iMySuffixIndex ); + + // only compare release versions (a dev/beta suffix means we cannot reliably compare) + if ( ( strServerVersion.size() == iServerSuffixIndex ) && ( QVersionNumber::compare ( serverVersion, myVersion ) > 0 ) ) + { + eResult = CR_UPGRADE_REQUIRED; + loop.quit(); + return; + } + + bGotVersion = true; + if ( bGotClientID ) + { + loop.quit(); + } + } ); + + auto conFull = connect ( getConnLessProtocol(), &CProtocol::ServerFullMesReceived, [&]() { + eResult = CR_FULL; + loop.quit(); + } ); + + auto conLicence = connect ( this, &CClient::LicenceRequired, [&] ( ELicenceType /* unused */ ) { + eResult = CR_UNAUTHORIZED; + loop.quit(); + } ); + + auto conGone = connect ( getConnLessProtocol(), &CProtocol::CLDisconnection, [&] ( CHostAddress InetAddr ) { + if ( InetAddr.toString() == strServerAddress ) + { + eResult = CR_GONE; + loop.quit(); + } + } ); + + QTimer::singleShot ( 3000, &loop, &QEventLoop::quit ); + + try + { + Start(); + loop.exec(); + } + catch ( const CGenErr& generr ) + { + disconnect ( conClientID ); + disconnect ( conVersion ); + disconnect ( conFull ); + disconnect ( conLicence ); + disconnect ( conGone ); + + if ( pstrErrorMessage ) + { + *pstrErrorMessage = generr.GetErrorText(); + } + return CR_SOUND_DEVICE_ERROR; + } + + disconnect ( conClientID ); + disconnect ( conVersion ); + disconnect ( conFull ); + disconnect ( conLicence ); + disconnect ( conGone ); + + if ( ( eResult == CR_OK ) && !bGotClientID ) + { + // no response of any kind before the timeout + eResult = CR_GONE; + } + + return eResult; } void CClient::Init() @@ -1156,6 +1318,21 @@ void CClient::Init() case AQ_HIGH: iCeltNumCodedBytes = OPUS_NUM_BYTES_MONO_HIGH_QUALITY_DBLE_FRAMESIZE; break; + case AQ_RAW: + if ( bRawAudioIsSupported ) + { + // no OPUS encoding or decoding + CurOpusEncoder = nullptr; + CurOpusDecoder = nullptr; + + iCeltNumCodedBytes = sizeof ( int16_t ) * iNumAudioChannels * iOPUSFrameSizeSamples; + } + else + { + // fall back to highest OPUS quality + iCeltNumCodedBytes = OPUS_NUM_BYTES_MONO_HIGH_QUALITY_DBLE_FRAMESIZE; + } + break; } } else @@ -1175,6 +1352,21 @@ void CClient::Init() case AQ_HIGH: iCeltNumCodedBytes = OPUS_NUM_BYTES_STEREO_HIGH_QUALITY_DBLE_FRAMESIZE; break; + case AQ_RAW: + if ( bRawAudioIsSupported ) + { + // no OPUS encoding or decoding + CurOpusEncoder = nullptr; + CurOpusDecoder = nullptr; + + iCeltNumCodedBytes = sizeof ( int16_t ) * iNumAudioChannels * iOPUSFrameSizeSamples; + } + else + { + // fall back to highest OPUS quality + iCeltNumCodedBytes = OPUS_NUM_BYTES_STEREO_HIGH_QUALITY_DBLE_FRAMESIZE; + } + break; } } } @@ -1199,6 +1391,21 @@ void CClient::Init() case AQ_HIGH: iCeltNumCodedBytes = OPUS_NUM_BYTES_MONO_HIGH_QUALITY; break; + case AQ_RAW: + if ( bRawAudioIsSupported ) + { + // no OPUS encoding or decoding + CurOpusEncoder = nullptr; + CurOpusDecoder = nullptr; + + iCeltNumCodedBytes = sizeof ( int16_t ) * iNumAudioChannels * iOPUSFrameSizeSamples; + } + else + { + // fall back to highest OPUS quality + iCeltNumCodedBytes = OPUS_NUM_BYTES_MONO_HIGH_QUALITY; + } + break; } } else @@ -1218,6 +1425,21 @@ void CClient::Init() case AQ_HIGH: iCeltNumCodedBytes = OPUS_NUM_BYTES_STEREO_HIGH_QUALITY; break; + case AQ_RAW: + if ( bRawAudioIsSupported ) + { + // no OPUS encoding or decoding + CurOpusEncoder = nullptr; + CurOpusDecoder = nullptr; + + iCeltNumCodedBytes = sizeof ( int16_t ) * iNumAudioChannels * iOPUSFrameSizeSamples; + } + else + { + // fall back to highest OPUS quality + iCeltNumCodedBytes = OPUS_NUM_BYTES_STEREO_HIGH_QUALITY; + } + break; } } } @@ -1229,8 +1451,12 @@ void CClient::Init() vecZeros.Init ( iStereoBlockSizeSam, 0 ); vecsStereoSndCrdMuteStream.Init ( iStereoBlockSizeSam ); - opus_custom_encoder_ctl ( CurOpusEncoder, - OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iOPUSFrameSizeSamples ) ) ); + // In case we are connected to a non raw audio server or we don't use raw audio we need to initialze the codec + if ( CurOpusEncoder != nullptr ) + { + opus_custom_encoder_ctl ( CurOpusEncoder, + OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iOPUSFrameSizeSamples ) ) ); + } // inits for network and channel vecbyNetwData.Init ( iCeltNumCodedBytes ); @@ -1391,9 +1617,10 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) for ( i = 0, j = 0; i < iSndCrdFrameSizeFactor; i++, j += iNumAudioChannels * iOPUSFrameSizeSamples ) { - // OPUS encoding + // OPUS encoding or copying RAW audio? if ( CurOpusEncoder != nullptr ) { + // OPUS encoding if ( bMuteOutStream ) { iUnused = opus_custom_encode ( CurOpusEncoder, &vecZeros[j], iOPUSFrameSizeSamples, &vecCeltData[0], iCeltNumCodedBytes ); @@ -1403,6 +1630,20 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) iUnused = opus_custom_encode ( CurOpusEncoder, &vecsStereoSndCrd[j], iOPUSFrameSizeSamples, &vecCeltData[0], iCeltNumCodedBytes ); } } + else if ( bRawAudioIsSupported ) + { + // RAW audio + if ( bMuteOutStream ) + { + // output muted - fill with silence + memset ( &vecCeltData[0], 0, iCeltNumCodedBytes ); + } + else + { + // copy raw audio data + memcpy ( &vecCeltData[0], &vecsStereoSndCrd[j], iCeltNumCodedBytes ); + } + } // send coded audio through the network Channel.PrepAndSendPacket ( &Socket, vecCeltData, iCeltNumCodedBytes ); @@ -1437,11 +1678,26 @@ void CClient::ProcessAudioDataIntern ( CVector& vecsStereoSndCrd ) bJitterBufferOK = false; } - // OPUS decoding + // OPUS decoding or copying RAW audio? if ( CurOpusDecoder != nullptr ) { + // OPUS decoding iUnused = opus_custom_decode ( CurOpusDecoder, pCurCodedData, iCeltNumCodedBytes, &vecsStereoSndCrd[j], iOPUSFrameSizeSamples ); } + else if ( bRawAudioIsSupported ) + { + // RAW audio + if ( pCurCodedData != nullptr ) + { + // copy raw audio data + memcpy ( &vecsStereoSndCrd[j], pCurCodedData, iCeltNumCodedBytes ); + } + else + { + // missing audio - fill with silence + memset ( &vecsStereoSndCrd[j], 0, iCeltNumCodedBytes ); + } + } } // for muted stream we have to add our local data here @@ -1488,7 +1744,7 @@ int CClient::EstimatedOverallDelay ( const int iPingTimeMs ) // length. Since that is usually not the case but the buffers are usually // a bit larger than necessary, we introduce some factor for compensation. // Consider the jitter buffer on the client and on the server side, too. - const float fTotalJitterBufferDelayMs = fSystemBlockDurationMs * ( GetSockBufNumFrames() + GetServerSockBufNumFrames() ) * 0.7f; + const float fTotalJitterBufferDelayMs = fSystemBlockDurationMs * ( GetSockBufNumFrames() + GetServerSockBufNumFrames() ) * JITTBUF_COMP_FACTOR; // consider delay introduced by the sound card conversion buffer by using // "GetSndCrdConvBufAdditionalDelayMonoBlSize()" @@ -1519,7 +1775,7 @@ int CClient::EstimatedOverallDelay ( const int iPingTimeMs ) const float fDelayToFillNetworkPacketsMs = GetSystemMonoBlSize() * 1000.0f / SYSTEM_SAMPLE_RATE_HZ; // OPUS additional delay at small frame sizes is half a frame size - const float fAdditionalAudioCodecDelayMs = fSystemBlockDurationMs / 2; + const float fAdditionalAudioCodecDelayMs = CurOpusDecoder != nullptr ? fSystemBlockDurationMs / 2 : 0.0f; const float fTotalBufferDelayMs = fDelayToFillNetworkPacketsMs + fTotalJitterBufferDelayMs + fTotalSoundCardDelayMs + fAdditionalAudioCodecDelayMs; diff --git a/src/client.h b/src/client.h index 6139ef599e..213f8a6eb0 100644 --- a/src/client.h +++ b/src/client.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -128,10 +150,9 @@ class CClient : public QObject public: CClient ( const quint16 iPortNumber, const quint16 iQosNumber, - const QString& strConnOnStartupAddress, const bool bNoAutoJackConnect, const QString& strNClientName, - const bool bNEnableIPv6, + const bool bNDisableIPv6, const bool bNMuteMeInPersonalMix ); virtual ~CClient(); @@ -142,6 +163,38 @@ class CClient : public QObject bool IsCallbackEntered() const { return Sound.IsCallbackEntered(); } bool SetServerAddr ( QString strNAddr ); + // The address most recently passed to SetServerAddr()/ConnectToServer(), i.e. the server we are + // currently connected (or attempting to connect) to. + const CHostAddress& GetServerAddress() const { return Channel.GetAddress(); } + + // The client channel ID assigned to us by the server (see the ClientIDReceived signal), or + // INVALID_INDEX if not currently connected. + int GetMyChannelID() const { return iMyChannelID; } + + // Outcome of ConnectToServer(). Used by both the client UI and the JSON-RPC API so they agree on + // what a connection attempt resulted in. + enum EConnectResult + { + CR_OK, + CR_INVALID_ADDRESS, // strServerAddress could not be parsed + CR_SOUND_DEVICE_ERROR, // the audio interface could not be started (see pstrErrorMessage) + CR_UNAUTHORIZED, // the server requires accepting a licence before use + CR_GONE, // the server did not respond, or told us it is disconnecting us + CR_UPGRADE_REQUIRED, // the server requires a newer protocol version than this client supports + CR_FULL // the server is full + }; + + // Sets the server address and starts the client, then blocks for a short time (up to a few seconds) + // while the outcome of the connection attempt is determined. On CR_SOUND_DEVICE_ERROR, *pstrErrorMessage + // (if given) is set to a human-readable description of the audio failure. Does not stop the client on a + // non-CR_OK outcome; callers decide whether/when to give up on the attempt (e.g. the UI keeps the + // connection alive on CR_UNAUTHORIZED so the licence dialog, wired independently to LicenceRequired, + // can still let the user accept and continue). + EConnectResult ConnectToServer ( const QString& strServerAddress, QString* pstrErrorMessage = nullptr ); + + // IPv6 Available + bool IsIPv6Available() { return bIPv6Available; } + double GetLevelForMeterdBLeft() { return SignalLevelMeter.GetLevelForMeterdBLeftOrMono(); } double GetLevelForMeterdBRight() { return SignalLevelMeter.GetLevelForMeterdBRight(); } @@ -304,6 +357,7 @@ class CClient : public QObject // settings CChannelCoreInfo ChannelInfo; QString strClientName; + void OnRPCInMuteMyself ( bool bMute ) { OnControllerInMuteMyself ( bMute ); } public: void SetSettings ( CClientSettings* settings ); @@ -369,7 +423,9 @@ class CClient : public QObject float fMuteOutStreamGain; CVector vecCeltData; - CHighPrioSocket Socket; + bool bIPv6Available; // must be before Socket - passed by reference to Socket + CHighPrioSocket Socket; + CSound Sound; CStereoSignalLevelMeter SignalLevelMeter; @@ -405,12 +461,15 @@ class CClient : public QObject bool bEnableOPUS64; bool bJitterBufferOK; - bool bEnableIPv6; bool bMuteMeInPersonalMix; QMutex MutexDriverReinit; // server settings - int iServerSockBufNumFrames; + int iServerSockBufNumFrames; + bool bRawAudioIsSupported; + + // see GetMyChannelID() + int iMyChannelID; // for ping measurement QElapsedTimer PreciseTime; @@ -453,6 +512,7 @@ protected slots: void OnControllerInFaderIsMute ( int iChannelIdx, bool bIsMute ); void OnControllerInMuteMyself ( bool bMute ); void OnClientIDReceived ( int iServerChanID ); + void OnRawAudioSupported(); void OnMuteStateHasChangedReceived ( int iServerChanID, bool bIsMuted ); void OnCLChannelLevelListReceived ( CHostAddress InetAddr, CVector vecLevelList ); void OnConClientListMesReceived ( CVector vecChanInfo ); diff --git a/src/clientdlg.cpp b/src/clientdlg.cpp index 6063547896..36ff4f8a74 100644 --- a/src/clientdlg.cpp +++ b/src/clientdlg.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -32,19 +54,17 @@ CClientDlg::CClientDlg ( CClient* pNCliP, const bool bNewShowComplRegConnList, const bool bShowAnalyzerConsole, const bool bMuteStream, - const bool bNEnableIPv6, QWidget* parent ) : CBaseDlg ( parent, Qt::Window ), // use Qt::Window to get min/max window buttons pClient ( pNCliP ), pSettings ( pNSetP ), bConnectDlgWasShown ( false ), bDetectFeedback ( false ), - bEnableIPv6 ( bNEnableIPv6 ), eLastRecorderState ( RS_UNDEFINED ), // for SetMixerBoardDeco eLastDesign ( GD_DEFAULT ), // " ClientSettingsDlg ( pNCliP, pNSetP, parent ), ChatDlg ( parent ), - ConnectDlg ( pNSetP, bNewShowComplRegConnList, bNEnableIPv6, parent ), + ConnectDlg ( pNCliP, pNSetP, bNewShowComplRegConnList, parent ), AnalyzerConsole ( pNCliP, parent ) { setupUi ( this ); @@ -597,12 +617,12 @@ CClientDlg::CClientDlg ( CClient* pNCliP, // Don't use SRV resolution when resolving update servers. - if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK1_ADDRESS, UpdateServerHostAddress, bEnableIPv6 ) ) + if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK1_ADDRESS, UpdateServerHostAddress, pClient->IsIPv6Available() ) ) { pClient->CreateCLServerListReqVerAndOSMes ( UpdateServerHostAddress ); } - if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK2_ADDRESS, UpdateServerHostAddress, bEnableIPv6 ) ) + if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK2_ADDRESS, UpdateServerHostAddress, pClient->IsIPv6Available() ) ) { pClient->CreateCLServerListReqVerAndOSMes ( UpdateServerHostAddress ); } @@ -825,34 +845,38 @@ void CClientDlg::OnVersionAndOSReceived ( COSUtil::EOpSystemType, QString strVer void CClientDlg::OnCLVersionAndOSReceived ( CHostAddress InetAddr, COSUtil::EOpSystemType, QString strVersion ) { - // display version in connect dialog - ConnectDlg.SetServerVersionResult ( InetAddr, strVersion ); - - // update check + // if connect dialog showing, pass version to it, and don't do update check + if ( bConnectDlgWasShown ) + { + // display version in connect dialog + ConnectDlg.SetServerVersionResult ( InetAddr, strVersion ); + } + else + { + // update check #if ( QT_VERSION >= QT_VERSION_CHECK( 5, 6, 0 ) ) && !defined( DISABLE_VERSION_CHECK ) - int mySuffixIndex; - QVersionNumber myVersion = QVersionNumber::fromString ( VERSION, &mySuffixIndex ); + int mySuffixIndex; + QVersionNumber myVersion = QVersionNumber::fromString ( VERSION, &mySuffixIndex ); - int serverSuffixIndex; - QVersionNumber serverVersion = QVersionNumber::fromString ( strVersion, &serverSuffixIndex ); + int serverSuffixIndex; + QVersionNumber serverVersion = QVersionNumber::fromString ( strVersion, &serverSuffixIndex ); - // only compare if the server version has no suffix (such as dev or beta) - if ( strVersion.size() == serverSuffixIndex && QVersionNumber::compare ( serverVersion, myVersion ) > 0 ) - { - // show the label and hide it after one minute again - lblUpdateCheck->show(); - QTimer::singleShot ( 60000, [this]() { lblUpdateCheck->hide(); } ); - } + // only compare if the server version has no suffix (such as dev or beta) + if ( strVersion.size() == serverSuffixIndex && QVersionNumber::compare ( serverVersion, myVersion ) > 0 ) + { + // show the label and hide it after one minute again + lblUpdateCheck->show(); + QTimer::singleShot ( 60000, [this]() { lblUpdateCheck->hide(); } ); + } #endif + } } void CClientDlg::OnChatTextReceived ( QString strChatText ) { if ( pSettings->bEnableAudioAlerts ) { - QSoundEffect* sf = new QSoundEffect(); - sf->setSource ( QUrl::fromLocalFile ( ":sounds/res/sounds/new_message.wav" ) ); - sf->play(); + PlayAudioAlert ( QUrl::fromLocalFile ( ":sounds/res/sounds/new_message.wav" ) ); } ChatDlg.AddChatText ( strChatText ); @@ -901,9 +925,7 @@ void CClientDlg::OnNumClientsChanged ( int iNewNumClients ) { if ( pSettings->bEnableAudioAlerts && iNewNumClients > iClients ) { - QSoundEffect* sf = new QSoundEffect(); - sf->setSource ( QUrl::fromLocalFile ( ":sounds/res/sounds/new_user.wav" ) ); - sf->play(); + PlayAudioAlert ( QUrl::fromLocalFile ( ":sounds/res/sounds/new_user.wav" ) ); } // iNewNumClients will be zero on the first trigger of this signal handler when connecting to a new server. @@ -1214,65 +1236,123 @@ void CClientDlg::OnCLPingTimeWithNumClientsReceived ( CHostAddress InetAddr, int ConnectDlg.SetPingTimeAndNumClientsResult ( InetAddr, iPingTime, iNumClients ); } +// NOTE (deferred, not yet implemented): Connect()/OnClientIDReceived()/OnDisconnected() are event-driven +// (they react to a state *transition*). A future pull-based CClientDlg::Refresh() - callable any time to +// make the GUI match current CClient state, e.g. on startup - is a natural next step, but two gaps need a +// decision first: +// 1. No stored "friendly" server display name: CClient only exposes the raw server address +// (GetServerAddress()); the nicer name (e.g. a server list entry's name) is a transient parameter to +// this method, never retained. A stateless Refresh() would have to fall back to the raw address, which +// is a real (if minor) behavioural difference from what this method shows today. +// 2. MainMixerBoard->HideAll() (in OnDisconnected()) calls StoreAllFaderSettings() first, a one-time +// persistence action, not pure state-reflection; and the timer .start() calls, while idempotent, are +// side effects rather than display updates. A strict "reads state, alters nothing" Refresh() would +// need to either exclude these or explicitly accept them as in-scope. +// This is left as-is intentionally for now: unifying these into Refresh() touches the same connect/disconnect +// code paths already reworked to fix the JSON-RPC API/GUI sync bugs, and is a large enough behavioural change +// to warrant its own separate, focused review. void CClientDlg::Connect ( const QString& strSelectedAddress, const QString& strMixerBoardLabel ) { - // set address and check if address is valid - if ( pClient->SetServerAddr ( strSelectedAddress ) ) + // Delegate to the same method the JSON-RPC API's jamulusclient/connect uses (CClient::ConnectToServer), + // so both agree on what constitutes success vs. each failure mode. This blocks for a short time (up to a + // few seconds) while the outcome is determined, so disable the button for the duration to avoid + // re-entering this method via a second click while we are waiting. + butConnect->setEnabled ( false ); + QString strErrorMessage; + const CClient::EConnectResult eResult = pClient->ConnectToServer ( strSelectedAddress, &strErrorMessage ); + butConnect->setEnabled ( true ); + + switch ( eResult ) { - // try to start client, if error occurred, do not go in - // running state but show error message - try - { - if ( !pClient->IsRunning() ) - { - pClient->Start(); - } - } + case CClient::CR_INVALID_ADDRESS: + // matches the previous behaviour: silently do nothing for an invalid address + return; - catch ( const CGenErr& generr ) - { - // show error message and return the function - QMessageBox::critical ( this, APP_NAME, generr.GetErrorText(), "Close", nullptr ); - return; - } + case CClient::CR_SOUND_DEVICE_ERROR: + // show error message and return the function + QMessageBox::critical ( this, APP_NAME, strErrorMessage, "Close", nullptr ); + return; - // hide label connect to server - lblConnectToServer->hide(); - lbrInputLevelL->setEnabled ( true ); - lbrInputLevelR->setEnabled ( true ); + case CClient::CR_GONE: + pClient->Stop(); + QMessageBox::warning ( this, APP_NAME, tr ( "The server did not respond. It may no longer be available." ), "Close", nullptr ); + return; - // change connect button text to "disconnect" - butConnect->setText ( tr ( "&Disconnect" ) ); + case CClient::CR_FULL: + pClient->Stop(); + QMessageBox::warning ( this, APP_NAME, tr ( "This server is full." ), "Close", nullptr ); + return; - // set server name in audio mixer group box title - MainMixerBoard->SetServerName ( strMixerBoardLabel ); + case CClient::CR_UNAUTHORIZED: + // handled by OnLicenceRequired (wired directly to CClient::LicenceRequired), which shows the + // licence dialog and disconnects if declined; the connection stays up until then. + break; - // start timer for level meter bar and ping time measurement - TimerSigMet.start ( LEVELMETER_UPDATE_TIME_MS ); - TimerBuffersLED.start ( BUFFER_LED_UPDATE_TIME_MS ); - TimerPing.start ( PING_UPDATE_TIME_MS ); - TimerCheckAudioDeviceOk.start ( CHECK_AUDIO_DEV_OK_TIME_MS ); // is single shot timer + case CClient::CR_UPGRADE_REQUIRED: + // advisory only, similar to the existing "update available" notice; does not block the connection + QMessageBox::information ( + this, APP_NAME, tr ( "This server is running a newer version of Jamulus than you are. Consider upgrading." ), "Close", nullptr ); + break; - // audio feedback detection - if ( pSettings->bEnableFeedbackDetection ) - { - TimerDetectFeedback.start ( DETECT_FEEDBACK_TIME_MS ); // single shot timer - bDetectFeedback = true; - } + case CClient::CR_OK: + break; + } + + // The rest of the "we are now connected" GUI setup (button text, timers, etc.) happens in + // OnClientIDReceived, triggered by CClient::ClientIDReceived, which fires regardless of whether + // this method or the JSON-RPC API's jamulusclient/connect initiated the connection. That handler + // does not know a human-friendly display name, so override its default (the raw server address) + // with the one this dialog knows about (e.g. the server list's name for the chosen entry). + MainMixerBoard->SetServerName ( strMixerBoardLabel ); +} + +void CClientDlg::OnClientIDReceived ( int iChanID ) +{ + MainMixerBoard->SetMyChannelID ( iChanID ); + + // "we are now connected" GUI setup. Triggered here (rather than directly in Connect()) so it also + // applies when the JSON-RPC API's jamulusclient/connect established the connection instead. We have + // no human-friendly display name at this point, so default to the raw server address; Connect() + // overrides this afterwards with a nicer name when it has one. + MainMixerBoard->SetServerName ( pClient->GetServerAddress().toString() ); + + // hide label connect to server + lblConnectToServer->hide(); + lbrInputLevelL->setEnabled ( true ); + lbrInputLevelR->setEnabled ( true ); + + // change connect button text to "disconnect" + butConnect->setText ( tr ( "&Disconnect" ) ); + + // start timer for level meter bar and ping time measurement + TimerSigMet.start ( LEVELMETER_UPDATE_TIME_MS ); + TimerBuffersLED.start ( BUFFER_LED_UPDATE_TIME_MS ); + TimerPing.start ( PING_UPDATE_TIME_MS ); + TimerCheckAudioDeviceOk.start ( CHECK_AUDIO_DEV_OK_TIME_MS ); // is single shot timer + + // audio feedback detection + if ( pSettings->bEnableFeedbackDetection ) + { + TimerDetectFeedback.start ( DETECT_FEEDBACK_TIME_MS ); // single shot timer + bDetectFeedback = true; } } void CClientDlg::Disconnect() { - // only stop client if currently running, in case we received - // the stopped message, the client is already stopped but the - // connect/disconnect button and other GUI controls must be - // updated + // Just stop the client if it is currently running; the actual GUI cleanup happens in + // OnDisconnected(), triggered by CClient::Disconnected. CClient::Stop() always emits that + // signal, so this reaches the same cleanup regardless of who else calls Stop() on our + // behalf (the JSON-RPC API's jamulusclient/disconnect, or CClient::ConnectToServer() + // dropping a stale connection before reconnecting). if ( pClient->IsRunning() ) { pClient->Stop(); } +} +void CClientDlg::OnDisconnected() +{ // change connect button text to "connect" butConnect->setText ( tr ( "C&onnect" ) ); @@ -1416,6 +1496,7 @@ void CClientDlg::SetGUIDesign ( const EGUIDesign eNewDesign ) void CClientDlg::SetMeterStyle ( const EMeterStyle eNewMeterStyle ) { // apply MeterStyle to current window + // Note: input meter uses big LED and wide bar even in narrow mode switch ( eNewMeterStyle ) { case MT_LED_STRIPE: @@ -1424,24 +1505,16 @@ void CClientDlg::SetMeterStyle ( const EMeterStyle eNewMeterStyle ) break; case MT_LED_ROUND_BIG: + case MT_LED_ROUND_SMALL: lbrInputLevelL->SetLevelMeterType ( CLevelMeter::MT_LED_ROUND_BIG ); lbrInputLevelR->SetLevelMeterType ( CLevelMeter::MT_LED_ROUND_BIG ); break; case MT_BAR_WIDE: - lbrInputLevelL->SetLevelMeterType ( CLevelMeter::MT_BAR_WIDE ); - lbrInputLevelR->SetLevelMeterType ( CLevelMeter::MT_BAR_WIDE ); - break; - case MT_BAR_NARROW: lbrInputLevelL->SetLevelMeterType ( CLevelMeter::MT_BAR_WIDE ); lbrInputLevelR->SetLevelMeterType ( CLevelMeter::MT_BAR_WIDE ); break; - - case MT_LED_ROUND_SMALL: - lbrInputLevelL->SetLevelMeterType ( CLevelMeter::MT_LED_ROUND_BIG ); - lbrInputLevelR->SetLevelMeterType ( CLevelMeter::MT_LED_ROUND_BIG ); - break; } // also apply MeterStyle to child GUI controls diff --git a/src/clientdlg.h b/src/clientdlg.h index a5d327676a..c8b30b4025 100644 --- a/src/clientdlg.h +++ b/src/clientdlg.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -38,7 +60,6 @@ #include #include #include -#include #if QT_VERSION >= QT_VERSION_CHECK( 5, 6, 0 ) # include #endif @@ -83,7 +104,6 @@ class CClientDlg : public CBaseDlg, private Ui_CClientDlgBase const bool bNewShowComplRegConnList, const bool bShowAnalyzerConsole, const bool bMuteStream, - const bool bNEnableIPv6, QWidget* parent = nullptr ); protected: @@ -108,7 +128,6 @@ class CClientDlg : public CBaseDlg, private Ui_CClientDlgBase bool bConnected; bool bConnectDlgWasShown; bool bDetectFeedback; - bool bEnableIPv6; ERecorderState eLastRecorderState; EGUIDesign eLastDesign; QTimer TimerSigMet; @@ -225,7 +244,7 @@ public slots: ConnectDlg.SetConnClientsList ( InetAddr, vecChanInfo ); } - void OnClientIDReceived ( int iChanID ) { MainMixerBoard->SetMyChannelID ( iChanID ); } + void OnClientIDReceived ( int iChanID ); void OnMuteStateHasChangedReceived ( int iChanID, bool bIsMuted ) { MainMixerBoard->SetRemoteFaderIsMute ( iChanID, bIsMuted ); } @@ -235,7 +254,7 @@ public slots: } void OnConnectDlgAccepted(); - void OnDisconnected() { Disconnect(); } + void OnDisconnected(); void OnGUIDesignChanged(); void OnMeterStyleChanged(); void OnRecorderStateReceived ( ERecorderState eRecorderState ); diff --git a/src/clientrpc.cpp b/src/clientrpc.cpp index c698106325..e9ddde1e9b 100644 --- a/src/clientrpc.cpp +++ b/src/clientrpc.cpp @@ -5,21 +5,43 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -110,8 +132,9 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe /// @param {string} params.servers[*].city - Server city. connect ( pClient->getConnLessProtocol(), &CProtocol::CLServerListReceived, - [=] ( CHostAddress /* unused */, CVector vecServerInfo ) { - QJsonArray arrServerInfo; + [=] ( CHostAddress InetAddr, CVector vecServerInfo ) { + QJsonArray arrServerInfo; + QSet setServerAddresses; for ( const auto& serverInfo : vecServerInfo ) { QJsonObject objServerInfo{ @@ -122,8 +145,12 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe { "city", serverInfo.strCity }, }; arrServerInfo.append ( objServerInfo ); + setServerAddresses.insert ( serverInfo.HostAddr.toString() ); pClient->CreateCLServerListPingMes ( serverInfo.HostAddr ); } + // remember which servers this directory listed, so jamulusclient/connect can tell + // a delisted server apart from one that was never seen in the first place + m_mapDirectoryServers[InetAddr.toString()] = setServerAddresses; pRpcServer->BroadcastNotification ( "jamulusclient/serverListReceived", QJsonObject{ { "servers", arrServerInfo }, @@ -144,7 +171,14 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe /// @rpc_notification jamulusclient/disconnected /// @brief Emitted when the client is disconnected from the server. /// @param {object} params - No parameters (empty object). - connect ( pClient, &CClient::Disconnected, [=]() { pRpcServer->BroadcastNotification ( "jamulusclient/disconnected", QJsonObject{} ); } ); + connect ( pClient, &CClient::Disconnected, [=]() { + // keep our record of the current connection (used by jamulusclient/disconnect) in sync, + // whether the disconnect was initiated by us, the server, or the desktop UI + m_strConnectedDirectory.clear(); + m_strConnectedServer.clear(); + m_strConnectStatus.clear(); + pRpcServer->BroadcastNotification ( "jamulusclient/disconnected", QJsonObject{} ); + } ); /// @rpc_notification jamulusclient/recorderState /// @brief Emitted when the client is connected to a server whose recorder state changes. @@ -216,6 +250,177 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe Q_UNUSED ( params ); } ); + /// @rpc_method jamulusclient/setCurrentDirectory + /// @brief Selects the current directory, as returned by jamulusclient/getCurrentDirectory and used as the + /// default in jamulusclient/pollServerList. + /// @param {string} params.directory - Socket address of the directory to select, in the same format as the + /// strings returned by jamulusclient/getDirectories (and accepted as params.directory by + /// jamulusclient/pollServerList). Must be one of the directories returned by jamulusclient/getDirectories. + /// @result {string} result - "ok" or "Not Found" if the given directory is not one of the known directories. + pRpcServer->HandleMethod ( "jamulusclient/setCurrentDirectory", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto jsonDirectory = params["directory"]; + if ( !jsonDirectory.isString() ) + { + response["error"] = CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: directory is not a string" ); + return; + } + + const QString strDirectory = jsonDirectory.toString(); + + // built-in directories, in the same order as jamulusclient/getDirectories + for ( int i = AT_DEFAULT; i < AT_CUSTOM; i++ ) + { + if ( NetworkUtil::GetDirectoryAddress ( static_cast ( i ), "" ) == strDirectory ) + { + m_pSettings->eDirectoryType = static_cast ( i ); + m_pSettings->iCustomDirectoryIndex = 0; + response["result"] = "ok"; + return; + } + } + + // custom directories + for ( int i = 0; i < MAX_NUM_SERVER_ADDR_ITEMS; i++ ) + { + if ( !m_pSettings->vstrDirectoryAddress[i].isEmpty() && m_pSettings->vstrDirectoryAddress[i] == strDirectory ) + { + m_pSettings->eDirectoryType = AT_CUSTOM; + m_pSettings->iCustomDirectoryIndex = i; + response["result"] = "ok"; + return; + } + } + + response["result"] = "Not Found"; + } ); + + /// @rpc_method jamulusclient/connect + /// @brief Connects to a server previously discovered via jamulusclient/pollServerList on the given directory. + /// Blocks for a short time (up to a few seconds) while the outcome of the connection attempt is determined. + /// @param {string} params.directory - Socket address of the directory the server was discovered from. Must + /// have already been queried via jamulusclient/pollServerList. + /// @param {string} params.server - Socket address of the server to connect to, as returned in + /// params.servers[*].address of jamulusclient/serverListReceived. + /// @result {string} result - "ok"; "Not Found" if the directory hasn't been polled, or the server address is + /// invalid; "Unauthorized" if the server requires accepting a licence, which isn't supported over this API; + /// "Gone (server no longer listed)" if the server is not, or is no longer, present in the directory's server + /// list; "Upgrade Required (obsolete protocol, upgrade Jamulus)" if the server requires a newer protocol + /// version than this client supports; or "Insufficient Storage (Full)" if the server is full. If the local + /// audio interface fails to start, an error is returned instead of a result. + pRpcServer->HandleMethod ( "jamulusclient/connect", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto jsonDirectory = params["directory"]; + auto jsonServer = params["server"]; + if ( !jsonDirectory.isString() || !jsonServer.isString() ) + { + response["error"] = + CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: directory and server must be strings" ); + return; + } + + // Resolve the directory the same way jamulusclient/pollServerList does, so it matches the key that the + // jamulusclient/serverListReceived handler cached the server list under. + CHostAddress haDirectoryAddress; + const QString strDirectoryKey = + NetworkUtil::ParseNetworkAddress ( jsonDirectory.toString(), haDirectoryAddress, false ) ? haDirectoryAddress.toString() : QString(); + + if ( strDirectoryKey.isEmpty() || !m_mapDirectoryServers.contains ( strDirectoryKey ) ) + { + response["result"] = "Not Found"; + return; + } + + const QString strServer = jsonServer.toString(); + + if ( !m_mapDirectoryServers[strDirectoryKey].contains ( strServer ) ) + { + response["result"] = "Gone (server no longer listed)"; + return; + } + + // Delegate the actual connection attempt to the same method the desktop UI's "Connect" button uses + // (CClientDlg::Connect), so both agree on what constitutes success vs. each failure mode. + QString strErrorMessage; + const CClient::EConnectResult eResult = pClient->ConnectToServer ( strServer, &strErrorMessage ); + + if ( eResult == CClient::CR_SOUND_DEVICE_ERROR ) + { + response["error"] = CRpcServer::CreateJsonRpcError ( 1, "Could not start the audio interface: " + strErrorMessage ); + return; + } + + switch ( eResult ) + { + case CClient::CR_OK: + response["result"] = "ok"; + break; + case CClient::CR_INVALID_ADDRESS: + response["result"] = "Not Found"; + break; + case CClient::CR_UNAUTHORIZED: + response["result"] = "Unauthorized"; + break; + case CClient::CR_GONE: + response["result"] = "Gone (server no longer listed)"; + break; + case CClient::CR_UPGRADE_REQUIRED: + response["result"] = "Upgrade Required (obsolete protocol, upgrade Jamulus)"; + break; + case CClient::CR_FULL: + response["result"] = "Insufficient Storage (Full)"; + break; + default: + break; + } + + // Unlike the desktop UI (which keeps the connection alive on CR_UNAUTHORIZED/CR_UPGRADE_REQUIRED so + // the user can interact with the licence dialog, or simply because it never blocked on stale + // versions), there is no interactive fallback here, so any non-ok outcome ends the attempt. + if ( ( eResult != CClient::CR_OK ) && pClient->IsRunning() ) + { + pClient->Stop(); + } + + m_strConnectedDirectory = jsonDirectory.toString(); + m_strConnectedServer = strServer; + m_strConnectStatus = response["result"].toString(); + } ); + + /// @rpc_method jamulusclient/disconnect + /// @brief Disconnects from the server that was connected via jamulusclient/connect. + /// @param {string} params.directory - Socket address of the directory that was passed to jamulusclient/connect. + /// @param {string} params.server - Socket address of the server that was passed to jamulusclient/connect. + /// @result {string} result - "ok"; "Not Found" if params.directory/params.server do not match the connection + /// established by the most recent jamulusclient/connect call; or, reflecting the outcome of that call, + /// "Unauthorized", "Gone (server no longer listed)", or "Upgrade Required (obsolete protocol, upgrade + /// Jamulus)". + pRpcServer->HandleMethod ( "jamulusclient/disconnect", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto jsonDirectory = params["directory"]; + auto jsonServer = params["server"]; + if ( !jsonDirectory.isString() || !jsonServer.isString() ) + { + response["error"] = + CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: directory and server must be strings" ); + return; + } + + if ( ( jsonDirectory.toString() != m_strConnectedDirectory ) || ( jsonServer.toString() != m_strConnectedServer ) ) + { + response["result"] = "Not Found"; + return; + } + + // capture before Stop(): it synchronously emits CClient::Disconnected, which our own handler + // above (kept in sync with the desktop UI's cleanup) reacts to by clearing these fields + const QString strPreviousStatus = m_strConnectStatus; + + if ( pClient->IsRunning() ) + { + pClient->Stop(); + } + + response["result"] = strPreviousStatus; + } ); + /// @rpc_method jamulus/getMode /// @brief Returns the current mode, i.e. whether Jamulus is running as a server or client. /// @param {object} params - No parameters (empty object). @@ -239,7 +444,7 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe /// @rpc_method jamulusclient/getChannelInfo /// @brief Returns the client's profile information. /// @param {object} params - No parameters (empty object). - /// @result {number} result.id - The channel ID. + /// @result {number} result.id - The channel ID assigned by the server, or -1 if not currently connected. /// @result {string} result.name - The musician’s name. /// @result {string} result.skillLevel - The musician’s skill level (beginner, intermediate, expert, or null). /// @result {number} result.countryId - The musician’s country ID (see QLocale::Country). @@ -250,7 +455,7 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe /// @result {string} result.skillLevel - Your skill level (beginner, intermediate, expert, or null). pRpcServer->HandleMethod ( "jamulusclient/getChannelInfo", [=] ( const QJsonObject& params, QJsonObject& response ) { QJsonObject result{ - // TODO: We cannot include "id" here is pClient->ChannelInfo is a CChannelCoreInfo which lacks that field. + { "id", pClient->GetMyChannelID() }, { "name", pClient->ChannelInfo.strName }, { "countryId", pClient->ChannelInfo.eCountry }, { "country", QLocale::countryToString ( pClient->ChannelInfo.eCountry ) }, @@ -508,6 +713,23 @@ CClientRpc::CClientRpc ( CClient* pClient, CClientSettings* pSettings, CRpcServe response["result"] = jsonDevices; Q_UNUSED ( params ); } ); + + /// @rpc_method jamulusclient/setMuted + /// @brief Mutes or unmutes the client. + /// @param {boolean} params.muted - muted (true or false). + /// @result {string} result - Always "ok". + pRpcServer->HandleMethod ( "jamulusclient/setMuted", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto muted = params["muted"]; + if ( !muted.isBool() ) + { + response["error"] = CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: muted is not a boolean" ); + return; + } + + pClient->OnRPCInMuteMyself ( muted.toBool() ); + + response["result"] = "ok"; + } ); } QJsonValue CClientRpc::SerializeSkillLevel ( ESkillLevel eSkillLevel ) diff --git a/src/clientrpc.h b/src/clientrpc.h index 1483696fcf..9e6d2116ba 100644 --- a/src/clientrpc.h +++ b/src/clientrpc.h @@ -5,26 +5,49 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #pragma once +#include #include "client.h" #include "util.h" #include "rpcserver.h" @@ -42,4 +65,14 @@ class CClientRpc : public QObject CClientSettings* m_pSettings; QJsonArray arrStoredChanInfo; static QJsonValue SerializeSkillLevel ( ESkillLevel skillLevel ); + + // last server list received per directory (keyed by CHostAddress::toString() of the directory), + // used to check whether a server is (still) listed before connecting to it + QMap> m_mapDirectoryServers; + + // identifies the connection established (or attempted) by the most recent jamulusclient/connect + // call, along with its outcome, so jamulusclient/disconnect can validate its params against it + QString m_strConnectedDirectory; + QString m_strConnectedServer; + QString m_strConnectStatus; }; diff --git a/src/clientsettingsdlg.cpp b/src/clientsettingsdlg.cpp index d9f2e6ad11..ad92a0f8e1 100644 --- a/src/clientsettingsdlg.cpp +++ b/src/clientsettingsdlg.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -494,6 +516,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, CClientSettings* pNSet cbxAudioQuality->addItem ( tr ( "Low" ) ); // AQ_LOW cbxAudioQuality->addItem ( tr ( "Normal" ) ); // AQ_NORMAL cbxAudioQuality->addItem ( tr ( "High" ) ); // AQ_HIGH + cbxAudioQuality->addItem ( tr ( "Max" ) ); // AQ_RAW cbxAudioQuality->setCurrentIndex ( static_cast ( pClient->GetAudioQuality() ) ); // GUI design (skin) combo box @@ -681,7 +704,7 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, CClientSettings* pNSet pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "Intermediate" ), SL_INTERMEDIATE ); - SLPixmap.fill ( QColor::fromRgb ( RGBCOL_R_SL_SL_PROFESSIONAL, RGBCOL_G_SL_SL_PROFESSIONAL, RGBCOL_B_SL_SL_PROFESSIONAL ) ); + SLPixmap.fill ( QColor::fromRgb ( RGBCOL_R_SL_PROFESSIONAL, RGBCOL_G_SL_PROFESSIONAL, RGBCOL_B_SL_PROFESSIONAL ) ); pcbxSkill->addItem ( QIcon ( SLPixmap ), tr ( "Expert" ), SL_PROFESSIONAL ); diff --git a/src/clientsettingsdlg.h b/src/clientsettingsdlg.h index 4baf50f5e5..7844f64117 100644 --- a/src/clientsettingsdlg.h +++ b/src/clientsettingsdlg.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -69,7 +91,7 @@ class CClientSettingsDlg : public CBaseDlg, private Ui_CClientSettingsDlgBase void UpdateAudioFaderSlider(); QString GenSndCrdBufferDelayString ( const int iFrameSize, const QString strAddText = "" ); - virtual void showEvent ( QShowEvent* ); + virtual void showEvent ( QShowEvent* ) override; virtual bool eventFilter ( QObject* obj, QEvent* event ) override; CClient* pClient; diff --git a/src/connectdlg.cpp b/src/connectdlg.cpp index 5c16bbc3db..05127ded37 100644 --- a/src/connectdlg.cpp +++ b/src/connectdlg.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -100,8 +122,9 @@ bool CMappedTreeWidgetItem::operator<( const QTreeWidgetItem& other ) const return lhs.toString() < rhs.toString(); } -CConnectDlg::CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteRegList, const bool bNEnableIPv6, QWidget* parent ) : +CConnectDlg::CConnectDlg ( CClient* pNCliP, CClientSettings* pNSetP, const bool bNewShowCompleteRegList, QWidget* parent ) : CBaseDlg ( parent, Qt::Dialog ), + pClient ( pNCliP ), pSettings ( pNSetP ), strSelectedAddress ( "" ), strSelectedServerName ( "" ), @@ -110,8 +133,7 @@ CConnectDlg::CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteR bReducedServerListReceived ( false ), bServerListItemWasChosen ( false ), bListFilterWasActive ( false ), - bShowAllMusicians ( true ), - bEnableIPv6 ( bNEnableIPv6 ) + bShowAllMusicians ( true ) { setupUi ( this ); @@ -736,6 +758,12 @@ void CConnectDlg::UpdateListFilter() bFilterFound = true; } + // search version + if ( pCurListViewItem->text ( LVC_VERSION ).indexOf ( sFilterText, 0, Qt::CaseInsensitive ) >= 0 ) + { + bFilterFound = true; + } + // search children for ( int iCCnt = 0; iCCnt < pCurListViewItem->childCount(); iCCnt++ ) { @@ -864,7 +892,9 @@ void CConnectDlg::OnTimerPing() // try to parse host address string which is stored as user data // in the server list item GUI control element // the data to be parsed is just IP:port, so no SRV discovery is needed - if ( NetworkUtil::ParseNetworkAddressBare ( pCurListViewItem->data ( LVC_NAME, Qt::UserRole ).toString(), haServerAddress, bEnableIPv6 ) ) + if ( NetworkUtil::ParseNetworkAddressBare ( pCurListViewItem->data ( LVC_NAME, Qt::UserRole ).toString(), + haServerAddress, + pClient->IsIPv6Available() ) ) { // if address is valid, send ping message using a new thread #if QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) @@ -1106,7 +1136,7 @@ void CConnectDlg::UpdateDirectoryComboBox() cbxDirectory->clear(); cbxDirectory->addItem ( DirectoryTypeToString ( AT_DEFAULT ) ); cbxDirectory->addItem ( DirectoryTypeToString ( AT_ANY_GENRE2 ) ); - cbxDirectory->addItem ( DirectoryTypeToString ( AT_ANY_GENRE3 ) ); + cbxDirectory->addItem ( DirectoryTypeToString ( AT_ANY_GENRE_ASIA ) ); cbxDirectory->addItem ( DirectoryTypeToString ( AT_GENRE_ROCK ) ); cbxDirectory->addItem ( DirectoryTypeToString ( AT_GENRE_JAZZ ) ); cbxDirectory->addItem ( DirectoryTypeToString ( AT_GENRE_CLASSICAL_FOLK ) ); diff --git a/src/connectdlg.h b/src/connectdlg.h index 435169edf7..2d82a8c454 100644 --- a/src/connectdlg.h +++ b/src/connectdlg.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -62,7 +84,7 @@ class CConnectDlg : public CBaseDlg, private Ui_CConnectDlgBase Q_OBJECT public: - CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteRegList, const bool bNEnableIPv6, QWidget* parent = nullptr ); + CConnectDlg ( CClient* pNCliP, CClientSettings* pNSetP, const bool bNewShowCompleteRegList, QWidget* parent = nullptr ); void SetShowAllMusicians ( const bool bState ) { ShowAllMusicians ( bState ); } bool GetShowAllMusicians() { return bShowAllMusicians; } @@ -105,6 +127,7 @@ class CConnectDlg : public CBaseDlg, private Ui_CConnectDlgBase void EmitCLServerListPingMes ( const CHostAddress& haServerAddress, const bool bNeedVersion ); void UpdateDirectoryComboBox(); + CClient* pClient; CClientSettings* pSettings; QTimer TimerPing; @@ -119,7 +142,6 @@ class CConnectDlg : public CBaseDlg, private Ui_CConnectDlgBase bool bServerListItemWasChosen; bool bListFilterWasActive; bool bShowAllMusicians; - bool bEnableIPv6; public slots: void OnServerListItemDoubleClicked ( QTreeWidgetItem* Item, int ); diff --git a/src/global.h b/src/global.h index 100b4039de..5414a58c41 100644 --- a/src/global.h +++ b/src/global.h @@ -31,19 +31,33 @@ LED bar: lbr ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -96,22 +110,22 @@ LED bar: lbr #define MAX_DELAY_PANNING_SAMPLES 64 // default server address and port numbers -#define DEFAULT_QOS_NUMBER 128 // CS4 (Quality of Service) -#define DEFAULT_SERVER_ADDRESS "anygenre1.jamulus.io:22124" // default port explicit to avoid unneeded SRV lookup +#define DEFAULT_QOS_NUMBER 128 // CS4 (Quality of Service) +#define DEFAULT_SERVER_ADDRESS "anygenre1.jamulus.app:22124" // default port explicit to avoid unneeded SRV lookup #define DEFAULT_PORT_NUMBER 22124 -#define CENTSERV_ANY_GENRE2 "anygenre2.jamulus.io:22224" -#define CENTSERV_ANY_GENRE3 "anygenre3.jamulus.io:22624" -#define CENTSERV_GENRE_ROCK "rock.jamulus.io:22424" -#define CENTSERV_GENRE_JAZZ "jazz.jamulus.io:22324" -#define CENTSERV_GENRE_CLASSICAL_FOLK "classical.jamulus.io:22524" -#define CENTSERV_GENRE_CHORAL "choral.jamulus.io:22724" +#define DIR_ADDR_ANY_GENRE2 "anygenre2.jamulus.app:22224" +#define DIR_ADDR_ANY_GENRE_ASIA "asia.jamulus.app:22624" +#define DIR_ADDR_GENRE_ROCK "rock.jamulus.app:22424" +#define DIR_ADDR_GENRE_JAZZ "jazz.jamulus.app:22324" +#define DIR_ADDR_GENRE_CLASSICAL_FOLK "classical.jamulus.app:22524" +#define DIR_ADDR_GENRE_CHORAL "choral.jamulus.app:22724" // specify an invalid port to disable the server #define INVALID_PORT -1 // servers to check for new versions -#define UPDATECHECK1_ADDRESS "updatecheck1.jamulus.io" -#define UPDATECHECK2_ADDRESS "updatecheck2.jamulus.io" +#define UPDATECHECK1_ADDRESS "updatecheck1.jamulus.app" +#define UPDATECHECK2_ADDRESS "updatecheck2.jamulus.app" // getting started and software manual URL #define CLIENT_GETTING_STARTED_URL "https://jamulus.io/wiki/Getting-Started" @@ -230,6 +244,9 @@ LED bar: lbr // defines the time interval at which the ping time is updated in the GUI #define PING_UPDATE_TIME_MS 500 // ms +// defines a factor to compensate for larger than ideal jitter buffer sizes for estimated overall delay calculation +#define JITTBUF_COMP_FACTOR 0.7f + // defines the time interval at which the ping time is updated for the server list #define PING_UPDATE_TIME_SERVER_LIST_MS 2500 // ms diff --git a/src/levelmeter.cpp b/src/levelmeter.cpp index c676415ca4..0ac457159e 100644 --- a/src/levelmeter.cpp +++ b/src/levelmeter.cpp @@ -4,24 +4,46 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Description: * Implements a multi color LED bar * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/levelmeter.h b/src/levelmeter.h index 7dbb2ffa38..6e41bf65c3 100644 --- a/src/levelmeter.h +++ b/src/levelmeter.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/mac/activity.h b/src/mac/activity.h index b731443520..e8acde754b 100644 --- a/src/mac/activity.h +++ b/src/mac/activity.h @@ -4,21 +4,43 @@ * Author(s): * AronVietti * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #pragma once diff --git a/src/mac/activity.mm b/src/mac/activity.mm index d8dd6a7849..fcaf65e253 100644 --- a/src/mac/activity.mm +++ b/src/mac/activity.mm @@ -4,21 +4,43 @@ * Author(s): * AronVietti * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -42,7 +64,7 @@ pActivity->activityId = [[NSProcessInfo processInfo] beginActivityWithOptions:options - reason:@"Jamulus provides low latency audio processing and should not be inturrupted by system throttling."]; + reason:@"Jamulus provides low latency audio processing and should not be interrupted by system throttling."]; } void CActivity::EndActivity() diff --git a/src/mac/badgelabel.h b/src/mac/badgelabel.h index 750a07f147..61f9a784d3 100644 --- a/src/mac/badgelabel.h +++ b/src/mac/badgelabel.h @@ -4,21 +4,43 @@ * Author(s): * The Jamulus Development Team * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/mac/badgelabel.mm b/src/mac/badgelabel.mm index 83dfcd74c0..28f0620394 100644 --- a/src/mac/badgelabel.mm +++ b/src/mac/badgelabel.mm @@ -4,21 +4,43 @@ * Author(s): * The Jamulus Development Team * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/main.cpp b/src/main.cpp index 98e5ab09ae..d2bf7a1140 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -87,6 +109,7 @@ int main ( int argc, char** argv ) bool bDisconnectAllClientsOnQuit = false; bool bUseDoubleSystemFrameSize = true; // default is 128 samples frame size bool bUseMultithreading = false; + bool bDisableRaw = false; bool bShowAnalyzerConsole = false; bool bMuteStream = false; bool bMuteMeInPersonalMix = false; @@ -95,7 +118,7 @@ int main ( int argc, char** argv ) bool bNoAutoJackConnect = false; bool bUseTranslation = true; bool bCustomPortNumberGiven = false; - bool bEnableIPv6 = false; + bool bDisableIPv6 = false; int iNumServerChannels = DEFAULT_USED_NUM_CHANNELS; quint16 iPortNumber = DEFAULT_PORT_NUMBER; int iJsonRpcPortNumber = INVALID_PORT; @@ -104,7 +127,6 @@ int main ( int argc, char** argv ) ELicenceType eLicenceType = LT_NO_LICENCE; QString strConnOnStartupAddress = ""; QString strIniFileName = ""; - QString strHTMLStatusFileName = ""; QString strLoggingFileName = ""; QString strRecordingDirName = ""; QString strDirectoryAddress = ""; @@ -240,11 +262,19 @@ int main ( int argc, char** argv ) continue; } + // Disable IPv6 --------------------------------------------------------- + if ( GetFlagArgument ( argv, i, "--noipv6", "--noipv6" ) ) + { + bDisableIPv6 = true; + qInfo() << "- IPv6 disabled"; + CommandLineOptions << "--noipv6"; + continue; + } + // Enable IPv6 --------------------------------------------------------- if ( GetFlagArgument ( argv, i, "-6", "--enableipv6" ) ) { - bEnableIPv6 = true; - qInfo() << "- IPv6 enabled"; + qWarning() << "IPv6 is now enabled by default: -6 and --enableipv6 have no effect and are deprecated"; CommandLineOptions << "--enableipv6"; continue; } @@ -342,19 +372,6 @@ int main ( int argc, char** argv ) continue; } - // HTML status file ---------------------------------------------------- - if ( GetStringArgument ( argc, argv, i, "-m", "--htmlstatus", strArgument ) ) - { - qWarning() << qUtf8Printable ( - QString ( "- The HTML status file option (\"--htmlstatus\" or \"-m\") is deprecated and will be removed soon. Please use JSON-RPC " - "instead. See https://github.com/jamulussoftware/jamulus/blob/main/docs/JSON-RPC.md" ) ); - strHTMLStatusFileName = strArgument; - qInfo() << qUtf8Printable ( QString ( "- HTML status file name: %1" ).arg ( strHTMLStatusFileName ) ); - CommandLineOptions << "--htmlstatus"; - ServerOnlyOptions << "--htmlstatus"; - continue; - } - // Server info --------------------------------------------------------- if ( GetStringArgument ( argc, argv, i, "-o", "--serverinfo", strArgument ) ) { @@ -478,6 +495,19 @@ int main ( int argc, char** argv ) continue; } + // Disable raw audio feature ------------------------------------------- + if ( GetFlagArgument ( argv, + i, + "--noraw", // no short form + "--noraw" ) ) + { + bDisableRaw = true; + qInfo() << "- raw audio is disabled"; + CommandLineOptions << "--noraw"; + ServerOnlyOptions << "--noraw"; + continue; + } + // Client only: // Connect on startup -------------------------------------------------- @@ -921,7 +951,7 @@ int main ( int argc, char** argv ) #ifndef SERVER_ONLY if ( bIsClient ) { - CClient Client ( iPortNumber, iQosNumber, strConnOnStartupAddress, bNoAutoJackConnect, strClientName, bEnableIPv6, bMuteMeInPersonalMix ); + CClient Client ( iPortNumber, iQosNumber, bNoAutoJackConnect, strClientName, bDisableIPv6, bMuteMeInPersonalMix ); // Create Settings with the client pointer CClientSettings Settings ( &Client, strIniFileName ); @@ -946,14 +976,8 @@ int main ( int argc, char** argv ) } // GUI object - CClientDlg ClientDlg ( &Client, - &Settings, - strConnOnStartupAddress, - bShowComplRegConnList, - bShowAnalyzerConsole, - bMuteStream, - bEnableIPv6, - nullptr ); + CClientDlg + ClientDlg ( &Client, &Settings, strConnOnStartupAddress, bShowComplRegConnList, bShowAnalyzerConsole, bMuteStream, nullptr ); // show dialog ClientDlg.show(); @@ -963,6 +987,12 @@ int main ( int argc, char** argv ) else # endif { + if ( !strConnOnStartupAddress.isEmpty() ) + { + Client.SetServerAddr ( strConnOnStartupAddress ); + Client.Start(); + } + // only start application without using the GUI qInfo() << qUtf8Printable ( GetVersionAndNameStr ( false ) ); @@ -979,7 +1009,6 @@ int main ( int argc, char** argv ) strServerBindIP, iPortNumber, iQosNumber, - strHTMLStatusFileName, strDirectoryAddress, strServerListFileName, strServerInfo, @@ -989,10 +1018,11 @@ int main ( int argc, char** argv ) strRecordingDirName, bDisconnectAllClientsOnQuit, bUseDoubleSystemFrameSize, + bDisableRaw, bUseMultithreading, bDisableRecording, bDelayPan, - bEnableIPv6, + bDisableIPv6, eLicenceType ); #ifndef NO_JSON_RPC @@ -1094,7 +1124,8 @@ QString UsageArguments ( char** argv ) " -Q, --qos set the QoS value. Default is 128. Disable with 0\n" " (see the Jamulus website to enable QoS on Windows)\n" " -t, --notranslation disable translation (use English language)\n" - " -6, --enableipv6 enable IPv6 addressing (IPv4 is always enabled)\n" + " --noipv6 disable IPv6 addressing (IPv4 is always enabled)\n" + " (recommended to leave IPv6 enabled by default)\n" "\n" "Server only:\n" " -d, --discononquit disconnect all Clients on quit\n" @@ -1106,7 +1137,6 @@ QString UsageArguments ( char** argv ) " -F, --fastupdate use 64 samples frame size mode\n" " -l, --log enable logging, set file name\n" " -L, --licence show an agreement window before users can connect\n" - " -m, --htmlstatus deprecated, please use JSON-RPC instead\n" " -o, --serverinfo registration info for this Server. Format:\n" " [name];[city];[country as two-letter ISO country code or Qt5 QLocale ID]\n" " --serverpublicip public IP address for this Server. Needed when\n" @@ -1115,14 +1145,16 @@ QString UsageArguments ( char** argv ) " -P, --delaypan start with delay panning enabled\n" " -R, --recording set server recording directory; server will record when a session is active by default\n" " --norecord set server not to record by default when recording is configured\n" + " --noraw disable raw audio\n" " -s, --server start Server\n" - " --serverbindip IP address the Server will bind to (rather than all)\n" + " --serverbindip IPv4 address the Server will bind to (rather than all)\n" + " (only works if IPv6 is unavailable or disabled with --noipv6)\n" " -T, --multithreading use multithreading to make better use of\n" " multi-core CPUs and support more Clients\n" " -u, --numchannels maximum number of channels\n" " -w, --welcomemessage welcome message to display on connect\n" " (string or filename, HTML supported)\n" - " -z, --startminimized start minimizied\n" + " -z, --startminimized start minimized\n" "\n" "Client only:\n" " -c, --connect connect to given Server address on startup\n" diff --git a/src/multicolorled.cpp b/src/multicolorled.cpp index 37f4c7e329..ba270ab0a2 100644 --- a/src/multicolorled.cpp +++ b/src/multicolorled.cpp @@ -4,24 +4,46 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Description: * Implements a multi color LED * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/multicolorled.h b/src/multicolorled.h index 63590ba1fa..808679fb1b 100644 --- a/src/multicolorled.h +++ b/src/multicolorled.h @@ -4,6 +4,14 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Description: * * SetLight(): @@ -13,19 +21,33 @@ * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/protocol.cpp b/src/protocol.cpp index 47be8bc265..335856ad93 100644 --- a/src/protocol.cpp +++ b/src/protocol.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -235,6 +257,11 @@ MESSAGES (with connection) note: does not have any data -> n = 0 +- PROTMESSID_RAWAUDIO_SUPPORTED: informs client that server supports raw (uncompressed) audio + + note: does not have any data -> n = 0 + + - PROTMESSID_RECORDER_STATE: notifies of changes in the server jam recorder state +--------------+ @@ -432,6 +459,31 @@ CONNECTION LESS MESSAGES five times for one registration request at 500ms intervals. Beyond this, it should "ping" every 15 minutes (standard re-registration timeout). + + +- PROTMESSID_CLM_SERVER_FEATURES: Bitmask of enabled server features + + +------------------+ + | 4 bytes number n | + +------------------+ + + +- PROTMESSID_CLM_REQ_SERVER_FEATURES: Request bitmask of enabled server features + + note: does not have any data -> n = 0 + + +- PROTMESSID_CLM_WELCOME_MESSAGE: Server welcome message + + +------------------+--------------------------------------+ + | 2 bytes number n | n bytes UTF-8 string welcome message | + +------------------+--------------------------------------+ + + +- PROTMESSID_CLM_REQ_WELCOME_MESSAGE: Request server welcome message + + note: does not have any data -> n = 0 + */ #include "protocol.h" @@ -813,6 +865,10 @@ void CProtocol::ParseMessageBody ( const CVector& vecbyMesBodyData, con EvaluateSplitMessSupportedMes(); break; + case PROTMESSID_RAWAUDIO_SUPPORTED: + EvaluateRawAudioSupportedMes(); + break; + case PROTMESSID_LICENCE_REQUIRED: EvaluateLicenceRequiredMes ( vecbyMesBodyDataRef ); break; @@ -916,6 +972,14 @@ void CProtocol::ParseConnectionLessMessageBody ( const CVector& vecbyMe case PROTMESSID_CLM_REGISTER_SERVER_RESP: EvaluateCLRegisterServerResp ( InetAddr, vecbyMesBodyData ); break; + + case PROTMESSID_CLM_REQ_SERVER_FEATURES: + EvaluateCLReqServerFeaturesMes ( InetAddr ); + break; + + case PROTMESSID_CLM_REQ_WELCOME_MESSAGE: + EvaluateCLReqWelcomeMessageMes ( InetAddr ); + break; } } @@ -1520,6 +1584,16 @@ bool CProtocol::EvaluateSplitMessSupportedMes() return false; // no error } +void CProtocol::CreateRawAudioSupportedMes() { CreateAndSendMessage ( PROTMESSID_RAWAUDIO_SUPPORTED, CVector ( 0 ) ); } + +bool CProtocol::EvaluateRawAudioSupportedMes() +{ + // invoke message action + emit RawAudioSupported(); + + return false; // no error +} + void CProtocol::CreateLicenceRequiredMes ( const ELicenceType eLicenceType ) { CVector vecData ( 1 ); // 1 bytes of data @@ -2568,7 +2642,7 @@ bool CProtocol::EvaluateCLRegisterServerResp ( const CHostAddress& InetAddr, con const int iSvrRegResult = static_cast ( GetValFromStream ( vecData, iPos, 1 ) ); if ( ( iSvrRegResult != SRR_REGISTERED ) && ( iSvrRegResult != SRR_SERVER_LIST_FULL ) && ( iSvrRegResult != SRR_VERSION_TOO_OLD ) && - ( iSvrRegResult != SRR_NOT_FULFILL_REQIREMENTS ) ) + ( iSvrRegResult != SRR_NOT_FULFILL_REQUIREMENTS ) ) { return true; } @@ -2579,6 +2653,53 @@ bool CProtocol::EvaluateCLRegisterServerResp ( const CHostAddress& InetAddr, con return false; // no error } +bool CProtocol::EvaluateCLReqServerFeaturesMes ( const CHostAddress& InetAddr ) +{ + // invoke message action + emit CLReqServerFeatures ( InetAddr ); + + return false; // no error +} + +void CProtocol::CreateCLServerFeaturesMes ( const CHostAddress& InetAddr, const uint32_t iFeatures ) +{ + int iPos = 0; // init position pointer + CVector vecData ( 4 ); + + PutValOnStream ( vecData, iPos, iFeatures, 4 ); + + CreateAndImmSendConLessMessage ( PROTMESSID_CLM_SERVER_FEATURES, vecData, InetAddr ); +} + +bool CProtocol::EvaluateCLReqWelcomeMessageMes ( const CHostAddress& InetAddr ) +{ + // invoke message action + emit CLReqWelcomeMessage ( InetAddr ); + + return false; // no error +} + +void CProtocol::CreateCLWelcomeMessageMes ( const CHostAddress& InetAddr, const QString strWelcomeMessage ) +{ + int iPos = 0; // init position pointer + + // convert chat text string to utf-8 + const QByteArray strUTF8WelcomeMessage = strWelcomeMessage.toUtf8(); + + const int iStrUTF8Len = strUTF8WelcomeMessage.size(); // get utf-8 str. size / string + + // size of message body + const int iEntrLen = 2 + iStrUTF8Len; // utf-8 str. size / string + + // build data vector + CVector vecData ( iEntrLen ); + + // chat text + PutStringUTF8OnStream ( vecData, iPos, strUTF8WelcomeMessage ); + + CreateAndImmSendConLessMessage ( PROTMESSID_CLM_WELCOME_MESSAGE, vecData, InetAddr ); +} + /******************************************************************************\ * Message generation and parsing * \******************************************************************************/ diff --git a/src/protocol.h b/src/protocol.h index b76e66607b..8d4125a9ab 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -62,6 +84,7 @@ #define PROTMESSID_RECORDER_STATE 33 // contains the state of the jam recorder (ERecorderState) #define PROTMESSID_REQ_SPLIT_MESS_SUPPORT 34 // request support for split messages #define PROTMESSID_SPLIT_MESS_SUPPORTED 35 // split messages are supported +#define PROTMESSID_RAWAUDIO_SUPPORTED 36 // raw (uncompressed) audio is supported // message IDs of connection less messages (CLM) // DEFINITION -> start at 1000, end at 1999, see IsConnectionLessMessageID @@ -83,6 +106,10 @@ #define PROTMESSID_CLM_REGISTER_SERVER_RESP 1016 // status of server registration request #define PROTMESSID_CLM_REGISTER_SERVER_EX 1017 // register server with extended information #define PROTMESSID_CLM_RED_SERVER_LIST 1018 // reduced server list +#define PROTMESSID_CLM_SERVER_FEATURES 1019 // server features message +#define PROTMESSID_CLM_REQ_SERVER_FEATURES 1020 // request server features +#define PROTMESSID_CLM_WELCOME_MESSAGE 1021 // server welcome message +#define PROTMESSID_CLM_REQ_WELCOME_MESSAGE 1022 // request server welcome message // special IDs #define PROTMESSID_SPECIAL_SPLIT_MESSAGE 2001 // a container for split messages @@ -124,6 +151,7 @@ class CProtocol : public QObject void CreateReqNetwTranspPropsMes(); void CreateReqSplitMessSupportMes(); void CreateSplitMessSupportedMes(); + void CreateRawAudioSupportedMes(); void CreateLicenceRequiredMes ( const ELicenceType eLicenceType ); void CreateOpusSupportedMes(); @@ -153,6 +181,8 @@ class CProtocol : public QObject void CreateCLReqConnClientsListMes ( const CHostAddress& InetAddr ); void CreateCLChannelLevelListMes ( const CHostAddress& InetAddr, const CVector& vecLevelList, const int iNumClients ); void CreateCLRegisterServerResp ( const CHostAddress& InetAddr, const ESvrRegResult eResult ); + void CreateCLServerFeaturesMes ( const CHostAddress& InetAddr, const uint32_t iResult ); + void CreateCLWelcomeMessageMes ( const CHostAddress& InetAddr, const QString strWelcomeMessage ); static bool ParseMessageFrame ( const CVector& vecbyData, const int iNumBytesIn, @@ -258,6 +288,7 @@ class CProtocol : public QObject bool EvaluateReqNetwTranspPropsMes(); bool EvaluateReqSplitMessSupportMes(); bool EvaluateSplitMessSupportedMes(); + bool EvaluateRawAudioSupportedMes(); bool EvaluateLicenceRequiredMes ( const CVector& vecData ); bool EvaluateVersionAndOSMes ( const CVector& vecData ); bool EvaluateRecorderStateMes ( const CVector& vecData ); @@ -279,6 +310,8 @@ class CProtocol : public QObject bool EvaluateCLReqConnClientsListMes ( const CHostAddress& InetAddr ); bool EvaluateCLChannelLevelListMes ( const CHostAddress& InetAddr, const CVector& vecData ); bool EvaluateCLRegisterServerResp ( const CHostAddress& InetAddr, const CVector& vecData ); + bool EvaluateCLReqServerFeaturesMes ( const CHostAddress& InetAddr ); + bool EvaluateCLReqWelcomeMessageMes ( const CHostAddress& InetAddr ); int iOldRecID; int iOldRecCnt; @@ -321,6 +354,7 @@ public slots: void ReqNetTranspProps(); void ReqSplitMessSupport(); void SplitMessSupported(); + void RawAudioSupported(); void LicenceRequired ( ELicenceType eLicenceType ); void VersionAndOSReceived ( COSUtil::EOpSystemType eOSType, QString strVersion ); void RecorderStateReceived ( ERecorderState eRecorderState ); @@ -345,4 +379,6 @@ public slots: void CLReqConnClientsList ( CHostAddress InetAddr ); void CLChannelLevelListReceived ( CHostAddress InetAddr, CVector vecLevelList ); void CLRegisterServerResp ( CHostAddress InetAddr, ESvrRegResult eStatus ); + void CLReqServerFeatures ( CHostAddress InetAddr ); + void CLReqWelcomeMessage ( CHostAddress InetAddr ); }; diff --git a/src/recorder/creaperproject.cpp b/src/recorder/creaperproject.cpp index 535a99010f..b82cba17b2 100644 --- a/src/recorder/creaperproject.cpp +++ b/src/recorder/creaperproject.cpp @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/creaperproject.h b/src/recorder/creaperproject.h index d72a63c16f..f62872ecc5 100644 --- a/src/recorder/creaperproject.h +++ b/src/recorder/creaperproject.h @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/cwavestream.cpp b/src/recorder/cwavestream.cpp index dfed4f6b1f..74091d3685 100644 --- a/src/recorder/cwavestream.cpp +++ b/src/recorder/cwavestream.cpp @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/cwavestream.h b/src/recorder/cwavestream.h index 944b0b7445..b80d991315 100644 --- a/src/recorder/cwavestream.h +++ b/src/recorder/cwavestream.h @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/jamcontroller.cpp b/src/recorder/jamcontroller.cpp index 82f16a2eb1..2c277fe0f3 100644 --- a/src/recorder/jamcontroller.cpp +++ b/src/recorder/jamcontroller.cpp @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/jamcontroller.h b/src/recorder/jamcontroller.h index 93e89f9a0c..17f6a37f74 100644 --- a/src/recorder/jamcontroller.h +++ b/src/recorder/jamcontroller.h @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/jamrecorder.cpp b/src/recorder/jamrecorder.cpp index bc318ac30e..de99ac9b5b 100644 --- a/src/recorder/jamrecorder.cpp +++ b/src/recorder/jamrecorder.cpp @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/recorder/jamrecorder.h b/src/recorder/jamrecorder.h index 0da9200ef5..c564566a83 100644 --- a/src/recorder/jamrecorder.h +++ b/src/recorder/jamrecorder.h @@ -4,21 +4,43 @@ * Author(s): * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/res/CLEDBlackBig.png b/src/res/CLEDBlackBig.png index 83b148bdb593f46da2ce8a2cdee86eea8801a4cc..bd1ef9305af857175706117a12b41f37de752985 100644 GIT binary patch delta 526 zcmbQsx}9Z$WDpAj1H)Fwr%^zPCEd~2k%3`jKlh(RRv=#?*(1o8fuTx`fuW&=f#DZW zsNn?zL#Y7+!>a@a2CEqi4B`cIb_Lo1C76=D-CY>|xA&jfKhZ(1{uvi9o2mIKp-vA5 z21YGU7sn8Z%f1)(X9X8ZG(3E6{9Hn)YSs_+rp7V>rdB7%3kN;#$nfmgAydT|TVxtr z#i+W@NoLNHdkvGPWKD6JxZ-8Nmy8Q6pNl&m?Y6ruePDB*)RKL2#|*pv9v9}Qh+Ed| zTDZ{ZVb`9nz3$FU;;B}1j@3(VzcayS?yZZSW%7KFQ_CxjbmO$IPW*5=xV&`LjZ<08 zsfADW6?clhxA?T=1Y6|2{U7exPOd+4Dcbn@ugH7RGpw)uGw<$nF{wM&-*f-hgVRCGM_riNX~<0sJ{Pu08E zdz;y82wS@L!J3}K?+f3Y;Wx>>wQbs^ch3wS1WU5-@17aIB70S6=KE&_U#ES}<4H2L z>%CN$&Q#B^M=0e+^Sw8Iz%W%Uag8WRNi0dVN-jzTQVd20Mn<}Z2D*mEAqHkvrp8vL uCfWuDRt5(7?>Y03H5gju=BH$)RbtU$2+`rwHLnz?gTd3)&t;ucLK6TeG}xK| delta 629 zcmV-*0*d{&1f2zt87Bq+0019IEztk~00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlaXs4f7=5Q6Al_?sl~eh00JFJL_t(2Q*DwvODkazhM#f2&m~JXtd}heZaP5-2!a+? zVy|Fhvz#AblV4-w4-jpISfr9zrPD5WMF`?8VASYhc5&x4Cqdy%H4O92yu-Z0k2pL$ zEURiwRX2dSf8{F?sf)Tc1wd5+`1<P!?2E{}aU7?X=egf(Hd$R=rQ7X}fS>Tf zf5HOIW|OV0E#DYZGuGOTUa!aX^))LiE8O3Y?*BC)&vPy=E=ZDusi~FJ3yP06whYwet|*5bM@rBaE@%S*B>qfjXP0+S@+_V$)isf6pgSZguH zn5!TNs!Cc@i;Ih#ot=%O z4Yw5vg^_}#r6ndOCm92x}LetrVrc^;KYg=)1*u~<}9{Zpw__D7a`czB3KWcT~~L)%Z1 zgu!3{fa|(=o`>T&eO29_nVH##A6^CMcDrQ}sfoxhldEc7Rd>QL96k9j3`+O2Favxw P00000NkvXXu0mjf%rr6% diff --git a/src/res/CLEDBlackSrc.png b/src/res/CLEDBlackSrc.png index 7acb70e6c65953b534541e1c42df94648c11614c..dea9569713133eec3d6f733faeb2030c49edc82e 100644 GIT binary patch literal 22973 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 literal 40795 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 DJq8vC literal 36790 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

Heu4r0ojgBrRxl996IH+Jb+JDL0| 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 diff --git a/src/res/CLEDYellowSrc.png b/src/res/CLEDYellowSrc.png index 7c643d925b833f57d98e9b2a0f23935c13e3a3b3..96b8d9792a187ceda010b2559b49517493ecc212 100644 GIT binary patch literal 35677 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 z

-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ۏo^-bB0 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%0AJsCgj%>A47} z2zwtOw2BaT$mz!?Hnz6DcW1L)E>9#L{y;?;K-lkQ|0-JM^yK1Y6jajPYXjJ1H?bCVW{|X z8)`_e1-Wj?iK;^`1<(0ye~?jBCtg_<+VeV_HD%RLnriKqhRDfI=dGVDryrk;L&6B8 z3d+x8T9yk0h**M%ggzC2{=q@saT}$R$Xi zr%z%rtu_TViVq>7HdBqe#i#;;or%XMcLPo!J^cauBx9o$>`1s_WMjMfUkjp-O}zy5 z=dwRPPj~Y?tUU2?K>*}j_4|t|1O~SN_0w|heiAMN5N!0|0(rY=&XHj>7-)a@_jUE) zlLHea&#ODTwvzSl%04`g9xG}u;v*$V;I6q41qE`}j3~u!(C~(Anb~`lSr{w?XZaA1 z_R9+Pdx9-wL|IAhdlVX=D%9DuiEmSm>z%93ys~xh&(&;SO*fgn?W_7PfX@BPZb%xn zazZfneWID+8t-hg;}PMA(ggFVLBa4(TzwxaZe!LWv3Fo8wDcg~78L@4j6_&HwgrH@ z6W}@<6@9MzK$%vt00Zv7mtrd=uYcdUbL7GFb)h{)rBNGpy#GR?9}g*BWD35569di0 zycAo}|HlnI$k-a!i&sJdY(v!6@2~ou1O;@x8JU>iX^sEb8;Mh?fI(MTU~dWtP13VW z2Z}zU3#hx)k((mpTl<&9T1--Krr{JB9JPpWv zPp@=@>0NwZf_nIA2a%LjYv*kTD`$H^SMTrCkx%@brl(6E7kL{FT)@!1&fvXvrZqX~ zQEYx}eaP9AwmRf#fX4Lsej)G)^F=+!lQhl-USd_yWwLbpx zM!ZSgf#yK#lX9@?+cT-(>=2S?q$Lf>^&^r>8)vPF#XF#fbboK4w{#>SAkaTH7JK~q zz^PV5Q1xcC(R56J71Kan{A>zq?T)?KiKV?7{_9u16}_!09JFju?aw+;o<7&jlXZ7z z)(l2TVp^6p8M$1oTkXa*TVbDU)A@Vyq}6^)LfN>6+v|MKkZGHQ((fUGL0+$Pt~T*r z9q8kev%BtO#KD2Bjm_XsDD(9b)Amai9o-y72jlwrDBE}FoNx`w|`s5 z#A_K%=A8R!@xFWs+jHDyn6gc{n6SoIF0+%p7IEKR3s(-cSyprxd}Q@D+S-aThZQ z?=!c~V@>6}C!bECF1)ZGllR>!fg430Devk8OQlK<-V(MAwv!A16~-Z#X{+BLuHu>~ z`If5#R$hpr3s=%Ol`o@h2}TV_YU8M0ZJ#iA}f_Ve?Lx;9P= zOb+8(2_%D+;W4%1k`i(Xiu!;K8uc%WxPQI3T(6HvA3kj;Bs;~lChyKllgyXY{Ps-I z{=J%T?kB)CSf0|M{VzUcj7%eqlAN6Pw)zZbN-Ngt- zj6WSdL04!Q=r_BS5Rf-DLcCP>qM4J$OX7`n956fPP>FrOfZ&%j(d4-#X6f&3Zg*d% zV6Qg352##OF-_$(v>0x7+|z~y8`aS%8$B}O_=RiC^TqlKu;z#I;rEj>m2LQlud-3F z8gx3NvBt_Ck5+czK=!U=bLna-n*@@^1Sj2^^p&((-SA8W0|ZQl_9r@e*~Lv;C8_ul zq9C^hiHG%KLz!_LjrjG~=alv3=m_|**xU&953ICRc8BQ+eI1dpv(a2$8_0c?NVe;v9 zSIqugPUQiYR@~3Ct=Jy%+3xeO4(K=QRtAhj#b>H#$>p zjBBMBOqizF)g(jG!R5y7&4nI5C=et0la1Ua18KO1Ot^?4Ub_2Jj(W&b_PW);F3}3$E)DI z!j2Bg3VFwg6IJ)V`pt++Y=K**?oYd+M*q0!{f8y2zMTf=(WqnlUL7da#Kv$FaT>c5 z=S|et@qF-UNwJc+v@OH`VNDEAU;cP@6EgeTX-@A2!8=dSspI`>lY2&PeKH17%Ri(m z@r%n}dOgCw3lRnIB^`C2Y$TcqJ3_eiqqb%xZRW0t1Vu$hrlyj&7Mlopj$$n+;3zYI z6*(~ZF{5B+5&!ebt;Nckz?jT(cm%G$VYWLW1*mlDOF;QlU6A9gA<83j^)w$`#+dG5k5v8jocTC-KwGY;PGu~i8!7s2RC9$~I0 zm64HQ4puidHa3!H6V@rBY*X%RDwoDW&Z43b&En7Va8g$f1xyccti>@u_oQL;M^qeGnd6t|hrYj+-B%Sq3qm45hutfZvGxm-Lh_E8ae zG+8-JKAxruT_~gOpUPJYrH`ME8w7+po#(DQS16CJ^+2n8@9Q;D3g3_sVvD0GGd5)-4Y)g3yKb|WgBJq zDDiW=lFK~~Nm=mq)$PX)+zJpT)Ma8ZwBik5;rmy}EK`1rbLT#{?cdS}D-$j62&XW8oAJ0ysHkf&ZzijNm> zGC4Ab?dukNu+aPZb=FVI&({L(%ahwjt+u@Nv~PlX0zXMb$;PzC?iO0v?Gh=K1}#r> zNvx`hWCt+>MU%EJ^K;q@+R)5{4ShPMO`(OT_4$FHA!ny>b$z78&nC9TBC8i8BZQ0C z*mCyveE)>ZkyJer(z->XZA&F#!-@a?%iPT~OC4K{)N%ik7mP2r8uWAO5E~0iYyUbS z6MRFp<<2p4-iBjIRsh^Snh%bttsEH@6(cd0Vf#23M#{n`^QP}COjpN6sL-tjKj@w* z%96Z#MX7q`K&Q;EY!Su;YDY7O?X9zlw3c#bM%j_3SX0a@Jo_!oVQ;uH) z#ekP^n*k${xu>T<*=y2q1LC&(xjM@W@+Lk89>PD4+vmW1lv`#eZ~4N*2fgLM)H$|K z)9%tQT%+$YX}NcFK@(=5Pm{ zee2p1$^J98GrMpsrd9$C43N$z*xVd6{Wtc)34EzG%5Nbn*YwT_1q;VWUrw?4K(~Fo zAjZhFcaztWf`-NS$~*s_ktwD%8-(jrm6eilYR8NJWIev*b&EFPBW5o*&&GZ(**S5{ zfc^HO#fAhFoXp*cQni1yFYUz1nFuflFwi(VO!vIP4LbkIYR~MSRQ0d3@>wtMDi{#% z)D1+P(Odq0zSO6)rg5yUvPN8AdS&Ygt)VA6V(z{t1|KBwii@iT1$8kkHe}! z**~oWAL)^&p7V`^LZ&F^$cXe?)FO3nEb|3OcoN=NaK3sKQ<>CZ$;i}?_(mAnr_O1! zv=p}8w)~bv@FDwINhM+g1UCf_j|LE(6I1~YI9d<7Zi*)jqY1eTjFF_P^=*hMww;e# zLmQiKCp*t>s?*-Q7-L|uNr3)YED;o2L16s2T}tK>68@$jKU)>nHgVE6P3E4LKdd z!{?6u%3_-VJk!q$pVtbgj<$`4wpa5D2v`}$sOR#$@z|^=cJ3Qv-dFx!M4te)$|Fg0 z7adha{0%a-yyMyV+n)38XXfkf$cTv2%F4#G6uhK>5CIguk-*wGT1iusO4YNgjQ1d> zPujbYv~)%F5%!I}MOywRi+z!o5G2B^xg05zdP+L2^Ke@~){-8W@pC<@zI3>?%U~9) z^SVRVel>X*vM}v z58noUch>19IpCx@poiNM+Ls37w!F4G=Q;Zb(#6qcYf!L0K8RMC-61CO`t|7V-&Rub zs^0xxA%6z-x35hzgzv%@msO5CK3t=wbMA1{^Ovo->~+pXE;>15lZ3#@!JeZvyv1W> zYKl1j3lx4fr!Zp3QWOHcy*zSXTh|fJEc^;UB)MpBVMj zi?cB{3`*UgPcj}Az*Y6wbQezV$cd!`HVE--^U!BY8_EpP)e%tu%K&{0s``Pk30!Ib zJ@8cyWpfwK(Hj4R*k;>yu7BcgSgI2COb4<<#FwUM4c7ktFkj0|lWOQM#M+bFum(9U5-DU|KBcvbIW4l{=5wG z(cXylKON&?VMk!96it!7wr5~q0Bkj`=c1esnMYQJH^$-^l-0L;_#^%^`*8yC z_(6lmMM+7&#rUGW@5=j|$?m91CWB;CP$OH{%D5^I*s7U{y%QG|RRXKM)ljchqyY8| z7RKkbxxRlgY}O*Ia+7wLnVC5$Z~FGJG|l{b6P=JnsIC-V3_H8Klk6k~vOdR?4|-4g zSsRC|Y1-vzCi;RPI$cs6eB{JTfT5vdHLfEru{&U3TQv-xZ4&kF7RovJpHwz01r8*#E zZ;=1ZBMPiVt3>a&sB`$yZDsY$Uc121JA2HmpilD!-H66<2QhZS9Yc%AF9Du*35R(S z%3U*Fur%v#nw6c+ND{N|TF6hQGN{P@j_EcFP-^S$>=O|kjR{K8GKS_neXRhz-~_1j zTO_;8ro7tvyjWHjiD`J9)sPN%F9n`Fvfd9dO&t-Ly6%VaGqP9D6gf#42rwAWZoZ>{ z@*zKr5&jWMtC1cco-sONkDQrlD(wC4m#;|nroA`_ZLx%x&{k}{HE;$zi!OhuE=dzAE$^OeZT zuB5}xh<5$I{|xPin?c*w-Dx*_YeM425x(rbx(uy)%Ip{YvVa0p>|GE z!R_cP+oDlAs%iuMyNu^l`+@J8a&IMMxa%))Ut|`*`n#I+gC}n8whu{jEG;IpfBoi> zh(|~HVA7f8DtfmcN#p^cmJvtm5gNs6aWt&&Q7hmV$KoiuQ z#{VBpUmaCt7wmmFba!`)G#t7cY3Xj{0D^RPBP{~br67Hf?n5IW-Q6H5ASv-Z@4eq$ z%eDB!#b%z_6Tg|+GefQ$h!Ky=_Zn5#3TY`>zKQo;!90-}1Jd^z(H_bV8_6}4VqYf% zfj4d*oR-X=<7$>lZ%^tc1QD+tGSldRdI)ec8Dn+2Z|8v)ESm@K{Tj1@0GgLht~HEh4RM#X^>-J;A+a$ zFT$nr<0B2WW7$GNMU5nHrrJ2=w6SqZ$~Ko@;!OrRI$q&hsVp4pc^A8 zSTD@|y^FtpwlWitWpQ-UNPD2tM)c^@)27(5_?+Z4r1%H|yKoWlB#^Fa0p2cqRj$Zv@<1 zX{q*k$``fm+G>&XOYelQL#2DrR=WE=TU4(wod>r)K?%XM>2>?R<~lk-)1N{G`1$1^ z6a&B2IvP3pIKQOUP{8s7&O}&UGq?5@XYY-Axa~d5B!FCwmmaD&)GqcGH-#|N?B`D- z+k(~QvTLG$mgGU+-z&ru`%+i!dUX%m#sM%995U`H(RvK<(4)q@(|=tCPU6^Oj7;=J zC+!J%^lRvjDsSXK%Vn_m_ml}hETeBsZSj^26y8mFHTvM^AGk-ev7Oo3Ht_CwG5H5$ zA%RLFX-$?iWO+J!j##P(=*0$9H}ZRi@ev$$vFKr`#8%5)T2y0Hl%F?dEvnf zE!AOGt^1SNIk`vKN?dXnasAm)YxKuUE{J-&HLo!f0X01D5Q4a>D;vYXmBzsKtjrrMG zT`uee*SRXl2e|)P>%mAU%FIYzmNcE^Pw&_4?Qi~K+fOPREZm)|9q;D9X~alHTPmwh zcj@~*JTfZw`?nbYXiCdGzWqZ7VNXcC1TM9&U)Q9LzSyjXesfq>-(Rq${f#x@+8UK@ zTKT#Sdqu;VB*~!;3KD_a^ZA|11Ele(atJz

WWx*c_~UDVWFX^d7ur?7UJIv#LTdJs^#bw2VTLoP$mo6 z4|3G80g={!_Y7H$_nyN=ISQ5{-pji};V7Y`08+nfoSXuld4hr;-nA9y{kcCVSO_I9 z&9os@yy-Sp*4s0>_R*gJ=wJI1)c%8G!8r0>w|lU)>DAZc5mE_3If%bP!9o0Yu|tE; z1&y{X(NxDVjn-UZX4YLKRr>C>NViuDaliJxWB&Y8g6-HP`ATu{AAQ=SJ7MYx3e5lg zL%w*|$H)A!#c^Uo>FpLB*8)dsY-{E@kiAS*M#?-k)}gVF0&g$<{uCE|@bBl|Wnqts zDhhy|Uo&jcocPlXi(dwe`MwK58EG+N+QDdwQeLdWt+DKP($-#`m~^d2Xf*x3Jr4t{ zlxeo0Ju^Ch`;RtVqJB&xtaQy;*8v~|ohpez?g*bjLu2gfhXrF(ke#bjaVz!e%toBb z$A1JEhQG~4bMy1Z0fuw%b57-7bmJGN z(!liK+JUwsS!o_MkGZnu4w%0I7e@b?cBn?BY%yf~(*+EutkfA|#q_P7F7^`x{3v)} zmAZdJ1MC0cP9$1T^-JSoU_eedZ-Hi5_nY!prF%1>CS!NS8nq+#UE)r|VjtPkCV7US zMX_l|AbtF(5K;Q!&BC>5_MP8P)9AL%OOmR+F@8@uLD3C=I~MhsSL_loYq(CSt_5$L znyzFNV|8txC7sVp-tNaM`cJ`L@&W!1-N`rpUO`8R*gZJN>7u4|#hcKQl6pxTMbsbv z+pWT?$GY%Rv5~LT5WoIZwzZEiwD{}S;smRC8fVK}#s2(P3DeTq!}te| zR{Qxb124Vnu1@4P;`Byfn|eQ3&t?x98Ok8y&S@_1rO4Rg`=K4g*o!aZh#upioDe#c zF+Qxr&^qb%l>Ql$zxnIaN4Nf!oqSHC6;-Q@jN9Y1Msq+-)F@rGzf)-YS@OKU^6Y4= zrMtr|^TYGm`Ew1KN$<2?nK56NJ$RgcfiNu zN^+6fm2-i~-73tt_=)p$Wthiq6xYorm>l1>KcNv@PHRlayZZjXZXKtgGFk74QHoQn zRA#~WuKOerug@EH{Uusk+tMfldBH1)+g@7#d=A}k-XPUBL=2SVTsPUT_7|tI2xdL^ zK_;Jj*1owuEDT%M3GvyuhYTo2F%eueQoRw@v;1{cFGnQ~UPUP6_EC{UTTE2= zlIk~AiYG5kzcov}RW3BzHkZ@2O{Jfraq4TdnMOiYMKI?mpocX7IMppqWXRohXWd=u zph6Y2raEcHI{GmvYfaiOvg(0T9?Syk<%bZi$#Bx$d5S8I+>e>r-)>^{(rk*G*-isf z!8H1uj;=-d$eA@T$pbG2NdIj-o%xW44oMhZS)Xj-)`D);Ld6Y1lQ0*=JMZD0ZONQ7 z&UBBI4E&06eXU=3$*`&wwCP23&~F>?Xl<)jop6;Os1_j^lY@D?HnbFeDF&CIsHUIy z3T^)qw&FDkg^(Z~3}7%2jVeUqHm)@2y;ML6MOi4S8AvL7eh}Dqx1bWK&biXCqE-3P zm%0vmnQ`H^H{Y?lZG=}nI7e;6X7lmTdQHN&J1@F6+Q-d-gi5$_nRiO_yFkto^V$gB z!M#U0^e)7MI9+8SWoS+cQ9^QO;0(`;m>ZsVG4~~V~&dHxNPU*Uj zYvJH*j}PKBx1ChzzTdxnzOuY9#vHfxrq}rDDJ9+Rg5K1LHIsWiNfS;B5h3i9b^fjc z5HrQ%sV@49Ro{?4Od#YAbx+(d!_JLO>3wLxhu-mu4VJJu5(vHo&KxSftl?-k2xRJm zn{>M1SM!{9A)?nupQsq2DkAPsw_9F=8Xp6nhD59RPu#jc7F%^9f9)a;lyHTJpwdb$ zV>V(ID+P{o+Rbf?j8cq>Zi~JhjBRMm>y<(ESnWKCl7#V)fUuk?v|*l^a{? zcGW|S1%URY{g-r;M25kYho1gY@TY1AzrHqP{_T)WMtVjFFQHXmf#9j|eMCL#3iZX_ ziOJ7h8gz~iBDj_Zu5qsBh4iLd7b$6R#piZ+iFzT37yS!zGik-@^eu#|wWylg1CcBT zUzKCa%!7*he1?~rx7}V2I0lgB#X~c3kuwPJe`VN(@xGvr$`>OUiD|d<>=&8`pkM4- zkUFcti++mSA+>V{;KcAk&{|yZuOB$4-ucRgN5HKUil(67-C4Fc{=6Cv(k-N4-E55D zNqvRvq~^kFKJQe^kl~99;T&0@VaWYYF%!g{zv~C!gC-13UL?hE!;qz!!vrwI2@Dy* z*jp&vVd-k0TR!iQa}J_Li&i~U#tw8R)k?53Ou(0k5riz%4~y_w`wX!YAC7aom2S+ngc-p~n?%f2WMur`U< za+&!*J~GUFL+D&_nxsE0$>lX;7_qf4T9xuwoEaf==&idgw0D8$-%qdI5pt|OO<;LjI01ql>Q=rOP* zCXq9p)pvuobHwFYigHxHOZ0-92V@Zrr4db2bzkQLgibuWb4bb4h;nrFGPeif2&Q zkOcz5`l4m)2Q%ASJ&s5oa8&2kL>oH#j}Qh_aOD94of4a>obRG%Os^&6mJ^J`8 zPOwj?cnTvEASKKp+rFFUF5wj;%$EZfEDbSsdZv#AuerIyPVM|~!ZO}fkvze^m7^7_ z$~PCz{Auz+z8>q6J5L|eJW4q`;vy*b13VqocsCPF7Ol2%1NwFR8`ay{iUPUi$KYgd zq8nwr!8RVc6;mIUFn&YF*^_t4&GePeET;A=&24y$*0g0St(7`MQL=7^M`#@8?W7F& zm{v5OsO(X%|3^giVa$?h#Y6^*cm#~4A#Ep1sE)YeUmhiJG8$#ihndEsgC4_{ZeheGYeS*sgC>39W-h7>Lu=g+5m%^RNjVe_L zY92Cq3{ruJ(8^v*BW3!ZGPj&bhW{OCHeg5$dO+l>OF)Aq1f8x;oeU3mUI%BYr+B1pf1E%HNTStr3Wo;doYZI1Wa>!Z1Y zZ%-V-x3YcEzk#?4-e^sT=p5Wr*BYPwS}3eKZwSVQ6%LJ!8`y^EtfcP{8Y_9UYlD84 zk6u_%Y}DjtzXm(_lL*x?f;Fx(2~rEDBINKp$C+a*ZmTXI)k zMEL>>qPZ`kxTOj4FuzDnK1DIR4QZCJQ6uKg6qPxvM#{*USg=g| z_)gUZHhIifQAqfb{vT$>IE#(%8&I3>&|=EJ)$4sZ)A|)Lmk!6s2JaPR`$5K)hK*jX zm)Us|-jeNC0Rk$W6(((UNY0Myp;aAtIXqq1<}ADLw6f(R{PLO^*05<8cY?tsbC!MF zev;blz^BVzAoKcZZ4w-!zh$JU^IV3H^_>RYZPw8ubmu+oePXVKxnH5zA=BZYL(ykA zc)-#x+J$HHE6Rb@6ipPlzkB9;%2zeJx#x#As2M>TbY zQ!zi4J!a!k=H{s{*@^cs`>+}Qtnv(;5#H%1)J5^c}!w|B$AkmYhP9a?QAxQZ<<<_RD6o02Y#D`SPMv?wCHvNMnT@O>U6V2E zxqY(nD>q408VqYGPsV{sHgxx@R4;%$Da~nc)PHuhmp~uRo>}t9uu53m6EDpIMzztK zeO;i)aD6%%C|aAsvJZo=ZS=N^%QAV}AY@$cmslvXq9{;)b-UnjpeS&cw*kXIO!Ac5 ztih7QCAaU!Lho=GSd;3b{7;elx6kpNKQg4a()B8Sa9;Mh)v67eVl?TE8-2V72T~FD z6N5%)A)J4~qdW;o<{PJdK5OG6Zxf@hNj!tlQV)p%q&y-Mu46}5S)zZ>K~|5y&fP;} z+h8BK&tr!~l1)>k<#EUJ6#TtrROtyd%m365nvKryF4Mr~EKBGi{HNqxX9W$MF!#1P zkgCQ6&-vrT-}OO15p;k}SY``BxK%b|Xa;>3>R&FWin6BC9=3RJnI7N;%HY9T5iZgee@++;noPDQ9^bMU~_1CNw z=alx3Y0>e<*B-H~FDPm@ALaaB&%5~yOAyD^You21(f24eUOEVmmqO*hk@M-Ol{0?2 z0=O9jVATb$mYQx6$u^(b*E5?*Q$$8_{Tq>132}mh2D>*H_|8R+Le4+YosB=fTcD_kp+1@Tc541EmM;QhJm2oymnd{8ytT2c zc;i#RM93D(eWZn1tQ=LHBUm+yjHA2AEOM=f=3~`|Xcw%4Yez0Y{9p$E&~Ji7 z8m6;O7NIt^af1CJfk(1jtYP0`hqYNz;*~7TZg~y+<%q*&xD+ zwz4@nic~zmD>tm#c>{hQ@H0j%rnW$6)q15KAquXX*>P{{ z`C;v>Ch|#Lh33o7bwjU~T;s!={+;uf_3N|VLUnJM`pguZz3h}k<5N{v8ZOM&1_=2x z(EdQ~i2t$jNUb@gFQYz*inF(Tw*90(hmXGNNktewihSAklTt}ZsCSy`{>>;)s1qxR zF-0+00sJrSf<$(a*$?hog#M*(EPcuyk8TZ%eAJQ zcjjr1ggzb@hAADK1fvxF%tDg@$IuU%D|J3I^DH{|w|jrI4KfH7!OlU-h&lNJYEm%i zL8QT*Yhtuiiz&U&;WbxyAAs!A7;g9&GzocGTU=w*Mp6}&!IPg5cbxIw;i`IY0)5f! zRQtgV%iXadpRro$jB0JDPgO$+8*pIVY2pJ=2P!6%i*T^`M@<__0N6W^8ZbKY;upbC z|8A%U+HZ9409G6;*pWpT09BV$;8Sr401P&bjIp{a7}F(~#Wyss*q@tqnq$T3mo9m=ZaUqYsPYd&>P`#g*l$x)SU+LsuSt23=YYL4JC+rgcX@9)zAW;W8>!!x44MG zSeZ5TasJnYv5Fh$eYuxKk(N{b-_NY^4D5ml6YuUD)dSUhMvwlZ*6l}EIz9Kcm~nN! z6J zfs>DE#${Kuq%9Q~@D25^4i&m7v>R1us?xUjBNlJ?0K7Z3*j`8}XF9?ZJ6@DU1AJcHHatqnfV0h3(#*2a;uNzAv3ltC4vaTfmbECiJa#%5y-0L2*S@?;HdPWSZ zC_t>s3|=dF`+{rZ0x5>&p{e!VbaK4lN!{Jx$dz0OQrRN{LLxi!^x|ELVg;p)JS0Rt z88m}bH6yf?Ey_A4lGYH0t;x_-xhQBe5&S+1LXhVQ8<3kDv<~E(o3CK|I)l71dXfAm zu+Mc3>^L{UK+%cL$j7}*#o(EOc8IjEZ#icXcD%ph>*YI0-)e=MiTadJn@(g{!9=-t z?OJ&ana%=XR85W(<8T~%k&UAi*ZF|5U-H#tS!7pWdpn;ai<9cXqyB`JGB;;2_}BtC z2xpi5K-=1^g@W0>W^#IY~ zR%&zvoe1ifN2QT?AMtB*)RmYXBo6=YEr1?T?*kD|gfn-KO9%EKMT(y(8qRZrPA$^B zkvUJ4H$E3)GSYmpu-KhDL@&Yu$&IzhQLf;4SF6^gH^DTNycG+()AR8LMIyUbWae#2 zsq}FT^sPiqdt$T~W{t_Nljh-t{a2TCTcST)T&ncv#IA+qIQHqtZr*>GDH3luVB?Oi z>5jCsX&mM~z;{~-o%PfKqEXWau@B@_Pb8r?Pl;`orcV-Z9DEHmY~B)XjR^VBJU62w zMqE%?W_(%(^7&u{!ag{bBmJOQVB&<+ht`D4uKGHh#UBA>_SZ zqN1-Ur~=Sa57iGJKt7argyZO(xdkf0Wc5}nx0XUAlWLulY>t6XhZLF>2fOQAZ73Cu zlH3@=#8DZj@e|@#V>WS$VWq0a4)pu3kxIqia&Vz?B(=z)2K|O0`BU#!4Eq2E0jD}*~x#euV=YxEr+m>^s zxMPDU&EH)~`#9F93^dwkQwbuVw#bRW8^vGuMan#GC$UnO26~h9=O*aQg`=`Nz+HHq z0e+l$giAtz=SHEcv4nPsKKY;{tXj-9S754?O4`CapvcsL6V~xp_`=;q8NR(mn-l<( z)fA^Wf2Akaj9sOBhFW;v=B+{1Q})`rD$CDUC>lS`G^+I0$Afg@lz~V#`_b}7W;qHK z^r{QOq5C?*G~v#=+urqeZle)PGnvjzf9#gv7$(ub(v*O&Opae+sF zSVIln5Vmmjo#u7m?{8!?Gy_O zBkaShnT^0U6tdlwxnlrL`uhF22b?_``S0Jqu1p;cY)fBgNm+pJ%r!H49rL%GWw$jj z$1(e41JT&9IF=1Y=*ONvGIG1N%kNYPsr2Ei+B$|Jt@}Z}6;e>czZ~!<4kBY3B#lc; ziKo9aQ9|p!Hl&~e3Q}e9vuLibSw2XM%hkq zZ9F~KZruaJ_RVoEU300ZSW(sEdw5uiDAOjdKSTR)@bbW+K8!lBxBR3v_2@%JF~?{5 zPyXSI+YcMh&tyP_;?f)eZbNa@f_jXd6pa>TKs9e}MO0E^#APRN;R-I|uFLP$iaF%~ zat@xIK*WeHM~nJOKc10K$nnDft;fx#u#xaM3k@^M-o-sJQ60ipEvh~3Bx{1@+NYn}`rarVa?YNXaMU;%{6B+BOV>IfHNbpq(Q&!BO zpZRr2hpZ5ki=t-9?(PXCOSat}ceiZR|N7l3y6*RLZb7D74(Vv35`1OU8WZ+IxQ#Hf~C+%qM=-7-$@33o9S{j=W-!ZA3Bt$&pbl zO8y&=kVb!VziE%n`;HoEuvU6znkNCBY*4t6?Fu^uN{OzuHLbG9bG!v-FGLqb_o4 zK{wJ5x7mmQ{*~Gn9`{XN(*wyfd;MXIpN}LkQBxt@pgz6&o`l}qJR4N_1q4c9o_qk zW_xV;EG^e`&O-^v)WQ-H2K|=DQ#n@nz{c#KAam=Mh16pdU;}7uYip0Pt8D=?|Tsew|wMMjE&T@s-196^hi9 z2!?n1t{Kng`9OqiysrK2-)3(PL$_%zv`;0+Drl&_PZUJGmu=FeiF6i{*a-eu0O)fc zPhfku?dPdkjpU0+xc^ak*&;BFZXM~5mv|L{`s;MrlBqwPxp{eRw$oOmhM(wm3=}7X zouxfDMa5k6^7h#qi9CZg>7v;Y)m3vZg1gbS5if?`4Zi2m2YbY$mW$r}Y03OZr_tLU z+}UxM1ev! z;=1b2FNO(%ht`x8Is7g?oSp_NkZSg$btqX^AY~HwtZK)v>RQ#l%%BzD;Rv<|q?wMq zWqZcpl&v&I=fLp1{UU2c)B3kycX7j%_CP*AqVvZb^&w zoxrqtkw~94u3RI>@9-M+I^e}`HkOJtJcyRRh4wmujRmGLt5)U**eMdgTwn<&O~grO zML(Xs8VvX6qQ@sl(u8sWS_%(Vo%-g04mGB#j=@ZKMbJmJ5ooD;)Y6sUDjlYz6qe<* zr4=Y%>wLpA?^kl<`R46{S2|w{;%<+lI$xH2o#Efk+`wS)j_CxmF6wg(N(}h{k|rtW zaI(RW-}ia5EIOjVm}=4*t%<=BfSx?VdKjt9Q@9vpL-X9~cYl4dx<6nF!ddL=7E_<{3{MdyfGH~DUf*jhv8%leZNIHr z@9^UfnU>1kzj|Q@Z5$^{xTk6W10?FE=A8l@avS}@d+t)&Yl8_JnuX7lFYf0BJh6F#J=UvmD4!GZcUU4DVMeOIVHT(`e77E!k$Ik>v=p4YSQlhw{NXx8*59 z8MqbbMzub;O$1ueR^LfNt_SpATr=Ppki1uio}$0l%=(1i*`Gg{Cmlrka}=W|;ug8c z%fq$QhtJM58n4^TB{an~lv5MNkuypiEW#Mb*ARliPPIH(L%ddG&jF+23e|PWR7LZ2 zv$2n?v)HkR1Vg-a6Tcs229Wg0;ReP}CF@7DE~_nDAm1L`c-#I_0UPxhWAg;^#pQfi zj~_*qSM0m7HRi-MT8wS(dadCD8o?+Djk#wM3P1t7H%wnNwVq%l5Fftrcb-Os7Yi{? z9-OZ7ZO^HLz%nO?{|lML#jg1gen$`Im&ipzS@l?4dKXz4C;1hzdef1(p`A%DNm&g7 z4eW1@fLD+c%~Nb#_Qz~9*!3B*T$!>lT9cEYzz<_IBvf`qck3==>5t*hPH|RhrA{vS za*J{J)>0yQKiHm`$w4%4aDG1He6OV@>GbrCng$2$y|b_q<9#XaJqLp>OYW07m+bn% z1XNb6eWpSD5SJ^PqMW&G{sEZheS^^P`Rf6{ zfa32R5yMIB8LljY^nt7;*-jp4od2Q2yp)OMMkM|U5qH%o?G|J_7Wh2 z5G&7-d`5Qp!9iYiHw|)Ww2ORs%>$6K+uKyKxI%fLO~QSiE|0F(?K+RSjBjXx^k>4q znVAeIOKc$P*N2e--0z>={bb;CeJCmK1eMhxzxV$VNa7b3*r_HNzih`Ef)k2BlPzC& zaw<*9dvuDyVJG~aDZy*KT-4b#$7JS9_N9s?KI``H#qYD5^eLMfQ2F!Wh0)#m?`BQS z6F`-D1~Ru@3*tta2RM)c>{#eTk&Y{*pMe0H@%D9kn|}x^10Y4wii}ChU)S}F*73K| zIa_ROV0849(z2`P=nx8CqMLh8+}9cTR;R!;S$lt_<-|k%eN$P`;qh^RtmXaIgRNTM z{yb4>8HsqekNsriU<{rnbT;x%T2|09_V{Y$-otWi#eUV1My+fnKZ6joY`o-TU>Ssg zfnKG?f@rqTZp?D>`MtLWI85PB7z^YDy)G8{JNgA36N9(Sj_gY9=|EWF;pJx8vftZw z@bN?d50mR*Tau?}qIKP2fYHD-=;MHlE#GrN#33zx!E7u@1|t%e{_Kh#D*J7kZX}(a ztLGGh3m5F{Slr~e2YkXP$mQBr13qlaw>mQN?f{%$t{hmC`Nsl@p0M~|#A^ee_wUV5 z9y;?rseEfmXGU+vflOt2e$u)jGnq2Q=TYdTM6lK z7WvzMhi5&3g)c37ew*ZE?G!MMYLYKM10hD%UttI4!d6M4{@KY}AyD(>A{0%EOROeW zQ*U7YD5vPl3i%`-2ryl~cja86zB33XY35%X(`momH*GfJOjN1)GfXi*i~>|GaN(GD zSXY-M7Z?-tW64iVz2X&2{L3V?$|d5DKEWFX$&?gql-9(VOw`U*{Mya49)fJ+@0`md zh6}Y8&42(rIe<3&9yfZkI|b5y!g;V-YK{Yp{td`{R(Vn`dy*<;^^B~)_rpRrdO`O= zek*iUU~Zz-$`|VH_eIsUz2^A!8O`HgV4UN!TZ67+Ay$S#qz=b?L=}dV1 zO}IXxsxb|YP&L}3Uro!_ox}=2q0z$=_|1>@0my%a3yLZKnq>cJ%hxcTt^*D5!#mWn z^zy&rnOs;nh=V(p(Yv_h^$o;ZL=|0OdgDrtc)21(`pBjcI8NJ3uP>&#njz-ohOZzn zXQGDT2xuuyIRMM1Ou(+~j2>VOz_KtAINYCSmo|DeMmQ_MTFd+6`NUgTEu<-Nh3C@3z=X`qHOw;o?~)6Jv}WhEp2JfA008P z0d13P@ly1U%gT89G7Ry!TU0Ug^#O1h9$Go(f9) zJ@1r7bl`&q=fli*S9~Nl(c*vKZx`0rnJVUjHTAWZ!;tg?Ja>8?Q~@M4VoMq?&!GHG z`&H(s>4=GWdu&mWI+tA@vij1q+{#9TvT!GzJdcr6U%(zQV0TNG0`jXv-zw_-^OPTI z^gLY_IIeD9e}IIZAO7u>DFsN#fiJI7E0j+sdw!fa8z4+|c}^Lpo1lBsk4o@EhNN0DxSfH8g+;-~c2udL>!Z1*8GfqiYOE*1S1hpU-w>?6(49X^Tg^Y*@fT`4 zN4`}Nrq;YD+ouRA3xxnb>?0eH-=Lx!byeBdx)F*4UX5%O2O^+3-+N%F4LAo!-m0c;<9+tzi6k)XT`J~71|v*Q z9;+kb;w1*W??EA}zbM;92p!##al z0use}zz_x6y;nzou|V#vM&BPf6VV8YB}ghvBd4h#5x=Va7QH{4)P3}?<$yG57vMsGB=$T~glx!(U^fn`yw^>!lf>R*V`z%oU!3KJ_G%u4-;-F!UhWJ&T2b+8pvI zee9`F8{cf!J{~?|1ry^wx<>l3)C%%?;$iSFG}vQ6%fefuHMXG4A${9?hfbrQ!w-^h z%r!UT4FMP8(9Q1zfd{r+WEZ>wx(vh;z5TBFSXd2c#E_PAN;P=-%VZk+D49`R5wu2e z_-dRiy-q6*Zk+{49kQdly1HsMXf2Np`6T-2CD5xX4QkK2pKexY5&xKVuChYOqQig* z8YgFGO@WD-iNAhW8%~Vxtd0duoGmeVQuofZ_O&k;p`Sv&d;1dh26IzCHy!~uvgi%& z_^ZZ}7G^~jh>;ebY}V@jt?d1VITGQMBoV%$lETd7BpyZ-xcP^HKDU*lJ9@O02Rna? zvWSnegYE}qR@*nFdB}5knvcJ)l5DJ<*8b z%JK~O0GmInFmvq*P`s_GF@vw3m~rhjqGB(NFyy`aJWlrkFtoytRYmX5_!jaae%fje zc%X)rmfp{pf0*`&{=sfg^BLjMsP-0}0T?D>I%;Cpj<%A)h8uThIq}CLayr%}Sku&4 zm>ZYINf2xUJ zBo+r%yS<4tA&CZE-BO5JC@GhR z!C_Xeu6T2f=_Y|6_) zEOo^kmOJHhbTm~#$nwtsVr%gkJ_?)l*7xVYGDk|dz=R7K9+{1yp&?*Q#6J5$T`@JK zt{Dn?#osfU(`5=E;p=}d`w2g7-iYb!yr@}UNi-Pc!BW%IjNx@VjHCLO`@yU$@V?F9 z_QwBZuNLu6A^Dt5BD>TI3Pl4piLQ=}ohLCA(DqGEmcB&2nV;JIF({`zOrVXwoXMI!p7gfsPgtIq7+Y-L3#Kg*_MF>ZT;2fm6lLP&K)Q6 zp@V#&P1!C3MRT(xliOnb<}y0?EA$DEh{#a-s{bNTGFh<%p)g=;7G0G+lUJ~5USSy} z|J90>2tmW|2s8l#jp<9HS&Ee;Yv<~AtwNUr>VZy!P+ZFEM?>fnQ7Ee9s)0XFr=j_W zED7wDBulrrjV0a4s@V0VvJnNm=lTwJ#GAUW#pWl{Qi&SgeK9GhP)AbD3sXyg-&qKE zu!UP}3}Em?to$8~ecFm}jC(8YHY;uRWGsxaP3pUQx$3v++ay5mQx0VsRBX5gEB57~xf zx$C@lVYyy#Uoz!C1{jw`S8h}>sx+cBOWFl<`#%RF47uUGaW~F1G{S9G5&^Do=&${G z@tb%?)6oRQl8S)Z=M(9A-y~X@vzS0M_{R0cvo^4YE8+corv3c1SqIFMy06b9R`Iy& za{!5Uw2^8{PMj7wfzdPJnB)euzpmqPHmml^zg6oZFCsL#Z1Ro`_DltT9ZF6+nvwxP z8ej1wa&$4iKou5@B68+_)NW`@!0h4!2LsyC6(yGP0C!`llknkHAe1Tk4_y?df{cQKV4a z*HMOQKg;h^L_;mE>OmH`RBfKWwQ=C*cSg}C2?+_VVhg`r#cJo2EyLVx{6Y^yp?X}h zcJj?#tTlpH>V96;Rg%b~Dt9J7hbFzK|HnFhPT3HdeAU%sv;QJRx0Oj`{-tzDNAB!v z2@P{jUf*-qC3P$sQg4~A0++1d$8T2e-{&8gyI5GzV)bpB*U0lg8slp3xL{mnZJwBt zD5=PR3ihymN`A;oCk36Y2T&xC<4M70c4hFk@z<2}T9#vYsc}iVN=t5ifp>O52(n{d zWBYg?CU`+C>0|)sc7Ls;0#WZ99*#XQ@|z&ApEE{L9W@YVQw^5Kt*S6Zl4&S?>T3Am zk2qH$6eHsEV;bm8C(BN>m4GXxK@)VOH#!4u%@O|Ka7DctSze~7m^&)3y(rn*=(r$2 zL2d46&H54FiPS@Q1hsni;RDr&HNT1f#77bsNkm3Vd;2#ZVRue7ldCgLNv7+JL45E9 zXR}!(gOwWSI5jjg+cQ7Q6SIi$>Da-HRalw$IY*HE&>lDwV@vYp9ZnDBo&**Z-po$` z1O3B1zx);Nxf}%aV-E++%`%v7{_f$M60bArB-C2w3<~Y)G84a=#hip>x9Z7^ zvvOwXeae!Hqy&^L`1t8nhUkRUTqTc6+05r#3_}Fht?hw$Q+G1AD@%aWKf8bhZMC2~ zpN^5wsX#w90EvW?q*{L&d-Ynop#cozk-BZ--XplAKe*NXS#=4gx`$*3lKg~zLepQU zkz%Rw^-J?KGkB6dkPD8=YysbK;e+8JNPqZ2pVxXV$xwi$QFX1YOH=Oq2JSle#=nipxZv==f@V#|=g5B^`M>AJ^ zza55|r^nOT%6f*NEi|@ymsA#db040c$2eRjA$|HJB|J%EioewZ4z&PnV!Sq?KtVyl zOT2v1M+5;pfwhah{`!7fc$*agFlw8l=2lq8OR8O~|Egf0ppcJhgE{i02tx`w9g#B+lQSu1yvn1$Svmnr!3aoo7(R$_Uzu_&K;XL%`CeQxj?=Mo?{h>?m zvLxF)6F!d)nXXPfzHIqF44?C=Y{+I@UwS-TbHAjRMP#X=0BgZQdM>vL%LO9goKuHy zR=Y!97(v0xUl0fi9Vko}21Z6O-kYeMyo~)t9Gh6f*KYcl@{GptNkZV~7(I=>-L>eC zR_|@o_OiK5Xde%chzL3KJU!-dJ_?gG*id&%wqyec9)v)_(hbzbQ(n|SkNNPsdf5>R zv-Z&EXEQ9E_n2%iw!LBzldvJw%Rvz`-&IVHe z0d0fRAAA9bK$PoOJVR10Q$y50mBptiQGmUTu_ykxxgL=-e4aE-rJ5TC4Fe#;@Ywpg zFiB=Uv3@WIi5w6m!Y-M24R9e*u92kA6l=|VXZ&Q@^Twyq1o8tURMfCY0SGUk$(U87Jy3-FPKr& zB9owkrWg@Gq3iztf?(7kLM(ZMz!pcK=8KSXa8taDwR$lAGY){*ECp?2hZ3fVW(?`5!7W zFZ_Y2x8B&2jcA|cO@2B1L025P>d<2ItO#N#EAD!YS$0}HGf zVt;u97zXJU>e8yht{@j$qs)TW|6&^+>A<@{9d_lo2GvLq3~J4<*cfnAB}r{IA)8>f`0#E~E=#_vE+z=#iVL z#27X$x0@n7Ec&6geB^*V#%z?)el7!6P+AZ<_d6iTSSlcNpcj^8rnW~B$Qu^sdn=biV#R#!X~H}RfTqHdlCpDS-Oufy{Op2)WtU`8(>*+qHw%4+W(#-9Qpy@Ip+QB@paRul!u*ZK)v`_Fh^i2Vf zbx;$5Hdkg{W8+@j@R1$c9E7sPdyjqC);pjnf-aVhenEUXQ2L#(hy|$%d2G^@}-rPzB3mmt3GxV^#wE2)<;p~u74V? z51cZ?`TAtW^$t@^&IVetqW)`AXVTIO$@p3NIwVRro-@cBsD4u~t z$CGxwmW+~f%@(BRoQ>@r|4$S$^GUi)@Icz-L@21J3OV%bl^~a~i3w5#%4x1J0z(k2 zrRB~Cq)fZY0v;q26cp5|oRiN1gTCZ+#+R2XOufSkCaj{5Od;S+e3jE4I@jnVJ0hte zPBR36Rw%#izS#c3!Am`qQIy{G|9=-L{5GyhPSJEhfh#k@?q^+qm%BSTP@R;|p-1RB zwvUw8y1K|spF3V$6z5*X0!cFw^Z+bBC42wtzk%dI-N0GQ-@#5;zrM+eUSA>sZH0n4 zQ9Hu2r@{&UD9C?qZ$|+&_svED24$^(4CB$f*zxfb)~r&@%S51Go>+i`;=#JOu=w-? zadU8WHMfC$#ROj&Fb1lss!~XsjDQm%9{rIry0_U@1Jwb65D~>%{O<)0+q#Rnzf@<@ zh0D7JWF1qqguLXvIvGvv(3ycGBqq`m;J16cbr1G+aXAA-bqYI-7~ot(!(UPmI2Bh8 zY0i-th^32vfhMVxr^~@LWh+{8i$YprKO5e5uVrQdeKUGuqky<|!pM)9rMbJyu~4t)Dek zX;^?{#7-SnSA_&fEKXy#xXyn|5dL3DR~`@L_x&GZjBO02Y3%zNL$>5&NsPhRilmv6 zec!THC}!+S_E02QD_gcu$e^fX3n{{gk`zNJW&2&f@4TLuKg`^7&pG$rbMHOpJnv(3 zB>a0;rW)n`moHziU|f}`*#B|I1noNjlXFHMV>Or+CfpU`K`0Be@A}7qzPVW>j)~pB zcBZy6XlXU19`5O>&++-GPinO4@#BBYOVhr_tFYljXg{G@;EulyCMmw;G>?BD-lBH>UJY4H2^wKyd$oo#DS#27fn<))Ay!g*E&+E6dn)=6qaO$OLj2IR68h*+-CVM{r)bDZsHn zpXclJ?k4%%#SOF!njL-ahcnaFH6V#%Dc5?+>4QDc!C|kMY3Bkk&?r|V@Ekp`tJa$v zFt_$7;Ii*v$o|{jB`U2a1wM|9Iei=CNno*e6Z{7@XS78#T(4dwedU{k){la!75m3W zjjs~NJcGRgGvvtnK*KI`nGfmU2TaV%RxLTn@L z)&}``?3Zl1`dcM-m~@@C8y`&_lp3!FLKU3m_@7Xs(EcMYofz7Du(RT+JktX6gjN;$ zcDA!zT+=X5oW-4Y103Aa)r+)A96-^>*k7470jjkgTESis01J-R;!?SaEV z4CIQ`(b17ZJR6{mFQPp>B1me;OX}RJzebY!!<)@dKa(-IColp4kBvT6U5|3TeED}5 zpMRWV+(oB~QHz;CVzZKgv#00%B@D_TIP{*`Sa!)y+!ZZ$)$Xfad58OV<2_F+yt@5B z{kDY*sO{Sq{sOO|Kp=eh{nfstJI&J4&U-d{TVKKW^@UWIYlB z$D63`N_dK43B|BP++WuqrV+f>C}nG=I=k=S>GC(b>T+ zRHNDHg#aKYB&KejNjCPqRoos+rTULn z{z{Ly*o=P=6Z6`^8J=o>&Y2t>83&Rv09j}LgabacDOc|5TnWH8OLSPade7@S6&gE{M_9?7sIx?fI@9I{&v`s=Po!GaJ{+Po|u(&$Lox? z(abYq90uWc>6AoHE@rP z7K=AjiFv*K@3JajD>-hbG?Sh@{_4hzZ^g9f8aOiYABj);?TVV9HL$?s=p z6Bb_9hphQo^!APag7q0s8eaQoMbhWvh4YWqKRK4R`Ixi5$Vr&R7mTp6F;AL}R{-}S zQ-`mIhlh2uM5zQdj0Q^3wZgXep%l08+2Sl+V(5%>Dv_(oz!0A*H;dyH)IU{vn!j)3 zwfneF_d3j4rCqKK+N%Z%%ShEULYO*Ef+Hs3&OxZ2|S!fyR=&2S|<{moHsqp&bXKIfDHml}Xd40?iX4N0^EtSY5sRy+cE& zs);HvuliK{07(}Ym%|Aq;8JrIVbMcp)#q=H(%Q(UWD1JEp} zD3Wv7KglnX=F<&Se+GKSMnRWcJ=s8dK0ABYOZ{n&hQEbHjnlPjTnVB#E@r!wsLIr6 z)lt*Z1QvsroTj@E*+B4KQcsF#bt50H5)I&r3`UM+hDwopmFk zGyU2L?rBuz@s}Dxx9-??Z@m``)zfNlHzLg+zuaDzJ~$}g7Scq0NsB@!I6Hy3Ndw8E z`G|8jg7E|3F&FdrC)EI=v7mCe7!zZq^amSf-3qYie7RPSP{}A;K)?f#zXwn?&ARDI`r3MWyUwG=FOlpunxqRCw!bc3f87--e-;3MzTfM*Jx>KRyI7=W9etNWBjuQPPc;-;lrC= zXL|Zr@87>4ZPv`&h=)~ky?ggg1L|U?Zxg1`vVPNjU~q5)z*3&_66_tJV`XLSGA;6q z3h|~ymA(&VGO_jnh`%!pCo3*!B?A{97@J$NgsWHItiiS}0aeD1K439~Ra*k8F3<@k z`U;?`34)?v6Co7NvtPfh2Qm>(du%D+%Q6*?@8Jo467v3Ng472O;7tFwy-g_OH9o;j zzi>e5d*c#zBs$NWVj9l1O7q%Vpj{VY1W#IcGMCe!BB} zeu3HNU%jxeq(9R+k#D(DX9a8@mIK`-|0rrW`K8{6g{5)(wI<~c2X36EQT8-LxW&)LSJE+slwUk@4c`fS~GH_7~9P|d91!kJ!P<#cyr)((;SaD zvX^#Ho$Shj*jZ>!0}O447d{3^sZ0h#s|iKJ#M>hCWfD{qIy?1ln$2?x9!IkF;tTmj z1|@Pi=9X5Fg3&wW_ExUGzG$7l4JX$Segu$B1`uttUm5;)-Gh^M#mdrhmnEa82M`rK zm@ffPG-PJh#=}GH$w@AHQGO2%jj2bMXG$rhqWL(BC zC}^l*Hh1Yd@IiJ07^rC6ROUS}s3z|wC!-mj)h2q!kaXf^uLFc4(%eHG;@r=POB z%Sfrhe_Gc9hD`oZ?!F4N4{F7ySg9=YqDi6+&z|kMLQ%wK5rqRMTx%=qB-eg8rJ!$Q zt}AuE#2<4SuG9z!lH|zws9Am(1t;_bV%-9GZEZsqnmhpnzx|+Nq=#{9)Wc z&+4l3x3En#r%72Dpjr~`#J77rGB~oeT-ak#?c0c8ziNG#KBcoqoFm?Vlovr%cWvMY z*Z3nzMMt|peJ+CMY6KfQPK@N}xbF__+XEF?KeRni!L*&a196Q1?Xo1|-<47Q`c#a} zF)qw!GmiMq%KR$Z*YXP$+Uec}2gxpKw=w=HK05%-emo;tQxe$R4eI7*7#A%O+DY=d zU<)R|?(TI=DnaH`lU1*ZpPL%N?d>+W*JPRHcIY)GeifXYuvWfrjr(0f`i5_~#eUX! zGXTWffcG6lWSey|^~DejeSp=R#n0eJlTLu~s$<^rhvtq>VJCo(Co(cpKL1r}NK&P0 zxs8n5TY{U~w(0%UBqRAXyFbnP0h)rmH&Jo64dbA6b8UHIRc@fR?x%!LHF1n~C@L^G zIQ!Z4zYtIY+0pSh(+<|ujeTC_#6Tl%w9=HQ>p;-HXryLsAW1e>vz8s5kV-R#=lXC= zm~rI#pet+;j|D~MgVCd27!Vx{RcX?S;-hg}T3J;Ioa<%+yygsgglUAhjRu#9gOdr! zrSxj*jwDLIJt=7o=ozSyjU~wjk`5)GU$}xKPamaZADQIW)LT_{XS_5dOD%Kmf><+{ z2q{hIfkdVqsSW$Toa{K1TN9ZJSSHMtG7tLv3|Ld^SGm@&9&YdwX&`Zpl74#P&gVz| zapBfVr#?N5?-Wfudugxcg6g;r`?yb#O#a^pYFw_y4hMzX!piFH;+nd2y;k<1$C3D0 z_{{-#3uXfNw)_ymjYJxh?XJIQ7MCKTY#jrZOeA3eM5d z#c^0UWN)~93%Dn|>^?OUSmLX!k!CP<@vETDZ%@9bvpek2jpe|LwSRNGo$641&92e! z=C!r`bYl8=Ro$m~wNNZ)e$q57e{F7BBQA$;EdwB3Gs)LrJ;Oi%MIS+*iyczNpj^L~ zj0E2aR1V{XpF;Ltm9LTi9D@PN-vtbNde=OX9cSRy^g)b;AqIUd^_M6xthQIqF-aAF zx;WwrGJZ`-uVOjrVyA$bx(8w6RGCaa&247r1dI}+CtYgu@E!@L5Wa&l2nAPOylhSh zJ?w8i(+*>CaWNY0pH!7eLtAJT?gl_ztQ6Et_Q62`m_oDo;gZ*Jx|ytB{Lsm8U@7D? za_^9!XO~=DK4lPuO4X$6rNs*eql75>?=;fX&}K>g)9>fzOrF>yHu((QH7xPq-2ku) zTI2|?W!tbYW)2-X6fH5uGa*5hVSi%3+6nE!X<*?cid*PBbq%D1Ofl)&{NI$(_ zZ=L)B!6*VvhQZYXNOTyqkfiLx=qaGZI~DN0svSs`{eLGOp63~FMn6cW$ugDp`d}Ni z3T^#PPEOt~<&r4Kq-Ec*S3VA>mqE`Qnw6e^0LIwnVVuoFBL^i(%>Oc0L$xgjDBbfv zp=Z7>E|TC1@rf6RCY?X<0@^`*&HQ>2*qWEs1b80)(%~Nnq;MBdwUvd%NQ>tyz}S%| z_EvcH1sxGz9u?rjdtz_=(6)53B5oWcWr0)$TLr>wmD7d+q_3x{YH;XD9N_2<@WO!L z9M?@n#Z0i(g2@d2PEk!wsg>TQ(r7RxfglUPCmWb{a)2P*Km%S}>@^VZ<~?JfiNU@e z^5+~CNu;jln#DiIb{FBTb1h_#I2AFUm|QzSSp&fM`*FqbJe_!$qWEI)ll#z)0EIl- z!qXWf-}3r1c$HW%S*eFFJ*CP`jaaH6jAP!KURYSTl%g4@C4?q1xd7iHnih>OHwjGoIstsQ#LVH61-`B2L!YDG6#&M8ea|G(*qPH7O8(tkKd0%B$ z{b0feBYvtm-kCqCe*p+3UDY#S!n8vN&B&nHHfSaenh8>hAx0DArNMP1&s`65VKbtr z;{u#gnXiCN)x(?}l^1apbg_r@ndy80i`E-rMQKVpMyk^L1O`;1z0+aqlgY~11%iq3`Lm6RfObQmoi0Tm#z1vf@(6ot2m*K0 zgUJ=}G~eM@L-w8os{=feS-@Az>yPfvKgYDwxxT(m7){`r0m_8?`T0E`eUrP{3)bNC z5ibqVlv=P>4lcmbrOc99FYyM4Q(u^#emH0X?c}Vl2Wg`v=|E6kAm}~@l(4*a5BVZU zcuBR}os4}ENQ|lU2B(t@c7Iy*VECXPf5&FhhXbzQ|DvGi{kEtf45s zYdsEtPXeec-5nyU?RIM2N|KQzXwMxDP={X=3BsNtgNr2x%Y}hLlO){0C<@cWpe+O# z#bDRz->xxWvv}V!I5>S+wuCp?=q}Hh&}U+!2yn%Z?CB~-GB}poMKu+*D0Rs68TCbIl`4k{}Rh$aGxK5VTbL5bu+tvr5sB3O^7(>na*rW}0S+M2*4Y7H?mK(|qj%@T3ZnKT;; z@YnsP(RARxQHm4PN@t!76WjCK^z3`z%Sm&MzI4S8R7z}E*;)&|nCQ&U%`#4mt`rZ6 zk#d9>u|QOFu-bRx;dzpN0Re(u9?|=g(AR1$UVba|1(O#T12|l0Yk#`^55GT!qLShvoh_Z5}l0E7}L>htJNcEYarO)YJysGhH?v|wCXB?YuV(!kyP_|z z9`zi$)0;+{0`*dl*ZD%6cDKJ&{zC7V7mZYw!`P=BLxS;Ux1+QCs`db`M z*T3Sj$DtMK;k@cEL5S*Z?V_PX>NM33{9D5%g7z86s*e&eawgRa){QOW;Hylt0@|t4 zmJ^wey0;Gp2DQ)33Th|yG&m(&-4BrrR0=#K+7x1hk2;f&c?S>F3p8(^sauMYDbU2? zevJLNJZJH^s8^t*$<$_0m-$-rOu)WsC=VAa-xJ^By)wDG0T$J2eUX*fhIZcBHKrf4vA1KF(Q5sVV_gE99t6WrP0QnS82K5 z*NkjKy~k>$OIyCstcrZ6HjrDHqfRQ|CFiACi--lWW5bEPp4@?ajL#aD*L6;h4aHOl zhgQq8}(s9BdFFan_iRg?fHf@j-CrA(RIi<9w`_Jt^VTg|9pxF=wP)gtt(E zA=%R5;1^iVyqH%%uOYW|16cxt=~~&w{i(Kcme-_+Xuf(yHt_Ah&z&$DA9aB8fx2K? z^@yF0qOTCMchp1qj}@|*sn4;hx zGo@cS;uEt_FJdZ6@|XUqRn>|p_n0Kw&s?v0aPchY%pGS6y z0|mr3rTMJ?^CxC^@Mz!AIE=+jSlwOXqzq7pVfW$bQr=%Wpld>HdPFpL=DAu@z3qkY zyT$MtL>-eIJiSa}UiP8X{3%*3?Rt>#8i$CnHWrIZiz}74W1565F-P^9ZT{4Ek_t2z z?$1a-Nr@cg%riE##+W}G(y?cL!!B&{cJxR2l#la8;r>Fy#H`9x7IUeG@+p&0F-(~W zi%6GRcDg`qr>yk{?W~PBmoI~f9iaT7YjWF|wo?)x%(8vt?_Xb~g_jGs zcH6jO2OPzytNc zFQkHmx82K(8=M}Frj(jeGnn#WmpFt?1X-e)R^d@R{Xtmm8<-Rp^KXhNpMRy?if`R^)yG7&GBlcTq_>#Oh)x#T_Jh~&!rQbQ z2344JEzVYndObdWmtEeH%3`jK=yW(*8o?ZNjG_F|(Y(x^k6~VA6Bb=Pp}@S9<G)FmpbhbMfq{1zH)6nKpdB)(-Sx>x%_YRG^O!wCRWMd@n+Gcr~*^jfPLx zKAeJfDkpp_;X_hsNX|Ts*oe;AhZcFYXKB?vvNpZD`966*%=IM`KD&B>qTX)g`f{e_ z;eaCi*_I*Jyadbgg!gd2a)q-Q|C!5hC9s%tluxcGl`5QHf?Z;E5Yx>1w#XLwV3+x- z@KyMGe!^%TH9or;m=-~_JNd5J+2-F41JpyY32*DCnRU5#@~Uk0LL~Z#u6rtQKVtk3hOyKMW({G)Haq<`U`7=% z1L5XBSFBjjL+!^7Pl?jWzZI=_gF-Nb*&7wSF5TIJrMQ77wiocYwT#s5N$-=2_KjKN z%y(Jut~eGxNExpLUBchUc%Q_PvgHRhCTt15>&|_DowK=We^_82#P-Rj>>X0LRXz{o z3bl17%K{A(P70a+Y0uu{XKv~#*9~Z=!d_B3^jABd(y;$z6jCIImvcgmusGsaW!GNy zi-CbjD&f1E6G~;9vO*h1ZR$XWSnYK(Hh#_yJ1o*aHSbS^h}MzN7~I+b diff --git a/src/res/HLEDBlackSrc.png b/src/res/HLEDBlackSrc.png index a2b423b0f22bd8e1cb5e9fa74ed151ff51b31904..b4781ebd5ff70d60ae34a536dea85a03d101b529 100644 GIT binary patch literal 11193 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 CQ03YH literal 18860 zcmXVY2RzmP_y0AMEh8(U?7e07vC0g&T$^O??0pMmB&mxKLiXN!W@TiBY?6><6d~h( z?)Ue9eENJorT2ZkU$66ez0P@_=XstRt*di~jF^!afk2R{-&N5^AaGF#1P(tDA^e0@ zemDvKNBBVVjtb%e`_H@9{MYc4%N}=)z2Fnm*ne@9xYPXMhnKw7wN)>DBP1l1BEU8O zlZ-%IN2sg(XW&1(y%6x0W-?3abg8gx(Qb3b*baqJWq7Ij9~B{i3fmLsG7~PN5Lf_VJtCGzks)ROp2trDM|MUFhKK%y&t*j9a4-Gkzn2 zJ3)U6m;UlQ!rL5ZUW6?|4l$32!J$bHPI-WMlB=$AOAUA9)^QL8+5(|~ut20EW_8YM zaHZKJ9Fp{X@pd(MWD(v5NTg58ZWqZbRrTe_3Xk-#^J8AL7tRpgsKAb3$G z4+~!>EN@2bPhCdb!C}6%n??DROjWP$=a-S5}>2%#DUjFG$ z*u_774nlrWWo6|L;yi0{`UCE`+}6>QRBOAc#!+rOYcg!z%J6~t4_B-^viVcsw*m0X z%Ha8Zdjz+AAv~DNf(Y8P%`7`;_T3JAt=ffFb@cz$xbD$IYlJ}9jbxbTa1VGRjPQP3S#_j6Y6Jdi2Y5T$Jd}4W703 zw)2y%u!nlWR(cV0?(Nsw&kxGubPwY72QF}|=)PpeL`7YhAX^qd+}oaS{OyTAH9q2i z*Rv#%;u%^qDu%Yui#+Hi3A z&RY~)#F1a{tt&EARC;;Gh*On`ntzM_t7I>PN6?Aw-#?|#A(rzIg7~@vSJ)Vzyk`8@ zOr=U?03h+CIb8~aget#eSH`NmGn+D;3IAd=tdKun%g^`i* zMrJ`;@UG zPL2*DpQ^i zcSt2fjEa-#4~*KtpQjIWQ?{B|PLlU+6kqDw381+4o5rTNW}Q_8lZRybObv;s0=IYn zMg{8}Ek&1kRSnv$4&KXCyilo=NVA-epv*tzj=2&zZ&%%ER~^MWoik?ZxFXQ^^t{|>h^*UlQnEv1Gwh7`bFthfzK==6UQ zN=tRY3ao*Ffuj=>;kU1&t%Rd)U#Bd}5?y7wX?(*V#W?MyQ>k&y_18}CG`McxWGu)| z49MO}a468=n9rsD`883UcP(KvL~!PS-o-Met}S6i4@oPTMpjhRwdvip_Na5)m#alE zKLMpi>s)5C*H(MiT(9LV?OY%_QX&KQ{u~E8xVoy^+uMI8i5RxC>9Q&i6)>3{Yt54w3*HL#AIKm zBzgxUTa;gQb#)yTkMpb6HMvSeSUgnv42i4VBKpz$w`CS#F)GuC^JIj<&n6jz=~&(C zSn;@xoD3#6^@5vI7mG6(xbouyXE*HkS=Y?;^t0YxwWDB#JffzStg3He|1qbima-(wU% z<;Uh_a}yDU?*_I?2mawcIXU^llRkbvWxmllQ1ZRq08cy5dFR!c7D?8z(Bz2B#0UHL z)#hqnii(P!%x!9=68{jMd_NP`pA8!gA-#O7T>;C3fp4{%v@JnMeGat!+U_7Ek zws8Btw|^d-AJ|IRP*t2xy%^e%O&K(W@jqv0=K^=6ATzTPk#xEaVJ9=0Q*`LoCtm?%i^A=hrVfsvEN#jDh$WGv zAAt`=Z*rZSeEj_VJ(K8a$YSNwH+OB@H6LCi>p!)tq5lC(`WK_BFtX{Lot=%Vs;YWR z-Zq8uYfq_Zy~WAbSfQ_cmdC_+Q@TzL4!S>m|ApZknUq=n^frGsy`_5pKK04Je*zQr zyuqIY5HPV7gIg*pdeY3~pC>2NADxrq+0&V8yj!cRGV^`@x(kyN}|hp54y0jFJcZvM%{+IrQ z8!H~tSBN$C2m|7b?kD#r`=<>*JwFd+mh~l#$+r5|pHMO9^=PW080ROhhno(;2Q$=1 z?KDa2gCCRG_4R+_%=ni3cgN@FpHEF0;)nltKXuAX&}bthEj88O_a^&5_Q^>g;p_rAc;?eEz4D@> zffPGso;7(`-dTdJ*kh#8&+J&iCZ>+of*kFEdakbmdS{#J)e?Kyn{U$}*3yX|1ol86=AS9rG!MF&%3g%=6i=-8Nu z6)8rmt*xl&)(k1i$mrRGjx1Szy6-H{YG*{)2hrJ+oVXWSDj4+@bIAxwy=D)3zaUmQ zf8qRJEg90DUtek+^5=F}SbqRN@`_}AqY>u0zeS3w{4gnuxRt=^ZQf^}8A6vjYscM{ zIK3rrt764RuMjK^IFDaUn3pPn;WSiH(sdTUeaSugV9#H!psbALm2<-2T2~a+4gQN1 z{P4~M2>-GJXxg4^)!0iL~nwvFYuwtG51JpjS{_ z96oGE;!`oS7ElU6NL7#Ki;E<83~u{U{P*v6;*yd|6XN$rR_)V$3>~gd7?dfmJeQ?M zB71gMKEQPxZ5?go#EULIv{$=trL9dyCur86%FWJB{pZgg ztJU5(7UPZ7Atn!X$AJbGqk&#gZ^HExWWcAKeMv#U1hszLhzRQd`yvK#DW zh(Nhc-c#43sj019S?&yH(EbT-#~IlV7Y1%}*L(HXx+W$ux36~qHh;)&GrlI&c7!`T zJS^?MyZo|!J>oL8PUDLn#tw1ABjR<4&Zef$Yt5uarw8R>tt0)61hf?hD~Oz{NaPs} zdblWabS&qNn2dvisV{Chntq`|Cgr8sPaDqUYs>Gb zxpcapGl)rl!=ch+`O+SyxEQdW{=D7I)m32L&F}MUey0+$WI9%oIi6r6CfmSmwx)36 zxs;LioRj%QEb;^LI%UUVYtY#AbaKLvk*{ALFe?Q6_qWA8XOtj@p;f}d6w}V5qV~IC z{lWqJ58txwL)`nIq5Q70;!`GE1`G)z9Xgwc3N+Q z*__^qvM}*W!)XO*S5(AX99g2nvsNJct05<7?`zL79HHe`nt}l|9e+#d%2LzPJU2$! z3Y-GX$3?G|KzfDyoJs119}XmhS~1!0-oMAcC%31fX5l{mUOhiJ<=#zHq!3rGN1_ew0}>?|&CW0XvbvnOL` z*NB0`S3RN-3p~s7rzLQ3j+UP8??1vMCz}>=Y7*^jL&!X{U&JrD<@LRQgM;H5BBr#4 z`qxrBYiVhzV7$gIe0>?fAmet#e9BzE||_y zk!fY>1Y-|5Nf@{KHn%?b@RaOK`AlsiWsi}ESTjnCk z1c5KXw;@%`p1iF2mke0+@d^+d8w|8^GfQATv5g!dGhTL_E{)d2Zi~k-iBBNG+^VeKG1<)IJWzA~geYGs> z89{=*FRl$%<4{qN6~bx#-?`TqxpwQ(O)P3oH{@Cjekvg$!OhECr4?|OryLT`-hn(-)m~fIurYo$zaO`z_JWzg=d0sud>o7`TwA~XfnaWnKjmR(e2CiW#5hkN9Xz~=ieTRLA(TA4rk$T1N?xnrDr zQ&v{C(r;(6W`|DeK&KNt+v>d6$eJGH&q=#~Chq0`Y3WDPm8J-rtVQhYY>edy+$WSw z+kP9zB-JKHQ=Yzuu63Q0ocEbFX91qBp;Q+QxCnbKO;&i*+2{qEHrU~idA-yHVuv(; zBASdz^1b-f*BZwOz<8|nwbuyp%iy)VhjTlO`^N77|{cp(U_67t|0mW?&dNM^uctO9TiiJJ^J2(fbBMZ_%uJ`@Nr3FSW@bY<$>6_7 z)*h|g3p=?#J|g>jNbC}s!B|%^=E{d>6!lv9emrYY;4WAJpUgJ-@Il~;0&mn#YL!Jx z>;iV**xJ%;bQGTSu$^anQ+%ydOr%JjYL7m5-Z~=ts)aw>=DJRr=Un8a?9zsrjP&}tN$fD&IJ4j6r5WF#7>&IMoji{$74L6`1^@Y)$iuEdtY&AF8@CE zuK_Rd3DRdKNte4P0r&HDRIgJ;9TQwPEKLHC27tNrifF#eY|UoQ^AM_m&m`tS+qGR= z2fms-+N|m&m6al;EA;w>jj2-Z8M%adH^4hg{#s~$UFJ|wUd}46t4d-4cNDyERhQjA z8Cls_zwOz?gzsDu_njxl#yrz0yFN#-MW9F4KR{HdVl4Y~Yn{2lOmLCoE;#pk!+huXbJOQ$b=GwJuJo1Y4q+kKggSS8s{pP;O zp51Z?A$s{sWw(1pnuN2VhK+L~2J^0|X_lCl?r$qZGe`T>npC1CU_Xa4M1aI%WgeYne5+Wb0VA+*O>E3!U#dB79WpZJGtbWcl z@_c9sx8mz|{Zj8xirD=T&dstOnBy-xrFl0yb$nc$mVdvRd2%g~NYB%wz4sYjE0I@4 z&47XZZ>G}bj{ab#&y?}y18s75Is+u_jXN)Dl`$J1wwK z9twq2L+UKde&+D}BUQc8FJIm~a@FTuiSZ+bbH+9!57ZJ=svIzkcU{5`;9Ud z?lw~d1qD$N;akw7yWjIa{`i`!kAhu<@H&JUiB`HnxB9E{f9Jh;;#e{sktJdFajHM` z0=P~}WIG&zzrf*10|uS)I9TC1t0K$4zdQFF0@{}ptv+?4jyoHAPtHPtGQlJzr8bp5 zzHKFd-g(GjIB|>YVe)@?JX}(JUXyDe)GbM_OosG%R*s5`{uN_E4o$0kXo*-t#JzpNi`pAOo96> z(>YXEzf=OihK46*+-Ay<5icfB^hXmVF7Ppzg%q8qN=CmW0v#%@D=Jo?l_JVv_l}st za78VSF){Ji?QrfuI4Q4w#3p)EXJvDf49|Df)k#7?y=ngC%&UxVy=0WGJPmFezueNJ;?1R^uzYiFuvDPITYW(;*0fo?+TOx z0IP}>Y8p(mT3%1D1OEf8{dwr^&xF^l>EMkwcM z3a*ksDT+CNzg^#;sej)TL|fK_~}Wr8ydb04Ks^4j=#6uUTBuedim0W z40xJhid+nbo$DmriHtuLq#skIJ=vYhVQx=RSh_H^Xjf=P&Gy+|xk%)Tq9VIe-@-gc zDZB=utbr#gbS8B!DTq1ec1H=3O-xCb>wJowQ-u7YK?8`x&0mB zd-O}S#q5UAd5(Cgmu*6x+S=NJ=M$^WE%bvB*%M1AprL3Lvj36mXe>TdoVvr*&LtXi z#l7v=Zk$?%Ypyb6|J%nbNedwHH8LhPyZczf-tO)n92|sC-Bq1(0IN>@ER(Bl18~(6 z0tK5sbBEEuI1Oe*HRx}K z=#fK-uB{wru8NUS^344WGd~!mUH*$wwB*CZ2fcLQ+QcO!ILvG3K7Yo1-iOp~Ft*L8 z1ec4Qy*iFTj1a)8hJ&&81Q2wilaoFg?_!Y3x!lA+UJR3?>Tyshz8y`c`-AO{YRI>g z?77W^udhW7*;TVq677Ea4-OUS-8$-%7uRHk0YODPdW^Ypc6J6Vo}I66UzP1(*&HP7 zJLAMC{ehj-%6(vpmfAwppXDYcCB4rOd(a*A{+}NeTvhMKw-G)*KI-+Hsw4(nUUxSv zZRnrDMS4yz(p57+#nuf}h)G8vI8o0|f~$xQelf$g#zuzJJPvX3@IAJhOl4h)(qLoJ zJ2kh6ZHeYWGLXsT_)gL z{rhm8iC<7q4FKd{muzPFy(Wh{F$-w?cSS-O|6p&*cB3^xcPvJjJ%|SHVZ=1Li zVgz_2^>!nO!0imwfR`TwX&AA?DL#}cLDFgE(XmT9c9%yFQf4Q6Kl5p4aFmp_$69gJ z-g#-2RbX5Q*!h22MTuo5By4}qW6Lt)fYM%vzL?llxlVcaD0OLaGBPHHc%n{E53`A= zyGdK|9%CtHW5!WF&Gf^|y5+)ZYiwa5{m(y4Vq)dy~qp0Z71AEvWvgU&KS9NeuD>CQih(T&{ zl#!Wd&#}HnP~Eitg!o&y#)XHUA98t10!JuGb%pA&pVO;@!#>pXdVlClNAhq4OMG8R z$d`cQwd9e&^W*g;4Q?xSo^mN00VXD<*NhX8^}qk4;8veD9Im2bZRr;M6q4A-(_7j< zZZ-Suko)*jP%zhyf|%g{v;au`fdaOHt%I)By*G_1(|C9Jt#IDh^fK1f*K^H_b4T30 zWwkfQm>}V)pv}%Q(UH91FRo1zS%f;9d~VIG#o}GV_Cqq_qB7vOof$xRgoj$)w2sED zjgIUD)+xwJ?gt7xm2(|3uCJCCK z{PlTm_5-Nrw|QG9K{GlHcj8%ku!NS6)7$KT{I$PAUL zxozpKl4_lgh_OfLtcC{QmXLY1I_f<63Q!bfjZl<)7p*&ez*KFnUCvF+$i$?)!doSr zLyMBZi(OL+!;?&;q|(bG#>WMirv&Wl{OCh7KEM-t_wU=x9+(sDjUe2jnJOYEmxc~w z0Q?`Fok!>wCAhp!U*(>zh^MEbT5Iygy~p0k8_akOc(vJrU-|=KF{G$`gV$yOYl$~< zF~c(!m7hN81n+iU3a5L>O>JMYm=V5@V8^K-Q4Kkb`qEY46 z^VVOcr|o?^WL%+W-3MjzAg7L0`5?)%mi+<884D)ht5^HtDHuycXSkwqVxfY4^2(93 z=Jv&pO(Z-74AI+KMGYWP4Tpl>`9(vfNQoF|c~hOvwNtcib^%X!In6 zb_qk5ikngTRn-Ybe1PoIfodE*(13t|V?` zJ(j8H`IFTO0ze^=T&E|jd`$H5e-95+o63N}??j_>xd)!O807$Q>FY3PZZaG>@h| z&7-Ka57mu?N<={A^)R#EnDrnl9I}ToRT>9({wnKX?)QEWfAn9?GHs(-Qe+k8fn7%o zvz2(ufKZj%;EIQ^6?R3}lLvh?3W!HY6ByX(NmCn(@(D|v%NlzHBMSQME`Z8_5R=8N zG4$u-<#^c3e#lVoidlb~?=?1TgrbuKO@+9&tkj&d6{(;Teo=o{41WV~hw{$>dEQpF z!&813XLy}bxb{h2L&MQq-45K*m)o>N6k3(Noy1{s!7|tWw=y7ZU(Aftrm#In+kQpo zkb$=acYZykN*%I=DE1I=AtL`Q7~&Z^H8mWaijy%_I7k1?BYsyMfA1}sjwa+K6oMGn zMOPXa)D|H4g-jg8B;0;iT1)_;>RmXI=!rNeqEdPtB7gDG+bc)uD} zUl1cTjIGs(x3{0A*aY~5&E zFksXJ0{&{#w)dDdUc^1#%Ocl8LPGNKi~V;5B5p&<^p_qC62nyT+{{{SI-e-FD4RQX zMki1$&YztXtoVHVmhA)ye8CLcn?ogn|B6Mot#o zViQ$HU6(Z|LR2Y`8-|62&Cl{a1u+PF3}-?rFUh>BgHA_`p>RT0%y0yD5rU_Ljk_(B zDQq;Vl`0*)A~!-^49b6XQt$%Dg}u>6pQC5;4L#XWB|96{Icx&lR@ z>tficLSnWOjj1*IpGAa7lLVmXHf$&6ETL(D5EOfD-@>ba9m-+FsiJL;vmV`uL=+kC zeEQ$5`v|n2U2wGIpZiHOS|lh^Bn*NnaWIeiI;`oS->ZjYQ<-Ao7V!9Y6Sj5jol4(` zxR~=@9%K)1B(?LcDR1m%^D=a4@gm4L4?k#dBtrPmvyPD%xcv>C!)Y{*k3@93Tq@ah zlKr0vGz|RL4`HzkEm~!r!~`WJS9RDsW3a(bg+}|KYhsT>5oI=oG0X6RTm2m}ga4b3 zQ$f|}?!8uGbcRcN@rRYDSsg};?Y?)|T}faUdm3299Yz5voy?Fo`nT9B0%{ts{oEr0bszL#+wGzxitTdt#Jm)<;}g zaaUgSA=5?|GI_O#1!eK(Q;vu1Z)aYv8cjmds1TsEIp&f+z6 zrNd@^RH|D;EPVdP?+A;LI3C^4X@2-NUvlLX-)QKMr1KBIu)s^ z_u`ERzmlh?2q-JE^M?BmF5~0=Z!X+UZbV$UAU+TaI(Sj2ui;*|gw%)z=+%(L+k!9- z$C@l!A36CGxm$#28X`goCOeN>NuZ9vTI?}H6u!+1KSNOqF_@|k&;4FVnd{WNaG`U! z2gw*aHHfYJMs;Zwx?j&|N9YfbtLkB1^n1LHV+E5->86`?j$XtwO2h;~kk!NCg|vvF zpeuhE$0~A`Z=)$x$x|jhZ_-LtJs6L8#Om>(0Sqas$L@D!cH4KNneJ?bB5Xr9BY0o^ zGIej4J`DlnVItIyM>bp&*Z=Z^8FAk`&hm)0sMtk#s1dwiDD~nBdx47Y>E^h@=4ZGRb#+NW4A@EV06>Q8H`GFTTu*S~(oV-x;rphNFflO^FRwRR!kipE zn*IzdVn7e{?E_yn;!LvMcib@?xJhG`j`t=}HlJx%8+NZfQr-5WP0`Jv{ohT2B2LpA0n@SlCo>W#h0L98-42s_ zH*?C4%VLH%gW1n%C;O?y@tvF8$7 zHd1=bYay1kS5DyeR94}-6^{SXa|tLVs*|xZk`gxlUnEB@M6x?qyGW+dHqo?F3s|*2 z=uLGpm@q&&e#9=|+co&kaho}zKAB%~tRSwU^@ry z#bn>s!!-DjGq&GJdm=Q4`?!M-4|nS1U~3NNXc(3C>eZ_VK$B$sdlfLh{W(Y;B&`4~ zx>$L;P5UempOv44Ui@3~BPT*}xr*DwLB)N(sI~uvYg3sGuu${=u%9xhv7&XC&fm4p z)Y?}%Vof4KA%q`&>wiPQ;Qk9(3y|CaUjm#elSgU1q#T}AO5q=i=ZqB!r@P7>?`1FN zV)F4zP<|vTY3jfUMePs15wTGcFkMOi5_gVTiI1chvD&|$v(tWY{tpjt3d3{%dc;vz zNmtF>b`}*XC$hw$FfsfE__#Gzo4~iIQdGiB2cY-1PfAfjc~A@yw!-PSe^1`WfN0Ft z@Z`6@Tt1CSO;;Q#HpXHUV`5{owgNw2PPeIjkRsnHhAunUn$8rxp;MEwb}yyY_lDYY zqPWj2LIw;3%tZJlRw0u!6gtbSj-Ym;s5*Dk_>upKERZx3HrS{Cil+=2A(Dm_1|rFA2WVq~v6ZjWF8M z<+wEo?GFt0Z#(5*!Dsu-eI}9W0`8HYw$JjEptb8gW^2f7BAS}(=@SG0W~UarPS98U zN`Z%O{ivDHQ5L4x`f&?fLSA`27zw|YLAmTG9lVjOZ#7Hy!Ub4&Uf&w~}S8&csyPoyN^Y21w#7hWV;(!R45wA=C zo33`kh5h4BRkqwzkj1-i!phRdFWRv2 z%V%q568n9<_uUbj|3<+vaM*vGd){MeO5NiN#fYy};4f1=x%Cui%9|LSTq zggzL%!)kqYa*&4Ooo2iN34QFGAk(%ogQN@nUld%L*fe-E`qOqo7H{yfCl3c4)Y6I{ zi}1GAeb8KRvQ}{3%W!eoSQ^rJhR_A=75ID!1J!faV4_Z|m)emqS2`)D&jt6(*7thb z#q)YA`=fB&@j6oMGg5*(i02x(h8AOf{P`QvY|@1?Y|+4Q}L%;wJ5I%iICxj}%7qm?EZ7bHwYl|aBSecILk4SHNcyB`zKwjq6@nzp; z0g*#mH1aY*eIM42|6WDpsRd}=4XSvaEb zkN*tqGp2eqD>v6x3Xz#&np4Ev8_%lfu%fmY0_w&Oop%73@jrlq|ERb?;W|j0ic3Ow zARDX=`q~}6d5ItKrNTNKqksN+NZ^%zHV}wE7VyFsLSDLTUj+nUi>(Ae7<$!q&h_st zoA(`ab8{sUPPtFPNaQ5r8)?oYtbhYgriaY;@8dkjHwqy#e_debs8yNf9tpeE&+&%G z`Uc2l)JB*2!Trbx`jvpFOFLV^^3p8v_8pXDE7@f0AoY1y#QWC``$14%<$iuPz^g2V z_|j%KoEl+tvoPfft?IET&dpDTv;>qp7osoC;Ee_m!iAhaB_`kcoIN!O_}AkJWM+gEAwF zjrmpLR}Vc!&BKt-G=@KE5rMob{1a@>pyiT=FjdfzEkIprLABj5=&95r zIe2mtztc>KYtN&3638Xgf{=j^`9Qrw})K0T}&X!h~>t_%_1q*tv)-!0R`Q~ z(;!7G;qgY;T1n&DXIjJ&tdG0{#bv#x+8J`Ua@Uat1}HnG2+A-*w2GSBJy|OTZ}av^VkV(n6?5}zF)=ZO z_`Ej^REvj2&yh5dH(G&bvmISawq*I?mpBwZxK=grE*rdHd;3L_!Qk~Z^a0$e6U1pT zQfUe+UfFD6alZ1=A*Vh5nrzY?tREzNFKW`5E{faq-}zT}<;LkZk|y(eSx`%Gs2=RVom0y4M$v+c3w= z0Yc4djQWcETqe}k{<}~X0&aSF4CLCF?B64bin+6V0Ed$YZBw>i>Yx8xjaLjEszD!s zL}z)gkF_1|c0Q8W78vP@8JDbf8wqN)tsIWr?h@l_{|KO!IW|G+~hwl?L?4UlD|9n>gC1!o}jG2@W`WlE>c;Gl+24bB7_wnuV zk=Od!@85SjrB#z7@^sQur(z$vke=*>>;(OXkmSQWr^E%NrGt}`%vz zzkV%P;cZbDHenUu;ZTcbajpI23$sZQ3;eTz!F|=k=_NU}*_;ws`kW(bYHDf;XQOuf znF1(nq?upbS4yPn=wgkPnEV8#aDE9hIBN-sSTQ`$K{GBI03%z<&@Hl7uIlHtxKp6q zAW_xhpH@B{5*vvq+rm>qW`oa)2R#l8HWRQeYdiT-^VG0v9G%Uz&Yy7%%@wz7CLI|_ zP{2d<=EN(Uh@b@wXK_F`q@g^|^d93Vp9wL42}_j$XU-!(ZC7nv>EkeneN^4c%d6Ky z*apWLv<e&}4YL!g5U4~57Nif3Jb4L$-q_MGMVW<(}UC|Fk z+`H0zH)(E)wZ6hah`&(sBtR1w^0vUO0AVl`YZ44!!QLon2faF#A%7z!HN%eT}!Cy$t!!>#0ifcxS($dgK4kttnqy zhoehhcBPpxIVnjAi7a+CEFZQrJpfJ2!_&xTCI8O3HDpA2cvV%x$X$1T?Ot65_l)0Et?tG>wqlO+0xlRpSrWVCkyT zX^+NPrOqM;dUGQG*)Izs3S`1?M8adf;1p2ZJb=?J_XBKFZtmGb>nLxDL=MLJ`HVlk z!y5AE14xRwf%g-F>FJ0E#l~A!2fCSdr&h z6E99Iqr?U31}o1ay!prBtc+b5b@T{C`Y?Yg$b$S0u)>2!GU=!$Z^waEv&d(BB)(41 zD8DW|1Krq9(CaRPV1%{mFT*%v31BOx$Y64QU!yFl7a-C6B)$54v?ctbIQ3JZd`CuL zb3XLpf%ag42hwj;os048N)eRbU#$?|cDJ`*4?sK>H^Wgj3#a|{l*#Rg9L-hIbRT$N zESrn>;x9O$aEoYIhE`BKVefltoa|W}8iALSkFP zktwF3AIPNM3Pv2!pce*Yb189wsKl0Cj(->7IZ(*37B9KuHVd! z$mT96EWB(^A;3#y)ul`!?>$;VD=c8epnQGadqP`kv#D+Bhim~Qu0kdStWWtmW&hm{ z+_ty)6I%xlK-42g0)+}StaJz~I|*9WU2WP10j*5E)wia_{oM}~ORUa@NiF246}OhX z-XNS)VI$u!_Y{ut6*7fZtmvHEKJ@n~9Dk#R3eyvNe5l0^f*e(JJX-!OxEoc~$iy^! zvSOCNjjTkw@`wkA#85JYHlH)1jyAJdPjKEWK3uU9M%E9xj(3-GF`(vdYx|#m4I+fU z?{)U<_YC(JK12C|pXmRzhal=3e8$JtZ4Z4?(rK&aJ!V(=Xric;u(RVt)HYU7^Tj*? z88%k!*=Z%b0_R@f>UJ%T71S=|Oku4`P!b~kAFU-8Sjs0PRR0r^O*K88L!ofAe7CqH z-YG!|2l2(F4oaZcMk22nPy2wrE2pJ}8AM+^P$s4(HrVT(6g^*(md45lpjW7VF)-Gi z9B8Q@Aa#oTutH>>CfWl!W`NNmeL*$LKF9o;1PaBpquNpn-hyZ;FV{=%&dwj8jCC)C zm&*hlbG7Y(KruHlTrjL=5Ni3mE+8a*18NIU@sVgxh*~_xc6k^YCXt+#l6tX#lQ1Vm zg`?Vnj}P<*4jOB6Km|TG7YiN=I$nf+b-YIqZXdZty?u0t=69< zXPgB&?P_@`H!-jVC)>3F#Qf37s!gu zNQ~M8z#Y2R|6I49q?HXm5(W?wm*&>A`4>?(JQ=R2R@{v@_iTV22M$?NIFUW)cjNOqlg|g#3&gxd2LHSD#0vKg&?YP1$s5U}NHQDC1DC6BJSjot6F0G+g#Y-l{=~Z<3+DWGo zOa`!&x36zDDEY*>tZOJ~SYBi=Xw$o=bao}rZ9fH}AWVlX7pm*Gfw3?(WrBM9%HMx0 z2Z7+H`@}e@^xpjV;RKRBnyXiHN=ir}k;C=@N;B)ytYLl!N~-e!SE>swEBO;CTRo@G zKdkgOI){Fmv|{ih<+p4*4L~HXO+20j7Y^lBeB8$c_o=%{EK^F3V-A^B_1-x$!u!Uc z&a6EFzlRtH8Zjj`v65YUE#fAoQT-2^ zK>+k*4ysmMdfio1x^Ode_{{1U}s9_ZQu%r|-vw_!mel^PH7L zX-lpwJk`QCwVBf=BT;53dC=OcJJt1&55+?%Faoc%s8EE+9?hhXd~;Ck(|zd3U=vNQEP?nin|?n7b#b#e+HizxV0UBH%6Q% z?XYQTM7Omm__r>OipwR`niT2?r^kJ7*CH25*!*<1Y3A_kME*XRK_Owei^PR-ZW8YV zj>IJ8pswoJVKg){0HTRZ#Tjl86Cs(CvEQDpZQlPLnC{LxDo{VKU$}Mh5AkFFtV8VA zudN?Hl)!xiD=eWsOG>63W|S`4EIQ*c+@kAh1%W z{#YnY!lW`u^Ba3=+^5k(iw5d#=1d&{gS^y(SC^57mkpwSQKXO}l^0I?MiZByfdIHm zh3Dpp1tEWz!Y;al=Y=I$rG5a<)|uwscB^OWVDU!8ku}@3x6o_@O=VpLdO6E*iGLqM zKNAi}V@xQ-@ZuinnF!uG4V!F@7| zlmg@E$zwSSboAAv2XP~GZD#D{i39ep<7WG__Jtc zSMx&PfnP3?rfmy2Z=$ZF6R~Cq>5FIW10ffD55Qy$Enn}CrZ!e|+_RHH02&ZA39u5O z_QcIL?Gy{axyQV(hr?2Snx$)1TW~5TGCUqA(Urh-zTVHI#04X|)iVJG|3ykephB(m zHee~_@Ak;Qk#@?qTSROgfCLi()T|@;zn#nP-n<@xF5AiqAc|wnNvQ-t;B@JvGxeg1 zwq=OOz)niF$CNWcH*wRX$Yq%FW#R2ahuhlgwe&^%TP9bw{c_YakVv>#1x3VZ!*r<+ zxGZ;$G{?w!)~W#7FQxsu6^=9bBy=~N_4E>&)l2c7oIk@Qh|zesDDc+M-wZE)-LH%E z>uWBsb;{^_@KpoEKiE6k9$;q9HW#3U&nwgaYqV8o zGJ)T-cGJoSJ+z2(CUkf%mPHcgi8y*TS!|^EA^Ygcr8Vio*4Aqvfek3j&+o%qzLi7- zw3d?OtV`W1>_ZdKRy!^oErAl5hx*2SSIN08M2s;btPbx8F=PshccbgMUD6rz6@mnK zwM&N^O$t}wiyqkFRb{)C1izQpm%Pnc>wqs^i1dGErIaZZd%f=e``VruS_#Ay9;!>9 zZD5#$iOROyP*tzYvepUd1+C`*42{`IQJc+cNv5A5W(pv3`GLydz21uWUSiRD5<;i? z;ET$echEJk3OV}Rzu%b`^KhB(AQ&|xvB;3J!w2dH9K}ZEp%;)0@h9L{67rELo%fw63t&)=0!~M zQ$c!KL9IWa7$}!v8hSivd1A~=in_HjW$NBa+rbNOqcVO@zB~tV#hpO9p3!CV2<7*= zxdhlhw-yyOy~iZue(BK%l&W>t2d#@}#^E0m9}d`Q{aXeA-o~1I(!QI$KLbYd5kzO= zG*B{Y#&X*Wxv1Rgy|hdVUv>gdE>2_L8L$PXimIsS9MN%squY)Bo)WfEl4Wv)vr(xD z2lfeqHJDX8B!7~K#VeXBDk&Aj9Xp7YW~WJB@|a;X^38ip7U#1$x8`kUgd46fiHj1b z{JZ^eTF93DiVaHxnGxsEs`nMzo9#ZrSE;;DN+QRj z%e4VrZZ&KIzJ~%@41uXOfX&vYK(`|5NZ6*9;Boi=7e)cO{G;}|w%3=vUUjse&qgm?|WYr3w#&9SH$u&BUEDY0_p%5p_fDx{QU06YLngb=k- z%8>x7rIeKbs)P__LWoi+WeET`fRd9h;{u?vG>It31o35)9RPF#@ChNhrIcM#%1!`n zLWp(%EkcN+Qp)C&%Xx(mow}}{xaXdGI#@GFhW{UB99Ed{m#HWK0000}D)ASnWhbc51i(A{w9ONn%YG>Cw-ba(d!X(>UZTRKHR5RvZs_kF*A zxm@7!oY}KyPd+m{OjTJ15BniD1VMOmvXbf$gbITo6!v?V;0dkRa1!`|Zuv^-6$I79 z;9Q$vfPX(WlT}xOATLG;3itp)m*7#r76iF*L(m^M1PP}=5V>PUi<&6-4@^@98A<34 z`6s8XI37H??s=|&%e8{&T252Q<~*D zq4pe$H|d1x;|~x+!b>u?Zwd+0orbYIj!xcp9al0aGMV&7)V(zlRWvZLDc6NO0*O45yE#>yr z?fY_|CryP;4bsIj>(LYYM)VLs(3```&A*f$yXGplURc(RyON3&SOL*wRWQ{eH=VY z^6)7cB?Pgny|5nX(jUXT$8Pp*N;^!FH#!(_@c7AaY7=QxKqv3>3Yu71`a+m2I0GgT z5h}&%=OQ9kM9U6R16zJn<5ppIPXixyg&8N)F-OS9)8-?fSs5@!3pFh7C z8X2MKdXEA@V}q*h?x&$|@1svIB3jr)MD#;2P$3AxT>JO$-!Efi_t?|HFK%;lbCWO< zEQR1d+a-S<=LC->*!{ATt@Eh{9!$&rW7HywYAJop9ZOG zXs`$gr4m1Qz{1HHZE9-D%*z``M@PpjD*A}sKvMEUPgrE+^U{(M=Fef#(G9XZJUkg6 zqoStt4GbRj^!93)n$j^aF=<#^vlbQ>s!2;@T3A>Rb#v1bhsm;&{W5dt#`wLyeoYc+ zVd&)MudE!69iL7eD=WFZy`Avs)63Y{SP~KvNz2hJ1`iJpXLol-CMG6WUPfl7(m+p- zg_?n(A>P{N<{R~Y|NeO$?eC986c-oId3t(oukY^Kxr&R6GrFDro%6i7yfk{k&HbsX ztBYA!IE|Q?n3;nk3LOh`MWA-n1qKxqYzj zuI}#b#by^kRH>?}>fU`sOUatqOWoI+HTRj#WD-k%S>*c~Atch*KW>BXj}FMR&- z9{3e?TU&M{-;0Zjgt!4EuQi{Py?dzD^5Me=Rd9y)(cc$3hn%c$ZdSd7ABa?GZ*Fcz za}>thn3|bw|DF5%5#yz%E==>_L}5E3jMW95Bs*_lEWmVdWhMLl`}fS^;#oifa)s(P z{EUh6I&_G0N}Y1B|Bm6|;rc&v!0wUa1w0es{BP+B?y@QddioDQ;lSDG?oggpYO)#z zcdikYYPJ}$Ci*#4sxidMGJ~(KudfOJ|EnZbO$>DOA-3nw6XN3HfM)40q@J~b4`Vvl zWDMry3nyqRc`D-Kp0kn(rkqGpt)gfqLlld$66|~Ta$J6o7(NjcOaTlsGcol(q+{de;@a~i)Gi?%lhb*BEn~X!PQc zx6Nxy*X!qM{PA&M=yur6*?9KplG52;TjsxK`B#;5;(p%n6>9eDW!}Gy_yo1?On21W zm7xU7N-B?9VzPt|x!c|y%X#gdyBvosvDKZfTVH;;S*ZK^(|6wa4Vv%Ix?uNaA1NlW znE04#0f#(m@xZ`95?Wdn;7TV(2kKf|Td9a(MN#F(fcXu5FU?`Uj_?@&`)@rq1$XOK zl(REnDmKwodF1$FuLyRp(3WmbMz@m;XHX#a`D%ClP~*M!tfajwzMG3awBwc~h2z+6 z@4D^{h1w%wX>q^h49ThbZ{NOsQf01N|NQI)kQ4bm_DQkk+VduPIk}(1XXW@Jj|x=& zPEWFhW*3E?uE;g|w?%GzcNPPldv)f^9r=yZO7+(EQ~x{ywJeA%N18dh|Q@4}e+q6u}`G99RkG-2j3wu3dG)UwQ=iO$b zw|zk`!HUA(Y=`ofrH1(8?9g#E>-L!Yzp=5g^AZwB1_lS8rYgR%nlR^`10MBhY`=LR znc#g{#`suCx?EtS%I~d5w+)Zae%Wl#NyJQKdOLJsVnJ_?(#3KX@Q#Zm{Bs0UZh~zM zUobiNbH$@i)qe;MR@2r_V#ultyvP3QTVfkSh?c!Qr<9abY(zwaZoc*2_R{fmjn4M+ zO-IkBMQ}O~1gl;+y^S;yu8Ff_8j8cMH9cIP8p`f zUzDuQ_KH3A{#O*>f+8JN){JzJ&z?=vTNW5_3N+AeI9~uG@N=q{XN>oCU@>7xlxJaQ zA6i%2SY3aaonfF7L#=1eL)C3}{*V{dM)b{t5UTo)@ z$*b!pjn~%tp4G*;@#Nm=QlIzPqiZ}nN3ZNwwAM&6t)npDWLsNBH6&wee7TYbb)Fz# zp9VMB0N0IV+$HqMgJC8Vz$5VPI%o)GosH|RC(wZa!Yi{ zzpHqi@Hbe7IcF>)&c;-3IY}bw#_flQXDntBC=T9L+gzhg9c!xEM|>nM%j@G>$yDYE zeXFxpe5^LB2Y6-|`-#Y~f3g3p#qBOCq+i6ORkdCv~l zKUtXSu)Z(Mu7TDUF* zW~WV2V5a74bzht7!q@E7p7`jq2}>T@SpQt6M0YavJ54TrIS6|CVwae8 zvj3G&!ZMDY(izPi-jd(GCF99@7^&;5W%jElZk5HbCr_RLN3Tp5`|L*7(*#sQr0bk3)!U7cQ;*qY}J$AZu5a*&qt4%=N zwf^&`$uUCMYxCaC#`z?pzJUkLEkhgiKDMVUb;%!7N`3(dY8U(Yu;b>79L+pEp#+sVLq*PQ2ys43+mS^7?s9_fu7iYhJ|Mu_wjr6TNm*jIQ zBJ-0i@eX5#GWJCx_;-sX|HKZcF6j@&usIHjlT1kYK?RF54)m77;^D5+lC+BOvP8#= zYnOb_t@FKY8!r8zAZzjQ@p0s#c=`D!XJ`B0#o<R#B1h`sd}S@K*bmp;h5`Q`e3#c$k+ zj}7FY1?nuMBqaN>WjQ&k#R@!#_ZJVf!KQ!$MqZ1t>Far3i|2F1iNsvLU*7i)d>=kK z5j=i08wo)b=Vsr=h+lY3-bu9_ZE@kAVnuz4UY6W3oK}VJ3kBt|K7W3Ujm*9>GlysT zu#MCMwNzCRS;c6tKwc?*a~~6n2}{rAuzv7?cMXmBjkj=$i2_3=#&f|XOS&5f>Xhgq zU$0|2QSchOb-(N$H|8ABD5jxLhGhODod8l$P8)tx!_3qM zkszkC@c540YK@MZv}J5t3J8L$z70;s7{kdTn50#?c4%9&IkUMO@Ge)QV`F2Bh>5Kq zDMKwsAoi<(jIG+2w$|6p^FK_n^u{00Xp9c0mI!=yUnyM~&mGGAA*dRG2Wl*`N{6yg zRMO?+lu5(7#eZ+w+BOccF+wr7skK06s6&Vy?1NLW4aj||U_qGsM3n#dp_%_}%A^U0||k%cHcV@eviEM`3t`h-;T$lpWl)A75aLW@CB$&3LaQO@S_UpQF}X zn+OK7ecD5gs)@H`OwH3heaa#rkn9k9k}HL!ZDR713kL@$^xReB882@nu}-$Ik0P7$t@K|1 z<;P!{>kJ+R%l-E3UVvbF!~;WD#w%vAEl0K`?>{;fVxF5u&IIn`Y-O9_(b0^liqasp z@Zr(a)I3&*z^lm1qjR8HQbanPwYA!W^AKD z(5j@T2T$9B>*VrL)+=M<$*1`Kk3%~(DuP()=+?lY@+4$uj~4eGHuQC}va)&=l$2~? zwJ*wsn2=HH;49-Fw{+v+D0f|m?pzSwPoF6DZy^UrnF~2n%T|gbK_%jj&xRngJt`XG z(GMiEARfPekJ^qtO#m24=(JS~yv&{$?nT;S|%3+wfL_4}BkYWa)(@ z{t%b~Y<9BA)sG*47^K~9pX@N%2%PN57xQcIl1gmo>ywq2mtULIs8El<23yao^lA14 z<`QumeA*q2^|r9Pt%7OQx7c4IMsP{)6@&N>kvTj-P@hx`+w0jrM$70=0rs1u(~CVM zhd^eU1_ndq`W$qK@bGYZPz^r(Enxt>)!5u;OL9^jnGF2#U-%w7JO_Rf4j65+42BpW z;ywVIKAV@(w^I2|?%L7qpzFCmWaqlJXwsG^udk^|0*WZG>32>}2OO;g6>Dp2@ODkB zw{N%BZWpMEpB@){#cA)Hx zD?BU=AVz>q`h$b4C)gyQk~w+=m`zWe`b9BG=fJWUOz6B z!>h21st)i0%?MJR2hs#0cUd%!*O|&Hf?Q0asvd1!;B5cYf?ODI8Pn6#qjJED2#<)U z=Hle6`qdo;YNUwEN;Z+=U&nR7&?*>b(4sr?i^cYys<~jgMK^-;fwk6!yz}ZhvG*D~ z(9XMe>NK4lZk`;OhFkf5X`&#Vp#<^Xoct$KcAJNAhM922z$=5}d@+u4IT-C*);?CM%5}wjBGE|RrPL)rO$hU#FSb!1&+itAkU}rJ&wB9^6w{?@khJDZF@%oL8xp1KH%l$JwGHFj3y5( zRAu(7Qe|drYJWmWNr~B;m>>VN(%CO$YW)IyQpe`YR&S)Pwj=uh3ivt?v7=8WNUJoh zC=q;FteR|h5jnp7=%}r%j8BVd^Ey}cI)fmvK6@wqNqj%qiNfwq<_se3Ie1k$o1v<> z=qILia{)SFinojHdYfowWwN`cCL}o8y(mVqX0ORi z(rtjHt*ZLztJ6v1QL!-7Uwg7W2 zMaWMHI9_r>!eXB;9MGF}_I<$n>=|Bkxx~oTHds+tDd~*PD1ZJI+xnqBQc$(Fll&9; z_8l`;@po647}I|VJ{>-;wH3Nw0W_8h*soW!&k=C1n0NF+ZIg0d%O@%ojQ#pgxKyQL z-fK#nK-}3T5RCN?R@qii$;`IenTT60j!=aTG8<7y;Z+jSu}$42^oo<(UW@gmpGM7S0n&_M70(f@_+l%7W9h#GZ=f8b*A>RfVR9O z4Vhelgft;Jxi_?L-gLT?m4&6bs-U1Cb5MYTECTQL?f%mlH({n8Ga8SH2U#8(Exdsb zF>L_FmkO$>P zKgGnvymG4V-oVj*u;vu=;?w89f>Q+ANLME+u5=qfbJnU*ocSvIb9h-ZKpZa!b$5oz zU;u}c=UlP%@o6==3;cY<<2B%dQQnW>F`=Hq*Hotlj0}|{G~~H1UMQ-(TdL0~ZqpfS zX7<-sE3`W$Ulzh=FVsaXud8##OLov?O?-GwE7Y-lkT)W?|6#`P*n0Js<}6EL+ATH& z>#|09S-k4(;5D&hpUID2F(rZkE=Kk-;r>sS>4z@p+8D_W6Dun#h?OtSHwjbdu46I7&-?EO7UmnUOzDOVi4XB4npC4`7?g zN@OqqMUES^3mF?52chnW#Y_of`GVKC>vNb&n)HIS(#Hj!f8CF&`zKMvn??SBn4;+Kp1yAFB>WrN#DX=KHPFc_DWKUc4DR-&_m#&9dt$=AWY^Zo&?gGmN%=;$GgE+mnDOX5^u`ZCJbeZ^~=~V;G{sG%cS*fZRK8{>z z6TW%6#nFbw#=sB^c9PrLdaa$0q3!8;Azrl{nX6L0eC(Mu1-;nmct4?apy|v*3uH>h z(#DdNbzuB8+&D63ITm>GrsxXa@3?hTUzZZD@mV+rz)GF6%Mrd&S$It< z#g(}`x>8!NUw2smco_JcAT`u-u%L;8x7SI?-cbeS>0H1SbIxLB_!kSL2GQdmN*o(> z`UMz_XoW`LU-Yq_m~a%IX*x7}Rui zDU$>FU}|bkOQxtcq&noZG&Cc^WdPyspPNf{_qMg#gnj-2<)0H4`L6o`FY># z$v%oUzU03#N-dXubKa_K(@H%>c#osgIG_nQ>0&LbYumniwDa|v-U@HS;|(eo7U?>U`iB_%LzHMIk3a`McqEWiop zi?+k-@Ttcm&Md;OYL)M^KLOUsUEaY|kw+dxYu>}TxvE8r_D9{wNEw)d!9`VVt#j&= zz!MZ5t*yPiQP#3ILP8?rRKK&##6EIizL32i^)tca6*{DlM)6J-Q`@Z3@mU+mH6h#1 zYhx2qt$A}^AP*@(iFS(`27Y`sFtGLW69jtio zM%bPo>jTh@+fYH%(UBVVH3VH7i=3Q_mbTghezW9XZ-mywcVjrP3-831LkY;lfr`j= zJ)({9Zywlq=Qo1ggHlFQTl>2O+--{#xvYnyQ!Xhf>H79|sg6OWbA7(fYuafWXxH4E zxmW@$3o+7*XDe5Sh{;!f5FZ+t-%n;164K=Y1!!4WS(9t1cwl{OL}#2Vy;o0SLS94J{u0~eb$ocyH9x~+ymdnYY$0Q?Gkk&x z;Wg|V2z1Mcr}X=FJ~col_bnE3F^Dgog#-Oh;#*ayagTZ-*Y&iU-_2y!o&k&G2`MQfuDX*}3U9 zWj`<&)dnaYDGg24vog?};#%1KGMw}E(&qTVdWE30t{niHAUI}NnWG-{(T8R6h^y5! zH4xn0NdsTLuVovHPG;pwzs!m|FbFYASI?y zjz>{3W0qAAf8ouX&qwp$PFk0fjbeN!9zS9EeT)t23R6xr8`I^^veMG#s0bW+1%*kl zKjn9{JnwSAdvW-izH-}@P7s`t5<(PYmb>S7^i)3Y+g{K2!q7G{qM4z6u*`1^Z|mym z`4AHFCz92!;djGBQC0s4eYr2S0_u7;pvMcnElB_5abe~4^xr6EjnZPDFtQ?+VpP*u-IXaKTDaWHcky`fMO(uvOVqj7L)< zuy&`IUOTNSukakAkYnA~V1r&{u+A$uFp63rO6nZj=>BI>hwZEgYa5%M&33|E)e_*h zsSg%9N?v(A`^j?2ZAV&ICket-0Og~^g$e!pDpW%ZJx0}?tel*iyohf{7}FRo#Ad90GaKk1# zZWst4sT`w|*C+0Tu~N?KJ3O1= zE)&!bu))E>{FWBss_QRRRsS$|J6p0NCXUX|X4nwZ46RKiuhQHq;8+a&p&+mX-0vxU zZ)JD*`PhBp8RiwYXCiP&v9e9L>}BQUU+$dYQ&Urwd}kOxe*E|p8j7{k6?EzeZ#{@b34Vb6Bu|rd|2(2d%md((h)Qh=zHz6GczxylV&NA^nXR*m;mPGObIiY z4=m(9!!S2D-vYX5EahXG05)EBZWC^UjmaHP2n8@$N=)w@EB`r)aA&-k$-Ub!yzP$ZSGU8@`~?2uT8Vp1Q0I#e&>bOfUcS`A_RUaoB%|s z+z%hez_})mENd3TuQ21s!^7j;^fM{d9AK?@v-@$uJnrknrkb71&$7>8Ir!r{FH61A zR%zOMx2CSYDY88!{^&h?_^_m=CYFs8`7z2SK0Da|v$EE#VIoJeJkCT%V5Vr!9%*@Opn~h;$(1%nF=YrR&tshfy zA@%Tvr05tETFn~3>dZTz5gC6WS-vIlvz+l~kKlGBYp&`$T|-0aBlueEY;_%6yU18%VaYs3>Hx zbD+-3);1yaDtK~Y0)&Ce?Y$J&u{vt5n)>UW62LV#ZHJf4rEF{X?GvwI^Ne67q&fWg z^QZh$qEs_2VyFnzyc3Ioi5VFcI&ixIJ+p~dlczQB_%42A77-RQK>^z(P(^QhUgdG@ zyF|H6BIDea8TVyvI3-a@8gNIkJL!HmKSq&25 zqb#s(e25G$ls|w4gTH0Ma>Ce5KP`~9>{7|0^P;F8M?y3K%espjn4`cGPj{L?LaM2w z(`x}&nk&&P69*y+OvuHD2va84YVWto{hO%9wg%~vmF9lq%TEfwG#W@gT6eOZhhc~e~M`n@9ztnuUh z^YbkQcVzxz9q_2CCW2A^MC_%bt|$= z7jzh1ndg!|qh#(pyI5E^^1zM2gA^4oI-knR%p0}_HuNp8D{3m2fRq1jVxXp>5kFK^ zTFNrH$W@`rj8y6TurET?KbqUwVKPQ|?(4;(z(K)J@RR%oF6O9`sSBT#z1dh_2Q@}2 zzmk#?5AaW*b_Q0oD|sz$gfUGvmtI%7Dt1`$LfKCqi>B)h5X5(M4 zv9>D?p94LZ64b4a7qHy5yl{vY)UShUTE!1;7+@tuD7m;C0Z-|uq4D72>gsbio4>#R z;r-)HJGgIJM~FBVOaY(Id%I#{ncXKaR2iTMQSn+LTc6)IdYb9n%KU%UJQL_PRMgz; zNlwlM0(?7MbGV*k&({d=)F7L@qEKV%OP`DH*)^qq8oi|WcPHn%vbq9h| z%2fr@{9>Dyp5EwquqG!b2dFO495629o%=-V_y%`_vAe3GwT=f<4ac72ddp66wBu|D zFmTa~U%|l-=7{!O4%Ps)39Mcu$Yj|dyCOQ;wMXda+l-2z-QW7U$n9Rq|4`Ob)ot~baw)4RnC_04mSsy=M<(+wp zWkhi6(?D9C|6ppNU%?X{CoXY3eq#{ z>h`EqqV2$znYkW<6y5#R@>$$>UC>u^(H6Y=dWBqI{ zsm&qwJ&rFdc&Y*%aTVH5jyt?^V~q|VTfn^e?+A@+Ij+9+D92s=WxosfYu!QTF-2qx z;0U=%9w=T!t0UfB+efxx!@m)>eQ4f>S`LEyPN!ZuHSEmAiAcUs-4bZGaeE>;T6=fj zskWb@<->MHKmr(u#Uc#_1)Tc&dZ%qakbvjb*PpBy zNNNMPd8Y{*7nk1qD@sH*H_n`KeeB5de@_Iae%jce-U^|LuHz%VHI?CyAGB~;>1=q- z>mCI5xUdU#f_k2mjLex@=g!{7=F3lKI8m&UzWxFRC#N($@pdHWhUW~5{xYaAo!D|l zyulG-IioWGVV~d$8GgKBxBI-|3DItafrFYm$K$411yHAOas3uXa1OaAy2Hbon^Gnw z)PYfQaGyWg<-Geii6T(kU7sBnZ%y0GM-AL@Q@C$8{=EJTkHZLunLLNAIjOdDbH=)} z5U3BFs9|dtsDtSd5mxs0w<>}hgjz1t!wdF_54LN|*mkQfKSlrWl~yimTc7v2C%B3! z>P7+YcUJXN!m{Qc|5rv(Ik7wtBgZ)U<&lc*a{+te=myI*DJV44!v3;NlF zLKcr2=kFH|=FW4twm6YD^HZZkoP202O&mn01Jtev_Xoa)H@R9a>?_4O2LF?k>+SW0 zoest{plAH^&wEg+16^EQUG=<>_SV1oHeunv%j8;nz~*cKhu=-@auA+JTSHh;{IlL14~R$e=M%nZ>TZ*^2i4edJlP#-W3uDJ$Feevx-Kd9gr0^5%qU8}{qB ztGtCm^sskdvnOqe0uHoF`})o^#xl(#Hq)Al+J08?YUf3W5dM^1Q7dXG(qDj#D74dS zH7&3(tiq&=!av)&i!l9}0(2@lQH!kejd61!d@+esUQ!g1D)^k?hr_ zeNRoQ-Zr0f7cRSw#D8v^cY~MRi7HzD7Zy6jo+#hrW`H-kTY7=Y7F&)pG(2oUstsIg za%R$A_lM_k-BJ46AO0xRIxNdYb9ncaT2xDY4a9?dR%Z|SGOg#8dlR!KbH6LO=KOpx zCSht-VC1A_V9>gCyS23itB~XmJQ30foSL2O1CVW|l6&um=dlt|>DwiT8nqg}a;HiS zu0@{YLiK+GFX~VssuAsPrEUb7R&!FP!wu#$#|+dOzVe|7>D%yM(%fUQAu4i4$Jw-a z7UeB1^Av$~uJVwb_=?k-C3HlN=)3nn&*7RR-$JD3%RIZo2G;-fe3DE&d47 z7;vD2ZkS1owO-9FeE>lMy`o{h1^fr`SokaglSEV6!qdl;)DD;L|E4vLmu~Kwuha%9 zH~uXEWczb1$c4ZP&nmz4*PPh22?A_$!v8dW$+gIh9Jx>Y|K7pMv2)6?4FA3p-%!NkOb zgyaF-FkZ2~?vb`#QFqy}Yk?I`Kvo0l=%bC)r+}1XeK3A`gTb;*Kz1}+N6xj4k7x;) zxBw^;*q+)Y`m{7BSCR>Zwh2J@{N_^gZc=g}xVRG3IYOp=ZB1QGsSZLXX#D#mf`RlF z$DgP({C^(6JRB*JcydLa{6e#&aXhYI3PIL)P!brvpLnjV##dfY@PWWdik#D+DaZ}@ z^5I|{a^a@dRWPOsqWTPFkKbU5>@d{%U2QeD5|aKs?U(|P+49QD4G9A`gYtYb>HS|Ea#e*PR!AkIyXNHT14{3*iulnspRfYosn zPrE;0AP9R=0t!bfw0+zt06MP?%8JmY%c{?xT~e0=r6l>m9R(f(BOfKDVbHsa(3pEw zo)rlXoCjN=4uop0q5gr*?kVEn! zUilsr&~x$Vd`mP%Uo$h?$OLqqOUlZ^xo8QhK-0r;W^PWXZ-WXvG9}e=5lW`*TE|#T zp@us7GOQP*4<|%{ngS{RCkLG%z}5`qBUoCW^Y6L4>V|D~IL2=4jwu$}e9h|p&&2SbZT(N&Wzt@;C zZ6x;}<5ztDF5NELHg7r9*-~F#zJtZNqH1Z$1nyfPJH7@s_y_jyQ38T@&>{Esme;R+ zOO~BL<5V6f+p2`Y&DhkGTlqMu!UJ6)gN~ZoTHa|8_t_azls#;X9XnB0t&35h$iB9l z$1DT4M+$#0ORB4j|NXNU?=x9Y0@i@3@%=%%!1UCV6iC^+#<934+YkrM>o3fr!i$Nod23jf6 zOCrpT^5)wr)p;jYjJ{|)7UHe_Nl9d2#Ki)rgr`o%^BeP)dmv2|jVAYi)%B6lfXbyepnw!@k6EyKap*=x?0{BNGLQ6{WI&+W-_r~O8 z`N<}3#SW)Y>+DFV0KkHj@87>)k#DW-<0IO`(DO;=>J>Y>SQD7y{1O;*`87k*Z5y*k zOGydukieyAOX#qtbGbvIvf|*`r~{gb)v_phppQ zCj!h>Afj(|1>^W&S8#;5Pne?agk)u98Hq0jM38f-zj?#B1De#}E>G@-WzA!_2^yHG zhj7}-RaE7gyKgj^ktWPZ|-;ux?BCHB}FsGx$#KgLNnkj*eA;-DS*98ylUr5^rd4o)3 zm^z?XU9YROwRQ1vWo6}$g@r-#?zXlz0cSGc1?ETd=jj37ha8AfieTIu>4woOj1%rp z8bJucCrg}~+D30w4FKkG#8Oq#*ywR*di8cZaB5-U>IjJSe*0nqFo}VoA#+mAu&^+l zu;FmJ>MRNEFOVp}vrQm4Th1Om3u^>!csXz+Kuzef*R1mz8_#}cV1aP?_gpgz@RX2{ z@D0fTQAoVy9SZxy`~@tC{T(Wda3wHbQ#IalUnU6TN{8F<$zKWMr<A6SZEUs4+SYbm-(dLo^mKVB{XglB+7p9@ zaa%W-O4+Vu)+O}Br$vry|>9Vk~DO8uFvE|LuM%-gxL|LVDfY?6GlbJXgfTlXq|E#Q)RaIB-c`aj*5zQT+ zoQMJOojuLAhw1B6fo35)g&K~WvU1Trb~YQ+G&3lic&O``YYhFs%ATG=d;$VT994dQ zcXqr7Qk2Yp0Is#UN9`YiMEMW3mP_!o*P*HU6$FWxL2&G!zEzrfYSxYh$TXUx3b-h) z*;z63@XnUP>S~7!2Z8E}3Pmt~nHU%M8VpsFsCkk_;Jo|IzCZS4HQxzVG4_gywUo0c zJRCa+2y?tAg1oe&BU|PB)zy{5PhVi5Hf#ht31Eot80cc2{K)uRO*iZZgK(A^))%Okx_tbAHnsk{i9?Y+IbKnH=()zvZJ!qf?1 zV9kPPUBDR^hd^=%}or<05Cq79-~s@<>e&{ zKvp0&hV^f%oeU!EFG0IwWJSK`^h#CNVlHn@zEty&r>dl*V`U)$&-_p4rG>x$9U-lQ zt%rxe{ovPa`PNnDPNEq2S+(;$_2!BwcaJb2{GPK5HK{58+v=AR;Al1c{a@hW;_eTR zb#``gaqxpe=H!XWV4|>yh}>gBus8rUbYxA4S(-*saENhRhTp$@N0T}(6TP8GPQWYsPWssSp{zc}o&i)4q z);xM2C?WW7L3XvkNq5lFZYe>efzq{SrYVhvf}&~A8W|6F&L6@)tAG(T9_F%5`H`sn zPfxJeVdtYo7}o`u0lFp+ESZf{zic5ulQwT;MEP^ZLQqgp2+XqTACEp#^vR>KfTomb z&1?=Z6b`mTIuX(2SvoNk5We3hA(|AHHTCpcx0*nsx(I{}iSFJh#63JJrDo4|FsJf zMy!lV5DW$Tc*o@x8I-89@W~s1^hXsiesHa5JSw&0NDN#o_NKQv9zMRhl~w6iZ~-e} zO%R*bE$`EwGJq3Ow50vf6K4|Cw6v!3fDNlVIBOY!xeT zB0l!L0l(dXf^F}e_{-Q{U-2lzzy}N(UdBmJF zbq!7Gnn2_8^M|HOd+@a%CspVqa75G63im2LMjb2Aa?OWv2 z;2T;Ha-jT=*~hu2g^O=Z0OL|%IiSz%KZln4+*TZEfJDM;6Z(LwUd z<}Jys|KC8IyR+v|fY!%rE}1x2CJhU>LbYFIm6b}>N6zowrLd{_yrlxuwY4Wfz zQ0sT^-ch0|4DRpm?}GVRF*4qO=c1yDz=0*CrNrb5~Hhb4%~pMoLrb%UbqPbF?O&{ zAG>_+xu0?Pbuk+IcYkn~&a(4;K{S?{)90bB|L6hi)xiHpaZC-EwkP$merSY&q=rvG z;BO-r%Lmv3!u#+#R}I{WNeyNpS=kH4!|0UF3-E8pYEWlFD=lFdrT>o*H8pjTE2h7Q zsAy}PgIM<$4E!7AQ>%k`fHgocLt*VXlbPG4R~2qu_gmX0X9;I74$x5FtG ztQV2;-@A7QF05!O=fCdS4-G4xEu0J?gkGtocokR@KBLb5H# z+nnmLnHd?-_ldw}1$RN@wLN(mPB7GmUKqM^Y6cY2ZLUB`99p|76A`JJx;pj~$d)Xk zu2}oC?ZqN@D?YoD`JBGBxnYZI7yxJFz#yhr*(L+2dI)P0F{3X+h=XMWf-|h$ZNJL< zDadNY%59}Ne0%-c+gk*WfIxrk!g}<~@4pDgHWv5P=Iz^$Kmg$0ER|RpJ#l~QhaSp= zc~a?vyNy>hF9bot7Gt4^72m2MtHqbdNKg*ObktcBk(yBY+d7A#E}{^9`ULDz{xi5& z>AFn}(#TI>Tw7PuP^5vEC7&TAPG&@H@ywp&DhMZ_C*q108caM^aUhQFQT0py$VxR( zQdIPv9eD)h5+1Y`yTFbhCw8YHJO8u%2 zAGE9z#!2PmCfi9ugRncHD#%OjJQ>SEDOkhEfiaPfG?k;IuD-5r40#OM*%wcrJ{8cD zZ-glVFTF!PO{@!e&I6G%Zg8V0rtGinK!1O#PJ@A>q8V}FS*Y4!-3x~6!JsvNR}6se z%3dy~^LE_N&B!HDuj?;qX-JDN0YfsmMMaFD;r{v9<(a>^`8s*h4|XzAn4U`QM8%WZ zHxlLb^@*UZKTM`I69+DcflCDmhRk$oN)IjSd(^y)1q&51RoDEz^)5oTFh%3{?@;zL zMG9{lY45-3V)3RATNlG+nP1nOQytM&)HQ((`?0^vFFXnFLE1?bEhXjsx}?4|x7%w^ zR(AGv`m))+e)9Mx)}WM4dg6?j;))T9fxlsSk%5l#9VGHrzg{H>Q@>0QVN%-ugYHrmn{f%+JrC(KjuJnZvDuliKQ~ru+Kt zf!a^i$%%(6&pJtyb&7?HD~1$YmgR0X@CycTY7jsfDJl?%F*t}YI$#2y|07Ty7;q$C z0SciD63%C`ATeYE84@OF_L>)#l?^p&P_3WARmFp{NJ7L;1X2u$+e)cu(i#$ujv62Ej$5CujreZM@2^? zvtGXE&p#P(%7BaT|K0w^Q1$f{%Y5OV1>AVW?$DK=tE+1pUtO5if36RF<7ZPDTX>@h zirH{*EA79F_^&m;68q>)O-@Pxotu95-B(0dxMe`E<=cM=2AhnGOmBr)Ew~+E1^l|6 zzJ6&z0Xn$+U)xv0EAz4@ip8au`2GFkTuoLa2m_pwB$y7E2HCu=Z6P0Dm=-d#j*N<` zq@beOsacbImlzm`0xVJ!274R#k@tDhEU&vHrAX2&x4UHO(QBkEy>gL0Lc6SQ_b_GDa$Ek|n2TOQ+;#vN$jVljo;tJ!7 zlyWHbVlqHGphZQe2|1PoLkS>&BKi^2`)nJJR6?Sx)3$)Q~yCnyp z1x&sqIEcZp6%;nZ`-wr!uduL?(qQP9fQAIxaq51!51}$c)iLUY?$JVh0P0iWH60?`!9Xn}0rV%BeF4m=X`f zSi++2>uU{VZ|CT^FgiPXkhY;&4qK~-I~;fqxT5_a>@FOvE09jv zTd>h{-fU33B>(Q=jyz)8S6x}GFwknT=4N6@Q!_IUfeR!Y|9aP}+1c5UAGW8GONj-T z8X6iJ6jhBWWU>Nc*Fo}vTQ&q%94rArV7nqjVz>su(dPq>-wSX)+S&$Wd10BEtsSr& z1rUaD|I+F0s@)Kpzs;4&v;zlkLkHNt3aT*--`n5c-+ql4L_mOf%7Fu6FcxB`($dq_ zpk~1N-kXqcA~!E@^nof6_BcN&yH#;6eU#G#X~Wjq<<1*6A6N$3qh0QFt^#={;|TrHqoV^6e${EF#k#0}90ip?J zqr9Z7te?ST;>XP(4A!H!hTR}3~N;gAIXaWJp0#R09NJC~ci1;N(uq z_=)Yr@6qX=P)$|}MBXw=d1>hz5!jLrN+cIe%dL?1Q+OqNsb@)PX~#@8pf3$SX^8^z zA<%U6P^c`h%xZ9ram?+GPWLDqU6E}zVqNnLdOCYor&|Xvmqq#3dq^>RBug)ysugO3 z!!`I>4gO*g&8giV!SM1|agW25pa$o`T+}Mt%wV_M4XEGZ(kUS(%na4? z^VGOBN2qn^$hAPuHLvV(u)k>J^-8A&@0`0W$XT~1Qi_Gz-DYyU>Z2;-rx9_}-HRAo3tp)8B~;WB-T^<``ec7Wa&%;JjC)jK3_K79jlrPMX%spd zPGh+cYpBP_-{6g!CgUxk&m4>1s@_yJfJq)K`k&g9k;O2We$m9Qwzkq0|aq(sa#)Au|3_#mG zptHSM8LxqPJNJ0l3|65+qRb$LEbDo{*-8^9YtLsL{(+D#4Na&V7Wa2DlK;HI#zHTu z0PmJzw}_ntxRfcH|LH(=qtQX2&F`}q(w6`h&}F95A9>}IrX7VQFY5qvu&jLJ82ZfPe%`b9S}RgBon5v5v8A>mQI z)H*mEAeqbg#HrRM`pq`eshPJ23IW7$zhDp@=;z_vVF*3zY$65R(?cruH>e`n_XU;j zM!skBDg;X$Y@ahg~lm5CN~V`Llc50-4pdYhhB&I$a^y(Y|re13lO^kh-nFZ zQ})6=uy5uB?iuQZxZvAp11L=t$zuO7lmOcUxA4s&dd6B-w=QjNg|JX&Mh2pR{~1~| zyxw)g5feDIGL@x%po8Omec0C1C0>+w!rpLb6ak3QL?H5teY51d-0(-0^r`q1@2esd zE%5pv10Ih%RZ}^(wF>~W`?1dOpT*0rKPvx2&~)HWdO#82?PvjS)C>BJA4S7tfL>L2 z;648VYpt9+3eseLC?|7!z8t{X82AfYru7k944yO~lIHjLHXOLgkN9M{N$%Hoba8O) zB0%MgeA(=U!$l+XoOb_(4L9Nvs$~)VBH=`K2 zA%%bMzP^UT5xIVMX=U0Kfl7jrnp?o$xz{Sa;v>gDcErh**{Y4{Z)oWj}x2K=o7oPlrOyVCsu9 zRNf1)4v!WZN4#%C1XZ@@mEy*@uSNz#IA9+Z`8wJX?XaHPum8>kP8odS@ZUi6P^Y*{jDfc1Xq{C76Ysf9*W zKID6QGcD%=?GucQLj#b&oNfclt+}jwdC6ku cPL&gQxxw~Djj^S8|9F`l47Xp| zQ8rXs((V3qSmY1(f$H3J{5h1VhjY*xRcLn5+Ie!GR;Y&qTei!mIyh7lTD4%ruxp_h zRVBcwcIJ6kMvWMjyK(6{_D1)5-!m|Do5FcA?yJ*z-uX`vSQArK6#P!O3Bm_e^AI5H zS6Z5{SQ73%b;wp)Dygg9w?d?TrL`XElRWE`(Y%qqXu>?SJ9DZ2+`N9?wLygjpYgW3 zZCB~{cX#s~?E>R|&Ewn-FaS#|;_58#r$ffrOrEb>jz3pKrrEYGAL2+Qr`d|asWksY zZuTBMS-;_5tww3QRSFHMgxTsE5kDpk>|bkPwhQH;`F$s;I#o%bzPR-`@3^`yCrJD4Bvmpe|0h%Q7gG?M8F0WLv;^Hz1pd<~(71cSHf9o;l&MQwY62&Y7$G4w8 z1|tObDyyiVBg3w0Z!1f`Aw3iUT-x*;{=yU%g)KM9aw{ZU7^kuRBuyEQ{h?IZT!qao z9IE-Y$I8g7=?&%4dZ5B5Ie_L`)!Z35P-tIRjg!E+-fa>x*w^E%<9 zi%}Xp1=zLPTr2FRCb&|U{5OxDB4p_178VGw{-Uedy*~g}TlTY1GZ;d&Xef30u18os zd#e>X5H(4^{xLsk89nc-882k9P0SJ~}!ouBrlzYN-|# z?uBC``<-CxG)ztD3DjKOI6pqbE8c@d(Xf6n@YsL+_>q#9X79zSt0>1*A@gZ^?=Ozo z)Q_}?*ryX0uh*KJ#{p$>nXhl9VGm=C1j%o9VI@$l&(SGrlzk(8LVWV*QhM=Z*pp?h zm$Z;jS>Tp8IL0Tw-ybeLpaOVF@t$Sa9?~z|%5QyWcB_fQa^*ENq=bcqTkfZycs7d8 z0Ebf#@ReKsA72_Myof7+*FXf^gp!g{L_|dMnJhS;$V4*TP(4#u9r&GYc(igZ(Ln~c zj3tx+GOE`$>QbJ0Ix<6Mn?A6~nOx6!K`?wfSE|kFFR7XNTv}3+16&ycv+j_t4`*%X z4C&0FLzKFiWi9SuEU0S0BFM|iF z2$F7<6;Mo!wO;&~3+9-@)sEJ&E9|$>{_-iOr3E*8+~n9(kZ9WRqoeNJ~@9F?FBOzHvY}N@J$xMA}r?93%9Y{>|@mX6dcpH6(+mFAp zdeSaNGUicwb@lasEiV2{OHUuRat+S@(C_PW;knUVP?~`{>3^ITq2?$ z^HSLL1GDH+1^kE9~E~~poqy(CT)xgeZse)X$Yb8(xL}cdV6sL^;I`~>xA8J`FNo1^u&p5~* zF46gjNII0vN5#}d1#Uc&YN_9o{HA6#P^P)Cp&TL6bbNGVYHr@M{WaaLt;_peInGRq z^RVUn0Cgnry3!Bw`th+b`==YTtxMOlK%~{=Z=*FgdQnCEM$&`~Pp<*C5g)A8;(8Ui z1?56cXOnAKYs1ejRC&X0hjSOd@7=naSzA+n3I(kNYZ+C4hx6VV<2iTSt>>;p295LG zuMp`97_l_{t~}1*_ez_boXkBF6W#_LVem_Ij#qOl&v-5N<+&Ckh{8V#eee{7>Lelc ziSgwSpCBf4J*#h$$KPCfN`KT`-A8cip=Hnz{~anqR^Ql|By6RM*u4MF*6N4JO2DTJygf5)K*%54 zDoBU+>1S}-{W6>yxqy9?z(e4dcnyhGJpVMkY6o@U-d-=VWLjzV^I}@kVW-E3Lz!bs zWyt%B9_b&Nm?=f+u}D^Qd=q`^jL;Tl%Dw*7h)7nV;a3k{?xDXYOs$(IGM12XF|_3K z_FgX)Gmm&<0@fzeIqT;|6%`c({bOk`&g*XbnZ%r0F@c&`)mc8Tk1}Av-=l}MJNh`V zCgWK~wzk!#HBE+W^~%yxnx&JT3u&BXG`1dE|iQ|gV zJO${2g`Z#6$Hzy3(vUxus|Rkd33qaAq4Tt$yySResB+wHx3z3>)`|T%{oBw2NC;jp zPnmLXla<)cbi?Z-O8fYLe{e`qIM1?_M|J#i`dJZAyZr=<#cS&ZV7L|*d8MVz{&}Ad z&@LW%&YF8KTUJ*-RlibQT+1dKP?VNV&Cd_)?Bt&=6HSg?{Mdr|5w>FIC45a;sqI6r zR^AatJMR_MxOA6$CI?UYC(u!A|KR|gpWp%gJkvd$_^v~OMJa>7eYw=dUTm8G$SX2w zUh8n!*~^PhMn=Z^Rp_zM3a%Vm+jUb4d{00x@)1Zdwg;l)WtVwgCNqe3 zPj_eu#t9mo+OB!Sl4)C=?S_+)M%@zgl$XUwo>MOzG7w zh^*OL+d)r!DYB)3(d;|&$_JG4cHYSZh*k< zn}OKBz{}0e>$4jhB>w*Xjn>zoJ*M+7sA#Mw$0WobmF@mTwJmnse&lc3bcgD!O*{Jz zX!uhUGO_X7fL!(41;z-)X^U|=s@2w5A)FaXd5w{WcUShHe`L948d4deFqoeU3aF3P3x5yg*&x<;$(si@&<~9&TZ=+NHrI3 zOd%}24*!{8(y9>gzYlr8Xpo&Tq0hj(V8ZsW9fON;uK&p$?qPA6WRGSMwxRaJh z&*0ivqtT6d-dPhKc%f`9e>vRzkky|JI#9%MIPVVG-oWo*48U{8$5bI7) zPpvz8FJhN%x;l2I4-G9wMh@|pL|@upNl@PQnD<~} zR;v5Z|Eqj}YO?Og^i@lP2t?Comoog+zHp8FcE8$H=#$HFe)=H+!iAl0WbCMn!JR>^ zSY6V>!a`w>nQj8P`WO)JoOV}M3a?t*^HNk`v0J3->!PeoT59U%LXAOjDIau?SAtve z{Zv(6?3?RPqQ2fUE0+r;j%S0$dds>3O<-dpl^i(3tWLPqm}E zP~FmDd(-BvYm32vm*?)2j;@!IOSjP{A$WyFN3HG0ER%;aj<<~NlIKbRnb*%m=8r5^ zeo?=Mrza-919?pMa?K*~`D)vJvQ$G|985X3j^`!hMrhp0$gj;!y{D&>5_aAa!cE;L zn5iG$9CQyI-e-%CByR_;*?D>174+}x)VLqC_B&+r_vv)p?q{SndSkb%UDh;hdRIny zc5c+Nad0T}B%6d&k z)sO`fomQoI>jBN{+DGnrxRjkkvGwFu8Hgs-oKa}OdwYrcKwR~vmOJ=!_}HeZH3Kfq zd+JInC_EiQYk|t*Q?vc~S_gFBnnDSX9)h(**JEJ}3=9Yav>zS}>iRLqi-?WpQid#E z@Htk87*8KnxQ~qzoB;Q6mlh^>wXXe0u6^Lvf7PnhZB1nMX!a{BF<9sCteC}U8oPB{ z+eJ%<$NietNhT(rZpY1(R5Zk!{7fc@jhVT-#$W*P%z?ce^(yY^!`I#?tza#b<3|$@ z@5tj;8@giTcNl@;Jlj3^?Yz%tc%r@`Ed8?&kHF-W!;Gs1qw9*~fJ^j%u$UNJ_eLM# z0pZQI$Nd@ok*$I#3W%}eMiFHKy17tz5;!4=MHA6;YG%&x@1oqoIEK3*sKS&!9v*iM zk*j$jWX~s(uOpHM6n{5kAANJ%_ql31f5E~XeI9je=!EsI-Q736*(GAM;Ns67w<7OE zh2pVpJ8kTN#n2E`fSwy>?0OCcS7BPgeU_1vo1UKbuRMma+J`=s;h$NnsgL^AL&$Ts zYr*m6kY=8SwA2M)7O_=I7+%l8`##BX8zfqW{wQ_rl9A4Z%^ewGFe?_bwA zpQ^WOR~1}+o+Ms%UbgB|FOS5g*X?+|8cvQoT{sK-Nn&Db`~aW_NQi29cyJB-hqKY@ z>Qya;iR;bB_Y1STt(#r%NR?1&;T1OATfq6-fk)x|C9OA+Jxrx1Q&}%?+=T;)An_Q>FAqL*~=^BlfRcFt9b8}V09$oMD zR+8Vq_V#isu(#N|*AIP9t?gZYN$VKg$nfY{nMNB1q8p2b_b5sIzb@>izUowRQWzM13l<^u7-N zv$nvS<$YC6#qFop+%(y#qax}C0)BzY2I1vekb1{Rnw4w(*v;GD=Qf|ZU)R@ zI#Hf;Gw~Z5V2=~kv|I2VNH-qJoc2a=-94_e^?1h!7!L$U!di^GeL27!_pg*3Hm&sM zUVv?*$$HeCtGsR_bw!u%6Ah7`lf}wDyq-M-3YG(y!`rTYG@4OTo|V_@+G2)%kC|CeO=6`yU1% z)yj^)pUb2FzIS+jng_|Lx(%O>`RkIXe=I}2;;E{G18YOWV}(VXi{G)!`I^=ONOpe# zx4IM7b08@aizHLl;b4Mv>d;a9xJdje_mX;AIz_!R&zio=X`Hyau#&av1p$!6+R<=_ z>CO4gCZ)BvdU1UWJH0c_K|Qm8I;>}@!2;m})FbA!waz-=bh4LgNHw75{Gj2EeEGqX z8c@i+8vwd$Y~266>Wx$&amfDoR2Yz(`~%0uD`7QlA2y$e`ECf zhqxy1_w@9HgU^Z`^?5jE6KfZNGO^~ww2{l(ddU;N%l+Ru+FhGDloTLM&$ru6*vg-8 zZfi##kqK!+KR3IIzxCFC>z<3bJ!45L%rV28ot+hZpru2Ao$DDYpwsbso?XE|?tg-PMM?g8VZtvM@+jgMkpC~=N&amE1nnX#v=ZDMo z`8RR5baW%|%;4G5EyvX?{@YJy_#m>eZR&txPkUJOU44gP)lR!>#%mp&muRkF5^kn@ zJoC=l0e)*McrNSdp@cho$ z`MvL^G^{;mN72=K?{eXx#fsnj{xF~&{PreM-x%L)58ie(D;MYclkvK;)O^Z=f?)CR z@#(8f>PU6BE1K5Q)(IUjLH-5QL*rYv&A>;)Jes4_@y`?g!b${1I5=!}lkYu|vImmy zFHiwv4d6*_tK@Thl(Thqj`8n+Q`NKl zx$4YgI>#$l)A5>xBYsisXnX!q9TE>r}56&^8yl>-2VQw&Vq6(dfcxpmDg2F|h&as%2H4XV{#~&H*isj(xjpGVT3Q6IdecPDzad?ChdWPVCxM zO)>hPk2H4BtLZq zGjsvADK~+bWKH+5Yg>$KPw^SUR!G|Ys}0ehrN&%p0Br@(o@@Fnt+S5ZB#k?bpQPD% zbYd1&QG`56YRz~TS%!aDQ|ip*6)?SDTXk|NaRlAZ5NlcoalePGRGzhF-NX6(jfVAU z-U1GQ*|tCT@VH-&8C`kRl=Rr}3OYN9y4EL|sk>l6h@d3%YHg3xhIHRw`}>3Qz(Fh+ zmAJ88TV3K(=;B{~g5j9a`C4bR7mp8b_SU=qESpl+&scZ6Q=4$K>f258I`ynMD|5xP zknsj!QS0Kq*2lec8}Hte9)R!|3f)nPQjzR#!`i@WlY~bcSJ}T~q1%;~7w?Eq9|uT) z{34<4$(Ed>yerV(>wkBU?U9(~=hptIyZyaA0I#)eWt03i8*rUe6YsiO(~<`Aq2NmM_&7KCMWI zGYj-5>fwxxjZIBV$eS`FUH(0;>Ux#pSod`38R=0qufBtfx_vr3KW}P}3K|OT_D{iu z%mo6-eC5CP6?V|w&JA_I*DHmeah@GxI>IU#^W|-^O>z}0@zfH(nzpN|+n(02k~LO1 zEP!bD^yE%O^{bL1J@9o5pba&rc106~a#hiBgzy^DOcj*MI@p;h5DLk%r?Tj9_Aq!W znSjML8%oyfHQdqe@g#FYkcbtmbnfu;!GXv1gG_{|2+43AAL?oZs#DtQ3t6t67(L394Lo#(|y zJ2QsqPh8kpS+@x4E~AftoF*IKk= z@1=yAySy1#LF*D|Q0_=WPOB)#(;l!;bNssh4D1cE#2Em~cDPxL0)>eqJnAzLMf#{6gIt(_Wnb;Yi zt1V6&Trp9nO2k75cF4&B{sliJAc|?){?`3KZg7rl~NjEJukIlgifM_uft=)Xa)!?Ty z)|&E$87J@>QRc{qo;tS|J#cSN$ws959M1Kwkl1p#a(_5f?r-d4fB(X_dS62R{JQuN zPL}mJz5gWrZHiq@@^qGlyr>WBub3cw{7$dFYGPN|oH!5pBr8|44AVf(h}g-+Irkf= za;aQ|%uf$T_8SKO72sK3xAq0z9w~~(ewM%<6M;ROyz%KRiP)61Om%H}pJNv*)ga2t z)=8$f%318yF|p$pPJh@d(};=X$4?fwFbEJAt?kBvRgxNs!}~%+2tsLMM#b+T1VBfF zM$k#Q)E?m~xru-DnR6$L3tEEup@jdmvlgbq33oD$&Q?5rR)AMv{^HygOOQA;slAL~ zvd-FYlF!^9z%Lm;@O-8D-2^m+j9%_(7 zhg3QaHJsY-PQ0i9F+M(3&I~aP6*Or0NoM-Oee`~{cCq%S*`V(&AZjIKBX$MnFcY#r zfDA|-=kp@;`5^g3>}7e|Ebg*ek=Q(IaF?!@mELWJM<5I%Je-4yS7s6J|2i>BqOWeL$O3|ffF5_qWv21R8ru(8)q!!0Eq}lO{ zxBT^u8eu)7V5w|Lo{v8|T9X~5*hLXQZDIcj1KXCtPVARcQsuPQ5xO$E83F(A_tgd=tvTeyt0v?kMCVydj2aE`VV97^rB{okE2uD^hi1B#i(wC;a(#uVr! z=#Q|JqfDJ?S(v+tDu@>-x+RT$UbO*Ir67Fk<{Y0*f2mnruDQ3Np-kA)IK3}yx?IQs zFDeIy{uw(VM&hrSxyXNUr4xc<1PtAyHrzVgQ7t_8Opc@|K{!{qu{g2c0u3Ga7Dp=W!^T@uU z4)`rlfJ!NkLcn1vagiHo_kWJUiovQ9*SD`p16%{>w_7z3QlfyVq^Guzd4(Lhu-S7g? zC_Y`l&~u)8HY0+z9F($~Vjylqe4!dV`uE&k#UCdUVTg=8K!SLcMN;L;4gUSG{z;UXAePGd@C3RM9{LN7NXXCYF5@atdzav)Q^#SUcX5^e(y%;K$JuQ+=nTR z4C^aO?RlNzFvHTTlp3<&f>$h=L~Bu82?;)e>gwuf?}F8zp$^0PrFGkXhkGhYWe^W) z?FjaifJ9iDqz3)a8DgidY{;b1$jzlO6pm!*ZE#>yrGvhc#LT~1+VV?fqJqM56WT+W zV#PIY79`>HxH+RX2hXho+`h7h=6@hPA(lprENw5@5Eq0)Ajt~NIik_-t6An;m3uGk1yoB&XVM+1ZEZ{>u|F8 zK{J$hKW(D=96*0dYQ?;CT~Tb7)!yyAk0X^}T-yq%m>?8Gn8JVDkT0fJCLrcC*vYdKwruC6>J!2>c`0p}P>+Dx z1f;qtFLRLb0nGhAjm}u$@a$6u0V$WTebSTh}M=#m(t*oaB!zj(2 z;Uj2x7fMCt@}Jb&wb`2L!wG}Xz!{0AX#oTls>o?67)qCyU)rm&y9mk6oH z%_KYtc_N#DJHqiVmC&Rvgp6NQfuN+j*0HTXtN=9WL&n^%>7I1-eNYE>UR_kD7C62v zSW>c!YBso-Qa~ium+WGS+KGXC{3v@K@#vV;kP6*qa@o+wc(@-C)Eabj+6fbI2iB8> zLNa#3V{FT&>%2tGoD`YYU6xDuK}ej~)#dFEtuBvvj64zj<1DEJMWkQI+mJ|y{5{b> zStrPEBabew^TPlBTDtr7jNl{~>vAJb_ALBsnEk8RwW%Sh>ZNy-EWw!SS3Kp{Xdp3G z_~11?06{3)eMej;6L3vnP3c&OnzSf;cI_xvSPVF3K;1zG{`G1upIyYPNl2yO?;Y+w zQj^k2mD-K{felx+$j95GG1=oHs;2g*6dJX#di2ap;TMupX^RM_2(Zn%&U6e6PY_-? z%jWtRq+MTYKD;8@tjRy&L|8Sikw3MwBMq+Q4(K>jkhb_4VK-Ssbr5<&zU6avQJC{-jf-o~H6m@ad zoiL0I3z0NTv=cs5bf{r@RoXmkbK(2sa8>NjD~CEw{uq7`CC=Iu@R-tvN2WMDG9sNc zq?*-8173!1!YEV=>`$DF@bSc`P?f^QmwN1~udK-ENKK%U1`H~U#V0#(h%83K0`VfU za`_iTgo}3^^pHp`m4ejhNQeHG97x2ew}Y2x9cceuq#~+b4=3De20UIpdd?+rJR2rV z!P3cd@_VIdRm^YSKS;IP0DBOtsE0;*e@bC&WKp2x+TQcWow}v74^i~MB0os>WOm3Z z9%#Q~eJ++P4WUq1{~_n#`NYJ7S4I8U2`E%K1+i3~or#lw)!|HzMkeGEqaHJ*yfJBU zw1`>~llqW=IozV!zC%}gHCk!XhlXqLdwq68>}}ME4iMgL)4N-|KOJdG@a+A=>^h9$ z7Ql$`&*cZl`Wo$`-XHRdomb*y9FuRLOsLPEX_Bf&B9;kb3zZXAZ}1Ax zy3GI7Bx?Fl9ye5kn$*jP`BFD<>G3iHS1|2iry@_-il*;mcXOkXW?`r(lhAHvn-vWf zjjl*QA+RQMq|{A4^l!Kjy*3|XM;~MTD_c-kp-0938n=$ETcvVEF9iTH(OX44qZ5GA za8~6B%~Y;v_h>bMP1hRV)@ELvNO*(x3^HCRxRAeo` zL9_Yq_xk9?oBBMX6yid?oZVVKBo==Mc93dZp_+>!Tc}Y%1KU91$GQSUk5;6$P7u5BWjHs7Z1zo$>$l&G`Ci4&@e=n<8V5(~x${ zs?eB2xkVu~`eqvz#P2TYxzFs9{9 z@pvRS#mdaU9!b{94Xl6DN3d58Kua_r;~J7LzcJ9FFB&TD?lmDt+o72+wIWl-47BBx z<|Wd(dkpkUBkuYva$6v!z&nhLEGs5A^|P+?%eLVlwhl*J9vQ<<+;JRQlFXL@PJCkO zO%KldDDwz+3+Mz50-HMc30!F)n#1>z@W3LY3nS z_Ypbsj+nN!IicoMPxXN6VbB(xL1=6S;b10Ow>rw4r`i`du6YrVmX?)SrY-l@kbh@F z%MG2^5i_^N9L62P>Q@_zt3EZ&eBQOEk1=xLXn|8GnXEO_BSyxns&-CUsd(jqenVL7 zK&B7Vig1))@WJMZ^yeZquh+Bto#mh`W)UgGl%8UFTo-S z*cLkSR7%^@U&J8q=d}VN%{_a9h2O zf#plnTyLe(rIdL~WA&Kk#JqmT_RG@}^<6sB2Y~!$io(L1c|%fi4)O9r>;B9X|BIjH znstAPi)O^m)tq=cqV`4ou8@!iK2uEo4HS(^N=m|sbk0PPipc(07>8?>|Ejo2${dtN zpU!0qUMjv5l~kn!d?F0Z^$g+Y2ul_L*Zda{zd7>tsQ*T-FARZ0?gymvFKn#j&NAh( zgM~S{$z==5T1K4wA`MkRh4Qrg<3lRh?`PXiHemx^E+NfKXietG2#VVuQY|Pf?#TQ| zAhAqpL8sd(2V{nOp*azJ1x!?#_c~a_4t*ECE){(m{|c z8|$d0FWz~HIbuhND%U(bRr6f$K^~Jm6(48$&%Jd0;p~{z?LID>4~P} z*zl;F=yOpPP~l1-qu;405u1Yd5jeHJ=!MPvc&BWabM+CQmNiAmBvnGrBpo`(GVOyJ zjZvL-g&Px&W{!O>oBMmY9E-oK`0xm_D@!+ zGh4`1Tgs2-#V9k|N(44apM^qL)KX)4a{5ySrSpz(!H>tunRqgHU1{UUz^QisUp-^H zInNYoStmb_U*2M=bl-(MpW3+QsR)APehdtwux2`WY>2{c8R=G4AFT@kcW#_4C{Z*j z0@R_X9=CXdX~qYWu)gZo;)+6y;$BzKMT>*X{lc9wt_Vaz$+6>GMGcMNlk&&Q3iI5^ zKSuP`I@6RSHib2TXB*_b-)B%ScZu zDt~Vh((In2mHo=Mp0|6B!MwyQ%!`*d_%lPTo_bp|l)Shn_;(Kmn+^3>dKx_GGHO{@ z7crAsAFj0O=6Jy04~n7;sU9UkL(;}+#oSU08ZwDhcs7go)An~apv58@(i5`m1VzBk zQnZJUpam$}0 za&v}i0}^AWk~_Wz9d6g)b^@m6Vi=oBEV}TcKZaJ$uCM@08D>b(1n| zQALuTGuB4(4v4dSG_$nKZ)&>#HDG@`P)e-RD}JlV9Ik>6SXe@mhyvdSKEdZK2yZ!v z=)g8s8bJ!5Yph&FvMqD(jGA;EiS0#|6A3HV5(z7~{6yzW_R6O^4lh(JB z3q?pJCHZZnO8zhkrRBs6BbiqRIiD=pb&vj%T6Mld zyoi=m%0g;rYH~PIJ~Ol3!>CZZ$4Ir-Yc#805G@nO!%NE|abvK3#1!z3CeEhvmAg#T z+MubLLL`-`t2CGW$nJtqWFU%1-kmXfC{7O{3;xY#AP=FqOn7Jy38$WVAG zBY)>$V-pr;Rb~?wWoL`%^OH0$k-o={BqhZ#u#`C=QA;Hyjfv{B78qGytr)+3hcO`Fq2z7her!V2en$`#B$$r_4=5|SwQ&T;m7*uqCO>@lk8&bfO*S`G0J1{-C zZo*4%2WOz_Tvf<{D9>@5?3U4)kwG}+bV{n@e-CA^aUs)KrPd9aR&Ki~8q}nsz#FZ; zyVsAV*4D<3Y%X1;kJu~O2=H zTQhZY(;F5YaW%nlFwDfMJ)JyJ%Qh>}9v$N|ZTvArG3qbYXtnI@Ttb!f9%T}f$sv(y8$dvmNt!dm(-dpB zs}-mC1dM6Lkq0pKMMV$w@5m0zcrhS=hR1yC6v6HY4?! z{YVUZYexz$8XyW$7FFjKPnnxZxX}N5R_q=Y9rb6VzyBi%X(50HL)M5r5CHTG9~~b9 zc%Qa&YJv7me~#0i^!(3KA@(Hmw4@`YD{{j@e+sZyOH#|e4FjrH0DydnVc2r3vtkG|K%*cc?qg!5;A7)wWTtBsZ~wJZS67gG1Jf09h2%bO1vf*Y(IXH0bUufZ!V zOv~?WL;DzioCpka67@={^(=Kb0wW+m`jP+XC(HM56tLIPrCUz}7D?VuiTB>7q-t3x;_^C7aj0P5kzTPR2V647Yw zzR_~AcB{G7_-Nr>j`s(c4a{_f4by$p>IR`S*WDoz)RG%ak*<=yGLxp-QnjtjhQB( zbi;yJgEzP<2_G9h_UCiyth&^(Yln8z3g5$P61|3Mu`YT1qR#9Larjt8MWsb=O^`{!17;6;ZXL?UP|t0- zp}yYsXy)su(DAbnwripJhz6#4?jN;lOSV9tNDY}<#(p3*9JV*8H7^-sqT)7B5wnke z)SqTiIw4*kXK#;R!29_@3G4-fS*qLH+e;u|-SLeEL)PASJ{X6{t2@u$8IuhAF#(?R z1apo|Q{WYXsMo-(6`~|gAQc_5OJkl~US{JTkH8seA{TQnenpt(*UDS9j`Yk|eNh(tF zmD)0O^jy1TNqykR>GQwWz0q`;`6*CjfKO;IB$Dp+-e~*V>%Wv!fp3g#N>ZcZNHvX@ zWQivPE&4z=LiOa+2QK zGq|0?riOcrwO~V+Q2P4UbI?mb&80L%p`8?K3Tvanw4@G|NNu!*>O@UFjwBb z!=9Fl<=u-V<}R?@asf&PqIxrhCZy-`5n_@>H3Trz@JOzkyo+V^jh($=OJssJ)G3Ok zrDc5$3Xo`6A_%QuChlM>4nYb_;Jfq8-Q1jN6EfXXccDyrWo@fs=jv4#il@N1lhu1i zG0+pYy}kFOOwTLNZn7jkD;nA)jalX@x)sKe4wC)|jJRr&{0>}XagxzKo|~I%rO*^4 zYEX;u0Y5=bK%e||@LIN9st+wG`N}4varKy3IA_M)87uuomNJ9R7@aoEV(m<*In7g1 zQ{tnPgjIU`=Psi9c5M&U+pw8 zE1#IS&NmdVD!ZW$PETL(E;8FWbn}3rIsWGhVMncTzJr5L<8s!=6m!};mo-Dae}E(5 zVjM=wHm2}q*k;E}K3+wYhcyTm$YlcJc6W~f^MAhfRAXS%h4Iz?&3YcWaB#9%m%;01 zKe%rn$k1EH+FEA0$*2SYfjRa5e*uD}W!iB>feyxH@hCLw25)yNE!O0n25Vs80>C`J zB~#l7gZt0U&Kx@dfJPVc=I-tlX(JkGDI_wAh;IlOSJd^kEO%2U>3ygqnyE$>YCZak zHC(U*hF4%XimNyw=%lDp*cZ-00}70y)GBM8i>s?I*+`4uyCKV}s;UqV;M5V9Vr1B4 zwkL9g_u)vi1{EQtQHpSuXZ=6_#msY!iXToyqZ|wtg`e(8g-_0ILCGenZm%5Jwwn$) zg)jgI0j&K>t4I6@g7EV4>XOLX7QqA#o;>Ts7R;;->Zxg*25nKg4@pE%f;&>cC|L?= zHl~8?vwF<%*coX;$)Lpx5YUB4kI6f*C!1Q^+TOHs@M~ywXJb#T*5xnyEm?SZM}U0@ zaV!%Eari`yp++!n^8m}m15A%4Wq71=|fldIjF|)nhk?T?w9_!g)*YOIp%vM9A2TCo_v0Sw~3+3 z$%~)Z%F4fk5L7(S{XCm)&Lf_h~l3HhME&YE-$KFQe=Vo9>r2 zSx6-ZRj3&K2+$R9=VZ@xPnEqfTB*Z?06*sEd&{pOdc$D*5`=1-iX}?%>I|mzoiI%)pjglhjqt`VGN!L@J<00I}<=XBOpLkYa;UHV-CiS)ax>rKwjW}$TwDl#g{{`mobyBJmS*xTGInQ-nwmbwGXry!n*VwbR_9A&H zZr1Nqs`JC#6Th*bpF7vpl+9xBCR`%Sn5_j4c6N_Hzvl0!S?4Bu99I8}OYzgv11*)S z51t8k7qQA+IQqyx}_w;n^{!ohMAP_N~%P&Ou0j63+VMfP#)|NXDCM|Vg^ z6;GO&7nYZ2Ksn4F;iOS=e5(RjhrRjIg&p7`@Wnjw#WFF0!&SJ3C++v}DrGRP0uYtX<9*dN0>@VbKU~+j&^pL&$CLq#R{w&4o#!W*YC093#GG|S$s;JK9|t32HXf<=t!Ornno7sDO4}2 zyhU~Q>nGH;*vrc{pn-fB$9*F4CPs)N>?Cbkc(Wp&-ELe1LprE!YyG0u45a@CY zQvI2B!U-#qhJernoC%(Jsp6bIx456ucwy^2cpUz6lo!cX@@COMO{*#~z)UaO(?@O$ zTcmYqBd8Y?0Z{z8y={J!A!ZFuk=xPLPYEnAJlF;`*+xx%iO!sX#BG8o(}@eaZ5z7O zFw?U&PhM!ZJxgr?tJx$&-no%-B+h26{r;&9(^@Z;ut(p(Xs@i?Tm68d&x>{q_ccX) zxshq)@9+OzaZz-DKfFY{jj4B;@j-aTNPc!%CO7j-u1@DH0muM{^^Hxhz=v$|{e68} z7X?0LpejY6v9K7AR~=bbye8MoWB;|uDF)R%zj)W2_~6qaRA&qn(-Pd+-n zY^!7d ziOaE{lr;<*rBJpyv#92}i~}SRUQC4*bEh;F{i?%$Zhrm@U$i;ey_)XzoDkM+L_F-~ zjX*#eEfK*&tvZ{Jsos=7_fbL3zRBd_!!nB$X8Lhvx21&z+2JZZDKM|#&E@~3Q^DCz ze`_H*Ir(%_r%9gDQ9w4Lr)%Z_{_0vNx_ctP@)qcG=f<4X!29Z$*7=?X|J-#E!ni!x z7J$k-zbYoHcOvDUw(q+e37l)-VpT8y(E|;auu6W#99kXxxM@&@&ob58>t36|v3&70 zgh!SHbFqzw$BV|sMm9*FEBWrJTpUO*1r zccO8ZrK(QNCA8x@Ah}2m_Y_RG!?FcV$k_=y36EjEzfxw~4Y-0vqemfy1QNw%uux+K zMK1!T0Vn{i8R};p&maN$Mnp5Pj<(CjUzD=+23mn*)kv2w3j=j;drQUW<{;_*v-sZ> z+hXmYafN-M5*${? z=PODr)?-5Z1JLjA$E{@H{1k3Y37>!j+GbFx=!JzY-xyzykl7>3@bE61!E(TR3x>M_ zehKioI3;&4uUCLXD>rPf@~tbyWgYH}dpGpcwok5%Imw9irC8*MycCOc4mBAu@NU>Z z-17biV)iDME4--!R~ErZpSHTRROi>ccJkqM5`%z{kn>qJ*7+O2RbU_>!4{s3@ktKg ztwX1X*FSpZwfNP}^DoKw#w+N%~RyYiP$@1eav zMGlmudb9?vDjG_pdUUn$PB{+8vzYcAgMe-NKOh8M;;l` zSBHG7cCDXs%zeoe*)8z_onz?-e_$C5_(=rRHzkLs6pUv`BFMPCcOlVP_{XZMs#cyg z;?dP`PyiepPw00ZleV@)0E9e)v@6}yAF8Wal1`u;7|pXiW2dRQeK-Yy@tIZUQ}>k4#komn!7hm8Ww{X& zYC3$>(d(+odk2AkWeT|i&f|k>s;Y;h^IEVr3Rw5Lk`)@5_v^_s?Soxi><0%2AB_3q z`mJ?7qT{X4mOH$irXKIF8SQ>WFxH9ZCK&sfXnH3s_s993ME0NZw*DXc2XK6<_OiF0 ztNe@noE&Nvxd_rcSpj>!HTcIG!i6Sx?sch?c|U@2aP}knjY1 z>12heCf(9urON8VZRxziu7%=>%yRyxG0sUv#?#9T|yzla_Wi z)qs~X{On=v&1qfQ=g!W~`W^cu_Y-{h`{u`KgG}l6TmBlZBdw({bish1K7~hfFj{qG z>28JYEQ;;yFoECm*jFeNTDayDGkiCs`bJcp0-q^&;1Q*$D9tW~#SPSQdp5@FCMXEkP) zQ#82A->u{KT%JB^yPF%=7K!WOb&(pK?Pe+&P@jz5Ex$#7?k>%WuWsyuf@y7lX)ztF z^921wTN~R1mvJ7Y7`8}yuGeNsG$8OV(Iz<90tknzZA8 z4G4Zkx`(~sJv05x7s8`8wideTE%A6F&b4h+i}Dtmz4%!plL3`ax59YEROXa=!_Nid zdYD-)taD?Fk2Bod(z2x#HZW+2;8pE0rhI$jnMlfPHP~okm=aN2(QnRfeOvQuIdsDI z$7*Z1Sa}l939}N09p{YOYrpQY-(2@@WRT&DPGeeW!>ZM%HB+fVukZJ|B3J^Si}Rf< znilZMPcs-jh%w0(iqT7Cm&Lab*+$Jl6t$6ax;ynY^rxa*goDG^hd;9!5-HBMBM7h- ze}1z6{_a(nq*ceIB{R*`sy)FxVmfr+Di#! zBK*Tz#81#ACHKG$fG~Qf;?`%YhB>S7{}1X0(CH*2;mXSV&D+gFYr$F>v}$2xF6c#O zwsbR?6^A+}48XX>PTdAGfqU#;@Osd&{jA_(qDWKh7CEvutt3;uP*-fx$Zr4lwiH=P z=y|-3BryL79B*1sk)nlVWo6CYVi8RI&uJLmIQN$-jf-?Ty9}vUJJwo(1BsK7k`&^L z75O8m{I%tGrbwQhz-raiHXKQaftCdcD>i z85&COb^PwA=!i&R8Q)uzY&9pguIILipNbb3X_9Hv;+Hakp~bnh?rNQh&R-FR@-PfS_EUM zz*C&z+h0-Y5U!1xhNgY?Dioe8noT`S}JIJ*fLa3RqNw^c}xCIW8=Zq{!iSp;)P{Qt)17%d4o zDbAucvz}7@*24wTP9?y55OUsX{$K1$^Tk3aY z!vxh9hPf_?Hl-IWw%E;WV?PJ7pM*_%?2w?RBejt?H;H?}7p6CNE9S)$E-Ep*m{w!z zdA4g-L*`+D0Kr3qrOk8Br`D@>>{`S4(Ki;sE!~duNj^xi!778_R=W!DgITrQ!IKKW zObZ10Oe-V0{>swjQzu3_v|I0=u98UmwimehJrHRLYA2~PX=*%muOPcDA|irmsEpLT z8*rEp8b&07OvK3F40dPmP3eI`8?%z-lJ8A0ub5*n>W2__dc|@O86atktvwXCQ;CX* z(BVb}$H~jfANF{0CuAQoZ1f1zWNF9A=GxlY0V~I8M5ha;>4N#uDA~jmj~qp7oN6>^ zGj5;1>anNi`X%z!IxXhKlZkp##{)Qa)YHFFqaxaMm|ZQcSau+5TNwF4MbTD$R57Pf zE^0ia7TczV#J=oh9SZ8#)<*8}dSK;~_VVV%tv-Z!$0Q~ujs&~YKl<0UdOCZ+xui}F zN7aa=TL;kXsinH$9$JrsXq`(oh$n$?Zm=7q}5N64pZ# zSLLV@8xheiW8$GHy3^!}sC8D25zDpV=%`qJMB^p#2b&7UN7Kpg-CO z-Y&R1i{ECfq+h+NoXE%XvUh>bkdBMKq1zsw61IsHJq`9#iZjI5Xdg#X0ub%5zSq=| z{5dO88gC79I_1*KVt(9;VD+{9)Xfn!{<=Bs0B@jsrHMgVuoz1BI}OO;R2W7>zTpY+S37uz#W?4M86Q<4_5s9Ors`RO~vT2EgAtWoK7uN!C=YT1PR7YMcM AE&u=k diff --git a/src/res/HLEDGreySrc.png b/src/res/HLEDGreySrc.png index 8cafffbd1c01e351ca9442c3090502ef41941d73..50532d909305c9de96ffda61bbbe3ab8cb295755 100644 GIT binary patch literal 10893 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

}q>0DT- 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 diff --git a/src/res/HLEDRedSrc.png b/src/res/HLEDRedSrc.png index 83e21598a363c2ac1e5c58c69f1a2940b689a36d..841e088e0701eec6524d977c94d3c8ba8cffa315 100644 GIT binary patch literal 19617 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 literal 21608 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

  • 0;Al~Tt%yKi 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 literal 21234 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 SBiJbp0HFG&dZiGjuzvu4+Dtb9 literal 2960 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 IR<#WIKS$9=cK`qY literal 32978 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 L*O04`F$?)0_=oJo diff --git a/src/res/instruments/clarinet.png b/src/res/instruments/clarinet.png index 623141f054c3d39030fc372e95d51ea74ff691f9..b12233220f31d347b8a776a75fb16f5988b7d15d 100644 GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv|!2%>rxN5Y36id3JuOkD)#(wTUiL5}rLb6AY zF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE?7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOg zEbxddW?lwTPk5$Z{%u$K;=re!l|K*Z9rSi7xRufU!CERiAX%pICEp+bLDuKP^o2G!8pF zc3in&nScAi-?LfYhVg9S<*8F>JA2PLI%1*z&o{b}XS>9wzpwA#u{DxMu`eg$F~4bi zgD`)p^J0fS4m#5JNMC9x#cD!C{XNHG{07#Zmr8t57t zhZvYynHpP}nrIssSQ!}Pzvs+D(U6;;l9^VCMS~GULv2zEFdi8gJYD@<);T3K0RS9A B)N%j- delta 546 zcmV+-0^R+c1j_`F85#xv005o?w4ne100v@9M??Vs0RI60puMM)k!v1*-2w{@5-MaO zTV?Xrn@Ncs*;z;Z|k{~7s-bMsT6g3QC21ZbrK`(*~YC_B{ z4+|-H5b7db1P{T&DpvRHaVdG8(H<9+zPAMf`= zG#Y&dPD>C3Azv&OA9KNf;_>*g*Xy-KQH=0P_yPa{I4YOR%-CTrm!nK3^N~xmY&Ls) zpY9G9(C71g2C&n0{iY;I&Y@1H1Jg8b^m;u~6y+QM(&;o?x^B1ov{WilFc^H!1XU^( z0Pq-wL82&LsH%FMxpsv@p`>XVx!vvy09VH2u`{UIYytr4_4=ECYPCwk;qdIz9q{MI zWHJE&NRsq$wOYMX6vYIfJAS5Z+W>&+blOu@m0GP9>AG$^27iBxd_Mo6R;!VwX|Mlx z=ipxl%jFUPuvjc!g+iga-|vs_cDt|Z_4?DLYxcL5OeRkPfdCST#1mPT4;^EMVPH0! zJqm}z_XRa@a2CEqi4B`cIb_Lo1C76=D-CY>|xA&jfKhaLSo`Jo@)7O>#85b{` z8KYmTKhSu_&7LlfAr`0CUfJs(94K-8qr5?slfxC>#N4&NqTVlK(Xo`6lp9Lz6Z?*@sW=m4v+RZ8{hZVZ-o3`}ZPfC$ z<9{5!>Nc}ouK0Xd(3_3!@yR~gr};ij6I))^8e8UJ%C`064Edaoa|@&PMs?+GdvP^V zeEQAQ%YT$6oiRGwx@&!TS0xkEF4Zayjv47)b^N!Mo#EbfL`hLmKBmJkt4yu_x@z97 zHHT(gzJ4y;$tkXz_40-?mX8gqjBi;BMXIl#Xk5!_H*>S)#3$1|?Iuk)5!AWo*>a)t zO6sETyi{%&RCfA##we+Rq{E} zQUBcF6d&uPv$2uJ=j??4KPx_NFEiiLLSD_Le%Z;JDSnA+X) zcOhznQmM3-umgWBK(EoIYPI@^n2X$IFmi&>Z+dn9paBdWH{ERHGJ}y`!X4A|(u1LU zw%syaHfCj?jUjg1n2Ee*7TFkLp^bIOW*IHDT`zgfe6%sd7aNltLys}E(sY~2Yv!7b zA$;?F=oh+=p%w8+io9knqnoDL#0_-CG{>Q!Ul7VjD{g-jL(4Rtq@ATbiLf8-MDx&F zbP-j!@o%CRYvLi2scw#asd3TPrk58CEhos(PgJ&9iwaE4Ar7E#=qM9kHQ|F}wd3}n z`DmKP;4tTWU~Vq$lV<j+Cj}%sq)mQdmQyXfo2P9h8~#GUe-xtOC}%b8JMz95~%{4fItPXOZu!#U&GvRwp7m!wrn1WQF8{(cpMmBT*PwLcDA28&Q5f!kqlxCvL zXeZu-l6C25Fd`c2AYe!r+RL1t%3Hvse-=?2Uz!5vX}3Ovl7^n51|y=WC=-Srpm(T` zF{OVy#8jjj^Wnhb=)FB7gz z`sRM!iQ#F{QvKY&ejA&lEpIfFCE6iwe)JOBxZg2j( zM!N3L*UlADZa-IHaAL`{C;xJnYe-K>_AL=Jvsc+Lyslp<+R^n*+wNjPnt4R> z(&Ow!;_ItiCWae5*DvOCwdm`eDKv*|MzHQesl-?E*F692W0x@B6|Z~#S5gDZ%}u{t zH@~>?LG^%(#U92UF`xTYF44vZHhsC+{LcJ#b5N}m=iL7vbvB6a-e9d#!(UriAe84O zU}4}BQ_&iwy=B&mH=q8n%oCf$rRvK1Do85#+xe*r(%$+;_N}ipoUVUxD#MP?X?fGu zZ9Msl`9Njf@89}84te35&LwmMBSf{tHKHUXu_V9nO2EKgAqhSZBh#`r7$pfy85}Sb4q9e0Oud|^#A|> delta 898 zcmV-|1AYAe1gHm)85#xv005fyWSjs100v@9M??Vs0RI60puMM)k!v1*-2w{^6$JJ3 zem4LB12suRK~y-)os>^V8(S2{zfLNXnNX}~FcBvhtJq4?E?NZ_1vL*%9C@TBG{|Dm-uzd9SXFl|VcA87Fo zW8$~E_j1pV@0`Oqn46n_^Nfs)Q~|*9@-j{$f~M&w<>lpn0f5zN1;=rDLlg|dgsQ5l zZX1n8X>D!oKS2;qd_iLxqsRaOw#d0#x;^N}n>FMcbnR{bnW9~J{96TP+ zV}c-RM@L5;0ARP8H2&_&&w)Q>G^U17E0APN89xTful}g1aiuzlvRtv?&#f_pUUgCK^_B%I@f5+X?w`uqFA^L*51vqhCkDNCo*W{pMzi^a0Ov9XaD8XAJf3%+S<}RJw4f-0KoY8H~@fQ zn1?!@?q9W9eIXu?-*da&GyvFaw&Nkg!^4=IoP@*Sh*eZnJf&&+#nI8x1*6eul4Thz z%jTX=Mgs!_H))!lDJv`6k!AVv($dmLB9HY600@U&!^^>7@P^OlQ^ZGgD^^!mQ?e{yA@T`sX=woftgNiOp(v^$olb9&B>50sU0r#(=;-LcH_QEEcX#)P Y&p5C{SCh-{tN;K207*qoM6N<$f_87MkpKVy diff --git a/src/res/instruments/vocaltenor.png b/src/res/instruments/vocaltenor.png index 633477bbb107ccf9be12aa5963bb9bc6be77749a..9e109f51a301cd25aef16582431f035d1f4907c4 100644 GIT binary patch delta 2140 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 Sk6Zu%002ov22Mn-LSTZ>Z1s@< delta 2129 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 literal 27223 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

    FC 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 T5KeOeEkPP8y2`bRmZAR#7+ja3 diff --git a/src/res/mixerboardbackground.png b/src/res/mixerboardbackground.png index 675925646025248df5e5bddb137183427081702c..e1d1aadd980e057b42175b35377493bc5007a09e 100644 GIT binary patch literal 21853 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 delta 22102 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 diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index f740e224e9..2c05c2f12d 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -5,21 +5,43 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/rpcserver.h b/src/rpcserver.h index b5629371bd..cf9da2706f 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -5,21 +5,43 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/server.cpp b/src/server.cpp index a477771fde..ce2669cbf7 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4,25 +4,48 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #include "server.h" +#include "util.h" // CServer implementation ****************************************************** CServer::CServer ( const int iNewMaxNumChan, @@ -30,7 +53,6 @@ CServer::CServer ( const int iNewMaxNumChan, const QString& strServerBindIP, const quint16 iPortNumber, const quint16 iQosNumber, - const QString& strHTMLStatusFileName, const QString& strDirectoryAddress, const QString& strServerListFileName, const QString& strServerInfo, @@ -40,35 +62,35 @@ CServer::CServer ( const int iNewMaxNumChan, const QString& strRecordingDirName, const bool bNDisconnectAllClientsOnQuit, const bool bNUseDoubleSystemFrameSize, + const bool bNDisableRaw, const bool bNUseMultithreading, const bool bDisableRecording, const bool bNDelayPan, - const bool bNEnableIPv6, + const bool bNDisableIPv6, const ELicenceType eNLicenceType ) : bUseDoubleSystemFrameSize ( bNUseDoubleSystemFrameSize ), bUseMultithreading ( bNUseMultithreading ), iMaxNumChannels ( iNewMaxNumChan ), iCurNumChannels ( 0 ), - Socket ( this, iPortNumber, iQosNumber, strServerBindIP, bNEnableIPv6 ), + bDisableRaw ( bNDisableRaw ), + bIPv6Available ( false ), + Socket ( this, iPortNumber, iQosNumber, strServerBindIP, bNDisableIPv6, bIPv6Available ), Logging(), iFrameCount ( 0 ), - bWriteStatusHTMLFile ( false ), - strServerHTMLFileListName ( strHTMLStatusFileName ), HighPrecisionTimer ( bNUseDoubleSystemFrameSize ), - ServerListManager ( iPortNumber, + ServerListManager ( this, + iPortNumber, strDirectoryAddress, strServerListFileName, strServerInfo, strServerPublicIP, strServerListFilter, iNewMaxNumChan, - bNEnableIPv6, &ConnLessProtocol ), JamController ( this ), bDisableRecording ( bDisableRecording ), bAutoRunMinimized ( false ), bDelayPan ( bNDelayPan ), - bEnableIPv6 ( bNEnableIPv6 ), eLicenceType ( eNLicenceType ), bDisconnectAllClientsOnQuit ( bNDisconnectAllClientsOnQuit ), pSignalHandler ( CSignalHandler::getSingletonP() ) @@ -191,14 +213,6 @@ CServer::CServer ( const int iNewMaxNumChan, Logging.Start ( strLoggingFileName ); } - // HTML status file writing - if ( !strServerHTMLFileListName.isEmpty() ) - { - // activate HTML file writing and write initial file - bWriteStatusHTMLFile = true; - WriteHTMLChannelList(); - } - // manage welcome message: if the welcome message is a valid link to a local // file, the content of that file is used as the welcome message (#361) SetWelcomeMessage ( strNewWelcomeMessage ); // first use given text, may be overwritten @@ -278,6 +292,10 @@ CServer::CServer ( const int iNewMaxNumChan, QObject::connect ( &ConnLessProtocol, &CProtocol::CLReqConnClientsList, this, &CServer::OnCLReqConnClientsList ); + QObject::connect ( &ConnLessProtocol, &CProtocol::CLReqServerFeatures, this, &CServer::OnCLReqServerFeatures ); + + QObject::connect ( &ConnLessProtocol, &CProtocol::CLReqWelcomeMessage, this, &CServer::OnCLReqWelcomeMessage ); + QObject::connect ( &ServerListManager, &CServerListManager::SvrRegStatusChanged, this, &CServer::SvrRegStatusChanged ); QObject::connect ( &JamController, &recorder::CJamController::RestartRecorder, this, &CServer::RestartRecorder ); @@ -383,6 +401,12 @@ void CServer::OnNewConnection ( int iChID, int iTotChans, CHostAddress RecHostAd // must be the first message to be sent for a new connection) vecChannels[iChID].CreateClientIDMes ( iChID ); + // if not disabled, inform the client that the server supports raw (uncompressed) audio + if ( !bDisableRaw ) + { + vecChannels[iChID].CreateRawAudioSupportedMes(); + } + // Send an empty channel list in order to force clients to reset their // audio mixer state. This is required to trigger clients to re-send their // gain levels upon reconnecting after server restarts. @@ -451,6 +475,68 @@ void CServer::OnNewConnection ( int iChID, int iTotChans, CHostAddress RecHostAd // logging of new connected channel Logging.AddNewConnection ( RecHostAddr.InetAddr, iTotChans ); + + emit ClientConnected ( iChID, RecHostAddr.InetAddr, iTotChans ); +} + +void CServer::OnCLReqServerFeatures ( CHostAddress RecHostAddr ) +{ + // This is a bitmask of features enabled at the server. + // EFeatureSet from util.h is used to shift each bool into position + uint32_t iFeatures = 0; + + // Use 64 samples frame size mode? (argument -F) + iFeatures |= ( !bUseDoubleSystemFrameSize << FS_FAST_UPDATE ); + + // Multithreading enabled? (argument -T) + iFeatures |= ( bUseMultithreading << FS_MULTITHREADING ); + + // Recording directory set? (argument -R) + // If a recording directory is set a server could potentially record all client audio + iFeatures |= ( GetRecorderInitialised() << FS_RECORDER_ENABLED ); + + // Will an idle server start recording when a client joins or is it already recording an active session? + // (argument --norecord disables recording by default) + iFeatures |= ( ( JamController.GetRecorderState() == RS_RECORDING ) << FS_IS_RECORDING ); + + // Delay pan enabled? (argument -P) + iFeatures |= ( bDelayPan << FS_DELAY_PAN ); + + // IPv6 available? (argument --noipv6 disables this feature) + iFeatures |= ( bIPv6Available << FS_IPV6_AVAILABLE ); + + // "Max" audio quality setting enabled? (argument --noraw disables this feature) + iFeatures |= ( !bDisableRaw << FS_RAW_AUDIO ); + + // Disconnect all clients on quit? (argument -d) + iFeatures |= ( bDisconnectAllClientsOnQuit << FS_DISCONONQUIT ); + + // Has welcome message? (argument -w) + iFeatures |= ( !strWelcomeMessage.isEmpty() << FS_HAS_WELCOME_MESSAGE ); + + // Logging enabled? (argument -l) + iFeatures |= ( Logging.IsLogging() << FS_IS_LOGGING ); + + // Licence agreement required? (argument -L) + iFeatures |= ( ( eLicenceType != LT_NO_LICENCE ) << FS_HAS_LICENCE ); + + // TODO: + // Running a GUI? (argument -n disables the GUI) + // iFeatures |= ( << FS_HAS_GUI ); + // + // // RPC interface enabled? (argument --jsonrpcport) + // iFeatures |= ( << FS_RPC_ENABLED ); + + // qDebug() << QString::number(iFeatures, 2).rightJustified(32, '0'); + + // Create and send the message + ConnLessProtocol.CreateCLServerFeaturesMes ( RecHostAddr, iFeatures ); +} + +void CServer::OnCLReqWelcomeMessage ( CHostAddress RecHostAddr ) +{ + // Create and send the message + ConnLessProtocol.CreateCLWelcomeMessageMes ( RecHostAddr, strWelcomeMessage ); } void CServer::OnServerFull ( CHostAddress RecHostAddr ) @@ -496,11 +582,6 @@ void CServer::OnAboutToQuit() } Stop(); - - if ( bWriteStatusHTMLFile ) - { - WriteHTMLServerQuit(); - } } void CServer::OnHandledSignal ( int sigNum ) @@ -858,10 +939,7 @@ void CServer::DecodeReceiveData ( const int iChanCnt, const int iNumClients ) // and emit the client disconnected signal if ( eGetStat == GS_CHAN_NOW_DISCONNECTED ) { - if ( JamController.GetRecordingEnabled() ) - { - emit ClientDisconnected ( iCurChanID ); // TODO do this outside the mutex lock? - } + emit ClientDisconnected ( iCurChanID ); // TODO do this outside the mutex lock? FreeChannel ( iCurChanID ); // note that the channel is now not in use @@ -885,16 +963,41 @@ void CServer::DecodeReceiveData ( const int iChanCnt, const int iNumClients ) pCurCodedData = nullptr; } - // OPUS decode received data stream - if ( CurOpusDecoder != nullptr ) + // Recognise a raw audio packet by its size: + // The client doesn't pass a value for the selected audio quality implicitly. + // Rather the server is passed the length of the data sent by the client in iClientFrameSizeSamples. + // We know the exact size to expect from a client sending raw audio packets. + // The length is calculated in the client by: iNumAudioChannels * iOPUSFrameSizeSamples * sizeof ( int16_t ) + // iOPUSFrameSizeSamples can be either 64 or 128 (small network buffers enabled|disabled) + // iNumAudioChannels is either 1 for mono or 2 for stereo and mono-in/stereo-out + // sizeof ( int16_t ) is the size in bytes for the raw pcm audio data = 2 + // Sizes other than that are considered OPUS coded because those depend on hardcoded sizes in client.h + const bool bIsRawAudio = + ( iCeltNumCodedBytes == static_cast ( sizeof ( int16_t ) * iClientFrameSizeSamples * vecNumAudioChannels[iChanCnt] ) ); + + const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt]; + + if ( !bIsRawAudio ) { - const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt]; - - iUnused = opus_custom_decode ( CurOpusDecoder, - pCurCodedData, - iCeltNumCodedBytes, - &vecvecsData[iChanCnt][iOffset], - iClientFrameSizeSamples ); + // OPUS decode received data stream + if ( CurOpusDecoder != nullptr ) + { + iUnused = opus_custom_decode ( CurOpusDecoder, + pCurCodedData, + iCeltNumCodedBytes, + &vecvecsData[iChanCnt][iOffset], + iClientFrameSizeSamples ); + } + } + else if ( pCurCodedData != nullptr ) + { + // copy received raw data stream + memcpy ( &vecvecsData[iChanCnt][iOffset], pCurCodedData, iCeltNumCodedBytes ); + } + else + { + // lost packet - fill with silence + memset ( &vecvecsData[iChanCnt][iOffset], 0, iCeltNumCodedBytes ); } } @@ -949,7 +1052,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients // stereo: apply stereo-to-mono attenuation for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { - vecfIntermProcBuf[i] += ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2; + vecfIntermProcBuf[i] += ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2.0f; } } } @@ -968,7 +1071,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients // stereo: apply stereo-to-mono attenuation for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { - vecfIntermProcBuf[i] += fGain * ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2; + vecfIntermProcBuf[i] += fGain * ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2.0f; } } } @@ -987,7 +1090,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients const int maxPanDelay = MAX_DELAY_PANNING_SAMPLES; int iPanDelL = 0, iPanDelR = 0, iPanDel; - int iLpan, iRpan, iPan; + int iLpan, iRpan; for ( j = 0; j < iNumClients; j++ ) { @@ -1003,21 +1106,20 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients const float fGainL = MathUtils::GetLeftPan ( fPan, false ) * fGain; const float fGainR = MathUtils::GetRightPan ( fPan, false ) * fGain; + const bool isMono = vecNumAudioChannels[j] == 1; + if ( bDelayPan ) { iPanDel = lround ( (float) ( 2 * maxPanDelay - 2 ) * ( vecvecfPannings[iChanCnt][j] - 0.5f ) ); iPanDelL = ( iPanDel > 0 ) ? iPanDel : 0; iPanDelR = ( iPanDel < 0 ) ? -iPanDel : 0; - } - if ( vecNumAudioChannels[j] == 1 ) - { - // mono: copy same mono data in both out stereo audio channels - for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) + if ( isMono ) { - // left/right channel - if ( bDelayPan ) + // mono: copy same mono data in both out stereo audio channels + for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { + // left/right channel // pan address shift // left channel @@ -1046,54 +1148,60 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients vecfIntermProcBuf[k + 1] += vecsData[iRpan] * fGainR; } } - else - { - vecfIntermProcBuf[k] += vecsData[i] * fGainL; - vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; - } } - } - else - { - // stereo - for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) + else { - // left/right channel - if ( bDelayPan ) + // stereo + for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i += 2 ) { // pan address shift - if ( ( i & 1 ) == 0 ) + + iLpan = i - 2 * iPanDelL; // left channel + iRpan = ( i + 1 ) - 2 * iPanDelR; // right channel + + // interleaved channels + if ( iLpan < 0 ) { - iPan = i - 2 * iPanDelL; // if even : left channel + // get from second + iLpan = iLpan + 2 * iServerFrameSizeSamples; + vecfIntermProcBuf[i] += vecsData2[iLpan] * fGain; } else { - iPan = i - 2 * iPanDelR; // if odd : right channel + vecfIntermProcBuf[i] += vecsData[iLpan] * fGain; } - // interleaved channels - if ( iPan < 0 ) + + if ( iRpan < 0 ) { // get from second - iPan = iPan + 2 * iServerFrameSizeSamples; - vecfIntermProcBuf[i] += vecsData2[iPan] * fGain; + iRpan = iRpan + 2 * iServerFrameSizeSamples; + vecfIntermProcBuf[i + 1] += vecsData2[iRpan] * fGain; } else { - vecfIntermProcBuf[i] += vecsData[iPan] * fGain; + vecfIntermProcBuf[i + 1] += vecsData[iRpan] * fGain; } } - else + } + } + else + { + if ( isMono ) + { + // mono: copy same mono data in both out stereo audio channels + for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { - if ( ( i & 1 ) == 0 ) - { - // if even : left channel - vecfIntermProcBuf[i] += vecsData[i] * fGainL; - } - else - { - // if odd : right channel - vecfIntermProcBuf[i] += vecsData[i] * fGainR; - } + vecfIntermProcBuf[k] += vecsData[i] * fGainL; + vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; + } + } + else + { + for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i += 2 ) + { + // left/right channel + vecfIntermProcBuf[i] += vecsData[i] * fGainL; + vecfIntermProcBuf[i + 1] += vecsData[i + 1] * fGainR; } } } @@ -1107,7 +1215,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients } int iClientFrameSizeSamples = 0; // initialize to avoid a compiler warning - OpusCustomEncoder* pCurOpusEncoder = nullptr; + OpusCustomEncoder* CurOpusEncoder = nullptr; // get current number of CELT coded bytes const int iCeltNumCodedBytes = vecChannels[iCurChanID].GetCeltNumCodedBytes(); @@ -1119,11 +1227,11 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients if ( vecNumAudioChannels[iChanCnt] == 1 ) { - pCurOpusEncoder = OpusEncoderMono[iCurChanID]; + CurOpusEncoder = OpusEncoderMono[iCurChanID]; } else { - pCurOpusEncoder = OpusEncoderStereo[iCurChanID]; + CurOpusEncoder = OpusEncoderStereo[iCurChanID]; } } else if ( vecAudioComprType[iChanCnt] == CT_OPUS64 ) @@ -1132,11 +1240,11 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients if ( vecNumAudioChannels[iChanCnt] == 1 ) { - pCurOpusEncoder = Opus64EncoderMono[iCurChanID]; + CurOpusEncoder = Opus64EncoderMono[iCurChanID]; } else { - pCurOpusEncoder = Opus64EncoderStereo[iCurChanID]; + CurOpusEncoder = Opus64EncoderStereo[iCurChanID]; } } @@ -1154,25 +1262,40 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const int iNumClients DoubleFrameSizeConvBufOut[iCurChanID].GetAll ( vecsSendData, DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt] ); } - // OPUS encoding - if ( pCurOpusEncoder != nullptr ) + if ( iCeltNumCodedBytes != static_cast ( sizeof ( int16_t ) * iClientFrameSizeSamples * vecNumAudioChannels[iChanCnt] ) ) { - //### TODO: BEGIN ###// - // find a better place than this: the setting does not change all the time so for speed - // optimization it would be better to set it only if the network frame size is changed - opus_custom_encoder_ctl ( pCurOpusEncoder, - OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iClientFrameSizeSamples ) ) ); - //### TODO: END ###// + // OPUS encoding + if ( CurOpusEncoder != nullptr ) + { + //### TODO: BEGIN ###// + // find a better place than this: the setting does not change all the time so for speed + // optimization it would be better to set it only if the network frame size is changed + opus_custom_encoder_ctl ( CurOpusEncoder, + OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iClientFrameSizeSamples ) ) ); + //### TODO: END ###// + + for ( int iB = 0; iB < vecNumFrameSizeConvBlocks[iChanCnt]; iB++ ) + { + const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt]; + iUnused = opus_custom_encode ( CurOpusEncoder, + &vecsSendData[iOffset], + iClientFrameSizeSamples, + &vecvecbyCodedData[iChanCnt][0], + iCeltNumCodedBytes ); + + // send separate mix to current clients + vecChannels[iCurChanID].PrepAndSendPacket ( &Socket, vecvecbyCodedData[iChanCnt], iCeltNumCodedBytes ); + } + } + } + else + { for ( int iB = 0; iB < vecNumFrameSizeConvBlocks[iChanCnt]; iB++ ) { const int iOffset = iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[iChanCnt]; - iUnused = opus_custom_encode ( pCurOpusEncoder, - &vecsSendData[iOffset], - iClientFrameSizeSamples, - &vecvecbyCodedData[iChanCnt][0], - iCeltNumCodedBytes ); + memcpy ( &vecvecbyCodedData[iChanCnt][0], &vecsSendData[iOffset], iCeltNumCodedBytes ); // send separate mix to current clients vecChannels[iCurChanID].PrepAndSendPacket ( &Socket, vecvecbyCodedData[iChanCnt], iCeltNumCodedBytes ); @@ -1214,12 +1337,6 @@ void CServer::CreateAndSendChanListForAllConChannels() vecChannels[i].CreateConClientListMes ( vecChanInfo ); } } - - // create status HTML file if enabled - if ( bWriteStatusHTMLFile ) - { - WriteHTMLChannelList(); - } } void CServer::CreateAndSendChanListForThisChan ( const int iCurChanID ) @@ -1244,15 +1361,33 @@ void CServer::CreateAndSendChatTextForAllConChannels ( const int iCurChanID, con const QString strActualMessageText = "(" + QTime::currentTime().toString ( "hh:mm:ss AP" ) + ") " + ChanName.toHtmlEscaped() + " " + strChatText.toHtmlEscaped(); + // Send chat text to all connected clients --------------------------------- + SendChatTextToAllConChannels ( iCurChanID, strActualMessageText ); +} + +void CServer::SendChatTextToAllConChannels ( const int iSendingChanID, const QString& strChatText ) +{ // Send chat text to all connected clients --------------------------------- for ( int i = 0; i < iMaxNumChannels; i++ ) { if ( vecChannels[i].IsConnected() ) { - // send message - vecChannels[i].CreateChatTextMes ( strActualMessageText ); + vecChannels[i].CreateChatTextMes ( strChatText ); } } + // forward the message to the RPC server + emit sentChatMessage ( iSendingChanID, strChatText ); +} + +bool CServer::SendChatTextToConChannel ( const int iCurChanID, const QString& strChatText ) +{ + if ( !MathUtils::InRange ( iCurChanID, 0, iMaxNumChannels - 1 ) || !vecChannels[iCurChanID].IsConnected() ) + { + return false; + } + // send message + vecChannels[iCurChanID].CreateChatTextMes ( strChatText ); + return true; } void CServer::CreateAndSendRecorderStateForAllConChannels() @@ -1518,54 +1653,6 @@ void CServer::SetWelcomeMessage ( const QString& strNWelcMess ) strWelcomeMessage = strWelcomeMessage.left ( MAX_LEN_CHAT_TEXT ); } -void CServer::WriteHTMLChannelList() -{ - // prepare file and stream - QFile serverFileListFile ( strServerHTMLFileListName ); - - if ( serverFileListFile.open ( QIODevice::WriteOnly | QIODevice::Text ) ) - { - QTextStream streamFileOut ( &serverFileListFile ); - - // depending on number of connected clients write list - if ( GetNumberOfConnectedClients() == 0 ) - { - // no clients are connected -> empty server - streamFileOut << " No client connected\n"; - } - else - { - streamFileOut << "

      \n"; - - // write entry for each connected client - for ( int i = 0; i < iMaxNumChannels; i++ ) - { - if ( vecChannels[i].IsConnected() ) - { - streamFileOut << "
    • " << vecChannels[i].GetName().toHtmlEscaped() << "
    • \n"; - } - } - - streamFileOut << "
    \n"; - } - } -} - -void CServer::WriteHTMLServerQuit() -{ - // prepare file and stream - QFile serverFileListFile ( strServerHTMLFileListName ); - - if ( !serverFileListFile.open ( QIODevice::WriteOnly | QIODevice::Text ) ) - { - return; - } - - QTextStream streamFileOut ( &serverFileListFile ); - streamFileOut << " Server terminated\n"; - serverFileListFile.close(); -} - void CServer::customEvent ( QEvent* pEvent ) { if ( pEvent->type() == QEvent::User + 11 ) diff --git a/src/server.h b/src/server.h index cbdbb04373..b92f3f2656 100644 --- a/src/server.h +++ b/src/server.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -90,7 +112,6 @@ class CServer : public QObject, public CServerSlots const QString& strServerBindIP, const quint16 iPortNumber, const quint16 iQosNumber, - const QString& strHTMLStatusFileName, const QString& strDirectoryAddress, const QString& strServerListFileName, const QString& strServerInfo, @@ -100,10 +121,11 @@ class CServer : public QObject, public CServerSlots const QString& strRecordingDirName, const bool bNDisconnectAllClientsOnQuit, const bool bNUseDoubleSystemFrameSize, + const bool bNDisableRaw, const bool bNUseMultithreading, const bool bDisableRecording, const bool bNDelayPan, - const bool bNEnableIPv6, + const bool bNDisableIPv6, const ELicenceType eNLicenceType ); virtual ~CServer(); @@ -124,8 +146,8 @@ class CServer : public QObject, public CServerSlots void CreateCLServerListReqVerAndOSMes ( const CHostAddress& InetAddr ) { ConnLessProtocol.CreateCLReqVersionAndOSMes ( InetAddr ); } - // IPv6 Enabled - bool IsIPv6Enabled() { return bEnableIPv6; } + // IPv6 Available + bool IsIPv6Available() { return bIPv6Available; } // GUI settings ------------------------------------------------------------ int GetClientNumAudioChannels ( const int iChanNum ) { return vecChannels[iChanNum].GetNumAudioChannels(); } @@ -169,6 +191,9 @@ class CServer : public QObject, public CServerSlots void SetEnableDelayPanning ( bool bDelayPanningOn ) { bDelayPan = bDelayPanningOn; } bool IsDelayPanningEnabled() { return bDelayPan; } + void SendChatTextToAllConChannels ( const int iSendingChanID, const QString& strChatText ); + bool SendChatTextToConChannel ( const int iCurChanID, const QString& strChatText ); + protected: // access functions for actual channels bool IsConnected ( const int iChanNum ) { return vecChannels[iChanNum].IsConnected(); } @@ -193,9 +218,6 @@ class CServer : public QObject, public CServerSlots template inline void connectChannelSignalsToServerSlots(); - void WriteHTMLChannelList(); - void WriteHTMLServerQuit(); - static void DecodeReceiveDataBlocks ( CServer* pServer, const int iStartChanCnt, const int iStopChanCnt, const int iNumClients ); static void MixEncodeTransmitDataBlocks ( CServer* pServer, const int iStartChanCnt, const int iStopChanCnt, const int iNumClients ); @@ -250,6 +272,9 @@ class CServer : public QObject, public CServerSlots CConvBuf DoubleFrameSizeConvBufIn[MAX_NUM_CHANNELS]; CConvBuf DoubleFrameSizeConvBufOut[MAX_NUM_CHANNELS]; + // needed for disabling raw audio transmission + bool bDisableRaw; + CVector vstrChatColors; CVector vecChanIDsCurConChan; @@ -269,6 +294,7 @@ class CServer : public QObject, public CServerSlots CVector vecChannelLevels; // actual working objects + bool bIPv6Available; // must be before Socket - passed by reference to Socket CHighPrioSocket Socket; // logging @@ -277,10 +303,6 @@ class CServer : public QObject, public CServerSlots // channel level update frame interval counter int iFrameCount; - // HTML file server status - bool bWriteStatusHTMLFile; - QString strServerHTMLFileListName; - CHighPrecisionTimer HighPrecisionTimer; // server list @@ -296,9 +318,6 @@ class CServer : public QObject, public CServerSlots // for delay panning bool bDelayPan; - // enable IPv6 - bool bEnableIPv6; - // messaging QString strWelcomeMessage; ELicenceType eLicenceType; @@ -312,6 +331,8 @@ class CServer : public QObject, public CServerSlots void Started(); void Stopped(); void ClientDisconnected ( const int iChID ); + void ClientConnected ( const int iChID, const QHostAddress RecHostAddr, const int iTotChans ); + void sentChatMessage ( const int iSendingChanID, const QString& strChatText ); void SvrRegStatusChanged(); void AudioFrame ( const int iChID, const QString stChName, @@ -380,6 +401,10 @@ public slots: void OnCLUnregisterServerReceived ( CHostAddress InetAddr ) { ServerListManager.Remove ( InetAddr ); } + void OnCLReqServerFeatures ( CHostAddress InetAddr ); + + void OnCLReqWelcomeMessage ( CHostAddress InetAddr ); + void OnCLDisconnection ( CHostAddress InetAddr ); void OnAboutToQuit(); diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index 330374fed7..47578e361c 100644 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -295,7 +317,7 @@ CServerDlg::CServerDlg ( CServer* pNServP, CServerSettings* pNSetP, const bool b cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_NONE ) ); cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_DEFAULT ) ); cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_ANY_GENRE2 ) ); - cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_ANY_GENRE3 ) ); + cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_ANY_GENRE_ASIA ) ); cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_GENRE_ROCK ) ); cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_GENRE_JAZZ ) ); cbxDirectoryType->addItem ( DirectoryTypeToString ( AT_GENRE_CLASSICAL_FOLK ) ); @@ -484,12 +506,12 @@ CServerDlg::CServerDlg ( CServer* pNServP, CServerSettings* pNSetP, const bool b // Don't use SRV resolution when resolving update servers. - if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK1_ADDRESS, UpdateServerHostAddress, pServer->IsIPv6Enabled() ) ) + if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK1_ADDRESS, UpdateServerHostAddress, pServer->IsIPv6Available() ) ) { pServer->CreateCLServerListReqVerAndOSMes ( UpdateServerHostAddress ); } - if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK2_ADDRESS, UpdateServerHostAddress, pServer->IsIPv6Enabled() ) ) + if ( NetworkUtil::ParseNetworkAddressBare ( UPDATECHECK2_ADDRESS, UpdateServerHostAddress, pServer->IsIPv6Available() ) ) { pServer->CreateCLServerListReqVerAndOSMes ( UpdateServerHostAddress ); } diff --git a/src/serverdlg.h b/src/serverdlg.h index 98eea508f6..80d427a4fe 100644 --- a/src/serverdlg.h +++ b/src/serverdlg.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 4dabe4c7ef..0dafa73863 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -62,10 +84,10 @@ CServerListEntry CServerListEntry::parse ( QString strHAddr, QString strCountry, QString strNumClients, bool isPermanent, - bool bEnableIPv6 ) + bool bIPv6Available ) { CHostAddress haServerHostAddr; - NetworkUtil::ParseNetworkAddress ( strHAddr, haServerHostAddr, bEnableIPv6 ); + NetworkUtil::ParseNetworkAddress ( strHAddr, haServerHostAddr, bIPv6Available ); if ( CHostAddress() == haServerHostAddr ) { // do not proceed without server host address! @@ -73,7 +95,7 @@ CServerListEntry CServerListEntry::parse ( QString strHAddr, } CHostAddress haServerLocalAddr; - NetworkUtil::ParseNetworkAddress ( strLHAddr, haServerLocalAddr, bEnableIPv6 ); + NetworkUtil::ParseNetworkAddress ( strLHAddr, haServerLocalAddr, bIPv6Available ); if ( haServerLocalAddr.iPort == 0 ) { haServerLocalAddr.iPort = haServerHostAddr.iPort; @@ -120,17 +142,17 @@ QString CServerListEntry::toCSV() } // --- CServerListManager --- -CServerListManager::CServerListManager ( const quint16 iNPortNum, +CServerListManager::CServerListManager ( CServer* pServer, + const quint16 iNPortNum, const QString& sNDirectoryAddress, const QString& strServerListFileName, const QString& strServerInfo, const QString& strServerListFilter, const QString& strServerPublicIP, const int iNumChannels, - const bool bNEnableIPv6, CProtocol* pNConLProt ) : + pServer ( pServer ), DirectoryType ( AT_NONE ), - bEnableIPv6 ( bNEnableIPv6 ), ServerListFileName ( strServerListFileName ), strDirectoryAddress ( "" ), bIsDirectory ( false ), @@ -158,7 +180,7 @@ CServerListManager::CServerListManager ( const quint16 iNPortNum, qDebug() << "Using" << qhaServerPublicIP.toString() << "as external IP."; ServerPublicIP = CHostAddress ( qhaServerPublicIP, iNPortNum ); - if ( bEnableIPv6 ) + if ( pServer->IsIPv6Available() ) { // set the server internal address, including internal port number QHostAddress qhaServerPublicIP6; @@ -586,7 +608,7 @@ void CServerListManager::Append ( const CHostAddress& InetAddr, // if the server is not listed, refuse registration and send registration response if ( !vWhiteList.contains ( InetAddr.InetAddr ) ) { - pConnLessProtocol->CreateCLRegisterServerResp ( InetAddr, SRR_NOT_FULFILL_REQIREMENTS ); + pConnLessProtocol->CreateCLRegisterServerResp ( InetAddr, SRR_NOT_FULFILL_REQUIREMENTS ); return; // leave function early, i.e., we do not register this server } } @@ -807,7 +829,7 @@ bool CServerListManager::Load() // This uses ParseNetworkAddressBare because it is just parsing ip:host that was saved to the file. // Therefore no SRV lookup is appropriate. - NetworkUtil::ParseNetworkAddressBare ( slLine[0], haServerHostAddr, bEnableIPv6 ); + NetworkUtil::ParseNetworkAddressBare ( slLine[0], haServerHostAddr, pServer->IsIPv6Available() ); int iIdx = IndexOf ( haServerHostAddr ); if ( iIdx != INVALID_INDEX ) { @@ -815,8 +837,14 @@ bool CServerListManager::Load() continue; } - serverListEntry = - CServerListEntry::parse ( slLine[0], slLine[1], slLine[2], slLine[3], slLine[4], slLine[5], slLine[6].toInt() != 0, bEnableIPv6 ); + serverListEntry = CServerListEntry::parse ( slLine[0], + slLine[1], + slLine[2], + slLine[3], + slLine[4], + slLine[5], + slLine[6].toInt() != 0, + pServer->IsIPv6Available() ); // We expect servers to have addresses... if ( ( CHostAddress() == serverListEntry.HostAddr ) ) @@ -892,7 +920,7 @@ void CServerListManager::StoreRegistrationResult ( ESvrRegResult eResult ) SetSvrRegStatus ( ESvrRegStatus::SRS_VERSION_TOO_OLD ); break; - case ESvrRegResult::SRR_NOT_FULFILL_REQIREMENTS: + case ESvrRegResult::SRR_NOT_FULFILL_REQUIREMENTS: SetSvrRegStatus ( ESvrRegStatus::SRS_NOT_FULFILL_REQUIREMENTS ); break; @@ -1028,7 +1056,7 @@ void CServerListManager::SetSvrRegStatus ( ESvrRegStatus eNSvrRegStatus ) return; } - // output regirstation result/update on the console + // output registration result/update on the console qInfo() << qUtf8Printable ( QString ( "Server Registration Status update: %1" ).arg ( svrRegStatusToString ( eNSvrRegStatus ) ) ); // store the state and inform the GUI about the new status diff --git a/src/serverlist.h b/src/serverlist.h index cdf1d0f7e6..f18c40678d 100644 --- a/src/serverlist.h +++ b/src/serverlist.h @@ -5,6 +5,14 @@ * Volker Fischer * pljones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * Originally, if you wanted to run a server, you had to open the firewall of your computer at the correct ports and introduce a port forwarding at your router @@ -45,19 +53,33 @@ Note: this mechanism will not work in a private network. ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -75,6 +97,9 @@ Note: this mechanism will not work in a private network. #include "util.h" #include "protocol.h" +// Forward declaration - see end of this file for the actual #include +class CServer; + /* Classes ********************************************************************/ class CServerListEntry : public CServerInfo { @@ -133,14 +158,14 @@ class CServerListManager : public QObject Q_OBJECT public: - CServerListManager ( const quint16 iNPortNum, + CServerListManager ( CServer* pServer, + const quint16 iNPortNum, const QString& sNDirectoryAddress, const QString& strServerListFileName, const QString& strServerInfo, const QString& strServerListFilter, const QString& strServerPublicIP, const int iNumChannels, - const bool bNEnableIPv6, CProtocol* pNConLProt ); void SetServerName ( const QString& strNewName ); @@ -188,11 +213,11 @@ class CServerListManager : public QObject QMutex Mutex; + CServer* pServer; + CHostAddress DirectoryAddress; EDirectoryType DirectoryType; - bool bEnableIPv6; - CHostAddress ServerPublicIP; CHostAddress ServerPublicIP6; @@ -234,3 +259,5 @@ public slots: signals: void SvrRegStatusChanged(); }; + +#include "server.h" diff --git a/src/serverlogging.cpp b/src/serverlogging.cpp index db1d3630c2..ccd981d5aa 100644 --- a/src/serverlogging.cpp +++ b/src/serverlogging.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/serverlogging.h b/src/serverlogging.h index 992c0e3b25..9923fa08d4 100644 --- a/src/serverlogging.h +++ b/src/serverlogging.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -44,6 +66,7 @@ class CServerLogging void AddServerStopped(); void AddNewConnection ( const QHostAddress& ClientInetAddr, const int iNumberOfConnectedClients ); + bool IsLogging() { return bDoLogging; } protected: void operator<< ( const QString& sNewStr ); diff --git a/src/serverrpc.cpp b/src/serverrpc.cpp index 90af0a4d8b..05bb54be62 100644 --- a/src/serverrpc.cpp +++ b/src/serverrpc.cpp @@ -5,26 +5,51 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #include "serverrpc.h" +/* Definitions ****************************************************************/ +#define INVALID_CLIENT_ID -1 + CServerRpc::CServerRpc ( CServer* pServer, CRpcServer* pRpcServer, QObject* parent ) : QObject ( parent ) { // API doc already part of CClientRpc @@ -34,6 +59,84 @@ CServerRpc::CServerRpc ( CServer* pServer, CRpcServer* pRpcServer, QObject* pare Q_UNUSED ( params ); } ); + /// @rpc_notification jamulusserver/clientConnected + /// @brief Emitted when a client has connected to the server. + /// @param {number} params.id - The channel ID assigned to the client. + /// @param {string} params.address - The client's address. + /// @param {number} params.totalChannels - Number of total channels connected to the server. + connect ( pServer, &CServer::ClientConnected, [=] ( const int iChanID, const QHostAddress RecHostAddr, const int iTotChans ) { + pRpcServer->BroadcastNotification ( "jamulusserver/clientConnected", + QJsonObject{ + { "id", iChanID }, + { "address", RecHostAddr.toString() }, + { "totalChannels", iTotChans }, + } ); + } ); + + /// @rpc_notification jamulusserver/clientDisconnected + /// @brief Emitted when a client has disconnected from the server. + /// @param {number} params.id - The channel ID assigned to the client. + connect ( pServer, &CServer::ClientDisconnected, this, [=] ( const int iChanID ) { + pRpcServer->BroadcastNotification ( "jamulusserver/clientDisconnected", + QJsonObject{ + { "id", iChanID }, + } ); + } ); + + /// @rpc_notification jamulusserver/chatMessageReceived + /// @brief Emitted when a chat message is received from either a Jamulus or RPC client and to be broadcast to all connected clients. + /// @param {number} params.id - Channel ID of sending client or -1 for RPC sent messages. + /// @param {string} params.chatMessage - Chat message text. + connect ( pServer, &CServer::sentChatMessage, [=] ( const int iSendingChanID, const QString& strChatText ) { + pRpcServer->BroadcastNotification ( "jamulusserver/chatMessageReceived", + QJsonObject{ + { "id", iSendingChanID }, + { "chatMessage", strChatText }, + } ); + } ); + + /// @rpc_method jamulusserver/broadcastChatMessage + /// @brief Sends a message (as the server) to all connected clients. This can be used to broadcast messages from external sources (e.g. scripts or + /// monitoring tools). + /// @param {string} params.chatMessage - The chat message text. + /// @result {string} result - Always "ok". + pRpcServer->HandleMethod ( "jamulusserver/broadcastChatMessage", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto jsonChatMessage = params["chatMessage"]; + if ( !jsonChatMessage.isString() ) + { + response["error"] = CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: chatMessage is not a string" ); + return; + } + + // set invalid channel ID to make clear this message was not sent by a Jamulus client + pServer->SendChatTextToAllConChannels ( INVALID_CLIENT_ID, jsonChatMessage.toString() ); + response["result"] = "ok"; + } ); + + /// @rpc_method jamulusserver/privateChatMessage + /// @brief Sends a chat message to a single connected client. + /// @param {string} params.chatMessage - The chat message text. + /// @param {number} params.id - The client's channel id. + /// @result {string} result - "ok" or "error" if bad arguments. + pRpcServer->HandleMethod ( "jamulusserver/privateChatMessage", [=] ( const QJsonObject& params, QJsonObject& response ) { + auto jsonChatMessage = params["chatMessage"]; + const int id = params["id"].toInt ( INVALID_CLIENT_ID ); + const QString chatMessage = jsonChatMessage.toString(); + if ( chatMessage.isEmpty() || chatMessage.size() > MAX_LEN_CHAT_TEXT ) + { + response["error"] = + CRpcServer::CreateJsonRpcError ( CRpcServer::iErrInvalidParams, "Invalid params: chatMessage is not a string or malformed" ); + return; + } + + if ( !pServer->SendChatTextToConChannel ( id, chatMessage ) ) + { + response["error"] = "invalid channel ID"; + return; + } + response["result"] = "ok"; + } ); + /// @rpc_method jamulusserver/getRecorderStatus /// @brief Returns the recorder state. /// @param {object} params - No parameters (empty object). @@ -281,7 +384,7 @@ const std::unordered_map { EDirectoryType::AT_NONE, "none" }, { EDirectoryType::AT_DEFAULT, "any_genre_1" }, { EDirectoryType::AT_ANY_GENRE2, "any_genre_2" }, - { EDirectoryType::AT_ANY_GENRE3, "any_genre_3" }, + { EDirectoryType::AT_ANY_GENRE_ASIA, "any_genre_asia" }, { EDirectoryType::AT_GENRE_ROCK, "genre_rock" }, { EDirectoryType::AT_GENRE_JAZZ, "genre_jazz" }, { EDirectoryType::AT_GENRE_CLASSICAL_FOLK, "genre_classical_folk" }, @@ -302,7 +405,7 @@ const std::unordered_map CServerRpc::sumStringToDir { "none", EDirectoryType::AT_NONE }, { "any_genre_1", EDirectoryType::AT_DEFAULT }, { "any_genre_2", EDirectoryType::AT_ANY_GENRE2 }, - { "any_genre_3", EDirectoryType::AT_ANY_GENRE3 }, + { "any_genre_asia", EDirectoryType::AT_ANY_GENRE_ASIA }, { "genre_rock", EDirectoryType::AT_GENRE_ROCK }, { "genre_jazz", EDirectoryType::AT_GENRE_JAZZ }, { "genre_classical_folk", EDirectoryType::AT_GENRE_CLASSICAL_FOLK }, diff --git a/src/serverrpc.h b/src/serverrpc.h index ef195a0350..4de40d1b7d 100644 --- a/src/serverrpc.h +++ b/src/serverrpc.h @@ -5,21 +5,43 @@ * dtinth * Christian Hoffmann * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/settings.cpp b/src/settings.cpp index af594c8bbe..bdc453913e 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -605,7 +627,7 @@ void CClientSettings::ReadSettingsFromXML ( const QDomDocument& IniXMLDocument, } // audio quality - if ( GetNumericIniSet ( IniXMLDocument, "client", "audioquality", 0, 2 /* AQ_HIGH */, iValue ) ) + if ( GetNumericIniSet ( IniXMLDocument, "client", "audioquality", 0, 3 /* AQ_RAW */, iValue ) ) { pClient->SetAudioQuality ( static_cast ( iValue ) ); } diff --git a/src/settings.h b/src/settings.h index a863c70b0a..4086a217fa 100644 --- a/src/settings.h +++ b/src/settings.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/signalhandler.cpp b/src/signalhandler.cpp index 2f9d6d1364..27f0b9eb6a 100644 --- a/src/signalhandler.cpp +++ b/src/signalhandler.cpp @@ -4,21 +4,43 @@ * Author(s): * Peter L Jones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * ****************************************************************************** * diff --git a/src/signalhandler.h b/src/signalhandler.h index 1d260427ae..238739e38a 100644 --- a/src/signalhandler.h +++ b/src/signalhandler.h @@ -4,21 +4,43 @@ * Author(s): * Peter L Jones * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * ****************************************************************************** * diff --git a/src/socket.cpp b/src/socket.cpp index f67f37c578..09c851d886 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -40,13 +62,18 @@ // we have different connections for client and server, created after Init in corresponding constructor -CSocket::CSocket ( CChannel* pNewChannel, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ) : +CSocket::CSocket ( CChannel* pNewChannel, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ) : pChannel ( pNewChannel ), bIsClient ( true ), bJitterBufferOK ( true ), - bEnableIPv6 ( bEnableIPv6 ) + bIPv6Available ( bIPv6Available ) { - Init ( iPortNumber, iQosNumber, strServerBindIP ); + Init ( iPortNumber, iQosNumber, strServerBindIP, bDisableIPv6 ); // client connections: QObject::connect ( this, &CSocket::ProtocolMessageReceived, pChannel, &CChannel::OnProtocolMessageReceived ); @@ -56,13 +83,18 @@ CSocket::CSocket ( CChannel* pNewChannel, const quint16 iPortNumber, const quint QObject::connect ( this, static_cast ( &CSocket::NewConnection ), pChannel, &CChannel::OnNewConnection ); } -CSocket::CSocket ( CServer* pNServP, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ) : +CSocket::CSocket ( CServer* pNServP, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ) : pServer ( pNServP ), bIsClient ( false ), bJitterBufferOK ( true ), - bEnableIPv6 ( bEnableIPv6 ) + bIPv6Available ( bIPv6Available ) { - Init ( iPortNumber, iQosNumber, strServerBindIP ); + Init ( iPortNumber, iQosNumber, strServerBindIP, bDisableIPv6 ); // server connections: QObject::connect ( this, &CSocket::ProtocolMessageReceived, pServer, &CServer::OnProtocolMessageReceived ); @@ -77,7 +109,7 @@ CSocket::CSocket ( CServer* pNServP, const quint16 iPortNumber, const quint16 iQ QObject::connect ( this, &CSocket::ServerFull, pServer, &CServer::OnServerFull ); } -void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, const QString& strNewServerBindIP ) +void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, const QString& strNewServerBindIP, const bool bDisableIPv6 ) { uSockAddr UdpSocketAddr; @@ -102,57 +134,59 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, memset ( &UdpSocketAddr, 0, sizeof ( UdpSocketAddr ) ); - if ( bEnableIPv6 ) + if ( !bDisableIPv6 ) { // try to create a IPv6 UDP socket UdpSocket = socket ( AF_INET6, SOCK_DGRAM, 0 ); - if ( UdpSocket == -1 ) + if ( UdpSocket != -1 ) { - // IPv6 requested but not available, throw error - throw CGenErr ( "IPv6 requested but not available on this system.", "Network Error" ); - } - // The IPV6_V6ONLY socket option must be false in order for the socket to listen on both protocols. - // On Linux it's false by default on most (all?) distros, but on Windows it is true by default - const int no = 0; - if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ) == -1 ) - { - throw CGenErr ( "request to support IPv4 over IPv6 failed", "Network Error" ); - } + // The IPV6_V6ONLY socket option must be false in order for the socket to listen on both protocols. + // On Linux it's false by default on most (all?) distros, but on Windows it is true by default + const int no = 0; + if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &no, sizeof ( no ) ) == -1 ) + { + throw CGenErr ( "request to support IPv4 over IPv6 failed", "Network Error" ); + } - // set the QoS - const int tos = (int) iQosNumber; // Quality of Service + // set the QoS + const int tos = (int) iQosNumber; // Quality of Service #if !defined( Q_OS_WIN ) - if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ) == -1 ) - { - throw CGenErr ( "request to set ToS for IPv6 failed", "Network Error" ); - } + if ( setsockopt ( UdpSocket, IPPROTO_IPV6, IPV6_TCLASS, (const char*) &tos, sizeof ( tos ) ) == -1 ) + { + throw CGenErr ( "request to set ToS for IPv6 failed", "Network Error" ); + } #endif -#if !defined( Q_OS_DARWIN ) && !defined( Q_OS_WIN ) - // set the QoS for IPv4 as well, as this is a dual-protocol socket - if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, (const char*) &tos, sizeof ( tos ) ) == -1 ) - { - throw CGenErr ( "request to set ToS for IPv4 over IPv6 failed", "Network Error" ); - } +#if !defined( Q_OS_BSD4 ) && !defined( Q_OS_WIN ) + // set the QoS for IPv4 as well, as this is a dual-stack socket + if ( setsockopt ( UdpSocket, IPPROTO_IP, IP_TOS, (const char*) &tos, sizeof ( tos ) ) == -1 ) + { + throw CGenErr ( "request to set ToS for IPv4 over IPv6 failed", "Network Error" ); + } #endif - UdpSocketAddr.sa6.sin6_family = AF_INET6; - UdpSocketAddr.sa6.sin6_addr = in6addr_any; - UdpSocketAddrLen = sizeof ( UdpSocketAddr.sa6 ); + UdpSocketAddr.sa6.sin6_family = AF_INET6; + UdpSocketAddr.sa6.sin6_addr = in6addr_any; + UdpSocketAddrLen = sizeof ( UdpSocketAddr.sa6 ); + + UdpPort = &UdpSocketAddr.sa6.sin6_port; // where to put the port number + + // FIXME: If binding a dual-stack interface to a specific address, does it cease to be dual-stack? - UdpPort = &UdpSocketAddr.sa6.sin6_port; // where to put the port number + // It is not possible to bind a dual-stack socket to a specific address + if ( !strServerBindIP.isEmpty() ) + { + qWarning() << "Option --serverbindip ignored: cannot be used on a dual-stack IPv6/IPv4 socket. Please add --noipv6 to use IPv4 only."; + } - // FIXME: If binding a dual-protocol interface to a specific address, does it cease to be dual-protocol? + bIPv6Available = true; // this is a reference to CClient::bIPv6Available or CServer::bIPv6Available - // TODO - ALLOW IPV6 ADDRESS - // if ( !strServerBindIP.isEmpty() ) - //{ - // UdpSocketInAddr.sin_addr.s_addr = htonl ( QHostAddress ( strServerBindIP ).toIPv4Address() ); - //} - // END TODO - ALLOW IPV6 ADDRESS + qInfo() << "IPv6/IPv4 dual-stack socket created"; + } } - else + + if ( !bIPv6Available ) { // create the UDP socket for IPv4 UdpSocket = socket ( AF_INET, SOCK_DGRAM, 0 ); @@ -182,6 +216,8 @@ void CSocket::Init ( const quint16 iNewPortNumber, const quint16 iNewQosNumber, { UdpSocketAddr.sa4.sin_addr.s_addr = htonl ( QHostAddress ( strServerBindIP ).toIPv4Address() ); } + + qInfo() << "IPv4 socket created"; } #ifdef Q_OS_IOS @@ -272,17 +308,23 @@ CSocket::~CSocket() #endif } -#if defined( Q_OS_DARWIN ) -// sendto_ipv4_with_tos - helper function for macOS to set TOS when sending IPv4 over IPv6 socket +#if defined( Q_OS_BSD4 ) +// sendto_ipv4_with_tos - helper function for macOS and FreeBSD to set TOS when sending IPv4 over IPv6 socket static ssize_t sendto_ipv4_with_tos ( int fd, const void* buf, size_t len, int flags, const struct sockaddr* dest, socklen_t destlen, int tos ) { // For a description of 'struct cmsghdr' and the 'CMSG_xxx' macros, see 'man 3 cmsg' on a Linux machine. // The macOS man pages are less descriptive, but the API is the same, being based on the BSD socket interface. +# if defined( Q_OS_FREEBSD ) + using tos_cmsg_type = unsigned char; +# else + using tos_cmsg_type = int; +# endif + // The cmsg buffer is only set up once (tos doesn't change) so can be static static union { - unsigned char cbuf[CMSG_SPACE ( sizeof ( int ) )]; + unsigned char cbuf[CMSG_SPACE ( sizeof ( tos_cmsg_type ) )]; struct cmsghdr h; } u; static socklen_t clen = 0; @@ -290,26 +332,30 @@ static ssize_t sendto_ipv4_with_tos ( int fd, const void* buf, size_t len, int f if ( clen == 0 ) { // set up the cmsg buffer - memset ( u.cbuf, 0, sizeof ( u.cbuf ) ); + memset ( &u, 0, sizeof ( u ) ); u.h.cmsg_level = IPPROTO_IP; u.h.cmsg_type = IP_TOS; - u.h.cmsg_len = CMSG_LEN ( sizeof ( int ) ); - memcpy ( CMSG_DATA ( &u.h ), &tos, sizeof ( int ) ); - clen = (socklen_t) u.h.cmsg_len; + u.h.cmsg_len = CMSG_LEN ( sizeof ( tos_cmsg_type ) ); + + tos_cmsg_type tosvalue = static_cast ( tos & 0xFF ); + memcpy ( CMSG_DATA ( &u.h ), &tosvalue, sizeof ( tosvalue ) ); + clen = CMSG_SPACE ( sizeof ( tos_cmsg_type ) ); } struct iovec iov; + memset ( &iov, 0, sizeof ( iov ) ); iov.iov_base = const_cast ( buf ); iov.iov_len = len; struct msghdr msg; + memset ( &msg, 0, sizeof ( msg ) ); msg.msg_name = const_cast ( dest ); msg.msg_namelen = destlen; msg.msg_iov = &iov; msg.msg_iovlen = 1; - msg.msg_control = (void*) u.cbuf; + msg.msg_control = u.cbuf; msg.msg_controllen = clen; return sendmsg ( fd, &msg, flags ); @@ -339,7 +385,7 @@ void CSocket::SendPacket ( const CVector& vecbySendBuf, const CHostAddr { if ( HostAddr.InetAddr.protocol() == QAbstractSocket::IPv4Protocol ) { - if ( bEnableIPv6 ) + if ( bIPv6Available ) { // Linux and Mac allow to pass an AF_INET address to a dual-stack socket, // but Windows does not. So use a V4MAPPED address in an AF_INET6 sockaddr, @@ -355,8 +401,8 @@ void CSocket::SendPacket ( const CVector& vecbySendBuf, const CHostAddr addr[2] = htonl ( 0xFFFF ); addr[3] = htonl ( HostAddr.InetAddr.toIPv4Address() ); -#if defined( Q_OS_DARWIN ) - // In macOS we need to set TOS explicitly when sending IPv4 over IPv6 socket +#if defined( Q_OS_BSD4 ) + // In macOS and FreeBSD we need to set TOS explicitly when sending IPv4 over IPv6 socket status = sendto_ipv4_with_tos ( UdpSocket, (const char*) &( (CVector) vecbySendBuf )[0], iVecSizeOut, @@ -387,7 +433,7 @@ void CSocket::SendPacket ( const CVector& vecbySendBuf, const CHostAddr sizeof ( UdpSocketAddr.sa4 ) ); } } - else if ( bEnableIPv6 ) + else if ( bIPv6Available ) { UdpSocketAddr.sa6.sin6_family = AF_INET6; UdpSocketAddr.sa6.sin6_port = htons ( HostAddr.iPort ); @@ -408,7 +454,7 @@ void CSocket::SendPacket ( const CVector& vecbySendBuf, const CHostAddr #ifdef Q_OS_IOS // qDebug("Socket send exception - mostly happens in iOS when returning from idle"); - Init ( iPortNumber, iQosNumber, strServerBindIP ); // reinit + Init ( iPortNumber, iQosNumber, strServerBindIP, !bIPv6Available ); // reinit // loop back to retry #endif diff --git a/src/socket.h b/src/socket.h index 77fdf24452..b81ea4d69d 100644 --- a/src/socket.h +++ b/src/socket.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -53,8 +75,19 @@ class CSocket : public QObject Q_OBJECT public: - CSocket ( CChannel* pNewChannel, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ); - CSocket ( CServer* pNServP, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ); + CSocket ( CChannel* pNewChannel, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ); + + CSocket ( CServer* pNServP, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ); virtual ~CSocket(); @@ -64,7 +97,7 @@ class CSocket : public QObject void Close(); protected: - void Init ( const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP ); + void Init ( const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, const bool bDisableIPv6 ); quint16 iPortNumber; quint16 iQosNumber; QString strServerBindIP; @@ -86,7 +119,9 @@ class CSocket : public QObject bool bJitterBufferOK; - bool bEnableIPv6; + // This is a reference to CClient::bIPv6Available or CServer::bIPv6Available, + // to inform the Client or Server which type of socket was created at startup. + bool& bIPv6Available; public: void OnDataReceived(); @@ -116,20 +151,24 @@ class CHighPrioSocket : public QObject Q_OBJECT public: - CHighPrioSocket ( CChannel* pNewChannel, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ) : - Socket ( pNewChannel, iPortNumber, iQosNumber, strServerBindIP, bEnableIPv6 ) - { - Init(); - } - - CHighPrioSocket ( CChannel* pNewChannel, const quint16 iPortNumber, const quint16 iQosNumber, bool bEnableIPv6 ) : - Socket ( pNewChannel, iPortNumber, iQosNumber, "", bEnableIPv6 ) + CHighPrioSocket ( CChannel* pNewChannel, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ) : + Socket ( pNewChannel, iPortNumber, iQosNumber, strServerBindIP, bDisableIPv6, bIPv6Available ) { Init(); } - CHighPrioSocket ( CServer* pNewServer, const quint16 iPortNumber, const quint16 iQosNumber, const QString& strServerBindIP, bool bEnableIPv6 ) : - Socket ( pNewServer, iPortNumber, iQosNumber, strServerBindIP, bEnableIPv6 ) + CHighPrioSocket ( CServer* pNewServer, + const quint16 iPortNumber, + const quint16 iQosNumber, + const QString& strServerBindIP, + const bool bDisableIPv6, + bool& bIPv6Available ) : + Socket ( pNewServer, iPortNumber, iQosNumber, strServerBindIP, bDisableIPv6, bIPv6Available ) { Init(); } diff --git a/src/sound/README.md b/src/sound/README.md index 9f5fe59577..8143aea1ab 100644 --- a/src/sound/README.md +++ b/src/sound/README.md @@ -1,7 +1,51 @@ +### Copyright (c) 2022-2026 + +Author(s): +* ann0see +* The Jamulus Development Team + +As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +under AGPL 3.0 or any later version. + +Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +This code will be licensed under GPL 3.0 (or any later version) from +3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +the combined work, including network use provisions. + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + +--- + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see [](https://www.gnu.org/licenses/). + # Sound APIs and Sound API related files This folder contains the related files for all sound APIs. ## Documentation of sound design -**Fixme:** The sound design is not yet documented. +**Fixme:** The sound design is not yet documented. diff --git a/src/sound/asio/sound.cpp b/src/sound/asio/sound.cpp index 4deb92b8ed..cb99becdb0 100644 --- a/src/sound/asio/sound.cpp +++ b/src/sound/asio/sound.cpp @@ -4,24 +4,46 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Description: * Sound card interface for Windows operating systems * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/asio/sound.h b/src/sound/asio/sound.h index 19ce0d10cb..8ab83796de 100644 --- a/src/sound/asio/sound.h +++ b/src/sound/asio/sound.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/coreaudio-ios/sound.h b/src/sound/coreaudio-ios/sound.h index 475f759c7d..5455cb2a8f 100644 --- a/src/sound/coreaudio-ios/sound.h +++ b/src/sound/coreaudio-ios/sound.h @@ -4,21 +4,43 @@ * Author(s): * ann0see and ngocdh based on code from Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/coreaudio-ios/sound.mm b/src/sound/coreaudio-ios/sound.mm index 33f47ee630..69a9f39a0f 100644 --- a/src/sound/coreaudio-ios/sound.mm +++ b/src/sound/coreaudio-ios/sound.mm @@ -4,21 +4,43 @@ * Author(s): * ann0see and ngocdh based on code from Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #include "sound.h" diff --git a/src/sound/coreaudio-mac/sound.cpp b/src/sound/coreaudio-mac/sound.cpp index e1f1e921a2..589a77e1be 100644 --- a/src/sound/coreaudio-mac/sound.cpp +++ b/src/sound/coreaudio-mac/sound.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/coreaudio-mac/sound.h b/src/sound/coreaudio-mac/sound.h index 6ed3990a19..9ee2796578 100644 --- a/src/sound/coreaudio-mac/sound.h +++ b/src/sound/coreaudio-mac/sound.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -42,28 +64,28 @@ class CSound : public CSoundBase virtual ~CSound(); - virtual int Init ( const int iNewPrefMonoBufferSize ); - virtual void Start(); - virtual void Stop(); + virtual int Init ( const int iNewPrefMonoBufferSize ) override; + virtual void Start() override; + virtual void Stop() override; // channel selection - virtual int GetNumInputChannels() { return iNumInChanPlusAddChan; } - virtual QString GetInputChannelName ( const int iDiD ) { return sChannelNamesInput[iDiD]; } - virtual void SetLeftInputChannel ( const int iNewChan ); - virtual void SetRightInputChannel ( const int iNewChan ); - virtual int GetLeftInputChannel() { return iSelInputLeftChannel; } - virtual int GetRightInputChannel() { return iSelInputRightChannel; } - - virtual int GetNumOutputChannels() { return iNumOutChan; } - virtual QString GetOutputChannelName ( const int iDiD ) { return sChannelNamesOutput[iDiD]; } - virtual void SetLeftOutputChannel ( const int iNewChan ); - virtual void SetRightOutputChannel ( const int iNewChan ); - virtual int GetLeftOutputChannel() { return iSelOutputLeftChannel; } - virtual int GetRightOutputChannel() { return iSelOutputRightChannel; } + virtual int GetNumInputChannels() override { return iNumInChanPlusAddChan; } + virtual QString GetInputChannelName ( const int iDiD ) override { return sChannelNamesInput[iDiD]; } + virtual void SetLeftInputChannel ( const int iNewChan ) override; + virtual void SetRightInputChannel ( const int iNewChan ) override; + virtual int GetLeftInputChannel() override { return iSelInputLeftChannel; } + virtual int GetRightInputChannel() override { return iSelInputRightChannel; } + + virtual int GetNumOutputChannels() override { return iNumOutChan; } + virtual QString GetOutputChannelName ( const int iDiD ) override { return sChannelNamesOutput[iDiD]; } + virtual void SetLeftOutputChannel ( const int iNewChan ) override; + virtual void SetRightOutputChannel ( const int iNewChan ) override; + virtual int GetLeftOutputChannel() override { return iSelOutputLeftChannel; } + virtual int GetRightOutputChannel() override { return iSelOutputRightChannel; } // MIDI functions - virtual void EnableMIDI ( const bool bEnable ); - virtual bool IsMIDIEnabled() const; + virtual void EnableMIDI ( const bool bEnable ) override; + virtual bool IsMIDIEnabled() const override; virtual QStringList GetMIDIDevNames() override; // these variables/functions should be protected but cannot since we want @@ -97,7 +119,7 @@ class CSound : public CSoundBase CVector vecNumOutBufChan; protected: - virtual QString LoadAndInitializeDriver ( QString strDriverName, bool ); + virtual QString LoadAndInitializeDriver ( QString strDriverName, bool ) override; QString CheckDeviceCapabilities ( const int iDriverIdx ); void UpdateChSelection(); diff --git a/src/sound/jack/sound.cpp b/src/sound/jack/sound.cpp index f9b6cc9b7d..a72a9c9059 100644 --- a/src/sound/jack/sound.cpp +++ b/src/sound/jack/sound.cpp @@ -4,23 +4,45 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * This code is based on the simple_client example of the Jack audio interface. * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -326,10 +348,10 @@ int CSound::Init ( const int /* iNewPrefMonoBufferSize */ ) CSoundBase::Init ( iJACKBufferSizeMono ); // set internal buffer size value and calculate stereo buffer size - iJACKBufferSizeStero = 2 * iJACKBufferSizeMono; + iJACKBufferSizeStereo = 2 * iJACKBufferSizeMono; // create memory for intermediate audio buffer - vecsTmpAudioSndCrdStereo.Init ( iJACKBufferSizeStero ); + vecsTmpAudioSndCrdStereo.Init ( iJACKBufferSizeStereo ); return iJACKBufferSizeMono; } diff --git a/src/sound/jack/sound.h b/src/sound/jack/sound.h index 3c44d38f46..024f2b48ef 100644 --- a/src/sound/jack/sound.h +++ b/src/sound/jack/sound.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -94,7 +116,7 @@ class CSound : public CSoundBase // to access them from the callback function CVector vecsTmpAudioSndCrdStereo; int iJACKBufferSizeMono; - int iJACKBufferSizeStero; + int iJACKBufferSizeStereo; bool bJackWasShutDown; jack_port_t* input_port_left; diff --git a/src/sound/midi-win/midi.cpp b/src/sound/midi-win/midi.cpp index 1501e21ade..204b245a6a 100644 --- a/src/sound/midi-win/midi.cpp +++ b/src/sound/midi-win/midi.cpp @@ -4,24 +4,46 @@ * Author(s): * Tony Mountifield * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * * Description: * MIDI interface for Windows operating systems * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/midi-win/midi.h b/src/sound/midi-win/midi.h index 08154e0ab0..5d3656ff84 100644 --- a/src/sound/midi-win/midi.h +++ b/src/sound/midi-win/midi.h @@ -4,21 +4,43 @@ * Author(s): * Tony Mountifield * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/oboe/sound.cpp b/src/sound/oboe/sound.cpp index c9e127077f..5f66c5235a 100644 --- a/src/sound/oboe/sound.cpp +++ b/src/sound/oboe/sound.cpp @@ -4,21 +4,43 @@ * Author(s): * Simon Tomlinson, Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/oboe/sound.h b/src/sound/oboe/sound.h index 2c78fab08f..d20ecc50c5 100644 --- a/src/sound/oboe/sound.h +++ b/src/sound/oboe/sound.h @@ -4,21 +4,43 @@ * Author(s): * Simon Tomlinson, Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/sound/soundbase.cpp b/src/sound/soundbase.cpp index 12043b510e..0581e6f80a 100644 --- a/src/sound/soundbase.cpp +++ b/src/sound/soundbase.cpp @@ -4,38 +4,48 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ #include "soundbase.h" -// This is used as a lookup table for parsing option letters, mapping -// a single character to an EMidiCtlType -char const sMidiCtlChar[] = { - // Has to follow order of EMidiCtlType - /* [EMidiCtlType::Fader] = */ 'f', - /* [EMidiCtlType::Pan] = */ 'p', - /* [EMidiCtlType::Solo] = */ 's', - /* [EMidiCtlType::Mute] = */ 'm', - /* [EMidiCtlType::MuteMyself] = */ 'o', - /* [EMidiCtlType::Device] = */ 'd', - /* [EMidiCtlType::None] = */ '\0' }; - /* Implementation *************************************************************/ CSoundBase::CSoundBase ( const QString& strNewSystemDriverTechniqueName, void ( *fpNewProcessCallback ) ( CVector& psData, void* pParg ), diff --git a/src/sound/soundbase.h b/src/sound/soundbase.h index b0d7f877cb..ddf68e3275 100644 --- a/src/sound/soundbase.h +++ b/src/sound/soundbase.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/testbench.h b/src/testbench.h index 3e5568ff9e..233acd6351 100644 --- a/src/testbench.h +++ b/src/testbench.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ diff --git a/src/threadpool.h b/src/threadpool.h index 51e5d6e134..dce0fed4b5 100644 --- a/src/threadpool.h +++ b/src/threadpool.h @@ -4,21 +4,43 @@ * Author(s): * Stefan Menzel * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -35,13 +57,23 @@ #include #include +// compatibility with C++17 deprecation of result_of +#if __cplusplus >= 201703L +// std::invoke_result_t should be used from C++17 onwards, but is not available in C++14 and earlier +template +using threadpool_result_t = std::invoke_result_t; +#else +// std::result_of should be used on C++14 and earlier, but is deprecated in C++17 +template +using threadpool_result_t = typename std::result_of::type; +#endif + class CThreadPool { public: - CThreadPool() = default; CThreadPool ( size_t ); template - auto enqueue ( F&& f, Args&&... args ) -> std::future::type>; + auto enqueue ( F&& f, Args&&... args ) -> std::future>; ~CThreadPool(); private: @@ -87,9 +119,9 @@ inline CThreadPool::CThreadPool ( size_t threads ) : stop ( false ) // add new work item to the pool template -auto CThreadPool::enqueue ( F&& f, Args&&... args ) -> std::future::type> +auto CThreadPool::enqueue ( F&& f, Args&&... args ) -> std::future> { - using return_type = typename std::result_of::type; + using return_type = threadpool_result_t; auto task = std::make_shared> ( std::bind ( std::forward ( f ), std::forward ( args )... ) ); diff --git a/src/translation/translation_de_DE.ts b/src/translation/translation_de_DE.ts index 167abc5678..78fda8df52 100644 --- a/src/translation/translation_de_DE.ts +++ b/src/translation/translation_de_DE.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt plattformübergreifendes Framework - + (build) (build) - + (runtime) (Laufzeit) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Halleffekt von Perry R. Cook und Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Diese Software ermöglicht Musikern über das Internet in Echtzeit zu jammen. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Es gibt einen Server, der die Audiodaten von allen Musikern sammelt, zusammen mischt und wieder an alle verbundenen Musiker zurück schickt. - + This app uses the following libraries, resources or code snippets: Diese Applikation verwendet die folgenden Bibliotheken, Ressourcen oder Codeschnipsel: - + Flag icons by Mark James Die Bilder der Länderflaggen sind von Mark James - + Some pixmaps are from the %1 Einige Pixmaps sind aus der %1 - + Some sound samples are from %1 Manche Töne sind von %1 - + For details on the contributions check out the %1 Details über Codebeiträge findet man in der %1 - + Github Contributors list Github Liste der Mitwirkenden - + Spanish Spanisch - + French Französisch - + Portuguese Portugiesisch - + Dutch Holländisch - + Italian Italienisch - + German Deutsch - + Polish Polnisch - + Swedish Schwedisch - + Korean Koreanisch - + Slovak Slowakisch - + Simplified Chinese Vereinfachtes Chinesisch - + Norwegian Bokmål Norwegisch (Bokmål) - + Japanese Japanese - + About %1 Über %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Analyzer Konsole - + Error Rate of Each Buffer Size Fehlerrate für jede Puffergröße @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Eigener Mix am Server - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Wenn man mit einem Server verbunden ist, dann kann man hier den eigenen Mix verstellen ohne dass man etwas daran verändert, was die anderen von mir hören. Der Titel zeigt den Servernamen an und falls bekannt den Aufnahmestatus des Servers. - + Server Server - + T R Y I N G T O C O N N E C T V E R B I N D U N G S A U F B A U - + RECORDING ACTIVE AUFNAHME AKTIV - + Personal Mix at: %1 Eigener Mix am Server: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level Kanalpegel - + Input level of the current audio channel at the server Eingangspegel des aktuellen Musikers am Server - + Mixer Fader Kanalregler - + Local mix level setting of the current audio channel at the server Lokale Mixerpegeleinstellung des aktuellen Kanals am Server - + Status Indicator Statusanzeige - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Zeigt den Status über den Musiker, der dem Kanal zugewiesen ist. Unterstützte Indikatoren sind: - + Status indicator label Label Statusanzeige - + Panning Pan - + Local panning position of the current audio channel at the server Lokale Pan-Position von dem aktuellen Audiokanal am Server - + With the Mute checkbox, the audio channel can be muted. Mit dem Mute-Schalter kann man den Kanal stumm schalten. - + Mute button Mute Schalter - + Solo button Solo Schalter - + Fader Tag Kanalbeschriftung - + Grp Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Zeigt den Audiopegel vor dem Lautstärkeregler des Kanals. Allen verbundenen Musikern am Server wird ein Audiopegel zugewiesen. - + &No grouping &Keine Gruppierung - + Assign to group Zuweisung zur Gruppe - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Regelt die Lautstärke des Kanals. Für alle Musiker, die gerade am Server verbunden sind, wird ein Lautstärkeregler angezeigt. Damit kann man seinen eigenen lokalen Mix erstellen. - + Speaker with cancellation stroke: Indicates that another client has muted you. Durchgestrichener Lautsprecher: Zeigt an, dass der andere Musiker dich stummgeschaltet hat. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Legt die Pan-Position von Links nach Rechts fest. Der Pan funktioniert nur im Stereo oder Mono-In/Stereo-Out Modus. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Bei aktiviertem Solo Status hört man nur diesen Kanal. Alle anderen Kanäle sind stumm geschaltet. Es ist möglich mehrere Kanäle auf Solo zu stellen. Dann hört man nur die Kanäle, die auf Solo gestellt wurden. - + Group Gruppe - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Mit dem Grp-Knopf kann eine Gruppe von Kanälen definiert werden. Wenn man einen Lautstärkeregler einer Kanalgruppe verändert, dann werden alle anderen Regler der Gruppe gleichermaßen verändert. - + Group button Gruppenknopf - + Mixer channel instrument picture Mixerkanal Instrumentenbild - + Mixer channel label (fader tag) Mixerkanalbeschriftung - + PAN PAN - + MUTE MUTE - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Alias/Name - + Instrument Instrument - + Location Standort - - - + + + Skill Level Spielstärke - + Alias Alias - + Beginner Anfänger - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Durch die Kanalbeschriftung wird der verbundene Teilnehmer identifiziert. Der Name, ein Bild des Instruments und eine Flagge des eigenen Landes kann im eigenen Profil ausgewählt werden. - + Mixer channel country/region flag Mixerkanal Landes-/Regionsflagge - + Intermediate Mittlere Spielstärke - + Expert Experte - + Musician Profile Profil des Musikers - - - + + + Mute Mute - - - + + + Pan Pan - - - + + + Solo Solo @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Chatfenster - + The chat window shows a history of all chat messages. Das Chatfenster zeigt den Verlauf aller Chatnachrichten. - + Chat history Chatverlauf - + Input Message Text Chatnachricht Eingabefeld - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Tippe die Chatnachricht in dieses Feld und drücke anschließend die Eingabetaste um die Nachricht an den Server zu schicken. Der Server verteilt die Nachricht anschließend an alle Musiker. Die eigene Nachricht wird dann im Chatfenster angezeigt. - + New chat text edit box Chatnachrichteneingabefeld - + Type a message here Nachricht eingeben - + &Edit B&earbeiten - + Cl&ear Chat History Lösch&en des Chatverlaufs - - + + &Close S&chließen - + Do you want to open the link '%1' in your browser? Willst Du den Link '%1' in Deinem Browser öffnen? @@ -544,218 +544,218 @@ CClientDlg - + Input Level Meter Eingangspegelanzeige - + Make sure not to clip the input signal to avoid distortions of the audio signal. Man sollte darauf achten, dass das Signal nicht zu stark ausgesteuert ist, um Verzerrungen des Signal zu vermeiden. - + Input level meter Eingangspegelanzeige - + Simulates an analog LED level meter. Simuliert eine analoge LED-Signalpegelanzeige. - + Connect/Disconnect Button Verbinden-/Trennschalter - + Connect and disconnect toggle button Schalter zum Verbinden und Trennen - + This shows the level of the two stereo channels for your audio input. Die Eingangspegelanzeige zeigt den Pegel der beiden Stereokanäle der selektierten Audiohardware an. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Wenn die Software verbunden ist und du spielst dein Instrument, dann sollte die Eingangspegelanzeige flackern. Wenn das nicht der Fall ist, dann ist wahrscheinlich der falsche Eingangskanal ausgewählt (z.B. der Line-In-Kanal anstatt des Mikrofonkanals) oder der Eingangsregler im (Windows) Systemmixer ist zu niedrig eingestellt. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Um die Software optimal zu nutzen, sollte man sein eigenes Instrument oder Gesang nicht im Lautsprecher oder Kopfhörer hören, wenn die Software nicht verbunden ist. Das kann man erreichen, indem man den Eingangskanal im Wiedergabemixer stumm schaltet. - + Reverb effect Halleffektregler - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Der Halleffekt kann auf einen selektierten Mono-Audiokanal oder auf beide Stereoaudiokanäle angewendet werden. Die Mono-Kanalselektion und die Hallstärke können eingestellt werden. Wenn z.B. ein Mikrofonsignal auf dem rechten Kanal anliegt und ein Halleffekt soll auf das Mikrofonsignal angewendet werden, dann muss die Hallkanalselektion auf rechts eingestellt werden und der Hallregler muss erhöht werden, bis die gewünschte Stärke des Halleffekts erreicht ist. - + Reverb effect level setting Halleffekt Pegelregler - + Reverb Channel Selection Halleffekt Kanalselektion - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Mit diesen Knöpfen kann ausgewählt werden, auf welches Eingangssignal der Halleffekt angewendet werden soll. Entweder der rechte oder linke Eingangskanal kann ausgewählt werden. - + Left channel selection for reverb Auswahl linker Kanal für Halleffekt - + Right channel selection for reverb Auswahl rechter Kanal für Halleffekt - + Green Grün - + The delay is perfect for a jam session. Die Verzögerung it gering genug für das Jammen. - + Yellow Gelb - + Red Rot - + If this LED indicator turns red, you will not have much fun using %1. Wenn diese LED rot leuchtet, dann wirst du wenig Spaß mit %1 haben. - + Delay status LED indicator LED Stautuslampe für die Verzögerung - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Wenn man diesen Knopf drückt, dann wird die Beschriftung des Knopfes von Verbinden zu Trennen geändert, das heißt, dass er eine Umschaltfunktion hat zum Verbinden und Trennen der Software. - + Shows the current audio delay status: Die Status-LED für die Verzögerung zeigt eine Bewertung der Gesamtverzögerung des Audiosignals: - + A session is still possible but it may be harder to play. Man kann noch spielen aber es wird schwieriger Lieder mit hohem Tempo zu spielen. - + The delay is too large for jamming. Die Verzögerung ist zu hoch zum Jammen. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Der Soundkartenpuffer ist zu klein eingestellt. - + The upload or download stream rate is too high for your internet bandwidth. Die Upload-Rate der Internetverbindung ist zu klein für den Netzwerkdatenstrom. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Als Ping wird die Zeit bezeichnet, die der Audiodatenstrom benötigt, um vom Client zum Server und wieder zurück zu kommen. Diese Verzögerung wird durch das Netzwerk hervorgerufen und sollte um 20-30 ms betragen. Wenn dieser Wert größer ist als 50ms, ist entweder der Abstand zum Server zu groß oder die Internetverbindung nicht ausreichend. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Die Gesamtverzögerung setzt sich aus der Ping-Zeit und der Verzögerung, die durch die aktuellen Puffereinstellungen verursacht wird zusammen. - - + + C&onnect &Verbinden - + &File &Datei - + &View &Ansicht - + &Connection Setup... &Verbinden... - + My &Profile... Mein &Profil... - + C&hat... C&hat... - + &Analyzer Console... &Analyzer Konsole... - + Clear &All Stored Solo and Mute Settings &Lösche alle gespeicherten Solo- und Mute-Einstellungen - + Connect Verbinden - + Settings Einstellungen - + Chat Chat - + Enable feedback detection Aktiviere Feedback-Erkennung - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -764,163 +764,163 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten' aktiviert. Bitte behebe zunächst die Ursache des Feedback-Problems, bevor Du die Stummschaltung wieder rückgängig machst. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Die Soundkarte funktioniert nicht ordnungsgemäß. Bitte überprüfe die Soundkartenauswahl und die Einstellungen der Soundkarte. - + Ok Ok - + E&xit &Beenden - + &Edit B&earbeiten - + Delay Status LED Status LED für die Verzögerung - + The network jitter buffer is not large enough for the current network/audio interface jitter. Der Netzwerkpuffer ist nicht groß genug eingestellt für die aktuellen Netzwerkbedingungen. - + The CPU of the client or server is at 100%. Die CPU des Computers ist voll ausgelastet. - + If this LED indicator turns red, the audio stream is interrupted. Wenn diese LED rot leuchtet, ist der Audio-Stream unterbrochen. - + Current Connection Status Aktueller Verbindungsstatus - + &Load Mixer Channels Setup... &Laden der Konfiguration der Mixerkanäle... - + &Save Mixer Channels Setup... &Speichern der Konfiguration der Mixerkanäle... - + Sort Users by Chann&el Nutzer nach d&em Kanal sortieren - + Sett&ings E&instellungen - + Audio/Network &Settings... Audio/Netzwerk-&Einstellungen... - + A&dvanced Settings... E&rweiterte Einstellungen... - + N&o User Sorting Keine Kanals&ortierung - + Local Jitter Buffer Status LED Lokaler Jitter Buffer Status LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Die Lokale Jitter Buffer Status LED zeigt den aktuellen Audio/Streaming Status. Rotes Licht bedeutet, dass der Audio-Datenstrom unterbrochen ist. Das wird durch folgende Problemen verursacht: - + Local Jitter Buffer status LED indicator Lokaler Jitter Buffer Status LED Indikator - + O&wn Fader First Eigener &Kanal zuerst - + Sort Users by &Name Sortiere die Kanäle nach dem &Namen - + Sort Users by &Instrument Sortiere die Kanäle nach dem &Instrument - + Sort Users by &Group Sortiere die Kanäle nach der &Gruppe - + Sort Users by &City Sortiere die Kanäle nach der &Stadt - + &MIDI Control Settings... &MIDI Einstellungen… - + %1 Directory %1 Verzeichnisserver - + Set All Faders to New Client &Level Setze alle Lautstärken auf den &Pegel für neuen Teilnehmer - + Auto-Adjust all &Faders Automatisches Einpegeln (aller &Fader) - - + + Select Channel Setup File Auswählen der Datei für die Konfiguration der Mixerkanäle - + user Musiker - + users Musiker - + &Disconnect &Trennen @@ -1017,1098 +1017,1107 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CClientSettingsDlg - + Jitter Buffer Size Netzwerkpuffergröße - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Die Netzwerkpuffergröße ist deshalb ein Kompromiss zwischen Audioqualität und Gesamtverzögerung. - + Local jitter buffer slider control Lokale Netzwerkpuffergröße Schieberegler - + Server jitter buffer slider control Server Netzwerkpuffergröße Schieberegler - + Auto jitter buffer check box Automatik für Netzwerkpuffergröße Checkbox - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Wenn der Treiber während eine aktiven Verbindung ausgewählt wird, dann wird die Verbindung gestoppt, der neue Treiber ausgewählt und anschließend wird die Verbindung automatisch wiederhergestellt. - + Sound card device selector combo box Soundkarten Auswahlbox - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Falls der ASIO4All-Treiber verwendet wird, kann es sein, dass dieser Treiber zusätzliche 10-30 ms Verzögerung hinzufügt. Aus diesem Grund sollte man bevorzugt einen nativen ASIO-Treiber der Soundkarte verwenden, der mit dem Produkt mitgeliefert wurde. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Falls der kx ASIO-Treiber verwendet wird, dann muss man darauf achten, dass die ASIO-Eingänge im kx DSP-Einstellungsfenster verbunden sind. - + Sound Card Channel Mapping Soundkarten Kanalzuweisung - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Falls die ausgewählte Soundkarte mehr als zwei Eingangs- oder Ausgangskanäle unterstützt, dann werden die Steuerelemente für die Kanalzuweisung angezeigt. - + Left input channel selection combo box Linker Eingang Kanalauswahlbox - + Right input channel selection combo box Rechter Eingang Kanalauswahlbox - + Left output channel selection combo box Linker Ausgang Kanalauswahlbox - + Right output channel selection combo box Rechter Ausgang Kanalauswahlbox - + Small Network Buffers Kleine Netzwerkpuffer - + Small network buffers check box Kleine Netzwerkpuffer checkbox - + Sound Card Buffer Delay Soundkarten Puffergröße - + Sound card driver settings Soundkarten Einstellungen - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Für jeden %1 Eingabe/Ausgabekanal (Linker und Rechter Kanal) können unterschiedliche Soundkarten-Kanäle ausgewählt werden. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Aktiviert die Unterstützung für sehr kleine Netzwerk-Audio-Pakete. Diese Netzwerk Pakete werden nur benutzt wenn die Soundkarten Pufferverzögerung kleiner als %1 Samples ist. Je kleiner die Netzwerk Puffer, desto geringer die Audio-Latenz. Gleichzeitig steigt aber die Netzwerk-Belastung und die Wahrscheinlichkeit von Audio-Aussetzern oder Sound-Artefakten. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Öffnet die Treibereinstellungen Deiner Soundkarte. Einige Treiber erlauben Dir die Puffer-Einstellungen zu ändern, andere wie ASIO4ALL lassen Dich die Ein- oder Ausgänge deiner Geräte auswählen. Weitere Infos findest du auf jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Öffnet die Treiber Einstellungen. Achtung: %1 unterstützt aktuell nur Geräte mit einer Samplerate von %2 Hz. Andere Geräte lassen sich nicht auswählen. Weitere Infos findest du auf jamulus.io. - + ASIO Device Settings push button ASIO-Geräte-Einstellungs-Knopf - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Wähle den Stil aus, der für die Pegel-Messer benutzt wird. Die Stile "Balken (schmal)" und "LEDs (rund, klein)" beziehen sich nur auf den Mixerbereich. Die Auswahl des Stils "Balken (schmal)" sorgt dafür, dass die Eingangspegelanzeigen dennoch mit breiten Balken dargestellt werden. Wenn der Stil "LEDs (rund, klein)" ausgwählt ist, entsprechen die Eingangspegelanzeigen dem Stil "LEDs (rund, groß)". Die anderen Optionen beziehen sich sowohl auf den Mixer als auch auf die Eingangspegelanzeigen. - + Language Sprache - + Select the language to be used for the user interface. Wähle die Sprache der Benutzeroberfläche aus. - + Language combo box Sprache Combo-Box - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Die Puffer Verzögerungs-/Größeneinstellung ist eine fundamentale Einstellung von %1. Diese Einstellung hat Einfluss auf viele Verbindungsparameter. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Mit diesem Regler kann der relative Pegel vom linken und rechten Eingangskanal verändert werden. Für ein Mono-Signal verhält er sich wie ein Pan-Regler. Wenn z.B. ein Mikrofon am rechten Kanal angeschlossen ist und das Instrument am linken Eingangskanal viel lauter als das Mikrofon ist, dann bewege den Audio-Regler in die Richtung, in der das Label über dem Kanal %1 anzeigt; %2 ist der aktuelle Dämpfungsindikator. - + Audio Device Audiogerät - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Unter Windows kann der ASIO-Treiber (Soundkarte) mit %1 ausgewählt werden. Wenn der ausgewählte ASIO-Treiber nicht kompatibel ist, wird eine Fehlermeldung angezeigt und der vorherige kompatible Treiber ausgewählt. Unter macOS kann die Eingangs- und Ausgangshardware ausgewählt werden. - + Three buffer sizes can be selected Drei Puffergrößen werden unterstützt - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 Samples: Führt zur geringsten Verzögerung, funktioniert aber nicht mit allen Soundkarten. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 Samples: Diese Einstellung sollte nur dann verwendet werden, wenn 64 oder 128 Samples schlechte Ergebnisse liefern. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Manche Soundkartentreiber erlauben es nicht, die Puffergröße innerhalb von %1 zu ändern. In diesem Fall ist die Einstellung für die Puffergröße deaktiviert und muss über den Soundkartentreiber geändert werden. Verwende das entsprechende Tool für deine Schnittstelle um die Puffergröße anzupassen. Wenn du z. B. ASIO nutzt, verwenden die Schaltfläche "ASIO-Geräteeinstellungen", um das Bedienfeld mit den Treibereinstellungen zu öffnen, oder wenn du JACK nutzt, verwende ein Tool wie QjackCtl, um die Puffergröße anzupassen. Für andere Schnittstellen, wie z. B. Pipewire, muss das entsprechende Tool verwendet werden. Bitte lese dazu das Handbuch der Schnittstelle. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Wenn keine Puffergröße ausgewählt ist und alle Einstellungen deaktiviert sind, bedeutet das, dass eine Puffergröße vom Treiber verwendet wird, die nicht den Standardwerten entspricht. %1 wird zwar trotzdem funktionieren, aber eventuell eine schlechtere Leistung bringen. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Die Puffergröße hat einen Einfluss auf den Verbindungsstatus, die aktuelle Upload-Rate und die Gesamtverzögerung. Je kleiner der Puffer, desto größer ist die Wahrscheinlichkeit für das Auftreten einer rot leuchtenden LED (was Audioaussetzer anzeigt), eine höhere Upload-Rate und eine niedrigere Gesamtverzögerung. - + Meter Style Pegel-Messer-Stil - + Meter Style combo box Pegel-Messer-Stil Combo-Box - + Input Boost Eingangs-Verstärkung - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Diese Einstellung erlaubt es Dir, Dein Eingangs-Signal um bis zu Faktor 10 (+20dB) zu verstärken. Wenn Dein Sound zu leise ist, versuche zunächst das Signal zu verbessern, indem Du entweder näher an das Mikrofon gehst, Dein Audioequipment lauter stellst oder die Pegel in den Eingangs-Einstellungen Deines Betriebssystems erhöhst. Nur wenn das nicht klappt, setze hier einen Verstärkungsfaktor. Falls der Sound zu laut ist und verzerrt oder übersteuert, wird dir diese Option nicht helfen. Bitte nutze sie dann auch nicht. Verringere stattdessen Deinen Eingnagspegel, indem Du entweder weiter weg vom Mikrofon gehst, Dein Audioequipment leiser stellst oder die Pegel in den Eingangs-Einstellungen Deines Betriebssystems verringerst. - + Input Boost combo box Eingangs-Verstärkungs Combo box - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Falls weitere Verzeichnisse zum Verbinden-Dialog hinzugefügt werden sollen, können sie hier eingetragen werden. <br> - + Delete custom directory button Benutzerdefiniertes Verzeichnis löschen Button - + Delete Custom Directory Benutzerdefiniertes Verzeichnis löschen - + Click the button to delete the currently selected custom directory. Klicke den Button um das momentan ausgewählte benutzerdefinierte Verzeichnis zu löschen. - + Audio Upstream Rate Audio-Upstream Rate - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Hängt von der aktuellen Audio-Paketgröße und den Kompressionseinstellungen ab. Stelle sicher, dass die Upstream-Rate nicht höher ist als Deine verfügbare Internet Upload Geschwindigkeit ist (das kann z.B. mit einem Service wie speedtest.net überprüft werden). - + Number of Mixer Panel Rows Anzahl der Mischpult-Reihen - + Adjust the number of rows used to arrange the mixer panel. Anzahl der Reihen des Mischpults einstellen. - + Number of Mixer Panel Rows spin box Anzahl Mischpult Reihen spin box - + Feedback Protection Feedback-Schutz - + Prevents acoustic feedback between microphone and speakers. Aktiviere den Feedback-Schutz, um ein akustisches Feedback zwischen Mikrofon und Lautsprechern zu erkennen. - + Feedback Protection check box Feedback-Erkennungs check box - + Audio Alerts Audiohinweise - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Aktiviert Audiohinweise beim Empfang einer Chat-Nachricht bzw. wenn ein neuer Client beitritt. Möglicherweise ist ein zweites Audiogerät erforderlich, um die Hinweise zu hören. - + Audio Alerts check box Audiohinweise Checkbox - + Enable/disable MIDI-in port MIDI-in Port aktivieren/deaktivieren - + MIDI-in port check box MIDI-in Port Checkbox - + Pick-up Mode Pickup Modus - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Wenn aktiviert, reagieren MIDI-Fader- und Panoramaregler erst, wenn die physische Position des Controllers mit dem aktuellen Softwarewert übereinstimmt. Dadurch werden plötzliche Sprünge vermieden, wenn der physische Controller nicht mit der Software synchron ist. - + Pick-up Mode check box Pickup Modus Checkbox - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Wähle den MIDI-Ausgangsport aus, mit dem eine Verbindung hergestellt werden soll. Jamulus verbindet seinen MIDI-Eingangsport mit dem ausgewählten Gerät falls aktiviert. Du kannst auch einen Verbindungsmanager deiner Wahl verwenden, um die Verbindungen manuell zu ändern. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Wähle die MIDI-Quelle aus, mit der du eine Verbindung herstellen möchtest. Jamulus verbindet seinen MIDI-Eingangsport automatisch mit dem ausgewählten Gerät falls aktiviert. Du kannst auch das Audio MIDI Setup verwenden, um die Verbindungen manuell zu ändern. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Wähle die/das MIDI Input Gerät/Geräte aus, auf die Jamulus hören soll. Wähle 'Alle Geräte' aus um MIDI von allen angeschlossenen Geräten zu nutzen oder wähle ein spezifisches Gerät aus. - + MIDI input device combo box MIDI Input Gerät Kombobox - + MIDI controller settings MIDI Controller Einstellungen - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Es gibt einen globalen MIDI-Kanalparameter (0–16) und zwei konfigurierbare Parameter pro zu steuerndem Element: die erste MIDI-CC-Nummer und die Anzahl der aufeinanderfolgenden CC-Nummern. Lege zunächst den Kanal fest, auf dem Jamulus lauschen soll (0 = alle Kanäle). Anschließend konfigurierst du für jedes zu steuernde Element (Lautstärke-Fader, Pan, Solo, Stummschalten) die erste MIDI-CC-Nummer und die Anzahl der dahinter folgenden CC-Nummern. Eine Ausnahme bildet der Parameter Stummschalten – dieser benötigt nur eine einzige CC-Nummer, da er ausschließlich auf deinen eigenen Audiostream wirkt. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Du kannst entweder den MIDI CC Wert eintippen, oder den "Lernen" Button nutzen: Klicke auf "Lernen", bewege den Regler/Knopf/etc. auf deinem MIDI Controller um die MIDI CC Nummer zu finden und zu speichern. - + MIDI channel combo box MIDI Kanal Combobox - + Mute Myself MIDI CC number spin box Stummschalten MIDI CC Nummer Spinbox - + Fader offset spin box Regler Offset Spinbox - + Pan offset spin box Pan offset Spinbox - + Solo offset spin box Solo offset Spinbox - + Mute offset spin box Mute offset Spinbox - + Mute Myself MIDI learn button Stummschalten MIDI Lernen Knopf - + Fader offset MIDI learn button Regler Offset Lernen Knopf - + Pan offset MIDI learn button Pan Offset Lernen Knopf - + Solo offset MIDI learn button Solo Offset Lernen Knopf - + Mute offset MIDI learn button Mute Offset MIDI Lernen Knopf - + ASIO Device Settings ASIO-Geräte-Einstellungen - + + Max + + + + Fancy Schick - + Compact Kompakt - + Bar (narrow) Balken (schmal) - + Bar (wide) Balken (breit) - + LEDs (stripe) LEDs (Streifen) - + LEDs (round, small) LEDs (rund, klein) - + LEDs (round, big) LEDs (rund, groß) - - - - + + + + None Nichts - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Setze hier deinen Namen oder ein Pseudonym, damit andere Musiker wissen, wer Du bist. Du kannst auch ein Bild deines Instruments und die Flagge deines Landes oder der Region, in der du dich befindest, hinzufügen. Auch Deine Stadt und die Spielstärke deines Instruments kannst du angeben. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Was Du hier einträgst erscheint in Deinem Schieberegler auf dem Mischpult, sobald Du mit einem %1 Server verbunden bist. Diese Kennung wird auch in jedem Client angezeigt, der mit dem selben Server wie Du verbunden ist. - + Country/region flag button Land/Regionsflaggenknopf - - + + Could not open MIDI port Konnte MIDI Port nicht öffnen - + No MIDI devices found. Please connect a MIDI device and try again. Es wurden keine MIDI Geräte gefunden. Verbinde ein MIDI Gerät und versuche es erneut. - + Please check your OS configuration. Bitte überprüfe deine Betriebssystemkonfiguration. - + Center Mitte - + R R - + Learn Lernen - - + + All Devices Alle Geräte - + No device connected Kein Gerät verbunden - - + + MIDI Device Not Found MIDI-Gerät nicht gefunden - + The MIDI device "%1" could not be found. Using all available devices instead. Das MIDI Gerät "%1" konnte nicht gefunden werden. Es werden nun alle verfügbaren Geräte genutzt. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. Das MIDI Gerät "%1" ist momentan nicht verfügbar. Wähle ein anderes Gerät aus dem Menü aus um eine Verbindung aufzubauen. - - + + MIDI Device Connection Failed MIDI Gerätekonfiguration fehlgeschlagen - + Could not connect to MIDI device "%1". Please check your OS configuration. Verbindung mit dem MIDI Gerät "%1" fehlgeschlagen. Bitte überprüfe deine Betriebssystemkonfiguration. - + Could not connect to MIDI device "%1". Please check that the device is available. Verbindung mit dem MIDI Gerät "%1" fehlgeschlagen. Bitte überprüfe, ob das Gerät verfügbar ist. - + Listening... Höre zu… - + The buffer setting is therefore a trade-off between audio quality and overall delay. Die Puffergröße ist somit ein Kompromiss zwischen Audioqualität und Gesamtverzögerung. - + 64 samples setting radio button 64 Samples Einstellknopf - + 128 samples setting radio button 128 Samples Einstellknopf - + 256 samples setting radio button 256 Samples Einstellknopf - + Audio Channels Audiokanäle - + Audio channels combo box Audiokanal Auswahlbox - + Audio Quality Audioqualität - + Audio quality combo box Audioqualität Auswahlbox - + New Client Level Pegel für neuen Teilnehmer - + New client level edit box Neuer Teilnehmer Pegel Einstellbox - - + + Mono Mono - + and und - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. Modus ist die Übertragungsrate etwas höher. Man muss sicher stellen, dass die Internetverbindung die höhere Rate übertragen kann. - + Custom Directories Benutzerdefinierte Verzeichnisse - + Custom Directories combo box Benutzerdefinierte Verzeichnisserveradresse Combo-Box - + Mono-in/Stereo-out Mono-In/Stereo-Out - - - + + + Stereo Stereo - - - + + + &Close &Schließen - + Local Audio Input Fader Lokaler Eingangspegelregler - - + + L L - + Local audio input fader (left/right) Lokaler Eingangsregler (Links/Rechts) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Der Netzwerkpuffer kompensiert die Netzwerk- und Soundkarten-Timing-Schwankungen. Die Größe des Netzwerkpuffers hat Auswirkungen auf die Qualität des Audiosignals (wie viele Aussetzer auftreten) und die Gesamtverzögerung (je länger der Puffer, desto größer ist die Verzögerung). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Die Netzwerkpuffergröße kann manuell verstellt werden, jeweils getrennt für die Applikation und den Server. Für den lokalen Netzwerkpuffer werden die Aussetzer durch die LED-Anzeige unter den Reglern angezeigt. Wenn die Lampe rot anzeigt, dann hat ein Pufferüberlauf oder ein Leerlauf des Puffers stattgefunden und der Audiodatenstrom wurde kurz unterbrochen. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Die Netzwerkpuffergröße kann automatisch eingestellt werden. Wenn die Automatik aktiviert ist, dann werden die Netzwerkpuffer der Applikation und des Servers getrennt basierend auf Messungen der Netzwerkschwankungen eingestellt. Wenn die Automatik aktiviert ist, dann sind die beiden Regler gesperrt für die manuelle Verstellung (sie können nicht mit der Maus verändert werden). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Wenn die Automatik zum Einstellen der Netzwerkpuffer aktiviert ist, dann werden die Netzwerkpuffer der Applikation und des entfernten Servers auf einen konservativen Wert eingestellt, um eine möglichst gute Audioqualität zu garantieren. Um die Gesamtverzögerung zu optimieren, bietet es sich an, die Automatik zu deaktivieren und die Netzwerkpuffer etwas kleiner einzustellen. Die Werte sollte man so weit reduzieren, bis die Audioqualität gerade noch der persönlichen Akzeptanz entspricht. Die LED-Anzeige hilft dabei die Audioaussetzer verursacht durch den lokalen Netzwerkpuffer zu visualisieren (wenn die LED rot leuchtet). - + 128 samples: Should work for most available sound cards. 128 Samples: Diese Puffergröße sollte mit den meisten Soundkarten funktionieren. - + Skin Oberfläche - + Select the skin to be used for the main window. Wählt die Oberfläche aus, die für das Hauptfenster verwendet werden soll. - + Skin combo box Oberfläche Combo-Box - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Hiermit kann man die Anzahl an Audiokanälen auswählen. Es gibt drei Modi: - + These modes use one and two audio channels respectively. Diese Modi verwenden jeweils einen oder zwei Audiokanäle. - + Mono in/Stereo-out Mono in/Stereo-out - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Ein Monosignal wird zum Server geschickt aber es kommt ein Stereo-Signal zurück vom Server. Dies ist nützlich für den Fall, dass man an die Soundkarte ein Instrument an den einen Eingangskanal und ein Mikrofon an den anderen Eingangskanal angeschlossen hat. In diesem Fall können die beiden Signale zusammen gemischt werden und an den Server geschickt werden aber man kann das Stereo-Signal von den anderen Musikern hören. - + Enabling Im - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. Wenn der Stereo-Modus ausgewählt wurde, dann verschwindet die Kanalselektion für den Halleffekt im Hauptfenster, da der Effekt auf beide Stereokanäle angewendet wird. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Je höher die Audioqualität, desto höher ist die Netzwerkübertragungsrate. Man muss sicherstellen, dass die Internetverbindung die höhere Rate übertragen kann. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Der Pegel für neue Teilnehmer definiert die Fadereinstellung, wenn sich ein Teilnehmer neu mit dem Server verbindet. D.h. wenn ein neuer Fader erscheint, dann wird er auf den voreingestellten Pegel gesetzt. Eine Ausnahme bildet der Fall, dass der Teilnehmer vorher schon mal mit dem Server verbunden war und der Pegel gespeichert war. - + Low Niedrig - - + + Normal Normal - + High Hoch - + Custom Benutzerdefiniert - + Any Genre 2 Alle Genres 2 - Any Genre 3 - Alle Genres 3 + Alle Genres 3 + + + + Any Genre Asia + - + Genre Rock Genre Rock - + Genre Jazz Genre Jazz - + Genre Classical/Folk Genre Klassik/Volksmusik - + Genre Choral/Barbershop Genre Chor/Barbershop - + Any Genre 1 Alle Genres 1 - + Musician Profile Musiker-Profil - + Alias or name edit box Alias oder Name Eingabefeld - + Instrument picture button Instrumentenbild Knopf - + City edit box Stadt Eingabefeld - + Skill level combo box Fähigkeit Auswahlbox - + Beginner Anfänger - + Intermediate Mittlere Spielstärke - + Expert Experte - - + + Size: Größe: - + Buffer Delay Puffergröße - + Buffer Delay: Puffergröße: - + Drum Set Schlagzeug - + Djembe Djembe - + Electric Guitar E-Gitarre - + Acoustic Guitar Akustikgitarre - + Bass Guitar E-Bass - + Keyboard Keyboard - + Synthesizer Synthesizer - + Grand Piano Flügel - + Accordion Akkordeon - + Vocal Gesang - + Microphone Mikrofon - + Harmonica Mundharmonika - + Trumpet Trompete - + Trombone Posaune - + French Horn Waldhorn - + Tuba Tuba - + Saxophone Saxophon - + Clarinet Klarinette - + Flute Flöte - + Violin Violine - + Cello Cello - + Double Bass Kontrabass - + Recorder Blockflöte - + Streamer Streamer - + Listener Zuhörer - + Guitar+Vocal Gitarre+Gesang - + Keyboard+Vocal Keyboard+Gesang - + Bodhran Bodhran - + Bassoon Fagott - + Oboe Oboe - + Harp Harfe - + Viola Viola - + Congas Congas - + Bongo Bongos - + Vocal Bass Gesang Bass - + Vocal Tenor Gesang Tenor - + Vocal Alto Gesang Alt - + Vocal Soprano Gesang Sopran - + Banjo Banjo - + Mandolin Mandoline - + Ukulele Ukulele - + Bass Ukulele Bass Ukulele - + Vocal Baritone Gesang Bariton - + Vocal Lead Gesang Lead - + Mountain Dulcimer Mountain Dulcimer - + Scratching Scratching - + Rapping Rapper - + Vibraphone Vibraphon - + Conductor Dirigent @@ -2508,117 +2517,117 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CConnectDlg - + Server List Severliste - + Directory Verzeichnis - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Zeigt die Server, die vom ausgewählten Verzeichnis gelistet werden an. Du kannst benutzerdefinierte Verzeichnisse in den erweiterten Einstellungen hinzufügen. - + Directory combo box Verzeichnis Combo-Box - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtert die Serverliste nach dem eingegebenen Text. Beachte, dass der Filter Groß- und Kleinschreibung nicht berücksichtigt. Ein einzelnes #-Zeichen filtert nach den Servern, mit denen mindestens eine Person verbunden ist. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Deaktiviere das Kästchen, um die Serverliste zu minimieren und nur die Server-Details zu sehen. Aktiviere es, um alle Personen auf den Servern zu sehen. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. Im Verbinden-Fenster werden die verfügbaren Server aufgelistet, die für das ausgewählte Verzeichnis registriert sind. Verwende das Verzeichnis-Dropdown-Menü, um das Verzeichnis zu ändern, suche den Server, mit dem du dich verbinden möchtest in der Serverliste, klicke ihn an und klicke danach auf die Schaltfläche Verbinden, um eine Verbindung herzustellen. Alternativ kannst du auch den Servernamen doppelklicken, um eine Verbindung herzustellen. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Permanente Server (Server, die länger als 48 Stunden gelistet sind) werden fett gedruckt. - + You can add custom directories in Advanced Settings. Du kannst benutzerdefinierte Verzeichnisse in den erweiterten Einstellungen hinzufügen. - + Server list view Serverliste Anzeige - + Server Address Serveradresse - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Wenn Sie die Serveradresse kennen, können Sie über das Feld Servername/Adresse eine Verbindung zu ihr herstellen. Nach der Serveradresse kann eine optionale Portnummer mit einem Doppelpunkt als Trennzeichen eingefügt werden, z. B. %1. In diesem Feld wird auch eine Liste der zuletzt verwendeten Serveradressen angezeigt. - + Holds the current server address. It also stores old addresses in the combo box list. Enthält die aktuelle Serveradresse. Außerdem werden alte Adressen in der Combo-Box gespeichert. - + Delete server address button Serveradresse löschen Button - + Delete Server Address Serveradresse löschen - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Klicke den Button um die momentan ausgewählte Serveradresse aus der Liste von gespeicherten Servern zu löschen. - + Ping Ping - + Server address edit box Serveradresse Eingabefeld - + Filter Filter - + Filter edit box Filtereingabefeld - + Show All Musicians Zeige alle Musiker - + Show all musicians check box Zeige alle Musiker Schalter - + Filter text, or # for occupied servers Filter Text, oder # für belegte Server @@ -2689,43 +2698,43 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CHelpMenu - + &Help &Hilfe - - + + Getting &Started... &Erste Schritte... - + Software &Manual... Software&handbuch... - + What's &This Konte&xthilfe - + P&rivacy policy... P&rivatsphäre… - + &About Jamulus... Ü&ber Jamulus... - + About &Qt... Über &Qt... - + About Qt Über Qt @@ -2733,12 +2742,12 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CLanguageComboBox - + Restart Required Neustart erforderlich - + Please restart the application for the language change to take effect. Bitte starte die Applikation neu um die Änderung der Spracheinstellung anzuwenden. @@ -2746,22 +2755,22 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Dieser Server verlangt, dass man Bedingungen akzeptiert, bevor man sich verbinden kann. Bitte ließ die Bedingungen im Chat-Fenster. - + I have read the conditions and &agree. Ich h&abe die Bedingungen gelesen und ich stimme zu. - + Accept Einwilligen - + Decline Ablehnen @@ -2769,17 +2778,17 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CMultiColorLED - + Red Rot - + Yellow Gelb - + Green Grün @@ -2787,7 +2796,7 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CMusProfDlg - + No Name Kein Name @@ -2795,448 +2804,448 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CServerDlg - + Client List Musikerliste - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. Die Musikerliste zeigt alle gerade mit dem Server verbunden Musiker an. Für jeden Musiker werden zusätzliche Informationen wie die IP-Adresse und Namen angezeigt. - + Connected clients list view Musikerliste - + Directory Type combo box Verzeichnis Combo-Box - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Wenn ein anderer Wert als "%1" für Verzeichnis gewählt wird, zeigt dies an, ob die Registrierung erfolgreich war. Wenn die Registrierung fehlgeschlagen ist, wählen Sie bitte ein anderes Verzeichnis. - + When checked, the recorder will run while a session is in progress (if set up correctly). Wenn dieses Kontrollkästchen aktiviert ist, läuft der Rekorder während einer laufenden Sitzung (wenn er richtig eingestellt ist). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Es wurde kein Aufzeichnungsverzeichnis festgelegt oder der Wert ist nicht verwendbar. Überprüfen Sie den Wert unter der Registerkarte Optionen. - + Recording has been switched off by the UI checkbox or JSON-RPC. Die Aufzeichnung wurde über die UI-Checkbox oder JSON-RPC ausgeschaltet. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. Die Aufzeichnung wurde über die UI-Checkbox, SIGUSR2 oder JSON-RPC ausgeschaltet. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Wenn das Aufzeichnungsverzeichnis nicht verfügbar ist, wird anstelle des Verzeichnisses der Fehler angezeigt. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Klicken Sie auf die Schaltfläche , um das Dialogfeld zu öffnen, in dem Sie das Hauptverzeichnis für die Aufzeichnung auswählen können. Der gewählte Wert muss existieren und beschreibbar sein (die Erstellung von Unterverzeichnissen durch den Benutzer, unter dem %1 läuft, muss möglich sein). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Der aktuelle Wert des Aufnahmeverzeichnisses. Der gewählte Wert muss existieren und beschreibbar sein (die Erstellung von Unterverzeichnissen durch den Benutzer, unter dem %1 läuft, muss möglich sein). Klicke auf die Schaltfläche, um das Dialogfeld zu öffnen, in dem das Verzeichnis für die Aufzeichnung ausgewählt werden kann. - + Custom Directory address Benutzerdefinierte Verzeichnisadresse - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. Die Adresse des benutzerdefinierten Verzeichnisses ist die Adresse des Verzeichnisses, das die Serverliste enthält, zu der dieser Server hinzugefügt werden soll. - + Server List Filename dialog push button Serverliste Dateiname Dialog Taste - - + + Server List Filename Serverliste Dateiname - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Klicke auf die Schaltfläche, um das Dialogfeld zu öffnen, in dem du den Namen der Persistenzdatei der Serverliste festlegen kannst. Der Benutzer, unter dem %1 läuft, muss die angegebene Datei erstellen können, auch wenn sie bereits existiert (sie wird beim Speichern überschrieben). - + Server List Filename text box (read-only) Serverliste Dateiname Textbox (schreibgeschützt) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Der aktuelle Wert des Dateinamens für die Persistenz der Serverliste. Der Benutzer, unter dem %1 läuft, muss die angegebene Datei erstellen können, auch wenn sie bereits existiert (sie wird beim Speichern überschrieben). Klicke auf die Schaltfläche um das Dialogfeld zu öffnen, in dem du den Namen der Serverlisten-Persistenzdatei festlegen kannst. - + Clear the server list file name button Schaltfläche Dateiname der Serverliste leeren - + Clear Server List Filename Serverliste Dateiname leeren - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Klicke auf diese Schaltfläche, um den Namen der aktuell ausgewählten Serverlisten-Persistenzdatei zu löschen. Dadurch wird verhindert, dass die Serverliste bestehen bleibt, bis ein neuer Wert ausgewählt wird. - + Start Minimized on Operating System Start Starte minimiert beim Starten des Betriebssystems - + Now a directory Jetzt ein Verzeichnis - + Register Server Status Registrierungsstatus - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Wenn diese Funktion angehakt ist, dann wird der Server automatisch mit dem Betriebssystemstart geladen und erscheint minimiert in der Systemleiste als Icon. - + Server Name Servername - + The server name identifies your server in the connect dialog server list at the clients. Der Servername identifiziert deinen Server in der Serverliste. - + Server name line edit Servername Eingabefeld - + Location City Standort Stadt - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. Hier kann man die Stadt angeben, in der sich der Server befindet. Falls eine Stadt angegeben wurde, dann wird die in der Serverliste angezeigt. - + City where the server is located line edit Stadt in der sich der Server befindet Eingabefeld - + Country/Region Land/Region - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Setze das Land oder die Region wo der Server läuft. Clients werden diese Location in der Liste im Verbindungsdialog anzeigen. - + Combo box for location of this server Combobox für die Location dieses Servers - + Display dialog to select recording directory button Zeige den Dialog zum das Aufnahmeverzeichnis festzulegen Knopf - - + + Main Recording Directory Aufnahmehauptverzeichnis - + Main recording directory text box (read-only) Hauptaufnahmeverzeichnis Textbox (schreibgeschützt) - + Clear the recording directory button Lösche das Aufnahmeverzeichnis Knopf - + Clear Recording Directory Zurücksetzen des Aufnahmeverzeichnisses - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Drücke den Knopf um das aktuelle Aufnahmeverzeichnis zurückzusetzen. Damit wird eine neue Aufnahme verhindert bis wieder ein neues Verzeichnis gesetzt wurde. - + Checkbox to turn on or off server recording Schalter zum aktivieren oder deaktivieren der Aufnahmefunktion - + Jam Recorder Aufnahmefunktion - + Current session directory text box (read-only) Aktuelle Session Checkbox - + Current Session Directory Verzeichnisname für das Speichern der Aufnahmen - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Wenn die Aufnahmefunktion aktiviert ist, dann kann das Verzeichnis ausgewählt werden, in dem die Aufnahmen gespeichert werden. - + Recorder status label Recorder Statusanzeige - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Verzeichnis:</b> '%1' auswählen, um den Server nicht bei einem Verzeichnis zu registrieren.<br>Oder eines der Verzeichnisse auswählen, um den Server bei diesem Verzeichnis zu registrieren.<br>Oder '%2' wählen und auf der Registerkarte Optionen eine benutzerdefinierte Verzeichnisadresse angeben, um den Server bei einem benutzerdefinierten Verzeichnis zu registrieren.<br><br>Für jeden Wert außer '%1' registriert sich dieser Server bei einem Verzeichnis, so dass ein %3-Benutzer diesen Server in der Serverliste des Client-Verbindungsdialogs auswählen kann, wenn er dieses Verzeichnis wählt.<br><br>Die Registrierung des Servers wird regelmäßig erneuert, um sicherzustellen, dass alle Server in der Serverliste des Verbindungsdialogs tatsächlich verfügbar sind. - + Recorder Status Aufnahmestatus - + Displays the current status of the recorder. The following values are possible: Zeigt den aktuellen Status der Aufnahmefunktion an. Die folgenden Zustände sind möglich: - + There is no one connected to the server to record. Es ist kein Musiker mit dem Server verbunden. - + The performers are being recorded to the specified session directory. Die Aufnahme ist aktiv. - + NOTE HINWEIS - + Server welcome message edit box Server Willkommenstext Eingabefeld - + Server Welcome Message Server Willkommensnachricht - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Eine Server Willkommensnachricht wird im Chat-Fenster angezeigt, wenn sich ein Musiker mit dem Server verbindet. Ist kein Text gesetzt, dann ist die Willkommensnachricht deaktiviert. - + Language Sprache - + Select the language to be used for the user interface. Wähle die Sprache der Benutzeroberfläche aus. - + Language combo box Sprache Combo-Box - + Custom Directory line edit Benutzerdefiniertes Verzeichnis Zeile bearbeiten - + &Hide %1 server Mi&nimiere %1 Server - + &Show %1 server Zeige %1 &Server - + %1 server %1 is the name of the main application %1 Server - + Type a message here. If no message is set, the server welcome is disabled. Willkommensnachricht eingeben. Ist kein Text gesetzt, dann ist die Willkommensnachricht deaktiviert. - + %1 Server %1 is the name of the main application %1 Server - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Aufnahme konnte nicht gestartet werden. Bitte überprüfe den verfügbaren Speicherplatz sowie die Zugriffsrechte und versuche es erneut. Fehler: - + ERROR FEHLER - + Request new recording button Anfordern einer neuen Aufnahme - + New Recording Neue Aufnahme - + During a recording session, the button can be used to start a new recording. Mit diesem Knopf kann man die Aufnahme neu starten (d.h. es wird eine neue Aufnahmedatei angelegt). - - + + E&xit &Beenden - + Select Main Recording Directory Wähle das Aufnahmehauptverzeichnis aus - + Recording Aufnahme - + Not recording Keine Aufnahme - + Not initialised Nicht initialisiert - + Not enabled Nicht aktiviert - + &Window &Fenster - + None Keins - + Not registered Nicht registriert - + Bad address Ungültige Adresse - + Registration requested Registrierung angefordert - + Registration failed Registrierung fehlgeschlagen - + Check server version Überprüfe Version des Servers - + Registered Registriert - + Server list full at directory Serverliste des Verzeichnisses voll - + Your server version is too old Deine Serverversion ist zu alt - + Requirements not fulfilled Anfoderungen nicht erfüllt - + Unknown value %1 Unbekannter Wert %1 @@ -3360,32 +3369,32 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CServerListManager - + Now a directory Jetzt ein Verzeichnis - + No longer a directory Kein Verzeichnis mehr - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Konnte '%1' nicht zum Lesen/Schreiben öffnen. Überprüfe ob %2 korrekte Berechtigungen hat (und genug Speicher frei ist). - + Loading persistent server list file: %1 Datei mit persistenter Serverliste wird geladen: %1 - + Could not write to '%1' Konnte nicht nach '%1' schreiben - + Saving registration for %1 (%2): %3 Speichere Registrierung für %1 (%2): %3 @@ -3393,68 +3402,68 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CSound - + The selected audio device is no longer present in the system. Please check your audio device. Das gewählte Audio Gerät ist nicht mehr im System verfügbar. Bitte überprüfe Dein Audio Gerät. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Der Audio-Treiber konnte nicht initialisiert werden. Überprüfe, ob Deine Audio Hardware angeschlossen ist und überprüfe die Treiber Einstellungen. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Das gewählte Audio Gerät ist nicht kompatibel, da es eine Samplerate von %1 Hz nicht unterstützt. Bitte wähle ein anderes Gerät. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. Die aktuelle Audio-Geräte-Konfiguration ist inkompatibel, weil die Samplerate nicht auf %2 Hz gesetzt werden konnte. Bitte suche nach einem Hardwareknopf oder einer Treibereinstellung, mit der du die Sample Rate manuell setzen kannst. Starte %1 dann neu. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Das gewählte Audio Gerät ist nicht kompatibel, da es %1 Ein/Ausgangskanäle nicht unterstützt. Bitte wähle ein anderes Gerät oder eine andere Konfiguration. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Das gewählte Audio Gerät ist nicht kompatibel, da das benötigte Audio Sample Format nicht verfügbar ist. Bitte wähle ein anderes Gerät. - + No ASIO audio device driver found. Kein ASIO-Audio-Treiber gefunden. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Bitte installiere einen ASIO Treiber bevor du %1 startest. Wenn Du ein Gerät mit ASIO Support besitzt, installiere seinen offziellen ASIO Treiber. Falls nicht, musst Du einen Universaltreiber wie ASIO4ALL instalieren. - + Error requesting stream stop: $s Fehler beim Anfordern stream stop: $s - + Error closing stream: $s Fehler beim Schließen des Datenstroms: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK konnte nicht automatisch gestartet werden. Bitte starte JACK manuell und suche nach Fehlermeldungen. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK läuft nicht mit einer Samplerate von <b>%1 Hz</b>. Bitte benutze ein Tool wie <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i>, um die JACK Sample Rate auf %1 Hz zu setzen. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. Die JACK Portregistrierung ist fehlgeschlagen. Das ist wahrscheinlich ein JACK Fehler. Bitte stoppe %1 und JACK. Danach prüfe, ob ein anderes Programm mit einer Samplerate von %2 Hz sich mit JACK verbinden lässt. @@ -3463,62 +3472,62 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos Die JACK Portregistrierung ist fehlgeschlagen. Das ist wahrscheinlich ein JACK Fehler. Bitte stoppe %1 und JACK. Danach prüfe, ob ein anderes MIDI Programm sich mit JACK verbinden lässt. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Kann den JACK Client nicht aktivieren. Dies ist wahrscheinlich ein Fehler mit JACK. Bitte überprüfe den JACK-Ausgang. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK wurde beendet. Um %1 zu nutzen, muss JACK laufen. Bitte starte %1 neu, um JACK wieder zu starten. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Es wurde keine Soundkarte ist im System gefunden. Der CoreAudio input AudioHardwareGetProperty call ist fehlgeschlagen. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Es wurde keine Soundkarte ist im System gefunden. Der CoreAudio output AudioHardwareGetProperty call ist fehlgeschlagen. - + The currently selected audio device is no longer present. Please check your audio device. Das momentan ausgewählte Audio Gerät ist nicht mehr verfügbar. Bitte überprüfe dein Audiogerät. - + The audio input device is no longer available. Please check if your input device is connected correctly. Das momentan ausgewählte Audio Eingangsgerät ist nicht mehr verfügbar. Bitte überprüfe, ob Dein Eingangsgerät korrekt angeschlossen ist. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Die Sample Rate des aktuellen Eingangsgerät beträgt nicht %1 Hz und ist somit nicht kompatibel. Bitte wähle ein anderes Gerät oder versuche manuell die Sample Rate auf %1 Hz zu setzen. Probiere das über das Audio-MIDI Setup (In Programme>Dienstprogramme). - + The audio output device is no longer available. Please check if your output device is connected correctly. Das momentan ausgewählte Audio Ausgangsgerät ist nicht mehr verfügbar. Bitte überprüfe, ob Dein Ausgangsgerät korrekt angeschlossen ist. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Die Sample Rate des aktuellen Ausgangsgeräts beträgt nicht %1 Hz und ist somit nicht kompatibel. Bitte wähle ein anderes Gerät oder versuche manuell die Sample Rate über das Audio-MIDI Setup (In Programme>Dienstprogramme) auf %1 Hz zu setzen. - + The stream format on the current input device isn't compatible with this software. Please select another device. Das Stream Format des aktuellen Eingangsgeräts ist nicht kompatibel mit dieser Software. Bitte wähle ein anderes Gerät. - + The stream format on the current output device isn't compatible with %1. Please select another device. Das Stream Format des aktuellen Ausgangsgeräts ist nicht kompatibel mit %1. Bitte wähle ein anderes Gerät. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Die Puffergrösse der aktuellen Ein- und Ausgangs Geräte können nicht auf den gleichen Wert gesetzt werden. Bitte wähle andere Input/-Output Geräte in Deinen System Einstellungen aus. @@ -3526,27 +3535,27 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Das gewählte Audiogerät kann aufgrund des folgenden Fehlers nicht genutzt werden: %1. Der vorherige Treiber wird gewählt. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Der vorher ausgewählte Audio Gerätetreiber ist nicht mehr verfügbar oder der Treiber ist in einen inkompatiblen Status gewechselt. Wir werden versuchen, ein passendes Audio Gerät zu finden, aber das neue Audio Gerät könnte Rückkoppelung verursachen. Überprüfe die Audiogeräte vor dem Verbinden mit einem Server. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 konnte kein nutzbares %2 Audiogerät finden.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Du kannst die Fehler eventuell in den Treibereinstellungen beheben. Möchtest du diese Einstellungen jetzt öffnen? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. %1 kann nicht gestartet werden. Bitte starte %1 neu und prüfe Deine Audio Einstellungen. @@ -3554,53 +3563,57 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Version %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Veröffentlicht unter der GNU General Public License version 2 oder später (GPLv2) + Veröffentlicht unter der GNU General Public License version 2 oder später (GPLv2) - + This app uses the following libraries, resources or code snippets: Diese App verwendet die folgenden Bibliotheken, Ressourcen oder Codeschnipsel: - + Qt cross-platform application framework Qt plattformübergreifendes Framework - + (build) (build) - + (runtime) (Laufzeit) - + Some pixmaps are from the %1 Einige Pixmaps sind aus der %1 - + Some sound samples are from %1 Manche Töne sind von %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Halleffekt von Perry R. Cook und Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Die Bilder der Länderflaggen sind von Mark James @@ -3608,12 +3621,12 @@ Wir haben Deinen Kanal stummgeschaltet und die Funktion 'Stummschalten&apos global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Ein %1 Upgrade ist verfügbar: <a style='color:red;' href='https://jamulus.io/de/upgrade?progversion=%2'>öffne Details und Downloads</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Für weitere Informationen verwende die "Kontexthilfe" (Hilfe-Menü, rechte Maustaste oder Tastenkombination Shift+F1) diff --git a/src/translation/translation_es_ES.ts b/src/translation/translation_es_ES.ts index a72c0ad5da..a697a48c29 100644 --- a/src/translation/translation_es_ES.ts +++ b/src/translation/translation_es_ES.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Marco de la aplicación multiplataforma Qt - + (build) (versión) - + (runtime) (tiempo de ejecución) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberación de audio de Perry R. Cook y Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Esta aplicación permite a músicos realizar jam sessions en tiempo real por internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Hay un servidor que recoge el audio de cada cliente, los combina y envía la mezcla de vuelta a cada cliente. - + This app uses the following libraries, resources or code snippets: Esta aplicación utiliza las siguientes librerías, recursos o fragmentos de código: - + Flag icons by Mark James Iconos de banderas de Mark James - + Some pixmaps are from the %1 Algunos pixmaps son de la %1 - + Some sound samples are from %1 Algunas muestras de audio son de la %1 - + For details on the contributions check out the %1 Para detalles sobre las contribuciones mira la %1 - + Github Contributors list lista de Contribuidores en Github - + Spanish Español - + French Francés - + Portuguese Portugués - + Dutch Neerlandés - + Italian Italiano - + German Alemán - + Polish Polaco - + Swedish Sueco - + Korean Coreano - + Slovak Eslovaco - + Simplified Chinese Chino Simplificado - + Norwegian Bokmål Noruego bokmål - + Japanese Japonés - + About %1 Acerca de %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Consola de Análisis - + Error Rate of Each Buffer Size Tasa de Error de Cada Tamaño de Buffer @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Mezcla Personal en el Servidor - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Estando conectado a un servidor, estos controles te permiten hacer tu mezcla personal sin afectar lo que otros escuchan de tí. El título muestra el nombre del servidor y, cuando se conoce, si está activamente grabando. - + Server Servidor - + T R Y I N G T O C O N N E C T I N T E N T A N D O C O N E C T A R - + RECORDING ACTIVE GRABACIÓN ACTIVA - + Personal Mix at: %1 Mezcla Personal en el Servidor: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level Nivel Canal - + Input level of the current audio channel at the server Nivel de entrada del canal de audio actual en el servidor - + Mixer Fader Fader Mezclador - + Local mix level setting of the current audio channel at the server Ajuste local de la mezcla del canal de audio actual en el servidor - + Status Indicator Indicador de Estado - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Muestra una indicación del estado del cliente asignado a este canal. Los indicadores soportados son: - + Status indicator label Etiqueta indicador estado - + Panning Paneo - + Local panning position of the current audio channel at the server Posición local del paneo del canal de audio actual en el servidor - + With the Mute checkbox, the audio channel can be muted. Activando Mute, se puede silenciar el canal de audio. - + Mute button Botón Mute - + Solo button Botón Solo - + Fader Tag Etiqueta Fader - + Grp Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Muestra el nivel de audio pre-fader de este canal. Todos los clientes conectados al servidor tienen un nivel de audio asignado, el mismo valor para cada cliente. - + &No grouping &Sin grupos - + Assign to group Asignar a grupo - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Ajusta el nivel de audio de este canal. Todos los clientes conectados al servidor tendrán asignado un fader, mostrado en cada cliente, para ajustar la mezcla local. - + Speaker with cancellation stroke: Indicates that another client has muted you. Altavoz tachado: Indica que otro cliente te ha muteado. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Fija el paneo de Izquierda a Derecha del canal. Solo funciona en modo estéreo o preferiblemente en modo Entrada mono/Salida estéreo. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Activando Solo, todos los demás canales de audio excepto este se silencian. Es posible activar esta función para más de un canal. - + Group Grupo - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Activando Grp se puede definir un grupo de canales. Todos los faders de un grupo se mueven en sincronización proporcional si se mueve cualquier fader del grupo. - + Group button Botón grupo - + Mixer channel instrument picture Imagen mezclador canal instrumento - + Mixer channel label (fader tag) Etiqueta mezclador canal (etiqueta fader) - + PAN PAN - + MUTE MUTE - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Alias/Nombre - + Instrument Instrumento - + Location Ubicación - - - + + + Skill Level Nivel Habilidad - + Alias Alias - + Beginner Principiante - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. La etiqueta del fader identifica el cliente conectado. El nombre de la etiqueta, una imagen de tu instrumento y la bandera de tu ubicación se pueden establecer en la ventana principal. - + Mixer channel country/region flag País/región del canal del mezclador - + Intermediate Intermedio - + Expert Experto - + Musician Profile Perfil Músico - - - + + + Mute Mute - - - + + + Pan Paneo - - - + + + Solo Solo @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Ventana Chat - + The chat window shows a history of all chat messages. La ventana del chat muestra un historial de todos los mensajes. - + Chat history Historial chat - + Input Message Text Texto Mensaje - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Teclea el mensaje en el campo y pulsa Enter para enviar el mensaje al servidor, el cual distribuye el mensaje a todos los clientes conectados. Tu mensaje se mostrará en la ventana del chat. - + New chat text edit box Campo nuevo texto chat - + Type a message here Teclea un mensaje aquí - + &Edit E&ditar - + Cl&ear Chat History Li&mpiar Historial Chat - - + + &Close &Cerrar - + Do you want to open the link '%1' in your browser? ¿Quieres abrir el enlace '%1' en tu navegador? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter Indicador Nivel Entrada - + Make sure not to clip the input signal to avoid distortions of the audio signal. Asegúrate de no clipear la señal de entrada para evitar distorsiones de la señal de audio. - + Input level meter Indicador nivel entrada - + Simulates an analog LED level meter. Simula un indicador analógico de LEDs. - + Connect/Disconnect Button Botón Conexión/Desconexión - + Connect and disconnect toggle button Botón de conexión y desconexión - + This shows the level of the two stereo channels for your audio input. Esto muestra los niveles de los dos canales estéreo de tu entrada de audio. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Si la aplicación está conectada a un servidor y tocas tu instrumento/cantas por el micrófono, el vúmetro debería parpadear. Si no es así, seguramente has seleccionado el canal de entrada equivocado (por ej. line in en lugar de la entrada del micrófono) o está muy bajo el gain de entrada en el mezclador de audio (Windows). - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Para un uso adecuado de la aplicación, no deberías oír tu voz/instrumento por el altavoz o los auriculares cuando el software no está conectado. Esto se puede realizar silenciando tu canal de entrada de audio en el mezclador de Reproducción (¡no el de Grabación!). - + Reverb effect Efecto reverb - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Se puede aplicar un efecto de reverb a un canal local de audio mono o a ambos canales en modo estéreo. Se puede modificar la selección de canales en modo mono y el nivel de reverb. Por ej., si la señal del micrófono va por el canal derecho de la tarjeta de sonido y se desea aplicar reverb, cambia el selector de canal a derecho y sube el fader hasta alcanzar el nivel de reverb deseado. - + Reverb effect level setting Nivel efecto reverb - + Reverb Channel Selection Selección Canal Reverb - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Con estos botones se puede escoger el canal de entrada de audio al que se aplica el efecto de reverb. Se pueden elegir los canales de entrada izquierdo o derecho. - + Left channel selection for reverb Selección canal izq para reverb - + Right channel selection for reverb Selección canal dcho para reverb - + Green Verde - + The delay is perfect for a jam session. El retardo es perfecto para una jam session. - + Yellow Amarillo - + Red Rojo - + Delay status LED indicator Indicador LED estado retardo - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Abre un diálogo donde puedes escoger un servidor al cual conectarte. Si estás conectado, pulsar este botón finalizará la sesión. - + Shows the current audio delay status: Muestra el estado actual del retardo de audio: - + A session is still possible but it may be harder to play. Una sesión aún es posible pero quizá sea más difícil tocar. - + The delay is too large for jamming. El retardo es demasiado grande para tocar. - + The sound card's buffer delay (buffer size) is too small (see Settings window). El retardo de buffer de la tarjeta de audio (tamaño buffer) tiene un valor demasiado bajo (ver ventana de Configuración). - + The upload or download stream rate is too high for your internet bandwidth. La tasa de subida o bajada es demasiado alta para tu ancho de banda de Internet. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. El Tiempo Ping es el tiempo que requiere el flujo de audio para viajar desde el cliente al servidor y volver. Este retardo lo determina la red y debería ser de unos 20-30 ms. Si este retardo es de unos 50 ms, la distancia al servidor es demasiado grande o tu conexión a internet no es óptima. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. El Retardo Total se calcula con el Tiempo Ping actual y el retardo ocasionado por la configuración de buffers. - - + + C&onnect C&onectar - + &File &Archivo - + &View &Ver - + &Connection Setup... &Configuración de Conexión... - + My &Profile... Mi &Perfil... - + C&hat... C&hat... - + &Analyzer Console... Consola de &Análisis... - + Clear &All Stored Solo and Mute Settings &Eliminar Todas las Configuraciones de Solo y Mute - + %1 Directory %1 Directorio - + Ok Ok - + E&xit &Salir - + &Edit &Editar - + Sort Users by &Group Ordenar Usuarios de Canal por &Grupo - + Delay Status LED LED Estado Retardo - + The network jitter buffer is not large enough for the current network/audio interface jitter. El jitter buffer de red no es lo suficientemente grande para el jitter actual de la red/interfaz de audio. - + The CPU of the client or server is at 100%. El procesador del cliente o del servidor está al 100%. - + If this LED indicator turns red, the audio stream is interrupted. Si este indicador LED se vuelve rojo, se interrumpe el flujo de audio. - + Current Connection Status Estado Actual de Conexión - + &Load Mixer Channels Setup... C&argar Configuración Canales Mezclador... - + &Save Mixer Channels Setup... &Guardar Configuración Canales Mezclador... - + Sort Users by Chann&el Ordenar Usuarios por &Canal - + Sett&ings Configurac&ión - + Audio/Network &Settings... Configuración de Audio/&Red... - + A&dvanced Settings... Configuración Avanza&da... - + N&o User Sorting N&o Ordenar Usuarios - + If this LED indicator turns red, you will not have much fun using %1. Si este indicador LED se vuelve rojo, no te divertirás demasiado utilizando %1. - + Local Jitter Buffer Status LED LED estado Jitter Buffer local - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: El LED de estado de jitter buffer local muestra el estado actual del flujo de audio. Si está rojo, hay interrupciones en el flujo de audio. Esto puede ser causado por alguno de los siguientes problemas: - + Local Jitter Buffer status LED indicator Indicador LED estado Jitter Buffer local - + O&wn Fader First Fader Pro&pio Primero - + Sort Users by &Name Ordenar Usuarios por &Nombre - + Sort Users by &Instrument Ordenar Usuarios por &Instrumento - + Sort Users by &City Ordenar Usuarios por &Ciudad - + Set All Faders to New Client &Level Todos los Faders al Nivel C&liente Nuevo - + Auto-Adjust all &Faders Auto-Ajustar todos los &Faders - + &MIDI Control Settings... Configuración Control &MIDI... - - + + Select Channel Setup File Seleccionar Archivo Configuración Canales - + user usuario - + users usuarios - + Connect Conectar - + Settings Configuración - + Chat Chat - + Enable feedback detection Activar detección de retroalimentación - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resuelve el problema de retroalimentación primero y después desactiva 'Silenciarme Yo'. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Tu tarjeta de sonido no está funcionando correctamente. Por favor abre la ventana de configuración y comprueba la selección de dispositivo y la configuración del driver. - + &Disconnect &Desconectar @@ -1017,1098 +1017,1107 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CClientSettingsDlg - + Jitter Buffer Size Tamaño Jitter Buffer - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Por tanto la configuración del jitter buffer es un compromiso entre calidad y retardo total. - + Local jitter buffer slider control Control deslizante jitter buffer local - + Server jitter buffer slider control Control deslizante jitter buffer servidor - + Auto jitter buffer check box Casilla auto jitter buffer - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Si el driver se selecciona durante una conexión activa, la conexión se detiene, se cambia el driver y la conexión se reanuda automáticamente. - + Sound card device selector combo box Selector de dispositivo de audio - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. En caso de utilizar el driver ASIO4ALL, por favor ten en cuenta que este driver normalmente introduce una latencia adicional de 10-30 ms. Por tanto se recomienda utilizar la tarjeta de audio con un driver nativo. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Si utilizas el driver kX ASIO, asegúrate de conectar las entradas ASIO en el panel de configuración de kX DSP. - + Sound Card Channel Mapping Mapeo Canales Tarjeta Audio - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Si el dispositivo de audio ofrece más de un canal de entrada o salida, son visibles las configuraciones para el Mapeo de Canales de Entrada y de Salida. - + Left input channel selection combo box Selección canal entrada izquierdo - + Right input channel selection combo box Selección canal entrada derecho - + Left output channel selection combo box Selección canal salida izquierdo - + Right output channel selection combo box Selección canal salida derecho - + Small Network Buffers Buffers Red Pequeños - + Small network buffers check box Casilla buffers de red pequeños - + Sound Card Buffer Delay Retardo Buffer Tarjeta Audio - + Sound card driver settings Configuración de la tarjeta de sonido - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Para cada canal de entrada/salida (canal derecho e izquierdo) de %1 se puede seleccionar una tarjeta de sonido diferente. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Habilita el soporte para paquetes de red de audio muy pequeños. Solo se utilizan estos paquetes pequeños si el retardo de buffer de la tarjeta de audio es menor de %1 muestras. Cuanto menores los buffers de red, menor la latencia de audio. Pero al mismo tiempo, aumenta la carga de red y la probabilidad de caídas de audio también aumenta. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Esto abre la configuración del driver de tu tarjeta de sonido. Algunos drivers te permiten cambiar los ajustes del buffer; otros, como ASIO4ALL, te permiten elegir las entradas o salidas de tu(s) dispositivo(s). Se puede encontrar más información en jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Abre la configuración del driver. Nota: %1 actualmente solo soporta dispositivos con una tasa de muestreo de %2 Hz. No podrás seleccionar un driver/dispositivo que no lo haga. Para más ayuda, ver jamulus.io. - + ASIO Device Settings push button Botón de Configuración Dispositivo ASIO - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Selecciona el estilo a utilizar para los indicadores de nivel. Barra (estrecha) y LEDs (redondos, pequeños) solo se aplican al cuadro de mezclas. Cuando se selecciona Barra (estrecha), los vúmetros de entrada se configuran como Barra (ancha). Cuando se selecciona LEDs (redondos, pequeños), los vúmetros de entrada se configuran como LEDs (redondos, grandes). Las opciones restantes se aplican al cuadro de mezclas y a los vúmetros de entrada. - + Language Idioma - + Select the language to be used for the user interface. Selecciona el idioma a utilizar para el interfaz de usuario. - + Language combo box Campo Idioma - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Este parámetro es una parte fundamental de la configuración de %1. Este parámetro tiene un impacto sobre muchas propiedades de la conexión. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Controla los niveles relativos de los canales locales de audio derecho e izquierdo. Para una señal mono actúa como paneo entre los dos canales. Por ej., si se conecta un miocrófono al canal derecho y un instrumento al izquierdo que suena mucho más alto que el micrófono, mueve el fader en una dirección donde la etiqueta sobre el fader muestra %1, donde %2 es el indicador actual de atenuación. - + Audio Device Dispositivo de Audio - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. En el sistema operativo WIndows se puede seleccionar el driver ASIO (tarjeta de audio) utilizando %1. Si el driver ASIO seleccionado no es válido, se muestra un mensaje de error y se selecciona el anterior driver válido. En macOS se puede seleccionar el hardware de entrada y salida. - + Three buffer sizes can be selected Se pueden seleccionar tres tamaños de buffer - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 muestras: Ofrece la latencia más baja, pero no funciona con todas las tarjetas de audio. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 muestras: Solo debería utilizarse cuando hay problemas con 64 ó 128 muestras. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Algunos drivers de tarjetas de sonido no permiten cambiar el retardo de buffer desde %1. En este caso la configuración del retardo de buffer está deshabilitada y debe cambiarse utilizando el driver de la tarjeta de sonido. Utiliza la herramienta apropiada del interfaz en uso para ajustar este tamalo de buffer. Por ejemplo, si utilizas ASIO, usa el botón de "Configuración Dispositivo ASIO" para abrir el panel de configuración del driver o si utilizas JACK, usa una herramienta como QjackCtl para ajustar el tamaño del buffer. Otros interfaces, como Pipewire, requerirán el uso de la herramienta apropiada. Por favor consulta el manual del interfaz. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Si no hay ningún tamaño de buffer seleccionado y todas las configuraciones están deshabilitadas, significa que el driver está utilizando un tamaño de buffer que no corresponde a los valores. %1 seguirá funcionando con esta configuración pero podría tener un rendimiento limitado. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. El retardo del buffer tiene un impacto en la conexión, la tasa de subida y el retardo total. Cuanto menor sea el tamaño del buffer, mayor la probabilidad de que haya una luz roja en el indicador de estado (caídas de audio), mayor la tasa de subida y menor el retardo total. - + Meter Style Estilo del Vúmetro - + Meter Style combo box Casilla para Estilo del Vúmetro - + Input Boost Aumento de Entrada - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Este ajuste te permite aumentar tu señal de entrada en unfactor de hasta 10 (+20dB). Si tu audio es muy bajo, primero intenta aumentar el nivel acercándote al micrófono, ajustando tu equipo de sonido o aumentando la configuración de entrada de audio de tu sistema operativo. Solamente si lo anterior falla, establece un factor aquí. Si tu sonido es muy alto, suena distorsionado y clipea, esta opción no ayudará. No la utilices. La distorsión seguirá ahí. En su lugar, reduce tu nivel de entrada alejándote de tu micrófono, ajusta tu equipo de audio o reduce la configuración de entrada de audio de tu sistema operativo. - + Input Boost combo box Desplegable de Aumento de Entrada - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Si necesitas añadir directorios adicionales al menú desplegable de Directorios en la ventana de Conectar, puedes introducir las direcciones aquí.<br> - + Delete custom directory button Botón para borrar directorios personalizados - + Delete Custom Directory Borrar Directorio Personalizado - + Click the button to delete the currently selected custom directory. Haz clic en el botón para borrar el directorio personalizado seleccionado. - + Audio Upstream Rate Tasa de Subida de Audio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Depende del tamaño actual de paquetes de audio y la configuración de compresión de audio. Asegúrate de que la tasa de subida no es mayor que la velocidad de subida disponible (comprueba la tasa de subida de tu conexión a internet, por ej. con speedtest.net). - + Number of Mixer Panel Rows Número de Filas Panel del Mezclador - + Adjust the number of rows used to arrange the mixer panel. Ajusta el número de filas utilizado para organizar el panel del mezclador. - + Number of Mixer Panel Rows spin box Casilla para Número de Filas Panel del Mezclador - + Feedback Protection Protección contra Retroalimentación - + Prevents acoustic feedback between microphone and speakers. Evita la retroalimentación acústica entre el micrófono y los altavoces. - + Feedback Protection check box Casilla para Protección contra Retroalimentación - + Audio Alerts Alertas Sonoras - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Activa la alerta sonora al recibir un mensaje de chat y cuando un nuevo cliente se une a la sesión. Para escuchar las alertas puede ser necesario un segundo dispositivo de audio. - + Audio Alerts check box Casilla Alertas Sonoras - + Enable/disable MIDI-in port Activar/desactivar puerto entrada MIDI - + MIDI-in port check box Casilla puerto entrada MIDI - + Pick-up Mode Modo Pick-up - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Cuando se habilita, los controles MIDI de fader y volumen esperarán a que la posición del controlador físico iguale el valor actual en software antes de responder. Esto evita saltos repentinos cuando el controlador físico no está en sincronización con el software. - + Pick-up Mode check box Casilla de Modo Pick-up - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Selecciona el puerto MIDI de salida al que conectarse. Jamulus conectará su puerto de entrada automáticamente al dispositivo seleccionado cuando se habilita. También puedes utilizar el gestor de conexiones de tu elección para cambiar las conexiones manualmente. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Selecciona la fuente de MIDI al que conectarse. Jamulus conectará su puerto de entrada MIDI automáticamente al dispositivo seleccionado cuando se habilita. También puedes utilizar Configuración Audio MIDI para cambiar las conexiones manualmente. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Selecciona el/los dispositivo/s a los que debe responder Jamulus. Selecciona 'Todos los Dispositivos' para recibir MIDI de todos los dispositivos conectados, o elige un dispositivo específico. - + MIDI input device combo box Desplegable de dispositivo entrada MIDI - + MIDI controller settings Configuración controlador MIDI - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Hay un parámetro global de canal MIDI (0-16) y dos parámetros que puedes establecer para cada elemento controlado: Primer MIDI CC y números CC consecutivos (cuenta). Primero establece el canal en el que quieres que Jamulus reciba (0 para todos los canales). Luego, para cada elemento que quieres controlar (fader de volumen, paneo, solo, mute) establece el primer MIDI CC (número CC desde el cual empezar) y la cantidad de números CC consecutivos. Hay una excepción que no requiere establecer números CC consecutivos que es el parámetro de "Silenciarme yo" - solo requiere un único número CC ya que solo se aplica al flujo de audio de uno mismo. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Puedes o bien introducir los valores MIDI CC o utilizar el botón de "Aprende": haz clic en "Aprende", mueve/pulsa el fader/potenciómetro/botón de tu controlador MIDI, y el número CC será detectado y guardado. - + MIDI channel combo box Desplegable canal MIDI - + Mute Myself MIDI CC number spin box Campo MIDI CC Silenciarme Yo - + Fader offset spin box Campo MIDI CC Fader - + Pan offset spin box Campo MIDI CC Paneo - + Solo offset spin box Campo MIDI CC Solo - + Mute offset spin box Campo MIDI CC Mute - + Mute Myself MIDI learn button Botón aprende MIDI Silenciarme Yo - + Fader offset MIDI learn button Botón aprende MIDI Fader - + Pan offset MIDI learn button Botón aprende MIDI Paneo - + Solo offset MIDI learn button Botón aprende MIDI Solo - + Mute offset MIDI learn button Botón aprende MIDI Mute - + ASIO Device Settings Configuración Dispositivo ASIO - + + Max + + + + Fancy Oscuro - + Compact Compacto - + Bar (narrow) Barra (estrecha) - + Bar (wide) Barra (ancha) - + LEDs (stripe) LEDs (franja) - + LEDs (round, small) LEDs (redondos, pequeños) - + LEDs (round, big) LEDs (redondos, grandes) - - - - + + + + None Ninguno - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Escribe tu nombre o un alias aquí para que otros músicos con quien quieras tocar sepan quién eres. Puedes además añadir una imagen del instrumento que tocas y la bandera del país o la región donde te ubicas. Tu ciudad y tu nivel de habilidad con el instrumento también pueden añadirse. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Lo que introduzcas aquí aparecerá en tu fader del mezclador cuando te conectes a un servidor %1. Esta etiqueta también se mostrará a cada cliente que se conecte al mismo servidor que tú. - + Country/region flag button Botón bandera país/región - - + + Could not open MIDI port No se pudo abrir puerto MIDI - + No MIDI devices found. Please connect a MIDI device and try again. No se encontraron dispositivos MIDI. Por favor conecta un dispositivo MIDI e inténtalo de nuevo. - + Please check your OS configuration. Por favor comprueba la configuración de tu SO. - + Center Centro - + R R - + Learn Aprende - - + + All Devices Todos los dispositivos - + No device connected Ningún dispositivo conectado - - + + MIDI Device Not Found Dispositivo MIDI no encontrado - + The MIDI device "%1" could not be found. Using all available devices instead. El dispositivo MIDI "%1" no se encontró. Utilizando todos los dispositivos disponibles en su lugar. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. El dispositivo MIDI "%1" no se encuentra disponible. Selecciona un dispositivo diferente del menú desplegable para conectar. - - + + MIDI Device Connection Failed Error de Conexión del Dispositivo MIDI - + Could not connect to MIDI device "%1". Please check your OS configuration. No se pudo conectar el dispositivo MIDI "%1". Por favor comprueba la configuración de tu SO. - + Could not connect to MIDI device "%1". Please check that the device is available. No se pudo conectar el dispositivo MIDI "%1". Por favor comprueba que el dispositivo se encuentra disponible. - + Listening... Esperando... - + The buffer setting is therefore a trade-off between audio quality and overall delay. Por tanto la configuración del buffer es un compromiso entre calidad de audio y retardo total. - + 64 samples setting radio button Configuración 64 muestras - + 128 samples setting radio button Configuración 128 muestras - + 256 samples setting radio button Configuración 256 muestras - + Audio Channels Canales Audio - + Audio channels combo box Selección canales audio - + Audio Quality Calidad Audio - + Audio quality combo box Selección calidad audio - + New Client Level Nivel Cliente Nuevo - + New client level edit box Campo para nivel nuevo cliente - - + + Mono Mono - + and y - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. aumentará la tasa de datos. Asegúrate de que tu tasa de subida no excede el valor de subida disponible con tu ancho de banda de Internet. - + Custom Directories Directorios Personalizados - + Custom Directories combo box Casilla Directorios Personalizados - + Mono-in/Stereo-out Entrada mono/Salida estéreo - - - + + + Stereo Estéreo - - - + + + &Close &Cerrar - + Local Audio Input Fader Fader Entrada Audio Local - - + + L L - + Local audio input fader (left/right) Fader entrada audio local (izq/dcho) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). El jitter buffer compensa el jitter de la red y la tarjeta de audio. El tamaño de este buffer tiene por tanto un impacto sobre la calidad del flujo de audio (el número de caídas de la señal) y el retardo total (a mayor buffer, mayor retardo). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. El tamaño del jitter buffer se puede establecer manualmente para el cliente local y para el servidor remoto. Para el jitter buffer local, las caídas del flujo de audio se indican mediante la luz debajo de los faders del jitter buffer. Si la luz se vuelve roja, significa que ha habido una interrupción del flujo de audio. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). En caso de activar Auto, los jitter buffer del cliente local y del servidor remoto se ajustan automáticamente basándose en mediciones del jitter de la red y de la tarjeta de audio. Si se activa Auto, los faders del jitter buffer se deshabilitan (no pueden moverse con el ratón). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. En caso de activar Auto, los buffers de red del cliente local y del servidor remoto se asignan a un valor conservador para minimizar la probabilidad de fallos de audio. Para ajustar el retardo de audio/latencia se recomienda desactivar la función Auto y bajar los valores de jitter buffer manualmente utilizando los controles deslizantes hasta alcanzar un límite aceptable de caídas de audio. El indicador LED ofrece una visualización de las caídas de audio mediante una luz roja. - + 128 samples: Should work for most available sound cards. 128 muestras: Debería de funcionar con la mayoría de tarjetas de audio. - + Skin Tema - + Select the skin to be used for the main window. Elige el tema a utilizar para la ventana principal. - + Skin combo box Campo tema - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Selecciona el número de canales de audio a utilizar para la comunicación entre cliente y servidor. Hay tres modos disponibles: - + These modes use one and two audio channels respectively. Estos modos utilizan uno y dos canales de audio respectivamente. - + Mono in/Stereo-out Entrada Mono/Salida Estéreo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. La señal de audio enviada al servidor es mono pero la señal de vuelta es estéreo. Esto es útil si la tarjeta de audio tiene el instrumento en una entrada y el micrófono en la otra. En este caso se pueden mezclar las dos señales de entrada a un canal mono pero la mezcla del servidor se escucha en estéreo. - + Enabling Habilitar el modo - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. En modo estéreo, no habrá ninguna selección de canal para el efecto de reverb en la ventana principal porque el efecto se aplica a ambos canales en este caso. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Cuanto mayor la calidad del audio, mayor la tasa de subida del audio. Asegúrate de que tu tasa de subida no excede el ancho de banda de tu conexión a Internet. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Este ajuste define el nivel del fader de una nueva conexión de cliente, en porcentaje. Si se conecta un nuevo cliente al servidor actual, el nivel inicial de su fader tomará este valor si no se ha especificado anteriormente un valor para ese cliente de una conexión anterior. - + Low Baja - - + + Normal Normal - + High Alta - + Custom Personalizado - + Any Genre 2 Cualquier Género 2 - Any Genre 3 - Cualquier Género 3 + Cualquier Género 3 + + + + Any Genre Asia + - + Genre Rock Género Rock - + Genre Jazz Género Jazz - + Genre Classical/Folk Género Clásico/Folk - + Genre Choral/Barbershop Género Coral/Barbershop - + Any Genre 1 Cualquier Género 1 - + Musician Profile Perfil Músico - + Alias or name edit box Campo para alias o nombre - + Instrument picture button Botón imagen instrumento - + City edit box Casilla para editar ciudad - + Skill level combo box Casilla para nivel de habilidad - + Beginner Principiante - + Intermediate Intermedio - + Expert Experto - - + + Size: Tamaño: - + Buffer Delay Retardo Buffer - + Buffer Delay: Retardo Buffer: - + Drum Set Batería - + Djembe Djembé - + Electric Guitar Guitarra Eléctrica - + Acoustic Guitar Guitarra Acústica - + Bass Guitar Bajo Eléctrico - + Keyboard Teclado - + Synthesizer Sintetizador - + Grand Piano Piano de Cola - + Accordion Acordeón - + Vocal Voz - + Microphone Micrófono - + Harmonica Armónica - + Trumpet Trompeta - + Trombone Trombón - + French Horn Trompa - + Tuba Tuba - + Saxophone Saxofón - + Clarinet Clarinete - + Flute Flauta - + Violin Violín - + Cello Violonchelo - + Double Bass Contrabajo - + Recorder Grabadora - + Streamer Streamer - + Listener Oyente - + Guitar+Vocal Guitarra+Voz - + Keyboard+Vocal Teclado+Voz - + Bodhran Bodhrán - + Bassoon Fagot - + Oboe Oboe - + Harp Arpa - + Viola Viola - + Congas Congas - + Bongo Bongo - + Vocal Bass Voz Bajo - + Vocal Tenor Voz Tenor - + Vocal Alto Voz Alto - + Vocal Soprano Voz Soprano - + Banjo Banyo - + Mandolin Mandolina - + Ukulele Ukulele - + Bass Ukulele Ukulele Barítono - + Vocal Baritone Voz Barítono - + Vocal Lead Voz Principal - + Mountain Dulcimer Dulcémele de Montaña - + Scratching Scratching - + Rapping Rapeo - + Vibraphone Vibráfono - + Conductor Director @@ -2508,117 +2517,117 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CConnectDlg - + Server List Lista Servidores - + Directory Directorio - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Muestra los servidores listados por el directorio seleccionado. Puedes añadir directorios personalizados en Configuración Avanzada. - + Directory combo box Casilla Directorio - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtra la lista de servidores con el texto dado. Nótese que el filtro no distingue entre mayúsculas y minúsculas. Un único caracter # filtrará los servidores con al menos una persona conectada. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Deshabilita para colapsar la lista de servidores para solo mostrar los detalles del servidor. Habilita para mostrar todos los conectados a los servidores. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. La ventana de Configuración de Conexión lista los servidores disponibles registrados con el directorio seleccionado. Utiliza el desplegable de Directorios para cambiar de directorio, encuentra el servidor al que te quieres conectar, haz clic en él, y luego haz clic en el botón de Conectar para conectarte. También puedes hacer doble clic en el nombre del servidor para conectarte. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Los servidores permanentes (aquellos que han estado en la lista durante más de 48 horas) se muestran en negrita. - + You can add custom directories in Advanced Settings. Puedes añadir directorios personalizados en Configuración Avanzada. - + Server list view Vista lista de servidores - + Server Address Dirección Servidor - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Si conoces la dirección del servidor, puedes conectarte a él utilizando el campo de Nombre/Dirección Servidor. Opcionalmente se puede añadir un número de puerto tras la dirección del servidor utilizando dos puntos como separador, por ej. %1. El campo también mostrará una lista de las direcciones de servidores utilizadas más recientemente. - + Holds the current server address. It also stores old addresses in the combo box list. Contiene la dirección del servidor actual. También guarda direcciones antiguas en la lista desplegable. - + Delete server address button Botón para borrar dirección de servidor - + Delete Server Address Borrar Dirección de Servidor - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Haz clic para borrar la dirección de servidor seleccionada y eliminarla de la lista de servidores guardados. - + Ping Ping - + Server address edit box Selección dirección servidor - + Filter Filtro - + Filter edit box Campo filtro - + Show All Musicians Mostrar Todos los Músicos - + Show all musicians check box Selección Mostrar todos los músicos - + Filter text, or # for occupied servers Texto de filtrado, o # para servidores ocupados @@ -2689,43 +2698,43 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CHelpMenu - + &Help A&yuda - - + + Getting &Started... &Cómo Empezar... - + Software &Manual... Manual del &Software... - + What's &This Qué es &Esto - + P&rivacy policy... Política de P&rivacidad... - + &About Jamulus... &Acerca de Jamulus... - + About &Qt... Acerca de &Qt... - + About Qt Acerca de Qt @@ -2733,12 +2742,12 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CLanguageComboBox - + Restart Required Reinicio Necesario - + Please restart the application for the language change to take effect. Por favor reinicia la aplicación para que el cambio de idioma surta efecto. @@ -2746,22 +2755,22 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Este servidor requiere que aceptes ciertas condiciones antes de unirte. Por favor léelas en la ventana del chat. - + I have read the conditions and &agree. He leído las condiciones y las &acepto. - + Accept Acepto - + Decline No Acepto @@ -2769,17 +2778,17 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CMultiColorLED - + Red Rojo - + Yellow Amarillo - + Green Verde @@ -2787,7 +2796,7 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CMusProfDlg - + No Name Sin Nombre @@ -2795,448 +2804,448 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CServerDlg - + Client List Lista Clientes - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. La lista de clientes muestra todos los clientes actualmente conectados a este servidor. Alguna información sobre los clientes como la dirección IP y el nombre aparecen para cada cliente conectado. - + Connected clients list view Vista lista clientes conectados - + Directory Type combo box Desplegable Tipo de Directorio - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Cuando se escoge un valor distinto a "%1" para el Directorio, esto mostrará si el registro ha tenido éxito. Si el registro fracasa, por favor elige otro directorio. - + When checked, the recorder will run while a session is in progress (if set up correctly). Cuando está activado, la grabadora se ejecutará mientras haya una sesión en marcha (si está bien configurada). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. No se ha establecido un directorio de grabación o el valor no puede utilizarse. Comprueba el valor en la pestaña de Opciones. - + Recording has been switched off by the UI checkbox or JSON-RPC. La grabación se ha desactivado mediante la casilla de la interfaz gráfica o JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. La grabación se ha desactivado, mediante la casilla de la interfaz gráfica, SIGUSR2 o JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Si el directorio de grabaciones no puede utilizarse, se mostrará el problema en lugar del directorio de la sesión. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Pulsa el botón para abrir la ventana que permite seleccionar el directorio principal de grabaciones. El valor escogido debe existir y tener permiso de escritura (permitir la creación de sub-directorios por parte del usuario ejecutando %1). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. El valor actual del directorio principal de grabaciones. El valor escogido debe existir y tener permisos de escritura (permitir la creación de sub-directorios por parte del usuario ejecutando %1). Pulsa el botón para abrir el diálogo que permite seleccionar el directorio principal de grabaciones. - + Custom Directory address Dirección Directorio Personalizado - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. La dirección del Directorio Personalizado es la dirección del directorio que contiene la lista de servidores al cual debe añadirse este servidor. - + Server List Filename dialog push button Botón ventana Nombre Archivo Lista de Servidores - - + + Server List Filename Nombre Archivo Lista de Servidores - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Pulsa el botón para abrir la ventana que permite establecer el nombre del archivo de persistencia para la lista de servidores. El usuario ejecutando %1 debe poder crear el nombre de archivo especificado aunque ya exista (se sobreescribirá al guardar). - + Server List Filename text box (read-only) Caja texto Nombre Archivo Lista de Servidores (solo lectura) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Valor actual del nombre del archivo de persistencia para la lista de servidores. El usuario ejecutando %1 debe poder crear el nombre de archivo especificado aunque ya exista (se sobreescribirá al guardar). Pulsa el botón para abrir la ventana que permite establecer el nombre del archivo de persistencia para la lista de servidores. - + Clear the server list file name button Vaciar el botón del nombre del archivo de lista de servidores - + Clear Server List Filename Vaciar Nombre del Archivo de Lista de Servidores - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Pulsa el botón para vaciar el nombre del archivo de persistencia para la lista de servidores actualmente seleccionado. Esto impedirá la persistencia de la lista de servidores hasta que se seleccione un nuevo valor. - + Start Minimized on Operating System Start Arranca Minimizado al Arrancar Sistema Operativo - + Now a directory Ahora un directorio - + Register Server Status Estado Registro Servidor - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Si se activa el arranque al arrancar el sistema operativo, el servidor arrancará cuando arranque el sistema operativo y se minimizará automáticamente a un icono en la barra de tareas. - + Server Name Nombre Servidor - + The server name identifies your server in the connect dialog server list at the clients. El nombre del servidor identifica a tu servidor en la lista de conexión de servidores de los clientes. - + Server name line edit Nombre del servidor - + Location City Ubicación Ciudad - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. Aquí se puede especificar la ciudad en donde se ubica el servidor. Si se introduce una ciudad, se mostrará en la lista de conexión de servidores de los clientes. - + City where the server is located line edit Ciudad en donde se encuentra en servidor - + Country/Region País/Región - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Establece el país o la región donde se ejecuta el servidor. Los clientes mostrarán esta ubicación en la lista de servidores de su ventana de conexión. - + Combo box for location of this server Campo para la ubicación de este servidor - + Display dialog to select recording directory button Mostrar diálogo para seleccionar botón de directorio de grabación - - + + Main Recording Directory Directorio Principal de Grabación - + Main recording directory text box (read-only) Caja de texto del directorio principal de grabación (solo lectura) - + Clear the recording directory button Vaciar botón de directorio de grabación - + Clear Recording Directory Vaciar Directorio de Grabación - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Pulsa el botón para vaciar el directorio de grabación actualmente seleccionado. Esto impedirá la grabación hasta que se seleccione un nuevo valor. - + Checkbox to turn on or off server recording Campo para activar/desactivar la grabación desde el servidor - + Jam Recorder Grabación de Jams - + Current session directory text box (read-only) Campo para directorio sesión actual (solo lectura) - + Current Session Directory Directorio Sesión Actual - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Habilitado durante la grabación y guarda el directorio actual de grabación, Deshabilitado tras la grabación o cuando la grabación no está habilitada. - + Recorder status label Etiqueta estado grabación - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Directorio:</b> Selecciona '%1' para no registrar tu servidor con un directorio.<br>O selecciona uno de los géneros para registrarlo con ese directorio.<br>O selecciona '%2' y especifica una dirección de Directorio Personalizada en la pestaña de Opciones para registrarlo con un directorio personalizado.<br><br>Para cualquier valor excepto '%1', este servidor se registra con un directorio para que un usuario de %3 pueda escoger este servidor de la lista de servidores en la ventana de conexión del cliente, donde escoge ese directorio.<br><br>El registro del servidor se renueva periódicamente para asegurarse de que todos los servidores de la lista de servidores en la ventana de conexión realmente están disponibles. - + Recorder Status Estado Grabación - + Displays the current status of the recorder. The following values are possible: Muestra el estado actual de la grabación. Son posibles los siguientes valores: - + There is no one connected to the server to record. No hay nadie conectado al servidor para grabar. - + The performers are being recorded to the specified session directory. Los intérpretes están siendo grabados al directorio de sesión especificado. - + NOTE NOTA - + Server welcome message edit box Campo edición mensaje bienvenida servidor - + Server Welcome Message Mensaje Bienvenida Servidor - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Se muestra un mensaje de bienvenida al servidor cuando un músico entra al mismo. Si no se escribe ningún mensaje, la bienvenida se deshabilita. - + Language Idioma - + Select the language to be used for the user interface. Selecciona el idioma a utilizar para el interfaz de usuario. - + Language combo box Campo Idioma - + Custom Directory line edit Edición de línea de Directorio Personalizado - + &Hide %1 server &Ocultar servidor %1 - + &Show %1 server Mo&strar servidor %1 - + %1 server %1 is the name of the main application %1 servidor - + Type a message here. If no message is set, the server welcome is disabled. Escribe un mensaje aquí. Si se deja vacío, el mensaje de bienvenida del servidor se deshabilita. - + %1 Server %1 is the name of the main application %1 Servidor - + Recorder failed to start. Please check available disk space and permissions and try again. Error: La grabadora no pudo iniciarse. Por favor comprueba el espacio en disco y los permisos y prueba de nuevo. Error: - + ERROR ERROR - + Request new recording button Botón Solicitar nueva grabación - + New Recording Nueva Grabación - + During a recording session, the button can be used to start a new recording. Durante una sesión de grabación, el botón puede utilizarse para comenzar una nueva grabación. - - + + E&xit &Salir - + Select Main Recording Directory Seleccionar Directorio Principal de Grabación - + Recording Grabando - + Not recording No grabando - + Not initialised No inicializado - + Not enabled No habilitado - + &Window &Ventana - + None Ninguno - + Not registered No registrado - + Bad address Dirección no válida - + Registration requested Registro solicitado - + Registration failed Error de registro - + Check server version Comprueba la versión del servidor - + Registered Registrado - + Server list full at directory Lista de Servidores llena en el Directorio - + Your server version is too old La versión de tu servidor es demasiado antigua - + Requirements not fulfilled No se cumplen los requisitos - + Unknown value %1 Valor desconocido %1 @@ -3360,32 +3369,32 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CServerListManager - + Now a directory Ahora un Directorio - + No longer a directory Ya no es un Directorio - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). No se ha podido abrir '%1' para lectura/escritura. Por favor, comprueba que %2 tiene permiso (y que hay espacio libre). - + Loading persistent server list file: %1 Cargando archivo de lista de Servidores persistentes: %1 - + Could not write to '%1' No se pudo escribir a '%1' - + Saving registration for %1 (%2): %3 Guardando registro para %1 (%2): %3 @@ -3393,68 +3402,68 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CSound - + The selected audio device is no longer present in the system. Please check your audio device. El dispositivo seleccionado ya no está presente en el sistema. Por favor comprueba tu dispositivo de audio. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. No se pudo inicializar el driver de audio. Comprueba que tu hardware de audio esté conectado y verifica la configuración del driver. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. El dispositivo de audio seleccionado es incompatible ya que no soporta una tasa de muestreo de %1 Hz. Por favor selecciona otro dispositivo. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. La configuración actual del dispositivo de audio es incompatible porque no se pudo establecer la tasa de muestreo en %2 Hz. Por favor comprueba si hay un interruptor físico o un ajuste del driver para establecer la tasa de muestreo manualmente y reinicia %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. El dispositivo de audio seleccionado es incompatible ya que no soporta %1 canales de entrada/salida. Por favor selecciona otro dispositivo u otra configuración. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. El dispositivo de audio seleccionado es incompatible ya que el formato requerido de muestreo de audio no está disponible. Por favor utiliza otro dispositivo. - + No ASIO audio device driver found. No se ha encontrado un dispositivo de audio ASIO. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Por favor instala un driver ASIO antes de ejecutar %1. Si tienes un dispositivo con soporte ASIO, instala su driver ASIO oficial. Si no, tendrás que instalar un driver universal como ASIO4ALL. - + Error requesting stream stop: $s Error petición parada transmisión: $s - + Error closing stream: $s Error cerrando transmisión: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK no pudo iniciarse automáticamente. Por favor arranca JACK manualmente y comprueba si hay mensajes de error. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK no está utilizando una tasa de muestreo de <b>%1 Hz</b>. Por favor utiliza una herramienta como <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> para establecer la tasa de muestreo de JACK en %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. El registro de puertos de JACK falló. Probablemente sea un error en JACK. Por favor detén %1 y JACK. Después, comprueba si otro programa con una tasa de muestreo de %2 Hz puede conectarse a JACK. @@ -3463,62 +3472,62 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue El registro de puertos de JACK falló. Probablemente sea un error en JACK. Por favor detén %1 y JACK. Después, comprueba si otro programa MIDI puede conectarse a JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. No se pudo activar el cliente de JACK. Probablemente sea un error en JACK. Por favor comprueba la salida de JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK se cerró. %1 requiere que se ejecute JACK. Por favor reinicia %1 para arrancar JACK de nuevo. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. No hay ninguna tarjeta de sonido disponible en tu sistema. Falló CoreAudio input AudioHardwareGetProperty. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. No hay ninguna tarjeta de sonido disponible en el sistema. Falló CoreAudio output AudioHardwareGetProperty. - + The currently selected audio device is no longer present. Please check your audio device. El dispositivo de audio seleccionado actualmente ya no está presente. Por favor comprueba tu dispositivo de audio. - + The audio input device is no longer available. Please check if your input device is connected correctly. El dispositivo de entrada de audio ya no está disponible. Por favor comprueba que tu dispositivo de entrada está conectado correctamente. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La tasa de muestreo en el dispositivo actual de entrada no es de %1 Hz y por tanto es incompatible. Por favor selecciona otro dispositivo o intenta establecer la tasa de muestro en %1 Hz manualmente a través de la Configuración de Audio-MIDI (en Aplicaciones->Utilidades). - + The audio output device is no longer available. Please check if your output device is connected correctly. El dispositivo de salida de audio ya no está disponible. Por favor comprueba que tu dispositivo de salida está conectado correctamente. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La tasa de muestreo en el dispositivo actual de salida no es de %1 Hz y por tanto es incompatible. Por favor selecciona otro dispositivo o intenta establecer la tasa de muestro en %1 Hz manualmente a través de la Configuración de Audio-MIDI (en Aplicaciones->Utilidades). - + The stream format on the current input device isn't compatible with this software. Please select another device. El formato de transmisión del dispositivo actual de entrada es incompatible con este software. Por favor selecciona otro dispositivo. - + The stream format on the current output device isn't compatible with %1. Please select another device. El formato de transmisión del dispositivo actual de salida es incompatible con %1. Por favor selecciona otro dispositivo. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Los tamaños de buffer de entrada y salida de audio del dispositivo actual no se pueden establecer en un valor común. Por favor selecciona otros dispositivos de entrada/salida en tu configuración de sistema. @@ -3526,27 +3535,27 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. No se puede utilizar el dispositivo de audio seleccionado por el siguiente error: %1 Se seleccionará el driver anterior. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. El dispositivo de audio seleccionado anteriormente ya no está disponible o el driver ha cambiado a un estado incompatible. Intentaremos encontrar un dispositivo de audio válido, pero este nuevo dispositivo puede ocasionar retroalimentación. Antes de conectarte a un servidor, por favor comprueba la configuración del dispositivo de audio. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 no pudo encontrar un dispositivo de audio %2.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Quizá puedas arreglar errores en la configuración del driver. ¿Quieres abrir la configuración ahora? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. No se puede iniciar %1. Por favor reinicia %1 y comprueba/vuelve a configurar tus ajustes de audio. @@ -3554,53 +3563,57 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Versión %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Publicado bajo la GNU General Public License versión 2 o posterior (GPLv2) + Publicado bajo la GNU General Public License versión 2 o posterior (GPLv2) - + This app uses the following libraries, resources or code snippets: Esta aplicación utiliza las siguientes librerías, recursos o fragmentos de código: - + Qt cross-platform application framework Marco de la aplicación multiplataforma Qt - + (build) (versión) - + (runtime) (tiempo de ejecución) - + Some pixmaps are from the %1 Algunos pixmaps son de la %1 - + Some sound samples are from %1 Algunas muestras de audio son de la %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberación de audio de Perry R. Cook y Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Iconos de banderas de Mark James @@ -3608,12 +3621,12 @@ Hemos silenciado tu canal y activado 'Silenciarme Yo'. Por favor resue global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Hay una actualización de %1 disponible: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>ir a detalles y descargas</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Para más información utiliza "¿Qué es Esto?" (menú de ayuda, botón derecho del ratón o Shift+F1) diff --git a/src/translation/translation_fr_FR.ts b/src/translation/translation_fr_FR.ts index b47d763a2f..744c108c0d 100644 --- a/src/translation/translation_fr_FR.ts +++ b/src/translation/translation_fr_FR.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Cadriciel d'application multiplateforme Qt - + (build) (construction) - + (runtime) (exécution) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Code de réverbération audio par Perry R. Cook et Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Cette application permet aux musiciens de faire des bœufs en temps réel sur internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Il y a un serveur qui collecte les données audio de chaque client, les mixe et renvoie le résultat à chaque client. - + This app uses the following libraries, resources or code snippets: Cette application utilise les bibliothèques, ressources ou extraits de code suivants : - + Flag icons by Mark James Icônes de drapeaux par Mark James - + Some pixmaps are from the %1 Certaines images proviennent de %1 - + Some sound samples are from %1 Certains échantillons sonores proviennent de %1 - + For details on the contributions check out the %1 Pour plus de détails sur les contributions, consultez le site %1 - + Github Contributors list Liste de contributeurs sur GitHub - + Spanish Espagnol - + French Français - + Portuguese Portugais - + Dutch Néerlandais - + Italian Italien - + German Allemand - + Polish Polonais - + Swedish Suédois - + Korean Coréen - + Slovak Slovaque - + Simplified Chinese Chinois simplifié - + Norwegian Bokmål Norvégien Bokmål - + Japanese Japonais - + About %1 À propos de %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Console d'analyse - + Error Rate of Each Buffer Size Taux d'erreur de chaque taille de tampon @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Mixage personnel sur le serveur - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Lorsque vous êtes connecté à un serveur, ces contrôles vous permettent de régler votre mixage local sans affecter ce que les autres entendent de vous. Le titre indique le nom du serveur et, lorsque c'est le cas, s'il est en train d'enregistrer. - + Server Serveur - + T R Y I N G T O C O N N E C T T E N T A T I V E D E C O N N E X I O N - + RECORDING ACTIVE ENREGISTREMENT ACTIF - + Personal Mix at: %1 Mixage personnel à : %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level Niveau de canal - + Input level of the current audio channel at the server Niveau d'entrée du canal audio actuel sur le serveur - + Mixer Fader Chariot du mixeur - + Local mix level setting of the current audio channel at the server Réglage du niveau de mixage local du canal audio actuel sur le serveur - + Status Indicator Indicateur d'état - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Affiche une indication sur l'état du client qui est affecté à ce canal. Les indicateurs pris en charge sont : - + Status indicator label Étiquette d'indicateur d'état - + Panning Panoramique - + Local panning position of the current audio channel at the server Position panoramique locale du canal audio actuel sur le serveur - + With the Mute checkbox, the audio channel can be muted. En cochant la case Me silencer, le canal audio peut être mis en sourdine. - + Mute button Bouton de sourdine - + Solo button Bouton de solo - + Fader Tag Étiquette de chariot - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. L'étiquette de chariot identifie le client connecté. Votre nom, une image de votre instrument et le drapeau de votre emplacement peuvent être définis dans la fenêtre principale. - + Mixer channel country/region flag Drapeau de pays/région du canal de mixage - + Grp Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Affiche le niveau audio pré-chariot de ce canal. Tous les clients connectés au serveur se verront attribuer un niveau audio, la même valeur pour chaque client. - + &No grouping &Pas de regroupement - + Assign to group Affecter au groupe - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Ajuste le niveau audio de ce canal. Tous les clients connectés au serveur se verront attribuer un chariot audio, affiché sur chaque client, pour ajuster le mixage local. - + Speaker with cancellation stroke: Indicates that another client has muted you. Haut-parleur barré : indique qu'un autre client vous a mis en sourdine. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Règle le panoramique de gauche à droite du canal. Fonctionne uniquement en mode stéréo ou de préférence en mode entrée mono/sortie stéréo. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. En cochant la case Solo, le canal audio peut être réglé sur solo, ce qui signifie que tous les canaux qui ne sont pas cochés, sont en sourdine. Il est possible de mettre plus d'un canal en solo. - + Group Groupe - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Avec la case à cocher Grp, un groupe de canaux audio peut être défini. Tous les chariots de canaux d'un groupe sont déplacés en synchronisation proportionnelle si l'un des chariots du groupe est déplacé. - + Group button Bouton de groupe - + Mixer channel instrument picture Image d'instrument du canal de mixeur - + Mixer channel label (fader tag) Label de canal de mixeur (étiquette de chariot) - + PAN PAN - + MUTE MUET - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Pseudo/nom - + Instrument Instrument - + Location Localisation - - - + + + Skill Level Niveau de compétence - + Alias Alias - + Beginner Débutant - + Intermediate Intermédiaire - + Expert Expert - + Musician Profile Profil de musicien - - - + + + Mute Muet - - - + + + Pan Pan - - - + + + Solo Solo @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Fenêtre de tchate - + The chat window shows a history of all chat messages. La fenêtre de tchate affiche un historique de tous les messages du tchate. - + Chat history Historique du tchate - + Input Message Text Saisie du texte du message - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Saisissez le texte du message de tchate dans la zone d'édition et appuyez sur la touche Entrée pour envoyer le message au serveur qui le distribue à tous les clients connectés. Votre message apparaîtra alors dans la fenêtre de tchate. - + New chat text edit box Nouvelle boîte d'édition de texte de tchate - + Type a message here Saisissez un message ici - + &Edit Modifi&er - + Cl&ear Chat History &Effacer l'historique du tchate - - + + &Close &Fermer - + Do you want to open the link '%1' in your browser? Souhaitez-vous ouvrir le lien '%1' dans votre navigateur ? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter Indicateur de niveau d'entrée - + Make sure not to clip the input signal to avoid distortions of the audio signal. Veillez à ne pas écrêter le signal d'entrée afin d'éviter les distorsions du signal audio. - + Input level meter Indicateur de niveau d'entrée - + Simulates an analog LED level meter. Simule un indicateur de niveau analogique à diode. - + Connect/Disconnect Button Bouton connecter/déconnecter - + Connect and disconnect toggle button Bouton-bascule de connexion/déconnexion - + This shows the level of the two stereo channels for your audio input. Ceci indique le niveau des deux canaux stéréo pour votre entrée audio. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Si l'application est connectée à un serveur et que vous jouez de votre instrument/chantez dans le microphone, le VU-mètre devrait clignoter. Si ce n'est pas le cas, vous avez probablement sélectionné le mauvais canal d'entrée (par exemple 'entrée ligne' au lieu de l'entrée microphone) ou réglé le gain d'entrée trop bas dans le mélangeur audio (Windows). - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Pour une bonne utilisation de l'application, vous ne devriez pas entendre votre chant/instrument par le haut-parleur ou votre casque lorsque le logiciel n'est pas connecté. Ceci peut être réalisé en coupant votre canal audio d'entrée dans le mixeur de lecture (pas dans le mixeur d'enregistrement !). - + Reverb effect Effet de réverbération - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. La réverbération peut être appliquée à un canal audio mono local ou aux deux canaux en mode stéréo. La sélection du canal mono et le niveau de réverbération peuvent être modifiés. Par exemple, si un signal de microphone est envoyé sur le canal audio droit de la carte son et qu'un effet de réverbération doit être appliqué, réglez le sélecteur de canal à droite et déplacez le chariot vers le haut jusqu'à ce que le niveau de réverbération souhaité soit atteint. - + Reverb effect level setting Réglage du niveau de l'effet de réverbération - + Reverb Channel Selection Sélection du canal de réverbération - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Ces boutons radio permettent de choisir le canal d'entrée audio sur lequel l'effet de réverbération est appliqué. Il est possible de sélectionner le canal d'entrée gauche ou le droit. - + Left channel selection for reverb Sélection du canal gauche pour la réverbération - + Right channel selection for reverb Sélection du canal droit pour la réverbération - + Green Vert - + The delay is perfect for a jam session. Ce délai est parfait pour une séance de bœufs. - + Yellow Jaune - + Red Rouge - + If this LED indicator turns red, you will not have much fun using %1. Si ce témoin lumineux devient rouge, ça ne sera pas génial d'utiliser %1. - + Delay status LED indicator Indicateur diode lumineuse d'état de délai - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Ouvre une fenêtre dans laquelle vous pouvez sélectionner un serveur auquel vous connecter. Si vous êtes connecté, appuyer sur ce bouton mettra fin à la session. - + Shows the current audio delay status: Affiche l'état actuel du délai audio : - + A session is still possible but it may be harder to play. Une session est toujours possible mais il sera probablement plus difficile de jouer. - + The delay is too large for jamming. Le délai est trop important pour bœuffer. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Le délai du tampon de la carte son (taille du tampon) est trop petit (voir la fenêtre des paramètres). - + The upload or download stream rate is too high for your internet bandwidth. Le taux de flux montant ou descendant est trop élevé pour votre bande passante internet. - - + + C&onnect Se c&onnecter - + &File &Fichier - + &View Afficha&ge - + &Connection Setup... &Paramètres de connexion... - + My &Profile... Mon &profil... - + C&hat... Tc&hate... - + &Analyzer Console... Console d'&analyse... - + Clear &All Stored Solo and Mute Settings Eff&acer tous les paramètres solo et muet enregistrés - + %1 Directory Répertoire de %1 - + Ok Ok - + E&xit &Quitter - + &Edit Modifi&er - + Delay Status LED Voyant d'état du délai - + The network jitter buffer is not large enough for the current network/audio interface jitter. Le tampon de gigue réseau n'est pas assez grand pour la gigue actuelle de l'interface réseau/audio. - + The CPU of the client or server is at 100%. Le processeur du client ou du serveur est à 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Le temps de ping est le temps nécessaire au flux audio pour aller du client au serveur et revenir. Ce délai est induit par le réseau et doit être d'environ 20 à 30 ms. Si ce délai est supérieur à environ 50 ms, la distance qui vous sépare du serveur est trop importante ou votre connexion internet est insuffisante. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Le délai global est calculé à partir du temps de ping actuel et du délai introduit par les paramètres actuels du tampon. - + &Load Mixer Channels Setup... &Charger une configuration de canaux de mixage... - + &Save Mixer Channels Setup... &Sauvegarder la configuration de canaux de mixage... - + Sort Users by Chann&el Tri&er les utilisateurs par canal - + Sett&ings &Paramètres - + Audio/Network &Settings... Paramètre&s audio/réseau... - + A&dvanced Settings... Paramètres &avancés... - + N&o User Sorting Pas de &tri des utilisateurs - + O&wn Fader First &Chariot personnel en premier - + Sort Users by &Name Trier les utilisateurs par &nom - + Sort Users by &Instrument Trier les utilisateurs par &instrument - + Sort Users by &Group Trier les utilisateurs par &groupe - + Sort Users by &City Trier les utilisateurs par &ville - + Set All Faders to New Client &Level Régler tous &les chariots sur le niveau d'un nouveau client - + Local Jitter Buffer Status LED Voyant d'état du tampon de gigue local - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Le voyant d'état du tampon de gigue local indique l'état actuel du flux audio/de la diffusion. Si le voyant est rouge, le flux audio est interrompu. Cela est dû à l'un des problèmes suivants : - + If this LED indicator turns red, the audio stream is interrupted. Si ce voyant devient rouge, le flux audio est interrompu. - + Local Jitter Buffer status LED indicator Voyant d'état du tampon de gigue local - + Current Connection Status État de la connexion actuelle - + Auto-Adjust all &Faders Auto-ajuster tous les &chariots - + &MIDI Control Settings... Paramètres de contrôle &MIDI... - - + + Select Channel Setup File Sélectionnez le fichier de configuration des canaux - + user utilisateur - + users utilisateurs - + Connect Se connecter - + Settings Paramètres - + Chat Tchate - + Enable feedback detection Activer la détection de larsen - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Nous avons coupé votre canal et activé "Me silencer". Veuillez d'abord résoudre le problème de larsen et rétablir votre son après. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Votre carte son ne fonctionne pas correctement. Veuillez ouvrir la fenêtre paramètres et vérifier la sélection du périphérique et les paramètres du pilote. - + &Disconnect &Déconnecter @@ -1017,1098 +1017,1107 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CClientSettingsDlg - + Jitter Buffer Size Taille du tampon de gigue - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Le réglage du tampon de gigue est donc un compromis entre la qualité audio et le délai global. - + Local jitter buffer slider control Chariot de contrôle du tampon de la gigue locale - + Server jitter buffer slider control Chariot de contrôle du tampon de la gigue du serveur - + Auto jitter buffer check box Case à cocher pour le tampon de gigue automatique - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Si le pilote est sélectionné pendant une connexion active, la connexion est interrompue, le pilote est modifié et la connexion est automatiquement relancée. - + Sound card device selector combo box Choix déroulant de sélecteur de périphérique de carte son - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Si le pilote ASIO4ALL est utilisé, veuillez noter que ce pilote introduit généralement environ 10 à 30 ms de latence audio supplémentaire. Il est donc recommandé d'utiliser une carte son avec un pilote ASIO natif. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Si vous utilisez le pilote ASIO kX, assurez-vous de connecter les entrées ASIO dans le panneau de configuration DSP kX. - + Sound Card Channel Mapping Correspondance des canaux de la carte son - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Si le périphérique de carte son sélectionnée offre plus d'un canal d'entrée ou de sortie, les paramètres de correspondance des canaux d'entrées et de sorties sont visibles. - + Left input channel selection combo box Choix déroulant de sélection de canal d'entrée gauche - + Right input channel selection combo box Choix déroulant de sélection de canal d'entrée droite - + Left output channel selection combo box Choix déroulant de sélection de canal de sortie gauche - + Right output channel selection combo box Choix déroulant de sélection de canal de sortie droite - + Small Network Buffers Petits tampons de réseau - + Small network buffers check box Case-à-cocher pour les petits tampons de réseau - + Sound Card Buffer Delay Délai du tampon de la carte son - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Le paramètre de délai de tampon est un paramètre fondamental de %1. Ce paramètre a une influence sur de nombreuses propriétés de la connexion. - + The buffer setting is therefore a trade-off between audio quality and overall delay. Le réglage du tampon est donc un compromis entre la qualité audio et le délai global. - + ASIO Device Settings push button Bouton-poussoir des paramètres du périphérique ASIO - + Sound card driver settings Paramètres du pilote de la carte son - + 64 samples setting radio button Bouton de paramétrage à 64 échantillons - + 128 samples setting radio button Bouton de paramétrage à 128 échantillons - + 256 samples setting radio button Bouton de paramétrage à 256 échantillons - + Audio Channels Canaux audio - + Audio channels combo box Choix déroulant de canaux audio - + Audio Quality Qualité audio - + Audio quality combo box Choix déroulant de qualité audio - + New Client Level Niveau de nouveau client - + New client level edit box Boîte d'édition du niveau des nouveaux clients - - + + Mono Mono - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. mode augmentera le débit de données de votre flux. Assurez-vous que votre taux montant ne dépasse pas la vitesse d'envoi disponible de votre connexion internet. - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Si vous devez ajouter des annuaires supplémentaires à la liste déroulante des annuaires de la boîte de dialogue Connecter, vous pouvez saisir les adresses ici.<br> - + Mono-in/Stereo-out Entrée-mono/sortie-stéréo - - - + + + Stereo Stéréo - - - + + + &Close &Fermer - + Local Audio Input Fader Chariot d'entrée audio locale - - + + L G - + Local audio input fader (left/right) Chariot d'entrée audio locale (gauche/droite) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Le tampon de gigue compense les gigues de synchronisation du réseau et de la carte son. La taille du tampon influence donc la qualité du flux audio (le nombre de désynchronisations ayant lieu) et le délai global (plus le tampon est grand, plus le délai est important). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Vous pouvez définir manuellement la taille du tampon de gigue pour le client local et le serveur distant. Pour le tampon de gigue locale, les désynchronisations dans le flux audio sont indiquées par le voyant situé sous les chariots de taille du tampon de gigue. Si le voyant devient rouge, un dépassement ou une sous-utilisation du tampon a eu lieu et le flux audio a été interrompu. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Si le paramètre Auto est activé, les tampons de gigue du client local et du serveur distant sont automatiquement réglés en fonction des mesures de la gigue de synchronisation du réseau et de la carte son. Si Auto est activé, les chariots de la taille de tampon de gigue sont désactivés (ils ne peuvent pas être déplacés avec la souris). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Si le paramètre Auto est activé, les tampons réseau du client local et du serveur distant sont réglés sur une valeur prudente pour minimiser la probabilité d'interruption de l'audio. Pour régler le délai/latence audio, il est recommander de désactiver le paramètre Auto et de réduire la taille du tampon de gigue manuellement en utilisant les curseurs jusqu'à ce que le nombre d'interruptions soit acceptable. La diode lumineuse affichera les désynchronisations audio du tampon de gigue local avec un voyant rouge. - + 128 samples: Should work for most available sound cards. 128 échantillons : devrait fonctionner pour la plupart des cartes son disponibles. - + Skin Thème graphique - + Select the skin to be used for the main window. Sélectionnez le thème graphique à utiliser pour la fenêtre principale. - + Skin combo box Choix déroulant de thème graphique - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Sélectionnez le style d'indicateur à utiliser pour les indicateurs de niveaux. Les options barres (étroites) et diodes lumineuses (rondes, petites) ne s'appliquent qu'à la table de mixage. Lorsque l'option Barre (étroite) est sélectionnée, les indicateurs d'entrées sont réglés sur barres (larges). Lorsque l'option diodes lumineuses (rondes, petites) est sélectionnée, les indicateurs d'entrées sont réglés sur diodes lumineuses (rondes, grandes). Les autres options s'appliquent à la table de mixage et aux indicateurs d'entrées. - + Language Langue - + Select the language to be used for the user interface. Sélectionnez la langue à utiliser pour l'interface utilisateur. - + Language combo box Choix déroulant de la langue - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Sélectionne le nombre de canaux audio à utiliser pour la communication entre le client et le serveur. Trois modes sont disponibles : - + These modes use one and two audio channels respectively. Ces modes utilisent respectivement un et deux canaux audio. - + Mono in/Stereo-out Entrée mono/sortie stéréo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Le signal audio envoyé au serveur est mono mais le signal de retour est stéréo. Ceci est utile si la carte son a l'instrument sur un canal d'entrée et le microphone sur l'autre. Dans ce cas, les deux signaux d'entrée peuvent être mélangés sur un canal mono mais le mixage du serveur est entendu en stéréo. - + Enabling Activation - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. En mode de flux stéréo, aucune sélection de canal audio pour l'effet de réverbération ne sera disponible dans la fenêtre principale puisque l'effet est appliqué aux deux canaux dans ce cas. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Plus la qualité audio est élevée, plus le débit de données de votre flux audio est élevé. Assurez-vous que votre débit montant ne dépasse pas la bande passante disponible de votre connexion internet. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Ce paramètre définit le niveau du chariot d'un client nouvellement connecté en pourcentage. Si un nouveau client se connecte au serveur actuel, il obtiendra le niveau de chariot initial spécifié si aucun autre niveau de chariot provenant d'une connexion précédente de ce client n'a déjà été enregistré. - + Input Boost Amplification de l'entrée - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Ce paramètre vous permet d'augmenter le niveau de votre signal d'entrée par des facteurs allant jusqu'à 10 (+20dB). Si votre son est trop faible, essayez d'abord d'augmenter le niveau en vous rapprochant du microphone, en réglant votre matériel audio ou en augmentant les niveaux dans les paramètres d'entrée de votre système d'exploitation. Si cela échoue, paramétrez un facteur ici. Si votre son est trop fort, s'il est déformé et s'il y a de l'écrêtage, cette option ne vous aidera pas. Ne l'utilisez pas. La distorsion sera toujours présente. Diminuez plutôt votre niveau d'entrée en vous éloignant de votre microphone, en réglant votre matériel audio ou en abaissant le niveau dans les paramètres d'entrée de votre système d'exploitation. - + Input Boost combo box Choix déroulant d'amplification de l'entrée - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Pour chaque canal d'entrée/sortie %1 (canal gauche et droit), un canal réel différent de la carte son peut être sélectionné. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Active la prise en charge de très petits paquets audio réseau. Ces paquets réseau ne sont réellement utilisés que si le délai du tampon de la carte son est inférieur à %1 échantillons. Plus les tampons réseau sont petits, plus la latence audio est faible. Mais en même temps, la charge du réseau et la probabilité de pertes audio ou d'artefacts sonores augmentent. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Contrôle les niveaux relatifs des canaux audio locaux gauche et droit. Pour un signal mono, il agit comme un panoramique entre les deux canaux. Par exemple, si un microphone est connecté au canal d'entrée droit et qu'un instrument est connecté au canal d'entrée gauche et est beaucoup plus fort que le microphone, déplacez le chariot audio dans une direction où l'étiquette au-dessus du chariot indique %1, où %2 est l'indicateur d'atténuation actuel. - + Audio Device Périphérique audio - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Sous le système d'exploitation Windows, le pilote ASIO (carte son) peut être sélectionné à l'aide de %1. Si le pilote ASIO sélectionné n'est pas valide, un message d'erreur s'affiche et le pilote valide précédent est sélectionné. Sous macOS, le matériel d'entrée et de sortie peut être sélectionné. - + Three buffer sizes can be selected Trois tailles de tampon peuvent être sélectionnées - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 échantillons : fournit la latence la plus faible mais ne fonctionne pas avec toutes les cartes son. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 échantillons : devrait être utilisé uniquement si le réglage 64 ou 128 échantillons provoque des dysfonctionnements. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Certains pilotes de carte son ne permettent pas de modifier le délai de la mémoire tampon depuis %1. Dans ce cas, le réglage de délai de tampon est désactivé et doit être modifié à l'aide du pilote de la carte son. Utilisez l'outil approprié pour l'interface utilisée afin de régler la taille du tampon. Par exemple, si vous utilisez ASIO, utilisez le bouton "Paramètres du périphérique ASIO" pour ouvrir le panneau des paramètres du pilote ou si vous utilisez JACK, utilisez un outil tel que QjackCtl pour ajuster la taille du tampon. D'autres interfaces, telles que PipeWire, nécessitent l'utilisation de leur propre outil. Veuillez vous référer au manuel de l'interface. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Si aucune taille de tampon n'est sélectionnée et que tous les paramètres sont désactivés, cela signifie que la taille de tampon utilisée par le pilote ne correspond pas aux valeurs. %1 fonctionnera toujours avec ce paramètre, mais ses performances seront peut-être limitées. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Le délai réel du tampon a une influence sur la connexion, le débit de téléversement actuel et le délai global. Plus la taille du tampon est faible, plus la probabilité d'un voyant rouge dans l'indicateur d'état (désynchronisation) est élevée, plus le débit de téléversement est élevé et plus le délai global est faible. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Cela ouvre les paramètres du pilote de votre carte son. Certains pilotes vous permettent de modifier les paramètres du tampon, d'autres comme ASIO4ALL vous permettent de choisir les entrées ou les sorties de votre ou vos périphériques. Vous trouverez de plus amples informations sur jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Ouvre les paramètres du pilote. Remarque : %1 ne prend actuellement en charge que les périphériques dont la fréquence d'échantillonnage est de %2 Hz. Vous ne pourrez pas sélectionner un pilote/périphérique qui ne le fait pas. Pour plus d'aide, consultez jamulus.io. - + Meter Style Style d'indicateur - + Meter Style combo box Choix déroulant de style d'indicateur - + and et - + Custom Directories Annuaires personnalisés - + Custom Directories combo box Choix déroulant des annuaires personnalisés - + Delete custom directory button Bouton de suppression de l'annuaire personnalisé - + Delete Custom Directory Supprimer un annuaire personnalisé - + Click the button to delete the currently selected custom directory. Cliquez sur le bouton pour supprimer l'annuaire personnalisé actuellement sélectionné. - + Audio Upstream Rate Débit montant du flux audio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Cela dépend de la taille actuelle des paquets audio et du paramètre de compression. Assurez-vous que le débit en amont n'est pas supérieur à votre vitesse de téléversement sur Internet (vérifiez-le avec un service tel que speedtest.net). - + Number of Mixer Panel Rows Nombre de rangées du panneau de mixeur - + Adjust the number of rows used to arrange the mixer panel. Ajustez le nombre de rangées utilisées pour arranger le panneau du mixeur. - + Number of Mixer Panel Rows spin box Liste de choix du nombre de rangées de panneaux de mixeurs - + Feedback Protection Protection larsen - + Prevents acoustic feedback between microphone and speakers. Protection larsen acoustique entre le microphone et les enceintes. - + Feedback Protection check box Case à cocher protection anti-larsen - + Audio Alerts Alertes audio - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Active une alerte audio lors de la réception d'un message de tchate et lorsqu'un nouveau client rejoint la session. Un deuxième périphérique sonore pourrait être nécessaire pour entendre les alertes. - + Audio Alerts check box Case-à-cocher alertes audio - + Enable/disable MIDI-in port Activer/désactiver le port d'entrée MIDI - + MIDI-in port check box Case à cocher du port d'entrée MIDI - + Pick-up Mode Mode reprise - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Quand cette option est activée, les contrôles MIDI de chariot et de panoramique attendront pour réagir que la position du contrôleur physique rejoigne celle du logiciel. Ceci empêche les changements brusques qui se produiraient quand les contrôleurs physiques ne sont pas synchronisés avec le logiciel. - + Pick-up Mode check box Case à cocher Mode reprise - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Choisir à quel port de sortie MIDI se connecter. Jamulus connectera automatiquement son port d'entrée MIDI au périphérique choisi lorsqu'activé. Vous pouvez aussi utiliser votre gestionnaire de connexions préféré pour modifier manuellement les connexions. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Sélectionner à quelle source MIDI se connecter. Jamulus connectera automatiquement son port d'entrée MIDI au périphérique choisi lorsqu'activé. Vous pouvez aussi utiliser les réglages audio MIDI pour modifier manuellement les connexions. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Choisir le(s) périphérique(s) d'entrée MIDI que Jamulus doit écouter. Sélectionner "Tous les périphériques" pour recevoir du MIDI de tous les périphérique connectés, ou choisissez un périphérique particulier. - + MIDI input device combo box Boîte de sélection du périphérique d'entrée MIDI - + MIDI controller settings Paramètres de contrôleur MIDI - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Il y a un paramètre canal MIDI global (0-16) et deux paramètres pour chaque élément contrôlé : le premier MIDI CC et les CC consécutifs (décompte). Réglez d'abord le canal que vous voulez que Jamulus écoute (0 pour tous les canaux). Puis, pour chaque élément que vous désirez contrôler (chariot de volume, panoramique, solo, sourdine), indiquez le premier CC MIDI (numéro CC de début) et le nombre de CC consécutifs (décompte). Il y a une exception qui ne nécessite pas de définir des numéros CC consécutifs : il s'agit du paramètre "Me mettre en sourdine" qui ne nécessite qu'un seul numéro CC, car il s'applique uniquement à son propre flux audio. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Vous pouvez au choix saisir les valeurs CC MIDI ou utiliser le bouton "Apprendre" : cliquer sur "Apprendre", actionnez le chariot/potard/bouton sur le contrôleur MIDI, et le numéro de CC MIDI sera détecté et sauvegardé. - + MIDI channel combo box Boîte de choix du canal MIDI - + Mute Myself MIDI CC number spin box Boîte de sélection du décalage de CC MIDI d'auto-sourdine - + Fader offset spin box Boîte de sélection du décalage du chariot - + Pan offset spin box Boîte de sélection du décalage de panoramique - + Solo offset spin box Boîte de sélection du décalage de solo - + Mute offset spin box Boîte de sélection du décalage de sourdine - + Mute Myself MIDI learn button Bouton d'apprentissage du auto-sourdine MIDI - + Fader offset MIDI learn button Bouton d'apprentissage MIDI de décalage du chariot - + Pan offset MIDI learn button Bouton d'apprentissage MIDI de décalage du panoramique - + Solo offset MIDI learn button Bouton d'apprentissage MIDI de décalage du solo - + Mute offset MIDI learn button Bouton d'apprentissage du décalage de la sourdine MIDI - + ASIO Device Settings Paramètres du périphérique ASIO - + Low Basse - - + + Normal Normale - + High Haute - + + Max + + + + Fancy Fantaisie - + Compact Compacte - + Bar (narrow) Barres (étroites) - + Bar (wide) Barres (larges) - + LEDs (stripe) Diodes lumineuses (bandes) - + LEDs (round, small) Diodes lumineuses (rondes, petites) - + LEDs (round, big) Diodes lumineuses (rondes, grandes) - - - - + + + + None Aucune - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Inscrivez ici votre nom ou un pseudonyme pour que les autres musiciens avec lesquels vous voulez jouer sachent qui vous êtes. Vous pouvez également ajouter une illustration de l'instrument dont vous jouez et un drapeau du pays ou de la région où vous vous trouvez. Votre ville et votre niveau de compétence sur votre instrument peuvent également être ajoutés. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Ce que vous définissez ici apparaîtra sur votre chariot sur la table de mixage lorsque vous serez connecté à un serveur %1. Cette information sera également affichée sur chaque client connecté au même serveur que vous. - + Country/region flag button Bouton de drapeau de pays/région - - + + Could not open MIDI port Impossible d'ouvrir le port MIDI - + No MIDI devices found. Please connect a MIDI device and try again. Aucun périphérique MIDI trouvé. Merci de connecter un périphérique MIDI et de réessayer. - + Please check your OS configuration. Merci de vérifier la configuration de votre système d'exploitation. - + Center Centre - + R D - + Learn Apprendre - - + + All Devices Tous les périphériques - + No device connected Aucun périphérique connecté - - + + MIDI Device Not Found Périphérique MIDI non trouvé - + The MIDI device "%1" could not be found. Using all available devices instead. Périphérique MIDI "%1" non trouvé. Utilisation de tous les périphériques. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. Périphérique MIDI "%1" actuellement non disponible. Choisissez un autre périphérique dans la liste déroulante pour le connecter. - - + + MIDI Device Connection Failed Échec de connexion au périphérique MIDI - + Could not connect to MIDI device "%1". Please check your OS configuration. Connexion au périphérique MIDI "%1" impossible. Veuillez vérifier la configuration de votre système d'exploitation. - + Could not connect to MIDI device "%1". Please check that the device is available. Connexion au périphérique MIDI "%1" impossible. Veuillez vérifier sa disponibilité. - + Listening... Écoute... - + Custom Personnalisé - + Any Genre 2 Tout genre 2 - Any Genre 3 - Tout genre 3 + Tout genre 3 + + + + Any Genre Asia + - + Genre Rock Genre Rock - + Genre Jazz Genre Jazz - + Genre Classical/Folk Genre classique/folk - + Genre Choral/Barbershop Genre chorale/barbershop - + Any Genre 1 Tout genre 1 - + Musician Profile Profil de musicien - + Alias or name edit box Boîte d'édition de pseudo ou de nom - + Instrument picture button Bouton d'image d'instrument - + City edit box Boîte d'édition de la ville - + Skill level combo box Choix déroulant de niveau de compétence - + Beginner Débutant - + Intermediate Intermédiaire - + Expert Expert - - + + Size: Taille : - + Buffer Delay Retard de temporisation - + Buffer Delay: Retard de temporisation : - + Drum Set Batterie - + Djembe Djembé - + Electric Guitar Guitare électrique - + Acoustic Guitar Guitare acoustique - + Bass Guitar Guitare basse - + Keyboard Clavier - + Synthesizer Synthétiseur - + Grand Piano Piano à queue - + Accordion Accordéon - + Vocal Voix - + Microphone Microphone - + Harmonica Harmonica - + Trumpet Trompette - + Trombone Trombone - + French Horn Cor d'harmonie - + Tuba Tuba - + Saxophone Saxophone - + Clarinet Clarinette - + Flute Flûte - + Violin Violon - + Cello Violoncelle - + Double Bass Contrebasse - + Recorder Enregistreur - + Streamer Diffuseur - + Listener Auditeur - + Guitar+Vocal Guitare+voix - + Keyboard+Vocal Clavier+voix - + Bodhran Bodhran - + Bassoon Basson - + Oboe Hautbois - + Harp Harpe - + Viola Alto - + Congas Congas - + Bongo Bongo - + Vocal Bass Voix basse - + Vocal Tenor Voix ténor - + Vocal Alto Voix alto - + Vocal Soprano Voix soprano - + Banjo Banjo - + Mandolin Mandoline - + Ukulele Ukulélé - + Bass Ukulele Ukulélé basse - + Vocal Baritone Voix baryton - + Vocal Lead Voix principale - + Mountain Dulcimer Dulcimer de montagne - + Scratching Scratch - + Rapping Rap - + Vibraphone Vibraphone - + Conductor Chef d'orchestre @@ -2508,117 +2517,117 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CConnectDlg - + Directory Annuaire - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Affiche les serveurs répertoriés par l'annuaire sélectionné. Vous pouvez ajouter des annuaires personnalisés dans les paramètres avancés. - + Directory combo box Choix déroulant de l'annuaire - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtre la liste des serveurs en fonction du texte donné. Notez que le filtre n'est pas sensible à la casse. Un simple caractère # filtrera les serveurs avec au moins une personne connectée. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Décochez cette case pour réduire la liste des serveurs et n'afficher que les détails du serveur. Cochez cette case pour afficher chaque personne sur les serveurs. - + Server List Liste de serveurs - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. La fenêtre de configuration de la connexion répertorie les serveurs disponibles enregistrés dans l'annuaire sélectionné. Utilisez la liste déroulante Annuaires pour changer d'annuaire, trouvez le serveur que vous voulez rejoindre dans la liste, cliquez dessus, puis cliquez sur le bouton "se connecter" pour vous connecter. Vous pouvez également double-cliquer sur le nom du serveur pour vous connecter. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Les serveurs permanents (ceux qui sont répertoriés depuis plus de 48 heures) sont indiqués en gras. - + You can add custom directories in Advanced Settings. Vous pouvez ajouter des annuaires personnalisés dans paramètres avancés. - + Server list view Vue de la liste de serveurs - + Server Address Adresse du serveur - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Si vous connaissez l'adresse du serveur, vous pouvez vous y connecter à l'aide du champ nom/adresse du serveur. Un numéro de port facultatif peut être ajouté après l'adresse du serveur en utilisant les deux points comme séparateur, par exemple %1. Le champ affichera également une liste des adresses de serveurs les plus récemment utilisées. - + Holds the current server address. It also stores old addresses in the combo box list. Contient l'adresse du serveur actuel. Il stocke également les anciennes adresses dans la liste déroulante. - + Delete server address button Bouton de suppression de l'adresse du serveur - + Delete Server Address Supprimer l'adresse du serveur - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Cliquez sur le bouton pour effacer l'adresse du serveur actuellement sélectionné et la supprimer de la liste des serveurs enregistrés. - + Ping Ping - + Server address edit box Boîte d'édition d'adresse de serveur - + Filter Filtre - + Filter edit box Boite d'édition de filtre - + Show All Musicians Afficher tous les musiciens - + Show all musicians check box Case-à-cocher pour afficher tous les musiciens - + Filter text, or # for occupied servers Texte du filtre, ou # pour les serveurs occupés @@ -2689,43 +2698,43 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CHelpMenu - + &Help &Aide - - + + Getting &Started... &Configuration... - + Software &Manual... &Manuel du logiciel... - + What's &This Qu'est-ce que c'es&t - + P&rivacy policy... Poli&tique de confidentialité... - + &About Jamulus... À &propos de Jamulus... - + About &Qt... À propos de &Qt... - + About Qt À propos de Qt @@ -2733,12 +2742,12 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CLanguageComboBox - + Restart Required Redémarrage nécessaire - + Please restart the application for the language change to take effect. Veuillez relancer l'application pour que le changement de langue soit pris en compte. @@ -2746,22 +2755,22 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Ce serveur exige que vous acceptiez des conditions avant de pouvoir le rejoindre. Veuillez les lire dans la fenêtre de tchate. - + I have read the conditions and &agree. J'ai lu les conditions et les &accepte. - + Accept Accepter - + Decline Décliner @@ -2769,17 +2778,17 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CMultiColorLED - + Red Rouge - + Yellow Jaune - + Green Vert @@ -2787,7 +2796,7 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CMusProfDlg - + No Name Sans nom @@ -2795,448 +2804,448 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CServerDlg - + Client List Liste des clients - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. La liste des clients affiche tous les clients qui sont actuellement connectés à ce serveur. Certaines informations à propos des clients, telles que les adresses IP et le nom, sont données pour chaque client connecté. - + Connected clients list view Vue de la liste des clients connectés - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Annuaire :</b> sélectionnez '%1' pour ne pas enregistrer votre serveur avec un annuaire.<br>Ou sélectionnez l'un des genres pour vous enregistrer avec cet annuaire.<br>Ou sélectionnez '%2' et spécifiez une adresse d'annuaire personnalisé dans l'onglet Options pour vous enregistrer avec un annuaire personnalisé.<br><br>Pour toute valeur sauf '%1', ce serveur s'enregistre auprès d'un annuaire afin qu'un utilisateur %3 puisse sélectionner ce serveur dans la liste des serveurs du dialogue de connexion du client lorsqu'il choisit cet annuaire.<br><br>L'enregistrement du serveur est renouvelé périodiquement pour s'assurer que tous les serveurs de la liste des serveurs du dialogue de connexion sont réellement disponibles. - + When checked, the recorder will run while a session is in progress (if set up correctly). Si cette case est cochée, l'enregistreur fonctionnera pendant qu'une session est en cours (si la configuration est correcte). - + Recording has been switched off by the UI checkbox or JSON-RPC. L'enregistrement a été désactivé par la case à cocher de l'interface utilisateur ou par JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. L'enregistrement a été désactivé par la case à cocher de l'interface utilisateur, SIGUSR2 ou JSON-RPC. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Cliquez sur le bouton pour ouvrir la boîte de dialogue qui permet de sélectionner le répertoire principal d'enregistrement. La valeur choisie doit exister et être accessible en écriture (permettre la création de sous-répertoires par l'utilisateur sous lequel %1 est exécuté). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. La valeur actuelle du répertoire principal d'enregistrement. La valeur choisie doit exister et être accessible en écriture (permettre la création de sous-répertoires par l'utilisateur sous lequel %1 est exécuté). Cliquez sur le bouton pour ouvrir la boîte de dialogue qui permet de sélectionner le répertoire d'enregistrement principal. - + Custom Directory address Adresse d'annuaire personnalisée - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. L'adresse d'annuaire personnalisée est l'adresse de l'annuaire contenant la liste des serveurs à laquelle ce serveur doit être ajouté. - + Server List Filename dialog push button Bouton poussoir de la boîte de dialogue du nom du fichier de la liste de serveurs - - + + Server List Filename Nom du fichier de la liste de serveurs - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Cliquez sur le bouton pour ouvrir la boîte de dialogue qui permet de définir le nom du fichier de persistance de la liste des serveurs. L'utilisateur %1 doit être en mesure de créer le nom de fichier spécifié, même s'il existe déjà (il sera écrasé lors de la sauvegarde). - + Server List Filename text box (read-only) Zone de texte du nom de fichier de la liste de serveurs (en lecture seule) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. La valeur actuelle du nom du fichier de persistance de la liste des serveurs. L'utilisateur %1 doit être en mesure de créer le nom de fichier spécifié, même s'il existait déjà (il sera écrasé lors de la sauvegarde). Cliquez sur le bouton pour ouvrir la boîte de dialogue qui permet de définir le nom du fichier de persistance de la liste de serveurs. - + Clear the server list file name button Bouton d'effacement du nom du fichier de la liste de serveurs - + Clear Server List Filename Effacer le nom de fichier de la liste de serveurs - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Cliquez sur le bouton pour effacer le nom du fichier de persistance de la liste de serveurs actuellement sélectionné. Cela empêchera la persistance de la liste de serveurs jusqu'à ce qu'une nouvelle valeur ne soit sélectionnée. - + Start Minimized on Operating System Start Démarrage minimisé au lancement du système d'exploitation - + Now a directory Maintenant un annuaire - + Register Server Status Enregistrer l'état du serveur - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Si la case de démarrage minimisé au démarrage du système d'exploitation est cochée, le serveur sera lancé au démarrage du système d'exploitation et sera automatiquement réduit en icône de la barre de tâches du système. - + Server Name Nom du serveur - + The server name identifies your server in the connect dialog server list at the clients. Le nom du serveur identifie votre serveur dans la liste des serveurs de la fenêtre de connexion chez les clients. - + Server name line edit Ligne d'édition pour le nom du serveur - + Location City Ville de localisation - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. La ville dans laquelle ce serveur est situé peut être définie ici. Si un nom de ville est saisi, il sera affiché dans la liste des serveurs du dialogue de connexion chez les clients. - + City where the server is located line edit Ligne d'édition pour la ville où est situé le serveur - + Display dialog to select recording directory button Afficher la boîte de dialogue pour sélectionner le bouton du répertoire d'enregistrement - - + + Main Recording Directory Répertoire principal des enregistrements - + Main recording directory text box (read-only) Zone de texte du répertoire principal d'enregistrement (lecture seule) - + Clear the recording directory button Effacer le bouton du répertoire d'enregistrement - + Clear Recording Directory Effacer le répertoire des enregistrements - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Cliquez sur le bouton pour effacer le répertoire d'enregistrement actuellement sélectionné. Cela empêchera l'enregistrement jusqu'à ce qu'une nouvelle valeur ne soit sélectionnée. - + Checkbox to turn on or off server recording Case à cocher pour activer ou désactiver l'enregistrement du serveur - + Jam Recorder Enregistreur de bœuf - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Si le répertoire d'enregistrement n'est pas utilisable, le problème sera affiché à la place du répertoire de la session. - + Current session directory text box (read-only) Zone de texte du répertoire de la session en cours (en lecture seule) - + Current Session Directory Répertoire de la session en cours - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Activé pendant l'enregistrement et contient le répertoire de la session d'enregistrement en cours. Désactivé après l'enregistrement ou lorsque l'enregistreur n'est pas activé. - + Recorder status label Étiquette de l'état de l'enregistreur - + Recorder Status État de l'enregistreur - + Displays the current status of the recorder. The following values are possible: Affiche l'état actuel de l'enregistreur. Les valeurs suivantes sont possibles : - + There is no one connected to the server to record. Personne n'est connecté au serveur à enregistrer. - + The performers are being recorded to the specified session directory. Les musiciens sont enregistrés dans le répertoire de session spécifié. - + NOTE NOTE - + Server welcome message edit box Boite d'édition du message de bienvenue du serveur - + Server Welcome Message Message de bienvenue du serveur - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Un message de bienvenue du serveur est affiché dans la fenêtre de tchate si un musicien entre sur le serveur. Si aucun message n'est défini, le message de bienvenue du serveur est désactivé. - + Language Langue - + Select the language to be used for the user interface. Sélectionnez la langue à utiliser pour l'interface utilisateur. - + Language combo box Choix déroulant de la langue - + Custom Directory line edit Modification de la ligne de l'annuaire personnalisé - + &Hide %1 server Cac&her le serveur %1 - + &Show %1 server Afficher le &serveur %1 - + %1 server %1 is the name of the main application Serveur %1 - + Type a message here. If no message is set, the server welcome is disabled. Saisissez un message ici. Si aucun message n'est défini, l'accueil du serveur est désactivé. - + Recorder failed to start. Please check available disk space and permissions and try again. Error: L'enregistreur n'a pas pu démarrer. Veuillez vérifier l'espace disque disponible et les permissions puis réessayer. Erreur : - + ERROR ERREUR - + Request new recording button Demander un nouveau bouton d'enregistrement - + Directory Type combo box Liste déroulante du type d'annuaire - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Lorsqu'une valeur autre que "%1" est choisie pour l’annuaire, cela indique si l'inscription a réussi. Si l'inscription a échoué, veuillez choisir un autre annuaire. - + Country/Region Pays/région - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Définissez le pays ou la région où le serveur est exécuté. Les clients afficheront cet emplacement dans la liste des serveurs de leur boîte de dialogue de connexion. - + Combo box for location of this server Liste déroulante pour le pays de ce serveur - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Aucun répertoire d'enregistrement n'a été défini ou la valeur n'est pas utilisable. Vérifiez la valeur dans l'onglet Options. - + New Recording Nouvel enregistrement - + During a recording session, the button can be used to start a new recording. Pendant une session d'enregistrement, le bouton peut être utilisé pour démarrer un nouvel enregistrement. - - + + E&xit &Quitter - + %1 Server %1 is the name of the main application %1 serveur - + Select Main Recording Directory Sélectionner le répertoire principal des enregistrements - + Recording En cours d'enregistrement - + Not recording Non enregistré - + Not initialised Non initialisé - + Not enabled Non activé - + &Window &Fenêtre - + None Aucune - + Not registered Non inscrit - + Bad address Mauvaise adresse - + Registration requested Inscription demandée - + Registration failed Échec de l'inscription - + Check server version Vérifier la version du serveur - + Registered Inscrit - + Server list full at directory Liste des serveurs pleine dans l'annuaire - + Your server version is too old La version de votre serveur est trop vieille - + Requirements not fulfilled Exigences non satisfaites - + Unknown value %1 Valeur inconnue %1 @@ -3360,32 +3369,32 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CServerListManager - + Now a directory Maintenant un annuaire - + No longer a directory Plus un annuaire - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Impossible d'ouvrir '%1' en lecture/écriture. Veuillez vérifier que %2 en a la permission (et qu'il y a de l'espace libre). - + Loading persistent server list file: %1 Chargement du fichier de la liste des serveurs persistants : %1 - + Could not write to '%1' Impossible d'écrire dans '%1' - + Saving registration for %1 (%2): %3 Sauvegarde de l'inscription pour %1 (%2) : %3 @@ -3393,68 +3402,68 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CSound - + The selected audio device is no longer present in the system. Please check your audio device. Le périphérique audio sélectionné n'est plus présent dans le système. Veuillez vérifier votre appareil audio. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Impossible d'initialiser le pilote audio. Vérifiez si votre matériel audio est branché et vérifiez les paramètres de votre pilote. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Le périphérique audio sélectionné est incompatible car il ne prend pas en charge une fréquence d'échantillonnage de %1 Hz. Veuillez sélectionner un autre périphérique. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. La configuration actuelle du périphérique audio est incompatible car la fréquence d'échantillonnage n'a pas pu être définie sur %2 Hz. Veuillez vérifier si un commutateur matériel ou un paramètre du pilote permet de définir manuellement la fréquence d'échantillonnage et redémarrer %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Le périphérique audio sélectionné est incompatible car il ne prend pas en charge les canaux d'entrée/sortie %1. Veuillez sélectionner un autre périphérique ou une autre configuration. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Le périphérique audio sélectionné est incompatible puisque le format d'échantillon audio requis n'est pas disponible. Veuillez utiliser un autre périphérique. - + No ASIO audio device driver found. Aucun pilote de périphérique audio ASIO trouvé. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Veuillez installer un pilote ASIO avant d'exécuter %1. Si vous possédez un périphérique avec un support ASIO, installez son pilote ASIO officiel. Sinon, vous devrez télécharger et installer un pilote universel comme ASIO4ALL. - + Error requesting stream stop: $s Erreur lors de la demande d'arrêt du flux : $s - + Error closing stream: $s Erreur de fermeture du flux : $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK n'a pas pu être lancé automatiquement. Veuillez lancer JACK manuellement et vérifier les messages d'erreur. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK ne fonctionne pas à un taux d'échantillonnage de <b>%1 Hz</b>. Veuillez utiliser un outil comme <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> pour régler le taux d'échantillonnage de JACK à %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. L'enregistrement du port JACK a échoué. Il s'agit probablement d'une erreur de JACK. Veuillez arrêter %1 et JACK. Ensuite, vérifiez si un autre programme avec un taux d'échantillonnage de %2 Hz peut se connecter à JACK. @@ -3463,62 +3472,62 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo L'enregistrement du port JACK a échoué. Il s'agit probablement d'une erreur de JACK. Veuillez arrêter %1 et JACK. Ensuite, vérifiez si un autre programme MIDI peut se connecter à JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Impossible d'activer le client JACK. Il s'agit probablement d'une erreur de JACK. Veuillez vérifier la sortie JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK a été arrêté. %1 a besoin de JACK pour fonctionner. Veuillez redémarrer %1 pour relancer JACK. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Aucune carte son n'est disponible dans votre système. L'appel à l'entrée AudioHardwareGetProperty de CoreAudio a échoué. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Aucune carte son n'est disponible dans le système. L'appel de la sortie CoreAudio AudioHardwareGetProperty a échoué. - + The currently selected audio device is no longer present. Please check your audio device. Le périphérique audio actuellement sélectionné n'est plus présent. Veuillez vérifier votre périphérique audio. - + The audio input device is no longer available. Please check if your input device is connected correctly. Le périphérique d'entrée audio n'est plus disponible. Veuillez vérifier si votre périphérique d'entrée est correctement connecté. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La fréquence d'échantillonnage du périphérique d'entrée actuel n'est pas de %1 Hz et est donc incompatible. Veuillez sélectionner un autre périphérique ou essayer de régler manuellement la fréquence d'échantillonnage sur %1 Hz via Audio-MIDI-Setup (dans Applications->Utilitaires). - + The audio output device is no longer available. Please check if your output device is connected correctly. Le périphérique de sortie audio n'est plus disponible. Veuillez vérifier si votre périphérique de sortie est correctement connecté. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La fréquence d'échantillonnage du périphérique de sortie actuel n'est pas %1 Hz et est donc incompatible. Veuillez sélectionner un autre périphérique ou essayer de régler manuellement la fréquence d'échantillonnage sur %1 Hz via Audio-MIDI-Setup (dans Applications->Utilitaires). - + The stream format on the current input device isn't compatible with this software. Please select another device. Le format de flux du périphérique d'entrée actuel n'est pas compatible avec ce logiciel. Veuillez sélectionner un autre périphérique. - + The stream format on the current output device isn't compatible with %1. Please select another device. Le format du flux sur le périphérique de sortie actuel n'est pas compatible avec %1. Veuillez sélectionner un autre périphérique. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Les tailles de tampon du périphérique audio d'entrée et de sortie actuel ne peuvent pas être définies sur une valeur commune. Veuillez sélectionner des périphériques d'entrée/sortie différents dans les paramètres de votre système. @@ -3526,27 +3535,27 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Impossible d'utiliser le périphérique audio sélectionné en raison de l'erreur suivante : %1 Le pilote précédent sera sélectionné. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Le périphérique audio précédemment sélectionné n'est plus disponible ou le pilote est passé dans un état incompatible. Nous allons essayer de trouver un périphérique audio valide, mais ce nouveau périphérique audio pourrait provoquer un effet larsen. Avant de vous connecter à un serveur, veuillez vérifier les paramètres de votre périphérique audio. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 n'a pas trouvé de périphérique audio %2 utilisable.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Vous pouvez peut-être corriger les erreurs dans les paramètres du pilote. Voulez-vous ouvrir ces paramètres maintenant ? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Impossible de démarrer %1. Veuillez redémarrer %1 et vérifier/reconfigurer vos paramètres audio. @@ -3554,53 +3563,57 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, version %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Publié sous la licence publique générale GNU (GPL) version 2 ou ultérieure (GPLv2) + Publié sous la licence publique générale GNU (GPL) version 2 ou ultérieure (GPLv2) - + This app uses the following libraries, resources or code snippets: Cette application utilise les bibliothèques, ressources ou extraits de code suivants : - + Qt cross-platform application framework Cadriciel d'application multiplateforme Qt - + (build) (construction) - + (runtime) (exécution) - + Some pixmaps are from the %1 Certaines images proviennent de %1 - + Some sound samples are from %1 Certains échantillons sonores proviennent de %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Code de réverbération audio par Perry R. Cook et Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Icônes de drapeaux par Mark James @@ -3608,12 +3621,12 @@ Nous avons coupé votre canal et activé "Me silencer". Veuillez d&apo global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Une mise à jour de %1 est disponible : <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>rendez-vous dans détails et téléchargements</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Pour plus d'informations, utilisez l'aide "Qu'est-ce que c'est" (menu d'aide, bouton droit de la souris ou Maj+F1) diff --git a/src/translation/translation_it_IT.ts b/src/translation/translation_it_IT.ts index adc415e81b..57577fdb01 100644 --- a/src/translation/translation_it_IT.ts +++ b/src/translation/translation_it_IT.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Framework per applicazioni multipiattaforma Qt - + (build) (compilazione) - + (runtime) (eseguibile) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Codice riverbero audio sviluppato da Perry R. Cook and Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Dà la possibilità ai musicisti di realizzare sessioni live attraverso internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Il server acquisisce i dati audio di ogni client, mixa i dati audio e li rimanda ad ogni client connesso. - + This app uses the following libraries, resources or code snippets: Questa applicazione usa le seguenti librerie, risorse e parti di codice: - + Flag icons by Mark James Bandiere create da Mark James - + Some pixmaps are from the %1 Alcune pixmap provengono da %1 - + Some sound samples are from %1 Alcuni campioni sonori provengono da %1 - + For details on the contributions check out the %1 Per maggiorni dettagli su chi contribuisce al progetto visitare %1 - + Github Contributors list Lista dei collaboratori su Github - + Spanish Spagnolo - + French Francese - + Portuguese Portoghese - + Dutch Olandese - + Italian Italiano - + German Tedesco - + Polish Polacco - + Swedish Svedese - + Korean Coreano - + Slovak Slovacco - + Simplified Chinese Cinese Semplificato - + Norwegian Bokmål Bokmal norvegese - + Japanese - + About %1 Informazioni su %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Consolle Analizzatore - + Error Rate of Each Buffer Size Tasso di errore per ogni Buffer @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Mixer personale sul Server - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Quando connessi i fader permettono di regolare i volumi in locale senza influenzare l'ascolto degli altri utenti. L'intestazione mostra il nome de server, se valorizzato, e le informazioni sullo stato della sessione di registrazione se attiva. - + Server Server - + T R Y I N G T O C O N N E C T I N A T T E S A D I C O N N E S S I O N E - + RECORDING ACTIVE Sessione con Registrazione Attiva - + Personal Mix at: %1 Mixer personale sul Server: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan Bilanciamento - - - + + + Mute Muto - - - + + + Solo Solo - + &No grouping &Non Assegnato - + Assign to group Assegna al Gruppo - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Il fader identifica il client connesso. Il nikname, un'immagine del tuo strumento e la bandiera del tuo paese, possono essere impostati nella finestra principale. - + Mixer channel country/region flag Bandiera della regione o paese relativa al canale del mixer - + Grp Grp - + Channel Level Volume - + Input level of the current audio channel at the server Livello di input del canale audio corrente sul server - + Mixer Fader Mixer Fader - + Local mix level setting of the current audio channel at the server Impostazione del livello di volume locale del canale audio corrente sul server - + Status Indicator Indicatore di Stato - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Visualizza lo stato del client assegnato a questo canale. Gli Stati supportati sono: - + Status indicator label Etichetta dell'indicatore di stato - + Panning Panoramica - + Local panning position of the current audio channel at the server Bilancimento locale del canale audio corrente sul server - + With the Mute checkbox, the audio channel can be muted. Quando il Mute è selezionato, il canale audio è mutato. - + Mute button Pulsante Mute - + Solo button Pulsante Solo - + Fader Tag Tag Fader - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Visualizza il livello "pre-fader" di questo canale. Tutti i client connessi al server avranno assegnato un livello audio, lo stesso valore per ogni client. - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Regola il livello audio di questo canale. A tutti i client connessi sarà assegnatu un fader per regolare il mix audio locale. - + Speaker with cancellation stroke: Indicates that another client has muted you. Altoparlate con il segnale rosso: indica che un altro client ha messo il tuo canale in mute. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Regola il bilanciamento Sinistro - Destro del canale. Funziona solo se abilitata la funzione stereo oppure "mono-in/stereo-out". - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Se selezionato il pulsate "Solo", il canale audio sarà settato nella modalità di "Solo" ovvero tutti i canali saranno mutati ad eccezione di quelli in modalità "Solo". - + Group Raggruppa - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Con il comando Rag, può essere definito un gruppo di canali. Tutti i canali raggruppati possono essere modificati in modo proporzionale muovendo uno dei fader del gruppo. - + Group button Pulsante Raggruppa - + Mixer channel instrument picture Immagine dello strumento - + Mixer channel label (fader tag) Etichetta del Canale (fader tag) - + PAN Bil. (L / R) - + MUTE MUTO - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Identificativo/Nome - + Instrument Strumento - + Location Località - - - + + + Skill Level Livello di Preparazione - + Alias Alias - + Beginner Principiante - + Intermediate Livello Intermedio - + Expert Esperto - + Musician Profile Profilo musicista @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Finestra della Chat - + The chat window shows a history of all chat messages. La finestra della chat mostra la storia di tutti i messaggi. - + Chat history Storia della Chat - + Input Message Text Input Messaggio di Testo - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Immettere il testo del messaggio di chat nella casella di testo e premere Invio per inviare il messaggio al server che distribuirà il messaggio a tutti i client connessi. Il tuo messaggio verrà quindi visualizzato nella finestra di chat. - + New chat text edit box Nuova casella di testo della chat - + Type a message here Inserisi un messaggio qui - + &Edit &Modifica - + Cl&ear Chat History Cance&lla Storico Chat - - + + &Close &Chiudi - + Do you want to open the link '%1' in your browser? Vuoi aprire il link '%1' nel tuo Browser? @@ -544,370 +544,370 @@ CClientDlg - + Input Level Meter Livello Segnale d'ingresso - + Make sure not to clip the input signal to avoid distortions of the audio signal. Controllare di non saturare il livello di input per evitare distorsioni nel segnale audio. - + Input level meter Indicatore del Segnale in ingresso - + Simulates an analog LED level meter. Simula un indicatore a LED analogico. - + Connect/Disconnect Button Pulsante: Connetti-Disconnetti - + Connect and disconnect toggle button Pulsante di connessione e disconnessione - + Delay Status LED LED di Stato del Delay - + Delay status LED indicator LED di stato del Delay - + The network jitter buffer is not large enough for the current network/audio interface jitter. Il Jitter Buffer non è grande abbastanza per la tipologia di rete/interfaccia audio usate. - + This shows the level of the two stereo channels for your audio input. Visualizza il livello di input dei due canali stereo. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Se il programma è connesso ad un server e voi state suonando o cantando, il VU-Meter sarà in funzione. Se ciò non accade probabilemnte avete settato un ingresso errato oppure il livello di input è troppo basso. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Per un corretto utilizzo dell'applicazione, non è possibile ascoltare il canto o lo strumento attraverso l'altoparlante o le cuffie quando il programma non è collegato. Basta disattivare l'audio del canale di ingresso nel mixer di riproduzione (non nel mixer di registrazione!). - + Reverb effect Effetto Reverbero - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Il Reverbero può essere applicato sia in modalità mono che stereo. La selezione del canale mono e il livello di riverbero possono essere modificati. Ad esempio, se un segnale del microfono viene immesso nel canale audio destro della scheda audio e deve essere applicato un effetto di riverbero, impostare il selettore di canale su destra e spostare il fader verso l'alto fino a raggiungere il livello di riverbero desiderato. - + Reverb effect level setting Livello dell'effetto di Reverbero - + Reverb Channel Selection Selezione Canale Reverbero - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Con questi pulsanti di opzione è possibile scegliere il canale di ingresso audio su cui viene applicato l'effetto riverbero. È possibile selezionare il canale di input sinistro o destro. - + Left channel selection for reverb Canale Sinistro per il Reverbero - + Right channel selection for reverb Canale Destro per il Reverbero - + Green Verde - + The delay is perfect for a jam session. Il delay è perfetto per una live session. - + Yellow Giallo - + Red Rosso - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Apre una finestra di dialogo in cui è possibile selezionare un server a cui connettersi. Se si è connessi, premere questo pulsante per terminare la sessione. - + Shows the current audio delay status: Visualizza lo stato corrente del delay: - + A session is still possible but it may be harder to play. Una sessione è ancora possibile ma potrebbe essere più difficile suonare. - + The delay is too large for jamming. Il delay è eccessivo per una live session. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Il ritardo del buffer della scheda audio (dimensione del buffer) è troppo piccolo (vedere la finestra Impostazioni). - + The upload or download stream rate is too high for your internet bandwidth. La banda passante per lo stream (upload e download) è troppo rispetto alla qualità della connessione internet. - + The CPU of the client or server is at 100%. La CPU del client è satura al 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Il ping è il tempo necessario affinché il flusso audio passi dal client al server e viceversa. Questo ritardo è introdotto dalla rete e dovrebbe essere di circa 20-30 ms. Se questo ritardo è superiore a circa 50 ms, la distanza dal server è eccessiva o la connessione a Internet non è sufficiente. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Il ritardo complessivo viene calcolato dal tempo di ping corrente e dal ritardo introdotto dalle impostazioni del buffer correnti. - - + + C&onnect C&onnetti - + &File &File - + &View &Vista - + &Connection Setup... Setup C&onnessione... - + My &Profile... &Profilo Personale... - + C&hat... C&hat... - + &Analyzer Console... &Analizzatore... - + N&o User Sorting N&on Riordinare i Canali - + Sort Users by &City Ordina i Canali per &Città di provenienza - + Clear &All Stored Solo and Mute Settings &Riprisitna tutti gli stati salvati di SOLO e MUTE - + Auto-Adjust all &Faders Auto regolazione &Fader - + Sort Users by Chann&el Ordina utenti per canal&e - + Sett&ings Settag&i - + %1 Directory %1 Cartella - + Ok Ok Ok - + Set All Faders to New Client &Level Setta &Livelli del Mixer al valore impostato per i Nuovi Utenti - + E&xit &Uscita - + Local Jitter Buffer Status LED Led di stato del Jitter Locale - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Il led di stato del Jitter Locale indica lo stato dello strem audio. Se diventa rosso l'audio risulta scadente. Questo è dovuto a diversi problemi: - + Local Jitter Buffer status LED indicator Indicatore Led del Jitter Buffer - + &Load Mixer Channels Setup... &Carica Setup Mixer... - + &Save Mixer Channels Setup... &Salva Setup Mixer... - + Audio/Network &Settings... &Impostazioni Audio/Rete... - + A&dvanced Settings... Impostazioni A&vanzate... - + &Edit &Modifica - + If this LED indicator turns red, you will not have much fun using %1. Se questo indicatore LED diventa rosso, non ti divertirai molto a usare %1. - + If this LED indicator turns red, the audio stream is interrupted. Se questo indicatore LED diventa rosso, il flusso audio viene interrotto. - + Current Connection Status Stato della connessione - + O&wn Fader First Metti il mio &fader prima degli altri - + Sort Users by &Name Ordina canali per &Nome - + Sort Users by &Instrument Ordina canali per &Strumento - + Sort Users by &Group Ordina Canali per Nome &Utente - + &MIDI Control Settings... - - + + Select Channel Setup File Selezione File di Setup dei Canali - + user utente - + users utenti - + Connect Connetti - + Settings Impostazioni - + Chat Chat - + Enable feedback detection Abilita riconoscimento feedback - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -916,12 +916,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe E' stato disattivato l'audio del tuo canale ed inserito il "Disattiva Inputt". Si prega di risolvere prima il problema dei larsen e dei ritorni e successivamente riattivare l'audio. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Se la tua interfaccia non funziona correttamente, apri la schermata dei settaggi e controlla se è stata selezionata l'interfaccia corretta ed il suo relativo driver. - + &Disconnect Disco&nnetti @@ -1018,1098 +1018,1107 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CClientSettingsDlg - + Jitter Buffer Size Dimensione Jitter Bufer - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. I settaggi del jitter buffer regolano il compromesso tra qualità audio e ritardo generale. - + Local jitter buffer slider control Controlli per la gestione del Jitter Buffer - + Server jitter buffer slider control Fader del Jitter Buffer del Server - + Auto jitter buffer check box Switch Jitter Buffer Automatico - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Se il driver viene cambiato mentre si è connessi ad un server, la connessione verrà fermata, il driver sarà sostituito e successivamente la connessione verrà ripristinata automaticamente. - + Sound card device selector combo box Box per la selezione della scheda audio - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Se viene utilizzato il driver ASIO4ALL, tieni presente che questo driver di solito introduce ca. 10-30 ms di ritardo audio aggiuntivo. Si consiglia pertanto di utilizzare una scheda audio con un driver ASIO nativo. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Se si usano i driver kX ASIO, accertarsi di connettere l'input ASIO nel pannello dei settaggi kX DSP. - + Sound Card Channel Mapping Mappa dei Canali della Scheda Audio - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Se la scheda audio dispone di diversi Input o Output, verrà visualizzata la mappa dei canali di input e di output. - + Left input channel selection combo box Box per la selezione dell'Ingresso Sinistro (Left) - + Right input channel selection combo box Box per la selezione dell'Ingresso Destro (Right) - + Left output channel selection combo box Box per la selezione dell'uscita Sinistra (Left) - + Right output channel selection combo box Box per la selezione dell'uscita Destra (Right) - + Small Network Buffers Abilita Riduzione del Buffer di Rete - + Small network buffers check box Check Box per abilitare la riduzione dei pacchetti di rete - + Sound Card Buffer Delay Buffer Delay della scheda audio - + The buffer setting is therefore a trade-off between audio quality and overall delay. L'impostazione del buffer è quindi un compromesso tra qualità audio e ritardo generale. - + 64 samples setting radio button Pulsante per abilitare 64 Campioni - + 128 samples setting radio button Pulsante per abilitare 128 Campioni - + 256 samples setting radio button Pulsante per abilitare 256 Campioni - + Audio Channels Canali Audio - + Audio channels combo box Combo Box Canali Audio - + Audio Quality Qualità Audio - + Audio quality combo box Combo Box Qualità Audio - + New Client Level Livello Volume Nuovo Client - + New client level edit box Box per modificare il livello di ingresso di un nuovo client - - + + Mono Mono - + and e - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. modalità che aumenterà la velocità dei dati del tuo stream. Assicurati che la tua velocità di upload non superi la velocità di upload disponibile per la tua connessione Internet. - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Se serve aggiungere ulteriori cartelle al menu a discesa della finestra di dialogo Connetti, è possibile inserire qui gli indirizzi.<br> - + Mono-in/Stereo-out Mono-in/Stereo-out - - - + + + Stereo Stereo - - - + + + &Close &Chiudi - + Local Audio Input Fader Fader per l'input audio locale - - + + L L - + Local audio input fader (left/right) Fader di input locale (Sinistro/Destro) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Il Jitter Buffer compensa i ritardi della rete e della scheda audio. La dimensione del buffer influenza quindi la qualità del flusso audio (quando si verificano i dropout) e il ritardo complessivo (più è alto il buffer, maggiore è il ritardo). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. È possibile impostare manualmente la dimensione delJitter Buffer per il client locale e il server remoto. Per il Jitter Buffer locale, i dropout nel flusso audio sono indicati dalla luce sotto i fader del Jitter Buffer. Se la luce diventa rossa, si è verificato un sovraccarico / underrun del buffer e il flusso audio viene interrotto. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Se la modalità "Auto" è abilitata il Jitter Buffer si regolerà automaticamente sulla base di misure sulla rete e sulle latenze della scheda audio. Quando la modalità "Auto" è abilitata i fader saranno disabilitati. - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Se l'impostazione Auto è abilitata, i buffer di rete del client locale e del server remoto vengono impostati su un valore conservativo per ridurre al minimo la probabilità di interruzione dell'audio. Per modificare il ritardo / latenza audio, si consiglia di disabilitare l'impostazione Auto e di ridurre manualmente la dimensione del buffer utilizzando i fader fino a raggiungere una qualità audio accettabile. L'indicatore LED mostrerà i dropout audio del Jitter Buffer locale con una luce rossa. - + 128 samples: Should work for most available sound cards. La modalità "128 Samples" è compatibile con la maggior parte delle schede audio. - + Sound card driver settings Settaggi scheda audio - + ASIO Device Settings push button Pulsante per i settaggi del driver ASIO - + Skin Vista - + Select the skin to be used for the main window. Selezione la vista da applicare alla finestra principale. - + Skin combo box Box di selezione Vista - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Selezionare lo stile del Meter da utilizzare per i livelli audio. L'opzione "Barra LED stretta e LED piccoli si applicano solo al mixer. Quando si seleziona "Barre Strette", gli indicatori di input sono impostati su Barre. Quando si seleziona LED Piccoli, gli indicatori di ingresso sono impostati su LED rotondi. Le restanti opzioni si applicano all mixer ed ai Meter delgli input. - + Language Lingua - + Select the language to be used for the user interface. Seleziona la lingua da usare per l'interfaccia utente. - + Language combo box Box di selezione lingua - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Seleziona il numero di canali audio da utilizzare per la comunicazione tra client e server. Sono disponibili tre modalità: - + These modes use one and two audio channels respectively. Questa modalità usa rispettivamente uno o due canali audio. - + Mono in/Stereo-out Ingresso Mono/Uscita Stereo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Il segnale audio inviato al server è mono ma il segnale di ritorno è stereo. Ciò è utile se la scheda audio ha lo strumento su un canale di ingresso e il microfono sull'altro. In tal caso, i due segnali di ingresso possono essere miscelati su un canale mono ma il mix del server viene ascoltato in stereo. - + Enabling Abilitando - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. Nella modalità stereo, nessuna selezione di canali audio per l'effetto riverbero sarà disponibile nella finestra principale poiché in questo caso l'effetto viene applicato ad entrambi i canali. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Maggiore è la qualità audio, maggiore è la quantità dei dati del flusso audio. Assicurati che la tua velocità di upload non superi la larghezza di banda disponibile della tua connessione Internet. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Questa impostazione definisce il livello di dissolvenza di un client appena connesso in percentuale. Se un nuovo client si connette al server corrente, otterrà il livello di fader iniziale specificato se nessun altro livello di fader da una precedente connessione di quel client era già memorizzato. - + Input Boost Gain Ingresso - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Questa impostazione consente di aumentare il livello del segnale in ingresso tramite fattori di moltiplicazione di guadagno fino a 10 (ovvero + 20dB). Se il suono è troppo basso provare, prima ad aumentare il guadagno, di avvicinarsi al microfono, regolare i livelli della scheda audio o regolare i livelli nelle impostazioni di input del sistema. Se non si riesce ad ottenere un livello di ingresso soddisfacente, impostare un fattore di guadagno adeguato. Se il suono è gia troppo forte risulterà distorto ed in clipping, questa opzione in questo caso non ti sarà utile. In questi casi dovrai diminuire il livello di ingresso: allontanati dal microfono, regola la scheda audio o regola i livelli delle impostazioni di ingresso del sistema operativo. - + Input Boost combo box Casella del Gain d'Ingresso - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Per ciascun %1 input/output (canali sinistro e destro) può essere selezionata una scheda audio diversa. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Abilita il supporto per pacchetti audio di rete molto piccoli. Questi pacchetti di rete vengono effettivamente utilizzati solo se il ritardo del buffer della scheda audio è inferiore a %1 campioni. Più piccoli sono i pacchetti di rete, minore sarà la latenza audio. Ma allo stesso tempo aumenta il carico di rete e la probabilità di avere problemi durante l'ascolto. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Apre le impostazioni del driver della tua scheda audio. Alcuni driver ti consentono di modificare le impostazioni del buffer, altri come ASIO4ALL ti consentono di scegliere input o output dei tuoi dispositivi. Maggiori informazioni possono essere trovate su jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Apre le impostazioni del driver. Nota: %1 attualmente supporta solo dispositivi con una frequenza di campionamento di %2 Hz. Non sarai in grado di selezionare un driver/dispositivo che non lo supporta. Per ulteriore assistenza, vedere jamulus.io. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. L'impostazione del ritardo del buffer è un'impostazione fondamentale di %1. Questa impostazione ha un'influenza su molte proprietà di connessione. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Controlla i livelli dei canali audio della scheda sinistro e destro. Per un segnale mono funge da mixer tra i due canali. Ad esempio, se un microfono è collegato al canale di ingresso destro e uno strumento è collegato al canale di ingresso sinistro che è molto più forte del microfono, spostare il fader audio per bilanciare gli ingressi, l'etichetta sopra il fader mostra %1, dove %2 è l'indicatore di attenuazione. - + Audio Device Dispositivo Audio - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Su Windows è possibile selezionare il driver ASIO (scheda audio) utilizzando %1. Se il driver ASIO selezionato non è valido, viene visualizzato un messaggio di errore e viene selezionato un driver valido. In macOS è possibile selezionare l'hardware di input e output. - + Three buffer sizes can be selected È possibile sceliere tra tre possibilità di dimensioni del buffer - + 64 samples: Provides the lowest latency but does not work with all sound cards. La modalità "64 Samples" garantisce una minore latenza ma non è applicabile a tutte le schede audio. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. La modalità "256 Samples" si usa quando non si possono usare le impostazioni a 64 o 128 Samples, per non avere problemi. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Alcuni driver di alcune schede audio non permettono la modifica del buffer da %1. In questo caso la funzione di modifica del buffer risulta disabilitata e andrà modificata direttamente dal driver della scheda audio. Usare il programma fornito dal produttore per modificare i parametri del buffer. Per esempio se usi i driver ASIO, puoi usare il bottone "ASIO Device Settings" per aprire il pannello di controllo oppure se si usa JACK si dovrà usare il tool QJackCtl per accedere ai parametri della scheda. Altre interfacce, come Pipewire, potrebbero richiedere un tool proprietario. In questo caso fare riferimento al manuale utente. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Se non è possibile selezionare le impostazioni sulla dimensione del buffer significa che i settaggi non sono compatibili con il driver o che non corrisponde ai valori. %1, continuerà a funzionare, ma con prestazioni limitate. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. L'effettivo ritardo del buffer ha influenza sulla connessione, sulla velocità di upload e sul ritardo complessivo. Minore è la dimensione del buffer, maggiore è la probabilità di avere il LED rosso nell'indicatore di stato (drop out), maggiore è la velocità di upload, minore è il ritardo complessivo. - + Meter Style Stile dei Vu-Meter - + Meter Style combo box Box selezione stile VU-Meter - + Custom Directories Cartella predefinita - + Custom Directories combo box Combo box della Cartella Predefinita - + Delete custom directory button Pulsante Elimina cartella personalizzata - + Delete Custom Directory Elimina cartella personalizzata - + Click the button to delete the currently selected custom directory. Fare clic sul pulsante per eliminare la cartella personalizzata attualmente selezionata. - + Audio Upstream Rate Velocità upstream audio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Dipende dalla dimensione del pacchetto audio e dall'impostazione di compressione. Assicurati che la velocità di upstream non sia superiore alla velocità di upload disponibile dal tuo provider (verificalo con un servizio come speedtest.net). - + Number of Mixer Panel Rows Numero di Righe su cui disporre il Mixer - + Adjust the number of rows used to arrange the mixer panel. Regola il numero di righe su cui saranno disposti i controlli del mixer. - + Number of Mixer Panel Rows spin box Box Numero di Righe su cui disporre il Mixer - + Feedback Protection Protezione dai Larser - + Prevents acoustic feedback between microphone and speakers. Abilita la protezione dai larsen tra il microfono e gli altoparlanti. - + Feedback Protection check box Casella Protezione dai Larser - + Audio Alerts Avvisi Audio - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Abilita gli avvisi audio quando ricevi un messaggio in chat e quando un nuovo utente entra nella sessione. Sarà necessario un secondo device audio per ascoltare questi avvisi. - + Audio Alerts check box CheckBox Avvisi Audio - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + ASIO Device Settings Configurasione driver ASIO - + Low Low - - + + Normal Normal - + High High - + + Max + + + + Fancy Fantasia - + Compact Compatto - + Bar (narrow) Barre (Sottili) - + Bar (wide) Barre (larghe) - + LEDs (stripe) LED (strip) - + LEDs (round, small) LED (Piccoli, rotondi) - + LEDs (round, big) LED (Rotondi, grandi) - - - - + + + + None Nullo - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Scrivi qui il tuo nome o uno pseudonimo in modo che gli altri musicisti con cui vuoi suonare sappiano chi sei. Puoi anche aggiungere un'immagine dello strumento che suoni e una bandiera del paese o della regione in cui ti trovi. Potrebbero anche essere aggiunti la tua città e il livello di abilità nel suonare il tuo strumento. - + Country/region flag button Bandiera del paese o della regione - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + Musician Profile Profilo musicista - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Quello che imposti qui apparirà sul tuo fader sulla scheda del mixer quando sei connesso a un server %1. Questo tag verrà mostrato anche su ogni client connesso al tuo stesso server. - + Alias or name edit box Box di modifica Nome o Alias - + Instrument picture button Pulsante Immagine dello strumento - + City edit box Box di modifica Città - + Skill level combo box Livello di Abilità - + Beginner Principiante - + Intermediate Intermedio - + Expert Esperto - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - - + + Size: Livello: - + Buffer Delay Ritardo del Buffer - + Buffer Delay: Ritardo buffer: - + Center Centro - + R R - + Custom Personalizzato - + Any Genre 2 Tutti i Generi 2 - Any Genre 3 - Tutti i Generi 3 + Tutti i Generi 3 - + + Any Genre Asia + + + + Genre Rock Genere Rock - + Genre Jazz Genere Jazz - + Genre Classical/Folk Genere Classica / Folk - + Genre Choral/Barbershop Genere Corale / Barbershop - + Any Genre 1 Tutti i Generi 1 - + Drum Set Batteria - + Djembe Djembe - + Electric Guitar Chitarra elettrica - + Acoustic Guitar Chitarra Acustica - + Bass Guitar Basso Elettrico - + Keyboard Tastiera - + Synthesizer Sintetizzatore - + Grand Piano Grand Piano - + Accordion Fisarmonica - + Vocal Voce - + Microphone Microfono - + Harmonica Armonica - + Trumpet Tromba - + Trombone Trombone - + French Horn Corno Francese - + Tuba Tuba - + Saxophone Sassofono - + Clarinet Clarinetto - + Flute Flauto - + Violin Violino - + Cello Violoncello - + Double Bass Contrabbasso - + Recorder Registratore - + Streamer Streamer - + Listener Ascoltatore - + Guitar+Vocal Chitarra+Voce - + Keyboard+Vocal Tastiera+Voce - + Bodhran Bodhran - + Bassoon Fagotto - + Oboe Oboe - + Harp Arpa - + Viola Viola - + Congas Conga - + Bongo Bongo - + Vocal Bass Voce Basso - + Vocal Tenor Voce Tenore - + Vocal Alto Voce Alto - + Vocal Soprano Voce Soprano - + Banjo Banjo - + Mandolin Mandolino - + Ukulele Uculele - + Bass Ukulele Uculele Basso - + Vocal Baritone Voce Baritono - + Vocal Lead Vocal Lead - + Mountain Dulcimer Dulcimer - + Scratching Scratching - + Rapping Rapping - + Vibraphone Vibrafono - + Conductor Conduttore @@ -2509,117 +2518,117 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CConnectDlg - + Server List Lista dei Server - + Directory Cartella - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Mostra i server elencati dalla cartella selezionata. Puoi aggiungere cartelle personalizzate in Impostazioni avanzate. - + Directory combo box Box della Cartella - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtra l'elenco dei server in base al testo specificato. Si noti che il filtro non fa distinzione tra maiuscole e minuscole. Un singolo carattere # filtrerà per quei server con almeno una persona connessa. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Deseleziona per comprimere l'elenco dei server. Seleziona per mostrare tutti sui server. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. La finestra Configurazione connessione elenca i server disponibili registrati con la cartella selezionata. Utilizzare il menu a discesa "Directory" per modificare la cartella, trovare il server a cui connettersi nell'elenco dei server, fare clic su di esso, quindi fare clic sul pulsante Connetti. In alternativa, fare doppio clic sul nome del server per connettersi. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. I server permanenti (quelli che sono stati elencati per più di 48 ore) sono mostrati in grassetto. - + You can add custom directories in Advanced Settings. Puoi aggiungere cartelle personalizzate in Impostazioni avanzate. - + Server list view Vista della Lista dei Server - + Server Address Indirizzo del Server - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Se conosci l'indirizzo del server, puoi connetterti utilizzando il campo Nome/Indirizzo del server. È possibile aggiungere un numero di porta (opzionale) dopo l'indirizzo del server utilizzando i due punti come separatore, ad es. %1. Il campo mostrerà anche un elenco degli indirizzi utilizzati più di recente. - + Holds the current server address. It also stores old addresses in the combo box list. Contiene l'indirizzo del server a cui connettersi. Memorizza anche i vecchi indirizzi, che compariranno nel menù a tendina. - + Delete server address button Pulsante Elimina indirizzo server - + Delete Server Address Elimina indirizzo server - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Fare clic sul pulsante per cancellare l'indirizzo del server attualmente selezionato ed eliminarlo dall'elenco dei server memorizzati. - + Ping Ping - + Server address edit box Box di editing dell'indirizzo del server - + Filter Filtro - + Filter edit box Box di modifica del Filtro - + Show All Musicians Visualizza tutti i Musicisti - + Show all musicians check box Box di Visualizzazione dei Musicisti - + Filter text, or # for occupied servers Filtro con testo, oppure # per visualizzare solo i server con utenti attivi @@ -2690,43 +2699,43 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CHelpMenu - + &Help &Aiuto - - + + Getting &Started... &Introduzione... - + Software &Manual... &Manuale Software... - + What's &This &Cos'è Questo - + P&rivacy policy... - + &About Jamulus... I&nformazioni su Jamulus... - + About &Qt... Informazioni su &Qt... - + About Qt Informazioni su Qt @@ -2734,12 +2743,12 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CLanguageComboBox - + Restart Required Riavvio Richiesto - + Please restart the application for the language change to take effect. Perfavore Riavvia il programma oer rendere effettive le modifiche. @@ -2747,22 +2756,22 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Il server richiede che tu accetti le condizioni prima di accedere. Leggi il regolamento nella finestra di chat. - + I have read the conditions and &agree. Ho letto ed &accetto. - + Accept Accetto - + Decline Declino @@ -2770,17 +2779,17 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CMultiColorLED - + Red Rosso - + Yellow Giallo - + Green Verde @@ -2788,7 +2797,7 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CMusProfDlg - + No Name Senza Nome @@ -2796,448 +2805,448 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CServerDlg - + Client List Lista dei Client - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. L'elenco dei client mostra tutti i client attualmente connessi a questo server. Alcune informazioni sui client come l'indirizzo IP e il nome vengono visualizzate per ciascun client collegato. - + Connected clients list view Lista dei Client Connessi - + Directory Type combo box ComboBox della categoria della Rubrica - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Quando viene scelto un valore diverso da "%1" per la rubrica, verrà mostrato se la registrazione è andata a buon fine. Se la registrazione non è riuscita, scegli una rubrica diversa. - + When checked, the recorder will run while a session is in progress (if set up correctly). Quando è selezionata, il registratore funziona fino a quando è attiva una sessione (se impostata correttamente). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Non è stata impostata alcuna cartella per la registrazione o il percorso non è valido. Controllare il valore nella scheda Opzioni. - + Recording has been switched off by the UI checkbox or JSON-RPC. La registrazione è stata disattivata dalla casella di controllo dell'interfaccia utente o da JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. La registrazione è stata disattivata dalla casella di controllo dell'interfaccia utente, da SIGUSR2 o da JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Se la cartella di registrazione non è disponibile, il problema verrà visualizzato al posto della directory di sessione. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Fare clic sul pulsante per aprire la finestra di dialogo che consente di selezionare la cartella di registrazione principale. Il percorso scelto deve esistere e deve avere i permessi di lattura/scrittura (consenti la creazione di sottodirectory da parte dell'utente %1 in esecuzione). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Il valore corrente della cartella di registrazione principale. Il valore scelto deve esistere ed avere i permessi di lettura/scrittura (consenti la creazione di sottodirectory da parte dell'utente %1 in esecuzione). Fare clic sul pulsante per aprire la finestra di dialogo che consente di selezionare la cartella di registrazione principale. - + Custom Directory address Indirizzo della Rubrica personalizzata - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. L'indirizzo della rubrica personalizzato è l'indirizzo della Rubrica contenente l'elenco dei server a cui questo server deve essere aggiunto. - + Server List Filename dialog push button Pulsante Nome file elenco server - - + + Server List Filename Filename lista dei server - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Fare clic sul pulsante per aprire la finestra di dialogo che consente di impostare il nome del file di persistenza dell'elenco dei server. L'utente %1 è in esecuzione poiché deve essere in grado di creare il file specificato anche se potrebbe già esistere (verrà sovrascritto al salvataggio). - + Server List Filename text box (read-only) File della lista dei Server (Sola lettura) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Il nome del file di dell'elenco dei server. L'utente %1 è in esecuzione poiché deve essere in grado di creare file specificato anche se potrebbe già esistere (verrà sovrascritto al salvataggio). Fare clic sul pulsante per aprire la finestra di dialogo che consente di impostare il nome del file dell'elenco dei server. - + Clear the server list file name button Bottone per cancellare il file della lista dei server - + Clear Server List Filename Cancella lista Server - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Usare il bottone per canellare la lista dei server selezionata. Questo impedirà la persistenza dell'elenco dei server fino a quando non viene selezionato un nuovo valore. - + Start Minimized on Operating System Start Avvia ridotto a icona all'avvio del sistema operativo - + Now a directory Ora una rubrica - + Register Server Status Stato di registrazione del server - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Se la casella di controllo "Avvia ridotto a icona" all'avvio del sistema operativo è selezionata, il server verrà avviato all'avvio del sistema operativo e verrà automaticamente ridotto a icona a icona nella barra delle attività del sistema. - + Server Name Nome del server - + The server name identifies your server in the connect dialog server list at the clients. Il nome del server identifica il tuo server nell'elenco dei server nella finestra di dialogo di connessione sui client. - + Server name line edit Modifica del Nome del server - + Location City Ubicazione Città - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. Qui è possibile specificare la città in cui si trova il server. Se viene inserita una città, verrà visualizzata nell'elenco dei server sul client. - + City where the server is located line edit Citta del Server - + Country/Region Paese/Regione - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Imposta il paese o la regione in cui è in esecuzione il server. I client mostreranno questa posizione nell'elenco dei server nella loro finestra di dialogo di connessione. - + Combo box for location of this server Casella per la posizione di questo server - + Display dialog to select recording directory button Visualizza la finestra di dialogo per selezionare il pulsante della directory di registrazione - - + + Main Recording Directory Cartella Principale di Registrazione - + Main recording directory text box (read-only) Casella di testo della Cartella principale di registrazione (sola lettura) - + Clear the recording directory button Bottone per cancellare il contenuto della cartella di registrazione - + Clear Recording Directory Cancella cartella di Registrazione - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Premere il pulsante per eliminare la cartella di registrazione. Ciò impedirà la registrazione fino a quando non viene selezionato un nuovo percorso valido. - + Checkbox to turn on or off server recording Spunta per abilitare o disabilitare la registrazione sul server - + Jam Recorder Abilita Registrazione - + Current session directory text box (read-only) Casella di testo per la Cartella della sessione Corrente (Sola Lettura) - + Current Session Directory Cartella della sessione Corrente - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Abilitato durante la registrazione e imposta la directory della sessione di registrazione. Disabilitato dopo la registrazione o quando il registratore non è abilitato. - + Recorder status label Etichetta dello stato di Registrazione - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Directory:</b> Seleziona '%1' per non registrare il tuo server con una directory.<br>Oppure seleziona uno dei generi per registrarti con quella directory.<br>Oppure seleziona '%2' e specifica un Indirizzo della directory personalizzata nella scheda Opzioni per registrarsi con una directory personalizzata.<br><br>Per qualsiasi valore tranne '%1', questo server si registra con una directory in modo che un utente %3 possa selezionare questo server nella finestra di dialogo di connessione del client elenco dei server quando scelgono quella directory.<br><br>La registrazione del server viene rinnovata periodicamente per assicurarsi che tutti i server nell'elenco dei server della finestra di connessione siano effettivamente disponibili. - + Recorder Status Stato di Registrazione - + Displays the current status of the recorder. The following values are possible: Visualizza lo stato della registrazione. Sono applicati i seguenti valori: - + There is no one connected to the server to record. Non c'è nessuno collegato al server per registrare. - + The performers are being recorded to the specified session directory. Gli artisti vengono registrati nella directory della sessione specificata. - + NOTE NOTE - + Server welcome message edit box Casella di modifica del messaggio di benvenuto del server - + Server Welcome Message Messaggio di Benvenuto del Server - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Un messaggio di benvenuto del server viene visualizzato nella finestra di chat se un musicista entra nel server. Se non viene impostato alcun messaggio, il benvenuto del server è disabilitato. - + Language Lingua - + Select the language to be used for the user interface. Seleziona la lingua da usare per l'interfaccia utente. - + Language combo box Box di selezione lingua - + Custom Directory line edit Modifica Cartella Personalizzata - + &Hide %1 server &Nascondi %1 server - + &Show %1 server &Visualizza %1 server - + %1 server %1 is the name of the main application %1 server - + Type a message here. If no message is set, the server welcome is disabled. Digita qui un messaggio. Se non viene impostato alcun messaggio, il benvenuto del server è disabilitato. - + %1 Server %1 is the name of the main application %1 server - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Registrazione non avviata. Controlla lo spazio su disco e le autorizzazioni disponibili e riprova. Errore: - + ERROR ERRORE - + Request new recording button Pulsante per una nuova registrazione - + New Recording Nuova Registrazione - + During a recording session, the button can be used to start a new recording. Durante una sessione di registrazione questo pulsante può essere usato per iniziare una nuova registrazione. - - + + E&xit &Esci - + &Window &Finestra - + Select Main Recording Directory Seleziona la directory di registrazione principale - + Recording Registrazione - + Not recording Registrazione Ferma - + Not initialised Non inizializato - + Not enabled Non Abilitata - + None None - + Not registered Non Registrato - + Bad address Indirizzo Errato - + Registration requested Registrazione richiesta - + Registration failed Registrazione fallita - + Check server version Controlla Versione server - + Registered Registrato - + Server list full at directory Elenco server completo nella directory - + Your server version is too old La tua versione del server è troppo vecchia - + Requirements not fulfilled Requisiti non soddisfatti - + Unknown value %1 Valore sconosciuto %1 @@ -3361,32 +3370,32 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CServerListManager - + Now a directory Ora una directory - + No longer a directory Non è più una directory - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Impossibile aprire '%1' in lettura/scrittura. Verificare che %2 abbia i permessi (e che ci sia spazio libero). - + Loading persistent server list file: %1 Caricamento del file dell'elenco dei server persistenti: %1 - + Could not write to '%1' Impossibile scrivere su '%1' - + Saving registration for %1 (%2): %3 Salvataggio della registrazione per %1 (%2): %3 @@ -3394,68 +3403,68 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CSound - + Error requesting stream stop: $s Errore durante la richiesta di interruzione del flusso: $s - + Error closing stream: $s Errore chiusura dello stream: $s - + The selected audio device is no longer present in the system. Please check your audio device. Il dispositivo audio selezionato non è più presente nel sistema. Controlla il tuo dispositivo audio. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Impossibile inizializzare il driver audio. Controlla se il tuo hardware audio è collegato e verifica le impostazioni del driver. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Il dispositivo audio selezionato non è compatibile poiché non supporta una frequenza di campionamento di %1 Hz. Seleziona un altro dispositivo. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. L'attuale configurazione del dispositivo audio non è compatibile perché non è stato possibile impostare la frequenza di campionamento su %2 Hz. Verifica la presenza di un interruttore hardware o di un'impostazione del driver per impostare manualmente la frequenza di campionamento e riavviare %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Il dispositivo audio selezionato non è compatibile poiché non supporta %1 canali di ingresso/uscita. Seleziona un altro dispositivo o configurazione. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Il dispositivo audio selezionato non è compatibile poiché il formato del campione audio richiesto non è disponibile. Si prega di utilizzare un altro dispositivo. - + No ASIO audio device driver found. Nessun driver ASIO trovato. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Installa un driver ASIO prima di eseguire %1. Se possiedi un dispositivo con supporto ASIO, installa il suo driver ASIO ufficiale. In caso contrario, dovrai installare un driver universale come ASIO4ALL. - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK non può essere avviato automaticamente. Avvia JACK manualmente e controlla i messaggi di errore. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK non è in esecuzione a una frequenza di campionamento di <b>%1 Hz</b>. Utilizza uno strumento come <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> per impostare la frequenza di campionamento JACK su %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. La registrazione della porta JACK non è riuscita. Questo è probabilmente un errore con JACK. Per favore, ferma %1 e JACK. Successivamente controlla se un altro programma con una frequenza di campionamento di %2 Hz può connettersi a JACK. @@ -3464,62 +3473,62 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat La registrazione della porta JACK non è riuscita. Questo è probabilmente un errore di JACK. Per favore, ferma %1 e JACK. Successivamente, controlla se un altro programma MIDI può connettersi a JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Impossibile attivare il client JACK. Questo è probabilmente un errore di JACK. Si prega di controllare gli errori su JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK è stato chiuso. %1 richiede l'esecuzione di JACK. Riavvia %1 per riavviare JACK. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Nessuna scheda audio è disponibile nel tuo sistema. Ingresso CoreAudio Chiamata AudioHardwareGetProperty non riuscita. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Nessuna scheda audio è disponibile nel sistema. Uscita CoreAudio Chiamata AudioHardwareGetProperty non riuscita. - + The currently selected audio device is no longer present. Please check your audio device. Il dispositivo audio attualmente selezionato non è più presente. Controlla il tuo dispositivo audio. - + The audio input device is no longer available. Please check if your input device is connected correctly. Il dispositivo audio attualmente selezionato non è più presente. Controlla le connessioni sul tuo dispositivo audio. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La frequenza di campionamento sul dispositivo selezionato non è %1 Hz ed è quindi incompatibile. Seleziona un altro dispositivo o prova a impostare manualmente la frequenza di campionamento su %1 Hz tramite Audio-MIDI-Setup (in Applicazioni->Utility). - + The audio output device is no longer available. Please check if your output device is connected correctly. Il dispositivo di uscita audio non è più disponibile. Si prega di verificare se il dispositivo di output è collegato correttamente. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). La frequenza di campionamento sul dispositivo selezionato non è %1 Hz ed è quindi incompatibile. Seleziona un altro dispositivo o prova a impostare manualmente la frequenza di campionamento su %1 Hz tramite Audio-MIDI-Setup (in Applicazioni->Utility). - + The stream format on the current input device isn't compatible with this software. Please select another device. Il formato del flusso sul dispositivo di input corrente non è compatibile con questo software. Seleziona un altro dispositivo. - + The stream format on the current output device isn't compatible with %1. Please select another device. Il formato del flusso sul dispositivo di output corrente non è compatibile con %1. Seleziona un altro dispositivo. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. La dimensione del buffer sul dispositivo audio selezionato non può essere impostata su un valore comune tra input e output. Si prega di selezionare diversi dispositivi di input/output nelle impostazioni di sistema. @@ -3527,27 +3536,27 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Impossibile utilizzare il dispositivo audio selezionato a causa del seguente errore: %1 Verrà selezionato il driver precedente. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Il dispositivo audio selezionato in precedenza non è più disponibile o il driver è passato a uno stato incompatibile. Cercheremo di trovare un dispositivo audio valido. Prima di connetterti a un server, controlla le connessioni sul tuo dispositivo audio dalle impostazioni. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 Impossibile trovare una valida %2 scheda audio.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Puoi risolvare il problema aprendo il software del driver. Vuoi aprire la schermata dei settaggi adesso? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Impossibile avviare %1. Riavvia %1 e controlla/riconfigura le tue impostazioni audio. @@ -3555,53 +3564,57 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Versione %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Rilasciato sotto la GNU General Public License versione 2 o successive (GPLv2) + Rilasciato sotto la GNU General Public License versione 2 o successive (GPLv2) - + This app uses the following libraries, resources or code snippets: Questa app usa le seguenti librerie, risorse o frammenti di codice: - + Qt cross-platform application framework Framework applicativo multipiattaforma Qt - + (build) (compilazione) - + (runtime) (eseguibile) - + Some pixmaps are from the %1 Alcune pixmap provengono da %1 - + Some sound samples are from %1 Alcuni campioni sonori provengono da %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Audio reverberation sviluppato da Perry R. Cook and Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Iconde delle Bandiere di Mark James @@ -3609,12 +3622,12 @@ E' stato disattivato l'audio del tuo canale ed inserito il "Disat global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> È disponibile un aggiornamento %1: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>vai a dettagli e download</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Per maggiori informazioni usare il comando "Cos'è Questo" (Menù Aiuto, Tasto destro del mouse oppure Shift+F1) diff --git a/src/translation/translation_ja_JP.ts b/src/translation/translation_ja_JP.ts index 07daba3ea8..29d7ee1217 100644 --- a/src/translation/translation_ja_JP.ts +++ b/src/translation/translation_ja_JP.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt クロスプラットフォームアプリケーションフレームワーク - + (build) (ビルド) - + (runtime) (ランタイム) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Perry R. Cook および Gary P. Scavone によるオーディオリバーブコード - + This app enables musicians to perform real-time jam sessions over the internet. このアプリを使用すると、ミュージシャンがインターネットを介してリアルタイムでジャムセッションを行うことができます。 - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. 各クライアントからオーディオデータを収集し、ミキシングして、各クライアントに送り返すサーバーがあります。 - + This app uses the following libraries, resources or code snippets: このアプリは以下のライブラリ、リソース、コードスニペットを使用しています: - + Flag icons by Mark James 国旗アイコン by Mark James - + Some pixmaps are from the %1 一部の画像は %1 から取得しています - + Some sound samples are from %1 一部のサウンドサンプルは %1 から取得しています - + For details on the contributions check out the %1 コード貢献の詳細については %1 を確認してください - + Github Contributors list Github コード貢献者リスト - + Spanish スペイン語 - + French フランス語 - + Portuguese ポルトガル語 - + Dutch オランダ語 - + Italian イタリア語 - + German ドイツ語 - + Polish ポーランド語 - + Swedish スウェーデン語 - + Korean 韓国語 - + Slovak スロバキア語 - + Simplified Chinese 簡体字中国語 - + Norwegian Bokmål ノルウェー語(ブークモール) - + Japanese - + About %1 %1 について @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console アナライザーコンソール - + Error Rate of Each Buffer Size 各バッファサイズのエラー率 @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server サーバーでのパーソナルミックス - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. サーバーに接続すると、ここのコントロールで他の人に聞こえる音に影響を与えずにローカルミックスを設定できます。タイトルにはサーバー名が表示され、録音中かどうかも表示されます。 - + Server サーバー - + T R Y I N G T O C O N N E C T 接続中 - + RECORDING ACTIVE 録音中 - + Personal Mix at: %1 パーソナルミックス: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level チャンネルレベル - + Input level of the current audio channel at the server サーバーでの現在のオーディオチャンネルの入力レベル - + Mixer Fader ミキサーフェーダー - + Local mix level setting of the current audio channel at the server サーバーでの現在のオーディオチャンネルのローカルミックスレベル設定 - + Status Indicator ステータスインジケーター - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: このチャンネルに割り当てられたクライアントのステータスを表示します。サポートされるインジケーター: - + Status indicator label ステータスインジケーターラベル - + Panning パンニング - + Local panning position of the current audio channel at the server サーバーでの現在のオーディオチャンネルのローカルパン位置 - + With the Mute checkbox, the audio channel can be muted. ミュートチェックボックスでオーディオチャンネルをミュートできます。 - + Mute button ミュートボタン - + Solo button ソロボタン - + Fader Tag フェーダータグ - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. フェーダータグは接続されたクライアントを識別します。タグ名、楽器の画像、所在地の国旗はメインウィンドウで設定できます。 - + Mixer channel country/region flag ミキサーチャンネル 国/地域の旗 - + Grp グループ - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. このチャンネルのプリフェーダーオーディオレベルを表示します。サーバーに接続されたすべてのクライアントには、同じオーディオレベルが割り当てられます。 - + &No grouping グループ化なし(&N) - + Assign to group グループに割り当て - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. このチャンネルのオーディオレベルを調整します。サーバーに接続されたすべてのクライアントには、ローカルミックスを調整するためのオーディオフェーダーが割り当てられます。 - + Speaker with cancellation stroke: Indicates that another client has muted you. キャンセル線付きスピーカー: 他のクライアントがあなたをミュートしていることを示します。 - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. チャンネルの左右のパンを設定します。ステレオまたはモノラル入力/ステレオ出力モードでのみ動作します。 - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. ソロチェックボックスでオーディオチャンネルをソロに設定できます。ソロ以外のすべてのチャンネルがミュートされます。複数のチャンネルをソロに設定することも可能です。 - + Group グループ - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Grpチェックボックスでオーディオチャンネルグループを定義できます。グループ内のフェーダーを動かすと、すべてのチャンネルフェーダーが比例同期で移動します。 - + Group button グループボタン - + Mixer channel instrument picture ミキサーチャンネル楽器画像 - + Mixer channel label (fader tag) ミキサーチャンネルラベル(フェーダータグ) - + PAN PAN - + MUTE MUTE - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name エイリアス/名前 - + Instrument 楽器 - + Location 所在地 - - - + + + Skill Level スキルレベル - + Alias エイリアス - + Beginner 初心者 - + Intermediate 中級者 - + Expert 上級者 - + Musician Profile ミュージシャンプロフィール - - - + + + Mute ミュート - - - + + + Pan パン - - - + + + Solo ソロ @@ -472,58 +472,58 @@ CChatDlg - + Chat Window チャットウィンドウ - + The chat window shows a history of all chat messages. チャットウィンドウにはすべてのチャットメッセージの履歴が表示されます。 - + Chat history チャット履歴 - + Input Message Text メッセージ入力 - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. 入力ボックスにチャットメッセージを入力しEnterキーを押すと、接続しているすべてのクライアントにメッセージを配信するサーバーにメッセージが送信されます。メッセージはチャットウィンドウに表示されます。 - + New chat text edit box 新しいチャットテキスト入力ボックス - + Type a message here ここにメッセージを入力 - + &Edit 編集(&E) - + Cl&ear Chat History チャット履歴をクリア(&E) - - + + &Close 閉じる(&C) - + Do you want to open the link '%1' in your browser? ブラウザで '%1' のリンクを開きますか? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter 入力レベルメーター - + Make sure not to clip the input signal to avoid distortions of the audio signal. オーディオ信号の歪みを防ぐため、入力信号がクリップしないようにしてください。 - + Input level meter 入力レベルメーター - + Simulates an analog LED level meter. アナログLEDレベルメーターをシミュレートします。 - + Connect/Disconnect Button 接続/切断ボタン - + Connect and disconnect toggle button 接続と切断のトグルボタン - + This shows the level of the two stereo channels for your audio input. オーディオ入力の2つのステレオチャンネルのレベルを表示します。 - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. アプリケーションがサーバーに接続されていて、楽器を演奏したりマイクに向かって歌ったりすると、VUメーターが点滅するはずです。そうでない場合は、間違った入力チャンネルを選択している(例:マイク入力ではなくライン入力)か、(Windows)オーディオミキサーで入力ゲインを低く設定しすぎている可能性があります。 - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). アプリケーションを正しく使用するには、ソフトウェアが接続されていないときにスピーカーやヘッドフォンから自分の歌声や楽器の音が聞こえないようにする必要があります。これは再生ミキサー(録音ミキサーではありません!)で入力オーディオチャンネルをミュートすることで実現できます。 - + Reverb effect リバーブエフェクト - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. リバーブは1つのローカルモノオーディオチャンネル、またはステレオモードの両方のチャンネルに適用できます。モノチャンネルの選択とリバーブレベルを変更できます。例えば、マイク信号がサウンドカードの右オーディオチャンネルに入力され、リバーブエフェクトを適用する必要がある場合は、チャンネルセレクターを右に設定し、希望のリバーブレベルに達するまでフェーダーを上に動かします。 - + Reverb effect level setting リバーブエフェクトレベル設定 - + Reverb Channel Selection リバーブチャンネル選択 - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. これらのラジオボタンで、リバーブエフェクトを適用するオーディオ入力チャンネルを選択できます。左または右の入力チャンネルを選択できます。 - + Left channel selection for reverb リバーブ用左チャンネル選択 - + Right channel selection for reverb リバーブ用右チャンネル選択 - + Green - + The delay is perfect for a jam session. 遅延はジャムセッションに最適な状態です。 - + Yellow - + Red - + If this LED indicator turns red, you will not have much fun using %1. このLEDインジケーターが赤に変わると、%1の使用が楽しくなくなるでしょう。 - + Delay status LED indicator 遅延状態LEDインジケーター - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. 接続するサーバーを選択できるダイアログを開きます。接続中の場合、このボタンを押すとセッションが終了します。 - + Shows the current audio delay status: 現在のオーディオ遅延状態を表示します: - + A session is still possible but it may be harder to play. セッションは可能ですが、演奏が難しくなる場合があります。 - + The delay is too large for jamming. ジャムセッションには遅延が大きすぎます。 - + The sound card's buffer delay (buffer size) is too small (see Settings window). サウンドカードのバッファ遅延(バッファサイズ)が小さすぎます(設定ウィンドウを参照)。 - + The upload or download stream rate is too high for your internet bandwidth. アップロードまたはダウンロードストリームレートがインターネット帯域幅に対して高すぎます。 - - + + C&onnect 接続(&O) - + &File ファイル(&F) - + &View 表示(&V) - + &Connection Setup... 接続設定(&C)... - + My &Profile... マイプロフィール(&P)... - + C&hat... チャット(&H)... - + &Analyzer Console... アナライザーコンソール(&A)... - + Clear &All Stored Solo and Mute Settings 保存されたすべてのソロ・ミュート設定をクリア(&A) - + %1 Directory %1 ディレクトリ - + Ok OK - + E&xit 終了(&X) - + &Edit 編集(&E) - + Delay Status LED 遅延状態LED - + The network jitter buffer is not large enough for the current network/audio interface jitter. ネットワークジッターバッファが、現在のネットワーク/オーディオインターフェースのジッターに対して十分な大きさではありません。 - + The CPU of the client or server is at 100%. クライアントまたはサーバーのCPUが100%になっています。 - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Ping時間は、オーディオストリームがクライアントからサーバーへ移動し、戻ってくるまでに必要な時間です。この遅延はネットワークによって発生し、約20〜30msが目安です。この遅延が約50msを超える場合は、サーバーとの距離が遠すぎるか、インターネット接続が十分ではありません。 - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. 全体遅延は、現在のPing時間と現在のバッファ設定による遅延から計算されます。 - + &Load Mixer Channels Setup... ミキサーチャンネル設定を読み込み(&L)... - + &Save Mixer Channels Setup... ミキサーチャンネル設定を保存(&S)... - + Sort Users by Chann&el チャンネルでユーザーを並べ替え(&E) - + Sett&ings 設定(&I) - + Audio/Network &Settings... オーディオ/ネットワーク設定(&S)... - + A&dvanced Settings... 詳細設定(&D)... - + N&o User Sorting ユーザー並べ替えなし(&O) - + O&wn Fader First 自分のフェーダーを先頭に(&W) - + Sort Users by &Name 名前でユーザーを並べ替え(&N) - + Sort Users by &Instrument 楽器でユーザーを並べ替え(&I) - + Sort Users by &Group グループでユーザーを並べ替え(&G) - + Sort Users by &City 都市でユーザーを並べ替え(&C) - + Set All Faders to New Client &Level すべてのフェーダーを新規クライアントレベルに設定(&L) - + Local Jitter Buffer Status LED ローカルジッターバッファ状態LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: ローカルジッターバッファ状態LEDは、現在のオーディオ/ストリーミング状態を表示します。ライトが赤の場合、オーディオストリームが中断されています。これは以下の問題のいずれかによって引き起こされます: - + If this LED indicator turns red, the audio stream is interrupted. このLEDインジケーターが赤に変わると、オーディオストリームが中断されています。 - + Local Jitter Buffer status LED indicator ローカルジッターバッファ状態LEDインジケーター - + Current Connection Status 現在の接続状態 - + Auto-Adjust all &Faders すべてのフェーダーを自動調整(&F) - + &MIDI Control Settings... - - + + Select Channel Setup File チャンネル設定ファイルを選択 - + user ユーザー - + users ユーザー - + Connect 接続 - + Settings 設定 - + Chat チャット - + Enable feedback detection フィードバック検出を有効化 - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe チャンネルをミュートし、「自分をミュート」を有効にしました。まずフィードバックの問題を解決してから、ミュートを解除してください。 - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. サウンドカードが正しく動作していません。設定ダイアログを開いて、デバイスの選択とドライバーの設定を確認してください。 - + &Disconnect 切断(&D) @@ -1017,1098 +1017,1107 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CClientSettingsDlg - + Jitter Buffer Size ジッターバッファサイズ - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. ジッターバッファの設定は、オーディオ品質と全体的な遅延のトレードオフです。 - + Local jitter buffer slider control ローカルジッターバッファスライダーコントロール - + Server jitter buffer slider control サーバージッターバッファスライダーコントロール - + Auto jitter buffer check box 自動ジッターバッファチェックボックス - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. 接続中にドライバーを選択すると、接続が停止し、ドライバーが変更され、自動的に再接続されます。 - + Sound card device selector combo box サウンドカードデバイス選択コンボボックス - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. ASIO4ALLドライバーを使用する場合、このドライバーは通常約10〜30msの追加オーディオ遅延が発生することに注意してください。そのため、ネイティブASIOドライバーを持つサウンドカードの使用をお勧めします。 - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. kX ASIOドライバーを使用している場合は、kX DSP設定パネルでASIO入力を接続してください。 - + Sound Card Channel Mapping サウンドカードチャンネルマッピング - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. 選択したサウンドカードデバイスが複数の入力または出力チャンネルを提供する場合、入力チャンネルマッピングと出力チャンネルマッピングの設定が表示されます。 - + Left input channel selection combo box 左入力チャンネル選択コンボボックス - + Right input channel selection combo box 右入力チャンネル選択コンボボックス - + Left output channel selection combo box 左出力チャンネル選択コンボボックス - + Right output channel selection combo box 右出力チャンネル選択コンボボックス - + Small Network Buffers 小さなネットワークバッファ - + Small network buffers check box 小さなネットワークバッファチェックボックス - + Sound Card Buffer Delay サウンドカードバッファ遅延 - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. バッファ遅延の設定は%1の基本的な設定です。この設定は多くの接続プロパティに影響を与えます。 - + The buffer setting is therefore a trade-off between audio quality and overall delay. したがって、バッファ設定はオーディオ品質と全体的な遅延のトレードオフです。 - + ASIO Device Settings push button ASIOデバイス設定プッシュボタン - + Sound card driver settings サウンドカードドライバー設定 - + 64 samples setting radio button 64サンプル設定ラジオボタン - + 128 samples setting radio button 128サンプル設定ラジオボタン - + 256 samples setting radio button 256サンプル設定ラジオボタン - + Audio Channels オーディオチャンネル - + Audio channels combo box オーディオチャンネルコンボボックス - + Audio Quality オーディオ品質 - + Audio quality combo box オーディオ品質コンボボックス - + New Client Level 新規クライアントレベル - + New client level edit box 新規クライアントレベル編集ボックス - - + + Mono モノラル - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. モードではストリームのデータレートが増加します。アップロードレートがインターネット接続の利用可能なアップロード速度を超えないようにしてください。 - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> 接続ダイアログのディレクトリドロップダウンに追加のディレクトリを追加する必要がある場合は、ここにアドレスを入力できます。<br> - + Mono-in/Stereo-out モノラル入力/ステレオ出力 - - - + + + Stereo ステレオ - - - + + + &Close 閉じる(&C) - + Local Audio Input Fader ローカルオーディオ入力フェーダー - - + + L L - + Local audio input fader (left/right) ローカルオーディオ入力フェーダー(左/右) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). ジッターバッファはネットワークとサウンドカードのタイミングジッターを補正します。したがってバッファのサイズはオーディオストリームの品質(ドロップアウトの発生頻度)と全体的な遅延(バッファが長いほど遅延が大きくなる)に影響します。 - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. ローカルクライアントとリモートサーバーのジッターバッファサイズを手動で設定できます。ローカルジッターバッファの場合、オーディオストリームのドロップアウトはジッターバッファサイズフェーダーの下のライトで示されます。ライトが赤くなると、バッファオーバーラン/アンダーランが発生し、オーディオストリームが中断されます。 - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). 自動設定が有効な場合、ローカルクライアントとリモートサーバーのジッターバッファはネットワークとサウンドカードのタイミングジッター測定に基づいて自動的に設定されます。自動が有効な場合、ジッターバッファサイズフェーダーは無効化されます(マウスで動かせません)。 - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. 自動設定が有効な場合、オーディオドロップアウトの可能性を最小限に抑えるため、ローカルクライアントとリモートサーバーのネットワークバッファは保守的な値に設定されます。オーディオ遅延/レイテンシを調整するには、自動設定を無効にして、スライダーを使用して個人的に許容できるドロップアウト量に達するまでジッターバッファサイズを手動で下げることをお勧めします。LEDインジケーターはローカルジッターバッファのオーディオドロップアウトを赤色で表示します。 - + 128 samples: Should work for most available sound cards. 128サンプル:ほとんどの利用可能なサウンドカードで動作するはずです。 - + Skin スキン - + Select the skin to be used for the main window. メインウィンドウに使用するスキンを選択します。 - + Skin combo box スキンコンボボックス - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. レベルメーターに使用するメータースタイルを選択します。バー(細)およびLED(丸、小)オプションはミキサーボードにのみ適用されます。バー(細)を選択すると、入力メーターはバー(太)に設定されます。LED(丸、小)を選択すると、入力メーターはLED(丸、大)に設定されます。残りのオプションはミキサーボードと入力メーターに適用されます。 - + Language 言語 - + Select the language to be used for the user interface. ユーザーインターフェースに使用する言語を選択します。 - + Language combo box 言語コンボボックス - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: クライアントとサーバー間の通信に使用するオーディオチャンネル数を選択します。3つのモードが利用可能です: - + These modes use one and two audio channels respectively. これらのモードはそれぞれ1つと2つのオーディオチャンネルを使用します。 - + Mono in/Stereo-out モノラル入力/ステレオ出力 - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. サーバーに送信されるオーディオ信号はモノラルですが、リターン信号はステレオです。これはサウンドカードの一方の入力チャンネルに楽器があり、もう一方にマイクがある場合に便利です。この場合、2つの入力信号を1つのモノラルチャンネルにミックスできますが、サーバーミックスはステレオで聴こえます。 - + Enabling 有効化 - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. ステレオストリーミングモードでは、リバーブエフェクトがこの場合両方のチャンネルに適用されるため、メインウィンドウでのオーディオチャンネル選択は利用できません。 - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. オーディオ品質が高いほど、オーディオストリームのデータレートが高くなります。アップロードレートがインターネット接続の利用可能な帯域幅を超えないようにしてください。 - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. この設定は、新しく接続されたクライアントのフェーダーレベルをパーセントで定義します。新しいクライアントが現在のサーバーに接続すると、そのクライアントの以前の接続から他のフェーダーレベルがまだ保存されていない場合、指定された初期フェーダーレベルが適用されます。 - + Input Boost 入力ブースト - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. この設定では、入力信号レベルを最大10倍(+20dB)まで上げることができます。音が小さすぎる場合は、まずマイクに近づく、音響機器を調整する、またはオペレーティングシステムの入力設定でレベルを上げることを試してください。それでも改善しない場合のみ、ここで係数を設定してください。音が大きすぎる、歪んでいる、クリッピングしている場合、このオプションは役に立ちません。使用しないでください。歪みは残ります。代わりに、マイクから離れる、音響機器を調整する、またはオペレーティングシステムの入力設定を下げることで入力レベルを下げてください。 - + Input Boost combo box 入力ブーストコンボボックス - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. 各%1入力/出力チャンネル(左右チャンネル)に対して、異なる実際のサウンドカードチャンネルを選択できます。 - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. 非常に小さいネットワークオーディオパケットのサポートを有効にします。これらのネットワークパケットは、サウンドカードバッファ遅延が%1サンプルより小さい場合にのみ実際に使用されます。ネットワークバッファが小さいほど、オーディオレイテンシが低くなります。しかし同時に、ネットワーク負荷とオーディオドロップアウトまたはサウンドアーティファクトの可能性が増加します。 - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. 左右のローカルオーディオチャンネルの相対レベルを制御します。モノラル信号の場合、2つのチャンネル間のパンとして機能します。例えば、マイクが右入力チャンネルに接続されていて、楽器がマイクよりもはるかに大きい左入力チャンネルに接続されている場合、フェーダー上のラベルが%1を示す方向にオーディオフェーダーを動かしてください。%2は現在の減衰インジケーターです。 - + Audio Device オーディオデバイス - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Windowsオペレーティングシステムでは、%1を使用してASIOドライバー(サウンドカード)を選択できます。選択したASIOドライバーが有効でない場合、エラーメッセージが表示され、以前の有効なドライバーが選択されます。macOSでは入力および出力ハードウェアを選択できます。 - + Three buffer sizes can be selected 3つのバッファサイズを選択できます - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64サンプル:最も低いレイテンシを提供しますが、すべてのサウンドカードで動作するわけではありません。 - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256サンプル:64または128サンプルで問題が発生する場合にのみ使用してください。 - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. 一部のサウンドカードドライバーは、%1内からバッファ遅延を変更することを許可しません。この場合、バッファ遅延設定は無効になり、サウンドカードドライバーを使用して変更する必要があります。このバッファサイズを調整するには、使用中のインターフェースに適したツールを使用してください。例えば、ASIOを使用している場合は「ASIOデバイス設定」ボタンを使用してドライバー設定パネルを開き、JACKを使用している場合はQjackCtlなどのツールを使用してバッファサイズを調整します。Pipewireなどの他のインターフェースは、適切なツールを使用する必要があります。インターフェースのマニュアルを参照してください。 - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. バッファサイズが選択されておらず、すべての設定が無効になっている場合、ドライバーで使用中のバッファサイズが値と一致しないことを意味します。%1はこの設定でも動作しますが、パフォーマンスが制限される可能性があります。 - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. 実際のバッファ遅延は、接続、現在のアップロードレート、および全体遅延に影響します。バッファサイズが小さいほど、ステータスインジケーターの赤いライト(ドロップアウト)の確率が高くなり、アップロードレートが高くなり、全体遅延が低くなります。 - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. サウンドカードのドライバー設定を開きます。一部のドライバーではバッファ設定を変更でき、ASIO4ALLなどの他のドライバーではデバイスの入力または出力を選択できます。詳細はjamulus.ioで確認できます。 - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. ドライバー設定を開きます。注:%1は現在、サンプルレートが%2 Hzのデバイスのみをサポートしています。それ以外のドライバー/デバイスは選択できません。詳しいヘルプはjamulus.ioを参照してください。 - + Meter Style メータースタイル - + Meter Style combo box メータースタイルコンボボックス - + and - + Custom Directories カスタムディレクトリ - + Custom Directories combo box カスタムディレクトリコンボボックス - + Delete custom directory button カスタムディレクトリ削除ボタン - + Delete Custom Directory カスタムディレクトリを削除 - + Click the button to delete the currently selected custom directory. ボタンをクリックして、現在選択されているカスタムディレクトリを削除します。 - + Audio Upstream Rate オーディオアップストリームレート - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). 現在のオーディオパケットサイズと圧縮設定に依存します。アップストリームレートが利用可能なインターネットアップロード速度より高くないことを確認してください(speedtest.netなどのサービスで確認)。 - + Number of Mixer Panel Rows ミキサーパネルの行数 - + Adjust the number of rows used to arrange the mixer panel. ミキサーパネルの配置に使用する行数を調整します。 - + Number of Mixer Panel Rows spin box ミキサーパネル行数スピンボックス - + Feedback Protection フィードバック保護 - + Prevents acoustic feedback between microphone and speakers. マイクとスピーカー間の音響フィードバックを防止します。 - + Feedback Protection check box フィードバック保護チェックボックス - + Audio Alerts オーディオアラート - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. チャットメッセージを受信したときや、新しいクライアントがセッションに参加したときにオーディオアラートをトリガーします。アラートを聞くには、2番目のサウンドデバイスが必要な場合があります。 - + Audio Alerts check box オーディオアラートチェックボックス - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + ASIO Device Settings ASIOデバイス設定 - + Low - - + + Normal 通常 - + High - + + Max + + + + Fancy ファンシー - + Compact コンパクト - + Bar (narrow) バー(細) - + Bar (wide) バー(太) - + LEDs (stripe) LED(ストライプ) - + LEDs (round, small) LED(丸、小) - + LEDs (round, big) LED(丸、大) - - - - + + + + None なし - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. ここに名前やニックネームを入力して、一緒に演奏したい他のミュージシャンにあなたが誰かを知らせましょう。演奏する楽器の画像や、あなたがいる国や地域の旗を追加することもできます。都市名や楽器の演奏スキルレベルも追加できます。 - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. ここで設定した内容は、%1サーバーに接続すると、ミキサーボードのフェーダーに表示されます。このタグは、あなたと同じサーバーに接続している各クライアントにも表示されます。 - + Country/region flag button 国/地域フラグボタン - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - + Center 中央 - + R R - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + Custom カスタム - + Any Genre 2 全ジャンル 2 - Any Genre 3 - 全ジャンル 3 + 全ジャンル 3 - + + Any Genre Asia + + + + Genre Rock ジャンル ロック - + Genre Jazz ジャンル ジャズ - + Genre Classical/Folk ジャンル クラシック/フォーク - + Genre Choral/Barbershop ジャンル コーラス/バーバーショップ - + Any Genre 1 全ジャンル 1 - + Musician Profile ミュージシャンプロファイル - + Alias or name edit box ニックネームまたは名前編集ボックス - + Instrument picture button 楽器画像ボタン - + City edit box 都市編集ボックス - + Skill level combo box スキルレベルコンボボックス - + Beginner 初心者 - + Intermediate 中級 - + Expert エキスパート - - + + Size: サイズ: - + Buffer Delay バッファ遅延 - + Buffer Delay: バッファ遅延: - + Drum Set ドラムセット - + Djembe ジャンベ - + Electric Guitar エレキギター - + Acoustic Guitar アコースティックギター - + Bass Guitar ベースギター - + Keyboard キーボード - + Synthesizer シンセサイザー - + Grand Piano グランドピアノ - + Accordion アコーディオン - + Vocal ボーカル - + Microphone マイク - + Harmonica ハーモニカ - + Trumpet トランペット - + Trombone トロンボーン - + French Horn フレンチホルン - + Tuba チューバ - + Saxophone サクソフォン - + Clarinet クラリネット - + Flute フルート - + Violin バイオリン - + Cello チェロ - + Double Bass コントラバス - + Recorder リコーダー - + Streamer ストリーマー - + Listener リスナー - + Guitar+Vocal ギター+ボーカル - + Keyboard+Vocal キーボード+ボーカル - + Bodhran バウロン - + Bassoon ファゴット - + Oboe オーボエ - + Harp ハープ - + Viola ビオラ - + Congas コンガ - + Bongo ボンゴ - + Vocal Bass ボーカル バス - + Vocal Tenor ボーカル テノール - + Vocal Alto ボーカル アルト - + Vocal Soprano ボーカル ソプラノ - + Banjo バンジョー - + Mandolin マンドリン - + Ukulele ウクレレ - + Bass Ukulele ベースウクレレ - + Vocal Baritone ボーカル バリトン - + Vocal Lead リードボーカル - + Mountain Dulcimer マウンテンダルシマー - + Scratching スクラッチ - + Rapping ラップ - + Vibraphone ビブラフォン - + Conductor 指揮者 @@ -2508,117 +2517,117 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CConnectDlg - + Directory ディレクトリ - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. 選択したディレクトリに登録されているサーバーを表示します。詳細設定でカスタムディレクトリを追加できます。 - + Directory combo box ディレクトリコンボボックス - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. 指定したテキストでサーバーリストをフィルタリングします。フィルターは大文字小文字を区別しません。単一の # 文字は、少なくとも1人が接続しているサーバーをフィルタリングします。 - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. チェックを外すとサーバーリストを折りたたんでサーバー詳細のみを表示します。チェックするとサーバー上の全員を表示します。 - + Server List サーバーリスト - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. 接続設定ウィンドウには、選択したディレクトリに登録された利用可能なサーバーが一覧表示されます。ディレクトリドロップダウンを使用してディレクトリを変更し、サーバーリストで参加したいサーバーを見つけてクリックし、接続ボタンをクリックして接続します。または、サーバー名をダブルクリックして接続します。 - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. 永続サーバー(48時間以上リストに載っているサーバー)は太字で表示されます。 - + You can add custom directories in Advanced Settings. 詳細設定でカスタムディレクトリを追加できます。 - + Server list view サーバーリストビュー - + Server Address サーバーアドレス - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. サーバーアドレスを知っている場合は、サーバー名/アドレスフィールドを使用して接続できます。コロンを区切り文字として使用して、サーバーアドレスの後にオプションのポート番号を追加できます。例)%1。このフィールドには、最近使用したサーバーアドレスのリストも表示されます。 - + Holds the current server address. It also stores old addresses in the combo box list. 現在のサーバーアドレスを保持し、コンボボックスリストに以前のアドレスを保存します。 - + Delete server address button サーバーアドレス削除ボタン - + Delete Server Address サーバーアドレスを削除 - + Click the button to clear the currently selected server address and delete it from the list of stored servers. ボタンをクリックすると、現在選択されているサーバーアドレスがクリアされ、保存済みサーバーリストから削除されます。 - + Ping Ping - + Server address edit box サーバーアドレス編集ボックス - + Filter フィルター - + Filter edit box フィルター編集ボックス - + Show All Musicians すべてのミュージシャンを表示 - + Show all musicians check box すべてのミュージシャン表示チェックボックス - + Filter text, or # for occupied servers フィルターテキスト、または使用中サーバーの場合は # @@ -2689,43 +2698,43 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CHelpMenu - + &Help ヘルプ(&H) - - + + Getting &Started... はじめに(&S)... - + Software &Manual... ソフトウェアマニュアル(&M)... - + What's &This これは何?(&T) - + P&rivacy policy... - + &About Jamulus... Jamulusについて(&A)... - + About &Qt... Qtについて(&Q)... - + About Qt Qtについて @@ -2733,12 +2742,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLanguageComboBox - + Restart Required 再起動が必要 - + Please restart the application for the language change to take effect. 言語の変更を適用するにはアプリケーションを再起動してください。 @@ -2746,22 +2755,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. このサーバーでは参加する前に条件に同意する必要があります。チャットウィンドウで内容をお読みください。 - + I have read the conditions and &agree. 条件を読み、同意します(&A)。 - + Accept 承諾 - + Decline 拒否 @@ -2769,17 +2778,17 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMultiColorLED - + Red - + Yellow - + Green @@ -2787,7 +2796,7 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMusProfDlg - + No Name 名前なし @@ -2795,448 +2804,448 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerDlg - + Client List クライアントリスト - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. クライアントリストには、現在このサーバーに接続されているすべてのクライアントが表示されます。IPアドレスや名前などのクライアント情報が、接続されている各クライアントについて表示されます。 - + Connected clients list view 接続中のクライアントリストビュー - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>ディレクトリ:</b> サーバーをディレクトリに登録しない場合は「%1」を選択してください。<br>または、登録したいジャンルのディレクトリを選択してください。<br>または「%2」を選択し、オプションタブでカスタムディレクトリアドレスを指定してカスタムディレクトリに登録してください。<br><br>「%1」以外の値の場合、このサーバーはディレクトリに登録され、%3ユーザーがそのディレクトリを選択した際にクライアント接続ダイアログのサーバーリストからこのサーバーを選択できるようになります。<br><br>サーバーの登録は定期的に更新され、接続ダイアログのサーバーリストにあるすべてのサーバーが実際に利用可能であることを確認します。 - + When checked, the recorder will run while a session is in progress (if set up correctly). このオプションを選択すると、セッション中にレコーダーが実行されます(正しく設定されている場合)。 - + Recording has been switched off by the UI checkbox or JSON-RPC. 録音がUIチェックボックスまたはJSON-RPCによってオフになりました。 - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. 録音がUIチェックボックス、SIGUSR2、またはJSON-RPCによってオフになりました。 - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). ボタンをクリックして、メイン録音ディレクトリを選択するダイアログを開きます。選択した値は存在し、書き込み可能である必要があります(ユーザー%1として実行している場合、サブディレクトリの作成を許可)。 - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. メイン録音ディレクトリの現在の値です。選択した値は存在し、書き込み可能である必要があります(ユーザー%1として実行している場合、サブディレクトリの作成を許可)。ボタンをクリックして、メイン録音ディレクトリを選択するダイアログを開きます。 - + Custom Directory address カスタムディレクトリアドレス - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. カスタムディレクトリアドレスは、このサーバーを追加するサーバーリストを保持するディレクトリのアドレスです。 - + Server List Filename dialog push button サーバーリストファイル名ダイアログプッシュボタン - - + + Server List Filename サーバーリストファイル名 - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). ボタンをクリックして、サーバーリスト永続化ファイル名を設定するダイアログを開きます。ユーザー%1として実行している必要があり、指定されたファイル名を作成できる必要があります(既に存在する場合があり、保存時に上書きされます)。 - + Server List Filename text box (read-only) サーバーリストファイル名テキストボックス(読み取り専用) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. サーバーリスト永続化ファイル名の現在の値です。ユーザー%1として実行している必要があり、指定されたファイル名を作成できる必要があります(既に存在する場合があり、保存時に上書きされます)。ボタンをクリックして、サーバーリスト永続化ファイル名を設定するダイアログを開きます。 - + Clear the server list file name button サーバーリストファイル名クリアボタン - + Clear Server List Filename サーバーリストファイル名をクリア - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. ボタンをクリックして、現在選択されているサーバーリスト永続化ファイル名をクリアします。これにより、新しい値が選択されるまでサーバーリストは保存されなくなります。 - + Start Minimized on Operating System Start OS起動時に最小化で起動 - + Register Server Status サーバー登録状態 - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. OS起動時に最小化で起動チェックボックスをオンにすると、OSの起動時にサーバーが起動し、自動的にシステムタスクバーアイコンに最小化されます。 - + Server Name サーバー名 - + The server name identifies your server in the connect dialog server list at the clients. サーバー名は、クライアントの接続ダイアログのサーバーリストでサーバーを識別します。 - + Server name line edit サーバー名行編集 - + Location City 所在地の都市 - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. このサーバーが設置されている都市をここで設定できます。都市名を入力すると、クライアントの接続ダイアログのサーバーリストに表示されます。 - + City where the server is located line edit サーバー所在都市行編集 - + Display dialog to select recording directory button 録音ディレクトリ選択ダイアログ表示ボタン - - + + Main Recording Directory メイン録音ディレクトリ - + Main recording directory text box (read-only) メイン録音ディレクトリテキストボックス(読み取り専用) - + Clear the recording directory button 録音ディレクトリクリアボタン - + Clear Recording Directory 録音ディレクトリをクリア - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. ボタンをクリックすると、現在選択されている録音ディレクトリがクリアされます。これにより、新しい値が選択されるまで録音ができなくなります。 - + Checkbox to turn on or off server recording サーバー録音のオン/オフを切り替えるチェックボックス - + Jam Recorder Jamレコーダー - + If the recording directory is not useable, the problem will be displayed in place of the session directory. 録音ディレクトリが使用できない場合、セッションディレクトリの代わりに問題が表示されます。 - + Current session directory text box (read-only) 現在のセッションディレクトリテキストボックス(読み取り専用) - + Current Session Directory 現在のセッションディレクトリ - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. 録音中に有効になり、現在の録音セッションディレクトリを保持します。録音後またはレコーダーが無効の場合は無効になります。 - + Recorder status label レコーダー状態ラベル - + Recorder Status レコーダー状態 - + Displays the current status of the recorder. The following values are possible: レコーダーの現在の状態を表示します。以下の値が可能です: - + There is no one connected to the server to record. 録音するサーバーに接続しているユーザーがいません。 - + The performers are being recorded to the specified session directory. 演奏は指定されたセッションディレクトリに録音されています。 - + NOTE NOTE - + Server welcome message edit box サーバーウェルカムメッセージ編集ボックス - + Server Welcome Message サーバーウェルカムメッセージ - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. ミュージシャンがサーバーに参加すると、チャットウィンドウにサーバーウェルカムテキストメッセージが表示されます。メッセージが設定されていない場合、サーバーウェルカムは無効になります。 - + Language 言語 - + Select the language to be used for the user interface. ユーザーインターフェースに使用する言語を選択します。 - + Language combo box 言語コンボボックス - + Custom Directory line edit カスタムディレクトリ行編集 - + &Hide %1 server %1 サーバーを隠す(&H) - + &Show %1 server %1 サーバーを表示(&S) - + %1 server %1 is the name of the main application %1 サーバー - + Type a message here. If no message is set, the server welcome is disabled. ここにメッセージを入力してください。メッセージが設定されていない場合、サーバーウェルカムは無効になります。 - + Recorder failed to start. Please check available disk space and permissions and try again. Error: 録音の開始に失敗しました。使用可能なディスク容量と権限を確認して、再試行してください。エラー: - + Now a directory 現在はディレクトリ - + ERROR ERROR - + Request new recording button 新規録音要求ボタン - + Directory Type combo box ディレクトリタイプコンボボックス - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. ディレクトリで「%1」以外の値を選択した場合、登録が成功したかどうかが表示されます。登録に失敗した場合は、別のディレクトリを選択してください。 - + Country/Region 国/地域 - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. サーバーが稼働している国または地域を設定します。クライアントは接続ダイアログのサーバーリストにこの場所を表示します。 - + Combo box for location of this server このサーバーの場所コンボボックス - + No recording directory has been set or the value is not useable. Check the value in the Options tab. 録音ディレクトリが設定されていないか、値が使用できません。オプションタブで値を確認してください。 - + New Recording 新規録音 - + During a recording session, the button can be used to start a new recording. 録音セッション中にボタンを使用して新しい録音を開始できます。 - - + + E&xit 終了(&X) - + %1 Server %1 is the name of the main application %1 サーバー - + Select Main Recording Directory メイン録音ディレクトリを選択 - + Recording 録音中 - + Not recording 録音していません - + Not initialised 未初期化 - + Not enabled 無効 - + &Window ウィンドウ(&W) - + None なし - + Not registered 未登録 - + Bad address 無効なアドレス - + Registration requested 登録要求中 - + Registration failed 登録失敗 - + Check server version サーバーバージョン確認 - + Registered 登録済み - + Server list full at directory ディレクトリのサーバーリストが満杯 - + Your server version is too old サーバーバージョンが古すぎます - + Requirements not fulfilled 要件を満たしていません - + Unknown value %1 不明な値 %1 @@ -3360,32 +3369,32 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerListManager - + Now a directory 現在はディレクトリ - + No longer a directory ディレクトリではなくなりました - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). 「%1」を読み取り/書き込み用に開けませんでした。%2 に権限があるか(空き容量があるか)確認してください。 - + Loading persistent server list file: %1 永続サーバーリストファイルを読み込み中: %1 - + Could not write to '%1' 「%1」に書き込めませんでした - + Saving registration for %1 (%2): %3 %1 (%2) の登録を保存中: %3 @@ -3393,68 +3402,68 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSound - + The selected audio device is no longer present in the system. Please check your audio device. 選択したオーディオデバイスはシステムに存在しません。オーディオデバイスを確認してください。 - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. オーディオドライバを初期化できませんでした。オーディオハードウェアが接続されているか確認し、ドライバ設定を確認してください。 - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. 選択したオーディオデバイスは %1 Hz のサンプルレートをサポートしていないため互換性がありません。別のデバイスを選択してください。 - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. サンプルレートを %2 Hz に設定できなかったため、現在のオーディオデバイス設定は互換性がありません。ハードウェアスイッチまたはドライバ設定を確認してサンプルレートを手動で設定し、%1 を再起動してください。 - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. 選択したオーディオデバイスは %1 入力/出力チャンネルをサポートしていないため互換性がありません。別のデバイスまたは設定を選択してください。 - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. 必要なオーディオサンプル形式が使用できないため、選択したオーディオデバイスは互換性がありません。別のデバイスを使用してください。 - + No ASIO audio device driver found. ASIOオーディオデバイスドライバが見つかりません。 - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. %1 を実行する前にASIOドライバをインストールしてください。ASIO対応のデバイスをお持ちの場合は、公式のASIOドライバをインストールしてください。そうでない場合は、ASIO4ALLのような汎用ドライバをインストールする必要があります。 - + Error requesting stream stop: $s ストリーム停止要求エラー: $s - + Error closing stream: $s ストリーム終了エラー: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACKを自動的に起動できませんでした。JACKを手動で起動し、エラーメッセージを確認してください。 - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACKは <b>%1 Hz</b> のサンプルレートで動作していません。<i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> などのツールを使用して、JACKのサンプルレートを %1 Hz に設定してください。 - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. JACKポートの登録に失敗しました。これはおそらくJACKのエラーです。%1 と JACK を停止してください。その後、サンプルレート %2 Hz の別のプログラムがJACKに接続できるか確認してください。 @@ -3463,62 +3472,62 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe JACKポートの登録に失敗しました。これはおそらくJACKのエラーです。%1 と JACK を停止してください。その後、別のMIDIプログラムがJACKに接続できるか確認してください。 - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. JACKクライアントを有効化できません。これはおそらくJACKのエラーです。JACKの出力を確認してください。 - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACKがシャットダウンしました。%1 を実行するにはJACKが必要です。JACKを再度起動するには %1 を再起動してください。 - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. システムで使用可能なサウンドカードがありません。CoreAudio入力のAudioHardwareGetProperty呼び出しが失敗しました。 - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. システムで使用可能なサウンドカードがありません。CoreAudio出力のAudioHardwareGetProperty呼び出しが失敗しました。 - + The currently selected audio device is no longer present. Please check your audio device. 現在選択されているオーディオデバイスは存在しません。オーディオデバイスを確認してください。 - + The audio input device is no longer available. Please check if your input device is connected correctly. オーディオ入力デバイスが使用できなくなりました。入力デバイスが正しく接続されているか確認してください。 - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 現在の入力デバイスのサンプルレートが %1 Hz ではないため互換性がありません。別のデバイスを選択するか、Audio-MIDI設定(アプリケーション→ユーティリティ)で手動でサンプルレートを %1 Hz に設定してみてください。 - + The audio output device is no longer available. Please check if your output device is connected correctly. オーディオ出力デバイスが使用できなくなりました。出力デバイスが正しく接続されているか確認してください。 - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 現在の出力デバイスのサンプルレートが %1 Hz ではないため互換性がありません。別のデバイスを選択するか、Audio-MIDI設定(アプリケーション→ユーティリティ)で手動でサンプルレートを %1 Hz に設定してみてください。 - + The stream format on the current input device isn't compatible with this software. Please select another device. 現在の入力デバイスのストリーム形式はこのソフトウェアと互換性がありません。別のデバイスを選択してください。 - + The stream format on the current output device isn't compatible with %1. Please select another device. 現在の出力デバイスのストリーム形式は %1 と互換性がありません。別のデバイスを選択してください。 - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. 現在の入力および出力オーディオデバイスのバッファサイズを共通の値に設定できません。システム設定で別の入力/出力デバイスを選択してください。 @@ -3526,27 +3535,27 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. 次のエラーにより選択したオーディオデバイスを使用できません: %1 以前のドライバーが選択されます。 - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. 以前選択したオーディオデバイスは使用できなくなったか、ドライバーが互換性のない状態に変更されました。有効なオーディオデバイスを検索します。ただし、この新しいオーディオデバイスはフィードバックを引き起こす可能性があります。サーバーに接続する前に、オーディオデバイスの設定を確認してください。 - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 で使用可能な %2 オーディオデバイスが見つかりませんでした。</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? ドライバー設定でエラーを修正できる場合があります。今すぐこの設定を開きますか? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. %1 を起動できません。%1 を再起動して、オーディオ設定を確認/再構成してください。 @@ -3554,53 +3563,57 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1、バージョン %2 - Released under the GNU General Public License version 2 or later (GPLv2) - GNU General Public License バージョン2以降 (GPLv2) に基づいてリリース + GNU General Public License バージョン2以降 (GPLv2) に基づいてリリース - + This app uses the following libraries, resources or code snippets: このアプリは以下のライブラリ、リソース、またはコードスニペットを使用しています: - + Qt cross-platform application framework Qt クロスプラットフォームアプリケーションフレームワーク - + (build) (ビルド) - + (runtime) (ランタイム) - + Some pixmaps are from the %1 一部のピクスマップは %1 から取得しています - + Some sound samples are from %1 一部のサウンドサンプルは %1 から取得しています - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Perry R. Cook と Gary P. Scavone によるオーディオリバーブコード - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Mark James による国旗アイコン @@ -3608,12 +3621,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> %1 のアップグレードが利用可能です: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>詳細とダウンロードへ</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) 詳細については「これは何?」ヘルプをご利用ください(ヘルプメニュー、右クリック、または Shift+F1) diff --git a/src/translation/translation_ko_KR.ts b/src/translation/translation_ko_KR.ts index c35ecd9fb6..bde4de5b67 100644 --- a/src/translation/translation_ko_KR.ts +++ b/src/translation/translation_ko_KR.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt 크로스 플랫폼 애플리케이션 프레임워크 - + (build) (빌드) - + (runtime) (런타임) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Perry R. Cook 및 Gary P. Scavone의 오디오 잔향 코드 - + This app enables musicians to perform real-time jam sessions over the internet. 이 앱을 통해 뮤지션이 인터넷으로 실시간 잼 세션을 할 수 있습니다. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. 각 클라이언트에서 오디오 데이터를 수집하고 오디오 데이터를 믹싱하고 믹스를 다시 각 클라이언트로 보내는 서버가 있습니다. - + This app uses the following libraries, resources or code snippets: 이 앱은 다음의 라이브러리, 리소스 또는 코드 스니펫을 사용합니다: - + Flag icons by Mark James 깃발 아이콘 by Mark James - + Some pixmaps are from the %1 일부 픽스맵은 %1에서 가져왔습니다 - + Some sound samples are from %1 일부 사운드 샘플은 %1에서 가져왔습니다 - + For details on the contributions check out the %1 기여에 대한 자세한 내용은 %1에서 확인하세요 - + Github Contributors list Github 기여자 목록 - + Spanish 스페인어 - + French 프랑스어 - + Portuguese 포르투갈어 - + Dutch 네델란드어 - + Italian 이태리어 - + German 독일어 - + Polish 폴란드어 - + Swedish 스웨덴어 - + Korean 한국어 - + Slovak 슬로바키아어 - + Simplified Chinese 중국어 간체 - + Norwegian Bokmål 노르웨이 부크몰어 - + Japanese 일본어 - + About %1 %1 정보 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console 애널라이저 콘솔 - + Error Rate of Each Buffer Size 각 버퍼 크기의 오류 비율 @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server 서버에서 개인 믹싱하기 - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. 서버에 연결했을 때, 여기의 컨트롤을 사용하여 다른 사람이 듣는 내용에 영향을 주지 않고 로컬 믹스를 설정할 수 있습니다. 제목에는 서버 이름이 표시되며, 현재 녹화 중 인지 여부가 표시됩니다. - + Server 서버 - + T R Y I N G T O C O N N E C T 연결하고 있습니다 - + RECORDING ACTIVE 녹음 중 - + Personal Mix at: %1 개인 믹싱: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level 채널 레벨 - + Input level of the current audio channel at the server 서버에서 현재 오디오 채널의 입력 레벨 - + Mixer Fader 믹서 페이더 - + Local mix level setting of the current audio channel at the server 서버에서 현재 오디오 채널의 로컬 믹스 레벨 설정 - + Status Indicator 상태 표시기 - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: 이 채널에 할당된 클라이언트에 대한 상태 표시를 표시합니다. 지원하는 지표: - + Status indicator label 상태 표시기 레이블 - + Panning 패닝 - + Local panning position of the current audio channel at the server 서버에서 현재 오디오 채널의 로컬 패닝 위치 - + With the Mute checkbox, the audio channel can be muted. 음소거 확인란을 사용하여 오디오 채널을 음소거할 수 있습니다. - + Mute button 음소거 버튼 - + Solo button 솔로 버튼 - + Fader Tag 페이더 태그 - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. 페이더 태그는 연결된 클라이언트를 식별합니다. 태그 이름, 악기 사진 및 위치 깃발을 기본 창에서 설정할 수 있습니다. - + Mixer channel country/region flag 믹서 채널 국가/지역 깃발 - + Grp 그룹 - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. 이 채널의 프리 페이더 오디오 레벨을 표시합니다. 서버에 연결된 모든 클라이언트에는 모든 클라이언트에 대해 동일한 오디오 레벨이 할당됩니다. - + &No grouping 그룹화 없음(&N) - + Assign to group 그룹에 할당 - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. 이 채널의 오디오 레벨을 조정합니다. 서버에 연결된 모든 클라이언트에는 로컬 믹스를 조정하기 위해 각 클라이언트에 표시되는 오디오 페이더가 할당됩니다. - + Speaker with cancellation stroke: Indicates that another client has muted you. 취소 스트로크가 있는 스피커: 다른 클라이언트가 사용자를 음소거했음을 나타냅니다. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. 채널의 왼쪽에서 오른쪽으로 팬을 설정합니다. 스테레오 또는 가급적이면 모노 입력/스테레오 출력 모드에서만 작동합니다. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. 솔로 확인란을 사용하여 오디오 채널을 솔로로 설정할 수 있습니다. 즉, 솔로 채널을 제외한 다른 모든 채널이 음소거됩니다. 한 개 이상의 채널을 솔로로 설정할 수 있습니다. - + Group 그룹 - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Grp 확인란을 사용하여 오디오 채널 그룹을 정의할 수 있습니다. 그룹 페이더 중 하나가 이동되면 그룹의 모든 채널 페이더가 비례 동기화로 이동됩니다. - + Group button 그룹 버튼 - + Mixer channel instrument picture 믹서 채널 악기 사진 - + Mixer channel label (fader tag) 믹서 채널 레이블 (페이더 태그) - + PAN PAN - + MUTE MUTE - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name 가명/이름 - + Instrument 악기 - + Location 위치 - - - + + + Skill Level 스킬 레벨 - + Alias 가명 - + Beginner 초보 - + Intermediate 중급 - + Expert 전문가 - + Musician Profile 뮤지션 프로필 - - - + + + Mute 음소거 - - - + + + Pan - - - + + + Solo 솔로 @@ -472,58 +472,58 @@ CChatDlg - + Chat Window 채팅 창 - + The chat window shows a history of all chat messages. 채팅 창에는 모든 채팅 메시지 기록을 보여줍니다. - + Chat history 채팅 기록 - + Input Message Text 메시지 입력 - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. 편집 박스에 채팅 메시지를 입력하고 Enter 키를 누르면 연결된 모든 클라이언트에 메시지를 배포하는 서버로 메시지를 보냅니다. 그러면 메시지가 채팅 창에 표시됩니다. - + New chat text edit box 새로운 채팅 텍스트 편집 박스 - + Type a message here 메시지를 이곳에 입력하세요 - + &Edit 편집(&E) - + Cl&ear Chat History 채팅 기록 비우기(&E) - - + + &Close 닫기(&C) - + Do you want to open the link '%1' in your browser? 브라우저에서 '%1'링크를 여시겠습니까? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter 레벨 미터 입력 - + Make sure not to clip the input signal to avoid distortions of the audio signal. 오디오 신호의 왜곡을 방지하기 위해 입력 신호를 클리핑하지 않도록 하세요. - + Input level meter 레벨 미터 입력 - + Simulates an analog LED level meter. 아날로그 LED 레벨 미터를 시뮬레이션합니다. - + Connect/Disconnect Button 연결/해제 버튼 - + Connect and disconnect toggle button 연결 및 해제 토글 버튼 - + This shows the level of the two stereo channels for your audio input. 오디오 입력에 대한 두 스테레오 채널의 레벨을 보여줍니다. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. 애플리케이션이 서버에 연결되어 있고 악기를 연주하거나 마이크에 대고 노래하면 VU 미터가 깜박입니다. 그렇지 않다면, 입력 채널을 잘못 선택했거나(예: 마이크 입력 대신 라인 입력) 오디오 믹서에서(Windows) 입력 게인을 너무 낮게 설정했을 수 있습니다. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). 애플리케이션을 올바르게 사용하려면 소프트웨어가 연결되어 있지 않을 때엔 스피커나 헤드폰을 통해 노래/악기 소리가 들리지 않아야 합니다. 재생 믹서(녹음 믹서가 아님!)에서 입력 오디오 채널을 음소거하면 됩니다. - + Reverb effect 리버브 효과 - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. 리버브는 하나의 로컬 모노 오디오 채널 또는 스테레오 모드의 두 채널에 모두 적용할 수 있습니다. 모노 채널 선택 및 리버브 레벨을 수정할 수 있습니다. 예를 들면, 마이크 신호가 사운드 카드의 오른쪽 오디오 채널에 입력되고 반향 효과를 적용해야 하는 경우, 채널 선택기를 오른쪽으로 설정하고 원하는 리버브 레벨에 도달할 때까지 페이더를 위쪽으로 이동합니다. - + Reverb effect level setting 리버브 효과 레벨 설정 - + Reverb Channel Selection 리버브 채널 선택 - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. 이 라디오 버튼으로 리버브 효과가 적용되는 오디오 입력 채널을 선택할 수 있습니다. 왼쪽 또는 오른쪽 입력 채널을 선택할 수 있습니다. - + Left channel selection for reverb 리버브 왼쪽 채널 선택 - + Right channel selection for reverb 리버브 오른쪽 채널 선택 - + Green 초록 - + The delay is perfect for a jam session. 딜레이 상태가 잼 세션에 적합합니다. - + Yellow 노랑 - + Red 빨강 - + If this LED indicator turns red, you will not have much fun using %1. 이 LED 표시등이 빨간색으로 바뀌면 %1 사용의 즐거움이 줄어들 겁니다. - + Delay status LED indicator 딜레이 상태 LED 표시등 - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. 연결할 서버를 선택할 수 있는 대화 상자를 엽니다. 연결되어 있는 경우 이 버튼을 누르면 세션이 종료됩니다. - + Shows the current audio delay status: 현재 오디오 딜레이 상태를 표시합니다: - + A session is still possible but it may be harder to play. 세션은 여전히 가능하지만 연주하기 더 어려울 수 있습니다. - + The delay is too large for jamming. 재밍을 하기에는 딜레이가 너무 큽니다. - + The sound card's buffer delay (buffer size) is too small (see Settings window). 사운드 카드 버퍼 딜레이(버퍼 크기)가 너무 작습니다(설정 창 참조). - + The upload or download stream rate is too high for your internet bandwidth. 업로드 또는 다운로드 스트림 속도 전송률이 인터넷 대역폭에 비해 너무 높습니다. - - + + C&onnect 연결(&O) - + &File 파일(&F) - + &View 보기(&V) - + &Connection Setup... 연결 설정(&C)... - + My &Profile... 내 프로필(&P)... - + C&hat... 채팅(&H)... - + &Analyzer Console... 애널라이저 콘솔(&A)... - + Clear &All Stored Solo and Mute Settings 저장된 모든 솔로 및 음소거 설정 지우기(&A) - + %1 Directory %1 디렉터리 - + Ok 확인 - + E&xit 나가기(&X) - + &Edit 편집(&E) - + Delay Status LED 딜레이 상태 LED - + The network jitter buffer is not large enough for the current network/audio interface jitter. 네트워크 지터 버퍼가 현재 네트워크/오디오 인터페이스 지터에 비해 충분히 크지 않습니다. - + The CPU of the client or server is at 100%. 클라이언트 또는 서버의 CPU가 100%입니다. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Ping 시간은 오디오 스트림이 클라이언트에서 서버로 이동하고 다시 돌아오는 데 필요한 시간입니다. 이 딜레이는 네트워크에 의해 발생하며 약 20-30ms 여야 합니다. 이 딜레이가 약 50ms보다 크면 서버와의 거리가 너무 멀거나 인터넷 연결이 충분하지 않은 것입니다. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. 전체 딜레이는 현재 핑 시간과 현재 버퍼 설정으로 인한 딜레이로 계산됩니다. - + &Load Mixer Channels Setup... 믹서 채널 설정 불러오기(&L)... - + &Save Mixer Channels Setup... 믹서 채널 설정 저장하기(&S)... - + Sort Users by Chann&el 채널별로 사용자 정렬(&E) - + Sett&ings 설정(&I) - + Audio/Network &Settings... 오디오/네트워크 설정(&S)... - + A&dvanced Settings... 고급 설정(&D)... - + N&o User Sorting 사용자 정렬 없음(&O) - + O&wn Fader First 자신의 페이더 우선(&W) - + Sort Users by &Name 이름별로 사용자 정렬(&N) - + Sort Users by &Instrument 악기별로 사용자 정렬(&I) - + Sort Users by &Group 그룹별로 사용자 정렬(&G) - + Sort Users by &City 도시별로 사용자 정렬(&C) - + Set All Faders to New Client &Level 모든 페이더를 새 클라이언트 및 레벨로 설정하기(&L) - + Local Jitter Buffer Status LED 로컬 지터 버퍼 상태 LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: 로컬 지터 버퍼 상태 LED는 현재 오디오/스트리밍 상태를 보여줍니다. 표시등이 빨간색이면 오디오 스트림이 중단됩니다. 이는 다음 문제 중 하나로 인해 발생합니다: - + If this LED indicator turns red, the audio stream is interrupted. 이 LED 표시등이 빨간색이면 오디오 스트림이 중단됩니다. - + Local Jitter Buffer status LED indicator 로컬 지터 버퍼 상태 LED 표시등 - + Current Connection Status 현재 연결 상태 - + Auto-Adjust all &Faders 모든 페이더 자동 조정(&F) - + &MIDI Control Settings... - - + + Select Channel Setup File 채널 설정 파일 선택 - + user 사용자 - + users 사용자 - + Connect 연결 - + Settings 설정 - + Chat 채팅 - + Enable feedback detection 피드백 감지 켜기 - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe 채널을 음소거하고 '직접 음소거'를 활성화했습니다. 피드백 문제를 먼저 해결하고 나중에 음소거를 해제하세요. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. 사운드 카드가 제대로 작동하지 않습니다. 설정 대화 상자를 열고 장치 선택과 드라이버 설정을 확인하세요. - + &Disconnect 연결 해제(&D) @@ -1017,1098 +1017,1107 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CClientSettingsDlg - + Jitter Buffer Size 지터 버퍼 크기 - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. 지터 버퍼 설정은 오디오 음질과 전체 딜레이 사이의 균형을 맞추는 작업입니다. - + Local jitter buffer slider control 로컬 지터 버퍼 슬라이더 제어 - + Server jitter buffer slider control 서버 지터 버퍼 슬라이더 제어 - + Auto jitter buffer check box 자동 지터 버퍼 확인란 - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. 연결된 상태에서 드라이버를 선택하면 연결이 중지되고 드라이버를 바꾼 후에 자동으로 다시 연결됩니다. - + Sound card device selector combo box 사운드 카드 선택 콤보 박스 - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. ASIO4ALL 드라이버를 사용하는 경우 이 드라이버는 일반적으로 약 10-30ms의 추가 오디오 딜레이를 일으킵니다. 그러므로 기본 ASIO 드라이버와 함께 사운드 카드를 사용하는 것이 좋습니다. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. kX ASIO 드라이버를 사용하는 경우 kX DSP 설정 패널에서 ASIO 입력을 연결해야 합니다. - + Sound Card Channel Mapping 사운드 카드 채널 매핑 - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. 선택한 사운드 카드 장치가 한 개 이상의 입력 또는 출력 채널을 제공하는 경우 입력 채널 매핑 및 출력 채널 매핑 설정이 표시됩니다. - + Left input channel selection combo box 왼쪽 입력 채널 선택 콤보 박스 - + Right input channel selection combo box 오른쪽 입력 채널 선택 콤보 박스 - + Left output channel selection combo box 왼쪽 출력 채널 선택 콤보 박스 - + Right output channel selection combo box 오른쪽 출력 채널 선택 콤보 박스 - + Small Network Buffers 소규모 네트워크 버퍼 - + Small network buffers check box 소규모 네트워크 버퍼 확인란 - + Sound Card Buffer Delay 사운드 카드 버퍼 딜레이 - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. 버퍼 딜레이 설정의 기본적인 설정은 %1입니다. 이 설정은 많은 연결 속성에 영향을 줍니다. - + The buffer setting is therefore a trade-off between audio quality and overall delay. 따라서 버퍼 설정은 오디오 음질과 전체 딜레이 사이의 균형을 맞추는 작업입니다. - + ASIO Device Settings push button ASIO 장치 설정 푸시 버튼 - + Sound card driver settings 사운드 카드 드라이버 설정 - + 64 samples setting radio button 64 샘플 설정 라디오 버튼 - + 128 samples setting radio button 128 샘플 설정 라디오 버튼 - + 256 samples setting radio button 256 샘플 설정 라디오 버튼 - + Audio Channels 오디오 채널 - + Audio channels combo box 오디오 채널 콤보 박스 - + Audio Quality 오디오 품질 - + Audio quality combo box 오디오 품질 콤보 박스 - + New Client Level 새 클라이언트 레벨 - + New client level edit box 새 클라이언트 레벨 편집 박스 - - + + Mono 모노 - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. 모드는 스트림 데이터 속도를 높입니다. 업로드 속도가 인터넷 연결의 사용 가능한 업로드 속도를 초과하지 않는지 확인하세요. - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> 연결 대화상자의 디렉터리 드롭다운에 추가 디렉터리를 추가해야 하는 경우, 여기에 주소를 입력할 수 있습니다.<br> - + Mono-in/Stereo-out 모노-입력/스테레오-출력 - - - + + + Stereo 스테레오 - - - + + + &Close 닫기(&C) - + Local Audio Input Fader 로컬 오디오 입력 페이더 - - + + L L - + Local audio input fader (left/right) 로컬 오디오 입력 페이더 (왼쪽/오른쪽) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). 지터 버퍼는 네트워크 및 사운드 카드 타이밍 지터를 보완합니다. 따라서 버퍼의 크기는 오디오 스트림의 품질(드롭아웃 발생 수)과 전체 딜레이(버퍼가 길수록 지연이 높아짐)에 영향을 줍니다. - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. 로컬 클라이언트와 원격 서버에 대해 지터 버퍼 크기를 수동으로 설정할 수 있습니다. 로컬 지터 버퍼의 경우 오디오 스트림의 드롭아웃은 지터 버퍼 크기 페이더 아래의 표시등으로 표시됩니다. 표시등이 빨간색으로 바뀌면 버퍼 오버런/언더런이 발생하고 오디오 스트림이 중단됩니다. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). 자동 설정이 활성화되면 로컬 클라이언트와 원격 서버의 지터 버퍼는 네트워크 및 사운드 카드 타이밍 지터 측정을 기반으로 자동으로 설정됩니다. 자동 활성화되면 지터 버퍼 크기 페이더가 비활성화됩니다(마우스로 이동할 수 없음). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Auto 설정이 활성화되면 오디오 드롭아웃 가능성을 최소화하기 위해 로컬 클라이언트와 원격 서버의 네트워크 버퍼가 보수적인 값으로 설정됩니다. 오디오 딜레이/레이턴시을 조정하려면 자동 설정을 비활성화하고 개인이 허용하는 드롭아웃 양에 도달할 때까지 슬라이더를 사용하여 수동으로 지터 버퍼 크기를 낮추는 것이 좋습니다. LED 표시기는 로컬 지터 버퍼의 오디오 드롭아웃을 빨간색으로 표시합니다. - + 128 samples: Should work for most available sound cards. 128 샘플: 사용 가능한 대부분의 사운드 카드에서 작동합니다. - + Skin 스킨 - + Select the skin to be used for the main window. 메인 창에 사용할 스킨을 선택합니다. - + Skin combo box 스킨 콤보 박스 - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. 레벨 미터에 사용할 미터 스타일을 선택합니다. 막대(좁음) 및 LED(둥근, 작은) 옵션은 믹서보드에만 적용됩니다. 바(좁음)를 선택하면 입력 미터가 바(넓음)로 설정됩니다. LED(둥근, 작은)를 선택하면 입력 미터가 LED(둥근, 큰)로 설정됩니다. 나머지 옵션은 믹서보드와 입력 미터에 적용됩니다. - + Language 언어 - + Select the language to be used for the user interface. 사용자 인터페이스에 사용할 언어를 고릅니다. - + Language combo box 언어 콤보 박스 - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: 클라이언트와 서버 간의 통신에 사용할 오디오 채널 수를 선택합니다. 세 가지 모드를 사용할 수 있습니다: - + These modes use one and two audio channels respectively. 이 모드는 각각 1개 및 2개의 오디오 채널을 사용합니다. - + Mono in/Stereo-out 모노 입력/스테레오-출력 - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. 서버로 전송되는 오디오 신호는 모노이지만 리턴 신호는 스테레오입니다. 이것은 사운드 카드의 한 입력 채널에 악기가 있고 다른 입력 채널에 마이크가 있는 경우에 유용합니다. 이 경우 두 개의 입력 신호를 하나의 모노 채널로 믹스할 수 있지만 서버 믹스는 스테레오로 들립니다. - + Enabling 활성화 - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. 스테레오 스트리밍 모드에서, 리버브 효과에 대한 오디오 채널 선택은 두 채널에 효과가 적용되기 때문에 이 경우 메인 창에서는 사용할 수 없습니다. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. 오디오 품질이 높을수록 오디오 스트림 데이터 속도가 높아집니다. 업로드 속도가 인터넷 연결의 사용 가능한 대역폭을 초과하지 않는지 확인하십시오. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. 이 설정은 새로 연결된 클라이언트의 페이더 레벨을 백분율로 정의합니다. 새 클라이언트가 현재 서버에 연결하는 경우 해당 클라이언트의 이전 연결에서 다른 페이더 레벨이 이미 저장되어 있지 않은 경우 지정된 초기 페이더 레벨을 가져옵니다. - + Input Boost 입력 부스트 - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. 이 설정을 사용하면 입력 신호 레벨을 최대 10(+20dB)까지 높일 수 있습니다. 소리가 너무 작으면, 먼저 마이크에 더 가까이 다가가거나 음향 장비를 조정하거나 운영 체제 입력 설정에서 레벨을 높이십시오. 그게 안 되는 경우에만 여기에서 설정하세요. 소리가 너무 크거나 왜곡되고 잘리면 이 옵션이 도움이 되지는 않습니다. 사용하지 않는 게 좋습니다. 왜곡은 여전히 생깁니다. 대신 마이크에서 더 멀리 떨어지거나 음향 장비를 조정하거나 운영 체제 입력 설정을 줄여서 입력 레벨을 줄여보세요. - + Input Boost combo box 입력 부스트 콤보 박스 - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. 각각의 %1 입력/출력 채널(왼쪽 및 오른쪽 채널)마다 다른 실제 사운드 카드 채널을 선택할 수 있습니다. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. 매우 작은 네트워크 오디오 패킷에 대한 지원을 활성화합니다. 이러한 네트워크 패킷은 사운드 카드 버퍼 딜레이가 %1 샘플보다 작은 경우에만 실제로 사용됩니다. 네트워크 버퍼가 작을수록 오디오 대기 시간이 낮아집니다. 그러나 동시에 네트워크 로드와 오디오 드롭아웃 또는 사운드 아티팩트의 가능성이 증가합니다. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. 왼쪽 및 오른쪽 로컬 오디오 채널 사이의 레벨을 적절하게 제어합니다. 모노 신호의 경우 두 채널 사이의 팬 역할을 합니다. 예를 들어 마이크가 오른쪽 입력 채널에 연결되어 있고 악기가 마이크보다 훨씬 큰 왼쪽 입력 채널에 연결된 경우 페이더 위의 레이블이 %1을 표시하는 방향으로 오디오 페이더를 이동합니다. 여기서 %2는 현재 감쇠 표시기입니다. - + Audio Device 오디오 장치 - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Windows 운영 체제에서는 ASIO 드라이버(사운드 카드)를 %1에서 선택할 수 있습니다. 선택한 ASIO 드라이버가 유효하지 않으면 오류 메시지가 표시되고 이전의 유효한 드라이버가 선택됩니다. macOS에서는 입력 및 출력 하드웨어를 선택할 수 있습니다. - + Three buffer sizes can be selected 세 가지 버퍼 크기를 선택할 수 있습니다 - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 샘플: 가장 낮은 대기 시간을 제공하지만 모든 사운드 카드에서 작동하지는 않습니다. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 샘플: 64 또는 128 샘플이 문제를 일으키는 경우에만 사용해야 합니다. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. 일부 사운드 카드 드라이버는 버퍼 딜레이가 %1 내에서 변경되는 것을 허용하지 않습니다. 이 경우 버퍼 딜레이 설정이 비활성화되고 사운드 카드 드라이버를 사용하여 변경해야 합니다. 이 버퍼 크기를 조정하려면 사용 중인 인터페이스에 적절한 도구를 사용하십시오. 예를 들어 ASIO를 사용하는 경우 "ASIO 장치 설정" 버튼을 사용하여 드라이버 설정 패널을 열거나 JACK을 사용하는 경우 QjackCtl과 같은 도구를 사용하여 버퍼 크기를 조정합니다. Pipewire와 같은 다른 인터페이스는 적절한 도구를 사용해야 합니다. 인터페이스 매뉴얼을 참조하십시오. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. 버퍼 크기를 선택하지 않고 모든 설정을 비활성화하면 드라이버에서 사용 중인 버퍼 크기가 값과 일치하지 않음을 의미합니다. 이 설정으로도 %1의 작동은 계속되지만 성능이 제한될 수 있습니다. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. 실제 버퍼 딜레이는 연결, 현재 업로드 속도 및 전체 딜레이에 영향을 미칩니다. 버퍼 크기가 작을수록 상태 표시기에 빨간색 불이 들어올 확률(드롭 아웃)이 높아지며 업로드 속도가 빨라지고 전체 딜레이가 줄어듭니다. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. 사운드 카드의 드라이버 설정을 엽니다. 일부 드라이버는 버퍼 설정을 변경할 수 있도록 하고 ASIO4ALL과 같은 다른 드라이버를 사용하면 장치의 입력 또는 출력을 선택할 수 있습니다. 자세한 내용은 jamulus.io에서 확인할 수 있습니다. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. 드라이버 설정을 엽니다. 참고: 현재 샘플 속도가 %2 Hz인 장치만 %1의 지원을 받습니다. 그렇지 않은 드라이버/장치는 선택할 수 없습니다. 자세한 도움말은 jamulus.io를 참조하세요. - + Meter Style 미터 스타일 - + Meter Style combo box 미터 스타일 콤보 박스 - + and - + Custom Directories 사용자 지정 디렉터리 - + Custom Directories combo box 사용자 지정 디렉터리 콤보 박스 - + Delete custom directory button 사용자 지정 디렉터리 버튼 삭제 - + Delete Custom Directory 사용자 지정 디렉터리 삭제 - + Click the button to delete the currently selected custom directory. 버튼을 클릭하면 현재 선택한 사용자 지정 디렉터리를 삭제할 수 있습니다. - + Audio Upstream Rate 오디오 업스트림 속도 - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). 현재 오디오 패킷 크기 및 압축 설정에 따라 다릅니다. 업스트림 속도가 사용 가능한 인터넷 업로드 속도보다 높지 않은지 확인합니다(speedtest.net과 같은 서비스에서 확인). - + Number of Mixer Panel Rows 믹서 패널 줄 수 - + Adjust the number of rows used to arrange the mixer panel. 믹서 패널을 정렬하는 데 사용되는 줄 수를 조정합니다. - + Number of Mixer Panel Rows spin box 믹서 패널 줄 수 스핀 박스 - + Feedback Protection 피드백 보호 - + Prevents acoustic feedback between microphone and speakers. 마이크와 스피커 간의 음향 피드백을 방지합니다. - + Feedback Protection check box 피드백 보호 체크 박스 - + Audio Alerts 오디오 경고 - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. 대화 메시지를 수신할 때와 새 클라이언트가 세션에 참여할 때 오디오 경고를 트리거합니다. 경고를 들으려면 두 번째 사운드 장치가 필요할 수 있습니다. - + Audio Alerts check box 오디오 경고 확인란 - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + ASIO Device Settings ASIO 장치 설정 - + Low 낮음 - - + + Normal 보통 - + High 높음 - + + Max + + + + Fancy 화려한 - + Compact 간결한 - + Bar (narrow) 막대 (좁음) - + Bar (wide) 막대 (넓음) - + LEDs (stripe) LED (줄무늬) - + LEDs (round, small) LED (둥근, 소형) - + LEDs (round, big) LED (둥근, 대형) - - - - + + + + None 없음 - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. 여기에 여러분의 이름이나 가명을 적어서 함께 연주하고 싶은 다른 뮤지션들이 여러분이 누구인지 알 수 있도록 하세요. 연주하는 악기의 사진과 여러분이 위치한 국가 또는 지역의 국기를 추가할 수도 있습니다. 여러분의 도시 및 악기 연주 기술 수준도 추가할 수 있습니다. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. 여기에서 설정한 내용은 %1 서버에 연결할 때 믹서 보드의 페이더에 나타납니다. 이 태그는 여러분과 동일한 서버에 연결한 각 클라이언트에도 표시됩니다. - + Country/region flag button 국가/지역 깃발 버튼 - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - + Center 가운데 - + R R - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + Custom 사용자 지정 - + Any Genre 2 모든 장르 2 - Any Genre 3 - 모든 장르 3 + 모든 장르 3 - + + Any Genre Asia + + + + Genre Rock 장르 Rock - + Genre Jazz 장르 Jazz - + Genre Classical/Folk 장르 Classical/Folk - + Genre Choral/Barbershop 장르 Choral/Barbershop - + Any Genre 1 모든 장르 1 - + Musician Profile 뮤지션 프로필 - + Alias or name edit box 가명 또는 이름 편집 상자 - + Instrument picture button 악기 사진 버튼 - + City edit box 도시 편집 박스 - + Skill level combo box 스킬 레벨 콤보 박스 - + Beginner 초보 - + Intermediate 중급 - + Expert 전문가 - - + + Size: 크기: - + Buffer Delay 버퍼 딜레이 - + Buffer Delay: 버퍼 딜레이: - + Drum Set 드럼 세트 - + Djembe 젬베 - + Electric Guitar 일렉트릭 기타 - + Acoustic Guitar 어쿠스틱 기타 - + Bass Guitar 베이스 기타 - + Keyboard 키보드 - + Synthesizer 신디사이저 - + Grand Piano 그랜드 피아노 - + Accordion 아코디언 - + Vocal 보컬 - + Microphone 마이크 - + Harmonica 하모니카 - + Trumpet 트럼펫 - + Trombone 트롬본 - + French Horn 호른 - + Tuba 튜바 - + Saxophone 색소폰 - + Clarinet 클라리넷 - + Flute 플루트 - + Violin 바이올린 - + Cello 첼로 - + Double Bass 콘트라베이스 - + Recorder 리코더 - + Streamer 스트리머 - + Listener 청취자 - + Guitar+Vocal 기타+보컬 - + Keyboard+Vocal 키보드+보컬 - + Bodhran 보란 - + Bassoon 바순 - + Oboe 오보에 - + Harp 하프 - + Viola 비올라 - + Congas 콩가 - + Bongo 봉고 - + Vocal Bass 보컬 베이스 - + Vocal Tenor 보컬 테너 - + Vocal Alto 보컬 알토 - + Vocal Soprano 보컬 소프라노 - + Banjo 벤조 - + Mandolin 만돌린 - + Ukulele 우쿨렐레 - + Bass Ukulele 베이스 우쿨렐레 - + Vocal Baritone 보컬 바리톤 - + Vocal Lead 리드 보컬 - + Mountain Dulcimer 마운틴 덜시머 - + Scratching 스크래치 - + Rapping 랩핑 - + Vibraphone 비브라폰 - + Conductor 지휘자 @@ -2508,117 +2517,117 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CConnectDlg - + Directory 디렉터리 - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. 선택한 디렉터리 별로 나열된 서버를 표시합니다. 고급 설정에서 사용자 지정 디렉터리를 추가할 수 있습니다. - + Directory combo box 디렉터리 콤보 박스 - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. 주어진 텍스트로 서버 목록을 필터링합니다. 필터는 대소문자를 구분하지 않습니다. 단일 # 문자는 적어도 한 사람이 연결된 서버를 필터링합니다. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. 서버 세부 정보만 표시하도록 서버 목록을 축소하려면 선택을 취소합니다. 서버의 모든 사람을 표시하려면 선택합니다. - + Server List 서버 목록 - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. 연결 설정 창에는 선택한 디렉터리에 등록된 사용 가능한 서버가 나열됩니다. 디렉터리 드롭 다운을 사용하여 디렉터리를 변경하고 서버 목록에서 가입하려는 서버를 찾아 클릭한 다음 연결 버튼을 클릭하여 연결합니다. 또는 연결할 서버 이름을 두 번 클릭합니다. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. 영구 서버(48시간 이상 나열된 서버)는 굵게 표시됩니다. - + You can add custom directories in Advanced Settings. 고급 설정에서 사용자 지정 디렉터리를 추가할 수 있습니다. - + Server list view 서버 목록 보기 - + Server Address 서버 주소 - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. 서버 주소를 알고 있는 경우 서버 이름/주소 필드를 사용하여 연결할 수 있습니다. 콜론을 구분 기호로 사용하여 서버 주소 뒤에 선택적 포트 번호를 추가할 수 있습니다. 예) %1. 필드에는 가장 최근에 사용한 서버 주소 목록도 표시됩니다. - + Holds the current server address. It also stores old addresses in the combo box list. 현재 서버 주소를 보유하고 콤보 상자 목록에 이전 주소를 저장합니다. - + Delete server address button 서버 주소 버튼 삭제 - + Delete Server Address 서버 주소 삭제 - + Click the button to clear the currently selected server address and delete it from the list of stored servers. 버튼을 클릭하면 현재 선택한 서버 주소가 지워지고 저장된 서버 목록에서 삭제됩니다. - + Ping Ping - + Server address edit box 서버 주소 편집 박스 - + Filter 필터 - + Filter edit box 필터 편집 박스 - + Show All Musicians 모든 뮤지션 보기 - + Show all musicians check box 모든 뮤지션 보기 체크 박스 - + Filter text, or # for occupied servers 필터 텍스트 또는 점유 서버의 경우 # @@ -2689,43 +2698,43 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CHelpMenu - + &Help 도움말 (&H) - - + + Getting &Started... 시작하기(&S)... - + Software &Manual... 소프트웨어 설명서(&M)... - + What's &This 이게 뭘까요(&T) - + P&rivacy policy... 개인정보 정책... - + &About Jamulus... Jamulus 정보(&A)... - + About &Qt... Qt 정보(&Q)... - + About Qt Qt 정보 @@ -2733,12 +2742,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLanguageComboBox - + Restart Required 다시 시작 필요 - + Please restart the application for the language change to take effect. 언어의 변경 사항을 적용하려면 애플리케이션을 다시 시작하세요. @@ -2746,22 +2755,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. 이 서버는 참여하기 전에 역관에 동의해야 합니다. 채팅창에서 읽어주세요. - + I have read the conditions and &agree. 약관을 읽었으며 동의합니다(&A). - + Accept 수락 - + Decline 거절 @@ -2769,17 +2778,17 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMultiColorLED - + Red 빨강 - + Yellow 노랑 - + Green 초록 @@ -2787,7 +2796,7 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMusProfDlg - + No Name 이름 없음 @@ -2795,448 +2804,448 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerDlg - + Client List 클라이언트 목록 - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. 클라이언트 목록에는 현재 이 서버에 연결된 모든 클라이언트가 표시됩니다. IP 주소 및 이름과 같은 클라이언트에 대한 일부 정보는 연결된 각 클라이언트에게 제공됩니다. - + Connected clients list view 연결된 클라이언트 목록 보기 - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>디렉터리:</b> 사용자의 서버를 디렉터리에 등록하지 않으려면 '%1'을(를) 선택합니다.<br>또는 해당 디렉토리에 등록할 장르 중 하나를 선택합니다.<br>또는 '%2'를 선택하고 [옵션] 탭에서 사용자 지정 디렉터리 주소를 지정하여 사용자 지정 디렉터리에 등록하십시오.<br><br>'%1'을 제외한 모든 값의 경우, %3 사용자가 해당 디렉터리를 선택할 때 클라이언트 연결 대화 상자 서버 목록에서 이 서버를 선택할 수 있도록 이 서버는 디렉터리에 등록됩니다.<br><br>서버의 등록은 연결 대화상자 서버 목록의 모든 서버를 실제로 사용할 수 있도록 주기적으로 갱신됩니다. - + When checked, the recorder will run while a session is in progress (if set up correctly). 이 옵션을 선택하면, 세션이 진행되는 동안 녹음기가 실행됩니다( 올바르게 설정된 경우). - + Recording has been switched off by the UI checkbox or JSON-RPC. 녹음이 UI 확인란 또는 JSON-RPC에 의해 꺼졌습니다. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. 녹음이 UI 확인란, SIGUSR2 또는 JSON-RPC에 의해 꺼졌습니다. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). 버튼을 클릭하여 기본 녹음 디렉터리를 선택할 수 있는 대화 상자를 엽니다. 선택한 값은 존재해야 하고 쓰기 가능해야 합니다(사용자 %1에 의해 실행 중인 사용자의 하위 디렉터리 생성 허용). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. 메인 녹음 디렉터리의 현재 값입니다. 선택한 값은 존재해야 하고 쓰기 가능해야 합니다(사용자 %1에 의해 실행 중인 사용자의 하위 디렉터리 생성 허용). 버튼을 클릭하여 기본 녹음 디렉터리를 선택할 수 있는 대화 상자를 엽니다. - + Custom Directory address 사용자 지정 디렉터리 주소 - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. 사용자 지정 디렉터리 주소는 이 서버를 추가해야 하는 서버 목록이 있는 디렉터리의 주소입니다. - + Server List Filename dialog push button 서버 목록 파일 이름 대화 상자 푸시 버튼 - - + + Server List Filename 서버 목록 파일이름 - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). 버튼을 클릭하여 서버 목록 지속성 파일 이름을 설정할 수 있는 대화 상자를 엽니다. %1 사용자는 이미 존재할 수 있지만 지정된 파일 이름을 생성할 수 있어야 하기 때문에 실행 중입니다(저장 시 덮어쓰게 됩니다). - + Server List Filename text box (read-only) 서버 목록 파일 이름 텍스트 박스 (읽기 전용) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. 서버 목록 지속성 파일 이름의 현재 값입니다. %1 사용자는 이미 존재할 수 있지만 지정된 파일 이름을 생성할 수 있어야 하기 때문에 실행 중입니다(저장 시 덮어쓰게 됩니다). 버튼을 클릭하여 서버 목록 지속성 파일 이름을 설정할 수 있는 대화 상자를 엽니다. - + Clear the server list file name button 서버 목록 파일 이름 정리 버튼 - + Clear Server List Filename 서버 목록 파일이름 지우기 - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. 버튼을 클릭하여 현재 선택된 서버 목록 지속성 파일 이름을 지웁니다. 이렇게 하면 새 값을 선택할 때까지 서버 목록이 유지되지 않게 됩니다. - + Start Minimized on Operating System Start 운영 체제 시작 시 최소화로 시작 - + Register Server Status 서버 상태 등록 - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. 운영 체제 시작 시 최소화로 시작 확인란을 선택하면 운영 체제가 시작될 때 서버가 시작되고 자동으로 시스템 작업 표시줄 아이콘으로 최소화됩니다. - + Server Name 서버 이름 - + The server name identifies your server in the connect dialog server list at the clients. 서버 이름은 클라이언트의 연결 대화 상자 서버 목록에서 서버를 식별합니다. - + Server name line edit 서버 이름 라인 편집 - + Location City 도시 위치 - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. 이 서버가 위치한 도시를 여기에서 설정할 수 있습니다. 도시 이름을 입력하면 클라이언트의 연결 대화 상자 서버 목록에 표시됩니다. - + City where the server is located line edit 서버가 위치한 도시 라인 편집 - + Display dialog to select recording directory button 녹음 디렉터리 버튼을 선택하는 대화 상자 표시 - - + + Main Recording Directory 메인 녹음 디렉터리 - + Main recording directory text box (read-only) 메인 녹음 디렉터리 텍스트 박스(읽기 전용) - + Clear the recording directory button 녹음 디렉터리 버튼 정리 - + Clear Recording Directory 녹음 디렉터리 정리 - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. 버튼을 클릭하면 현재 선택한 녹음 디렉터리가 지워집니다. 이렇게 하면 새 값이 선택될 때까지 녹음이 되지 않습니다. - + Checkbox to turn on or off server recording 서버 녹화를 켜거나 끄는 체크박스 - + Jam Recorder Jam 녹음기 - + If the recording directory is not useable, the problem will be displayed in place of the session directory. 녹음 디렉터리를 사용할 수 없는 경우 세션 디렉터리 대신 문제가 표시됩니다. - + Current session directory text box (read-only) 현재 세션 디렉터리 텍스트 박스 (읽기 전용) - + Current Session Directory 현재 세션 디렉터리 - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. 기록하는 동안 활성화되고 현재 기록 세션 디렉터리를 유지합니다. 녹음 후 또는 녹음기가 활성화되지 않은 경우 비활성화됩니다. - + Recorder status label 녹음기 상태 레이블 - + Recorder Status 녹음기 상태 - + Displays the current status of the recorder. The following values are possible: 녹음기의 현재 상태를 표시합니다. 다음 값이 가능합니다: - + There is no one connected to the server to record. 녹음할 서버에 연결된 사용자가 없습니다. - + The performers are being recorded to the specified session directory. 연주는 지정된 세션 디렉터리에 녹음되고 있습니다. - + NOTE NOTE - + Server welcome message edit box 서버 환영 메시지 편집 박스 - + Server Welcome Message 서버 환영 메시지 - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. 뮤지션이 서버에 입장하면 채팅 창에 서버 환영 텍스트 메시지가 표시됩니다. 메시지가 설정되어 있지 않으면 서버 환영이 비활성화됩니다. - + Language 언어 - + Select the language to be used for the user interface. 사용자 인터페이스에 사용할 언어를 고릅니다. - + Language combo box 언어 콤보 박스 - + Custom Directory line edit 사용자 지정 디렉터리 라인 편집 - + &Hide %1 server %1 서버 숨기기(&H) - + &Show %1 server %1 서버 표시하기(&S) - + %1 server %1 is the name of the main application %1 서버 - + Type a message here. If no message is set, the server welcome is disabled. 여기에 메시지를 입력하세요. 메시지가 설정되어 있지 않으면 서버 환영이 비활성화됩니다. - + Recorder failed to start. Please check available disk space and permissions and try again. Error: 녹음을 시작하지 못했습니다. 사용 가능한 디스크 공간과 권한을 확인하고 다시 시도해 보세요. 오류: - + Now a directory 현재 디렉터리 - + ERROR ERROR - + Request new recording button 새 녹음 요청 버튼 - + Directory Type combo box 디렉터리 유형 콤보 박스 - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. 디렉터리에 대해 "%1" 이외의 값을 선택하면 등록 성공 여부가 표시됩니다. 등록에 실패하는 경우 다른 디렉터리를 선택하세요. - + Country/Region 국가/지역 - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. 서버가 실행되는 국가 또는 지역을 설정합니다. 클라이언트는 연결 대화 상자의 서버 목록에 이 위치를 표시합니다. - + Combo box for location of this server 이 서버의 위치에 대한 콤보 박스 - + No recording directory has been set or the value is not useable. Check the value in the Options tab. 녹음 디렉터리가 설정되지 않았거나 값을 사용할 수 없습니다. 옵션 탭에서 값을 확인하세요. - + New Recording 새 녹음 - + During a recording session, the button can be used to start a new recording. 녹음 세션 중에 버튼을 사용하여 새 녹음을 시작할 수 있습니다. - - + + E&xit 나가기(&X) - + %1 Server %1 is the name of the main application %1 서버 - + Select Main Recording Directory 메인 녹음 디렉터리 선택 - + Recording 녹음 - + Not recording 녹음하지 않음 - + Not initialised 시작하지 않음 - + Not enabled 활성화되지 않음 - + &Window 창(&W) - + None 없음 - + Not registered 등록되지 않음 - + Bad address 잘못된 주소 - + Registration requested 등록 요청 - + Registration failed 등록 실패 - + Check server version 서버 버전 확인 - + Registered 등록함 - + Server list full at directory 디렉터리에 서버 목록이 가득 찼습니다 - + Your server version is too old 서버 버전이 너무 오래되었습니다 - + Requirements not fulfilled 요구 사항을 충족하지 않음 - + Unknown value %1 알 수 없는 값 %1 @@ -3360,32 +3369,32 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerListManager - + Now a directory 현재 디렉터리 - + No longer a directory 더 이상 디렉터리가 아닙니다 - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). 읽기/쓰기를 위해 '%1'을(를) 열 수 없습니다. %2에 권한이 있는지(및 여유 공간이 있는지) 확인하십시오. - + Loading persistent server list file: %1 영구 서버 목록 파일 불러오는 중: %1 - + Could not write to '%1' '%1'에 쓸 수 없습니다 - + Saving registration for %1 (%2): %3 %1(%2)에 대한 등록 저장하는 중: %3 @@ -3393,68 +3402,68 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSound - + The selected audio device is no longer present in the system. Please check your audio device. 선택한 오디오 장치가 더 이상 시스템에 없습니다. 오디오 장치를 확인해 주세요. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. 오디오 드라이버를 시작할 수 없습니다. 오디오 하드웨어가 연결되어 있는지 확인하시고 드라이버 설정을 확인해 주세요. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. 선택한 오디오 장치는 %1 Hz의 샘플 속도를 지원하지 않으므로 호환되지 않습니다. 다른 장치를 선택해 주세요. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. 샘플 속도를 %2 Hz로 설정할 수 없기 때문에 현재 오디오 장치 구성이 호환되지 않습니다. 샘플링 속도를 수동으로 설정하려면 하드웨어 스위치나 드라이버 설정을 확인하고 %1 다시 시작해 주세요. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. 선택한 오디오 장치는 %1 입력/출력 채널을 지원하지 않으므로 호환되지 않습니다. 다른 장치 또는 구성을 선택해 주세요. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. 필요한 오디오 샘플 형식을 사용할 수 없으므로 선택한 오디오 장치가 호환되지 않습니다. 다른 장치를 사용해 주세요. - + No ASIO audio device driver found. ASIO 오디오 장치 드라이버를 찾을 수 없습니다. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. %1 실행 전에 ASIO 드라이버를 설치해 주세요. ASIO를 지원하는 장치를 소유하고 계시면 공식 ASIO 드라이버를 설치하세요. 그렇지 않은 경우 ASIO4ALL과 같은 범용 드라이버를 설치해야 합니다. - + Error requesting stream stop: $s 오류 발생 스트림 중지 요청: $s - + Error closing stream: $s 오류 발생 스트림 닫기: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK을 자동으로 시작할 수 없습니다. JACK을 수동으로 시작하고 오류 메시지를 확인해 주세요. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK이 <b>%1 Hz</b> 샘플 레이트에서 실행되고 있지 않습니다. <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> 같은 도구를 이용해서 JACK 샘플 속도를 %1 Hz로 설정해 주세요. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. JACK 포트 등록에 실패했습니다. 이것은 아마도 JACK의 오류일 겁니다. %1 및 JACK을 중지해 주세요. 샘플 레이트가 %2 Hz인 다른 프로그램이 JACK에 연결할 수 있는지 확인해 주세요. @@ -3463,62 +3472,62 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe JACK 포트 등록에 실패했습니다. 이것은 아마도 JACK의 오류일 겁니다. %1 및 JACK을 중지해 주세요. 그런 다음 다른 MIDI 프로그램이 JACK에 연결할 수 있는지 확인해 주세요. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. JACK 클라이언트를 활성화할 수 없습니다. 이것은 아마도 JACK의 오류일 겁니다. JACK의 출력을 확인해 주세요. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK이 종료되었습니다. %1의 실행에는 JACK이 필요합니다. JACK을 다시 실행하려면 %1을(를) 다시 시작하십시오. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. CoreAudio input AudioHardwareGetProperty call failed. 시스템에 사용할 수 있는 사운드 카드가 없습니다. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. CoreAudio output AudioHardwareGetProperty call failed. 시스템에 사용할 수 있는 사운드 카드가 없습니다. - + The currently selected audio device is no longer present. Please check your audio device. 선택한 오디오 장치가 더 이상 시스템에 없습니다. 오디오 장치를 확인해 주세요. - + The audio input device is no longer available. Please check if your input device is connected correctly. 오디오 입력 장치를 더 이상 사용할 수 없습니다. 입력 장치가 올바르게 연결되어 있는지 확인해 주세요. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 현재 입력 장치의 샘플 속도가 %1 Hz가 아니므로 호환되지 않습니다. 다른 장치를 선택하시거나 오디오-MIDI-설정(애플리케이션->유틸리티)을 통해 수동으로 샘플 속도를 %1 Hz로 설정해 보세요. - + The audio output device is no longer available. Please check if your output device is connected correctly. 오디오 출력 장치를 더 이상 사용할 수 없습니다. 출력 장치가 올바르게 연결되어 있는지 확인해 주세요. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 현재 출력 장치의 샘플 속도가 %1 Hz가 아니므로 호환되지 않습니다. 다른 장치를 선택하시거나 오디오-MIDI-설정(애플리케이션->유틸리티)을 통해 수동으로 샘플 속도를 %1 Hz로 설정해 보세요. - + The stream format on the current input device isn't compatible with this software. Please select another device. 현재 입력 장치의 스트림 형식이 이 소프트웨어와 호환되지 않습니다. 다른 장치를 선택해 주세요. - + The stream format on the current output device isn't compatible with %1. Please select another device. 현재 출력 장치의 스트림 형식과 %1의 호환이 되지 않습니다. 다른 장치를 선택해 주세요. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. 현재 입력 및 출력 오디오 장치의 버퍼 크기는 공통 값으로 설정할 수 없습니다. 시스템 설정에서 다른 입력/출력 장치를 선택해 주세요. @@ -3526,27 +3535,27 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. 다음 오류 때문에 선택한 오디오 장치를 사용할 수 없습니다: %1 이전 드라이버가 선택될 겁니다. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. 이전에 선택한 오디오 장치를 더 이상 사용할 수 없거나 드라이버가 호환되지 않는 상태로 변경되었습니다. 유효한 오디오 장치를 찾으려고 시도하겠습니다. 하지만, 이 새 오디오 장치로 인해 피드백이 발생할 수 있습니다. 서버에 연결하기 전에 오디오 장치 설정을 확인해 주세요. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1에서 사용 가능한 %2 오디오 장치를 찾을 수 없습니다.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? 드라이버 설정에서 오류를 수정할 수 있습니다. 지금 이 설정을 여시겠습니까? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. %1 시작할 수 없습니다. %1 다시 시작하고 오디오 설정을 확인/재구성 해주세요. @@ -3554,53 +3563,57 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, 버전 %2 - Released under the GNU General Public License version 2 or later (GPLv2) - GNU 일반 공중 허가서 버전 2 또는 이후 버전에 따라 출시됨 (GPLv2) + GNU 일반 공중 허가서 버전 2 또는 이후 버전에 따라 출시됨 (GPLv2) - + This app uses the following libraries, resources or code snippets: 이 앱은 다음의 라이브러리, 리소스 또는 코드 스니펫을 사용합니다: - + Qt cross-platform application framework Qt 크로스 플랫폼 애플리케이션 프레임워크 - + (build) (빌드) - + (runtime) (런타임) - + Some pixmaps are from the %1 일부 픽스맵은 %1에서 가져왔습니다 - + Some sound samples are from %1 일부 사운드 샘플은 %1에서 가져왔습니다 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Perry R. Cook과 Gary P. Scavone이 작성한 오디오 잔향 코드 - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James 깃발 아이콘 by Mark James @@ -3608,12 +3621,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> %1 업그레이드를 사용할 수 있습니다. <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>세부 정보 및 다운로드로 이동</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) 자세한 내용은 "What's This"를 사용하세요. 도움말(도움말 메뉴, 마우스 오른쪽 버튼 또는 Shift+F1) diff --git a/src/translation/translation_nb_NO.ts b/src/translation/translation_nb_NO.ts index f5596c841e..e81861c5f3 100644 --- a/src/translation/translation_nb_NO.ts +++ b/src/translation/translation_nb_NO.ts @@ -4,132 +4,132 @@ CAboutDlg - + This app enables musicians to perform real-time jam sessions over the internet. Programmet lar musikere spille sammen over Internett. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Det er en server som samler inn lyddataene fra hver klient, blander lyddataene og sender miksen tilbake til hver klient. - + This app uses the following libraries, resources or code snippets: Denne appen bruker følgende biblioteker, ressurser eller kodebiter: - + Qt cross-platform application framework Rammeverk for Qt-applikasjoner på tvers av plattformer - + (build) (bygg) - + (runtime) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Etterklangskode for lyd av Perry R. Cook og Gary P. Scavone - + Flag icons by Mark James Flaggikoner av Mark James - + Some pixmaps are from the %1 - + Some sound samples are from %1 - + For details on the contributions check out the %1 Detaljer om bidragsyterne er å finne i %1 - + Github Contributors list GitHub-bidragsyterlisten - + Spanish Spansk - + French Fransk - + Portuguese Portugisisk - + Dutch Hollandsk - + Italian Italiensk - + German Tysk - + Polish Polsk - + Swedish Svensk - + Korean Koreansk - + Slovak Slovakisk - + Simplified Chinese Forenklet kinesisk - + Norwegian Bokmål Norsk bokmål - + Japanese - + About %1 Om %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Analysatorkonsoll - + Error Rate of Each Buffer Size Feilrate for hver hurtiglagerstørrelse @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Personlig miks på tjeneren - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Når du kobler til en tjener vil kontrollene her la deg sette din lokale miks uten å ha innvirkning på hva andre hører fra deg. Tittelen viser tjenernavn og, (om det er kjent) hvorvidt det er et aktivt opptak. - + Server Tjener - + T R Y I N G T O C O N N E C T P R Ø V E R Å K O B L E T I L - + RECORDING ACTIVE OPPTAK PÅGÅR - + Personal Mix at: %1 Personlig miks på: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan Panorering - - - + + + Mute Forstum - - - + + + Solo Solo - + &No grouping &Ingen gruppering - + Assign to group Tildel til gruppe - + Channel Level Kanalnivå - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Viser pre-fader-lydstyrkenivå for denne kanalen. Alle klienter tilkoblet tjeneren vil bli tildelt et lydstyrkenivå, med lik verdi for hver klient. - + Input level of the current audio channel at the server Inngangsnivå for nåværende lydkanal på tjeneren - + Mixer Fader Mikser-fader - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Justerer lydstyrkenivået for denne kanalen. Alle klienter tilkoblet tjeneren vil bli tildelt en lydstyrkefader, vist ved hver klient, for å justere den lokale miksen. - + Local mix level setting of the current audio channel at the server Lokalt miksernivåinnstilling for nåværende lydkanal på tjeneren - + Status Indicator Statusindikator - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Viser en statusindikator om klienten som er tilknyttet denne kanalen. Støttede indikatorer er: - + Speaker with cancellation stroke: Indicates that another client has muted you. Høyttaler med strek over indikerer at en annen klient har forstummet deg. - + Status indicator label Etikett for statusindikator - + Panning Panorering - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Setter panoreringen fra venstre til høyre for kanalen. Fungerer kun i stereo, eller helst i mono inn/stereo ut-modus. - + Local panning position of the current audio channel at the server Lokal panoreringsposisjon for nåværende lydkanal på tjeneren - + With the Mute checkbox, the audio channel can be muted. Med forstummelsesboksen avhuket vil lydkanalen forstummes. - + Mute button Forstummelsesknapp - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Med «Solo»-sjekkboksen kan lydkanalen settes til solo, som betyr at alle andre kanaler med unntak av påvirket/ede kanal er forstummet. - + Solo button Solo-knapp - + Group Gruppe - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Med «Grp»-sjekkboksen kan lydkanaler defineres som gruppe. Alle fadere i den flyttes i proporsjonal synkronisering hvis én av gruppens fadere flyttes. - + Group button Gruppe-knapp - + Fader Tag Fader-etikett - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Fader-etiketten indentifiserer tilkoblet klient. Etikettnavnet er et bilde av instrumentet ditt, og et flagg for din posisjon kan settes i hovedvinduet. - + Mixer channel instrument picture Mikserkanalens instrumentbilde - + Mixer channel label (fader tag) Mikserkanalens etikett (fader-etikett) - + Mixer channel country/region flag Mikserkanalsland/regionsflagg - + PAN PAN - + MUTE FORSTUM - + SOLO SOLO - + GRP GRP - + M F - + S S - + G G - + Grp Grp - + Alias/Name Alias/navn - + Instrument Instrument - + Location Sted - + Beginner Nybegynner - - - + + + Skill Level Ferdighetsnivå - + Intermediate Middels - + Expert Ekspert - + Musician Profile Musikerprofil - + Alias Alias @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Sludrevindu - + The chat window shows a history of all chat messages. Sludrevinduet viser all sludringshistorikken. - + Chat history Sludringshistorikk - + Input Message Text Skriv meldingstekst - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Skriv sludremeldingsteksten i redigeringsboksen og trykk enter for å sende meldingen til tjeneren som sender meldingen til alle tilkoblede klienter. Meldingen din vil da vises i sludringsvinduet. - + New chat text edit box Ny tekstredigeringsboks for sludring - + Type a message here Skriv en melding her - + &Edit &Rediger - + Cl&ear Chat History &Tøm sludringshistorikk - - + + &Close &Lukk - + Do you want to open the link '%1' in your browser? Åpne «%1»-lenken i nettleseren din? @@ -544,381 +544,381 @@ CClientDlg - + Input Level Meter Inngangsnivå - + This shows the level of the two stereo channels for your audio input. Dette viser nivået for de to stereo-lydkanalene for din lydinngang. - + Make sure not to clip the input signal to avoid distortions of the audio signal. Forsikre deg om at du ikke klipper inngangssignalet, slik at du unngå forvrengning av lydsignalet. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Hvis programmet er tilkoblet en tjener og du spiller ditt instrument/synger i mikrofonen, vil VU-meteret røre seg. Hvis dette ikke skjer har du antageligvis valgt feil inngangskanal (f.eks. «linje inn» istedenfor mikrofoninngangen) eller satt inngangsforsterkningen for lavt i (Windows)-lydmikseren. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Du bør høre synging/instrumenter gjennom høyttalerne eller hodetelefonene dine når programvaren ikke er tilkoblet. Du kan gjøre dette ved å forstumme lydinngangskanalen i avspillingsmikseren (ikke opptaksmikseren). - + Input level meter Inngangsnivåvisning - + Simulates an analog LED level meter. Simulerer et analogt LED-signalnivåpanel. - + Connect/Disconnect Button Koble til/fra -knapp - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Åpner en dialog der du kan velge hvilken tjener du vil koble til. Hvis du er tilkoblet kan du avslutte økten ved å trykke på denne knappen. - + Connect and disconnect toggle button Knapp for tilkobling og frakobling - + Reverb effect Lydklangseffekt - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Lydklang kan brukes på en lokal mono-lydkanal, eller begge lydkanaler i stereomodus. Monokanalvalget og nivået for lydklangseffekten kan endres. For eksempel hvis et mikrofonsignal sendes til høyre lydkanal av lydkortet og en lydklangseffekt må legges til, kan du sette kanalvelgeren til høyre og flytte nivåregulatoren oppover til ønsket lydklangsnivå oppnås. - + Reverb effect level setting Nivåinnstilling for lydklangseffekt - + Reverb Channel Selection Kanalvalg for lydklang - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Disse radioknappene velger lydinngangskanalen lydklangseffekten skal brukes på. Enten venstre eller høyre inngangskanal kan velges. - + Left channel selection for reverb Venstrekanalsvalg for lydklang - + Right channel selection for reverb Høyrekanalsvalg for lydklang - + Delay Status LED Forsinkelsesstatus-LED - + Shows the current audio delay status: Viser status for forsinkelse av nåværende lyd: - + Green Grønn - + The delay is perfect for a jam session. Forsinkelsen er perfekt for samspill. - + Yellow Gul - + A session is still possible but it may be harder to play. En økt er fremdeles mulig, men det kan være vanskeligere å spille. - + Red Rød - + The delay is too large for jamming. Forsinkelsen er for lang for samspill. - + If this LED indicator turns red, you will not have much fun using %1. Hvis denne LED-indikatoren blir rød vil du ikke ha mye glede av å bruke %1. - + Delay status LED indicator LED-indikator for forsinkelsesstatus - + Local Jitter Buffer Status LED Status-LED for lokalt jitter-mellomlager - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Status-LED for lokalt jitter-mellomlager viser nåværende lyd/strømmingsstatus. Hvis lyset er rødt forstyrres lydstrømmen. Dette kan ha sitt opphav i følgende: - + The network jitter buffer is not large enough for the current network/audio interface jitter. Mellomlageret for nettverksjitter er ikke stort nok for nåværende størrelse på jitter fra lyd/nettverksgrensesnittet. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Lydkortets mellomlagerforsinkelse (mellomlagerstørrelse) er for liten (sjekk innstillingsvinduet). - + The upload or download stream rate is too high for your internet bandwidth. Opp- eller nedlastingshastigheten som kreves er for høy for båndbredden din. - + The CPU of the client or server is at 100%. Prosessoren på klienten eller tjeneren jobber 100%. - + If this LED indicator turns red, the audio stream is interrupted. Denne LED-indikatoren blir rød når lydstrømmen forstyrres. - + Local Jitter Buffer status LED indicator LED-indikator for lokalt jitter-mellomlagerstatus - + Current Connection Status Nåværende tilkoblingsstatus - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Pingtid er tiden det tar for lydstrømmen å sendes fra klienten til tjeneren, og så tilbake igjen. Forsinkelsen introduseres av nettverket, og bør være ca. 20–30 ms. Hvis forsinkelsen er mer enn 50 ms er avstanden din til tjeneren for stor, eller så er ikke tilknytningen din til Internett tilstrekkelig. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Helhetlig forsinkelse regnes ut fra nåværende pingtid og forsinkelsen som introdusert av nåværende hurtiglagersinnstillinger. - - + + C&onnect &Koble til - + &File &Fil - + &Connection Setup... &Tilkoblingsoppsett... - + &Load Mixer Channels Setup... Last &inn kanalmikserinnstillingene... - + &Save Mixer Channels Setup... &Lagre kanalmikserinnstillingene... - + E&xit &Avslutt - + &Edit &Rediger - + Clear &All Stored Solo and Mute Settings &Tøm alle lagrede solo- og forstummingsinnstillinger - + Set All Faders to New Client &Level Sett alle fadere til nytt klient&nivå - + Auto-Adjust all &Faders Auto-juster alle &fadere - + &View &Vis - + O&wn Fader First &Egen fader først - + N&o User Sorting Ingen brukers&ortering - + Sort Users by &Name Sorter brukere etter &navn - + Sort Users by &Instrument Sorter brukere etter &instrument - + Sort Users by &Group Sorter brukere etter &gruppe - + Sort Users by &City Sorter brukere etter &by - + Sort Users by Chann&el - + C&hat... &Sludring... - + &Analyzer Console... &Analysatorkonsoll... - + Sett&ings I&nnstillinger - + My &Profile... Min &profil... - + Audio/Network &Settings... Lyd/&nettverksinnstillinger... - + A&dvanced Settings... A&vanserte innstillinger... - + &MIDI Control Settings... - + %1 Directory - - + + Select Channel Setup File Velg kanaloppsettsfil - + user bruker - + users brukere - + Connect Koble til - + Settings Innstillinger - + Chat Sludring - + Enable feedback detection Skru på tilbakekoblingsoppdagelse - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Lydkortet ditt virker ikke rett. Åpne innstillingsdialogen og sjekk enhetsvalg og driverinnstillingene. - + Ok OK - + &Disconnect &Koble fra @@ -1015,1098 +1015,1107 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CClientSettingsDlg - - - + + + &Close &Lukk - + Local Audio Input Fader Fader for lokal lydinngang - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. - - + + L V - + Local audio input fader (left/right) Fader for lokal lydinngang (venstre/høyre) - + Jitter Buffer Size Størrelse på jitter-mellomlager - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. - + Local jitter buffer slider control Glidebryterkontroll for lokalt jittermellomlager - + Server jitter buffer slider control Glidebryterkontroll for tjener-jittermellomlager - + Auto jitter buffer check box - + Audio Device Lydenhet - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. På Windows kan ASIO-driverrutinen (lydkort) velges ved bruk av %1. Hvis valgt ASIO-driverrutine ikke er gyldig vil en feilmelding vises og forrige gyldige driver valgt. På macOS kan inngang- og utgangsmaskinvare velges. - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. - + Sound card device selector combo box Kombinasjonsboksvelger for lydkortsenhet - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Hvis du bruker kX ASIO-driverrutinen må du sørge for å koble til ASIO-inngangene i kX DSP-innstillingspanelet. - + Sound Card Channel Mapping Lydkortets kanalvalg - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Hvis valgt lydkortsenhet tilbyr mer enn én inn- eller utgangskanal, vil inngangskanaltilknytning og utgangskanaltilknytningsinnstillinger bli synlige. - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. For hver %1-inn-/utgangskanal (venstre og høyre kanal) kan en lydkortskanal på selv et annet kort velges. - + Left input channel selection combo box Kombinasjonsboks for valg av venstre inngangskanal - + Right input channel selection combo box Kombinasjonsboks for valg av høyre inngangskanal - + Left output channel selection combo box Kombinasjonsboks for valg av venstre utgangskanal - + Right output channel selection combo box Kombinasjonsboks for valg av høyre utgangskanal - + Small Network Buffers Små nettverksmellomlagre - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. - + Small network buffers check box Små nettverkshurtiglagre-avkryssningsboks - + Sound Card Buffer Delay Lydkorthurtiglager-forsinkelse - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. - + Three buffer sizes can be selected Tre hurtiglagerstørrelser kan velges - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 samplinger: Gir lavest forsinkelse, men fungerer ikke med alle lydkort. - + 128 samples: Should work for most available sound cards. 128 samplinger: Bør fungere på de fleste lydkort. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 samplinger: Bør kun brukes hvis 64 eller 128 samplinger byr på problemer. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. - + The buffer setting is therefore a trade-off between audio quality and overall delay. - + Sound card driver settings Oppsett av driverrutine for lydkort - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Dette åpner driverrutineinnstillingene for lydkortet ditt. Noen driverrutiner lar deg endre hurtiglagerinnstillinger. Andre som f.eks. ASIO4ALL lar deg velge innganger og utganger for din(e) enhet(er). Mer info er å finne på jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Åpner driverrutine-innstillingene. Merk: %1 støtter kun enheter med samplingsrate på %2 Hz for øyeblikket. Du vil ikke kunne velge en driverrutine/enhet som ikke har det. Mer info er å finne på jamulus.io. - + 64 samples setting radio button - + 128 samples setting radio button Radioknapp for valg av 128 samplinger - + 256 samples setting radio button Radioknapp for valg av 256 samplinger - + ASIO Device Settings push button Trykk-knapp for ASIO-enhetsinnstillinger - + Skin Drakt - + Select the skin to be used for the main window. Velg drakt for hovedvinduet - + Skin combo box Draktkombinasjonsboks - + Meter Style - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. - + Meter Style combo box - + Language Språk - + Select the language to be used for the user interface. Velg språk å bruke i brukergrensesnittet. - + Language combo box Språk-kombinasjonsboks - + Audio Channels Lydkanaler - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: - - + + Mono Mono - + and og - - - + + + Stereo Stereo - + These modes use one and two audio channels respectively. Disse bruker respektivt én og to lydkanaler. - + Mono in/Stereo-out Mono inn/stereo ut - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. - + Enabling Skrur på - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. I stereostrømmingsmodus er det ikke noe kanalvalg for lydklangseffekten tilgjengelig fra hovedvinduet, siden effekten brukes for begge kanaler i dette tilfellet. - + Audio channels combo box Kombinasjonsboks for lydkanaler - + Audio Quality Lydkvalitet - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. - + Audio quality combo box Kombinasjonsboks for lydkvalitet - + New Client Level Nytt klientnivå - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. - + New client level edit box Redigeringsboks for nytt klientnivå - + Input Boost - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. - + Input Boost combo box - + Custom Directories Egendefinerte mapper - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> - + Custom Directories combo box Komboboks for egendefinerte mapper - + Delete custom directory button - + Delete Custom Directory - + Click the button to delete the currently selected custom directory. - + Audio Upstream Rate - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). - + Number of Mixer Panel Rows Antall mikserpanelrader - + Adjust the number of rows used to arrange the mixer panel. Juster antall rader brukt i mikserpanelet. - + Number of Mixer Panel Rows spin box - + Feedback Protection Beskyttelse mot tilbakekobling - + Prevents acoustic feedback between microphone and speakers. - + Feedback Protection check box Avkryssningsboks for tilbakekoblingsbeskyttelse - + Audio Alerts Lydvarsler - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. - + Audio Alerts check box - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + ASIO Device Settings ASIO-enhetsinnstillinger - + Mono-in/Stereo-out Mono inn/stereo ut - + Low Lav - - + + Normal Normal - + High Høy - + + Max + + + + Fancy Stilig - + Compact Kompakt - + Bar (narrow) Bjelke (tynn) - + Bar (wide) Bjelke (bred) - + LEDs (stripe) LED-lys (stripe) - + LEDs (round, small) LED-lys (runde, små) - + LEDs (round, big) LED-lys (runde, store) - - - - + + + + None Ingen - + Musician Profile Musikerprofil - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Skriv navnet ditt eller et kallenavn her slik at andre musikere du vil spille med vet hvem du er. Du kan også legge til et bilde av instrumentet du spiller, eller flagget for landet eller regionen du befinner deg i. By og ferdighetsnivå for instrumentet ditt kan også legges til. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. - + Alias or name edit box Redigeringsfelt for alias eller navn - + Instrument picture button Instrumentbildeknapp - + Country/region flag button Land/region-flaggknapp - + City edit box Redigeringsfelt for by - + Skill level combo box Ferdighetsnivå-kombinasjonsboks - + Beginner Nybegynner - + Intermediate Erfaren - + Expert Ekspert - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - - + + Size: Størrelse: - + Buffer Delay Hurtiglagringsforsinkelse - + Buffer Delay: Hurtiglagringsforsinkelse: - + Center Midten - + R H - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + Drum Set Slagverk - + Djembe Djembe - + Electric Guitar Elektrisk gitar - + Acoustic Guitar Akustisk gitar - + Bass Guitar Bassgitar - + Keyboard Klaviatur - + Synthesizer Synthesizer - + Grand Piano Flygel - + Accordion Trekkspill - + Vocal Vokal - + Microphone Mikrofon - + Harmonica Munnspill - + Trumpet Trompet - + Trombone Trombone - + French Horn Valthorn - + Tuba Tuba - + Saxophone Saksofon - + Clarinet Klarinett - + Flute Fløyte - + Violin Fiolin - + Cello Cello - + Double Bass Kontrabass - + Recorder Blokkfløyte - + Streamer Strømmer - + Listener Lytter - + Guitar+Vocal Gitar+vokal - + Keyboard+Vocal Klaviatur+vokal - + Bodhran Bodhrán - + Bassoon Fagott - + Oboe Obo - + Harp Harpe - + Viola Bratsj - + Congas Congas - + Bongo Bongoer - + Vocal Bass - + Vocal Tenor - + Vocal Alto - + Vocal Soprano - + Banjo Banjo - + Mandolin Mandolin - + Ukulele Ukulele - + Bass Ukulele - + Vocal Baritone - + Vocal Lead - + Mountain Dulcimer - + Scratching - + Rapping Rapping - + Vibraphone Vibrafon - + Conductor Dirigent - + Any Genre 2 Enhver sjanger 2 - Any Genre 3 - Enhver sjanger 3 + Enhver sjanger 3 - + + Any Genre Asia + + + + Genre Rock Rock-sjanger - + Genre Jazz Jazz-sjanger - + Genre Classical/Folk Klassisk/folkemusikk-sjanger - + Genre Choral/Barbershop - + Custom Egendefinert - + Any Genre 1 Enhver sjanger 1 @@ -2506,117 +2515,117 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CConnectDlg - + Directory Mappe - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. - + Directory combo box - + Filter Filter - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtrerer tjenerlisten for angitt tekst. Merk at det ikke tas hensyn til små og store bokstaver. Et enkelt «#»-tegn viser tjenere med minst én person tilknyttet. - + Filter edit box - + Show All Musicians Vis alle musikere - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. - + Show all musicians check box Avkryssningsboks for visning av alle musikere - + Server List Tjenerliste - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. - + You can add custom directories in Advanced Settings. Du kan legge til egendefinerte mapper i de avanserte innstillingene. - + Server list view Tjenerlistevisning - + Server Address Tjeneradresse - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. - + Server address edit box Redigeringsboks for tjeneradresse - + Holds the current server address. It also stores old addresses in the combo box list. - + Delete server address button - + Delete Server Address - + Click the button to clear the currently selected server address and delete it from the list of stored servers. - + Filter text, or # for occupied servers Filtrer tekst, eller # for tjenere som ikke er tomme - + Ping Svartidsforespørsel @@ -2687,43 +2696,43 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CHelpMenu - + &Help &Hjelp - - + + Getting &Started... &Begynn... - + Software &Manual... &Programvaremanual... - + What's &This Hva er &dette - + P&rivacy policy... - + &About Jamulus... &Om Jamulus... - + About &Qt... Om &Qt... - + About Qt Om Qt @@ -2731,12 +2740,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLanguageComboBox - + Restart Required Programomstart kreves - + Please restart the application for the language change to take effect. Start programmet på ny for å bruke det nye språket. @@ -2744,22 +2753,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Tjeneren krever at du godtar vilkårene før du kobler til. Les disse i sludringsvinduet. - + I have read the conditions and &agree. Jeg har lest vilkårene og &samtykker. - + Accept Godta - + Decline Avslå @@ -2767,17 +2776,17 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMultiColorLED - + Red Rød - + Yellow Gul - + Green Grønn @@ -2785,7 +2794,7 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMusProfDlg - + No Name Uten navn @@ -2793,448 +2802,448 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerDlg - + %1 Server %1 is the name of the main application %1-tjener - + Client List Klientliste - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. - + Connected clients list view Listevisning av tilkoblede klienter - + Directory Type combo box - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus - + Register Server Status Status for hvorvidt tjeneren er registrert - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. - + Server Name Tjenernavn - + The server name identifies your server in the connect dialog server list at the clients. - + Server name line edit - + Location City - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. - + City where the server is located line edit - + Country/Region Land/region - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. - + Combo box for location of this server - + Checkbox to turn on or off server recording Avkryssningsboks for å slå på eller av tjeneropptak - + Jam Recorder Opptak - + When checked, the recorder will run while a session is in progress (if set up correctly). - + Request new recording button Forespør ny opptaksknapp - + New Recording Nytt opptak - + During a recording session, the button can be used to start a new recording. I løpet av en økt kan knappen brukes til å starte et nytt opptak. - + Recorder status label - + Recorder Status Opptaksstatus - + Displays the current status of the recorder. The following values are possible: - + No recording directory has been set or the value is not useable. Check the value in the Options tab. - + Recording has been switched off by the UI checkbox or JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. - + There is no one connected to the server to record. Det er ingen tilknyttet tjeneren å spille inn. - + The performers are being recorded to the specified session directory. - + NOTE - + If the recording directory is not useable, the problem will be displayed in place of the session directory. - + Current session directory text box (read-only) - + Current Session Directory - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. - + Server welcome message edit box Redigeringsboks for tjenervelkomstmelding - + Server Welcome Message Tjener-velkomstmelding - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. - + Language Språk - + Select the language to be used for the user interface. Velg språk for brukergrensesnittet. - + Language combo box Språk-kombinasjonsboks - + Display dialog to select recording directory button - - + + Main Recording Directory Hovedopptaksmappe - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). - + Main recording directory text box (read-only) - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. - + Clear the recording directory button - + Clear Recording Directory - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. - + Custom Directory address Egendefinert mappeadresse - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. - + Custom Directory line edit - + Server List Filename dialog push button - - + + Server List Filename Tjenerliste-filnavn - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). - + Server List Filename text box (read-only) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. - + Clear the server list file name button - + Clear Server List Filename - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. - + Start Minimized on Operating System Start Start minimert sammen med operativsystemet - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. - - + + E&xit &Avslutt - + &Hide %1 server &Skjul %1-tjener - + &Show %1 server &Vis %1-tjener - + %1 server %1 is the name of the main application %1-tjeneren - + Type a message here. If no message is set, the server welcome is disabled. - + &Window &Vindu - + Recorder failed to start. Please check available disk space and permissions and try again. Error: - + Select Main Recording Directory - + Now a directory - + ERROR Feil - + Not initialised - + Not enabled Ikke påskrudd - + Not recording Tar ikke opp - + Recording Innspilling - + None Ingen - + Not registered Ikke registrert - + Bad address Feilaktig adresse - + Registration requested Registrering forespurt - + Registration failed Registrering mislyktes - + Check server version Sjekk tjenerversjonen - + Registered Registrert - + Server list full at directory - + Your server version is too old Tjenerversjonen din er for gammel - + Requirements not fulfilled Krav er ikke oppfylt - + Unknown value %1 Ukjent verdi (%1) @@ -3358,32 +3367,32 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerListManager - + Now a directory - + No longer a directory - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). - + Loading persistent server list file: %1 - + Could not write to '%1' Kunne ikke skrive til «%1» - + Saving registration for %1 (%2): %3 @@ -3391,108 +3400,108 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSound - + The selected audio device is no longer present in the system. Please check your audio device. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. - + No ASIO audio device driver found. Fant ingen ASIO-lydenhetsdriver. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Installer en ASIO-lydenhetsdriver før du kjører %1. Hvis du eier en enhet med ASIO-støtte kan du installere dens offisielle ASIO-driver. Hvis ikke må du installere en universell driver som f.eks ASIO4ALL. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. - + The currently selected audio device is no longer present. Please check your audio device. - + The audio input device is no longer available. Please check if your input device is connected correctly. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). - + The audio output device is no longer available. Please check if your output device is connected correctly. Lydutgangsenheten er ikke lenger tilgjengelig. Sjekk at utgangsenheten din er tilkoblet på riktig vis. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). - + The stream format on the current input device isn't compatible with this software. Please select another device. - + The stream format on the current output device isn't compatible with %1. Please select another device. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. Kunne ikke starte JACK automatisk. Start JACK på ny automatisk og sjekk om du finner noen feilmeldinger. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK kjører ikke med samplingstakt på <b>%1 Hz</b>. Bruk et verktøy som f.eks. <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> for å sette JACK-samplingstakten til %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. Kunne ikke registrere port for JACK. Dette er antagelig en feil i JACK. Stopp %1 og JACK. Etterpå kan du sjekke om et annet program med samplingstakt på %2 Hz kan koble til JACK. @@ -3501,22 +3510,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Kunne ikke registrere port for JACK. Dette er antagelig en feil i JACK. Stopp %1 og JACK. Etterpå kan du sjekke om et annet MIDI-program kan koble til JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Kan ikke aktivere JACK-klienten. Dette er antagelig en feil med JACK. Sjekk JACK-utgangen. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK ble skrudd av. %1 krever at JACK kjører. Start %1 på ny for å starte JACK igjen. - + Error requesting stream stop: $s Kunne ikke forespørre stopping av strøm: $s - + Error closing stream: $s Kunne ikke lukke strømmen: $s @@ -3524,27 +3533,27 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Kan ikke bruke valgt lydenhet fordi: %1 Forrige driver vil bli valgt. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Tidligere valgt driver er ikke lenger tilgjengelig, eller så har den endret seg til en inkompatibel tilstand. Forsøk på å finne en gyldig lydenhet vil bli utført, men denne nye lydenheten kan forårsake tilbakekobling. Før du kobler til en tjener bør du sjekke lydenhetsinnstillingene dine. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 kunne ikke finne noen anvendbar %2-lydenhet.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Åpne driverinnstillingene for å sjekke om du kan fikse feilene der? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Kan ikke starte %1. Start %1 på ny og sjekk/sett opp lydinnstillingene dine igjen. @@ -3552,53 +3561,57 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, versjon %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Lisensiert GPLv2+ + Lisensiert GPLv2+ + + + + Released under the GNU Affero General Public License 3.0 (or any later version) + - + This app uses the following libraries, resources or code snippets: Denne appen bruker følgende biblioteker, ressurser eller kodebiter: - + Qt cross-platform application framework Rammeverk for Qt-applikasjoner på tvers av plattformer - + (build) (bygg) - + (runtime) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Etterklangskode for lyd av Perry R. Cook og Gary P. Scavone - + Some pixmaps are from the %1 - + Flag icons by Mark James Flaggikoner av Mark James - + Some sound samples are from %1 @@ -3606,12 +3619,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> En %1-oppgradering er tilgjengelig: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>gå til detaljer og last den ned</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Mer info får du ved å bruke «Hva er dette»-hjelpen (hjelpemeny, høyreklikksknapp, eller Shift+F1) diff --git a/src/translation/translation_nl_NL.ts b/src/translation/translation_nl_NL.ts index a3bb21ec6d..550d4ec19b 100644 --- a/src/translation/translation_nl_NL.ts +++ b/src/translation/translation_nl_NL.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt cross-platform applicatieframework - + (build) (build) - + (runtime) (runtime) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Audio reverberatiecode door Perry R. Cook en Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Deze applicatie stelt muzikanten in staat om real-time jamsessies uit te voeren via het internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Een server verzamelt de audiodata van elke client, mixt deze en stuurt de mix weer terug naar iedere client. - + This app uses the following libraries, resources or code snippets: Deze applicatie gebruikt de volgende libraries, bronnen of code snippets: - + Flag icons by Mark James Vlag-iconen van Mark James - + Some pixmaps are from the %1 Sommige pixmaps zijn van de %1 - + Some sound samples are from %1 Sommige geluiden komen van %1 - + For details on the contributions check out the %1 Voor details over de bijdragen, zie de %1 - + Github Contributors list Github bijdragerslijst - + Spanish Spaans - + French Frans - + Portuguese Portugees - + Dutch Nederlands - + Italian Italiaans - + German Duits - + Polish Pools - + Swedish Zweeds - + Korean Koreaans - + Slovak Slowaaks - + Simplified Chinese Chinees (vereenvoudigd) - + Norwegian Bokmål Noors (Bokmål) - + Japanese Japans - + About %1 Over %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Analyzer console - + Error Rate of Each Buffer Size Foutpercentage van elke buffergrootte @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Eigen mix op de server - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Indien verbonden met de server kan hier de lokale mix ingesteld worden zonder dat hetgeen anderen horen wordt beïnvloed. De titel toont de servernaam en indien bekend is of er audio wordt opgenomen. - + Server Server - + T R Y I N G T O C O N N E C T A A N H E T V E R B I N D E N - + RECORDING ACTIVE GELUIDSOPNAME ACTIEF - + Personal Mix at: %1 Eigen mix op: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan Bal. - - - + + + Mute Demp - - - + + + Solo Solo - + &No grouping &Geen groepering - + Assign to group Toewijzen aan groep - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. De fadertag identificeert de verbonden client. De tagnaam, de afbeelding van uw instrument en een vlag van uw locatie kunnen in het hoofdvenster worden ingesteld. - + Mixer channel country/region flag Land/regio vlag van het kanaal - + Grp Grp - + Channel Level Kanaalniveau - + Input level of the current audio channel at the server Invoerniveau van het huidige audiokanaal op de server - + Mixer Fader Mixer fader - + Local mix level setting of the current audio channel at the server Lokale instelling van het mixniveau van het huidige audiokanaal op de server - + Status Indicator Statusindicatie - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Toont de status van de muzikant die aan dit kanaal is toegewezen. Ondersteunde indicaties: - + Status indicator label Statusindicatielabel - + Panning Balans - + Local panning position of the current audio channel at the server Lokale balans-positie van het huidige audiokanaal op de server - + With the Mute checkbox, the audio channel can be muted. Met het Demp selectievakje kan het audiokanaal worden gedempt. - + Mute button Dempknop - + Solo button Soloknop - + Fader Tag Fader tag - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Geeft het pre-fader-audioniveau van dit kanaal weer. Alle clients die verbonden zijn met de server krijgen een audioniveau toegewezen, dezelfde waarde voor elke client. - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Past het geluidsniveau van dit kanaal aan. Alle verbonden clients op de server krijgen een audiofader toegewezen, waarmee de lokale mix kan worden aangepast. - + Speaker with cancellation stroke: Indicates that another client has muted you. Doorgestreepte luidspreker: Geeft aan dat een andere muzikant u gedempt heeft. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Stelt de balans in van links naar rechts. Werkt alleen in stereo of bij voorkeur voor mono in/stereo uit mode. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Met het Solo selectievakje kan het audiokanaal worden ingesteld op solo, zodat alle overige kanalen worden gedempt. Het is mogelijk om meer dan één kanaal op solo in te stellen. - + Group Groep - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Met het Grp selectievakje kan een groep van audiokanalen worden gedefinieerd. Alle kanaalfaders in een groep bewegen mee indien een van de faders wordt verschoven. - + Group button Groepknop - + Mixer channel instrument picture Afbeelding van het mengkanaalinstrument - + Mixer channel label (fader tag) Label van het mengkanaal (faderlabel) - + PAN BAL. - + MUTE DEMP - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Alias/naam - + Instrument Instrument - + Location Locatie - - - + + + Skill Level Vaardigheidsniveau - + Alias Alias - + Beginner Beginner - + Intermediate Gemiddeld - + Expert Gevorderd - + Musician Profile Muzikantenprofiel @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Chatvenster - + The chat window shows a history of all chat messages. Het chatvenster toont een geschiedenis van alle chatberichten. - + Chat history Chatgeschiedenis - + Input Message Text Tekst van het invoerbericht - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Type het chatbericht in het bewerkingsvak in en druk op enter om het bericht naar de server te sturen, die het bericht naar alle verbonden clients distribueert. Uw bericht verschijnt dan in het chatvenster. - + New chat text edit box Nieuw chat tekstbewerkingsvak - + Type a message here Typ hier een bericht - + &Edit &Bewerk - + Cl&ear Chat History &Wis chatgeschiedenis - - + + &Close &Sluiten - + Do you want to open the link '%1' in your browser? Wilt u de link '%1' in uw browser openen? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter Ingangsniveaumeter - + Make sure not to clip the input signal to avoid distortions of the audio signal. Zorg ervoor dat u het ingangssignaal niet clipt om vervorming van het audiosignaal te voorkomen. - + Input level meter Ingangsniveaumeter - + Simulates an analog LED level meter. Simuleert een analoge LED-niveaumeter. - + Connect/Disconnect Button Verbinden/afmelden-knop - + Connect and disconnect toggle button Knop voor het opzetten en verbreken van de verbinding - + Delay Status LED Vertragingsstatus LED - + Delay status LED indicator Vertraging status LED-indicator - + The network jitter buffer is not large enough for the current network/audio interface jitter. De buffer voor de netwerkjitter is niet groot genoeg voor de huidige netwerk-/audio-interfacejitter. - + This shows the level of the two stereo channels for your audio input. Dit toont het niveau van de twee stereokanalen voor de audio-invoer. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Indien de applicatie verbonden is met een server en in de microfoon wordt gespeeld of gezongen, dan zou de LED-niveaumeter moeten flikkeren. Als dit niet het geval is, dan heeft u waarschijnlijk het verkeerde ingangskanaal gekozen (bijv. line in i.p.v. de microfooningang) of heeft u de ingangsversterking te laag ingesteld in de (Windows) audiomixer. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Voor goed gebruik van de applicatie moet u de zang of het instrument niet via de luidspreker of koptelefoon horen als de software niet verbonden is. Dit kan worden bereikt door het dempen van het audiokanaal in de afspeelmixer (niet de opnamemixer!). - + Reverb effect Galm-effect - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Een galmeffect kan worden toegepast op één lokaal mono-audiokanaal of op beide kanalen in de stereomodus. De monokanaalselectie en het galmniveau kunnen worden aangepast. Als bijvoorbeeld het microfoonsignaal in het juiste audiokanaal van de geluidskaart binnenkomt en er een galmeffect wordt toegepast, zet u de kanaalkeuzeschakelaar naar rechts en beweegt u de fader omhoog tot het gewenste galmniveau is bereikt. - + Reverb effect level setting Instelling van het niveau van het galmeffect - + Reverb Channel Selection Selectie van het galmkanaal - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Met deze radioknoppen kan het audio-invoerkanaal worden gekozen waarop het galmeffect wordt toegepast. Het linker of rechter ingangskanaal kan worden gekozen. - + Left channel selection for reverb Linker kanaalselectie voor galm - + Right channel selection for reverb Rechter kanaalselectie voor galm - + Green Groen - + The delay is perfect for a jam session. De vertraging is prima voor een jamsessie. - + Yellow Geel - + Red Rood - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Laat een dialoog zien waarin u een server kunt selecteren om mee te verbinden. Indien reeds verbonden verbreekt deze knop de verbinding. - + Shows the current audio delay status: Toont de huidige geluidsvertragingsstatus: - + A session is still possible but it may be harder to play. Een sessie is nog mogelijk maar zal moeilijk gaan. - + The delay is too large for jamming. De vertraging is te groot voor een jamsessie. - + The sound card's buffer delay (buffer size) is too small (see Settings window). De buffer vertraging van de geluidskaart (buffergrootte) is op een te kleine waarde ingesteld. - + The upload or download stream rate is too high for your internet bandwidth. De bitsnelheid van de audio staat te hoog voor de huidige beschikbare internetbandbreedte. - + The CPU of the client or server is at 100%. De CPU van de client of server staat op 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. De ping-tijd is de tijd die nodig is voor de audiostream om van de client naar de server en terug te reizen. Deze vertraging wordt veroorzaakt door het netwerk en bedraagt ongeveer 20-30 ms. Als deze vertraging hoger is dan circa 50 ms, dan is uw afstand tot de server te groot of is uw internetverbinding niet toereikend. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. De totale vertraging wordt berekend op basis van de huidige ping-tijd en de vertraging door de huidige bufferinstellingen. - - + + C&onnect &Verbinden - + &File &Bestand - + &View &Weergave - + &Connection Setup... &Verbindingsinstellingen... - + My &Profile... Mijn &profiel... - + C&hat... &Chat... - + &Analyzer Console... &Analyzer console... - + N&o User Sorting Kanalen niet s&orteren - + Sort Users by &City Sorteer muzikanten op &Stad - + Clear &All Stored Solo and Mute Settings &Wis alle opgeslagen solo- en demp-instellingen - + Auto-Adjust all &Faders Stel alle &faders automatisch in - + Sort Users by Chann&el Sorteer muzikanten op &Kanaal - + Sett&ings In&stellingen - + %1 Directory %1 adresboek - + Ok Ok - + Set All Faders to New Client &Level &Zet alle faders op nieuw client-niveau - + E&xit &Afsluiten - + Local Jitter Buffer Status LED Lokale jitterbuffer status LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: De lokale jitterbuffer status LED geeft de huidige audio/streaming status weer. Indien deze rood is dan wordt de audio onderbroken. Dit komt door één van de volgende problemen: - + Local Jitter Buffer status LED indicator Lokale jitterbuffer LED status indicator - + &Load Mixer Channels Setup... Mixer kanaalinstellingen &laden... - + &Save Mixer Channels Setup... Mixer kanaalinstellingen &opslaan... - + Audio/Network &Settings... Audio-/netwerk-&instellingen... - + A&dvanced Settings... Geavanceer&de instellingen... - + &Edit B&ewerken - + If this LED indicator turns red, you will not have much fun using %1. Als deze LED-indicator rood wordt, zult u niet veel plezier beleven aan het gebruik van %1. - + If this LED indicator turns red, the audio stream is interrupted. Als deze LED-indicator rood wordt, dan wordt de audiostream onderbroken. - + Current Connection Status Huidige verbindingsstatus - + O&wn Fader First &Eigen fader eerst - + Sort Users by &Name Sorteer muzikanten op &Naam - + Sort Users by &Instrument Sorteer muzikanten op &Instrument - + Sort Users by &Group Sorteer muzikanten op &Groep - + &MIDI Control Settings... &MIDI-besturinginstellingen... - - + + Select Channel Setup File Selecteer bestand met kanaalinstellingen - + user gebruiker - + users gebruikers - + Connect Verbinden - + Settings Instellingen - + Chat Chat - + Enable feedback detection Feedback detectie inschakelen - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst het probleem met de audio feedback op en schakel daarna 'Demp mijzelf' uit. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Uw geluidskaart werkt niet goed. Open het Instellingsvenster en controleer apparaatselectie en besturingsprogramma-instellingen. - + &Disconnect &Afmelden @@ -1017,1098 +1017,1107 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CClientSettingsDlg - + Jitter Buffer Size Jitterbuffer grootte - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. De jitterbufferinstelling is dus een afweging tussen geluidskwaliteit en totale vertraging. - + Local jitter buffer slider control Lokale jitterbuffer-schuifregelaar - + Server jitter buffer slider control Server jitterbuffer-schuifregelaar - + Auto jitter buffer check box Automatische jitterbuffer selectievakje - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Als het stuurprogramma tijdens een actieve verbinding wordt geselecteerd, wordt de verbinding gestopt, wordt het stuurprogramma gewijzigd en wordt de verbinding automatisch opnieuw gestart. - + Sound card device selector combo box Geluidskaart apparaatselectie combobox - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. In het geval dat de ASIO4ALL driver wordt gebruikt, dient u er rekening mee te houden dat deze driver meestal ongeveer 10-30 ms extra geluidsvertraging introduceert. Het gebruik van een geluidskaart met een native ASIO-driver wordt daarom aanbevolen. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Als u het kX ASIO-stuurprogramma gebruikt, zorg er dan voor dat u de ASIO-ingangen in het kX DSP-instellingenpaneel aansluit. - + Sound Card Channel Mapping Geluidskaart kanaaltoewijzing - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. In het geval dat het geselecteerde geluidskaartapparaat meer dan één ingangs- of uitgangskanaal biedt, zijn de instellingen voor het ingangs- en uitgangskanaal toewijzing zichtbaar. - + Left input channel selection combo box Linkeringangskanaal selectie combobox - + Right input channel selection combo box Rechteringangskanaal selectie combobox - + Left output channel selection combo box Linkeruitgangskanaal selectie combobox - + Right output channel selection combo box Rechteruitgangskanaal selectie combobox - + Small Network Buffers Kleine netwerkbuffers - + Small network buffers check box Kleine netwerkbuffers selectievakje - + Sound Card Buffer Delay Geluidskaart buffervertraging - + Sound card driver settings Instellingen geluidskaart-stuurprogramma - + ASIO Device Settings push button ASIO Apparaatinstellingen drukknop - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Selecteer de meterstijl die voor de niveaumeters moet worden gebruikt. De opties "Balk (smal)" en "LED's (rond, klein)" zijn alleen van toepassing op het mengpaneel. Als "Balk (smal)" is geselecteerd dan worden de ingangmeters ingesteld op "Balk (breed)". Als "LED's (rond, klein)" is geselecteerd dan worden de ingangsmeters ingesteld op "LED's (rond, groot)". De overige opties zijn van toepassing op het mengpaneel en de ingangsmeters. - + Language Taal - + Select the language to be used for the user interface. Selecteer de te gebruiken taal voor de gebruikersinterface. - + Language combo box Taal combobox - + and en - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Als u extra/eigen adresboeken wilt toevoegen aan de adresboek keuzelijst in het Verbinden dialoogvenster, dan kunt u hier de adressen invoeren.<br> - + Audio Upstream Rate Audio upstream snelheid - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Deze is afhankelijk van de huidige audio pakket grootte en compressie instelling. Zorg ervoor dat de upstream snelheid niet groter is dan uw beschikbare internet upload snelheid (controleer dit met een service zoals speedtest.net). - - - - + + + + None Geen - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Stel hier uw naam of een alias in zodat de andere muzikanten met wie u wilt spelen weten wie u bent. Daarnaast kunt u een afbeelding toevoegen van het instrument dat u bespeelt en een vlag van het land of regio waarin u zich bevindt. De stad waar u woont en uw vaardigheidsniveau kunnen ook worden toegevoegd. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Wat u hier instelt verschijnt bij uw fader op het mengpaneel indien u verbonden met een %1 server. Deze tag zal ook worden getoond aan andere muzikanten die met deze server verbonden zijn. - + Country/region flag button Land/regio vlag knop - - + + Could not open MIDI port MIDI-poort kon niet worden geopend - + No MIDI devices found. Please connect a MIDI device and try again. Geen MIDI-apparaten gevonden. Sluit een MIDI-apparaat aan en probeer het opnieuw. - + Please check your OS configuration. Controleer uw besturingssysteemconfiguratie. - + Center Midden - + R R - + The buffer setting is therefore a trade-off between audio quality and overall delay. De bufferinstelling is dus een afweging tussen de geluidskwaliteit en de totale vertraging. - + 64 samples setting radio button 64 samples instellen radioknop - + 128 samples setting radio button 128 samples instellen radioknop - + 256 samples setting radio button 256 samples instellen radioknop - + Audio Channels Audiokanalen - + Audio channels combo box Audiokanalen combobox - + Audio Quality Audiokwaliteit - + Audio quality combo box Audiokwaliteit combobox - + New Client Level Nieuw client-niveau - + New client level edit box Nieuw client-niveau bewerkingsvak - - + + Mono Mono - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. modus verhoogt de bandbreedte van de audiostream. Zorg ervoor dat deze niet hoger staat dan de beschikbare bandbreedte van uw internetverbinding. - + Mono-in/Stereo-out Mono-in/stereo-uit - - - + + + Stereo Stereo - - - + + + &Close &Sluiten - + Local Audio Input Fader Lokale audio-ingangsfader - - + + L L - + Local audio input fader (left/right) Lokale audio-ingangsfader (links/rechts) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). De jitterbuffer compenseert voor jitters als gevolg van netwerk- en geluidskaart timing. De grootte van de jitterbuffer beïnvloed de kwaliteit van de audiostream (aantal dropouts) en de totale vertraging (hoe groter de buffer, des te groter de vertraging). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. De jitter-buffergrootte kan handmatig worden gekozen voor de client en de server. Voor de lokale jitterbuffer worden drop-outs in de audiostream aangegeven door het lampje op de onderkant van de faders voor de jitterbuffergrootte. Als het lampje op rood springt, heeft er een bufferoverschrijding/onderbenedenrijding plaatsgevonden en wordt de audiostream onderbroken. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Als de Auto-instelling aanstaat worden de jitterbuffers lokaal en op de server automatisch aangepast op basis van metingen van het netwerk en de geluidskaart. Indien ingeschakeld kunnen de faders van de jitterbuffer niet handmatig worden bewogen. - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. In het geval dat de automatische instelling van de jitterbuffer is ingeschakeld, worden de netwerkbuffers van de lokale client en de externe server op een conservatieve waarde gezet om de kans op audio-uitval te minimaliseren. Om de audio delay/latentie te tweaken is het aan te raden om de automatische instelling uit te schakelen en de grootte van de jitterbuffer handmatig te verlagen met behulp van de schuifregelaars totdat de persoonlijke aanvaardbare limiet van het aantal drop-outs is bereikt. De LED-indicator zal de audio dropouts van de lokale jitterbuffer visualiseren met een rood lampje. - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Voor elk %1 invoer-/uitvoerkanaal (linker- en rechterkanaal) kan een ander daadwerkelijk kanaal van de geluidskaart worden geselecteerd. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Maakt ondersteuning mogelijk voor zeer kleine netwerkaudiopakketten. Deze netwerkpakketten worden alleen gebruikt indien de geluidskaart buffer kleiner is dan %1 samples. Hoe kleiner de netwerkbuffers, des te kleiner de audio-vertraging. Maar tegelijkertijd neemt de netwerkbelasting toe en neemt ook de kans op audio-uitval toe. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. De buffervertragingsinstelling is een fundamentele instelling van %1. Deze instelling is van invloed op veel verbindingseigenschappen. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Dit opent de stuurprogramma-instellingen van uw geluidskaart. Sommige stuurprogramma's laten u toe bufferinstellingen te veranderen, andere zoals ASIO4ALL laten u invoer- of uitvoerkanalen kiezen van uw apparaat. Meer informatie is te vinden op jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Opent de stuurprogramma-instellingen. Let op: %1 ondersteunt momenteel alleen apparaten met een sample rate van %2 Hz. U kunt geen stuurprogramma/apparaat selecteren die dit niet ondersteunt. Voor meer informatie zie jamulus.io. - + 128 samples: Should work for most available sound cards. 128 samples: Werkt voor de meeste geluidskaarten. - + Skin Skin - + Select the skin to be used for the main window. Selecteer de te gebruiken skin voor het hoofdvenster. - + Skin combo box Skin combobox - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Selecteer het aantal audiokanalen voor communicatie tussen client en server. Er zijn drie modi beschikbaar: - + These modes use one and two audio channels respectively. Deze modi gebruiken respectievelijk een en twee audiokanalen. - + Mono in/Stereo-out Mono in/stereo uit - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Het audiosignaal naar de server is mono maar wat terugkomt is stereo. Dit is handig als de geluidskaart het instrument op een invoerkanaal heeft en de microfoon op een ander. In dat geval kunnen de twee signalen gemixed worden naar een monokanaal terwijl de server mix in stereo blijft. - + Enabling Aanzetten - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. In het geval van de stereo streaming-mode is er geen audiokanaalselectie voor het galmeffect beschikbaar op het hoofdvenster, aangezien het effect in dit geval op beide kanalen wordt toegepast. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Hoe hoger de audiokwaliteit, des te hoger de benodigde bandbreedte. Zorg ervoor dat deze niet hoger staat dan de beschikbare bandbreedte van uw internetverbinding. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Deze instelling stelt het faderniveau in van een nieuwe verbonden client in procenten. Als een nieuwe client verbinding maakt krijgt hij het opgegeven initiële faderniveau als dit in de vorige verbinding niet was opgeslagen. - + Input Boost Ingangsversterking - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Met deze instelling kunt u het niveau van uw ingangssignaal tot en met een factor 10 verhogen (+ 20dB). Als uw geluid te zacht is, probeer dan eerst het niveau te verhogen door dichter bij de microfoon te komen, uw geluidsapparatuur aan te passen of de niveaus in uw besturingssysteem te verhogen. Stel hier alleen een factor in als dit niet lukt. Als uw geluid te luid is, vervormd klinkt en afknapt, zal deze optie niet helpen. Gebruik het daar niet voor, de vervorming zal er nog steeds zijn. Verlaag in plaats daarvan uw ingangssignaal door verder weg te gaan van uw microfoon, uw geluidsapparatuur aan te passen of door de niveaus in uw besturingssysteem te verlagen. - + Input Boost combo box Ingangsversterking combobox - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Met de audiofader kunnen de relatieve niveaus van de linker en rechter lokale audiokanalen worden gewijzigd. Voor een monosignaal werkt het als een panning tussen de twee kanalen. Als bijvoorbeeld een microfoon is verbonden op het rechter ingangskanaal en een veel luider instrument is verbonden op het linker ingangskanaal, beweeg dan de audiofader in de richting van het label %1, waarbij %2 de huidige dempingsindicator is. - + Audio Device Audioapparaat - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Bij het Windows-besturingssysteem kan de ASIO-driver (geluidskaart/audio-interface) worden geselecteerd voor gebruik met %1. Als het geselecteerde ASIO-stuurprogramma niet geschikt is dan wordt er een foutmelding weergegeven en wordt de vorige geschikte stuurprogramma geselecteerd. Bij macOS kan de invoer- en uitvoerhardware worden geselecteerd. - + Three buffer sizes can be selected Er kunnen drie buffergroottes worden geselecteerd - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 samples: Zorgt voor de minste vertraging maar werkt niet met alle geluidskaarten. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 samples: Gebruik deze alleen indien 64 of 128 problemen veroorzaaken. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Sommige stuurprogramma's van geluidskaarten staan niet toe dat de buffervertraging vanuit %1 kan worden gewijzigd. In dat geval is de buffervertragingsinstelling uitgeschakeld en moet deze worden gewijzigd via het stuurprogramma van de geluidskaart. Gebruik de juiste tool voor de gebruikte interface om deze buffergrootte aan te passen. Als u bijvoorbeeld ASIO gebruikt, gebruikt u de knop "ASIO Apparaatinstellingen" om het paneel met driverinstellingen te openen of als u JACK gebruikt, gebruikt u een tool zoals QjackCtl om de buffergrootte aan te passen. Voor andere interfaces, zoals Pipewire, moet het juiste programma worden gebruikt. Raadpleeg hiervoor de handleiding van de interface. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Als er geen buffergrootte is geselecteerd en alle instellingen zijn uitgeschakeld, betekent dit een buffergrootte die door het stuurprogramma wordt gebruikt en die niet overeenkomt met de waarden. %1 werkt nog steeds met deze instelling, maar heeft mogelijk beperkte prestaties. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. De werkelijke buffervertraging heeft invloed op de verbindingsstatus, de huidige uploadsnelheid en de algehele vertraging. Hoe kleiner de buffergrootte, hoe groter de kans op een rood lampje in de statusindicator (uitval) en hoe hoger de uploadsnelheid en hoe lager de algehele vertraging. - + Meter Style Meterstijl - + Meter Style combo box Meterstijl combobox - + Custom Directories Eigen adresboeken - + Custom Directories combo box Eigen adresboeken combobox - + Delete custom directory button Verwijder eigen adresboeken knop - + Delete Custom Directory Verwijder eigen adresboek - + Click the button to delete the currently selected custom directory. Klik op de knop om het momenteel geselecteerde eigen adresboek te verwijderen. - + Number of Mixer Panel Rows Aantal mengpaneel rijen - + Adjust the number of rows used to arrange the mixer panel. Stel het aantal rijen in dat gebruikt wordt in het mengpaneel. - + Number of Mixer Panel Rows spin box Aantal rijen in het mengpaneel spinbox - + Feedback Protection Feedback bescherming - + Prevents acoustic feedback between microphone and speakers. Voorkomt akoestische terugkoppeling tussen microfoon en luidsprekers. - + Feedback Protection check box Feedback bescherming selectievakje - + Audio Alerts Audiowaarschuwingen - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Krijg een audiowaarschuwing bij ontvangst van een chatbericht en wanneer een nieuwe client deelneemt aan de sessie. Er kan een tweede geluidsapparaat nodig zijn om de waarschuwingen te horen. - + Audio Alerts check box Audiowaarschuwingen selectievakje - + Enable/disable MIDI-in port MIDI-ingang in-/uitschakelen - + MIDI-in port check box MIDI-in poort selectievakje - + Pick-up Mode Volgstand-modus - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Wanneer deze functie is ingeschakeld, wachten de MIDI-fader- en balans-regelaars totdat de positie van de fysieke controller overeenkomt met de huidige waarde in de software voordat ze reageren. Dit voorkomt abrupte sprongen wanneer uw fysieke controller niet synchroon loopt met de software. - + Pick-up Mode check box Volgstand-modus selectievakje - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Selecteer de MIDI-uitgangspoort waarmee u verbinding wilt maken. Jamulus verbindt automatisch de MIDI-ingangspoort met het geselecteerde apparaat wanneer deze functie is ingeschakeld. U kunt ook uw favoriete verbindingsbeheerder gebruiken om de verbindingen handmatig te wijzigen. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Selecteer de MIDI-bron waarmee u verbinding wilt maken. Jamulus verbindt automatisch de MIDI-ingangspoort met het geselecteerde apparaat wanneer dit is ingeschakeld. U kunt ook Audio MIDI instellingen gebruiken om de verbindingen handmatig te wijzigen. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Selecteer naar welke MIDI-ingangsapparaten Jamulus moet luisteren. Selecteer 'Alle apparaten' om MIDI van alle aangesloten apparaten te ontvangen, of kies een specifiek apparaat. - + MIDI input device combo box MIDI-ingangsapparaat combobox - + MIDI controller settings MIDI-controller instellingen - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Er is één globale MIDI-kanaalparameter (0-16) en twee parameters die u voor elk te bedienen item kunt instellen: de eerste MIDI CC en het aantal opeenvolgende CC-nummers. Stel eerst het kanaal in waarop Jamulus moet luisteren (0 voor alle kanalen). Stel vervolgens voor elk item dat u wilt bedienen (volumefader, balans, solo, demp) de eerste MIDI CC (het CC-nummer waarmee u wilt beginnen) en het aantal opeenvolgende CC-nummers in. Er is één uitzondering waarbij het instellen van opeenvolgende CC-nummers niet nodig is: de parameter "Demp mijzelf". Deze vereist slechts één CC-nummer, omdat deze alleen van toepassing is op uw eigen audiostream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Je kunt de MIDI CC-waarden handmatig invoeren of de knop "Leren" gebruiken: klik op "Leren", bedien de fader/knop op je MIDI-controller en het MIDI CC-nummer wordt gedetecteerd en opgeslagen. - + MIDI channel combo box MIDI-kanaal combobox - + Mute Myself MIDI CC number spin box Demp mijzelf MIDI CC-nummer spinbox - + Fader offset spin box Fader offset spinbox - + Pan offset spin box Balans offset spinbox - + Solo offset spin box Solo offset spinbox - + Mute offset spin box Demp offset spinbox - + Mute Myself MIDI learn button Demp mijzelf MIDI-leerknop - + Fader offset MIDI learn button Fader offset MIDI-leerknop - + Pan offset MIDI learn button Balans offset MIDI-leerknop - + Solo offset MIDI learn button Solo offset MIDI-leerknop - + Mute offset MIDI learn button Demp offset MIDI-leerknop - + ASIO Device Settings ASIO Apparaatinstellingen - + Low Laag - - + + Normal Normaal - + High Hoog - + + Max + + + + Fancy Fancy - + Compact Compact - + Bar (narrow) Balk (smal) - + Bar (wide) Balk (breed) - + LEDs (stripe) LED's (streep) - + LEDs (round, small) LED's (rond, klein) - + LEDs (round, big) LED's (rond, groot) - + Learn Leren - - + + All Devices Alle apparaten - + No device connected Geen apparaat aangesloten - - + + MIDI Device Not Found MIDI-apparaat niet gevonden - + The MIDI device "%1" could not be found. Using all available devices instead. Het MIDI-apparaat "%1" kon niet worden gevonden. In plaats daarvan worden alle beschikbare apparaten gebruikt. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. Het MIDI-apparaat "%1" is momenteel niet beschikbaar. Selecteer een ander apparaat in het keuzemenu om verbinding te maken. - - + + MIDI Device Connection Failed MIDI-apparaatverbinding mislukt - + Could not connect to MIDI device "%1". Please check your OS configuration. Kon geen verbinding maken met MIDI-apparaat "%1". Controleer uw besturingssysteemconfiguratie. - + Could not connect to MIDI device "%1". Please check that the device is available. Kon geen verbinding maken met MIDI-apparaat "%1". Controleer of het apparaat beschikbaar is. - + Listening... Luisteren... - + Custom Aangepast - + Any Genre 2 Ieder Genre 2 - Any Genre 3 - Ieder Genre 3 + Ieder Genre 3 + + + + Any Genre Asia + - + Genre Rock Genre Rock - + Genre Jazz Genre Jazz - + Genre Classical/Folk Genre Klassiek/Folk - + Genre Choral/Barbershop Genre Koor/Barbershop - + Any Genre 1 Ieder Genre 1 - + Musician Profile Muzikantenprofiel - + Alias or name edit box Alias of naam bewerkingsvak - + Instrument picture button Afbeelding van het instrument - + City edit box Stad bewerkingsvak - + Skill level combo box Vaardigheidsniveau combobox - + Beginner Beginner - + Intermediate Gemiddeld - + Expert Gevorderd - - + + Size: Grootte: - + Buffer Delay Buffervertraging - + Buffer Delay: Buffervertraging: - + Drum Set Drumstel - + Djembe Djembe - + Electric Guitar Elektrische gitaar - + Acoustic Guitar Akoestische gitaar - + Bass Guitar Basgitaar - + Keyboard Toetsenbord - + Synthesizer Synthesizer - + Grand Piano Piano - + Accordion Accordeon - + Vocal Zang - + Microphone Microfoon - + Harmonica Harmonica - + Trumpet Trompet - + Trombone Trombone - + French Horn Hoorn - + Tuba Tuba - + Saxophone Saxofoon - + Clarinet Klarinet - + Flute Fluit - + Violin Viool - + Cello Cello - + Double Bass Contrabas - + Recorder Opnemer - + Streamer Streamer - + Listener Luisteraar - + Guitar+Vocal Gitaar+zang - + Keyboard+Vocal Toetsenbord+zang - + Bodhran Bodhran - + Bassoon Fagot - + Oboe Hobo - + Harp Harp - + Viola Altviool - + Congas Conga's - + Bongo Bongo - + Vocal Bass Bas (stem) - + Vocal Tenor Tenor (stem) - + Vocal Alto Alt (stem) - + Vocal Soprano Sopraan (stem) - + Banjo Banjo - + Mandolin Mandoline - + Ukulele Ukelele - + Bass Ukulele Ukelele-bas - + Vocal Baritone Bariton (stem) - + Vocal Lead Leadzanger - + Mountain Dulcimer Dulcimer - + Scratching Scratchen - + Rapping Rappen - + Vibraphone Vibrafoon - + Conductor Dirigent @@ -2508,117 +2517,117 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CConnectDlg - + Server List Serverlijst - + Directory Adresboek - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Toont de beschikbare servers in het gekozen adresboek. U kunt eigen adresboeken toevoegen in de geavanceerde instellingen. - + Directory combo box Adresboek combobox - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filter de serverlijst met de opgegeven tekst. Merk op dat het filter ongevoelig is voor hoofdletters. Gebruik het #-karakter om alleen servers te laten zien waarmee minimaal één persoon verbonden is. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Haal het vinkje weg om de serverlijst samen te vouwen en zo alleen de server gegevens te zien. Plaats een vinkje om te zien wie er met de servers verbonden zijn. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. In het verbindingvenster worden de beschikbare servers weergegeven die zijn geregistreerd bij het geselecteerde adresboek. Gebruik de adresboek keuzelijst het adresboek te wijzigen, zoek de server waaraan u wilt deelnemen in de serverlijst, klik erop en klik vervolgens op de knop Verbinden om verbinding te maken. U kunt ook dubbelklikken op de servernaam om verbinding te maken. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Permanente servers (die langer dan 48 uur in de lijst staan) worden vetgedrukt weergegeven. - + You can add custom directories in Advanced Settings. U kunt eigen adresboeken toevoegen in de geavanceerde instellingen. - + Server list view Serverlijstweergave - + Server Address Serveradres - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Als u het serveradres weet, kunt u er verbinding mee maken via het veld Servernaam/Adres. Een optioneel poortnummer kan worden toegevoegd na het serveradres met een dubbele punt als scheidingsteken, b.v. %1. Het veld toont ook een lijst met de meest recent gebruikte serveradressen. - + Holds the current server address. It also stores old addresses in the combo box list. Bevat het huidige serveradres. Het slaat ook oude adressen op in de keuzelijst. - + Delete server address button Verwijder serveradres knop - + Delete Server Address Verwijder serveradres - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Klik op de knop om het momenteel geselecteerde serveradres te wissen en het uit de lijst met opgeslagen servers te verwijderen. - + Ping Ping - + Server address edit box Serveradres bewerkingsvak - + Filter Filter - + Filter edit box Filter bewerkingsvak - + Show All Musicians Toon alle muzikanten - + Show all musicians check box Toon alle muzikanten selectievakje - + Filter text, or # for occupied servers Filter op tekst of gebruik # voor bezette servers @@ -2689,43 +2698,43 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CHelpMenu - + &Help &Hulp - - + + Getting &Started... &Aan de slag... - + Software &Manual... Gebruikers&handleiding... - + What's &This Wat Is &Dit - + P&rivacy policy... P&rivacyverklaring... - + &About Jamulus... &Over Jamulus... - + About &Qt... Over &Qt... - + About Qt Over Qt @@ -2733,12 +2742,12 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CLanguageComboBox - + Restart Required Herstart noodzakelijk - + Please restart the application for the language change to take effect. Start de applicatie opnieuw om de taalwijziging door te voeren. @@ -2746,22 +2755,22 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Deze server vereist dat u voorwaarden accepteert voor het verbinen. Lees deze in het chatvenster. - + I have read the conditions and &agree. Ik heb de voorwaarden gelezen en &stem in. - + Accept Accepteer - + Decline Niet akkoord @@ -2769,17 +2778,17 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CMultiColorLED - + Red Rood - + Yellow Geel - + Green Groen @@ -2787,7 +2796,7 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CMusProfDlg - + No Name Geen naam @@ -2795,448 +2804,448 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CServerDlg - + Client List Clientlijst - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. De clientlijst toont alle clients die op dit moment verbonden zijn met deze server. Voor elke verbonden client wordt enige informatie over de clients gegeven, zoals het IP-adres en de naam. - + Connected clients list view Overzicht van de lijst met verbonden clients - + Directory Type combo box Adresboek type combobox - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Wanneer een andere waarde dan "%1" wordt gekozen voor adresboek zal dit laten zien of de registratie is gelukt. Als de registratie is mislukt, kiest u een ander adresboek. - + When checked, the recorder will run while a session is in progress (if set up correctly). Als deze optie is aangevinkt wordt er een opname gemaakt wanneer er een sessie bezig is (als deze correct is ingesteld). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Er is geen opnamemap ingesteld of de waarde is niet bruikbaar. Controleer de waarde in het tabblad Opties. - + Recording has been switched off by the UI checkbox or JSON-RPC. Opname is uitgeschakeld door het UI selectievakje of JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. Opname is uitgeschakeld door het UI selectievakje, SIGUSR2 of JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Als de opnamemap niet bruikbaar is, wordt het probleem weergegeven in plaats van de sessiemap. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Klik op de knop om het dialoogvenster te openen waarin de opnamemap kan worden geselecteerd. De gekozen waarde moet bestaan en schrijfbaar zijn (laat het maken van submappen door de gebruiker toe die %1 uitgevoerd). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. De huidige waarde van de opnamemap. De gekozen waarde moet bestaan en schrijfbaar zijn (laat het maken van submappen door de gebruiker toe die %1 uitgevoerd). Klik op de knop om het dialoogvenster te openen waarin de opnamemap kan worden geselecteerd. - + Custom Directory address Eigen adresboek adres - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. Het eigen adresboek adres is het adres van het adresboek met de serverlijst waaraan deze server moet worden toegevoegd. - + Server List Filename dialog push button Serverlijst bestandsnaam drukknop - - + + Server List Filename Serverlijst bestandsnaam - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Klik op de knop om het dialoogvenster te openen waarmee de bestandsnaam voor de serverlijst kan worden ingesteld. De gebruiker %1 is actief om de opgegeven bestandsnaam te kunnen maken, hoewel deze mogelijk al bestaat (deze wordt overschreven bij het opslaan). - + Server List Filename text box (read-only) Serverlijst bestandsnaam tekstvak (alleen lezen) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. De huidige waarde van de serverlijst bestandsnaam. De gebruiker %1 is actief om de opgegeven bestandsnaam te kunnen maken, hoewel deze mogelijk al bestaat (deze wordt overschreven bij het opslaan). Klik op de knop om het dialoogvenster te openen waarmee de bestandsnaam voor de serverlijst kan worden ingesteld. - + Clear the server list file name button Wis serverlijst bestandsnaam drukknop - + Clear Server List Filename Wis serverlijst bestandsnaam - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Klik op de knop om de momenteel geselecteerde bestandsnaam van de serverlijst te wissen. Dit voorkomt dat de serverlijst wordt bewaard totdat een nieuwe waarde is geselecteerd. - + Start Minimized on Operating System Start Start geminimaliseerd bij de start van het besturingssysteem - + Now a directory Nu een adresboek - + Register Server Status Geregistreerde server status - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Als de Start geminimaliseerd bij systeemstart checkbox iss aangevinkt, zal de server gestart worden als het systeem opstart end word automatisch geminimaliseerd naar een icoon op de taakbalk. - + Server Name Servernaam - + The server name identifies your server in the connect dialog server list at the clients. De servernaam identificeert uw server in de serverlijst. - + Server name line edit Servernaam bewerkingsregel - + Location City Locatie Stad - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. De stad waar deze server zich bevindt kan hier worden ingesteld. Als er een plaatsnaam wordt ingevoerd, wordt deze getoond in de lijst van de connect-dialoog-server bij de clients. - + City where the server is located line edit Stad waar de server zich bevindt bewerkingsregel - + Country/Region Land/regio - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Het land of regio waarin deze server zich bevindt kan hier worden ingesteld. Dit wordt getoond in de lijst van de verbindingsservers bij de clients. - + Combo box for location of this server Combobox voor de locatie van deze server - + Display dialog to select recording directory button Toon venster voor het instellen van de map voor geluidsopnames - - + + Main Recording Directory Hoofdmap voor geluidsopnames - + Main recording directory text box (read-only) Hoofdmap voor geluidsopnames tekstvak (alleen lezen) - + Clear the recording directory button Wis de geluidsopnamemap knop - + Clear Recording Directory Wis geluidsopnamemap - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Klik op deze knop om de aangegeven geluidsopnamemap te wissen. Opnames kunnen niet worden gemaakt zonder ingestelde geluidsopnamemap. - + Checkbox to turn on or off server recording Selectievakje om geluidsopname op de server in of uit te schakelen - + Jam Recorder Geluidsopname - + Current session directory text box (read-only) Huidige sessiemap tekstvak (alleen lezen) - + Current Session Directory Huidige sessiemap - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Ingeschakeld tijdens geluidsopname en bevat de sessiemap. Uitgeschakeld na geluidsopname of wanneer geluidsopname uit staat. - + Recorder status label Geluidsopname statuslabel - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Adresboek:</b>Kies '%1' om je server niet te registreren bij een adresboek.<br>Of kies één van de genres om te registreren bij die adresboek.<br>Of kies '%2' en specificeer een eigen adresboek adres in het Opties tabblad om te registreren bij een eigen adresboek.<br><br>Bij elke waarde behalve '%1' wordt deze server geregistreerd bij een adresboek, zodat een %3 gebruiker deze server kan selecteren in de client verbindingsdialoog server lijst wanneer hij die adresboek kiest.<br><br>De registratie van de server wordt periodiek vernieuwd om er zeker van te zijn dat alle servers in de verbindingsdialoog server lijst daadwerkelijk beschikbaar zijn. - + Recorder Status Geluidsopname status - + Displays the current status of the recorder. The following values are possible: Toon de huidige status van geluidsopname. De volgende keuzes zijn mogelijk: - + There is no one connected to the server to record. Er is niemand verbonden met de server voor geluidsopname. - + The performers are being recorded to the specified session directory. Het geluid van de muzikanten wordt opgenomen in de aangegeven sessiemap. - + NOTE OPMERKING - + Server welcome message edit box Vak voor welkomstbericht server - + Server Welcome Message Welkomstbericht server - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Een server welkomstbericht wordt getoond in het chatvenster als een muzikant binnenkomt. Indien niets ingesteld wordt geen welkomstbericht getoond. - + Language Taal - + Select the language to be used for the user interface. Selecteer de te gebruiken taal voor de gebruikersinterface. - + Language combo box Taal combobox - + Custom Directory line edit Eigen adresboek regel bewerken - + &Hide %1 server &Verberg %1 server - + &Show %1 server &Toon %1 server - + %1 server %1 is the name of the main application %1 server - + Type a message here. If no message is set, the server welcome is disabled. Typ hier een bericht. Indien niets ingesteld wordt geen welkomstbericht getoond. - + %1 Server %1 is the name of the main application %1 server - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Opname starten mislukt. Controleer beschikbare schijfruimte en toegangsrechtern en probeer opnieuw. Fout: - + ERROR FOUT - + Request new recording button Knop om nieuwe geluidsopname aan te vragen - + New Recording Nieuwe geluidsopname - + During a recording session, the button can be used to start a new recording. Tijdens een opnamesessie kan de knop gebruikt worden om een nieuwe opname te starten. - - + + E&xit &Afsluiten - + Select Main Recording Directory Selecteer hoofdgeluidsopnamemap - + Recording Neemt op - + Not recording Neemt niet op - + Not initialised Niet geïnitialiseerd - + Not enabled Niet ingeschakeld - + &Window &Window - + None Geen - + Not registered Niet geregistreerd - + Bad address Foutief adres - + Registration requested Registratie aangevraagd - + Registration failed Registratie is mislukt - + Check server version Controleer de versie van de server - + Registered Geregistreerd - + Server list full at directory Serverlijst vol bij adresboek - + Your server version is too old Uw serverversie is te oud - + Requirements not fulfilled Vereisten niet gehaald - + Unknown value %1 Onbekende waarde %1 @@ -3360,32 +3369,32 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CServerListManager - + Now a directory Nu een adresboek - + No longer a directory Niet langer een adresboek - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Kon '%1' niet openen voor lezen/schrijven. Controleer of %2 toestemming heeft (en of er vrije ruimte is). - + Loading persistent server list file: %1 Laden van persistente serverlijst bestand: %1 - + Could not write to '%1' Fout bij het schrijven naar '%1' - + Saving registration for %1 (%2): %3 Registratie opslaan voor %1 (%2): %3 @@ -3393,68 +3402,68 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CSound - + Error requesting stream stop: $s Fout bij het aanvragen om te stoppen: $s - + Error closing stream: $s Fout tijdens afsluiten: $s - + The selected audio device is no longer present in the system. Please check your audio device. Het geselecteerde audioapparaat is niet langer aanwezig in het system. Controleer uw audioapparaat. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Kan het audiostuurprogramma niet initialiseren. Controleer of uw audiohardware is aangesloten en controleer uw stuurprogramma-instellingen. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Het geselecteerde audioapparaat is niet compatibel omdat het geen samplefrequentie van %1 Hz ondersteunt. Selecteer een ander apparaat. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. De huidige configuratie van het audioapparaat is niet compatibel omdat de samplefrequentie niet kan worden ingesteld op %2 Hz. Controleer of er een hardware-switch of driver-instelling is om de samplefrequentie handmatig in te stellen en start %1 opnieuw. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Het geselecteerde audioapparaat is niet compatibel omdat het geen %1 in-/uitvoerkanalen ondersteunt. Selecteer een ander apparaat of een andere configuratie. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Het geselecteerde audioapparaat is niet compatibel omdat het vereiste audiosampleformaat niet beschikbaar is. Gebruik een ander apparaat. - + No ASIO audio device driver found. Geen ASIO geluidskaart stuurprogramma gevonden. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Installeer een ASIO stuurprogramma voor het starten van %1. Indien u een apparaat heeft met ASIO ondersteuning, installeer dan de officiële ASIO driver voor dit apparaat. Indien u dit niet heeft, dan kunt u een universeel stuurprogramma zoals ASIO4ALL gebruiken. - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK kon niet automatisch worden gestart. Start JACK handmatig en controleer op foutmeldingen. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK werkt niet met een samplefrequentie van <b>%1 Hz</b>. Gebruik een tool als <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> om de JACK-samplefrequentie in te stellen op %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. De JACK-poortregistratie is mislukt. Dit is waarschijnlijk een fout met JACK. Stop a.u.b. %1 en JACK. Controleer daarna of een ander programma met een samplefrequentie van %2 Hz verbinding kan maken met JACK. @@ -3463,62 +3472,62 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h De JACK-poortregistratie is mislukt. Dit is waarschijnlijk een fout met JACK. Stop a.u.b. %1 en JACK. Controleer daarna of een ander MIDI-programma verbinding kan maken met JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Kan de JACK-client niet activeren. Dit is waarschijnlijk een fout met JACK. Controleer de JACK-uitgang. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK werd afgesloten. %1 vereist dat JACK wordt uitgevoerd. Herstart %1 om JACK opnieuw te starten. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Er is geen geluidskaart beschikbaar in uw systeem. CoreAudio-invoer AudioHardwareGetProperty-aanroep mislukt. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Er is geen geluidskaart beschikbaar in het systeem. CoreAudio-uitvoer AudioHardwareGetProperty-aanroep mislukt. - + The currently selected audio device is no longer present. Please check your audio device. Het momenteel geselecteerde audioapparaat is niet meer aanwezig. Controleer uw audioapparaat. - + The audio input device is no longer available. Please check if your input device is connected correctly. Het audio-invoerapparaat is niet langer beschikbaar. Controleer of uw invoerapparaat correct is aangesloten. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). De samplefrequentie van het huidige invoerapparaat is geen %1 Hz en is daarom niet compatibel. Selecteer een ander apparaat of probeer de samplefrequentie handmatig in te stellen op %1 Hz via Audio-MIDI-Setup (in Applications->Utilities). - + The audio output device is no longer available. Please check if your output device is connected correctly. Het audio-uitvoerapparaat is niet langer beschikbaar. Controleer of uw uitvoerapparaat correct is aangesloten. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). De samplefrequentie van het huidige uitvoerapparaat is geen %1 Hz en is daarom niet compatibel. Selecteer een ander apparaat of probeer de samplefrequentie handmatig in te stellen op %1 Hz via Audio-MIDI-Setup (in Applications->Utilities). - + The stream format on the current input device isn't compatible with this software. Please select another device. Het streamformaat van het huidige invoerapparaat is niet compatibel met deze software. Selecteer een ander apparaat. - + The stream format on the current output device isn't compatible with %1. Please select another device. Het streamformaat van het huidige uitvoerapparaat is niet compatibel met %1. Selecteer een ander apparaat. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. De buffergroottes van het huidige invoer- en uitvoeraudioapparaat kunnen niet op een gemeenschappelijke waarde worden ingesteld. Selecteer verschillende invoer-/uitvoerapparaten in uw systeeminstellingen. @@ -3526,27 +3535,27 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Kan het geselecteerde audioapparaat niet gebruiken vanwege de volgende fout: %1 Het vorige stuurprogramma wordt geselecteerd. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Het eerder geselecteerde audioapparaat is niet langer beschikbaar of het stuurprogramma is gewijzigd in een niet compatibele status. We zullen proberen een geldig audioapparaat te vinden, maar dit nieuwe audioapparaat kan feedback veroorzaken. Controleer uw audioapparaat instellingen voordat u verbinding maakt met een server. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 kan geen geschikt %2 audioapparaat vinden.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Mogelijk kunt u fouten in de instellingen van het stuurprogramma herstellen. Wilt u deze instellingen nu openen? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Kan %1 niet starten. Herstart %1 en controleer/configureer uw audio-instellingen opnieuw. @@ -3554,53 +3563,57 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, versie %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Gereleased onder de GNU General Public License versie 2 of recenter (GPLv2) + Gereleased onder de GNU General Public License versie 2 of recenter (GPLv2) - + This app uses the following libraries, resources or code snippets: Deze applicatie gebruikt de volgende libraries, bronnen of code snippets: - + Qt cross-platform application framework Qt cross-platform applicatieframework - + (build) (build) - + (runtime) (runtime) - + Some pixmaps are from the %1 Sommige pixmaps zijn van de %1 - + Some sound samples are from %1 Sommige geluiden komen van %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Audio reverberatiecode door Perry R. Cook en Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Vlag-iconen van Mark James @@ -3608,12 +3621,12 @@ We hebben uw kanaal gedempt en 'Demp mijzelf' geactiveerd. Los eerst h global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Er is een nieuwe versie van %1 beschikbaar: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>klik hier voor details en downloads</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Voor meer informatie gebruik de "Wat Is Dit" hulp (helpmenu, rechtermuisklik of Shift+F1) diff --git a/src/translation/translation_pl_PL.ts b/src/translation/translation_pl_PL.ts index c5e50d9c6b..016c04ee93 100644 --- a/src/translation/translation_pl_PL.ts +++ b/src/translation/translation_pl_PL.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt - między-platformowe szablony aplikacji - + (build) (buduj) - + (runtime) (czas wykonania) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Kod algorytmu pogłosu: Perry R. Cook i Gary P Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Aplikacja pozwala muzykom na sesje dźwiękowe w czasie rzeczywistym przez internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. To jest serwer, który zbiera dane audio każdego uczestnika i już zmiksowane odsyła do każdego. - + This app uses the following libraries, resources or code snippets: Aplikacja korzysta z następująuch bibliotek, źródeł lub fragmentów kodu: - + Flag icons by Mark James Ikony flag: Mark James - + Some pixmaps are from the %1 Niektóre pixmapy są z %1 - + Some sound samples are from %1 Niektóre sample dźwięku są z %1 - + For details on the contributions check out the %1 Aby znaleźć szczegółowe informacje o współtwórcach sprawdź %1 - + Github Contributors list Lista współautorów na Github-ie - + Spanish hiszpański - + French francuski - + Portuguese portugalski - + Dutch holenderski - + Italian włoski - + German niemiecki - + Polish polski - + Swedish szwedzki - + Korean koreański - + Slovak słowacki - + Simplified Chinese Chiński uproszczony - + Norwegian Bokmål Norweski Bokmål - + Japanese japoński - + About %1 O programie %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Konsola analizatora - + Error Rate of Each Buffer Size Częstotliwość występowania błędu dla każdego rozmiaru bufora @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Własny miks na serwerze - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Podczas połączenia z serwerem, znajdujące się tutaj opcje pozwalają ustawić własny miks bez wpływu na to jak inni ciebie słyszą. W tytule zawarta jest nazwa serwera oraz to, czy nagrywanie jest aktywne. - + Server Serwer - + T R Y I N G T O C O N N E C T P R Ó B U J Ę S I Ę P O Ł Ą C Z Y Ć - + RECORDING ACTIVE NAGRYWANIE AKTYWNE - + Personal Mix at: %1 Własny miks na: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan Panorama - - - + + + Mute Wycisz - - - + + + Solo Solo - + &No grouping &Nie grupuj - + Assign to group Przypisz do grupy - + Channel Level Poziom kanału - + Input level of the current audio channel at the server Poziom wejściowy aktualnego kanału audio na serwerze - + Mixer Fader Suwak miksera - + Local mix level setting of the current audio channel at the server Lokalne ustawienie poziomu miksowania bieżącego kanału audio na serwerze - + Status Indicator Wskaźnik stanu - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Pokazuje wskazanie statusu uczestnika, który jest przypisany do tego kanału. Wskazana oznaczają: - + Status indicator label Etykieta wskaźnika stanu - + Panning Ustawienia panoramy - + Local panning position of the current audio channel at the server Lokalna pozycja panoramy aktualnego kanału dźwiękowego na serwerze - + With the Mute checkbox, the audio channel can be muted. Pole wyboru wycisza kanał audio. - + Mute button Przycisk wyciszenia - + Solo button Przycisk funkcji Solo - + Group Grupa - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Pole wybory GR służy do definiowania grupy kanałów dźwiękowych. Kiedy jeden z suwaków w grupie jest przesuwany, wszystkie inne przesuwane są proporcjonalnie. - + Group button Przycisk grupy - + Fader Tag Etykieta suwaka - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Oznaczenie suwaka idenyfikuje podłączonego uczestnika. Nazwę, ikonę instrumentu i flagę kraju uczestnika ustawia się w głównym oknie programu. - + Mixer channel country/region flag Flaga kraju/regionu widoczna na kanale miksera - + Alias Nazwa - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Pokazuje początkowy poziom dźwięku suwaka tego kanału. Każdemu uczetnikowi podłączającemu się do tego serwera zostanie ustawiony ten poziom, ta sama wartość dla każdego. - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Regulacja poziomu dźwięku tego kanału. Wszystkim klientom połączonym z serwerem zostanie przypisany suwak, wyświetlany przy każdym kliencie, w celu dostosowania lokalnego miksowania. - + Speaker with cancellation stroke: Indicates that another client has muted you. Przekreślony głośnik: Oznacza, że któryś użytkownik cię wyciszył. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Ustawia panoramę do prawej strony kanału. Działa tylko w trybie stereo lub najlepiej mono in/stereo out. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Za pomocą tego pola wyboru, kanał audio może być ustawiony na solo, co oznacza, że wszystkie inne kanały są wyciszone. Możliwe jest ustawienie więcej niż jednego kanału w tym trybie. - + Mixer channel instrument picture Obrazek instrumentu dla kanału miksera - + Mixer channel label (fader tag) Etykieta kanału mieksera (nazwa suwaka) - + PAN PANORAMA - + MUTE WYCISZENIE - + SOLO SOLO - + GRP GR - + M W - + S S - + G G - + Grp Gr - + Alias/Name Nick/Nazwa - + Instrument Instrument - + Location Lokalizacja - - - + + + Skill Level Poziom umiejętności - + Beginner Początkujący - + Intermediate Średniozaawansowany - + Expert Ekspert - + Musician Profile Profil muzyka @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Okno Czatu - + The chat window shows a history of all chat messages. Okno rozmowy pokazuje historię wszystkich widomości czatu. - + Chat history Historia czatu - + Input Message Text Wprowadzanie wiadomości czatu - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Wpisz tekst widomości w polu edycji i wciśnij enter, aby wysłać wiadomość do serwera, który roześle ją do wszystkich podłączonych osób. Twoja wiadomość pojawi się w oknie czatu. - + New chat text edit box Pole edycji nowego tekstu czatu - + Type a message here Napisz tu wiadomość - + &Edit &Edytuj - + Cl&ear Chat History &Wyczyść historię rozmowy - - + + &Close &Zamknij - + Do you want to open the link '%1' in your browser? Czy chcesz otworzyć link '%1' w przeglądarce? @@ -544,303 +544,303 @@ CClientDlg - + Input Level Meter Miernik Poziomu Wejścia - + Make sure not to clip the input signal to avoid distortions of the audio signal. Aby uniknąć zniekształceń sygnału audio, należy upewnić się, że sygnał wejściowy nie jest obcinany. - + Input level meter Miernik poziomu wejścia - + Simulates an analog LED level meter. Symuluje analogową diodę miernika poziomu. - + Connect/Disconnect Button Przycisk Połącz/Rozłącz - + Connect and disconnect toggle button Przycisk przełącznika połącz i rozłącz - + Delay Status LED Dioda stanu opóźnienia - + Delay status LED indicator Wskaźnik diody stanu opóźnienia - + The network jitter buffer is not large enough for the current network/audio interface jitter. Bufor dla odchyleń sieciowych nie jest wystarczający dla aktualnych odchyleń interfejsu sieciowego/dźwiękowego. - + This shows the level of the two stereo channels for your audio input. Pokazuje poziom dwóch kanałów stereo dla wejścia audio. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Jeśli aplikacja jest już podłączona do serwera i grasz na instrumencie/śpiewasz do mikrofonu, miernik VU powinien migać. Jeśli tak nie jest, prawdopodobnie wybrany został niewłaściwy kanał wejściowy (np. wejście liniowe zamiast wejścia mikrofonowego) lub ustawione zostało zbyt niskie wzmocnienie wejściowe w mikserze audio (Windows). - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). W celu prawidłowego korzystania z aplikacji nie należy słyszeć śpiewu/instrumentu przez głośnik lub słuchawki, gdy oprogramowanie nie jest podłączone. Można to osiągnąć wyciszając wejściowy kanał audio w mikserze odtwarzającym (nie w mikserze nagrywającym!). - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. otwiera okno wyboru serwera. do którego można się podłączyć, a gdy połączono, naciśnięcie tego przycisku spowoduje zakończenie sesji. - + Reverb effect Efekt pogłosu - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Pogłos może być zastosowany do jednego lokalnego kanału audio mono lub do obu kanałów w trybie stereo. Wybór kanału monofonicznego i poziom pogłosu mogą być modyfikowane. Na przykład, jeśli sygnał z mikrofonu jest podawany do prawego kanału audio karty dźwiękowej i konieczne jest zastosowanie efektu pogłosu, należy ustawić przełącznik wyboru kanału w prawo i przesunąć suwak w górę, aż do osiągnięcia żądanego poziomu pogłosu. - + Reverb effect level setting Ustawienie poziomu efektu pogłosu - + Reverb Channel Selection Wybór kanału z pogłosem - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Za pomocą tych przycisków wyboru można ustawić kanał wejściowy audio, na którym zostanie zastosowany efekt pogłosu. Można wybrać lewy lub prawy. - + Left channel selection for reverb Wybór lewego kanału dla pogłosu - + Right channel selection for reverb Wybór prawego kanału dla pogłosu - + Shows the current audio delay status: Pokazuje obecny status opóźnienia audio: - + Green Zielony - + The delay is perfect for a jam session. Opóźnienie jest idealne dla sesji. - + Yellow Żółty - + A session is still possible but it may be harder to play. Sesja jest nadal możliwa, ale może być trudniej grać. - + Red Czerwony - + The delay is too large for jamming. Opóźnienie jest zbyt duże dla sesji. - + &MIDI Control Settings... - + %1 Directory %1 Serwer zbiorczy - + The sound card's buffer delay (buffer size) is too small (see Settings window). Opóźnienie bufora karty dźwiękowej (rozmiar bufora) jest zbyt małe (patrz okno Ustawienia). - + The upload or download stream rate is too high for your internet bandwidth. Prędkość przesyłania lub pobierania strumienia audio jest zbyt wysoka dla dostępnej prędkości internetu. - + The CPU of the client or server is at 100%. Obciążenie CPU klienta lub serwera wynosi 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Czas Ping Time to czas potrzebny do przejścia strumienia audio od klienta do serwera i z powrotem. To opóźnienie jest wywoływane przez sieć internetową i powinno wynosić około 20-30 ms. Jeśli jest większe niż około 50 ms, odległość do serwera jest zbyt duża lub szybkość połączenia internetowego nie jest wystarczająca. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Całkowite opóźnienie jest obliczane na podstawie bieżącego ping-a i opóźnienia wynikającego z aktualnych ustawień bufora. - - + + C&onnect &Połącz - + &File P&lik - + &Load Mixer Channels Setup... Wczytaj ustawienia kanałów &miksera... - + &Save Mixer Channels Setup... Zapi&sz ustawienia kanałów miksera... - + &View &Widok - + &Connection Setup... &Konfiguracja połączenia... - + My &Profile... Mój &profil... - + C&hat... &Czat... - + &Analyzer Console... Konsola &analizatora... - + N&o User Sorting &Bez sortowania kanałów - + O&wn Fader First &Własny suwak na początku - + Sort Users by &Name Sortuj kanały według &nazwy - + Sort Users by &Instrument Sortuj kanały według &instrumentu - + Sort Users by &Group Sortuj kanały według &grupy - + Sort Users by &City Sortuj kanały według &miasta - + Auto-Adjust all &Faders &Automatycznie dopasuj wszystkie suwaki - + If this LED indicator turns red, you will not have much fun using %1. Jeśli ta dioda zmieni kolor na czerwony, korzystanie z %1-a może być utrudnione. - + Local Jitter Buffer Status LED Dioda statusu lokalnego bufora opóźnień - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Dioda lokalnego bufora opóźnień pokazuje status aktualnego strumienia audio. Jeżeli jest czerwona to strumień jest przerywany. Powodem tego może być jedna z poniższych przyczyn: - + If this LED indicator turns red, the audio stream is interrupted. Jeśli ta dioda zmieni kolor na czerwony, to strumień audio został przerwany. - + Local Jitter Buffer status LED indicator Wskaźnik stanu lokalnego bufora opóźnień - + Connect Połącz - + Settings Ustawienia - + Chat Czat - + Enable feedback detection Wykrywaj sprzężenia - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -849,78 +849,78 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę sprzęgania i wtedy wyłącz swoje wyciszenie. - + Ok Ok - + Set All Faders to New Client &Level Ustaw suwaki do określonego w ustawieniach &poziomu - + E&xit &Wyjdź - + Current Connection Status Wskaźnik aktualnego połączenia - + Sort Users by Chann&el Sortuj użytkowników po kanal&e - + Sett&ings Ustaw&ienia - + Audio/Network &Settings... &Ustawienia dźwięku i sieci... - + A&dvanced Settings... Ustawienia &zaawansowane... - + &Edit &Edytuj - + Clear &All Stored Solo and Mute Settings &Wyczyść wszystkie ustawienia solo/wycissz - - + + Select Channel Setup File Wybierz plik ustawień kanału - + user użytkownik - + users użytkownicy - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Twoja karta dźwiękowa nie działa prawidłowo. Proszę otworzyć okno ustawień dźwięku i sprawdzić wybrane urządzenie i ustawienia sterownika. - + &Disconnect &Rozłącz @@ -1017,1098 +1017,1107 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CClientSettingsDlg - + Jitter Buffer Size Rozmiar bufora odchyleń - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Wartość bufora odchyleń jest więc kompromisem pomiędzy jakością dźwięku a całkowitym opóźnieniem. - + Local jitter buffer slider control Suwak kontrolujący lokalny bufor odchyleń - + Server jitter buffer slider control Suwak kontrolujący bufor odchyleń na serwerze - + Auto jitter buffer check box Przełącznik automatycznego rozmiaru bufora odchyleń - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Jeżeli podczas aktywnego połączenia zostanie wybrany sterownik, to połączenie zostanie przerwane, sterownik zostanie zmieniony i połączenie zostanie ponownie automatycznie uruchomione. - + Sound card device selector combo box Pole wyboru urządzenia karty dźwiękowej - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Jeśli używasz sterownika kX ASIO, upewnij się, że podłączyłeś wejścia ASIO w panelu ustawień kX DSP. - + Sound Card Channel Mapping Mapowanie kanałów kart dźwiękowych - + Left input channel selection combo box Pole wyboru lewego kanału wejściowego - + Right input channel selection combo box Pole wyboru prawego kanału wejściowego - + Left output channel selection combo box Pole wyboru lewego kanału wyjściowego - + Right output channel selection combo box Pole wyboru prawego kanału wyjściowego - + Small Network Buffers Małe bufory sieciowe - + Small network buffers check box Pole wyboru Małe bufory sieciowe - + Sound Card Buffer Delay Opóźnienie Bufora Karty Dźwiękowej - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Ustawienie bufora opóźnień jest kluczowe w programie %1. Ma to wpływ na wiele cech połączenia. - + The buffer setting is therefore a trade-off between audio quality and overall delay. Wartość bufora odchyleń jest więc kompromisem pomiędzy jakością dźwięku a całkowitym opóźnieniem. - + Sound card driver settings Ustawienia sterownika karty dźwiękowej - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Gdy rozmiar bufora nie jest wybrany, a wszystkie ustawienia są zablokowane, oznacza to, że sterownik używa nieobsługiwanego rozmiaru bufora. %1 będzie działał z tymi ustawieniami ale jego fukcjonalność może być ograniczona. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Rzeczywiste opóźnienie bufora ma wpływ na status połączenia, bieżącą prędkość wysyłania i całkowite opóźnienie. Im mniejsza wielkość bufora, tym większe prawdopodobieństwo pojawienia się czerwonej kontrolki we wskaźniku statusu (drop-out) i tym większa szybkość wysyłania danych oraz tym mniejsze ogólne opóźnienie. - + 128 samples setting radio button przycisk wyboru 128-samplowego bufora - + 256 samples setting radio button przycisk wyboru 256-samplowego bufora - + Meter Style Styl miarki - + Meter Style combo box Lista wyboru stylu miarki - + Language Język - + Select the language to be used for the user interface. Wybierz język interfejsu użytkownika. - + Language combo box Lista wyboru języka - + Custom Directories Własne serwery - + Custom Directories combo box Lista wyboru własnych serwerów - + Audio Upstream Rate Szybkość wysyłania audio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Zależy od aktualnego rozmiaru bufora audio i wybranej jakości dźwięku. Upewnij się, że szybkość wysyłania nie jest wyższa niż dostępna u ciebie prędkość wychodząca (upload) połączenia internetowego (można to sprawdzić np. na speedtest.net). - - - - + + + + None Brak - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Wpisz swoje imię lub przezwisko, żeby inni muzycy, z którymi chesz grać wiedzieli kim jesteś. Możesz także dodać ikonę instrumentu, na którym grasz oraz flagę kraju/regionu i miasto, z którego pochodzisz, a także poziom umiejętności. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. To co zostanie tu wpisane pojawi się na suwaku miksera podczas połączenia z serwerem %1. Ta etykieta będzie także wyświetlana u innych muzyków podłączonych do tego samego serwera. - + Country/region flag button Przycisk wyboru flagi kraju/regionu - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - + Center Środek - + R P - + Fancy Fantazyjna - + Compact Kompaktowa - + Audio Channels Kanały Audio - + Audio Device Urządzenie dźwiękowe - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. W systemie operacyjnym Windows. można wybrać sterownik ASIO (kartę dźwiękową) używając %1-a. Jeśli wybrany sterownik ASIO nie jest prawidłowy, wyświetlany jest komunikat o błędzie i wybierany jest poprzedni prawidłowy sterownik. W systemie MacOS/Linux nie ma możliwości wyboru karty dźwiękowej przez Jamulus-a. - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Może być wybrany inny kanał aktualnej karty dźwiękowej dla każdego wejściowego i wyjściowego strumienia programu %1 (prawy i lewy kanał). - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Włącza obsługę bardzo małych pakietów internetowych z danymi audio. Właściwie to te małe pakiety są używane tylko jeżeli opóźnienie bufora jest mniejsze niż %1 sampli. Im mniejsze bufory sieciowe tym niższe opóźnienie audio ale jednocześnie zwiększa się obciążenie sieci i prawdopodobieństwo występowania przerw i zniekształceń dźwięku. - + Three buffer sizes can be selected Można wybrać spośród trzech różnych rozmairów bufora - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 sample: daje najmniejsze opóźnienie ale nie działa ze wszystkimi kartami dźwiękowymi. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 sample: używać tylko gdy 64 lub 128 powoduje problemy. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Niektóre sterowniki kart dźwiękowych nie pozwalają na zmianę opóźnienia bufora z poziomu %1. W tym przypadku ustawienie opóźnienia bufora jest wyłączone i musi zostać zmienione za pomocą sterownika karty dźwiękowej. Aby dopasować rozmiar bufora, użyj odpowiedniego narzędzia dla swojego sterownika. Na przykład dla sterownika ASIO, naciśnij przycisk „Ustawienia ASIO” aby otworzyć panel ustawień tego sterownika. Gdy używany jest JACK, do zmiany rozmiaru bufora można wykorzystać program QjackCtl. Inne interfejsy, takie jak np. PipeWire będą wymagały odpowiednio innego narzędzia. Szczegóły proszę sprawdzić w ich dokomentacji. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Otwiera ustawienia sterownika karty dźwiękowej. Niktóre sterowniki pozwalają na zmianę ustawień bufora, a inne jak ASIO4ALL pozwalają wybrać wejścia i wyjścia. Więcej informacji można znaleść na stronie jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Otwiera ustawienia sterownika. Uwaga: aktualnie %1 obsługuje tylko urządzenia z częstotliwością próbkowania %2 Hz. Nie będzie można wybrać sterownika/urządzenia nieobsługującego tej częstotliwośći. Więcej informacji można znaleść na stronie jamulus.io. - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Wybierz styl miarki używanej do poziomów. Opcje „Pasek” (zwężony) i „Diody” (małe, zaokrąglone) mają zastosowanie tylko do miksera. Gdy zaznaczony jest „Pasek” (zwężony) - wskaźniki wejścia są ustawione do paska (szeroki). Zaznaczenie „Diody” (małe) spowoduje dopasowywanie wskaźników do dużych diod. Pozostałe opcje mają zastosowanie zarówno do miksera jak i wskaźników wejścia. - + and i - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. tryb ten zwiększy szybkość przesyłania danych w strumieniu. Upewnij się, że prędkość przesyłania danych nie przekracza dostępnej prędkości przesyłania połączenia internetowego. - + Audio channels combo box Pole wyboru kanałów audio - + Audio Quality Jakość Audio - + Audio quality combo box Pole ustawień jakości audio - + New Client Level Poziom nowego klienta - + New client level edit box Pole edycji poziomu nowego klienta - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Jeżeli musisz dodać dodatkowe katalogi docelowe do dropdownu Połączenia katalogu docelowego dialogu, możesz wprowadzić adresy tutaj.<br> - + Delete custom directory button Przycisk usunięcia niestandardowego katalogu docelowego - + Delete Custom Directory Usuń niestandardowy katalog docelowy - + Click the button to delete the currently selected custom directory. Kliknij przycisk aby usunąć wybrany katalog niestandardowy. - + Audio Alerts Alarmy dźwiękowe - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Wyzwalanie alertu dźwiękowego po otrzymaniu wiadomości lub po dołączeniu nowego klienta do sesji. Do usłyszenia alertów może być wymagane drugie urządzenie dźwiękowe. - + Audio Alerts check box Pole wyboru dla alarmów dźwiękowych - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + + Max + + + + Bar (narrow) Pasek (zwężony) - + Bar (wide) Pasek (szeroki) - + LEDs (stripe) Diody (pasek) - + LEDs (round, small) Diody (małe, zaokrąglone) - + LEDs (round, big) Diody (zaokrąglone, duże) - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Jeśli używany jest sterownik ASIO4ALL, należy pamiętać, że zazwyczaj wprowadza on ok. 10-30 ms dodatkowego opóźnienia dźwięku. Dlatego zaleca się używanie karty dźwiękowej z natywnym sterownikiem ASIO. - - - + + + &Close &Zamknij - + Local Audio Input Fader Suwak Lokalnego Wejścia Audio - - + + L L - + Local audio input fader (left/right) Suwak lokalnego wejścia audio - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Jeśli wybrane urządzenie karty dźwiękowej oferuje więcej niż jeden kanał wejściowy lub wyjściowy, widoczne są ustawienia Mapowanie Kanału Wejścia i Mapowanie Kanału Wejścia. - + 64 samples setting radio button przycisk wyboru 64-samplowego bufora - + ASIO Device Settings push button Przycisk ustawień ASIO - - + + Mono Mono - + Mono-in/Stereo-out Mono-in/Stereo-out - - - + + + Stereo Stereo - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Kontroluje względne poziomy lewego i prawego lokalnego kanału audio. Na przykład, jeśli mikrofon jest podłączony do prawego kanału wejściowego, a instrument jest podłączony do lewego kanału wejściowego, który jest znacznie głośniejszy od mikrofonu, należy przesunąć suwak audio w kierunku, w którym %1 pokazuje etykietę nad suwakiem, gdzie %2 jest właściwym wskaźnikiem tego cichszego. - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Bufor odchyleń kompensuje opóźnienia sieci i karty dźwiękowej. Rozmiar bufora ma zatem wpływ na jakość strumienia audio (ilość zakłóceń) i ogólne opóźnienie (im większy bufor, tym większe opóźnienie). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Można ręcznie ustawić rozmiar bufora odchyleń dla klienta lokalnego i zdalnego serwera. W przypadku lokalnego bufora, przerwy w strumieniu audio są sygnalizowane przez diodę poniżej suwaków bufora odchylenia. Zmiana koloru na czerwony, oznacza przekroczenie/zaniżenie bufora i strumień audio zostanie przerwany. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Jeśli opcja Auto jest włączona, bufory odchylenia lokalnego klienta i zdalnego serwera są ustawiane automatycznie na podstawie pomiarów czasu trwania odchyleń sieci i karty dźwiękowej. Jeśli opcja Auto jest włączona, bufory są wyłączone (nie można ich przesuwać za pomocą myszy). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Jeśli opcja Auto jest włączone, bufory sieciowe klienta lokalnego i zdalnego serwera są ustawione na wartość zachowawczą, aby zminimalizować prawdopodobieństwo przerwania odtwarzania dźwięku. W celu dostrojenia opóźnienia dźwięku zaleca się wyłączenie ustawienia Auto i ręczne zmniejszenie rozmiaru bufora odchyleń za pomocą suwaków do momentu osiągnięcia zadawalającego poziomu zakłóceń. Dioda będzie sygnalizować czerwoną lampką przerwanie odtwarzania dźwięku w lokalnym buforze lokalnym. - + 128 samples: Should work for most available sound cards. 128 sampli: powinno działać na większości z dostępnych kart dźwiękowych. - + Skin Skórka - + Select the skin to be used for the main window. Wybierz skórkę dla głównego okna aplikacji. - + Skin combo box Lista wyboru skórki - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Wybiera liczbę kanałów audio, które mają być używane do komunikacji między klientem a serwerem. Dostępne są trzy tryby: - + These modes use one and two audio channels respectively. Tryby te wykorzystują odpowiednio jeden i dwa kanały audio. - + Mono in/Stereo-out wejście mono/wyjście stereo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Sygnał audio wysyłany do serwera jest mono, ale sygnał zwrotny jest stereo. Jest to przydatne, jeśli karta dźwiękowa ma instrument na jednym kanale wejściowym i mikrofon na drugim. W tym przypadku dwa sygnały wejściowe mogą być miksowane do jednego kanału mono, ale miks serwera jest słyszalny w trybie stereo. - + Enabling Włączanie - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. W trybie strumieniowania stereo w oknie głównym nie będzie dostępny wybór kanału audio dla efektu pogłosu, ponieważ w tym przypadku efekt jest stosowany do obu kanałów. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Im wyższa jakość dźwięku, tym większa szybkość transmisji danych strumienia audio. Upewnij się, że prędkość przesyłania danych nie przekracza dostępnej przepustowości połączenia internetowego. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. To ustawienie definiuje poziom sygnału nowo podłączonego klienta w procentach. Jeśli nowy klient połączy się z aktualnym serwerem, otrzyma ten początkowy poziom sygnału, o ile żaden inny poziom z poprzedniego połączenia tego klienta nie był wcześniej zapisany. - + Input Boost Wzmocnienie Wejścia - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Ta opcja pozwala na stopniowe zwiększenie poziomu twojego sygnału wejściowego aż do 10 (+20dB). Kiedy twój dźwięk jest zbyt cichy, najpierw spróbuj zwiększyć głośność zbliżając się do mikrofonu, ustawiając lepiej sprzęt audio lub zwiększając poziomy w ustawieniach wejścia dźwięku w swoim systemie operacyjnym. Dopiero gdy wszystko powyższe zawiedzie, ustaw to wzmocnienie tutaj. Jednak gdy twój dźwięk jest zbyt głośny, zniekształcony lub urywany, ta opcja nie pomoże. Wtedy jej nie używaj. Zniekształcenia i tak pozostaną. Zamiast tego obniż poziom sygnału wejściowego odsuwając się od mikrofonu, zmieniając ustawienia twoich urządzeń dźwiękowych lub ściszając poziomy wejścia w swoim systemie. - + Input Boost combo box Kontrolka Wzmocnienia Wejścia - + Number of Mixer Panel Rows Liczba rzędów panelu miksera - + Adjust the number of rows used to arrange the mixer panel. Dostosuj liczbę rzędów w panelu miksera. - + Number of Mixer Panel Rows spin box Pole wyboru liczby rzędów panelu miksera - + Feedback Protection Ochrona przed sprzężeniem zwrotnym - + Prevents acoustic feedback between microphone and speakers. Zapobiega sprzężeniu akustycznemu między mikrofonem a głośnikami. - + Feedback Protection check box Pole wyboru wykrywania sprzężeń - + ASIO Device Settings Ustawienia urządzeń ASIO - + Low Niska - - + + Normal Standardowa - + High Wysoka - + Custom Własny - + Any Genre 2 Każdy styl 2 - Any Genre 3 - Każdy styl 3 + Każdy styl 3 - + + Any Genre Asia + + + + Genre Rock Rock - + Genre Jazz Jazz - + Genre Classical/Folk Klasyka/folk - + Genre Choral/Barbershop Chór/zespół wokalny - + Any Genre 1 Każdy styl 1 - + Musician Profile Profil muzyka - + Alias or name edit box Pole edycji nazwy lub pseudonimu - + Instrument picture button Przycisk wyboru instrumentu - + City edit box Pole edycji miasta - + Skill level combo box Lista wyboru poziomu umiejętności - + Beginner Początkujący - + Intermediate Średniozaawansowany - + Expert Ekspert - - + + Size: Rozmiar: - + Buffer Delay Opóźnienie bufora - + Buffer Delay: Opóźnienie bufora: - + Drum Set Zestaw perkusyjny - + Djembe Djembe - + Electric Guitar Gitara elektryczna - + Acoustic Guitar Gitara akustyczna - + Bass Guitar Gitara basowa - + Keyboard Klawisze - + Synthesizer Syntezator - + Grand Piano Fortepian - + Accordion Akordeon - + Vocal Śpiew - + Microphone Mikrofon - + Harmonica Harmonijka ustna - + Trumpet Trąbka - + Trombone Puzon - + French Horn Waltornia - + Tuba Tuba - + Saxophone Saksofon - + Clarinet Klarnet - + Flute Flet - + Violin Skrzypce - + Cello Wiolonczela - + Double Bass Kontrabas - + Recorder Rejestrator - + Streamer Streamer - + Listener Słuchacz - + Guitar+Vocal Gitara+Śpiew - + Keyboard+Vocal Keyboard+Śpiew - + Bodhran Bodhran - + Bassoon Fagot - + Oboe Obój - + Harp Harfa - + Viola Altówka - + Congas Kongi - + Bongo Bongo - + Vocal Bass Bas - + Vocal Tenor Tenor - + Vocal Alto Alt - + Vocal Soprano Sopran - + Banjo Banjo - + Mandolin Mandolina - + Ukulele Ukulele - + Bass Ukulele Ukulele basowe - + Vocal Baritone Baryton - + Vocal Lead Wokal prowadzący - + Mountain Dulcimer Cymbały górskie - + Scratching Scratch - + Rapping Rapowanie - + Vibraphone Wibrafon - + Conductor Dyrygent @@ -2508,119 +2517,119 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CConnectDlg - + Directory Serwer - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Wyświetla serwery z wybranego katalogu. Można dodać własne katalogi w „Ustawieniach zaawansowanych”. - + Directory combo box Lista wyboru katalogu - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Tekst filtrujący listę serwerów. Filtr rozróżnia wielkość znaków. Pojedynczy znak # będzie filtrował serwery z podłączoną co najmniej jedną osobą. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Odznacz aby lista pokazywała tylko szczcegóły serwera. Zaznzcz, żeby wyświetlić wszystkich na serwerze. - + Server List Lissta serwerów - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. Okno ustawień połączenia wyświetla dostępne serwery zarejstrowane w wybranym katalogu. Użyj listy wyboru katalogu serwerów, znajdź serwer do którego chcesz się dołączyć, kliknij wybrany serwer na liście, a potem kliknij przycisk „Połącz” aby połączyć. Ewentualnie kliknij podwójnie w serwer na liście żeby połączyć się od razu. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Stałe serwery (te które są na liście od ponad 48 godzin) wypisane są pogrubionym tekstem. - + You can add custom directories in Advanced Settings. Możesz dodać własne katalogi serwerów w zaawansowanych ustawieniach. - + Server list view Podgląd listy serwerów - + Server Address Adres serwera - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Jeżeli znasz adres serwera możesz podłączyć się do niego podając te dane w polu nazwa/adres serwera. Dodatkowo może być podany numer portu - po dwukropku za adresem/numerem IP, np. %1. To pole tekstowe będzie także wyświetlać listę ostatnio używanych adresów. - + Holds the current server address. It also stores old addresses in the combo box list. Zatrzymuje aktualny adres serwera. Przechowuje również stare adresy na liście. - + Delete server address button Przycisk usunięcia adresu serwera - + Delete Server Address Usuń adres serwera - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Kliknij przycisk aby wyczyścić wybrany adres serwera i usunąć go z listy przechowywanych serwerów. - + Ping Ping - + Server address edit box Pole edycji adresu serwera - + Filter Filtr - + Filter edit box Pole edycji filtra - + Show All Musicians Pokaż wsztystkich muzyków Pokaż wszystkich muzyków - + Show all musicians check box *nie jestem pewna Pokaż wszystkim muzykom pole wyboru - + Filter text, or # for occupied servers Tekst filtra lub # żeby widzieć używane serwery @@ -2691,43 +2700,43 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CHelpMenu - + &Help P&omoc - - + + Getting &Started... &Zaczynajmy... - + Software &Manual... &Instrukcja programu... - + What's &This &Co to jest - + P&rivacy policy... &Polityka poprawności... - + &About Jamulus... &O programie Jamulus... - + About &Qt... O &Qt... - + About Qt O Qt @@ -2735,12 +2744,12 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CLanguageComboBox - + Restart Required Wymagany restart - + Please restart the application for the language change to take effect. Aby wprowadzić zmianę języka, proszę uruchomić program ponownie. @@ -2748,22 +2757,22 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Zanim dołączysz, ten serwer wymaga akceptacji warunków korzystania. Proszę je przeczytać w oknie czatu. - + I have read the conditions and &agree. Zapoznałem się z zasadami i &akceptuję. - + Accept Zgadzam się - + Decline Odrzucam @@ -2771,17 +2780,17 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CMultiColorLED - + Red Czerwony - + Yellow Żółty - + Green Zielony @@ -2789,7 +2798,7 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CMusProfDlg - + No Name Brak nazwy @@ -2797,448 +2806,448 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CServerDlg - + Client List Lista użytkowników - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. Lista użytkowników wyświetla wszystkich użytkowników obecnie połączonych z tym serwerem. Informacje takie jak IP użytkownika oraz nazwa są wyświetlane dla każdego połączonego użytkownika. - + Connected clients list view Widok listy podłączonych użytkowników - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Katalog:</b>Wybierz '%1', aby nie rejestrować serwera w katalogu.<br>lub wybierz jeden z gatunków, aby zarejestrować się w tym katalogu.<br>lub wybierz '%2' i podaj adres Niestandardowy katalog w zakładce Opcje, aby zarejestrować się w niestandardowym katalogu.<br><br>Dla każdej wartości oprócz '%1', ten serwer rejestruje się z katalogiem, aby użytkownik %3 mógł wybrać ten serwer na liście serwerów okna dialogowego client connect, gdy wybiera ten katalog.<br><br>Rejestracja serwera jest odnawiana okresowo, aby upewnić się, że wszystkie serwery na liście serwerów okna dialogowego connect są rzeczywiście dostępne. - + When checked, the recorder will run while a session is in progress (if set up correctly). Po zaznaczeniu tej opcji rejestrator będzie działał w trakcie trwania sesji (jeśli został poprawnie skonfigurowany). - + Recording has been switched off by the UI checkbox or JSON-RPC. Nagrywanie zostało wyłączone przez pole wyboru UI lub JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. Nagrywanie zostało wyłączone, przez pole wyboru UI, SIGUSR2 lub JSON-RPC. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Kliknij przycisk aby otworzyć okno dialogowe wyboru głownego katalogu nagrywania. Wybrana ścieżka musi istnieć i mieć ustawione prawo do zapisu i tworzenia podkatalogów przez użytkownika uruchamiającego %1. - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Aktualny głowny katalog nagrywania. Wybrana ścieżka musi istnieć i mieć ustawione prawo do zapisu i tworzenia podkatalogów przez użytkownika uruchamiającego %1. Kliknij przycisk aby otworzyć okno dialogowe wyboru głownego katalogu nagrywania. - + Custom Directory address Własny adres serwera zbiorczego - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. Własny adres serwera zbiorczego to adres serwera, na którym zarządzana jest lista serwerów w oknie dialogowym połączenia. - + Server List Filename dialog push button Przycisk dla nazwy pliku z listą serwerów - - + + Server List Filename Nazwa pliku z listą serwerów - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Otwiera okno dialogowe wyboru nazwy pliku z listą serwerów. Użytkownik uruchamiający %1-a musi mieć prawo do tworzenia plików (gdy plik już istnieje, zostanie nadpisany). - + Server List Filename text box (read-only) Pole tekstowe z nazwą pliku listy serwerów (tylko do odczytu) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Obecna nazwa pliku z listą serwerów. Użytkownik uruchamiający %1-a musi mieć prawo do tworzenia plików (gdy plik już istnieje, zostanie nadpisany). Naciśnij przycisk aby otwierzyć okno dialogowe wyboru nazwy pliku z listą serwerów. - + Clear the server list file name button Przycisk kasowania nazwy pliku z listą serwerów - + Clear Server List Filename Wyczyść nazwę pliku z listą serwerów - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Naciśnij aby wyczyść nazwę pliku z listą serwerów. Lista serwerów nie będzie isnieć dopóki nie zostanie podana nowa nazwa. - + Start Minimized on Operating System Start Uruchom w tle przy włączeniu systemu operacyjnego - + Register Server Status Zarejetruj status serwera - + Server Name Nazwa serwera - + Server name line edit Pole edycji nazwy serwera - + Location City Lokalizacja serwera - miasto - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. W tym okne można ustawić nazwę miasta, w którym znajduje się serwer. Jeżeli nazwa miasta jest wprowadzona, zostanie wyświetlona w oknie dialogowym połączenia, na liście dostępnych serwerów. - + City where the server is located line edit Pole wyboru miasta, w którym zlokalizowany jest serwer - + Display dialog to select recording directory button Wyświetla okno wyboru katalogu nagrywania - - + + Main Recording Directory Główny katalog nagrywania - + Main recording directory text box (read-only) Pole tekstowe katalogu nagrywania (tylko do odczytu) - + Clear the recording directory button Przycisk czyszczenia katalogu nagrywania - + Clear Recording Directory Wyczyść katalog nagrywania - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Naciśnij przycisk aby wyczyścić wybraną ścieżkę katalogu. Nagrywanie będzie niemożliwe dopóki nowa ścieżka nie zostanie podana. - + Checkbox to turn on or off server recording Pole wyboru do włączania lub wyłączania nagrywania na serwerze - + Jam Recorder Nagrywanie sesji - + Current session directory text box (read-only) Pole tekstowe aktualnego katalogu sesji (tylko do odczytu) - + Current Session Directory Katalog sesji bieżących - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Dostępne podczas nagrywania, przechowuje ścieżkę do aktualnego katalogu nagrywania. Wyłączone po nagraniu lub gdy rejestrator nie jest włączony. - + Recorder status label Etykieta statusu nagrywania - + Directory Type combo box Lista wyboru typu serwera - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Kiedy podana nazwa jest różna niż „%1” zostanie wyświetlone czy rejestracja się powiodła. Gdy się nie powiedzie, proszę wybrać inny katalog serwerów. - + Recorder Status Status nagrywania - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Nie wybrano katalogu nagrywania lub nie da się go używać. Proszę sprawdzić na karcie Opcje. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Gdy nie da się używać katalogu nagrywania, zostanie to wyświetlone w miejscu katalogu sesji. - + Language Język - + Select the language to be used for the user interface. Wybierz język interfejsu użytkownika. - + Language combo box Lista wyboru języka - + Now a directory Bieżący serwer - + Custom Directory line edit Pole edycji własnych serwerów - + &Hide %1 server &Ukryj serwer %1 - + &Show %1 server &Pokaż serwer %1 - + %1 server %1 is the name of the main application serwer %1-a - + %1 Server %1 is the name of the main application Serwer %1-a - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Nie dało się nagrywać. Sprawdź dostępne miejsce na dysku i prawa dostępu i spróbuj ponownie. Błąd: - + Select Main Recording Directory Wybierz katalog nagrywania - + ERROR BŁĄD - + Request new recording button Nowy przycisk nagrywania - + New Recording Nowe nagranie - + During a recording session, the button can be used to start a new recording. Podczas sesji nagraniowej można użyć przycisku w celu rozpoczęcia nowego nagrania. - - + + E&xit &Wyjdź - + Recording Nagrywanie włączone - + Not recording Nagrywanie wyłączone - + Not initialised Nie rozpoczęte - + Not enabled Niedostępny - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Jeśli pole wyboru start zminimalizowany na starcie systemu operacyjnego jest zaznaczone, serwer zostanie uruchomiony po uruchomieniu systemu operacyjnego i zostanie automatycznie zminimalizowany do ikony paska zadań systemowych. - + The server name identifies your server in the connect dialog server list at the clients. Nazwa serwera identyfikuje twój serwer w oknie dialogowym połączenia na liście dostępnych serwerów. - + Country/Region Kraj/Region - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Ustaw kraj lub region gdzie znajduje się serwer. Inni będą widzieć tą nazwę lokalizacji w oknie z listą serwerów. - + Combo box for location of this server Lista rozwijana położenia tego serwera - + Displays the current status of the recorder. The following values are possible: Wyświetla aktualny stan nagrywania. Możliwe są następujące wartości: - + There is no one connected to the server to record. Nikt nie jest podłączony do serwera żeby nagrywać. - + The performers are being recorded to the specified session directory. Wykonawcy są nagrywani do wybranego katalogu. - + NOTE UWAGA - + Server welcome message edit box Pole edycji tekstu powitania na serwerze - + Server Welcome Message Tekst powitania na serwerze - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Tekst powitania pojawi się w oknie czatu kidy muzyk połaczy sie z serwerem. Jeżli tekst nie jest podany okno czatu nie zostanie wyświetlone po połączeniu. - + Type a message here. If no message is set, the server welcome is disabled. Wpisz tutaj tekst. Jeżli tekst nie jest podany okno czatu nie zostanie wyświetlone po połączeniu. - + &Window &Okno - + None Brak - + Not registered Nie zarejstrowany - + Bad address Błędny adres - + Registration requested Wymagana rejestracja - + Registration failed Rejestraca nie powiodła się - + Check server version Sprawdź wersję serwera - + Registered Zarejestrowany - + Server list full at directory Lista serwerów pełna w katalogu - + Your server version is too old Wersja twojego serwera jest przestarzała - + Requirements not fulfilled Niespełniono wymagań - + Unknown value %1 Nieznana wartość %1 @@ -3362,32 +3371,32 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CServerListManager - + Now a directory Teraz katalog - + No longer a directory Nie ma już katalogu - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Nie można otworzyć '%1' do odczytu/zapisu. Sprawdź, czy %2 ma uprawnienia (i czy jest wolne miejsce). - + Loading persistent server list file: %1 Ładowanie pliku z listą trwałych serwerów: %1 - + Could not write to '%1' Nie da się zapisywać do „%1” - + Saving registration for %1 (%2): %3 Zapisywanie rejestracji dla %1 (%2): %3 @@ -3395,68 +3404,68 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CSound - + The selected audio device is no longer present in the system. Please check your audio device. Wybrane urządzenie dźwiękowe nie jest już dostępne w systemie. Proszę sprawdzić je sprawdzić. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Nie da się włączyć sterownika audio. Sprawdź czy twój sprzęt audio jest podłączony i zweryfikuj ustawienia sterownika. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Wybrane urządzenie dźwiękowe jest niekompatybilne bo nie obsługuje próbkowania %1 Hz. Proszę wybrać inne. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. Aktualne urządzenie dźwiękowe jest niekompatybilne bo nie da się ustawić próbkowania %2 Hz. Proszę sprawdzić przełączniki na urządzeniu lub ustawienia jego sterownika żeby ustawić tą częstotliwość ręcznie i uruchomić %1 ponownie. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Wybrane urządzenie dźwiękowe jest niekompatybilne bo nie obsługuje %1 kanałów wej/wyj. Proszę wybrać inne urządzenie lub zmienić jego konfigurację. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Wybrane urządzenie dźwiękowe jest niekompatybilne bo nie obsługuje wymaganego formatu próbek audio. Proszę wybrać inne. - + No ASIO audio device driver found. Nie znaleziono urządzenia ASIO. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Proszę zainstalować sterownik ASIO przed uruchomieniem %1-a. Jeżeli twoje urządzenie posiada wsparcie dla ASIO, zainstaluj oficjalny sterownik dla niego, jeżeli nie, trzeba zainstalować uniwersalny sterownik taki jak ASIO4ALL. - + Error requesting stream stop: $s Błąd podczas zamykania strumienia: $s - + Error closing stream: $s Błąd podczas zamykania strumienia: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK nie mógł być uruchomiony automatycznie. Proszę go uruchomić ręcznie i sprawdzić komunikaty błędów. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK nie jest uruchomiony z częstotliwością próbkowania <b>%1 Hz</b>. Proszę użyć programu takiego jak <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> aby ustawić próbkowanie JACK-a na %1. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. Nie powiodła się rejestracja portu na serwerze JACK. Prawdopodobnie to jego błąd. Proszę zamknąć %1-a i JACK-a i sprawdzić czy jakiś inny program wykorzystujący próbkowanie %2 Hz może się podłączyć do JACK-a. @@ -3465,62 +3474,62 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę Nie powiodła się rejestracja portu na serwerze JACK. Prawdopodobnie to jego błąd. Proszę zamknąć %1-a i JACK-a i sprawdzić czy jakiś inny program MIDI może się podłączyć do JACK-a. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Nie da się uruchomić klienta JACK. Prawdopodobnie to błąd JACK-a. Proszę sprawdzić jego komunikaty. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK został zatrzymany. %1 wymaga serwera JACK. Proszę zrestartować %1-a aby uruchomić JACK-a jeszcze raz. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. W twoim systemie nie ma karty dźwiękowej. Wywołanie CoreAudio input AudioHardwareGetProperty nie powiodło się. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. W twoim systemie nie ma karty dźwiękowej. Wywołanie CoreAudio output AudioHardwareGetProperty nie powiodło się. - + The currently selected audio device is no longer present. Please check your audio device. Brakuje aktualnie zaznaczonego urządzenia dźwiękowego. Proszę sprawdzić urządenia dźwiękowe. - + The audio input device is no longer available. Please check if your input device is connected correctly. Wejściowe urządzenie dźwiękowe nie jest już dostępne. Proszę sprawdzić czy jest właściwie podłączone. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Częstotliwość próbkowania aktualnego urządzenia wejściowego to nie %1 Hz więc jest niekompatybilna. Proszę wybrać inne urządzenie lub spróbować zmienić próbkowanie na %1 Hz ręcznie - poprzez ustawienia Dźwięk-MIDI (w Programy->Narzędzia). - + The audio output device is no longer available. Please check if your output device is connected correctly. Wyjściowe urządzenie dźwiękowe nie jest już dostępne. Proszę sprawdzić czy jest właściwie podłączone. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Częstotliwość próbkowania aktualnego urządzenia wejściowego to nie %1 Hz więc jest niekompatybilna. Proszę wybrać inne urządzenie lub spróbować zmienić próbkowanie na %1 Hz ręcznie - poprzez ustawienia Dźwięk-MIDI (w Programy->Narzędzia). - + The stream format on the current input device isn't compatible with this software. Please select another device. Format strumienia dźwiękowego aktualnego urządzenia wejściowego nie jest kompatybilny z tym oprogramowaniem. Proszę wybrać inne urządzenie. - + The stream format on the current output device isn't compatible with %1. Please select another device. Format strumienia dźwiękowego aktualnego urządzenia wyjściowego nie jest kompatybilny z %1-em. Proszę wybrać inne urządzenie. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Rozmiary buforów aktualnych urządzeń wejściowych i wejściowych nie mogą być ustawione na jednakową wartość. Proszę wybrać inne urządzenia w ustawieniach systemowych. @@ -3528,27 +3537,27 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Nie można używać wybranego urządzenia dźwiękowego z powodu błędu %1. Poprzedni sterownik zostanie wybrany. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Poprzednio wybrane urządzenie dźwiękowe nie jest już dostępne lub jego ustawienia nie są już kompatybilne. Spróbuję znaleźć odpowiednie urządzenie dźwiękowe ale może ono powodować sprzężenia. Przed podłączeniem do serwera proszę sprawdzić swoje ustawienia audio. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 nie znalazł działającego %2 urządzenia dźwiękowego.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Można spróbować naprawić błędy w ustawieniach sterownika. Otworzyć je teraz? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Nie udało się uruchomić %1-a. Proszę sprawdzić/zmienić ustawienia dźwięku i uruchomić %1-a ponownie. @@ -3556,53 +3565,57 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Wersja %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Wydane na zasadach licencji GNU General Public License wersja 2 lub następne (GPLv2) + Wydane na zasadach licencji GNU General Public License wersja 2 lub następne (GPLv2) - + This app uses the following libraries, resources or code snippets: Aplikacja korzysta z następująuch bibliotek, zasobów lub fragmentów kodu: - + Qt cross-platform application framework Między-platformowe szablony aplikacji Qt - + (build) (buduj) - + (runtime) (czas wykonania) - + Some pixmaps are from the %1 Niektóre pixmapy są z %1 - + Some sound samples are from %1 Niektóre sample dźwiękowe są z %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Kod algorytmu pogłosu: Perry R. Cook i Gary P Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Ikony flag: Mark James @@ -3610,12 +3623,12 @@ Twój kanał został wyciszony i włączono „Wycisz mnie”. Napraw przyczynę global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Dostępna jest aktualizacja %1-a: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>zobacz szczegóły i pobierz</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Aby uzyskać więcej informacji użyj „Co to jest” (z menu Pomoc lub prawy przycisk myszy lub Shift+F1) diff --git a/src/translation/translation_pt_BR.ts b/src/translation/translation_pt_BR.ts index d6f86fb42e..4f8683f283 100644 --- a/src/translation/translation_pt_BR.ts +++ b/src/translation/translation_pt_BR.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Framework de aplicações multiplataforma Qt - + (build) (versão) - + (runtime) (tempo de execução) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberação de áudio por Perry R. Cook e Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Esta aplicação permite aos músicos realizar jam sessions em tempo real pela Internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Existe um servidor que reúne os dados de áudio de cada cliente, mixa e envia a mixagem de volta para cada cliente. - + This app uses the following libraries, resources or code snippets: Esta aplicação utiliza as seguintes bibliotecas, recursos ou partes de código: - + Flag icons by Mark James Ícones de bandeiras por Mark James - + Some pixmaps are from the %1 Alguns pixmaps são de %1 - + Some sound samples are from %1 Algumas amostras de áudio são de %1 - + For details on the contributions check out the %1 Para detalhes sobre as contribuições, consulte a %1 - + Github Contributors list lista de colaboradores do Github - + Spanish Espanhol - + French Francês - + Portuguese Português - + Dutch Holandês - + Italian Italiano - + German Alemão - + Polish Polonês - + Swedish Suíço - + Korean Coreano - + Slovak Eslovaco - + Simplified Chinese Chinês Simplificado - + Norwegian Bokmål Norueguês Bokmål - + Japanese Japonês - + About %1 Sobre %1 @@ -181,12 +181,12 @@ CAnalyzerConsole - + Analyzer Console Console de Análise - + Error Rate of Each Buffer Size Taxa de Erros de Cada Tamanho de Buffer @@ -194,32 +194,32 @@ CAudioMixerBoard - + Personal Mix at the Server Mixagem Pessoal no Servidor - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Quando conectado a um servidor, estes controles permite definir sua mixagem local sem afetar o que os outros ouvem de você. O título exibe o nome do servidor e, quando conhecido, se está ativamente gravando. - + Server Servidor - + T R Y I N G T O C O N N E C T T E N T A N D O C O N E C T A R - + RECORDING ACTIVE GRAVAÇÃO ATIVA - + Personal Mix at: %1 Mixagem Pessoal em: %1 @@ -227,245 +227,245 @@ CChannelFader - + Channel Level Nível do Canal - + Input level of the current audio channel at the server Nível de entrada deste canal de áudio no servidor - + Mixer Fader Fader do Mixer - + Local mix level setting of the current audio channel at the server Configuração do nível de mixagem local deste canal de áudio no servidor - + Status Indicator Indicador de Estado - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Mostra uma indicação de estado do cliente que está atribuído a este canal. Os indicadores suportados são: - + Status indicator label Etiqueta do indicador de estado - + Panning Panorâmica - + Local panning position of the current audio channel at the server Posição de panorâmica local deste canal de áudio no servidor - + With the Mute checkbox, the audio channel can be muted. Com a caixa de seleção Mute, o canal de áudio pode ser silenciado. - + Mute button Botão Mute - + Solo button Botão Solo - + Fader Tag Identificador do Fader - + Grp Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Mostra o nível de áudio pré-fader deste canal. A todos os clientes conectados ao servidor será atribuído um nível de áudio, o mesmo valor para cada cliente. - + &No grouping &Sem grupo - + Assign to group Atribuir ao grupo - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Ajusta o nível de áudio deste canal. A todos os clientes ligados ao servidor será atribuído um fader de áudio,exibido em cada cliente, para ajustar a mixagem local. - + Speaker with cancellation stroke: Indicates that another client has muted you. Alto-falante com sinal de proibido: Indica que outro cliente silenciou o teu canal. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Define a posição de panorâmica da esquerda para a direita do canal. Funciona apenas no modo estéreo ou, de preferência, no modo Entrada Mono/Saída Estéreo. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Com a caixa de seleção Solo, o canal de áudio pode ser definido como solo, o que significa que todos os outros canais, exceto o canal atual, serão silenciados. É possível definir mais que um canal no modo solo. - + Group Grupo - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Com a caixa de seleção Grp, um grupo de canais de áudio pode ser definido. Todos os faders de canal de um grupo são movidos em sincronização proporcional se algum dos faders do grupo for movido. - + Group button Botão Grupo - + Mixer channel instrument picture Imagem do instrumento do canal do mixer - + Mixer channel label (fader tag) Identificação do canal do mixer (identificador do fader) - + PAN BAL - + MUTE MUTE - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Apelido/Nome - + Instrument Instrumento - + Location Localização - - - + + + Skill Level Nível de Habilidade - + Alias Apelido - + Beginner Principiante - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. A marcação do fader identifica o cliente conectado. O nome, a imagem de seu instrumento e a bandeira de sua localização podem ser definidos na janela principal. - + Mixer channel country/region flag Bandeira do país/região do canal do mixer - + Intermediate Intermediário - + Expert Avançado - + Musician Profile Perfil do músico - - - + + + Mute Mudo - - - + + + Pan Bal - - - + + + Solo Solo @@ -473,59 +473,59 @@ CChatDlg - + Chat Window Janela de Mensagens - + The chat window shows a history of all chat messages. A janela de mensagens mostra um histórico de todas as mensagens enviadas durante a sessão. - + Chat history Histórico de Mensagens - + Input Message Text Texto da Mensagem - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Digite o texto da mensagem no campo de digitação e pressione Enter para enviar a mensagem ao servidor, que distribui a mensagem a todos os clientes conectados. A sua mensagem será então exibida na janela de mensagens. - + New chat text edit box Campo de edição de texto da mensagem - + Type a message here Digite uma mensagem aqui - + &Edit E&ditar - + Cl&ear Chat History Didn't include "de Mensagens" in order to keep the menu a bit shorter. &Limpar Histórico - - + + &Close &Fechar - + Do you want to open the link '%1' in your browser? Deseja abrir o link '%1' em seu navegador? @@ -546,369 +546,369 @@ CClientDlg - + Input Level Meter Indicador do Nível de Entrada - + Make sure not to clip the input signal to avoid distortions of the audio signal. Certifique-se de não clipar o sinal de entrada para evitar distorções no sinal de áudio. - + Input level meter Medidor do nível de entrada - + Simulates an analog LED level meter. Simula um medidor de nível analógico LED. - + Connect/Disconnect Button Botão de Conectar/Desconectar - + Connect and disconnect toggle button Botão de alternação entre ligar e desligar - + This shows the level of the two stereo channels for your audio input. Isto mostra o nível dos dois canais estéreo para a sua entrada de áudio. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Se a aplicação estiver conectada a um servidor e você tocar o seu instrumento/cantar no microfone, os LEDs do medidor do nível de entrada devem piscar. Se isso não acontecer, você provavelmente selecionou o canal de entrada errado (Ex.: entrada de linha em vez da entrada do microfone) ou ajustou o ganho da entrada muito baixo no mixer de áudio (Windows) ou na placa de som. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Para um uso adequado da aplicação, não deve ouvir a sua voz/instrumento diretamente nos alto-falantes ou nos fones enquanto a aplicação não estiver conectada a um servidor. Isso pode ser feito silenciando (mute) o canal da entrada de áudio no dispositivo de reprodução (não no dispositivo de captura!). - + Reverb effect Efeito de Reverberação - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. O efeito de reverberação pode ser aplicado a um canal local de áudio mono ou a ambos os canais no modo estéreo. A seleção do canal mono e o nível de reverberação podem ser modificados. Por exemplo, se o sinal do microfone for alimentado no canal de áudio direito da placa de som, e for necessário aplicar um efeito de reverberação, ajuste o seletor de canal para a direita e mova o fader para cima até que o nível de reverberação desejado seja atingido. - + Reverb effect level setting Ajuste do nível do efeito de reverberação - + Reverb Channel Selection Seleção do Canal de Reverberação - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Com estes botões de seleção, pode ser escolhido o canal de entrada de áudio no qual o efeito de reverberação é aplicado. Pode ser selecionado o canal de entrada esquerdo ou direito. - + Left channel selection for reverb Seleção do canal esquerdo para reverberação - + Right channel selection for reverb Seleção do canal direito para reverberação - + Green Verde - + The delay is perfect for a jam session. A latência é perfeita para uma jam session. - + Yellow Amarelo - + Red Vermelho - + If this LED indicator turns red, you will not have much fun using %1. Se este indicador LED ficar vermelho, você não irá divertir-se muito ao usar o %1. - + Delay status LED indicator Indicador LED do estado de latência - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Abre uma caixa de diálogo onde pode selecionar a que servidor conectar-se. Se estiver conectado, pressionar este botão vai terminar a sessão. - + Shows the current audio delay status: Mostra o estado atual da latência de áudio: - + A session is still possible but it may be harder to play. Ainda é possível fazer uma sessão, mas poderá ser mais difícil tocar no tempo. - + The delay is too large for jamming. A latência é demasiada para tocar no tempo. - + The sound card's buffer delay (buffer size) is too small (see Settings window). O buffer (tamanho do buffer) da placa de som é demasiado pequeno (verificar janela das Definições). - + The upload or download stream rate is too high for your internet bandwidth. A taxa de upload ou download é muito elevada para a sua largura de banda da Internet. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. A latência da conexão é o tempo necessário para o fluxo de áudio viajar do cliente para o servidor e vice-versa. Esta latência é introduzida pela rede e deve ser cerca de 20-30 ms. Se esta latência for maior que 50 ms, a distância até ao servidor é muito grande ou sua conexão à Internet não é suficiente. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. A latência geral é calculada a partir da latência da conexão atual e do atraso introduzido pelas configurações de buffer. - - + + C&onnect C&onectar - + &File &Arquivo - + &View &Ver - + &Connection Setup... C&onectar a Servidor... - + My &Profile... Meu &Perfil... - + C&hat... &Mensagens... - + &Analyzer Console... Console de &Análise... - + Clear &All Stored Solo and Mute Settings Limpar Todas as Configurações de &Solo e Mute - + %1 Directory Diretório %1 - + Ok Ok - + E&xit S&air - + &Edit &Editar - + Delay Status LED LED do Estado da Latência - + The network jitter buffer is not large enough for the current network/audio interface jitter. O jitter buffer da rede não é grande o suficiente para o jitter atual da interface de rede/áudio. - + The CPU of the client or server is at 100%. O CPU do cliente ou servidor está em 100%. - + If this LED indicator turns red, the audio stream is interrupted. Se este indicador LED ficar vermelho, o fluxo de áudio é interrompido. - + Current Connection Status Estado da Conexão Atual - + &Load Mixer Channels Setup... &Carregar Configuração de Canais do Mixer... - + &Save Mixer Channels Setup... &Salvar Configuração de Canais do Mixer... - + Sort Users by Chann&el O&rdenar Usuários por Canal - + Sett&ings Def&inições - + Audio/Network &Settings... Definiçõe&s de Áudio/Rede... - + A&dvanced Settings... &Definições Avançadas... - + N&o User Sorting Sem &Ordenação de Canais - + Local Jitter Buffer Status LED LED de estado do jitter buffer local - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: O indicador LED do estado do jitter buffer local mostra a situação atual do áudio/transmissão. Se a luz estiver vermelha, o fluxo de áudio é interrompido. Isto é causado por um dos seguintes problemas: - + Local Jitter Buffer status LED indicator Indicador LED de estado do jitter buffer local - + O&wn Fader First P&róprio Fader Primeiro - + Sort Users by &Name Ordenar os Canais por &Nome - + Sort Users by &Instrument Ordenar os Canais por &Instrumento - + Sort Users by &Group Ordenar os Canais por &Grupo - + Sort Users by &City Ordenar os Canais por &Cidade - + Set All Faders to New Client &Level Todos os Faders para Nível de Novo C&liente - + Auto-Adjust all &Faders Auto-Ajuste todos &Faders - + &MIDI Control Settings... - + Configuração de controle &MIDI... - - + + Select Channel Setup File Selecione Arquivo de Configuraçao de Canal - + user usuário - + users usuários - + Connect Conectar - + Settings Definições - + Chat Mensagens - + Enable feedback detection Ativar detecção de microfonia - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -917,12 +917,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de microfonia primeiro e depois reative seu som. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Sua placa de som não está funcionando corretamente. Por favor abra a janela de ajustes e verifique a seleção do dispositivo e as configurações de driver. - + &Disconnect &Desconectar @@ -1019,1100 +1019,1109 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CClientSettingsDlg - + Jitter Buffer Size Tamanho do Jitter Buffer - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. A configuração do jitter buffer é, portanto, uma troca entre a qualidade do áudio e o atraso geral. - + Local jitter buffer slider control Controle deslizante do jitter buffer local - + Server jitter buffer slider control Controle deslizante do jitter buffer do servidor - + Auto jitter buffer check box Interruptor do jitter buffer automático - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Se o driver for selecionado durante uma sessão ativa, a conexão será interrompida, o driver será alterado e a conexão reiniciada automaticamente. - + Sound card device selector combo box Seletor de dispositivo de som - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Caso o driver ASIO4ALL seja usado, note que esse driver geralmente introduz aprox. 10-30 ms de atraso de áudio adicional. Dado isto, é recomendável usar uma placa de som com um driver ASIO nativo. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Se estiver utilizando o driver kX ASIO, certifique-se de conectar as entradas ASIO no painel de configurações do kX DSP. - + Sound Card Channel Mapping Mapeamento de Canais da Placa de Som - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Caso o dispositivo selecionado da placa de som ofereça mais que um canal de entrada ou saída, as configurações de Mapeamento de canais de entrada e de saída estarão visíveis. - + Left input channel selection combo box Seletor de canal de entrada esquerdo - + Right input channel selection combo box Seletor de canal de entrada direito - + Left output channel selection combo box Seletor de canal de saída esquerdo - + Right output channel selection combo box Seletor de canal de saída direito - + Small Network Buffers Buffers de Rede Pequenos - + Small network buffers check box Caixa de ativação de buffers de rede pequenos - + Sound Card Buffer Delay Atraso do Buffer da Placa de Som - + Sound card driver settings Definições de driver da placa de som - + ASIO Device Settings push button Botão de Definições do Dispositivo ASIO - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Selecione o estilo a ser usado para os medidores de nível. As opções Barra (estreita) e LEDs (redondo, pequeno) aplicam-se apenas à mesa do mixer. Quando a Barra (estreita) é selecionada, os medidores de entrada são definidos como Barra (larga). Quando LEDs (redondo, pequeno) é selecionado, os medidores de entrada são definidos como LEDs (redondo, grande). As opções restantes aplicam-se à mesa do mixer e aos medidores de entrada. - + Language Idioma - + Select the language to be used for the user interface. Selecione o idioma para ser utilizado na interface do usuário. - + Language combo box Seletor de idioma - + and e - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Se você precisa adicionar mais diretórios ao menu suspenso de Diretórios na janela Conectar, insira os endereços aqui.<br> - + Audio Upstream Rate Taxa de Transmissão de Áudio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Depende do tamanho do pacote de áudio e da configuração de compactação de áudio. Certifique-se de que a taxa de transmissão não é maior que a taxa de upload de internet disponível (verifique isso em um serviço como o speedtest.net). - - - - + + + + None Nenhum - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Escreva o seu nome ou um apelido aqui para que os outros músicos com quem quer tocar saibam quem você é. Além disso, pode também definir uma imagem do instrumento que toca e uma bandeira do país ou região onde vive. A cidade e o nível de habilidade com o seu instrumento também podem ser adicionados. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. O que definir aqui aparecerá abaixo do seu fader no mixer quando estiver conectado a um servidor %1. Esta etiqueta também será exibida em cada cliente que estiver conectado ao mesmo servidor. - + Country/region flag button Botão da bandeira do país/região - - + + Could not open MIDI port - + Não foi possível abrir a porta MIDI - + No MIDI devices found. Please connect a MIDI device and try again. - + Nenhum dispositivo MIDI encontrado. Conecte um dispositivo MIDI e tente novamente. - + Please check your OS configuration. - + Por favor verifique a configuração do seu SO. - + Center Centro - + R R - + The buffer setting is therefore a trade-off between audio quality and overall delay. A configuração do buffer é, portanto, uma troca entre qualidade de áudio e latência geral. - + 64 samples setting radio button Botão de configuração de 64 amostras - + 128 samples setting radio button Botão de configuração de 128 amostras - + 256 samples setting radio button Botão de configuração de 256 amostras - + Audio Channels Canais de Áudio - + Audio channels combo box Seletor de canais de áudio - + Audio Quality Qualidade de Áudio - + Audio quality combo box Seletor de qualidade áudio - + New Client Level Nível de Novo Cliente - + New client level edit box Caixa de edição no nível de novo cliente - - + + Mono Mono - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. vai aumentar a quantidade de dados da transmissão. Verifique se a taxa de upload não ultrapassa a velocidade de upload disponível da sua conexão à Internet. - + Mono-in/Stereo-out Entrada Mono/Saída Estéreo - - - + + + Stereo Estéreo - - - + + + &Close &Fechar - + Local Audio Input Fader Fader da Entrada Local de Áudio - - + + L L - + Local audio input fader (left/right) Fader de entrada local de áudio (esquerdo/direito) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). O jitter buffer (ou buffer de instabilidade) compensa os desvios de temporização da rede e da placa de som. O tamanho do buffer influencia, portanto, a qualidade do fluxo de áudio (quantas interrupções ocorrem) e a latência geral (quanto maior o buffer, maior a latência). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Pode escolher o tamanho do jitter buffer manualmente para o cliente local e o servidor remoto. Para o jitter buffer local, as interrupções no fluxo de áudio são indicadas pela luz na parte inferior dos faders do jitter buffer. Se a luz ficar vermelha, ocorreu um excesso/déficit do buffer e o fluxo de áudio é interrompido. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Caso a configuração automática estiver ativada, os buffers de rede do cliente local e do servidor remoto são configurados automaticamente com um valor conservador para minimizar a probabilidade de perda de áudio. Se o modo automático estiver ligado, os controlos estarão desativados (não podem ser alterados pelo usuário). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Caso a configuração automática do jitter buffer estiver ativada, os buffers de rede do cliente local e do servidor remoto são configurados com um valor conservador para minimizar a probabilidade de perda de áudio. Para ajustar o atraso/latência do áudio, é recomendável desativar a funcionalidade de configuração automática e diminuir o tamanho do jitter buffer manualmente usando os controles deslizantes até que a quantidade de perdas de áudio lhe sejam pessoalmente aceitáveis. O indicador LED representará as interrupções de áudio do jitter buffer local através de uma luz vermelha. - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Para cada canal de entrada/saída do %1 (canal esquerdo e direito), um canal real da placa de som pode ser selecionado. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Habilita suporte para pacotes de áudio de rede muito pequenos. Esses pacotes de rede só são realmente usados se o buffer de atraso da placa de som for menor que %1 amostras. Quanto menores os buffers de rede, menor a latência do áudio. Mas, ao mesmo tempo, a carga da rede e a probabilidade de falhas de áudio ou artefatos de som aumentam. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. A configuração do atraso do buffer é uma configuração fundamental do %1. Esta configuração tem influência em muitas propriedades da conexão. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Isto abre definições de driver para sua placa de som. Alguns drivers permitem mudanças na configuração de buffer, outros como ASIO4ALL permitem escolher entradas e saídas do(s) seu(s) dispositivo(s). Mais informações podem ser encontradas em jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Abre as definições de driver. Nota: %1 somente suporta dispositivos com uma taxa de amostras de %2 Hz. Você não poderá selecionar um driver/dispositivo que não suporte. Para obter mais ajuda, consulte jamulus.io. - + 128 samples: Should work for most available sound cards. 128 amostras: Deve funcionar na maioria das placas de som disponíveis. - + Skin Aparência - + Select the skin to be used for the main window. Selecione a aparência para ser utilizada na janela principal. - + Skin combo box Seletor de aparência - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Seleciona o número de canais de áudio a serem usados para a comunicação entre cliente e servidor. Existem três modos disponíveis: - + These modes use one and two audio channels respectively. Estes modos usam um e dois canais de áudio, respectivamente. - + Mono in/Stereo-out Entrada Mono/Saída Estéreo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. O sinal de áudio enviado ao servidor é mono, mas o sinal de retorno é estéreo. Isso é útil quando a placa de som coloca o instrumento e o microfone em canais diferentes. Nesse caso, os dois sinais de entrada podem ser misturados num canal mono, mas a mistura do servidor pode ser ouvida em estéreo. - + Enabling Habilitando o modo - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. No modo de transmissão estéreo, nenhuma seleção de canal de áudio para o efeito de reverberação estará disponível na janela principal, pois o efeito é aplicado em ambos os canais. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Quanto maior a qualidade de áudio, maior a quantidade de dados da transmissão. Verifique se a taxa de upload não ultrapassa a velocidade de upload disponível da sua conexão à Internet. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Esta opção define o nível do fader de um cliente novo, em percentagem. Se um cliente novo conecta-se ao mesmo servidor, este irá ter o nível do fader específicado, exceto se já definiu o nível do fader desse cliente a partir de uma conexão anterior que tenha sido guardada. - + Input Boost Changed from Impulso to Reforço Reforço de Entrada - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Esta configuração permite que você aumente o nível do seu sinal de entrada em fatores de até 10 (+ 20dB). Se o seu som estiver muito baixo, primeiro tente aumentar o nível aproximando-se do microfone, ajustando seu equipamento de som ou aumentando os níveis de entrada nas configurações do sistema operacional. Somente se isso falhar, defina um fator aqui. Se o seu som estiver muito alto, distorcido e cortado, esta opção não ajudará. Não use isso. A distorção ainda estará lá. Em vez disso, diminua o nível de entrada ficando mais longe do microfone, ajustando o equipamento de som ou diminuindo as configurações de entrada do sistema operacional. - + Input Boost combo box Seletor do Reforço de Entrada - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Controla os níveis relativos dos canais locais esquerdo e direito. Para um sinal mono, atua como uma panorâmica entre os dois canais. Por exemplo, se um microfone estiver ligado no canal de entrada direito e um instrumento estiver ligado no canal de entrada esquerdo, mais alto que o microfone, mova o fader de áudio numa direção em que o marcador acima do fader mostre %1, onde %2 é o indicador de atenuação. - + Audio Device Dispositivo de Áudio - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. No sistema operacional Windows o driver ASIO (placa de som) pode ser selecionado usando %1. Se o driver ASIO selecionado não for válido, uma mensagem de erro será exibida e o driver válido anterior será selecionado. No macOS o hardware de entrada e saída pode ser selecionado. - + Three buffer sizes can be selected Três tamanhos de buffer podem ser selecionados - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 amostras: Fornece menor latência, mas não funciona com todas as placas de som. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 amostras: Deve apenas ser usado quando 64 ou 128 amostras estiver causando problemas. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Alguns drivers de placa de som não permitem que o atraso do buffer seja alterado de dentro do %1. Nesse caso, a configuração de atraso do buffer está desabilitada e deve ser alterada usando o driver da placa de som. Use a ferramenta apropriada para a interface em uso para ajustar o tamanho do buffer. Por exemplo, se estiver usando ASIO, use o botão "Definições de Dispositivo ASIO" para abrir o painel de configurações do driver ou se estiver usando JACK, use uma ferramenta como QjackCtl para ajustar o tamanho do buffer. Outras interfaces, como o Pipewire, exigem o uso de sua ferramenta apropriada. Consulte o manual da interface. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Se nenhum tamanho de buffer estiver selecionado e todas as configurações estiverem desativadas, significa que um tamanho de buffer em uso pelo driver não combina os valores. %1 ainda funcionará com essa configuração, mas com desempenho limitado. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. O atraso do buffer influencia a conexão, a taxa de upload e a latência geral. Quanto menor o tamanho do buffer, maior a probabilidade de a luz vermelha no indicador de estado (interrupções), maior a taxa de upload e menor a latência geral. - + Meter Style Estilo do Medidor - + Meter Style combo box Seletor do Estilo do Medidor - + Custom Directories Diretórios Personalizados - + Custom Directories combo box Seletor de Diretório Personalizado - + Delete custom directory button Botão para apagar diretórios personalizados - + Delete Custom Directory Apagar Diretório Personalizado - + Click the button to delete the currently selected custom directory. Clique no botão para excluir o diretório personalizado selecionado. - + Number of Mixer Panel Rows Número de Linhas do Painel do Mixer - + Adjust the number of rows used to arrange the mixer panel. Ajusta o número de linhas usadas para organizar o painel do mixer. - + Number of Mixer Panel Rows spin box Spinner Número de Linhas do Painel do Mixer - + Feedback Protection Microfonia ou realimentação? TBD Proteção de Microfonia - + Prevents acoustic feedback between microphone and speakers. Permite a proteção de microfonia detectar realimentação acústica entre microfone e falantes. - + Feedback Protection check box Caixa de seleção Proteção de Microfonia - + Audio Alerts Alertas de Áudio - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Ative o alerta de áudio ao receber uma mensagem de bate-papo e quando um novo cliente ingressar na sessão. Um segundo dispositivo de som pode ser necessário para ouvir os alertas. - + Audio Alerts check box Caixa de seleção de Alertas de Áudio - + Enable/disable MIDI-in port - + Ativar/desativar porta de entrada MIDI - + MIDI-in port check box - + Caixa de seleção porta de entrada MIDI - + Pick-up Mode - + Modo Pick-up - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Quando ativado, o controle MIDI de fader e pan aguardará até que a posição do controlador físico corresponda ao valor atual do software antes de responder. Isso evita saltos repentinos quando o controlador físico estiver dessincronizado com o software. - + Pick-up Mode check box - + Caixa de seleção de Modo Pick-up - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Selecione a porta de saída MIDI à qual deseja conectar. Jamulus conectará automaticamente sua porta de entrada MIDI ao dispositivo selecionado quando ativado. Você também pode usar o gerenciador de conexões de sua preferência para alterar as conexões manualmente. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Selecione a fonte MIDI à qual deseja se conectar. Jamulus conectará automaticamente sua porta de entrada MIDI ao dispositivo selecionado quando ativado. Você também pode usar a Configuração de Áudio MIDI para alterar as conexões manualmente. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + Selecione quais dispositivos de entrada MIDI o Jamulus deve receber. Selecione "Todos os dispositivos" para receber MIDI de todos os dispositivos conectados ou escolha um dispositivo específico. - + MIDI input device combo box - + Combo do dispositivo de entrada MIDI - + MIDI controller settings - + Configurações controlador MIDI - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + Há um parâmetro global de canal MIDI (0-16) e dois parâmetros que você pode definir para cada item controlado: o primeiro CC MIDI e a quantidade de CCs consecutivos (contagem). Primeiro, defina o canal que você deseja que o Jamulus receba (0 para todos os canais). Em seguida, para cada item que você deseja controlar (fader de volume, pan, solo, mudo), defina o primeiro CC MIDI (número do CC inicial) e a quantidade de CCs consecutivos (contagem). Há uma exceção que não requer a definição de CCs consecutivos: o parâmetro "Silenciar-me" - ele requer apenas um único número de CC, pois se aplica somente ao seu próprio fluxo de áudio. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + Você pode digitar os valores MIDI CC ou usar o botão "Aprender": clique em "Aprender", acione o fader/botão/controlador do seu controlador MIDI e o número MIDI CC será detectado e salvo. - + MIDI channel combo box - + Caixa de combinação canal MIDI - + Mute Myself MIDI CC number spin box - + Campo MIDI CC Silenciar-me - + Fader offset spin box - + Campo MIDI CC Fader - + Pan offset spin box - + Campo MIDI CC Pan - + Solo offset spin box - + Campo MIDI CC Solo - + Mute offset spin box - + Campo MIDI CC Mudo - + Mute Myself MIDI learn button - + Botão aprender MIDI Silenciar-me - + Fader offset MIDI learn button - + Botão aprender MIDI Fader - + Pan offset MIDI learn button - + Botão aprender MIDI Pan - + Solo offset MIDI learn button - + Botão aprender MIDI Solo - + Mute offset MIDI learn button - + Botão aprender MIDI Mudo - + ASIO Device Settings Definições de Dispositivo ASIO - + Low Baixa - - + + Normal Normal - + High Alta - + + Max + + + + Fancy Sofisticada - + Compact Compacta - + Bar (narrow) Barra (estreita) - + Bar (wide) Barra (larga) - + LEDs (stripe) LEDs (faixa) - + LEDs (round, small) LEDs (redondo, pequeno) - + LEDs (round, big) LEDs (redondo, grande) - + Learn - + Aprender - - + + All Devices - + Todos os Dispositivos - + No device connected - + Nenhum dispositivo conectado - - + + MIDI Device Not Found - + Dispositivo MIDI não encontrado - + The MIDI device "%1" could not be found. Using all available devices instead. - + O dispositivo MIDI "%1" não foi encontrado. Usando todos os dispositivos disponíveis. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - + O dispositivo MIDI "%1" não está disponível. Selecione um dispositivo diferente no menu suspenso para conectar. - - + + MIDI Device Connection Failed - + Falha na conexão do dispositivo MIDI - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Não foi possível conectar ao dispositivo MIDI "%1". Verifique a configuração do seu SO. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Não foi possível conectar ao dispositivo MIDI "%1". Verifique se o dispositivo está disponível. - + Listening... - + Ouvindo... - + Custom Personalizado - + Any Genre 2 Gênero Variado 2 - Any Genre 3 - Gênero Variado 3 + Gênero Variado 3 - + + Any Genre Asia + + + + Genre Rock Gênero Rock - + Genre Jazz Gênero Jazz - + Genre Classical/Folk Gênero Clássico/Folk - + Genre Choral/Barbershop Gênero Coral/Barbershop - + Any Genre 1 Gênero Variado 1 - + Musician Profile Perfil do músico - + Alias or name edit box Caixa de edição do nome ou apelido - + Instrument picture button Botão da imagem do instrumento - + City edit box Caixa de edição da cidade - + Skill level combo box Seletor do nível de habilidade - + Beginner Principiante - + Intermediate Intermediário - + Expert Avançado - - + + Size: Tamanho: - + Buffer Delay Atraso do buffer - + Buffer Delay: Atraso do buffer: - + Drum Set Bateria - + Djembe Djembê - + Electric Guitar Guitarra Elétrica - + Acoustic Guitar Violão - + Bass Guitar Baixo - + Keyboard Teclado - + Synthesizer Sintetizador - + Grand Piano Piano de Cauda - + Accordion Acordeão - + Vocal Voz - + Microphone Microfone - + Harmonica Gaita - + Trumpet Trompete - + Trombone Trombone - + French Horn Trompa Francesa - + Tuba Tuba - + Saxophone Saxofone - + Clarinet Clarinete - + Flute Flauta - + Violin Violino - + Cello Violoncelo - + Double Bass Contrabaixo - + Recorder Gravador - + Streamer Streamer - + Listener Ouvinte - + Guitar+Vocal Guitarra+Voz - + Keyboard+Vocal Teclado+Voz - + Bodhran Bodhrán - + Bassoon Fagote - + Oboe Oboé - + Harp Harpa - + Viola Viola de Arco - + Congas Congas - + Bongo Bongo - + Vocal Bass Voz Baixo - + Vocal Tenor Voz Tenor - + Vocal Alto Voz Alto - + Vocal Soprano Voz Soprano - + Banjo Banjo - + Mandolin Bandolim - + Ukulele Ukulele - + Bass Ukulele Ukulele Baixo - + Vocal Baritone Voz Barítono - + Vocal Lead Voz Principal - + Mountain Dulcimer Saltério dos Apalaches - + Scratching Scratching - + Rapping Rap - + Vibraphone Vibrafone - + Conductor Maestro @@ -2306,117 +2315,117 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de MIDI Control - + Controle MIDI MIDI-in - + Entrada MIDI MIDI Channel - + Canal MIDI 0 (all) - + 0 (todos) 1 - + 1 2 - + 2 3 - + 3 4 - + 4 5 - + 5 6 - + 6 7 - + 7 8 - + 8 9 - + 9 10 - + 10 11 - + 11 12 - + 12 13 - + 13 14 - + 14 15 - + 15 16 - + 16 Pick-up Mode - + Modo Pick-up Mute Myself - + Silenciar-me MIDI CC - + MIDI CC @@ -2425,12 +2434,12 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de Learn - + Aprender Fader - + Fader @@ -2438,7 +2447,7 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de First MIDI CC - + Primeiro CC MIDI @@ -2446,22 +2455,22 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de Count - + Contagem Mute - Mudo + Mudo Solo - Solo + Solo MIDI Device - + Dispositivo MIDI @@ -2512,117 +2521,117 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CConnectDlg - + Server List Lista de servidores - + Directory Diretório - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Exibe os servidores listados por diretório selecionado. Você pode adicionar diretórios personalizados em Configurações Avançadas. - + Directory combo box Seletor de Diretório - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtra a lista de servidores pelo texto fornecido. Observe que o filtro não diferencia maiúsculas de minúsculas. Um único caractere # filtrará os servidores com pelo menos uma pessoa conectada. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Desmarque para recolher a lista de servidores e mostrar apenas os detalhes. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. A janela de Configuração de Conexão lista os servidores disponíveis registrados no diretório selecionado. Use o menu suspenso Diretório para alterar o diretório, localize o servidor que deseja ingressar na lista de servidores, clique nele e, em seguida clique no botão Conectar para conectar-se. Como alternativa, clique duas vezes no nome do servidor para conectar-se. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Servidores permanentes (aqueles que estão listados por mais de 48 horas) são mostrados em negrito. - + You can add custom directories in Advanced Settings. Você pode adicionar diretórios personalizados em Configurações Avançadas. - + Server list view Vista da lista de servidores - + Server Address Endereço do servidor - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Se você souber o endereço do servidor, poderá conectar-se a ele usando o campo Nome/Endereço do servidor. Um número de porta opcional pode ser adicionado após o endereço do servidor usando dois pontos como separador, por exemplo %1. O campo também mostrará uma lista dos endereços de servidor usados mais recentemente. - + Holds the current server address. It also stores old addresses in the combo box list. Contém o endereço do servidor atual. Também armazena endereços antigos na lista do seletor. - + Delete server address button Botão para apagar endereço de servidor - + Delete Server Address Apagar Endereço de Servidor - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Clique no botão para limpar o endereço de servidor selecionado e excluí-lo da lista de servidores armazenados. - + Ping - Ping + Ping - + Server address edit box Caixa de edição do endereço do servidor - + Filter Filtro - + Filter edit box Caixa de edição do filtro - + Show All Musicians Mostrar Todos os Músicos - + Show all musicians check box Caixa de seleção para mostrar músicos - + Filter text, or # for occupied servers Texto ou # para servidores ocupados @@ -2693,43 +2702,43 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CHelpMenu - + &Help A&juda - - + + Getting &Started... Como Começa&r... - + Software &Manual... &Manual do Programa... - + What's &This O que é &isto - + P&rivacy policy... - + Política de P&rivacidade... - + &About Jamulus... &Sobre o Jamulus... - + About &Qt... Sobre o &Qt... - + About Qt Sobre o Qt @@ -2737,12 +2746,12 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CLanguageComboBox - + Restart Required É necessário reiniciar - + Please restart the application for the language change to take effect. Reinicie a aplicação para que a alteração de idioma entre em vigor. @@ -2750,22 +2759,22 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Este servidor requer que você aceite as condições antes de entrar. Por favor leia-as na janela de chat. - + I have read the conditions and &agree. Li as condições e &concordo. - + Accept Aceitar - + Decline Rejeitar @@ -2773,17 +2782,17 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CMultiColorLED - + Red Vermelho - + Yellow Amarelo - + Green Verde @@ -2791,7 +2800,7 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CMusProfDlg - + No Name Sem Nome @@ -2799,448 +2808,448 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CServerDlg - + Client List Lista de Clientes - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. A lista de clientes mostra todos os clientes que estão atualmente conectados neste servidor. Algumas informações sobre os clientes, como o endereço IP e o nome, são fornecidas para cada cliente ligado. - + Connected clients list view Lista de clientes conectados - + Directory Type combo box Seletor de Tipo de Diretório - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Quando um valordirefente de "%1" for escolhido para Diretório, isso mostrará se o registro foi bem sucedido. Se o registro falhou, escolha um diretório diferente. - + When checked, the recorder will run while a session is in progress (if set up correctly). Quando marcada, o gravador será executado enquanto uma sessão estiver em andamento (se configurado corretamente). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Nenhum diretório de gravação foi definido ou o valor não pode ser usado. Verifique o valor na guia Opções. - + Recording has been switched off by the UI checkbox or JSON-RPC. A gravação foi desativada pela caixa de seleção da interface do usuário ou pelo JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. A gravação foi desativada pela caixa de seleção da interface do usuário, SIGUSR2 ou JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Se o diretório de gravação não for utilizável, o problema será exibido no lugar do diretório de sessão. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Clique no botão para abrir a caixa de diálogo que permite selecionar o diretório de gravação principal. O valor escolhido deve existir e ser gravável (permitir a criação de subdiretórios pelo usuário com o qual %1 está sendo executado). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Valor atual do diretório principal de gravação. O valor escolhido deve existir e ser gravável (permite criação de subdiretórios pelo usuário com o qual %1 está sendo executado.). Clique no botão para abrir a caixa de diálogo que permite selecionar o diretório principal de gravação. - + Custom Directory address End. de Diretório Personalizado - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. O endereço do Diretório Personalizado é o endereço do diretório que contém a lista de servidores ao qual esse servidor deve ser adicionado. - + Server List Filename dialog push button Botão de diálogo do arquivo da Lista de Servidores - - + + Server List Filename Arquivo da Lista de Servidores - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Clique no botão para abrir a caixa de diálogo que permite definir o nome do arquivo de persistência da lista de servidores. O usuário com o qual %1 está sendo executado necessita ser capaz de criar o nome do arquivo especificado, embora ele já exista (será substituído ao salvar). - + Server List Filename text box (read-only) Caixa de texto com o arquivo da Lista de Servidores (apenas leitura) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. O valor atual do nome do arquivo de persistência da lista de servidores. O usuário com o qual %1 está sendo executado precisa ser capaz de criar o nome do arquivo especificado, embora ele já exista (será substituído ao salvar). Clique no botão para abrir a caixa de diálogo que permite definir o nome do arquivo de persistência da lista de servidores. - + Clear the server list file name button Botão limpar arquivo da lista de servidores - + Clear Server List Filename Limpar Arquivo da Lista de Servidores - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Clique no botão para limpar o nome do arquivo de persistência da lista de servidores atualmente selecionado. Isso impedirá a persistência da lista de servidores até que um novo valor seja selecionado. - + Start Minimized on Operating System Start Iniciar Minimizado com o Sistema Operacional - + Now a directory Agora um diretório - + Register Server Status Estado de Registro do Servidor - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Se a caixa de seleção Iniciar Minimizado com o Sistema Operacional estiver marcada, o servidor será iniciado quando o sistema operacional for iniciado, e minimizado automaticamente para um ícone da barra de tarefas do sistema. - + Server Name Nome do Servidor - + The server name identifies your server in the connect dialog server list at the clients. O nome do servidor identifica seu servidor na lista do diálogo de conexão exibido nos clientes. - + Server name line edit Caixa de edição do nome do servidor - + Location City Localização: Cidade - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. A cidade onde este servidor está localizado pode ser definida aqui. Se um nome de cidade for inserido, este será mostrado na lista do diálogo de conexão dos clientes. - + City where the server is located line edit Caixa de edição da cidade onde o servidor se encontra - + Country/Region País/Região - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Define o país ou região onde o servidor está sendo executado. Os clientes irão exibir essa localização na caixa de diálogo de conexão da lista de servidores. - + Combo box for location of this server Seletor para localização deste servidor - + Display dialog to select recording directory button Botão que mostra diálogo para selecionar diretório de gravação - - + + Main Recording Directory Diretório Principal de Gravação - + Main recording directory text box (read-only) Caixa de texto com o diretório principal de gravação (apenas leitura) - + Clear the recording directory button Botão para limpar o diretório de gravação - + Clear Recording Directory Limpar Diretório de Gravação - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Clique no botão para limpar o diretório de gravação atualmente selecionado. Isso impedirá a gravação até que um novo valor seja selecionado. - + Checkbox to turn on or off server recording Caixa de seleção para ligar ou desligar a gravação no servidor - + Jam Recorder Habilitar Gravador - + Current session directory text box (read-only) Caixa de texto com a pasta da gravação (apenas leitura) - + Current Session Directory Pasta da Sessão Atual - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Ativo durante a gravação e exibe a pasta da gravação atual. Inativo depois de gravação ou quando o gravador não estiver habilitado. - + Recorder status label Etiqueta do estado do Gravador - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Diretório:</b> Selecione '%1' para não registrar seu servidor com um diretório.<br>Ou selecione um dos gêneros para registrar-se com esse diretório.<br>Ou selecione '%2' e especifique um endereço de Diretório Personalizado na aba Opções para registrar-se com um diretório personalizado.<br><br>Para qualquer valor exceto '%1', este servidor registra-se com um diretório para que um usuário %3 possa escolher este servidor na lista de servidores do diálogo de conexão do cliente, quando escolher aquele diretório.<br><br>O registro do servidor é renovado periodicamente para garantir que todos os servidores na lista de servidores de diálogo de conexão estejam realmente disponíveis. - + Recorder Status Estado do Gravador - + Displays the current status of the recorder. The following values are possible: Exibe o estado atual do gravador. Os seguintes valores são possíveis: - + There is no one connected to the server to record. Não há ninguém conectado ao servidor para gravar. - + The performers are being recorded to the specified session directory. Os artistas estão sendo gravados no diretório de sessão especificado. - + NOTE NOTA - + Server welcome message edit box Caixa de edição da mensagem de boas-vindas do servidor - + Server Welcome Message Mensagem de Boas-vindas do Servidor - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Uma mensagem de boas-vindas é exibida na janela de chat se um músico entra no servidor. Se nenhuma mensagem for definida, a mensagem de boas-vindas do servidor é desativada. - + Language Idioma - + Select the language to be used for the user interface. Selecione o idioma para ser utilizado na interface do usuário. - + Language combo box Seletor de idioma - + Custom Directory line edit Edição de linha do Diretório Personalizado - + &Hide %1 server &Ocultar servidor %1 - + &Show %1 server Mostrar &servidor %1 - + %1 server %1 is the name of the main application Servidor %1 - + Type a message here. If no message is set, the server welcome is disabled. Digite uma mensagem de boas-vindas aqui. Se nenhuma mensagem for definida, a mensagem de boas-vindas do servidor será desativada. - + %1 Server %1 is the name of the main application Servidor %1 - + Recorder failed to start. Please check available disk space and permissions and try again. Error: O gravador falhou ao iniciar. Verifique o espaço em disco disponível e as permissões e tente novamente. Erro: - + ERROR ERRO - + Request new recording button Botão para começar nova gravação - + New Recording Nova Gravação - + During a recording session, the button can be used to start a new recording. Durante uma sessão de gravação, este botão pode ser usado para começar uma nova gravação. - - + + E&xit &Sair - + Select Main Recording Directory Selecione Diretório Principal de Gravação - + Recording Gravando - + Not recording Não gravando - + Not initialised Não inicializado - + Not enabled Desativado - + &Window &Janela - + None Nenhum - + Not registered Não registrado - + Bad address Endereço incorreto - + Registration requested Registro solicitado - + Registration failed Falha no registro - + Check server version Verifique versão do servidor - + Registered Registrado - + Server list full at directory Lista de servidores cheia no diretório - + Your server version is too old A versão do seu servidor está muito desatualizada - + Requirements not fulfilled Requisitos não atendidos - + Unknown value %1 Valor desconhecido %1 @@ -3364,32 +3373,32 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CServerListManager - + Now a directory Agora um diretório - + No longer a directory Não é mais um diretório - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Não foi possível abrir '%1' para leitura/gravação. Verifique se %2 tem permissão (e se há espaço livre). - + Loading persistent server list file: %1 Carregando arquivo de lista de servidores persistentes: %1 - + Could not write to '%1' Não foi possível gravar em '%1' - + Saving registration for %1 (%2): %3 Salvando o registro para %1 (%2): %3 @@ -3397,68 +3406,68 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CSound - + The selected audio device is no longer present in the system. Please check your audio device. O dispositivo de áudio selecionado não está mais presente no sistema. Verifique seu dispositivo de áudio. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Não foi possível inicializar o driver de áudio. Confirme se seu equipamento de áudio está conectado e verifique suas configurações do driver. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. O dispositivo de áudio selecionado é incompatível uma vez que não suporta uma taxa de amostras de %1 Hz. Por favor, selecione outro dispositivo. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. A configuração do dispositivo de áudio atual é incompatível pois não foi possível definir a taxa de amostras em %2 Hz. Verifique se o equipamento possui alguma chave ou configuração de driver para definir manualmente a taxa de amostras e reiniciar o %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. O dispositivo de áudio selecionado é incompatível uma vez que não suporta %1 canais de entrada/saída. Por favor, selecione outro dispositivo ou configuração. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. O dispositivo de áudio selecionado é incompatível uma vez que o formato de áudio requerido não está disponível. Por favor, selecione outro dispositivo. - + No ASIO audio device driver found. Nenhum driver de dispositivo de áudio ASIO encontrado. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Instale um driver ASIO antes de executar %1. Se você possui um dispositivo com suporte ASIO, instale o driver oficial. Caso contrário, você precisará instalar um driver universal como o ASIO4ALL. - + Error requesting stream stop: $s Erro ao requisitar parada do stream: $s - + Error closing stream: $s Erro ao fechar o stream: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. Não foi possível iniciar o JACK automaticamente. Inicie o JACK manualmente e verifique se há mensagens de erro. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. O JACK não está sendo executado com uma taxa de amostras de <b>%1 Hz</b>. Utilize uma ferramenta como <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> para definir a taxa de amostras do JACK em %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. O registro da porta JACK falhou. Provavelmente isso é um erro com JACK. Pare %1 e JACK. Depois, verifique se outro programa com uma taxa de amostragem de %2 Hz pode conectar-se ao JACK. @@ -3467,62 +3476,62 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de O registro da porta JACK falhou. Provavelmente isso é um erro com JACK. Pare %1 e JACK. Depois, verifique se outro programa MIDI pode conectar-se ao JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Não é possível ativar o cliente JACK. Provavelmente isso é um erro com JACK. Verifique a saída JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK foi encerrado. %1 requer JACK para ser executado. Reinicie %1 para iniciar JACK novamente. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Nenhuma placa de som está disponível em seu sistema. A entrada do CoreAudio falhou na chamada AudioHardwareGetProperty. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Nenhuma placa de som está disponível em seu sistema. A saída do CoreAudio falhou na chamada AudioHardwareGetProperty. - + The currently selected audio device is no longer present. Please check your audio device. O dispositivo de áudio selecionado não está mais presente. Verifique seu dispositivo de áudio. - + The audio input device is no longer available. Please check if your input device is connected correctly. O dispositivo de entrada de áudio não está mais disponível. Verifique se seu dispositivo de entrada está corretamente conectado. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). A taxa de amostragem no dispositivo de entrada atual não é %1 Hz e, portanto, é incompatível. Selecione outro dispositivo ou tente definir manualmente a taxa de amostragem para %1 Hz via Configuração de Áudio e MIDI (em Aplicativos->Utilitários). - + The audio output device is no longer available. Please check if your output device is connected correctly. O dispositivo de saída de áudio não está mais disponível. Verifique se seu dispositivo de saída está corretamente conectado. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). A taxa de amostragem no dispositivo de saída atual não é %1 Hz e, portanto, é incompatível. Selecione outro dispositivo ou tente definir manualmente a taxa de amostragem para %1 Hz via Configuração de Áudio e MIDI (em Aplicativos->Utilitários). - + The stream format on the current input device isn't compatible with this software. Please select another device. O formato do fluxo no dispositivo de entrada atual não é compatível com este software. Selecione outro dispositivo. - + The stream format on the current output device isn't compatible with %1. Please select another device. O formato do fluxo no dispositivo de saída atual não é compatível com %1. Selecione outro dispositivo. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Os tamanhos de buffer do dispositivo de áudio de entrada e saída atual não podem ser definidos para um valor comum. Selecione diferentes dispositivos de entrada/saída nas suas configurações. @@ -3530,27 +3539,27 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Não é possível usar o dispositivo de áudio selecionado devido ao seguinte erro: %1. O driver anterior será selecionado. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. O dispositivo de áudio selecionado anteriormente não está mais disponível ou o driver mudou para um estado incompatível. Tentaremos encontrar um dispositivo de áudio válido, mas esse novo dispositivo pode causar microfonia. Antes de conectar-se a um servidor, verifique suas definições de dispositivo de áudio. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 não encontrou um dispositivo de áudio %2 utilizável </b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Você pode corrigir erros nas configurações do driver. Deseja abrir essas configurações agora? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Não é possível iniciar %1. Reinicie %1 e verifique/reconfigure suas definições de áudio. @@ -3558,53 +3567,57 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Versão %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Lançado sob a Licença Pública Geral GNU versão 2 (GPLv2) + Lançado sob a Licença Pública Geral GNU versão 2 (GPLv2) - + This app uses the following libraries, resources or code snippets: Esta aplicação utiliza as seguintes bibliotecas, recursos ou partes de código: - + Qt cross-platform application framework Estrutura de aplicações multiplataforma Qt - + (build) (versão) - + (runtime) (tempo de execução) - + Some pixmaps are from the %1 Alguns pixmaps são de %1 - + Some sound samples are from %1 Algumas amostras de áudio são de %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberação de áudio por Perry R. Cook e Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Ícones de bandeiras por Mark James @@ -3612,12 +3625,12 @@ Silenciamos seu canal e ativamos 'Silenciar-me'. Resolva o problema de global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Uma melhoria %1 está disponível: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>vá para detalhes e downloads</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Para mais informações, use "O que é isto" (menu Ajuda, botão direito do mouse ou Shift + F1) diff --git a/src/translation/translation_pt_PT.ts b/src/translation/translation_pt_PT.ts index 4d325429db..d872c458c7 100644 --- a/src/translation/translation_pt_PT.ts +++ b/src/translation/translation_pt_PT.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Estrutura de aplicações multiplataforma do Qt - + (build) (versão) - + (runtime) (tempo de execução) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberação de áudio por Perry R. Cook e Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Esta aplicação permite que os músicos realizem sessões ''jam'' em tempo real pela Internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Existe um servidor que reúne os dados de áudio de cada cliente, mistura os dados de áudio e envia a mistura de volta para cada cliente. - + This app uses the following libraries, resources or code snippets: Esta aplicação utiliza as seguintes bibliotecas, recursos ou partes de código: - + Flag icons by Mark James Ícones de bandeiras por Mark James - + Some pixmaps are from the %1 Alguns pixmaps são de %1 - + Some sound samples are from %1 Algumas amostras de áudio são de %1 - + For details on the contributions check out the %1 Para detalhes sobre as contribuições, consulte a %1 - + Github Contributors list Lista de colaboradores do Github - + Spanish Espanhol - + French Francês - + Portuguese Português (Portugal) - + Dutch Holandês - + Italian Italiano - + German Alemão - + Polish Polaco - + Swedish Sueco - + Korean Coreano - + Slovak Eslovaco - + Simplified Chinese Chinês Simplificado - + Norwegian Bokmål Norueguês Bokmål - + Japanese japonês - + About %1 Sobre %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Consola de Análise - + Error Rate of Each Buffer Size Taxa de Erros de Cada Tamanho de Buffer @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Mistura Pessoal no Servidor - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Quando ligado a um servidor, estes controles permitem que defina a sua mistura local sem afectar o que os outros ouvem. O título mostra o nome do servidor e, quando conhecido, se está gravando activamente. - + Server Servidor - + T R Y I N G T O C O N N E C T A T E N T A R L I G A R - + RECORDING ACTIVE GRAVAÇÃO ATIVA - + Personal Mix at: %1 Mistura Pessoal no Servidor: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level Nível do Canal - + Input level of the current audio channel at the server Nível de entrada do canal de áudio atual no servidor - + Mixer Fader Fader da Mistura - + Local mix level setting of the current audio channel at the server Definição do nível de mistura local do canal de áudio atual no servidor - + Status Indicator Indicador de Estado - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Mostra uma indicação de estado sobre o cliente que está atribuído a este canal. Os indicadores suportados são: - + Status indicator label Etiqueta do indicador de estado - + Panning Panorâmica - + Local panning position of the current audio channel at the server Posição de movimento panorâmico local do canal de áudio atual no servidor - + With the Mute checkbox, the audio channel can be muted. Com a caixa de seleção Silenciar, o canal de áudio pode ser silenciado. - + Mute button Botão Silenciar - + Solo button Botão Solo - + Fader Tag Identificador do Fader - + Grp Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Mostra o nível de áudio pré-fader deste canal. A todos os clientes ligados ao servidor será atribuído um nível de áudio, o mesmo valor para cada cliente. - + &No grouping &Sem grupo - + Assign to group Atribuir a grupo - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Ajusta o nível de áudio deste canal. A todos os clientes ligados ao servidor será atribuído um fader de áudio,exibido em cada cliente, para ajustar a mistura local. - + Speaker with cancellation stroke: Indicates that another client has muted you. Altifalante com sinal de proibição: Indica que outro cliente o silenciou. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Define o movimento panorâmico da 'Esquerda' para a 'Direita' do canal. Funciona apenas no modo estéreo ou, de preferência, no modo entrada mono/saída estéreo. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Com a caixa de seleção Solo, o canal de áudio pode ser definido como solo, o que significa que todos os outros canais, exceto o canal atual, serão silenciados. É possível definir mais que um canal no modo solo. - + Group Grupo - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Com a caixa de seleção Grp, um grupo de canais de áudio pode ser definido. Todos os faders de canal de um grupo são movidos em sincronização se algum dos faders do grupo for movido. - + Group button Botão de Grupo - + Mixer channel instrument picture Imagem do instrumento do canal da mistura - + Mixer channel label (fader tag) Etiqueta do canal da mistura (identificador do fader) - + PAN PAN - + MUTE SILENCIAR - + SOLO SOLO - + GRP GRP - + M M - + S S - + G G - + Alias/Name Nome/Pseudónimo - + Instrument Instrumento - + Location Localização - - - + + + Skill Level Nível de Habilidade - + Alias Pseudónimo - + Beginner Principiante - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. A etiqueta do fader identifica o cliente ligado. O nome da etiqueta, uma imagem do instrumento e a bandeira da sua localização podem ser definidos na janela principal. - + Mixer channel country/region flag Bandeira do país/região do canal da mistura - + Intermediate Intermediário - + Expert Avançado - + Musician Profile Perfil do músico - - - + + + Mute Silenciar - - - + + + Pan Pan - - - + + + Solo Solo @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Janela de Conversação - + The chat window shows a history of all chat messages. A janela de conversação mostra um histórico de todas as mensagens de conversação. - + Chat history Histórico de conversação - + Input Message Text Texto da Mensagem - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Introduza o texto da mensagem no campo de introdução e pressione Enter para enviar a mensagem ao servidor, que distribui a mensagem a todos os clientes ligados. A sua mensagem será exibida na janela de mensagens. - + New chat text edit box Nova caixa de edição do texto de conversação - + Type a message here Digite aqui uma mensagem - + &Edit &Editar - + Cl&ear Chat History &Limpar Histórico de Conversação - - + + &Close &Fechar - + Do you want to open the link '%1' in your browser? Deseja abrir a hiperligação '%1' no seu navegador? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter Medidor do Nível de Entrada - + Make sure not to clip the input signal to avoid distortions of the audio signal. Certifique-se de não clipar o sinal de entrada para evitar distorções no sinal de áudio. - + Input level meter Medidor do nível de entrada - + Simulates an analog LED level meter. Simula um medidor de nível analógico LED. - + Connect/Disconnect Button Botão de Ligar/Desligar - + Connect and disconnect toggle button Botão de alternação entre ligar e desligar - + This shows the level of the two stereo channels for your audio input. Isto mostra o nível dos dois canais estéreo para a sua entrada de áudio. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Se a aplicação estiver ligada a um servidor e tocar o seu instrumento/cantar no microfone, os LEDs do medidor do nível de entrada devem piscar. Se tal não acontecer, provavelmente selecionou o canal de entrada errado (por exemplo, entrada de linha em vez da entrada do microfone) ou ajustou o ganho da entrada muito baixo no misturador de áudio (Windows) ou na placa de som. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Para um uso adequado da aplicação, não deve ouvir a sua voz/instrumento diretamente nas colunas ou nos headphones enquanto a aplicação não estiver ligada a um servidor. Isso pode ser feito silenciando (mute) o canal da entrada de áudio no dispositivo de reprodução (não no dispositivo de captura!). - + Reverb effect Efeito de Reverberação - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. O efeito de reverberação pode ser aplicado a um canal local de áudio mono ou a ambos os canais no modo estéreo. A seleção do canal mono e o nível de reverberação podem ser modificados. Por exemplo, se o sinal do microfone for alimentado no canal de áudio direito da placa de som, e for necessário aplicar um efeito de reverberação, ajuste o seletor de canal para a direita e mova o fader para cima até que o nível de reverberação desejado seja atingido. - + Reverb effect level setting Ajuste do nível do efeito de reverberação - + Reverb Channel Selection Seleção do Canal de Reverberação - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Com estes botões de seleção, pode ser escolhido o canal de entrada de áudio no qual o efeito de reverberação é aplicado. Pode ser selecionado o canal de entrada esquerdo ou direito. - + Left channel selection for reverb Seleção do canal esquerdo para reverberação - + Right channel selection for reverb Seleção do canal direito para reverberação - + Green Verde - + The delay is perfect for a jam session. A latência é perfeita para uma jam session. - + Yellow Amarelo - + Red Vermelho - + If this LED indicator turns red, you will not have much fun using %1. Se este indicador LED ficar vermelho, não se vai divertir muito ao usar o %1. - + Delay status LED indicator Indicador LED do estado de latência - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Abre uma caixa de diálogo onde pode seleccionar a que servidor se ligar. Se estiver ligado, pressionar este botão vai terminar a sessão. - + Shows the current audio delay status: Mostra o estado actual da latência de áudio: - + A session is still possible but it may be harder to play. Ainda é possível fazer uma sessão, mas poderá ser mais difícil tocar a tempo. - + The delay is too large for jamming. A latência é demasiada para tocar a tempo. - + The sound card's buffer delay (buffer size) is too small (see Settings window). O buffer (tamanho do buffer) da placa de som é demasiado pequeno (verificar janela das Definições). - + The upload or download stream rate is too high for your internet bandwidth. A taxa de envio ou de transferência é muito alta para a sua largura de banda da Internet. - - + + C&onnect &Ligar - + &File &Ficheiro - + &View &Ver - + &Connection Setup... &Ligar a Servidor... - + My &Profile... Meu &Perfil... - + C&hat... &Mensagens... - + &Analyzer Console... Consola de &Análise... - + Clear &All Stored Solo and Mute Settings Limpar &Todas as Configurações de Solo e Mudo - + %1 Directory Diretório %1 - + Ok Ok - + E&xit &Sair - + &Edit &Editar - + Delay Status LED LED do Estado da Latência - + The network jitter buffer is not large enough for the current network/audio interface jitter. O jitter buffer da rede não é grande o suficiente para o jitter atual da interface de rede/áudio. - + The CPU of the client or server is at 100%. O CPU do cliente ou servidor está a 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. O tempo do ''ping'' é o tempo necessário para a transmissão de áudio circular do cliente para o servidor e vice-versa. Esta latência é introduzida pela rede e deveria ser cerca de 20-30 ms. Se esta latência for maior do que 50 ms, a distância até ao servidor é muito grande ou a sua ligação à Internet não é suficiente. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. A latência geral é calculada a partir do «Tempo do Ping» atual e do atraso introduzido pelas definições do buffer. - + &Load Mixer Channels Setup... &Carregar Configuração dos Canais do Misturador... - + &Save Mixer Channels Setup... &Guardar Configuração dos Canais do Misturador... - + O&wn Fader First P&róprio Fader Primeiro - + Sort Users by Chann&el Ord&enar Utilizadores por Canal - + Sett&ings Def&inições - + Audio/Network &Settings... Definiçõe&s de Áudio/Rede... - + A&dvanced Settings... &Definições Avançadas... - + N&o User Sorting Nã&o Ordenar Utilizador - + If this LED indicator turns red, the audio stream is interrupted. Se este indicador LED ficar vermelho, a transmissão de áudio é interrompida. - + Current Connection Status Estado da Ligação Atual - + Sort Users by &Name Ordenar Utilizadores por &Nome - + Sort Users by &Instrument Ordenar Utilizadores por &Instrumento - + Sort Users by &Group Ordenar Utilizadores por &Grupo - + Sort Users by &City Ordenar Utilizadores por &Cidade - + Set All Faders to New Client &Level Definir Todos os Canais para Níve&l de Novo Cliente - + Local Jitter Buffer Status LED LED do Estado do Buffer Jitter Local - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: O LED do estado do buffer jitter local mostra o estado atual do áudio/transmissão. Se a luz estiver vermelha, a transmissão de áudio é interrompida. Isto é causado por um dos seguintes problemas: - + Local Jitter Buffer status LED indicator Indicador do LED do estado Jitter Buffer Local - + Auto-Adjust all &Faders Ajustar automaticamente todos os &Faders - + &MIDI Control Settings... Definições de Controlo &MIDI... - - + + Select Channel Setup File Selecione o ficheiro de configuração da mistura - + user utilizador - + users utilizadores - + Connect Ligar - + Settings Definições - + Chat Conversação - + Enable feedback detection Ativar deteção de feedback - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, resolva primeiro o problema de feedback e depois remova o silêncio você mesmo. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. A sua placa de som não está a funcionar correctamente. Abra a janela das definições e verifique a selecção do dispositivo e as configurações do driver. - + &Disconnect &Desligar @@ -1017,1098 +1017,1107 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CClientSettingsDlg - + Jitter Buffer Size Tamanho do Jitter Buffer - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. A definição do buffer de jitter é, portanto, uma troca entre a qualidade do áudio e o atraso geral. - + Local jitter buffer slider control Controle deslizante do jitter buffer local - + Server jitter buffer slider control Controle deslizante do jitter buffer do servidor - + Auto jitter buffer check box Interruptor do jitter buffer automático - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Se o driver for selecionado durante uma ligação ativa, a ligação será interrompida, o driver será alterado e a ligação reiniciada automaticamente. - + Sound card device selector combo box Seletor de dispositivo da placa de som - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Caso o driver ASIO4ALL seja usado, note que esse driver geralmente introduz aprox. 10-30 ms de atraso de áudio adicional. Dado isto, é recomendável usar uma placa de som com um driver ASIO nativo. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Se estiver a usar o driver kX ASIO, certifique-se de ligar as entradas ASIO no painel de configurações do kX DSP. - + Sound Card Channel Mapping Mapeamento de Canais da Placa de Som - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Caso o dispositivo selecionado da placa de som ofereça mais que um canal de entrada ou saída, as configurações de Mapeamento de canais de entrada e de saída estarão visíveis. - + Left input channel selection combo box Seletor de canal de entrada esquerdo - + Right input channel selection combo box Seletor de canal de entrada direito - + Left output channel selection combo box Seletor de canal de saída esquerdo - + Right output channel selection combo box Seletor de canal de saída direito - + Small Network Buffers Buffers de Rede Pequenos - + Small network buffers check box Caixa de ativação de buffers de rede pequenos - + Sound Card Buffer Delay Atraso do Buffer da Placa de Som - + Sound card driver settings Definições do driver da placa de som - + ASIO Device Settings push button Botão das Definições do Dispositivo ASIO - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Selecione o estilo a ser usado para os medidores de nível. As opções Barra (estreita) e LEDs (redondo, pequeno) aplicam-se apenas à mesa do mixer. Quando a Barra (estreita) é selecionada, os medidores de entrada são definidos como Barra (larga). Quando LEDs (redondo, pequeno) é selecionado, os medidores de entrada são definidos como LEDs (redondo, grande). As opções restantes aplicam-se à secção da mistura e aos medidores de entrada. - + Language Idioma - + Select the language to be used for the user interface. Selecione o idioma para ser utilizado na interface do utilizador. - + Language combo box Seletor de idioma - + and e - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Se você precisa adicionar mais diretórios ao menu suspenso de Diretórios na janela Conectar, insira os endereços aqui.<br> - + Audio Upstream Rate Taxa de Transmissão de Áudio - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Depende do tamanho do pacote de áudio e da configuração da compactação de áudio. Verifique se a taxa de transmissão não é maior que a sua taxa de upload disponível (verifique isto com um serviço como o speedtest.net). - - - - + + + + None Nenhum - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Escreva o seu nome ou um pseudónimo aqui para que os outros músicos com quem quer tocar saibam quem você é. Além disso, pode também definir uma imagem do instrumento que toca e uma bandeira do país ou região onde vive. A cidade onde vive e o nível de habilidade com o seu instrumento também podem ser adicionados. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. O que definir aqui aparecerá por baixo do seu fader na secção de mistura quando estiver ligado a um servidor %1. Esta etiqueta também será exibida em cada cliente que estiver ligado ao mesmo servidor. - + Country/region flag button Botão da bandeira do país/região - - + + Could not open MIDI port Não foi possível abrir a porta MIDI - + No MIDI devices found. Please connect a MIDI device and try again. Nenhum dispositivo MIDI encontrado. Por favor conecte um dispositivo MIDI e tente novamente. - + Please check your OS configuration. Por favor verifique a sua configuração OS. - + Center Centro - + R R - + The buffer setting is therefore a trade-off between audio quality and overall delay. A configuração do buffer é, portanto, uma troca entre qualidade de áudio e latência geral. - + 64 samples setting radio button Botão de configuração de 64 amostras - + 128 samples setting radio button Botão de configuração de 128 amostras - + 256 samples setting radio button Botão de configuração de 256 amostras - + Audio Channels Canais de Áudio - + Audio channels combo box Seletor de canais áudio - + Audio Quality Qualidade de Áudio - + Audio quality combo box Seletor de qualidade áudio - + New Client Level Nível de Novo Cliente - + New client level edit box Caixa de edição no nível de novo cliente - - + + Mono Mono - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. vai aumentar a quantidade de dados da transmissão. Verifique se a taxa de upload não ultrapassa a velocidade de upload disponível da sua ligação à Internet. - + Mono-in/Stereo-out Entrada Mono/Saída Estéreo - - - + + + Stereo Estéreo - - - + + + &Close &Fechar - + Local Audio Input Fader Fader da Entrada Local de Áudio - - + + L L - + Local audio input fader (left/right) Fader de entrada local de áudio (esquerdo/direito) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). O jitter buffer (ou buffer de instabilidade) compensa os desvios de temporização da rede e da placa de som. O tamanho do buffer influencia, portanto, a qualidade do fluxo de áudio (quantas interrupções ocorrem) e a latência geral (quanto maior o buffer, maior a latência). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Pode escolher o tamanho do jitter buffer manualmente para o cliente local e o servidor remoto. Para o jitter buffer local, as interrupções no fluxo de áudio são indicadas pela luz na parte inferior dos faders do jitter buffer. Se a luz ficar vermelha, ocorreu um excesso/déficit do buffer e o fluxo de áudio é interrompido. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Caso a configuração automática estiver activada, os buffers de rede do cliente local e do servidor remoto são configurados automaticamente com um valor conservador para minimizar a probabilidade de perda de áudio. Se o modo automático estiver ligado, os controlos estarão desactivados (não podem ser alterados pelo utilizador). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Caso a configuração automática do jitter buffer estiver ativada, os buffers de rede do cliente local e do servidor remoto são configurados com um valor conservador para minimizar a probabilidade de perda de áudio. Para ajustar o atraso/latência do áudio, é recomendável desativar a funcionalidade de configuração automática e diminuir o tamanho do jitter buffer manualmente usando os controles deslizantes até que a quantidade de perdas de áudio lhe sejam pessoalmente aceitáveis. O indicador LED representará as interrupções de áudio do jitter buffer local através de uma luz vermelha. - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Para cada canal de entrada/saída do %1 (canal esquerdo e direito), um canal real da placa de som pode ser selecionado. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Habilita suporte para pacotes de áudio de rede muito pequenos. Esses pacotes de rede só são realmente usados se o buffer de atraso da placa de som for menor que %1 amostras. Quanto menores os buffers de rede, menor a latência do áudio. Mas, ao mesmo tempo, a carga da rede e a probabilidade de falhas de áudio ou artefatos de som aumentam. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. A definição do atraso do 'buffer'' é uma definição fundamental do %1. Esta definição tem influência em muitas propriedades da ligação. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Isto abre as configurações do driver da sua placa de som. Alguns drivers permitem que altere as configurações do buffer, outros como o ASIO4ALL permitem que escolha a entrada ou saída do(s) seu(s) dispositivo(s). Mais informações podem ser encontradas em jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Abre as configurações do drive. Nota: %1 somente suporta dispositivos com uma taxa de amostragem de %2 Hz. Você não poderá selecionar um driver/dispositivo que não suporte. Para obter mais ajuda, consulte jamulus.io. - + 128 samples: Should work for most available sound cards. 128 amostras: Deve funcionar na maioria das placas de som disponíveis. - + Skin Tema - + Select the skin to be used for the main window. Selecione o tema a ser usado na janela principal. - + Skin combo box Caixa de selecção do tema - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Selecione o número de canais de áudio a serem usados para a comunicação entre cliente e servidor. Existem três modos disponíveis: - + These modes use one and two audio channels respectively. Estes modos usam um e dois canais de áudio, respectivamente. - + Mono in/Stereo-out Entrada Mono/Saída Estéreo - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. O sinal de áudio enviado ao servidor é mono, mas o sinal de retorno é estéreo. Isso é útil quando a placa de som coloca o instrumento e o microfone em canais diferentes. Nesse caso, os dois sinais de entrada podem ser misturados num canal mono, mas a mistura do servidor pode ser ouvida em estéreo. - + Enabling Activar o modo - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. No modo de transmissão estéreo, nenhuma seleção de canal de áudio para o efeito de reverberação estará disponível na janela principal, pois o efeito é aplicado em ambos os canais. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Quanto maior a qualidade de áudio, maior a quantidade de dados da transmissão. Verifique se a taxa de upload não ultrapassa a velocidade de upload disponível da sua ligação à Internet. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Esta opção define o nível do fader de um cliente novo, em percentagem. Se um cliente novo se liga ao mesmo servidor, este irá ter o nível do fader específicado, excepto se já definiu o nível do fader desse cliente previamente. - + Input Boost Ampliação de Sinal de Entrada - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Esta definição permite aumentar o nível de sinal de entrada até um factor de 10 (+20dB). Se o seu som está muito baixo, tente primeiro aumentar o nível posicionando-se mais perto do microfone, ajustando o seu equipamento de áudio ou aumentando o volume nas definições do seu sistema operativo. Apenas se tudo isto falhar deverá tentar esta opção. Se o seu som estiver demasiado alto, distorcido ou a clipar, esta opção não irá ajudar. A distorção irá permanecer. Em vez disso, diminua o volume do sinal de entrada afastando-se do microfone, ajustando o seu equipamento de som ou baixando o volume nas definições do seu sistema operativo. - + Input Boost combo box Caixa de selecção da Ampliação de Sinal de Entrada - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Controla os níveis relativos dos canais esquerdo e direito. Para um sinal mono, actua como uma panorâmica entre os dois canais. Por exemplo, se um microfone estiver ligado no canal direito e um instrumento estiver ligado no canal esquerdo, mais alto que o microfone, mova o fader de áudio numa direção em que a etiqueta acima do fader mostre %1, onde %2 é o indicador de atenuação. - + Audio Device Dispositivo de Áudio - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. No sistema operacional Windows o driver ASIO (placa de som) pode ser selecionado usando %1. Se o driver ASIO selecionado não for válido, uma mensagem de erro será exibida e o driver válido anterior será selecionado. No macOS o hardware de entrada e saída pode ser selecionado. - + Three buffer sizes can be selected Três tamanhos de buffer podem ser selecionados - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 amostras: Fornece menor latência, mas não funciona com todas as placas de som. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 amostras: Deve apenas ser usada quando 64 ou 128 amostras estiver causando problemas. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Alguns drivers de placa de som não permitem que o atraso do buffer seja alterado de dentro do %1. Nesse caso, a configuração de atraso do buffer está desabilitada e deve ser alterada usando o driver da placa de som. Use a ferramenta apropriada para a interface em uso para ajustar o tamanho do buffer. Por exemplo, se estiver usando ASIO, use o botão "Definições de Dispositivo ASIO" para abrir o painel de configurações do driver ou se estiver usando JACK, use uma ferramenta como QjackCtl para ajustar o tamanho do buffer. Outras interfaces, como o Pipewire, exigem o uso de sua ferramenta apropriada. Consulte o manual da interface. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Se nenhum tamanho do buffer estiver selecionado e todas as configurações estiverem desativadas, significa que um tamanho do buffer em uso pelo driver não combina os valores. %1 ainda funcionará com essa configuração, mas com desempenho restrito. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. O atraso do buffer influencia a ligação, a taxa de upload atual e a latência geral. Quanto menor o tamanho do buffer, maior a probabilidade de a luz vermelha no indicador de estado (interrupções), maior a taxa de upload e menor a latência geral. - + Meter Style Estilo do Medidor - + Meter Style combo box Seletor do Estilo do Medidor - + Custom Directories Diretórios Personalizados - + Custom Directories combo box Caixa de seleção do Diretório Personalizado - + Delete custom directory button Botão para apagar diretórios personalizados - + Delete Custom Directory Apagar Diretório Personalizado - + Click the button to delete the currently selected custom directory. Clique no botão para excluir o diretório personalizado selecionado. - + Number of Mixer Panel Rows Número de Linhas do Painel de Mistura - + Adjust the number of rows used to arrange the mixer panel. Ajusta o número de linhas utilizadas para organizar o painel de mistura. - + Number of Mixer Panel Rows spin box Caixa de Selecção do Número de Linhas do Painel de Mistura - + Feedback Protection Proteção de feedback - + Prevents acoustic feedback between microphone and speakers. Evita o feedback acústico entre o microfone e os altifalantes. - + Feedback Protection check box Caixa de Activação da Protecção Contra Feedback - + Audio Alerts Alertas de Áudio - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Ative o alerta de áudio quando receber uma mensagem de conversação e quando um novo cliente se juntar à sessão. Pode ser necessário um segundo dispositivo de som para ouvir os alertas. - + Audio Alerts check box Caixa de seleção de Alertas de Áudio - + Enable/disable MIDI-in port Ativar/desativar porta de entrada MIDI - + MIDI-in port check box Caixa de verificação da porta de entrada MIDI - + Pick-up Mode Modo de Recolha - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Ao ser ativado, fader de MIDI e controlos de panorâmica vão esperar até que a posição do controlador físico corresponda ao valor atual do software antes de responder. Isto evita saltos súbitos quando o seu controlador físico está dessincronizado com o software. - + Pick-up Mode check box Caixa de verificação do Modo de Recolha - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Selecione a porta de saída MIDI à qual se quer ligar. O Jamulus irá conectar automaticamente a sua porta de entrada MIDI ao dispositivo selecionado quando ativo. Também pode usar o seu gestor de conexões à sua escolha para mudar conexões manualmente. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Seleciona qual fonte MIDI a conectar. Jamulus irá automaticamente conectar a sua porta de entrada MIDI ao dispositivo selecionado quando ativo. Também pode usar A Configuração de Áudio MIDI para mudar conexões manualmente . - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Seleciona quais dispositivo(s) de entrada MIDI o Jamulus deve ouvir. Selecione 'Todos os Dispositivos' para receber MIDI de todos os dispositivos conectados, ou escolha um dispositivo específico. - + MIDI input device combo box Caixa de combinação de dispositivo de entrada MIDI - + MIDI controller settings Definições de controlador MIDI - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Há um parâmetro de canal MIDI global (0-16) e dois parâmetros que pode definir para cada item controlado: Primeiro MIDI CC e números consecutivos CC (contagem). Primeiro defina qual o canal que quer que o Jamulus escute (0 para todos os canais). Depois, para cada item que quer controlar (fader de volume, pan, solo, silenciar), defina o primeiro MIDI CC (CC é qual o número onde começar) e o número de número consecutivos CC (contagem). Há uma exceção que não requer estabelecer números consecutivos CC que é o parâmetro “Silenciar-me a Mim Mesmo” - apenas requer um único número CC uma vez que é aplicado apenas à stream de áudio do mesmo. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Pode ou digitar os valores MIDI CC ou usar o botão "Aprender": clique em "Aprender", acione o fader/knob/botão no controlador MIDI, e o número CC de MIDI será detetado e guardado. - + MIDI channel combo box Caixa de combinação de canal MIDI - + Mute Myself MIDI CC number spin box Caixa de seleção do número MIDI CC de Silenciar-me - + Fader offset spin box Caixa giratória de desvio do fader - + Pan offset spin box Caixa giratória de panorâmica de áudio - + Solo offset spin box Caixa giratória de solo offset - + Mute offset spin box Caixa giratória de mute offset - + Mute Myself MIDI learn button Botão de aprendizagem de MIDI de Silenciar o Próprio - + Fader offset MIDI learn button Botão de aprendizagem de MIDI de fader offset - + Pan offset MIDI learn button Botão de aprendizagem de MIDI de panorâmica de áudio - + Solo offset MIDI learn button Botão de aprendizagem de MIDI de solo offset - + Mute offset MIDI learn button Botão de aprendizagem de MIDI de mute offset - + ASIO Device Settings Definições do Dispositivo ASIO - + Low Baixa - - + + Normal Normal - + High Alta - + + Max + + + + Fancy Sofisticado - + Compact Compacto - + Bar (narrow) Barra (estreita) - + Bar (wide) Barra (larga) - + LEDs (stripe) LEDs (faixa) - + LEDs (round, small) LEDs (redondo, pequeno) - + LEDs (round, big) LEDs (redondo, grande) - + Learn Aprender - - + + All Devices Todos os Dispositivos - + No device connected Nenhum dispositivo conectado - - + + MIDI Device Not Found Dispositivo MIDI Não Encontrado - + The MIDI device "%1" could not be found. Using all available devices instead. O dispositivo MIDI "%1" não pode ser encontrado. Em vez disso, a usar todos os dispositivos. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. O dispositivo MIDI "%1" atualmente não está disponível. Selecione um dispositivo diferente do menu suspenso para conectar. - - + + MIDI Device Connection Failed Conexão de Dispositivo MIDI Falhou - + Could not connect to MIDI device "%1". Please check your OS configuration. Não foi possível ligar ao dispositivo MIDI "%1". Por favor verifique a sua configuração de OS. - + Could not connect to MIDI device "%1". Please check that the device is available. Não foi possível conectar ao dispositivo MIDI "%1". Por favor verifique que o dispositivo está disponível. - + Listening... A Ouvir... - + Custom Personalizado - + Any Genre 2 Qualquer Estilo 2 - Any Genre 3 - Qualquer Estilo 3 + Qualquer Estilo 3 + + + + Any Genre Asia + - + Genre Rock Estilo Rock - + Genre Jazz Estilo Jazz - + Genre Classical/Folk Estilo Clássico/Folk - + Genre Choral/Barbershop Estilo Coral/Barbershop - + Any Genre 1 Qualquer Estilo 1 - + Musician Profile Perfil do músico - + Alias or name edit box Caixa de edição do nome ou pseudônimo - + Instrument picture button Botão da imagem do instrumento - + City edit box Caixa de edição da cidade - + Skill level combo box Caixa do nível de habilidade - + Beginner Principiante - + Intermediate Intermediário - + Expert Avançado - - + + Size: Tamanho: - + Buffer Delay Atraso do buffer - + Buffer Delay: Atraso do buffer: - + Drum Set Bateria - + Djembe Djembe - + Electric Guitar Guitarra Elétrica - + Acoustic Guitar Guitarra Acústica - + Bass Guitar Baixo - + Keyboard Teclado - + Synthesizer Sintetizador - + Grand Piano Piano de Cauda - + Accordion Acordeão - + Vocal Voz - + Microphone Microfone - + Harmonica Harmónica - + Trumpet Trompete - + Trombone Trombone - + French Horn Trompa Francesa - + Tuba Tuba - + Saxophone Saxofone - + Clarinet Clarinete - + Flute Flauta - + Violin Violino - + Cello Violoncelo - + Double Bass Contrabaixo - + Recorder Gravador - + Streamer Streamer - + Listener Ouvinte - + Guitar+Vocal Guitarra+Voz - + Keyboard+Vocal Teclado+Voz - + Bodhran Bodhrán - + Bassoon Fagote - + Oboe Oboé - + Harp Harpa - + Viola Viola de Arco - + Congas Congas - + Bongo Bongo - + Vocal Bass Voz Baixo - + Vocal Tenor Voz Tenor - + Vocal Alto Voz Alto - + Vocal Soprano Voz Soprano - + Banjo Banjo - + Mandolin Bandolim - + Ukulele Ukulele - + Bass Ukulele Ukulele Baixo - + Vocal Baritone Voz Barítono - + Vocal Lead Voz Principal - + Mountain Dulcimer Saltério dos Apalaches - + Scratching Scratching - + Rapping Rapping - + Vibraphone Vibrafone - + Conductor Maestro @@ -2508,117 +2517,117 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CConnectDlg - + Server List Lista de servidores - + Directory Diretório - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Exibe os servidores listados por diretório selecionado. Você pode adicionar diretórios personalizados em Configurações Avançadas. - + Directory combo box Seletor de Diretório - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtra a lista de servidores pelo texto fornecido. Observe que o filtro não diferencia maiúsculas de minúsculas. Um único caractere # filtrará os servidores com pelo menos uma pessoa ligada. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Desmarque para recolher a lista de servidores e mostrar apenas os detalhes. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. A janela de Configuração de Conexão lista os servidores disponíveis registados no diretório selecionado. Use o menu lista para alterar o diretório, localize o servidor que deseja ingressar na lista de servidores, clique nele e, em seguida clique no botão Conectar para conectar-se. Como alternativa, clique duas vezes no nome do servidor para conectar-se. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Servidores permanentes (aqueles que estão listados por mais de 48 horas) são mostrados em negrito. - + You can add custom directories in Advanced Settings. Você pode adicionar diretórios personalizados em Configurações Avançadas. - + Server list view Vista da lista de servidores - + Server Address Endereço do servidor - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Se você souber o endereço do servidor, poderá ligar-se a ele usando o campo Nome/Endereço do servidor. Um número de porta opcional pode ser adicionado após o endereço do servidor usando dois pontos como separador, por exemplo %1. O campo também mostrará uma lista dos endereços de servidor usados mais recentemente. - + Holds the current server address. It also stores old addresses in the combo box list. Contém o endereço do servidor atual. Também armazena endereços antigos na lista do seletor. - + Delete server address button Botão para apagar endereço de servidor - + Delete Server Address Apagar Endereço de Servidor - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Clique no botão para limpar o endereço do servidor atualmente selecionado e eliminá-lo da lista dos servidores guardados. - + Ping Ping - + Server address edit box Caixa de edição do endereço do servidor - + Filter Filtro - + Filter edit box Caixa de edição do filtro - + Show All Musicians Mostrar Todos os Músicos - + Show all musicians check box Caixa de seleção para mostrar músicos - + Filter text, or # for occupied servers Filtrar texto, ou # para servidores ocupados @@ -2689,43 +2698,43 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CHelpMenu - + &Help &Ajuda - - + + Getting &Started... Como Começa&r... - + Software &Manual... &Manual do Programa... - + What's &This O que é &isto - + P&rivacy policy... Política de P&rivacidade... - + &About Jamulus... &Sobre o Jamulus... - + About &Qt... Sobre o &Qt... - + About Qt Sobre o Qt @@ -2733,12 +2742,12 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CLanguageComboBox - + Restart Required Reinicio necessário - + Please restart the application for the language change to take effect. Por favor reinicie a aplicação para a alteração de linguagem ter efeito. @@ -2746,22 +2755,22 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Este servidor requer que aceite as condições antes de poder entrar. Por favor leia as condições na janela de mensagens. - + I have read the conditions and &agree. Li &as condições e concordo. - + Accept Aceitar - + Decline Rejeitar @@ -2769,17 +2778,17 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CMultiColorLED - + Red Vermelho - + Yellow Amarelo - + Green Verde @@ -2787,7 +2796,7 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CMusProfDlg - + No Name Sem Nome @@ -2795,448 +2804,448 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CServerDlg - + Client List Lista de Clientes - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. A lista de clientes mostra todos os clientes que estão atualmente ligados a este servidor. Algumas informações sobre os clientes, como o endereço IP e o nome, são fornecidas para cada cliente ligado. - + Connected clients list view Lista de clientes ligados - + Directory Type combo box Seletor de Tipo de Diretório - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Quando um valor direfente de "%1" for escolhido para Diretório, isso mostrará se o registo foi bem sucedido. Se o registo falhou, escolha um diretório diferente. - + When checked, the recorder will run while a session is in progress (if set up correctly). Quando selecionado, o gravador funcionará enquanto estiver a decorrer uma sessão (se estiver corretamente configurado). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Nenhum diretório de gravação foi definido ou o valor não pode ser usado. Verifique o valor na guia Opções. - + Recording has been switched off by the UI checkbox or JSON-RPC. A gravação foi desativada pela caixa de verificação da interface do utilizador ou pelo JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. A gravação foi desativada, através da caixa de verificação da interface do utilizador, SIGUSR2 ou JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Se o diretório de gravação não for utilizável, o problema será exibido no lugar do diretório de sessão. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Clique no botão para abrir o diálogo que permite selecionar o diretório de gravação principal. O diretório escolhido deve existir e ser gravável (permitir a criação de subdiretórios pelo utilizador com o qual %1 está sendo corrido). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. O valor atual do diretório principal de gravação. O valor escolhido deve existir e ser gravável (permite criação de subdiretórios pelo uutilizador com o qual %1 está sendo corrido.). Clique no botão para abrir o diálogo que permite selecionar o diretório principal de gravação. - + Custom Directory address End. de Diretório Personalizado - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. O endereço do Diretório Personalizado é o endereço do diretório que contém a lista de servidores ao qual esse servidor deve ser adicionado. - + Server List Filename dialog push button Botão de diálogo do arquivo da Lista de Servidores - - + + Server List Filename Arquivo da Lista de Servidores - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Clique no botão para abrir o diálogo que permite definir o nome do arquivo de persistência da lista de servidores. O utilizador com o qual %1 está sendo corrido necessita ser capaz de criar o nome do arquivo especificado, embora ele já exista (será substituído ao salvar). - + Server List Filename text box (read-only) Caixa de texto com o arquivo da Lista de Servidores (apenas leitura) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. O valor atual do nome do arquivo de persistência da lista de servidores. O utilizador com o qual %1 está sendo corrido precisa ser capaz de criar o nome do arquivo especificado, embora ele já exista (será substituído ao salvar). Clique no botão para abrir o diálogo que permite definir o nome do arquivo de persistência da lista de servidores. - + Clear the server list file name button Botão para limpar arquivo da lista de servidores - + Clear Server List Filename Limpar Arquivo da Lista de Servidores - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Carregue no botão para limpar o nome do arquivo de persistência da lista de servidores atualmente selecionado. Isso impedirá a persistência da lista de servidores até que um novo valor seja selecionado. - + Start Minimized on Operating System Start Iniciar Minimizado com o Sistema Operativo - + Now a directory Agora um diretório - + Register Server Status Estado de Registo do Servidor - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Se a caixa de seleção Iniciar Minimizado com o Sistema Operativo estiver marcada, o servidor será iniciado quando o sistema operativo for iniciado, e minimizado automaticamente para um ícone da barra de tarefas do sistema. - + Server Name Nome do Servidor - + The server name identifies your server in the connect dialog server list at the clients. O nome do servidor identifica o servidor na lista do diálogo de ligação exibido nos clientes. - + Server name line edit Caixa de edição do nome do servidor - + Location City ;Localização: Cidade - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. A cidade onde este servidor está localizado pode ser definida aqui. Se um nome de cidade for inserido, este será mostrado na lista do diálogo de ligação dos clientes. - + City where the server is located line edit Caixa de edição da cidade onde o servidor se encontra - + Country/Region País/Região - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Defina o país ou a região onde o servidor está a ser executado. Os clientes irão exibir esta localização na janela da ligação da lista de servidores. - + Combo box for location of this server Caixa de seleção para localização deste servidor - + Display dialog to select recording directory button Mostrar diálogo para selecionar botão do directorio de gravação - - + + Main Recording Directory Diretório Principal das Gravações - + Main recording directory text box (read-only) Caixa de texto do diretório principal das gravações (só de leitura) - + Clear the recording directory button Botão para limpar diretório de gravações - + Clear Recording Directory Limpar diretório de gravações - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Carregue no botão para limpar o valor do diretório selecionado actualmente. Isto irá prevenir gravações até que um novo valor seja selecionado. - + Checkbox to turn on or off server recording Caixa de seleção para ligar ou desligar a gravação no servidor - + Jam Recorder Gravador de Jam - + Current session directory text box (read-only) Caixa de texto do diretório da gravação atual (apenas leitura) - + Current Session Directory Diretório de Sessão Atual - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Ativado durante a gravação e exibe a diretoria da gravação atual. Desativado depois da gravação ou quando o gravador não estiver ativado. - + Recorder status label Etiqueta do estado do gravador - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Pasta:</b> Selecione '%1' para não registar o seu servidor com uma pasta.<br>Ou selecione um dos géneros para registar com essa pasta.<br>Ou selecione '%2' e especifique um endereço da "Pasta Personalizada" no separador das 'Opções' para registar numa pasta personalizada.<br><br>Para qualquer valor, exceto "%1", este servidor regista numa pasta para que um utilizador %3 possa selecionar este servidor na lista de servidores na janela da ligação do cliente quando escolher essa pasta.<br><br>O registo do servidor é renovado periodicamente para garantir que todos os servidores na lista de servidores da janela de ligação estão realmente disponíveis. - + Recorder Status Estado do Gravador - + Displays the current status of the recorder. The following values are possible: Mostra o estado atual do gravador. Os valores possíveis são: - + There is no one connected to the server to record. Não está ninguém ligado ao servidor para gravar. - + The performers are being recorded to the specified session directory. Os artistas estão a ser gravados para o diretório de sessão especificado. - + NOTE NOTA - + Server welcome message edit box Caixa de edição da mensagem de Boas-Vindas do Servidor - + Server Welcome Message Mensagem de Boas-Vindas do Servidor - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Uma mensagem de boas-vindas do servidor é exibida na janela de mensagens quando um utilizador entra no servidor. Se não for definida nenhuma mensagem, esta mensagem estará desativada. - + Language Idioma - + Select the language to be used for the user interface. Selecione o idioma a ser utilizado na interface do utilizador. - + Language combo box Caixa de seleção de idioma - + Custom Directory line edit Caixa de edição do Diretório Personalizado - + &Hide %1 server &Ocultar servidor %1 - + &Show %1 server Mostrar &servidor %1 - + %1 server %1 is the name of the main application Servidor %1 - + Type a message here. If no message is set, the server welcome is disabled. Insira uma mensagem aqui. Se não houver nenhuma mensagem definida, a mensagem do servidor ficará desativada. - + %1 Server %1 is the name of the main application Servidor %1 - + Recorder failed to start. Please check available disk space and permissions and try again. Error: O gravador falhou a inicialização. Por favor, verifique se tem espaço em disco e permissões e tente de novo. Erro: - + ERROR ERRO - + Request new recording button Botão para começar nova gravação - + New Recording Nova Gravação - + During a recording session, the button can be used to start a new recording. Durante uma sessão de gravação, este botão pode ser utilizado para começar uma nova gravação. - - + + E&xit &Sair - + Select Main Recording Directory Selecionar a Diretoria Principal das Gravações - + Recording A gravar - + Not recording Não está a gravar - + Not initialised Não inicializado - + Not enabled Desativado - + &Window &Janela - + None Nenhum - + Not registered Não registado - + Bad address Endereço incorreto - + Registration requested Registo solicitado - + Registration failed Registo falhou - + Check server version Verifique a versão do servidor - + Registered Registado - + Server list full at directory Lista dos servidores cheia na pasta - + Your server version is too old A versão do seu servidor é muito antiga - + Requirements not fulfilled Requisitos não cumpridos - + Unknown value %1 Valor desconhecido %1 @@ -3360,32 +3369,32 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CServerListManager - + Now a directory Agora uma pasta - + No longer a directory Deixou de ser uma pasta - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Não foi possível abrir '%1' para ler/gravar. Por favor, verifique se %2 tem permissão (e se há espaço livre). - + Loading persistent server list file: %1 A carregar o ficheiro da lista de servidores persistentes: %1 - + Could not write to '%1' Não foi possível gravar em '%1' - + Saving registration for %1 (%2): %3 A guardar o registo para %1 (%2): %3 @@ -3393,68 +3402,68 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CSound - + The selected audio device is no longer present in the system. Please check your audio device. O dispositivo de áudio atualmente selecionado já não se encontra presente no sistema. Por favor, verifique o seu dispositivo de áudio. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Não foi possível inicializar o controlador de áudio. Confirme se o seu equipamento de áudio está ligado e verifique as suas definições do controlador. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. O dispositivo de áudio selecionado é incompatível uma vez que não suporta uma taxa de amostras de %1 Hz. Por favor, selecione outro dispositivo. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. A configuração do dispositivo de áudio atual é incompatível pois não foi possível definir a taxa de amostras em %2 Hz. Verifique se o equipamento possui alguma chave ou configuração de driver para definir manualmente a taxa de amostras e reiniciar o %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. O dispositivo de áudio selecionado é incompatível uma vez que não suporta %1 canais de entrada/saída. Por favor, selecione outro dispositivo ou configuração. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. O dispositivo de áudio selecionado é incompatível uma vez que o formato de áudio requerido não está disponível. Por favor, selecione outro dispositivo. - + No ASIO audio device driver found. Não foi encontrado um controlador ASIO do dispositivo de áudio. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Por favor, instale um controlador ASIO driver antes de executar o %1. Se tem um dispositivo com suporte ASIO, instale o controlador ASIO oficial. Se não, precisará de instalar um controlador ASIO universal, como o ASIO4ALL. - + Error requesting stream stop: $s Erro ao requisitar paragem do stream: $s - + Error closing stream: $s Erro ao fechar o stream: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. Não foi possível iniciar o JACK automaticamente. Inicie o JACK manualmente e verifique se há mensagens de erro. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK não está em execução com uma taxa de amostras de <b>%1 Hz</b>. Por favor, use uma ferramenta, como <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> para definir a taxa de amostras de JACK para %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. O registo da porta JACK falhou. Provavelmente isso é um erro com JACK. Pare %1 e JACK. Depois, verifique se outro programa com uma taxa de amostragem de %2 Hz pode ligar-se ao JACK. @@ -3463,62 +3472,62 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res O registo da porta JACK falhou. Provavelmente isso é um erro com JACK. Pare %1 e JACK. Depois, verifique se outro programa MIDI pode ligar-se ao JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Não é possível ativar o cliente JACK. Provavelmente isso é um erro com JACK. Verifique a saída JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK foi encerrado. %1 requer JACK para correr. Reinicie %1 para iniciar JACK novamente. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Nenhuma placa de som está disponível em seu sistema. A entrada do CoreAudio falhou na chamada AudioHardwareGetProperty. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Nenhuma placa de som está disponível em seu sistema. A saída do CoreAudio falhou na chamada AudioHardwareGetProperty. - + The currently selected audio device is no longer present. Please check your audio device. O dispositivo de áudio selecionado não está mais presente. Verifique seu dispositivo de áudio. - + The audio input device is no longer available. Please check if your input device is connected correctly. O dispositivo de entrada de áudio não está mais disponível. Verifique se seu dispositivo de entrada está corretamente ligado. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). A taxa de amostragem no dispositivo de entrada atual não é %1 Hz e, portanto, é incompatível. Selecione outro dispositivo ou tente definir manualmente a taxa de amostragem para %1 Hz via Configuração de Áudio e MIDI (em Aplicativos->Utilitários). - + The audio output device is no longer available. Please check if your output device is connected correctly. O dispositivo de saída de áudio não está mais disponível. Verifique se seu dispositivo de saída está corretamente ligaado. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). A taxa de amostragem no dispositivo de saída atual não é %1 Hz e, portanto, é incompatível. Selecione outro dispositivo ou tente definir manualmente a taxa de amostragem para %1 Hz via Configuração de Áudio e MIDI (em Aplicativos->Utilitários). - + The stream format on the current input device isn't compatible with this software. Please select another device. O formato do fluxo no dispositivo de entrada atual não é compatível com este software. Por favor, selecione outro dispositivo. - + The stream format on the current output device isn't compatible with %1. Please select another device. O formato do fluxo no dispositivo de saída atual não é compatível com %1. Por favor, selecione outro dispositivo. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Os tamanhos de buffer do dispositivo de áudio de entrada e saída atual não podem ser definidos para um valor comum. Por favor, selecione outros dispositivos de entrada/saída nas suas configurações. @@ -3526,27 +3535,27 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Não é possível usar o dispositivo de áudio selecionado devido ao seguinte erro: %1. O driver anterior será selecionado. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. O dispositivo de áudio selecionado anteriormente não está mais disponível ou o driver mudou para um estado incompatível. Tentaremos encontrar um dispositivo de áudio válido, mas esse novo dispositivo pode causar microfonia. Antes de ligar-se a um servidor, verifique suas definições de dispositivo de áudio. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 não encontrou um dispositivo de áudio %2 utilizável </b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Você pode corrigir erros nas configurações do driver. Deseja abrir essas configurações agora? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Não é possível iniciar %1. Reinicie %1 e verifique/reconfigure suas definições de áudio. @@ -3554,53 +3563,57 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Versão %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Lançado sob a Licença Pública Geral GNU versão 2 (GPLv2) + Lançado sob a Licença Pública Geral GNU versão 2 (GPLv2) - + This app uses the following libraries, resources or code snippets: Esta aplicação utiliza as seguintes bibliotecas, recursos ou partes de código: - + Qt cross-platform application framework Estrutura de aplicações multiplataforma Qt - + (build) (versão) - + (runtime) (tempo de execução) - + Some pixmaps are from the %1 Alguns pixmaps são de %1 - + Some sound samples are from %1 Algumas amostras de áudio são de %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Código de reverberação de áudio por Perry R. Cook e Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Ícones de bandeiras por Mark James @@ -3608,12 +3621,12 @@ Nós silenciamos o seu canal e ativamos 'Silenciar-me'. Por favor, res global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Está disponível uma atualização %1: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>vá para detalhes e transferências</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Para mais informações, use "O que é isto" (menu Ajuda, botão direito do rato ou Shift + F1) diff --git a/src/translation/translation_ru_RU.ts b/src/translation/translation_ru_RU.ts index faddd57a66..369c174aa6 100644 --- a/src/translation/translation_ru_RU.ts +++ b/src/translation/translation_ru_RU.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt фреймворк для разработки кроссплатформенного программного обеспечения - + (build) (сборка) - + (runtime) (время выполнения) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Код реверберации от Перри Р. Кука и Гэри П. Скавоне - + This app enables musicians to perform real-time jam sessions over the internet. Это приложение позволяет музыкантам проводить мероприятия(jam sessions) в режиме реального времени через Интернет. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Это сервер, который собирает аудиоданные от каждого клиента, микширует аудиоданные и отправляет микширование обратно каждому клиенту. - + This app uses the following libraries, resources or code snippets: Это приложение использует следующие библиотеки, ресурсы или фрагменты кода: - + Flag icons by Mark James Значки флагов от Марка Джеймса - + Some pixmaps are from the %1 Некоторые пиксельные изображения взяты из %1 - + Some sound samples are from %1 Некоторые звуковые сэмплы взяты из %1 - + For details on the contributions check out the %1 Для получения подробной информации о взносах ознакомьтесь с %1 - + Github Contributors list - + Spanish Испанский - + French Французский - + Portuguese Португальский - + Dutch - Датский + Нидерландский - + Italian Итальянский - + German Немецкий - + Polish Польский - + Swedish Шведский - + Korean Корейский - + Slovak Словацкий - + Simplified Chinese Упрощённый китайский - + Norwegian Bokmål Букмол - + Japanese Японский - + About %1 @@ -149,7 +149,7 @@ Copyright © 2005-2026 The Jamulus Development Team - © 2005–2025 Команда разработчиков Jamulus {2005-2026 ?} + © 2005–2026 Команда разработчиков Jamulus @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console - + Error Rate of Each Buffer Size Частота ошибок для каждого размера буфера @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Персональный микс на сервере - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Когда вы подключены к серверу, эти элементы управления позволяют настроить ваш локальный микс, не влияя на то, что слышат от вас другие. В заголовке отображается имя сервера и, если известно, ведётся ли на нём запись. - + Server Сервер - + T R Y I N G T O C O N N E C T П О П Ы Т К А П О Д К Л Ю Ч Е Н И Я - + RECORDING ACTIVE ИДЁТ ЗАПИСЬ - + Personal Mix at: %1 @@ -226,245 +226,245 @@ CChannelFader - + Channel Level - + Input level of the current audio channel at the server Уровень входного сигнала текущего аудиоканала на сервере - + Mixer Fader - + Local mix level setting of the current audio channel at the server - + Status Indicator Индикатор состояния - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: - + Status indicator label Метка индикатора состояния - + Panning - + Local panning position of the current audio channel at the server Локальная позиция панорамирования текущего аудиоканала на сервере - + With the Mute checkbox, the audio channel can be muted. - + Mute button - + Solo button - + Fader Tag - + Grp - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Отображает уровень звука этого канала до фейдера. Всем клиентам, подключённым к серверу, будет присвоен один и тот же уровень звука. - + &No grouping - + Assign to group - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Регулирует уровень звука этого канала. Всем клиентам, подключённым к серверу, назначается аудиофейдер, который отображается у каждого из них для настройки локального микса. - + Speaker with cancellation stroke: Indicates that another client has muted you. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. - + Group - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. С помощью флажка Grp можно объединить аудиоканалы в группу. Фейдеры всех каналов в группе перемещаются пропорционально и синхронно, если сдвинуть любой из них. - + Group button - + Mixer channel instrument picture - + Mixer channel label (fader tag) - + PAN - + MUTE - + SOLO - + GRP - + M - + S - + G - + Alias/Name - + Instrument - + Location - - - + + + Skill Level - + Alias - + Beginner - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Метка фейдера идентифицирует подключённого клиента. Имя, изображение инструмента и флаг вашего местоположения можно задать в главном окне. - + Mixer channel country/region flag Флаг страны/региона на микшерном канале - + Intermediate Промежуточный - + Expert Экспертный - + Musician Profile Карточка музыканта - - - + + + Mute Заглушить - - - + + + Pan - - - + + + Solo @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Окно чата - + The chat window shows a history of all chat messages. - + Chat history История чата - + Input Message Text Введите текст сообщения - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Введите текст сообщения в поле для ввода и нажмите Enter, чтобы отправить его на сервер, который разошлёт сообщение всем подключённым клиентам. После этого ваше сообщение появится в окне чата. - + New chat text edit box Новое поле для ввода текста чата - + Type a message here Введи сообщение здесь - + &Edit &Правка - + Cl&ear Chat History &Очистить историю чата - - + + &Close &Закрыть - + Do you want to open the link '%1' in your browser? @@ -544,381 +544,381 @@ CClientDlg - + Input Level Meter - + Make sure not to clip the input signal to avoid distortions of the audio signal. Во избежание искажений звука не допускайте перегрузки входного сигнала. - + Input level meter Индикатор входного уровня - + Simulates an analog LED level meter. - + Connect/Disconnect Button - + Connect and disconnect toggle button - + This shows the level of the two stereo channels for your audio input. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Если приложение подключено к серверу и вы играете на своём инструменте/поёте в микрофон, индикатор уровня громкости должен реагировать. Если этого не происходит, вы, вероятно, выбрали не тот входной канал (например, «линейный вход» вместо микрофонного) или установили слишком низкий уровень входного усиления в аудиомикшере (Windows). - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). - + Reverb effect - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Реверберацию можно применить к одному локальному моноканалу или к обоим каналам в стереорежиме. Выбор моноканала и уровень реверберации можно изменять. Например, если на правый аудиоканал звуковой карты подаётся сигнал с микрофона и необходимо применить реверберацию, установите переключатель каналов в положение «правый» и двигайте фейдер вверх, пока не будет достигнут её желаемый уровень. - + Reverb effect level setting - + Reverb Channel Selection - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. С помощью этих радиокнопок можно выбрать входной аудиоканал, к которому применяется реверберация. Можно выбрать левый или правый входной канал. - + Left channel selection for reverb - + Right channel selection for reverb - + Green Зелёный - + The delay is perfect for a jam session. - + Yellow Жёлтый - + Red Красный - + If this LED indicator turns red, you will not have much fun using %1. - + Delay status LED indicator - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. - + Shows the current audio delay status: - + A session is still possible but it may be harder to play. - + The delay is too large for jamming. - + The sound card's buffer delay (buffer size) is too small (see Settings window). - + The upload or download stream rate is too high for your internet bandwidth. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Время пинга — это время, необходимое аудиопотоку для прохождения от клиента до сервера и обратно. Эта задержка обусловлена сетью и должна составлять около 20–30 мс. Если она превышает 50 мс, значит, расстояние до сервера слишком велико или ваше интернет-соединение недостаточно качественное. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Общая задержка рассчитывается из текущего времени пинга и задержки, вносимой текущими настройками буфера. - - + + C&onnect - + &File &Файл - + &View &Вид - + &Connection Setup... &Настройка соединения... - + My &Profile... - + C&hat... - + &Analyzer Console... - + Clear &All Stored Solo and Mute Settings - + Connect - + Settings - + Chat Чат - + Enable feedback detection - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Ваша звуковая карта работает некорректно. Пожалуйста, откройте диалоговое окно настроек и проверьте выбор устройства и настройки драйвера. - + Ok - + E&xit &Выйти - + &Edit & Редактировать - + Delay Status LED - + The network jitter buffer is not large enough for the current network/audio interface jitter. Размера сетевого джиттер-буфера недостаточно для текущего джиттера сети/аудиоинтерфейса. - + The CPU of the client or server is at 100%. Процессор клиента или сервера загружен на 100%. - + If this LED indicator turns red, the audio stream is interrupted. - + Current Connection Status - + &Load Mixer Channels Setup... - + &Save Mixer Channels Setup... - + Sort Users by Chann&el - + Sett&ings &Настройки - + Audio/Network &Settings... - + A&dvanced Settings... &Продвинутые настройки... - + N&o User Sorting - + Local Jitter Buffer Status LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Светодиодный индикатор состояния локального джиттер-буфера показывает текущий статус аудио/потока. Если индикатор горит красным, аудиопоток прерван. Это вызвано одной из следующих проблем: - + Local Jitter Buffer status LED indicator Светодиодный индикатор состояния локального джиттер-буфера - + O&wn Fader First - + Sort Users by &Name Сортировать пользователей по &Имени - + Sort Users by &Instrument Сортировать пользователей по &Инструменту - + Sort Users by &Group Сортировать пользователей по &Группе - + Sort Users by &City Сортировать пользователей по &Городу - + &MIDI Control Settings... - + %1 Directory - + Set All Faders to New Client &Level - + Auto-Adjust all &Faders - - + + Select Channel Setup File - + user пользователь - + users пользователи - + &Disconnect @@ -1015,1098 +1015,1103 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CClientSettingsDlg - + Jitter Buffer Size - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. - + Local jitter buffer slider control - + Server jitter buffer slider control - + Auto jitter buffer check box - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Если драйвер выбирается во время активного соединения, соединение останавливается, драйвер изменяется, и соединение автоматически запускается снова. - + Sound card device selector combo box - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. При использовании драйвера ASIO4ALL, пожалуйста, учтите, что он обычно добавляет дополнительную задержку звука примерно в 10-30 мс. Поэтому рекомендуется использовать звуковую карту с нативным драйвером ASIO. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Если вы используете драйвер kX ASIO, убедитесь, что входы ASIO подключены в панели настроек kX DSP. - + Sound Card Channel Mapping Назначение каналов звуковой карты - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Если выбранное звуковое устройство имеет более одного входного или выходного канала, становятся видимыми настройки «Назначение входных каналов» и «Назначение выходных каналов». - + Left input channel selection combo box - + Right input channel selection combo box - + Left output channel selection combo box - + Right output channel selection combo box - + Small Network Buffers - + Small network buffers check box - + Sound Card Buffer Delay - + Sound card driver settings - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Включает поддержку очень маленьких сетевых аудиопакетов. Эти пакеты используются только в том случае, если задержка буфера звуковой карты меньше %1 сэмплов. Чем меньше сетевые буферы, тем ниже задержка звука. Но в то же время возрастает нагрузка на сеть и вероятность выпадений звука или появления звуковых артефактов. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Это открывает настройки драйвера вашей звуковой карты. Некоторые драйверы позволяют изменять настройки буфера, а другие, например ASIO4ALL, дают возможность выбирать входы или выходы ваших устройств. Больше информации можно найти на jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. - + ASIO Device Settings push button - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Выберите стиль для индикаторов уровня. Опции «Полоса (узкая)» и «Светодиоды (круглые, маленькие)» применяются только к микшерной панели. Когда выбрана «Полоса (узкая)», для входных индикаторов устанавливается стиль «Полоса (широкая)». Когда выбраны «Светодиоды (круглые, маленькие)», для входных индикаторов устанавливается стиль «Светодиоды (круглые, большие)». Остальные опции применяются как к микшерной панели, так и к входным индикаторам. - + Language Язык - + Select the language to be used for the user interface. Выберите язык, который будет использоваться в пользовательском интерфейсе. - + Language combo box - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Регулирует относительные уровни левого и правого локальных аудиоканалов. Для моносигнала он работает как регулятор панорамы между двумя каналами. Например, если микрофон подключён к правому входному каналу, а к левому — инструмент, который звучит намного громче микрофона, перемещайте фейдер в ту сторону, чтобы надпись над ним показывала %1, где %2 — текущий индикатор ослабления. - + Audio Device - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. В операционной системе Windows драйвер ASIO (звуковой карты) можно выбрать с помощью %1. Если выбранный драйвер ASIO недействителен, отображается сообщение об ошибке и выбирается предыдущий действительный драйвер. В macOS можно выбрать устройства ввода и вывода. - + Three buffer sizes can be selected - + 64 samples: Provides the lowest latency but does not work with all sound cards. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Некоторые драйверы звуковых карт не позволяют изменять задержку буфера из %1. В этом случае настройка задержки буфера будет неактивна, и её придётся изменять с помощью драйвера звуковой карты. Используйте соответствующий инструмент для вашего интерфейса, чтобы настроить размер буфера. Например, если вы используете ASIO, нажмите кнопку «Настройки устройства ASIO», чтобы открыть панель настроек драйвера, или, если вы используете JACK, воспользуйтесь утилитой вроде QjackCtl для настройки размера буфера. Для других интерфейсов, таких как Pipewire, потребуется использовать их собственные инструменты. Пожалуйста, обратитесь к руководству по вашему интерфейсу. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Фактическая задержка буфера влияет на соединение, текущую скорость отдачи и общую задержку. Чем меньше размер буфера, тем выше вероятность появления красного индикатора состояния (выпадения звука), выше скорость отдачи и ниже общая задержка. - + Meter Style - + Meter Style combo box - + Input Boost - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Эта настройка позволяет увеличить уровень входного сигнала до 10 раз (+20 дБ). Если ваш звук слишком тихий, сначала попробуйте увеличить уровень, приблизившись к микрофону, отрегулировав звуковое оборудование или увеличив уровень в настройках входа вашей операционной системы. И только если это не поможет, установите значение здесь. Если ваш звук слишком громкий, искажается и перегружен, эта опция не поможет. Не используйте её. Искажение всё равно останется. Вместо этого уменьшите уровень входного сигнала, отодвинувшись от микрофона, отрегулировав звуковое оборудование или уменьшив уровень в настройках входа вашей операционной системы. - + Input Boost combo box - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> - + Delete custom directory button - + Delete Custom Directory - + Click the button to delete the currently selected custom directory. - + Audio Upstream Rate - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Зависит от текущего размера аудиопакета и настроек сжатия. Убедитесь, что скорость исходящего потока не превышает доступную вам скорость отдачи (проверить это можно с помощью такого сервиса, как speedtest.net). - + Number of Mixer Panel Rows - + Adjust the number of rows used to arrange the mixer panel. - + Number of Mixer Panel Rows spin box - + Feedback Protection - + Prevents acoustic feedback between microphone and speakers. - + Feedback Protection check box - + Audio Alerts - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Включать звуковое оповещение при получении сообщения в чате и при подключении нового клиента к сессии. Для прослушивания оповещений может потребоваться второе звуковое устройство. - + Audio Alerts check box - + Enable/disable MIDI-in port - + MIDI-in port check box - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + ASIO Device Settings - + + Max + + + + Fancy - + Compact - + Bar (narrow) - + Bar (wide) - + LEDs (stripe) - + LEDs (round, small) - + LEDs (round, big) - - - - + + + + None - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Напишите здесь своё имя или псевдоним, чтобы другие музыканты, с которыми вы хотите играть, знали, кто вы. Вы также можете добавить изображение инструмента, на котором играете, и флаг страны или региона, где вы находитесь. Кроме того, можно указать ваш город и уровень владения инструментом. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Указанные здесь данные появятся на вашем фейдере на микшерной панели при подключении к серверу %1. Этот тег также будет отображаться у каждого клиента, подключённого к тому же серверу, что и вы. - + Country/region flag button - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - + Center - + R - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + The buffer setting is therefore a trade-off between audio quality and overall delay. - + 64 samples setting radio button - + 128 samples setting radio button - + 256 samples setting radio button - + Audio Channels - + Audio channels combo box - + Audio Quality - + Audio quality combo box - + New Client Level - + New client level edit box - - + + Mono - + and - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. - + Custom Directories - + Custom Directories combo box - + Mono-in/Stereo-out - - - + + + Stereo - - - + + + &Close &Закрыть - + Local Audio Input Fader - - + + L - + Local audio input fader (left/right) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Вы можете вручную задать размер джиттер-буфера для локального клиента и удалённого сервера. Для локального джиттер-буфера выпадения в аудиопотоке обозначаются световым индикатором под фейдерами размера буфера. Если индикатор становится красным, произошло переполнение/опустошение буфера, и аудиопоток прерывается. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Если включена настройка «Авто», джиттер-буферы локального клиента и удалённого сервера настраиваются автоматически на основе измерений джиттера сети и звуковой карты. Когда включён режим «Авто», регуляторы размера джиттер-буфера неактивны (их нельзя перемещать мышью). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Если включена настройка «Авто», сетевые буферы локального клиента и удалённого сервера устанавливаются на консервативное значение, чтобы минимизировать вероятность пропадания звука. Для точной настройки задержки рекомендуется отключить опцию «Авто» и вручную уменьшать размер джиттер-буфера с помощью ползунков до тех пор, пока вы не достигнете приемлемого для вас количества выпадений звука. Светодиодный индикатор будет отображать выпадения звука в локальном джиттер-буфере красным светом. - + 128 samples: Should work for most available sound cards. - + Skin - + Select the skin to be used for the main window. - + Skin combo box - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Выбирает количество аудиоканалов, используемых для связи между клиентом и сервером. Доступно три режима: - + These modes use one and two audio channels respectively. - + Mono in/Stereo-out - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Аудиосигнал, отправляемый на сервер, — монофонический, а обратный сигнал — стереофонический. Это полезно в том случае, если к одному входному каналу звуковой карты подключен инструмент, а к другому — микрофон. В такой ситуации два входных сигнала можно свести в один моноканал, но микс с сервера будет слышен в стерео. - + Enabling - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Эта настройка определяет в процентах уровень фейдера для нового подключившегося клиента. Когда новый клиент подключается к текущему серверу, ему будет присвоен указанный начальный уровень, если для этого клиента не был сохранён другой уровень с предыдущего подключения. - + Low - - + + Normal - + High - + Custom - + Any Genre 2 - - Any Genre 3 + + Any Genre Asia - + Genre Rock - + Genre Jazz - + Genre Classical/Folk - + Genre Choral/Barbershop - + Any Genre 1 - + Musician Profile Карточка музыканта - + Alias or name edit box - + Instrument picture button - + City edit box - + Skill level combo box - + Beginner - + Intermediate Промежуточный - + Expert Экспертный - - + + Size: - + Buffer Delay - + Buffer Delay: - + Drum Set - + Djembe - + Electric Guitar - + Acoustic Guitar - + Bass Guitar - + Keyboard - + Synthesizer - + Grand Piano - + Accordion - + Vocal - + Microphone - + Harmonica - + Trumpet - + Trombone - + French Horn - + Tuba - + Saxophone - + Clarinet - + Flute - + Violin - + Cello - + Double Bass - + Recorder - Recorder + Блокфлейта - + Streamer - + Listener - + Guitar+Vocal - + Keyboard+Vocal - + Bodhran - + Bassoon - + Oboe - + Harp - + Viola - + Congas - + Bongo - + Vocal Bass - + Vocal Tenor - + Vocal Alto - + Vocal Soprano - + Banjo - + Mandolin - + Ukulele - + Bass Ukulele - + Vocal Baritone - + Vocal Lead - + Mountain Dulcimer - + Scratching - + Rapping - + Vibraphone - + Conductor @@ -2506,117 +2511,117 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CConnectDlg - + Server List - + Directory - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. - + Directory combo box - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. - + You can add custom directories in Advanced Settings. - + Server list view - + Server Address - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. - + Holds the current server address. It also stores old addresses in the combo box list. - + Delete server address button - + Delete Server Address - + Click the button to clear the currently selected server address and delete it from the list of stored servers. - + Ping - + Server address edit box - + Filter - + Filter edit box - + Show All Musicians - + Show all musicians check box - + Filter text, or # for occupied servers @@ -2687,43 +2692,43 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CHelpMenu - + &Help - - + + Getting &Started... - + Software &Manual... - + What's &This - + P&rivacy policy... - + &About Jamulus... - + About &Qt... - + About Qt @@ -2731,12 +2736,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLanguageComboBox - + Restart Required - + Please restart the application for the language change to take effect. @@ -2744,22 +2749,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. - + I have read the conditions and &agree. - + Accept - + Decline @@ -2767,17 +2772,17 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMultiColorLED - + Red Красный - + Yellow Жёлтый - + Green Зелёный @@ -2785,7 +2790,7 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMusProfDlg - + No Name @@ -2793,448 +2798,448 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerDlg - + Client List - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. - + Connected clients list view - + Directory Type combo box - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. - + When checked, the recorder will run while a session is in progress (if set up correctly). - + No recording directory has been set or the value is not useable. Check the value in the Options tab. - + Recording has been switched off by the UI checkbox or JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. - + Custom Directory address - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. - + Server List Filename dialog push button - - + + Server List Filename - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). - + Server List Filename text box (read-only) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. - + Clear the server list file name button - + Clear Server List Filename - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. - + Start Minimized on Operating System Start - + Now a directory - + Register Server Status - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. - + Server Name - + The server name identifies your server in the connect dialog server list at the clients. - + Server name line edit - + Location City - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. - + City where the server is located line edit - + Country/Region - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. - + Combo box for location of this server - + Display dialog to select recording directory button - - + + Main Recording Directory - + Main recording directory text box (read-only) - + Clear the recording directory button - + Clear Recording Directory - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. - + Checkbox to turn on or off server recording - + Jam Recorder - + Current session directory text box (read-only) - + Current Session Directory - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. - + Recorder status label - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus - + Recorder Status - + Displays the current status of the recorder. The following values are possible: - + There is no one connected to the server to record. - + The performers are being recorded to the specified session directory. - + NOTE - + Server welcome message edit box - + Server Welcome Message - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. - + Language Язык - + Select the language to be used for the user interface. Выберите язык, который будет использоваться в пользовательском интерфейсе. - + Language combo box - + Custom Directory line edit - + &Hide %1 server - + &Show %1 server - + %1 server %1 is the name of the main application - + Type a message here. If no message is set, the server welcome is disabled. - + %1 Server %1 is the name of the main application - + Recorder failed to start. Please check available disk space and permissions and try again. Error: - + ERROR - + Request new recording button - + New Recording - + During a recording session, the button can be used to start a new recording. - - + + E&xit &Выйти - + Select Main Recording Directory - + Recording - + Not recording - + Not initialised - + Not enabled - + &Window - + None - + Not registered - + Bad address - + Registration requested - + Registration failed - + Check server version - + Registered - + Server list full at directory - + Your server version is too old - + Requirements not fulfilled - + Unknown value %1 @@ -3358,32 +3363,32 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerListManager - + Now a directory - + No longer a directory - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). - + Loading persistent server list file: %1 - + Could not write to '%1' - + Saving registration for %1 (%2): %3 @@ -3391,128 +3396,128 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSound - + The selected audio device is no longer present in the system. Please check your audio device. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. - + No ASIO audio device driver found. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. - + Error requesting stream stop: $s - + Error closing stream: $s - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. - + The currently selected audio device is no longer present. Please check your audio device. - + The audio input device is no longer available. Please check if your input device is connected correctly. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). - + The audio output device is no longer available. Please check if your output device is connected correctly. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). - + The stream format on the current input device isn't compatible with this software. Please select another device. - + The stream format on the current output device isn't compatible with %1. Please select another device. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. @@ -3520,27 +3525,27 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. @@ -3548,53 +3553,53 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number - - Released under the GNU General Public License version 2 or later (GPLv2) - - - - + This app uses the following libraries, resources or code snippets: Это приложение использует следующие библиотеки, ресурсы или фрагменты кода: - + Qt cross-platform application framework Qt фреймворк для разработки кроссплатформенного программного обеспечения - + (build) (сборка) - + (runtime) (время выполнения) - + Some pixmaps are from the %1 Некоторые пиксельные изображения взяты из %1 - + Some sound samples are from %1 Некоторые звуковые сэмплы взяты из %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Код реверберации от Перри Р. Кука и Гэри П. Скавоне - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Значки флагов от Марка Джеймса @@ -3602,12 +3607,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) diff --git a/src/translation/translation_sk_SK.ts b/src/translation/translation_sk_SK.ts index 02182e2ab1..ae9dc34ad4 100644 --- a/src/translation/translation_sk_SK.ts +++ b/src/translation/translation_sk_SK.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt multiplatformový aplikačný framework - + (build) (zostavenie) - + (runtime) (runtime) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Kód pre ozvenu (reverb): Perry R. Cook a Gary P. Scavone - + This app enables musicians to perform real-time jam sessions over the internet. Táto aplikácia umožňuje hudobníkom v reálnom čase džemovať cez internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Úlohou servera je zbierať zvukové dáta od každého klienta, zmiešať ich a poslať ich každému klientovi späť. - + This app uses the following libraries, resources or code snippets: Tento program používa nasledujúce knižnice, zdrojové dáta alebo úryvky kódu: - + Flag icons by Mark James Ikony vlajok: Mark James - + Some pixmaps are from the %1 Niektoré ikony sú z %1 - + Some sound samples are from %1 Niektoré zvukové ukážky sú z %1 - + For details on the contributions check out the %1 Podrobnosti o prispievateľoch nájdete na %1 - + Github Contributors list Zoznam prispievateľov na Githube - + Spanish španielčina - + French francúzština - + Portuguese portugalčina - + Dutch holandčina - + Italian taliančina - + German nemčina - + Polish poľština - + Swedish švédčina - + Korean kórejčina - + Slovak slovenčina - + Simplified Chinese zjednodušená čínština - + Norwegian Bokmål nórsky bokmål - + Japanese Japončina - + About %1 O programe %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console Konzola analyzéra - + Error Rate of Each Buffer Size Frekvencia chýb podľa veľkosti vyr. pamäte @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server Osobný mix servera - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. Po pripojení sa na server vám tieto ovládacie prvky umožnia lokálne mixovať zvuk bez toho, aby ste tým ovplyvnili to, čo od vás budú počuť ostatní. Nadpis okna zobrazuje názov servera a v prípade, ak je táto informácia k dispozícii, či je aktívne nahrávanie. - + Server Server - + T R Y I N G T O C O N N E C T P O K U S O P R I P O J E N I E - + RECORDING ACTIVE NAHRÁVANIE AKTÍVNE - + Personal Mix at: %1 Osobný mix na: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan Posúvanie - - - + + + Mute Stíšiť - - - + + + Solo Sólo - + Channel Level Úroveň kanála - + Input level of the current audio channel at the server Vstupná úroveň aktuálneho audio kanála na serveri - + Mixer Fader Prelínač mixéra - + Local mix level setting of the current audio channel at the server Nastavenie úrovne miestneho mixu aktuálneho audio kanála na serveri - + Status Indicator Stavový indikátor - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Zobrazuje indikáciu stavu klienta, ktorý je priradený k tomuto kanálu. Podporované indikátory sú: - + Status indicator label Menovka stavového indikátora - + Panning Posúvanie - + Local panning position of the current audio channel at the server Miesto posúvanie pozície aktuálneho zvukového kanála na serveri - + With the Mute checkbox, the audio channel can be muted. Audio kanál môžete vypnúť pomocou zaškrtávacieho políčka Stíšiť. - + Mute button Tlačidlo Stíšenia - + Solo button Tlačidlo Sóla - + Fader Tag Značka posuvníka - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Zobrazuje počiatočnú úroveň zvuku pre tento kanál. Každému klientovi pripájajúcemu sa k tomuto serveru bude priradená táto úroveň, pre každého klienta sa použije rovnaká hodnota. - + &No grouping &Bez zoskupovania - + Assign to group Priradiť do skupiny - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Upravuje úroveň zvuku pre tento kanál. Všetkým klientom pripojeným k serveru bude priradený posuvník zvuku a umožní vám ich lokálne mixovanie. - + Speaker with cancellation stroke: Indicates that another client has muted you. Prečiarknutý reproduktor: Zobrazí sa vtedy, ak vás iný klient stíšil. - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Nastavuje posun z ľavého do pravého kanála. Funguje iba v režime stereo, prípadne (lepšie) v režie mono dnu/stereo von. - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Pomocou zaškrtávacieho políčka Sólo môžete zvukový kanál nastaviť ako sólo, čo znamená, že zvyšné kanály (okrem sólo kanálov) budú stíšené. Je možné takto označiť viac kanálov. - + Group Zoskupiť - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Pomocou zaškrtávacieho políčka Skp môžete definovať skupinu zvukových kanálov. Pri zmene hlasitosti kanála sú príslušným spôsobom menené hlasitosti ostatných kanálov v tej istej skupine. - + Group button Tlačidlo Zoskupiť - + Mixer channel instrument picture Obrázok hud. nástroja kanála mixéra - + Mixer channel label (fader tag) Menovka kanála mixéra (značka posuvníka) - + PAN PAN - + MUTE STÍŠIŤ - + SOLO SÓLO - + GRP SKP - + M M - + S S - + G G - + Grp Skp - + Alias/Name Prez/Meno - + Instrument Hud. nástroj - + Location Miesto - - - + + + Skill Level Úroveň hrania - + Alias Prezývka - + Beginner Začiatočník - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Značka posuvníka identifikuje pripojeného klienta. Názov značky, obrázok vášho nástroja a vlajku vašej polohy môžete nastaviť v hlavnom okne. - + Mixer channel country/region flag Vlajka krajiny/regiónu na kanáli mixéra - + Intermediate Pokročilý - + Expert Expert - + Musician Profile Profil hudobníka @@ -472,58 +472,58 @@ CChatDlg - + Chat Window Okno chatu - + The chat window shows a history of all chat messages. Okno chatu zobrazuje históriu všetkých správ chatu. - + Chat history História chatu - + Input Message Text Vstupná správa chatu - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Zadajte text správy chatu do poľa a stlačte enter pre poslanie správy na server, ktorý ju rozpošle všetkým pripojeným klientom. Vaša správa sa potom objaví v okne chatu. - + New chat text edit box Pole úprav nového textu správy - + Type a message here Sem napíšte správu - + &Edit &Upraviť - + Cl&ear Chat History &Vyčistiť históriu chatu - - + + &Close &Zavrieť - + Do you want to open the link '%1' in your browser? Chcete otvoriť prepojenie '%1' vo vašom prehliadači? @@ -544,369 +544,369 @@ CClientDlg - + Input Level Meter Indikátor úrovne vstupu - + Make sure not to clip the input signal to avoid distortions of the audio signal. Zabezpečte, aby nedochádzalo k orezávaniu (clipping) vstupného signálu, aby ste zamedzili jeho skresleniu. - + Input level meter Indikátor úrovne vstupu - + Simulates an analog LED level meter. Simuluje analógový LED indikátor úrovne vstupu. - + Connect/Disconnect Button Tlačidlo Pripojiť/Odpojiť - + Connect and disconnect toggle button Tlačidlo Pripojiť/Odpojiť - + Delay Status LED Dióda stavu oneskorenia - + Delay status LED indicator LED indikátor stavu oneskorenia - + The network jitter buffer is not large enough for the current network/audio interface jitter. Vyrovnávacia pamäť sieťového chvenia nemá dostatočnú veľkosť vzhľadom na aktuálne chvenie siete/zvukového rozhrania. - + This shows the level of the two stereo channels for your audio input. Tu sa zobrazuje úroveň dvoch stereo kanálov vášho zvukového vstupu. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Ak je aplikácia pripojená k serveru a vy zahráte na hudobný nástroj alebo zaspievate do mikrofónu, ukazovateľ vstupného signálu by sa mal aktivovať. Ak sa tak nedeje, pravdepodobne ste vybrali nesprávny vstupný kanál (napr. 'line in' miesto mikrofónneho vstupu) alebo ste nastavili zosilnenie signálu (gain) na príliš nízku hodnotu v zmiešavači zvuku (Windows). - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). Ak má táto aplikácia fungovať správne, nemali by ste počuť svoj spev/nástroj v reproduktoroch alebo slúchadlách vtedy, keď tento program nie je pripojený. To môžete docieliť stíšením vášho vstupného audio kanála v mixéri prehrávania (nie v nahrávacom mixeri!). - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Otvorí dialógové okno s výberom serveru, ku ktorému sa chcete pripojiť. Ak ste pripojený, stlačením tohto tlačidla ukončíte sedenie. - + Reverb effect Efekt ozveny (reverb) - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Efekt ozveny môžete použiť na jeden miestny audio kanál alebo na oba kanály v režime sterea. Výber kanála v mono režime a úroveň ozveny je možné meniť. Príklad: ak je signál z mikrofónu privedený do pravého kanála zvukovej karty a chcete naň použiť efekt ozveny, zvoľte pravý kanál a posuvník nastavte tak, aby ste dosiahli požadovanú úroveň efektu. - + Reverb effect level setting Nastavenie sily efektu ozveny (reverb) - + Reverb Channel Selection Výber kanála pre reverb - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Pomocou týchto tlačidiel si môžete vybrať, na ktorý vstupný kanál bude použitý efekt ozveny (reverb). Môžete si vybrať ľavý alebo pravý kanál. - + Left channel selection for reverb Výber ľavého kanála pre reverb - + Right channel selection for reverb Výber pravého kanála pre reverb - + Shows the current audio delay status: Zobrazuje aktuálny stav oneskorenia zvuku: - + Green Zelená - + The delay is perfect for a jam session. Oneskorenie je perfektné pre džemovanie. - + Yellow Žltá - + A session is still possible but it may be harder to play. Džemovanie je stále možné, ale hranie môže byť sťažené. - + Red Červená - + The delay is too large for jamming. Oneskorenie je príliš veľké na džemovanie. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Oneskorenie buffera (veľkosť buffera) zvukovej karty je príliš malé (pozrite Nastavenia). - + The upload or download stream rate is too high for your internet bandwidth. Rýchlosť uploadu alebo downloadu streamu je príliš vysoká vzhľadom na vašu rýchlosť internetového pripojenia. - + The CPU of the client or server is at 100%. Procesor na klientovi alebo serveri je vytažený na 100 %. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Čas pingu je čas potrebný na to, aby prúd zvuku pricestoval od klienta na server a naspäť. Oneskorenie je spôsobené sieťou a malo by sa pohybovať medzi 20 a 30 ms. Ak je oneskorenie vyššie ako približne 50 ms, vaša vzdialenosť ku serveru je príliš veľká alebo vaše pripojenie k internetu nie je postačujúce. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Celkové oneskorenie vychádza z času pingu a oneskorenia spôsobeného nastavením vyrovnávacej pamäte. - - + + C&onnect &Pripojiť - + &File &Súbor - + &View Pohľ&ad - + &Connection Setup... Nasta&venie pripojenia... - + My &Profile... Môj &profil... - + C&hat... &Chat... - + &Analyzer Console... &Konzola analyzátora... - + N&o User Sorting Netriediť &používateľov - + Sort Users by &City Triediť používateľov podľa mes&ta - + Clear &All Stored Solo and Mute Settings &Vypnúť všetky nastavenia sólo a stíšení - + If this LED indicator turns red, you will not have much fun using %1. Ak sa táto dióda zmení na červenú, veľa zábavy si aplikáciou %1 neužijete. - + If this LED indicator turns red, the audio stream is interrupted. Ak sa táto dióda zmení na červenú, prúd zvuku sa prerušil. - + Current Connection Status Aktuálny stav pripojenia - + Set All Faders to New Client &Level Nastaviť všetky posuvníky na ú&roveň pre nových klientov - + Auto-Adjust all &Faders &Automaticky prispôsobiť všetky posuvníky - + O&wn Fader First &Vlastný posuvník ako prvý - + Sort Users by Chann&el Triediť používateľov podľa &kanála - + Sett&ings &Nastavenia - + %1 Directory Adresár %1 - + Ok Ok - + E&xit U&končiť - + Local Jitter Buffer Status LED Stavová LEDka vyrovnávacej pamäte miestneho chvenia - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Stavová LEDka miestnej vyrovnávacej pamäte chvenia zobrazuje stav aktuálneho streamovania/zvuku. Ak svieti načerveno, prúd zvuku bol prerušený. Toto môže byť spôsobené: - + Local Jitter Buffer status LED indicator Stavová dióda vyrovnávacej pamäte miestneho chvenia - + &Load Mixer Channels Setup... &Načítať nastavenia kanálov mixéra... - + &Save Mixer Channels Setup... &Uložiť nastavenia kanálov mixéra... - + Audio/Network &Settings... Nastavenia zvuku/&siete... - + A&dvanced Settings... Pokročilé &nastavenia... - + &Edit Úp&ravy - + Sort Users by &Name Triediť používateľov kanálov podľa &mena - + Sort Users by &Instrument Triediť používateľov kanálov podľa &nástroja - + Sort Users by &Group Triediť používateľov kanálov podľa &skupiny - + &MIDI Control Settings... Nastavenia ovládania &MIDI... - - + + Select Channel Setup File Vyberte súbor s nastavením kanálov - + user používateľ - + users používatelia - + Connect Pripojiť sa - + Settings Nastavenia - + Chat Chat - + Enable feedback detection Zapnúť detekciu spätnej väzby - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -915,12 +915,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Prosím, vyriešte problém so spätnou väzbou a následne vypnite stíšenie. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Vaša zvuková karta nefunguje správne. Prosím, otvorte okno s nastaveniami a skontrolujte výber zariadenia a nastavenia ovládača. - + &Disconnect O&dpojiť @@ -1017,1098 +1017,1107 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CClientSettingsDlg - + Jitter Buffer Size Veľkosť vyrovnávacej pamäte chvenia - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Nastavenie vyrovnávacej pamäte chvenia je preto kompromisom medzi kvalitou zvuku a celkovým oneskorením. - + Local jitter buffer slider control Posuvný ovládač vyr. pamäte miestneho chvenia - + Server jitter buffer slider control Posuvný ovládač vyr. pamäte chvenia na serveri - + Auto jitter buffer check box Prepínač automatickej vyr. pamäte chvenia - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Ak ovládač vyberiete počas aktívneho pripojenia, pripojenie je pozastavené, ovládač sa zmení a následne sa spojenie automaticky opäť obnoví. - + Sound card device selector combo box Výberové okno zariadenia zvukovej karty - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Ak používate ovládač kX ASIO, zabezpečte, aby boli ASIO vstupy v nastaveniach kX DSP pripojené. - + Sound Card Channel Mapping Mapovanie kanálov zvukovej karty - + Left input channel selection combo box Výberové okno Ľavého vstupného kanála - + Right input channel selection combo box Výberové okno pravého vstupného kanála - + Left output channel selection combo box Výberové okno ľavého výstupného kanála - + Right output channel selection combo box Výberové okno pravého výstupného kanála - + Small Network Buffers Malá vyrovnávaciu pamäť pre sieť - + Small network buffers check box Prepínač malej sieťovej vyrovnávacej pamäte - + Sound Card Buffer Delay Oneskorenie vyrovnávacej pamäte zvukovej karty - + The buffer setting is therefore a trade-off between audio quality and overall delay. Nastavenie vyrovnávacej pamäte je preto kompromisom medzi kvalitou zvuku a celkovým oneskorením. - + Sound card driver settings Nastavenia ovládača zvukovej karty - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. Pre každý %1 vstupný/výstupný kanál (ľavý a pravý kanál) môžete vybrať iný kanál zvukovej karty. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Zapne podporu pre veľmi malé sieťové audio pakety. Takéto sieťové pakety sa v skutočnosti použijú iba vtedy, ak je veľkosť buffera zvukovej karty menšia ako %1 vzoriek. Čím je menšia vyrovnávacia pamäť siete, tým je nižšia latencia zvuku. Zároveň tým však rastie zaťaženie siete a pravdepodobnosť výpadkov zvuku a vzniku artefaktov. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Týmto otvoríte nastavenia ovládača vašej zvukovej karty. Niektoré ovládače Vám umožnia zmeniť nastavenia vyrovnávacej pamäte, iné, ako napríklad ASIO4ALL, umožňujú vybrať vstupy alebo výstupy vášho zariadenia (zariadení). Viac informácií nájdete na stránke jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Otvorí nastavenia ovládača. Poznámka: %1 aktuálne podporuje iba zariadenia so vzorkovacou frekvenciou %2 Hz. Nebudete môcť vybrať ovládač/zariadenie, ktoré to nepodporujú. Viac informácií nájdete na jamulus.io. - + 128 samples setting radio button Prepínač nastavenia 128 vzoriek - + 256 samples setting radio button Prepínač nastavenia 256 vzoriek - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Vyberte štýl ukazovateľa pre ukazovatele úrovne. Možnosti Paličky (úzke) a Diódy (okrúhle, malé) platia len pre mixér. Ak vyberiete Paličky (úzke), vstupné ukazovatele sa nastavia na Paličky (široké). Ak vyberiete Diódy (okrúhle, malé), vstupné ukazovatele sa nastavia na Diódy (okrúhle, veľké). Ostatné možnosti platia pre mixér aj vstupné ukazovatele. - + Language Jazyk - + Select the language to be used for the user interface. Vyberte jazyk, ktorý sa použije v používateľskom rozhraní. - + Language combo box Výberové okno jazyka - + and a - + Input Boost Zosilnenie vstupu - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Toto nastavenie vám umožní zvýšiť úroveň vstupného signálu až 10-násobne (+20 dB). Ak je váš zvuk príliš tichý, skúste najskôr zvýšiť hlasitosť priblížením sa k mikrofónu, nastavením zvukového zariadenia alebo zvýšením úrovne v systémových nastaveniach vstupu. Iba ak to nepomôže, nastavte násobič zosilnenia. Ak je zvuk príliš hlasný, skreslený alebo dochádza k jeho orezaniu, táto možnosť nepomôže. Nepoužívajte ju. Stále bude dochádzať ku skresleniu. Namiesto toho znížte úroveň vstupu vzdialením sa od mikrofónu, nastavením zvukového zariadenia alebo znížením úrovne v systémových nastaveniach vstupu. - + Input Boost combo box Výberové okno zosilnenia vstupu - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Ak chcete pridať ďalšie adresáre do rozbaľovacej ponuky Pripojenia, dodatočné adresy môžete vložiť sem.<br> - + Delete custom directory button Tlačidlo na vymazanie vlastného adresára - + Delete Custom Directory Vymazať vlastný adresár - + Click the button to delete the currently selected custom directory. Kliknite na tlačidlo na vymazanie aktuálne vybraného adresára. - + Bar (narrow) Paličky (úzke) - + Bar (wide) Paličky (široké) - + LEDs (stripe) Diódy (pás) - + LEDs (round, small) Diódy (okrúhle, malé) - + LEDs (round, big) Diódy (okrúhle, veľké) - + Audio Device Zvukové zariadenie - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. V operačnom systéme Windows môžete vybrať ovládač ASIO (zvukovej karty) pomocou %1. Ak vybraný ovládač ASIO nie je platný, zobrazí sa chybové hlásenie a obnoví sa predchádzajúci platný ovládač. V macOS môžete vybrať vstupný a výstupný hardvér. - + Three buffer sizes can be selected Môžete si vybrať medzi tromi nastaveniami veľkosti vyrovnávacej pamäte - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 vzoriek: Poskytuje najnižšiu latenciu, ale nefunguje so všetkými zvukovými kartami. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 vzoriek: Mali by ste použiť iba vtedy, ak vám vyrovnávacia pamäť o veľkosti 64 alebo 128 spôsobuje problémy. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Niektoré ovládače zvukovej karty neumožňujú zmeniť oneskorenie vyrovnávacej pamäte zo %1. V takom prípade je nastavenie oneskorenia zakázané a musíte ho zmeniť priamo v ovládači. Pre nastavenie veľkosti vyrovnávacej pamäte použite príslušný nástroj pre dané rozhranie. Napríklad pri ASIO použite tlačidlo „Nastavenia zariadenia ASIO“ na otvorenie nastavení ovládača, pri JACK použite nástroj ako QjackCtl. Iné rozhrania, ako Pipewire, vyžadujú použitie ich vlastných nástrojov. Preštudujte si manuál pre dané rozhranie. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Ak nie je vybraná žiadna veľkosť vyrovnávacej pamäte a všetky nastavenia sú neaktívne, znamená to, že veľkosť vyrovnávacej pamäte, ktorý používa ovládač nesedí s hodnotami. %1 bude s týmito nastavenia fungovať, ale výkon môže byť nižší. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Skutočné oneskorenie vyrovnávacej pamäte má vplyv na pripojenie, aktuálnu rýchlosť odosielania a celkové oneskorenie. Čím nižšia je veľkosť vyrovnávacej pamäte, tým vyššia je pravdepodobnosť , že indikátor stavu bude červený (výpadky) a tým vyššia je rýchlosť odosielania a nižšie celkové oneskorenie. - + Meter Style Štýl ukazovateľa - + Meter Style combo box Výberové okno štýlu ukazovateľa - + Custom Directories Vlastné adresáre - + Custom Directories combo box Výberové okno vlastných adresárov - + Audio Upstream Rate Rýchlosť odosielania zvuku - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Závisí od aktuálnej veľkosti audio paketu a nastavenia kompresie. Uistite sa, že rýchlosť odosielania nie je vyššia ako vaša dostupná rýchlosť odosielania internetu (skontrolujte ju pomocou služby ako je napr. speedtest.net). - + Number of Mixer Panel Rows Počet riadkov panela s mixérom - + Adjust the number of rows used to arrange the mixer panel. Upravte množstvo riadkov na paneli mixéra. - + Number of Mixer Panel Rows spin box Číselný vstup počtu riadkov panela mixéra - + Feedback Protection Ochrana pred spätnou väzbou - + Prevents acoustic feedback between microphone and speakers. Zabraňuje vzniku spätnej väzby medzi mikrofónom a reproduktormi. - + Feedback Protection check box Zaškrtávacie pole ochrany pred spätnou väzbou - + Audio Alerts Zvukové upozornenia - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Spustiť zvukové upozornenie pri prijatí správy v chate a pri pripojení nového klienta. Pre prehratie upozornenia môže byť potrebné ďalšie zariadenie zvuku. - + Audio Alerts check box Prepínač zvukových upozornení - + Enable/disable MIDI-in port Zapnúť/vypnúť port MIDI-in - + MIDI-in port check box Prepínač portu MIDI-in - + Pick-up Mode Režim Pick-up - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. Keď je zapnutý, MIDI posuvník a ovládač panorámovania budú čakať, kým poloha fyzického ovládača nebude zodpovedať aktuálnej hodnote v softvéri. Tým predídete náhlym skokom, kedy nemusí byť fyzický ovládač synchronizovaný so softvérovým ovládačom. - + Pick-up Mode check box Prepínač režimu Pick-up - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. Vyberte, ku ktorému výstupnému portu MIDI sa chcete pripojiť. Jamulus automaticky pripojí svoj vstupný port MIDI k vybranému zariadeniu, keď ho zapnete. Môžete tiež použiť správcu pripojení podľa vášho výberu na ručnú zmenu pripojení. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. Vyberte, ku ktorému zdroju MIDI sa chcete pripojiť. Jamulus automaticky pripojí svoj vstupný port MIDI k vybranému zariadeniu, keď ho zapnete. Môžete tiež použiť Audio MIDI Setup na ručnú zmenu pripojení. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. Vyberte, ktoré vstupné MIDI zariadenie(a) má Jamulus počúvať. Vyberte „Všetky zariadenia“ pre príjem MIDI zo všetkých pripojených zariadení alebo zvoľte konkrétne zariadenie. - + MIDI input device combo box Výberové okno vstupného MIDI zariadenia - + MIDI controller settings Nastavenia MIDI ovládača - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. Existuje jeden globálny parameter kanálu MIDI (0-16) a dva parametre, ktoré môžete nastaviť pre každú ovládanú položku: Prvý MIDI CC a potom po sebe nasledujúce čísla CC (počet). Najprv nastavte kanál, ktorý má Jamulus počúvať (0 pre všetky kanály). Potom pre každú položku, ktorú chcete ovládať (posuvník hlasitosti, panorámovanie, sólo, stíšenie), nastavte prvý MIDI CC (číslo CC od ktorého má začať) a počet po sebe nasledujúcich čísel CC (počet). Výnimkou je parameter „Stíšiť ma“ - vyžaduje len jedno číslo CC, keďže sa aplikuje len na vlastný zvukový tok. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. Môžete buď zadať hodnoty MIDI CC ručne alebo použiť tlačidlo „Naučiť sa“: kliknite na „Naučiť sa“, pohnite posuvníkom/gombíkom/tlačidlom na vašom MIDI ovládači a číslo MIDI CC sa deteguje a uloží. - + MIDI channel combo box Výberové okno kanálu MIDI - + Mute Myself MIDI CC number spin box Číselný vstup čísla MIDI CC pre Stíšiť ma - + Fader offset spin box Číselný vstup odsadenia posuvníka - + Pan offset spin box Číselný vstup odsadenia panorámovania - + Solo offset spin box Číselný vstup odsadenia sóla - + Mute offset spin box Číselný vstup odsadenia stíšenia - + Mute Myself MIDI learn button Tlačidlo MIDI Naučiť sa pre Stíšiť ma - + Fader offset MIDI learn button Tlačidlo MIDI Naučiť sa pre odsadenie posuvníka - + Pan offset MIDI learn button Tlačidlo MIDI Naučiť sa pre odsadenie panorámovania - + Solo offset MIDI learn button Tlačidlo MIDI Naučiť sa pre odsadenie sóla - + Mute offset MIDI learn button Tlačidlo MIDI Naučiť sa pre odsadenie stíšenia - + + Max + + + + Fancy Efektný - + Compact Kompaktný - - - - + + + + None Nenastavené - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Sem napíšte vaše meno alebo prezývku, aby ostatní hudobníci vedeli, s kým majú tú česť. Rovnako môžete pridať obrázok hudobného nástroja, na ktorý hráte a vlajku krajiny alebo regiónu, v ktorej/om sa nachádzate. Je možné pridať aj mesto a úroveň vašej hry na hudobný nástroj. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. To, čo sem napíšete sa zobrazí pri vašom posuvníku na mixéri po tom, ako sa pripojíte k serveru %1. Táto menovka sa rovnako zobrazí každému klientovi, ktorý sa pripojí k tomu istému serveru ako vy. - + Country/region flag button Tlačidlo s vlajkou krajiny/regiónu - - + + Could not open MIDI port Nepodarilo sa otvoriť port MIDI - + No MIDI devices found. Please connect a MIDI device and try again. Nenašli sa žiadne MIDI zariadenia. Pripojte MIDI zariadenie a skúste to znova. - + Please check your OS configuration. Skontrolujte, prosím, nastavenie operačného systému. - + Center Stred - + R P - + Learn Naučiť sa - - + + All Devices Všetky zariadenia - + No device connected Žiadne zariadenie nie je pripojené - - + + MIDI Device Not Found MIDI zariadenie sa nenašlo - + The MIDI device "%1" could not be found. Using all available devices instead. MIDI zariadenie „%1“ sa nepodarilo nájsť. Namiesto toho sa použijú všetky dostupné zariadenia. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. MIDI zariadenie „%1“ momentálne nie je dostupné. Vyberte iné zariadenie z rozbaľovacieho zoznamu. - - + + MIDI Device Connection Failed Pripojenie k MIDI zariadeniu zlyhalo - + Could not connect to MIDI device "%1". Please check your OS configuration. Nepodarilo sa pripojiť k MIDI zariadeniu „%1“. Skontrolujte, prosím, nastavenie operačného systému. - + Could not connect to MIDI device "%1". Please check that the device is available. Nepodarilo sa pripojiť k MIDI zariadeniu „%1“. Skontrolujte, prosím, či je zariadenie dostupné. - + Listening... Počúvam... - + Audio Channels Zvukové kanály - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. režim zvýši rýchlosť prenosu dát streamu. Uistite sa, že rýchlosť odosielania neprekračuje dostupnú rýchlosť odosielania vášho internetového pripojenia. - + Audio channels combo box Výberové okno zvukových kanálov - + Audio Quality Kvalita zvuku - + Audio quality combo box Výberové okno kvality zvuku - + New Client Level Úroveň pre nových klientov - + New client level edit box Vstupné pole úrovne nových klientov - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Ak sa používa ovládač ASIO4ALL, upozorňujeme, že tento ovládač zvyčajne pridáva cca 10-30 ms dodatočného oneskorenia zvuku. Odporúča sa preto používať zvukovú kartu s natívnym ovládačom ASIO. - - - + + + &Close &Zavrieť - + Local Audio Input Fader Miestny posuvník zvukového vstupu - - + + L L - + Local audio input fader (left/right) Miestny posuvník zvukového vstupu (ľavý/pravý) - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Ak vybrané zvukové zariadenie ponúka viac ako jeden vstupný alebo výstupný kanál, zobrazia sa nastavenia Mapovania vstupných kanálov a Mapovania výstupných kanálov. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Nastavenie oneskorenia vyrovnávacej pamäte je základným nastavením %1. Toto nastavenie má vplyv na mnohé vlastnosti pripojenia. - + 64 samples setting radio button Prepínač nastavenia 64 vzoriek - + ASIO Device Settings push button Tlačidlo nastavení zariadenia ASIO - - + + Mono Mono - + Mono-in/Stereo-out Mono-dnu/Stereo-von - - - + + + Stereo Stereo - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Ovláda relatívne úrovne ľavého a pravého lokálneho zvukového kanála. Pre monofónny signál slúži na posun medzi dvoma kanálmi. Napríklad, ak je mikrofón pripojený k pravému vstupnému kanálu a nástroj k ľavému vstupnému kanálu, ktorý je oveľa hlasnejší ako mikrofón, posuňte posuvník zvuku smerom, kde štítok nad posuvníkom zobrazuje %1, kde %2 je aktuálny ukazovateľ útlmu. - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Vyrovnávacia pamäť chvenia kompenzuje časové výkyvy siete a zvukovej karty. Veľkosť vyrovnávacej pamäte teda ovplyvňuje kvalitu zvukového toku (počet výpadkov) a celkové oneskorenie (čím dlhšia vyrovnávacia pamäť, tým vyššie oneskorenie). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Veľkosť vyrovnávacej pamäte chvenia môžete nastaviť ručne pre miestneho klienta aj vzdialený server. Pre miestnu vyrovnávaciu pamäť chvenia sú výpadky zvukového toku indikované farbou pod posuvníkmi veľkosti vyrovnávacej pamäte. Pri červenej došlo k pretečeniu/podtečeniu vyrovnávacej pamäte a zvukový tok bol prerušený. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Ak je zapnuté automatické nastavenie, vyrovnávacie pamäte chvenia miestneho klienta a vzdialeného servera sa nastavia automaticky na základe meraní časových výkyvov siete a zvukovej karty. Ak je zapnuté Auto, posuvníky veľkosti vyrovnávacej pamäte sú zakázané (nemožno ich pohybovať myšou). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Ak je zapnuté automatické nastavenie, sieťové vyrovnávacie pamäte miestneho klienta a vzdialeného servera sa nastavia na konzervatívnu hodnotu, aby sa minimalizovala pravdepodobnosť výpadkov zvuku. Na doladenie oneskorenia/latencie zvuku sa odporúča vypnúť automatické nastavenie a ručne znižovať veľkosť vyrovnávacej pamäte pomocou posuvníkov, kým nedosiahnete subjektívne prijateľné množstvo výpadkov. Indikátor LED zobrazí výpadky zvuku miestnej vyrovnávacej pamäte červenou farbou. - + 128 samples: Should work for most available sound cards. 128 vzoriek. Malo by fungovať pre väčšinu dostupných zvukových kariet. - + Skin Vzhľad - + Select the skin to be used for the main window. Vyberte vzhľad, ktorý sa aplikuje na hlavné okno programu. - + Skin combo box Výberové okno vzhľadu - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Vyberie počet zvukových kanálov, ktoré sa použijú na komunikáciu medzi klientom a serverom. Sú dostupné tri režimy: - + These modes use one and two audio channels respectively. Tieto režimy používajú jeden, resp. dva zvukové kanály. - + Mono in/Stereo-out Mono dnu/Stereo von - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Zvukový signál odoslaný na server je mono, ale návratový signál je stereo. Je to užitočné, ak má zvuková karta nástroj na jednom vstupnom kanáli a mikrofón na druhom. V takom prípade možno oba vstupné signály zmiešať do jedného mono kanála, ale mix zo servera sa prehrá v režime stereo. - + Enabling Zapnutím - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. V stereo streamovacom režime nebude dostupný výber zvukového kanála pre efekt ozveny v hlavnom okne, pretože efekt sa v tomto prípade aplikuje na oba kanály. - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Čím vyššia je kvalita zvuku, tým vyššia je rýchlosť prenosu dát zvukového streamu. Uistite sa, že rýchlosť odosielania neprekračuje dostupnú šírku pásma vášho internetového pripojenia. - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Toto nastavenie definuje úroveň posuvníka nového pripojeného klienta v percentách. Ak sa nový klient pripojí k aktuálnemu serveru, dostane zadanú počiatočnú úroveň posuvníka, pokiaľ nie je uložená iná úroveň z predchádzajúceho pripojenia tohto klienta. - + ASIO Device Settings Nastavenia zariadenia ASIO - + Low Nízka - - + + Normal Normálna - + High Vysoká - + Custom Vlastný - + Any Genre 2 Ľubovoľný žáner 2 - Any Genre 3 - Ľubovoľný žáner 3 + Ľubovoľný žáner 3 + + + + Any Genre Asia + - + Genre Rock Žáner Rock - + Genre Jazz Žáner Jazz - + Genre Classical/Folk Žáner Klasika/Folk - + Genre Choral/Barbershop Žáner Zbor/Barbershop - + Any Genre 1 Ľubovoľný žáner 1 - + Musician Profile Profil hudobníka - + Alias or name edit box Vstupné pole prezývky alebo mena - + Instrument picture button Tlačidlo s obrázkom hud. nástroja - + City edit box Vstupné pole mesta - + Skill level combo box Výberové okno úrovne zručnosti - + Beginner Začiatočník - + Intermediate Pokročilý - + Expert Expert - - + + Size: Veľkosť: - + Buffer Delay Oneskorenie vyr. pamäte - + Buffer Delay: Oneskorenie buffera: - + Drum Set Bicie - + Djembe Djembe - + Electric Guitar Elektrická gitara - + Acoustic Guitar Akustická gitara - + Bass Guitar Basová gitara - + Keyboard Keyboard - + Synthesizer Syntetizátor - + Grand Piano Koncertné krídlo - + Accordion Akordeón - + Vocal Vokály - + Microphone Mikrofón - + Harmonica Ústna harmonika - + Trumpet Trúbka - + Trombone Trombón - + French Horn Lesný roh - + Tuba Tuba - + Saxophone Saxofón - + Clarinet Klarinet - + Flute Flauta - + Violin Husle - + Cello Violončelo - + Double Bass Kontrabas - + Recorder Rekordér - + Streamer Streamovač - + Listener Poslucháč - + Guitar+Vocal Gitara+Vokály - + Keyboard+Vocal Klávesnica+Vokály - + Bodhran Bodhran - + Bassoon Fagot - + Oboe Hoboj - + Harp Harfa - + Viola Viola - + Congas Kongy - + Bongo Bongo - + Vocal Bass Basové vokály - + Vocal Tenor Tenorové vokály - + Vocal Alto Altové vokály - + Vocal Soprano Sopránové vokály - + Banjo Bendžo - + Mandolin Mandolína - + Ukulele Ukulele - + Bass Ukulele Basové ukulele - + Vocal Baritone Barytónové vokály - + Vocal Lead Hlavný spev - + Mountain Dulcimer Horský dulcimer - + Scratching Skrečing - + Rapping Repovanie - + Vibraphone Vibrafón - + Conductor Dirigent @@ -2508,117 +2517,117 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CConnectDlg - + Directory Adresár - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Zobrazí servery uvedené vo vybranom adresári. V pokročilých nastaveniach môžete pridať vlastné adresáre. - + Directory combo box Výberové okno adresára - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtruje zoznam serverov podľa zadaného textu. Všimnite si, že filter neberie ohľad na veľkosť písmen. Samostatný znak # zobrazí iba servery, ku ktorému je pripojená aspoň jedna osoba. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Zrušte začiarknutie pre skrytie zoznamu serverov a zobrazenie iba detailov o serveri. Začiarknite pre zobrazenie všetkých hudobníkov na serveroch. - + Server List Zoznam serverov - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. V okne Parametre pripojenia sú uvedené servery registrované vo vybranom adresári. Pomocou rozbaľovacieho zoznamu Adresár zmeňte adresár, nájdite server, ku ktorému sa chcete pripojiť, kliknite naň a potom kliknite na tlačidlo Pripojiť. Prípadne dvakrát kliknite na názov servera. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Stále servery (tie, ktoré sú v zozname dlhšie ako 48 hodín) sú zobrazené tučným písmom. - + You can add custom directories in Advanced Settings. V pokročilých nastaveniach môžete pridať vlastné adresáre. - + Server list view Okno so zoznamom serverov - + Server Address Adresa servera - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Ak poznáte adresu servera, môžete sa k nemu pripojiť pomocou poľa Názov/adresa servera. Prípadne môžete za adresu servera pridať číslo portu oddelené dvojbodkou, napr. %1. Pole tiež zobrazí zoznam naposledy použitých adries serverov. - + Holds the current server address. It also stores old addresses in the combo box list. Obsahuje aktuálnu adresu servera. Staré adresy uchováva v zozname výberového okna. - + Delete server address button Tlačidlo na vymazanie adresy servera - + Delete Server Address Vymazať adresu servera - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Kliknite na tlačidlo pre vyčistenie aktuálne vybranej adresy servera a jej vymazanie zo zoznamu uložených serverov. - + Ping Ping - + Server address edit box Vstupné pole adresy servera - + Filter Filter - + Filter edit box Vstupné pole filtra - + Show All Musicians Zobraziť všetkých hudobníkov - + Show all musicians check box Zaškrtávacie políčko Zobraziť všetkých hudobníkov - + Filter text, or # for occupied servers Filtrujte podľa textu alebo # pre obsadené servery @@ -2689,43 +2698,43 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CHelpMenu - + &Help Po&mocník - - + + Getting &Started... &Začíname... - + Software &Manual... &Manuál programu... - + What's &This Čo j&e toto - + P&rivacy policy... Zo&brazenie zásad ochrany osobných údajov... - + &About Jamulus... &O programe Jamulus... - + About &Qt... O &Qt... - + About Qt O Qt @@ -2733,12 +2742,12 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CLanguageComboBox - + Restart Required Vyžadovaný reštart - + Please restart the application for the language change to take effect. Aby sa zmeny nastavenia jazyku prejavili, musíte reštartovať aplikáciu. @@ -2746,22 +2755,22 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Tento server od vás pred pripojením vyžaduje akceptovanie podmienok. Prosím, prečítajte si ich v okne chatu. - + I have read the conditions and &agree. Prečítal som si podmienky a &akceptujem ich. - + Accept Akceptovať - + Decline Odmietnuť @@ -2769,17 +2778,17 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CMultiColorLED - + Red Červená - + Yellow Žltá - + Green Zelená @@ -2787,7 +2796,7 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CMusProfDlg - + No Name Bez názvu @@ -2795,448 +2804,448 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CServerDlg - + Client List Zoznam klientov - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. Zoznam klientov zobrazuje všetkých klientov, ktorí su momentálne pripojení k serveru. Pri každom klientovi sú zobrazené dodatočné informácie, ako napr. IP adresa a meno. - + Connected clients list view Zoznam pripojených klientov - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Adresár:</b> Vyberte „%1“, ak nechcete registrovať váš server v adresári.<br>Alebo vyberte jeden zo žánrov pre registráciu v príslušnom adresári.<br>Alebo vyberte „%2“ a zadajte adresu vlastného adresára na karte Nastavenia pre registráciu vo vlastnom adresári.<br><br>Pre akúkoľvek hodnotu okrem „%1“ sa tento server zaregistruje v adresári, takže používateľ %3 môže vybrať tento server v zozname serverov v dialógovom okne pripojenia, keď zvolí daný adresár.<br><br>Registrácia servera sa pravidelne obnovuje, aby sa zabezpečilo, že všetky servery v zozname sú skutočne dostupné. - + When checked, the recorder will run while a session is in progress (if set up correctly). Ak je začiarknuté, nahrávač bude bežať počas sedenia (ak je správne nastavený). - + Recording has been switched off by the UI checkbox or JSON-RPC. Nahrávanie bolo vypnuté zaškrtávacím políčkom alebo volaním JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. Nahrávanie bolo vypnuté zaškrtávacím políčkom, spracovaním signálu SIGUSR2 alebo volaním JSON-RPC. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Kliknite na tlačidlo pre otvorenie dialógového okna, ktoré vám umožní vybrať hlavný adresár pre nahrávky. Vybraná hodnota musí existovať a mať práva na zápis (umožniť vytváranie podadresárov používateľovi, pod ktorým beží %1). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Aktuálna hodnota hlavného adresára pre nahrávky. Vybraná hodnota musí existovať a mať práva na zápis (umožniť vytváranie podadresárov používateľovi, pod ktorým beží %1). Kliknite na tlačidlo pre otvorenie dialógového okna, ktoré vám umožní vybrať hlavný adresár pre nahrávky. - + Custom Directory address Adresa vlastného adresára - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. Adresa vlastného adresára je adresa, na ktorej sa nachádza adresár so zoznamom serverov, do ktorého sa má tento server pridať. - + Server List Filename dialog push button Tlačidlo pre výber súboru zoznamu serverov - - + + Server List Filename Meno súboru so zoznamom serverov - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Kliknite na tlačidlo pre otvorenie dialógového okna na nastavenie názvu súboru pre uloženie zoznamu serverov. Používateľ, pod ktorým beží %1, musí mať možnosť vytvoriť zadaný súbor, aj keď môže už existovať (pri uložení bude prepísaný). - + Server List Filename text box (read-only) Textové pole názvu súboru so zoznamom serverov (iba na čítanie) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Aktuálny reťazec s názvom súboru pre uloženie zoznamu serverov. Používateľ, pod ktorým beží %1, musí mať možnosť vytvoriť zadaný súbor, aj keď môže už existovať (pri uložení bude prepísaný). Kliknite na tlačidlo pre otvorenie dialógového okna na nastavenie názvu súboru. - + Clear the server list file name button Tlačidlo na vyčistenie názvu súboru so zoznamom serverov - + Clear Server List Filename Vyčistiť názov súboru so zoznamom serverov - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Kliknite na tlačidlo pre vyčistenie aktuálne vybraného názvu súboru pre uloženie zoznamu serverov. Tým sa zastaví ukladanie zoznamu serverov, kým nebude vybraná nová hodnota. - + Start Minimized on Operating System Start Spustiť minimalizované pri štarte operačného systému - + Register Server Status Stav registrácie servera - + Server Name Názov servera - + Server name line edit Vstupné pole názvu servera - + Location City Umiestnenie/mesto - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. Tu môžete nastaviť, v ktorom meste sa server nachádza. Ak je mesto zadané, zobrazí sa klientom v okne so zoznamom serverov. - + City where the server is located line edit Vstupné pole mesta, kde sa server nachádza - + Display dialog to select recording directory button Tlačidlo pre zobrazenie dialógového okna pre výber adresára pre nahrávky - - + + Main Recording Directory Hlavný adresár na nahrávanie - + Main recording directory text box (read-only) Textové pole hlavného adresára pre nahrávky (iba na čítanie) - + Clear the recording directory button Tlačidlo na vyčistenie adresára pre nahrávky - + Clear Recording Directory Vyčistiť adresár pre nahrávky - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Kliknite na tlačidlo pre vyčistenie aktuálne vybraného adresára pre nahrávky. Tým sa zastaví nahrávanie, kým nebude vybraná nová hodnota. - + Checkbox to turn on or off server recording Prepínač zapnutia/vypnutia nahrávania servera - + Jam Recorder Nahrávanie džemov - + Current session directory text box (read-only) Textové pole aktuálneho adresára sedenia (iba na čítanie) - + Current Session Directory Aktuálny adresár sedenia - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Zapnuté počas nahrávania a obsahuje aktuálny adresár nahrávaného sedenia. Vypnuté po nahrávaní alebo keď nahrávač nie je zapnutý. - + Recorder status label Štítok stavu nahrávača - + Directory Type combo box Výberové okno typu adresára - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. Keď je pre Adresár vybraná iná hodnota ako „%1“, zobrazí sa tu, či bola registrácia úspešná. Ak registrácia zlyhala, vyberte, prosím, iný adresár. - + Recorder Status Stav nahrávania - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Nebol nastavený žiadny adresár pre nahrávky alebo hodnota nie je použiteľná. Skontrolujte hodnotu na karte Nastavenia. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Ak adresár pre nahrávky nie je použiteľný, namiesto adresára sedenia sa zobrazí problém. - + Server welcome message edit box Vstupné pole uvítacej správy servera - + Server Welcome Message Uvítacia správa servera - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. Text uvítacej správy servera sa zobrazí v chatovom okne, keď sa hudobník pripojí na server. Ak nie je nastavená žiadna správa, uvítacia správa servera je vypnutá. - + Language Jazyk - + Select the language to be used for the user interface. Vyberte jazyk, ktorý sa použije v rozhraní aplikácie. - + Language combo box Výberové okno jazyka - + Now a directory Teraz je adresárom - + Custom Directory line edit Vstupné pole vlastného adresára - + &Hide %1 server Sk&ryť %1 server - + &Show %1 server Z&obraziť %1 server - + %1 server %1 is the name of the main application %1 server - + Type a message here. If no message is set, the server welcome is disabled. Sem napíšte správu. Ak nie je nastavená žiadna správa, uvítacia správa servera bude vypnutá. - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Nahrávanie sa nepodarilo spustiť. Skontrolujte, prosím, či je na disku dosť miesta a práva na zápis a skúste to znovu. Chyba: - + ERROR CHYBA - + Request new recording button Tlačidlo pre novú nahrávku - + New Recording Nová nahrávka - + During a recording session, the button can be used to start a new recording. Počas nahrávania sedenia môžete použiť toto tlačidlo na spustenie novej nahrávky. - - + + E&xit U&končiť - + Select Main Recording Directory Výber hlavného adresára pre nahrávky - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Ak je zaškrtnuté políčko Spustiť minimalizované pri štarte operačného systému, server sa spustí pri štarte operačného systému a automaticky sa minimalizuje do ikony na paneli úloh. - + The server name identifies your server in the connect dialog server list at the clients. Názov servera identifikuje váš server v zozname serverov v dialógovom okne pripojenia u klientov. - + Country/Region Krajina/Región - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Nastavte krajinu alebo región, kde server beží. Klienti uvidia toto umiestnenie v zozname serverov v ich dialógovom okne pripojenia. - + Combo box for location of this server Výberové okno umiestnenia tohto servera - + Displays the current status of the recorder. The following values are possible: Zobrazuje aktuálny stav nahrávača. Možné hodnoty sú: - + There is no one connected to the server to record. K serveru nie je pripojený nikto, kto by mohol nahrávať. - + The performers are being recorded to the specified session directory. Interpreti sa nahrávajú do zadaného adresára sedenia. - + NOTE POZNÁMKA - + %1 Server %1 is the name of the main application %1 Server - + &Window &Okno - + None Žiadny - + Not registered Neregistrovaný - + Bad address Zlá adresa - + Registration requested Vyžiadaná registrácia - + Registration failed Registrácia zlyhala - + Check server version Skontrolovať verziu servera - + Registered Registrovaný - + Server list full at directory Zoznam serverov v adresári je plný - + Your server version is too old Verzia vášho servera je príliš stará - + Requirements not fulfilled Požiadavky nie sú splnené - + Unknown value %1 Neznáma hodnota %1 - + Not initialised Neinicializované - + Not enabled Nie je zapnuté - + Not recording Nenahráva sa - + Recording Nahráva sa @@ -3360,32 +3369,32 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CServerListManager - + Now a directory Teraz je adresárom - + No longer a directory Už nie je adresárom - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Nepodarilo sa otvoriť „%1“ na čítanie/zápis. Skontrolujte, prosím, či má %2 oprávnenie (a či je dostatok voľného miesta). - + Loading persistent server list file: %1 Načítanie trvalého súboru so zoznamom serverov: %1 - + Could not write to '%1' Nepodarilo sa zapísať do '%1' - + Saving registration for %1 (%2): %3 Ukladanie registrácie pre %1 (%2): %3 @@ -3393,68 +3402,68 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CSound - + Error requesting stream stop: $s Chyba pri požiadavke na zastavenie streamu: $s - + Error closing stream: $s Chyba pri zatváraní streamu: $s - + The selected audio device is no longer present in the system. Please check your audio device. Vybrané zvukové zariadenie už nie je v systéme dostupné. Prosím, skontrolujte ho. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Nepodarilo sa inicializovať audio ovládač. Skontrolujte, či je váš zvukový hardvér zapojený a preverte nastavenia ovládača. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Vybrané zvukové zariadenie je nekompatibilné, pretože nepodporuje vzorkovaciu frekvenciu %1 Hz. Prosím, vyberte iné zariadenie. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. Aktuálna konfigurácia zvukového zariadenia nie je kompatibilná, pretože nepodporuje vzorkovaciu frekvenciu %2 Hz. Prosím skontrolujte, či neexistuje hardvérový prepínač alebo nastavenie ovládača, ktoré umožní nastaviť vzorkovaciu frekvenciu manuálne a reštartujte %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Vybrané zvukové zariadenie nie je kompatibilné, pretože nepodporuje %1 vstupných/výstupných kanálov. Prosím, vyberte iné zariadenie alebo konfiguráciu. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Vybrané zvukové zariadenie nie je kompatibilné, pretože vybraný formát vzorkovania nie je dostupný. Vyberte, prosím, iné zariadenie. - + No ASIO audio device driver found. Nebol nájdený zvukový ovládač ASIO. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Pred spustením %1 prosím nainštalujte ovládač ASIO. Ak vlastníte zariadenie s podporou ASIO, nainštalujte jeho oficiálny ovládač ASIO. Ak nie, budete musieť nainštalovať univerzálny ovládač ako ASIO4ALL. - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. Server JACK sa nepodarilo spustiť automaticky. Prosím, spustite JACK server ručne a skontrolujte chybové hlásenia. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. Server JACK nebeží na vzorkovacej frekvencii <b>%1 Hz</b>. Prosím, použite nástroj ako je <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> a nastavte v ňom vzorkovaciu frekvenciu servera JACK na %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. Chyba pri registrovaní portu JACK. Pravdepodobne sa jedná o chybu servera JACK. Prosím, zastavte %1 a následne aj JACK server. Potom sa presvedčte, či sa k JACK server dokáže pripojiť iný program pri použití vzorkovacej frekvencie %2 Hz. @@ -3463,62 +3472,62 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro Chyba pri registrovaní portu JACK. Pravdepodobne sa jedná o chybu servera JACK. Prosím, zastavte %1 a následne aj JACK server. Potom sa presvedčte, či sa k JACK server dokáže pripojiť iný program MIDI. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Nie je možné aktivovať klienta JACK. Pravdepodobne sa jedná o chybu JACK. Skontrolujte, prosím, výstup servera JACK. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. Server JACK bol vypnutý. %1 vyžaduje, aby bol JACK spustený. Prosím, reštartujte %1, aby sa JACK opäť spustil. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. V systéme nie je žiadna dostupná zvuková karta. Volanie AudioHardwareGetProperty vstupu CoreAudio skončilo s chybou. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. V systéme nie je žiadna dostupná zvuková karta. Volanie AudioHardwareGetProperty výstupu CoreAudio skončilo s chybou. - + The currently selected audio device is no longer present. Please check your audio device. Vybrané zvukové zariadenie už nie je v systéme dostupné. Prosím, skontrolujte ho. - + The audio input device is no longer available. Please check if your input device is connected correctly. Vybrané zvukové zariadenie pre vstup už nie je v systéme dostupné. Prosím, skontrolujte, či je vaše zariadenie správne pripojené. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Vzorkovacia frekvencia aktuálneho vstupného zariadenia nie je %1 Hz, a preto nie je kompatibilná. Vyberte, prosím, iné zariadenie alebo skúste nastaviť vzorkovaciu frekvenciu na %1 Hz ručne cez Audio-MIDI-Setup (v Aplikácie→Utility). - + The audio output device is no longer available. Please check if your output device is connected correctly. Vybrané zvukové zariadenie pre výstup už nie je dostupné. Prosím, skontrolujte, či je vaše zariadenie správne pripojené. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Vzorkovacia frekvencia aktuálneho výstupného zariadenia nie je %1 Hz, a preto nie je kompatibilná. Vyberte, prosím, iné zariadenie alebo skúste nastaviť vzorkovaciu frekvenciu na %1 Hz ručne cez Audio-MIDI-Setup (v Aplikácie→Utility). - + The stream format on the current input device isn't compatible with this software. Please select another device. Formát streamu aktuálneho vstupného zariadenia nie je kompatibilný s týmto softvérom. Vyberte, prosím, iné zariadenie. - + The stream format on the current output device isn't compatible with %1. Please select another device. Formát streamu aktuálneho výstupného zariadenia nie je kompatibilný s %1. Vyberte, prosím, iné zariadenie. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Veľkosti vyrovnávacej pamäte aktuálnych vstupných a výstupných zvukových zariadení nie je možné nastaviť na spoločnú hodnotu. Vyberte, prosím, iné vstupné/výstupné zariadenia v nastaveniach systému. @@ -3526,27 +3535,27 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Nie je možé použiť vybrané zvukové zariadenie kvôli nasledujúcej chyba: %1 Bude vybraný predchádzajúci ovládač zvuku. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. V minulosti vybrané zvukové zariadenia už nie je dostupné alebo sa zmenili vlastnosti ovládača zvuku tak, že už nie sú kompatibilné. Teraz sa pokúsime nájsť platné zvukové zariadenie, ale toto nové zariadenie môže spôsobiť spätnú väzbu. Pred pripojením sa k serveru preto skontrolujte nastavenia zvukového zariadenia. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 nemohol nájsť použiteľné zariadenie zvuku %2.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Možno budete vedieť opraviť chyby v nastaveniach ovládača. Chcete tieto nastavenia otvoriť teraz? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Nepodarilo sa spustiť %1. Prosím, znovu spustite %1 a skontrolujte/zmeňte nastavenia zvuku. @@ -3554,53 +3563,57 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Verzia %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Vydané pod licenciou GNU General Public License verzie 2 alebo novšej (GPLv2) + Vydané pod licenciou GNU General Public License verzie 2 alebo novšej (GPLv2) - + This app uses the following libraries, resources or code snippets: Tento program používa nasledujúce knižnice, zdroje alebo úryvky kódu: - + Qt cross-platform application framework Multiplatformový aplikačný framework Qt - + (build) (zostavenie) - + (runtime) (runtime) - + Some pixmaps are from the %1 Niektoré ikony sú z %1 - + Some sound samples are from %1 Niektoré zvukové ukážky sú z %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Kód pre ozvenu (reverb): Perry R. Cook a Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Ikony vlajok: Mark James @@ -3608,12 +3621,12 @@ Stíšili sme váš kanál a aktivovali nastavenia 'Stíšiť ma'. Pro global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> Je dostupná aktualizácia %1: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>prejsť na podrobnosti a preberania</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) Pre získanie viac informácii, použite "Čo je toto?" (ponuka pomocníka, pravé tlačidlo myši alebo Shift+F1) diff --git a/src/translation/translation_sv_SE.ts b/src/translation/translation_sv_SE.ts index c72c2ca66a..f44e6671e1 100644 --- a/src/translation/translation_sv_SE.ts +++ b/src/translation/translation_sv_SE.ts @@ -4,132 +4,132 @@ CAboutDlg - + This app enables musicians to perform real-time jam sessions over the internet. Denna applikation gör det möjligt för musiker att spela tillsammans live över Internet. - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. Det finns en server som samlar ljud från varje klient, blandar ljudet och skickar mixen tillbaka till varje klient. - + This app uses the following libraries, resources or code snippets: Denna applikationen använder följande bibliotek, resurser eller kodavsnitt: - + Qt cross-platform application framework Qt cross-platform applikationsramverk - + (build) (build) - + (runtime) (runtime) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Ljudklangskod av Perry R. Cook och Gary P. Scavone - + Flag icons by Mark James Flaggikoner av Mark James - + Some pixmaps are from the %1 Några pixmaps är från %1 - + Some sound samples are from %1 Några ljudklipp är från %1 - + For details on the contributions check out the %1 För detaljer om bidragen kolla in %1 - + Github Contributors list Github's bidragsgivarlista - + Spanish Spanska - + French Franska - + Portuguese Portugisiska - + Dutch Holländska - + Italian Italienska - + German Tyska - + Polish Polska - + Swedish Svenska - + Korean Koreanska - + Slovak Slovakiska - + Simplified Chinese Förenklad kinesiska - + Norwegian Bokmål Norskt bokmål - + Japanese Japanska - + About %1 Cirka %1 @@ -181,12 +181,12 @@ CAnalyzerConsole - + Analyzer Console Analyskonsol - + Error Rate of Each Buffer Size Felhastighet för varje buffertstorlek @@ -194,32 +194,32 @@ CAudioMixerBoard - + Personal Mix at the Server Personlig mix på servern - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. När du är ansluten till en server låter kontrollerna här ställa in din lokala mix utan att påverka vad andra hör från dig. Titeln visar servernamnet och, om det är känt, om den aktivt spelar in. - + Server Server - + T R Y I N G T O C O N N E C T F Ö R S Ö K E R A N S L U T A - + RECORDING ACTIVE INSPELNING AKTIV - + Personal Mix at: %1 Personlig mix på: %1 @@ -227,245 +227,245 @@ CChannelFader - - - + + + Pan Panorera - - - + + + Mute Tyst - - - + + + Solo Solo - + &No grouping &Ingen gruppering - + Assign to group Tilldela grupp - + Channel Level Kanalnivå - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. Visar ljudnivån för fader på denna kanal. Alla klienter som är anslutna till servern tilldelas en ljudnivå och har samma värde för alla klienter. - + Input level of the current audio channel at the server Ingångsnivå för den aktuella ljudkanalen på servern - + Mixer Fader Mixer - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. Justerar ljudnivån på den här kanalen. Alla klienter som är anslutna till servern tilldelas en ljudfader som visas vid varje klient för att justera den lokala mixen. - + Local mix level setting of the current audio channel at the server Lokal mixernivåinställning för den aktuella ljudkanalen på servern - + Status Indicator Statusindikator - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: Visar en statusindikering om klienten som tilldelas denna kanal. Stödjade indikatorer är: - + Speaker with cancellation stroke: Indicates that another client has muted you. Högtalare med streck över visar att en annan klient har stängt av ditt ljud. - + Status indicator label etikett för statusindikator - + Panning Panorering - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. Ställer in panorering från vänster till höger för kanalen. Fungerar endast i stereo eller helst mono in / stereo ut-läge. - + Local panning position of the current audio channel at the server Lokal panoreringsposition för den aktuella ljudkanalen på servern - + With the Mute checkbox, the audio channel can be muted. Med kryssrutan "Stäng av" kan ljudkanalen stängas av. - + Mute button Knapp för att stänga av - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. Med kryssrutan Solo kan ljudkanalen ställas in på solo vilket innebär att alla andra kanaler utom solokanalen är avstängda. Det är möjligt att ställa in mer än en kanal för solo. - + Solo button Soloknapp - + Group Grupp - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. Med kryssrutan Grp kan en grupp ljudkanaler definieras. Alla kanalfadrar i en grupp flyttas i proportionell synkronisering om någon av gruppfadrarna flyttas. - + Group button Gruppknapp - + Fader Tag Panoreringstagg - + Mixer channel instrument picture Mixerkanalens instrumentbild - + Mixer channel label (fader tag) Mixerkanalens etikett (fader) - + PAN PANORERA - + MUTE TYST - + SOLO SOLO - + GRP GRUPP - + M T - + S S - + G G - + Grp Grp - + Alias/Name Alias/Namn - + Instrument Instrument - + Location Plats - - - + + + Skill Level Skicklighetsnivå - + Alias Alias - + Beginner Nybörjare - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. Ovanliggande tagg identifierar den anslutna klienten. Etikettnamnet, en bild av ditt instrument och flaggan för din plats ställas in i huvudfönstret. - + Mixer channel country/region flag Mixerkanalens land/regionsflagga - + Intermediate Mellannivå - + Expert Expert - + Musician Profile Musikerprofil @@ -473,58 +473,58 @@ CChatDlg - + Chat Window Chattfönster - + The chat window shows a history of all chat messages. Chattfönstret visar en historik över alla chattmeddelanden. - + Chat history Chatthistorik - + Input Message Text Skriv meddelandetext - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. Ange chattmeddelandetexten i textrutan och tryck på enter för att skicka meddelandet till servern som distribuerar meddelandet till alla anslutna klienter. Ditt meddelande kommer synas i chattfönstret. - + New chat text edit box Ny redigeringsruta för chatt-text - + Type a message here Skriv ditt meddelande här - + &Edit &Redigera - + Cl&ear Chat History &Rensa chatthistorik - - + + &Close S&täng - + Do you want to open the link '%1' in your browser? Vill du öppna länken '%1' i din webbläsare? @@ -545,254 +545,254 @@ CClientDlg - + Input Level Meter Ingångsnivå - + This shows the level of the two stereo channels for your audio input. Detta visar nivån på de två stereokanalerna för din ljudingång. - + Make sure not to clip the input signal to avoid distortions of the audio signal. Se till att inte klippa insignalen för att undvika en snedvridning av ljudsignalen. - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. Om applikationen är ansluten till en server och du spelar ditt instrument/sjunger in i mikrofonen, bör VU-mätaren röra sig. Om detta inte sker har du antagligen valt fel inmatningskanal (t.ex. 'line in' i stället för mikrofoningången) eller ställt in ingångsförstärkningen för (Windows) för lågt. - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). För korrekt användning av applikationen, bör du inte höra din sång/instrument via högtalaren eller hörlurarna när programvaran inte är ansluten. Det kan uppnås genom att stänga av din ingående ljudkanal i uppspelningsblandaren (inte inspelningsblandaren!). - + Input level meter Ingångsnivåmätare - + Simulates an analog LED level meter. Simulerar en analog LED-nivåmätare. - + Connect/Disconnect Button Knapp för att anslut eller koppla ifrån - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. Öppnar en dialogruta där du kan välja en server att ansluta till. Om du är ansluten avslutar du sessionen genom att trycka på den här knappen. - + Connect and disconnect toggle button Knapp för att anslut och koppla bort - + Reverb effect Reverb effekt - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. Reverb kan tillämpas på en lokal monoljudkanal eller på båda kanalerna i stereoläge. Valet av monokanal och reverbnivån kan ändras. Om till exempel en mikrofonsignal matas in till höger ljudkanal på ljudkortet och en reverb-effekt måste appliceras, ställ in kanalväljaren till höger och flytta fadern uppåt tills önskad reverbnivå har uppnåtts. - + Reverb effect level setting Reverbeffektnivåinställning - + Reverb Channel Selection Reverbkanalval - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. Med dessa tryckknappar kan du välja ljudingångskanalen på vilken reverbeffekten används. Antingen kan vänster eller höger ingångskanal väljas. - + Left channel selection for reverb Vänster kanal för reverb - + Right channel selection for reverb Höger kanal för reverb - + Delay Status LED Fördröjningsstatus-LED - + Shows the current audio delay status: Visar aktuell ljudfördröjningsstatus: - + Green Grön - + The delay is perfect for a jam session. Fördröjningen är perfekt för en jam-session. - + Yellow Gul - + A session is still possible but it may be harder to play. En session är fortfarande möjlig men det kan vara svårare att spela. - + Red Röd - + The delay is too large for jamming. Fördröjningen är troligtvis för stor för en jam-session. - + Delay status LED indicator LED-indikator för fördröjningsstatus - + &MIDI Control Settings... &MIDI -kontrollinställningar... - + %1 Directory %1 Katalog - + The network jitter buffer is not large enough for the current network/audio interface jitter. Nätverksjitterbufferten är inte tillräckligt stor för det nuvarande nätverks-/ljudgränssnittsjitteret. - + The sound card's buffer delay (buffer size) is too small (see Settings window). Ljudkortets buffertfördröjning (buffertstorlek) är för liten (se Inställningsfönstret). - + The upload or download stream rate is too high for your internet bandwidth. Uppladdnings- eller nedladdningsströmmen är för hög för din internethastighet. - + The CPU of the client or server is at 100%. Klientens eller serverns CPU är 100%. - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Ping-tiden är den tid som krävs för ljudströmmen att resa från klienten till servern och tillbaka igen. Denna fördröjning införs av nätverket och bör vara cirka 20-30 ms. Om denna fördröjning är högre än cirka 50 ms är ditt avstånd till servern för stort eller din internetanslutning är inte tillräcklig. - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. Övergripande fördröjning beräknas utifrån den aktuella Ping-tiden och den fördröjning som införts av de aktuella buffertinställningarna. - - + + C&onnect A&nslut - + &File &Arkiv - + &View &Visa - + &Connection Setup... &Anslutningsinställningar... - + My &Profile... Min &profil... - + C&hat... &Chatt... - + &Analyzer Console... Analys&konsol... - + N&o User Sorting Ingen kanals&ortering - + Sort Users by &City Sortera användarna efter &Stad - + Clear &All Stored Solo and Mute Settings &Rensa alla lagrade solo och tystade inställningar - + Auto-Adjust all &Faders Möjligtvis annat ordval skulle vara bättre. Justera alla &mixers automatiskt - + Connect Anslut - + Settings Inställningar - + Chat Chatt - + Enable feedback detection Aktivera återkopplingsdetektering - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -801,128 +801,128 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen lös problemet med ljudåterkopplingen först och slå sedan på dittt ljud igen. - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. Ditt ljudkort fungerar inte korrekt. Öppna inställningar och kontrollera enhetsvalet och drivrutinsinställningarna. - + Ok Okej - + Set All Faders to New Client &Level &Ställ in alla mixers till ny klientnivå - + E&xit A&vsluta - + If this LED indicator turns red, you will not have much fun using %1. Om den här LED-indikatorn blir röd kommer du inte att ha mycket kul med %1. - + Local Jitter Buffer Status LED LED för lokal jitterbufferstatus - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: Statuslampan (LED) för dns lokala jitterbuffert visar aktuell ljud-/strömningsstatus. Om lampan är röd avbryts ljudströmmen. Detta orsakas av ett av följande problem: - + If this LED indicator turns red, the audio stream is interrupted. Om denna LED-indikator blir röd avbryts ljudströmmen. - + Local Jitter Buffer status LED indicator LED-indikator för lokal jitterbufferstatus - + &Load Mixer Channels Setup... &Ladda in mixerkanalinställningarna... - + &Save Mixer Channels Setup... &Spara mixerkanalinställningarna... - + O&wn Fader First &Egen fader först - + Sort Users by Chann&el Sortera användare efter &Kanal - + Sett&ings &Inställningar - + Audio/Network &Settings... Ljud och nätverks&inställningar... - + A&dvanced Settings... A&vancerade inställningar... - + &Edit &Redigera - + Current Connection Status Aktuell anslutningsstatus - + Sort Users by &Name Sortera användarna efter &Namn - + Sort Users by &Instrument Sortera användarna efter &Instrument - + Sort Users by &Group Sortera användarna efter &Grupp - - + + Select Channel Setup File Välj kanalinställningsfil - + user användare - + users användare - + &Disconnect Koppla &ner @@ -1019,1098 +1019,1107 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CClientSettingsDlg - - - + + + &Close &Stäng - + Local Audio Input Fader Lokal ljudingångsfader - - + + L V - + Local audio input fader (left/right) Lokal ljudingångsfader (vänster/höger) - + Jitter Buffer Size Jitterbuffertstorlek - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). Jitterbufferten kompenserar för nätverks- och ljudkortstimning. Storleken på bufferten påverkar därför kvaliteten på ljudströmmen (hur många bortfall som inträffar) och den totala förseningen (ju längre bufferten är, desto högre fördröjning). - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. Jitterbufferten kompenserar för nätverks- och ljudkortets timeing. Storleken på bufferten påverkar därför kvaliteten på ljudströmmen (hur många bortfall som inträffar) och den totala förseningen (ju längre bufferten är, desto högre är fördröjningen). - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. Jitterbuffertinställningen är därför en avvägning mellan ljudkvalitet och total fördröjning. - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). Om Auto-inställningen är aktiverad, ställs jitterbuffertarna för den lokala klienten och fjärrservern in automatiskt baserat på mätningar av nätverkets och ljudkortets timingjitter. Om Auto är aktiverat inaktiveras jitterbuffertstorleken (de kan inte justeras). - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. Om Auto-inställningen är aktiverad ställs nätverksbuffertarna för den lokala klienten och fjärrservern in på ett konservativt värde för att minimera sannorlikheten för ljudbortfall. För att justera ljudfördröjningen/latensen rekommenderas att du inaktiverar Auto-inställningen och att sänka jitterbuffertstorleken manuellt genom att använda reglagen tills din personliga acceptabla mängd bortfall uppnåtts. LED-indikatorn visar ljudavfallet från den lokala jitterbufferten med rött ljus. - + Local jitter buffer slider control Lokalt jitterbuffertreglage - + Server jitter buffer slider control Server jitter buffertreglage - + Auto jitter buffer check box Auto-jitterbuffert kryssruta - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. För varje %1 ingångs-/utgångskanal (vänster- och högerkanal) kan en annan faktisk ljudkortkanal väljas. - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. Möjliggör stöd för mycket små nätverksljudpaket. Dessa nätverkspaket används faktiskt bara om ljudkortets buffertfördröjning är mindre än %1 sampel. Ju mindre nätverksbuffertar, desto lägre ljudfördröjning. Men samtidigt ökar nätverksbelastningen och sannolikheten för ljudavbrott eller ljudartefakter. - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. Inställningen för buffertfördröjning är en grundläggande inställning för %1. Denna inställning påverkar många anslutningsegenskaper. - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. Detta öppnar drivrutinsinställningarna för ditt ljudkort. Vissa drivrutiner låter dig ändra buffertinställningar, andra som ASIO4ALL låter dig välja in- eller utgångar från din enhet(er). Mer information finns på jamulus.io. - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. Öppnar drivrutinsinställningarna. Obs! %1 stöder för närvarande bara enheter med en samplingsfrekvens på %2 Hz. Du kommer inte att kunna välja en drivrutin/enhet som inte gör det. För mer hjälp se jamulus.io. - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. Om drivrutinen väljs under en aktiv anslutning stoppas anslutningen, drivrutinen ändras och anslutningen startas automatiskt igen. - + Sound card device selector combo box Ljudkortsenhetens kombinationsruta - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. Om ASIO4ALL-drivrutinen används, observera att den här drivrutinen vanligtvis introducerar ca. 10-30 ms extra ljudfördröjning. Det rekommenderas därför att använda ett ljudkort med en inbyggd ASIO-drivrutin. - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. Om du använder kX ASIO-drivrutinen, se till att ansluta ASIO-ingångarna på kX DSP-inställningspanelen. - + Sound Card Channel Mapping Ljudkortets kanalval - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. Om den valda ljudkortsenheten erbjuder mer än en ingångs- eller utgångskanal är inställningarna för inmatningskanalens mappning och utmatningskanal synliga. - + Left input channel selection combo box Vänster ingångskanalvalskombinationsruta - + Right input channel selection combo box Höger ingångskanalvalskombinationsruta - + Left output channel selection combo box Vänster utgångskanalvalskombinationsruta - + Right output channel selection combo box Höger utgångskanalvalskombinationsruta - + Small Network Buffers Aktivera liten nätverksbuffert - + Small network buffers check box Aktivera kryssrutan för små nätverksbuffertar - + Sound Card Buffer Delay Ljudkortets buffertfördröjning - + 128 samples: Should work for most available sound cards. 128 bitars buffert: Bör fungera för alla ljudkort. - + Sound card driver settings Ljudkortsinställningar - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. Kontrollerar de relativa nivåerna för vänster och höger lokala ljudkanal. För en monosignal fungerar den som en panorering mellan de två kanalerna. Om exempelvis en mikrofon är ansluten till den högra ingångskanalen och ett instrument är anslutet till den vänstra ingångskanalen som är mycket högre än mikrofonen, flytta ljudfadern i en riktning som etiketten ovanför fadern visar %1, där %2 är den aktuella dämpningsindikatorn. - + Audio Device Ljudenhet - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. Under Windows operativsystem kan ASIO-drivrutinen (ljudkortet) väljas med %1. Om den valda ASIO-drivrutinen inte är giltig visas ett felmeddelande och den tidigare giltiga drivrutinen väljs. Under macOS är inget ljudkortsval möjligt. - + Three buffer sizes can be selected Tre buffertstorlekar kan väljas - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 bitars buffert: Den ger den lägsta latensen men fungerar inte med alla ljudkort. - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 bitars buffert: Ska endast användas när 64 eller 128 bitars buffert orsakar problem. - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. Vissa ljudkortsdrivrutiner tillåter inte att buffertfördröjningen ändras inom %1. I detta fall är inställningen för buffertfördröjning inaktiverad och måste ändras med hjälp av ljudkortsdrivrutinen. Använd lämpligt verktyg för det gränssnitt som används för att justera buffertstorleken. Om du till exempel använder ASIO, använd knappen "ASIO Device Settings" för att öppna drivrutinens inställningspanel eller om du använder JACK, använd ett verktyg som QjackCtl för att justera buffertstorleken. Andra gränssnitt, t.ex. Pipewire, kräver att man använder det rätta verktyget. Se gränssnittsmanualen. - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. Om ingen buffertstorlek är vald och alla inställningar är inaktiverade, betyder detta en buffertstorlek som används av drivrutinen och som inte matchar värdena. %1 fungerar fortfarande med den här inställningen men med begränsad prestanda. - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. Den faktiska buffertfördröjningen har påverkan på anslutning, den aktuella uppladdningshastigheten och den totala förseningen. Ju lägre buffertstorlek, desto högre är sannolikheten för rött ljus i statusindikatorn (drop outs) och desto högre uppladdningshastighet och desto lägre blir den totala fördröjningen. - + ASIO Device Settings push button ASIO enhetsinställningsknapp - + Meter Style Meterstil - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. Välj den mätarstil som ska användas för nivåmätarna. Alternativen Bar (smal) och LEDs (rund, liten) gäller bara för mixerkortet. När Bar (smal) är vald ställs ingångsmätarna in på Bar (bred). När LEDs (rund, liten) är vald, är ingångsmätarna inställda på LEDs (rund, stor). De återstående alternativen gäller mixerboard och ingångsmätare. - + Meter Style combo box Kombineringsknapp för meterstil - + Language Språk - + Select the language to be used for the user interface. Välj det språk som ska användas för användargränssnittet. - + Language combo box Kombineringsknapp för språk - + and och - + Input Boost Ingångsförstärkning - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. Denna inställning låter dig öka din insignalnivå med faktor upp till 10 (+ 20dB). Om ditt ljud är för tyst, försök först att höja nivån genom att komma närmare mikrofonen, justera din ljudutrustning eller öka nivåerna i din drift systemets ingångsinställningar. Endast om detta misslyckas, ställ in en faktor här. Om ditt ljud är för högt, låter förvrängt och klipper, hjälper det här alternativet inte. Använd då inte det då förvrängningen kommer fortfarande att finnas där. Sänk istället din ingångsnivå genom att komma längre bort från din mikrofon, justera din ljudutrustning eller genom att minska operativsystemets ingångsinställningar. - + Input Boost combo box Ingångsförstärknings knapp - + Custom Directories Anpassad kataloger - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> Om du behöver lägga till ytterligare kataloger i kopplingsdialogens rullgardinsmeny för kataloger kan du ange adresserna här. <br> - + Custom Directories combo box Kombinationsruta för anpassad kataloger - + Delete custom directory button Knapp för att ta bort anpassad katalog - + Delete Custom Directory Ta bort anpassad katalog - + Click the button to delete the currently selected custom directory. Klicka på knappen för att ta bort den för närvarande valda anpassade katalogen. - + Audio Upstream Rate Ljud uppströmshastighet - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). Beror på den aktuella ljudpaketstorleken och komprimeringsinställningen. Se till att uppströmshastigheten inte är högre än din tillgängliga internetuppladdningshastighet (kolla detta med en tjänst som exempelvis speedtest.net). - + Number of Mixer Panel Rows Antal mixerpanelrader - + Adjust the number of rows used to arrange the mixer panel. Justera antalet rader som används för att ordna mixerpanelen. - + Number of Mixer Panel Rows spin box Antal mixerpanelrader i rutan - + Feedback Protection Rundgångsskydd - + Prevents acoustic feedback between microphone and speakers. Aktivera rundgångsskydd för att upptäcka rundgång mellan mikrofon och högtalare. - + Feedback Protection check box Rundgångsskyddsruta - + Audio Alerts Ljudvarningar - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. Aktivera ljudvarning när du tar emot ett chattmeddelande och när en ny klient ansluter sig till sessionen. Det kan krävas en andra ljudenhet för att höra varningarna. - + Audio Alerts check box Kryssrutan Ljudvarningar - + ASIO Device Settings ASIO enhetsinställningar - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. Skriv ditt namn eller ett alias här så att de andra musikerna du vill spela med vet vem du är. Du kan också lägga till en bild av instrumentet du spelar och en flagga för det land/region du befinner dig i. Din stad och din färdighetsnivå som spelar ditt instrument kan också läggas till. - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. Det du ställer in här visas på din fader på mixerkortet när du är ansluten till en %1-server. Den här taggen kommer också att visas vid varje klient som är ansluten till samma server som du. - + Country/region flag button Knapp för land/regionsflagga - + Center Mitten - + R H - + The buffer setting is therefore a trade-off between audio quality and overall delay. Buffertinställningen är därför en avvägning mellan ljudkvalitet och total fördröjning. - + 64 samples setting radio button 64 bitars buffertknapp - + 128 samples setting radio button 128 bitars buffertknapp - + 256 samples setting radio button 256 bitars buffertknapp - + Skin Skal - + Select the skin to be used for the main window. Välj skal som ska användas för huvudfönstret. - + Skin combo box Kombineringsknapp för skal - + Audio Channels Ljudkanaler - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: Väljer antalet ljudkanaler som ska användas för kommunikation mellan klient och server. Det finns tre lägen tillgängliga: - - + + Mono Mono - - - + + + Stereo Stereo - + These modes use one and two audio channels respectively. Dessa lägen använder respektive en och två ljudkanaler. - + Mono in/Stereo-out Mono in/Stereo-ut - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. Ljudsignalen som skickas till servern är mono men retursignalen är stereo. Detta är användbart om ljudkortet har instrumentet på en ingångskanal och mikrofonen på den andra. I så fall kan de två insignalerna blandas till en monokanal men servermixen hörs i stereo. - + Enabling Möjliggör - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. kommer att öka dataströmmen. Se till att din uppladdningshastighet inte överstiger den tillgängliga uppladdningshastigheten för din internetanslutning. - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. I stereo-strömningsläge kommer inget val av ljudkanal för reverb-effekten att finnas tillgängligt i huvudfönstret eftersom effekten tillämpas på båda kanalerna i detta fall. - + Audio channels combo box Kombineringsknapp för ljudkanalerna - + Audio Quality Ljudkvalitet - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. Ju högre ljudkvalitet, desto högre datahastighet krävs. Se till att din uppladdningshastighet inte överstiger den tillgängliga bandbredden för din internetanslutning. - + Audio quality combo box Kombineringsknapp för ljudkvalitet - + New Client Level Ny klientnivå - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. Denna inställning definierar fadernivån för en nyansluten klient i procent. Om en ny klient ansluter till den aktuella servern, kommer de att få den angivna initiala fader-nivån om ingen annan fader-nivå från en tidigare anslutning av den klienten redan lagrats. - + New client level edit box Redigeringsruta för en ny klient - + Enable/disable MIDI-in port Aktivera/avaktivera MIDI-inport - + MIDI-in port check box MIDI-ingångsport kryssruta - + Pick-up Mode - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. - + Pick-up Mode check box - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. - + MIDI input device combo box - + MIDI controller settings - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. - + MIDI channel combo box - + Mute Myself MIDI CC number spin box - + Fader offset spin box - + Pan offset spin box - + Solo offset spin box - + Mute offset spin box - + Mute Myself MIDI learn button - + Fader offset MIDI learn button - + Pan offset MIDI learn button - + Solo offset MIDI learn button - + Mute offset MIDI learn button - + Mono-in/Stereo-out Mono-in/Stereo-ut - + Low Låg - - + + Normal Normal - + High Hög - + + Max + + + + Fancy Stiligt - + Compact Kompakt - + Bar (narrow) Bar (smal) - + Bar (wide) Bar (bred) - + LEDs (stripe) LEDs (bred) - + LEDs (round, small) LEDs (rund, liten) - + LEDs (round, big) LEDs (rund, stor) - - - - + + + + None Ingen - + Musician Profile Musikerprofil - + Alias or name edit box Redigeringsruta för alias eller namn - + Instrument picture button Knapp för instrumentbild - + City edit box Redigeringsruta för stad - + Skill level combo box Kombinationsruta för färdighetsnivå - + Beginner Nybörjare - + Intermediate Mellannivå - + Expert Expert - - + + Could not open MIDI port - + No MIDI devices found. Please connect a MIDI device and try again. - + Please check your OS configuration. - - + + Size: Storlek: - + Buffer Delay Buffertfördröjning - + Buffer Delay: Buffertfördröjning: - + Learn - - + + All Devices - + No device connected - - + + MIDI Device Not Found - + The MIDI device "%1" could not be found. Using all available devices instead. - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. - - + + MIDI Device Connection Failed - + Could not connect to MIDI device "%1". Please check your OS configuration. - + Could not connect to MIDI device "%1". Please check that the device is available. - + Listening... - + Custom Eget - + Any Genre 2 Alla genrer 2 - Any Genre 3 - Alla genrer 3 + Alla genrer 3 - + + Any Genre Asia + + + + Genre Rock Genre Rock - + Genre Jazz Genre Jazz - + Genre Classical/Folk Genre Klassisk/Folkmusik - + Genre Choral/Barbershop Genre Kör/Barbershop - + Any Genre 1 Alla genrer 1 - + Drum Set Trumset - + Djembe Djembe - + Electric Guitar Elgitarr - + Acoustic Guitar Akustisk gitarr - + Bass Guitar Basgitarr - + Keyboard Klaviatur - + Synthesizer Synthesizer - + Grand Piano Flygel - + Accordion Dragspel - + Vocal Sång - + Microphone Mikrofon - + Harmonica Munspel - + Trumpet Trumpet - + Trombone Trombon - + French Horn Valthorn - + Tuba Tuba - + Saxophone Saxofon - + Clarinet Klarinett - + Flute Flöjt - + Violin Fiol - + Cello Cello - + Double Bass Kontrabas - + Recorder Inspelningsapparat - + Streamer Streamer - + Listener Lyssnare - + Guitar+Vocal Gitarr+Sång - + Keyboard+Vocal Klaviatur+Sång - + Bodhran Bodhrán - + Bassoon Fagott - + Oboe Oboe - + Harp Harpa - + Viola Altfiol - + Congas Congas - + Bongo Bongo - + Vocal Bass Sång (bas) - + Vocal Tenor Sång (tenor) - + Vocal Alto Sång (alt) - + Vocal Soprano Sång (sopran) - + Banjo Banjo - + Mandolin Mandolin - + Ukulele Ukulele - + Bass Ukulele Ukulele (bas) - + Vocal Baritone Sång (baryton) - + Vocal Lead Sång (melodistämma) - + Mountain Dulcimer Mountain Dulcimer - + Scratching Skrapning - + Rapping Rapp - + Vibraphone Vibrafon - + Conductor Dirigent @@ -2510,117 +2519,117 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CConnectDlg - + Server List Serverlista - + Directory Katalog - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. Visar servrarna listade i den valda katalogen. Du kan lägga till anpassade kataloger i Avancerade inställningar. - + Directory combo box Kombineringsknapp för kataloger - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. Filtrerar serverlistan efter den givna texten. Observera att filtret är skiftlägesokänsligt. Ett enda # tecken kommer att filtrera för de servrar med minst en person ansluten. - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. Avmarkera för att komprimera serverlistan för att bara visa serverdetaljerna. Markera för att visa alla på servrarna. - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. Fönstret Connection Setup listar tillgängliga servrar som är registrerade med den valda katalogen. Använd rullgardinsmenyn Katalog för att ändra katalogen, hitta den server du vill ansluta till i serverlistan, klicka på den och klicka sedan på knappen Anslut för att ansluta. Alternativt kan du dubbelklicka på servernamnet för att ansluta. - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. Permanenta servrar (de som har varit listade i mer än 48 timmar) visas i fet stil. - + You can add custom directories in Advanced Settings. Du kan lägga till anpassade kataloger i Avancerade inställningar. - + Server list view Serverlistevy - + Server Address Serveradress - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. Om du känner till serveradressen kan du ansluta till den med hjälp av fältet Servernamn/adress. Ett valfritt portnummer kan läggas till efter serveradressen med ett kolon som separator, t.ex. %1. Fältet visar också en lista över de senast använda serveradresserna. - + Holds the current server address. It also stores old addresses in the combo box list. Innehåller den aktuella serveradressen. Den lagrar även gamla adresser i listan med kombinationsrutor. - + Delete server address button Knapp för att ta bort serveradress - + Delete Server Address Ta bort serveradressen - + Click the button to clear the currently selected server address and delete it from the list of stored servers. Klicka på knappen för att rensa den för närvarande valda serveradressen och ta bort den från listan över sparade servrar. - + Ping Ping - + Server address edit box Serveradressens redigeringsruta - + Filter Filter - + Filter edit box Redigeringsrutan för filtrering - + Show All Musicians Visa alla musiker - + Show all musicians check box Klickruta för att visa alla musiker - + Filter text, or # for occupied servers Filtrera text eller använd # för att se servrar med användare @@ -2691,43 +2700,43 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CHelpMenu - + &Help &Hjälp - - + + Getting &Started... Komma &igång... - + Software &Manual... &Manual... - + What's &This &Vad är detta - + P&rivacy policy... Integ&ritetspolicy... - + &About Jamulus... &Om Jamulus... - + About &Qt... Om &Qt... - + About Qt Om Qt @@ -2735,12 +2744,12 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CLanguageComboBox - + Restart Required Omstart krävs - + Please restart the application for the language change to take effect. Starta om applikationen för att språkändringen ska träda i kraft. @@ -2748,22 +2757,22 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. Denna server kräver att du accepterar villkoren innan du kan gå med. Läs dem i chattfönstret. - + I have read the conditions and &agree. Jag har &läst villkoren och håller med. - + Accept Acceptera - + Decline Neka @@ -2771,17 +2780,17 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CMultiColorLED - + Red Röd - + Yellow Gul - + Green Grön @@ -2789,7 +2798,7 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CMusProfDlg - + No Name Inget namn @@ -2797,448 +2806,448 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CServerDlg - + Client List Klientlista - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. Klientlistan visar alla klienter som för närvarande är anslutna till den här servern. Viss information om klienterna som IP-adressen och namnet ges för varje ansluten klient. - + Connected clients list view Lista över anslutna klienter - + Directory Type combo box Kombinationsruta för katalogtyp - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. När ett annat värde än "%1" väljs för Katalogen visas om registreringen har lyckats. Om registreringen misslyckades, välj en annan katalog. - + No recording directory has been set or the value is not useable. Check the value in the Options tab. Ingen inspelningskatalog har ställts in eller värdet kan inte användas. Kontrollera värdet på fliken Alternativ. - + If the recording directory is not useable, the problem will be displayed in place of the session directory. Om inspelningskatalogen inte kan användas visas problemet i stället för sessionskatalogen. - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Klicka på knappen för att öppna dialogrutan där du kan välja huvudkatalogen för inspelning. Det valda värdet måste finnas och vara skrivbart (tillåta skapande av underkataloger av användaren %1 som körs som). - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. Det aktuella värdet för den huvudsakliga inspelningskatalogen. Det valda värdet måste finnas och vara skrivbart (tillåta skapande av underkataloger av användaren %1 som körs som). Klicka på knappen för att öppna dialogrutan där huvudinspelningskatalogen kan väljas. - + Custom Directory address Anpassad katalogadress - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. Adressen för anpassad katalog är adressen till den katalog som innehåller den serverlista som den här servern ska läggas till i. - + Server List Filename dialog push button Dialogrutan Knapp med serverlista och filnamn - - + + Server List Filename Filnamn på serverlistan - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Klicka på knappen för att öppna dialogrutan där du kan ställa in namnet på filnamnet för serverlistans beständighet. Användaren %1 som körs som måste kunna skapa det angivna filnamnet, även om det redan kan finnas (det skrivs över när du sparar). - + Server List Filename text box (read-only) Textruta Filnamn för serverlista (skrivskyddad) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. Det aktuella värdet av filnamnet för serverlistans standardfil. Användaren %1 som körs som måste kunna skapa det angivna filnamnet, även om det redan kan finnas (det skrivs över när det sparas). Klicka på knappen för att öppna dialogrutan som gör det möjligt att ställa in standardfilnamnet för serverlistan. - + Clear the server list file name button Knapp för att rensa filnamnet för serverlistan - + Clear Server List Filename Rensa filnamnen i serverlistan - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. Klicka på knappen för att radera det valda filnamnet för serverlistans standardval. Detta förhindrar att serverlistan bevaras tills ett nytt värde väljs. - + Start Minimized on Operating System Start Starta Minimerad vid operativsystemets start - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. Om kryssrutan Starta minimerad på operativsystemets start är markerad kommer servern att startas när operativsystemet startar och minimeras automatiskt till en ikon för systemaktivitetsfält. - + Now a directory Nu en katalog - + Register Server Status Serverstatus om servern är registrerad - + Server Name Servernamn - + The server name identifies your server in the connect dialog server list at the clients. Servernamnet identifierar din server i anslutningsdialogens serverlista hos klienterna. - + Server name line edit Ändra servernamnet - + Location City Stad - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. Här kan man visa serverns plats. Om en stad anges kommer det att visas i listan för anslutningsdialogserver på klienterna. - + City where the server is located line edit Ändra var servern befinner sig - + Country/Region Land/region - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. Ställ in det land eller den region där servern körs. Klienter kommer att visa denna plats i sin anslutningsdialogs serverlista. - + Combo box for location of this server Kombineringsknapp för val av serverplacering - + When checked, the recorder will run while a session is in progress (if set up correctly). När krysset är markerat körs inspelaren medan en session pågår (om inställningen är korrekt). - + Recording has been switched off by the UI checkbox or JSON-RPC. Inspelningen har stängts av med hjälp av kryssrutan i användargränssnittet eller JSON-RPC. - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. Inspelningen har stängts av med hjälp av kryssrutan i användargränssnittet, SIGUSR2 eller JSON-RPC. - + Display dialog to select recording directory button Knapp för att visa dialogruta för att välja inspelningskatalog - - + + Main Recording Directory Huvudinspelningskatalog - + Main recording directory text box (read-only) Textruta för huvudinspelningskatalog (skrivskyddad) - + Clear the recording directory button Knappen för att rensa inspelningskatalogen - + Clear Recording Directory Rensa inspelningskatalogen - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. Klicka på knappen för att rensa den valda inspelningskatalogen. Detta förhindrar inspelning tills ett ny plats valts. - + Checkbox to turn on or off server recording Knapp för att slå på eller av serverinspelning - + Jam Recorder Starta serverinspelning - + Current session directory text box (read-only) Nuvarande inspelningskatalogtext (skrivskyddad) - + Current Session Directory Aktuell inspelningskatalog - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. Aktiverad under inspelning och har den aktuella inspelningskatalogen. Inaktiverad efter inspelning eller när inspelaren inte är aktiverad. - + Recorder status label Inspelningsstatusetikett - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>Katalog:</b> Välj "%1" för att inte registrera din server med en katalog.<br>Och välj en av genrerna för att registrera dig med den katalogen.<br>Och välj "%2" och ange en anpassad katalogadress på fliken Alternativ för att registrera dig med en anpassad katalog.<br><br>För alla värden utom "%1" registrerar den här servern med en katalog så att en %3-användare kan välja den här servern i serverlistan i klientens anslutningsdialog när de väljer den katalogen.<br><br>Registreringen av servern förnyas regelbundet för att se till att alla servrar i anslutningsdialogens serverlista faktiskt är tillgängliga. - + Recorder Status Inspelningsstatus - + Displays the current status of the recorder. The following values are possible: Visar inspelarens aktuella status. Dessa värden är möjliga: - + There is no one connected to the server to record. Det är ingen ansluten till servern att spela in. - + The performers are being recorded to the specified session directory. Artisterna spelas in i den angivna sessionskatalogen. - + NOTE NOTERING - + Server welcome message edit box Serverns redigeringsruta för välkomstmeddelandet - + Server Welcome Message Serverns välkomstmeddelande - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. En välkomstmeddelandetext för servern visas i chattfönstret om en musiker kommer in på servern. Om inget meddelande är inställt är serverns välkomst inaktiverad. - + Language Språk - + Select the language to be used for the user interface. Välj det språk som ska användas för användargränssnittet. - + Language combo box Kombineringsknapp för språk - + Custom Directory line edit Ändra anpassad katalog - + &Hide %1 server &Dölj %1-server - + &Show %1 server &Visa %1-server - + %1 server %1 is the name of the main application %1-server - + Type a message here. If no message is set, the server welcome is disabled. Skriv ett meddelande här. Om inget meddelande är inställt är serverns välkomst inaktiverad. - + %1 Server %1 is the name of the main application %1-server - + Recorder failed to start. Please check available disk space and permissions and try again. Error: Inspelningen kunde inte starta. Kontrollera tillgängligt diskutrymme och behörigheter och försök igen. Fel: - + ERROR FEL - + Request new recording button Begär ny inspelningsknapp - + New Recording Ny inspelning - + During a recording session, the button can be used to start a new recording. Under en inspelningssession kan knappen användas för att starta en ny inspelning. - - + + E&xit &Avbryt - + &Window &Fönster - + Select Main Recording Directory Välj huvudinspelningskatalog - + Recording Inspelning - + Not recording Inspelning inte aktiv - + Not initialised Inte initierad - + Not enabled Inte aktiv - + None Ingen - + Not registered Ej registrerat - + Bad address Felaktig adress - + Registration requested Registreringsförfrågan skickad - + Registration failed Registreringen misslyckades - + Check server version Kontrollera serverversionen - + Registered Registrerad - + Server list full at directory Katalogens serverlista är full - + Your server version is too old Din serverversion är för gammal - + Requirements not fulfilled Kraven uppfylls inte - + Unknown value %1 Okänt värde %1 @@ -3362,32 +3371,32 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CServerListManager - + Now a directory Nu en katalog - + No longer a directory Inte längre en katalog - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). Kunde inte öppna "%1" för läsning/skrivning. Kontrollera att %2 har behörighet (och att det finns ledigt utrymme). - + Loading persistent server list file: %1 Läser in en fil med en lista över beständiga servrar: %1 - + Could not write to '%1' Kunde inte skriva till '%1' - + Saving registration for %1 (%2): %3 Sparar registrering för %1 (%2): %3 @@ -3395,68 +3404,68 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CSound - + Error requesting stream stop: $s Fel vid begäran av strömningsstopp: $s - + Error closing stream: $s Fel vid stängning av ström: $s - + The selected audio device is no longer present in the system. Please check your audio device. Den valda ljudenheten finns inte längre i systemet. Kontrollera din ljudenhet. - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. Det gick inte att initiera ljuddrivrutinen. Kontrollera om din ljudmaskinvara är ansluten och kontrollera dina drivrutinsinställningar. - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. Den valda ljudenheten är inkompatibel eftersom den inte stöder en samplingsfrekvens på %1 Hz. Välj en annan enhet. - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. Den aktuella ljudenhetskonfigurationen är inkompatibel eftersom samplingshastigheten inte kunde ställas in på %2 Hz. Kontrollera om det finns en hårdvarubrytare eller drivrutinsinställning för att ställa in samplingsfrekvensen manuellt och starta om %1. - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. Den valda ljudenheten är inkompatibel eftersom den inte stöder %1 in/ut-kanaler. Välj en annan enhet eller konfiguration. - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. Den valda ljudenheten är inkompatibel eftersom det nödvändiga ljudsampelformatet inte är tillgängligt. Använd en annan enhet. - + No ASIO audio device driver found. Ingen ASIO-ljudenhetsdrivrutin hittades. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. Installera en ASIO-drivrutin innan du kör %1. Om du äger en enhet med ASIO-stöd installerar du dess officiella ASIO-drivrutin. Om inte, måste du ladda ner och installera en universell drivrutin så som ASIO4ALL. - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK kunde inte startas automatiskt. Starta JACK manuellt och leta efter felmeddelanden. - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK körs inte med en samplingshastighet på <b>%1 Hz</b>. Använd ett verktyg som <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> för att ställa in JACK-samplingsfrekvensen till %1 Hz. - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. JACK-portregistreringen misslyckades. Detta är förmodligen ett fel med JACK. Stoppa %1 och JACK. Kontrollera efteråt om ett annat program med en samplingshastighet på %2 Hz kan ansluta till JACK. @@ -3465,62 +3474,62 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen JACK-portregistreringen misslyckades. Detta är förmodligen ett fel med JACK. Stoppa %1 och JACK. Kontrollera efteråt om ett annat MIDI-program kan ansluta till JACK. - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. Det går inte att aktivera JACK-klienten. Detta är förmodligen ett fel med JACK. Kontrollera JACK-utgången. - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK stängdes av. %1 kräver att JACK körs. Starta om %1 för att starta JACK igen. - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. Inget ljudkort är tillgängligt i ditt system. CoreAudio-ingång AudioHardwareGetProperty-anrop misslyckades. - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. Inget ljudkort finns tillgängligt i systemet. CoreAudio-ingång AudioHardwareGetProperty-anrop misslyckades. - + The currently selected audio device is no longer present. Please check your audio device. Den för närvarande valda ljudenheten finns inte längre. Kontrollera din ljudenhet. - + The audio input device is no longer available. Please check if your input device is connected correctly. Ljudinmatningsenheten är inte längre tillgänglig. Kontrollera om din ingångsenhet är korrekt ansluten. - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Samplingshastigheten på den aktuella inmatningsenheten är inte %1 Hz och är därför inkompatibel. Välj en annan enhet eller försök ställa in samplingsfrekvensen till %1 Hz manuellt via Audio-MIDI-inställning (i Program->Verktyg). - + The audio output device is no longer available. Please check if your output device is connected correctly. Ljudutgångsenheten är inte längre tillgänglig. Kontrollera om din utenhet är korrekt ansluten. - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). Samplingshastigheten på den aktuella utenheten är inte %1 Hz och är därför inkompatibel. Välj en annan enhet eller försök ställa in samplingsfrekvensen till %1 Hz manuellt via Audio-MIDI-inställning (i Program->Verktyg). - + The stream format on the current input device isn't compatible with this software. Please select another device. Strömformatet på den aktuella inmatningsenheten är inte kompatibelt med denna programvara. Välj en annan enhet. - + The stream format on the current output device isn't compatible with %1. Please select another device. Strömformatet på den aktuella inmatningsenheten är inte kompatibelt med %1. Välj en annan enhet. - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. Buffertstorlekarna för den aktuella in- och utgående ljudenheten kan inte ställas in på ett gemensamt värde. Välj olika in-/utgångsenheter i dina systeminställningar. @@ -3528,27 +3537,27 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. Kan inte använda den valda ljudenheten på grund av följande fel: %1 Den tidigare drivrutinen kommer att väljas. - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. Den tidigare valda ljudenheten är inte längre tillgänglig eller så har drivrutinen ändrats till ett inkompatibelt tillstånd. Vi kommer att försöka hitta en giltig ljudenhet, men den här nya ljudenheten kan orsaka ljudåterkoppling. Kontrollera din ljudenhet innan du ansluter till en server inställningar. - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 kunde inte hitta en användbar %2-ljudenhet.</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? Du kanske kan åtgärda fel i drivrutinsinställningarna. Vill du öppna dessa inställningar nu? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. Kan inte starta %1. Starta om %1 och kontrollera/konfigurera om dina ljudinställningar. @@ -3556,53 +3565,57 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1, Version %2 - Released under the GNU General Public License version 2 or later (GPLv2) - Släppt under GNU General Public License version 2 eller senare (GPLv2) + Släppt under GNU General Public License version 2 eller senare (GPLv2) - + This app uses the following libraries, resources or code snippets: Denna applikationen använder följande bibliotek, resurser eller kodavsnitt: - + Qt cross-platform application framework Qt cross-platform applikationsramverk - + (build) (build) - + (runtime) (runtime) - + Some pixmaps are from the %1 Vissa pixmaps kommer från %1 - + Some sound samples are from %1 Vissa ljudfiler kommer från %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone Ljudklangkod av Perry R. Cook och Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James Flaggsymboler gjorda av Mark James @@ -3610,12 +3623,12 @@ Vi stängde av din kanal och aktiverade 'Tysta mig själv'. Vänligen global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> En %1-uppgradering är tillgänglig: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>gå till detaljer och nedladdningar</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) För mer information använd hjälpen (hjälpmeny, höger musknapp eller Shift + F1) diff --git a/src/translation/translation_zh_CN.ts b/src/translation/translation_zh_CN.ts index cc0a001793..b9d5e35ff2 100644 --- a/src/translation/translation_zh_CN.ts +++ b/src/translation/translation_zh_CN.ts @@ -4,132 +4,132 @@ CAboutDlg - + Qt cross-platform application framework Qt 跨平台应用程序框架 - + (build) (构建) - + (runtime) (运行时) - + Audio reverberation code by Perry R. Cook and Gary P. Scavone 音频混响代码由 Perry R. Cook 和 Gary P. Scavone 提供 - + This app enables musicians to perform real-time jam sessions over the internet. 此应用使乐手们可以在线实时进行音乐合奏。 - + There is a server which collects the audio data from each client, mixes the audio data and sends the mix back to each client. 这是一个收集来自各个客户端声音数据,并将音频数据混合并发回各个客户端的服务器端程序。 - + This app uses the following libraries, resources or code snippets: 此应用程序使用了以下依赖库,资源或代码片段: - + Flag icons by Mark James 旗帜图标作者为 Mark James - + Some pixmaps are from the %1 部分位图来自 %1 - + Some sound samples are from %1 部分声音采样来自 %1 - + For details on the contributions check out the %1 关于贡献者的详情请参见 %1 - + Github Contributors list Github 贡献者列表 - + Spanish 西班牙语 - + French 法语 - + Portuguese 葡萄牙语 - + Dutch 荷兰语 - + Italian 意大利语 - + German 德语 - + Polish 波兰语 - + Swedish 瑞典语 - + Korean 韩语 - + Slovak 斯洛伐克语 - + Simplified Chinese 简体中文 - + Norwegian Bokmål 书面挪威语 - + Japanese 日语 - + About %1 关于 %1 @@ -180,12 +180,12 @@ CAnalyzerConsole - + Analyzer Console 分析控制台 - + Error Rate of Each Buffer Size 错误的缓冲区采样率大小 @@ -193,32 +193,32 @@ CAudioMixerBoard - + Personal Mix at the Server 位于服务器的个人混音室 - + When connected to a server, the controls here allow you to set your local mix without affecting what others hear from you. The title shows the server name and, when known, whether it is actively recording. 当连接到一个服务器时,此控件将允许您设置本地混音选项而不会影响到它人实际听到您的情况。标题将会显示服务器名称,以及是否在录制状态。 - + Server 服务器 - + T R Y I N G T O C O N N E C T 尝 试 连 接 中 - + RECORDING ACTIVE 录制已开启 - + Personal Mix at: %1 个人混音室: %1 @@ -226,245 +226,245 @@ CChannelFader - - - + + + Pan 左右平衡 - - - + + + Mute 静音 - - - + + + Solo 独奏 - + &No grouping 不分组(&N) - + Assign to group 分配到组 - + The fader tag identifies the connected client. The tag name, a picture of your instrument and the flag of your location can be set in the main window. 推子标签指示了连接到的客户端。标签名称、乐器图案和您所在位置的旗帜可在主窗口中进行设置。 - + Mixer channel country/region flag 混音通道的国家/地区旗帜 - + Grp - + Channel Level 声道音量 - + Input level of the current audio channel at the server 位于服务器的当前声道的输入音量 - + Mixer Fader 混音推子 - + Local mix level setting of the current audio channel at the server 位于服务器的当前音频通道的本地混音音量设置 - + Status Indicator 状态指示器 - + Shows a status indication about the client which is assigned to this channel. Supported indicators are: 显示当前声道对应的客户端的状态指示。支持的指示有: - + Status indicator label 状态指示标签 - + Panning 左右平衡 - + Local panning position of the current audio channel at the server 此服务器上当前声道的本地声像位置 - + With the Mute checkbox, the audio channel can be muted. 使用静音勾选框,可将声道静音。 - + Mute button 静音按钮 - + Solo button 独奏按钮 - + Fader Tag 推子标签 - + Displays the pre-fader audio level of this channel. All clients connected to the server will be assigned an audio level, the same value for every client. 按推子显示当前声道的音量。所有连接到一服务器的客户端都会被分配有一个音频音量,所有客户端相同的值。 - + Adjusts the audio level of this channel. All clients connected to the server will be assigned an audio fader, displayed at each client, to adjust the local mix. 调整当前声道的音量。所有连接到一服务器的客户端都会被分配有一个音频推子,在客户端旁展示,用以调整本地混音。 - + Speaker with cancellation stroke: Indicates that another client has muted you. 被划掉的喇叭图标:表示其它客户端把你静音了。 - + Sets the pan from Left to Right of the channel. Works only in stereo or preferably mono in/stereo out mode. 从左到右设定声道的声像。仅对立体声或单声道输入、立体声输出模式可用。 - + With the Solo checkbox, the audio channel can be set to solo which means that all other channels except the soloed channel are muted. It is possible to set more than one channel to solo. 使用独奏勾选框可将声道进行独奏,即除独奏声道外的其它声道将会静音。可将多个声道设置为独奏。 - + Group 分组 - + With the Grp checkbox, a group of audio channels can be defined. All channel faders in a group are moved in proportional synchronization if any one of the group faders are moved. 通过分组勾选框,即可定义一组声道。移动一组内的任意一个推子时,所有同组的声道推子将会同时移动。 - + Group button 分组按钮 - + Mixer channel instrument picture 混音通道的乐器图片 - + Mixer channel label (fader tag) 混音通道的标签(推子标签) - + PAN 声像 - + MUTE 静音 - + SOLO 独奏 - + GRP 分组 - + M M - + S S - + G G - + Alias/Name 别名/名称 - + Instrument 乐器 - + Location 位置 - - - + + + Skill Level 水平程度 - + Alias 别名 - + Beginner 新手 - + Intermediate 中级 - + Expert 专家 - + Musician Profile 乐手信息 @@ -472,58 +472,58 @@ CChatDlg - + Chat Window 聊天窗口 - + The chat window shows a history of all chat messages. 此聊天窗口显示所有历史聊天信息。 - + Chat history 聊天记录 - + Input Message Text 输入消息文本 - + Enter the chat message text in the edit box and press enter to send the message to the server which distributes the message to all connected clients. Your message will then show up in the chat window. 在输入框中输入聊天信息并按下回车来发送信息到服务器,服务器将会把信息分发给连接到服务器的其它所有客户端。您的信息将会显示在聊天窗口。 - + New chat text edit box 聊天新对话文字输入框 - + Type a message here 在此键入消息 - + &Edit 编辑(&E) - + Cl&ear Chat History 清除聊天记录(&C) - - + + &Close 关闭(&C) - + Do you want to open the link '%1' in your browser? 您想在您的浏览器中打开链接 '%1' 吗? @@ -544,370 +544,370 @@ CClientDlg - + Input Level Meter 输入音量计量表 - + Make sure not to clip the input signal to avoid distortions of the audio signal. 请避免擦碰输入以避免音频失真。 - + Input level meter 输入音量计量表 - + Simulates an analog LED level meter. 模拟实物 LED 音量电平计量表。 - + Connect/Disconnect Button 连接/断开连接按钮 - + Connect and disconnect toggle button 连接和断开连接的开关按钮 - + Delay Status LED 延迟指示 LED - + Delay status LED indicator 延迟状态 LED 指示器 - + The network jitter buffer is not large enough for the current network/audio interface jitter. 为应对当前网络/音频接口延迟而言当前网络抖动缓冲大小不够大。 - + This shows the level of the two stereo channels for your audio input. 这里展示了立体声的两个声道的音频输入音量。 - + If the application is connected to a server and you play your instrument/sing into the microphone, the VU meter should flicker. If this is not the case, you have probably selected the wrong input channel (e.g. 'line in' instead of the microphone input) or set the input gain too low in the (Windows) audio mixer. 如果应用程序已连接到了服务器且您已开始对着麦克风演奏乐器或唱歌,此 VU 计量表将开始跳动。若未发生此情况,您可能选错了输入声道或您的 (Windows) 音量合成器中的音频增益设置过低。 - + For proper usage of the application, you should not hear your singing/instrument through the loudspeaker or your headphone when the software is not connected. This can be achieved by muting your input audio channel in the Playback mixer (not the Recording mixer!). 为了恰当的使用此应用程序,当您未连接到服务器时您不会希望在音响或耳机中听到您的演唱或弹奏。您可以通过在音频声道(不是录制混音器!)中将自己静音来达到此目的。 - + Reverb effect 混响效果 - + Reverb can be applied to one local mono audio channel or to both channels in stereo mode. The mono channel selection and the reverb level can be modified. For example, if a microphone signal is fed in to the right audio channel of the sound card and a reverb effect needs to be applied, set the channel selector to right and move the fader upwards until the desired reverb level is reached. 可以将混响应用至本地单声道或立体声双声道上。可以调整单声道的选取和混响程度。例如,如果麦克风信号输入到了声卡的右声道并希望对其应用混响效果,从通道选取器选择右声道并向上移动推子直到达到了希望的混响程度即可。 - + Reverb effect level setting 混响效果程度设定 - + Reverb Channel Selection 混响通道选则框 - + With these radio buttons the audio input channel on which the reverb effect is applied can be chosen. Either the left or right input channel can be selected. 使用这些单选按钮可选择混响效果需要应用到的音频输入声道。左声道和右声道均可供选择。 - + Left channel selection for reverb 左通道的混响 - + Right channel selection for reverb 右通道的混响 - + Green 绿 - + The delay is perfect for a jam session. 该延迟很适合来场合奏。 - + Yellow - + Red - + Opens a dialog where you can select a server to connect to. If you are connected, pressing this button will end the session. 将打开一个供选择您要连接到的服务器的对话框。如果您已连接,按下此按钮将断开此次会话。 - + Shows the current audio delay status: 指示当前音频的延迟情况: - + A session is still possible but it may be harder to play. 仍可来场合奏但或许体验较差而难以完成。 - + The delay is too large for jamming. 该延迟太高,不适合进行合奏。 - + The sound card's buffer delay (buffer size) is too small (see Settings window). 声卡的缓冲区延迟(缓冲区大小)过小(见设置窗口)。 - + The upload or download stream rate is too high for your internet bandwidth. 上行或下行流量频率对您的网络带宽而言过高。 - + The CPU of the client or server is at 100%. 客户端或服务器的 CPU 负载已达 100%。 - + The Ping Time is the time required for the audio stream to travel from the client to the server and back again. This delay is introduced by the network and should be about 20-30 ms. If this delay is higher than about 50 ms, your distance to the server is too large or your internet connection is not sufficient. Ping 延迟时间是指您的音频数据从您的客户端传输到服务器再传输回来所需的耗时。此延迟由网络导致且应保持在 20-30 毫秒。若延迟高于 50 毫秒,您到服务器的距离可能过远或您的网络连接可能不可用。 - + Overall Delay is calculated from the current Ping Time and the delay introduced by the current buffer settings. 最终延迟由当前 Ping 延迟和当前的缓冲区大小设定组合计算而来。 - - + + C&onnect 连接(&O) - + &File 文件(&F) - + &View 视图(&V) - + &Connection Setup... 连接配置(&C)... - + My &Profile... 我的信息(&P)... - + C&hat... 聊天(&H)... - + &Analyzer Console... 分析控制台(&A)... - + N&o User Sorting 不对用户进行排序(&O) - + Sort Users by &City 根据城市排序用户(&C) - + Clear &All Stored Solo and Mute Settings 清除所有已保存的独奏和静音设定(&A) - + Auto-Adjust all &Faders 自动调整所有推子(&F) - + %1 Directory %1 目录 - + Ok Ok 确认 - + Set All Faders to New Client &Level 将所有推子设置为新客户端音量值(&L) - + E&xit 退出(&E) - + &Load Mixer Channels Setup... 加载混音器通道选项(&L)... - + &Save Mixer Channels Setup... 保存混音器通道选项(&S)... - + Sort Users by Chann&el 按频道对用户排序(&e) - + Sett&ings 设置(&I) - + Audio/Network &Settings... 音频/网络选项(&S)... - + A&dvanced Settings... 高级选项(&D)... - + &Edit 编辑(&E) - + If this LED indicator turns red, you will not have much fun using %1. 如果此 LED 指示器变红,您可能无法很愉快的使用 %1。 - + Local Jitter Buffer Status LED 本地抖动缓冲状态 LED - + The local jitter buffer status LED shows the current audio/streaming status. If the light is red, the audio stream is interrupted. This is caused by one of the following problems: 本地抖动缓冲区状态 LED 指示当前音频/串流状态。如果变红,表示音频流被中断了。这可能由以下问题导致: - + If this LED indicator turns red, the audio stream is interrupted. 如果此 LED 指示器变红,音频流则为中断状态。 - + Local Jitter Buffer status LED indicator 本地抖动缓冲状态 LED 指示器 - + Current Connection Status 当前连接状态 - + O&wn Fader First 优先显示自己的推子(&W) - + Sort Users by &Name 根据名称排序用户(&N) - + Sort Users by &Instrument 根据乐器排序用户(&I) - + Sort Users by &Group 根据分组排序用户(&G) - + &MIDI Control Settings... MIDI控制器选项(&M)... - - + + Select Channel Setup File 选择通道配置文件 - + user 用户 - + users 用户 - + Connect 连接 - + Settings 选项 - + Chat 聊天 - + Enable feedback detection 启用自激保护 - + Audio feedback or loud signal detected. We muted your channel and activated 'Mute Myself'. Please solve the feedback issue first and unmute yourself afterwards. @@ -916,12 +916,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe 静音已启用并已为您打开了“静音自己”选项。请解决自激问题然后手动取消静音。 - + Your sound card is not working correctly. Please open the settings dialog and check the device selection and the driver settings. 您的声卡未正常工作。请打开设置对话框并检查设备选项和驱动设置。 - + &Disconnect 断开连接(&D) @@ -1018,1099 +1018,1108 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CClientSettingsDlg - + Jitter Buffer Size 抖动缓冲区大小 - + The jitter buffer setting is therefore a trade-off between audio quality and overall delay. 抖动缓冲选项是音频质量和总延迟之间的一种权衡。 - + Local jitter buffer slider control 本地抖动缓冲滑条 - + Server jitter buffer slider control 服务器抖动缓冲滑条 - + Auto jitter buffer check box 自动抖动缓冲复选框 - + If the driver is selected during an active connection, the connection is stopped, the driver is changed and the connection is started again automatically. 若在一个已建立的连接过程中选择驱动,则连接会被断开,驱动也将被改变,随后将会自动重新建立连接。 - + Sound card device selector combo box 声卡设备选择框 - + If the ASIO4ALL driver is used, please note that this driver usually introduces approx. 10-30 ms of additional audio delay. Using a sound card with a native ASIO driver is therefore recommended. 如果使用 ASIO4ALL 驱动,则请注意其会引入大约 10 至 30 毫秒的额外音频延迟。建议使用具有原生 ASIO 驱动支持的声卡及其官方配套驱动。 - + If you are using the kX ASIO driver, make sure to connect the ASIO inputs in the kX DSP settings panel. 如果您在使用 kX ASIO 驱动,请确保在 kX DSP 设定面板中正确配置 ASIO 的输入连接。 - + Sound Card Channel Mapping 声卡声道映射 - + If the selected sound card device offers more than one input or output channel, the Input Channel Mapping and Output Channel Mapping settings are visible. 若所选的声卡设备提供了超过一个输入或输出声道,则输入声道映射和输出声道映射设置项将可见。 - + Left input channel selection combo box 左输入声道选择框 - + Right input channel selection combo box 右输入声道选择框 - + Left output channel selection combo box 左输出声道选择框 - + Right output channel selection combo box 右输出声道选择框 - + Small Network Buffers Small Network Buffers 的作用不确定,暂定译法 启用小网络缓冲区 - + Small network buffers check box 小网络缓冲区复选框 - + Sound Card Buffer Delay 声卡缓冲区延迟 - + The buffer setting is therefore a trade-off between audio quality and overall delay. 缓冲区设置则是在音质和总体延迟之间的权衡。 - + This opens the driver settings of your sound card. Some drivers allow you to change buffer settings, others like ASIO4ALL lets you choose input or outputs of your device(s). More information can be found on jamulus.io. 这将打开您声卡的驱动选项。一些驱动允许您调整缓冲区选项,其它类如 ASIO4ALL 则允许您选择音频的输入输出设备。更多信息可从 jamulus.io 了解。 - + Opens the driver settings. Note: %1 currently only supports devices with a sample rate of %2 Hz. You will not be able to select a driver/device which doesn't. For more help see jamulus.io. 打开驱动选项。注意:%1 目前仅支持采样率为 %2 的设备。您无法选择非此采样率的设备。更多帮助请见 jamulus.io。 - + 64 samples setting radio button 64 采样设置单选按钮 - + 128 samples setting radio button 128 采样设置单选按钮 - + 256 samples setting radio button 256 采样设置单选按钮 - + Select the meter style to be used for the level meters. The Bar (narrow) and LEDs (round, small) options only apply to the mixerboard. When Bar (narrow) is selected, the input meters are set to Bar (wide). When LEDs (round, small) is selected, the input meters are set to LEDs (round, big). The remaining options apply to the mixerboard and input meters. 选择音量计量表所使用的计量表样式。窄条和圆形小 LED 选项仅在混音版有效。选择窄条时,输入音量计量表将被设置为条状。选择圆形小 LED 时,输入音量计量表将使用圆形大 LED。其余选项均可同时应用于混音版和输入音量计量表。 - + Audio Channels 音频通道 - + and - + Audio channels combo box 声道选择框 - + Audio Quality 音频质量 - + Audio quality combo box 音频质量选择框 - + New Client Level 新客户端音量 - + New client level edit box 新客户端音量编辑框 - + What you set here will appear at your fader on the mixer board when you are connected to a %1 server. This tag will also be shown at each client which is connected to the same server as you. 当你连接到一个 %1 服务器时,你填写到这里的内容会显示在代表你的那个推子上。此标签也会呈现在其它连接到相同服务器的客户端上。 - - + + Mono 单声道 - + For each %1 input/output channel (left and right channel) a different actual sound card channel can be selected. 对于所有 %1 输入/输出声道(左右声道)均可选择对应到不同的声卡的声道。 - + Enables support for very small network audio packets. These network packets are only actually used if the sound card buffer delay is smaller than %1 samples. The smaller the network buffers, the lower the audio latency. But at the same time the network load and the probability of audio dropouts or sound artifacts increases. 启用超小网络音频数据包的支持。这些网络包仅会在声卡缓冲区延迟小于 %1 采样率时才启用。网络缓冲区越小,则音频延迟越低。但于此同时网络负载和产生音频中断或声音伪影的可能性将会增加。 - + mode will increase your stream's data rate. Make sure your upload rate does not exceed the available upload speed of your internet connection. 模式将增加您的媒体流数据频率。请确保您的上传速率未超过您实际可用的网络上传速率。 - + Custom Directories 自定义目录 - + Custom Directories combo box 自定义分类目录下拉框 - + Audio Upstream Rate 音频流上行速度 - + Depends on the current audio packet size and compression setting. Make sure that the upstream rate is not higher than your available internet upload speed (check this with a service such as speedtest.net). 取决于当前音频数据包大小和压缩设定。请确保当前上行流量频率未超过您网络的可用上传速度(可通过类如 speedtest.net 的服务进行检测)。 - + Mono-in/Stereo-out 单声道输入/立体声输出 - - - + + + Stereo 立体声 - - - + + + &Close 关闭(&C) - + Local Audio Input Fader 本地音频输入推子 - - + + L L - + Local audio input fader (left/right) 本地音频输入推子(左/右) - + The jitter buffer compensates for network and sound card timing jitters. The size of the buffer therefore influences the quality of the audio stream (how many dropouts occur) and the overall delay (the longer the buffer, the higher the delay). 抖动缓冲区补偿了网络和声卡时值抖动。缓冲区的大小也影响了音频流的质量(发生多少丢包)和总体延迟(缓冲区越大,延迟越高)。 - + You can set the jitter buffer size manually for the local client and the remote server. For the local jitter buffer, dropouts in the audio stream are indicated by the light below the jitter buffer size faders. If the light turns to red, a buffer overrun/underrun has taken place and the audio stream is interrupted. 您可以在本地客户端和服务端手动设置抖动缓冲区的大小。对于本地抖动缓冲区,音频流的丢包将由抖动缓冲区大小推子下方的灯来指示。若灯变红,则表明缓冲区上溢/下溢在发生,因而音频流发生了中断。 - + If the Auto setting is enabled, the jitter buffers of the local client and the remote server are set automatically based on measurements of the network and sound card timing jitter. If Auto is enabled, the jitter buffer size faders are disabled (they cannot be moved with the mouse). 若选取了自动,则本地客户端和远程服务器的抖动缓冲区将根据网络情况和声卡时值抖动来自动推断。若选取了自动,则用于手动设置抖动缓冲区大小的推子也将被禁用(无法使用鼠标调节)。 - + If the Auto setting is enabled, the network buffers of the local client and the remote server are set to a conservative value to minimize the audio dropout probability. To tweak the audio delay/latency it is recommended to disable the Auto setting and to lower the jitter buffer size manually by using the sliders until your personal acceptable amount of dropouts is reached. The LED indicator will display the audio dropouts of the local jitter buffer with a red light. 若选取了自动,则本地客户端和远程服务器的抖动缓冲区将设为保守可使得音频丢包率最低的值。若要调整音频延迟,则推荐您禁用自动设置并手动使用滑块调低抖动缓冲区大小直到达到您满意的效果。本地音频抖动丢包时 LED 标识将指示红灯。 - + The buffer delay setting is a fundamental setting of %1. This setting has an influence on many connection properties. 缓冲区延迟设定是 %1 的一个基础设置项。此选项会对很多连接相关的属性有影响。 - + 128 samples: Should work for most available sound cards. 128 采样:应该适用于大多数可用的声卡。 - + Controls the relative levels of the left and right local audio channels. For a mono signal it acts as a pan between the two channels. For example, if a microphone is connected to the right input channel and an instrument is connected to the left input channel which is much louder than the microphone, move the audio fader in a direction where the label above the fader shows %1, where %2 is the current attenuation indicator. 控制了本地音频左右声道的相对音量。对于单声道信号,其行为为对声像的调整。例如,若麦克风连接到了右输入声道,而音量远高于麦克风的乐器被连接到了左输入声道,则将音量推子向推子上方标识 %1 的方向移动,%2 是当前的衰减指示器。 - + Audio Device 音频设备 - + Under the Windows operating system the ASIO driver (sound card) can be selected using %1. If the selected ASIO driver is not valid an error message is shown and the previous valid driver is selected. Under macOS the input and output hardware can be selected. 在 Windows 操作系统下,ASIO 驱动(声卡)可通过 %1 进行选择。若所选的 ASIO 驱动无效,则将展示错误信息并选取上一个有效的驱动。在 macOS 中,输入和输出硬件可供选择。 - + Three buffer sizes can be selected 三种缓冲区大小可供选择 - + 64 samples: Provides the lowest latency but does not work with all sound cards. 64 采样:提供最低的延迟但并非支持所有声卡。 - + 256 samples: Should only be used when 64 or 128 samples is causing issues. 256 采样:仅当在 64 或 128 采样存在问题时使用。 - + Some sound card drivers do not allow the buffer delay to be changed from within %1. In this case the buffer delay setting is disabled and has to be changed using the sound card driver. Use the appropriate tool for the interface in use to adjust this buffer size. For example, if using ASIO, use the "ASIO Device Settings" button to open the driver settings panel or if using JACK, use a tool such as QjackCtl to adjust the buffer size. Other interfaces, such as Pipewire, would require their appropriate tool being used. Please refer to the interface manual. 部分声卡驱动不允许缓冲区延迟被调整到 %1。在此情况下,缓冲区延迟设置项会被禁用,此时需要从相应的显卡驱动中修改缓冲区大小的设置。例如,如果使用 ASIO,则使用“ASIO 设备选项”按钮来打开驱动设置面板,或是使用 JACK 时,使用类如 QjackCtl 的工具来调整缓冲区大小。其它音频介质,如 Pipewire,则需要使用其对应的设置工具来调整。请参照对应声卡驱动或音频介质的文档。 - + If no buffer size is selected and all settings are disabled, this means a buffer size in use by the driver which does not match the values. %1 will still work with this setting but may have restricted performance. 如果没有选择缓冲区大小且所有设置均被禁用,则表明驱动所使用的缓冲区大小与提供的值不匹配。在此设定下,%1 仍将可供使用,但可能存在受限的性能。 - + The actual buffer delay has influence on the connection, the current upload rate and the overall delay. The lower the buffer size, the higher the probability of a red light in the status indicator (drop outs) and the higher the upload rate and the lower the overall delay. 实际的缓冲区延迟的设置将影响连接、当前上行带宽以及总体延迟情况。缓冲区大小越小,则指示灯亮红的概率越大(音频丢包),对上行带宽的要求也就越高,总体延迟也就越低。 - + Sound card driver settings 声卡驱动选项 - + ASIO Device Settings push button ASIO 驱动设置按钮 - + Skin 皮肤 - + Select the skin to be used for the main window. 选择用于主窗口的皮肤。 - + Skin combo box 皮肤选择框 - + Meter Style 计量表样式 - + Meter Style combo box 计量表样式下拉框 - + Language 语言(Lang) - + Select the language to be used for the user interface. 选择用于用户界面的语言。 - + Language combo box 语言选择框 - + Selects the number of audio channels to be used for communication between client and server. There are three modes available: 设置用于连接客户端与服务器所要使用的声道数量。有三个模式可用: - + These modes use one and two audio channels respectively. 这些模式分别使用一个和两个声道。 - + Mono in/Stereo-out 单声道输入/立体声输出 - + The audio signal sent to the server is mono but the return signal is stereo. This is useful if the sound card has the instrument on one input channel and the microphone on the other. In that case the two input signals can be mixed to one mono channel but the server mix is heard in stereo. 发送到服务器的音频信号是单声道但接收到的是立体声。当您的声卡其中一个输入声道用于乐器而另一个用于麦克风的场景下很实用。在此情况下,两个输入信号可以合并为单声道但服务器混音仍可听到立体声。 - + Enabling 启用 - + In stereo streaming mode, no audio channel selection for the reverb effect will be available on the main window since the effect is applied to both channels in this case. 在立体声媒体流模式时,由于混响效果将被应用到所有的两个声道,故主窗口将不提供选择混响效果所应用到的声道的功能。 - + The higher the audio quality, the higher your audio stream's data rate. Make sure your upload rate does not exceed the available bandwidth of your internet connection. 音质越高,音频流带宽使用率也会越高。请确保您的上传速率未超过实际网络连接可用的带宽。 - + This setting defines the fader level of a newly connected client in percent. If a new client connects to the current server, they will get the specified initial fader level if no other fader level from a previous connection of that client was already stored. 此选项决定了新加入服务器的客户端的推子电平(音量)。若新的客户端连接到了当前服务器,若其未曾连接到此服务器并存储了其推子音量值,则其推子初始值将为此项所设置的值。 - + Input Boost 输入增强 - + This setting allows you to increase your input signal level by factors up to 10 (+20dB). If your sound is too quiet, first try to increase the level by getting closer to the microphone, adjusting your sound equipment or increasing levels in your operating system's input settings. Only if this fails, set a factor here. If your sound is too loud, sounds distorted and is clipping, this option will not help. Do not use it. The distortion will still be there. Instead, decrease your input level by getting farther away from your microphone, adjusting your sound equipment or by decreasing your operating system's input settings. 此选项允许你增加输入信号的强度最多十倍(+20dB)。若你的声卡音量过低,首先尝试通过将麦克风离近的方式提高音量,调整您的声音设备或者增加您的系统输入音量设定。若这些方法仍不奏效,则在此设置增加的强度。如果您的声卡音量过高,音频有失真或削波,则请不要使用此选项,此项无助于解决这些问题,相反,您应当考虑通过离远麦克风、降低声音设备的音量或降低系统输入音量设定的方式解决此问题。 - + Input Boost combo box 输入增强选择框 - + If you need to add additional directories to the Connect dialog Directory drop down, you can enter the addresses here.<br> 如果您需要在“连接”对话框的“目录”下拉列表中添加其他目录,您可以在这里输入地址 - + Delete custom directory button 移除自定义目录按钮 - + Delete Custom Directory 移除自定义目录 - + Click the button to delete the currently selected custom directory. 单击此按钮以删除当前选择的自定义目录。 - + Audio Alerts 音频提示 - + Trigger an audio alert when receiving a chat message and when a new client joins the session. A second sound device may be required to hear the alerts. 收到聊天消息以及新客户端加入会话时触发音频警报。可能需要第二个声音设备来听到警报。 - + Audio Alerts check box 音频提示勾选框 - + Enable/disable MIDI-in port 启用/禁用MIDI输入端口 - + MIDI-in port check box MIDI输入端口勾选框 - + Pick-up Mode 拾音器模式 - + When enabled, MIDI fader and pan controls will wait until the physical controller position matches the current software value before responding. This prevents sudden jumps when your physical controller is out of sync with the software. 启用后,MIDI 推子和平移控件将等待物理控制器位置与当前软件值匹配,然后再做出响应。当您的物理控制器与软件不同步时,这可以防止对应的值突然变化。 - + Pick-up Mode check box 拾音器模式勾选框 - + Select which MIDI output port to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use your connection manager of choice to manually change connections. 选择要连接的 MIDI 输出端口。启用后,Jamulus 会自动将其 MIDI 输入端口连接到所选设备。您还可以使用选择的连接管理器手动更改连接。 - + Select which MIDI source to connect to. Jamulus will automatically connect its MIDI input port to the selected device when enabled.You can also use Audio MIDI Setup to manually change connections. 选择要连接的 MIDI 源。启用后,Jamulus 将自动将其 MIDI 输入端口连接到所选设备。您还可以使用音频 MIDI 设置来手动更改连接。 - + Select which MIDI input device(s) Jamulus should listen to. Select 'All Devices' to receive MIDI from all connected devices, or choose a specific device. 选择 Jamulus 应监听的 MIDI 输入设备。选择“所有设备”以从所有连接的设备接收 MIDI,或选择一个特定的设备。 - + MIDI input device combo box MIDI 输入设备下拉框 - + MIDI controller settings MIDI 控制器设置 - + There is one global MIDI channel parameter (0-16) and two parameters you can set for each item controlled: First MIDI CC and consecutive CC numbers (count). First set the channel you want Jamulus to listen on (0 for all channels). Then, for each item you want to control (volume fader, pan, solo, mute), set the first MIDI CC (CC number to start from) and number of consecutive CC numbers (count). There is one exception that does not require establishing consecutive CC numbers which is the “Mute Myself” parameter - it only requires a single CC number as it is only applied to one’s own audio stream. 有一个全局 MIDI 通道参数 (0-16) 和两个可为每个控制项目设置的参数:第一个 MIDI CC 和连续 CC 编号(计数)。首先设置您希望 Jamulus 收听的通道(0 表示所有通道)。然后,对于要控制的每个项目(音量推子、声相、独奏、静音),设置第一个 MIDI CC(从其开始的 CC 编号)和连续 CC 编号的数量(计数)。有一个例外,不需要建立连续的 CC 编号,即“静音自己”参数 - 它只需要一个 CC 编号,因为它仅适用于自己的音频流。 - + You can either type in the MIDI CC values or use the "Learn" button: click on "Learn", actuate the fader/knob/button on your MIDI controller, and the MIDI CC number will be detected and saved. 您可以输入 MIDI CC 值或使用“学习”按钮:单击“学习”,启动 MIDI 控制器上的推子/旋钮/按钮,将检测并保存 MIDI CC 编号。 - + MIDI channel combo box MIDI 通道下拉框 - + Mute Myself MIDI CC number spin box 静音自己 MIDI CC 数字输入控件 - + Fader offset spin box 推子偏移量输入控件 - + Pan offset spin box 生相偏移量输入控件 - + Solo offset spin box 独奏偏移量输入控件 - + Mute offset spin box 静音偏移量输入控件 - + Mute Myself MIDI learn button 静音自己 MIDI 学习按钮 - + Fader offset MIDI learn button 推子偏移量 MIDI 学习按钮 - + Pan offset MIDI learn button 声像偏移量 MIDI 学习按钮 - + Solo offset MIDI learn button 独奏偏移量 MIDI 学习按钮 - + Mute offset MIDI learn button 独奏偏移量 MIDI 学习按钮 - + + Max + + + + Bar (narrow) 窄条 - + Bar (wide) 条状 - + LEDs (stripe) 条纹 LED - + LEDs (round, small) 圆形小 LED - + LEDs (round, big) 圆形大 LED - + Write your name or an alias here so the other musicians you want to play with know who you are. You may also add a picture of the instrument you play and a flag of the country or region you are located in. Your city and skill level playing your instrument may also be added. 在此填写您的名字或别名以便合奏的其他乐手知道您是谁。您也可以添加乐器的图片以及您所在国家或地区的旗帜。您还可以添加您的城市和水平程度的相关信息。 - + Country/region flag button 国家/地区旗帜按钮 - + Learn 学习 - - + + All Devices 所有设备 - + No device connected 没有已连接的设备 - - + + MIDI Device Not Found MIDI 设备未找到 - + The MIDI device "%1" could not be found. Using all available devices instead. MIDI 设备 "%1" 未找到。将使用所有可用设备。 - + The MIDI device "%1" is not currently available. Select a different device from the dropdown to connect. MIDI 设备 "%1" 当前不可用。请从下拉框选择一个不同的设备以连接。 - - + + MIDI Device Connection Failed MIDI 设备连接失败 - + Could not connect to MIDI device "%1". Please check your OS configuration. 无法连接到 MIDI 设备 "%1"。请检查你的系统配置。 - + Could not connect to MIDI device "%1". Please check that the device is available. 无法连接到 MIDI 设备 "%1"。请检查这个设备是否可用。 - + Listening... 监听中... - + Number of Mixer Panel Rows 混音面板行数 - + Adjust the number of rows used to arrange the mixer panel. 调整用于呈现混音面板的行数。 - + Number of Mixer Panel Rows spin box 混音面板行数数字框 - + Feedback Protection 反馈保护 - + Prevents acoustic feedback between microphone and speakers. 防止麦克风和扬声器之间的声反馈。 - + Feedback Protection check box 自激保护勾选框 - + ASIO Device Settings ASIO 驱动设置 - + Low - - + + Normal 一般 - + High - + Fancy 精致 - + Compact 紧凑 - - - - + + + + None - + Musician Profile 乐手信息 - + Alias or name edit box 名称或别名编辑框 - + Instrument picture button 乐器图片按钮 - + City edit box 城市编辑框 - + Skill level combo box 水平程度选择框 - + Beginner 新手 - + Intermediate 中级 - + Expert 专家 - - + + Could not open MIDI port 无法打开 MIDI 端口 - + No MIDI devices found. Please connect a MIDI device and try again. 未找到 MIDI 设备。请连接一个 MIDI 设备后再试一次。 - + Please check your OS configuration. 请检查你的系统配置。 - - + + Size: 大小: - + Buffer Delay 缓冲区延迟 - + Buffer Delay: 缓冲区延迟: - + Center 中心 - + R - + Custom 自定义 - + Any Genre 2 任何流派 2 - Any Genre 3 - 任何流派 3 + 任何流派 3 - + + Any Genre Asia + + + + Genre Rock 摇滚流派 - + Genre Jazz 爵士流派 - + Genre Classical/Folk 古典/民间流派 - + Genre Choral/Barbershop 唱诗/合唱流派 - + Any Genre 1 任何流派 1 - + Drum Set 组鼓 - + Djembe 非洲鼓 - + Electric Guitar 电吉他 - + Acoustic Guitar 原声吉他 - + Bass Guitar 贝斯 - + Keyboard 键盘手 - + Synthesizer 合成器 - + Grand Piano 大钢琴 - + Accordion 手风琴 - + Vocal 歌手 - + Microphone 麦克风 - + Harmonica 口琴 - + Trumpet 小号 - + Trombone 长号 - + French Horn 圆号 - + Tuba 大号 - + Saxophone 萨克斯 - + Clarinet 单簧管 - + Flute 长笛 - + Violin 小提琴 - + Cello 大提琴 - + Double Bass 低音提琴 - + Recorder 录音员 - + Streamer 直播推流员 - + Listener 听众 - + Guitar+Vocal 吉他弹唱 - + Keyboard+Vocal 键盘手弹唱 - + Bodhran 宝思兰鼓 - + Bassoon 大管 - + Oboe 双簧管 - + Harp 竖琴 - + Viola 中提琴 - + Congas 康茄鼓 - + Bongo 邦戈鼓 - + Vocal Bass 男低音 - + Vocal Tenor 男高音 - + Vocal Alto 女低音 - + Vocal Soprano 女高音 - + Banjo 班卓琴 - + Mandolin 曼陀林 - + Ukulele 尤克里里 - + Bass Ukulele 贝斯尤克里里 - + Vocal Baritone 男中音 - + Vocal Lead 领唱 - + Mountain Dulcimer 扬琴 - + Scratching 打碟 - + Rapping 饶舌歌手 - + Vibraphone 铁琴 - + Conductor 指挥 @@ -2510,117 +2519,117 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CConnectDlg - + Directory 分类目录 - + Shows the servers listed by the selected directory. You can add custom directories in Advanced Settings. 根据所选分类目录展示服务器列表。您可以在高级选项中添加自定义的分类目录。 - + Directory combo box 分类目录下拉框 - + Filters the server list by the given text. Note that the filter is case insensitive. A single # character will filter for those servers with at least one person connected. 根据给定文字过滤服务器列表。请注意过滤文字并非大小写敏感的。使用单 # 字符以过滤展示至少有一个人连接到的服务器。 - + Uncheck to collapse the server list to show just the server details. Check to show everyone on the servers. 取消勾选以收起服务器列表来仅展示服务器信息。勾选以展示加入对应服务器的所有用户。 - + Server List 服务器列表 - + The Connection Setup window lists the available servers registered with the selected directory. Use the Directory dropdown to change the directory, find the server you want to join in the server list, click on it, and then click the Connect button to connect. Alternatively, double click on the server name to connect. 连接配置窗口列出了所选的分类目录下可供使用的服务器列表。使用分类目录下拉框来选择分类目录,在服务器列表中找到您想要加入的服务器,点击选中它,然后点击“连接”按钮以进行连接。或者,您也可以双击服务器名称来进行连接。 - + Permanent servers (those that have been listed for longer than 48 hours) are shown in bold. 永久服务器(指在服务器列表中存在超过 48 小时的服务器)会以粗体标识。 - + You can add custom directories in Advanced Settings. 您可以在高级设置中添加自定义的分类目录项。 - + Server list view 服务器列表视图 - + Server Address 服务器地址 - + If you know the server address, you can connect to it using the Server name/Address field. An optional port number can be added after the server address using a colon as a separator, e.g. %1. The field will also show a list of the most recently used server addresses. 如果你知道服务器地址,你可以使用服务器名称/地址一栏来连接到对应的服务器。一个可选的端口号可以附在后面,通过半角冒号作为分割符。例如:%1。此位置也将显示一个最近使用过的服务器地址的列表。 - + Holds the current server address. It also stores old addresses in the combo box list. 存储了当前服务器地址。在下拉列表中,也存储了旧的服务器地址列表。 - + Delete server address button 删除服务器地址按钮 - + Delete Server Address 删除服务器地址 - + Click the button to clear the currently selected server address and delete it from the list of stored servers. 单击该按钮可清除当前选择的服务器地址,并将其从存储的服务器列表中删除。 - + Ping Ping - + Server address edit box 服务器地址编辑框 - + Filter 筛选器 - + Filter edit box 过滤器输入框 - + Show All Musicians 显示所有乐手 - + Show all musicians check box 显示所有乐手勾选框 - + Filter text, or # for occupied servers 过滤文字,或使用 # 选择使用的服务器 @@ -2691,43 +2700,43 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CHelpMenu - + &Help 帮助(&H) - - + + Getting &Started... 入门(&S)... - + Software &Manual... 软件说明书(&M)... - + What's &This 这是什么(&T) - + P&rivacy policy... 隐私政策(&R)... - + &About Jamulus... 关于 Jamulus(&A)... - + About &Qt... 关于 &Qt... - + About Qt 关于 Qt @@ -2735,12 +2744,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLanguageComboBox - + Restart Required 需要重启 - + Please restart the application for the language change to take effect. 请重启应用程序以使语言变更生效. @@ -2748,22 +2757,22 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CLicenceDlg - + This server requires you accept conditions before you can join. Please read these in the chat window. 此服务器需要你同意一些条件才可加入。请阅读聊天窗口中的内容。 - + I have read the conditions and &agree. 我已阅读并同意这些条件(&A)。 - + Accept 接受 - + Decline 拒绝 @@ -2771,17 +2780,17 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMultiColorLED - + Red - + Yellow - + Green 绿 @@ -2789,7 +2798,7 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CMusProfDlg - + No Name 无名称 @@ -2797,449 +2806,449 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerDlg - + Client List 客户端列表 - + The client list shows all clients which are currently connected to this server. Some information about the clients like the IP address and name are given for each connected client. 客户端列表显示了所有连接到此服务器的客户端。例如 IP 地址和名称等信息由各个客户端提供。 - + Connected clients list view 已连接的客户端列表视图 - + <b>Directory:</b> Select '%1' not to register your server with a directory.<br>Or select one of the genres to register with that directory.<br>Or select '%2' and specify a Custom Directory address on the Options tab to register with a custom directory.<br><br>For any value except '%1', this server registers with a directory so that a %3 user can select this server in the client connect dialog server list when they choose that directory.<br><br>The registration of the server is renewed periodically to make sure that all servers in the connect dialog server list are actually available. %1: directory type NONE; %2: directory type CUSTOM; %3 app name, Jamulus <b>目录:</b>选择 '%1' 不在目录中注册你的服务器。<br>或者选择其中一个流派在该目录中注册。<br>或者选择 '%2' 并在选项标签上指定一个自定义目录地址,在一个自定义目录中注册。<br><br>对于除'%1'以外的任何值,该服务器都会与一个目录注册,这样,当 %3 的用户选择该目录时,可以在客户端连接对话服务器列表中选择该服务器。<br><br>服务器的注册会定期更新,以确保连接对话服务器列表中的所有服务器都是实际可用的。 - + Start Minimized on Operating System Start 操作系统启动时以最小化状态启动 - + Register Server Status 登记服务器状态 - + If the start minimized on operating system start check box is checked, the server will be started when the operating system starts up and is automatically minimized to a system task bar icon. 如果选中了操作系统启动时以最小化状态启动勾选框,服务器程序将随操作系统启动时自动启动并最小化至系统任务栏。 - + Server Name 服务器名称 - + The server name identifies your server in the connect dialog server list at the clients. 服务器名称在客户端的连接对话框的服务器列表中对应服务器的显示标识。 - + Server name line edit 服务器名称编辑框 - + Location City 所处城市 - + The city in which this server is located can be set here. If a city name is entered, it will be shown in the connect dialog server list at the clients. 设置服务器所处于的城市。如果输入了城市名称,其将被显示在客户端的连接对话框的服务器列表中。 - + City where the server is located line edit 服务器所位于的城市的编辑框 - + Language 语言(Lang) - + Select the language to be used for the user interface. 选择用于用户界面的语言。 - + Language combo box 语言选择框 - + Display dialog to select recording directory button 打开可供选择录制存储位置的对话框的按钮 - - + + Main Recording Directory 主要录制目录 - + Main recording directory text box (read-only) 主录制路径文本框(只读) - + Clear the recording directory button 清除录制目录按钮 - + Clear Recording Directory 清除录制目录 - + Click the button to clear the currently selected recording directory. This will prevent recording until a new value is selected. 点击按钮以清除当前所选择的录制路径。在设置新的位置之前将不再可以开始新的录制。 - + Checkbox to turn on or off server recording 开启或关闭录制的勾选框 - + Jam Recorder Jam 录音器 - + Current session directory text box (read-only) 当前会话目录文本框(只读) - + Current Session Directory 当前会话目录 - + Enabled during recording and holds the current recording session directory. Disabled after recording or when the recorder is not enabled. 这句话原文可能有问题 用于存储录制时当前会话所录制到的位置,录制未进行时且未开启录制功能时此项将不可用。 - + Recorder status label 录制状态标签 - + Recorder Status 录音器状态 - + Displays the current status of the recorder. The following values are possible: 显示当前录音功能的状态。 可能为下述值: - + There is no one connected to the server to record. 没有人连接到服务器以供录制。 - + The performers are being recorded to the specified session directory. 演奏已被录制到会话所对应的目录中。 - + NOTE 注意 - + Server welcome message edit box 服务器欢迎信息编辑框 - + Server Welcome Message 服务器欢迎信息 - + A server welcome message text is displayed in the chat window if a musician enters the server. If no message is set, the server welcome is disabled. 当新的乐手加入服务器时,欢迎信息将会显示在聊天窗口中。若未设置欢迎信息,则服务器欢迎功能将为关闭状态。 - + Custom Directory line edit 自定义目录编辑框 - + &Hide %1 server 隐藏 %1 服务器(&H) - + &Show %1 server 显示 %1 服务器(&S) - + %1 server %1 is the name of the main application %1 服务器 - + Type a message here. If no message is set, the server welcome is disabled. 在此输入消息文字。若未设定消息文字,服务器欢迎信息将为关闭状态。 - + %1 Server %1 is the name of the main application %1 服务器 - + Recorder failed to start. Please check available disk space and permissions and try again. Error: 录音功能启动失败。请检查可用的磁盘空间和权限然后再试一次。错误信息: - + ERROR 错误 - + Request new recording button 用于创建新的录制的按钮 - + Directory Type combo box 分类目录类型下拉框 - + When a value other than "%1" is chosen for Directory, this will show whether registration is successful. If the registration failed, please choose a different directory. 当一个非“%1”的选项被作为目录选择时,此处将呈现登记情况是否成功的状态。若登记失败,则请选择一个其它的目录。 - + Country/Region 国家/地区 - + Set the country or region where the server is running. Clients will show this location in their connect dialog's server list. 设置当前服务器所位于的国家或地区。客户端将在服务器列表对话框中展示此位置信息。 - + Combo box for location of this server 服务器位置的选择框 - + When checked, the recorder will run while a session is in progress (if set up correctly). 选中后,记录盒将在会话进行时运行(如果设置正确)。 - + New Recording 创建新录制 - + During a recording session, the button can be used to start a new recording. 在一次录制会话中,此按钮可供开始新的录制。 - + No recording directory has been set or the value is not useable. Check the value in the Options tab. 未设置录音目录或设置的值不可用。请在设置选项卡中检查对应的选项。 - + Recording has been switched off by the UI checkbox or JSON-RPC. 记录已被用户界面复选框或JSON-RPC关闭。 - + Recording has been switched off, by the UI checkbox, SIGUSR2 or JSON-RPC. 录音已被关闭,通过用户界面复选框、SIGUSR2或JSON-RPC。 - + If the recording directory is not useable, the problem will be displayed in place of the session directory. 如果录制目录不可用,问题将会被显示在此位置。 - + Click the button to open the dialog that allows the main recording directory to be selected. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). 点击按钮以打开可供选择录制目录位置的对话框。 所选值必须存在且可写入(允许运行 %1 的用户创建子目录)。 - + The current value of the main recording directory. The chosen value must exist and be writeable (allow creation of sub-directories by the user %1 is running as). Click the button to open the dialog that allows the main recording directory to be selected. 当前录制目录路径的值。所选的值必须存在且可被写入(允许运行 %1 的用户创建子目录)。点击按钮以打开供选择主录制目录路径的对话框。 - + Custom Directory address 自定义目录服务器地址 - + The Custom Directory address is the address of the directory holding the server list to which this server should be added. 自定义目录指用于提供连接对话框中所展示的服务器列表信息的自定义的目录服务器的地址或。 - + Server List Filename dialog push button 服务器列表文件名对话框按钮 - - + + Server List Filename 服务器列表文件名 - + Click the button to open the dialog that allows the server list persistence file name to be set. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). 点击按钮以打开供选择存储服务器列表文件位置的对话框。运行 %1 的用户需要能够能够创建此文件(若对应的文件已存在则将在保存时覆盖文件内容)。 - + Server List Filename text box (read-only) 服务器列表文件名编辑框(只读) - + The current value of server list persistence file name. The user %1 is running as needs to be able to create the file name specified although it may already exist (it will get overwritten on save). Click the button to open the dialog that allows the server list persistence file name to be set. 当前持久存储服务器列表的文件名。运行 %1 的用户需要能够能够创建此文件(若对应的文件已存在则将在保存时覆盖文件内容)。点击按钮以打开可供设置持久存储服务器列表的文件名的对话框。 - + Clear the server list file name button 清除服务器列表文件名的按钮 - + Clear Server List Filename 清除服务器列表文件名 - + Click the button to clear the currently selected server list persistence file name. This will prevent persisting the server list until a new value is selected. 点击按钮来清除当前所选的服务器列表持久化存储的文件名。这将导致服务器列表不再持久存储到本地,直至一个新的文件名被设置。 - - + + E&xit 退出(&E) - + Now a directory 现在是目录了 - + &Window 窗口(&W) - + Select Main Recording Directory 选择录制存储位置 - + Recording 录制中 - + Not recording 未在录制 - + Not initialised 未初始化 - + Not enabled 未启用 - + None - + Not registered 未登记 - + Bad address 地址不正确 - + Registration requested 已请求登记 - + Registration failed 登记失败 - + Check server version 检查服务器版本 - + Registered 已登记 - + Server list full at directory 服务器列表在目录中已满 - + Your server version is too old 您的服务端版本过低 - + Requirements not fulfilled 要求未满足 - + Unknown value %1 未知的值 %1 @@ -3363,32 +3372,32 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CServerListManager - + Now a directory 现在是目录 - + No longer a directory 不再是一个目录 - + Could not open '%1' for read/write. Please check that %2 has permission (and that there is free space). 无法打开'%1'进行读/写。请检查%2是否有权限(以及是否有可用空间)。 - + Loading persistent server list file: %1 正在加载持久化服务器列表文件:%1 - + Could not write to '%1' 不能写入到 '%1' - + Saving registration for %1 (%2): %3 保存%1 (%2)的注册:%3 @@ -3396,68 +3405,68 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSound - + Error requesting stream stop: $s 请求流停止时遇到错误: $s - + Error closing stream: $s 关闭流时遇到错误: $s - + The selected audio device is no longer present in the system. Please check your audio device. 所选的音频设备已不存在于您的系统中。请检查您的音频设备。 - + Couldn't initialise the audio driver. Check if your audio hardware is plugged in and verify your driver settings. 无法初始化音频驱动。请检查您的音频硬件设备是否已经插入并检查您的驱动设定。 - + The selected audio device is incompatible since it doesn't support a sample rate of %1 Hz. Please select another device. 由于所选的音频设备不支持于采样率 %1 Hz 下工作,故其处于不兼容状态。请选择其它设备。 - + The current audio device configuration is incompatible because the sample rate couldn't be set to %2 Hz. Please check for a hardware switch or driver setting to set the sample rate manually and restart %1. 由于采样率无法被设置到 %2 Hz,故当前音频设备选项不兼容。请检查硬件上的开关或驱动设定,手动设置其采样率并重启 %1。 - + The selected audio device is incompatible since it doesn't support %1 in/out channels. Please select another device or configuration. 由于所选的音频设备不支持 %1 声道输入/输出,故其处于不兼容状态。请选择其它设备或配置。 - - + + The selected audio device is incompatible since the required audio sample format isn't available. Please use another device. 由于所需的采样格式不可用,故当前所选的音频设备处于不兼容状态。请使用其它设备。 - + No ASIO audio device driver found. 未发现 ASIO 音频设备驱动. - + Please install an ASIO driver before running %1. If you own a device with ASIO support, install its official ASIO driver. If not, you'll need to install a universal driver like ASIO4ALL. 请在运行 %1 前安装 ASIO 驱动。如果您由一个受 ASIO 支持的设备,请安装其官方 ASIO 驱动。若没有,您需要安装一个通用的驱动,如 ASIO4ALL。 - + JACK couldn't be started automatically. Please start JACK manually and check for error messages. JACK 未能自动启动。请手动启动 JACK 并检查错误信息。 - + JACK isn't running at a sample rate of <b>%1 Hz</b>. Please use a tool like <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> to set the the JACK sample rate to %1 Hz. JACK 未在采样率 <b>%1 Hz</b> 下运行。请使用例如 <i><a href="https://qjackctl.sourceforge.io">QjackCtl</a></i> 的工具将 JACK 配置到 %1 Hz。 - + The JACK port registration failed. This is probably an error with JACK. Please stop %1 and JACK. Afterwards check if another program at a sample rate of %2 Hz can connect to JACK. JACK 端口注册失败。这可能是由于 JACK 的错误所至。请停止运行 %1 和 JACK。然后就检查使用采样率 %2 的其它程序是否可以连接到 JACK。 @@ -3466,62 +3475,62 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe JACK 端口注册失败。这可能是由于 JACK 的错误所至。请停止运行 %1 和 JACK。然后就检查其它 MIDI 程序是否可以连接到 JACK。 - + Can't activate the JACK client. This is probably an error with JACK. Please check the JACK output. 无法启用 JACK 客户端。这可能是由于 JACK 的错误所至。请检查 JACK 输出。 - + JACK was shut down. %1 requires JACK to run. Please restart %1 to start JACK again. JACK 为停止状态。%1 需要 JACK 才能运行。请重启 %1 来再次启动 JACK。 - + No sound card is available in your system. CoreAudio input AudioHardwareGetProperty call failed. 您的系统中没有声卡可用。CoreAudio 输入 AudioHardwareGetProperty 调用失败。 - + No sound card is available in the system. CoreAudio output AudioHardwareGetProperty call failed. 您的系统中没有声卡可用。CoreAudio 输入 AudioHardwareGetProperty 调用失败。 - + The currently selected audio device is no longer present. Please check your audio device. 当前所选的音频设备已不存在。请检查您的音频设备。 - + The audio input device is no longer available. Please check if your input device is connected correctly. 音频输入设备已不再可用。请检查您的音频输入设备是否已正确连接。 - + The sample rate on the current input device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 当前输入设备的采样率并非 %1 Hz,故不兼容。请选择其它设备或尝试通过 音频-MIDI-选项(位于 应用程序>辅助功能)手动设定其采样率到 %1 Hz。 - + The audio output device is no longer available. Please check if your output device is connected correctly. 音频输出设备不再可用。请检查您的输出设备是否已正确连接。 - + The sample rate on the current output device isn't %1 Hz and is therefore incompatible. Please select another device or try setting the sample rate to %1 Hz manually via Audio-MIDI-Setup (in Applications->Utilities). 当前输出设备的采样率并非 %1 Hz,故不兼容。请选择其它设备或尝试通过 音频-MIDI-选项(位于 应用程序>辅助功能)手动设定其采样率到 %1 Hz。 - + The stream format on the current input device isn't compatible with this software. Please select another device. 当前输入设备的媒体流格式与此软件不兼容。请选择其它设备。 - + The stream format on the current output device isn't compatible with %1. Please select another device. 当前输出设备的媒体流格式与 %1 不兼容。请选择其它设备。 - + The buffer sizes of the current input and output audio device can't be set to a common value. Please select different input/output devices in your system settings. 当前音频输入输出设备的缓冲区大小无法被设定到一个常见的值。请在您的系统设置中选择其它的输入/输出设备。 @@ -3529,27 +3538,27 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe CSoundBase - + Can't use the selected audio device because of the following error: %1 The previous driver will be selected. 由于以下原因,无法使用所选的音频设备:%1 将会使用之前的设备。 - + The previously selected audio device is no longer available or the driver has changed to an incompatible state. We'll attempt to find a valid audio device, but this new audio device may cause feedback. Before connecting to a server, please check your audio device settings. 之前所选的音频设备已不再可用或现处于不兼容的状态。我们将尝试寻找一个有效的音频设备,但新的设备可能会产生自激。在连接刀服务器前,请考虑检查您的音频设备设置项。 - + <b>%1 couldn't find a usable %2 audio device.</b><br><br> <b>%1 未发现可用的 %2 音频设备。</b><br><br> - + You may be able to fix errors in the driver settings. Do you want to open these settings now? 您可能可通过驱动设置来修复问题。要打开对应的设置吗? - + Can't start %1. Please restart %1 and check/reconfigure your audio settings. 无法启动 %1。请重启 %1 并检查/重新配置您的音频设置选项。 @@ -3557,53 +3566,57 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe QCoreApplication - + %1, Version %2 %1 is app name, %2 is version number %1,版本 %2 - Released under the GNU General Public License version 2 or later (GPLv2) - 使用 GNU 通用许可证第2版或更高版本发布 (GPLv2) + 使用 GNU 通用许可证第2版或更高版本发布 (GPLv2) - + This app uses the following libraries, resources or code snippets: 此应用程序使用了以下依赖库,资源或代码片段: - + Qt cross-platform application framework Qt 跨平台应用程序框架 - + (build) (构建) - + (runtime) (运行时) - + Some pixmaps are from the %1 部分位图来自 %1 - + Some sound samples are from %1 部分声音采样来自 %1 - + Audio reverberation code by Perry R. Cook and Gary P. Scavone 音频混响代码作者为 Perry R. Cook 和 Gary P. Scavone - + + Released under the GNU Affero General Public License 3.0 (or any later version) + + + + Flag icons by Mark James 旗帜图标作者为 Mark James @@ -3611,12 +3624,12 @@ We muted your channel and activated 'Mute Myself'. Please solve the fe global - + A %1 upgrade is available: <a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>go to details and downloads</a> %1 更新已可用:<a style='color:red;' href='https://jamulus.io/upgrade?progversion=%2'>前往详情和下载页面</a> - + For more information use the "What's This" help (help menu, right mouse button or Shift+F1) 更多信息请通过“这是什么”查阅(帮助菜单,鼠标右键或 Shift+F1) diff --git a/src/util.cpp b/src/util.cpp index 4fd1f3af59..eba8ce47a4 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * --------------------------------------------------------------------------- + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -373,18 +395,34 @@ CAboutDlg::CAboutDlg ( QWidget* parent ) : CBaseDlg ( parent ) " the audio data from each client, mixes the audio data and sends the mix " " back to each client." ) + "

    " - "

    " // GPL header text - "This program is free software; you can redistribute it and/or modify " + "

    " // license notice (see file headers) + "As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed " + "under AGPL 3.0 or any later version.

    " + "Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. " + "This code will be licensed under GPL 3.0 (or any later version) from " + "3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern " + "the combined work, including network use provisions.

    " + "This program is free software: you can redistribute it and/or modify " + "it under the terms of the GNU Affero General Public License as published by " + "the Free Software Foundation, either version 3 of the License, or " + "(at your option) any later version.
    This program is distributed in " + "the hope that it will be useful, but WITHOUT ANY WARRANTY; without " + "even the implied warranty of MERCHANTABILITY or FITNESS FOR A " + "PARTICULAR PURPOSE. See the GNU Affero General Public License for more " + "details.
    You should have received a copy of the GNU Affero General Public " + "License along with this program. If not, see " + "<https://www.gnu.org/licenses/>.
    " + "---------------------------------------------------------------------------
    " + "This program is free software: you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " - "the Free Software Foundation; either version 2 of the License, or " + "the Free Software Foundation, either version 3 of the License, or " "(at your option) any later version.
    This program is distributed in " "the hope that it will be useful, but WITHOUT ANY WARRANTY; without " "even the implied warranty of MERCHANTABILITY or FITNESS FOR A " - "PARTICULAR PURPOSE. See the GNU General Public License for more " + "PARTICULAR PURPOSE. See the GNU General Public License for more " "details.
    You should have received a copy of the GNU General Public " - "License along with his program; if not, write to the Free Software " - "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 " - "USA" + "License along with this program. If not, see " + "<https://www.gnu.org/licenses/>." "

    " ); // libraries used by this compilation @@ -419,7 +457,8 @@ CAboutDlg::CAboutDlg ( QWidget* parent ) : CBaseDlg ( parent ) "

    " "

    " + tr ( "Flag icons by Mark James" ) + - ", http://www.famfamfam.com" + ", " + "via www.iconarchive.com (originally www.famfamfam.com)" "

    " "

    " + QString ( tr ( "Some sound samples are from %1" ) ).arg ( "Freesound" ) + @@ -719,13 +758,26 @@ QSize CMinimumStackedLayout::sizeHint() const } return QStackedLayout::sizeHint(); } + +void PlayAudioAlert ( QUrl soundUrl ) +{ + QSoundEffect* sf = new QSoundEffect(); + QObject::connect ( sf, &QSoundEffect::playingChanged, sf, [sf]() { + if ( !sf->isPlaying() ) + { + sf->deleteLater(); + } + } ); + sf->setSource ( soundUrl ); + sf->play(); +} #endif /******************************************************************************\ * Other Classes * \******************************************************************************/ // Network utility functions --------------------------------------------------- -bool NetworkUtil::ParseNetworkAddressString ( QString strAddress, QHostAddress& InetAddr, bool bEnableIPv6 ) +bool NetworkUtil::ParseNetworkAddressString ( QString strAddress, QHostAddress& InetAddr, const bool bIPv6Available ) { // try to get host by name, assuming // that the string contains a valid host name string or IP address @@ -741,7 +793,7 @@ bool NetworkUtil::ParseNetworkAddressString ( QString strAddress, QHostAddress& { // qInfo() << qUtf8Printable ( QString ( "Resolved network address to %1 for proto %2" ) .arg ( HostAddr.toString() ) .arg ( // HostAddr.protocol() ) ); - if ( HostAddr.protocol() == QAbstractSocket::IPv4Protocol || ( bEnableIPv6 && HostAddr.protocol() == QAbstractSocket::IPv6Protocol ) ) + if ( HostAddr.protocol() == QAbstractSocket::IPv4Protocol || ( bIPv6Available && HostAddr.protocol() == QAbstractSocket::IPv6Protocol ) ) { InetAddr = HostAddr; return true; @@ -751,7 +803,7 @@ bool NetworkUtil::ParseNetworkAddressString ( QString strAddress, QHostAddress& } #ifndef DISABLE_SRV_DNS -bool NetworkUtil::ParseNetworkAddressSrv ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ) +bool NetworkUtil::ParseNetworkAddressSrv ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ) { // init requested host address with invalid address first HostAddress = CHostAddress(); @@ -799,7 +851,7 @@ bool NetworkUtil::ParseNetworkAddressSrv ( QString strAddress, CHostAddress& Hos QString ( "resolved %1 to a single SRV record: %2:%3" ).arg ( strAddress ).arg ( record.target() ).arg ( record.port() ) ); QHostAddress InetAddr; - if ( ParseNetworkAddressString ( record.target(), InetAddr, bEnableIPv6 ) ) + if ( ParseNetworkAddressString ( record.target(), InetAddr, bIPv6Available ) ) { HostAddress = CHostAddress ( InetAddr, record.port() ); return true; @@ -808,20 +860,20 @@ bool NetworkUtil::ParseNetworkAddressSrv ( QString strAddress, CHostAddress& Hos } #endif -bool NetworkUtil::ParseNetworkAddress ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ) +bool NetworkUtil::ParseNetworkAddress ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ) { #ifndef DISABLE_SRV_DNS // Try SRV-based discovery first: - if ( ParseNetworkAddressSrv ( strAddress, HostAddress, bEnableIPv6 ) ) + if ( ParseNetworkAddressSrv ( strAddress, HostAddress, bIPv6Available ) ) { return true; } #endif // Try regular connect via plain IP or host name lookup (A/AAAA): - return ParseNetworkAddressBare ( strAddress, HostAddress, bEnableIPv6 ); + return ParseNetworkAddressBare ( strAddress, HostAddress, bIPv6Available ); } -bool NetworkUtil::ParseNetworkAddressBare ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ) +bool NetworkUtil::ParseNetworkAddressBare ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ) { QHostAddress InetAddr; unsigned int iNetPort = DEFAULT_PORT_NUMBER; @@ -886,7 +938,7 @@ bool NetworkUtil::ParseNetworkAddressBare ( QString strAddress, CHostAddress& Ho // first try if this is an IP number an can directly applied to QHostAddress if ( InetAddr.setAddress ( strAddress ) ) { - if ( !bEnableIPv6 && InetAddr.protocol() == QAbstractSocket::IPv6Protocol ) + if ( !bIPv6Available && InetAddr.protocol() == QAbstractSocket::IPv6Protocol ) { // do not allow IPv6 addresses if not enabled // qInfo() << qUtf8Printable ( QString ( "IPv6 addresses disabled" ) ); @@ -902,7 +954,7 @@ bool NetworkUtil::ParseNetworkAddressBare ( QString strAddress, CHostAddress& Ho return false; // invalid address } - if ( !ParseNetworkAddressString ( strAddress, InetAddr, bEnableIPv6 ) ) + if ( !ParseNetworkAddressString ( strAddress, InetAddr, bIPv6Available ) ) { // no valid address found // qInfo() << qUtf8Printable ( QString ( "No IP address found for hostname" ) ); @@ -964,17 +1016,17 @@ QString NetworkUtil::GetDirectoryAddress ( const EDirectoryType eDirectoryType, case AT_CUSTOM: return strDirectoryAddress; case AT_ANY_GENRE2: - return CENTSERV_ANY_GENRE2; - case AT_ANY_GENRE3: - return CENTSERV_ANY_GENRE3; + return DIR_ADDR_ANY_GENRE2; + case AT_ANY_GENRE_ASIA: + return DIR_ADDR_ANY_GENRE_ASIA; case AT_GENRE_ROCK: - return CENTSERV_GENRE_ROCK; + return DIR_ADDR_GENRE_ROCK; case AT_GENRE_JAZZ: - return CENTSERV_GENRE_JAZZ; + return DIR_ADDR_GENRE_JAZZ; case AT_GENRE_CLASSICAL_FOLK: - return CENTSERV_GENRE_CLASSICAL_FOLK; + return DIR_ADDR_GENRE_CLASSICAL_FOLK; case AT_GENRE_CHORAL: - return CENTSERV_GENRE_CHORAL; + return DIR_ADDR_GENRE_CHORAL; default: return DEFAULT_SERVER_ADDRESS; // AT_DEFAULT } @@ -1535,17 +1587,48 @@ QString GetVersionAndNameStr ( const bool bDisplayInGui ) strVersionText += "\n *** "; } - strVersionText += QCoreApplication::tr ( "Released under the GNU General Public License version 2 or later (GPLv2)" ); + strVersionText += QCoreApplication::tr ( "Released under the GNU Affero General Public License 3.0 (or any later version)" ); if ( !bDisplayInGui ) { - // additional non-translated text to show in console output - strVersionText += "\n *** "; + // additional non-translated text to show in console output (see file headers) + strVersionText += "\n *** "; + strVersionText += "\n *** "; + strVersionText += "\n *** As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed"; + strVersionText += "\n *** under AGPL 3.0 or any later version."; + strVersionText += "\n *** "; + strVersionText += "\n *** Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+."; + strVersionText += "\n *** This code will be licensed under GPL 3.0 (or any later version) from"; + strVersionText += "\n *** 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern"; + strVersionText += "\n *** the combined work, including network use provisions."; + strVersionText += "\n *** "; + strVersionText += "\n *** This program is free software: you can redistribute it and/or modify"; + strVersionText += "\n *** it under the terms of the GNU Affero General Public License as published by"; + strVersionText += "\n *** the Free Software Foundation, either version 3 of the License, or"; + strVersionText += "\n *** (at your option) any later version."; + strVersionText += "\n *** "; + strVersionText += "\n *** This program is distributed in the hope that it will be useful,"; + strVersionText += "\n *** but WITHOUT ANY WARRANTY; without even the implied warranty of"; + strVersionText += "\n *** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"; + strVersionText += "\n *** GNU Affero General Public License for more details."; + strVersionText += "\n *** "; + strVersionText += "\n *** You should have received a copy of the GNU Affero General Public License"; + strVersionText += "\n *** along with this program. If not, see ."; + strVersionText += "\n *** "; + strVersionText += "\n *** ---------------------------------------------------------------------------"; + strVersionText += "\n *** "; + strVersionText += "\n *** This program is free software: you can redistribute it and/or modify"; + strVersionText += "\n *** it under the terms of the GNU General Public License as published by"; + strVersionText += "\n *** the Free Software Foundation, either version 3 of the License, or"; + strVersionText += "\n *** (at your option) any later version."; + strVersionText += "\n *** "; + strVersionText += "\n *** This program is distributed in the hope that it will be useful,"; + strVersionText += "\n *** but WITHOUT ANY WARRANTY; without even the implied warranty of"; + strVersionText += "\n *** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"; + strVersionText += "\n *** GNU General Public License for more details."; strVersionText += "\n *** "; - strVersionText += "\n *** This program is free software; you can redistribute it and/or modify it under"; - strVersionText += "\n *** the terms of the GNU General Public License as published by the Free Software"; - strVersionText += "\n *** Foundation; either version 2 of the License, or (at your option) any later version."; - strVersionText += "\n *** There is NO WARRANTY, to the extent permitted by law."; + strVersionText += "\n *** You should have received a copy of the GNU General Public License"; + strVersionText += "\n *** along with this program. If not, see ."; strVersionText += "\n *** "; strVersionText += "\n *** " + QCoreApplication::tr ( "This app uses the following libraries, resources or code snippets:" ); @@ -1573,7 +1656,7 @@ QString GetVersionAndNameStr ( const bool bDisplayInGui ) strVersionText += "\n *** "; strVersionText += "\n *** "; strVersionText += "\n *** " + QCoreApplication::tr ( "Flag icons by Mark James" ); - strVersionText += "\n *** "; + strVersionText += "\n *** https://www.iconarchive.com/artist/famfamfam.html (originally www.famfamfam.com)"; strVersionText += "\n *** "; strVersionText += "\n *** " + QString ( QCoreApplication::tr ( "Some sound samples are from %1" ) ).arg ( "Freesound" ); strVersionText += "\n *** "; diff --git a/src/util.h b/src/util.h index e83e1f764a..1185c56936 100644 --- a/src/util.h +++ b/src/util.h @@ -4,21 +4,43 @@ * Author(s): * Volker Fischer * + * As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed + * under AGPL 3.0 or any later version. + * + * Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. + * This code will be licensed under GPL 3.0 (or any later version) from + * 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern + * the combined work, including network use provisions. + * ****************************************************************************** * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * --------------------------------------------------------------------------- * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * \******************************************************************************/ @@ -36,7 +58,7 @@ # include # include #else -// using mach nanosleep for Linux +// using nanosleep for Linux # include #endif #include @@ -53,6 +75,7 @@ #include #include #include + #ifndef DISABLE_SRV_DNS # include #endif @@ -72,6 +95,7 @@ # include # include # include +# include # include "ui_aboutdlgbase.h" #endif @@ -467,6 +491,8 @@ class CMinimumStackedLayout : public QStackedLayout CMinimumStackedLayout ( QWidget* parent = nullptr ) : QStackedLayout ( parent ) {} virtual QSize sizeHint() const override; }; + +void PlayAudioAlert ( QUrl soundUrl ); #endif /******************************************************************************\ @@ -502,10 +528,11 @@ enum ENetwFlags // Audio quality enum ---------------------------------------------------------- enum EAudioQuality { - // used for settings and the comobo box index -> enum values must be fixed! + // used for settings and the combo box index -> enum values must be fixed! AQ_LOW = 0, AQ_NORMAL = 1, - AQ_HIGH = 2 + AQ_HIGH = 2, + AQ_RAW = 3 }; // Get data status enum -------------------------------------------------------- @@ -582,7 +609,7 @@ enum EDirectoryType AT_NONE = -1, // means not registered, "invalid value" AT_DEFAULT = 0, AT_ANY_GENRE2 = 1, - AT_ANY_GENRE3 = 2, + AT_ANY_GENRE_ASIA = 2, AT_GENRE_ROCK = 3, AT_GENRE_JAZZ = 4, AT_GENRE_CLASSICAL_FOLK = 5, @@ -590,6 +617,25 @@ enum EDirectoryType AT_CUSTOM = 7 // Must be the last entry! }; +// Server feature set ---------------------------------------------------------- +enum EFeatureSet +{ + // used for protocol -> enum values must be fixed + FS_FAST_UPDATE = 0, + FS_MULTITHREADING = 1, + FS_RECORDER_ENABLED = 2, + FS_IS_RECORDING = 3, + FS_DELAY_PAN = 4, + FS_IPV6_AVAILABLE = 5, + FS_RAW_AUDIO = 6, + FS_DISCONONQUIT = 7, + FS_HAS_WELCOME_MESSAGE = 8, + FS_IS_LOGGING = 9, + FS_HAS_LICENCE = 10, + FS_HAS_GUI = 11, + FS_RPC_ENABLED = 12 +}; + inline QString DirectoryTypeToString ( EDirectoryType eAddrType ) { switch ( eAddrType ) @@ -600,8 +646,8 @@ inline QString DirectoryTypeToString ( EDirectoryType eAddrType ) case AT_ANY_GENRE2: return QCoreApplication::translate ( "CClientSettingsDlg", "Any Genre 2" ); - case AT_ANY_GENRE3: - return QCoreApplication::translate ( "CClientSettingsDlg", "Any Genre 3" ); + case AT_ANY_GENRE_ASIA: + return QCoreApplication::translate ( "CClientSettingsDlg", "Any Genre Asia" ); case AT_GENRE_ROCK: return QCoreApplication::translate ( "CClientSettingsDlg", "Genre Rock" ); @@ -676,10 +722,10 @@ inline QString svrRegStatusToString ( ESvrRegStatus eSvrRegStatus ) enum ESvrRegResult { // used for protocol -> enum values must be fixed! - SRR_REGISTERED = 0, - SRR_SERVER_LIST_FULL = 1, - SRR_VERSION_TOO_OLD = 2, - SRR_NOT_FULFILL_REQIREMENTS = 3 + SRR_REGISTERED = 0, + SRR_SERVER_LIST_FULL = 1, + SRR_VERSION_TOO_OLD = 2, + SRR_NOT_FULFILL_REQUIREMENTS = 3 }; // Skill level enum ------------------------------------------------------------ @@ -693,18 +739,18 @@ enum ESkillLevel }; // define the GUI RGB colors for each skill level -#define RGBCOL_R_SL_NOT_SET 255 -#define RGBCOL_G_SL_NOT_SET 255 -#define RGBCOL_B_SL_NOT_SET 255 -#define RGBCOL_R_SL_BEGINNER 255 -#define RGBCOL_G_SL_BEGINNER 255 -#define RGBCOL_B_SL_BEGINNER 200 -#define RGBCOL_R_SL_INTERMEDIATE 225 -#define RGBCOL_G_SL_INTERMEDIATE 255 -#define RGBCOL_B_SL_INTERMEDIATE 225 -#define RGBCOL_R_SL_SL_PROFESSIONAL 255 -#define RGBCOL_G_SL_SL_PROFESSIONAL 225 -#define RGBCOL_B_SL_SL_PROFESSIONAL 225 +#define RGBCOL_R_SL_NOT_SET 255 +#define RGBCOL_G_SL_NOT_SET 255 +#define RGBCOL_B_SL_NOT_SET 255 +#define RGBCOL_R_SL_BEGINNER 255 +#define RGBCOL_G_SL_BEGINNER 255 +#define RGBCOL_B_SL_BEGINNER 200 +#define RGBCOL_R_SL_INTERMEDIATE 225 +#define RGBCOL_G_SL_INTERMEDIATE 255 +#define RGBCOL_B_SL_INTERMEDIATE 225 +#define RGBCOL_R_SL_PROFESSIONAL 255 +#define RGBCOL_G_SL_PROFESSIONAL 225 +#define RGBCOL_B_SL_PROFESSIONAL 225 // Stereo signal level meter --------------------------------------------------- class CStereoSignalLevelMeter @@ -1053,13 +1099,13 @@ class CNetworkTransportProps class NetworkUtil { public: - static bool ParseNetworkAddressString ( QString strAddress, QHostAddress& InetAddr, bool bEnableIPv6 ); + static bool ParseNetworkAddressString ( QString strAddress, QHostAddress& InetAddr, const bool bIPv6Available ); #ifndef DISABLE_SRV_DNS - static bool ParseNetworkAddressSrv ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ); + static bool ParseNetworkAddressSrv ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ); #endif - static bool ParseNetworkAddress ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ); - static bool ParseNetworkAddressBare ( QString strAddress, CHostAddress& HostAddress, bool bEnableIPv6 ); + static bool ParseNetworkAddress ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ); + static bool ParseNetworkAddressBare ( QString strAddress, CHostAddress& HostAddress, const bool bIPv6Available ); static QString FixAddress ( const QString& strAddress ); static CHostAddress GetLocalAddress(); @@ -1114,8 +1160,10 @@ class COSUtil return OT_I_OS; #elif defined( Q_OS_ANDROID ) || defined( ANDROID ) return OT_ANDROID; -#else +#elif defined( Q_OS_LINUX ) return OT_LINUX; +#else + return OT_UNIX; #endif } }; @@ -1194,6 +1242,13 @@ class MathUtils return powf ( 10.0f, ( fInValueRange0_1 - 1.0f ) * AUD_MIX_FADER_RANGE_DB / 20.0f ); } } + + // return true if a value is within the lower and upper bounds (inclusively), otherwise false + template + static inline bool InRange ( T value, T lower, T upper ) + { + return !( value < lower || value > upper ); + } }; /******************************************************************************\ diff --git a/tools/changelog-helper.sh b/tools/changelog-helper.sh index 50a199f338..528370a329 100755 --- a/tools/changelog-helper.sh +++ b/tools/changelog-helper.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/tools/check-wininstaller-translations.sh b/tools/check-wininstaller-translations.sh index 9b38542ae3..7c25a5c179 100755 --- a/tools/check-wininstaller-translations.sh +++ b/tools/check-wininstaller-translations.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/tools/checkkeys.pl b/tools/checkkeys.pl index a0058af107..c3890055df 100755 --- a/tools/checkkeys.pl +++ b/tools/checkkeys.pl @@ -6,21 +6,43 @@ # Tony Mountifield # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/tools/create-translation-issues.sh b/tools/create-translation-issues.sh index 2e333ede95..d9402ed5b0 100755 --- a/tools/create-translation-issues.sh +++ b/tools/create-translation-issues.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/tools/generate_json_rpc_docs.py b/tools/generate_json_rpc_docs.py index 4497d3d485..0495c4b1af 100755 --- a/tools/generate_json_rpc_docs.py +++ b/tools/generate_json_rpc_docs.py @@ -3,24 +3,46 @@ # Copyright (c) 2022-2026 # # Author(s): -# Christian Hoffmann +# Thai Pangsakulyanont # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## @@ -197,7 +219,7 @@ def to_markdown(self): current_item.handle_tag("result") current_item.handle_text(line[len("/// @result "):]) elif line.startswith("///"): - current_item.handle_text(line[len("///"):]) + current_item.handle_text(line[len("///"):].lstrip()) elif line == "": pass else: @@ -238,7 +260,7 @@ def to_markdown(self): ## Connect to a JSON-RPC server -On Linux, you can connect to a JSON-RPC server using the `nc` CLI tool. +On Linux, you can connect to a JSON-RPC server using the `nc` CLI tool. On Windows, [you can download](https://nmap.org/ncat/) and use the `ncat` CLI tool. diff --git a/tools/get_release_contributors.py b/tools/get_release_contributors.py index 8989a00974..7cdc5b65a6 100755 --- a/tools/get_release_contributors.py +++ b/tools/get_release_contributors.py @@ -1,4 +1,51 @@ #!/usr/bin/env python3 +############################################################################## +# Copyright (c) 2021-2026 +# +# Author(s): +# Christian Hoffmann +# The Jamulus Development Team +# +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# +############################################################################## +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## + """ Generates a list of GitHub usernames who contributed to a specific release. diff --git a/tools/qt5_to_qt6_country_code_table.py b/tools/qt5_to_qt6_country_code_table.py index 980fd9250f..851c53c33a 100755 --- a/tools/qt5_to_qt6_country_code_table.py +++ b/tools/qt5_to_qt6_country_code_table.py @@ -1,26 +1,48 @@ #!/usr/bin/env python3 ############################################################################## -# Copyright (c) 2022-2026 +# Copyright (c) 2023-2026 # # Author(s): -# Christian Hoffmann +# Nick B # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/tools/update-copyright-notices.sh b/tools/update-copyright-notices.sh index 98ca1408a1..8b0799ea71 100755 --- a/tools/update-copyright-notices.sh +++ b/tools/update-copyright-notices.sh @@ -6,21 +6,43 @@ # Christian Hoffmann # The Jamulus Development Team # +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# ############################################################################## # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . # ############################################################################## diff --git a/windows/deploy_windows.ps1 b/windows/deploy_windows.ps1 index 487e02f9fb..8d66212047 100644 --- a/windows/deploy_windows.ps1 +++ b/windows/deploy_windows.ps1 @@ -1,3 +1,49 @@ +############################################################################## +# Copyright (c) 2020-2026 +# +# Author(s): +# Daniel Masato +# The Jamulus Development Team +# +# As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +# under AGPL 3.0 or any later version. +# +# Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +# This code will be licensed under GPL 3.0 (or any later version) from +# 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +# the combined work, including network use provisions. +# +############################################################################## +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# --------------------------------------------------------------------------- +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################################## param ( # Replace default path with system Qt installation folder if necessary [string] $QtInstallPath32 = "C:\Qt\5.15.2", diff --git a/windows/installer.nsi b/windows/installer.nsi index 926d5a0e95..bd69b3ca7f 100644 --- a/windows/installer.nsi +++ b/windows/installer.nsi @@ -1,5 +1,51 @@ ; Jamulus NSIS Installer with Modern User Interface +; ---------------------------------------------------------------------------- +; Copyright (c) 2009-2026 +; +; Author(s): +; Volker Fischer +; The Jamulus Development Team +; ---------------------------------------------------------------------------- +; +; As of Jamulus 3.12.1dev (commit eb172d47): All new source code contributions must be licensed +; under AGPL 3.0 or any later version. +; +; Existing code: Code contributed before 3.12.1dev (commit eb172d47) was licensed under GPL 2.0+. +; This code will be licensed under GPL 3.0 (or any later version) from +; 3.12.1dev (commit eb172d47). When distributed as part of Jamulus, the AGPL 3.0 terms govern +; the combined work, including network use provisions. +; +; ---------------------------------------------------------------------------- +; +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU Affero General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU Affero General Public License for more details. +; +; You should have received a copy of the GNU Affero General Public License +; along with this program. If not, see . +; +; --------------------------------------------------------------------------- +; +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program. If not, see . + ; Includes !include "x64.nsh" ; 64bit architecture support !include "MUI2.nsh" ; Modern UI

  • JWGct80uB;ED~{M%tIyzhZUJyyXyH{Uva5a(Dpk?b#7p2Dmv<}L0< zOJ(H?HNBuw8@u+&tgO^xYAh`>|5oTFt0k7M^)vq_t|-5x-5tu0%sSek9A(zmk9ACa zKGUrHsFswO4yD$iG%PhWhMWz^NzZ|>4nmA|@&ix1psUdTHGu{SvtDagS$P!0vs#$H z2X+-l&io!or7zHn<5&aLX|vSX0$F2+F+%i%Ze)guenPRBR&N6-XtBmD)N%7fs}1ou zMS_CGoRU!}a`o2Zp~9@sa^sdR-939TW_7@Yn`^qeYSw)8Bu{tMynEl9n8zo~{2`|t zvwZz_!#kmG**rbvqe=co^y3JxEs4dS%&Q7J+gk|dxyr3FvmKo*MyMTBYVDuEUfb>U zk2m8j+dSo_!U|r1%;l5(73(ilThw%j`4{p9JMFiw#_QPi{KBbPG;y9?bVB4s{uFA% z@0b8w4O|bXfE(cS(jua#fxW=pz)pbEvVRcW1Y8ZIf!l$*fQNx+fR}-HfKP#=zyiPn z%p(8az+vEHU;}KNlJ)gGur=r{$QTE;pJAIpJYIOJ0S(&Ba|N8?8F9D4HV)fw(YdtW zx0^G0GdCDF!$coA^5_o8%(XgW48$|5a=K15-SA|?G*kD4GyF&RW~Fbf(jx~0iA;v* zNYl3bXfBmChr;w))B0>qA5P^>Jr~Ku^LbRAq-ZKX8aD@%y?Q<$AJ$>J-nCjcPpL1u zy7RGAHeqbThXX}&dfe0r1Y%Wrw^Jmk5;03w(h;XNz=`BsS!O#^gxrA zG`2OmEO1YK6(dhHc3ST-vcr7UCT$0%FrvosNvdNU`R?qH5vKK;($|>WedsI$-z@`a zzBs-Y?CgP7E57iqqJ4Bq=NK_^rTdgUX=DrZ%GHG|4JvNxxx9t zn}S+!V{kBdN3a;&8+<(YRPa#n%is^e`SL<}iM&*f$(!V1dAmF&m*ofLiu|1Xiu_j| J@wvRW{{v@`wA%mx literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/StartMenu.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/StartMenu.dll new file mode 100644 index 0000000000000000000000000000000000000000..14f23bd948ff010b5baff4e8bfefad8a5f7026f8 GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/System.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/System.dll new file mode 100644 index 0000000000000000000000000000000000000000..eb1d8c574ff61e1674fe990158e01e5825590341 GIT binary patch literal 12288 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 D*21_r literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/TypeLib.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/TypeLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..57adf2a45cf3299ae338c4e1dede396564044f2e GIT binary patch literal 3584 zcmeHJUuauZ82^%nlGUtUU4mt+c#Cx?)Ohc$dk~r2Y|Cb~b2nLY13s*#$=#ZeCE@lK ztqh&k2;~ykd=wv6iVq@+u))d%8@I99hoShOFGCcj1X^^yXa(W;JLl$)4qHS9I_L+# z^PTVS`M&dqdk;Q;in@p>05C?h2+m0tQ6W3mpVAJbOZ9x%I`}J z@Q<&aUiwk+Q-VvE-xWNW&rb4~R)t2KXw(;=^zQHTE#0>i9k|Qa?KKA`NW#b=Hzhvz zdoEnV_d$?>u_^dTuZke<%Yy~?m_9({K>N5%#6#949rdki+`u3s_Xg&uW4*-Je*-;; zx_Hg)CcHqI=!K}A%QzXLb3W*x;5}0i_!H?k_NeDZVXjvI?$^VG4(UYosBIO?S)vcQ z8VcbT;zEaXqCFjHbM}ASf#JG-F+?eM^|e)g9o%?mA*hh##={FC!KDQWyjG<(#*D_j zxDK^=$Y{zeBFiLI>nC=2iUJvII>aLV&?1%L23aDweCZ#jKa1PhNnh|AEYjyKpd(!^ z6;6tj{aA4)N@SJrQTOTXtRf}A`x0;;^j2omVK->7gmP;YgI<&7I$d7>m3KKL$_S%N zA-B7H1#8w)p-vGAq<41>Va@bX0NZr;dA-l5#jmFg_SNj=5N1Z>Z5%t?VA_7G=~ZD0 zW6Qi^$5-z81dmQK8x|~PW8AZQ+t{{^2-{waN0u+m^HVabb>}fxss7?TGJ66YI@@ad z0|s*jaTIv$l5lc+&AA|pNRWr?D_uDFBNqcSyPGE<=ZSfK?B;AeXcTl73Brr*5;x%{ z&m;0h0_|Kh*DaFHDLjdp_Iz8B?oG3iWgsuZ8Zt-)W)`SGED}Nz)2qY1I?ls4>A%~7 zD>BiSz&F4uun2HEPjqqtmxapP?JDfVUu@0p0_6grCM{D%NOzLX>d8axgV5dn#WpQPMh=pK>gl zQl<8kN8K*spZJGzw=3Ibo;z*_a3A@9={9AD@}QzCreZ5EE3Yf_$`{ISicj65?o{`w u�%>57bZ9@6;dEpH;usqur<7uRW@1+LPLdme9sETbt4DxZXDlrau7vsj1=s literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/UserInfo.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/UserInfo.dll new file mode 100644 index 0000000000000000000000000000000000000000..e7755badf840992e08fa0eda5cc8c86b734927ee GIT binary patch literal 4096 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 D9P+WX literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-ansi/nsDialogs.dll b/libs/NSIS/NSIS-source/Plugins/x86-ansi/nsDialogs.dll new file mode 100644 index 0000000000000000000000000000000000000000..730624a0542a5237cb61a0b43fa995a99f07f5ec GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/AdvSplash.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/AdvSplash.dll new file mode 100644 index 0000000000000000000000000000000000000000..e1891792e17737a9ba646f384c3872921dff4434 GIT binary patch literal 6144 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 k(kIddXjZD+yDRo literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/BgImage.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/BgImage.dll new file mode 100644 index 0000000000000000000000000000000000000000..238819ba6fca4eaeeef0920c336aa951409b4bf4 GIT binary patch literal 7680 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 k57jqqC`!}`E)P6Az)1RaKqE+C(0RTvl%>V!Z literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/Dialer.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/Dialer.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e05f88e539a5e40cd08b974c5b9e157cceaa19e GIT binary patch literal 3584 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/LangDLL.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/LangDLL.dll new file mode 100644 index 0000000000000000000000000000000000000000..181d8c37f39aac42fb3168a0e262895782453427 GIT binary patch literal 5632 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/NSISdl.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/NSISdl.dll new file mode 100644 index 0000000000000000000000000000000000000000..fe3af82289fcb63383cb01f0825368c3a8b34195 GIT binary patch literal 15360 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 L@b};UEerflVz;7j literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/Splash.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/Splash.dll new file mode 100644 index 0000000000000000000000000000000000000000..a988c74b0f2994c7a285f2f57232997baba11cf0 GIT binary patch literal 4096 zcmeHJZ)_Xo8Gr1!C=53?BR6%^&|FBRt^x1<5YZCanc7FlNZV7K`l?ZtI`O$@%kf3N zbJC(pZRHrvGTsoX#yU-!f|0f%Ko#poH&JB5_|s~zO$ex_e#jS4q5WV1sxpn`-S54# z+iDusB)(J=kNms$`Tsoc^WOPx+YcY79wG_=j1is0$|>evuYGC3-1nV7_R)zO-&%Xp zH}=-r2{UI$W=ht+QhGWvl`a-7Co*Y7O66iCSBxZfBqP&S#)z(7{k4Hk>cR7R*s5)c zU%|%scF4~@nu%wz4nK2ad>ZTHzu6owVja&-ncTPAnWhqr`2wVG{vg-YEm3ssO}-nv zP4#xPVXPbxR}Qf?iX})5w*9p`U1A*p*NMWTFTMW|9`o$v` zPvAbPtHD%rFZ6Y_znO8@aMQ%vsP1Nr>009yU(fg9zG_q_{>7Mf-VeUs;A-WP(z+mI zEC1Lu_pQ*2r$-ur!y}EveSgi?Lr{v%-AH6FWjFnf2ZrXqkDF=u_0W&+#=0;7n@NX= zYU=XBdI&Z3^99~v>Wx(*mQQb{aPwX;OxPF!n*iHTm(4q{HZ@m&7xdX`D>VNh#@^|! zQ62jynqMR;2H3OQyP0Gg*buMHgnn*uEAYHba3DX#hVayO4#y0*dl2@+Q2A5PJ2CBi z6VrWo&*@ij#+8d^s$LFOR(yJ>dIXI%)U#TCO}7H}9#&XGZR?tz7n!gZa=qNE=i8XW zZZ4>w=L3W4XRN$5s4lVcxnqNie_QTRKhx^!@}SxtRJ)qCrXyw-V)CoNOn}kZ5I_IC z53&aNqZ%5htc1#k8tTuI8m7jCG3Yf+hzUV(^|R>3Gduv%YqLJo3qHx-tEv6y2i+(P zbNw^vda~07LeOHHk5LHlz;ZwQlT088DCVV1Ku}r_U5Hgy!sP&N+`Esg+=5x1^x;3y z2@JQ(-#|~w>EU+h=qt6=e9laWdFfa=i~~f&2O(p)i(y*ePfH31`MtVWz2tnia&VxR zaH{tQH0BJTll5?Qo$7t58bSx$`WJfe1nyZ3P-QbuK+Zi2{P9aQ64a~ZV@&uquQ=pB zl5L*IO(;YzC!^X8Zq}N}v;42re>+|azy{zRKm!5*r{~uaJp~*Eegqr@IBmR*=m)?C zAP+nOJPQ02cp5kkybQbzECFkPAh3e?kAe4qGr%tBIGLS#LFl^l5_s&G2CmXA!yk_} zwSg|};js~%(^Y=6(9J{l-{^YU@5?;}+bK<@9i8Y6kDoaJp7}-!)?~VHf5|W~sjj7{ z({jghUxB}bA5_P;t7D2B%@pw3KI@;eXG*!Elhx^je`m2|?917XQHmGRwvDV$Q6gv0 zq@5{qn_=7OeFk(}d?SW)S$xhnYU{aT#+oBaQ@muP9mA8={W`tk8?(}x(P=O8oBr|t z$bZVU$IB(#D(UnSN*Gx$SSwjmsC5h)Y}Y!_De)$$#f+9l!`LyQk9Z+x6rFKn%AwV? z71@g&>m&Z8;Y{SFjS|rl{-kNmb-S!^OQ(uu6CJrCk6FcisQPn%@&KkVt)=lvYG54p zXfbQ)v@@xWcPGbtEx@*8GS7?Sd(D#*aiXu&)||7o0Bs*~7hvyt-PxH?+?vKzbCU&w z`#;Gi>bao$NMf{8titT+BePk8a<#%{w;Sq&v2F->xsMPUy8pHpBG;cUldP?i{csaFXFr6C*rc$Bi$@*kR)k~q)Ri> ztW=kdNzX~YmHr^TDxHzumCi{aS&-MsvYeGIc~(9oKPfNB$K~J4FUcRtm*gHrRyHaR gC`rXu_A3?TsPYTt8RfXrQeIQuR<6(S{J(egZ-Rf#-~a#s literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/StartMenu.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/StartMenu.dll new file mode 100644 index 0000000000000000000000000000000000000000..5fe50a87a537ac415e7e39ed358bb5b71abd315e GIT binary patch literal 7680 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/System.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/System.dll new file mode 100644 index 0000000000000000000000000000000000000000..6fbdd3a40c250208afd3c7ae3b300765594cdcda GIT binary patch literal 12288 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 VPyK`SPt^Z6Eah)Q{y)^f{{`^e6&e5l literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/TypeLib.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/TypeLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..aba103512c17453275fc54c33c1647256bd866c4 GIT binary patch literal 3584 zcmeHJTZkJ~82*zDOS-1(ND~Nc(Fv|aLB^RZeGw~D&1|biJ4rVQ_|P`HJKJVSlQ5Y@ zD@ChI9+qLCg+BRYSVTb-AB2`#n)Cv-LeZzs-Zzd*>mFjZMt{%0E z$K~l_rBZd|DNDBJD{`qKrw$yHk5^|bW$V_Fv2N&(8egscwA^eB@Lp>f@{=onwmRUS zUq93OQSj4(OV{2PJX@MR#@F;JG!3G3AVh^d-NpNW?3hp)NHe+VT!}alu zh}o4{Y^O|8qkVFRub3l~%|}=)4lP2NZkT1lH?IEY@X9~J&jn2ui~0$4g!6LItO&Ui z8F!&XR*TNM`?s^2lmU-t;4b@_*?iOun=GT=T}8@oGQUQb7k}qnet?tmj3~Mka=*(r zk<-gX21R5L-rfB;au!-4Y}141^tkC67Yio4wQwzhnb~<4!Qckd_Pb4Q2~!kX<`;W- z<)KS>bW*-!!IJMB_U-;Q_H8c++w&L?-MHH1r<8BBou^#2@tgC+!pX5PIorI6kjb1e z90eY`B%IvQ{9>5JB9O=1D?>Q=Lsvqyu!jdA=jkRt_Pm#(usNr*SQu_>x3~&F^FShC zEYuH1i^C%7qROLe(*Jb_F3Ch+0=Ixq0Z!+LPAvgV-~zyPzsh`sAPXjjWj+T!^RvLda&@X$p0F*vk?TX{x?@k*P885ZZ(b?T?XK6}GXF@u zWMp44(&I^Grd%faCiq&tW|u0?Y=LqIjciYUAZ_f;P4=Wai#4D1|0!nCM*s%?zr?X0 z@+5EsSiwKRFkk^T;qoulI*_5mFr+n4@ zBL0bgjArgvy3ITrZ3l2)Q>ba1x{2^$#_mZP9jVDeXn=jP|j1 hS^G}=LHk7uCP$L-J)#tq3J4#GS3^9=p zon&@qelzplym@nb+xq-lumAwu$dm#Mp=1=YpZ9)TLU;LNUzNibr5F7}u9l1bXj0Aa zJ%+x|h^P5PT+?)u-=pw`rSYo9H*JgXXTOSV2@&|)U(fLI6E;`R;}Dc&>Z+ z1EzAwME`eq2D>g+^PNLDi9A48z>wo+9N=pfhkzYZ=m}ajh4A_VP8cK^LXcU!ml?AZ z0vHY$N=i=vOfnb&JFc7=vlIe&X4ab59;6Pm=O%Kkl{wLyYxfPjK)`qWLbj|6WtNlK zQ}mj39r-5kbV}VJ%JDq-a?^RyE9DQmJ1AF$_VHnB!CwEuewLMk>>^vq*6rRE8^P6k zCssykuV-Up+1M22>g@Q#i-&Nge80Tu0?3O~Ql#5MxmDCi39r_c=6D7 zme_%b^)XLJU+hX>>}p@^T3_sXU+jlb@yCay zR(sikkw|w5wWjE0EWUwqPa@VkeZ(Tvnk*i(VI(Wgn9DIoLX=uFcQVY<^Wsfh7;bY| zM8&aBQLSIbwx~GPk9ub|hAkSGa^iHvCi-~`ZjcwRbo1RMct($X7*oaUY;3~h`dMzn zi0RF@PCQ4g@d&+iTd2oVY{-c-wY0wK#nt&9H#+DV%DJ87Md!r{Rs%*f_l|lR>WrW2 zaV;-ynma0COjaCY862SAD^7cQUz+ACUXv-MyX#{!yUbEN66IE+moh{b zk&9Sl?QrOv7kbyTwZL54&j!$*wmZW{S2HX(iA8zy8{Jq;6BbjPHD~CuWY@WWyy|fA zdHOdUaQpE;9C<178srw_F61fR$$kU%cacvce~CPbd=2?G#lE$iQ6S0lq~pQlJ{4yX+#)24s3dg#d5?67zK59SDOAX;1;j0VL4jASi$X1hFl{*lRwD9;3L6j zgZqM3@I>%z@N)1*5QI{pN?0ze5Q4&5p;6c=$U<5;A)FN67fuOhg+XChVDEU`0wl7X Obde-Mb)Fue4*U(Adn`Es literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/VPatch.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/VPatch.dll new file mode 100644 index 0000000000000000000000000000000000000000..b2452073dd4eec4c34aa0c814edd8a7afa51e628 GIT binary patch literal 8704 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 CYvRQK literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/nsDialogs.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/nsDialogs.dll new file mode 100644 index 0000000000000000000000000000000000000000..5e55b85c8d06cea738204d661639a0013c4c7513 GIT binary patch literal 9728 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Plugins/x86-unicode/nsExec.dll b/libs/NSIS/NSIS-source/Plugins/x86-unicode/nsExec.dll new file mode 100644 index 0000000000000000000000000000000000000000..d035867384f42f9030f55ab6a8e5dae9eeb884cc GIT binary patch literal 7168 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 Cp*qZ+j4N+pw_x;S-fW5c( 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 literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Stubs/lzma-x86-ansi b/libs/NSIS/NSIS-source/Stubs/lzma-x86-ansi new file mode 100644 index 0000000000000000000000000000000000000000..bb030e61c45eb96449da699619b08704bde99ede GIT binary patch literal 37376 zcmeFa4|r77wKsewGYLcfa0W;)3dkryQT~VqY(j`mAcsH7z=R<)pah6y!ek6dnw*1R ziAt9BZNJ}-@R?GVez}SE%(+mSsNPb*Ed#fu&%4DtE-o-k9n+(N}aW)&RV+EY28p? z<(Zz9m7bRX{fn@rPe(~nxF`iy<{0ThoesS#a&+vTfR~wIiis$qn+Kw|k zm({HEQkx`(4oMIe8&U;#@qgAN^ZEqQkYPv@gev45HSj_HAs=xIf**lKN%0hY{FFm< z;D7$>nTX*J6{+sEXCg^i_?yux2s=gk#D3r!A9v1m%BrkJ&yg-_dr=v;7y)1}Uuf%35Qk{cCJv=~JJ z&jleQWrn45dY%J$YV$zAGa#trm;2GyF9?G8`ut_$>n@l0YB^KipJHd?tDVM!A-m;A z7q$H3?E@$;LzejZl5+7?J2Q5wZ=(b)mQ#!N9+W%8S0#(_AhJ8pn#I>689ia?f+J*) zYdI^>O+Xqjg`{kUj!34KvmA(MO15?)ATd*6GZVKxp=ny+sTG>+(KgQ1a#o>LFoHI6 zx!RoRGq}5@b0kgO5;NnW<*Y>oZQ}~JmQzJBC0m{4K*X(`(g*CdqMpO2d96irk(;xE z_n3)t-Y@8+lVlb0*R0NuJbL7yMNk*#nK~ANjOsCG&GB4_lFO|wPcaW3Op%v{zir6Z zie@cFanoG&y_zFb9xgSQRr6qHifmjEyLGVBBo9~LUm83jTVs~NPK%PEewhFJz^8`% z4@0^0Q>ldxq4DiCs~$Qgz9 zOgSxY|J=}gb5RaQqEtOt6X8f~$u)=P8dQ<+NcS0*v6n$jN}80(gPk_ns7XVEod!7- z&lnQ%qEv#Q_BQUzj{uP)2hBpDc}S4Y2b$x8oEBJOw#7bImze!$w+4|Rt0}wElu`NGf)k$ypB$1+nTA+O-qldb{FZ|^jQPVgtMwrV z`ZGI-TLYdUaBk{$%&1!}CX_-_T$SSa9~I`x4;OvhB&oBA8i6jeI%e=-nlf3H%)tl{ zob$XOk5%nM`4L;-6T^uuWCq5}UsASA*>Ea!K+}Kt0v7Ci*2c)fXLgB(>bQA>X>v_J=`2(Xf3cKe2{3^$(!IrBd{|FSBbQOo<(0rhg{XX$*b zp^Bl-&(n=x883zHXF^$X_Chh(PX{`$1}>F|&w9rIvAnQxicN4j*kbe&oggABwI2g1 ztcZ)P79^coPA2e@}8|m%$h^X z>4m&T|C$513iO19Kz)f+Va2(vh0P;WQ*Z}Hv$GVa#l+6O6t#`gp*Eou1TnBN07%eO z;BN|3QS_H+jf#a8EX?bweySTXh~a-iNe4j+8KNrUs&pA! zJQErbRZu~j`2zy!ivAw!vYIu3ajUbkfnw1+@~~xP+9@JwmI;%I#;pZt;Xr2e9z=Wt z>;D18d0YTV5}nvdr|(Ruk%-zpbd!&B{PZMV)o)Fx#p z<3R^Gmu1cq06-SqOq~nmaY)W18BTMvQ+hI|_zgi2lnki2)97oLMIm8tmonPY=FdK) zyj)n(C*S4!jCKE2)7;>kxdJO#3~|$P&LmL#4n~M3(Iz~7e~E6(r0M!SjfizD1=cUa zVDt5|9va%m>Hs@Hk*robWR5}5kg+nwQ*8Gu6&z|jRy=2dqf~Il{7Yc@?k-U z4eyqQ!0$ra1nMogcQn~f0OH2D7@$P|6*)eQjYcP7ySdE8OPvm|Y=2_dt*8-oVNLOU z$@(#Lhl`!X6hxPRe|`6|4{6>9Fw23yVXlx84@qWrwG?RX7ha+%mCY{p@qOO0MJo;FycVu zuUQz8e`4pw(_{05P$C(3BO&Q?of}KJFghm}!fG7sm88-shE}OuLO8|?R#8xL1%tCpr%Xc}NHiWnm z_kF_bMJR1Hr$p}u3u&plNYWhOWGej=y9cFO>Pcieotkn%Q_it7xyZ_*tUxo<)VPus zXzthKQDKR}0$@%|;{`3}0tU__aYTx)h~e{Kl7Mzq8SRU@*qt2rxQqQ8cqV4{ec@u+ z$nshQD}*wf4jzro#5CQ9S=5v>4z}4wY$CSq9)YI>4qOlZD3bcc;Qs(zRT_x?7*9x_ zz+3b=*m<;wK1G=Z7Q=WPY!>>8z7Ov7rLZ?hR*fO)FjNft84@d1tW1Yj`V67w)=+sH z@xyD>DkSx?p@qcuJ#DutXhHKPwoam6?X5-cG-rh8m@&R>qmfe-e=3FG^cuUtZ?E!Z z=H?MD_G?59l6kW+RAB})6caOx;Xbfu+qfCg)5NA$CJ|2eLImd^QdrUNa4Dm-oFUH8 z%9GG((O;vYmLp(wiS=VOcC%5asf!m7g;i)m5tw&0DVNbMZYWZ1EMTdj=ApJ*+kUJW zL4@^yqbdVVwwu#OjT04KLVRV>c~ZKHxhTHH{M5GCsG@ii5N1&uT8PhV0*9zlfAl^= z*uWZz2ytHuT7;U-Y#jkWd?hhF3&gX;XSai!wY*@)RGVPD6nzAJPq`Fz;vv5Je(V+~ zTc_Inql=f+c=Q2eX1pIuoA`b#CI5Z(Qgj+J@*|+^_DJmGqASYCSVq1Uy$QKRSLDB- z=~tjYbQq=Iku!BLm!lU`&`L|Fk7yLB6Q4&vp@$azh#p@?PvW6Ao1;hZ#30_Mv0&EN zONcn!E(}1+$$i=;1P)uG4~VEMol}c#SX?04r3-;j>&L^8`(V)_M>Dzn;Wii`95I_vTVA~Pbr_(;rc_~G{HC%pSSsAo|8LGhn zO*{@nN+`3T*n`*eOOYR&$~F?LQ6TIFMB2@RAC5gTv8R35Ak<&k#BOe$lVM;*ZK%1z ziZkN2_dy*fjc8R|)0}K{0s*MeJXE5U<|5RVD)mKwiHeZouV~x`9o_##oTG~kQqE-5 zkDfDQCcLD&!ZR)Gw~2C>FNO+Jslr-78I+<1ISa5}PL#*6^*YB*76PK$8R!Gc^HQMC z82B99oC|7aCz}wGj?(kiK%e1aCuAE#=#_{2MlwIZ#7yEFQXl9X4sL{2P%Ygzk^0(&55nk(2Vr! z1Q+w6J}j^;!y)Js=3?SAFgwE%+6NX7t$oqUSk1s+>jBWgrbBj%4v{#HR!?h9*>3iE z3HofxjW+y6)1aUyMBfF~d|$9{p?=s7Q9fGc@MW-eG}L@EN;y6lRk6^`!%yC$*O_L_h$2iSK&PnvSphzM3P z8gCZpVFA~vaVT?(4_jhPej+Vz20S;*0h-)mE(U$kiF^~;8~tB{t4{&1dlTKnCVK_o z>m}94O&-1ilE|J49L|oV1D5Y1Q|{xeCI+7z4%uMuz-l24QcEc)c=Q}yi@0wvx*6i- z`#efg2HX!2@jeboJ?u3;aUeJQImO-$1!?_bKc<9)d12cT13^Pl8x}<@dU182<*Wv+ z)fu;RUd^0D4&G3>0gYNd7yMWyJ{yK9U_YEqs3^mHx3Oh_KsK^hXtjZ2POk+|EvF5V z0BdL4DUcK9Lb$wlnb(RE)$Gtl(j>>lZLjEM=$~@S97R`qh2o+6&V5c}H6 zY&0h$!8+ff$V3SIbVOX>AoevR40OwK`Yy45njr|$omd{ht0;V>TiTrhg0M1dN!@L$ zW*FE4#M)LB7|?IEYCq?2hLk;_=Di`Qt2$)g$6NpqmR^Apl{xBS>oVXF+gY47@QVz2 zJhw!B%*mPo#=$Pnf~y`>+8X^9YH6u^!1U4E5X~Qi)98?#;bhN3E%049mUmhRo}hFb z%#YOVtcFsjeebfhh&Y_Iud)&g9>D0UJ1k&lpP@P=r867K`KtLXiu{52kQ9!?ONLum zN_Szc=m7)gp|$^k^ysMb5WR z=mV6f_Wom+%3y%BQ9B5x*t$3kgnbB&Ri&Ry*#Ve$z~QH;?HdVBXD?DL#Q~2U-=eVz zXqwPF7PQ4y=Bj~ji0rV!v}mbs`;6Z(veb2^MNp$bzUOmkHe@M^&1c=(|AK#rm=9qTS8`q#V&bm#}61GrI%*anl5wo6o-mZ4%eS z)*nM@IifSaBqlf~XY)f?0GauxO1TY#BKKj5k9n{&Zmqa`vn5>G$z5-R*}IT0328(SZJR5wyMO# z(g!{RxU`qO2`n+vHCXYL+x*QLS@IP8rpuGsr4QOn55R!|Pl#+QQZ8(HJ60&ZE`5M? z^aE(e==-1|Dixr3#GEYIG$&n2qZYBzP?Dr{dST^8!*_By4XJhDrBA7V8Ir*c~Hy2cLXl>6v~L&Wt0cg5Otyw;%-*OOR%*K&w$&2 z_VY7P2nKpE!ToKwM#rKi`fEdf*Q?D$HO!ARUq;Ld_<%MDI8iW@q;Zg!q8UFTppoFaV@QhMasU@jLVu8&=Y zNXKqfN2v2naLtw(yIqb@ScassyV0}pHHsG8s{9cWs_#}X9}rhFyNF^EG#b7Af<`U_ ztT-3gPXQ27(m!Mp`OX(zS=~I^_vLDm@0_#UO389V9J_!Xy_0N3g^L47bp zTS)4QSu~|TJU`dLUPJ@`lHph+&Z+jkQ06mWRk3v;+G@&ScJy;BO+`pRyQ6g=ZY7Qq z15d-JA%~^kTBOa zq~VP>aHmq@B*G*N-E9+|%eDzGAiRO_Ho_@{3kchDY{Ef=K7`;Hn~;KMHNvw9KScU- zgokgk35^Irgu8CG2~!bPBQzld5pKT4COm}Dj_@|ZKa8~rze0FqoF48T4;Tmy2>*ys zd8^z%Lj_@;thbGyCeF%AX*n|Rv zM-Vy?R^Mq8zK8G%!YPF8$$)*AO?VyQc8vWigrf+Tftvw%nGv!O#v|N@FbQEg!nY7g z5tbt~B5X$RBk1P_-2LAZ zI4gF>P1?+M9E7Bjm(#&^pk;7SjW@&Le5C+Tx|2sZ#162WvaC4dcEDQrDMa4UL4dRd z6N8Tpt;=T$eE)y3ccNsjz{!Pv-m)c2&3Xyk7;ZIy*Zj!G0Y+G|0G>sMryp;!cL^pd zz5$A*;$SA##t}!R{{cZ6wl@Yv5S!X!w-6!(1gyxm^M>VMa;z@cu3KCV27QLrz?ZgS zbpl39zXjdXX^F+HUJXk_EuRSh=1{u=pBplV0}!3DvgZIL|0AgX;LibJP_m@R6KT1Y z;!a06H~>krA@i8}6 zho&6TP5|>>4wROCSVcbr`BC%M~vSVYf)zAr%;lrHkXT!bxjEhq%&~IyL&ZN;Q zH~R$dWsHMtaEPqwY0|8jqfvw!^iUS7S-qIWjx+HRp{S=ZMeT9;s>%{aR$(dP9k&CV zk@SG!Y&k+ChfW75N_f*uT(_{_-c80H9joHRun@;pa&E_I0@@{$YhtJcZk<__vHDOU zf09dGz$jNA(sGVsbVaFC!6h3fy1Zr6!OOmSZ5FvcKxTC1OLgp|#=3)G^&v1tpntN{ z<<8ea%@;z=akw*eF#CmlIDHd4>^&j|Njcsj)3bl{2>8lMYF$cJzu@Cr_f*jel+U2M-(Ot@Ewz|Y=` z3?H46^#FJ~>MhNix8Vd*rl<6ys;24tkuKOF!YDO*~a&wRQ67k^ZmTAJCSx+YoiwKSh=s;`!n z%9iH7B}#3rvSK)#Rrtr}IMA0eJT(Hysx(m470RMc#Ao-Tk3q?dvj_Z|6g!TK!wo}4 zS2vDRuf}rsnmS!A4qO;~@hpi)PXAnnvo_)0(~;x&tPMp_tfd%0)3~29j83 zzrd=OudOWPW0IYP&2jm5Z5CBx+d%{<79V_=O^8ASW~$PKBFU^w#e$r4VyFY0dV$C| z2YU?FP~>vsu%`-0!Q(HF+*_~%vQdVXb_$e4f737#4g)l01d#zxM8}-6&2YADB8Uhfx$??Hh`X_g#(M9Mt3m$zfx} zcAy2NILG(b6|rJi`pKdsMIat1m-}4MshMoE-s>B@!)yY-^_`e8qzol*1X%d7IvuTR zvq-pEE?VF~-p5bi^D^~ZokOr}LGt%-$-kE*zi%?fB?ZeXTaUPl)rqS(>BnpjOeN5>>v`zX$D&8{{(mCE@b=CSqDALJM#d9{XlOo`fk<8UpdU5 zMP2wI#06-KorWI(clIIA9S)v>GVrd2jNrt%56Vi*X#nqfw}ANkmJpi&cF}TPLd)L> zJK!O6vMl8Iiz#t?cdC`p7BD%7l;N1F+xHrfj|JGlcHTjh&$$3_5U1!qRP$f5Drq)< zfmOcjFSwm%R!Ox{D}TW~Vo)VO{sN~mrhTCSRb^A_5hcBwD`OxCD=q5@pe63l*@y@3 zRAs!4xN<{WPR0w(ilu#_DG9_Bu*XekUavQ=OIAbk4L8JVlkviZS7ovy9PE$aR-mdF zZ0+XOBVuqiW->O)zxFB)s#36|y##vy74o1K?*fH%*4G`YAF!`+>;iUN=e=U&Q}+sL zc&pHdi+zSB?6_V&j}_leLLvswVvsKH5Nc~5c-QiZZ*kbW(bDBzfgJ4vmv=dTvhVZe zV(ZV*ip!I}C&V6tnc~zlZEb^LlooQeE^ox#jlg(lTiZBO+@HD>fIyWccy#ue!I1m2 z>^H<0C*y^~lEl7p8rM(j+mQqdqDO&zU@$fG?i-OGewGvvRvthl&O0Df%?0mzaq^C32xm<2+}kh) zfYS{&{npjtOl`LnP24O(h&MCAB@bg$tT2#M*;9C6lm!r;)0m6F!zN`s;Y?$PfdU06&`S9v2{ zGw@B;a`vGRb@F((@;zbcjKez>#K2&z$aA}4M!Ct0$hu)3fPlDSn1Tm<)hPCvSOI!0 z>fWCsnEZ04%Qwl5+a;uBvRpK2aZV6;V1_g2?=`K1W*$Bl*@%gUMWWAY2dyHMJ0gi~ z7UgIR>x1Bf+S?26@mU1{Te4Z_pp$SoL936;q~5U0SWQ2`*s+w}g8hnm zzxD*I?p$Dj0g*!m)!CZBB!Ysarh`MvP#2nuaH$baeh^Rj$_8-xk=P}^0d(o`;5D_y zrus6I<`qUb7MJ}pLk(u!HdV6-P{_QK9%yO|^k{TPEzoaqmIE_#T)5$c$RG;|+a!6E z2Ca{60AKc|V2)$U4_Jr84d8ZqO9M~~Aho|Mm5OI{r5f_hVMIkzj~flefRx4T(4W~VLJ z&2rIcxU^uXsC(lbUe>{RYsgP5t&B;?3Qe>LH?Xi-{smgO*;@QM%2_vnm$MR%4mM}6 z=Nc$o3V>dlA3X2$8GP%Lo0}O=W5qJ#Vp-rRhjt(`8!WvQjuarh{~UUCcc&gko?yXJ zlhupZ&Xf2F%{qr)T*U$(RFjlY7va)83$8r*X5eNO@|}7Q*n{UyDb0h+*@5U(MDrZr zxv3Pq0x0ctd4UvwF*MpK(A2SSgY&=_W?#yRDD9cpLHrbsj{qw%7(m>Ys?DOR`gY7~ z2|%N@-$nFS(!C~1Z9z(%Rr|C}cq@({ce#^WFk{@_ek74_ho)U0M27$hI0KOyuk-*k z_Zt!18cOW`27s0?6`rayr}%#2AQlI;D>lW+l$)qSIk#{;-BZ-fNU-J})QirA=wL&z z3vn{!D;~w|jYHsI_W@$5-_S{%oBbePRLuZ@aXqhmnxqV?$~o$(UOb(5Z5hHY?6~lyCgUQ#=|6Q36*-DkG_Pe&qr;L!-k`z2)ji;3x*4 z2PE;0^RVCfl?|-tf0f6VmwV46A9YVX5q9~Kx#S1&0aVOtGak#s6_B>VlSX+Y#RJ5&mb3E3ww`BfP@h1gKW%j zdI_WCAgE)WOF!(-XdHFmha`#!TlCdVGwCtAI%_g&Vi61#)7@O{lrP1-a~uiEDWB#W z=ibSnR@r+61TwUZdFtwHuh0V>U41*Ht=^j< zoo?pgrQ^I~dCJXGlfAd_)FPzdS@#`0K-&){7<0F{eAj<#^c-HV4hzLZZ* zx%YwqT;;qu+KB{nj4sDfiUD+SYbSJgu{3QKO&jY)=M1hT?KiYg!OZ-Vl?IyYWET-J z9&)hS+o00X6$v9|1-G=1(X5EU7syBf)wkmrc*>NDE54i;#UMG}3a9M=ImO^cltxpK zk(@j(FSFtTXgyv0?r(uBj$Po{4fbMss@1e=V=5^gH?6u!9VwviqTlW$Aro7_hbG#_ zslGG^`vao1EI7QEja-0;J3-l#pa;(f-lq}w<&>9$B326JNkm95U_hDdY;TeglvO@# zm36tM+3}_lGaW)Nu?fk1!e5(3!W5cDGJr15Aggd19S$gC3#UU>P?#zxNV4s={|g(*-Oeyo5kgdYXTTI$j^kK#3q16AdH#Zds^`SZt9E5}+Gw>9y?mqjEJZ4D|pM4fFbxHQc&OWS3$`&;Z?>_7WMfh7J4()@% z`Pl}je)8kyRQW-?jTRnXi#Vnp#ki;wm(x%cPb5uilGPWZ3NkG6ZFp-0n<907CI*na z2}bYa=r81i=4YY^7bzpFkLVtC?iB1N$x$ruQ}GVBQ|E-m4(i#S9WoeFsY-sN0yCo1 zAmLbs<5djO(Uw|~t$t@lP-`BkX3;tqHob*e5~lR1h1~Menr0f~zT3t9xapFu&dY`; zDd362FS_93sm?D_1D_diV-6l893v^EHX&nx-30<`O$EM*sLIA6kst9HK-=w+)O3K> zz0a?JelBK3sh1hS737g7-d0aLxqnifRf-fQ(%^j*jbLu@t%qv!;{A`|7f*vOGzD;3 zdFScnu!RgJBqcrRW;cxoM{4jL%+hl}%}_Cs0~lm`7wMULPJSdx8$Hm5)(mw#$An{` zJc2`xPG%t^ElArQsAW!5ydpqVvq;Xvo3jUpS;bZpavTmXRF~kTq0*>Mz{8`8pi$uL zRYyioNMuvs)?i@Kc3uPGg!|0E?D&7sUcvH55x3MEv$L}F3X(#CXfNol_f2Qt) zL@^5V4h8D)VRT4xtjrB;wPYzHIra5LR9_2`JrQ@QtS-KM#veoj-@4k~y#j zB&p3#pe2r9IHJEtC7d)R#AI;?&8sscopY%x=BT!U&QH@@4$*D=#8BOIH*2Jm`%lc9 z8eC%(gR4;+heu>+6h~1k26v*iZ&-c=uO97%bLRZd`OeQ9C*4n%tM-BLw?B-XOT|$p z-9i%(2}^r00f$S_Qp>4rAv;c9f$7@@+?{L!#-j_WpAKeFHo4^r?e`Qbd6x}<;pTfe ztQ|vs-gubX$r^74v{VZ?LZ_&U62)gkck#f zwhait8cg2B**^egbGq1Ha*0rE45o-XpX6Ej5#00YlBbcIL4VQVB(7DJUqIt;!)cvj z9ftQ`MnS^ka3?J-y4p2tm2v`*ehx@3){7Ff@0N{zD~<>H0OA5dKf(ar&U#KC+dLf9 z>=y{*SEYV%8maR+pxKYW$)WPo2}e*2zLS%9n@fD9C%rS8PG$CFS-!^GBF}L6uJHS1>}QEq;PKO%a?&^CV#iT6 zHiCOpfs&cMiwn+h-V}B3JPi3%(tX3&eMewvOK`KF3pQlKL(+`*_6nPapu%A;!GVXk zl2uqt6Q-oHiIDLSPtdEHx;WuxNK)=;-D%D=!1quJ9#O`T_9gCQkDy~DpaQBvB2t#8 zP%%ZBmH?CE)!AzVFxt_>t$cVsum+OW_avKONxUYuHpq*9K6d8chlHzM1 zYVcy`9}k=S#>feF;)|6Rzfvz_&V3&{*bMAoG3VIrvPl$myS(uZ8^)5kpUh1c6OoH+ zdaNDBj1iZ=6E7m<66JM+i`laTywR$^&k74D{|HQHInP3Yk@F1ey~(8ys4XUu{(lZv4s&^5M4 zxNx@y#)%ncCHqNHa#eyOpC@xrim|xZdr*6bWwH}p&}A;R7A0%QH^nWJ<(N3W`Eq+N zfjc-maElR|mM6fF9Yg?~kKncAiYEUf{yJ(x@%k+A$gUBCcS0Vpii9fqcKXqT@7D3A zp~GkE#+wp^FMkCC_X3>0x}CY0s-z`813VhY%A_2x+i4Sg7%<+F!rAmxlsJ89zT4dH zo!L~LV}q1?H9-@0nkcP{H}bSul*X21I4DGIPdT05amjd5cXKA(W%Q06FGD;1;(tEW zJyT74;gq{Gpjjbz6$99?90l1NPVYQOGF`$s<#u?>lJNxr?Y1pPu--z^X!5f&d^sQ$ z`?m|Ua!|%h-x$jHAu{rDwVRw4p^6LQcaMMsm@vEw94bE-o@*({6CFyGVsM~lY{o8=3`KFlXXI?jsX+O;bbnU|#q)F+Xsni>Tab7&S%2%e{G7N= zf^6XGAFfCYP;G9+=Us6mQZ!qI6$45xJY95kDH~}-SmZpmYaz~HL+n>bB-RwX4Sgh3 zVJS&0IU##Ct|HoT=$N@=?`UwiJiHK#QScnbhX`&=Vl~=q;_jIs-SQetEd+5>lqQto zopQ9?Y`&^^@{drnA9TV%A7YO|QPK&=mL>Xo;JB?DUTik22KXS0cG={Sv;2V68re+m zV-L%_3g_(rJP`(#-3f;^`A!#H?CoS`ZgGRtvlGbTuBN;M2k$ML%yqD+l@VIQDyR2m zV6Bspm-wh;a$r+t3c6Kos}wQuGJ2`m957pBSvMrDAA>4nP$>1)EzOooFdkf7qPQts zY`_XUA8By)f+Q!xmnyd2OPLO@Bblkj1DYn|0s|`?w^uRxtZQ%u6JvpE*~+mam2bD; zMow}ldj)_1$rLmEog8~$!fng@I!LJKbqp+`GyOJ!b5tU2hB^z4rwX{`!GB5Y(Uj~4 zG59DD!hOC6BP16Vv>8FJU&BI&&&=#FsR}Ey53H(VX;w8^PH%j&c2MmC+3WU>aosCsm4g)6KmkCA>&{PjI}avN>a;&rM(cXtYlJ? z`dhkb(SR1v?`4YH) z7XpJkmEM2Nw(4(S!)oa4!~JT0P3n}}do`im`F;;umg`1?3)f;2Dc+ny&ZId!o_>z?bxHyp50(It0hjUx1-@(i{IYdmnh?l;o78Bs^It*-4X!4q4})v4JwNpAW)SOJ8{)n>{q1 zf8>GI5C?jJ`QD1T$5NZd($dT-KQ_K;zLy&D7P@ZE!(Ek)&o8X#|_?t3U4PaLI;&^PATA~O$GQ|#%!kCp-L zJ4z>P(?ZFjyqORh;8+S$(VHw5@w*q%30}j(y!y^MaTfJN2IdbM4wJo&Pjxq*X5h58>bGm1>5f3K7Z)7TDJj%bz65986+b|^ohdwML`XmqDezHP2h3iyuvh?nA!E2K;g z2ayZYxJB<3w|ikIbH0-Xs9*StO^(3YJfT~d!_nJ>(IQ`)Oy*pLc+t+Pc_Wc z(yaF2)jn+k+)@!RmLR8gvK(bWpty&p(ptU}gk1dtEnf3aY{Je={B&4RxYL3dLD-p% zNOx*3e(7{Clr;`9+#`6J_rZ_svCARXo^A(CAA~30;F2*>n=m9IVFB;~X;R6HHj;`> zU=Xm@NtBZ}UEdtF^e+a-(RxS<)T|x~^qFW4Vn0s7;&F%^$MQ|sTM{(>{B`9V`G(eryl&2PCC&d-iXg9aIaw)y4|32Jylx?7;$`hQ zM&&`MFE{%WV8v!a65Q;c5QWEPLZLJyk8=CIVh$|)bXnyOP&Iffgukc|!`F4bX7{5c zfh^w;%;2OKgKj7uo-viMCpwt?>omLvSg4rghYOVp5G)Fu4FR{y0{N@~GF2E2Y%xka4w(^#~n$OKqRt2 z;P?G^zy_<(ksrhYK<`fAoeR{4|B2p~z#_)0%jrdm`vW%$6R4a`C{DJhZwv?DftdK{J{a2AukCN!d>p7S0{AURMaj0!vyGv{k!ib z&BV#T3)7KFg|r!Pm3#X@2Ji0M$yUyV@TjM`jTks=(RNR!8tg|#xO+{sibPy&8+ub& z;ICS!HV30punFs__b8Ap;9=r5PE>r{#~|D1loexwhq$ zq6}D(m2RfM>d^)-d8O{ga)sH)uBBi+U9{!A>lR-)q^6OOU;Jq7NB4b%a}5w}msP&+ zVmC&*R=!((|JQ;MFTF=|Cca(twvw*CbMe^3tX=@{pSzmT=|A_^7Q9HOy%@{-DS1@o zw2V|LRC^{KYB~F{_N7LPP-p}$E#vj0M}YuXFZrrZ0~!L?RJ_;|8>L%(upg96P;xTH zme_A4YttweT*t2-WYK%YBp%>* z)(C(&9RdbLc!S6d-)*J~zD&T>lw435@DNG9SMC2-x&|Z!wKYm6`LN~TWlxG@t_#3%k>QRj8zv1nfh|oS}>>X&>po zJY&mn|K)FOHSIS4>RbL#KK5T;p%`~tO2qvmO9Cj&6!)JmI<+-5@TVEEo99??&+_ZQ zXCDWymTb8xaCQFHQGri}1r81u_Ya7#UNnA(+bMjj`0CKZ4y_D zlNN$;h~t2MHU+$hi_hC3owFDvhmwtnsVwXSNQcpp<<` zGigk%M>fxb)8_1hMn14WpUvSe^X>{jgJDR1HWxw&OEJflm*p=UYA#{7{{p za!#Q=E?eAX_}q`aq3Xr5T7ZKUBd`!(f5%mp%qJa)+g4CHUUcfhM@{(IUhpH>fw)+W z^8@AkKv*6bXufa@Ou~~Gikt1mFx;#S7{*HdmyHUpbB%`|lK16iC$UwFja0j?9l^TU zIy4A$#R6A{HI0t_)_>Um3G30ObithZh{IZeUwj_Y80U--%TmlxqBkuli5c809vHXpWmLQ{;@TpUX=^W)oEk}%$cz9cAOUP#3A#yQ498sGRmd>4oJed8-PjY z)_$kPk)sZ@r?p0u_bY%6y^&P)G*+c}`>;89QDDw0Wf-!HK5qQagh{l&0h=6J-C!2X zL^tG%%phfkIIIlvfRP=K^?>&X|Gw0ZL5Ee?l^uy0 z@i_z#AsnLbzl2*;$?PukUcd;@P*+cQn~_`P+-Be(Y)S5=TIMF6!NsOm! zv>&a!c*!?>C04sSGQhp5p(WMbrUt>JTnKpf z!d(y%VrWlD{wuVxD(wZ5^pUvdI?o!#*M$>(!=(t2)}+0G=DnsZCsip@ByE!?(|ZT_ zVvdY%aVA6EYD(nBjNDcu7@u z{L*~4{qRJEoxrD&4xjjpR8LpfWb5q1n%`pzx0-9=sSQcHnp5$~fEfHlJ?YJ9fek&z zm6rNcE2Uce^0~ZiO$}8dKdKIm zh>gF?K5&=)LbVEHBZO>qXEb$6XL!|EeAp(frFj5ZhET;mG4O3Ld2|7p2b?8-4ch(} zi0jBUuTrI5;cR>pcpyA8v$YHs%^q@85t_&NZaMj~H}>zJW|rNAw9o#B&s% z8`;+;y%cDE0bKeZN9p-?%yfBNlXhs*^P2sIHUkb}+Ds$EC5HUt7nN<%A7GgJ7*hU^ z#_+=bqhn}}7!O@I)CzeH}Jc?Sqy1U9~gMYvQL4jlBUh`@IF8#yVDw`W?A z*JgjIEz@G-bD?5}uFVrpsr$RRri8U3M7wbpisPJ$LC5aDkwkFo5?(!oR~srPtDTAA zOcvDX3)%Z{)h2|v9h9P*HfRni=AdD!7sCRDq90<}yoNoeVFvJz{xhKB^H+hmX^Ro3 zaiA6?14IR#VD7cz5);;3^IDLDfV@ZDUomZ&slKBgI)={;8Wv@yoahT&8G(LrVqZQq zw~ygILiPw9fx1(1}lo?~Ub$Do#deFROFo^F)2F^!_)h;G||JO)ETgCyp(Q zA068;P-Gu~Y&K>>z97VbcSuqbGTU@KwyX0~lkpI+CleLu5POtjB>5i!a~%4kXPj5= z3svlmL1&YmzwN(90h%5<9tx?sQI&S9t`3cf-JO5ruJVDByUH)9AFB4fCq4z?D)wc32o0o5`U0Q? zX%98;PL8B4x*F1Ms5q(77*3KSp%r8=l6HvC?j`z5y(yS6gS10uz75FxKV?4B5SqOg ztG3Wa47hb)bQ2k^BrH}{+7s~fVp4WNM(|O2EH0p11Vj>|@8Jgn*To3;(S&eAicSJd z1~e~}T|)WdPUkliFX>`Zy*FRea^FzB*ELH-gc6)u;1Qt;VD4-_C~T~C-jJ>_2JMml3lx%!xtiF5 zuR!5!oh=eH5#LB^{F|;(L)ZA6Ek?w~TqB0g1#^i7%CE7&kE1fsR_zhBVmEB76Ma)4 z(XHT=sEM;iuPXVYmmtu(0wK)Lnw%J6Gs zES`Tk@zNe`;1891@mU#!AJo8-M!37dCTv3Z4dRc~+JwUh!!{rf;YEZsb@;rD51*fT z+$J1D_ypOeMa<->o5mu1opv!*d}5{T&Yr!Y2qmgo6mLAp8)a z9pOm?`djsnC`Wh-VIji(2)84QLNFm*cuo-d5KbZ-M%aU}3*mJUD$>(BfN(YLHIGkHiS(G)dUWI z4G2{T%MfNGOh!lpzG-+~ZWn|5upi+SgdZb(7vX7yjR-!3T=Y2|VF^Mm;ezMC1AqGa1T?sSU_!n3@Z6uE z36+(vSiVrQOG3F*S|%-V2~KHwxue9fNGNeQ7D|g9f@9fIhjXP<)Kcl3o8u`ZfeKSfD`T6%<&%bX5#iy4_ z^GnJXFJCpUzD{neueCZV>pZoq7S+j~#=1(mroOJSmg;@8xYX11xLn_`YMH00UTIwC zSzN!averZOQiPcZ_%o8?6f6dw5K^s3SSfDI7CP}CB++N8@W+2OT>70l;0dtICv` zb&p#YS1NVuyr}y{wvI#uas16U{7pJT$3=+nVqt!7s~(}>2WYwzo$D#QRZC8Ug{AindL%jjyEkwOJH{{&`xvE9p-~0P- zefHn_?Eh=}?5ts#XT4OXY;aZ9DxMPI56Seyp3Nn~MM{+^p2p3*SlUzqNl8JT(<5Kc zd53DvtF3SHppkHzQl*|+kL*dnJb68bLmelSRQZ%9d3pWgo;pWk&BmHq&w5Xju+*@) zzW#Bg;aXOr{VRs04OFpyou{dZHxh(?f=StcNN647I5c`HWkP~-N=jW&zWMh}ud0P6 z{AaQF3#`*QNRh~xV?$hfzDrN8d z#`+D5N*C8O$;cm$Z%}(`Yo$$|b&BkvKAlkiixXXXpnI2BHa%|lY?$BZ@!&9TUj00d zAbpRlvThypZmMBvt*5-MrmjY=sjRJe(j$B!AZO9_beFJbQ7QH6lpAa6)(iEuo&@{? zVbO-l^&Y}y4fHw|fz8n2*YirMs_f|AQzd-shFl#3tP4x+^Oh%36?z1zuF6qaQ-}3u zpHSLZ`NVSk*L@|zCjy95yUeo=`I-P)&8w|}I_DW#!d%b#nz}@*?+T@!YF+EoM1eX* zDNaval^s(CERp`cVNu;i3=;o0pGSvy7`;|LR_oE53BujrtXfZHlc#i^kZC|~ct*ez zl~sIHfZ+#BS+BmhzHU8oM)G>K>lewM4TA6s!=k1nv~$3{u1ZhQ+&pk2KFe!1c0j7)guI!-##geNJ7 zdT4~LAm|h?#r)Qz#ty^BNPcy7Puao5jM+VPicaxWR73BKGKB>+b`D&hpntzMBl=ud33bI2Z(@|V}}an&@{fcfw)B3E4)a>HZwm5s1x9@58TlMwbJ#Bmr|BDR<3*8QQx36a8kevQ_=tp1sSMQ@M*`yEM2cqaU<;@-s>=SC-sdH z5p{KT8cnsnk@JZmF+{M$qPnV@M#yK0Fpcw!qtUamMCbs|G&NMp>%79mni{(lyr%3oXhn5 zn#LxswZXq(NyRn9{ z|8A*57|AtrH_M*o_3oM~4+*Fc7f7`)u6eAnvJq=X3hAmuid2rUmHGqKlv>Zi%DO5V zf)F<>sI7mjvbLnQwtk(UB~pBefbNAYjEYj-#+t_Zx((2^I(`tq|NB)i=Ua5LWYcG)*#i`7x}Bq+f1M;`5DMm(f}4 z@iYh@Q=8>5`sYE#VvSjsgyE#M@Y|GHT-hW`jg1g~p_$S;HEBFLy24z_P2iKT5d>_p z>Kiswr4r#yu3M8OqY0lI$m^ zpzCXBRar$D*uCqr!4qA{5dd=iHNK#+zNME`l5Mozm=u!b_17dv=%jx1)#3(Zc2F*% z3zMZ0`YEvj(2_V08Yek*!gEGGt5`F0*YyI)DpRP<814ss!5Yj&h2Z;L75Em ztw!E#T}PIJ)mzzQt*!)1S53E)2-nx)e*#yUJWZ&%u2!k?q~i&VNo$rB4h#rkWtA0z zZmp^$W4p?_!BbUJNsa5|%5}0;_EM7s0(Ul9D-{{q)GF6o>mQS0Pg^Ukb)F}z>!6LM zr>EOtO`@mj`o;}>4`Qv9XQz8*xncG__tZ7jG)-@+o?hpX?^)tpWR{NQhK{S(3} z(rk!Z?> ztNGT+ivMt(Tl~}YIr~{DKGJT7_k009-d>Ii*Lbd3@|ZB)vk5u|+62ZDJtryCCn=Mf zCP5MKzsZT`-#*s=O~&4x_)tCqJ=+q`T0GYxI1 zS7LpE4Y+Xr(#56HG68?ig(ZqyPpdfbB&8R-$*0J7t`FB?zV&S?HP-9%9Vldgwv_TU zt^j(%wSD>D?2xG)@GNigG-4B12|K5J(c;Rw^$IvXQTB~higZ0z(L~+ST3Bjig4Q?I zU=xqOq(-Lrs=KG(P0zZfN+JDGL3nhTrw(RDMHYm4Qd9AyCPeOjaLb$r?zw$7)uUY!#|?i5f#99~JNfjk*#GS2 zYCeZ`P zuU_}`Uze51fg-Ng7h_F=uAkGFL=A$jmus{}Ef0j{oGsz6mekiu>gP-98zuFAN&U@| z`n#y#!7b!EPi_J`pICI?;NSYl;(6{v@3KV~4Et3-w(t+IPsT)|v5D6$;!mffaCga~ zUsD8SeZj&%j0~!f|8s^?9s0~0_!jhi%)k|nOey;2I92sfrqs2h(&19QO&6(xRHsF{ zf~`Uqkejg#?Ib=w4(a>>z&O5!WOA?|tHuvSJfKs=FKIH53FFQWka3!()DqnX{T*7O z1@!qkUB=#L^b(z=^GO5Nm3MhP5n7~@94gl})sb6hJxwhw(Ld8K(@yKftys7BpxaTJ z;Tjt$k%b5X{z;m`ooAn$12UQ?v}uFJ^mJUjoc`N!T{?DLWBqYy-OX_g`jPleZeB2) z5&X!f^_oL3;w#7}=r8e+b+JU2soFjG!8tlfe+b>rNZ3o~_$WU-A-?(ru7yI*ur z7-!X?H|TSmy>$!v(CwF{J--l;c}glJ_48*6{oF?Xik>A$Jw=BD@(1k*UV!P}Ku56S z7(HEGp)+&~M+o_TO8lirO0!Yy#OoDzImD z>v52-$ok+_`c`bu?@_1p-1reAhvOrZ8Nq*Ws!>CrKhgiEu>1mI@D-GosDU|H zM*QcQSjCo~1N1;&!^ioq>;w2lQLKN2-;;uWPO3Wb8~S=~-@=@(qL<>iWw~IL*m~6Z z1{-*u#9P3aJF$(=O$7$+12W*>tS|0ECC3qM|Dxj^;Tq>T*nr=pPv=OwMCLo|wO8l` z`VFy;k9T<5DkUXlc^omvvEz`>K8PnLppS-8{TzM-KeXvP=s02M_&mf^kg7y5|N#Z$G@T#SBdMJg+f%qa}DkCu+&#`^qNldC^@A#jbUFQ(O~k~O_6#?he&wLLqSCq_l`)198MIrN@Y&G zoX_0#N@D+?N19`yG>#kq?qcvUQ=q`#r9h5d@qJzc+UL1ouV;*XpV62iflf!4$LAXf z%N|?Lb(?!ql$Qy6r-Ob0&Ev{cerJYT?ly-?an(k%lazh=89(-JoWZh+sk&xroOQUINf4nWQ0 Q%8dkcv*UBE#{Vb(2Tj~3egFUf literal 0 HcmV?d00001 diff --git a/libs/NSIS/NSIS-source/Stubs/lzma-x86-unicode b/libs/NSIS/NSIS-source/Stubs/lzma-x86-unicode new file mode 100644 index 0000000000000000000000000000000000000000..81964fd7ff1fedf19d779f4f5a9103aa65b556fb GIT binary patch literal 38400 zcmeFa4|r77weWrBPr{Ht%peIy1&tCbEq{szENO^NAcLR;CJvc_3TT9klQ9r(at>lI z(ZoqA<6*4r<@VZM?=2L2UwW^t^nO-pi|&-Xpg8{KpEUVHDg*Is+=wbx#IpF{Px9#I^MqBsfZw4&_hDSuw`_rL!+ zM)sI1eltdSYV<2t?zSy@<;tazhL+;>%}sYT*R3sHUAJyslUjUdeQ~q4uDD@can+JQ z@!F;}_0#k7b4oI(e|~Lod(yx7@JRUD?PCw8%=D7OH}m}3?c)x=&-2-q`wqXyb9!*W zVT0$b4XYzk=f9%R?^BdTwk#!7@yCXdGX09%mTSvalrWI1?26)2l+Y~V9zq*IdM$CX zgdg%Z@>KfH1BvlRK`DFgnMn$Wzu^u=*(Q-)c4fv`iTuCx*QO{tEdu^3!s%-LMwOhs z_528Z(${mHAkJU0qTDgPc}<;Krzp$D0cax>5Tb+&{=6_`x>Zb>ea2>W2=*!WT~LT9 z<+`S?%M^sC%C^5wV4I>mKfSr7c{N2$p1>RBA`ykvSRh8l(;W1;X7f$)&SF62V(UDiav2^8+F?hMR7kp|5o?Y!JzxeT0{TclxoBM zWVhq_c(vz;r_-f}9~vOP29W#d#kKAys|`oD{vtWlSSmFh>LuUre$wZ0JP)}09hdv* zuH4>)@034YJ(Mn7Ml&(rfHUqZ@LPoBr3)hvlGX~+M`Aw1S=MT}x7?FXr(^dmORM$i z4KwK&wK}_~qt@!Jc~M)a$9FF2?WEhC#{KCkg?j2OXb<;?={j zP@nJGX;*X0s`J$BlD%`|^IheICJ|No^9@}l5u1u!iMcl2Ep+5WZMPafg`1LeYLf@M zy{aSa8y@VosaZTzB!E-FpmbmW81Zx5@^JX^|MayD+C z-~RjseSYKiRaTc{C-b(8w8rX(k=(4UjA%%&5R&4)A>B7r`es>?dQ17+Ek1pga3glW zrH>zcK3kit`&^w}5IE;iMZHX~9xmDLzzPwLgXfgE|a{CO>RUi$&F;kTO) zl)tU!)9;vX$VnfIn}4kPhRr@Z6}_s&+1b@P*86K^+gzo)KX*!Rjj_50wdhoWx?18& zMfC%Ez8@0q?wa7}j?K2IEBwY5=&gXm_p7yjV>gk`F3stkpBlA5e^not(jD7WlBcL& zw`Juadr>7l>r{NM5}BbPx3dJ4E?m&=Rs0b<>p)s9DPoc!g`I<~-!JW2#ZU;!`%`}w z>hyf!6FAiNMxy~Zltp@fj>JQq@m8ftDnitL^0?j90-7tdT@*!h)bd2@%b)#JuRf~R zzPwlZXY#hM^v&*faviVgL-FcUiR!-Y4|3!AC9isw#LZ_NXJenwi?1AZKlt*+P*#$N zO!X=Ozp;U4l2hG)vQE;IvXw*bj)^1#>B3?NPmU$-H=aD3PA{PJKAy=RfPnZMsd>M| zjUz>h5*xBDkJk>|?_k*c>B6H-*kqkFrJ*QF1XX}k*~(-0m$i=3ot@k0$d0KHmvVRa z+x5+oj&D}}k?z@y2S6y;^yU`ab~=tY!^&%Tk=oD zb>FeXOcQ@;mp-QaCHK~@N!7>os?NUnnB*H~fum`wKqxs|()j~)U7s}>D$8F|N2j%; zHR;!MU!R`uWJtl#@edU9157?lBsyR?Adq5o^cWrO>~eQ%WF%Eqcyj*;t^T;rW#lge z`#||;YF%_i&}d&Esjz-SIDUD!{ET)5+)yty$}pc0{IRHZ(eh38f1Dn=L@bMm#sXiPK&;8{N_s}NpnRM|2)MQw?xQf#pusa z`MW{@zTspK&*-0%59Z16T`%MsRkzZCpJQ@F`-~DG(YN&h<1&ei(}#?Uh=hXa!V@MU zbyW1dD5;zt-!My|5{?Vg+?}JK-$WBa|DOa; z^3NDm(X#%d(sM~(+FeLq5p!xf?Q`BH=e$=gaSY;vvKDXC}0|9Gk8U8J`g^ zJxEtPiR$CAu7Vn*vL%^<_T&X`9r2`q*V%UK%S~>C&=8#uS94v!j77F@;B3J7H=M<2DjzZqOJ<6glo5a`>&h zJLiGNaJoA}NXY{AvQYGk3y*)WigeYsL%)5U&!=(psP2_~*GIAnuM) z9-cnruMx>8_w~CwKSA_#--+ZYo=n44W{snMqljK7j|$LcEClE`JhYJP%L8IJ3V}o& zaozI)7cSLPI*S(JTN*AI~A=AN~m`R;*e8Nr1 zDMDzmu}yTzwamePAX2un-yhU2N*5}uE-Xo#P;$w93Z@I4KvE}52j>TkwUo4Gg=n92 zq020+juSmo5Hb~kl%{@mTtjzU5sv@(>?k;~n^~c2Cj!Q3Y1GC70xP}*{qpk9L=S7O z@}W(x`yNVNR6f)K&Bv49qlWuC8xRxS*Po2Ztg;y|Q9~by+Nlv|=I#*$#FvZ2ACC>? zyC2+&IHyZGH%{{^j!%-eI}~NgC&^_z+)uumx)kLb&=36Z^ym6Oavs3kS5w)OUQO9c zU)4WJUI(DG3+`_1O1)kFnKm|+TRNDW02KZDXR3Yz50ZJ3eo4)<(0rO4wo_{`qdk%z zlREN#@&kFCP4>&<3oRyFAn(stfz9kDsc5sK(OBd#~dzEAXO-GzAi1VfkJwTWYC{&6Y4I?RJy zDA#YK+em2}V3CTh2F1-z8!<*|O->29Vu zz35U$N5>k6K$CL1pYa_ zC(SB`VmMqSD7yB)`S<2pHRBtTKbNl{j|YazTxj z%S{(frrqQu$WIsgC0ax@U_2~!L?d=eCQ*W=qFw$h}YxNmc!Q>DD$u+33S$$ES=f?y)^x;y?Z zPZ<7$vGQi~nYt-p3_};g5ltD>uNNEWJLQs=sT`%IsNE}r#x%+^#W&?Lpr?!;47yY< z<25Rylo(Z67n3tVkGTB|lz!ux1r{Q8TzW%+RC|PK=?z86oBu35JZ0+cqNI~nq8}R? zbrRJ~^4=PMG}jo5I!L1%ta9a_h2uq;w%i@B=0fL)1}Wc%47)pi11y?n{GK+W`N*r$ zM-0(ImV@R>U)zQ8GbiDDibZ{oKT@#GYf4_N0r+ZGI3`0{-Hdhg;XKIp9oMV(u&H6b zoHC99VcP+=#~%G-=evMqL2_ zMI!+9ZdrYVH(&L^-q1oJ{{8__P0S?P4)1R761Oe#8#%9RVeKzlEaSF$) zceQ_@w6TP|j|tjk{J<1NZB+D1<6)|c0Udd{!wbIxk>fnmg^w^pu!pw%5@upfh*FN6 zBu97o(_@8wxL_W%@@QP3HU9E5fVD9cH%(c;?n>8`u#V;c37V-n#L`-qS$w8m{ZzQ@ z5;fn1?b1D%vbR>5i6OJVR5O0cj871y+`+B3cv^HRZibN~=dQH4o4=yW0xz=%+ z@qvl9PuN?2T?G16>eGO+T^K!<$^NKBCLtW(B@#qnjUSmCCM`b@{oHu^Iz>r-nI%0R zBJ+_R-&Q+)HNHLK5G8h#otDFT^)Y`Su00xWeJt+#*KoXgo6!P_gzphF zXB#6dL;f=tb98$}{=m<3)rqDd8Z`oj13Z4Ccs7oEr0f3V!<0&AJ%v0cHxex!#D%m^ zbp?#~>4ZKYtGX!uW0D#|s!3gCyeO$-(N~OaBL0AEsftCeeogPUd$!5AN*8yKYc7>P zlE_;kT8~JDNZMh_fH(qK1`1248;;$WlbrY&lWS$at{v5;phcva0tWR3-wisJ$BZqUBtrjBcRK7NFf%Y z-es|~4$U1=*jtCtJI9T;MHgbX4v>=BjwJ-un6FsQrb;=&P)9CN?27U4V2YL^E)7IP zauGSnVE4m-)j0B zrCl&IgtX7wW@MvJC7!tUnsZ=x)Q z((aDW>{4R#pJatNR(de@#cW2*y|uf1pZJxfltgN- zG^UYnDo1m(XzegRrTN(YJj*dvI2n0Mxshr+Mg7J>G96vvGRz*JEjBl~BmM+EPmahS9_oGKzpEyFaEs_V~)7Wo%iVGU9YH<4Hos+*__-W}AF0 z@4n9wuiisb?v7Px-B5gGud$V;%2uLJ4fn$f0qV1+LLatknY;75h(^NK74S#x%chvy z(H!OsrsWKZ$Rsb43e{cW-N`2!c0cXQf#7)cQ*qxecjvFn`n#ew*1Q~+RaYSW8Uhp1 zTc0}pcDlN2_m`rqeY@1<>FTF$LK`EeVz`1m;mcG*e~wgCUrtQ}yEYyVn>H4CHjJCf zEUs9T?qV(p^a%Qeg{xKf?UM4>hGVV0`D(d5a#R%YDZO?GFK@VfUpVfpVaZo-MfH^n zvmB_URF(UgF4NFh#ln#^9Q3S=LYIXr^6~zLD{>UgeI5%aQWxpIr=qsg$7Hvj>46jg zDNRhMOcsBXPMduHKFH85e?%!*Rv;Vvkm05sbfY4)h`3k=ubX-J3KAuF8^k#>hiq7UQ%0jOmy%adm?pQ< zIUqAYkk^4c(dh@VKa{Luc%uW)g-IDVi$)s=#2X1@{}m7$46!hLz3z?}$?Y@I`}!=|hxwykWEF>@m?6=CQDUv~AtTF-9K+gr zO>}Ww8&GF5X~m{GYB*4rsUm%hKHrH8yvETJ!*ZU5}cwG-$)YwL&dlg+#F z0eKifvKx$5_ol@Q!xG(V>_!g}6|F9oWc0K0Gpkz1MgO!4`D4pK@eF^0$sd?|s7Vg` zGqk+ia?95axMRP?2d1A!ZCD2t4%0PXzHie6J?}f(*w}$0wgsn*{W4>>z|ETEm+&BV zFg>L=UVTjUpj&qRQ!zN0BmTI)~DFY+6GRA^f~+9q4(>Z9?z?;z6dj+?;{GVXq# z_5Mbp0pste8yhN?>h9PKNTHZ|m6*>L`HkB@VA~fkej&v@X7L{YN&b-0loEw{p}5fn z{gwx|LRB&)qhoUlcge~bv)tQ<`*@xX?zAlGde(`h1)2Znu$Q46aJ#q)q1{b3Es9zy*1HXbLY8? zQf%$iTp4?Ydnsv-JZz?`E_2-DRO+UBmG2dJm471aCcH#=o$zPEqlI3jm+(H}2jlU= z@Vtw#neabI4-x7vCQbN9!t6`DN;zRI;Q_){!jwzB$_m0i6aGNhaTyXuXqsS!c@w?L z8bX}#bHcYT_bNG8c$FIneT1uuS?>vsE4|8VgejA}%9DgY5Q?GOSpxwj1VDwhmas_C0K_va)1&{&uot>hHWjoyN8_VnGbR5lqIfXztKaD&Ov>s6%X%JL{aY z$HHfwB^$2@PGkE8SUfAA&y&(YUCRr{ZcwyQyHhBI)YSHBk5D35kW1t5%$mCqdDbL0 zbe^E!zzkPXj%fC>RT(7hCkvQ29CK=(kbXAd8*YDJ0hwPv5c|NEHyT88qHTNzmeMy_ z4m$r041+$8U7aM>kZ&m9PjsGSK4S*RG#SRt+2&O$9P~=N%gTymk?;rfiKZ2GO=ntL z3^i6B4GbHyaYvhvzpyx3b2xnj%KJ>DVpL&tep)8I(Jmi3XfFbsy6jvDixIg|@q`H7 z=|1yB(PUTq$u>xDZ_N`$q+JqKB43b}jSf?|=mAl*dE>~UggmrGdj4)ka{K-<93%BM z+x1?5bWKg>j4u|RFK{pALUDn}X)WNyM>aQ~uj>XQT;}eUvc@=eEaIdm# z9!v4Jkd>g(G>tKjC~cf%Ed&siQ^}V>-r2Q7II0i0zcWOm)>?d4X2{iYUnWbjqlE`x z_fRO(1^d9fRmotBhT9p<*Vo`YkV?CEaToYf&%D z*Az4lZUb9|h|`qQ?oJm(vg&@!tSL<|FEjh32FhB8)T`37q>%AXFahNf#Xr1>D6>G8 zmvWy=o0`^6j<|sI0h4>Nt_gnQZi;eU}Ouii8IZ@`20Ee!=v6{#7i;btBmTo zwaPr-euTzEeH4WBR!>|TVs_&l8&cXBEv^yhZv)8sZP&wXbwh~%F zs{<;Y>snliXd8k^5T1g(uWAMHiUopX)*^nfjxCfE{iJp*<;N%#9p5Eet}Q#L!KD?T zQ$Di@7&H&g@NuaNr}$1)^itp+cAN!@Rz{zg^i$}>8m97sb~Hkwb3GJBCj8_tw1Wxs zBP88dA`PvlItSHjW33)V8z&}Zp3yVa9Oh{@Z8(+3&sVh}-J~zpI$(2mE&ydJDs8&I zn%thGh~@u2b1)%-@3J5UM%5UtwResYNEU5nTj-(LDr#MTCL8cT|Ms!EEE!9d~# z*jH@~+N{UiR*-{9|%mQ+-*upHh3%Dh7XLwpb ziFNmxj^hIzCE^BjvMP6n;~ganNN_!5c1}xnIJO3_6P3K~rx%sX*>MbME$w<}P04I_ zXSv;_2OoOEEbe~hV0XVKm-|;+OkBC$JC0K{++Ohq9!j=4w$_*jAIe`)M@5u8q`7bJ z&Ii13;aQwk_z5N>EeSQ-*2WV4AwJyk6prQ?Zh5$Nlz_x=SoPh}%hP>~+NidCX`+p} zIU8=&rVAeh;SO=j)+RbimeGmGQ+9e?8|gKdgiSON*#jfZ>sCe=S~6X@ld8W}yz^L+ zjb8wXUe%LTEF>#lWtF}!TsBKGwNd)n-F6}&ztM4xaI(-vV|s6VQOShlAf=wm_&GlTW<5v>1mA=b)a6K%F`EALTDqF1d#@I5s~ z=U31Oz4TAB(-++a{qD}QDErh!;dsMvtlL==Q5GQ6cQCv3iYMT&H4iLj_3OqTIpjhz zS4Yku?2P;_N<UD#i;|{ygKut7OKwJ1gvziwsjb{d(jPvtY4_`zdM$BOO4} zuLmQW%%|}kvpR?B)G{ZRwQ+>_0^=i2kjh_(GoRd@AHeOhX`=2q5K)+R0pnkpkh1q} zUIf23fbQHV7ywiN?q~AX3p`f<&BRQhFFp9f++O{K+~@U+%MT$cA!m7?n!RL6`I(lF zN!Mix%aE5g47vi* z#mQ2N8%M5$9V90k1(c&-6Z9d@1ehQnqea4H(*&J(AF)3y)UN?gI9o*JEfJuJvH3 z8mY-lB^!LeI^#a1g`*-$(}&10$w}{$)i7XGKuf@Q3nGxFs`KbIE+$kmlZC%iSshA0 zGG3v_>B6lKuv3Dqx2YwjE1Yf?8J9wR)SfQf0|CtHVIHWwA|=&ZHcdR@>LxU3u|GOF zUD#z6Dd9mUW&)q=kIeXqsd|b5*46@=TI;U`vFO}6kSPpbU^kneK#{1^sDQNc7xvl} zXPcTAj9y(^TWhMb{GgDL_kbYBl{4D-$uS)1A^jI~ASc3FM|K4ygGe1W75 zn8dBRh_W6rN);;#8@pLAqy0D>l4UFC)URLOIjDUqcN{ZWEW@wECf49f+4Shwr|%KF z9nNPwG!!>(k6kTTSfjR^*mCs+u5#|7a?B#+e&PjPX;1i_(4K5VY3I zTj*!%TfcR2I1&nkB9FvSA#l4b+><5i=?sO4oybPcODdd1jBRM`a9M@a(8h-Xk(Z^4 zSAHDSGup`xSh)9t+qlJ!w24jltjwlZe{t=OZKQg#_V6pG;l{G7OcCqcLQ-G6p!|34 zj&_L#7j0igncsHZ3vG!4e<0ypaH~JPp~{#jBy1OWnEr&q6;~;m=eN(3j$Rcord>&H ze0IRNf%X$s^Ke>j_)4U0hbfkdIT5t+taZoRtdVzeaV|Sx6jCi<>|?0?wZ=!ZP;2Z3 z#GvG*pBB$>tx*8Nh_{XT8;aVZca7|qsvcmqbUlQ8-RDpLwu_5{>iv4YtbKbo(rTb5 zYd<5lAMeZ+PgFlhp@_k{eR=nQU1nQ~+9$e58OQ;^zF$WL@C z(GovGI8{PKf$5=O1foFJCX^V{;g|9A|B%H&b>Zty$~Me+o}aRcE~s*M#)wC=(zB$f zwZn_djCmE~+g~#~oD-QWsYX)zECrm;dPoOqxlRo`#s?z9z(@q*)6REdy8;Ke!O{>J z?G^pr#er02L+PY=Gz(u?5k#?V_$4cgejqg^WW05;G^iGpRmfFScjsc}53)LN6nEZS ziQ9}5#AR==^0wH1&pt#t^qffMZ{=h(WIQe_&8#)_ifQMwe0=)CHTofL51szKBmWL^ z94{^o>t79*8k17t&X3e==HbcIC3=lLUMMu{HQDjPUdknEayk!d7lqq7mDWc6R?cct zJ4)Y7{WxAYEYv+?!?%4Y4I1oGmF+cO)8(u$uWZ^KJG{z$ zH%8NJMC`YhpVnrUO?v`XtA!!s*kL?E701TI$c@H!s-~vly?Guea*4euIS`?wxN%rA zBM=daMmix4n^5^NKBaQ9mLHi>!r1apb__5Zv}%3U97?iu#w+Azb^5iaJ+#A#wj-8~ zP6+MjL(dwwP&GYECVli%x^ujpDo$fIl@YttJ%M#mv@nwCUuwGlU5ypUQ>8>gAmVry6OU+v7^>F$ngJR`XjGzy_$yO3`4JG=jf{5}6iv9XYk}i&1 z!t4wgQ8RZ!KVqv6a%K1a6l)CM+>om)RJNewIhUxa-c(bMiCvdq(NH|W#?^8 zZW*FTmPph-T1j0o0vGzzvt&lar^!U1i2*Q`O_Ku%?Xt3IQe7Pv%^^c@^khi}3_$oZ z+8W;^Hm-A{hC4_ESzc@?aYaO368)}$d%sjj+!K_zgG>5X>5AK5EXiDC) zGL@n}&^hSt_(y=T`?zrZ;P=d!$L@acL1Oyig45moEKFRt&E_SRm*I%{I*>p8`r!Nm z8~R^d#D#0xVBQ9g8NY)#Lr*r>r-syQit;4synUqjB8mX;s8{m(kK6^CpGOBqZtls; zRo0tT@%edVar?Dv)j`W!k6&NUKg#quWZ>g>;r}w*d{o*OLLQUGs|y@mahokm%9VDl zWLRLtc1hu3b0wVfL2niG97>jV<0Zu(Q3EFFfZr@Ag@6=pweYR_Pw05bCs6uk#t$A0 zxjQdK6!g{t{iYe^`&!59`Lcv2oSlrlGNo6y>G@*ZC7hM+XI$QRb)Gl&Ik!o0zn#M6 z&xzN@`8a>&Lfj2R^qUIO_srA>3e2JCy_LMCB9GY zF>s9`D~FaisyChIT?|vu_%*o^!-4RLLtV5y-eBWtp!zHkkN{feHfmwnnENB$8-euE zr;ouN8EAhXGSAA!>asZl5ucUf6*J@TL?ky5nPov3vG_#cuSi2=p#`)crCrHe;S7wD z#mQ<|yNzM&Haubnc3us*%&hG0yoC66Q6Y(q1%soC-5o9ffj|V+s6?cL=X!!iN_WGa z*gI$axxI0>@iGd}_!H%Lt#GlsvrB6HW#3y1+V6Mej*htHw0iXB~ z{3F~p-X1IVo<->2QiwA$a{|UrE;7e95ci!3>dWTn-r3#n<+ksW+L^9~P!wDZF&#X{ zKY=G;*e*APM{GsruGTo>{1I^ua3${E0@I@Q1dJVKOtv;3kE3QNo>BO+z~Sglub(L% zg$KTXY)Q?C76c8IRLI!DFZ<@>G$l6L_Ye*2p>$tHXx*KMU<~(`Jr&}4(u(wIPj}K2 zMq(W9&efFW%u9@!iX_?Y&K;DFjw6fKNdn(?#2gWa{W_Psm zW#gBZ$^dl9#nK+%{z_`53pXNJsKaFp-!^Cu7?;x@YlgOof0n$-?PpA94gLkiSPPEO zbLO^jM&04~|oWlLW3t zbJw%YMkTrMeXqW_g z;4WAsTJtpu+O=sJG=-`qV`HGG<$$@Jz~{m`i#$c@N2;*wX6CMS>dU;bj<}=8JG*XE zbKOrIDCjl{O4F&u(Sr7~Z27rVf1o8hnzKCm)@=Yl)RGnbL+L>hrKRa~OMYorw7`4& zk$&E#b{xc}{g3YO z(w)4$GNXb<3sA0d8dW?K&YKW{sqi7TU+(H;3_io3uP7OIiKWFtFLstkf^ikiV^`?r z8^?P70tTtHtMjm06dbH{+0;?;lB~n|%l7UfmWG?P56`{eJ3GU2PU|?bjE;`vpsZL& zVX~sm!PN$P-Oq7*#^ZiYW`@WvFFX%eW~-#&^H{6SAXnM6EWB8$%aIjSbAo%qWZxj! zs0x_KUQG9$yd5LR#i^Y6x~r*EIH@YdT$H{9jrE0QEYJAKew13!xP%<8Shy@JaA`na z>4Iv}o1w_(4yJYbHPbXj9}mfU<-^vy;if3@DwwHoO4H`+%V-Euz;es5^J?aU=?jRr z_VYF>SHHMjDsv=0u?_xNFXn{!i>}+DFiIm%kt!OF<)1>X(~$>iSv!YyrVWScUZE(O z9lbK@iF$SnOMyZ!lRT1E(!6E6 zv`ku!&4?Dtbe?}o)(!#8jE)z;EC9UCZCxU3J>`D*Mfku-@zQv__C#W?CtNn0H)jP{ zeJbwTuiK-=@#-g*>wP`GU3R{JGU-r{?MxE)nz?jxSCn5sClpJtX5xoP^$fXH&*+w5kXDr$I9Q{wAlJ&fL?tvvB>4pZMZticY4*a zv)aJa(RHu9x<9JqEKcJATOe*Tl6!HLi??>(>Ar5mg+Uo#>A@_|5L?!IN?pvAf%c8A z3ieOhnDqJ;p~xjrEsSAKN=}*NOpa~Lv(v2ZU7@)%-z}(exni#3RQ?6Y;%^M>sS1*jRIge_NXz^_U zqwG0u35FuYCUv6lt3BLZ8R^Py1r)H1H|RrH=}-?Prg?eYc9~U74%vUrZ1XCnL}k)> zjD5U93dAc!(Bc&`$*C%)gS+!K2;z2g0c@lX)EOgZ3$_K^`85LAer2r%>W%4HQqy=> z3LOg=-{Xm$aIpOC`^M-G0#JMG;waRwyn0E z9qjh1Sy9Kb)EK>+!T0h}3)Km1f?K|1NPnHYRfb|^;_m;buP$LK0PEEe|Ap>AuUEFTk6&pPqcV!tW zH`~vd7fVRMXW@W0%bEl>b*j7wm4@bihHC&G`l(uMIJY!#!~1vi^!&h%NeZ4mTun-!rN~(v6ZQFbS5s=r zzRZN7BS$0SfSCN|!yCD5slxF&KB3ZNFRQcVA~Ida=l6 z2?x(PBSKs}ad*b)O{}^v9plBcs5np(t^IMWmpw;(cOvfdaAf{50<}Xv3?ZZUdSpnFCMzYGo+UXuq-l9OH&-8Q}~QdFHVFy845@hrL(_K;_L}?Rbt#CNCvJv`UkGg`~TrfUN zF<}SiQ(A;XTUs_z+>Yv3q8qKV0cNpcG*IZgDoB#br~>hcnhuE9%O;9YX=AMYIXh*e zjuka%Os6ml_1|jGVVRcsJlZojV`Sz)rtCQ6Wv4v%!^1R#pfj(d@5r9~crGP^;#__V z7)!SMIbQ)gW>i<&{oFxqoCt@>b8+a3aaMg&G(@1rA8CVKRNO{J`2lz5c2MK0;8hoF zATj!Te8*&#GxeWqk@2o}u~`6_%hIVr6<;LaLXcg151u{_9`5S!n{Zz5kIuEsQ(m+| zvu%da@;#2OIG-_*msb!1sh^lRKird@ukcxsp6nbR^U4vz*F^>jw@`;jG(TPVgo%0= zzxcR*h7n+TTZ?xO#Joyd{X39&0)v?yY^?sIxvj>|W-ogHKZ`%y<9in`u;#*c?x%c@ z?^K@2#5VAwZJns$Z0j27LGk>Wj%3a||5L7HW*b+r-J@2Hc^`nf-hHKAmeg^UeSp9dXL&L$P#Poj%B+fi0*q zP#fuzu&|1HA{+PMlH0#=ij` z+-EwnFGef{n;bTJt@jO*tu{n)C4Mz_i(|!iBwpabeRg+;Oy9kpC7dG!jqhR(@M;~d zmPq4I(Sznoe<|+4e~&`EyNG8X9IKGRE3{nm-QtjO4|RA$gx|!3n-ZNn@!E>_!wUiU zh0kIWKF)}QW6vHXXS#MdvDb(xYD*?IU64L|%!J*Z=#*mqfFWN`7&NhYcyGj)$E*8u z9NLX&tdMaE8BXzf&Tz=sP86Tb6=l9*^`cPp6QhQ8UoO*h;4n;itPi84T%qWv#y7}0 zPv0Dq-FU^&IgmS>q}lVVaBTHiUJxzQT*BN)pM-1BibR?LSi z>?WqACC;#(qj%>Ohhv|w(6Ym2H`~>5;fgw?`J!;ex0QQ%wcy+KZ)&Fau?o|=tk=?F zh*MY(s|Y5s+^%%fyn0bMR{l+S9pP{7D>RO?UrS9k@fL^6me{pRqxMzN75>FWx!9Aj z*^27&dO6%riQ@)FfSglk=HgyYNW3FO^dM+#p|CFZiAAR@3mLma0?Y-mO&ud&0AP0f zFZJnBn9<0JzSG~R*j1(8%oT>;k%Z!VL9N04f}juR6S5 z?i+4BWOhfK9o(AuvwWIO#>CS(xWO$hoGIN86}UE!tz4{~UWNB2NSB%L$3bb%3^l*x zthjhM4U$Q2jX7y&rc7^CskA=3Q3JF9_l=yZW$s9=r-pUXR8u2|MWN`L+qZ9I(k?-J zZ{I|O{#f^!qnDN*##o5GHkY5vQ)EcT0R^<5WeyT%V|SD23a2D{Se+Op*RjI z^UaFPyO?TDx#l@1B_nT@{FUOnP3(WYc*ess6Xx^U0=o=upUVZ7CA_}LtCa!c+lT@K zn}<1(lRj$-#Pyib>g4lfxq}cX=)fK^Hc{AopWw`M>HD*?SkqFY@#=sQRf@E&WO#TP z*Kv+B65n%*@GT%9bTq8+n9Li0rHrlYXO!%`wxGjqUfOcTJWO#tH|1 zX=jASyMl(D)^sEGWm+yqx;x}`ged33=35l{P@?LJ99&qISzw)o{yil^!CGSx6@|1; z(vc3@3>ufAL}6$_!g+%Up%;tbcC05SH7nMY6KSKA-}tk5BMffdOibk6kZ@j-%6@3< zX3v6!<*(c`IOSuX{(=rAsciYxdjgIFW?%e90myN{`nd*ZzBAxBBUJnuDDy-1;lPLC zwt2k<=gY{#Tj(bbs$?tSl3>(B`SRuItX-_7GD@Xy&YmbYp3PYlazD0D&lcr#`pwJU zyzWg7U|`zLV)eSyJ@oVr^=ta?exty_?quPl7t3GNa`cx@ADWck2ZFW}XLGyTPJG$U z>xbzdr}BR$E?+e}H%l`0-bwq~-+4RzCsS8D^;eRuTqon74g{yUy;ZxUVAyr zGw)&K%ggaHJu!8RW)O0W1qFP|V>pC!IWLH>6`X0U$a*WD$jHY5!m)pmZ$l}a>D#qD z>|l<&`L(OgaO^7z&e#IeEQ=H|U(C_Sc%SpEF7xHfYAgf!1|&DPr$uv?Wez2xWw&v? zyE4Z2L&=z-T_e|_$A)8H%xFgSfANibvZJnL(Qn-5e&%rO-M3?3ETj9L%4M7!kEPZZ zGdAUM->Cex`?F#n&PefAGp|2P(m##8|90$b<)%wwXXoEv5PNr2?D^5|X9nC)YQv6C z*%79?d0}G}hb6;&50kGf%B(yuLXW~os7_z~7?JeVOOYrMMG6#1h+Y+mq9gDqtf9$>cyWbrp zA7nkEALG{i{)yK@X z_rbv<~H$UwK)v|@N%-gqQkSj1Uh2xJ*TJI z|0umcPhS+28y)QV%uQM!kZ*Eab3H`3pMI&fW(2Mu>wHr!RLb0@t)V=tiCzEteYsFv}mF6!B|F&tn_k&Dei<1JBH#x8!@Ntwf+8prCWUmT8) zcYNabJe3uWPj`G0*1yj6M0ckP5;BCAn95CViO3D>Wzx!ikIW{~TzMg0(_Fy|5V8BP zj+ig^Id2pj_rB~Enu8a}x8aTQDoRRizIBlW$dKgFx%OP0lMrqJkM%PA@T>DvHs4 zVmWEFeT`E7r{=fO&0>Y^UB)I$7BFlOFXhE4%D0b9a~M-V+%XhGEw-PW!*B-oIuXc3 z=YC-v#YA?>53JfiIXdDF$M*Q-+Q$mEg$Gj(KHGsROXO9{M~D&~KB-j`*(FQQ$oUs< zg$gvv*%YuM(2eZog8D$H`+bML_t*}s1U@uO9^K0c8S6~Vj6>?_<78271zDD5Y0(-x zIl;7u^oouL$jM2_cb5w{5$9YTE9itY#utaQ_r>PPbWhfnL?4-!{4;w$hG0gWg zM8d5spcrr??TOt7YcRiNMIZqSOtN2lPFDZan5f&3H6#PX%lk2k+(NL1(wLN1>)eab z=E7QSTIs+7r6@(XH6f1owk3fP6CWW(`Sd-Kw}d-o--KeUGH8x2AoMJfzHd$Nk_5Kxo3~ zv>z@%{dsisa`f%fe6jj-{Z;qVUz8q>x9*>Noa+^*b}ClC z8#hOnlA^v4`7daA-M1Se<>QBsbidF5 zT-Ub!()G3K{gX7~2!5*lN8aZv%#H&Ir?2k7X9mnh)-*8_=}_6rCbazFVyA#D6PqJDP)QHAG-N_@*^5%d?tv}{k_ zBZSny%s2e@Z1z1KYkdqUz0oA;(T5o6TD~f?E$w?WUH#Z*8!pMs&asI~Tj}A`+Lq+s z(@m=n_Wz|mJodk}53OA`4Usa%#gt=4NaRE=@Ff4uA)<7=$JfRM0OYctH@f3|kxo9l zcudZZdPlkcscS*Wm+V+L1_Mpj8v29)>)K9B?6`uXBv*qc*4m|L+@a}3=wn@OE0n~&xK53z=SLoVI z;gMp;QyeP8o&I=rKR1Qq#QBhlc~OY!aFJ^QN>+q!!J*_E7%S(fH+jezV{h_DVC5^r zu_5Os2giwUib_kMJrTH_?O*8eE^nHgu=iqT+p8ZIF?93S2 zOI!?>Qa&pkAzD$Pw|Vq9>(qLOHh< zXc>>^p7_e$DRj2z`78f>643PMcob4=Gaq!)YX`bN%uURJTRRgoN1<>~JML$C-A^7W zt3B0nG2g%Wjj3-Ab$^lN=sQ%u3!^dhwbFxMtsSWRYV9fg4ZV8zk@sNS%00PnpnmaJTT^*T>iJ`fR>!mhi0w_P;88 zq9M}NeXQEbW)Z;q_arxBZkZBQ%%`Mc^?eM=PUZ;zfC7sPeCvWqO7c~H=(shFxKpPj z*4r%>Fc@fFlwC&oawqjK6tC!FQN5R(({g{Ide3XRmaDB%`I$)Meq z!CWO`VXi=l0^trye?%-sH2%fsxM690Q!K`$#-C$`B?WUu1ZvNTz&|Hd$mRoQ`pR9{ zR!91$9MgRrNJ`RaibkLAYfFC4gtiojNOp3w^vTpGGGM7qR$OlAq}E$;)_Nti#)@;s ztfZD%aV}f3hqB_AN!)A2^CUjgiVNeIHk@^)uCgE#1Tx-=i$%j{-p$sFi0jXqmhM%{ z6TcE;@w1<1-gXq9_rA)z`GOIly^(DkVSEc;93uP=;`5ul$}YlZgf;8EicYxYZ@h|k ztylS+@a#IT@+#?nCjYHwuks`6>8e+GfpW(Q$4Gxb$f3*@%3cg?E9L&5|5d@?rGz^P z8wi^TKOpQR>?ZUP48kxWFK)GWmgiV(y^9`Fl*t77d+}jK`90xI!fyzV6CNf!Kxih& z-vi$VMtF>{jhGF%L#VEsqZSv`-H=UF2cVPwh}fH z8VNzd&4k&6se}oH9KtaD`;@Q;ntBPZ5#A*X5pw1V5pQ za2?@N!Wd{C(y2@MJ>f;dZwQYQ9wmH-pb}OQ{DdmPbi(C?iwI7_r;Psz!f`?$p^NYf z!aozX5bh(aBiu;{5^g43O1obnTt{$0$9$e$(ii^r!i&R%6NFz7{+S?uwab<+@KyVG zx8HZGZ*fow_?FiCEBy^D39tD2ta?SKhj`QgGg?G$^Zay!n(h#8d(OC)jnofgBQe!|I4{P3d)J88d#} z42e%ys;EC-sl>&;NLi|^Q06I3$~v$$^K4X#6~9tPx}Nw7WuciS{I`T&T z{=3>$U};hAre2e>9&ERo=_W-3-)iEEfUh>O)sLXV(>jyDpZx0}OcQy_g1@X{eu^dT zC{VijN4Vr`UHqB9X)X?54Nv4R0M0Ni-UHrd+E}4fn_QFLwPf;Ez@Y~Ev4-?LK!pcF zlav=u1bH?Cw|Z-${V(ub$e(&@7Q@?(^tBPpf~}c)HQ<(UyPMoaP^Hm^jH04^USM^u z%W7i2?SD$=T76VT@*nH83d-;0B4=$d=s`(Yf8PhDwlhc3eItLTfIad6vVK9`Imq