Skip to content

Commit 02a905d

Browse files
committed
Improve algorithm for determining default player language
1 parent fd43838 commit 02a905d

7 files changed

Lines changed: 220 additions & 137 deletions

File tree

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,7 @@ The following attributes are supported on both the `<audio>` and `<video>` eleme
225225

226226
#### Language
227227

228-
- **data-lang** - optional; specify language of the player using 2-character language code (default is "en" for English)
229-
- **data-force-lang** - optional; include this option to force the player to use the value of *data-lang* as the player language. Otherwise, the player language will be set as follows, in order of precedence: 1) the language of the web page or user's web browser if either is known and if there is a matching translation file; 2) the value of *data-lang* if provided; 3) English.
228+
- **data-lang** - optional; specify language of the player using 2-character language code. In order to work, the language specified must be one of Able Player's supported languages (see **Supported Languages** above). If **data-lang** is not included or specifies a language that is not supported, Able Player will default to the language of the web page if known and supported; otherwise it will default to English.
230229

231230
#### Captions
232231

build/ableplayer.dist.js

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -404,23 +404,16 @@ var AblePlayerInstances = [];
404404
}
405405

406406
// Language
407-
this.lang = 'en';
408-
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
409-
var lang = $(media).data('lang');
410-
if (lang.length == 2) {
411-
this.lang = lang;
412-
}
413-
}
414-
// Player language is determined as follows (in translation.js > getTranslationText() ):
415-
// 1. Lang attributes on <html> or <body>, if a matching translation file is available
416-
// 2. The value of this.lang, if a matching translation file is available
407+
// Player language is determined given the following precedence:
408+
// 1. The value of data-lang on the media element, if provided and a matching translation file is available
409+
// 2. Lang attribute on <html> or <body>, if a matching translation file is available
417410
// 3. English
418-
// To override this formula and force #2 to take precedence over #1, set data-force-lang="true"
419-
if ($(media).data('force-lang') !== undefined && $(media).data('force-lang') !== false) {
420-
this.forceLang = true;
411+
// Final calculation occurs in translation.js > getTranslationText()
412+
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
413+
this.lang = $(media).data('lang').toLowerCase();
421414
}
422415
else {
423-
this.forceLang = false;
416+
this.lang = null;
424417
}
425418

426419
// Metadata Tracks
@@ -14405,40 +14398,75 @@ if (thisObj.useTtml && (trackSrc.endsWith('.xml') || trackText.startsWith('<?xml
1440514398
};
1440614399

1440714400
AblePlayer.prototype.getTranslationText = function() {
14401+
1440814402
// determine language, then get labels and prompts from corresponding translation var
14409-
var deferred, thisObj, lang, thisObj, msg, translationFile, collapsedLang;
14410-
deferred = $.Deferred();
1441114403

14404+
var deferred, thisObj, supportedLangs, docLang, msg, translationFile, collapsedLang;
14405+
deferred = $.Deferred();
1441214406
thisObj = this;
14413-
// get language of the web page, if specified
14414-
if ($('body').attr('lang')) {
14415-
lang = $('body').attr('lang').toLowerCase();
14416-
}
14417-
else if ($('html').attr('lang')) {
14418-
lang = $('html').attr('lang').toLowerCase();
14419-
}
14420-
else {
14421-
lang = null;
14422-
}
1442314407

14424-
// override this.lang to language of the web page, if known and supported
14425-
// otherwise this.lang will continue using default
14426-
if (!this.forceLang) {
14427-
if (lang) {
14428-
if (lang !== this.lang) {
14429-
if ($.inArray(lang,this.getSupportedLangs()) !== -1) {
14430-
// this is a supported lang
14431-
this.lang = lang;
14432-
}
14433-
else {
14434-
msg = lang + ' is not currently supported. Using default language (' + this.lang + ')';
14435-
if (this.debug) {
14436-
14437-
}
14438-
}
14439-
}
14440-
}
14441-
}
14408+
supportedLangs = this.getSupportedLangs(); // returns an array
14409+
14410+
if (this.lang) { // a data-lang attribute is included on the media element
14411+
if ($.inArray(this.lang,supportedLangs) === -1) {
14412+
// the specified language is not supported
14413+
if (this.lang.indexOf('-') == 2) {
14414+
// this is a localized lang attribute (e.g., fr-CA)
14415+
// try the parent language, given the first two characters
14416+
if ($.inArray(this.lang.substring(0,2),supportedLangs) !== -1) {
14417+
// parent lang is supported. Use that.
14418+
this.lang = this.lang.substring(0,2);
14419+
}
14420+
else {
14421+
// the parent language is not supported either
14422+
// unable to use the specified language
14423+
this.lang = null;
14424+
}
14425+
}
14426+
else {
14427+
// this is not a localized language.
14428+
// since it's not supported, we're unable to use it.
14429+
this.lang = null;
14430+
}
14431+
}
14432+
}
14433+
14434+
if (!this.lang) {
14435+
// try the language of the web page, if specified
14436+
if ($('body').attr('lang')) {
14437+
docLang = $('body').attr('lang').toLowerCase();
14438+
}
14439+
else if ($('html').attr('lang')) {
14440+
docLang = $('html').attr('lang').toLowerCase();
14441+
}
14442+
else {
14443+
docLang = null;
14444+
}
14445+
if (docLang) {
14446+
if ($.inArray(docLang,supportedLangs) !== -1) {
14447+
// the document language is supported
14448+
this.lang = docLang;
14449+
}
14450+
else {
14451+
// the document language is not supported
14452+
if (docLang.indexOf('-') == 2) {
14453+
// this is a localized lang attribute (e.g., fr-CA)
14454+
// try the parent language, given the first two characters
14455+
if ($.inArray(docLang.substring(0,2),supportedLangs) !== -1) {
14456+
// the parent language is supported. use that.
14457+
this.lang = docLang.substring(0,2);
14458+
}
14459+
}
14460+
}
14461+
}
14462+
}
14463+
14464+
if (!this.lang) {
14465+
// No supported language has been specified by any means
14466+
// Fallback to English
14467+
this.lang = 'en';
14468+
}
14469+
1444214470
if (!this.searchLang) {
1444314471
this.searchLang = this.lang;
1444414472
}

build/ableplayer.js

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -404,23 +404,16 @@ var AblePlayerInstances = [];
404404
}
405405

406406
// Language
407-
this.lang = 'en';
408-
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
409-
var lang = $(media).data('lang');
410-
if (lang.length == 2) {
411-
this.lang = lang;
412-
}
413-
}
414-
// Player language is determined as follows (in translation.js > getTranslationText() ):
415-
// 1. Lang attributes on <html> or <body>, if a matching translation file is available
416-
// 2. The value of this.lang, if a matching translation file is available
407+
// Player language is determined given the following precedence:
408+
// 1. The value of data-lang on the media element, if provided and a matching translation file is available
409+
// 2. Lang attribute on <html> or <body>, if a matching translation file is available
417410
// 3. English
418-
// To override this formula and force #2 to take precedence over #1, set data-force-lang="true"
419-
if ($(media).data('force-lang') !== undefined && $(media).data('force-lang') !== false) {
420-
this.forceLang = true;
411+
// Final calculation occurs in translation.js > getTranslationText()
412+
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
413+
this.lang = $(media).data('lang').toLowerCase();
421414
}
422415
else {
423-
this.forceLang = false;
416+
this.lang = null;
424417
}
425418

426419
// Metadata Tracks
@@ -14405,40 +14398,75 @@ if (thisObj.useTtml && (trackSrc.endsWith('.xml') || trackText.startsWith('<?xml
1440514398
};
1440614399

1440714400
AblePlayer.prototype.getTranslationText = function() {
14401+
1440814402
// determine language, then get labels and prompts from corresponding translation var
14409-
var deferred, thisObj, lang, thisObj, msg, translationFile, collapsedLang;
14410-
deferred = $.Deferred();
1441114403

14404+
var deferred, thisObj, supportedLangs, docLang, msg, translationFile, collapsedLang;
14405+
deferred = $.Deferred();
1441214406
thisObj = this;
14413-
// get language of the web page, if specified
14414-
if ($('body').attr('lang')) {
14415-
lang = $('body').attr('lang').toLowerCase();
14416-
}
14417-
else if ($('html').attr('lang')) {
14418-
lang = $('html').attr('lang').toLowerCase();
14419-
}
14420-
else {
14421-
lang = null;
14422-
}
1442314407

14424-
// override this.lang to language of the web page, if known and supported
14425-
// otherwise this.lang will continue using default
14426-
if (!this.forceLang) {
14427-
if (lang) {
14428-
if (lang !== this.lang) {
14429-
if ($.inArray(lang,this.getSupportedLangs()) !== -1) {
14430-
// this is a supported lang
14431-
this.lang = lang;
14432-
}
14433-
else {
14434-
msg = lang + ' is not currently supported. Using default language (' + this.lang + ')';
14435-
if (this.debug) {
14436-
console.log(msg);
14437-
}
14438-
}
14439-
}
14440-
}
14441-
}
14408+
supportedLangs = this.getSupportedLangs(); // returns an array
14409+
14410+
if (this.lang) { // a data-lang attribute is included on the media element
14411+
if ($.inArray(this.lang,supportedLangs) === -1) {
14412+
// the specified language is not supported
14413+
if (this.lang.indexOf('-') == 2) {
14414+
// this is a localized lang attribute (e.g., fr-CA)
14415+
// try the parent language, given the first two characters
14416+
if ($.inArray(this.lang.substring(0,2),supportedLangs) !== -1) {
14417+
// parent lang is supported. Use that.
14418+
this.lang = this.lang.substring(0,2);
14419+
}
14420+
else {
14421+
// the parent language is not supported either
14422+
// unable to use the specified language
14423+
this.lang = null;
14424+
}
14425+
}
14426+
else {
14427+
// this is not a localized language.
14428+
// since it's not supported, we're unable to use it.
14429+
this.lang = null;
14430+
}
14431+
}
14432+
}
14433+
14434+
if (!this.lang) {
14435+
// try the language of the web page, if specified
14436+
if ($('body').attr('lang')) {
14437+
docLang = $('body').attr('lang').toLowerCase();
14438+
}
14439+
else if ($('html').attr('lang')) {
14440+
docLang = $('html').attr('lang').toLowerCase();
14441+
}
14442+
else {
14443+
docLang = null;
14444+
}
14445+
if (docLang) {
14446+
if ($.inArray(docLang,supportedLangs) !== -1) {
14447+
// the document language is supported
14448+
this.lang = docLang;
14449+
}
14450+
else {
14451+
// the document language is not supported
14452+
if (docLang.indexOf('-') == 2) {
14453+
// this is a localized lang attribute (e.g., fr-CA)
14454+
// try the parent language, given the first two characters
14455+
if ($.inArray(docLang.substring(0,2),supportedLangs) !== -1) {
14456+
// the parent language is supported. use that.
14457+
this.lang = docLang.substring(0,2);
14458+
}
14459+
}
14460+
}
14461+
}
14462+
}
14463+
14464+
if (!this.lang) {
14465+
// No supported language has been specified by any means
14466+
// Fallback to English
14467+
this.lang = 'en';
14468+
}
14469+
1444214470
if (!this.searchLang) {
1444314471
this.searchLang = this.lang;
1444414472
}

build/ableplayer.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ableplayer",
3-
"version": "4.3.10",
3+
"version": "4.3.11",
44
"description": "fully accessible HTML5 media player",
55
"homepage": "http://ableplayer.github.io/ableplayer",
66
"bugs": "https://github.com/ableplayer/ableplayer/issues",

scripts/ableplayer-base.js

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -404,23 +404,16 @@ var AblePlayerInstances = [];
404404
}
405405

406406
// Language
407-
this.lang = 'en';
408-
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
409-
var lang = $(media).data('lang');
410-
if (lang.length == 2) {
411-
this.lang = lang;
412-
}
413-
}
414-
// Player language is determined as follows (in translation.js > getTranslationText() ):
415-
// 1. Lang attributes on <html> or <body>, if a matching translation file is available
416-
// 2. The value of this.lang, if a matching translation file is available
407+
// Player language is determined given the following precedence:
408+
// 1. The value of data-lang on the media element, if provided and a matching translation file is available
409+
// 2. Lang attribute on <html> or <body>, if a matching translation file is available
417410
// 3. English
418-
// To override this formula and force #2 to take precedence over #1, set data-force-lang="true"
419-
if ($(media).data('force-lang') !== undefined && $(media).data('force-lang') !== false) {
420-
this.forceLang = true;
411+
// Final calculation occurs in translation.js > getTranslationText()
412+
if ($(media).data('lang') !== undefined && $(media).data('lang') !== "") {
413+
this.lang = $(media).data('lang').toLowerCase();
421414
}
422415
else {
423-
this.forceLang = false;
416+
this.lang = null;
424417
}
425418

426419
// Metadata Tracks

0 commit comments

Comments
 (0)