#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <libintl.h>
#include <iconv.h>
#include <errno.h>
#include "assertion.h"
#include "i18n.h"
+#include "version.h"
+
#include <localcharset.h>
#include "xstrndup.h"
void
i18n_init (void)
{
- free (default_encoding);
+#if ENABLE_NLS
+ setlocale (LC_CTYPE, "");
+#if HAVE_LC_MESSAGES
+ setlocale (LC_MESSAGES, "");
+#endif
+#if HAVE_LC_PAPER
+ setlocale (LC_PAPER, "");
+#endif
+ bindtextdomain (PACKAGE, locale_dir);
+ textdomain (PACKAGE);
+#endif /* ENABLE_NLS */
+
+ assert (default_encoding == NULL);
default_encoding = strdup (locale_charset ());
hmapx_init (&map);
}
+const char *
+get_default_encoding (void)
+{
+ return default_encoding;
+}
+
+void
+set_default_encoding (const char *enc)
+{
+ free (default_encoding);
+ default_encoding = strdup (enc);
+}
+
+
+/* Attempts to set the encoding from a locale name
+ returns true if successfull.
+ This function does not (should not!) alter the current locale.
+*/
+bool
+set_encoding_from_locale (const char *loc)
+{
+ bool ok = true;
+ char *c_encoding;
+ char *loc_encoding;
+ char *tmp = strdup (setlocale (LC_CTYPE, NULL));
+
+ setlocale (LC_CTYPE, "C");
+ c_encoding = strdup (locale_charset ());
+
+ setlocale (LC_CTYPE, loc);
+ loc_encoding = strdup (locale_charset ());
+
+
+ if ( 0 == strcmp (loc_encoding, c_encoding))
+ {
+ ok = false;
+ }
+
+
+ setlocale (LC_CTYPE, tmp);
+
+ free (tmp);
+
+ if (ok)
+ {
+ free (default_encoding);
+ default_encoding = loc_encoding;
+ }
+ else
+ free (loc_encoding);
+
+ free (c_encoding);
+
+ return ok;
+}
+
void
i18n_done (void)
{
+bool
+valid_encoding (const char *enc)
+{
+ iconv_t conv = iconv_open ("UTF8", enc);
+
+ if ( conv == (iconv_t) -1)
+ return false;
+
+ iconv_close (conv);
+
+ return true;
+}
+
/* Return the system local's idea of the
decimal seperator character */