Skip to content

Commit

Permalink
Fix Bug 949143 - Translation bar: request doesn't disappear after swi…
Browse files Browse the repository at this point in the history
…tching language
  • Loading branch information
kyoshino committed Dec 20, 2013
1 parent 401e234 commit ca890a8
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 16 deletions.
46 changes: 30 additions & 16 deletions bedrock/tabzilla/templates/tabzilla/tabzilla.js
Original file line number Diff line number Diff line change
Expand Up @@ -342,18 +342,24 @@ var Tabzilla = (function (Tabzilla) {
Infobar.prototype.onshow = {};
Infobar.prototype.onaccept = {};
Infobar.prototype.oncancel = {};
var setupTransbar = function () {
Tabzilla.setupTransbar = function (userLang, pageLang) {
var transbar = new Infobar('transbar', 'Translation Bar');
if (transbar.disabled) {
return;
userLang = userLang || navigator.language || navigator.browserLanguage;
pageLang = pageLang || document.documentElement.lang;

if (transbar.disabled || !userLang || !pageLang) {
return false;
}

var userLangLower = userLang.toLowerCase();
var userLangShort = userLangLower.split('-')[0];
var pageLangLower = pageLang.toLowerCase();

// Compare the user's language and the page's language
var userLang = navigator.language || navigator.browserLanguage;
var pageLang = document.documentElement.lang;
if (!userLang || !pageLang ||
userLang.toLowerCase() === pageLang.toLowerCase()) {
return;
if (userLangLower === pageLangLower ||
// Consider some legacy locales like fr-FR, it-IT or el-GR
userLangShort === pageLangLower) {
return false;
}

// Normalize the user language in the form of ab or ab-CD
Expand All @@ -363,22 +369,28 @@ var Tabzilla = (function (Tabzilla) {

// Check the availability of the translated page for the user.
// Use an alternate URL in <head> or a language option in <form>
var langLink = $(['link[hreflang="' + userLang + '"]',
var langLink = $([
'link[hreflang="' + userLang + '"]',
// The user language can be ab-CD while the page language is ab
// (Example: fr-FR vs fr, ja-JP vs ja)
'link[hreflang="' + userLang.split('-')[0] + '"]'].join(','));
var langOption = $(['#language [value="' + userLang + '"]',
'link[hreflang="' + userLangShort + '"]'
].join(','));
var langOption = $([
'#language [value="' + userLang + '"]',
// Languages in the language switcher are uncapitalized on some
// sites (AMO, Firefox Flicks)
'#language [value="' + userLang.toLowerCase() + '"]',
'#language [value="' + userLangLower + '"]',
// The user language can be ab-CD while the page language is ab
// (Example: fr-FR vs fr, ja-JP vs ja)
'#language [value="' + userLang.split('-')[0] + '"]',
'#language [value="' + userLangShort + '"]',
// Sometimes the value of a language switcher option is the path of
// a localized page on some sites (MDN)
'#language [value^="/' + userLang + '/"]'].join(','));
'#language [value^="/' + userLang + '/"]',
'#language [value^="/' + userLangShort + '/"]'
].join(','));

if (!langLink.length && !langOption.length) {
return;
return false;
}

// Normalize the user language again, based on the language of the site
Expand Down Expand Up @@ -408,6 +420,8 @@ var Tabzilla = (function (Tabzilla) {
jsonpCallback: "_", success: function (str) {
transbar.show(str).attr('lang', userLang);
}});

return true;
};
var setupGATracking = function () {
// track tabzilla links in GA
Expand Down Expand Up @@ -527,7 +541,7 @@ var Tabzilla = (function (Tabzilla) {

// Information Bars in order of priority
var infobars = {
translation: setupTransbar
translation: Tabzilla.setupTransbar
};
$.each((tab.data('infobar') || '').split(' '), function (index, value) {
var setup = infobars[value];
Expand Down
91 changes: 91 additions & 0 deletions media/js/test/spec/tabzilla.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,95 @@ describe("tabzilla.js", function() {
expect(result3).toEqual(0);
});
});

var testTransbar = function () {

var setup = Tabzilla.setupTransbar;

it('should return false if the user\'s language is the same as the page\'s language', function () {
// perfect match
expect(setup('en-US', 'en-US')).toBeFalsy();
expect(setup('fr', 'fr')).toBeFalsy();
// lower or upper case
expect(setup('en-us', 'en-US')).toBeFalsy();
expect(setup('EN-US', 'en-US')).toBeFalsy();
// obsolete ab-XX
expect(setup('fr-FR', 'fr')).toBeFalsy();
expect(setup('el-GR', 'el')).toBeFalsy();
});

it('should return false if the page is not localized into the user\'s language', function () {
expect(setup('en-GB', 'en-US')).toBeFalsy();
expect(setup('pt-PT', 'en-US')).toBeFalsy();
});

it('should return true if the page is localized into the user\'s language', function () {
// perfect match
expect(setup('en-US', 'fr')).toBeTruthy();
expect(setup('fr', 'en-US')).toBeTruthy();
// lower or upper case
expect(setup('en-us', 'fr')).toBeTruthy();
expect(setup('EN-US', 'fr')).toBeTruthy();
// obsolete ab-XX
expect(setup('fr-FR', 'en-US')).toBeTruthy();
expect(setup('el-GR', 'en-US')).toBeTruthy();
});

};

describe('setupTransbar – alternate URLs', function () {

beforeEach(function () {
$('head').append(
'<link rel="alternate" hreflang="el" href="http://www.mozilla.org/el/" title="Ελληνικά">' +
'<link rel="alternate" hreflang="en-US" href="http://www.mozilla.org/en-US/" title="English (US)">' +
'<link rel="alternate" hreflang="fr" href="http://www.mozilla.org/fr/" title="Français">');
});

afterEach(function() {
$('head link[hreflang]').remove();
});

testTransbar();

});

describe('setupTransbar – language switcher', function () {

beforeEach(function () {
$('body').append(
'<select id="language" name="lang" dir="ltr">' +
'<option value="el">Ελληνικά</option>' +
'<option value="en-us">English (US)</option>' +
'<option value="fr">Français</option>' +
'</select>');
});

afterEach(function() {
$('#language').remove();
});

testTransbar();

});

describe('setupTransbar – language switcher with path values', function () {

beforeEach(function () {
$('body').append(
'<select id="language" class="wiki-l10n" name="next" dir="ltr">' +
'<option value="/el/docs/HTML/HTML5">Ελληνικά</option>' +
'<option value="/en-US/docs/Web/Guide/HTML/HTML5">English (US)</option>' +
'<option value="/fr/docs/Web/Guide/HTML/HTML5">Français</option>' +
'</select>');
});

afterEach(function() {
$('#language').remove();
});

testTransbar();

});

});

0 comments on commit ca890a8

Please sign in to comment.