diff options
-rw-r--r-- | i18npool/source/textconversion/textconversionImpl.cxx | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/i18npool/source/textconversion/textconversionImpl.cxx b/i18npool/source/textconversion/textconversionImpl.cxx index 2c3a0c9a8cca..b143ca9d9680 100644 --- a/i18npool/source/textconversion/textconversionImpl.cxx +++ b/i18npool/source/textconversion/textconversionImpl.cxx @@ -20,6 +20,8 @@ #include <assert.h> #include <textconversionImpl.hxx> +#include <localedata.hxx> +#include <i18nlangtag/languagetag.hxx> using namespace com::sun::star::lang; using namespace com::sun::star::uno; @@ -85,21 +87,21 @@ TextConversionImpl::getLocaleSpecificTextConversion(const Locale& rLocale) throw if (rLocale != aLocale) { aLocale = rLocale; + OUString aPrefix("com.sun.star.i18n.TextConversion_"); Reference < XInterface > xI; xI = m_xContext->getServiceManager()->createInstanceWithContext( - OUString("com.sun.star.i18n.TextConversion_") + aLocale.Language, m_xContext); - - if ( ! xI.is() ) - xI = m_xContext->getServiceManager()->createInstanceWithContext( - OUString("com.sun.star.i18n.TextConversion_") + aLocale.Language + - OUString("_") + aLocale.Country, m_xContext); - if ( ! xI.is() ) - xI = m_xContext->getServiceManager()->createInstanceWithContext( - OUString("com.sun.star.i18n.TextConversion_") + aLocale.Language + - OUString("_") + aLocale.Country + - OUString("_") + aLocale.Variant, m_xContext); - + aPrefix + LocaleDataImpl::getFirstLocaleServiceName( aLocale), m_xContext); + if (!xI.is()) + { + ::std::vector< OUString > aFallbacks( LocaleDataImpl::getFallbackLocaleServiceNames( aLocale)); + for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it) + { + xI = m_xContext->getServiceManager()->createInstanceWithContext( aPrefix + *it, m_xContext); + if (xI.is()) + break; + } + } if (xI.is()) xTC.set( xI, UNO_QUERY ); else if (xTC.is()) |