summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2018-02-20 11:38:24 +0100
committerLászló Németh <nemeth@numbertext.org>2018-05-03 11:42:20 +0200
commitf1579d3d6c5f5f3a651825e035b93bee7a4f43c6 (patch)
tree302e93db63f5029f521a0dba446e2c7b91d08a10 /sw
parentf5a56c367fba1c42b4f9719b10ff3e86ad5e2ab1 (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.hxx4
-rw-r--r--sw/qa/extras/odfexport/data/spellout-numberingtypes.odtbin0 -> 10093 bytes
-rw-r--r--sw/qa/extras/odfexport/odfexport.cxx26
-rw-r--r--sw/source/core/doc/number.cxx7
-rw-r--r--sw/source/core/txtnode/ndtxt.cxx4
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
new file mode 100644
index 000000000000..194920b5d91b
--- /dev/null
+++ b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt
Binary files differ
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));
}
}