i18nlangtag/source/languagetag/languagetag.cxx | 45 +++++++++++++++++++++ include/i18nlangtag/languagetag.hxx | 31 +++++++++++++- scripting/Library_stringresource.mk | 1 scripting/source/stringresource/stringresource.cxx | 31 ++++---------- 4 files changed, 85 insertions(+), 23 deletions(-)
New commits: commit 38522416bd6a85f206b8c294726dd2e3d6a63567 Author: Eike Rathke <er...@redhat.com> Date: Thu Jul 11 17:41:59 2013 +0200 use LanguageTag::getMatchingFallback() Change-Id: Ib6fd9581728bdd7c32ccec9ce538d9b4c5658b04 diff --git a/scripting/Library_stringresource.mk b/scripting/Library_stringresource.mk index bd59637..daa6386 100644 --- a/scripting/Library_stringresource.mk +++ b/scripting/Library_stringresource.mk @@ -25,6 +25,7 @@ $(eval $(call gb_Library_use_libraries,stringresource,\ cppuhelper \ sal \ tl \ + i18nlangtag \ $(gb_UWINAPI) \ )) diff --git a/scripting/source/stringresource/stringresource.cxx b/scripting/source/stringresource/stringresource.cxx index c5c8b91..7a80699 100644 --- a/scripting/source/stringresource/stringresource.cxx +++ b/scripting/source/stringresource/stringresource.cxx @@ -36,6 +36,7 @@ #include <rtl/ustrbuf.hxx> #include <rtl/strbuf.hxx> #include <tools/urlobj.hxx> +#include <i18nlangtag/languagetag.hxx> using namespace ::com::sun::star; using namespace ::com::sun::star::lang; @@ -679,33 +680,21 @@ LocaleItem* StringResourceImpl::getItemForLocale return pRetItem; } -// Returns the LocalItem for a given locale, if it exists, otherwise NULL -// This method performes a closest match search, at least the language must match +// Returns the LocaleItem for a given locale, if it exists, otherwise NULL. +// This method performs a closest match search, at least the language must match. LocaleItem* StringResourceImpl::getClosestMatchItemForLocale( const Locale& locale ) { LocaleItem* pRetItem = NULL; - // Search for locale - for( sal_Int32 iPass = 0 ; iPass <= 2 ; ++iPass ) + ::std::vector< Locale > aLocales( m_aLocaleItemVector.size()); + for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); ++it ) { - for( LocaleItemVectorConstIt it = m_aLocaleItemVector.begin(); it != m_aLocaleItemVector.end(); ++it ) - { - LocaleItem* pLocaleItem = *it; - if( pLocaleItem ) - { - Locale& cmp_locale = pLocaleItem->m_locale; - if( cmp_locale.Language == locale.Language && - (iPass > 1 || cmp_locale.Country == locale.Country) && - (iPass > 0 || cmp_locale.Variant == locale.Variant) ) - { - pRetItem = pLocaleItem; - break; - } - } - } - if( pRetItem ) - break; + LocaleItem* pLocaleItem = *it; + aLocales.push_back( pLocaleItem ? pLocaleItem->m_locale : Locale()); } + ::std::vector< Locale >::const_iterator iFound( LanguageTag::getMatchingFallback( aLocales, locale)); + if (iFound != aLocales.end()) + pRetItem = *(m_aLocaleItemVector.begin() + (iFound - aLocales.begin())); return pRetItem; } commit 00de85cc75e3501a5597c2f293407b1b76fef429 Author: Eike Rathke <er...@redhat.com> Date: Thu Jul 11 16:46:20 2013 +0200 added getMatchingFallback() Change-Id: I5805ab98049bd7dfd8ca1b58632f6c0115197bdd diff --git a/i18nlangtag/source/languagetag/languagetag.cxx b/i18nlangtag/source/languagetag/languagetag.cxx index 13e25f8..4aefa79 100644 --- a/i18nlangtag/source/languagetag/languagetag.cxx +++ b/i18nlangtag/source/languagetag/languagetag.cxx @@ -1312,4 +1312,49 @@ LanguageTag::Extraction LanguageTag::simpleExtract( const OUString& rBcp47, } +// static +::std::vector< com::sun::star::lang::Locale >::const_iterator LanguageTag::getMatchingFallback( + const ::std::vector< com::sun::star::lang::Locale > & rList, + const com::sun::star::lang::Locale & rReference ) +{ + if (rList.empty()) + return rList.end(); + + ::std::vector< lang::Locale >::const_iterator it; + + // Try the simple case first without constructing fallbacks. + for (it = rList.begin(); it != rList.end(); ++it) + { + if ( (*it).Language == rReference.Language && + (*it).Country == rReference.Country && + (*it).Variant == rReference.Variant) + return it; // exact match + } + + // Now for each reference fallback test the fallbacks of the list in order. + ::std::vector< OUString > aFallbacks( LanguageTag( rReference).getFallbackStrings()); + aFallbacks.erase( aFallbacks.begin()); // first is full BCP47, we already checked that + ::std::vector< ::std::vector< OUString > > aListFallbacks( rList.size()); + for (it = rList.begin(); it != rList.end(); ++it) + { + ::std::vector< OUString > aTmp( LanguageTag( *it).getFallbackStrings()); + aListFallbacks.push_back( aTmp); + } + for (::std::vector< OUString >::const_iterator rfb( aFallbacks.begin()); rfb != aFallbacks.end(); ++rfb) + { + for (::std::vector< ::std::vector< OUString > >::const_iterator lfb( aListFallbacks.begin()); + lfb != aListFallbacks.end(); ++lfb) + { + for (::std::vector< OUString >::const_iterator fb( (*lfb).begin()); fb != (*lfb).end(); ++fb) + { + if (*rfb == *fb) + return rList.begin() + (lfb - aListFallbacks.begin()); + } + } + } + + // No match found. + return rList.end(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/i18nlangtag/languagetag.hxx b/include/i18nlangtag/languagetag.hxx index d779f9d..bbda176 100644 --- a/include/i18nlangtag/languagetag.hxx +++ b/include/i18nlangtag/languagetag.hxx @@ -273,7 +273,7 @@ public: ::std::vector< OUString > getFallbackStrings() const; - /** @short search for an equal or at least for a similar locale in a list + /** @short Search for an equal or at least for a similar locale in a list of possible ones. @descr First search for a locale that is equal to the reference @@ -306,12 +306,39 @@ public: @return An iterator that points to the found element inside the given locale list. If no matching locale could be found it points to - the end of the list. + the beginning of the list. */ static ::std::vector< OUString >::const_iterator getFallback( const ::std::vector< OUString > & rList, const OUString & rReference ); + /** @short Search for an equal or for a similar locale in a list + of possible ones where at least the language matches. + + @descr First search for a locale that is equal to the reference + locale. + + If the reference locale could not be located, check for + "similar" locales, in the same order as obtained by + getFallbackStrings(). + + If no locale matches, rList.end() is returned. + + @param rList + the vector of possible locales. + + @param rReference + the reference locale. + + @return An iterator that points to the found element inside the given + locale list. If no matching locale could be found it points to + the end of the list. + */ + static ::std::vector< com::sun::star::lang::Locale >::const_iterator getMatchingFallback( + const ::std::vector< com::sun::star::lang::Locale > & rList, + const com::sun::star::lang::Locale & rReference ); + + /** Test equality of two LanguageTag, possibly resolving system locale. @param bResolveSystem _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits