Set locale initially.
[crypto-install.git] / crypto-install
index 9a98129..6fb3a7c 100755 (executable)
@@ -2,8 +2,8 @@
 # -*- mode: python; coding: utf-8; -*-
 
 
-import argparse, errno, gettext, itertools, os, re, readline, subprocess, \
-    sys, tempfile, textwrap, threading
+import argparse, errno, gettext, itertools, locale, os, re, readline, \
+    subprocess, sys, tempfile, textwrap, threading
 
 
 if sys.version_info[0] == 2:
@@ -18,8 +18,8 @@ if sys.version_info[0] == 2:
         return raw_input (prompt)
 
 
-    def gettext_install ():
-        gettext.install ("crypto-install", unicode = True)
+    def gettext_install (*args, **kwargs):
+        gettext.install (*args, unicode = True, **kwargs)
 elif sys.version_info[0] > 2:
     from tkinter import *
     from tkinter.messagebox import *
@@ -32,8 +32,7 @@ elif sys.version_info[0] > 2:
         return input (prompt)
 
 
-    def gettext_install ():
-        gettext.install ("crypto-install")
+    gettext_install = gettext.install
 else:
     raise Exception ("Unsupported Python version {}".format (sys.version_info))
 
@@ -70,7 +69,7 @@ def parse_arguments ():
         "-v", "--version",
         dest = "version",
         action = "version",
-        version = "crypto-install.py version GIT-TAG (GIT-COMMIT/GIT-BRANCH)",
+        version = "crypto-install version GIT-TAG (GIT-COMMIT/GIT-BRANCH)",
         help = _ ("Display version."))
     parser.add_argument (
         "--no-gui",
@@ -84,12 +83,12 @@ def parse_arguments ():
         "--no-gpg",
         dest = "gnupg",
         action = "store_false",
-        help = "Disable GnuPG setup.")
+        help = _ ("Disable GnuPG setup."))
     gnupg_group.add_argument (
         "--gpg-home",
         dest = "gnupg_home",
         default = os.getenv("GNUPGHOME") or "~/.gnupg",
-        metavar = "PATH",
+        metavar = _ ("PATH"),
         help = _ ("Default directory for GnuPG files."))
     openssh_group = parser.add_argument_group (
         _ ("OpenSSH"),
@@ -103,7 +102,7 @@ def parse_arguments ():
         "--ssh-home",
         dest = "openssh_home",
         default = "~/.ssh",
-        metavar = "PATH",
+        metavar = _ ("PATH"),
         help = _ ("Default directory for OpenSSH files."))
     return parser.parse_args ()
 
@@ -426,76 +425,86 @@ class CryptoInstall (Tk):
         self.info_frame = Frame (self)
         self.info_frame.pack (fill = X)
 
-        self.user_label = Label (self.info_frame, text = ("Username"))
+        msg = dedented (_ ("""
+        Username on the local machine (e.g. 'user')
+        """))
+        self.user_label = Label (self.info_frame, text = _ ("Username"))
+        self.balloon.bind_widget (self.user_label, msg = msg)
         self.user_label.grid ()
 
         self.user_var = StringVar (self, default_username ())
         self.user_var.trace ("w", self.update_widgets)
 
         self.user = Entry (self.info_frame, textvariable = self.user_var)
-        self.balloon.bind_widget (self.user, msg = dedented (_ ("""
-        Username on the local machine (e.g. 'user')
-        """)))
+        self.balloon.bind_widget (self.user, msg = msg)
         self.user.grid (row = 0, column = 1)
 
         self.fields["user"] = [self.user_var, valid_user,
                                self.user, self.user_label]
 
+        msg = dedented (_ ("""
+        Host name of the local machine (e.g. 'mycomputer')
+        """))
         self.host_label = Label (self.info_frame, text = _ ("Host Name"))
+        self.balloon.bind_widget (self.host_label, msg = msg)
         self.host_label.grid ()
 
         self.host_var = StringVar (self, default_hostname ())
         self.host_var.trace ("w", self.update_widgets)
 
         self.host = Entry (self.info_frame, textvariable = self.host_var)
-        self.balloon.bind_widget (self.host, msg = dedented (_ ("""
-        Host name of the local machine (e.g. 'mycomputer')
-        """)))
+        self.balloon.bind_widget (self.host, msg = msg)
         self.host.grid (row = 1, column = 1)
 
         self.fields["host"] = [self.host_var, valid_host,
                                self.host, self.host_label]
 
+        msg = dedented (_ ("""
+        Full name as it should appear in the key description (e.g. 'John Doe')
+        """))
         self.name_label = Label (self.info_frame, text = _ ("Full Name"))
+        self.balloon.bind_widget (self.name_label, msg = msg)
         self.name_label.grid ()
 
         self.name_var = StringVar (self, default_name ())
         self.name_var.trace ("w", self.update_widgets)
 
         self.name = Entry (self.info_frame, textvariable = self.name_var)
-        self.balloon.bind_widget (self.name, msg = dedented (_ ("""
-        Full name as it should appear in the key description (e.g. 'John Doe')
-        """)))
+        self.balloon.bind_widget (self.name, msg = msg)
         self.name.grid (row = 2, column = 1)
 
         self.fields["name"] = [self.name_var, valid_name,
                                self.name, self.name_label]
 
+        msg = dedented (_ ("""
+        Email address associated with the name (e.g. '<test@example.com>')
+        """))
         self.email_label = Label (self.info_frame, text = _ ("Email address"))
+        self.balloon.bind_widget (self.email_label, msg = msg)
         self.email_label.grid ()
 
         self.email_var = StringVar (self, default_email ())
         self.email_var.trace ("w", self.update_widgets)
 
         self.email = Entry (self.info_frame, textvariable = self.email_var)
-        self.balloon.bind_widget (self.email, msg = dedented (_ ("""
-        Email address associated with the name (e.g. '<test@example.com>')
-        """)))
+        self.balloon.bind_widget (self.email, msg = msg)
         self.email.grid (row = 3, column = 1)
 
         self.fields["email"] = [self.email_var, valid_email,
                                 self.email, self.email_label]
 
+        msg = dedented (_ ("""
+        Comment phrase for the GnuPG key, if any (e.g. 'key for 2014')
+        """))
         self.comment_label = Label (self.info_frame, text = _ ("Comment phrase"))
+        self.balloon.bind_widget (self.comment_label, msg = msg)
         self.comment_label.grid ()
 
         self.comment_var = StringVar (self, default_comment ())
         self.comment_var.trace ("w", self.update_widgets)
 
         self.comment = Entry (self.info_frame, textvariable = self.comment_var)
-        self.balloon.bind_widget (self.comment, msg = dedented (_ ("""
-        Comment phrase for the GnuPG key, if any (e.g. 'key for 2014')
-        """)))
+        self.balloon.bind_widget (self.comment, msg = msg)
         self.comment.grid (row = 4, column = 1)
 
         self.fields["comment"] = [self.comment_var, valid_comment,
@@ -607,25 +616,20 @@ class CryptoInstall (Tk):
         self.balloon.bind_widget (self.openssh, msg = msg)
         self.balloon.bind_widget (self.openssh_label, msg = msg)
 
-    def generate_thread (self):
+    def generate_thread (self, gnupg, openssh, name, email, comment, user,
+                         host):
         stdout = sys.stdout
 
         try:
             sys.stdout = self.progress.redirect
 
-            # TODO: capture and show stdout and stderr
-            if self.gnupg_var.get ():
-                # TODO: make get calls thread-safe
-                gnupg_setup (self.arguments,
-                             self.name_var.get (),
-                             self.email_var.get (),
-                             self.comment_var.get ())
+            if gnupg:
+                gnupg_setup (self.arguments, name, email, comment)
                 # TODO: put update into queue
                 self.update_widgets ()
 
-            if self.openssh_var.get ():
-                comment = "{}@{}".format (self.user_var.get (),
-                                          self.host_var.get ())
+            if openssh:
+                comment = "{}@{}".format (user, host)
                 openssh_setup (self.arguments, comment)
                 # TODO: put update into queue
                 self.update_widgets ()
@@ -635,7 +639,8 @@ class CryptoInstall (Tk):
     def _on_idle ():
         try:
             while True:
-                self.progress.redirect.write (self.progress.queue.get (block = False))
+                message = self.progress.queue.get (block = False)
+                self.progress.redirect.write (message)
         except Empty:
             pass
 
@@ -644,12 +649,21 @@ class CryptoInstall (Tk):
 
         self.bind ("<<Idle>>", self._on_idle)
 
-        thread = threading.Thread (target = self.generate_thread)
+        thread = threading.Thread (target = self.generate_thread,
+                                   args = (self.gnupg_var.get (),
+                                           self.openssh_var.get (),
+                                           self.name_var.get (),
+                                           self.email_var.get (),
+                                           self.comment_var.get (),
+                                           self.user_var.get (),
+                                           self.host_var.get ()))
         thread.start ()
 
 
 def main ():
-    gettext_install ()
+    locale.setlocale (locale.LC_ALL, "")
+
+    gettext_install ("crypto-install", localedir = os.getenv ("TEXTDOMAINDIR"))
 
     arguments = parse_arguments ()