diff --git a/commerce_paypal.module b/commerce_paypal.module
index 058a868..57c4d6f 100644
--- a/commerce_paypal.module
+++ b/commerce_paypal.module
@@ -568,6 +568,48 @@ function commerce_paypal_short_pending_reason($pendingreason) {
 }
 
 /**
+ * Returns an array of all possible language codes.
+ */
+function commerce_paypal_languages() {
+  return array(
+    t('By country') => array(
+      'AU' => t('Australia'),
+      'AT' => t('Austria'),
+      'BE' => t('Belgium'),
+      'BR' => t('Brazil'),
+      'CA' => t('Canada'),
+      'CN' => t('China'),
+      'FR' => t('France'),
+      'DE' => t('Germany'),
+      'IT' => t('Italy'),
+      'NL' => t('Netherlands'),
+      'PL' => t('Poland'),
+      'PT' => t('Portugal'),
+      'RU' => t('Russia'),
+      'ES' => t('Spain'),
+      'CH' => t('Switzerland'),
+      'GB' => t('United Kingdom'),
+      'US' => t('United States'),
+    ),
+    t('By language') => array(
+      'da_DK' => t('Danish (for Denmark only)'),
+      'he_IL' => t('Hebrew (for all)'),
+      'id_ID' => t('Indonesian (for Indonesia only)'),
+      'jp_JP' => t('Japanese (for Japan only)'),
+      'no_NO' => t('Norwegian (for Norway only)'),
+      'pt_BR' => t('Brazilian Portuguese (for Portugal and Brazil only)'),
+      'ru_RU' => t('Russian (for Lithuania, Latvia, and Ukraine only)'),
+      'sv_SE' => t('Swedish (for Sweden only)'),
+      'th_TH' => t('Thai (for Thailand only)'),
+      'tr_TR' => t('Turkish (for Turkey only)'),
+      'zh_CN' => t('Simplified Chinese (for China only)'),
+      'zh_HK' => t('Traditional Chinese (for Hong Kong only)'),
+      'zh_TW' => t('Traditional Chinese (for Taiwan only)'),
+    ),
+  );
+}
+
+/**
  * Returns an array of PayPal payment method icon img elements.
  *
  * @return
diff --git a/modules/ec/commerce_paypal_ec.module b/modules/ec/commerce_paypal_ec.module
index ea7074a..0e99eb5 100644
--- a/modules/ec/commerce_paypal_ec.module
+++ b/modules/ec/commerce_paypal_ec.module
@@ -166,6 +166,7 @@ function commerce_paypal_ec_default_settings() {
     'txn_type' => COMMERCE_CREDIT_AUTH_CAPTURE,
     'ec_mode' => 'Mark',
     'shipping_prompt' => 1,
+    'language' => 'US',
     'log' => array('request' => 0, 'response' => 0),
     'show_payment_instructions' => FALSE,
   );
@@ -256,6 +257,13 @@ function commerce_paypal_ec_settings_form($settings = array()) {
     $form['shipping_prompt']['#default_value'] = $settings['shipping_prompt'];
   }
 
+  $form['language'] = array(
+    '#type' => 'select',
+    '#title' => t('PayPal login page language / locale'),
+    '#options' => commerce_paypal_languages() + array(t('Other') => array('MULTILINGUAL' => "Multilingual website", 'USER' => "User's prefered language")),
+    '#default_value' => $settings['language'],
+  );
+
   $form['log'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Log the following messages for debugging'),
@@ -328,7 +336,7 @@ function commerce_paypal_ec_order_form($form, &$form_state, $payment_method, $or
   $form['paypal_ec'] = array(
     '#type' => 'image_button',
     '#value' => t('Check out with PayPal'),
-    '#src' => commerce_paypal_ec_button_url(),
+    '#src' => commerce_paypal_ec_button_url($payment_method),
     '#attached' => array(
       'css' => array(
         drupal_get_path('module', 'commerce_paypal_ec') . '/theme/commerce_paypal_ec.theme.css',
@@ -625,6 +633,8 @@ function commerce_paypal_ec_set_express_checkout($payment_method, $order, $flow)
     // them right now.
     'ALLOWNOTE' => '0',
 
+    'LOCALECODE' => commerce_paypal_ec_get_paypal_country_code($payment_method),
+
     'PAYMENTREQUEST_0_PAYMENTACTION' => commerce_paypal_payment_action($payment_method['settings']['txn_type']),
     'PAYMENTREQUEST_0_AMT' => commerce_paypal_price_amount($order_total['amount'], $order_total['currency_code']),
     'PAYMENTREQUEST_0_CURRENCYCODE' => $currency_code,
@@ -1089,12 +1099,91 @@ function commerce_paypal_ec_enabled($order = NULL) {
 }
 
 /**
- * Returns the URL to an Express Checkout button.
+ * Returns an array of all available language codes.
+ *
+ * Matching between Drupal's predefined language codes and Paypal's country
+ * codes.
  *
- * @todo Allow for localization by changing en_US to a supported locale code.
+ * @return array
  */
-function commerce_paypal_ec_button_url() {
-  return 'https://www.paypalobjects.com/en_US/i/btn/btn_xpressCheckout.gif';
+function commerce_paypal_ec_locale_codes() {
+  return array(
+    'ast' => 'AT',
+    'de' => 'DE',
+    'es' => 'ES',
+    'en' => 'US',
+    'fr' => 'FR',
+    'it' => 'IT',
+    'nl' => 'NL',
+    'pl' => 'PL',
+    'pt-br' => 'BR',
+    'pt-pt' => 'PT',
+    'ru' => 'RU',
+    'zh-hans' => 'CN',
+    'zh-hant' => 'CN',
+  );
+}
+
+
+/**
+ * Return the Paypal country code based on the payment method settings.
+ *
+ * @param $payment_method
+ * @return string
+ */
+function commerce_paypal_ec_get_paypal_country_code($payment_method) {
+  switch($payment_method['settings']['language'] ) {
+    case 'USER':
+      // Select the prefered language of the user
+      global $user;
+      $paypal_language_codes = commerce_paypal_ec_locale_codes();
+      return isset($paypal_language_codes[$user->language]) ? $paypal_language_codes[$user->language] : 'US';
+
+    case 'MULTILINGUAL':
+      // Select the lang of the website
+      global $language;
+      $paypal_country_codes = commerce_paypal_ec_locale_codes();
+      return isset($paypal_country_codes[$language->language]) ? $paypal_country_codes[$language->language] : 'US';
+
+    default:
+      // Use the configured lang.
+      return $payment_method['settings']['language'];
+  }
+}
+
+/**
+ * Returns the URL to an Express Checkout image.
+ *
+ * @see https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_WPButtonIntegration
+ */
+function commerce_paypal_ec_button_url($payment_method) {
+  // Get the country code configured for the payment method.
+  $country_code = commerce_paypal_ec_get_paypal_country_code($payment_method);
+
+  // Matching between Paypal's locale codes and country codes.
+  $locale_code = array(
+    'AU' => 'en_AU',
+    'AT' => 'de_DE',
+    'BE' => 'fr_FR',
+    'BR' => 'pt_BR',
+    'CA' => 'fr_CA',
+    'CN' => 'zh_CN',
+    'DE' => 'de_DE',
+    'ES' => 'es_ES',
+    'FR' => 'fr_FR',
+    'GB' => 'en_GB',
+    'IT' => 'it_IT',
+    'NL' => 'nl_NL',
+    'PL' => 'pl_PL',
+    'PT' => 'pt_PT',
+    'RU' => 'ru_RU',
+    'US' => 'en_US',
+    'jp_jp' => 'ja_JP',
+  );
+
+  return isset($locale_code[$country_code])
+    ? 'https://fpdbs.paypal.com/dynamicimageweb?cmd=_dynamic-image&locale=' . $locale_code[$country_code]
+    : 'https://fpdbs.paypal.com/dynamicimageweb?cmd=_dynamic-image&locale=en_US';
 }
 
 /**
diff --git a/modules/wps/commerce_paypal_wps.module b/modules/wps/commerce_paypal_wps.module
index b45c861..bba7851 100644
--- a/modules/wps/commerce_paypal_wps.module
+++ b/modules/wps/commerce_paypal_wps.module
@@ -81,7 +81,7 @@ function commerce_paypal_wps_settings_form($settings = array()) {
   $form['language'] = array(
     '#type' => 'select',
     '#title' => t('PayPal login page language / locale'),
-    '#options' => commerce_paypal_wps_languages(),
+    '#options' => commerce_paypal_languages(),
     '#default_value' => $settings['language'],
   );
   $form['server'] = array(
@@ -466,45 +466,3 @@ function commerce_paypal_wps_server_url($server) {
       return 'https://www.paypal.com/cgi-bin/webscr';
   }
 }
-
-/**
- * Returns an array of all possible language codes.
- */
-function commerce_paypal_wps_languages() {
-  return array(
-    t('By country') => array(
-      'AU' => t('Australia'),
-      'AT' => t('Austria'),
-      'BE' => t('Belgium'),
-      'BR' => t('Brazil'),
-      'CA' => t('Canada'),
-      'CN' => t('China'),
-      'FR' => t('France'),
-      'DE' => t('Germany'),
-      'IT' => t('Italy'),
-      'NL' => t('Netherlands'),
-      'PL' => t('Poland'),
-      'PT' => t('Portugal'),
-      'RU' => t('Russia'),
-      'ES' => t('Spain'),
-      'CH' => t('Switzerland'),
-      'GB' => t('United Kingdom'),
-      'US' => t('United States'),
-    ),
-    t('By language') => array(
-      'da_DK' => t('Danish (for Denmark only)'),
-      'he_IL' => t('Hebrew (for all)'),
-      'id_ID' => t('Indonesian (for Indonesia only)'),
-      'jp_JP' => t('Japanese (for Japan only)'),
-      'no_NO' => t('Norwegian (for Norway only)'),
-      'pt_BR' => t('Brazilian Portuguese (for Portugal and Brazil only)'),
-      'ru_RU' => t('Russian (for Lithuania, Latvia, and Ukraine only)'),
-      'sv_SE' => t('Swedish (for Sweden only)'),
-      'th_TH' => t('Thai (for Thailand only)'),
-      'tr_TR' => t('Turkish (for Turkey only)'),
-      'zh_CN' => t('Simplified Chinese (for China only)'),
-      'zh_HK' => t('Traditional Chinese (for Hong Kong only)'),
-      'zh_TW' => t('Traditional Chinese (for Taiwan only)'),
-    ),
-  );
-}
