summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
Diffstat (limited to 'includes')
-rw-r--r--includes/language.inc14
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;
}
/**