diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/language.inc | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/includes/language.inc b/includes/language.inc index b7057f2a1..20909f5a6 100644 --- a/includes/language.inc +++ b/includes/language.inc @@ -349,7 +349,10 @@ function language_provider_invoke($provider_id, $provider = NULL) { $results[$provider_id] = isset($languages[$langcode]) ? $languages[$langcode] : FALSE; } - return $results[$provider_id]; + // Since objects are resources we need to return a clone to prevent the + // provider cache to be unintentionally altered. The same providers might be + // used with different language types based on configuration. + return !empty($results[$provider_id]) ? clone($results[$provider_id]) : $results[$provider_id]; } /** @@ -380,15 +383,18 @@ function language_initialize($type) { // first valid language found. $negotiation = variable_get("language_negotiation_$type", array()); - foreach ($negotiation as $id => $provider) { - $language = language_provider_invoke($id, $provider); + foreach ($negotiation as $provider_id => $provider) { + $language = language_provider_invoke($provider_id, $provider); if ($language) { + $language->provider = $provider_id; return $language; } } // If no other language was found use the default one. - return language_default(); + $language = language_default(); + $language->provider = LANGUAGE_NEGOTIATION_DEFAULT; + return $language; } /** |