summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--i18npool/inc/defaultnumberingprovider.hxx2
-rw-r--r--i18npool/inc/nativenumbersupplier.hxx2
-rw-r--r--i18npool/source/calendar/calendar_gregorian.cxx3
-rw-r--r--i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx21
-rw-r--r--i18npool/source/nativenumber/nativenumbersupplier.cxx60
-rw-r--r--svl/qa/unit/svl.cxx13
6 files changed, 77 insertions, 24 deletions
diff --git a/i18npool/inc/defaultnumberingprovider.hxx b/i18npool/inc/defaultnumberingprovider.hxx
index 97608c122000..1320b7e41a73 100644
--- a/i18npool/inc/defaultnumberingprovider.hxx
+++ b/i18npool/inc/defaultnumberingprovider.hxx
@@ -25,7 +25,6 @@
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/i18n/XTransliteration.hpp>
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
-#include <com/sun/star/i18n/CharacterClassification.hpp>
#include <cppuhelper/implbase.hxx>
#include <rtl/ref.hxx>
@@ -81,7 +80,6 @@ private:
OUString makeNumberingIdentifier( sal_Int16 index );
/// @throws css::uno::RuntimeException
bool isScriptFlagEnabled(const OUString& aName );
- mutable css::uno::Reference< css::i18n::XCharacterClassification > xCharClass;
};
}
diff --git a/i18npool/inc/nativenumbersupplier.hxx b/i18npool/inc/nativenumbersupplier.hxx
index d17c39fe7490..067a590b441a 100644
--- a/i18npool/inc/nativenumbersupplier.hxx
+++ b/i18npool/inc/nativenumbersupplier.hxx
@@ -24,6 +24,7 @@
#include <com/sun/star/i18n/NativeNumberXmlAttributes.hpp>
#include <cppuhelper/implbase.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/i18n/CharacterClassification.hpp>
namespace i18npool {
@@ -76,6 +77,7 @@ public:
private:
css::lang::Locale aLocale;
bool useOffset;
+ mutable css::uno::Reference< css::i18n::XCharacterClassification > xCharClass;
};
}
diff --git a/i18npool/source/calendar/calendar_gregorian.cxx b/i18npool/source/calendar/calendar_gregorian.cxx
index 9d8a4c1442d3..a4ac0acfe53d 100644
--- a/i18npool/source/calendar/calendar_gregorian.cxx
+++ b/i18npool/source/calendar/calendar_gregorian.cxx
@@ -935,7 +935,8 @@ Calendar_gregorian::getDisplayStringImpl( sal_Int32 nCalendarDisplayCode, sal_In
}
aOUStr = OUString::createFromAscii(aStr);
}
- if (nNativeNumberMode > 0) {
+ // NatNum12 used only for selected parts
+ if (nNativeNumberMode > 0 && nNativeNumberMode != 12) {
// For Japanese calendar, first year calls GAN, see bug 111668 for detail.
if (eraArray == gengou_eraArray && value == 1
&& (nCalendarDisplayCode == CalendarDisplayCode::SHORT_YEAR ||
diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
index d363407c19fe..99cf26fe60cb 100644
--- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
+++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
@@ -584,7 +584,6 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
sal_Int16 tableSize = 0;
const sal_Unicode *table = nullptr; // initialize to avoid compiler warning
bool bRecycleSymbol = false;
- bool bCapitalize = false;
OUString sNatNumParams;
Locale locale;
@@ -638,21 +637,18 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
break;
case TEXT_NUMBER: // ordinal indicators (1st, 2nd, 3rd, ...)
natNum = NativeNumberMode::NATNUM12;
- sNatNumParams = "ordinal-number";
+ sNatNumParams = "capitalize ordinal-number";
locale = aLocale;
- bCapitalize = true;
break;
case TEXT_CARDINAL: // cardinal number names (One, Two, Three, ...)
natNum = NativeNumberMode::NATNUM12;
- sNatNumParams = "cardinal";
+ sNatNumParams = "capitalize";
locale = aLocale;
- bCapitalize = true;
break;
case TEXT_ORDINAL: // ordinal number names (First, Second, Third, ...)
natNum = NativeNumberMode::NATNUM12;
- sNatNumParams = "ordinal";
+ sNatNumParams = "capitalize ordinal";
locale = aLocale;
- bCapitalize = true;
break;
case ROMAN_UPPER:
result += toRoman( number );
@@ -913,17 +909,8 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
if (natNum) {
rtl::Reference<NativeNumberSupplierService> xNatNum(new NativeNumberSupplierService);
- OUString aNum = xNatNum->getNativeNumberStringParams(OUString::number(number), locale,
+ result += xNatNum->getNativeNumberStringParams(OUString::number(number), locale,
natNum, sNatNumParams);
- if (bCapitalize)
- {
- if (!xCharClass.is())
- xCharClass = CharacterClassification::create(m_xContext);
- // capitalize first letter
- result += xCharClass->toTitle(aNum, 0, 1, aLocale) + aNum.copy(1);
- }
- else
- result += aNum;
} else if (tableSize) {
if ( number > tableSize && !bRecycleSymbol)
result += OUString::number( number);
diff --git a/i18npool/source/nativenumber/nativenumbersupplier.cxx b/i18npool/source/nativenumber/nativenumbersupplier.cxx
index b8cc35dcfef4..d9bff101a08c 100644
--- a/i18npool/source/nativenumber/nativenumbersupplier.cxx
+++ b/i18npool/source/nativenumber/nativenumbersupplier.cxx
@@ -597,7 +597,7 @@ OUString getNumberText(const Locale& rLocale, const OUString& rNumberString,
= css::linguistic2::NumberText::create(comphelper::getProcessComponentContext());
OUString numbertext_prefix;
// default "cardinal" gets empty prefix
- if (sNumberTextParams != "cardinal")
+ if (!sNumberTextParams.isEmpty() && sNumberTextParams != "cardinal")
numbertext_prefix = sNumberTextParams + " ";
// Several hundreds of headings could result typing lags because
// of the continuous update of the multiple number names during typing.
@@ -628,7 +628,63 @@ OUString NativeNumberSupplierService::getNativeNumberString(const OUString& aNum
return aNumberString;
if (nNativeNumberMode == NativeNumberMode::NATNUM12)
- return getNumberText(rLocale, aNumberString, rNativeNumberParams);
+ {
+ // handle capitalization prefixes "capitalize", "upper" and "title"
+
+ enum WhichCasing
+ {
+ CAPITALIZE,
+ UPPER,
+ TITLE
+ };
+
+ struct CasingEntry
+ {
+ OUStringLiteral aLiteral;
+ WhichCasing eCasing;
+ };
+
+ static const CasingEntry Casings[] =
+ {
+ { OUStringLiteral("capitalize"), CAPITALIZE },
+ { OUStringLiteral("upper"), UPPER },
+ { OUStringLiteral("title"), TITLE }
+ };
+
+ sal_Int32 nStripCase = 0;
+ size_t nCasing;
+ for (nCasing = 0; nCasing < SAL_N_ELEMENTS(Casings); ++nCasing)
+ {
+ if (rNativeNumberParams.startsWith( Casings[nCasing].aLiteral))
+ {
+ nStripCase = Casings[nCasing].aLiteral.size;
+ break;
+ }
+ }
+
+ if (nStripCase > 0 && (rNativeNumberParams.getLength() == nStripCase ||
+ rNativeNumberParams[nStripCase++] == ' '))
+ {
+ OUString aStr = getNumberText(rLocale, aNumberString, rNativeNumberParams.copy(nStripCase));
+
+ if (!xCharClass.is())
+ xCharClass = CharacterClassification::create(comphelper::getProcessComponentContext());
+
+ switch (Casings[nCasing].eCasing)
+ {
+ case CAPITALIZE:
+ return xCharClass->toTitle(aStr, 0, 1, aLocale) + aStr.copy(1);
+ case UPPER:
+ return xCharClass->toUpper(aStr, 0, aStr.getLength(), aLocale);
+ case TITLE:
+ return xCharClass->toTitle(aStr, 0, aStr.getLength(), aLocale);
+ }
+ }
+ else
+ {
+ return getNumberText(rLocale, aNumberString, rNativeNumberParams);
+ }
+ }
sal_Int16 langnum = getLanguageNumber(rLocale);
if (langnum == -1)
diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx
index 26b2f6a41588..7f0c54a2547e 100644
--- a/svl/qa/unit/svl.cxx
+++ b/svl/qa/unit/svl.cxx
@@ -1394,14 +1394,23 @@ void Test::testUserDefinedNumberFormats()
sCode = "[NatNum12 ordinal-number]0";
sExpected = "123rd";
checkPreviewString(aFormatter, sCode, 123, eLang, sExpected);
+ sCode = "[NatNum12 capitalize]0";
+ sExpected = "One hundred twenty-three";
+ checkPreviewString(aFormatter, sCode, 123, eLang, sExpected);
+ sCode = "[NatNum12 title ordinal]0";
+ sExpected = "One Thousand Two Hundred Thirty-Fourth";
+ checkPreviewString(aFormatter, sCode, 1234, eLang, sExpected);
+ sCode = "[NatNum12 upper ordinal-number]0";
+ sExpected = "12345TH";
+ checkPreviewString(aFormatter, sCode, 12345, eLang, sExpected);
sCode = "[NatNum12 D=ordinal-number]D\" of \"MMMM";
sExpected = "2nd of January";
checkPreviewString(aFormatter, sCode, M_PI, eLang, sExpected);
sCode = "[NatNum12 D=ordinal-number,YYYY=year]D\" of \"MMMM\", \"YYYY";
sExpected = "2nd of January, nineteen hundred";
checkPreviewString(aFormatter, sCode, M_PI, eLang, sExpected);
- sCode = "[NatNum12 YYYY=year, D=ordinal]D\" of \"MMMM\", \"YYYY";
- sExpected = "second of January, nineteen hundred";
+ sCode = "[NatNum12 YYYY=title year, D=capitalize ordinal]D\" of \"MMMM\", \"YYYY";
+ sExpected = "Second of January, Nineteen Hundred";
checkPreviewString(aFormatter, sCode, M_PI, eLang, sExpected);
#endif
}