diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-12-20 16:02:18 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-12-22 20:08:51 +0100 |
commit | 1c7d3390022908cfbfd30f55e8c0c3b60a045da7 (patch) | |
tree | 07e34f151fbfc0c5ec39b2417f0e86f1e02d5c79 | |
parent | 91d361604781f92640c9727add1e08cde854037e (diff) |
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@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | config_host/config_langs.h.in | 10 | ||||
-rw-r--r-- | config_host/config_vendor.h.in | 10 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | cui/source/options/optgdlg.cxx | 3 | ||||
-rw-r--r-- | desktop/source/app/langselect.cxx | 3 | ||||
-rw-r--r-- | include/svl/languageoptions.hxx | 3 | ||||
-rw-r--r-- | include/svtools/langhelp.hxx | 3 | ||||
-rw-r--r-- | officecfg/registry/data/org/openoffice/Office/Common.xcu | 3 | ||||
-rw-r--r-- | officecfg/registry/schema/org/openoffice/Office/Common.xcs | 6 | ||||
-rw-r--r-- | svl/source/config/languageoptions.cxx | 33 | ||||
-rw-r--r-- | svtools/source/misc/langhelp.cxx | 131 |
11 files changed, 168 insertions, 41 deletions
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: */ |