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>
This commit is contained in:
10
config_host/config_langs.h.in
Normal file
10
config_host/config_langs.h.in
Normal file
@@ -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
|
10
config_host/config_vendor.h.in
Normal file
10
config_host/config_vendor.h.in
Normal file
@@ -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
|
@@ -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])
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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: */
|
||||
|
@@ -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: */
|
||||
|
@@ -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">
|
||||
|
@@ -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>
|
||||
|
@@ -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: */
|
||||
|
@@ -7,12 +7,20 @@
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
|
||||
#include <svtools/langhelp.hxx>
|
||||
|
||||
#include <vcl/svapp.hxx>
|
||||
#include <vcl/settings.hxx>
|
||||
#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 <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: */
|
||||
|
Reference in New Issue
Block a user