Source: ui/audio_language_selection.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.ui.AudioLanguageSelection');
  7. goog.require('shaka.ui.Controls');
  8. goog.require('shaka.ui.Enums');
  9. goog.require('shaka.ui.LanguageUtils');
  10. goog.require('shaka.ui.Locales');
  11. goog.require('shaka.ui.Localization');
  12. goog.require('shaka.ui.OverflowMenu');
  13. goog.require('shaka.ui.SettingsMenu');
  14. goog.require('shaka.ui.Utils');
  15. goog.require('shaka.util.FakeEvent');
  16. goog.requireType('shaka.ui.Controls');
  17. /**
  18. * @extends {shaka.ui.SettingsMenu}
  19. * @final
  20. * @export
  21. */
  22. shaka.ui.AudioLanguageSelection = class extends shaka.ui.SettingsMenu {
  23. /**
  24. * @param {!HTMLElement} parent
  25. * @param {!shaka.ui.Controls} controls
  26. */
  27. constructor(parent, controls) {
  28. super(parent, controls, shaka.ui.Enums.MaterialDesignIcons.LANGUAGE);
  29. this.button.classList.add('shaka-language-button');
  30. this.button.classList.add('shaka-tooltip-status');
  31. this.menu.classList.add('shaka-audio-languages');
  32. this.eventManager.listen(
  33. this.localization, shaka.ui.Localization.LOCALE_UPDATED, () => {
  34. this.updateLocalizedStrings_();
  35. });
  36. this.eventManager.listen(
  37. this.localization, shaka.ui.Localization.LOCALE_CHANGED, () => {
  38. this.updateLocalizedStrings_();
  39. });
  40. this.eventManager.listen(this.player, 'loading', () => {
  41. this.onAudioTracksChanged_();
  42. });
  43. this.eventManager.listen(this.player, 'loaded', () => {
  44. this.onAudioTracksChanged_();
  45. });
  46. this.eventManager.listen(this.player, 'unloading', () => {
  47. this.onAudioTracksChanged_();
  48. });
  49. this.eventManager.listen(this.player, 'audiotrackschanged', () => {
  50. this.onAudioTracksChanged_();
  51. });
  52. // Set up all the strings in the user's preferred language.
  53. this.updateLocalizedStrings_();
  54. this.onAudioTracksChanged_();
  55. }
  56. /** @private */
  57. onAudioTracksChanged_() {
  58. const audioTracks = this.player.getAudioTracks() || [];
  59. shaka.ui.LanguageUtils.updateAudioTracks(audioTracks, this.menu,
  60. (track) => this.onAudioTrackSelected_(track),
  61. /* updateChosen= */ true, this.currentSelection, this.localization,
  62. this.controls.getConfig().trackLabelFormat,
  63. this.controls.getConfig().showAudioChannelCountVariants,
  64. this.controls.getConfig().showAudioCodec);
  65. shaka.ui.Utils.focusOnTheChosenItem(this.menu);
  66. this.controls.dispatchEvent(
  67. new shaka.util.FakeEvent('languageselectionupdated'));
  68. this.button.setAttribute('shaka-status', this.currentSelection.innerText);
  69. const numberOfItems = this.menu.getElementsByTagName('button').length;
  70. shaka.ui.Utils.setDisplay(this.button, numberOfItems > 2);
  71. }
  72. /**
  73. * @param {!shaka.extern.AudioTrack} audioTrack
  74. * @private
  75. */
  76. onAudioTrackSelected_(audioTrack) {
  77. this.player.selectAudioTrack(audioTrack);
  78. // Set audio preference for when reloading the stream (e.g. casting), keep
  79. // this selection.
  80. this.player.configure('preferredAudioLanguage', audioTrack.language);
  81. if (audioTrack.label) {
  82. this.player.configure('preferredAudioLabel', audioTrack.label);
  83. }
  84. if (audioTrack.channelsCount) {
  85. this.player.configure('preferredAudioChannelCount',
  86. audioTrack.channelsCount);
  87. }
  88. this.player.configure('preferSpatialAudio', audioTrack.spatialAudio);
  89. }
  90. /**
  91. * @private
  92. */
  93. updateLocalizedStrings_() {
  94. const LocIds = shaka.ui.Locales.Ids;
  95. this.backButton.ariaLabel = this.localization.resolve(LocIds.BACK);
  96. this.button.ariaLabel = this.localization.resolve(LocIds.LANGUAGE);
  97. this.nameSpan.textContent =
  98. this.localization.resolve(LocIds.LANGUAGE);
  99. this.backSpan.textContent =
  100. this.localization.resolve(LocIds.LANGUAGE);
  101. }
  102. };
  103. /**
  104. * @implements {shaka.extern.IUIElement.Factory}
  105. * @final
  106. */
  107. shaka.ui.AudioLanguageSelection.Factory = class {
  108. /** @override */
  109. create(rootElement, controls) {
  110. return new shaka.ui.AudioLanguageSelection(rootElement, controls);
  111. }
  112. };
  113. shaka.ui.OverflowMenu.registerElement(
  114. 'language', new shaka.ui.AudioLanguageSelection.Factory());
  115. shaka.ui.Controls.registerElement(
  116. 'language', new shaka.ui.AudioLanguageSelection.Factory());