diff options
-rw-r--r-- | sal/inc/rtl/locale.h | 8 | ||||
-rw-r--r-- | sal/osl/unx/nlsupport.c | 15 |
2 files changed, 14 insertions, 9 deletions
diff --git a/sal/inc/rtl/locale.h b/sal/inc/rtl/locale.h index aaab61770..5306da225 100644 --- a/sal/inc/rtl/locale.h +++ b/sal/inc/rtl/locale.h @@ -49,7 +49,7 @@ extern "C" { typedef struct _rtl_Locale { /** - Lowercase two-letter ISO-639 code. + Lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code. */ rtl_uString * Language; /** @@ -72,7 +72,7 @@ typedef struct _rtl_Locale /** Register a locale from language, country and variant. - @param language lowercase two-letter ISO-639 code. + @param language lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code. @param country uppercase two-letter ISO-3166 code. May be null. @param variant vendor and browser specific code. May be null. */ @@ -95,7 +95,7 @@ rtl_Locale * SAL_CALL rtl_locale_getDefault(); Sets the default. Normally set once at the beginning of applet or application, then never reset. <code>setDefault</code> does not reset the host locale. - @param language lowercase two-letter ISO-639 code. + @param language lowercase two-letter ISO 639-1 or three-letter ISO 639-3 code. @param country uppercase two-letter ISO-3166 code. @param variant vendor and browser specific code. See class description. */ @@ -103,7 +103,7 @@ void SAL_CALL rtl_locale_setDefault( const sal_Unicode * language, const sal_Uni /** Getter for programmatic name of field, - an lowercased two-letter ISO-639 code. + a lowercased two-letter ISO 639-1 or three-letter ISO 639-3 code. @see #getDisplayLanguage */ rtl_uString * SAL_CALL rtl_locale_getLanguage( rtl_Locale * This ); diff --git a/sal/osl/unx/nlsupport.c b/sal/osl/unx/nlsupport.c index f6d0b4a16..3cce0e6b0 100644 --- a/sal/osl/unx/nlsupport.c +++ b/sal/osl/unx/nlsupport.c @@ -105,7 +105,8 @@ _pair_search (const char *key, const _pair *base, unsigned int member ) static char * _compose_locale( rtl_Locale * pLocale, char * buffer, size_t n ) { /* check if a valid locale is specified */ - if( pLocale && pLocale->Language && (pLocale->Language->length == 2) ) + if( pLocale && pLocale->Language && + (pLocale->Language->length == 2 || pLocale->Language->length == 3) ) { size_t offset = 0; @@ -193,16 +194,20 @@ static rtl_Locale * _parse_locale( const char * locale ) rtl_Locale * ret; + /* language is a two or three letter code */ + if( (len > 3 && '_' == locale[3]) || (len == 3 && '_' != locale[2]) ) + offset = 3; + /* convert language code to unicode */ - rtl_string2UString( &pLanguage, locale, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); + rtl_string2UString( &pLanguage, locale, offset, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); OSL_ASSERT(pLanguage != NULL); /* convert country code to unicode */ - if( len >= 5 && '_' == locale[2] ) + if( len >= offset+3 && '_' == locale[offset] ) { - rtl_string2UString( &pCountry, locale + 3, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); + rtl_string2UString( &pCountry, locale + offset + 1, 2, RTL_TEXTENCODING_ASCII_US, OSTRING_TO_OUSTRING_CVTFLAGS ); OSL_ASSERT(pCountry != NULL); - offset = 5; + offset += 3; } /* convert variant code to unicode - do not rely on "." as delimiter */ |