Kaydet (Commit) 087ee660 authored tarafından Eike Rathke's avatar Eike Rathke

encapsulate IsoLangEntry again

Change-Id: I66475eb3914b07b4c7a045e295ef77a5de9439d4
üst 5b2a740b
...@@ -299,25 +299,24 @@ void TestLanguageTag::testAllTags() ...@@ -299,25 +299,24 @@ void TestLanguageTag::testAllTags()
void TestLanguageTag::testAllIsoLangEntries() void TestLanguageTag::testAllIsoLangEntries()
{ {
const MsLangId::IsoLangEntry* pLangEntry; const ::std::vector< MsLangId::LanguagetagMapping > aList( MsLangId::getDefinedLanguagetags());
sal_Int32 nIndex = 0; for (::std::vector< MsLangId::LanguagetagMapping >::const_iterator it( aList.begin()); it != aList.end(); ++it)
while (((pLangEntry = MsLangId::getIsoLangEntry( nIndex++ )) != NULL) && (pLangEntry->mnLang != LANGUAGE_DONTKNOW))
{ {
LanguageTag aTagString( pLangEntry->getTagString(), true); LanguageTag aTagString( (*it).maBcp47, true);
LanguageTag aTagID( pLangEntry->mnLang); LanguageTag aTagID( (*it).mnLang);
if (pLangEntry->getTagString() != aTagString.getBcp47()) 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); 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. // There are multiple mappings, ID must be equal after conversions.
LanguageTag aTagBack( aTagID.getBcp47(), true); LanguageTag aTagBack( aTagID.getBcp47(), true);
if (aTagString.getLanguageType() != aTagBack.getLanguageType()) 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) + aMessage += " " + OString::number( aTagString.getLanguageType(), 16) +
" -> " + OString::number( aTagBack.getLanguageType(), 16); " -> " + OString::number( aTagBack.getLanguageType(), 16);
CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagString.getLanguageType() == aTagBack.getLanguageType()); CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagString.getLanguageType() == aTagBack.getLanguageType());
...@@ -327,13 +326,13 @@ void TestLanguageTag::testAllIsoLangEntries() ...@@ -327,13 +326,13 @@ void TestLanguageTag::testAllIsoLangEntries()
// This does not hold, there are cases like 'ar' // This does not hold, there are cases like 'ar'
// LANGUAGE_ARABIC_PRIMARY_ONLY that when mapped back results in // LANGUAGE_ARABIC_PRIMARY_ONLY that when mapped back results in
// 'ar-SA' as default locale. // '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. // There are multiple mappings, string must be equal after conversions.
LanguageTag aTagBack( aTagString.getLanguageType()); LanguageTag aTagBack( aTagString.getLanguageType());
if (aTagID.getBcp47() != aTagBack.getBcp47()) 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) + aMessage += " " + OUStringToOString( aTagID.getBcp47(), RTL_TEXTENCODING_ASCII_US) +
" -> " + OUStringToOString( aTagBack.getBcp47(), RTL_TEXTENCODING_ASCII_US); " -> " + OUStringToOString( aTagBack.getBcp47(), RTL_TEXTENCODING_ASCII_US);
CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagID.getBcp47() == aTagBack.getBcp47()); CPPUNIT_ASSERT_MESSAGE( aMessage.getStr(), aTagID.getBcp47() == aTagBack.getBcp47());
......
...@@ -27,6 +27,16 @@ ...@@ -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 struct IsoLangEngEntry
{ {
LanguageType mnLang; LanguageType mnLang;
...@@ -89,7 +99,7 @@ struct IsoLangOtherEntry ...@@ -89,7 +99,7 @@ struct IsoLangOtherEntry
* LANGUAGE_AZERI LANGUAGE_URDU LANGUAGE_KASHMIRI * LANGUAGE_AZERI LANGUAGE_URDU LANGUAGE_KASHMIRI
*/ */
static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = static IsoLangEntry const aImplIsoLangEntries[] =
{ {
// MS-LANGID codes ISO639-1/2/3 ISO3166 // MS-LANGID codes ISO639-1/2/3 ISO3166
{ LANGUAGE_ENGLISH, "en", "" }, { LANGUAGE_ENGLISH, "en", "" },
...@@ -524,10 +534,10 @@ static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = ...@@ -524,10 +534,10 @@ static MsLangId::IsoLangEntry const aImplIsoLangEntries[] =
{ LANGUAGE_DONTKNOW, "", "" } // marks end of table { LANGUAGE_DONTKNOW, "", "" } // marks end of table
}; };
static MsLangId::IsoLangEntry aLastResortFallbackEntry = static IsoLangEntry aLastResortFallbackEntry =
{ LANGUAGE_ENGLISH_US, "en", "US" }; { LANGUAGE_ENGLISH_US, "en", "US" };
OUString MsLangId::IsoLangEntry::getTagString() const OUString IsoLangEntry::getTagString() const
{ {
if (maCountry[0]) if (maCountry[0])
return OUString( OUString::createFromAscii( maLangStr) + "-" + OUString::createFromAscii( maCountry)); return OUString( OUString::createFromAscii( maLangStr) + "-" + OUString::createFromAscii( maCountry));
...@@ -695,7 +705,7 @@ void MsLangId::Conversion::convertLanguageToLocaleImpl( LanguageType nLang, ...@@ -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 ) const ::com::sun::star::lang::Locale & rLocale )
{ {
// language is lower case in table // language is lower case in table
...@@ -705,8 +715,8 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry( ...@@ -705,8 +715,8 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry(
sal_Int32 nCountryLen = aUpperCountry.getLength(); sal_Int32 nCountryLen = aUpperCountry.getLength();
// Search for locale and remember first lang-only. // Search for locale and remember first lang-only.
const MsLangId::IsoLangEntry* pFirstLang = NULL; const IsoLangEntry* pFirstLang = NULL;
const MsLangId::IsoLangEntry* pEntry = aImplIsoLangEntries; const IsoLangEntry* pEntry = aImplIsoLangEntries;
do do
{ {
if (aLowerLang.equalsAscii( pEntry->maLangStr)) if (aLowerLang.equalsAscii( pEntry->maLangStr))
...@@ -762,7 +772,7 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry( ...@@ -762,7 +772,7 @@ static const MsLangId::IsoLangEntry & lcl_lookupFallbackEntry(
::com::sun::star::lang::Locale MsLangId::Conversion::lookupFallbackLocale( ::com::sun::star::lang::Locale MsLangId::Conversion::lookupFallbackLocale(
const ::com::sun::star::lang::Locale & rLocale ) 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( return ::com::sun::star::lang::Locale(
OUString::createFromAscii( rEntry.maLangStr), OUString::createFromAscii( rEntry.maLangStr),
OUString::createFromAscii( rEntry.maCountry), OUString::createFromAscii( rEntry.maCountry),
...@@ -985,15 +995,16 @@ LanguageType MsLangId::convertUnxByteStringToLanguage( ...@@ -985,15 +995,16 @@ LanguageType MsLangId::convertUnxByteStringToLanguage(
return Conversion::convertIsoNamesToLanguage( aLang, aCountry ); return Conversion::convertIsoNamesToLanguage( aLang, aCountry );
} }
// -----------------------------------------------------------------------
// pass one IsoLangEntry to the outer world of the resource compiler
// static // static
const MsLangId::IsoLangEntry* MsLangId::getIsoLangEntry( size_t nIndex ) ::std::vector< MsLangId::LanguagetagMapping > MsLangId::getDefinedLanguagetags()
{ {
if (nIndex < SAL_N_ELEMENTS(aImplIsoLangEntries)) ::std::vector< LanguagetagMapping > aVec;
return &aImplIsoLangEntries[ nIndex]; for (const IsoLangEntry* pEntry = aImplIsoLangEntries; pEntry->mnLang != LANGUAGE_DONTKNOW; ++pEntry)
return 0; {
aVec.push_back( LanguagetagMapping( pEntry->getTagString(), pEntry->mnLang));
}
return aVec;
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "i18nlangtag/i18nlangtagdllapi.h" #include "i18nlangtag/i18nlangtagdllapi.h"
#include "i18nlangtag/lang.h" #include "i18nlangtag/lang.h"
#include <com/sun/star/lang/Locale.hpp> #include <com/sun/star/lang/Locale.hpp>
#include <vector>
/** Methods related to Microsoft language IDs. For details about MS-LANGIDs /** Methods related to Microsoft language IDs. For details about MS-LANGIDs
please see lang.h */ please see lang.h */
...@@ -173,26 +174,19 @@ public: ...@@ -173,26 +174,19 @@ public:
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** @internal - Access to fields of an element of the simple conversion table. struct LanguagetagMapping
For resource compiler build environment usage only! */
struct IsoLangEntry
{ {
LanguageType mnLang; OUString maBcp47;
sal_Char maLangStr[4]; LanguageType mnLang;
sal_Char maCountry[3];
/** Obtain a language tag string with '-' separator. */ LanguagetagMapping( const OUString & rBcp47, LanguageType nLang ) : maBcp47(rBcp47), mnLang(nLang) {}
I18NLANGTAG_DLLPUBLIC OUString getTagString() const;
}; };
/** @internal - Return a pointer to the IsoLangEntry of the underlying table, /** @internal - Obtain a list of known locales (i.e. those that have a
matching the offset passed by nIndex. Only meaningful for the resource defined mapping between MS-LangID and ISO codes or tags) as BCP 47
compiler to build a list of known languages. language tag strings.
@returns address of IsoLangEntry, or NULL pointer if nIndex exceeds the
table elements' count.
*/ */
static const IsoLangEntry* getIsoLangEntry( size_t nIndex ); static ::std::vector< LanguagetagMapping > getDefinedLanguagetags();
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
......
...@@ -81,18 +81,18 @@ void RscLangEnum::Init( RscNameTable& rNames ) ...@@ -81,18 +81,18 @@ void RscLangEnum::Init( RscNameTable& rNames )
sal_Int32 nIndex = 0; sal_Int32 nIndex = 0;
mnLangId = 0x400; // stay away from selfdefined... 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 #if OSL_DEBUG_LEVEL > 2
fprintf( stderr, "ISO Language in : %d, 0x%04x, %s\n", fprintf( stderr, "ISO Language in : %d, 0x%04x, %s\n",
(int)nIndex, (int)nIndex,
(unsigned)pLangEntry->mnLang, (unsigned)(*iTag).mnLang,
OUStringToOString( pLangEntry->getTagString(), RTL_TEXTENCODING_ASCII_US).getStr()); OUStringToOString( (*iTag).maBcp47, RTL_TEXTENCODING_ASCII_US).getStr());
fprintf( stderr, "ISO Language out:"); fprintf( stderr, "ISO Language out:");
#endif #endif
LanguageTag aLanguageTag( pLangEntry->getTagString()); LanguageTag aLanguageTag( (*iTag).maBcp47);
::std::vector< OUString > aFallbacks( aLanguageTag.getFallbackStrings()); ::std::vector< OUString > aFallbacks( aLanguageTag.getFallbackStrings());
for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it) for (::std::vector< OUString >::const_iterator it( aFallbacks.begin()); it != aFallbacks.end(); ++it)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment