| Index: chrome/browser/intents/cws_intents_registry.cc
 | 
| diff --git a/chrome/browser/intents/cws_intents_registry.cc b/chrome/browser/intents/cws_intents_registry.cc
 | 
| index 78fc48b2fe855bba84c87084bd334e603374cf4f..96fd943aa1d8c9a30c4234283ffee7c4b484aa0e 100644
 | 
| --- a/chrome/browser/intents/cws_intents_registry.cc
 | 
| +++ b/chrome/browser/intents/cws_intents_registry.cc
 | 
| @@ -10,6 +10,8 @@
 | 
|  #include "base/stl_util.h"
 | 
|  #include "base/string16.h"
 | 
|  #include "base/utf_string_conversions.h"
 | 
| +#include "chrome/common/extensions/extension_l10n_util.h"
 | 
| +#include "chrome/common/extensions/message_bundle.h"
 | 
|  #include "chrome/browser/intents/api_key.h"
 | 
|  #include "chrome/browser/net/chrome_url_request_context.h"
 | 
|  #include "chrome/browser/webdata/web_data_service.h"
 | 
| @@ -38,6 +40,17 @@ const char kMaxSuggestions[] = "15";
 | 
|  const char kCWSIntentServiceURL[] =
 | 
|    "https://www.googleapis.com/chromewebstore/v1.1b/items/intent";
 | 
|  
 | 
| +// Determines if a string is a candidate for localization.
 | 
| +bool ShouldLocalize(const std::string& value) {
 | 
| +  std::string::size_type index = 0;
 | 
| +  index = value.find(extensions::MessageBundle::kMessageBegin);
 | 
| +   if (index == std::string::npos)
 | 
| +     return false;
 | 
| +
 | 
| +  index = value.find(extensions::MessageBundle::kMessageEnd, index);
 | 
| +  return (index != std::string::npos);
 | 
| +}
 | 
| +
 | 
|  // Parses a JSON |response| from the CWS into a list of suggested extensions,
 | 
|  // stored in |intents|. |intents| must not be NULL.
 | 
|  void ParseResponse(const std::string& response,
 | 
| @@ -92,6 +105,38 @@ void ParseResponse(const std::string& response,
 | 
|        continue;
 | 
|      info.icon_url = GURL(url_string);
 | 
|  
 | 
| +    // Need to parse CWS reply, since it is not pre-l10n'd.
 | 
| +    ListValue* all_locales = NULL;
 | 
| +    if (ShouldLocalize(UTF16ToUTF8(info.name)) &&
 | 
| +        item->GetList("locale_data", &all_locales)) {
 | 
| +      std::map<std::string, std::string> localized_title;
 | 
| +
 | 
| +      for (ListValue::const_iterator locale_iter(all_locales->begin());
 | 
| +           locale_iter != all_locales->end(); ++locale_iter) {
 | 
| +        DictionaryValue* locale = static_cast<DictionaryValue*>(*locale_iter);
 | 
| +
 | 
| +        std::string locale_id, title;
 | 
| +        if (!locale->GetString("locale_string", &locale_id) ||
 | 
| +            !locale->GetString("title", &title))
 | 
| +          continue;
 | 
| +
 | 
| +        localized_title[locale_id] = title;
 | 
| +      }
 | 
| +
 | 
| +      std::vector<std::string> valid_locales;
 | 
| +      extension_l10n_util::GetAllFallbackLocales(
 | 
| +          extension_l10n_util::CurrentLocaleOrDefault(),
 | 
| +          "all",
 | 
| +          &valid_locales);
 | 
| +      for (std::vector<std::string>::iterator iter = valid_locales.begin();
 | 
| +          iter != valid_locales.end(); ++iter) {
 | 
| +        if (localized_title.count(*iter)) {
 | 
| +            info.name = UTF8ToUTF16(localized_title[*iter]);
 | 
| +            break;
 | 
| +        }
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
|      intents->push_back(info);
 | 
|    }
 | 
|  }
 | 
| 
 |