writerfilter/source/dmapper/DomainMapper.cxx |   24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

New commits:
commit 23f17b7ea6fbd2f422c7e40192ae60e4df25224c
Author:     Eike Rathke <er...@redhat.com>
AuthorDate: Sat Aug 14 23:32:39 2021 +0200
Commit:     Eike Rathke <er...@redhat.com>
CommitDate: Sun Aug 15 01:46:08 2021 +0200

    Resolves: tdf#137742 Workaround cheesy Google Docs writing language-only 
tags
    
    Change-Id: I2dc85abb70d53769d2e36102070e30ed71e8d888
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120495
    Reviewed-by: Eike Rathke <er...@redhat.com>
    Tested-by: Jenkins

diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index b74ee3d02daf..ac63dc699fd2 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -666,7 +666,29 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
                 m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "val", 
sStringValue);
             else if (nName == NS_ooxml::LN_CT_Language_bidi)
                 m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "bidi", 
sStringValue);
-            lang::Locale aLocale( LanguageTag::convertToLocale( sStringValue));
+            lang::Locale aLocale;
+            if (sStringValue.getLength() <= 3 && sStringValue.getLength() >= 1)
+            {
+                // Cheesy Google Docs is known to tag language-only even for
+                // "en" or others that need some region to distinguish language
+                // variants for spell-checker and hyphenation. Obtain our known
+                // fallback to clarify and match. The original value/context is
+                // unknown anyway.
+                LanguageTag aLanguageTag( sStringValue);
+                aLanguageTag.makeFallback();
+                if (aLanguageTag.getLanguage() == sStringValue)
+                    aLocale = aLanguageTag.getLocale();
+                else
+                {
+                    // Do not fallback for an unknown language, which usually
+                    // results in "en-US", or any other non-matching case.
+                    aLocale = LanguageTag::convertToLocale( sStringValue);
+                }
+            }
+            else
+            {
+                aLocale = LanguageTag::convertToLocale( sStringValue);
+            }
             if (m_pImpl->GetTopContext())
                 
m_pImpl->GetTopContext()->Insert(NS_ooxml::LN_CT_Language_val== nName ? 
PROP_CHAR_LOCALE :
                              NS_ooxml::LN_CT_Language_eastAsia == nName ? 
PROP_CHAR_LOCALE_ASIAN : PROP_CHAR_LOCALE_COMPLEX,

Reply via email to