[pan2] Use Unicode in translatable strings



commit 44d7766a8ead0234aac4a085c77840925e3e6cf6
Author: Piotr Drąg <piotrdrag gmail com>
Date:   Sat Apr 29 00:48:22 2017 +0200

    Use Unicode in translatable strings
    
    See https://developer.gnome.org/hig/stable/typography.html
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781922

 pan/data-impl/data-impl.cc        |    2 +-
 pan/data-impl/data-io.cc          |    4 +-
 pan/data-impl/groups.cc           |    2 +-
 pan/data-impl/headers.cc          |    6 ++--
 pan/data-impl/profiles.cc         |    2 +-
 pan/data-impl/server.cc           |    2 +-
 pan/data-impl/xover.cc            |    2 +-
 pan/data/article-cache.cc         |   10 ++++----
 pan/data/cert-store.cc            |    2 +-
 pan/data/encode-cache.cc          |    2 +-
 pan/general/e-util.cc             |    8 +++---
 pan/general/file-util.cc          |    2 +-
 pan/general/text-match.cc         |    2 +-
 pan/general/utf8-utils.cc         |    2 +-
 pan/gui/actions.cc                |   42 ++++++++++++++++++------------------
 pan/gui/body-pane.cc              |    4 +-
 pan/gui/dl-headers-ui.cc          |    2 +-
 pan/gui/e-charset-combo-box.c     |    2 +-
 pan/gui/group-prefs-dialog.cc     |    2 +-
 pan/gui/gui.cc                    |   12 +++++-----
 pan/gui/pan.cc                    |    4 +-
 pan/gui/post-ui.cc                |   32 ++++++++++++++--------------
 pan/gui/prefs-ui.cc               |    4 +-
 pan/gui/prefs.cc                  |    2 +-
 pan/gui/profiles-dialog.cc        |   10 ++++----
 pan/gui/save-attach-ui.cc         |   24 ++++++++++----------
 pan/gui/save-ui.cc                |   24 ++++++++++----------
 pan/gui/score-add-ui.cc           |   12 +++++-----
 pan/gui/score-view-ui.cc          |    4 +-
 pan/gui/server-ui.cc              |   24 ++++++++++----------
 pan/gui/task-pane.cc              |   10 ++++----
 pan/tasks/decoder.cc              |    6 ++--
 pan/tasks/nntp-pool.cc            |    2 +-
 pan/tasks/nntp.cc                 |    4 +-
 pan/tasks/socket-impl-gio.cc      |    4 +-
 pan/tasks/socket-impl-openssl.cc  |    4 +-
 pan/tasks/task-article.cc         |    2 +-
 pan/tasks/task-groups.cc          |    2 +-
 pan/tasks/task-post.cc            |    6 ++--
 pan/tasks/task-upload.cc          |    4 +-
 pan/tasks/task-xover.cc           |    8 +++---
 pan/tasks/task-xoverinfo.cc       |    2 +-
 pan/usenet-utils/filter-info.cc   |   42 ++++++++++++++++++------------------
 pan/usenet-utils/gnksa.cc         |    2 +-
 pan/usenet-utils/message-check.cc |   20 ++++++++--------
 pan/usenet-utils/scorefile.cc     |    4 +-
 pan/usenet-utils/ssl-utils.h      |    6 ++--
 47 files changed, 190 insertions(+), 190 deletions(-)
---
diff --git a/pan/data-impl/data-impl.cc b/pan/data-impl/data-impl.cc
index 74748ea..0b660df 100644
--- a/pan/data-impl/data-impl.cc
+++ b/pan/data-impl/data-impl.cc
@@ -195,7 +195,7 @@ DataImpl :: password_encrypt (const PasswordData& pw)
     gnome_keyring_store_password_sync (
       GNOME_KEYRING_NETWORK_PASSWORD,
       GNOME_KEYRING_DEFAULT,
-      _("Pan Newsreader's server passwords"),
+      _("Pan Newsreader’s server passwords"),
       pw.pw,
       "user", pw.user.str,
       "server", pw.server.c_str(),
diff --git a/pan/data-impl/data-io.cc b/pan/data-impl/data-io.cc
index 7267811..dd51f04 100644
--- a/pan/data-impl/data-io.cc
+++ b/pan/data-impl/data-io.cc
@@ -196,7 +196,7 @@ namespace
       tmp.c_str(), std::ios_base::out|std::ios_base::binary));
 
     if (!o->good())
-      Log::add_err_va (_("Unable to save \"%s\" %s"), filename.c_str(), "");
+      Log::add_err_va (_("Unable to save “%s” %s"), filename.c_str(), "");
     ostream_to_filename[o] = filename;
     return o;
   }
@@ -228,7 +228,7 @@ namespace
       }
 //      std::cerr<<"dbg "<<ret<<"\n";
     } else {
-      Log::add_err_va (_("Unable to save \"%s\" %s"), filename.c_str(), file::pan_strerror(my_errno));
+      Log::add_err_va (_("Unable to save “%s” %s"), filename.c_str(), file::pan_strerror(my_errno));
     }
   }
 }
diff --git a/pan/data-impl/groups.cc b/pan/data-impl/groups.cc
index 38df007..f50934b 100644
--- a/pan/data-impl/groups.cc
+++ b/pan/data-impl/groups.cc
@@ -99,7 +99,7 @@ DataImpl :: load_newsrc (const Quark       & server,
 {
   Server * s = find_server (server);
   if (!s) {
-    Log::add_err_va (_("Skipping newsrc file for server \"%s\""), server.c_str());
+    Log::add_err_va (_("Skipping newsrc file for server “%s”"), server.c_str());
     return;
   }
 
diff --git a/pan/data-impl/headers.cc b/pan/data-impl/headers.cc
index 7d88111..9303071 100644
--- a/pan/data-impl/headers.cc
+++ b/pan/data-impl/headers.cc
@@ -603,7 +603,7 @@ DataImpl :: load_headers (const DataIO   & data_io,
       }
 
       if (expire_count)
-        Log::add_info_va (_("Expired %lu old articles from \"%s\""), expire_count, group.c_str());
+        Log::add_info_va (_("Expired %lu old articles from “%s”"), expire_count, group.c_str());
 
       success = !in->fail();
     }
@@ -625,7 +625,7 @@ DataImpl :: load_headers (const DataIO   & data_io,
   if (success) {
     const double seconds = timer.get_seconds_elapsed ();
     Log::add_info_va (
-      _("Loaded %lu articles for \"%s\" in %.1f seconds (%.0f per second)"),
+      _("Loaded %lu articles for “%s” in %.1f seconds (%.0f per second)"),
       article_count, group.c_str(), seconds,
       article_count/(fabs(seconds)<0.001?0.001:seconds));
   }
@@ -854,7 +854,7 @@ DataImpl :: save_headers (DataIO& data_io, const Quark& group) const
    const double time_elapsed (timer.get_seconds_elapsed());
    if (success)
       Log::add_info_va (
-   _("Saved %lu parts, %lu articles in \"%s\" in %.1f seconds (%.0f articles/sec)"),
+   _("Saved %lu parts, %lu articles in “%s” in %.1f seconds (%.0f articles/sec)"),
          part_count,
          article_count,
          group.c_str(),
diff --git a/pan/data-impl/profiles.cc b/pan/data-impl/profiles.cc
index d92efdb..903ac03 100644
--- a/pan/data-impl/profiles.cc
+++ b/pan/data-impl/profiles.cc
@@ -171,7 +171,7 @@ ProfilesImpl :: load (const StringView& filename)
     GMarkupParseContext* c (g_markup_parse_context_new (&p, (GMarkupParseFlags)0, &mc, 0));
     g_markup_parse_context_parse (c, txt.c_str(), txt.size(), &gerr);
     if (gerr) {
-      Log::add_err_va (_("Error reading file \"%s\": %s"), filename.to_string().c_str(), gerr->message);
+      Log::add_err_va (_("Error reading file “%s”: %s"), filename.to_string().c_str(), gerr->message);
       g_clear_error (&gerr);
     }
     g_markup_parse_context_free (c);
diff --git a/pan/data-impl/server.cc b/pan/data-impl/server.cc
index 9dcc261..4454c53 100644
--- a/pan/data-impl/server.cc
+++ b/pan/data-impl/server.cc
@@ -524,7 +524,7 @@ DataImpl :: load_server_properties (const DataIO& source)
   if (!txt.empty())
     g_markup_parse_context_parse (c, txt.c_str(), txt.size(), &gerr);
   if (gerr) {
-    Log::add_err_va (_("Error reading file \"%s\": %s"), filename.c_str(), gerr->message);
+    Log::add_err_va (_("Error reading file “%s”: %s"), filename.c_str(), gerr->message);
     g_clear_error (&gerr);
   }
   g_markup_parse_context_free (c);
diff --git a/pan/data-impl/xover.cc b/pan/data-impl/xover.cc
index 5ab992e..cde925e 100644
--- a/pan/data-impl/xover.cc
+++ b/pan/data-impl/xover.cc
@@ -240,7 +240,7 @@ DataImpl :: xover_add (const Quark         & server,
 
   GroupHeaders * h (get_group_headers (group));
   if (!h && !is_virtual) {
-    Log::add_err_va (_("Error reading from %s: unknown group \"%s\""),
+    Log::add_err_va (_("Error reading from %s: unknown group “%s”"),
                      get_server_address(server).c_str(),
                      group.c_str());
     return 0;
diff --git a/pan/data/article-cache.cc b/pan/data/article-cache.cc
index 0ac3d57..98ceb76 100644
--- a/pan/data/article-cache.cc
+++ b/pan/data/article-cache.cc
@@ -141,7 +141,7 @@ ArticleCache :: ArticleCache (const StringView& path, const StringView& extensio
    GDir * dir = g_dir_open (_path.c_str(), 0, &err);
    if (err != NULL)
    {
-      Log::add_err_va (_("Error opening directory: \"%s\": %s"), _path.c_str(), err->message);
+      Log::add_err_va (_("Error opening directory: “%s”: %s"), _path.c_str(), err->message);
       g_clear_error (&err);
    }
    else
@@ -232,7 +232,7 @@ ArticleCache :: add (const Quark& message_id, const StringView& article, const b
 
   if (!fp)
   {
-      Log::add_err_va (_("Unable to save \"%s\" %s"),
+      Log::add_err_va (_("Unable to save “%s” %s"),
                        filename, file::pan_strerror(errno));
       res.type = CACHE_IO_ERR;
   }
@@ -241,7 +241,7 @@ ArticleCache :: add (const Quark& message_id, const StringView& article, const b
     const size_t bytes_written (fwrite (article.str, sizeof(char), article.len, fp));
     if (bytes_written < article.len)
     {
-      Log::add_err_va (_("Unable to save \"%s\" %s"),
+      Log::add_err_va (_("Unable to save “%s” %s"),
                        filename, file::pan_strerror(errno));
       if (errno ==  ENOSPC || errno == ENOMEM)
       {
@@ -359,7 +359,7 @@ ArticleCache :: get_message_file_stream (const Quark& mid) const
       errno = 0;
       FILE * fp = fopen (filename, "rb");
       if (!fp)
-         Log::add_err_va (_("Error opening file \"%s\" %s"), filename, file::pan_strerror(errno));
+         Log::add_err_va (_("Error opening file “%s” %s"), filename, file::pan_strerror(errno));
       else {
          GMimeStream * file_stream = g_mime_stream_file_new (fp);
          retval = g_mime_stream_buffer_new (file_stream, GMIME_STREAM_BUFFER_BLOCK_READ);
@@ -390,7 +390,7 @@ ArticleCache :: get_message_mem_stream (const Quark& mid) const
          retval = g_mime_stream_mem_new_with_buffer (buf, len);
          g_free (buf);
       } else {
-         Log::add_err_va (_("Error reading file \"%s\": %s"), filename, err->message);
+         Log::add_err_va (_("Error reading file “%s”: %s"), filename, err->message);
          g_clear_error (&err);
       }
    }
diff --git a/pan/data/cert-store.cc b/pan/data/cert-store.cc
index 08192ec..1f08708 100644
--- a/pan/data/cert-store.cc
+++ b/pan/data/cert-store.cc
@@ -260,7 +260,7 @@ int CertStore::get_all_certs_from_disk() {
        GDir * dir = g_dir_open(ssldir, 0, &err);
        if (err != NULL) {
                Log::add_err_va(
-                               _("Error opening SSL certificate directory: \"%s\": %s"),
+                               _("Error opening SSL certificate directory: “%s”: %s"),
                                ssldir, err->message);
                g_error_free(err);
        } else {
diff --git a/pan/data/encode-cache.cc b/pan/data/encode-cache.cc
index 2d1de90..9ea1fa6 100644
--- a/pan/data/encode-cache.cc
+++ b/pan/data/encode-cache.cc
@@ -59,7 +59,7 @@ EncodeCache :: EncodeCache (const StringView& path, size_t max_megs):
    GDir * dir = g_dir_open (_path.c_str(), 0, &err);
    if (err != NULL)
    {
-      Log::add_err_va (_("Error opening directory: \"%s\": %s"), _path.c_str(), err->message);
+      Log::add_err_va (_("Error opening directory: “%s”: %s"), _path.c_str(), err->message);
       g_clear_error (&err);
    }
    else
diff --git a/pan/general/e-util.cc b/pan/general/e-util.cc
index efb7932..af5ccd0 100644
--- a/pan/general/e-util.cc
+++ b/pan/general/e-util.cc
@@ -208,10 +208,10 @@ EvolutionDateMaker :: set_current_time (time_t now)
 EvolutionDateMaker :: EvolutionDateMaker (time_t now)
 {
   // build the locale strings
-  locale_recent = g_locale_from_utf8 (_("%l:%M %p"), -1, NULL, NULL, NULL);
-  locale_today = g_locale_from_utf8 (_("Today %l:%M %p"), -1, NULL, NULL, NULL);
-  locale_this_week = g_locale_from_utf8 (_("%a %l:%M %p"), -1, NULL, NULL, NULL);
-  locale_this_year = g_locale_from_utf8 (_("%b %d %l:%M %p"), -1, NULL, NULL, NULL);
+  locale_recent = g_locale_from_utf8 (_("%l∶%M %p"), -1, NULL, NULL, NULL);
+  locale_today = g_locale_from_utf8 (_("Today %l∶%M %p"), -1, NULL, NULL, NULL);
+  locale_this_week = g_locale_from_utf8 (_("%a %l∶%M %p"), -1, NULL, NULL, NULL);
+  locale_this_year = g_locale_from_utf8 (_("%b %d %l∶%M %p"), -1, NULL, NULL, NULL);
   locale_old = g_locale_from_utf8 (_("%b %d %Y"), -1, NULL, NULL, NULL);
 
   // set the current time
diff --git a/pan/general/file-util.cc b/pan/general/file-util.cc
index 473e426..a548acf 100644
--- a/pan/general/file-util.cc
+++ b/pan/general/file-util.cc
@@ -308,7 +308,7 @@ file :: get_text_file_contents (const StringView  & filename,
   const std::string fname (filename.str, filename.len);
   g_file_get_contents (fname.c_str(), &body, &body_len, &err);
   if (err) {
-    Log::add_err_va (_("Error reading file \"%s\": %s"), err->message, g_strerror(errno));
+    Log::add_err_va (_("Error reading file “%s”: %s"), err->message, g_strerror(errno));
     g_clear_error (&err);
     return false;
   }
diff --git a/pan/general/text-match.cc b/pan/general/text-match.cc
index 7c0bdb0..e5770e5 100644
--- a/pan/general/text-match.cc
+++ b/pan/general/text-match.cc
@@ -190,7 +190,7 @@ class pan::TextMatch::PcreInfo
           GError * err = 0;
           re = g_regex_new (pattern.c_str(), options, (GRegexMatchFlags)0, &err);
           if (err) {
-            Log::add_err_va (_("Can't use regular expression \"%s\": %s"), pattern.c_str(), err->message);
+            Log::add_err_va (_("Can’t use regular expression “%s”: %s"), pattern.c_str(), err->message);
             g_error_free (err);
             return false;
           }
diff --git a/pan/general/utf8-utils.cc b/pan/general/utf8-utils.cc
index 0c2fe18..f7f95a2 100644
--- a/pan/general/utf8-utils.cc
+++ b/pan/general/utf8-utils.cc
@@ -210,7 +210,7 @@ pan :: content_to_utf8 (const StringView  & content,
       ret.assign (content.str, content.len);
     if (!g_utf8_validate (ret.c_str(), ret.size(), NULL)) {
       ret = clean_utf8 (ret);
-      Log::add_err (_("Couldn't determine article encoding.  Non-UTF8 characters were removed."));
+      Log::add_err (_("Couldn’t determine article encoding.  Non-UTF8 characters were removed."));
     }
   }
 
diff --git a/pan/gui/actions.cc b/pan/gui/actions.cc
index 5b72341..50c97ec 100644
--- a/pan/gui/actions.cc
+++ b/pan/gui/actions.cc
@@ -330,8 +330,8 @@ namespace pan
         G_CALLBACK(do_mark_selected_groups_read) },
 
       { "delete-groups-articles", GTK_STOCK_DELETE,
-        N_("_Delete Selected Groups' Articles"), "<control><shift>Delete",
-        N_("Delete Selected Groups' Articles"),
+        N_("_Delete Selected Groups’ Articles"), "<control><shift>Delete",
+        N_("Delete Selected Groups’ Articles"),
         G_CALLBACK(do_clear_selected_groups) },
 
       { "get-new-headers-in-selected-groups", "ICON_GET_SELECTED",
@@ -350,8 +350,8 @@ namespace pan
         G_CALLBACK(do_xover_subscribed_groups) },
 
       { "download-headers", "ICON_GET_DIALOG",
-        N_("Get _Headers..."), "",
-        N_("Get Headers..."),
+        N_("Get _Headers…"), "",
+        N_("Get Headers…"),
         G_CALLBACK(do_download_headers) },
 
       { "refresh-group-list", NULL,
@@ -370,17 +370,17 @@ namespace pan
         G_CALLBACK(do_unsubscribe_selected_groups) },
 
       { "save-articles", GTK_STOCK_SAVE,
-        N_("_Save Articles..."), "<shift>S",
-        N_("Save Articles..."),
+        N_("_Save Articles…"), "<shift>S",
+        N_("Save Articles…"),
         G_CALLBACK(do_save_articles) },
 
       { "save-articles-from-nzb", GTK_STOCK_SAVE,
-        N_("Save Articles from Selected _NZB..."), "<control><shift>S",
+        N_("Save Articles from Selected _NZB…"), "<control><shift>S",
         N_("Save Articles from Selected NZB"),
         G_CALLBACK(do_save_articles_from_nzb) },
 
       { "save-articles-to-nzb", GTK_STOCK_SAVE,
-        N_("Save Articles to an NZB _File..."), "<control><shift>F",
+        N_("Save Articles to an NZB _File…"), "<control><shift>F",
         N_("Save Articles to an NZB File"),
         G_CALLBACK(do_save_articles_to_nzb) },
 
@@ -390,7 +390,7 @@ namespace pan
         G_CALLBACK(do_print) },
 
       { "import-tasks", GTK_STOCK_OPEN,
-        N_("_Import NZB Files..."), "<constrol>O",
+        N_("_Import NZB Files…"), "<constrol>O",
         NULL,
         G_CALLBACK(do_import_tasks) },
 
@@ -450,7 +450,7 @@ namespace pan
         G_CALLBACK(do_show_preferences_dialog) },
 
       { "show-group-preferences-dialog", GTK_STOCK_PREFERENCES,
-        N_("Edit Selected _Group's Preferences"), NULL,
+        N_("Edit Selected _Group’s Preferences"), NULL,
         NULL,
         G_CALLBACK(do_show_group_preferences_dialog) },
 
@@ -614,22 +614,22 @@ namespace pan
         G_CALLBACK(do_invert_selection) },
 
       { "view-article-score", "ICON_SCORE",
-        N_("Edit Article's Watch/Ignore/Score..."), "<control><shift>C",
+        N_("Edit Article’s Watch/Ignore/Score…"), "<control><shift>C",
         NULL,
         G_CALLBACK(do_show_score_dialog) },
 
       { "add-article-score", "ICON_SCORE",
-        N_("Add a _Scoring Rule..."), "S",
+        N_("Add a _Scoring Rule…"), "S",
         NULL,
         G_CALLBACK(do_show_new_score_dialog) },
 
       { "cancel-article", NULL,
-        N_("Cance_l Article..."), NULL,
+        N_("Cance_l Article…"), NULL,
         NULL,
         G_CALLBACK(do_cancel_article) },
 
       { "supersede-article", NULL,
-        N_("_Supersede Article..."), NULL,
+        N_("_Supersede Article…"), NULL,
         NULL,
         G_CALLBACK(do_supersede_article) },
 
@@ -692,12 +692,12 @@ namespace pan
         G_CALLBACK(do_pan_web) },
 
       { "bug-report", NULL,
-        N_("Give _Feedback or Report a Bug..."), NULL,
+        N_("Give _Feedback or Report a Bug…"), NULL,
         NULL,
         G_CALLBACK(do_bug_report) },
 
       { "tip-jar", NULL,
-        N_("_Tip Jar..."), NULL,
+        N_("_Tip Jar…"), NULL,
         NULL,
         G_CALLBACK(do_tip_jar) },
 
@@ -751,10 +751,10 @@ namespace pan
     { "match-only-watched-articles", "ICON_ONLY_WATCHED", N_("Match Only _Watched Articles"), NULL, 
N_("Match Only Watched Articles"), G_CALLBACK(do_match_only_watched_articles), false },
 
     { "match-watched-articles", NULL, N_("Match Scores of 9999 (_Watched)"), NULL, NULL, 
G_CALLBACK(do_match_watched_articles), true },
-    { "match-high-scoring-articles", NULL, N_("Match Scores of 5000...9998 (_High)"), NULL, NULL, 
G_CALLBACK(do_match_high_scoring_articles), true },
-    { "match-medium-scoring-articles", NULL, N_("Match Scores of 1...4999 (Me_dium)"), NULL, NULL, 
G_CALLBACK(do_match_medium_scoring_articles), true },
+    { "match-high-scoring-articles", NULL, N_("Match Scores of 5000…9998 (_High)"), NULL, NULL, 
G_CALLBACK(do_match_high_scoring_articles), true },
+    { "match-medium-scoring-articles", NULL, N_("Match Scores of 1…4999 (Me_dium)"), NULL, NULL, 
G_CALLBACK(do_match_medium_scoring_articles), true },
     { "match-normal-scoring-articles", NULL, N_("Match Scores of 0 (_Normal)"), NULL, NULL, 
G_CALLBACK(do_match_normal_scoring_articles), true },
-    { "match-low-scoring-articles", NULL, N_("Match Scores of -9998...-1 (_Low)"), NULL, NULL, 
G_CALLBACK(do_match_low_scoring_articles), true },
+    { "match-low-scoring-articles", NULL, N_("Match Scores of -9998…-1 (_Low)"), NULL, NULL, 
G_CALLBACK(do_match_low_scoring_articles), true },
     { "match-ignored-articles", NULL, N_("Match Scores of -9999 (_Ignored)"), NULL, NULL, 
G_CALLBACK(do_match_ignored_articles), false },
 
     { "enable-rules", NULL, N_("Enable/Disable All _Rules"), "<shift>R", NULL, G_CALLBACK(do_toggle_rules), 
true }
@@ -786,8 +786,8 @@ namespace pan
   GtkRadioActionEntry match_toggle_entries[] =
   {
     { "show-matching-articles", NULL, N_("Show Matching _Articles"), NULL, NULL, Data::SHOW_ARTICLES },
-    { "show-matching-threads", NULL, N_("Show Matching Articles' _Threads"), NULL, NULL, Data::SHOW_THREADS 
},
-    { "show-matching-subthreads", NULL, N_("Show Matching Articles' _Subthreads"), NULL, NULL, 
Data::SHOW_SUBTHREADS }
+    { "show-matching-threads", NULL, N_("Show Matching Articles’ _Threads"), NULL, NULL, Data::SHOW_THREADS 
},
+    { "show-matching-subthreads", NULL, N_("Show Matching Articles’ _Subthreads"), NULL, NULL, 
Data::SHOW_SUBTHREADS }
   };
 
   std::map<std::string,GCallback> real_toggle_callbacks;
diff --git a/pan/gui/body-pane.cc b/pan/gui/body-pane.cc
index 6da7709..286e554 100644
--- a/pan/gui/body-pane.cc
+++ b/pan/gui/body-pane.cc
@@ -1312,7 +1312,7 @@ BodyPane :: on_verbose_tooltip_cb(GtkWidget  *widget,
   std::pair<std::string,std::string> name_and_email = get_email_address(info.signers[0].name);
   g_snprintf(buf, sizeof(buf),
              _("<u>This is a <b>PGP-Signed</b> message.</u>\n\n"
-             "<b>Signer:</b> %s ('%s')\n"
+             "<b>Signer:</b> %s (“%s”)\n"
              "<b>Valid until:</b> %s\n"
              "<b>Created on:</b> %s"),
              name_and_email.first.c_str(), name_and_email.second.c_str(),
@@ -1744,7 +1744,7 @@ BodyPane :: BodyPane (Data& data, ArticleCache& cache, Prefs& prefs, GroupPrefs
 
   // menu for popup menu for attachments
   _menu = gtk_menu_new ();
-  l = gtk_menu_item_new_with_label(_("Save Attachment As..."));
+  l = gtk_menu_item_new_with_label(_("Save Attachment As…"));
   g_signal_connect (l, "activate", G_CALLBACK(menu_clicked_as_cb), this);
   gtk_menu_shell_append (GTK_MENU_SHELL(_menu), l);
   l =  gtk_menu_item_new_with_label(_("Save All Attachments"));
diff --git a/pan/gui/dl-headers-ui.cc b/pan/gui/dl-headers-ui.cc
index 9922f55..2171850 100644
--- a/pan/gui/dl-headers-ui.cc
+++ b/pan/gui/dl-headers-ui.cc
@@ -132,7 +132,7 @@ pan :: headers_dialog (Data& data, Prefs& prefs, Queue& queue,
     GtkWidget *w, *x;
     GtkAdjustment * adj;
     int row = 0;
-    state->n_days_rb = w = gtk_radio_button_new_with_mnemonic (NULL, _("Get the last N _days' headers: "));
+    state->n_days_rb = w = gtk_radio_button_new_with_mnemonic (NULL, _("Get the last N _days’ headers: "));
     gtk_button_set_alignment (GTK_BUTTON(w), 0.5, 0.0);
     gtk_table_attach_defaults (GTK_TABLE(t), w, 0, 1, row, row+1);
     adj = GTK_ADJUSTMENT(gtk_adjustment_new (n_days, 1, INT_MAX, 1, 1, 0));
diff --git a/pan/gui/e-charset-combo-box.c b/pan/gui/e-charset-combo-box.c
index bc557ee..f075867 100644
--- a/pan/gui/e-charset-combo-box.c
+++ b/pan/gui/e-charset-combo-box.c
@@ -333,7 +333,7 @@ charset_combo_box_init (ECharsetComboBox *combo_box)
        /* Note the "other" action is not included in the index. */
 
        radio_action = gtk_radio_action_new (
-               "charset-other", _("Other..."), NULL, NULL, OTHER_VALUE);
+               "charset-other", _("Other…"), NULL, NULL, OTHER_VALUE);
 
        g_object_set_data (G_OBJECT (radio_action), "charset", (gpointer) "");
 
diff --git a/pan/gui/group-prefs-dialog.cc b/pan/gui/group-prefs-dialog.cc
index e786e4b..475f500 100644
--- a/pan/gui/group-prefs-dialog.cc
+++ b/pan/gui/group-prefs-dialog.cc
@@ -159,7 +159,7 @@ namespace
 
     if (profiles.empty())
     {
-      gtk_combo_box_text_append_text (combo, _("No Profiles defined in Edit|Posting Profiles."));
+      gtk_combo_box_text_append_text (combo, _("No Profiles defined in Edit → Posting Profiles."));
       gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0);
       gtk_widget_set_sensitive (w, false);
     }
diff --git a/pan/gui/gui.cc b/pan/gui/gui.cc
index c29e574..945ea55 100644
--- a/pan/gui/gui.cc
+++ b/pan/gui/gui.cc
@@ -608,7 +608,7 @@ GUI :: prompt_user_for_save_path (GtkWindow * parent, const Prefs& prefs)
   if (!file :: file_exists (prev_path.c_str()))
     prev_path = g_get_home_dir ();
 
-  GtkWidget * w = gtk_file_chooser_dialog_new (_("Save NZB's Files"), parent,
+  GtkWidget * w = gtk_file_chooser_dialog_new (_("Save NZB’s Files"), parent,
                                                GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
                                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
@@ -637,7 +637,7 @@ GUI :: prompt_user_for_filename (GtkWindow * parent, const Prefs& prefs)
   prev_path = g_get_home_dir ();
     prev_file = std::string(_("Untitled.nzb"));
 
-  GtkWidget * w = gtk_file_chooser_dialog_new (_("Save NZB File as..."),
+  GtkWidget * w = gtk_file_chooser_dialog_new (_("Save NZB File as…"),
                                      parent,
                                      GTK_FILE_CHOOSER_ACTION_SAVE,
                                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
@@ -1333,7 +1333,7 @@ void GUI :: do_supersede_article ()
       GTK_BUTTONS_CLOSE, NULL);
     HIG :: message_dialog_set_text (GTK_MESSAGE_DIALOG(w),
       _("Unable to supersede article."),
-      _("The article doesn't match any of your posting profiles."));
+      _("The article doesn’t match any of your posting profiles."));
     g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w);
     gtk_widget_show (w);
     g_object_unref (message);
@@ -1407,7 +1407,7 @@ void GUI :: do_cancel_article ()
       GTK_BUTTONS_CLOSE, NULL);
     HIG :: message_dialog_set_text (GTK_MESSAGE_DIALOG(w),
       _("Unable to cancel article."),
-      _("The article doesn't match any of your posting profiles."));
+      _("The article doesn’t match any of your posting profiles."));
     g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w);
     gtk_widget_show (w);
     g_object_unref (message);
@@ -2282,7 +2282,7 @@ GUI :: set_queue_size_label (unsigned int running,
                     KiB_remain, KiBps,
                     hr, min, sec);
 
-  g_snprintf (tip, sizeof(tip), _("%lu tasks, %s, %.1f KiBps, ETA %d:%02d:%02d"),
+  g_snprintf (tip, sizeof(tip), _("%lu tasks, %s, %.1f KiBps, ETA %d∶%02d∶%02d"),
               (running+queued), render_bytes(KiB_remain), KiBps, hr, min, sec);
 
   // update the gui
@@ -2334,7 +2334,7 @@ GUI :: on_queue_error (Queue&, const StringView& message)
       s.assign (message.str, message.len);
       s += "\n \n";
     }
-    s += _("Pan is now offline. Please see \"File|Event Log\" and correct the problem, then use \"File|Work 
Online\" to continue.");
+    s += _("Pan is now offline. Please see “File → Event Log” and correct the problem, then use “File → Work 
Online” to continue.");
     Log::add_urgent_va ("%s", s.c_str());
 
     toggle_action ("work-online", false);
diff --git a/pan/gui/pan.cc b/pan/gui/pan.cc
index 4083675..a05d180 100644
--- a/pan/gui/pan.cc
+++ b/pan/gui/pan.cc
@@ -643,7 +643,7 @@ _("General Options\n"
 "  --no-gui                 On news:message-id, dump the article to stdout.\n"
 "\n"
 "NZB Batch Options\n"
-"  --nzb file1 file2 ...    Process nzb files without launching all of Pan.\n"
+"  --nzb file1 file2 …      Process nzb files without launching all of Pan.\n"
 "  -o path, --output=path   Path to save attachments listed in the nzb files.\n"
 "  --no-gui                 Only show console output, not the download queue.\n") << std::endl;
   }
@@ -993,7 +993,7 @@ main (int argc, char *argv[])
     CertStore& certstore (data.get_certstore());
 
     if (nzb && data.get_servers().empty()) {
-      std::cerr << _("Please configure Pan's news servers before using it as an nzb client.") << std::endl;
+      std::cerr << _("Please configure Pan’s news servers before using it as an nzb client.") << std::endl;
        return EXIT_FAILURE;
     }
     data.set_newsrc_autosave_timeout( prefs.get_int("newsrc-autosave-timeout-min", 10 ));
diff --git a/pan/gui/post-ui.cc b/pan/gui/post-ui.cc
index b9e09b2..91ddd08 100644
--- a/pan/gui/post-ui.cc
+++ b/pan/gui/post-ui.cc
@@ -456,10 +456,10 @@ namespace
     { "post-toolbar", 0, "post", 0, 0, 0 },
     { "post-article", GTK_STOCK_EXECUTE, N_("_Send Article"), "<control>Return", N_("Send Article Now"), 
G_CALLBACK(do_send) },
     { "post-and-save-articles", GTK_STOCK_FLOPPY, N_("_Send and Save Articles to NZB"), 0, N_("Send and Save 
Articles to NZB"), G_CALLBACK(do_send_and_save) },
-    { "set-charset", 0, N_("Set Character _Encoding..."), 0, 0, G_CALLBACK(do_charset) },
-    { "set-encoding", 0, N_("Set Content _Transfer Encoding..."), 0, 0, G_CALLBACK(do_cte) },
+    { "set-charset", 0, N_("Set Character _Encoding…"), 0, 0, G_CALLBACK(do_charset) },
+    { "set-encoding", 0, N_("Set Content _Transfer Encoding…"), 0, 0, G_CALLBACK(do_cte) },
     { "save-draft", GTK_STOCK_SAVE, N_("Sa_ve Draft"), "<control>s", N_("Save as a Draft for Future 
Posting"), G_CALLBACK(do_save) },
-    { "open-draft", GTK_STOCK_OPEN, N_("_Open Draft..."), "<control>o", N_("Open an Article Draft"), 
G_CALLBACK(do_open) },
+    { "open-draft", GTK_STOCK_OPEN, N_("_Open Draft…"), "<control>o", N_("Open an Article Draft"), 
G_CALLBACK(do_open) },
     { "close", GTK_STOCK_CLOSE, 0, 0, 0, G_CALLBACK(do_close) },
     { "cut", GTK_STOCK_CUT, 0, 0, 0, G_CALLBACK(do_cut) },
     { "copy", GTK_STOCK_COPY, 0, 0, 0, G_CALLBACK(do_copy) },
@@ -552,7 +552,7 @@ PostUI :: prompt_for_charset ()
       _charset = DEFAULT_CHARSET;
 
   char * tmp = e_charset_dialog (_("Character Encoding"),
-                                 _("New Article's Encoding:"),
+                                 _("New Article’s Encoding:"),
                                  _charset.c_str(),
                                  GTK_WINDOW(root()));
   set_charset (tmp);
@@ -563,7 +563,7 @@ void
 PostUI :: prompt_for_cte ()
 {
   GMimeContentEncoding enc = e_cte_dialog (_("Content Transfer Encoding"),
-                                 _("New Article's Content Transfer Encoding:"),
+                                 _("New Article’s Content Transfer Encoding:"),
                                  _enc, GTK_WINDOW(root()));
   _enc = enc;
 }
@@ -641,7 +641,7 @@ PostUI :: add_actions (GtkWidget * box)
     gtk_ui_manager_add_ui_from_string (_uim, fallback_post_ui, -1, &err);
   }
   if (err) {
-    Log::add_err_va (_("Error reading file \"%s\": %s"), filename, err->message);
+    Log::add_err_va (_("Error reading file “%s”: %s"), filename, err->message);
     g_clear_error (&err);
 
   }
@@ -822,7 +822,7 @@ PostUI :: check_charset ()
   tmp = g_ascii_strup (best_charset, -1);
 
   // Prompt the user
-  char * msg = g_strdup_printf (_("Message uses characters not specified in charset '%s' - possibly use '%s' 
"), charset.c_str(), tmp);
+  char * msg = g_strdup_printf (_("Message uses characters not specified in charset “%s” — possibly use “%s” 
"), charset.c_str(), tmp);
   GtkWidget * d = gtk_message_dialog_new (GTK_WINDOW(_root),
                                           GTK_DIALOG_DESTROY_WITH_PARENT,
                                           GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE,
@@ -1102,7 +1102,7 @@ PostUI :: maybe_post_message (GMimeMessage * message)
   std::string error_msg;
   bool error = false;
   if (server.empty() || !_data.get_servers().count(server))
-    error_msg = _("No posting server is set for this posting profile.\nPlease edit the profile via 
Edit|Manage Posting Profiles.");
+    error_msg = _("No posting server is set for this posting profile.\nPlease edit the profile via Edit → 
Manage Posting Profiles.");
 
   //invalid connection count, can't post
   Data::Server* s = _data.find_server(server);
@@ -1378,7 +1378,7 @@ PostUI :: spawn_editor ()
     GError * err (0);
     g_shell_parse_argv (editor.c_str(), &argc, &argv, &err);
     if (err != NULL) {
-      Log::add_err_va (_("Error parsing \"external editor\" command line: %s (Command was: %s)"), 
err->message, editor.c_str());
+      Log::add_err_va (_("Error parsing “external editor” command line: %s (Command was: %s)"), 
err->message, editor.c_str());
       g_clear_error (&err);
       ok = false;
     }
@@ -1774,7 +1774,7 @@ PostUI :: save_draft ()
         GTK_DIALOG_DESTROY_WITH_PARENT,
         GTK_MESSAGE_ERROR,
         GTK_BUTTONS_CLOSE,
-        _("Unable to save \"%s\" %s"), filename, file::pan_strerror(errno));
+        _("Unable to save “%s” %s"), filename, file::pan_strerror(errno));
         gtk_dialog_run (GTK_DIALOG(e));
         gtk_widget_destroy (e);
       }
@@ -1938,7 +1938,7 @@ namespace
         GError * err = NULL;
         if (!g_shell_parse_argv (pch, &argc, &argv, &err))
         {
-          Log::add_err_va (_("Couldn't parse signature command \"%s\": %s"), pch, err->message);
+          Log::add_err_va (_("Couldn’t parse signature command “%s”: %s"), pch, err->message);
           g_error_free (err);
         }
       }
@@ -1974,7 +1974,7 @@ namespace
     if (!sig.empty())
       sig = content_to_utf8 (sig);
     else
-      Log::add_err (_("Couldn't convert signature to UTF-8."));
+      Log::add_err (_("Couldn’t convert signature to UTF-8."));
 
     if (!sig.empty())
       setme = sig;
@@ -2813,7 +2813,7 @@ PostUI :: create_extras_tab ()
   gtk_label_set_mnemonic_widget (GTK_LABEL(l), w);
   /* i18n: "poster" is a key used by many newsreaders.  probably safest to keep this key in english. */
   gtk_widget_set_tooltip_text (w, _("The newsgroups where replies to your message should go.  This is only 
needed if it differs from "
-      "the \"Newsgroups\" header.\n\nTo direct all replies to your email address, use \"Followup-To: 
poster\""));
+      "the “Newsgroups” header.\n\nTo direct all replies to your email address, use “Followup-To: poster”"));
   gtk_table_attach (GTK_TABLE(t), w, 1, 2, row, row+1, fe, fill, 0, 0);
 
   //  Reply-To
@@ -2828,7 +2828,7 @@ PostUI :: create_extras_tab ()
   w = _replyto_entry = gtk_entry_new ();
   gtk_label_set_mnemonic_widget (GTK_LABEL(l), w);
   gtk_widget_set_tooltip_text (w, _("The email account where mail replies to your posted message should go. "
-    "This is only needed if it differs from the \"From\" header."));
+    "This is only needed if it differs from the “From” header."));
   gtk_table_attach (GTK_TABLE(t), w, 1, 2, row, row+1, fe, fill, 0, 0);
 
   //  Extra Headers
@@ -2858,14 +2858,14 @@ PostUI :: create_extras_tab ()
   //  User-Agent
 
   ++row;
-  w = _user_agent_check = gtk_check_button_new_with_mnemonic (_("Add \"_User-Agent\" header"));
+  w = _user_agent_check = gtk_check_button_new_with_mnemonic (_("Add “_User-Agent” header"));
   bool b = _prefs.get_flag (USER_AGENT_PREFS_KEY, true);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), b);
   g_signal_connect (w, "toggled", G_CALLBACK(user_agent_toggled_cb), &_prefs);
   gtk_table_attach (GTK_TABLE(t), w, 0, 2, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
 
   ++row;
-  w = _message_id_check = gtk_check_button_new_with_mnemonic (_("Add \"Message-_ID\" header"));
+  w = _message_id_check = gtk_check_button_new_with_mnemonic (_("Add “Message-_ID” header"));
   b = _prefs.get_flag(MESSAGE_ID_PREFS_KEY,false);
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), b);
   g_signal_connect (w, "toggled", G_CALLBACK(message_id_toggled_cb), this);
diff --git a/pan/gui/prefs-ui.cc b/pan/gui/prefs-ui.cc
index 4b0d37c..e7aa42c 100644
--- a/pan/gui/prefs-ui.cc
+++ b/pan/gui/prefs-ui.cc
@@ -126,7 +126,7 @@ PrefsDialog :: edit_shortkey (gpointer user_data)
       GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
 
   str = g_strdup_printf(
-      _("Press the combination of the keys\nyou want to use for \"%s\"."), data->value.c_str());
+      _("Press the combination of the keys\nyou want to use for “%s”."), data->value.c_str());
   label = gtk_label_new(str);
   gtk_misc_set_padding(GTK_MISC(label), 5, 10);
 
@@ -1120,7 +1120,7 @@ PrefsDialog :: PrefsDialog (Prefs& prefs, GtkWindow* parent):
   t = HIG :: workarea_create ();
 
     gtk_widget_set_tooltip_text (t, _("This menu lets you configure Pan to take certain actions on your 
behalf automatically, "
-                                      "based on an article's score."));
+                                      "based on an article’s score."));
 
     int i(0);
     GtkWidget** action_combo = new GtkWidget*[2];
diff --git a/pan/gui/prefs.cc b/pan/gui/prefs.cc
index 95700a8..9fdfb2f 100644
--- a/pan/gui/prefs.cc
+++ b/pan/gui/prefs.cc
@@ -363,7 +363,7 @@ Prefs :: set_color (const StringView& key, const StringView& value)
   if (gdk_color_parse (value.to_string().c_str(), &c))
     set_color (key, c);
   else
-    Log::add_err_va (_("Couldn't parse %s color \"%s\""), key.to_string().c_str(), 
value.to_string().c_str());
+    Log::add_err_va (_("Couldn’t parse %s color “%s”"), key.to_string().c_str(), value.to_string().c_str());
 }
 
 GdkColor
diff --git a/pan/gui/profiles-dialog.cc b/pan/gui/profiles-dialog.cc
index d766b10..4c8bcea 100644
--- a/pan/gui/profiles-dialog.cc
+++ b/pan/gui/profiles-dialog.cc
@@ -80,7 +80,7 @@ namespace
     if (row == ROW_GPGSIG)
     {
       gtk_widget_set_tooltip_text(d->_signature_file_combo_box,
-            _("Please choose your email address according to your PGP key's user id."));
+            _("Please choose your email address according to your PGP key’s user id."));
       gtk_widget_hide (d->_signature_file);
 
     }
@@ -156,7 +156,7 @@ ProfileDialog :: ProfileDialog (const Data         & data,
     set_entry (w, profile.address);
 #ifdef HAVE_GMIME_CRYPTO
     gtk_widget_set_tooltip_text(w, _("Your email address.\n"
-                                     "Note that this has to match your PGP signature's address\n"
+                                     "Note that this has to match your PGP signature’s address\n"
                                      "if you want your messages to be PGP-signed or encrypted correctly."));
 #endif
     HIG :: workarea_add_row (t, &row, _("_Email Address:"), w);
@@ -227,7 +227,7 @@ ProfileDialog :: ProfileDialog (const Data         & data,
     w = _xface_entry = gtk_entry_new ();
     set_entry (w, profile.xface);
     gtk_widget_set_tooltip_markup (w, _("You can add an avatar icon to your articles with a unique X-Face 
code.\n"
-                                        "Add the code without the trailing <b>\"X-Face:\"</b> \n if it was 
generated "
+                                        "Add the code without the trailing <b>“X-Face:”</b> \n if it was 
generated "
                                         "by a helper program (for example 
http://www.dairiki.org/xface/xface.php)."));
     HIG :: workarea_add_row (t, &row, _("_X-Face:"), w, NULL);
   HIG :: workarea_add_section_divider (t, &row);
@@ -236,7 +236,7 @@ ProfileDialog :: ProfileDialog (const Data         & data,
 
     w = _msgid_fqdn_entry = gtk_entry_new ();
     set_entry (w, profile.fqdn);
-    gtk_widget_set_tooltip_text (w, _("When posting to Usenet, your article's Message-ID contains a domain 
name.\n"
+    gtk_widget_set_tooltip_text (w, _("When posting to Usenet, your article’s Message-ID contains a domain 
name.\n"
                                       "You can set a custom domain name here, or leave it blank to let Pan 
use the "
                                       "domain name from your email address."));
     HIG :: workarea_add_row (t, &row, _("Message-ID _Domain Name:"), w, NULL);
@@ -268,7 +268,7 @@ ProfileDialog :: ProfileDialog (const Data         & data,
     if (!s.empty())
       gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW(w)), s.c_str(), s.size());
     GtkWidget * eventbox = gtk_event_box_new ();
-    gtk_widget_set_tooltip_text (eventbox, _("Extra headers to be included in your articles, such 
as\nReply-To: \"Your Name\""
+    gtk_widget_set_tooltip_text (eventbox, _("Extra headers to be included in your articles, such 
as\nReply-To: “Your Name”"
                                              "<yourname somewhere com>\nOrganization: Your Organization\n"));
     GtkWidget * scrolled_window = gtk_scrolled_window_new (NULL, NULL);
     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window),
diff --git a/pan/gui/save-attach-ui.cc b/pan/gui/save-attach-ui.cc
index d2b9f30..2e23482 100644
--- a/pan/gui/save-attach-ui.cc
+++ b/pan/gui/save-attach-ui.cc
@@ -43,17 +43,17 @@ namespace
   void
   show_group_substitution_help_dialog (gpointer window)
   {
-    const char * str = _("%g - group as one directory (alt.binaries.pictures.trains)\n"
-                         "%G - group as nested directory (/alt/binaries/pictures/trains)\n"
-                         "%s - Subject line excerpt\n"
-                         "%S - Subject line\n"
-                         "%n - Poster display name\n"
-                         "%e - Poster email address\n"
-                         "%d - Article timestamp\n"
-                         "\"/home/user/News/Pan/%g\" becomes\n"
-                         "\"/home/user/News/Pan/alt.binaries.pictures.trains\", and\n"
-                         "\"/home/user/News/Pan/%G\" becomes\n"
-                         "\"/home/user/News/Pan/alt/binaries/pictures/trains\",");
+    const char * str = _("%g — group as one directory (alt.binaries.pictures.trains)\n"
+                         "%G — group as nested directory (/alt/binaries/pictures/trains)\n"
+                         "%s — Subject line excerpt\n"
+                         "%S — Subject line\n"
+                         "%n — Poster display name\n"
+                         "%e — Poster email address\n"
+                         "%d — Article timestamp\n"
+                         "“/home/user/News/Pan/%g” becomes\n"
+                         "“/home/user/News/Pan/alt.binaries.pictures.trains”, and\n"
+                         "“/home/user/News/Pan/%G” becomes\n"
+                         "“/home/user/News/Pan/alt/binaries/pictures/trains”,");
     GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW(window),
                                             GTK_DIALOG_DESTROY_WITH_PARENT,
                                             GTK_MESSAGE_INFO,
@@ -275,7 +275,7 @@ SaveAttachmentsDialog :: SaveAttachmentsDialog
     HIG :: workarea_add_row (t, &row, _("_Location:"), h, file_entry_gtk_entry(_save_path_entry));
 
   if (have_group_default) {
-    char * pch = g_strdup_printf (_("_Group's path: %s"), group_path.c_str());
+    char * pch = g_strdup_printf (_("_Group’s path: %s"), group_path.c_str());
     w = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON(_save_custom_path_radio), pch);
     _save_group_path_radio = w;
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), path_mode==PATH_GROUP);
diff --git a/pan/gui/save-ui.cc b/pan/gui/save-ui.cc
index a3a58ed..a78278b 100644
--- a/pan/gui/save-ui.cc
+++ b/pan/gui/save-ui.cc
@@ -43,18 +43,18 @@ namespace
   void
   show_group_substitution_help_dialog (gpointer window)
   {
-    const char * str = _("%g - group as one directory (alt.binaries.pictures.trains)\n"
-                         "%G - group as nested directory (/alt/binaries/pictures/trains)\n"
-                         "%s - subject line excerpt\n"
-                         "%S - subject line\n"
-                         "%n - Poster display name\n"
-                         "%e - Poster email address\n"
-                         "%d - Article timestamp\n"
+    const char * str = _("%g — group as one directory (alt.binaries.pictures.trains)\n"
+                         "%G — group as nested directory (/alt/binaries/pictures/trains)\n"
+                         "%s — subject line excerpt\n"
+                         "%S — subject line\n"
+                         "%n — Poster display name\n"
+                         "%e — Poster email address\n"
+                         "%d — Article timestamp\n"
                          " \n"
-                         "\"/home/user/News/Pan/%g\" becomes\n"
-                         "\"/home/user/News/Pan/alt.binaries.pictures.trains\", and\n"
-                         "\"/home/user/News/Pan/%G\" becomes\n"
-                         "\"/home/user/News/Pan/alt/binaries/pictures/trains\",");
+                         "“/home/user/News/Pan/%g” becomes\n"
+                         "“/home/user/News/Pan/alt.binaries.pictures.trains”, and\n"
+                         "“/home/user/News/Pan/%G” becomes\n"
+                         "“/home/user/News/Pan/alt/binaries/pictures/trains”,");
     GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW(window),
                                             GTK_DIALOG_DESTROY_WITH_PARENT,
                                             GTK_MESSAGE_INFO,
@@ -290,7 +290,7 @@ SaveDialog :: SaveDialog (Prefs                       & prefs,
     HIG :: workarea_add_row (t, &row, _("_Location:"), h, file_entry_gtk_entry(_save_path_entry));
 
   if (have_group_default) {
-    char * pch = g_strdup_printf (_("_Group's path: %s"), group_path.c_str());
+    char * pch = g_strdup_printf (_("_Group’s path: %s"), group_path.c_str());
     w = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON(_save_custom_path_radio), pch);
     _save_group_path_radio = w;
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), path_mode==PATH_GROUP);
diff --git a/pan/gui/score-add-ui.cc b/pan/gui/score-add-ui.cc
index 3787666..4a61a5b 100644
--- a/pan/gui/score-add-ui.cc
+++ b/pan/gui/score-add-ui.cc
@@ -109,9 +109,9 @@ namespace
   GtkTreeModel * score_tree_model_new ()
   {
     struct { int type; const char * str; } items[] = {
-      { _ADD,      N_("increase the article's score by") },
-      { _SUBTRACT, N_("decrease the article's score by") },
-      { _ASSIGN,   N_("set the article's score to") },
+      { _ADD,      N_("increase the article’s score by") },
+      { _SUBTRACT, N_("decrease the article’s score by") },
+      { _ASSIGN,   N_("set the article’s score to") },
       { _WATCH,    N_("watch the article (set its score to 9999)") },
       { _IGNORE,   N_("ignore the article (set its score to -9999)") }
     };
@@ -192,9 +192,9 @@ namespace
   {
     struct { int type; bool negate; const char * str; } items[] = {
       { TextMatch::CONTAINS,    false, N_("contains")},
-      { TextMatch::CONTAINS,    true,  N_("doesn't contain")},
+      { TextMatch::CONTAINS,    true,  N_("doesn’t contain")},
       { TextMatch::IS,          false, N_("is")},
-      { TextMatch::IS,          true,  N_("isn't")},
+      { TextMatch::IS,          true,  N_("isn’t")},
       { TextMatch::BEGINS_WITH, false, N_("starts with")},
       { TextMatch::ENDS_WITH,   false, N_("ends with")},
       { TextMatch::REGEX,       false, N_("matches regex")},
@@ -478,7 +478,7 @@ ScoreAddDialog :: response_cb (GtkDialog * w, int response, gpointer dialog_gpoi
         GTK_DIALOG_DESTROY_WITH_PARENT,
         GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE, NULL));
       HIG :: message_dialog_set_text (GTK_MESSAGE_DIALOG(d),
-        _("Another rule already sets this article's score."),
+        _("Another rule already sets this article’s score."),
         _("You may want to go back or delete the old rule."));
       gtk_dialog_add_buttons (GTK_DIALOG(d),
         GTK_STOCK_GO_BACK, -20,
diff --git a/pan/gui/score-view-ui.cc b/pan/gui/score-view-ui.cc
index 75b9490..60e0d07 100644
--- a/pan/gui/score-view-ui.cc
+++ b/pan/gui/score-view-ui.cc
@@ -151,7 +151,7 @@ ScoreView :: tree_view_refresh ()
 
     // build the criteria column: file & line numbers, optional name, criteria
     GString * criteria = g_string_new (0);
-    g_string_printf (criteria, _("File %s, Lines %d - %d"), item.filename.c_str(), (int)item.begin_line, 
(int)item.end_line);
+    g_string_printf (criteria, _("File %s, Lines %d-%d"), item.filename.c_str(), (int)item.begin_line, 
(int)item.end_line);
     g_string_append_c (criteria, '\n');
     if (!item.name.empty())
       g_string_append_printf (criteria, "%s: \"%s\"\n", _("Name"), item.name.c_str());
@@ -179,7 +179,7 @@ ScoreView :: ScoreView (Data& data, GtkWindow* parent,
   _article (article),
   _root (0)
 {
-  GtkWidget * w = _root = gtk_dialog_new_with_buttons (_("Pan: Article's Scores"),
+  GtkWidget * w = _root = gtk_dialog_new_with_buttons (_("Pan: Article’s Scores"),
                                                       parent,
                                                       GTK_DIALOG_DESTROY_WITH_PARENT,
                                                       GTK_STOCK_CLOSE, GTK_RESPONSE_OK,
diff --git a/pan/gui/server-ui.cc b/pan/gui/server-ui.cc
index c5667c5..1af9f5e 100644
--- a/pan/gui/server-ui.cc
+++ b/pan/gui/server-ui.cc
@@ -269,7 +269,7 @@ namespace
 
       const char * err_msg (0);
       if (addr.empty())
-        err_msg = _("Please specify the server's address.");
+        err_msg = _("Please specify the server’s address.");
 
       if (err_msg) {
         GtkWidget * dialog (gtk_message_dialog_new (GTK_WINDOW(d->dialog),
@@ -352,7 +352,7 @@ pan :: server_edit_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
   ServerEditDialog * d (new ServerEditDialog (data, queue, prefs));
 
   // create the dialog
-  char * title = g_strdup_printf ("Pan: %s", server.empty() ? _("Add a Server") : _("Edit a Server's 
Settings"));
+  char * title = g_strdup_printf ("Pan: %s", server.empty() ? _("Add a Server") : _("Edit a Server’s 
Settings"));
   GtkWidget * dialog = gtk_dialog_new_with_buttons (title,
                                                     GTK_WINDOW(window),
                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -376,13 +376,13 @@ pan :: server_edit_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
     HIG::workarea_add_section_spacer (t, row, 2);
 
     GtkWidget * w = d->address_entry = gtk_entry_new ();
-    gtk_widget_set_tooltip_text( w, _("The news server's actual address, e.g. \"news.mynewsserver.com\""));
+    gtk_widget_set_tooltip_text( w, _("The news server’s actual address, e.g. “news.mynewsserver.com”"));
     HIG::workarea_add_row (t, &row, _("_Address:"), w, NULL);
     //g_signal_connect (w, "changed", G_CALLBACK(address_entry_changed_cb), d);
 
     GtkAdjustment * a = GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, ULONG_MAX, 1.0, 1.0, 0.0));
     w = d->port_spin = gtk_spin_button_new (GTK_ADJUSTMENT(a), 1.0, 0u);
-    gtk_widget_set_tooltip_text( w, _("The news server's port number.  Typically 119 for unencrypted and 563 
for encrypted connections (SSL/TLS)."));
+    gtk_widget_set_tooltip_text( w, _("The news server’s port number.  Typically 119 for unencrypted and 563 
for encrypted connections (SSL/TLS)."));
     HIG::workarea_add_row (t, &row, _("Por_t:"), w, NULL);
 
     HIG::workarea_add_section_divider (t, &row);
@@ -391,12 +391,12 @@ pan :: server_edit_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
 
     w = d->auth_username_entry = gtk_entry_new ();
     HIG::workarea_add_row (t, &row, _("_Username:"), w, NULL);
-    gtk_widget_set_tooltip_text( w, _("The username to give the server when asked.  If your server doesn't 
require authentication, you can leave this blank."));
+    gtk_widget_set_tooltip_text( w, _("The username to give the server when asked.  If your server doesn’t 
require authentication, you can leave this blank."));
 
     w = d->auth_password_entry = gtk_entry_new ();
     gtk_entry_set_visibility (GTK_ENTRY(w), FALSE);
     HIG::workarea_add_row (t, &row, _("_Password:"), w, NULL);
-    gtk_widget_set_tooltip_text( w, _("The password to give the server when asked.  If your server doesn't 
require authentication, you can leave this blank."));
+    gtk_widget_set_tooltip_text( w, _("The password to give the server when asked.  If your server doesn’t 
require authentication, you can leave this blank."));
 
     HIG::workarea_add_section_divider (t, &row);
     HIG::workarea_add_section_title (t, &row, _("Settings"));
@@ -452,7 +452,7 @@ pan :: server_edit_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
     GtkWidget * e = gtk_event_box_new ();
     gtk_container_add (GTK_CONTAINER(e), l);
     gtk_misc_set_alignment (GTK_MISC(l), 0.0f, 0.5f);
-    gtk_widget_set_tooltip_text( e, _("Fallback servers are used for articles that can't be found on the 
primaries.  One common approach is to use free servers as primaries and subscription servers as fallbacks."));
+    gtk_widget_set_tooltip_text( e, _("Fallback servers are used for articles that can’t be found on the 
primaries.  One common approach is to use free servers as primaries and subscription servers as fallbacks."));
     HIG::workarea_add_row (t, &row, e, w);
 
     // header compression list options
@@ -510,7 +510,7 @@ pan :: server_edit_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
             "It is encouraged to enable SSL/TLS for privacy reasons."));
     HIG::workarea_add_row (t, &row, e, w);
 
-    d->always_trust_checkbox = w = gtk_check_button_new_with_label (_("Always trust this server's 
certificate"));
+    d->always_trust_checkbox = w = gtk_check_button_new_with_label (_("Always trust this server’s 
certificate"));
     HIG::workarea_add_row (t, &row, NULL, w, NULL);
     g_signal_connect (d->dialog, "realize", G_CALLBACK(server_edit_dialog_realized_cb), d);
 #endif
@@ -686,7 +686,7 @@ namespace
                                               
GtkDialogFlags(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
                                               GTK_MESSAGE_QUESTION,
                                               GTK_BUTTONS_NONE,
-                                              _("Really delete \"%s\"?"),
+                                              _("Really delete “%s”?"),
                                               addr.c_str());
       gtk_dialog_add_buttons (GTK_DIALOG(w),
                               GTK_STOCK_NO, GTK_RESPONSE_NO,
@@ -785,7 +785,7 @@ namespace
 
         HIG :: message_dialog_set_text (GTK_MESSAGE_DIALOG(w), buf, NULL);
 
-        g_snprintf(buf,sizeof(buf), _("Server Certificate for '%s'"), addr.c_str());
+        g_snprintf(buf,sizeof(buf), _("Server Certificate for “%s”"), addr.c_str());
         gtk_window_set_title(GTK_WINDOW(w), buf);
 
         gtk_widget_show_all (w);
@@ -884,7 +884,7 @@ namespace
                                               
GtkDialogFlags(GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT),
                                               GTK_MESSAGE_QUESTION,
                                               GTK_BUTTONS_NONE,
-                                              _("Really delete certificate for \"%s\"?"),
+                                              _("Really delete certificate for “%s”?"),
                                               addr.c_str());
       gtk_dialog_add_buttons (GTK_DIALOG(w),
                               GTK_STOCK_NO, GTK_RESPONSE_NO,
@@ -964,7 +964,7 @@ pan :: server_list_dialog_new (Data& data, Queue& queue, Prefs& prefs, GtkWindow
   // edit button
   w = gtk_button_new_from_stock (GTK_STOCK_EDIT);
   gtk_box_pack_start (GTK_BOX (bbox), w, FALSE, FALSE, 0);
-  gtk_widget_set_tooltip_text(w, _("Edit a Server's Settings"));
+  gtk_widget_set_tooltip_text(w, _("Edit a Server’s Settings"));
   g_signal_connect (w, "clicked", G_CALLBACK(edit_button_clicked_cb), d->dialog);
   d->edit_button = w;
 
diff --git a/pan/gui/task-pane.cc b/pan/gui/task-pane.cc
index 504ca63..87f033a 100644
--- a/pan/gui/task-pane.cc
+++ b/pan/gui/task-pane.cc
@@ -118,7 +118,7 @@ namespace
       const Article& a(tu->get_article());
       date = date_maker.get_date_string (tu->get_article().time_posted);
       g_snprintf(buffer,size,
-                 _("\n<u>Upload</u>\n\n<i>Subject:</i> <b>\"%s\"</b>\n<i>From:</i> <b>%s</b>\n"
+                 _("\n<u>Upload</u>\n\n<i>Subject:</i> <b>“%s”</b>\n<i>From:</i> <b>%s</b>\n"
                    "<i>Groups:</i> <b>%s</b>\n<i>Sourcefile:</i> <b>%s</b>\n"),
                  escaped(a.subject.to_string()).c_str(), escaped(a.author.to_string()).c_str(),
                  tu->get_groups().c_str(), tu->get_filename().c_str());
@@ -130,7 +130,7 @@ namespace
       const Article& a(ta->get_article());
       date = date_maker.get_date_string (ta->get_article().time_posted);
       g_snprintf(buffer, size,
-                 _("\n<u>Download</u>\n\n<i>Subject:</i> <b>\"%s\"</b>\n<i>From:</i> <b>%s</b>\n<i>Date:</i> 
<b>%s</b>\n"
+                 _("\n<u>Download</u>\n\n<i>Subject:</i> <b>“%s”</b>\n<i>From:</i> <b>%s</b>\n<i>Date:</i> 
<b>%s</b>\n"
                    "<i>Groups:</i> <b>%s</b>\n<i>Save Path:</i> <b>%s</b>\n"),
                  escaped(a.subject.to_string()).c_str(), escaped(a.author.to_string()).c_str(), date ? date 
: _("unknown"),
                  ta->get_groups().c_str(), ta->get_save_path().to_string().c_str());
@@ -472,7 +472,7 @@ TaskPane :: update_status (const task_states_t& tasks)
     minutes = tmp % 60ul; tmp /= 60ul;
     hours   = tmp;
   }
-  g_snprintf (buf, sizeof(buf), _("%lu tasks, %s, %.1f KiBps, ETA %d:%02d:%02d"),
+  g_snprintf (buf, sizeof(buf), _("%lu tasks, %s, %.1f KiBps, ETA %d∶%02d∶%02d"),
               task_count, render_bytes(bytes), KiBps, hours, minutes, seconds);
   std::string line (buf);
 
@@ -589,7 +589,7 @@ namespace
     }
     if (state == Queue::RUNNING) {
       char buf[128];
-      g_snprintf (buf, sizeof(buf), _("%d:%02d:%02d Remaining (%d @ %lu KiB/s)"), h, m, s, connections, 
(unsigned long)speed);
+      g_snprintf (buf, sizeof(buf), _("%d∶%02d∶%02d Remaining (%d @ %lu KiB/s)"), h, m, s, connections, 
(unsigned long)speed);
       status += " - ";
       status += buf;
     }
@@ -734,7 +734,7 @@ TaskPane :: add_actions (GtkWidget * box)
     gtk_ui_manager_add_ui_from_string (_uim, fallback_taskpane_ui, -1, &err);
   }
   if (err) {
-    Log::add_err_va (_("Error reading file \"%s\": %s"), filename, err->message);
+    Log::add_err_va (_("Error reading file “%s”: %s"), filename, err->message);
     g_clear_error (&err);
 
   }
diff --git a/pan/tasks/decoder.cc b/pan/tasks/decoder.cc
index 4b99d57..769e27a 100644
--- a/pan/tasks/decoder.cc
+++ b/pan/tasks/decoder.cc
@@ -114,7 +114,7 @@ Decoder :: do_work()
         mut.unlock();
 
         if (!fp) {
-          g_snprintf(buf, bufsz, _("Couldn't save file \"%s\": %s"), filename, file::pan_strerror(errno));
+          g_snprintf(buf, bufsz, _("Couldn’t save file “%s”: %s"), filename, file::pan_strerror(errno));
           log_errors.push_back (buf); // log error
         } else {
           fwrite (contents, 1, (size_t)length, fp);
@@ -191,14 +191,14 @@ Decoder :: do_work()
 
         // decode the file...
         if ((res = UUDecodeFile (item, fname)) == UURET_OK) {
-          g_snprintf(buf, bufsz,_("Saved \"%s\""), fname);
+          g_snprintf(buf, bufsz,_("Saved “%s”"), fname);
           log_infos.push_back(buf); // log info
         } else if (res == UURET_NODATA) {
           // silently let this error by... user probably tried to
           // save attachements on a text-only post
         } else {
           const int the_errno (UUGetOption (UUOPT_ERRNO, NULL, NULL, 0));
-          g_snprintf (buf, bufsz,_("Error saving \"%s\":\n%s."),
+          g_snprintf (buf, bufsz,_("Error saving “%s”:\n%s."),
                       fname,
                       res==UURET_IOERR ? file::pan_strerror(the_errno) : UUstrerror(res));
           log_errors.push_back(buf); // log error
diff --git a/pan/tasks/nntp-pool.cc b/pan/tasks/nntp-pool.cc
index 603ec0a..3fba653 100644
--- a/pan/tasks/nntp-pool.cc
+++ b/pan/tasks/nntp-pool.cc
@@ -232,7 +232,7 @@ NNTP_Pool :: on_nntp_done (NNTP* nntp, Health health, const StringView& response
        const std::string addr (_server_info.get_server_address (_server));
        std::string s;
        char buf[4096];
-       snprintf (buf, sizeof(buf), _("Unable to connect to \"%s\""), addr.c_str());
+       snprintf (buf, sizeof(buf), _("Unable to connect to “%s”"), addr.c_str());
        s = buf;
        if (!response.empty()) {
          s += ":\n";
diff --git a/pan/tasks/nntp.cc b/pan/tasks/nntp.cc
index 624b3db..d7fc8b1 100644
--- a/pan/tasks/nntp.cc
+++ b/pan/tasks/nntp.cc
@@ -244,7 +244,7 @@ NNTP :: on_socket_response (Socket * sock UNUSED, const StringView& line_in)
            }
            std::string host;
            _socket->get_host (host);
-           Log::add_err_va (_("Sending \"%s\" to %s returned an error: %s"),
+           Log::add_err_va (_("Sending “%s” to %s returned an error: %s"),
                             cmd.c_str(),
                             host.c_str(),
                             line.to_string().c_str());
@@ -267,7 +267,7 @@ NNTP :: on_socket_response (Socket * sock UNUSED, const StringView& line_in)
              cmd.resize (cmd.size()-2);
            std::string host;
            _socket->get_host (host);
-           Log::add_err_va (_("Sending \"%s\" to %s returned an unrecognized response: \"%s\""),
+           Log::add_err_va (_("Sending “%s” to %s returned an unrecognized response: “%s”"),
                             _previous_command.c_str(),
                             host.c_str(),
                             line.to_string().c_str());
diff --git a/pan/tasks/socket-impl-gio.cc b/pan/tasks/socket-impl-gio.cc
index 1752319..7c069e2 100644
--- a/pan/tasks/socket-impl-gio.cc
+++ b/pan/tasks/socket-impl-gio.cc
@@ -170,7 +170,7 @@ namespace
       err = ::getaddrinfo (host.c_str(), portbuf, &hints, &ans);
       if (err != 0) {
         char buf[512];
-        snprintf (buf, sizeof(buf), _("Error connecting to \"%s\""), hpbuf);
+        snprintf (buf, sizeof(buf), _("Error connecting to “%s”"), hpbuf);
         setme_err = buf;
         if (errno) {
           setme_err += " (";
@@ -208,7 +208,7 @@ namespace
     // create the giochannel...
     if (sockfd < 0) {
       char buf[512];
-      snprintf (buf, sizeof(buf), _("Error connecting to \"%s\""), hpbuf);
+      snprintf (buf, sizeof(buf), _("Error connecting to “%s”"), hpbuf);
       setme_err = buf;
       if (errno) {
         setme_err += " (";
diff --git a/pan/tasks/socket-impl-openssl.cc b/pan/tasks/socket-impl-openssl.cc
index 8443190..e552c43 100644
--- a/pan/tasks/socket-impl-openssl.cc
+++ b/pan/tasks/socket-impl-openssl.cc
@@ -211,7 +211,7 @@ GIOChannelSocketGnuTLS :: create_channel (const StringView& host_in, int port, s
     err = ::getaddrinfo (host.c_str(), portbuf, &hints, &ans);
     if (err != 0) {
       char buf[512];
-      snprintf (buf, sizeof(buf), _("Error connecting to \"%s\""), hpbuf);
+      snprintf (buf, sizeof(buf), _("Error connecting to “%s”"), hpbuf);
       setme_err = buf;
       if (errno) {
         setme_err += " (";
@@ -249,7 +249,7 @@ GIOChannelSocketGnuTLS :: create_channel (const StringView& host_in, int port, s
   // create the giochannel...
   if (sockfd <= 0) {
     char buf[512];
-    snprintf (buf, sizeof(buf), _("Error connecting to \"%s\""), hpbuf);
+    snprintf (buf, sizeof(buf), _("Error connecting to “%s”"), hpbuf);
     setme_err = buf;
     if (errno) {
       setme_err += " (";
diff --git a/pan/tasks/task-article.cc b/pan/tasks/task-article.cc
index 7be9f16..949dce3 100644
--- a/pan/tasks/task-article.cc
+++ b/pan/tasks/task-article.cc
@@ -323,7 +323,7 @@ TaskArticle :: on_nntp_done  (NNTP             * nntp,
       else { // if none of our servers have this part, but keep going --
              // an incomplete file gives us more PAR2 blocks than a missing one.
         Log :: add_err_va (
-          _("Article \"%s\" is incomplete -- the news server(s) don't have part %s"),
+          _("Article “%s” is incomplete — the news server(s) don’t have part %s"),
           _article.subject.c_str(),
           it->message_id.c_str());
         _needed.erase (it);
diff --git a/pan/tasks/task-groups.cc b/pan/tasks/task-groups.cc
index c206755..d257451 100644
--- a/pan/tasks/task-groups.cc
+++ b/pan/tasks/task-groups.cc
@@ -38,7 +38,7 @@ namespace
   {
     char buf[1024];
     std::string host (data.get_server_address (server));
-    snprintf (buf, sizeof(buf), _("Getting group list from \"%s\""), host.c_str());
+    snprintf (buf, sizeof(buf), _("Getting group list from “%s”"), host.c_str());
     return std::string (buf);
   }
 }
diff --git a/pan/tasks/task-post.cc b/pan/tasks/task-post.cc
index 25cfdf8..985de7e 100644
--- a/pan/tasks/task-post.cc
+++ b/pan/tasks/task-post.cc
@@ -32,7 +32,7 @@ namespace
   std::string get_description (GMimeMessage * message)
   {
     char buf[1024];
-    snprintf (buf, sizeof(buf), _("Posting \"%s\""), g_mime_message_get_subject(message));
+    snprintf (buf, sizeof(buf), _("Posting “%s”"), g_mime_message_get_subject(message));
     return buf;
   }
 }
@@ -73,12 +73,12 @@ TaskPost :: on_nntp_done (NNTP              * nntp,
 
   if (health == ERR_NETWORK || health == ERR_COMMAND)
   {
-    Log :: add_err_va (_("Posting of \"%s\" failed: %s"),
+    Log :: add_err_va (_("Posting of “%s” failed: %s"),
                           res, response.str);
     _state.set_need_nntp (_server);
   }
   else {
-    Log :: add_info_va (_("Posting of \"%s\" successful: %s"),
+    Log :: add_info_va (_("Posting of “%s” successful: %s"),
                           res, response.str);
     _state.set_completed ();
     set_error (response);
diff --git a/pan/tasks/task-upload.cc b/pan/tasks/task-upload.cc
index ff16de1..d0dd556 100644
--- a/pan/tasks/task-upload.cc
+++ b/pan/tasks/task-upload.cc
@@ -241,9 +241,9 @@ TaskUpload :: use_nntp (NNTP * nntp)
     needed->nntp = nntp;
 
     if (_queue_pos != -1)
-      set_status_va (_("Uploading %s - Part %d of %d"), _basename.c_str(), needed->partno, _total_parts);
+      set_status_va (_("Uploading %s — Part %d of %d"), _basename.c_str(), needed->partno, _total_parts);
     else
-      set_status_va (_("Uploading message body with subject \"%s\""), _subject.c_str());
+      set_status_va (_("Uploading message body with subject “%s”"), _subject.c_str());
 
     std::string data;
     if (_queue_pos != -1) _cache.get_data(data,needed->message_id.c_str());
diff --git a/pan/tasks/task-xover.cc b/pan/tasks/task-xover.cc
index f139e11..b694c4a 100644
--- a/pan/tasks/task-xover.cc
+++ b/pan/tasks/task-xover.cc
@@ -80,14 +80,14 @@ namespace
   {
     char buf[1024];
     if (mode == TaskXOver::ALL)
-      snprintf(buf, sizeof(buf), _("Getting all headers for \"%s\""),
+      snprintf(buf, sizeof(buf), _("Getting all headers for “%s”"),
           group.c_str());
     else if (mode == TaskXOver::NEW)
-      snprintf(buf, sizeof(buf), _("Getting new headers for \"%s\""),
+      snprintf(buf, sizeof(buf), _("Getting new headers for “%s”"),
           group.c_str());
     else
       // SAMPLE
-      snprintf(buf, sizeof(buf), _("Sampling headers for \"%s\""),
+      snprintf(buf, sizeof(buf), _("Sampling headers for “%s”"),
           group.c_str());
     return std::string(buf);
   }
@@ -497,7 +497,7 @@ TaskXOver::update_work(bool subtract_one_from_nntp_count)
       _state.set_completed();
       set_finished(OK);
       char str[4096];
-      g_snprintf(str, sizeof(str), _("Getting new headers for \"%s\" done."), _group.c_str());
+      g_snprintf(str, sizeof(str), _("Getting new headers for “%s” done."), _group.c_str());
       verbose (str);
     }
 }
diff --git a/pan/tasks/task-xoverinfo.cc b/pan/tasks/task-xoverinfo.cc
index 5d19e25..9649310 100644
--- a/pan/tasks/task-xoverinfo.cc
+++ b/pan/tasks/task-xoverinfo.cc
@@ -75,7 +75,7 @@ namespace
   std::string get_description (const Quark& group)
   {
     char buf[1024];
-    snprintf (buf, sizeof(buf), _("Getting header counts for \"%s\""), group.c_str());
+    snprintf (buf, sizeof(buf), _("Getting header counts for “%s”"), group.c_str());
     return std::string (buf);
   }
 }
diff --git a/pan/usenet-utils/filter-info.cc b/pan/usenet-utils/filter-info.cc
index 7fd7906..6135c2f 100644
--- a/pan/usenet-utils/filter-info.cc
+++ b/pan/usenet-utils/filter-info.cc
@@ -214,7 +214,7 @@ FilterInfo :: describe () const
 
   if (_type==IS_BINARY && _negate)
   {
-    ret = _("article doesn't have attachments");
+    ret = _("article doesn’t have attachments");
   }
   else if (_type==IS_BINARY)
   {
@@ -222,7 +222,7 @@ FilterInfo :: describe () const
   }
   else if (_type==IS_CACHED && _negate)
   {
-    ret = _("the article isn't cached locally");
+    ret = _("the article isn’t cached locally");
   }
   else if (_type==IS_CACHED)
   {
@@ -230,7 +230,7 @@ FilterInfo :: describe () const
   }
   else if (_type==IS_POSTED_BY_ME && _negate)
   {
-    ret = _("the article wasn't posted by you");
+    ret = _("the article wasn’t posted by you");
   }
   else if (_type==IS_POSTED_BY_ME)
   {
@@ -242,7 +242,7 @@ FilterInfo :: describe () const
   }
   else if (_type==IS_UNREAD)
   {
-    ret = _("the article hasn't been read");
+    ret = _("the article hasn’t been read");
   }
   else if (_type==BYTE_COUNT_GE && _negate)
   {
@@ -286,12 +286,12 @@ FilterInfo :: describe () const
   }
   else if (_type==SCORE_GE && _negate)
   {
-    g_snprintf (buf, sizeof(buf), _("the article's score is less than %ld"), _ge);
+    g_snprintf (buf, sizeof(buf), _("the article’s score is less than %ld"), _ge);
     ret = buf;
   }
   else if (_type==SCORE_GE)
   {
-    g_snprintf (buf, sizeof(buf), _("the article's score is %ld or higher"), _ge);
+    g_snprintf (buf, sizeof(buf), _("the article’s score is %ld or higher"), _ge);
     ret = buf;
   }
   else if (_type==TEXT && _negate)
@@ -300,21 +300,21 @@ FilterInfo :: describe () const
     const char * h (_header.c_str());
     const char * t (_text.get_state().text.c_str());
     switch (_text.get_state().type) {
-      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s doesn't contain \"%s\""), h, t); 
break;
-      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s isn't \"%s\""), h, t); break;
-      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s doesn't begin with \"%s\""), h, t); 
break;
-      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s doesn't end with \"%s\""), h, t); 
break;
-      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s doesn't match the regex \"%s\""), h, 
t); break;
+      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s doesn’t contain “%s”"), h, t); break;
+      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s isn’t “%s”"), h, t); break;
+      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s doesn’t begin with “%s”"), h, t); 
break;
+      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s doesn’t end with “%s”"), h, t); break;
+      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s doesn’t match the regex “%s”"), h, 
t); break;
     }
 #else
     const char * h (_header.c_str());
     const char * t (_text._impl_text.c_str());
     switch (_text._impl_type) {
-      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s doesn't contain \"%s\""), h, t); 
break;
-      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s isn't \"%s\""), h, t); break;
-      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s doesn't begin with \"%s\""), h, t); 
break;
-      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s doesn't end with \"%s\""), h, t); 
break;
-      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s doesn't match the regex \"%s\""), h, 
t); break;
+      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s doesn’t contain “%s”"), h, t); break;
+      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s isn’t “%s”"), h, t); break;
+      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s doesn’t begin with “%s”"), h, t); 
break;
+      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s doesn’t end with “%s”"), h, t); break;
+      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s doesn’t match the regex “%s”"), h, 
t); break;
     }
 #endif
     ret = buf;
@@ -326,11 +326,11 @@ FilterInfo :: describe () const
     //switch (_text.get_state().type) {
     const char * t (_text._impl_text.c_str());
     switch (_text._impl_type) {
-      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s contains \"%s\""), h, t); break;
-      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s is \"%s\""), h, t); break;
-      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s begins with \"%s\""), h, t); break;
-      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s ends with \"%s\""), h, t); break;
-      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s matches the regex \"%s\""), h, t); 
break;
+      case TextMatch::CONTAINS:    g_snprintf (buf, sizeof(buf), _("%s contains “%s”"), h, t); break;
+      case TextMatch::IS:          g_snprintf (buf, sizeof(buf), _("%s is “%s”"), h, t); break;
+      case TextMatch::BEGINS_WITH: g_snprintf (buf, sizeof(buf), _("%s begins with “%s”"), h, t); break;
+      case TextMatch::ENDS_WITH:   g_snprintf (buf, sizeof(buf), _("%s ends with “%s”"), h, t); break;
+      case TextMatch::REGEX:       g_snprintf (buf, sizeof(buf), _("%s matches the regex “%s”"), h, t); 
break;
    }
     ret = buf;
   }
diff --git a/pan/usenet-utils/gnksa.cc b/pan/usenet-utils/gnksa.cc
index 467fc05..c722f86 100644
--- a/pan/usenet-utils/gnksa.cc
+++ b/pan/usenet-utils/gnksa.cc
@@ -877,7 +877,7 @@ GNKSA :: generate_message_id_from_email_address (const StringView& addr)
 
    // fallback to default domain
    if (domain.empty()) {
-      Log::add_info_va (_("No email address provided; generating message-id with domain \"%s\""), 
default_domain);
+      Log::add_info_va (_("No email address provided; generating message-id with domain “%s”"), 
default_domain);
       domain = default_domain;
    }
 
diff --git a/pan/usenet-utils/message-check.cc b/pan/usenet-utils/message-check.cc
index f4c7c88..e98ebee 100644
--- a/pan/usenet-utils/message-check.cc
+++ b/pan/usenet-utils/message-check.cc
@@ -142,7 +142,7 @@ namespace
     if (sig_type == GNKSA::SIG_NONSTANDARD)
     {
       goodness.raise_to_warn ();
-      errors.insert (_("Warning: The signature marker should be \"-- \", not \"--\"."));
+      errors.insert (_("Warning: The signature marker should be “-- ”, not “--”."));
     }
 
     // how wide and long is the signature?
@@ -341,10 +341,10 @@ namespace
       else if (!groups_our_server_has.count (*it)) {
         goodness.raise_to_warn ();
         char * tmp = g_strdup_printf (
-          _("Warning: The posting profile's server doesn't carry newsgroup\n"
-            "\t\"%s\".\n"
-            "\tIf the group name is correct, switch profiles in the \"From:\"\n"
-            "\tline or edit the profile with \"Edit|Manage Posting Profiles\"."), it->c_str());
+          _("Warning: The posting profile’s server doesn’t carry newsgroup\n"
+            "\t“%s”.\n"
+            "\tIf the group name is correct, switch profiles in the “From:”\n"
+            "\tline or edit the profile with “Edit → Manage Posting Profiles”."), it->c_str());
         errors.insert (tmp);
         g_free (tmp);
       }
@@ -380,10 +380,10 @@ namespace
       {
         goodness.raise_to_warn ();
         char * tmp = g_strdup_printf (
-          _("Warning: The posting profile's server doesn't carry newsgroup\n"
-            "\t\"%s\".\n"
-            "\tIf the group name is correct, switch profiles in the \"From:\"\n"
-            "\tline or edit the profile with \"Edit|Manage Posting Profiles\"."), it->c_str());
+          _("Warning: The posting profile’s server doesn’t carry newsgroup\n"
+            "\t“%s”.\n"
+            "\tIf the group name is correct, switch profiles in the “From:”\n"
+            "\tline or edit the profile with “Edit → Manage Posting Profiles”."), it->c_str());
         errors.insert (tmp);
         g_free (tmp);
       }
@@ -392,7 +392,7 @@ namespace
       {
         goodness.raise_to_warn ();
         char buf[1024];
-        g_snprintf (buf, sizeof(buf), _("Warning: Group \"%s\" is read-only."), it->c_str());
+        g_snprintf (buf, sizeof(buf), _("Warning: Group “%s” is read-only."), it->c_str());
         errors.insert (buf);
       }
 #endif
diff --git a/pan/usenet-utils/scorefile.cc b/pan/usenet-utils/scorefile.cc
index 7f52bad..c8e06bd 100644
--- a/pan/usenet-utils/scorefile.cc
+++ b/pan/usenet-utils/scorefile.cc
@@ -301,7 +301,7 @@ Scorefile :: parse_file (ParseContext& context, const StringView& filename)
       line.trim ();
       const int has_expired (has_score_expired (line, context.today));
       if (has_expired < 0)
-        Log::add_err_va (_("Error reading score in %*.*s, line %d: expected 'Expires: MM/DD/YYYY' or 
'Expires: DD-MM-YYYY'."),
+        Log::add_err_va (_("Error reading score in %*.*s, line %d: expected “Expires: MM/DD/YYYY” or 
“Expires: DD-MM-YYYY”."),
           filename.len, filename.len, filename.str, line_number);
       else if (has_expired) {
         Log::add_info_va (_("Expired old score from %*.*s, line %d"),
@@ -426,7 +426,7 @@ Scorefile :: parse_file (const StringView& filename)
     item_count += sit->items.size ();
 
   if (!_sections.empty())
-    Log::add_info_va (_("Read %lu scoring rules in %lu sections from \"%s\""),
+    Log::add_info_va (_("Read %lu scoring rules in %lu sections from “%s”"),
       item_count, _sections.size(), filename.to_string().c_str());
   return 0;
 }
diff --git a/pan/usenet-utils/ssl-utils.h b/pan/usenet-utils/ssl-utils.h
index a97a66a..4690dde 100644
--- a/pan/usenet-utils/ssl-utils.h
+++ b/pan/usenet-utils/ssl-utils.h
@@ -186,7 +186,7 @@ namespace pan
 
     if (!c)
     {
-      g_snprintf(buf,size, _("Error printing the server certificate for '%s'"), server.c_str());
+      g_snprintf(buf,size, _("Error printing the server certificate for “%s”"), server.c_str());
       return;
     }
 
@@ -202,8 +202,8 @@ namespace pan
     char * before = date_maker.get_date_string (t2);
 
     char tmp1[2048], tmp2[2048];
-    g_snprintf(tmp1,sizeof(tmp1), _("The current server <b>'%s'</b> sent this security certificate:\n\n"), 
server.c_str());
-    g_snprintf(tmp2,sizeof(tmp2), _("Certificate information for server <b>'%s'</b>:\n\n"), server.c_str());
+    g_snprintf(tmp1,sizeof(tmp1), _("The current server <b>“%s”</b> sent this security certificate:\n\n"), 
server.c_str());
+    g_snprintf(tmp2,sizeof(tmp2), _("Certificate information for server <b>“%s”</b>:\n\n"), server.c_str());
 
     g_snprintf(buf,size, _("%s"
                            "<b>Issuer information:</b>\n"


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]