add support for LC_TIME and LC_MESSAGES translations
authorRich Felker <dalias@aerifal.cx>
Sat, 26 Jul 2014 09:36:25 +0000 (05:36 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 26 Jul 2014 09:36:25 +0000 (05:36 -0400)
for LC_MESSAGES, translation of strerror and similar literal message
functions is supported. for messages in other places (particularly the
dynamic linker) that use format strings, translation is not yet
supported. in order to make it possible and safe, such messages will
need to be refactored to separate the textual content from the format.

for LC_TIME, the day and month names and strftime-style format strings
provided by nl_langinfo are supported for translation. however there
may be limitations, as some of the original C-locale nl_langinfo
strings are non-unique and thus perhaps non-suitable as keys.

overall, the locale support activated by this commit should not be
seen as complete and polished but as a basis for beginning to test
locale functionality and implement locales.

src/errno/strerror.c
src/locale/langinfo.c
src/locale/strerror_l.c [deleted file]
src/network/gai_strerror.c
src/network/hstrerror.c
src/regex/regerror.c
src/string/strsignal.c

index b5559cbe3312f18a78b519c9eff6d7ca6cbf408b..24c94d3742d4ed013dea3ef5625bfc03fd189a05 100644 (file)
@@ -1,5 +1,7 @@
 #include <errno.h>
 #include <string.h>
+#include "locale_impl.h"
+#include "libc.h"
 
 #define E(a,b) ((unsigned char)a),
 static const unsigned char errid[] = {
@@ -12,7 +14,7 @@ static const char errmsg[] =
 #include "__strerror.h"
 ;
 
-char *strerror(int e)
+char *__strerror_l(int e, locale_t loc)
 {
        const char *s;
        int i;
@@ -24,5 +26,12 @@ char *strerror(int e)
        }
        for (i=0; errid[i] && errid[i] != e; i++);
        for (s=errmsg; i; s++, i--) for (; *s; s++);
-       return (char *)s;
+       return (char *)LCTRANS(s, LC_MESSAGES, loc);
+}
+
+char *strerror(int e)
+{
+       return __strerror_l(e, CURRENT_LOCALE);
 }
+
+weak_alias(__strerror_l, strerror_l);
index aa0e8de6c49836885b36e08a68316a72479661a3..a1ada246ba35dee556e535d5b990c492febe636f 100644 (file)
@@ -57,6 +57,7 @@ char *__nl_langinfo_l(nl_item item, locale_t loc)
        }
 
        for (; idx; idx--, str++) for (; *str; str++);
+       if (cat != LC_NUMERIC && *str) str = LCTRANS(str, cat, loc);
        return (char *)str;
 }
 
diff --git a/src/locale/strerror_l.c b/src/locale/strerror_l.c
deleted file mode 100644 (file)
index 765f5c6..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <string.h>
-#include <locale.h>
-
-char *strerror_l(int err, locale_t l)
-{
-       return strerror(err);
-}
index 0bf3e37978412019b2ca57d4e76fa23efec9781c..9596580e9ffbda7a2e46465ab0f91256db5c51a9 100644 (file)
@@ -1,4 +1,5 @@
 #include <netdb.h>
+#include "locale_impl.h"
 
 static const char msgs[] =
        "Invalid flags\0"
@@ -19,5 +20,6 @@ const char *gai_strerror(int ecode)
 {
        const char *s;
        for (s=msgs, ecode++; ecode && *s; ecode++, s++) for (; *s; s++);
-       return *s ? s : s+1;
+       if (!*s) s++;
+       return LCTRANS_CUR(s);
 }
index b7a6ab6ce74d4b2686ca080fc32da9b207a00f3e..a4d001c53410a0faeee07d5e7e93ec62a917d027 100644 (file)
@@ -1,5 +1,6 @@
 #define _GNU_SOURCE
 #include <netdb.h>
+#include "locale_impl.h"
 
 static const char msgs[] =
        "Host not found\0"
@@ -12,5 +13,6 @@ const char *hstrerror(int ecode)
 {
        const char *s;
        for (s=msgs, ecode--; ecode && *s; ecode--, s++) for (; *s; s++);
-       return *s ? s : s+1;
+       if (!*s) s++;
+       return LCTRANS_CUR(s);
 }
index df4afa4f22a6792b04570526999623f68e7d137e..5b347cc73c7351b72ec40efa4901818751da7019 100644 (file)
@@ -1,6 +1,7 @@
 #include <string.h>
 #include <regex.h>
 #include <stdio.h>
+#include "locale_impl.h"
 
 /* Error message strings for error codes listed in `regex.h'.  This list
    needs to be in sync with the codes listed there, naturally. */
@@ -31,5 +32,6 @@ size_t regerror(int e, const regex_t *restrict preg, char *restrict buf, size_t
        const char *s;
        for (s=messages; e && *s; e--, s+=strlen(s)+1);
        if (!*s) s++;
+       s = LCTRANS_CUR(s);
        return 1+snprintf(buf, size, "%s", s);
 }
index 905c0956184e096c360059dfc1dcc39c1cc596f5..96bfe841ff3f65fb7524624c39d8eabd97b8df87 100644 (file)
@@ -1,5 +1,6 @@
 #include <signal.h>
 #include <string.h>
+#include "locale_impl.h"
 
 #if (SIGHUP == 1) && (SIGINT == 2) && (SIGQUIT == 3) && (SIGILL == 4) \
  && (SIGTRAP == 5) && (SIGABRT == 6) && (SIGBUS == 7) && (SIGFPE == 8) \
@@ -104,12 +105,12 @@ static const char strings[] =
 
 char *strsignal(int signum)
 {
-       char *s = (char *)strings;
+       const char *s = strings;
 
        signum = sigmap(signum);
        if (signum - 1U >= _NSIG-1) signum = 0;
 
        for (; signum--; s++) for (; *s; s++);
 
-       return s;
+       return (char *)LCTRANS_CUR(s);
 }