summaryrefslogtreecommitdiffstats
path: root/common/localename.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--common/localename.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/common/localename.c b/common/localename.c
new file mode 100644
index 0000000..b620a74
--- /dev/null
+++ b/common/localename.c
@@ -0,0 +1,127 @@
+/* localename.c - Determine the current selected locale.
+ * Copyright (C) 1995-1999, 2000-2003, 2007,
+ * 2008 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
+ *
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, see <https://www.gnu.org/licenses/>.
+ */
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995. */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>. */
+/* Modified for GpgOL use by Werner Koch <wk@gnupg.org>, 2005. */
+/* Modified for GnuPG use by Werner Koch <wk@gnupg.org>, 2007 */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#include <gpg-error.h> /* We need gettext_localename for W32. */
+
+#include "../common/w32help.h"
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+ "Directs 'setlocale()' to query 'category' and return the current
+ setting of 'local'."
+ However it does not specify the exact format. Neither do SUSV2 and
+ ISO C 99. So we can use this feature only on selected systems (e.g.
+ those using GNU C Library). */
+#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Use a dummy value for LC_MESSAGES in case it is not defined. This
+ works because we always test for HAVE_LC_MESSAGES and the core
+ function takes the category as a string as well. */
+#ifndef HAVE_LC_MESSAGES
+#define LC_MESSAGES 0
+#endif
+
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+ language[_territory[.codeset]][@modifier]
+ The codeset part in the result is not reliable; the locale_charset()
+ should be used for codeset information instead.
+ The result must not be freed; it is statically allocated. */
+
+#ifndef HAVE_W32_SYSTEM
+static const char *
+do_nl_locale_name (int category, const char *categoryname)
+{
+ const char *retval;
+
+ /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+ On some systems this can be done by the 'setlocale' function itself. */
+# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ (void)categoryname;
+ retval = setlocale (category, NULL);
+# else
+ (void)category;
+ /* Setting of LC_ALL overwrites all other. */
+ retval = getenv ("LC_ALL");
+ if (retval == NULL || retval[0] == '\0')
+ {
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval == NULL || retval[0] == '\0')
+ {
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval == NULL || retval[0] == '\0')
+ /* We use C as the default domain. POSIX says this is
+ implementation defined. */
+ retval = "C";
+ }
+ }
+# endif
+
+ return retval;
+}
+#endif /* HAVE_W32_SYSTEM */
+
+
+
+/* Return the locale used for translatable messages. The standard C
+ and POSIX are locale names are mapped to an empty string. If a
+ locale can't be found an empty string will be returned. */
+const char *
+gnupg_messages_locale_name (void)
+{
+ const char *s;
+
+#ifdef HAVE_W32_SYSTEM
+ /* We use the localename function libgpg-error. */
+ s = gettext_localename ();
+#else
+ s = do_nl_locale_name (LC_MESSAGES, "LC_MESSAGES");
+#endif
+ if (!s)
+ s = "";
+ else if (!strcmp (s, "C") || !strcmp (s, "POSIX"))
+ s = "";
+
+ return s;
+}