blob: 1774fb92acb30212ed1a7a4bcae1c9538b797a57 [file] [log] [blame]
/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
var l10n = l10n || {};
/**
* Localize a tag, returning the tag itself and logging an error if no
* translation exists.
*
* @param {string} tag The localization tag.
* @param {(string|Array)=} opt_substitutions An optional set of substitution
* strings corresponding to the "placeholders" attributes in messages.json.
* @return {string} The translated tag.
*/
l10n.getTranslationOrError = function(tag, opt_substitutions) {
var translation = chrome.i18n.getMessage(tag, opt_substitutions);
if (translation) {
return translation;
}
console.error('Missing translation for "' + tag + '"');
return tag;
};
/**
* Localize an element by setting its innerText according to the specified tag
* and an optional set of substitutions.
*
* @param {Element} element The element to localize.
* @param {string} tag The localization tag.
* @param {(string|Array)=} opt_substitutions An optional set of substitution
* strings corresponding to the "placeholders" attributes in messages.json.
* @param {boolean=} opt_asHtml If true, set innerHTML instead of innerText.
* This parameter should be used with caution.
* @return {boolean} True if the localization was successful; false otherwise.
*/
l10n.localizeElementFromTag = function(element, tag, opt_substitutions,
opt_asHtml) {
var translation = l10n.getTranslationOrError(tag, opt_substitutions);
if (opt_asHtml) {
element.innerHTML = translation;
} else {
element.innerText = translation;
}
return translation != null;
};
/**
* Localize an element by setting its innerText according to its i18n-content
* attribute, and an optional set of substitutions.
*
* @param {Element} element The element to localize.
* @param {(string|Array)=} opt_substitutions An optional set of substitution
* strings corresponding to the "placeholders" attributes in messages.json.
* @param {boolean=} opt_asHtml If true, set innerHTML instead of innerText.
* This parameter should be used with caution.
* @return {boolean} True if the localization was successful; false otherwise.
*/
l10n.localizeElement = function(element, opt_substitutions, opt_asHtml) {
var tag = element.getAttribute('i18n-content');
return l10n.localizeElementFromTag(element, tag, opt_substitutions,
opt_asHtml);
};
/**
* Localize all tags with the i18n-content attribute, using i18n-data-n
* attributes to specify any placeholder substitutions.
*
* Because we use i18n-value attributes to implement translations of rich
* content (including paragraphs with hyperlinks), we localize these as
* HTML iff there are any substitutions.
*/
l10n.localize = function() {
var elements = document.querySelectorAll('[i18n-content],[i18n-title]');
for (var i = 0; i < elements.length; ++i) {
/** @type {Element} */ var element = elements[i];
var substitutions = [];
for (var j = 1; j < 9; ++j) {
var value = 'i18n-value-' + j;
var valueName = 'i18n-value-name-' + j;
if (element.hasAttribute(value)) {
substitutions.push(element.getAttribute(value));
} else if (element.hasAttribute(valueName)) {
var name = element.getAttribute(valueName);
var translation = chrome.i18n.getMessage(name);
if (translation) {
substitutions.push(translation);
} else {
console.error('Missing translation for substitution: ' + name);
substitutions.push(name);
}
} else {
break;
}
}
var titleTag = element.getAttribute('i18n-title');
if (titleTag) {
element.title = l10n.getTranslationOrError(titleTag, substitutions);
} else {
l10n.localizeElement(element, substitutions,
substitutions.length != 0);
}
}
};