1 # HG changeset patch |
1 # HG changeset patch |
2 # User Wolfgang Rosenauer <wr@rosenauer.org> |
2 # User Wolfgang Rosenauer <wr@rosenauer.org> |
3 # Parent 5a29924228527f8882c83cf62d470963ea1ce62e |
3 # Parent 5a29924228527f8882c83cf62d470963ea1ce62e |
4 # Parent bf7b3a5853467b34f13465102a19b9c7c2524bd4 |
4 # Parent 4f39ed617c2f151a3a15903c7ae4471b66774e9e |
5 Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE |
5 Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE |
6 |
6 |
7 diff --git a/intl/locale/nsLocaleService.cpp b/intl/locale/nsLocaleService.cpp |
7 diff --git a/intl/locale/nsLocaleService.cpp b/intl/locale/nsLocaleService.cpp |
8 --- a/intl/locale/nsLocaleService.cpp |
8 --- a/intl/locale/nsLocaleService.cpp |
9 +++ b/intl/locale/nsLocaleService.cpp |
9 +++ b/intl/locale/nsLocaleService.cpp |
23 int i; |
23 int i; |
24 |
24 |
25 for( i = 0; i < LocaleListLength; i++ ) { |
25 for( i = 0; i < LocaleListLength; i++ ) { |
26 nsresult result; |
26 nsresult result; |
27 // setlocale( , "") evaluates LC_* and LANG |
27 // setlocale( , "") evaluates LC_* and LANG |
28 @@ -149,16 +150,21 @@ nsLocaleService::nsLocaleService(void) |
28 @@ -149,16 +150,36 @@ nsLocaleService::nsLocaleService(void) |
29 } else { |
29 } else { |
30 CopyASCIItoUTF16(lang, platformLocale); |
30 CopyASCIItoUTF16(lang, platformLocale); |
31 result = nsPosixLocale::GetXPLocale(lang, xpLocale); |
31 result = nsPosixLocale::GetXPLocale(lang, xpLocale); |
32 } |
32 } |
33 } |
33 } |
34 if (NS_FAILED(result)) { |
34 if (NS_FAILED(result)) { |
35 return; |
35 return; |
36 } |
36 } |
37 + // LANGUAGE is overriding LC_MESSAGES |
37 + // LANGUAGE is overriding LC_MESSAGES |
|
38 + // it can be a colon separated list of preferred languages |
|
39 + // as we do not recognize here if a language is available |
|
40 + // we actually only consider the first entry unless GetXPLocale |
|
41 + // fails completely |
38 + if (i == LC_MESSAGES && language && *language) { |
42 + if (i == LC_MESSAGES && language && *language) { |
39 + CopyASCIItoUTF16(language, platformLocale); |
43 +#define LANGUAGE_SEP ":" |
40 + result = nsPosixLocale::GetXPLocale(language, xpLocale); |
44 + nsAutoString xpLocale_temp; |
|
45 + char* rawBuffer = (char*) language; |
|
46 + char* token = nsCRT::strtok(rawBuffer, LANGUAGE_SEP, &rawBuffer); |
|
47 + for (; token; |
|
48 + token = nsCRT::strtok(rawBuffer, LANGUAGE_SEP, &rawBuffer)) { |
|
49 + result = nsPosixLocale::GetXPLocale(token, xpLocale_temp); |
|
50 + if (NS_SUCCEEDED(result)) { |
|
51 + CopyASCIItoUTF16(token, platformLocale); |
|
52 + xpLocale = xpLocale_temp; |
|
53 + break; |
|
54 + } |
|
55 + } |
41 + } |
56 + } |
42 resultLocale->AddCategory(category, xpLocale); |
57 resultLocale->AddCategory(category, xpLocale); |
43 resultLocale->AddCategory(category_platform, platformLocale); |
58 resultLocale->AddCategory(category_platform, platformLocale); |
44 } |
59 } |
45 mSystemLocale = do_QueryInterface(resultLocale); |
60 mSystemLocale = do_QueryInterface(resultLocale); |