From 087ee66013916bd009eb0b29460ef1868b4d755c Mon Sep 17 00:00:00 2001 From: Eike Rathke Date: Fri, 23 Aug 2013 22:27:14 +0200 Subject: encapsulate IsoLangEntry again Change-Id: I66475eb3914b07b4c7a045e295ef77a5de9439d4 --- i18nlangtag/qa/cppunit/test_languagetag.cxx | 23 +++++++++--------- i18nlangtag/source/isolang/isolang.cxx | 37 +++++++++++++++++++---------- include/i18nlangtag/mslangid.hxx | 24 +++++++------------ rsc/source/parser/rscibas.cxx | 10 ++++---- 4 files changed, 49 insertions(+), 45 deletions(-) diff --git a/i18nlangtag/qa/cppunit/test_languagetag.cxx b/i18nlangtag/qa/cppunit/test_languagetag.cxx index c64d199fc0e4..838f69b21a24 100644 --- a/i18nlangtag/qa/cppunit/test_languagetag.cxx +++ b/i18nlangtag/qa/cppunit/test_languagetag.cxx @@ -299,25 +299,24 @@ void TestLanguageTag::testAllTags() void TestLanguageTag::testAllIsoLangEntries() { - const MsLangId::IsoLangEntry* pLangEntry; - sal_Int32 nIndex = 0; - while (((pLangEntry = MsLangId::getIsoLangEntry( nIndex++ )) != NULL) && (pLangEntry->mnLang != LANGUAGE_DONTKNOW)) + const ::std::vector< MsLangId::LanguagetagMapping > aList( MsLangId::getDefinedLanguagetags()); + for (::std::vector< MsLangId::LanguagetagMapping >::const_iterator it( aList.begin()); it != aList.end(); ++it) { - LanguageTag aTagString( pLangEntry->getTagString(), true); - LanguageTag aTagID( pLangEntry->mnLang); - if (pLangEntry->getTagString() != aTagString.getBcp47()) + LanguageTag aTagString( (*it).maBcp47, true); + LanguageTag aTagID( (*it).mnLang); + if ((*it).maBcp47 != aTagString.getBcp47()) { - OString aMessage( OUStringToOString( pLangEntry->getTagString(), RTL_TEXTENCODING_ASCII_US)); + OString aMessage( OUStringToOString( (*it).maBcp47, RTL_TEXTENCODING_ASCII_US)); aMessage += " -> " + OUStringToOString( aTagString.getBcp47(), RTL_TEXTENCODING_ASCII_US); - CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), pLangEntry->getTagString() == aTagString.getBcp47()); + CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), (*it).maBcp47 == aTagString.getBcp47()); } - if (pLangEntry->getTagString() != aTagID.getBcp47()) + if ((*it).maBcp47 != aTagID.getBcp47()) { // There are multiple mappings, ID must be equal after conversions. LanguageTag aTagBack( aTagID.getBcp47(), true); if (aTagString.getLanguageType() != aTagBack.getLanguageType()) { - OString aMessage( OUStringToOString( pLangEntry->getTagString(), RTL_TEXTENCODING_ASCII_US)); + OString aMessage( OUStringToOString( (*it).maBcp47, RTL_TEXTENCODING_ASCII_US)); aMessage += " " + OString::number( aTagString.getLanguageType(), 16) + " -> " + OString::number( aTagBack.getLanguageType(), 16); CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagString.getLanguageType() == aTagBack.getLanguageType()); @@ -327,13 +326,13 @@ void TestLanguageTag::testAllIsoLangEntries() // This does not hold, there are cases like 'ar' // LANGUAGE_ARABIC_PRIMARY_ONLY that when mapped back results in // 'ar-SA' as default locale. - if (pLangEntry->mnLang != aTagString.getLanguageType()) + if ((*it).mnLang != aTagString.getLanguageType()) { // There are multiple mappings, string must be equal after conversions. LanguageTag aTagBack( aTagString.getLanguageType()); if (aTagID.getBcp47() != aTagBack.getBcp47()) { - OString aMessage( OUStringToOString( pLangEntry->getTagString(), RTL_TEXTENCODING_ASCII_US)); + OString aMessage( OUStringToOString( (*it).maBcp47, RTL_TEXTENCODING_ASCII_US)); aMessage += " " + OUStringToOString( aTagID.getBcp47(), RTL_TEXTENCODING_ASCII_US) + " -> " + OUStringToOString( aTagBack.getBcp47(), RTL_TEXTENCODING_ASCII_US); CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagID.getBcp47() == aTagBack.getBcp47()); diff --git a/i18nlangtag/source/isolang/isolang.cxx b/i18nlangtag/source/isolang/isolang.cxx index 26ad88fbbe6e..037354868f93 100644 --- a/i18nlangtag/source/isolang/isolang.cxx +++ b/i18nlangtag/source/isolang/isolang.cxx @@ -27,6 +27,16 @@ // ======================================================================= +struct IsoLangEntry +{ + LanguageType mnLang; + sal_Char maLangStr[4]; + sal_Char maCountry[3]; + + /** Obtain a language tag string with '-' separator. */ + OUString getTagString() const; +}; + struct IsoLangEngEntry { LanguageType mnLang; @@ -89,7 +99,7 @@ struct IsoLangOtherEntry * LANGUAGE_AZERI LANGUAGE_URDU LANGUAGE_KASHMIRI */ -static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = +static IsoLangEntry const aImplIsoLangEntries[] = { // MS-LANGID codes ISO639-1/2/3 ISO3166 { LANGUAGE_ENGLISH, "en", "" }, @@ -524,10 +534,10 @@ static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = { LANGUAGE_DONTKNOW, "", "" } // marks end of table }; -static MsLangId::IsoLangEntry aLastResortFallbackEntry = +static IsoLangEntry aLastResortFallbackEntry = { LANGUAGE_ENGLISH_US, "en", "US" }; -OUString MsLangId::IsoLangEntry::getTagString() const +OUString IsoLangEntry::getTagString() const { if (maCountry[0]) return OUString( OUString::createFromAscii( maLangStr) + "-" + OUString::createFromAscii( maCountry)); @@ -695,7 +705,7 @@ void MsLangId::Conversion::convertLanguageToLocaleImpl( LanguageType nLang, // ----------------------------------------------------------------------- -static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry( +static const IsoLangEntry & lcl_lookupFallbackEntry( const ::com::sun::star::lang::Locale & rLocale ) { // language is lower case in table @@ -705,8 +715,8 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry( sal_Int32 nCountryLen = aUpperCountry.getLength(); // Search for locale and remember first lang-only. - const MsLangId::IsoLangEntry* pFirstLang = NULL; - const MsLangId::IsoLangEntry* pEntry = aImplIsoLangEntries; + const IsoLangEntry* pFirstLang = NULL; + const IsoLangEntry* pEntry = aImplIsoLangEntries; do { if (aLowerLang.equalsAscii( pEntry->maLangStr)) @@ -762,7 +772,7 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry( ::com::sun::star::lang::Locale MsLangId::Conversion::lookupFallbackLocale( const ::com::sun::star::lang::Locale & rLocale ) { - const MsLangId::IsoLangEntry& rEntry = lcl_lookupFallbackEntry( rLocale); + const IsoLangEntry& rEntry = lcl_lookupFallbackEntry( rLocale); return ::com::sun::star::lang::Locale( OUString::createFromAscii( rEntry.maLangStr), OUString::createFromAscii( rEntry.maCountry), @@ -985,15 +995,16 @@ LanguageType MsLangId::convertUnxByteStringToLanguage( return Conversion::convertIsoNamesToLanguage( aLang, aCountry ); } -// ----------------------------------------------------------------------- -// pass one IsoLangEntry to the outer world of the resource compiler // static -const MsLangId::IsoLangEntry* MsLangId::getIsoLangEntry( size_t nIndex ) +::std::vector< MsLangId::LanguagetagMapping > MsLangId::getDefinedLanguagetags() { - if (nIndex < SAL_N_ELEMENTS(aImplIsoLangEntries)) - return &aImplIsoLangEntries[ nIndex]; - return 0; + ::std::vector< LanguagetagMapping > aVec; + for (const IsoLangEntry* pEntry = aImplIsoLangEntries; pEntry->mnLang != LANGUAGE_DONTKNOW; ++pEntry) + { + aVec.push_back( LanguagetagMapping( pEntry->getTagString(), pEntry->mnLang)); + } + return aVec; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/i18nlangtag/mslangid.hxx b/include/i18nlangtag/mslangid.hxx index 37bc72898e15..14386eccc504 100644 --- a/include/i18nlangtag/mslangid.hxx +++ b/include/i18nlangtag/mslangid.hxx @@ -25,6 +25,7 @@ #include "i18nlangtag/i18nlangtagdllapi.h" #include "i18nlangtag/lang.h" #include +#include /** Methods related to Microsoft language IDs. For details about MS-LANGIDs please see lang.h */ @@ -173,26 +174,19 @@ public: // --------------------------------------------------------------------------- - /** @internal - Access to fields of an element of the simple conversion table. - For resource compiler build environment usage only! */ - struct IsoLangEntry + struct LanguagetagMapping { - LanguageType mnLang; - sal_Char maLangStr[4]; - sal_Char maCountry[3]; + OUString maBcp47; + LanguageType mnLang; - /** Obtain a language tag string with '-' separator. */ - I18NLANGTAG_DLLPUBLIC OUString getTagString() const; + LanguagetagMapping( const OUString & rBcp47, LanguageType nLang ) : maBcp47(rBcp47), mnLang(nLang) {} }; - /** @internal - Return a pointer to the IsoLangEntry of the underlying table, - matching the offset passed by nIndex. Only meaningful for the resource - compiler to build a list of known languages. - - @returns address of IsoLangEntry, or NULL pointer if nIndex exceeds the - table elements' count. + /** @internal - Obtain a list of known locales (i.e. those that have a + defined mapping between MS-LangID and ISO codes or tags) as BCP 47 + language tag strings. */ - static const IsoLangEntry* getIsoLangEntry( size_t nIndex ); + static ::std::vector< LanguagetagMapping > getDefinedLanguagetags(); // --------------------------------------------------------------------------- diff --git a/rsc/source/parser/rscibas.cxx b/rsc/source/parser/rscibas.cxx index f4f05b5dbff5..dda165cc6e2c 100644 --- a/rsc/source/parser/rscibas.cxx +++ b/rsc/source/parser/rscibas.cxx @@ -81,18 +81,18 @@ void RscLangEnum::Init( RscNameTable& rNames ) sal_Int32 nIndex = 0; mnLangId = 0x400; // stay away from selfdefined... - const MsLangId::IsoLangEntry* pLangEntry; - while ( NULL != ( pLangEntry = MsLangId::getIsoLangEntry( nIndex )) && ( pLangEntry->mnLang != LANGUAGE_DONTKNOW )) + const ::std::vector< MsLangId::LanguagetagMapping > aList( MsLangId::getDefinedLanguagetags()); + for (::std::vector< MsLangId::LanguagetagMapping >::const_iterator iTag( aList.begin()); iTag != aList.end(); ++iTag) { #if OSL_DEBUG_LEVEL > 2 fprintf( stderr, "ISO Language in : %d, 0x%04x, %s\n", (int)nIndex, - (unsigned)pLangEntry->mnLang, - OUStringToOString( pLangEntry->getTagString(), RTL_TEXTENCODING_ASCII_US).getStr()); + (unsigned)(*iTag).mnLang, + OUStringToOString( (*iTag).maBcp47, RTL_TEXTENCODING_ASCII_US).getStr()); fprintf( stderr, "ISO Language out:"); #endif - LanguageTag aLanguageTag( pLangEntry->getTagString()); + LanguageTag aLanguageTag( (*iTag).maBcp47); ::std::vector< OUString > aFallbacks( aLanguageTag.getFallbackStrings()); for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it) { -- cgit