diff -r a888b9636517 -r 3604ed712e16 mozilla-language.patch --- a/mozilla-language.patch Sun Jan 22 17:43:03 2017 +0100 +++ b/mozilla-language.patch Tue Jan 24 22:19:01 2017 +0100 @@ -1,7 +1,7 @@ # HG changeset patch # User Wolfgang Rosenauer # Parent 5a29924228527f8882c83cf62d470963ea1ce62e -# Parent bf7b3a5853467b34f13465102a19b9c7c2524bd4 +# Parent 4f39ed617c2f151a3a15903c7ae4471b66774e9e Bug 583793 - Firefox interface language set to LANG, ignores LANGUAGE diff --git a/intl/locale/nsLocaleService.cpp b/intl/locale/nsLocaleService.cpp @@ -25,7 +25,7 @@ for( i = 0; i < LocaleListLength; i++ ) { nsresult result; // setlocale( , "") evaluates LC_* and LANG -@@ -149,16 +150,21 @@ nsLocaleService::nsLocaleService(void) +@@ -149,16 +150,36 @@ nsLocaleService::nsLocaleService(void) } else { CopyASCIItoUTF16(lang, platformLocale); result = nsPosixLocale::GetXPLocale(lang, xpLocale); @@ -35,9 +35,24 @@ return; } + // LANGUAGE is overriding LC_MESSAGES ++ // it can be a colon separated list of preferred languages ++ // as we do not recognize here if a language is available ++ // we actually only consider the first entry unless GetXPLocale ++ // fails completely + if (i == LC_MESSAGES && language && *language) { -+ CopyASCIItoUTF16(language, platformLocale); -+ result = nsPosixLocale::GetXPLocale(language, xpLocale); ++#define LANGUAGE_SEP ":" ++ nsAutoString xpLocale_temp; ++ char* rawBuffer = (char*) language; ++ char* token = nsCRT::strtok(rawBuffer, LANGUAGE_SEP, &rawBuffer); ++ for (; token; ++ token = nsCRT::strtok(rawBuffer, LANGUAGE_SEP, &rawBuffer)) { ++ result = nsPosixLocale::GetXPLocale(token, xpLocale_temp); ++ if (NS_SUCCEEDED(result)) { ++ CopyASCIItoUTF16(token, platformLocale); ++ xpLocale = xpLocale_temp; ++ break; ++ } ++ } + } resultLocale->AddCategory(category, xpLocale); resultLocale->AddCategory(category_platform, platformLocale);