| Index: chrome/browser/extensions/extension_l10n_util.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_l10n_util.cc (revision 25781)
|
| +++ chrome/browser/extensions/extension_l10n_util.cc (working copy)
|
| @@ -12,27 +12,31 @@
|
| #include "base/file_util.h"
|
| #include "base/string_util.h"
|
| #include "base/values.h"
|
| +#include "chrome/browser/extensions/extension_message_bundle.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/extensions/extension_constants.h"
|
| +#include "chrome/common/json_value_serializer.h"
|
|
|
| +namespace errors = extension_manifest_errors;
|
| namespace keys = extension_manifest_keys;
|
|
|
| namespace extension_l10n_util {
|
|
|
| -bool ValidateDefaultLocale(const Extension* extension) {
|
| - std::string default_locale = extension->default_locale();
|
| -
|
| - if (extension->supported_locales().find(default_locale) !=
|
| - extension->supported_locales().end()) {
|
| - return true;
|
| - } else {
|
| - return false;
|
| +std::string GetDefaultLocaleFromManifest(const DictionaryValue& manifest,
|
| + std::string* error) {
|
| + std::string default_locale;
|
| + if (!manifest.GetString(keys::kDefaultLocale, &default_locale)) {
|
| + *error = errors::kInvalidDefaultLocale;
|
| + return "";
|
| }
|
| + // Normalize underscores to hyphens.
|
| + std::replace(default_locale.begin(), default_locale.end(), '_', '-');
|
| + return default_locale;
|
| }
|
|
|
| bool AddLocale(const std::set<std::string>& chrome_locales,
|
| const FilePath& locale_folder,
|
| - Extension* extension,
|
| + std::set<std::string>* valid_locales,
|
| std::string* locale_name,
|
| std::string* error) {
|
| // Normalize underscores to hyphens because that's what our locale files use.
|
| @@ -50,7 +54,7 @@
|
| // Check if messages file is actually present (but don't check content).
|
| if (file_util::PathExists(
|
| locale_folder.AppendASCII(Extension::kMessagesFilename))) {
|
| - extension->AddSupportedLocale(*locale_name);
|
| + valid_locales->insert(*locale_name);
|
| } else {
|
| *error = StringPrintf("Catalog file is missing for locale %s.",
|
| locale_name->c_str());
|
| @@ -60,8 +64,8 @@
|
| return true;
|
| }
|
|
|
| -bool AddValidLocales(const FilePath& locale_path,
|
| - Extension* extension,
|
| +bool GetValidLocales(const FilePath& locale_path,
|
| + std::set<std::string>* valid_locales,
|
| std::string* error) {
|
| // Get available chrome locales as a set.
|
| const std::vector<std::string>& available_locales =
|
| @@ -76,13 +80,16 @@
|
| while (!(locale_folder = locales.Next()).empty()) {
|
| std::string locale_name =
|
| WideToASCII(locale_folder.BaseName().ToWStringHack());
|
| - if (!AddLocale(chrome_locales, locale_folder,
|
| - extension, &locale_name, error)) {
|
| + if (!AddLocale(chrome_locales,
|
| + locale_folder,
|
| + valid_locales,
|
| + &locale_name,
|
| + error)) {
|
| return false;
|
| }
|
| }
|
|
|
| - if (extension->supported_locales().empty()) {
|
| + if (valid_locales->empty()) {
|
| *error = extension_manifest_errors::kLocalesNoValidLocaleNamesListed;
|
| return false;
|
| }
|
| @@ -90,4 +97,51 @@
|
| return true;
|
| }
|
|
|
| +// Loads contents of the messages file for given locale. If file is not found,
|
| +// or there was parsing error we return NULL and set |error|.
|
| +// Caller owns the returned object.
|
| +static DictionaryValue* LoadMessageFile(const FilePath& locale_path,
|
| + const std::string& locale,
|
| + std::string* error) {
|
| + std::string extension_locale = locale;
|
| + // Normalize hyphens to underscores because that's what our locale files use.
|
| + std::replace(extension_locale.begin(), extension_locale.end(), '-', '_');
|
| + FilePath file = locale_path.AppendASCII(extension_locale)
|
| + .AppendASCII(Extension::kMessagesFilename);
|
| + JSONFileValueSerializer messages_serializer(file);
|
| + Value *dictionary = messages_serializer.Deserialize(error);
|
| + if (!dictionary && error->empty()) {
|
| + // JSONFileValueSerializer just returns NULL if file cannot be found. It
|
| + // doesn't set the error, so we have to do it.
|
| + *error = StringPrintf("Catalog file is missing for locale %s.",
|
| + extension_locale.c_str());
|
| + }
|
| +
|
| + return static_cast<DictionaryValue*>(dictionary);
|
| +}
|
| +
|
| +ExtensionMessageBundle* LoadMessageCatalogs(
|
| + const FilePath& locale_path,
|
| + const std::string& default_locale,
|
| + const std::string& application_locale,
|
| + std::string* error) {
|
| + scoped_ptr<DictionaryValue> default_catalog(
|
| + LoadMessageFile(locale_path, default_locale, error));
|
| + if (!default_catalog.get()) {
|
| + return false;
|
| + }
|
| +
|
| + scoped_ptr<DictionaryValue> app_catalog(
|
| + LoadMessageFile(locale_path, application_locale, error));
|
| + if (!app_catalog.get()) {
|
| + // Only default catalog has to be present. This is not an error.
|
| + app_catalog.reset(new DictionaryValue);
|
| + error->clear();
|
| + }
|
| +
|
| + return ExtensionMessageBundle::Create(*default_catalog,
|
| + *app_catalog,
|
| + error);
|
| +}
|
| +
|
| } // namespace extension_l10n_util
|
|
|