diff options
author | László Németh <nemeth@numbertext.org> | 2018-02-20 11:38:24 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2018-05-03 11:42:20 +0200 |
commit | f1579d3d6c5f5f3a651825e035b93bee7a4f43c6 (patch) | |
tree | 302e93db63f5029f521a0dba446e2c7b91d08a10 /sw | |
parent | f5a56c367fba1c42b4f9719b10ff3e86ad5e2ab1 (diff) |
tdf#117171 support localized number name numbering styles
in page number, chapter and outline numbering
in ~30 languages by integrating libnumbertext library.
- offapi: add linguistic2::NumberText
New NumberingType constants:
- ordinal indicators (1st, 2nd, 3rd...)
- cardinal number names (One, Two, Three...)
- ordinal number names (First, Second, Third...)
Note: these numberings are parts of OOXML, too.
Plain text files of Libnumbertext's language data
are installed in share/numbertext (similar to
share/fingerprint), allowing further customization.
Change-Id: I4034da0a40a8c926f14a3f591749a89a8d807d5a
Reviewed-on: https://gerrit.libreoffice.org/53313
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/numrule.hxx | 4 | ||||
-rw-r--r-- | sw/qa/extras/odfexport/data/spellout-numberingtypes.odt | bin | 0 -> 10093 bytes | |||
-rw-r--r-- | sw/qa/extras/odfexport/odfexport.cxx | 26 | ||||
-rw-r--r-- | sw/source/core/doc/number.cxx | 7 | ||||
-rw-r--r-- | sw/source/core/txtnode/ndtxt.cxx | 4 |
5 files changed, 37 insertions, 4 deletions
diff --git a/sw/inc/numrule.hxx b/sw/inc/numrule.hxx index 7d5bc9f4a374..fe6476a93fde 100644 --- a/sw/inc/numrule.hxx +++ b/sw/inc/numrule.hxx @@ -22,6 +22,7 @@ #include <sal/types.h> #include <rtl/ustring.hxx> #include <editeng/numitem.hxx> +#include <i18nlangtag/lang.h> #include "swdllapi.h" #include "swtypes.hxx" #include "calbck.hxx" @@ -166,7 +167,8 @@ public: const bool bInclStrings = true, const bool bOnlyArabic = false, const unsigned int _nRestrictToThisLevel = MAXLEVEL, - Extremities* pExtremities = nullptr ) const; + Extremities* pExtremities = nullptr, + LanguageType nLang = LANGUAGE_SYSTEM) const; OUString MakeRefNumString( const SwNodeNum& rNodeNum, const bool bInclSuperiorNumLabels, const int nRestrictInclToThisLevel ) const; diff --git a/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt Binary files differnew file mode 100644 index 000000000000..194920b5d91b --- /dev/null +++ b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index d1d544ea22e5..c2da82ffcaa3 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -1981,6 +1981,32 @@ DECLARE_ODFEXPORT_TEST(testChapterNumberingNewLine, "chapter-number-new-line.odt sal_Int16(SvxNumberFormat::NEWLINE), hashMap["LabelFollowedBy"].get<sal_Int16>()); } +DECLARE_ODFEXPORT_TEST(testSpellOutNumberingTypes, "spellout-numberingtypes.odt") +{ + // ordinal indicator, ordinal and cardinal number numbering styles (from LibreOffice 6.1) + const char* aFieldTexts[] = { "1st", "First", "One" }; + // fallback for old platforms without std::codecvt and std::regex supports + const char* aFieldTextFallbacks[] = { "Ordinal-number 1", "Ordinal 1", "1" }; + uno::Reference<text::XTextFieldsSupplier> xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + // update text field content + uno::Reference<util::XRefreshable>(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY)->refresh(); + + uno::Reference<container::XEnumerationAccess> xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference<container::XEnumeration> xFields(xFieldsAccess->createEnumeration()); + + for (sal_uInt32 i = 0; i < SAL_N_ELEMENTS(aFieldTexts); i++) + { + uno::Any aField = xFields->nextElement(); + uno::Reference<lang::XServiceInfo> xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.PageNumber")) + { + uno::Reference<text::XTextContent> xField(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, OUString::fromUtf8(aFieldTexts[i]).equals(xField->getAnchor()->getString()) || + OUString::fromUtf8(aFieldTextFallbacks[i]).equals(xField->getAnchor()->getString())); + } + } +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/doc/number.cxx b/sw/source/core/doc/number.cxx index 2b7047b57535..a4bb0ab1e7eb 100644 --- a/sw/source/core/doc/number.cxx +++ b/sw/source/core/doc/number.cxx @@ -621,7 +621,8 @@ OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVecto const bool bInclStrings, const bool bOnlyArabic, const unsigned int _nRestrictToThisLevel, - SwNumRule::Extremities* pExtremities ) const + SwNumRule::Extremities* pExtremities, + LanguageType nLang ) const { OUString aStr; @@ -657,6 +658,8 @@ OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVecto } } + css::lang::Locale aLocale( LanguageTag::convertToLocale(nLang)); + for( ; i <= nLevel; ++i ) { const SwNumFormat& rNFormat = Get( i ); @@ -673,7 +676,7 @@ OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVecto if( bOnlyArabic ) aStr += OUString::number( rNumVector[ i ] ); else - aStr += rNFormat.GetNumStr( rNumVector[ i ] ); + aStr += rNFormat.GetNumStr( rNumVector[ i ], aLocale ); } else aStr += "0"; // all 0 level are a 0 diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index 3ef80bd0d93f..93f753645c41 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -2779,7 +2779,9 @@ OUString SwTextNode::GetNumString( const bool _bInclPrefixAndSuffixStrings, return pRule->MakeNumString( GetNum()->GetNumberVector(), _bInclPrefixAndSuffixStrings, false, - _nRestrictToThisLevel ); + _nRestrictToThisLevel, + nullptr, + GetLang(0)); } } |