diff --git a/core/modules/openid/openid.module b/core/modules/openid/openid.module
index a3df38f..141a3ab 100644
--- a/core/modules/openid/openid.module
+++ b/core/modules/openid/openid.module
@@ -255,21 +255,24 @@ function openid_form_user_register_form_alter(&$form, &$form_state) {
       // preferred langugage is "en-GB", we look for "en-gb" (Drupal's language
       // codes are lower-case) or fall back to "en".
       $parts = preg_split('/[_-]/', strtolower($language));
-      $candidate_languages[] = $parts[0];
+      $candidate_langcodes[] = $parts[0];
       if (count($parts) > 1) {
-        $candidate_languages[] = $parts[0] . '-' . $parts[1];
+        $candidate_langcodes[] = $parts[0] . '-' . $parts[1];
       }
       if (count($parts) > 2) {
-        $candidate_languages[] = $parts[0] . '-' . $parts[2];
-        $candidate_languages[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2];
+        $candidate_langcodes[] = $parts[0] . '-' . $parts[2];
+        $candidate_langcodes[] = $parts[0] . '-' . $parts[1] . '-' . $parts[2];
       }
       $enabled_languages = language_list(TRUE);
       // Iterate over the generated permutations starting with the longest (most
       // specific) strings.
-      foreach (array_reverse($candidate_languages) as $candidate_language) {
-        if (isset($enabled_languages[$candidate_language])) {
+      foreach (array_reverse($candidate_langcodes) as $candidate_langcode) {
+        if (isset($enabled_languages[$candidate_langcode])) {
           $form['locale']['preferred_langcode']['#type'] = 'hidden';
-          $form['locale']['preferred_langcode']['#value'] = $candidate_language;
+          $form['locale']['preferred_langcode']['#value'] = $candidate_langcode;
+          // Skip the rest of the foreach to not overwrite the specific
+          // language we found.
+          break;
         }
       }
     }
diff --git a/core/modules/openid/openid.test b/core/modules/openid/openid.test
index 7a4c9cf..539d12c 100644
--- a/core/modules/openid/openid.test
+++ b/core/modules/openid/openid.test
@@ -453,7 +453,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
   }
 
   function setUp() {
-    parent::setUp('openid', 'openid_test');
+    parent::setUp('openid', 'openid_test', 'language');
     variable_set('user_register', USER_REGISTER_VISITORS);
   }
 
@@ -469,10 +469,16 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     variable_set('openid_test_response', array(
       'openid.sreg.nickname' => 'john',
       'openid.sreg.email' => 'john@example.com',
-      'openid.sreg.language' => 'en-GB',
+      'openid.sreg.language' => 'pt-BR',
       'openid.sreg.timezone' => 'Europe/London',
     ));
 
+    // Save Portuguese as an optional language so OpenID can pick that.
+    $language = (object) array(
+      'langcode' => 'pt',
+    );
+    language_save($language);
+
     // Use a User-supplied Identity that is the URL of an XRDS document.
     $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
     $this->submitLoginForm($identity);
@@ -484,7 +490,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->preferred_langcode, 'pt', t('User was registered with right language.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     $this->submitLoginForm($identity);
@@ -513,10 +519,16 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     variable_set('openid_test_response', array(
       'openid.sreg.nickname' => 'john',
       'openid.sreg.email' => 'john@example.com',
-      'openid.sreg.language' => 'en-GB',
+      'openid.sreg.language' => 'pt-BR',
       'openid.sreg.timezone' => 'Europe/London',
     ));
 
+    // Save Portuguese, Brazil as an optional language so OpenID can pick that.
+    $language = (object) array(
+      'langcode' => 'pt-br',
+    );
+    language_save($language);
+
     // Use a User-supplied Identity that is the URL of an XRDS document.
     $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
     $this->submitLoginForm($identity);
@@ -526,7 +538,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->preferred_langcode, 'pt-br', t('User was registered with right language.'));
     $this->assertFalse($user->data, t('No additional user info was saved.'));
 
     $this->drupalLogout();
@@ -644,9 +656,20 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
       'openid.ext123.type.timezone' => 'http://axschema.org/pref/timezone',
       'openid.ext123.value.timezone' => 'Europe/London',
       'openid.ext123.type.language' => 'http://axschema.org/pref/language',
-      'openid.ext123.value.language' => 'en-GB',
+      'openid.ext123.value.language' => 'pt-PT',
     ));
 
+    // Save Portuguese and Portuguese, Portugal as an optional languages so
+    // OpenID can pick the right one.
+    $language = (object) array(
+      'langcode' => 'pt',
+    );
+    language_save($language);
+    $language = (object) array(
+      'langcode' => 'pt-pt',
+    );
+    language_save($language);
+
     // Use a User-supplied Identity that is the URL of an XRDS document.
     $identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
     $this->submitLoginForm($identity);
@@ -656,7 +679,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
     $this->assertTrue($user, t('User was registered with right username.'));
     $this->assertEqual($user->mail, 'john@example.com', t('User was registered with right email address.'));
     $this->assertEqual($user->timezone, 'Europe/London', t('User was registered with right timezone.'));
-    $this->assertEqual($user->preferred_langcode, 'en', t('User was registered with right language.'));
+    $this->assertEqual($user->preferred_langcode, 'pt-pt', t('User was registered with right language.'));
   }
 }
 
