summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Joachim Lankenau <hjs@openoffice.org>2004-06-25 14:04:28 +0000
committerHans-Joachim Lankenau <hjs@openoffice.org>2004-06-25 14:04:28 +0000
commit3b07dcc6e34680e0b9734616db670e5daa7c6338 (patch)
treee7993a7b7d1c9ffb616858dacda74f81b5a2bc01
parent85a360f2795ea54a182ecee8ca35185eea42e7d6 (diff)
INTEGRATION: CWS mergebuild (1.25.6); FILE MERGED
2004/06/16 18:12:36 hjs 1.25.6.8: #i8252# handle incomplete language/country pair resources 2004/05/18 17:22:20 hjs 1.25.6.7: RESYNC: (1.26-1.27); FILE MERGED 2004/04/21 01:09:40 hjs 1.25.6.6: RESYNC: (1.25-1.26); FILE MERGED 2004/03/02 13:15:45 hjs 1.25.6.5: #i8252# compile problems on windows 2004/02/06 11:17:25 hjs 1.25.6.4: #i8252# rework *CreateResmgr parameters 2004/01/29 11:24:31 hjs 1.25.6.3: #i8252# chng. resmgr creation parameters from LanguageType to ::com::sun::star::lang::Locale 2003/10/06 15:20:45 hjs 1.25.6.2: #i8252# switch to ByteString ref outparameter 2003/09/29 16:32:27 hjs 1.25.6.1: #i8252# look for names with iso codes
-rw-r--r--tools/source/rc/resmgr.cxx220
1 files changed, 149 insertions, 71 deletions
diff --git a/tools/source/rc/resmgr.cxx b/tools/source/rc/resmgr.cxx
index eb319bdc458d..4d60007f0d0f 100644
--- a/tools/source/rc/resmgr.cxx
+++ b/tools/source/rc/resmgr.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: resmgr.cxx,v $
*
- * $Revision: 1.29 $
+ * $Revision: 1.30 $
*
- * last change: $Author: hr $ $Date: 2004-06-22 12:46:02 $
+ * last change: $Author: hjs $ $Date: 2004-06-25 15:04:28 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -107,10 +107,16 @@
#include <urlobj.hxx>
#endif
+#ifndef _ISOLANG_HXX
+#include <isolang.hxx>
+#endif
+
#ifndef _TOOLS_SIMPLERESMGR_HXX_
#include "simplerm.hxx"
#endif
+#include "isofallback.hxx"
+
#include <functional>
#include <algorithm>
@@ -1159,7 +1165,14 @@ void* ResMgr::Increment( USHORT nSize )
return pClassRes;
}
-// -----------------------------------------------------------------------
+//---------------------------------------------------------------------------
+//
+// method left here for SDK compatibility,
+// used in "framework/source/services/substitutepathvars.cxx"
+//
+// phone numbers no longer in use for resource files
+//
+//---------------------------------------------------------------------------
const char* ResMgr::GetLang( LanguageType& nType, USHORT nPrio )
{
@@ -1340,43 +1353,82 @@ const char* ResMgr::GetLang( LanguageType& nType, USHORT nPrio )
// -----------------------------------------------------------------------
ResMgr* ResMgr::CreateResMgr( const sal_Char* pPrefixName,
- LanguageType nType,
+ ::com::sun::star::lang::Locale aLocale,
const UniString* pAppName,
const UniString* pResPath )
{
+ ByteString aLanguage(rtl::OUStringToOString(aLocale.Language, RTL_TEXTENCODING_UTF8));
+// ByteString aLanguage = aLocale.Language; // doesn't compile
+
+// aLanguage = aLocale.Language; // compiles...
+ //legal shortcut?
+ if ( ! aLocale.Language.equalsIgnoreAsciiCase(aLocale.Country))
+ {
+ aLanguage += "-";
+ aLanguage += ByteString(rtl::OUStringToOString(aLocale.Country, RTL_TEXTENCODING_UTF8));
+ }
+
// Suchreihenfolge festlegen
- const sal_Char* pLang[6];
+ ByteString aLang[LOCALE_MAX_FALLBACK + 1];
// Resourcefile suchen
UniString aName;
InternalResMgr* pInternalResMgr = NULL;
int i;
- for ( i = 0; i < 6; ++i )
- {
- pLang[i] = GetLang( nType, i );
- if ( pLang[i] && (i == 0 || pLang[i] != pLang[0]) )
+ aLang[0] = aLanguage;
+
+ for ( i = 0; i < LOCALE_MAX_FALLBACK ; ++i )
+ {
+ if ( aLang[i].Len() != 0 && (i == 0 || aLang[i] != aLang[0]) )
{
aName.AssignAscii( pPrefixName );
- aName.AppendAscii( pLang[i] );
+ aName.AppendAscii( aLang[i].GetBuffer() );
aName.AppendAscii( ".res" );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "ResMgr::CreateIso, ISO Language : %s\n", aLanguage.GetBuffer() );
+ fprintf( stderr, "ResMgr::CreateIso, ISO Language : %s\n", pPrefixName );
+ fprintf( stderr, "ResMgr::CreateIso, Prio : %d\n", i );
+#endif
pInternalResMgr = InternalResMgr::GetInternalResMgr( aName, pAppName, pResPath );
if ( pInternalResMgr )
return new ResMgr( pInternalResMgr );
+
+ aLang[i+1] = aLang[i];
+ GetIsoFallback( aLang[i+1] );
}
}
-
- return SearchCreateResMgr( pPrefixName, nType );
+ return SearchCreateResMgr( pPrefixName, aLocale );
}
// -----------------------------------------------------------------------
ResMgr* ResMgr::SearchCreateResMgr(
const sal_Char* pPrefixName,
- LanguageType& nType )
+ ::com::sun::star::lang::Locale& rLocale )
{
- if( nType == LANGUAGE_DONTKNOW )
- nType = GetSystemUILanguage();
+ ByteString aLanguage;
+ ByteString aCountry;
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "ResMgr::SearchCreateLocale, prefix : %s\n", pPrefixName );
+#endif
+
+ if( rLocale.Language.getLength() )
+ {
+ aLanguage = ByteString(rtl::OUStringToOString(rLocale.Language, RTL_TEXTENCODING_UTF8));
+ if( rLocale.Country.getLength() )
+ {
+ aLanguage += "-";
+ aLanguage = ByteString(rtl::OUStringToOString(rLocale.Country, RTL_TEXTENCODING_UTF8));
+ if( rLocale.Variant.getLength() )
+ {
+ aLanguage += "-";
+ aLanguage = ByteString(rtl::OUStringToOString(rLocale.Variant, RTL_TEXTENCODING_UTF8));
+ }
+ }
+ }
+ else
+ aLanguage = ConvertLanguageToIsoByteString( GetSystemUILanguage() );
::rtl::OUString aRtlUniAppFileName;
osl_getExecutableFile( &aRtlUniAppFileName.pData );
@@ -1384,64 +1436,82 @@ ResMgr* ResMgr::SearchCreateResMgr(
::osl::FileBase::getSystemPathFromFileURL( aRtlUniAppFileName, aRtlAppFileName );
String aAppFileName( aRtlAppFileName );
- const sal_Char* pLang = GetLang( nType, 0 );
String aBaseName( String::CreateFromAscii( pPrefixName ) );
String aName( aBaseName );
- aName.AppendAscii( pLang ? pLang : "" );
+ aName.AppendAscii( aLanguage.GetBuffer() );
aName.AppendAscii( ".res" );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "ResMgr::SearchCreateLocale, prefix : %s\n", pPrefixName );
+ fprintf( stderr, "ResMgr::SearchCreateLocale, ISO Language : %s\n", aLanguage.GetBuffer() );
+#endif
InternalResMgr* pInternalResMgr = InternalResMgr::GetInternalResMgr( aName, &aAppFileName, NULL );
if ( pInternalResMgr )
+ {
+ rLocale.Language = rtl::OStringToOUString( aLanguage.GetToken( 0, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Country = rtl::OStringToOUString( aLanguage.GetToken( 1, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Variant = rtl::OStringToOUString( aLanguage.GetToken( 2, '-' ), RTL_TEXTENCODING_UTF8);
return new ResMgr( pInternalResMgr );
+ }
- static const LanguageType aLanguages[] =
+ if ( aLanguage.Len() )
{
- LANGUAGE_ENGLISH_US,
- LANGUAGE_GERMAN,
- LANGUAGE_FRENCH,
- LANGUAGE_ITALIAN,
- LANGUAGE_SPANISH,
- LANGUAGE_DUTCH,
- LANGUAGE_SWEDISH,
- LANGUAGE_TURKISH,
- LANGUAGE_SWEDISH_FINLAND,
- LANGUAGE_PORTUGUESE_BRAZILIAN,
- LANGUAGE_PORTUGUESE,
- LANGUAGE_POLISH,
- LANGUAGE_NORWEGIAN,
- LANGUAGE_NORWEGIAN_NYNORSK,
- LANGUAGE_NORWEGIAN_BOKMAL,
- LANGUAGE_FINNISH,
- LANGUAGE_DUTCH_BELGIAN,
- LANGUAGE_DANISH,
- LANGUAGE_CATALAN,
- LANGUAGE_ESTONIAN,
- LANGUAGE_CHINESE_SIMPLIFIED,
- LANGUAGE_CHINESE_TRADITIONAL,
- LANGUAGE_JAPANESE,
- LANGUAGE_HUNGARIAN,
- LANGUAGE_CZECH,
- LANGUAGE_SLOVENIAN,
- LANGUAGE_SLOVAK,
- LANGUAGE_RUSSIAN,
- LANGUAGE_ARABIC,
- LANGUAGE_GREEK,
- LANGUAGE_KOREAN,
- LANGUAGE_KOREAN_JOHAB,
- LANGUAGE_THAI,
- LANGUAGE_HINDI,
- LANGUAGE_HEBREW
- };
-
- for( size_t i = 0; i < sizeof( aLanguages )/sizeof( aLanguages[0] ); ++i )
+ ByteString aTestLang = aLanguage;
+ while ( GetIsoFallback( aTestLang ))
+ {
+ aName = aBaseName;
+ aName.AppendAscii( aTestLang.GetBuffer() );
+ aName.AppendAscii( ".res" );
+
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "ResMgr::SearchCreateLocale, ISO Language Fallback: %s\n", aTestLang.GetBuffer() );
+#endif
+
+ InternalResMgr* pInternalResMgr = InternalResMgr::GetInternalResMgr( aName, &aAppFileName, NULL );
+ if ( pInternalResMgr )
+ {
+ rLocale.Language = rtl::OStringToOUString( aTestLang.GetToken( 0, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Country = rtl::OStringToOUString( aTestLang.GetToken( 1, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Variant = rtl::OStringToOUString( aTestLang.GetToken( 2, '-' ), RTL_TEXTENCODING_UTF8);
+ return new ResMgr( pInternalResMgr );
+ }
+ }
+ }
+ const IsoLangEntry* pLangEntry;
+ sal_Int32 nIndex = 0;
+ LanguageType nType = 0;
+ ByteString aLang;
+
+ //search any
+ while ( (pLangEntry = GetIsoLangEntry( nIndex )) )
{
- nType = aLanguages[i];
- aName = aBaseName;
- aName.AppendAscii( GetLang( nType, 0 ) );
- aName.AppendAscii( ".res" );
- pInternalResMgr = InternalResMgr::GetInternalResMgr( aName, &aAppFileName, NULL );
- if ( pInternalResMgr )
- return new ResMgr( pInternalResMgr );
+#if OSL_DEBUG_LEVEL > 1
+ fprintf( stderr, "ISO Language : %d\n", nIndex );
+ fprintf( stderr, "ISO Language : %d\n", pLangEntry->meLang );
+ fprintf( stderr, "ISO Language : %s\n", ConvertLanguageToIsoByteString( pLangEntry->meLang ).GetBuffer() );
+ fprintf( stderr, "ISO Language : %s\n", pPrefixName );
+#endif
+ aLanguage = pLangEntry->maLangStr;
+ aCountry = pLangEntry->maCountry;
+ aLanguage.Append( "-" );
+ aLanguage.Append( aCountry );
+
+ for( int j = 0; j < 2; j++ )
+ {
+ aName = aBaseName;
+ aName.AppendAscii( aLanguage.GetBuffer() );
+ aName.AppendAscii( ".res" );
+ pInternalResMgr = InternalResMgr::GetInternalResMgr( aName, &aAppFileName, NULL );
+ if ( pInternalResMgr )
+ {
+ rLocale.Language = rtl::OStringToOUString( aLanguage.GetToken( 0, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Country = rtl::OStringToOUString( aLanguage.GetToken( 1, '-' ), RTL_TEXTENCODING_UTF8);
+ rLocale.Variant = rtl::OStringToOUString( aLanguage.GetToken( 2, '-' ), RTL_TEXTENCODING_UTF8);
+ return new ResMgr( pInternalResMgr );
+ }
+ aLanguage = pLangEntry->maLangStr;
+ }
+ nIndex++;
}
return NULL;
}
@@ -1490,23 +1560,30 @@ ResHookProc ResMgr::GetReadStringHook()
// =======================================================================
SimpleResMgr::SimpleResMgr( const sal_Char* pPrefixName,
- LanguageType nType,
+ const ::com::sun::star::lang::Locale& rLocale,
const UniString* pAppName,
const UniString* pResPath )
{
+ ByteString aLanguage(rtl::OUStringToOString(rLocale.Language, RTL_TEXTENCODING_UTF8));
+
+ //legal shortcut?
+ if ( ! rLocale.Language.equalsIgnoreAsciiCase(rLocale.Country))
+ {
+ aLanguage += "-";
+ aLanguage += ByteString(rtl::OUStringToOString(rLocale.Country, RTL_TEXTENCODING_UTF8));
+ }
// Suchreihenfolge festlegen
- const sal_Char* pLang[6];
+ ByteString aLang[6];
+ aLang[0] = aLanguage;
// Resourcefile suchen
UniString aName;
- for ( int i = 0; i < 6; ++i )
+ for ( int i = 0; i < LOCALE_MAX_FALLBACK; ++i )
{
- pLang[i] = ResMgr::GetLang( nType, i );
-
- if ( pLang[i] && (i == 0 || pLang[i] != pLang[0]) )
+ if ( aLang[i].Len() != 0 && (i == 0 || aLang[i] != aLang[0]) )
{
aName.AssignAscii( pPrefixName );
- aName.AppendAscii( pLang[i] );
+ aName.AppendAscii( aLang[i].GetBuffer() );
aName.AppendAscii( ".res" );
m_pResImpl = InternalResMgr::Create( aName, pAppName, pResPath );
if ( m_pResImpl )
@@ -1514,12 +1591,13 @@ SimpleResMgr::SimpleResMgr( const sal_Char* pPrefixName,
m_pResImpl->AddRef();
break;
}
+ aLang[i+1] = aLang[i];
+ GetIsoFallback( aLang[i+1] );
}
}
}
// -----------------------------------------------------------------------
-
SimpleResMgr::~SimpleResMgr()
{
if(m_pResImpl)