summaryrefslogtreecommitdiff
path: root/i18nlangtag/source/isolang/inunx.cxx
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-04-05 18:40:39 +0200
committerEike Rathke <erack@redhat.com>2013-04-05 19:10:48 +0200
commit876c619b944dfbc88464045f1400c549a01a1164 (patch)
treef15f930fe100bda4c0a0503728654801ac977fcd /i18nlangtag/source/isolang/inunx.cxx
parent8ef9e38aa84675c57b331a796d900b3c10e04f44 (diff)
new module i18nlangtag
Moved portions from module i18npool, all of former i18nisolang1 library that now is i18nlangtag. Included are languagetag, isolang and mslangid. This i18nlangtag code is now even used by module comphelper, so disentangling i18npool and making this an own module was needed to not create circular module dependencies. Change-Id: Ib887c3d6dde667403fd22d382310ba5f1a9b0015
Diffstat (limited to 'i18nlangtag/source/isolang/inunx.cxx')
-rw-r--r--i18nlangtag/source/isolang/inunx.cxx139
1 files changed, 139 insertions, 0 deletions
diff --git a/i18nlangtag/source/isolang/inunx.cxx b/i18nlangtag/source/isolang/inunx.cxx
new file mode 100644
index 000000000000..f47bfa4b67c2
--- /dev/null
+++ b/i18nlangtag/source/isolang/inunx.cxx
@@ -0,0 +1,139 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <stdlib.h> // for getenv()
+#include <stdio.h>
+
+#ifdef MACOSX
+#include <osl/process.h>
+#include <rtl/locale.h>
+#include <rtl/ustring.hxx>
+
+#else // MACOSX
+#include <rtl/string.hxx>
+
+#endif // MACOSX
+#include <rtl/instance.hxx>
+#include "i18nlangtag/languagetag.hxx"
+#include "i18nlangtag/mslangid.hxx"
+
+// =======================================================================
+
+static LanguageType nImplSystemLanguage = LANGUAGE_DONTKNOW;
+static LanguageType nImplSystemUILanguage = LANGUAGE_DONTKNOW;
+
+// -----------------------------------------------------------------------
+
+// Get locale of category LC_CTYPE of environment variables
+static const sal_Char* getLangFromEnvironment()
+{
+ static const sal_Char* pFallback = "C";
+ const sal_Char *pLang = NULL;
+
+ pLang = getenv ( "LC_ALL" );
+ if (! pLang || pLang[0] == 0)
+ pLang = getenv ( "LC_CTYPE" );
+ if (! pLang || pLang[0] == 0)
+ pLang = getenv( "LANG" );
+ if (! pLang || pLang[0] == 0)
+ pLang = pFallback;
+
+ return pLang;
+}
+
+// -----------------------------------------------------------------------
+
+// Get locale of category LC_MESSAGES of environment variables
+static const sal_Char* getUILangFromEnvironment()
+{
+ static const sal_Char* pFallback = "C";
+ const sal_Char *pLang = NULL;
+
+ pLang = getenv ( "LANGUAGE" ); // respect the GNU extension
+ if (! pLang || pLang[0] == 0)
+ pLang = getenv ( "LC_ALL" );
+ if (! pLang || pLang[0] == 0)
+ pLang = getenv ( "LC_MESSAGES" );
+ if (! pLang || pLang[0] == 0)
+ pLang = getenv( "LANG" );
+ if (! pLang || pLang[0] == 0)
+ pLang = pFallback;
+
+ return pLang;
+}
+
+// -----------------------------------------------------------------------
+
+typedef const sal_Char * (*getLangFromEnv)();
+
+static void getPlatformSystemLanguageImpl( LanguageType& rSystemLanguage,
+ getLangFromEnv pGetLangFromEnv )
+{
+ /* get the language from the user environment */
+ LanguageType nLang = rSystemLanguage;
+ if ( nLang == LANGUAGE_DONTKNOW )
+ {
+ ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex());
+ nLang = rSystemLanguage;
+ if ( nLang == LANGUAGE_DONTKNOW )
+ {
+#ifdef MACOSX
+ rtl_Locale *procLocale;
+ (void) pGetLangFromEnv; /* unused */
+
+ if ( osl_getProcessLocale(&procLocale) == osl_Process_E_None )
+ {
+ nLang = LanguageTag( *procLocale ).getLanguageType();
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ rSystemLanguage = nLang;
+#ifdef DEBUG
+ if ( rSystemLanguage == LANGUAGE_DONTKNOW )
+ fprintf( stderr, "intnunx.cxx: failed to convert osl_getProcessLocale() language to system language.\n" );
+#endif
+ }
+#else /* MACOSX */
+ rtl::OString aUnxLang( (pGetLangFromEnv)() );
+ nLang = MsLangId::convertUnxByteStringToLanguage( aUnxLang );
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ rSystemLanguage = nLang;
+#endif /* MACOSX */
+ }
+ else {
+ OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+LanguageType MsLangId::getPlatformSystemLanguage()
+{
+ getPlatformSystemLanguageImpl( nImplSystemLanguage, &getLangFromEnvironment);
+ return nImplSystemLanguage;
+}
+
+// -----------------------------------------------------------------------
+
+LanguageType MsLangId::getPlatformSystemUILanguage()
+{
+ getPlatformSystemLanguageImpl( nImplSystemUILanguage, &getUILangFromEnvironment);
+ return nImplSystemUILanguage;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */