[l10n] Treat language as case-insensitive
See "Case-insensitive language comparisons per RFC 4646" https://github.com/fabi1cazenave/webL10n/pull/51 Removed the "patch" in compatibility.js and fixed the bug in webL10n, because the logic belongs to webL10n instead of PDF.js. The immediate motivation for this patch is that Chrome 40 converts navigator.language to lower case: https://crbug.com/454331
This commit is contained in:
parent
a544aed2b0
commit
ac5a8bcdda
28
external/webL10n/l10n.js
vendored
28
external/webL10n/l10n.js
vendored
@ -142,7 +142,7 @@ document.webL10n = (function(window, document, undefined) {
|
|||||||
* URL of the l10n resource to parse.
|
* URL of the l10n resource to parse.
|
||||||
*
|
*
|
||||||
* @param {string} lang
|
* @param {string} lang
|
||||||
* locale (language) to parse.
|
* locale (language) to parse. Must be a lowercase string.
|
||||||
*
|
*
|
||||||
* @param {Function} successCallback
|
* @param {Function} successCallback
|
||||||
* triggered when the l10n resource has been successully parsed.
|
* triggered when the l10n resource has been successully parsed.
|
||||||
@ -188,7 +188,7 @@ document.webL10n = (function(window, document, undefined) {
|
|||||||
function parseRawLines(rawText, extendedSyntax) {
|
function parseRawLines(rawText, extendedSyntax) {
|
||||||
var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
|
var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
|
||||||
var currentLang = '*';
|
var currentLang = '*';
|
||||||
var genericLang = lang.replace(/-[a-z]+$/i, '');
|
var genericLang = lang.split('-', 1)[0];
|
||||||
var skipLang = false;
|
var skipLang = false;
|
||||||
var match = '';
|
var match = '';
|
||||||
|
|
||||||
@ -203,7 +203,9 @@ document.webL10n = (function(window, document, undefined) {
|
|||||||
if (extendedSyntax) {
|
if (extendedSyntax) {
|
||||||
if (reSection.test(line)) { // section start?
|
if (reSection.test(line)) { // section start?
|
||||||
match = reSection.exec(line);
|
match = reSection.exec(line);
|
||||||
currentLang = match[1];
|
// RFC 4646, section 4.4, "All comparisons MUST be performed
|
||||||
|
// in a case-insensitive manner."
|
||||||
|
currentLang = match[1].toLowerCase();
|
||||||
skipLang = (currentLang !== '*') &&
|
skipLang = (currentLang !== '*') &&
|
||||||
(currentLang !== lang) && (currentLang !== genericLang);
|
(currentLang !== lang) && (currentLang !== genericLang);
|
||||||
continue;
|
continue;
|
||||||
@ -268,6 +270,12 @@ document.webL10n = (function(window, document, undefined) {
|
|||||||
|
|
||||||
// load and parse all resources for the specified locale
|
// load and parse all resources for the specified locale
|
||||||
function loadLocale(lang, callback) {
|
function loadLocale(lang, callback) {
|
||||||
|
// RFC 4646, section 2.1 states that language tags have to be treated as
|
||||||
|
// case-insensitive. Convert to lowercase for case-insensitive comparisons.
|
||||||
|
if (lang) {
|
||||||
|
lang = lang.toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
callback = callback || function _callback() {};
|
callback = callback || function _callback() {};
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
@ -282,7 +290,19 @@ document.webL10n = (function(window, document, undefined) {
|
|||||||
var dict = getL10nDictionary();
|
var dict = getL10nDictionary();
|
||||||
if (dict && dict.locales && dict.default_locale) {
|
if (dict && dict.locales && dict.default_locale) {
|
||||||
console.log('using the embedded JSON directory, early way out');
|
console.log('using the embedded JSON directory, early way out');
|
||||||
gL10nData = dict.locales[lang] || dict.locales[dict.default_locale];
|
gL10nData = dict.locales[lang];
|
||||||
|
if (!gL10nData) {
|
||||||
|
var defaultLocale = dict.default_locale.toLowerCase();
|
||||||
|
for (var anyCaseLang in dict.locales) {
|
||||||
|
anyCaseLang = anyCaseLang.toLowerCase();
|
||||||
|
if (anyCaseLang === lang) {
|
||||||
|
gL10nData = dict.locales[lang];
|
||||||
|
break;
|
||||||
|
} else if (anyCaseLang === defaultLocale) {
|
||||||
|
gL10nData = dict.locales[defaultLocale];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
callback();
|
callback();
|
||||||
} else {
|
} else {
|
||||||
console.log('no resource to load, early way out');
|
console.log('no resource to load, early way out');
|
||||||
|
@ -447,20 +447,10 @@ if (typeof PDFJS === 'undefined') {
|
|||||||
|
|
||||||
// Checks if navigator.language is supported
|
// Checks if navigator.language is supported
|
||||||
(function checkNavigatorLanguage() {
|
(function checkNavigatorLanguage() {
|
||||||
if ('language' in navigator &&
|
if ('language' in navigator) {
|
||||||
/^[a-z]+(-[A-Z]+)?$/.test(navigator.language)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
function formatLocale(locale) {
|
PDFJS.locale = navigator.userLanguage || 'en-US';
|
||||||
var split = locale.split(/[-_]/);
|
|
||||||
split[0] = split[0].toLowerCase();
|
|
||||||
if (split.length > 1) {
|
|
||||||
split[1] = split[1].toUpperCase();
|
|
||||||
}
|
|
||||||
return split.join('-');
|
|
||||||
}
|
|
||||||
var language = navigator.language || navigator.userLanguage || 'en-US';
|
|
||||||
PDFJS.locale = formatLocale(language);
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
(function checkRangeRequests() {
|
(function checkRangeRequests() {
|
||||||
|
Loading…
Reference in New Issue
Block a user