From 12cdbeb96a97dd3690073cb955c002b4e7adf16d Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sun, 9 Jul 2000 15:46:46 +0000 Subject: [PATCH] The old behavior of quoting `like this' doesn't look good with newer, ISO-style fonts. See: http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html Instead, quote "like this" by default. Let the translator tailor the locale-specific quoting behavior by providing translations for {LEFT QUOTATION MARK} and {RIGHT QUOTATION MARK}. (N_): New macro. (gettext_default): New function. (quotearg_buffer_restyled): Use gettext_default ("{LEFT QUOTATION MARK}", "\"") for left quote, and gettext_default ("{RIGHT QUOTATION MARK}", "\"") for right quote. --- lib/quotearg.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/lib/quotearg.c b/lib/quotearg.c index 111b1c1aa3..7ccb7599d7 100644 --- a/lib/quotearg.c +++ b/lib/quotearg.c @@ -33,6 +33,7 @@ #else # define _(text) text #endif +#define N_(text) text #if HAVE_LIMITS_H # include @@ -174,6 +175,15 @@ set_char_quoting (struct quoting_options *o, char c, int i) return r; } +/* Return the translation of MSGID if there is one, and + DEFAULT_TRANSLATION otherwise. */ +static char const * +gettext_default (char const *msgid, char const *default_translation) +{ + char const *translation = _(msgid); + return translation == msgid ? default_translation : translation; +} + /* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of argument ARG (of size ARGSIZE), using QUOTING_STYLE and the non-quoting-style part of O to control quoting. @@ -222,11 +232,36 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize, break; case locale_quoting_style: - for (quote_string = _("`"); *quote_string; quote_string++) - STORE (*quote_string); - backslash_escapes = 1; - quote_string = _("'"); - quote_string_len = strlen (quote_string); + { + /* Get translations for open and closing quotation marks. + + The message catalog should translate "{LEFT QUOTATION + MARK}" to a left quotation mark suitable for the locale, + and similarly for "{RIGHT QUOTATION MARK}". If the catalog + has no translation, the code below uses a neutral + (vertical) quotation mark instead, as it is the most + appropriate for the C locale. + + For example, an American English Unicode locale should + translate the string "{LEFT QUOTATION MARK}" to the + character U+201C (LEFT DOUBLE QUOTATION MARK), and should + translate the string "{RIGHT QUOTATION MARK}" to the + character U+201D (RIGHT DOUBLE QUOTATION MARK). A British + English Unicode locale should instead translate these to + U+2018 (LEFT SINGLE QUOTATION MARK) and U+2019 (RIGHT + SINGLE QUOTATION MARK), respectively. */ + + static char const quotation_mark[] = "\""; + char const *left = gettext_default (N_("{LEFT QUOTATION MARK}"), + quotation_mark); + char const *right = gettext_default (N_("{RIGHT QUOTATION MARK}"), + quotation_mark); + for (quote_string = left; *quote_string; quote_string++) + STORE (*quote_string); + backslash_escapes = 1; + quote_string = right; + quote_string_len = strlen (quote_string); + } break; case shell_always_quoting_style: @@ -481,7 +516,7 @@ quotearg_buffer (char *buffer, size_t buffersize, OPTIONS specifies the quoting options. The returned value points to static storage that can be reused by the next call to this function with the same value of N. - N must be nonnegative. N is deliberately declared with type `int' + N must be nonnegative. N is deliberately declared with type "int" to allow for future extensions (using negative values). */ static char * quotearg_n_options (int n, char const *arg, -- 2.30.2