Kaydet (Commit) 1c7d3390 authored tarafından Caolán McNamara's avatar Caolán McNamara

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/46856Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 91d36160
/* Configuration of restriction on supported ui languages, by the
* --with-lang option.
*/
#ifndef CONFIG_LANGS_H
#define CONFIG_LANGS_H
#define WITH_LANG ""
#endif
/* 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 <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: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment