blob: 086f82831a41a91d848180a95359f5cb588a51c3 [file] [log] [blame]
<!DOCTYPE html><!-- This page is a placeholder for generated extensions api doc. Note:
1) The <head> information in this page is significant, should be uniform
across api docs and should be edited only with knowledge of the
templating mechanism.
3) All <body>.innerHTML is genereated as an rendering step. If viewed in a
browser, it will be re-generated from the template, json schema and
authored overview content.
4) The <body>.innerHTML is also generated by an offline step so that this
page may easily be indexed by search engines.
--><html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="css/ApiRefStyles.css" rel="stylesheet" type="text/css">
<link href="css/print.css" rel="stylesheet" type="text/css" media="print">
<script type="text/javascript" src="../../../third_party/jstemplate/jstemplate_compiled.js">
</script>
<script type="text/javascript" src="js/api_page_generator.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
<script type="text/javascript" src="js/sidebar.js"></script>
<title>Internationalization (i18n) - Google Chrome Extensions - Google Code</title></head>
<body> <div id="gc-container" class="labs">
<div id="devModeWarning">
You are viewing extension docs in chrome via the 'file:' scheme: are you expecting to see local changes when you refresh? You'll need run chrome with --allow-file-access-from-files.
</div>
<!-- SUBTEMPLATES: DO NOT MOVE FROM THIS LOCATION -->
<!-- In particular, sub-templates that recurse, must be used by allowing
jstemplate to make a copy of the template in this section which
are not operated on by way of the jsskip="true" -->
<div style="display:none">
<!-- VALUE -->
<div id="valueTemplate">
<dt>
<var>paramName</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional">optional</span>
<span class="enum">enumerated</span>
<span id="typeTemplate">
<span>
<a> Type</a>
</span>
<span>
<span>
array of <span><span></span></span>
</span>
<span>paramType</span>
<span></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo">
Undocumented.
</dd>
<dd>
Description of this parameter from the json schema.
</dd>
<dd>
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd>
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd>
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd>
<div></div>
</dd>
</div> <!-- /VALUE -->
<div id="functionParametersTemplate">
<h5>Parameters</h5>
<dl>
<div>
<div>
</div>
</div>
</dl>
</div>
</div> <!-- /SUBTEMPLATES -->
<a id="top"></a>
<div id="skipto">
<a href="#gc-pagecontent">Skip to page content</a>
<a href="#gc-toc">Skip to main navigation</a>
</div>
<!-- API HEADER -->
<table id="header" width="100%" cellspacing="0" border="0">
<tbody><tr>
<td valign="middle"><a href="http://code.google.com/"><img src="images/code_labs_logo.gif" height="43" width="161" alt="Google Code Labs" style="border:0; margin:0;"></a></td>
<td valign="middle" width="100%" style="padding-left:0.6em;">
<form action="http://www.google.com/cse" id="cse" style="margin-top:0.5em">
<div id="gsc-search-box">
<input type="hidden" name="cx" value="002967670403910741006:61_cvzfqtno">
<input type="hidden" name="ie" value="UTF-8">
<input type="text" name="q" value="" size="55">
<input class="gsc-search-button" type="submit" name="sa" value="Search">
<br>
<span class="greytext">e.g. "page action" or "tabs"</span>
</div>
</form>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("elements", "1", {packages: "transliteration"});</script>
<script type="text/javascript" src="http://www.google.com/coop/cse/t13n?form=cse&amp;t13n_langs=en"></script>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse&amp;lang=en"></script>
</td>
</tr>
</tbody></table>
<div id="codesiteContent" class="">
<a id="gc-topnav-anchor"></a>
<div id="gc-topnav">
<h1>Google Chrome Extensions (<a href="http://code.google.com/labs/">Labs</a>)</h1>
<ul id="home" class="gc-topnav-tabs">
<li id="home_link">
<a href="index.html" title="Google Chrome Extensions home page">Home</a>
</li>
<li id="docs_link">
<a href="docs.html" title="Official Google Chrome Extensions documentation">Docs</a>
</li>
<li id="faq_link">
<a href="faq.html" title="Answers to frequently asked questions about Google Chrome Extensions">FAQ</a>
</li>
<li id="samples_link">
<a href="samples.html" title="Sample extensions (with source code)">Samples</a>
</li>
<li id="group_link">
<a href="http://groups.google.com/a/chromium.org/group/chromium-extensions" title="Google Chrome Extensions developer forum">Group</a>
</li>
</ul>
</div> <!-- end gc-topnav -->
<div class="g-section g-tpl-170">
<!-- SIDENAV -->
<div class="g-unit g-first" id="gc-toc">
<ul>
<li><a href="getstarted.html">Getting Started</a></li>
<li><a href="overview.html">Overview</a></li>
<li><a href="whats_new.html">What's New?</a></li>
<li><h2><a href="devguide.html">Developer's Guide</a></h2>
<ul>
<li>Browser UI
<ul>
<li><a href="browserAction.html">Browser Actions</a></li>
<li><a href="contextMenus.html">Context Menus</a></li>
<li><a href="notifications.html">Desktop Notifications</a></li>
<li><a href="omnibox.html">Omnibox</a></li>
<li><a href="options.html">Options Pages</a></li>
<li><a href="override.html">Override Pages</a></li>
<li><a href="pageAction.html">Page Actions</a></li>
</ul>
</li>
<li>Browser Interaction
<ul>
<li><a href="bookmarks.html">Bookmarks</a></li>
<li><a href="cookies.html">Cookies</a></li>
<li><a href="events.html">Events</a></li>
<li><a href="history.html">History</a></li>
<li><a href="management.html">Management</a></li>
<li><a href="tabs.html">Tabs</a></li>
<li><a href="windows.html">Windows</a></li>
</ul>
</li>
<li>Implementation
<ul>
<li><a href="a11y.html">Accessibility</a></li>
<li><a href="background_pages.html">Background Pages</a></li>
<li><a href="content_scripts.html">Content Scripts</a></li>
<li><a href="xhr.html">Cross-Origin XHR</a></li>
<li><a href="idle.html">Idle</a></li>
<li class="leftNavSelected">Internationalization</li>
<li><a href="messaging.html">Message Passing</a></li>
<li><a href="npapi.html">NPAPI Plugins</a></li>
</ul>
</li>
<li>Finishing
<ul>
<li><a href="hosting.html">Hosting</a></li>
<li><a href="external_extensions.html">Other Deployment Options</a></li>
</ul>
</li>
</ul>
</li>
<li><h2><a href="apps.html">Packaged Apps</a></h2></li>
<li><h2><a href="tutorials.html">Tutorials</a></h2>
<ul>
<li><a href="tut_debugging.html">Debugging</a></li>
<li><a href="tut_analytics.html">Google Analytics</a></li>
<li><a href="tut_oauth.html">OAuth</a></li>
</ul>
</li>
<li><h2>Reference</h2>
<ul>
<li>Formats
<ul>
<li><a href="manifest.html">Manifest Files</a></li>
<li><a href="match_patterns.html">Match Patterns</a></li>
</ul>
</li>
<li><a href="permission_warnings.html">Permission Warnings</a></li>
<li><a href="api_index.html">chrome.* APIs</a></li>
<li><a href="api_other.html">Other APIs</a></li>
</ul>
</li>
<li><h2><a href="samples.html">Samples</a></h2></li>
<div class="line"> </div>
<li><h2>More</h2>
<ul>
<li><a href="http://code.google.com/chrome/webstore/docs/index.html">Chrome Web Store</a></li>
<li><a href="http://code.google.com/chrome/apps/docs/developers_guide.html">Hosted Apps</a></li>
<li><a href="themes.html">Themes</a></li>
</ul>
</li>
</ul>
</div>
<script>
initToggles();
</script>
<div class="g-unit" id="gc-pagecontent">
<div id="pageTitle">
<h1 class="page_title">Internationalization (i18n)</h1>
</div>
<!-- TABLE OF CONTENTS -->
<div id="toc">
<h2>Contents</h2>
<ol>
<li>
<a href="#l10">How to support multiple languages</a>
<ol>
<li style="display: none; ">
<a>h3Name</a>
</li>
</ol>
</li><li>
<a href="#overview-predefined">Predefined messages</a>
<ol>
<li style="display: none; ">
<a>h3Name</a>
</li>
</ol>
</li><li>
<a href="#overview-locales">Locales</a>
<ol>
<li>
<a href="#locales-supported">Supported locales</a>
</li><li>
<a href="#locales-usage">How extensions find strings</a>
</li><li>
<a href="#locales-testing">How to set your browser's locale</a>
</li>
</ol>
</li><li>
<a href="#overview-examples">Examples</a>
<ol>
<li>
<a href="#examples-getMessage">Examples: getMessage</a>
</li><li>
<a href="#example-accept-languages">Example: getAcceptLanguages</a>
</li>
</ol>
</li>
<li>
<a href="#apiReference">API reference: chrome.i18n</a>
<ol>
<li style="display: none; ">
<a href="#properties">Properties</a>
<ol>
<li>
<a href="#property-anchor">propertyName</a>
</li>
</ol>
</li>
<li>
<a href="#global-methods">Methods</a>
<ol>
<li>
<a href="#method-getAcceptLanguages">getAcceptLanguages</a>
</li><li>
<a href="#method-getMessage">getMessage</a>
</li>
</ol>
</li>
<li style="display: none; ">
<a>Events</a>
<ol>
<li>
<a href="#event-anchor">eventName</a>
</li>
</ol>
</li>
<li style="display: none; ">
<a href="#types">Types</a>
<ol>
<li>
<a href="#id-anchor">id</a>
</li>
</ol>
</li>
</ol>
</li>
</ol>
</div>
<!-- /TABLE OF CONTENTS -->
<!-- Standard content lead-in for experimental API pages -->
<p id="classSummary" style="display: none; ">
For information on how to use experimental APIs, see the <a href="experimental.html">chrome.experimental.* APIs</a> page.
</p>
<!-- STATIC CONTENT PLACEHOLDER -->
<div id="static"><div id="pageData-name" class="pageData">Internationalization (i18n)</div>
<!--
[NOTEs for editors:
* Try to be consistent about string vs. message (it's probably not yet).
-->
<!-- BEGIN AUTHORED CONTENT -->
<p id="classSummary">
An <em>internationalized</em> extension
can be easily
<em>localized</em>
adapted to languages and regions
that it didn't originally support.
</p>
<p>
To internationalize your extension,
you need to put all of its user-visible strings into a file
named <a href="i18n-messages.html"><code>messages.json</code></a>.
Each time you localize your extension
you add a messages file
under a directory
named <code>_locales/<em>localeCode</em></code>,
where <em>localeCode</em> is a code such as
<code>en</code> for English.
</p>
<p>
Here's the file hierarchy
for an internationalized extension that supports
English (<code>en</code>),
Spanish (<code>es</code>), and
Korean (<code>ko</code>):
</p>
<img src="images/i18n-hierarchy.gif" alt="In the extension directory: manifest.json, *.html, *.js, _locales directory. In the _locales directory: en, es, and ko directories, each with a messages.json file." width="385" height="77">
<h2 id="l10">How to support multiple languages</h2>
<p>
Say you have an extension
with the files shown in the following figure:
</p>
<img src="images/i18n-before.gif" alt="A manifest.json file and a file with JavaScript. The .json file has &quot;name&quot;: &quot;Hello World&quot;. The JavaScript file has title = &quot;Hello World&quot;;" width="323" height="148">
<p>
To internationalize this extension,
you name each user-visible string
and put it into a messages file.
The extension's manifest,
CSS files,
and JavaScript code
use each string's name to get its localized version.
</p>
<p>
Here's what the extension looks like when it's internationalized
(note that it still has only English strings):
</p>
<img src="images/i18n-after-1.gif" alt="In the manifest.json file, &quot;Hello World&quot; has been changed to &quot;__MSG_extName__&quot;, and a new &quot;default_locale&quot; item has the value &quot;en&quot;. In the JavaScript file, &quot;Hello World&quot; has been changed to chrome.i18n.getMessage(&quot;extName&quot;). A new file named _locales/en/messages.json defines &quot;extName&quot;." width="782" height="228">
<p class="note">
<b>Important:</b>
If an extension has a <code>_locales</code> directory,
the <a href="manifest.html">manifest</a>
<b>must</b> define "default_locale".
</p>
<p>
Some notes about internationalizing extensions:
</p>
<ul>
<li><p>
You can use any of the <a href="#overview-locales">supported locales</a>.
If you use an unsupported locale,
Google Chrome ignores it.
</p></li>
<li>
In <code>manifest.json</code>
and CSS files,
refer to a string named <em>messagename</em> like this:
<pre>__MSG_<em>messagename</em>__</pre>
</li>
<li>
In your extension's JavaScript code,
refer to a string named <em>messagename</em>
like this:
<pre>chrome.i18n.getMessage("<em>messagename</em>")</pre>
</li><li> <p>
In each call to <code>getMessage()</code>,
you can supply up to 9 strings
to be included in the message.
See <a href="#examples-getMessage">Examples: getMessage</a>
for details.
</p>
</li>
<li><p>
Some messages, such as <code>@@bidi_dir</code> and <code>@@ui_locale</code>,
are provided by the internationalization system.
See the <a href="#overview-predefined">Predefined messages</a> section
for a full list of predefined message names.
</p>
</li>
<li>
In <code>messages.json</code>,
each user-visible string has a name, a "message" item,
and an optional "description" item.
The name is a key
such as "extName" or "search_string"
that identifies the string.
The "message" specifies
the value of the string in this locale.
The optional "description"
provides help to translators,
who might not be able to see how the string is used in your extension.
For example:
<pre>{
"search_string": {
"message": "hello%20world",
"description": "The string we search for. Put %20 between words that go together."
},
...
}</pre>
<p>
For more information, see
<a href="i18n-messages.html">Formats: Locale-Specific Messages</a>.
</p>
</li>
</ul>
<p>
Once an extension is internationalized,
translating it is simple.
You copy <code>messages.json</code>,
translate it,
and put the copy into a new directory under <code>_locales</code>.
For example, to support Spanish,
just put a translated copy of <code>messages.json</code>
under <code>_locales/es</code>.
The following figure shows the previous extension
with a new Spanish translation.
</p>
<img src="images/i18n-after-2.gif" alt="This looks the same as the previous figure, but with a new file at _locales/es/messages.json that contains a Spanish translation of the messages." width="782" height="358">
<h2 id="overview-predefined">Predefined messages</h2>
<p>
The internationalization system provides a few predefined
messages to help you localize your extension.
These include <code>@@ui_locale</code>,
so you can detect the current UI locale,
and a few <code>@@bidi_...</code> messages
that let you detect the text direction.
The latter messages have similar names to constants in the
<a href="http://code.google.com/apis/gadgets/docs/i18n.html#BIDI">
gadgets BIDI (bi-directional) API</a>.
</p>
<p>
The special message <code>@@extension_id</code>
can be used in the CSS and JavaScript files of any extension,
whether or not the extension is localized.
This message doesn't work in manifest files.
</p>
<p class="note">
<b>Note:</b>
Content script CSS files can't use
predefined messages such as <code>@@extension_id</code>.
For details, see
<a href="http://crbug.com/39899">bug 39899</a>.
</p>
<p>
The following table describes each predefined message.
</p>
<table>
<tbody><tr>
<th>Message name</th> <th>Description</th>
</tr>
<tr>
<td> <code>@@extension_id</code> </td>
<td>The extension ID;
you might use this string to construct URLs
for resources inside the extension.
Even unlocalized extensions can use this message.
<br>
<b>Note:</b> You can't use this message in a manifest file.
</td>
</tr>
<tr>
<td> <code>@@ui_locale</code> </td>
<td>The current locale;
you might use this string to construct locale-specific URLs. </td>
</tr>
<tr>
<td> <code>@@bidi_dir</code> </td>
<td> The text direction for the current locale,
either "ltr" for left-to-right languages such as English
or "rtl" for right-to-left languages such as Japanese. </td>
</tr>
<tr>
<td> <code>@@bidi_reversed_dir</code> </td>
<td> If the <code>@@bidi_dir</code> is "ltr", then this is "rtl";
otherwise, it's "ltr". </td>
</tr>
<tr>
<td> <code>@@bidi_start_edge</code> </td>
<td> If the <code>@@bidi_dir</code> is "ltr", then this is "left";
otherwise, it's "right". </td>
</tr>
<tr>
<td> <code>@@bidi_end_edge</code> </td>
<td> If the <code>@@bidi_dir</code> is "ltr", then this is "right";
otherwise, it's "left". </td>
</tr>
</tbody></table>
<p>
Here's an example of using <code>@@extension_id</code> in a CSS file
to construct a URL:
</p>
<pre>body {
<b>background-image:url('chrome-extension://__MSG_@@extension_id__/background.png');</b>
}
</pre>
<p>
If the extension ID is abcdefghijklmnopqrstuvwxyzabcdef,
then the bold line in the previous code snippet becomes:
</p>
<pre>background-image:url('chrome-extension://abcdefghijklmnopqrstuvwxyzabcdef/background.png');
</pre>
<p>
Here's an example of using <code>@@bidi_*</code> messages in a CSS file:
</p>
<pre>body {
<b>direction: __MSG_@@bidi_dir__;</b>
}
div#header {
margin-bottom: 1.05em;
overflow: hidden;
padding-bottom: 1.5em;
<b>padding-__MSG_@@bidi_start_edge__: 0;</b>
<b>padding-__MSG_@@bidi_end_edge__: 1.5em;</b>
position: relative;
}
</pre>
<p>
For left-to-right languages such as English,
the bold lines become:
</p>
<pre>dir: ltr;
padding-left: 0;
padding-right: 1.5em;
</pre>
<h2 id="overview-locales">Locales</h2>
<p>
You can choose from many locales,
including some (such as <code>en</code>)
that let a single translation support multiple variations of a language
(such as <code>en_GB</code> and <code>en_US</code>).
</p>
<h3 id="locales-supported">Supported locales</h3>
<p>
Extensions can use any of the
<a href="http://code.google.com/chrome/webstore/docs/i18n.html#localeTable">locales that the Chrome Web Store supports</a>.
</p>
<h3 id="locales-usage">How extensions find strings</h3>
<p>
You don't have to define every string for every locale
that your internationalized extension supports.
As long as the default locale's <code>messages.json</code> file
has a value for every string,
your extension will run no matter how sparse a translation is.
Here's how the extension system searches for a message:
</p>
<ol>
<li>
Search the messages file (if any)
for the user's preferred locale.
For example, when Google Chrome's locale is set to
British English (<code>en_GB</code>),
the system first looks for the message in
<code>_locales/en_GB/messages.json</code>.
If that file exists and the message is there,
the system looks no further.
</li>
<li>
If the user's preferred locale has a region
(that is, the locale has an underscore: _),
search the locale without that region.
For example, if the <code>en_GB</code> messages file
doesn't exist or doesn't contain the message,
the system looks in the <code>en</code> messages file.
If that file exists and the message is there,
the system looks no further.
</li>
<li>
Search the messages file for the extension's default locale.
For example, if the extension's "default_locale" is set to "es",
and neither <code>_locales/en_GB/messages.json</code>
nor <code>_locales/en/messages.json</code> contains the message,
the extension uses the message from
<code>_locales/es/messages.json</code>.
</li>
</ol>
<p>
In the following figure,
the message named "colores" is in all three locales
that the extension supports,
but "extName" is in only two of the locales.
Wherever a user running Google Chrome in US English sees the label "Colors",
a user of British English sees "Colours".
Both US English and British English users
see the extension name "Hello World".
Because the default language is Spanish,
users running Google Chrome in any non-English language
see the label "Colores" and the extension name "Hola mundo".
</p>
<img src="images/i18n-strings.gif" alt="Four files: manifest.json and three messages.json files (for es, en, and en_GB). The es and en files show entries for messages named &quot;extName&quot; and &quot;colores&quot;; the en_GB file has just one entry (for &quot;colores&quot;)." width="493" height="488">
<h3 id="locales-testing">How to set your browser's locale</h3>
<p>
To test translations, you might want to set your browser's locale.
This section tells you how to set the locale in
<a href="#testing-win">Windows</a>,
<a href="#testing-mac">Mac OS X</a>, and
<a href="#testing-linux">Linux</a>.
</p>
<h4 id="testing-win">Windows</h4>
<p>
You can change the locale using either
a locale-specific shortcut
or the Google Chrome UI.
The shortcut approach is quicker, once you've set it up,
and it lets you use several languages at once.
</p>
<h5 id="win-shortcut">Using a locale-specific shortcut</h5>
<p>
To create and use a shortcut that launches Google Chrome
with a particular locale:
</p>
<ol>
<li>
Make a copy of the Google Chrome shortcut
that's already on your desktop.
</li>
<li>
Rename the new shortcut to match the new locale.
</li>
<li>
Change the shortcut's properties
so that the Target field specifies the
<code>--lang</code> and
<code>--user-data-dir</code> flags.
The target should look something like this:
<pre><em>path_to_chrome.exe</em> --lang=<em>locale</em> --user-data-dir=c:\<em>locale_profile_dir</em></pre>
</li>
<li>
Launch Google Chrome by double-clicking the shortcut.
</li>
</ol>
<p>
For example, to create a shortcut
that launches Google Chrome in Spanish (<code>es</code>),
you might create a shortcut named <code>chrome-es</code>
that has the following target:
</p>
<pre><em>path_to_chrome.exe</em> --lang=es --user-data-dir=c:\chrome-profile-es</pre>
<p>
You can create as many shortcuts as you like,
making it easy to test your extension in multiple languages.
For example:
</p>
<pre><em>path_to_chrome.exe</em> --lang=en --user-data-dir=c:\chrome-profile-en
<em>path_to_chrome.exe</em> --lang=en_GB --user-data-dir=c:\chrome-profile-en_GB
<em>path_to_chrome.exe</em> --lang=ko --user-data-dir=c:\chrome-profile-ko</pre>
<p class="note">
<b>Note:</b>
Specifying <code>--user-data-dir</code> is optional but handy.
Having one data directory per locale
lets you run the browser
in several languages at the same time.
A disadvantage is that because the locales' data isn't shared,
you have to install your extension multiple times — once per locale,
which can be challenging when you don't speak the language.
For more information, see
<a href="http://www.chromium.org/developers/creating-and-using-profiles">Creating and Using Profiles</a>.
</p>
<h5 id="win-ui">Using the UI</h5>
<p>
Here's how to change the locale using the UI on Google Chrome for Windows:
</p>
<ol>
<li> Wrench icon &gt; <b>Options</b> </li>
<li> Choose the <b>Under the Hood</b> tab </li>
<li> Scroll down to <b>Web Content</b> </li>
<li> Click <b>Change font and language settings</b> </li>
<li> Choose the <b>Languages</b> tab </li>
<li> Use the drop down to set the <b>Google Chrome language</b> </li>
<li> Restart Chrome </li>
</ol>
<h4 id="testing-mac">Mac OS X</h4>
<p>
To change the locale on Mac,
you use the system preferences.
</p>
<ol>
<li> From the Apple menu, choose <b>System Preferences</b> </li>
<li> Under the <b>Personal</b> section, choose <b>International</b> </li>
<li> Choose your language and location </li>
<li> Restart Chrome </li>
</ol>
<h4 id="testing-linux">Linux</h4>
<p>
To change the locale on Linux,
first quit Google Chrome.
Then, all in one line,
set the LANGUAGE environment variable
and launch Google Chrome.
For example:
</p>
<pre>LANGUAGE=es ./chrome
</pre>
<h2 id="overview-examples">Examples</h2>
<p>
You can find simple examples of internationalization in the
<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/i18n/">examples/api/i18n</a>
directory.
For a complete example, see
<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/extensions/news/">examples/extensions/news</a>.
For other examples and for help in viewing the source code, see
<a href="samples.html">Samples</a>.
</p>
<h3 id="examples-getMessage">Examples: getMessage</h3>
<!--
[PENDING: improve this section. it should probably start with a
one-variable example that includes the messages.json code.]
-->
<p>
The following code gets a localized message from the browser
and displays it as a string.
It replaces two placeholders within the message with the strings
"string1" and "string2".
</p>
<pre>function getMessage() {
var message = chrome.i18n.getMessage("click_here", ["string1", "string2"]);
document.getElementById("languageSpan").innerHTML = message;
}
</pre>
<p>
Here's how you'd supply and use a single string:
</p>
<pre><em>// In JavaScript code</em>
status.innerText = chrome.i18n.getMessage("error", errorDetails);
<em>// In messages.json</em>
"error": {
"message": "Error: $details$",
"description": "Generic error template. Expects error parameter to be passed in.",
"placeholders": {
"details": {
"content": "$1",
"example": "Failed to fetch RSS feed."
}
}
}
</pre>
<p>
For more information about placeholders, see the
<a href="i18n-messages.html">Locale-Specific Messages</a> page.
For details on calling <code>getMessage()</code>, see the
<a href="#method-getMessage">API reference</a>.
</p>
<h3 id="example-accept-languages">Example: getAcceptLanguages</h3>
<p>
The following code gets accept-languages from the browser and displays them as a
string by separating each accept-language with ','.
</p>
<pre>function getAcceptLanguages() {
chrome.i18n.getAcceptLanguages(function(languageList) {
var languages = languageList.join(",");
document.getElementById("languageSpan").innerHTML = languages;
})
}
</pre>
<p>
For details on calling <code>getAcceptLanguages()</code>, see the
<a href="#method-getAcceptLanguages">API reference</a>.
</p>
<!-- END AUTHORED CONTENT -->
</div>
<!-- API PAGE -->
<div class="apiPage">
<a name="apiReference"></a>
<h2>API reference: chrome.i18n</h2>
<!-- PROPERTIES -->
<div class="apiGroup" style="display: none; ">
<a name="properties"></a>
<h3 id="properties">Properties</h3>
<div>
<a></a>
<h4>getLastError</h4>
<div class="summary">
<!-- Note: intentionally longer 80 columns -->
<span>chrome.extension</span><span>lastError</span>
</div>
<div>
</div>
</div>
</div> <!-- /apiGroup -->
<!-- METHODS -->
<div id="methodsTemplate" class="apiGroup">
<a name="global-methods"></a>
<h3>Methods</h3>
<!-- iterates over all functions -->
<div class="apiItem">
<a name="method-getAcceptLanguages"></a> <!-- method-anchor -->
<h4>getAcceptLanguages</h4>
<div class="summary"><span style="display: none; ">void</span>
<!-- Note: intentionally longer 80 columns -->
<span>chrome.i18n.getAcceptLanguages</span>(<span class="null"><span style="display: none; ">, </span><span>function</span>
<var><span>callback</span></var></span>)</div>
<div class="description">
<p class="todo" style="display: none; ">Undocumented.</p>
<p>Gets the accept-languages of the browser. This is different from the locale used by the browser; to get the locale, use <code>window.navigator.language</code>.</p>
<!-- PARAMETERS -->
<h4>Parameters</h4>
<dl>
<div>
<div>
<dt>
<var>callback</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional" style="display: none; ">optional</span>
<span class="enum" style="display: none; ">enumerated</span>
<span id="typeTemplate">
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span style="display: none; ">
array of <span><span></span></span>
</span>
<span>function</span>
<span style="display: none; "></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo">
Undocumented.
</dd>
<dd style="display: none; ">
Description of this parameter from the json schema.
</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd style="display: none; ">
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd style="display: none; ">
<div></div>
</dd>
</div>
</div>
</dl>
<!-- RETURNS -->
<h4 style="display: none; ">Returns</h4>
<dl>
<div style="display: none; ">
<div>
</div>
</div>
</dl>
<!-- CALLBACK -->
<div>
<div>
<h4>Callback function</h4>
<p>
The callback <em>parameter</em> should specify a function
that looks like this:
</p>
<p style="display: none; ">
If you specify the <em>callback</em> parameter, it should
specify a function that looks like this:
</p>
<!-- Note: intentionally longer 80 columns -->
<pre>function(<span>array of string languages</span>) <span class="subdued">{...}</span>;</pre>
<dl>
<div>
<div>
<dt>
<var>languages</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional" style="display: none; ">optional</span>
<span class="enum" style="display: none; ">enumerated</span>
<span id="typeTemplate">
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span>
array of <span><span>
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span style="display: none; ">
array of <span><span></span></span>
</span>
<span>string</span>
<span style="display: none; "></span>
</span>
</span></span>
</span>
<span style="display: none; ">paramType</span>
<span style="display: none; "></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
<dd>Array of the accept languages of the browser, such as en-US,en,zh-CN</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd style="display: none; ">
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd style="display: none; ">
<div></div>
</dd>
</div>
</div>
</dl>
</div>
</div>
<!-- MIN_VERSION -->
<p style="display: none; ">
This function was added in version <b><span></span></b>.
If you require this function, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</p>
</div> <!-- /description -->
</div><div class="apiItem">
<a name="method-getMessage"></a> <!-- method-anchor -->
<h4>getMessage</h4>
<div class="summary"><span>string</span>
<!-- Note: intentionally longer 80 columns -->
<span>chrome.i18n.getMessage</span>(<span class="null"><span style="display: none; ">, </span><span>string</span>
<var><span>messageName</span></var></span><span class="optional"><span>, </span><span>string or array of string</span>
<var><span>substitutions</span></var></span>)</div>
<div class="description">
<p class="todo" style="display: none; ">Undocumented.</p>
<p>Gets the localized string for the specified message. If the message is missing, this method returns an empty string (''). If the format of the <code>getMessage()</code> call is wrong — for example, <em>messageName</em> is not a string or the <em>substitutions</em> array is empty or has more than 9 elements — this method returns <code>undefined</code>.</p>
<!-- PARAMETERS -->
<h4>Parameters</h4>
<dl>
<div>
<div>
<dt>
<var>messageName</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional" style="display: none; ">optional</span>
<span class="enum" style="display: none; ">enumerated</span>
<span id="typeTemplate">
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span style="display: none; ">
array of <span><span></span></span>
</span>
<span>string</span>
<span style="display: none; "></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
<dd>The name of the message, as specified in the <a href="i18n-messages.html"><code>messages.json</code></a> file.</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd style="display: none; ">
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd style="display: none; ">
<div></div>
</dd>
</div>
</div><div>
<div>
<dt>
<var>substitutions</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional">optional</span>
<span class="enum" style="display: none; ">enumerated</span>
<span id="typeTemplate">
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span style="display: none; ">
array of <span><span></span></span>
</span>
<span>string or array of string</span>
<span style="display: none; "></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
<dd>1 - 9 substitution strings, if the message requires any.</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd style="display: none; ">
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd style="display: none; ">
<div></div>
</dd>
</div>
</div>
</dl>
<!-- RETURNS -->
<h4>Returns</h4>
<dl>
<div>
<div>
<dt>
<var style="display: none; ">paramName</var>
<em>
<!-- TYPE -->
<div style="display:inline">
(
<span class="optional" style="display: none; ">optional</span>
<span class="enum" style="display: none; ">enumerated</span>
<span id="typeTemplate">
<span style="display: none; ">
<a> Type</a>
</span>
<span>
<span style="display: none; ">
array of <span><span></span></span>
</span>
<span>string</span>
<span style="display: none; "></span>
</span>
</span>
)
</div>
</em>
</dt>
<dd class="todo" style="display: none; ">
Undocumented.
</dd>
<dd>Message localized for current locale.</dd>
<dd style="display: none; ">
This parameter was added in version
<b><span></span></b>.
You must omit this parameter in earlier versions,
and you may omit it in any version. If you require this
parameter, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</dd>
<!-- OBJECT PROPERTIES -->
<dd style="display: none; ">
<dl>
<div>
<div>
</div>
</div>
</dl>
</dd>
<!-- OBJECT METHODS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- OBJECT EVENT FIELDS -->
<dd style="display: none; ">
<div></div>
</dd>
<!-- FUNCTION PARAMETERS -->
<dd style="display: none; ">
<div></div>
</dd>
</div>
</div>
</dl>
<!-- CALLBACK -->
<div style="display: none; ">
<div>
<h4>Callback function</h4>
<p>
The callback <em>parameter</em> should specify a function
that looks like this:
</p>
<p>
If you specify the <em>callback</em> parameter, it should
specify a function that looks like this:
</p>
<!-- Note: intentionally longer 80 columns -->
<pre>function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>;</pre>
<dl>
<div>
<div>
</div>
</div>
</dl>
</div>
</div>
<!-- MIN_VERSION -->
<p style="display: none; ">
This function was added in version <b><span></span></b>.
If you require this function, the manifest key
<a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a>
can ensure that your extension won't be run in an earlier browser version.
</p>
</div> <!-- /description -->
</div> <!-- /apiItem -->
</div> <!-- /apiGroup -->
<!-- EVENTS -->
<div id="eventsTemplate" class="apiGroup" style="display: none; ">
<a></a>
<h3>Events</h3>
<!-- iterates over all events -->
<div class="apiItem">
<a></a>
<h4>event name</h4>
<div class="summary">
<!-- Note: intentionally longer 80 columns -->
<span class="subdued">chrome.bookmarks</span><span>onEvent</span><span class="subdued">.addListener</span>(function(<span>Type param1, Type param2</span>) <span class="subdued">{...}</span>);
</div>
<div class="description">
<p class="todo">Undocumented.</p>
<p>
A description from the json schema def of the event goes here.
</p>
<!-- PARAMETERS -->
<div>
<h4>Parameters</h4>
<dl>
<div>
<div>
</div>
</div>
</dl>
</div>
</div> <!-- /decription -->
</div> <!-- /apiItem -->
</div> <!-- /apiGroup -->
<!-- TYPES -->
<div class="apiGroup" style="display: none; ">
<a name="types"></a>
<h3 id="types">Types</h3>
<!-- iterates over all types -->
<div class="apiItem">
<a></a>
<h4>type name</h4>
<div>
</div>
</div> <!-- /apiItem -->
</div> <!-- /apiGroup -->
</div> <!-- /apiPage -->
</div> <!-- /gc-pagecontent -->
</div> <!-- /g-section -->
</div> <!-- /codesiteContent -->
<div id="gc-footer" --="">
<div class="text">
<p>
Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>,
the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons
Attribution 3.0 License</a>, and code samples are licensed under the
<a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
</p>
<p>
©2011 Google
</p>
<!-- begin analytics -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>
<script type="text/javascript">
// chrome doc tracking
try {
var engdocs = _gat._getTracker("YT-10763712-2");
engdocs._trackPageview();
} catch(err) {}
// code.google.com site-wide tracking
try {
_uacct="UA-18071-1";
_uanchor=1;
_uff=0;
urchinTracker();
}
catch(e) {/* urchinTracker not available. */}
</script>
<!-- end analytics -->
</div>
</div> <!-- /gc-footer -->
</div> <!-- /gc-container -->
</body></html>