public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
* [setup - the official Cygwin setup program] branch master, updated. release_2.918-18-g212135ac
@ 2022-06-17 12:47 Jon TURNEY
  0 siblings, 0 replies; only message in thread
From: Jon TURNEY @ 2022-06-17 12:47 UTC (permalink / raw)
  To: cygwin-apps-cvs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 81599 bytes --]




https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=212135acf1be102c98760d7dbeb7cc92ef998a71

commit 212135acf1be102c98760d7dbeb7cc92ef998a71
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 21:03:18 2022 +0100

    Update README

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=7d12fb07114647a57bb0c37aab99a8c4ff900b8d

commit 7d12fb07114647a57bb0c37aab99a8c4ff900b8d
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Fri Jun 17 10:23:10 2022 +0100

    Also localize options helptext framing text

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=e11d78063bfa1347a0c66af6cb6f9bf93c1f6ce5

commit e11d78063bfa1347a0c66af6cb6f9bf93c1f6ce5
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 21:03:01 2022 +0100

    Enable maintainer mode for libgetopt++
    
    AM_MAINTAINER_MODE without an argument means --disable-maintainer-mode
    by default, which isn't what's wanted.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=0842d2e3a3c280fcce1ce780c77ab7c766dcae0b

commit 0842d2e3a3c280fcce1ce780c77ab7c766dcae0b
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 20:14:20 2022 +0100

    Add a GitHub workflow for building on Cygwin

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=3f7be6270618acdf9dddbcd6ffd6ea9e03171cf9

commit 3f7be6270618acdf9dddbcd6ffd6ea9e03171cf9
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 17:03:03 2022 +0100

    Try to ensure console output is correctly encoded
    
    Previously, all log messages were ASCII, so this wasn't a concern.  Now
    that log may contain UTF-8, we need to ensure that appears correctly.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=6ac90bf08213d9b7a20fc9f086fb89601a7a2019

commit 6ac90bf08213d9b7a20fc9f086fb89601a7a2019
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 22:05:05 2022 +0100

    Add French translations of option help-text
    
    Also make some minor adjustments to help-texts for consistency:
    * --no-warn-deprecated-windows should start "Don't"
    * --categories doesn't need to say "entire"
    * --download and --local-install no longer say "seulement"

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=20f237b4e884af7992c5b5e270301684f64d0395

commit 20f237b4e884af7992c5b5e270301684f64d0395
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Thu Jun 16 13:57:38 2022 +0100

    Add command-line option help-text localization
    
    Change libgetopt++ Option class to store an unsigned int message catalog
    identifer for the help-text, rather than a std::string of the help-text.
    
    ParameterUsage (the function which produces the help output) now takes a
    lookup function as a parameter, which translates that message identifer
    to a localized std::string.
    
    Move existing help-text to a stringtable resource, and then wire up
    ParameterUsage to use LoadString.
    
    Update libgetop++ tests appropriately.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=b0bd16950669290e488dc382051f7f28f2278eef

commit b0bd16950669290e488dc382051f7f28f2278eef
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Mon Jun 13 14:54:50 2022 +0100

    Fix '-t -P package-with-only-a-test-version'
    
    Fix how 'install any version' operates in that case.
    Also make '-t' have an effect when used with '-P' but without '-g'.
    
    Future work: The language around '-t' perhaps needs refining, since it's
    absence just lowers the priority of test packages, not prohibiting their
    use (so in this particular case, package-with-only-a-test-version will
    be installed, even without '-t')

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=9ea9db8ff367b21efe0ed9a7ada0e1e697751518

commit 9ea9db8ff367b21efe0ed9a7ada0e1e697751518
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Tue Jun 14 22:03:48 2022 +0100

    Improve consistency of ending sentences with a full-stop
    
    Improve the consistency between translations of ending sentences with a
    full-stop.
    
    Always end the sentence under the page title with a full-stop.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=35152c83ad51db6ada7f072bc57318d30a44e459

commit 35152c83ad51db6ada7f072bc57318d30a44e459
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Jun 15 14:49:38 2022 +0100

    Tidy up spacing in french translation
    
    Consistently use a space before ':' (apparently "space before and after
    full-height punctuation" is a standard typographical rule for French).
    
    Remove unneeded trailing whitespace.


Diff:
---
 .github/workflows/cygwin.yml                      |  53 +++++
 AntiVirus.cc                                      |   2 +-
 LogFile.cc                                        |  25 ++-
 README                                            |  17 +-
 String++.cc                                       |   7 +-
 String++.h                                        |   3 +-
 choose.cc                                         |  13 +-
 crypto.cc                                         |  17 +-
 desktop.cc                                        |   6 +-
 ini.cc                                            |   4 +-
 install.cc                                        |   4 +-
 io_stream_cygfile.cc                              |   4 +-
 libgetopt++/configure.ac                          |   1 -
 libgetopt++/include/getopt++/BoolOption.h         |   6 +-
 libgetopt++/include/getopt++/DefaultFormatter.h   |  13 +-
 libgetopt++/include/getopt++/Option.h             |   2 +-
 libgetopt++/include/getopt++/OptionSet.h          |   4 +-
 libgetopt++/include/getopt++/StringArrayOption.h  |   8 +-
 libgetopt++/include/getopt++/StringChoiceOption.h |   2 +-
 libgetopt++/include/getopt++/StringOption.h       |   8 +-
 libgetopt++/src/BoolOption.cc                     |   4 +-
 libgetopt++/src/OptionSet.cc                      |   4 +-
 libgetopt++/src/StringArrayOption.cc              |   4 +-
 libgetopt++/src/StringChoiceOption.cc             |   2 +-
 libgetopt++/src/StringOption.cc                   |   4 +-
 libgetopt++/tests/BoolOptionTest.cc               |   6 +-
 libgetopt++/tests/OptionSet.cc                    |  10 +-
 libgetopt++/tests/optioniterator.cc               |   2 +-
 libgetopt++/tests/testoption.cc                   |  13 +-
 libsolv.cc                                        |  13 +-
 localdir.cc                                       |   2 +-
 main.cc                                           |  38 ++--
 net.cc                                            |   2 +-
 nio-ie5.cc                                        |   2 +-
 package_db.cc                                     |   2 +-
 package_meta.cc                                   |   8 +-
 po/fr/res.po                                      | 235 ++++++++++++++++++++--
 prereq.cc                                         |   2 +-
 res.pot                                           | 209 ++++++++++++++++++-
 res/en/res.rc                                     |  66 +++++-
 res/fr/res.rc                                     |  74 ++++++-
 resource.h                                        |  49 +++++
 root.cc                                           |   2 +-
 site.cc                                           |   5 +-
 source.cc                                         |   4 +-
 win32.cc                                          |   7 +
 win32.h                                           |   1 +
 47 files changed, 820 insertions(+), 149 deletions(-)

diff --git a/.github/workflows/cygwin.yml b/.github/workflows/cygwin.yml
new file mode 100644
index 00000000..b406c5eb
--- /dev/null
+++ b/.github/workflows/cygwin.yml
@@ -0,0 +1,53 @@
+name: Cygwin
+
+on: push
+
+jobs:
+  cygwin-build:
+    name: Cygwin
+    runs-on: windows-latest
+
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+        - pkgarch: i686
+        - pkgarch: x86_64
+
+    steps:
+    - run: git config --global core.autocrlf input
+
+    # fetch all history for all tags for 'git describe'
+    - uses: actions/checkout@v3
+      with:
+        fetch-depth: 0
+
+    - name: Install Cygwin
+      uses: cygwin/cygwin-install-action@master
+      with:
+        packages: >-
+          autoconf,
+          automake,
+          bison,
+          flex,
+          libtool,
+          make,
+          mingw64-${{ matrix.pkgarch }}-bzip2,
+          mingw64-${{ matrix.pkgarch }}-gcc-g++,
+          mingw64-${{ matrix.pkgarch }}-headers,
+          mingw64-${{ matrix.pkgarch }}-libgcrypt,
+          mingw64-${{ matrix.pkgarch }}-libsolv,
+          mingw64-${{ matrix.pkgarch }}-xz,
+          mingw64-${{ matrix.pkgarch }}-zlib,
+          mingw64-${{ matrix.pkgarch }}-zstd,
+          upx
+
+    - name: Build
+      run: packaging-scripts/conf.sh upx ${{ matrix.pkgarch }}
+      shell: bash --noprofile --norc -eo pipefail '{0}'
+
+    - name: Test
+      run: >-
+        export PATH=/usr/${{ matrix.pkgarch }}-w64-mingw32/sys-root/mingw/bin/:${PATH} &&
+        make -C ${{ matrix.pkgarch }} check
+      shell: bash --noprofile --norc -eo pipefail '{0}'
diff --git a/AntiVirus.cc b/AntiVirus.cc
index 051a434d..cc416cc7 100644
--- a/AntiVirus.cc
+++ b/AntiVirus.cc
@@ -31,7 +31,7 @@
 /* XXX: Split this into observer and model classes */
 
 /* Default is to leave well enough alone */
-static BoolOption DisableVirusOption (false, 'A', "disable-buggy-antivirus", "Disable known or suspected buggy anti virus software packages during execution.");
+static BoolOption DisableVirusOption (false, 'A', "disable-buggy-antivirus", IDS_HELPTEXT_DISABLE_ANTIVIRUS);
 
 static bool KnownAVIsPresent = false;
 static bool AVRunning = true;
diff --git a/LogFile.cc b/LogFile.cc
index 0a83159f..ab2e3ec9 100644
--- a/LogFile.cc
+++ b/LogFile.cc
@@ -33,8 +33,7 @@
 #include "String++.h"
 #include "getopt++/BoolOption.h"
 
-static BoolOption VerboseOutput (false, 'v', "verbose",
-                                 "Verbose output");
+static BoolOption VerboseOutput (false, 'v', "verbose", IDS_HELPTEXT_VERBOSE);
 
 /* private helper class */
 class filedef
@@ -215,7 +214,27 @@ LogFile::endEntry()
 
   /* also write to stdout */
   if ((currEnt->level >= LOG_PLAIN) || VerboseOutput)
-    std::cout << buf << std::endl;
+    {
+      /*
+        The log message is UTF-8 encoded. Re-encode this in the console output
+        codepage (so it can be correctly decoded by a Windows terminal).
+        Unfortunately there's no API for direct multibyte re-encoding, so we
+        must do it in two steps UTF-8 -> UTF-16 -> CP_COCP.
+
+        If the console output codepage is UTF-8, we already have the log message
+        in the correct encoding, so we can avoid doing all that work.
+
+        If the output is not a console, GetConsoleOutputCP() returns 0.
+        Possibly it's a Cygwin pty?
+      */
+      std::string cpbuf = buf;
+
+      unsigned int ocp = GetConsoleOutputCP();
+      if ((ocp != 0 ) && (ocp != 65001))
+        cpbuf = wstring_to_string(string_to_wstring(buf), ocp);
+
+      std::cout << cpbuf << std::endl;
+    }
 
   if (!currEnt)
     {
diff --git a/README b/README
index b8f3f7cf..9bcf7b35 100644
--- a/README
+++ b/README
@@ -99,6 +99,19 @@ Follow the general directions given in the Cygwin contributions document:
    https://cygwin.com/contrib.html
 
 The appropriate mailing list for this project is cygwin-apps
-(rather than cygwin-patches). Thus, the appropriate final command would be:
+(rather than cygwin-patches). Thus an appropriate configuration is:
 
-   $ git send-email --to="cygwin-apps@cygwin.com"
+   $ git config --local format.subjectprefix "PATCH setup"
+   $ git config --local sendemail.to "cygwin-apps@cygwin.com"
+
+Before sending patches with:
+
+   $ git format-patch [--cover-letter]
+   $ git send-email *.patch
+
+
+TRANSLATIONS
+------------
+
+Translations of the gettext template res.pot can be made using PO file tools, or
+online at https://hosted.weblate.org/projects/cygwin-setup/cygwin-setup/
diff --git a/String++.cc b/String++.cc
index a5649759..9506b9e3 100644
--- a/String++.cc
+++ b/String++.cc
@@ -11,7 +11,6 @@
  */
 
 #include "String++.h"
-#include "win32.h"
 #include <string.h>
 #include <sstream>
 #include <algorithm>
@@ -116,15 +115,15 @@ std::wstring string_to_wstring(const std::string &s)
 }
 
 // convert a UTF-16 wstring to a UTF-8 string
-std::string wstring_to_string(const std::wstring &w)
+std::string wstring_to_string(const std::wstring &w, unsigned int encoding)
 {
-  int n = WideCharToMultiByte(CP_UTF8, 0, w.c_str(), -1, NULL, 0, NULL, NULL);
+  int n = WideCharToMultiByte(encoding, 0, w.c_str(), -1, NULL, 0, NULL, NULL);
 
   if (n <= 0)
     return "conversion failed";
 
   char *buf = new char[n+1];
-  WideCharToMultiByte(CP_UTF8, 0, w.c_str(), -1, buf, n, NULL, NULL);
+  WideCharToMultiByte(encoding, 0, w.c_str(), -1, buf, n, NULL, NULL);
 
   std::string s(buf);
   delete[] buf;
diff --git a/String++.h b/String++.h
index af32611c..caaf75f8 100644
--- a/String++.h
+++ b/String++.h
@@ -14,6 +14,7 @@
 #define SETUP_STRING___H
 
 #include <string>
+#include "win32.h"
 
 char *new_cstr_char_array (const std::string& s);
 
@@ -43,7 +44,7 @@ inline std::string operator+ (const char *a, const std::string& b)
 { return std::string(a) + b; }
 
 std::wstring string_to_wstring(const std::string &s);
-std::string wstring_to_string(const std::wstring &w);
+std::string wstring_to_string(const std::wstring &w, unsigned int encoding = CP_UTF8);
 
 // produce a std::string using formatting like sprintf
 std::wstring vformat(const std::wstring &fmt, va_list ap);
diff --git a/choose.cc b/choose.cc
index 1b18bbd0..8deab874 100644
--- a/choose.cc
+++ b/choose.cc
@@ -59,11 +59,11 @@
 #include "Exception.h"
 
 #include "getopt++/BoolOption.h"
-static BoolOption UpgradeAlsoOption (false, 'g', "upgrade-also", "Also upgrade installed packages");
-static BoolOption CleanOrphansOption (false, 'o', "delete-orphans", "Remove orphaned packages");
-static BoolOption ForceCurrentOption (false, 'f', "force-current", "Select the current version for all packages");
-static BoolOption PruneInstallOption (false, 'Y', "prune-install", "Prune the installation to only the requested packages");
-static BoolOption AllowTestOption (false, 't', "allow-test-packages", "Consider package versions marked test");
+static BoolOption UpgradeAlsoOption (false, 'g', "upgrade-also", IDS_HELPTEXT_UPGRADE_ALSO);
+static BoolOption CleanOrphansOption (false, 'o', "delete-orphans", IDS_HELPTEXT_DELETE_ORPHANS);
+static BoolOption ForceCurrentOption (false, 'f', "force-current", IDS_HELPTEXT_FORCE_CURRENT);
+static BoolOption PruneInstallOption (false, 'Y', "prune-install", IDS_HELPTEXT_PRUNE_INSTALL);
+static BoolOption AllowTestOption (false, 't', "allow-test-packages", IDS_HELPTEXT_ALLOW_TEST);
 
 extern ThreeBarProgressPage Progress;
 
@@ -166,7 +166,6 @@ ChooserPage::initialUpdateState()
   if (ForceCurrentOption)
     {
       update_mode_id = IDC_CHOOSE_SYNC;
-      changeTrust(update_mode_id, AllowTestOption, true);
     }
   else if (hasManualSelections && !UpgradeAlsoOption)
     {
@@ -177,8 +176,8 @@ ChooserPage::initialUpdateState()
   else
     {
       update_mode_id = IDC_CHOOSE_BEST;
-      changeTrust (update_mode_id, AllowTestOption, true);
     }
+  changeTrust(update_mode_id, AllowTestOption, true);
 
   static int ta[] = { IDC_CHOOSE_KEEP, IDC_CHOOSE_BEST, IDC_CHOOSE_SYNC, 0 };
   rbset (GetHWND (), ta, update_mode_id);
diff --git a/crypto.cc b/crypto.cc
index 88ced387..a837f8da 100644
--- a/crypto.cc
+++ b/crypto.cc
@@ -42,18 +42,11 @@
 #endif
 
 /*  Command-line options for specifying and controlling extra keys.  */
-static StringArrayOption ExtraKeyOption ('K', "pubkey",
-                                         "URL or absolute path of extra public key file (RFC4880 format)");
-
-static StringArrayOption SexprExtraKeyOption ('S', "sexpr-pubkey",
-                                              "Extra DSA public key in s-expr format");
-
-static BoolOption UntrustedKeysOption (false, 'u', "untrusted-keys",
-			"Use untrusted saved extra keys");
-static BoolOption KeepUntrustedKeysOption (false, 'U', "keep-untrusted-keys",
-			"Use untrusted keys and retain all");
-static BoolOption EnableOldKeysOption (false, '\0', "old-keys",
-                                       "Enable old cygwin.com keys",
+static StringArrayOption ExtraKeyOption ('K', "pubkey", IDS_HELPTEXT_PUBKEY);
+static StringArrayOption SexprExtraKeyOption ('S', "sexpr-pubkey", IDS_HELPTEXT_SEXPR_PUBKEY);
+static BoolOption UntrustedKeysOption (false, 'u', "untrusted-keys", IDS_HELPTEXT_UNTRUSTED_KEYS);
+static BoolOption KeepUntrustedKeysOption (false, 'U', "keep-untrusted-keys", IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS);
+static BoolOption EnableOldKeysOption (false, '\0', "old-keys", IDS_HELPTEXT_OLD_KEYS,
                                        BoolOption::BoolOptionType::pairedAble);
 
 /*  Embedded public half of Cygwin signing key.  */
diff --git a/desktop.cc b/desktop.cc
index aa1f9019..4b76568c 100644
--- a/desktop.cc
+++ b/desktop.cc
@@ -40,9 +40,9 @@
 #include "getopt++/BoolOption.h"
 #include "LogFile.h"
 
-static BoolOption NoShortcutsOption (false, 'n', "no-shortcuts", "Disable creation of desktop and start menu shortcuts");
-static BoolOption NoStartMenuOption (false, 'N', "no-startmenu", "Disable creation of start menu shortcut");
-static BoolOption NoDesktopOption (false, 'd', "no-desktop", "Disable creation of desktop shortcut");
+static BoolOption NoShortcutsOption (false, 'n', "no-shortcuts", IDS_HELPTEXT_NO_SHORTCUTS);
+static BoolOption NoStartMenuOption (false, 'N', "no-startmenu", IDS_HELPTEXT_NO_STARTMENU);
+static BoolOption NoDesktopOption (false, 'd', "no-desktop", IDS_HELPTEXT_NO_DESKTOP);
 
 /* Lines starting with '@' are conditionals - include 'N' for NT,
    '5' for Win95, '8' for Win98, '*' for all, like this:
diff --git a/ini.cc b/ini.cc
index 1fd39ba1..3ef13118 100644
--- a/ini.cc
+++ b/ini.cc
@@ -61,8 +61,8 @@ std::string ini_setup_version;
 IniList setup_ext_list (setup_exts,
 			setup_exts + (sizeof(setup_exts) / sizeof(*setup_exts)));
 
-static BoolOption NoVerifyOption (false, 'X', "no-verify", "Don't verify setup.ini signatures");
-static BoolOption NoVersionCheckOption (false, '\0', "no-version-check", "Suppress checking if a newer version of setup is available");
+static BoolOption NoVerifyOption (false, 'X', "no-verify", IDS_HELPTEXT_NO_VERIFY);
+static BoolOption NoVersionCheckOption (false, '\0', "no-version-check", IDS_HELPTEXT_NO_VERSION_CHECK);
 
 class GuiParseFeedback : public IniParseFeedback
 {
diff --git a/install.cc b/install.cc
index beb15c74..e58ef4b3 100644
--- a/install.cc
+++ b/install.cc
@@ -66,9 +66,7 @@ static long long int total_bytes = 0;
 static long long int total_bytes_sofar = 0;
 static int package_bytes = 0;
 
-static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot",
-				     "Disable replacing in-use files on next "
-				     "reboot.");
+static BoolOption NoReplaceOnReboot (false, 'r', "no-replaceonreboot", IDS_HELPTEXT_NO_REPLACEONREBOOT);
 
 struct std_dirs_t {
   const char *name;
diff --git a/io_stream_cygfile.cc b/io_stream_cygfile.cc
index 52ef7355..7fa661c6 100644
--- a/io_stream_cygfile.cc
+++ b/io_stream_cygfile.cc
@@ -29,6 +29,7 @@
 #include "io_stream_cygfile.h"
 #include "IOStreamProvider.h"
 #include "LogSingleton.h"
+#include "resource.h"
 
 static StringChoiceOption::StringChoices algs({
     {"xpress4k", FILE_PROVIDER_COMPRESSION_XPRESS4K},
@@ -38,8 +39,7 @@ static StringChoiceOption::StringChoices algs({
   });
 
 static StringChoiceOption CompactOsOption(algs,
-    '\0', "compact-os",
-    "Compress installed files with Compact OS (xpress4k, xpress8k, xpress16k, lzx)",
+   '\0', "compact-os", IDS_HELPTEXT_COMPACTOS,
     true, -1, FILE_PROVIDER_COMPRESSION_LZX);
 
 /* completely private iostream registration class */
diff --git a/libgetopt++/configure.ac b/libgetopt++/configure.ac
index 45070264..b79691dc 100644
--- a/libgetopt++/configure.ac
+++ b/libgetopt++/configure.ac
@@ -10,7 +10,6 @@ AC_CONFIG_AUX_DIR(cfgaux)
 AM_INIT_AUTOMAKE
 AC_CONFIG_HEADERS(include/autoconf.h)
 AC_PREFIX_DEFAULT(/usr/local)
-AM_MAINTAINER_MODE
 m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES(yes)])
 
 AC_LANG([C++])
diff --git a/libgetopt++/include/getopt++/BoolOption.h b/libgetopt++/include/getopt++/BoolOption.h
index 8b20e1cc..7cfb8bf4 100644
--- a/libgetopt++/include/getopt++/BoolOption.h
+++ b/libgetopt++/include/getopt++/BoolOption.h
@@ -31,14 +31,14 @@ public:
     };
 
   BoolOption(bool const defaultvalue, char shortopt, char const *longopt = 0,
-             std::string const &shorthelp = std::string(),
+             unsigned int shorthelp = 0,
              BoolOptionType type = BoolOptionType::simple,
              OptionSet &owner=GetOption::GetInstance());
   virtual ~ BoolOption ();
   virtual std::string const shortOption () const;
   virtual std::string const longOption () const;
   virtual std::vector<std::string> const & longOptionPrefixes () const;
-  virtual std::string const shortHelp () const;
+  virtual unsigned int shortHelp () const;
   virtual Result Process (char const *, int);
   virtual Argument argument () const;
   operator bool () const;
@@ -48,7 +48,7 @@ private:
   bool _ovalue;
   char _shortopt;
   char const *_longopt;
-  std::string _shorthelp;
+  unsigned int _shorthelp;
   BoolOptionType _type;
 };
 
diff --git a/libgetopt++/include/getopt++/DefaultFormatter.h b/libgetopt++/include/getopt++/DefaultFormatter.h
index 8b421a67..ee2397f5 100644
--- a/libgetopt++/include/getopt++/DefaultFormatter.h
+++ b/libgetopt++/include/getopt++/DefaultFormatter.h
@@ -31,18 +31,20 @@ class DefaultFormatter {
     const unsigned int h_len;
     const std::string s_lead;
     const std::string l_lead;
+    std::ostream &theStream;
+    StrLookup strLookup;
   public:
-    DefaultFormatter (std::ostream &aStream)
+    DefaultFormatter (std::ostream &aStream, StrLookup aLookup)
       : o_len(35), h_len(45),
         s_lead(" -"), l_lead(" --"),
-        theStream(aStream)
+        theStream(aStream), strLookup(aLookup)
     {}
-    DefaultFormatter (std::ostream &aStream,
+    DefaultFormatter (std::ostream &aStream, StrLookup aLookup,
 		      unsigned int o_len, unsigned int h_len,
 		      std::string s_lead, std::string l_lead)
       : o_len(o_len), h_len(h_len),
         s_lead(s_lead), l_lead(l_lead),
-        theStream(aStream)
+        theStream(aStream), strLookup(aLookup)
     {}
     void operator () (Option *anOption) {
       if (anOption->shortOption ()[0] == '\0')
@@ -57,7 +59,7 @@ class DefaultFormatter {
 		<< std::string (o_len
 				- s_lead.size () - 1 - l_lead.size ()
 				- longOption.size (), ' ');
-      std::string helpmsg = anOption->shortHelp();
+      std::string helpmsg = strLookup(anOption->shortHelp());
       while (helpmsg.size() > h_len)
 	{
 	  // TODO: consider using a line breaking strategy here.
@@ -68,7 +70,6 @@ class DefaultFormatter {
 	}
       theStream << helpmsg << std::endl;
     }
-    std::ostream &theStream;
 };
 
 #endif // _GETOPT___DEFAULTFORMATTER_H_
diff --git a/libgetopt++/include/getopt++/Option.h b/libgetopt++/include/getopt++/Option.h
index b3b140ff..ae301813 100644
--- a/libgetopt++/include/getopt++/Option.h
+++ b/libgetopt++/include/getopt++/Option.h
@@ -34,7 +34,7 @@ public:
   virtual std::string const shortOption () const = 0;
   virtual std::string const longOption () const = 0;
   virtual std::vector<std::string> const & longOptionPrefixes () const;
-  virtual std::string const shortHelp () const = 0;
+  virtual unsigned int shortHelp () const = 0;
   enum Result {
       Failed,
       Ok,
diff --git a/libgetopt++/include/getopt++/OptionSet.h b/libgetopt++/include/getopt++/OptionSet.h
index dbd8046b..b0c218cc 100644
--- a/libgetopt++/include/getopt++/OptionSet.h
+++ b/libgetopt++/include/getopt++/OptionSet.h
@@ -21,6 +21,8 @@
 #include <vector>
 #include "getopt++/Option.h"
 
+typedef const std::string (*StrLookup)(unsigned int);
+
 class OptionSet
 {
 public:
@@ -30,7 +32,7 @@ public:
   virtual bool Process (int argc, char **argv, Option *nonOptionHandler);
   virtual bool Process (std::vector<std::string> const &parms, Option *nonOptionHandler);
   virtual bool process (Option *nonOptionHandler);
-  virtual void ParameterUsage (std::ostream &);
+  virtual void ParameterUsage (std::ostream &, StrLookup strLookup);
   virtual std::vector<Option *> const &optionsInSet() const;
   virtual std::vector<std::string> const &nonOptions() const;
   virtual std::vector<std::string> const &remainingArgv() const;
diff --git a/libgetopt++/include/getopt++/StringArrayOption.h b/libgetopt++/include/getopt++/StringArrayOption.h
index b589d283..0072bfde 100644
--- a/libgetopt++/include/getopt++/StringArrayOption.h
+++ b/libgetopt++/include/getopt++/StringArrayOption.h
@@ -23,12 +23,12 @@ class StringArrayOption : public Option
 {
 public:
   StringArrayOption(char shortopt, char const *longopt = 0,
-	     std::string const &shorthelp = std::string(),
-	     OptionSet &owner=GetOption::GetInstance());
+                    unsigned int shorthelp = 0,
+                    OptionSet &owner=GetOption::GetInstance());
   virtual ~ StringArrayOption ();
   virtual std::string const shortOption () const;
   virtual std::string const longOption () const;
-  virtual std::string const shortHelp () const;
+  virtual unsigned int shortHelp () const;
   virtual Result Process (char const *, int);
   virtual Argument argument () const;
   operator std::vector<std::string> () const;
@@ -38,7 +38,7 @@ private:
   std::vector<std::string> _value;
   char _shortopt;
   char const *_longopt;
-  std::string _shorthelp;
+  unsigned int _shorthelp;
 };
 
 #endif // _STRINGARRAYOPTION_H_
diff --git a/libgetopt++/include/getopt++/StringChoiceOption.h b/libgetopt++/include/getopt++/StringChoiceOption.h
index 88007128..2cf70f2a 100644
--- a/libgetopt++/include/getopt++/StringChoiceOption.h
+++ b/libgetopt++/include/getopt++/StringChoiceOption.h
@@ -23,7 +23,7 @@ public:
 
   StringChoiceOption(StringChoices choices,
                      char shortopt, char const *longopt = 0,
-                     std::string const &shorthelp = std::string(),
+                     unsigned int shorthelp = 0,
                      bool const optional = true,   // option without choice string is permitted
                      int const defaultvalue = -1,  // value when option is absent
                      int const impliedvalue = -1); // value when option is present without choice string
diff --git a/libgetopt++/include/getopt++/StringOption.h b/libgetopt++/include/getopt++/StringOption.h
index 37e723a6..10bb4b89 100644
--- a/libgetopt++/include/getopt++/StringOption.h
+++ b/libgetopt++/include/getopt++/StringOption.h
@@ -24,12 +24,12 @@ class StringOption : public Option
 {
 public:
   StringOption(std::string const defaultvalue, char shortopt, char const *longopt = 0,
-	     std::string const &shorthelp = std::string(), bool const optional = true,
-	     OptionSet &owner=GetOption::GetInstance());
+               unsigned int shorthelp = 0, bool const optional = true,
+               OptionSet &owner=GetOption::GetInstance());
   virtual ~ StringOption ();
   virtual std::string const shortOption () const;
   virtual std::string const longOption () const;
-  virtual std::string const shortHelp () const;
+  virtual unsigned int shortHelp () const;
   virtual Result Process (char const *, int);
   virtual Argument argument () const;
   operator const std::string& () const;
@@ -39,7 +39,7 @@ private:
   std::string _value;
   char _shortopt;
   char const *_longopt;
-  std::string _shorthelp;
+  unsigned int _shorthelp;
 };
 
 #endif // _STRINGOPTION_H_
diff --git a/libgetopt++/src/BoolOption.cc b/libgetopt++/src/BoolOption.cc
index 37d9a229..fa9686b7 100644
--- a/libgetopt++/src/BoolOption.cc
+++ b/libgetopt++/src/BoolOption.cc
@@ -16,7 +16,7 @@
 #include <getopt++/BoolOption.h>
 
 BoolOption::BoolOption(bool const defaultvalue, char shortopt,
-                       char const *longopt, std::string const &shorthelp,
+                       char const *longopt, unsigned int shorthelp,
                        BoolOptionType type, OptionSet &owner) :
   _value (defaultvalue), _ovalue (defaultvalue), _shortopt(shortopt),
   _longopt (longopt), _shorthelp (shorthelp), _type(type)
@@ -56,7 +56,7 @@ BoolOption::longOptionPrefixes () const
     }
 }
 
-std::string const
+unsigned int
 BoolOption::shortHelp () const
 {
   return _shorthelp;
diff --git a/libgetopt++/src/OptionSet.cc b/libgetopt++/src/OptionSet.cc
index 5a8ddee4..004c2cba 100644
--- a/libgetopt++/src/OptionSet.cc
+++ b/libgetopt++/src/OptionSet.cc
@@ -334,10 +334,10 @@ comp_long_option(const Option *a, const Option *b)
 }
 
 void
-OptionSet::ParameterUsage (std::ostream &aStream)
+OptionSet::ParameterUsage (std::ostream &aStream, StrLookup strLookup)
 {
     std::sort(options.begin(), options.end(), comp_long_option);
-    for_each (options.begin(), options.end(), DefaultFormatter (aStream));
+    for_each (options.begin(), options.end(), DefaultFormatter (aStream, strLookup));
 }
 
 std::vector<Option *> const &
diff --git a/libgetopt++/src/StringArrayOption.cc b/libgetopt++/src/StringArrayOption.cc
index fe6f6131..1a2e69e2 100644
--- a/libgetopt++/src/StringArrayOption.cc
+++ b/libgetopt++/src/StringArrayOption.cc
@@ -15,7 +15,7 @@
 #include <getopt++/StringArrayOption.h>
 
 StringArrayOption::StringArrayOption(char shortopt,
-		       char const *longopt, std::string const &shorthelp,
+		       char const *longopt, unsigned int shorthelp,
 		       OptionSet &owner) :
 		       _optional(Required), _shortopt(shortopt),
 		       _longopt (longopt), _shorthelp (shorthelp)
@@ -37,7 +37,7 @@ StringArrayOption::longOption () const
   return _longopt;
 }
 
-std::string const
+unsigned int
 StringArrayOption::shortHelp () const
 {
   return _shorthelp;
diff --git a/libgetopt++/src/StringChoiceOption.cc b/libgetopt++/src/StringChoiceOption.cc
index 185d56af..be4d54df 100644
--- a/libgetopt++/src/StringChoiceOption.cc
+++ b/libgetopt++/src/StringChoiceOption.cc
@@ -14,7 +14,7 @@
 StringChoiceOption::StringChoiceOption (StringChoices _choices,
                                         char shortopt,
                                         char const *longopt,
-                                        std::string const &shorthelp,
+                                        unsigned int shorthelp,
                                         bool const optional,
                                         int const defaultvalue,
                                         int const impliedvalue) :
diff --git a/libgetopt++/src/StringOption.cc b/libgetopt++/src/StringOption.cc
index e3c4af64..0817c9c2 100644
--- a/libgetopt++/src/StringOption.cc
+++ b/libgetopt++/src/StringOption.cc
@@ -16,7 +16,7 @@
 #include <getopt++/StringOption.h>
 
 StringOption::StringOption(std::string const defaultvalue, char shortopt,
-		       char const *longopt, std::string const &shorthelp,
+		       char const *longopt, unsigned int shorthelp,
 		       bool const optional, OptionSet &owner) :
 		       _value (defaultvalue) , _shortopt(shortopt),
 		       _longopt (longopt), _shorthelp (shorthelp)
@@ -42,7 +42,7 @@ StringOption::longOption () const
   return _longopt;
 }
 
-std::string const
+unsigned int
 StringOption::shortHelp () const
 {
   return _shorthelp;
diff --git a/libgetopt++/tests/BoolOptionTest.cc b/libgetopt++/tests/BoolOptionTest.cc
index 7fdd2591..c83b3d3e 100644
--- a/libgetopt++/tests/BoolOptionTest.cc
+++ b/libgetopt++/tests/BoolOptionTest.cc
@@ -23,9 +23,9 @@
 int
 main (int anargc, char **anargv)
 {
-  BoolOption helpoption (false, 'h', "help", "Tests the use of help output.");
-  BoolOption helpoption2 (false, 'o', "help2", "Tests the use of help output.");
-  BoolOption ableoption (false, '\0', "foo", "Tests the use of paired option.", BoolOption::BoolOptionType::pairedAble);
+  BoolOption helpoption (false, 'h', "help");
+  BoolOption helpoption2 (false, 'o', "help2");
+  BoolOption ableoption (false, '\0', "foo", 0, BoolOption::BoolOptionType::pairedAble);
 
   int argc=2;
   char *argv[4];
diff --git a/libgetopt++/tests/OptionSet.cc b/libgetopt++/tests/OptionSet.cc
index 4eac880c..fa270e79 100644
--- a/libgetopt++/tests/OptionSet.cc
+++ b/libgetopt++/tests/OptionSet.cc
@@ -32,9 +32,9 @@ class StringCollector : public Option
        {
 	 return "";
        }
-     virtual const std::string shortHelp() const
+     virtual unsigned int shortHelp() const
        {
-	 return "";
+	 return 0;
        }
      virtual Option::Result Process(const char * value, int index);
      virtual Option::Argument argument() const
@@ -71,7 +71,7 @@ main (int anargc, char **anargv)
 	    std::cout << "Processed ok with no options and no default." << std::endl;
 	    return 1;
 	}
-	BoolOption testoption (false, 't', "testoption", "dummy for testing OptionSet behaviour");
+	BoolOption testoption (false, 't', "testoption");
 	if (!GetOption::GetInstance().Process(argc, argv, NULL)) {
 	    std::cout << "Failed to processed with options and only nonoption arguments." << std::endl;
 	    return 1;
@@ -114,7 +114,7 @@ main (int anargc, char **anargv)
 	    std::cout << "Processed with a value to a valueless=argument." << std::endl;
 	    return 1;
 	}
-	StringOption testrequiredstring ("default", 's', "string", "A string with required parameter", false);
+	StringOption testrequiredstring ("default", 's', "string", 0, false);
 	free (argv[argc - 1]);
 	argv[argc - 1] = strdup ("-st");
 	if (GetOption::GetInstance().Process(argc, argv, NULL)) {
@@ -152,7 +152,7 @@ main (int anargc, char **anargv)
 	    return 1;
 	}
 	
-	StringOption testoptionalstring ("default", 'o', "optional", "A string with optional parameter", true);
+	StringOption testoptionalstring ("default", 'o', "optional", 0, true);
 	argv[argc] = strdup ("-ot");
 	++argc;
 	if (!GetOption::GetInstance().Process(argc, argv, NULL)) {
diff --git a/libgetopt++/tests/optioniterator.cc b/libgetopt++/tests/optioniterator.cc
index 6d00d7ad..c7b6cb46 100644
--- a/libgetopt++/tests/optioniterator.cc
+++ b/libgetopt++/tests/optioniterator.cc
@@ -18,7 +18,7 @@
 
 #include <iostream>
 
-static BoolOption testoption (false, 't', "testoption", "Tests the use of boolean options");
+static BoolOption testoption (false, 't', "testoption");
 int
 main (int argc, char **argv)
 {
diff --git a/libgetopt++/tests/testoption.cc b/libgetopt++/tests/testoption.cc
index 1a18a2ed..7e54d42e 100644
--- a/libgetopt++/tests/testoption.cc
+++ b/libgetopt++/tests/testoption.cc
@@ -19,8 +19,15 @@
 
 #include <iostream>
 
-static BoolOption testoption (false, 't', "testoption", "Tests the use of boolean options");
-static BoolOption helpoption (false, 'h', "help", "Tests the use of help output.");
+static BoolOption testoption (false, 't', "testoption");
+static BoolOption helpoption (false, 'h', "help");
+
+static
+const std::string lookup(unsigned int)
+{
+  return "";
+}
+
 int
 main (int argc, char **argv)
 {
@@ -31,7 +38,7 @@ main (int argc, char **argv)
     }
   if (helpoption)
     {
-      GetOption::GetInstance().ParameterUsage(std::cout);
+      GetOption::GetInstance().ParameterUsage(std::cout, lookup);
     }
   if (testoption)
     {
diff --git a/libsolv.cc b/libsolv.cc
index a2f3f4c0..5b10c5a7 100644
--- a/libsolv.cc
+++ b/libsolv.cc
@@ -656,8 +656,17 @@ SolverTasks::setTasks()
         case packagemeta::Install_action:
           if (pkg->desired)
             add(pkg->desired, taskInstall); // install/upgrade
-          else if (pkg->curr)
-            add(pkg->curr, taskInstallAny); // install
+          else
+            {
+              // install
+              //
+              // empty desired means "any version", it doesn't matter which one
+              // we use as taskInstallAny only match on the provides name
+              if (pkg->curr)
+                add(pkg->curr, taskInstallAny);
+              else if (pkg->exp)
+                add(pkg->exp, taskInstallAny);
+            }
           break;
 
         case packagemeta::Uninstall_action:
diff --git a/localdir.cc b/localdir.cc
index 7130a17c..52bf734e 100644
--- a/localdir.cc
+++ b/localdir.cc
@@ -46,7 +46,7 @@
 #include "threebar.h"
 extern ThreeBarProgressPage Progress;
 
-static StringOption LocalDirOption ("", 'l', "local-package-dir", "Local package directory", false);
+static StringOption LocalDirOption ("", 'l', "local-package-dir", IDS_HELPTEXT_LOCAL_PACKAGE_DIR, false);
 
 static ControlAdjuster::ControlInfo LocaldirControlsInfo[] = {
   { IDC_LOCALDIR_GRP,       CP_STRETCH,   CP_TOP },
diff --git a/main.cc b/main.cc
index 9d1f419d..3a8c5ea5 100644
--- a/main.cc
+++ b/main.cc
@@ -95,18 +95,18 @@ static StringChoiceOption::StringChoices symlink_types({
     {"wsl", SymlinkTypeWsl},
   });
 
-static StringOption Arch ("", 'a', "arch", "Architecture to install (x86_64 or x86)", false);
-static BoolOption UnattendedOption (false, 'q', "quiet-mode", "Unattended setup mode");
-static BoolOption PackageManagerOption (false, 'M', "package-manager", "Semi-attended chooser-only mode");
-static BoolOption NoAdminOption (false, 'B', "no-admin", "Do not check for and enforce running as Administrator");
-static BoolOption WaitOption (false, 'W', "wait", "When elevating, wait for elevated child process");
-static BoolOption HelpOption (false, 'h', "help", "Print help");
-static BoolOption VersionOption (false, 'V', "version", "Show version");
-static StringOption SetupBaseNameOpt ("setup", 'i', "ini-basename", "Use a different basename, e.g. \"foo\", instead of \"setup\"", false);
-BoolOption UnsupportedOption (false, '\0', "allow-unsupported-windows", "Allow old, unsupported Windows versions");
-static BoolOption DeprecatedOption (false, 'w', "no-warn-deprecated-windows", "Warn about deprecated Windows versions");
-static StringChoiceOption SymlinkTypeOption(symlink_types, '\0', "symlink-type", "Symlink type (lnk, native, sys, wsl)", false, SymlinkTypeMagic);
-static StringOption GuiLangOption ("", '\0', "lang", "Specify GUI language langid");
+static StringOption Arch ("", 'a', "arch", IDS_HELPTEXT_ARCH, false);
+static BoolOption UnattendedOption (false, 'q', "quiet-mode", IDS_HELPTEXT_QUIET_MODE);
+static BoolOption PackageManagerOption (false, 'M', "package-manager", IDS_HELPTEXT_PACKAGE_MANAGER);
+static BoolOption NoAdminOption (false, 'B', "no-admin", IDS_HELPTEXT_NO_ADMIN);
+static BoolOption WaitOption (false, 'W', "wait", IDS_HELPTEXT_WAIT);
+static BoolOption HelpOption (false, 'h', "help", IDS_HELPTEXT_HELP);
+static BoolOption VersionOption (false, 'V', "version", IDS_HELPTEXT_VERSION);
+static StringOption SetupBaseNameOpt ("setup", 'i', "ini-basename", IDS_HELPTEXT_INI_BASENAME, false);
+BoolOption UnsupportedOption (false, '\0', "allow-unsupported-windows", IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS);
+static BoolOption DeprecatedOption (false, 'w', "no-warn-deprecated-windows", IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS);
+static StringChoiceOption SymlinkTypeOption(symlink_types, '\0', "symlink-type", IDS_HELPTEXT_SYMLINK_TYPE, false, SymlinkTypeMagic);
+static StringOption GuiLangOption ("", '\0', "lang", IDS_HELPTEXT_LANG);
 
 std::string SetupBaseName;
 
@@ -310,15 +310,19 @@ WinMain (HINSTANCE h,
 			<< setup_version << endLog;
       }
 
+    /* Some confusion of interfaces here: Normally we try to write un-localized
+       strings to the log. However, if output_only is true, then we know that
+       Log() is only outputting to console, not a logfile, so using localized
+       text is ok. */
     if (help_option)
       {
-	if (invalid_option)
-	  Log (LOG_PLAIN) << "\nError during option processing.\n" << endLog;
+        if (invalid_option)
+          Log (LOG_PLAIN) << "\n" << LoadStringUtf8(IDS_HELPTEXT_ERROR) << "\n" << endLog;
         Log (LOG_PLAIN) << "Cygwin setup " << setup_version << endLog;
-	Log (LOG_PLAIN) << "\nCommand Line Options:\n" << endLog;
-	GetOption::GetInstance ().ParameterUsage (Log (LOG_PLAIN));
+        Log (LOG_PLAIN) << "\n" << LoadStringUtf8(IDS_HELPTEXT_HEADER) << "\n" << endLog;
+	GetOption::GetInstance ().ParameterUsage (Log (LOG_PLAIN), LoadStringUtf8);
 	Log (LOG_PLAIN) << endLog;
-	Log (LOG_PLAIN) << "The default is to both download and install packages, unless either --download or --local-install is specified." << endLog;
+        Log (LOG_PLAIN) << LoadStringUtf8(IDS_HELPTEXT_FOOTER) << endLog;
 	Logger ().exit (invalid_option ? 1 : 0, false);
 	goto finish_up;
       }
diff --git a/net.cc b/net.cc
index ad497caf..f460efc8 100644
--- a/net.cc
+++ b/net.cc
@@ -35,7 +35,7 @@
 #include "ConnectionSetting.h"
 extern ThreeBarProgressPage Progress;
 
-static StringOption ProxyOption ("", 'p', "proxy", "HTTP/FTP proxy (host:port)", false);
+static StringOption ProxyOption ("", 'p', "proxy", IDS_HELPTEXT_PROXY, false);
 
 static int rb[] = { IDC_NET_PRECONFIG, IDC_NET_DIRECT, IDC_NET_PROXY, 0 };
 static bool doing_loading = false;
diff --git a/nio-ie5.cc b/nio-ie5.cc
index 876aac63..2117e33e 100644
--- a/nio-ie5.cc
+++ b/nio-ie5.cc
@@ -32,7 +32,7 @@
 #include <sstream>
 #include <iomanip>
 
-static StringOption UserAgent ("", '\0', "user-agent", "User agent string for HTTP requests");
+static StringOption UserAgent ("", '\0', "user-agent", IDS_HELPTEXT_USER_AGENT);
 
 static const std::string
 machine_name(USHORT machine)
diff --git a/package_db.cc b/package_db.cc
index 03591d75..b02d6dcd 100644
--- a/package_db.cc
+++ b/package_db.cc
@@ -43,7 +43,7 @@
 #include "csu_util/version_compare.h"
 #include "getopt++/BoolOption.h"
 
-static BoolOption MirrorOption (false, 'm', "mirror-mode", "Skip package availability check when installing from local directory (requires local directory to be clean mirror!)");
+static BoolOption MirrorOption (false, 'm', "mirror-mode", IDS_HELPTEXT_MIRROR_MODE);
 
 packagedb::packagedb ()
 {
diff --git a/package_meta.cc b/package_meta.cc
index 1c6183c6..8a695257 100644
--- a/package_meta.cc
+++ b/package_meta.cc
@@ -43,10 +43,10 @@
 #include "Exception.h"
 #include "resource.h"
 
-static StringArrayOption DeletePackageOption ('x', "remove-packages", "Specify packages to uninstall");
-static StringArrayOption DeleteCategoryOption ('c', "remove-categories", "Specify categories to uninstall");
-static StringArrayOption PackageOption ('P', "packages", "Specify packages to install");
-static StringArrayOption CategoryOption ('C', "categories", "Specify entire categories to install");
+static StringArrayOption DeletePackageOption ('x', "remove-packages", IDS_HELPTEXT_REMOVE_PACKAGES);
+static StringArrayOption DeleteCategoryOption ('c', "remove-categories", IDS_HELPTEXT_REMOVE_CATEGORIES);
+static StringArrayOption PackageOption ('P', "packages", IDS_HELPTEXT_PACKAGES);
+static StringArrayOption CategoryOption ('C', "categories", IDS_HELPTEXT_CATEGORIES);
 bool hasManualSelections = 0;
 
 /*****************/
diff --git a/po/fr/res.po b/po/fr/res.po
index a1bea77d..a741eaa8 100644
--- a/po/fr/res.po
+++ b/po/fr/res.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-06 19:04+0100\n"
+"POT-Creation-Date: 2022-06-17 10:45+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -150,7 +150,7 @@ msgstr "Juste &Moi"
 
 #: DIALOG.IDD_ROOT.LTEXT.IDC_ALLUSERS_TEXT
 msgid "Cygwin will be available to all users of the system."
-msgstr "Cygwin sera disponible pour tous les utilisateurs"
+msgstr "Cygwin sera disponible pour tous les utilisateurs."
 
 #: DIALOG.IDD_ROOT.LTEXT.IDC_JUSTME_TEXT
 msgid ""
@@ -172,7 +172,7 @@ msgid "Available Download Sites:"
 msgstr "Sites disponibles :"
 
 #: DIALOG.IDD_SITE.LTEXT.IDC_STATIC
-msgid "Choose a site from this list, or add your own sites to the list"
+msgid "Choose a site from this list, or add your own sites to the list."
 msgstr ""
 "Choisissez un site dans cette liste, ou ajoutez vos propres sites à la liste."
 
@@ -480,12 +480,12 @@ msgid "&Hide obsolete packages"
 msgstr "&Cacher les paquets obsolètes"
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_CHOOSE_INST_TEXT_DOWNLOAD
-msgid "Select packages to download"
-msgstr "Sélectionnez les paquets à télécharger"
+msgid "Select packages to download."
+msgstr "Sélectionnez les paquets à télécharger."
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_CHOOSE_INST_TEXT_INSTALL
-msgid "Select packages to install"
-msgstr "Sélectionnez les paquets à installer"
+msgid "Select packages to install."
+msgstr "Sélectionnez les paquets à installer."
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_STATIC_HEADER_TITLE
 msgid "Select Packages"
@@ -502,7 +502,7 @@ msgstr "Résolution des dépendances"
 #: DIALOG.IDD_PREREQ.LTEXT.IDC_STATIC
 msgid "The following problems occured trying to satisfy dependencies."
 msgstr ""
-"Les problèmes suivants apparaissent lors de la résolution des dépendances"
+"Les problèmes suivants apparaissent lors de la résolution des dépendances."
 
 #: DIALOG.IDD_PREREQ.CONTROL.IDC_PREREQ_CHECK
 msgid "&Accept default problem solutions"
@@ -623,7 +623,7 @@ msgstr "Impossible d'extraire"
 
 #: DIALOG.IDD_FILE_INUSE.LTEXT.IDC_STATIC
 msgid "The file is in use by the following processes:"
-msgstr "Ce fichier est en cours d'utilisation par : "
+msgstr "Ce fichier est en cours d'utilisation par :"
 
 #: DIALOG.IDD_FILE_INUSE.LTEXT.IDC_FILE_INUSE_HELP_0
 msgid ""
@@ -740,7 +740,7 @@ msgstr "Impossible d'ouvrir le fichier de trace %s en écriture"
 
 #: STRINGTABLE.IDS_UNINSTALL_COMPLETE
 msgid "Uninstalls complete."
-msgstr "Désinstallation terminée"
+msgstr "Désinstallation terminée."
 
 #: STRINGTABLE.IDS_ERR_CHDIR
 msgid "Could not change dir to %s: %s [%.8x]"
@@ -813,7 +813,7 @@ msgstr ""
 "Erreur Fatale : exception non traitée\n"
 "Thread : %s\n"
 "Type : %s\n"
-"Message: %s\n"
+"Message : %s\n"
 "AppErrNo : %d"
 
 #: STRINGTABLE.IDS_TRUSTKEEP_TOOLTIP
@@ -825,7 +825,7 @@ msgstr ""
 "demander à l'assistant de ne faire aucun changement aux paquets."
 
 #: STRINGTABLE.IDS_TRUSTCURR_TOOLTIP
-msgid "Sets all packages to the best version available. (RECOMMENDED)"
+msgid "Sets all packages to the best version available (RECOMMENDED)."
 msgstr ""
 "Sélectionne globalement la version qui est actuellement considérée comme la "
 "meilleure (RECOMMANDÉ)."
@@ -1096,7 +1096,7 @@ msgstr "Assistant Cygwin"
 
 #: STRINGTABLE.IDS_EXTRACTION_FAILED
 msgid "Unable to extract /%s -- corrupt package?"
-msgstr "Impossible d'extraire /%s -- paquet corrompu ?\r\n"
+msgstr "Impossible d'extraire /%s -- paquet corrompu ?"
 
 #: STRINGTABLE.IDS_EXTRACTION_INUSE
 msgid ""
@@ -1171,7 +1171,7 @@ msgstr ""
 
 #: STRINGTABLE.IDS_NIO_ERROR
 msgid "Internet Error: %s"
-msgstr "Erreur Internet: %s"
+msgstr "Erreur Internet : %s"
 
 #: STRINGTABLE.IDS_PREREQ_UNSOLVED_PROBLEMS
 msgid ""
@@ -1293,3 +1293,210 @@ msgstr "&Tuer les processus"
 msgctxt "STRINGTABLE.IDS_FILE_INUSE_MSG"
 msgid "Unable to extract"
 msgstr "Incapable d'extraire"
+
+#: STRINGTABLE.IDS_HELPTEXT_ERROR
+msgid "Error during option processing."
+msgstr "Erreur pendant l'analyse des options."
+
+#: STRINGTABLE.IDS_HELPTEXT_HEADER
+msgid "Command Line Options:"
+msgstr "Options de la ligne de commandes :"
+
+#: STRINGTABLE.IDS_HELPTEXT_FOOTER
+msgid ""
+"The default is to both download and install packages, unless either --"
+"download or --local-install is specified."
+msgstr ""
+"Par défault téléchargement et installation des paquets, sauf si --download "
+"ou --local-install sont spécifiés."
+
+#: STRINGTABLE.IDS_HELPTEXT_ALLOW_TEST
+msgid "Consider package versions marked test"
+msgstr "Prendre en compte les paquets marqués test"
+
+#: STRINGTABLE.IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS
+msgid "Allow old, unsupported Windows versions"
+msgstr "Autoriser les vieilles versions de Windows"
+
+#: STRINGTABLE.IDS_HELPTEXT_ARCH
+msgid "Architecture to install (x86_64 or x86)"
+msgstr "Architecture à installer (x86_64 ou x86)"
+
+#: STRINGTABLE.IDS_HELPTEXT_CATEGORIES
+msgid "Specify categories to install"
+msgstr "Spécifie les catégories à installer"
+
+#: STRINGTABLE.IDS_HELPTEXT_COMPACTOS
+msgid ""
+"Compress installed files with Compact OS (xpress4k, xpress8k, xpress16k, lzx)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_DELETE_ORPHANS
+msgid "Remove orphaned packages"
+msgstr "Supprimer les paquets orphelins"
+
+#: STRINGTABLE.IDS_HELPTEXT_DISABLE_ANTIVIRUS
+msgid ""
+"Disable known or suspected buggy anti virus software packages during "
+"execution"
+msgstr "Inhibe les anti-virus buggés à l'exécution"
+
+#: STRINGTABLE.IDS_HELPTEXT_DOWNLOAD
+msgid "Download packages from internet"
+msgstr "Télécharger depuis internet"
+
+#: STRINGTABLE.IDS_HELPTEXT_FORCE_CURRENT
+msgid "Select the current version for all packages"
+msgstr "Choisir la version courante pour tous les paquets"
+
+#: STRINGTABLE.IDS_HELPTEXT_HELP
+msgid "Print help"
+msgstr "Afficher l'aide"
+
+#: STRINGTABLE.IDS_HELPTEXT_INCLUDE_SOURCE
+msgid "Automatically install source for every package installed"
+msgstr "Ajouter automatiquement les sources de chaque paquet installé"
+
+#: STRINGTABLE.IDS_HELPTEXT_INI_BASENAME
+msgid "Use a different basename, e.g. \"\"foo\"\", instead of \"\"setup\"\""
+msgstr "Utiliser un nom de base différent, p.ex. «toto», au lieu de «setup»"
+
+#: STRINGTABLE.IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS
+msgid "Use untrusted keys and retain all"
+msgstr "Utiliser les clés non-fiables et les garder"
+
+#: STRINGTABLE.IDS_HELPTEXT_LANG
+msgid "Specify GUI language langid"
+msgstr "Choisir la langue de l'IHM"
+
+#: STRINGTABLE.IDS_HELPTEXT_LOCAL_INSTALL
+msgid "Install packages from local directory"
+msgstr "Installer depuis un répertoire local"
+
+#: STRINGTABLE.IDS_HELPTEXT_LOCAL_PACKAGE_DIR
+msgid "Local package directory"
+msgstr "Dossier local pour les paquets"
+
+#: STRINGTABLE.IDS_HELPTEXT_MIRROR_MODE
+msgid ""
+"Skip package availability check when installing from local directory ("
+"requires local directory to be clean mirror!)"
+msgstr ""
+"Ne pas vérifier la présence d'un paquet depuis un dossier local (celui-ci "
+"doit être un miroir propre !)"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_ADMIN
+msgid "Do not check for and enforce running as Administrator"
+msgstr "Ne pas vérifier et forcer à installer en tant qu'administrateur"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_DESKTOP
+msgid "Disable creation of desktop shortcut"
+msgstr "Pas de création de raccourci de bureau"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_REPLACEONREBOOT
+msgid "Disable replacing in-use files on next reboot"
+msgstr ""
+"Inhibe le remplacement des fichiers en cours d'utilisation au prochain "
+"redémarrage"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_SHORTCUTS
+msgid "Disable creation of desktop and start menu shortcuts"
+msgstr "Pas de création de raccourcis de bureau et de menu"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_STARTMENU
+msgid "Disable creation of start menu shortcut"
+msgstr "Pas de création de raccourci de menu"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_VERIFY
+msgid "Don't verify setup.ini signatures"
+msgstr "Ne pas vérifier les signatures de setup.ini"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_VERSION_CHECK
+msgid "Suppress checking if a newer version of setup is available"
+msgstr ""
+"Ne pas vérifier si une version plus récente de l'assistant est disponible"
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS
+msgid "Don't warn about deprecated Windows versions"
+msgstr "Ne pas avertir pour les vieilles versions de Windows"
+
+#: STRINGTABLE.IDS_HELPTEXT_OLD_KEYS
+msgid "Enable old cygwin.com keys"
+msgstr "Utiliser les anciennes clés de cygwin.com"
+
+#: STRINGTABLE.IDS_HELPTEXT_ONLY_SITE
+msgid "Do not download mirror list.  Only use sites specified with -s."
+msgstr "Ignorer tous les sites sauf ceux spécifiés par -s"
+
+#: STRINGTABLE.IDS_HELPTEXT_PACKAGES
+msgid "Specify packages to install"
+msgstr "Spécifie les paquets à installer"
+
+#: STRINGTABLE.IDS_HELPTEXT_PACKAGE_MANAGER
+msgid "Semi-attended chooser-only mode"
+msgstr "Mode assistant sélection seulement"
+
+#: STRINGTABLE.IDS_HELPTEXT_PROXY
+msgid "HTTP/FTP proxy (host:port)"
+msgstr "Proxy HTTP/FTP (serveur:port)"
+
+#: STRINGTABLE.IDS_HELPTEXT_PRUNE_INSTALL
+msgid "Prune the installation to only the requested packages"
+msgstr "Purger l'installation pour n'avoir que les paquets demandés"
+
+#: STRINGTABLE.IDS_HELPTEXT_PUBKEY
+msgid "URL or absolute path of extra public key file (RFC4880 format)"
+msgstr ""
+"URL ou chemin complet d'une clé publique supplémentaire (format RFC4880)"
+
+#: STRINGTABLE.IDS_HELPTEXT_QUIET_MODE
+msgid "Unattended setup mode"
+msgstr "Assistant sans messages"
+
+#: STRINGTABLE.IDS_HELPTEXT_REMOVE_CATEGORIES
+msgid "Specify categories to uninstall"
+msgstr "Spécifie les catégories à désinstaller"
+
+#: STRINGTABLE.IDS_HELPTEXT_REMOVE_PACKAGES
+msgid "Specify packages to uninstall"
+msgstr "Spécifie les paquets à désinstaller"
+
+#: STRINGTABLE.IDS_HELPTEXT_ROOT
+msgid "Root installation directory"
+msgstr "Dossier racine de l'installation"
+
+#: STRINGTABLE.IDS_HELPTEXT_SEXPR_PUBKEY
+msgid "Extra DSA public key in s-expr format"
+msgstr "Clé publique DSA supplémentaire au format s-expr"
+
+#: STRINGTABLE.IDS_HELPTEXT_SITE
+msgid "Download site URL"
+msgstr "URL du site de téléchargement"
+
+#: STRINGTABLE.IDS_HELPTEXT_SYMLINK_TYPE
+msgid "Symlink type (lnk, native, sys, wsl)"
+msgstr "Type de lien symbolique (lnk, native, sys, wsl)"
+
+#: STRINGTABLE.IDS_HELPTEXT_UNTRUSTED_KEYS
+msgid "Use untrusted saved extra keys"
+msgstr "Utiliser les clés non-fiables enregistrées"
+
+#: STRINGTABLE.IDS_HELPTEXT_UPGRADE_ALSO
+msgid "Also upgrade installed packages"
+msgstr "Mettre à jour les paquets installés"
+
+#: STRINGTABLE.IDS_HELPTEXT_USER_AGENT
+msgid "User agent string for HTTP requests"
+msgstr "« User agent » pour les requêtes HTTP"
+
+#: STRINGTABLE.IDS_HELPTEXT_VERBOSE
+msgid "Verbose output"
+msgstr "Affichages verbeux"
+
+#: STRINGTABLE.IDS_HELPTEXT_VERSION
+msgid "Show version"
+msgstr "Montrer la version"
+
+#: STRINGTABLE.IDS_HELPTEXT_WAIT
+msgid "When elevating, wait for elevated child process"
+msgstr "Attendre le process fils en mode élévation"
diff --git a/prereq.cc b/prereq.cc
index 65a6b391..8c96cebf 100644
--- a/prereq.cc
+++ b/prereq.cc
@@ -32,7 +32,7 @@ static ControlAdjuster::ControlInfo PrereqControlsInfo[] = {
 };
 
 extern ThreeBarProgressPage Progress;
-BoolOption IncludeSource (false, 'I', "include-source", "Automatically install source for every package installed");
+BoolOption IncludeSource (false, 'I', "include-source", IDS_HELPTEXT_INCLUDE_SOURCE);
 
 // ---------------------------------------------------------------------------
 // implements class PrereqPage
diff --git a/res.pot b/res.pot
index 3b347250..f2aaa60e 100644
--- a/res.pot
+++ b/res.pot
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-14 13:10+0100\n"
+"POT-Creation-Date: 2022-06-17 10:45+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -155,7 +155,7 @@ msgid "Available Download Sites:"
 msgstr ""
 
 #: DIALOG.IDD_SITE.LTEXT.IDC_STATIC
-msgid "Choose a site from this list, or add your own sites to the list"
+msgid "Choose a site from this list, or add your own sites to the list."
 msgstr ""
 
 #: DIALOG.IDD_SITE.LTEXT.IDC_STATIC_HEADER_TITLE
@@ -448,11 +448,11 @@ msgid "&Hide obsolete packages"
 msgstr ""
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_CHOOSE_INST_TEXT_DOWNLOAD
-msgid "Select packages to download"
+msgid "Select packages to download."
 msgstr ""
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_CHOOSE_INST_TEXT_INSTALL
-msgid "Select packages to install"
+msgid "Select packages to install."
 msgstr ""
 
 #: DIALOG.IDD_CHOOSE.LTEXT.IDC_STATIC_HEADER_TITLE
@@ -740,7 +740,7 @@ msgid ""
 msgstr ""
 
 #: STRINGTABLE.IDS_TRUSTCURR_TOOLTIP
-msgid "Sets all packages to the best version available. (RECOMMENDED)"
+msgid "Sets all packages to the best version available (RECOMMENDED)."
 msgstr ""
 
 #: STRINGTABLE.IDS_TRUSTSYNC_TOOLTIP
@@ -1134,3 +1134,202 @@ msgstr ""
 msgctxt "STRINGTABLE.IDS_FILE_INUSE_MSG"
 msgid "Unable to extract"
 msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ERROR
+msgid "Error during option processing."
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_HEADER
+msgid "Command Line Options:"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_FOOTER
+msgid ""
+"The default is to both download and install packages, unless either --"
+"download or --local-install is specified."
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ALLOW_TEST
+msgid "Consider package versions marked test"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS
+msgid "Allow old, unsupported Windows versions"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ARCH
+msgid "Architecture to install (x86_64 or x86)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_CATEGORIES
+msgid "Specify categories to install"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_COMPACTOS
+msgid ""
+"Compress installed files with Compact OS (xpress4k, xpress8k, xpress16k, lzx)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_DELETE_ORPHANS
+msgid "Remove orphaned packages"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_DISABLE_ANTIVIRUS
+msgid ""
+"Disable known or suspected buggy anti virus software packages during "
+"execution"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_DOWNLOAD
+msgid "Download packages from internet"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_FORCE_CURRENT
+msgid "Select the current version for all packages"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_HELP
+msgid "Print help"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_INCLUDE_SOURCE
+msgid "Automatically install source for every package installed"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_INI_BASENAME
+msgid "Use a different basename, e.g. \"\"foo\"\", instead of \"\"setup\"\""
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS
+msgid "Use untrusted keys and retain all"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_LANG
+msgid "Specify GUI language langid"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_LOCAL_INSTALL
+msgid "Install packages from local directory"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_LOCAL_PACKAGE_DIR
+msgid "Local package directory"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_MIRROR_MODE
+msgid ""
+"Skip package availability check when installing from local directory ("
+"requires local directory to be clean mirror!)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_ADMIN
+msgid "Do not check for and enforce running as Administrator"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_DESKTOP
+msgid "Disable creation of desktop shortcut"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_REPLACEONREBOOT
+msgid "Disable replacing in-use files on next reboot"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_SHORTCUTS
+msgid "Disable creation of desktop and start menu shortcuts"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_STARTMENU
+msgid "Disable creation of start menu shortcut"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_VERIFY
+msgid "Don't verify setup.ini signatures"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_VERSION_CHECK
+msgid "Suppress checking if a newer version of setup is available"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS
+msgid "Don't warn about deprecated Windows versions"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_OLD_KEYS
+msgid "Enable old cygwin.com keys"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ONLY_SITE
+msgid "Do not download mirror list.  Only use sites specified with -s."
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_PACKAGES
+msgid "Specify packages to install"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_PACKAGE_MANAGER
+msgid "Semi-attended chooser-only mode"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_PROXY
+msgid "HTTP/FTP proxy (host:port)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_PRUNE_INSTALL
+msgid "Prune the installation to only the requested packages"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_PUBKEY
+msgid "URL or absolute path of extra public key file (RFC4880 format)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_QUIET_MODE
+msgid "Unattended setup mode"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_REMOVE_CATEGORIES
+msgid "Specify categories to uninstall"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_REMOVE_PACKAGES
+msgid "Specify packages to uninstall"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_ROOT
+msgid "Root installation directory"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_SEXPR_PUBKEY
+msgid "Extra DSA public key in s-expr format"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_SITE
+msgid "Download site URL"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_SYMLINK_TYPE
+msgid "Symlink type (lnk, native, sys, wsl)"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_UNTRUSTED_KEYS
+msgid "Use untrusted saved extra keys"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_UPGRADE_ALSO
+msgid "Also upgrade installed packages"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_USER_AGENT
+msgid "User agent string for HTTP requests"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_VERBOSE
+msgid "Verbose output"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_VERSION
+msgid "Show version"
+msgstr ""
+
+#: STRINGTABLE.IDS_HELPTEXT_WAIT
+msgid "When elevating, wait for elevated child process"
+msgstr ""
diff --git a/res/en/res.rc b/res/en/res.rc
index 127f3688..d5f6d1f1 100644
--- a/res/en/res.rc
+++ b/res/en/res.rc
@@ -132,7 +132,7 @@ BEGIN
                     WS_GROUP
     CONTROL         "",IDC_HEADSEPARATOR,"Static",SS_BLACKFRAME | SS_SUNKEN,0,28,
                     SETUP_STANDARD_DIALOG_W,1
-    LTEXT           "Choose a site from this list, or add your own sites to the list",
+    LTEXT           "Choose a site from this list, or add your own sites to the list.",
                     IDC_STATIC,21,9,239,16,NOT WS_GROUP
     LTEXT           "Choose A Download Site",IDC_STATIC_HEADER_TITLE,7,0,258,
                     8,NOT WS_GROUP
@@ -335,9 +335,9 @@ BEGIN
     CONTROL         "&Hide obsolete packages", IDC_CHOOSE_HIDE,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 167, 160, 14
     ICON            IDI_CYGWIN, IDC_HEADICON, SETUP_HEADICON_X, 0, 21, 20
-    LTEXT           "Select packages to download",
+    LTEXT           "Select packages to download.",
                     IDC_CHOOSE_INST_TEXT_DOWNLOAD, 21, 9, 239, 16, NOT WS_GROUP
-    LTEXT           "Select packages to install",
+    LTEXT           "Select packages to install.",
                     IDC_CHOOSE_INST_TEXT_INSTALL, 21, 9, 239, 16, NOT WS_GROUP
     LTEXT           "Select Packages", IDC_STATIC_HEADER_TITLE, 7, 0, 258, 8,
                     NOT WS_GROUP
@@ -514,8 +514,8 @@ BEGIN
     IDS_TRUSTKEEP_TOOLTIP   "Sets all packages to their currently installed "
        "version.  This is equivalent to telling setup not to make any "
        "changes to any package."
-    IDS_TRUSTCURR_TOOLTIP   "Sets all packages to the best version available. "
-       "(RECOMMENDED)"
+    IDS_TRUSTCURR_TOOLTIP   "Sets all packages to the best version available "
+       "(RECOMMENDED)."
     IDS_TRUSTSYNC_TOOLTIP   "Sets all packages to the version available from the "
        "package repository, downgrading if necessary."
     IDS_TRUSTEXP_TOOLTIP    "Enable test packages."
@@ -644,3 +644,59 @@ BEGIN
     IDS_FILE_INUSE_KILL "&Kill Processes"
     IDS_FILE_INUSE_MSG "Unable to extract"
 END
+
+//
+// Option Helptext String Table
+//
+
+STRINGTABLE
+BEGIN
+    IDS_HELPTEXT_ERROR "Error during option processing."
+    IDS_HELPTEXT_HEADER "Command Line Options:"
+    IDS_HELPTEXT_FOOTER "The default is to both download and install packages, unless either --download or --local-install is specified."
+    IDS_HELPTEXT_ALLOW_TEST "Consider package versions marked test"
+    IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS "Allow old, unsupported Windows versions"
+    IDS_HELPTEXT_ARCH "Architecture to install (x86_64 or x86)"
+    IDS_HELPTEXT_CATEGORIES "Specify categories to install"
+    IDS_HELPTEXT_COMPACTOS "Compress installed files with Compact OS (xpress4k, xpress8k, xpress16k, lzx)"
+    IDS_HELPTEXT_DELETE_ORPHANS "Remove orphaned packages"
+    IDS_HELPTEXT_DISABLE_ANTIVIRUS "Disable known or suspected buggy anti virus software packages during execution"
+    IDS_HELPTEXT_DOWNLOAD "Download packages from internet"
+    IDS_HELPTEXT_FORCE_CURRENT "Select the current version for all packages"
+    IDS_HELPTEXT_HELP "Print help"
+    IDS_HELPTEXT_INCLUDE_SOURCE "Automatically install source for every package installed"
+    IDS_HELPTEXT_INI_BASENAME "Use a different basename, e.g. ""foo"", instead of ""setup"""
+    IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS "Use untrusted keys and retain all"
+    IDS_HELPTEXT_LANG "Specify GUI language langid"
+    IDS_HELPTEXT_LOCAL_INSTALL "Install packages from local directory"
+    IDS_HELPTEXT_LOCAL_PACKAGE_DIR "Local package directory"
+    IDS_HELPTEXT_MIRROR_MODE "Skip package availability check when installing from local directory (requires local directory to be clean mirror!)"
+    IDS_HELPTEXT_NO_ADMIN "Do not check for and enforce running as Administrator"
+    IDS_HELPTEXT_NO_DESKTOP "Disable creation of desktop shortcut"
+    IDS_HELPTEXT_NO_REPLACEONREBOOT "Disable replacing in-use files on next reboot"
+    IDS_HELPTEXT_NO_SHORTCUTS "Disable creation of desktop and start menu shortcuts"
+    IDS_HELPTEXT_NO_STARTMENU "Disable creation of start menu shortcut"
+    IDS_HELPTEXT_NO_VERIFY "Don't verify setup.ini signatures"
+    IDS_HELPTEXT_NO_VERSION_CHECK "Suppress checking if a newer version of setup is available"
+    IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS "Don't warn about deprecated Windows versions"
+    IDS_HELPTEXT_OLD_KEYS "Enable old cygwin.com keys"
+    IDS_HELPTEXT_ONLY_SITE "Do not download mirror list.  Only use sites specified with -s."
+    IDS_HELPTEXT_PACKAGES "Specify packages to install"
+    IDS_HELPTEXT_PACKAGE_MANAGER "Semi-attended chooser-only mode"
+    IDS_HELPTEXT_PROXY "HTTP/FTP proxy (host:port)"
+    IDS_HELPTEXT_PRUNE_INSTALL "Prune the installation to only the requested packages"
+    IDS_HELPTEXT_PUBKEY "URL or absolute path of extra public key file (RFC4880 format)"
+    IDS_HELPTEXT_QUIET_MODE "Unattended setup mode"
+    IDS_HELPTEXT_REMOVE_CATEGORIES "Specify categories to uninstall"
+    IDS_HELPTEXT_REMOVE_PACKAGES "Specify packages to uninstall"
+    IDS_HELPTEXT_ROOT "Root installation directory"
+    IDS_HELPTEXT_SEXPR_PUBKEY "Extra DSA public key in s-expr format"
+    IDS_HELPTEXT_SITE "Download site URL"
+    IDS_HELPTEXT_SYMLINK_TYPE "Symlink type (lnk, native, sys, wsl)"
+    IDS_HELPTEXT_UNTRUSTED_KEYS "Use untrusted saved extra keys"
+    IDS_HELPTEXT_UPGRADE_ALSO "Also upgrade installed packages"
+    IDS_HELPTEXT_USER_AGENT "User agent string for HTTP requests"
+    IDS_HELPTEXT_VERBOSE "Verbose output"
+    IDS_HELPTEXT_VERSION "Show version"
+    IDS_HELPTEXT_WAIT "When elevating, wait for elevated child process"
+END
diff --git a/res/fr/res.rc b/res/fr/res.rc
index 666d3d4d..3468e45e 100644
--- a/res/fr/res.rc
+++ b/res/fr/res.rc
@@ -101,7 +101,7 @@ BEGIN
                     BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,13,89,130,8
     CONTROL         "Juste &Moi",IDC_ROOT_USER,"Button",BS_AUTORADIOBUTTON |
                     WS_TABSTOP,13,130,130,8
-    LTEXT           "Cygwin sera disponible pour tous les utilisateurs",
+    LTEXT           "Cygwin sera disponible pour tous les utilisateurs.",
                     IDC_ALLUSERS_TEXT,25,101,300,28
     LTEXT           "Cygwin sera disponible pour tous les utilisateurs "
                     "mais les icônes et les menus uniquement pour l'utilisateur "
@@ -323,9 +323,9 @@ BEGIN
     CONTROL         "&Cacher les paquets obsolètes", IDC_CHOOSE_HIDE,
                     "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 167, 160, 14
     ICON            IDI_CYGWIN, IDC_HEADICON, SETUP_HEADICON_X, 0, 21, 20
-    LTEXT           "Sélectionnez les paquets à télécharger",
+    LTEXT           "Sélectionnez les paquets à télécharger.",
                     IDC_CHOOSE_INST_TEXT_DOWNLOAD, 21, 9, 239, 16, NOT WS_GROUP
-    LTEXT           "Sélectionnez les paquets à installer",
+    LTEXT           "Sélectionnez les paquets à installer.",
                     IDC_CHOOSE_INST_TEXT_INSTALL, 21, 9, 239, 16, NOT WS_GROUP
     LTEXT           "Sélection des paquets",IDC_STATIC_HEADER_TITLE,7,0,258,8,
                     NOT WS_GROUP
@@ -343,7 +343,7 @@ BEGIN
     LTEXT           "Résolution des dépendances",IDC_STATIC_HEADER_TITLE,
                     7,0,258,8,NOT WS_GROUP
     LTEXT           "Les problèmes suivants apparaissent lors de la résolution "
-                    "des dépendances",IDC_STATIC,21,9,239,16,NOT WS_GROUP
+                    "des dépendances.",IDC_STATIC,21,9,239,16,NOT WS_GROUP
     CONTROL         "&Accepter la solution par défaut"
                     ,IDC_PREREQ_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
                     7,167,225,14
@@ -445,7 +445,7 @@ BEGIN
     ICON            IDI_WARNING,IDC_HEADICON,10,10
     LTEXT           "Impossible d'extraire",
                     IDC_FILE_INUSE_MSG,33,10,234,8,SS_PATHELLIPSIS
-    LTEXT           "Ce fichier est en cours d'utilisation par : ",
+    LTEXT           "Ce fichier est en cours d'utilisation par :",
                     IDC_STATIC,33,28,234,8
     EDITTEXT        IDC_FILE_INUSE_EDIT,33,40,234,32,WS_VSCROLL |
                     ES_LEFT | ES_MULTILINE | ES_READONLY |
@@ -486,7 +486,7 @@ BEGIN
     IDS_ROOT_ABSOLUTE       "Le dossier d'installation doit être absolu, avec à la fois un identificateur de lecteur et une barre oblique au début : C:\\Cygwin"
     IDS_DOWNLOAD_COMPLETE   "Téléchargement terminé"
     IDS_NOLOGFILE           "Impossible d'ouvrir le fichier de trace %s en écriture"
-    IDS_UNINSTALL_COMPLETE  "Désinstallation terminée"
+    IDS_UNINSTALL_COMPLETE  "Désinstallation terminée."
     IDS_ERR_CHDIR           "Impossible de changer le dossier vers %s : %s [%.8x]"
     IDS_OLD_SETUP_VERSION   "Cet assistant est en version %s, mais setup.ini indique que la version %s est disponible.\nVous devriez le mettre à jour pour avoir les dernière fonctionnalités et corrections de bogues."
     IDS_DOWNLOAD_INCOMPLETE "Téléchargement incomplet. Recommencer ?"
@@ -497,7 +497,7 @@ BEGIN
     IDS_QUERY_CORRUPT       "Le fichier %s est corrompu. Effacer et re-télécharger ?"
     IDS_SKIP_PACKAGE	    "%s\nVoulez-vous passer ce paquet ?"
     IDS_UNCAUGHT_EXCEPTION  "Erreur Fatale : exception non traitée\nThread : %s\nType : %s\nMessage : %s"
-    IDS_UNCAUGHT_EXCEPTION_WITH_ERRNO  "Erreur Fatale : exception non traitée\nThread : %s\nType : %s\nMessage: %s\nAppErrNo : %d"
+    IDS_UNCAUGHT_EXCEPTION_WITH_ERRNO  "Erreur Fatale : exception non traitée\nThread : %s\nType : %s\nMessage : %s\nAppErrNo : %d"
     IDS_TRUSTKEEP_TOOLTIP   "Garde tous les paquets à la version installée. "
        "Ceci est équivalent à demander à l'assistant de ne faire aucun "
 	   "changement aux paquets."
@@ -573,7 +573,7 @@ BEGIN
     IDS_COLUMN_SIZE "Taille"
     IDS_COLUMN_DESCR "Description"
     IDS_MBOX_CAPTION "Assistant Cygwin"
-    IDS_EXTRACTION_FAILED "Impossible d'extraire /%s -- paquet corrompu ?\r\n"
+    IDS_EXTRACTION_FAILED "Impossible d'extraire /%s -- paquet corrompu ?"
     IDS_EXTRACTION_INUSE
         "Incapable d'extraire /%s -- erreur à l'écriture du fichier\r\n"
         "Le fichier est utilisé ou une autre erreur est survenue.\r\n"
@@ -592,7 +592,7 @@ BEGIN
     IDS_DEPRECATED_WINDOWS_VERSION "Cygwin n'est plus supporté pour cette version de Windows, et sera enlevé dans la prochaine version majeure"
     IDS_DEPRECATED_WINDOWS_ARCH "Cygwin n'est plus supporté pour Windows 32-bits, et sera enlevé dans la prochaine version majeure"
     IDS_MOUNT_REGISTRY_KEY_FAILED "Impossible de créer la clé de registre pour enregistrer le chemin d'installation"
-    IDS_NIO_ERROR "Erreur Internet: %s"
+    IDS_NIO_ERROR "Erreur Internet : %s"
     IDS_PREREQ_UNSOLVED_PROBLEMS
         "ATTENTION - Problèmes non résolus"
         "\r\n\r\n"
@@ -630,3 +630,59 @@ BEGIN
     IDS_FILE_INUSE_KILL "&Tuer les processus"
     IDS_FILE_INUSE_MSG "Incapable d'extraire"
 END
+
+//
+// Option Helptext String Table
+//
+
+STRINGTABLE
+BEGIN
+    IDS_HELPTEXT_ERROR "Erreur pendant l'analyse des options."
+    IDS_HELPTEXT_HEADER "Options de la ligne de commandes :"
+    IDS_HELPTEXT_FOOTER "Par défault téléchargement et installation des paquets, sauf si --download ou --local-install sont spécifiés."
+    IDS_HELPTEXT_ALLOW_TEST "Prendre en compte les paquets marqués test"
+    IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS "Autoriser les vieilles versions de Windows"
+    IDS_HELPTEXT_ARCH "Architecture à installer (x86_64 ou x86)"
+    IDS_HELPTEXT_CATEGORIES "Spécifie les catégories à installer"
+    // IDS_HELPTEXT_COMPACTOS "XXX: missing translation"
+    IDS_HELPTEXT_DELETE_ORPHANS "Supprimer les paquets orphelins"
+    IDS_HELPTEXT_DISABLE_ANTIVIRUS "Inhibe les anti-virus buggés à l'exécution"
+    IDS_HELPTEXT_DOWNLOAD "Télécharger depuis internet"
+    IDS_HELPTEXT_FORCE_CURRENT "Choisir la version courante pour tous les paquets"
+    IDS_HELPTEXT_HELP "Afficher l'aide"
+    IDS_HELPTEXT_INCLUDE_SOURCE "Ajouter automatiquement les sources de chaque paquet installé"
+    IDS_HELPTEXT_INI_BASENAME "Utiliser un nom de base différent, p.ex. «toto», au lieu de «setup»"
+    IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS "Utiliser les clés non-fiables et les garder"
+    IDS_HELPTEXT_LANG "Choisir la langue de l'IHM"
+    IDS_HELPTEXT_LOCAL_INSTALL "Installer depuis un répertoire local"
+    IDS_HELPTEXT_LOCAL_PACKAGE_DIR "Dossier local pour les paquets"
+    IDS_HELPTEXT_MIRROR_MODE "Ne pas vérifier la présence d'un paquet depuis un dossier local (celui-ci doit être un miroir propre !)"
+    IDS_HELPTEXT_NO_ADMIN "Ne pas vérifier et forcer à installer en tant qu'administrateur"
+    IDS_HELPTEXT_NO_DESKTOP "Pas de création de raccourci de bureau"
+    IDS_HELPTEXT_NO_REPLACEONREBOOT "Inhibe le remplacement des fichiers en cours d'utilisation au prochain redémarrage"
+    IDS_HELPTEXT_NO_SHORTCUTS "Pas de création de raccourcis de bureau et de menu"
+    IDS_HELPTEXT_NO_STARTMENU "Pas de création de raccourci de menu"
+    IDS_HELPTEXT_NO_VERIFY "Ne pas vérifier les signatures de setup.ini"
+    IDS_HELPTEXT_NO_VERSION_CHECK "Ne pas vérifier si une version plus récente de l'assistant est disponible"
+    IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS "Ne pas avertir pour les vieilles versions de Windows"
+    IDS_HELPTEXT_OLD_KEYS "Utiliser les anciennes clés de cygwin.com"
+    IDS_HELPTEXT_ONLY_SITE "Ignorer tous les sites sauf ceux spécifiés par -s"
+    IDS_HELPTEXT_PACKAGES "Spécifie les paquets à installer"
+    IDS_HELPTEXT_PACKAGE_MANAGER "Mode assistant sélection seulement"
+    IDS_HELPTEXT_PROXY "Proxy HTTP/FTP (serveur:port)"
+    IDS_HELPTEXT_PRUNE_INSTALL "Purger l'installation pour n'avoir que les paquets demandés"
+    IDS_HELPTEXT_PUBKEY "URL ou chemin complet d'une clé publique supplémentaire (format RFC4880)"
+    IDS_HELPTEXT_QUIET_MODE "Assistant sans messages"
+    IDS_HELPTEXT_REMOVE_CATEGORIES "Spécifie les catégories à désinstaller"
+    IDS_HELPTEXT_REMOVE_PACKAGES "Spécifie les paquets à désinstaller"
+    IDS_HELPTEXT_ROOT "Dossier racine de l'installation"
+    IDS_HELPTEXT_SEXPR_PUBKEY "Clé publique DSA supplémentaire au format s-expr"
+    IDS_HELPTEXT_SITE "URL du site de téléchargement"
+    IDS_HELPTEXT_SYMLINK_TYPE "Type de lien symbolique (lnk, native, sys, wsl)"
+    IDS_HELPTEXT_UNTRUSTED_KEYS "Utiliser les clés non-fiables enregistrées"
+    IDS_HELPTEXT_UPGRADE_ALSO "Mettre à jour les paquets installés"
+    IDS_HELPTEXT_USER_AGENT "« User agent » pour les requêtes HTTP"
+    IDS_HELPTEXT_VERBOSE "Affichages verbeux"
+    IDS_HELPTEXT_VERSION "Montrer la version"
+    IDS_HELPTEXT_WAIT "Attendre le process fils en mode élévation"
+END
diff --git a/resource.h b/resource.h
index 6dfedccf..e8ed0fa9 100644
--- a/resource.h
+++ b/resource.h
@@ -106,6 +106,55 @@
 #define IDS_DEPRECATED_WINDOWS_VERSION   1209
 #define IDS_DEPRECATED_WINDOWS_ARCH      1210
 
+#define IDS_HELPTEXT_COMPACTOS           1500
+#define IDS_HELPTEXT_PUBKEY              1501
+#define IDS_HELPTEXT_SEXPR_PUBKEY        1502
+#define IDS_HELPTEXT_UNTRUSTED_KEYS      1503
+#define IDS_HELPTEXT_KEEP_UNTRUSTED_KEYS 1504
+#define IDS_HELPTEXT_OLD_KEYS            1505
+#define IDS_HELPTEXT_DISABLE_ANTIVIRUS   1506
+#define IDS_HELPTEXT_UPGRADE_ALSO        1507
+#define IDS_HELPTEXT_DELETE_ORPHANS      1508
+#define IDS_HELPTEXT_FORCE_CURRENT       1509
+#define IDS_HELPTEXT_PRUNE_INSTALL       1510
+#define IDS_HELPTEXT_ALLOW_TEST          1511
+#define IDS_HELPTEXT_NO_SHORTCUTS        1512
+#define IDS_HELPTEXT_NO_STARTMENU        1513
+#define IDS_HELPTEXT_NO_DESKTOP          1514
+#define IDS_HELPTEXT_NO_VERIFY           1515
+#define IDS_HELPTEXT_NO_VERSION_CHECK    1516
+#define IDS_HELPTEXT_NO_REPLACEONREBOOT  1517
+#define IDS_HELPTEXT_VERBOSE             1518
+#define IDS_HELPTEXT_LOCAL_PACKAGE_DIR   1519
+#define IDS_HELPTEXT_ARCH                1520
+#define IDS_HELPTEXT_QUIET_MODE          1521
+#define IDS_HELPTEXT_PACKAGE_MANAGER     1522
+#define IDS_HELPTEXT_NO_ADMIN            1523
+#define IDS_HELPTEXT_WAIT                1524
+#define IDS_HELPTEXT_HELP                1525
+#define IDS_HELPTEXT_VERSION             1526
+#define IDS_HELPTEXT_INI_BASENAME        1527
+#define IDS_HELPTEXT_ALLOW_UNSUPPORTED_WINDOWS 1528
+#define IDS_HELPTEXT_NO_WARN_DEPRECATED_WINDOWS 1529
+#define IDS_HELPTEXT_SYMLINK_TYPE        1530
+#define IDS_HELPTEXT_LANG                1531
+#define IDS_HELPTEXT_USER_AGENT          1532
+#define IDS_HELPTEXT_PROXY               1533
+#define IDS_HELPTEXT_MIRROR_MODE         1534
+#define IDS_HELPTEXT_REMOVE_PACKAGES     1535
+#define IDS_HELPTEXT_REMOVE_CATEGORIES   1536
+#define IDS_HELPTEXT_PACKAGES            1537
+#define IDS_HELPTEXT_CATEGORIES          1538
+#define IDS_HELPTEXT_INCLUDE_SOURCE      1539
+#define IDS_HELPTEXT_SITE                1540
+#define IDS_HELPTEXT_ONLY_SITE           1541
+#define IDS_HELPTEXT_DOWNLOAD            1542
+#define IDS_HELPTEXT_LOCAL_INSTALL       1543
+#define IDS_HELPTEXT_ROOT                1544
+#define IDS_HELPTEXT_ERROR               1545
+#define IDS_HELPTEXT_HEADER              1546
+#define IDS_HELPTEXT_FOOTER              1547
+
 // Dialogs
 
 #define IDD_SPLASH                        200
diff --git a/root.cc b/root.cc
index ddff3f0f..1723a532 100644
--- a/root.cc
+++ b/root.cc
@@ -38,7 +38,7 @@
 
 #include "getopt++/StringOption.h"
 
-StringOption RootOption ("", 'R', "root", "Root installation directory", false);
+StringOption RootOption ("", 'R', "root", IDS_HELPTEXT_ROOT, false);
 
 static ControlAdjuster::ControlInfo RootControlsInfo[] = {
   { IDC_ROOTDIR_GRP,              CP_STRETCH,           CP_TOP      },
diff --git a/site.cc b/site.cc
index 57f54dde..33c06f01 100644
--- a/site.cc
+++ b/site.cc
@@ -91,9 +91,8 @@ SiteList cached_site_list;
 /* Stale selected sites to warn about and add to cache */
 SiteList dropped_site_list;
 
-StringArrayOption SiteOption('s', "site", "Download site URL");
-
-BoolOption OnlySiteOption(false, 'O', "only-site", "Do not download mirror list.  Only use sites specified with -s.");
+StringArrayOption SiteOption('s', "site", IDS_HELPTEXT_SITE);
+BoolOption OnlySiteOption(false, 'O', "only-site", IDS_HELPTEXT_ONLY_SITE);
 extern BoolOption UnsupportedOption;
 
 SiteSetting::SiteSetting (): saved (false)
diff --git a/source.cc b/source.cc
index 066da8de..63da0241 100644
--- a/source.cc
+++ b/source.cc
@@ -33,8 +33,8 @@
 
 #include "getopt++/BoolOption.h"
 
-static BoolOption DownloadOption (false, 'D', "download", "Download packages from internet");
-static BoolOption LocalOption (false, 'L', "local-install", "Install packages from local directory");
+static BoolOption DownloadOption (false, 'D', "download", IDS_HELPTEXT_DOWNLOAD);
+static BoolOption LocalOption (false, 'L', "local-install", IDS_HELPTEXT_LOCAL_INSTALL);
 
 static int rb[] =
   { IDC_SOURCE_NETINST, IDC_SOURCE_DOWNLOAD, IDC_SOURCE_LOCALDIR, 0 };
diff --git a/win32.cc b/win32.cc
index a403d662..55072a90 100644
--- a/win32.cc
+++ b/win32.cc
@@ -20,6 +20,7 @@
 #include "resource.h"
 #include "ini.h"
 #include <sys/stat.h>
+#include "String++.h"
 
 NTSecurity nt_sec;
 
@@ -507,6 +508,12 @@ LoadStringW(unsigned int uID)
   return LoadStringWEx(uID, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
 }
 
+const std::string
+LoadStringUtf8(unsigned int uID)
+{
+  return wstring_to_string(LoadStringW(uID));
+}
+
 bool
 is_developer_mode(void)
 {
diff --git a/win32.h b/win32.h
index dcaa2511..02c1d06e 100644
--- a/win32.h
+++ b/win32.h
@@ -194,6 +194,7 @@ SetDlgItemRect (HWND h, int item, LPRECT r)
 	      r->right - r->left, r->bottom - r->top, TRUE);
 }
 
+const std::string LoadStringUtf8(unsigned int uID);
 const std::wstring LoadStringW(unsigned int uID);
 const std::wstring LoadStringWEx(UINT uID, UINT langId);
 



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-17 12:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-17 12:47 [setup - the official Cygwin setup program] branch master, updated. release_2.918-18-g212135ac Jon TURNEY

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).