[Libreoffice-commits] core.git: config_host/config_langs.h.in config_host/config_vendor.h.in configure.ac cui/source desktop/source include/svl include/svtools officecfg/registry svl/source svtools/source

Caolán McNamara caolanm at redhat.com
Fri Dec 22 19:09:17 UTC 2017


 config_host/config_langs.h.in                              |   10 
 config_host/config_vendor.h.in                             |   10 
 configure.ac                                               |    4 
 cui/source/options/optgdlg.cxx                             |    3 
 desktop/source/app/langselect.cxx                          |    3 
 include/svl/languageoptions.hxx                            |    3 
 include/svtools/langhelp.hxx                               |    3 
 officecfg/registry/data/org/openoffice/Office/Common.xcu   |    3 
 officecfg/registry/schema/org/openoffice/Office/Common.xcs |    6 
 svl/source/config/languageoptions.cxx                      |   33 ---
 svtools/source/misc/langhelp.cxx                           |  131 ++++++++++++-
 11 files changed, 168 insertions(+), 41 deletions(-)

New commits:
commit 1c7d3390022908cfbfd30f55e8c0c3b60a045da7
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Dec 20 16:02:18 2017 +0000

    request installation of langpack via packagekit
    
    if ui is set to track the locale automatically and the current locale
    has no match in installed resources but has a match in the list of
    languages that libreoffice was compiled to contain
    
    so e.g. de_AT locale shouldn't trigger the installation of anything if
    langpack-de is already installed and yue_HK shouldn't trigger install
    of anything cause that not supported (at time of writing) for libreoffice
    
    put Fedora/RHEL/Ubuntu naming schemes in here.
    
    I moved the lang code from svl to svtools so I could use the restart dialog
    to prompt to restart after the langpack is installed, but packagekit's blocking
    mode seems to be no longer blocking and control returns immediately which is a
    change since the last time I played with this stuff, so drop the restart thing
    for now. The lack of a blocking modal also makes the "run this on idle when there's
    a toplevel window up and running" a bit futile, but lets keep that for now anyway.
    
    caolanm->rene: I know you'd disable this anyway, so Debian is left out, there's
    also config key Office/Common/PackageKit/EnableLangpackInstallation to disable
    this too.
    
    Change-Id: Ice731be539850338ccdd8af87839e0b4d83f01e7
    Reviewed-on: https://gerrit.libreoffice.org/46856
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/config_host/config_langs.h.in b/config_host/config_langs.h.in
new file mode 100644
index 000000000000..d60a5c168420
--- /dev/null
+++ b/config_host/config_langs.h.in
@@ -0,0 +1,10 @@
+/* Configuration of restriction on supported ui languages, by the
+ * --with-lang option.
+ */
+
+#ifndef CONFIG_LANGS_H
+#define CONFIG_LANGS_H
+
+#define WITH_LANG ""
+
+#endif
diff --git a/config_host/config_vendor.h.in b/config_host/config_vendor.h.in
new file mode 100644
index 000000000000..32602210c36b
--- /dev/null
+++ b/config_host/config_vendor.h.in
@@ -0,0 +1,10 @@
+/* Configuration of restriction on supported ui languages, by the
+ * --with-lang option.
+ */
+
+#ifndef CONFIG_VENDOR_H
+#define CONFIG_VENDOR_H
+
+#define OOO_VENDOR ""
+
+#endif
diff --git a/configure.ac b/configure.ac
index f3bd86698cda..f0eb940fbae2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -11710,6 +11710,7 @@ if test "$enable_release_build" = "" -o "$enable_release_build" = "no"; then
     ALL_LANGS=`echo $ALL_LANGS qtz`
 fi
 AC_SUBST(ALL_LANGS)
+AC_DEFINE_UNQUOTED(WITH_LANG,"$WITH_LANG")
 AC_SUBST(WITH_LANG)
 AC_SUBST(WITH_LANG_LIST)
 AC_SUBST(GIT_NEEDED_SUBMODULES)
@@ -11858,6 +11859,7 @@ else
     OOO_VENDOR="$with_vendor"
     AC_MSG_RESULT([$OOO_VENDOR])
 fi
+AC_DEFINE_UNQUOTED(OOO_VENDOR,"$OOO_VENDOR")
 AC_SUBST(OOO_VENDOR)
 
 if test "$_os" = "Android" ; then
@@ -12471,6 +12473,7 @@ AC_CONFIG_HEADERS([config_host/config_gio.h])
 AC_CONFIG_HEADERS([config_host/config_global.h])
 AC_CONFIG_HEADERS([config_host/config_gpgme.h])
 AC_CONFIG_HEADERS([config_host/config_java.h])
+AC_CONFIG_HEADERS([config_host/config_langs.h])
 AC_CONFIG_HEADERS([config_host/config_lgpl.h])
 AC_CONFIG_HEADERS([config_host/config_libcxx.h])
 AC_CONFIG_HEADERS([config_host/config_liblangtag.h])
@@ -12483,6 +12486,7 @@ AC_CONFIG_HEADERS([config_host/config_options.h])
 AC_CONFIG_HEADERS([config_host/config_options_calc.h])
 AC_CONFIG_HEADERS([config_host/config_test.h])
 AC_CONFIG_HEADERS([config_host/config_typesizes.h])
+AC_CONFIG_HEADERS([config_host/config_vendor.h])
 AC_CONFIG_HEADERS([config_host/config_vcl.h])
 AC_CONFIG_HEADERS([config_host/config_vclplug.h])
 AC_CONFIG_HEADERS([config_host/config_version.h])
diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx
index 1c90931c7afb..7965179fa72d 100644
--- a/cui/source/options/optgdlg.cxx
+++ b/cui/source/options/optgdlg.cxx
@@ -21,6 +21,7 @@
 #include <svl/zforlist.hxx>
 #include <svl/currencytable.hxx>
 #include <svtools/grfmgr.hxx>
+#include <svtools/langhelp.hxx>
 #include <svl/flagitem.hxx>
 #include <sfx2/dispatch.hxx>
 #include <unotools/lingucfg.hxx>
@@ -1122,7 +1123,7 @@ namespace
     LanguageTag GetInstalledLocaleForSystemUILanguage()
     {
         css::uno::Sequence<OUString> inst(officecfg::Setup::Office::InstalledLocales::get()->getElementNames());
-        return LanguageTag(getInstalledLocaleForSystemUILanguage(inst)).makeFallback();
+        return LanguageTag(getInstalledLocaleForSystemUILanguage(inst, false)).makeFallback();
     }
 }
 
diff --git a/desktop/source/app/langselect.cxx b/desktop/source/app/langselect.cxx
index 4ce877a3d926..86ce7434e6ab 100644
--- a/desktop/source/app/langselect.cxx
+++ b/desktop/source/app/langselect.cxx
@@ -37,6 +37,7 @@
 #include <sal/log.hxx>
 #include <sal/types.h>
 #include <svl/languageoptions.hxx>
+#include <svtools/langhelp.hxx>
 
 #include <app.hxx>
 
@@ -103,7 +104,7 @@ bool prepareLocale() {
         }
     }
     if (locale.isEmpty()) {
-        locale = getInstalledLocaleForSystemUILanguage(inst);
+        locale = getInstalledLocaleForSystemUILanguage(inst, true);
     }
     if (locale.isEmpty()) {
         return false;
diff --git a/include/svl/languageoptions.hxx b/include/svl/languageoptions.hxx
index f386cb6b0e00..6de8eb566c5b 100644
--- a/include/svl/languageoptions.hxx
+++ b/include/svl/languageoptions.hxx
@@ -131,9 +131,6 @@ public:
     bool            isCJKKeyboardLayoutInstalled() const;
 };
 
-OUString SVL_DLLPUBLIC getInstalledLocaleForLanguage(css::uno::Sequence<OUString> const & installed, OUString const & locale);
-OUString SVL_DLLPUBLIC getInstalledLocaleForSystemUILanguage(css::uno::Sequence<OUString> const & installed);
-
 #endif // INCLUDED_SVL_LANGUAGEOPTIONS_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svtools/langhelp.hxx b/include/svtools/langhelp.hxx
index a3a84df0477f..db22bb368367 100644
--- a/include/svtools/langhelp.hxx
+++ b/include/svtools/langhelp.hxx
@@ -22,6 +22,9 @@
  */
 SVT_DLLPUBLIC void localizeWebserviceURI( OUString& io_rURI );
 
+OUString SVT_DLLPUBLIC getInstalledLocaleForLanguage(css::uno::Sequence<OUString> const & installed, OUString const & locale);
+OUString SVT_DLLPUBLIC getInstalledLocaleForSystemUILanguage(css::uno::Sequence<OUString> const & installed, bool bRequestInstallIfMissing);
+
 #endif
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/officecfg/registry/data/org/openoffice/Office/Common.xcu b/officecfg/registry/data/org/openoffice/Office/Common.xcu
index 6b94ff9be853..26d1ba053a1e 100644
--- a/officecfg/registry/data/org/openoffice/Office/Common.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Common.xcu
@@ -535,6 +535,9 @@
       <prop oor:name="EnableFontInstallation" oor:type="xs:boolean">
         <value install:module="unx">true</value>
       </prop>
+      <prop oor:name="EnableLangpackInstallation" oor:type="xs:boolean">
+        <value install:module="unx">true</value>
+      </prop>
   </node>
   <node oor:name="Classification">
       <prop oor:name="Policy" oor:type="xs:short">
diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
index f9816fc7dfb6..2884179d0800 100644
--- a/officecfg/registry/schema/org/openoffice/Office/Common.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
@@ -6382,6 +6382,12 @@
         </info>
         <value>true</value>
       </prop>
+      <prop oor:name="EnableLangpackInstallation" oor:type="xs:boolean" oor:nillable="false">
+        <info>
+           <desc>Specifies if missing langpack installation should be triggered.</desc>
+        </info>
+        <value>true</value>
+      </prop>
     </group>
     <group oor:name="Classification">
       <info>
diff --git a/svl/source/config/languageoptions.cxx b/svl/source/config/languageoptions.cxx
index 9f9fe4513819..74af0313c775 100644
--- a/svl/source/config/languageoptions.cxx
+++ b/svl/source/config/languageoptions.cxx
@@ -27,7 +27,6 @@
 #include <rtl/instance.hxx>
 #include <com/sun/star/i18n/ScriptType.hpp>
 #include <unotools/syslocale.hxx>
-#include <officecfg/System.hxx>
 
 #ifdef _WIN32
 #if !defined WIN32_LEAN_AND_MEAN
@@ -256,41 +255,9 @@ bool SvtSystemLanguageOptions::isKeyboardLayoutTypeInstalled(sal_Int16 scriptTyp
     return isInstalled;
 }
 
-
 bool SvtSystemLanguageOptions::isCJKKeyboardLayoutInstalled() const
 {
     return isKeyboardLayoutTypeInstalled(css::i18n::ScriptType::ASIAN);
 }
 
-OUString getInstalledLocaleForLanguage(css::uno::Sequence<OUString> const & installed, OUString const & locale)
-{
-    if (locale.isEmpty())
-        return OUString();  // do not attempt to resolve anything
-
-    for (sal_Int32 i = 0; i != installed.getLength(); ++i) {
-        if (installed[i] == locale) {
-            return installed[i];
-        }
-    }
-    std::vector<OUString> fallbacks(LanguageTag(locale).getFallbackStrings(false));
-    for (OUString & rf : fallbacks) {
-        for (sal_Int32 i = 0; i != installed.getLength(); ++i) {
-            if (installed[i] == rf) {
-                return installed[i];
-            }
-        }
-    }
-    return OUString();
-}
-
-OUString getInstalledLocaleForSystemUILanguage(const css::uno::Sequence<OUString>& rLocaleElementNames)
-{
-    OUString locale = getInstalledLocaleForLanguage(rLocaleElementNames, officecfg::System::L10N::UILocale::get());
-    if (locale.isEmpty())
-        locale = getInstalledLocaleForLanguage(rLocaleElementNames, "en-US");
-    if (locale.isEmpty() && rLocaleElementNames.hasElements())
-        locale = rLocaleElementNames[0];
-    return locale;
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/misc/langhelp.cxx b/svtools/source/misc/langhelp.cxx
index 16a3a1d8191c..47cb87e36963 100644
--- a/svtools/source/misc/langhelp.cxx
+++ b/svtools/source/misc/langhelp.cxx
@@ -7,12 +7,20 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-
+#include <comphelper/sequence.hxx>
+#include <i18nlangtag/mslangid.hxx>
+#include <officecfg/Office/Common.hxx>
+#include <officecfg/System.hxx>
+#include <org/freedesktop/PackageKit/SyncDbusSessionHelper.hpp>
+#include <rtl/ustring.hxx>
 #include <svtools/langhelp.hxx>
-
+#include <vcl/idle.hxx>
 #include <vcl/svapp.hxx>
+#include <vcl/sysdata.hxx>
 #include <vcl/settings.hxx>
-#include <rtl/ustring.hxx>
+#include <vcl/window.hxx>
+#include <config_langs.h>
+#include <config_vendor.h>
 
 void localizeWebserviceURI( OUString& rURI )
 {
@@ -33,4 +41,121 @@ void localizeWebserviceURI( OUString& rURI )
     rURI += aLang;
 }
 
+OUString getInstalledLocaleForLanguage(css::uno::Sequence<OUString> const & installed, OUString const & locale)
+{
+    if (locale.isEmpty())
+        return OUString();  // do not attempt to resolve anything
+
+    for (sal_Int32 i = 0; i != installed.getLength(); ++i) {
+        if (installed[i] == locale) {
+            return installed[i];
+        }
+    }
+    std::vector<OUString> fallbacks(LanguageTag(locale).getFallbackStrings(false));
+    for (OUString & rf : fallbacks) {
+        for (sal_Int32 i = 0; i != installed.getLength(); ++i) {
+            if (installed[i] == rf) {
+                return installed[i];
+            }
+        }
+    }
+    return OUString();
+}
+
+static std::unique_ptr<Idle> xLangpackInstaller;
+
+class InstallLangpack : public Idle
+{
+    std::vector<OUString> m_aPackages;
+public:
+    explicit InstallLangpack(const std::vector<OUString>& rPackages)
+        : Idle("install langpack")
+        , m_aPackages(rPackages)
+    {
+        SetPriority(TaskPriority::LOWEST);
+    }
+
+    virtual void Invoke() override
+    {
+        vcl::Window* pTopWindow = Application::GetActiveTopWindow();
+        if (!pTopWindow)
+            pTopWindow = Application::GetFirstTopLevelWindow();
+        if (!pTopWindow)
+        {
+            Start();
+            return;
+        }
+        try
+        {
+            using namespace org::freedesktop::PackageKit;
+            css::uno::Reference<XSyncDbusSessionHelper> xSyncDbusSessionHelper(SyncDbusSessionHelper::create(comphelper::getProcessComponentContext()));
+            const SystemEnvData* pEnvData = pTopWindow->GetSystemData();
+            sal_uInt32 nDbusId = pEnvData ? GetDbusId(*pEnvData) : 0;
+            xSyncDbusSessionHelper->InstallPackageNames(nDbusId, comphelper::containerToSequence(m_aPackages), OUString());
+        }
+        catch (const css::uno::Exception& e)
+        {
+            SAL_INFO("svl", "trying to install a LibreOffice langpack, caught " << e);
+        }
+        xLangpackInstaller.reset();
+    }
+};
+
+OUString getInstalledLocaleForSystemUILanguage(const css::uno::Sequence<OUString>& rLocaleElementNames, bool bRequestInstallIfMissing)
+{
+    OUString wantedLocale = officecfg::System::L10N::UILocale::get();
+    OUString locale = getInstalledLocaleForLanguage(rLocaleElementNames, wantedLocale);
+    if (bRequestInstallIfMissing && locale.isEmpty() && !wantedLocale.isEmpty() && !Application::IsHeadlessModeEnabled() &&
+        officecfg::Office::Common::PackageKit::EnableLangpackInstallation::get())
+    {
+        LanguageTag aWantedTag(wantedLocale);
+        if (aWantedTag.getLanguage() != "en")
+        {
+            // Get the list of langpacks that this build was configured to include
+            std::vector<OUString> aPackages;
+            OUString sAvailableLocales(WITH_LANG);
+            std::vector<OUString> aAvailable;
+            sal_Int32 nIndex = 0;
+            do
+            {
+                aAvailable.emplace_back(sAvailableLocales.getToken(0, ' ', nIndex));
+            }
+            while (nIndex >= 0);
+            // See which one matches the desired ui locale
+            OUString install = getInstalledLocaleForLanguage(comphelper::containerToSequence(aAvailable), wantedLocale);
+            if (!install.isEmpty() && install != "en-US")
+            {
+                OUString sVendor(OOO_VENDOR);
+                if (sVendor == "Red Hat, Inc." || sVendor == "The Fedora Project")
+                {
+                    // langpack is the typical Fedora/RHEL naming convention
+                    LanguageType eType = aWantedTag.getLanguageType();
+                    if (MsLangId::isSimplifiedChinese(eType))
+                        aPackages.emplace_back("libreoffice-langpack-zh-Hans");
+                    else if (MsLangId::isTraditionalChinese(eType))
+                        aPackages.emplace_back("libreoffice-langpack-zh-Hant");
+                    else
+                        aPackages.emplace_back("libreoffice-langpack-" + install);
+                }
+                //Debian would be: "The Document Foundation/Debian"
+                else if (sVendor == "The Document Foundation, Debian and Ubuntu")
+                {
+                    // l10n is the typical Debian/Ubuntu naming convention
+                    aPackages.emplace_back("libreoffice-l10n-" + install);
+                }
+            }
+            if (!aPackages.empty())
+            {
+                xLangpackInstaller.reset(new InstallLangpack(aPackages));
+                xLangpackInstaller->Start();
+            }
+        }
+    }
+    if (locale.isEmpty())
+        locale = getInstalledLocaleForLanguage(rLocaleElementNames, "en-US");
+    if (locale.isEmpty() && rLocaleElementNames.hasElements())
+        locale = rLocaleElementNames[0];
+    return locale;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list