summaryrefslogtreecommitdiff
path: root/sal
diff options
context:
space:
mode:
authorEike Rathke <erack@openoffice.org>2010-06-10 23:31:31 +0200
committerEike Rathke <erack@openoffice.org>2010-06-10 23:31:31 +0200
commit17f9d3862b112b96787d06e11f983323f665cf18 (patch)
tree04bc00b47d35f4ef38ac773f5cec8e1727da6c1e /sal
parenta6d2fd8975afc0c9c4bb4e2219a8d4b8d1317239 (diff)
locales33a: #i111019# fixed locale parser/composer for three-letter language codes
Diffstat (limited to 'sal')
-rw-r--r--sal/inc/rtl/locale.h8
-rw-r--r--sal/osl/unx/nlsupport.c15
2 files changed, 14 insertions, 9 deletions
diff --git a/sal/inc/rtl/locale.h b/sal/inc/rtl/locale.h
index 8767f41d88b7..f2b0016942a3 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 0b09cf1ac2a4..c9f4fd18df21 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 */