My favorites | Sign in
Logo
Project hosting will be READ-ONLY Wednesday at 8am PST due to brief network maintenance.
             
New issue | Search
for
| Advanced search | Search tips
Issue 12131: Implement I18N support for extensions
9 people starred this issue and may be notified of changes. Back to list
 
Reported by aa@chromium.org, May 17, 2009
Implement APIs to support I18N of extensions. This includes:

- Strings in HTML
- Strings in the manifest
- APIs to get strings dynamically from JavaScript (eg for use in alerts)

Comment 1 by aa@chromium.org, May 17, 2009
(No comment was entered for this change.)
Labels: -Pri-2 Pri-3
Comment 2 by xlyuan@chromium.org, May 20, 2009
(No comment was entered for this change.)
Cc: js...@chromium.org hb...@chromium.org
Labels: I18N
Comment 3 by aa@chromium.org, May 20, 2009
(No comment was entered for this change.)
Cc: a...@chromium.org rafa...@chromium.org erik...@chromium.org mpcompl...@chromium.org nickb...@chromium.org asarg...@chromium.org
Comment 4 by aa@chromium.org, Jun 09, 2009
(No comment was entered for this change.)
Labels: -Pri-3 Pri-2 Mstone-4
Comment 5 by nickbaum@chromium.org, Jun 24, 2009
More details:
There are 5 parts to internationalize:
*Manifest (name, description...)
*HTML files (toolstrips, popups...)
*JS code (alerts, dynamically generated HTML...)
*Local resources (images...)
*Server side resources (fetching different urls based on locale)

The international files should likely be organized in a separate sub-directory to
minimize clutter.

Question: do we need extensions to support multiple locales, in addition to multiple
languages?
Cc: c...@chromium.org
Comment 6 by c...@chromium.org, Jun 24, 2009
We can use lang_ALL convention, so that if developer wants to cover all english 
speaking locales he implements only en_ALL. Somebody else can pitch in with en_in later 
on it would just work...
Comment 7 by c...@chromium.org, Jun 24, 2009
(No comment was entered for this change.)
Status: Assigned
Comment 8 by jshin@chromium.org, Jun 24, 2009
Cira, I'm assuming that you wanted to assign this to yourself. Otherwise, the status 
shouldn't be set to assigned :-)

Should we put 'the global default' in all_ALL or is it kinda redundant? 

BTW, CSS stylesheets may have to be localizable as well. 

Owner: c...@chromium.org
Comment 9 by nickbaum@chromium.org, Jun 25, 2009
RE:locales, the answer is yes, we should support them. From Christos:

"I believe some type of extensions, especially geo-location dependent ones, locale
will be important, not just language. [...] Also any extension that relies on let's
say media content for which the owner may have  limited rights to a specific
geographic area will require the same thing."
Comment 10 by nickbaum@chromium.org, Aug 04, 2009
(No comment was entered for this change.)
Labels: Channel-Beta
Comment 11 by bugdroid1@chromium.org, Aug 19, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=23739 

------------------------------------------------------------------------
r23739 | cira@chromium.org | 2009-08-19 13:45:14 -0700 (Wed, 19 Aug 2009) | 16 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.cc?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.h?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util_unittest.cc?r1=23739&r2=23738
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.h
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/chrome.gyp?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.cc?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.h?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_constants.cc?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_constants.h?r1=23739&r2=23738
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_unittest.cc?r1=23739&r2=23738

This change enables Chrome to load locale information for the extension. It detects default locale, and filters out all locales not supported
by Chrome or with invalid names/missing messages.

It also checks for folders that start with _ and are not in the reserved list.

We don't validate messages file with this CL.

Added support for loading supplied locale information to the extension_file_util, and detecting default locale.
Added new constants to extension class (_locales directory name, messages filename).
Added new error messages to _constants.
Added new unittests.

BUG=12131
TEST=There should be no visible changes, except in case of error when loading extension (e.g. create empty _locales folder and try loading).

Review URL: http://codereview.chromium.org/170015
------------------------------------------------------------------------

Comment 12 by aa@chromium.org, Sep 09, 2009
(No comment was entered for this change.)
Labels: -Channel-Beta
Comment 13 by bugdroid1@chromium.org, Sep 18, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=26609 

------------------------------------------------------------------------
r26609 | cira@chromium.org | 2009-09-18 14:07:39 -0700 (Fri, 18 Sep 2009) | 24 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.h?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util_unittest.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.h?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util_unittest.cc?r1=26609&r2=26608
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_message_bundle.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_message_bundle.h
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_message_bundle_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_ui_unittest.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/chrome.gyp?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.h?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_unittest.cc?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/_locales/en_US/messages.json?r1=26609&r2=26608
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/_locales/sr/messages.json?r1=26609&r2=26608

CL is the same as http://codereview.chromium.org/173487, but had to be moved to new CL number because I switched machines.

Implemented the rest of loading/parsing logic for extension i18n:

1. Loading message catalogs for default and application locale.
2. Parsing JSON and replacing placeholders with actual content within a message.
3. Creating unified dictionary (union of default and application dictionaries,
where application dict. has priority for common messages).

New class ExtensionMessageBundle holds new dictionary, and parses data. It's
injected into Extension.

ExtensionMessageHandler::ReplaceVariablesInString can replace both
$placeholders$ and __MSG_messages__ in given string (HTML, manifest, actual
message string...).

Implemented actual manifest name/description replacement too, as an example.

Extension is now pretty agnostic about localization, and this makes it easier to use message bundles
with things that are not extensions...

BUG=12131

Review URL: http://codereview.chromium.org/202063
------------------------------------------------------------------------

Comment 14 by bugdroid1@chromium.org, Sep 28, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=27393 

------------------------------------------------------------------------
r27393 | cira@chromium.org | 2009-09-28 12:38:49 -0700 (Mon, 28 Sep 2009) | 14 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc?r1=27393&r2=27392
   D /trunk/src/chrome/browser/extensions/extension_message_bundle.cc
   D /trunk/src/chrome/browser/extensions/extension_message_bundle.h
   D /trunk/src/chrome/browser/extensions/extension_message_bundle_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_process_manager.cc?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/chrome.gyp?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/api/extension_api.json?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/i18n.html?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/static/i18n.html?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.h?r1=27393&r2=27392
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle.h
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/render_messages_internal.h?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/extensions/extension_api_client_unittest.cc?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/extensions/extension_process_bindings.cc?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/extensions/extension_process_bindings.h?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/render_thread.cc?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/render_thread.h?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/resources/extension_process_bindings.js?r1=27393&r2=27392
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_test/i18n/_locales
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_test/i18n/_locales/en_US
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_test/i18n/_locales/en_US/messages.json
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_test/i18n/manifest.json?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/api_test/i18n/test.js?r1=27393&r2=27392
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/_locales
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/_locales/en_US
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/_locales/en_US/messages.json
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/_locales/sr
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/_locales/sr/messages.json
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/manifest.json?r1=27393&r2=27392
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/samples/i18n/toolstrip.html?r1=27393&r2=27392

Implementing chrome.i18n.getMessage call, that loads message from the extension catalog, and if necessary replaces placeholders (up to 9).

I have 3 forms of getMessage call:

getMessage("name") for simple messages without placeholders.
getMessage("name", "one param") for messages with only one placeholder.
getMessage("name", ["one", "two"]) for messages with only one or more placeholders.

getMessage returns string.

BUG=12131
TEST=Load samples/i18n extension (switch Chrome to sr locale) and observe ext. name, description and toolstrip texts should be in Serbian.

Review URL: http://codereview.chromium.org/225009
------------------------------------------------------------------------

Comment 15 by bugdroid1@chromium.org, Oct 07, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=28333 

------------------------------------------------------------------------
r28333 | cira@chromium.org | 2009-10-07 15:49:10 -0700 (Wed, 07 Oct 2009) | 12 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/crx_installer.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/execute_code_in_tab_function.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/execute_code_in_tab_function.h?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_disabled_infobar_delegate.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.h?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util_unittest.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_protocols.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extensions_service_unittest.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extensions_ui.cc?r1=28333&r2=28332
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/file_reader.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/file_reader.h
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/file_reader_unittest.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/image_loading_tracker.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/image_loading_tracker.h
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/user_script_master.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/gtk/location_bar_view_gtk.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/gtk/location_bar_view_gtk.h?r1=28333&r2=28332
   D /trunk/src/chrome/browser/image_loading_tracker.cc
   D /trunk/src/chrome/browser/image_loading_tracker.h
   D /trunk/src/chrome/browser/net/file_reader.cc
   D /trunk/src/chrome/browser/net/file_reader.h
   D /trunk/src/chrome/browser/net/file_reader_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/views/browser_actions_container.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/views/location_bar_view.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/views/location_bar_view.h?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/chrome.gyp?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension.h?r1=28333&r2=28332
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_resource.cc
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_resource.h
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_resource_unittest.cc
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_unittest.cc?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/user_script.h?r1=28333&r2=28332
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/user_script_unittest.cc?r1=28333&r2=28332

Loads local resources from current locale subtree if available, if not it falls back to extension subtree.

We look for ext_root/foo/bar.js under ext_root/_locales/fr/foo/bar.js if current locale is fr. If there is no fr specific resource we load ext_root/foo/bar.js instead.

Lots of small refactoring to replace FilePath with ExtensionResource.


BUG=12131
TEST=See unittest for sample tree.


Review URL: http://codereview.chromium.org/256022
------------------------------------------------------------------------

Comment 16 by bugdroid1@chromium.org, Oct 21, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=29684 

------------------------------------------------------------------------
r29684 | cira@chromium.org | 2009-10-21 12:08:23 -0700 (Wed, 21 Oct 2009) | 20 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_file_util.cc?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.h?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util_unittest.cc?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle.cc?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle.h?r1=29684&r2=29683
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_message_bundle_unittest.cc?r1=29684&r2=29683
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/_locales/en
   A http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/_locales/en/messages.json
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/test/data/extensions/good/Extensions/behllobkkfkfnphdnhnkndlbkcpglgmj/1.0.0.0/_locales/en_US/messages.json?r1=29684&r2=29683

Implementing better fallback algorithm.

Before:
 current_locale->default_locale

Now:
 current_locale->chain_of_parent_locales->default_locale

If default_locale is de, and current locale en_US, we follow:
en_US -> en -> de

en is not a Chrome locale (only en_US, en_GB are), but we fake it to allow this kind of fallback.

Developers can implement common locale root with most of the messages (like en) and put locale specifics in en_GB (color->colour) or en_US. You can even symlink en and en_US and save on work.

I am planning on fixing loading local resources too, to use this child->parent fallback.

BUG=12131

Review URL: http://codereview.chromium.org/293037
------------------------------------------------------------------------

Comment 17 by jshin@chromium.org, Oct 21, 2009
Cira, would it be possible to break this "meta" bug into sub-issues? That way, we may 
have a better sense of what's done and what remains to do. BTW, thank you for your 
great work !
Comment 18 by c...@chromium.org, Oct 22, 2009
I've just sent list of unsolved problems to Aaron. I can convert that list into 3 new 
bugs, and close this one.
Comment 19 by bugdroid1@chromium.org, Oct 22, 2009
The following revision refers to this bug:
    http://src.chromium.org/viewvc/chrome?view=rev&revision=29815 

------------------------------------------------------------------------
r29815 | cira@chromium.org | 2009-10-22 13:56:18 -0700 (Thu, 22 Oct 2009) | 13 lines
Changed paths:
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.cc?r1=29815&r2=29814
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util.h?r1=29815&r2=29814
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_l10n_util_unittest.cc?r1=29815&r2=29814
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_resource.cc?r1=29815&r2=29814
   M http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/extension_resource_unittest.cc?r1=29815&r2=29814

Loading local resources uses improved fallback algorithm.

Before:
 _locales/current_locale/rel_path, then extension root/rel_path

Now:
 _locales/{current_locale, parents}/rel_path, then extension root/rel_path

This change syncs local resource loading with catalog loading algo.

BUG=12131

Review URL: http://codereview.chromium.org/316013
------------------------------------------------------------------------

Comment 20 by c...@chromium.org, Oct 28, 2009
I'll open 3 new bugs with details that need to be addressed, and close this mega bug.
Not ready for Mstone-4.
Status: Fixed
Sign in to add a comment