shaka-player 4.9.26 → 4.9.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/controls.css +2 -2
  2. package/dist/controls.css.map +1 -1
  3. package/dist/deps.js +1 -1
  4. package/dist/locales.js +54 -54
  5. package/dist/shaka-player.compiled.d.ts +5 -1
  6. package/dist/shaka-player.compiled.debug.d.ts +5 -1
  7. package/dist/shaka-player.compiled.debug.externs.js +6 -0
  8. package/dist/shaka-player.compiled.debug.js +124 -115
  9. package/dist/shaka-player.compiled.debug.map +4 -4
  10. package/dist/shaka-player.compiled.externs.js +6 -0
  11. package/dist/shaka-player.compiled.js +1113 -1105
  12. package/dist/shaka-player.compiled.map +4 -4
  13. package/dist/shaka-player.ui.d.ts +5 -1
  14. package/dist/shaka-player.ui.debug.d.ts +5 -1
  15. package/dist/shaka-player.ui.debug.externs.js +6 -0
  16. package/dist/shaka-player.ui.debug.js +367 -355
  17. package/dist/shaka-player.ui.debug.map +4 -4
  18. package/dist/shaka-player.ui.externs.js +6 -0
  19. package/dist/shaka-player.ui.js +1285 -1276
  20. package/dist/shaka-player.ui.map +4 -4
  21. package/externs/ima.js +22 -2
  22. package/externs/shaka/player.js +13 -2
  23. package/lib/dash/dash_parser.js +17 -9
  24. package/lib/dash/mpd_utils.js +0 -3
  25. package/lib/hls/hls_parser.js +18 -4
  26. package/lib/media/gap_jumping_controller.js +4 -2
  27. package/lib/media/segment_index.js +18 -6
  28. package/lib/media/streaming_engine.js +22 -9
  29. package/lib/net/networking_utils.js +5 -0
  30. package/lib/offline/storage.js +12 -10
  31. package/lib/player.js +13 -4
  32. package/lib/text/simple_text_displayer.js +1 -1
  33. package/lib/text/text_utils.js +4 -0
  34. package/lib/text/ttml_text_parser.js +26 -5
  35. package/lib/util/periods.js +60 -4
  36. package/lib/util/player_configuration.js +5 -0
  37. package/lib/util/tXml.js +17 -9
  38. package/package.json +1 -1
  39. package/ui/controls.js +14 -2
  40. package/ui/less/overflow_menu.less +1 -0
  41. package/ui/less/tooltip.less +1 -1
  42. package/ui/locales/README.md +16 -0
  43. package/ui/locales/ar-XB.json +1 -1
  44. package/ui/locales/ar.json +1 -1
  45. package/ui/locales/bg.json +1 -1
  46. package/ui/locales/ca.json +5 -5
  47. package/ui/locales/cs.json +1 -1
  48. package/ui/locales/da.json +1 -1
  49. package/ui/locales/de.json +1 -1
  50. package/ui/locales/el.json +1 -1
  51. package/ui/locales/en-GB.json +1 -1
  52. package/ui/locales/en-XA.json +1 -1
  53. package/ui/locales/es-419.json +4 -4
  54. package/ui/locales/es.json +3 -3
  55. package/ui/locales/fa.json +1 -1
  56. package/ui/locales/fi.json +1 -1
  57. package/ui/locales/fil.json +1 -1
  58. package/ui/locales/fr.json +6 -6
  59. package/ui/locales/hi.json +1 -1
  60. package/ui/locales/hr.json +1 -1
  61. package/ui/locales/hu.json +1 -1
  62. package/ui/locales/id.json +1 -1
  63. package/ui/locales/it.json +1 -1
  64. package/ui/locales/iw.json +1 -1
  65. package/ui/locales/ja.json +1 -1
  66. package/ui/locales/ko.json +1 -1
  67. package/ui/locales/lt.json +1 -1
  68. package/ui/locales/lv.json +1 -1
  69. package/ui/locales/nl.json +1 -1
  70. package/ui/locales/no.json +1 -1
  71. package/ui/locales/pl.json +6 -6
  72. package/ui/locales/pt-BR.json +6 -6
  73. package/ui/locales/pt-PT.json +7 -7
  74. package/ui/locales/ro.json +1 -1
  75. package/ui/locales/ru.json +1 -1
  76. package/ui/locales/sjn-translations.yaml +50 -4
  77. package/ui/locales/sjn.json +8 -1
  78. package/ui/locales/sk.json +1 -1
  79. package/ui/locales/sl.json +1 -1
  80. package/ui/locales/sr.json +1 -1
  81. package/ui/locales/sv.json +1 -1
  82. package/ui/locales/sync-sjn.py +41 -0
  83. package/ui/locales/th.json +1 -1
  84. package/ui/locales/tr.json +1 -1
  85. package/ui/locales/uk.json +1 -1
  86. package/ui/locales/vi.json +1 -1
  87. package/ui/locales/zh-HK.json +1 -1
  88. package/ui/locales/zh-TW.json +1 -1
  89. package/ui/locales/zh.json +1 -1
@@ -107,6 +107,56 @@ shaka.util.PeriodCombiner = class {
107
107
  return this.imageStreams_;
108
108
  }
109
109
 
110
+ /**
111
+ * Deletes a stream from matchedStreams because it is no longer needed
112
+ *
113
+ * @param {?shaka.extern.Stream} stream
114
+ * @param {string} periodId
115
+ *
116
+ * @export
117
+ */
118
+ deleteStream(stream, periodId) {
119
+ if (!stream) {
120
+ return;
121
+ }
122
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
123
+ if (stream.type == ContentType.AUDIO) {
124
+ for (const audioStream of this.audioStreams_) {
125
+ audioStream.matchedStreams = audioStream.matchedStreams.filter((s) => {
126
+ return s !== stream;
127
+ });
128
+ }
129
+ } else if (stream.type == ContentType.VIDEO) {
130
+ for (const videoStream of this.videoStreams_) {
131
+ videoStream.matchedStreams = videoStream.matchedStreams.filter((s) => {
132
+ return s !== stream;
133
+ });
134
+ if (videoStream.trickModeVideo) {
135
+ videoStream.trickModeVideo.matchedStreams =
136
+ videoStream.trickModeVideo.matchedStreams.filter((s) => {
137
+ return s !== stream;
138
+ });
139
+ }
140
+ }
141
+ } else if (stream.type == ContentType.TEXT) {
142
+ for (const textStream of this.textStreams_) {
143
+ textStream.matchedStreams = textStream.matchedStreams.filter((s) => {
144
+ return s !== stream;
145
+ });
146
+ }
147
+ } else if (stream.type == ContentType.IMAGE) {
148
+ for (const imageStream of this.imageStreams_) {
149
+ imageStream.matchedStreams = imageStream.matchedStreams.filter((s) => {
150
+ return s !== stream;
151
+ });
152
+ }
153
+ }
154
+ if (stream.segmentIndex) {
155
+ stream.closeSegmentIndex();
156
+ }
157
+ this.usedPeriodIds_.delete(periodId);
158
+ }
159
+
110
160
  /**
111
161
  * Returns an object that contains arrays of streams by type
112
162
  * @param {!Array<shaka.extern.Period>} periods
@@ -600,7 +650,8 @@ shaka.util.PeriodCombiner = class {
600
650
  const streams = outputStream.matchedStreams;
601
651
  goog.asserts.assert(streams, 'matched streams should be valid');
602
652
 
603
- for (const stream of streams) {
653
+ for (let i = firstNewPeriodIndex; i < streams.length; i++) {
654
+ const stream = streams[i];
604
655
  operations.push(stream.createSegmentIndex());
605
656
  if (stream.trickModeVideo && !stream.trickModeVideo.segmentIndex) {
606
657
  operations.push(stream.trickModeVideo.createSegmentIndex());
@@ -783,7 +834,8 @@ shaka.util.PeriodCombiner = class {
783
834
  clone.segmentIndex = null;
784
835
  clone.emsgSchemeIdUris = [];
785
836
  clone.keyIds = new Set();
786
- clone.closedCaptions = null;
837
+ clone.closedCaptions = stream.closedCaptions ?
838
+ new Map(stream.closedCaptions) : null;
787
839
  clone.trickModeVideo = null;
788
840
 
789
841
  return clone;
@@ -808,7 +860,8 @@ shaka.util.PeriodCombiner = class {
808
860
  clone.keyIds = new Set();
809
861
  clone.segments = [];
810
862
  clone.variantIds = [];
811
- clone.closedCaptions = null;
863
+ clone.closedCaptions = streamDb.closedCaptions ?
864
+ new Map(streamDb.closedCaptions) : null;
812
865
 
813
866
  return clone;
814
867
  }
@@ -852,7 +905,10 @@ shaka.util.PeriodCombiner = class {
852
905
  if (output.originalId == null) {
853
906
  output.originalId = input.originalId;
854
907
  } else {
855
- output.originalId += ',' + (input.originalId || '');
908
+ const newOriginalId = (input.originalId || '');
909
+ if (newOriginalId && !output.originalId.endsWith(newOriginalId)) {
910
+ output.originalId += ',' + newOriginalId;
911
+ }
856
912
  }
857
913
 
858
914
  const commonDrmInfos = shaka.util.DrmUtils.getCommonDrmInfos(
@@ -205,6 +205,7 @@ shaka.util.PlayerConfiguration = class {
205
205
  alwaysStreamText: false,
206
206
  startAtSegmentBoundary: false,
207
207
  gapDetectionThreshold: 0.5,
208
+ gapPadding: 0.01,
208
209
  gapJumpTimerTime: 0.25 /* seconds */,
209
210
  durationBackoff: 1,
210
211
  // Offset by 5 seconds since Chromecast takes a few seconds to start
@@ -270,6 +271,10 @@ shaka.util.PlayerConfiguration = class {
270
271
  streaming.stallSkip = 0;
271
272
  }
272
273
 
274
+ if (shaka.util.Platform.isTizen()) {
275
+ streaming.gapPadding = 2;
276
+ }
277
+
273
278
  const offline = {
274
279
  // We need to set this to a throw-away implementation for now as our
275
280
  // default implementation will need to reference other fields in the
package/lib/util/tXml.js CHANGED
@@ -44,11 +44,13 @@ shaka.util.TXml = class {
44
44
  * Parse some data
45
45
  * @param {BufferSource} data
46
46
  * @param {string=} expectedRootElemName
47
+ * @param {boolean=} includeParent
47
48
  * @return {shaka.extern.xml.Node | null}
48
49
  */
49
- static parseXml(data, expectedRootElemName) {
50
+ static parseXml(data, expectedRootElemName, includeParent = false) {
50
51
  const xmlString = shaka.util.StringUtils.fromBytesAutoDetect(data);
51
- return shaka.util.TXml.parseXmlString(xmlString, expectedRootElemName);
52
+ return shaka.util.TXml.parseXmlString(
53
+ xmlString, expectedRootElemName, includeParent);
52
54
  }
53
55
 
54
56
  /**
@@ -57,8 +59,9 @@ shaka.util.TXml = class {
57
59
  * @param {string=} expectedRootElemName
58
60
  * @return {shaka.extern.xml.Node | null}
59
61
  */
60
- static parseXmlString(xmlString, expectedRootElemName) {
61
- const result = shaka.util.TXml.parse(xmlString);
62
+ static parseXmlString(xmlString, expectedRootElemName,
63
+ includeParent = false) {
64
+ const result = shaka.util.TXml.parse(xmlString, includeParent);
62
65
  if (!expectedRootElemName && result.length) {
63
66
  return result[0];
64
67
  }
@@ -109,9 +112,10 @@ shaka.util.TXml = class {
109
112
  * parseXML / html into a DOM Object,
110
113
  * with no validation and some failure tolerance
111
114
  * @param {string} S your XML to parse
115
+ * @param {boolean} includeParent
112
116
  * @return {Array.<shaka.extern.xml.Node>}
113
117
  */
114
- static parse(S) {
118
+ static parse(S, includeParent) {
115
119
  let pos = 0;
116
120
 
117
121
  const openBracket = '<';
@@ -286,9 +290,11 @@ shaka.util.TXml = class {
286
290
  children,
287
291
  parent: null,
288
292
  };
289
- for (let i = 0; i < children.length; i++) {
290
- if (typeof children[i] !== 'string') {
291
- children[i].parent = node;
293
+ if (includeParent) {
294
+ for (let i = 0; i < children.length; i++) {
295
+ if (typeof children[i] !== 'string') {
296
+ children[i].parent = node;
297
+ }
292
298
  }
293
299
  }
294
300
  return node;
@@ -330,7 +336,9 @@ shaka.util.TXml = class {
330
336
  for (let i = 0; i < childrenLength; i++) {
331
337
  const childrenValue = children[i];
332
338
  if (typeof childrenValue !== 'string') {
333
- childrenValue.parent = node;
339
+ if (includeParent) {
340
+ childrenValue.parent = node;
341
+ }
334
342
  } else if (i == childrenLength - 1 && childrenValue == '\n') {
335
343
  children.pop();
336
344
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shaka-player",
3
3
  "description": "DASH/EME video player library",
4
- "version": "4.9.26",
4
+ "version": "4.9.28",
5
5
  "homepage": "https://github.com/shaka-project/shaka-player",
6
6
  "author": "Google",
7
7
  "maintainers": [
package/ui/controls.js CHANGED
@@ -259,6 +259,16 @@ shaka.ui.Controls = class extends shaka.util.FakeEventTarget {
259
259
  this.castProxy_ = null;
260
260
  }
261
261
 
262
+ if (this.spinnerContainer_) {
263
+ this.videoContainer_.removeChild(this.spinnerContainer_);
264
+ this.spinnerContainer_ = null;
265
+ }
266
+
267
+ if (this.clientAdContainer_) {
268
+ this.videoContainer_.removeChild(this.clientAdContainer_);
269
+ this.clientAdContainer_ = null;
270
+ }
271
+
262
272
  if (this.localPlayer_) {
263
273
  await this.localPlayer_.destroy();
264
274
  this.localPlayer_ = null;
@@ -518,6 +528,8 @@ shaka.ui.Controls = class extends shaka.util.FakeEventTarget {
518
528
  * @export
519
529
  */
520
530
  getClientSideAdContainer() {
531
+ goog.asserts.assert(
532
+ this.clientAdContainer_, 'No client ad container after destruction!');
521
533
  return this.clientAdContainer_;
522
534
  }
523
535
 
@@ -976,7 +988,7 @@ shaka.ui.Controls = class extends shaka.util.FakeEventTarget {
976
988
 
977
989
  /** @private */
978
990
  addBufferingSpinner_() {
979
- /** @private {!HTMLElement} */
991
+ /** @private {HTMLElement} */
980
992
  this.spinnerContainer_ = shaka.util.Dom.createHTMLElement('div');
981
993
  this.spinnerContainer_.classList.add('shaka-spinner-container');
982
994
  this.videoContainer_.appendChild(this.spinnerContainer_);
@@ -1133,7 +1145,7 @@ shaka.ui.Controls = class extends shaka.util.FakeEventTarget {
1133
1145
  * @private
1134
1146
  */
1135
1147
  addClientAdContainer_() {
1136
- /** @private {!HTMLElement} */
1148
+ /** @private {HTMLElement} */
1137
1149
  this.clientAdContainer_ = shaka.util.Dom.createHTMLElement('div');
1138
1150
  this.clientAdContainer_.classList.add('shaka-client-side-ad-container');
1139
1151
  shaka.ui.Utils.setDisplay(this.clientAdContainer_, false);
@@ -39,6 +39,7 @@
39
39
 
40
40
  /* The buttons inside the menu. */
41
41
  button {
42
+ font-family: Roboto, sans-serif, TengwarTelcontar;
42
43
  font-size: 14px;
43
44
  background: transparent;
44
45
  color: black;
@@ -47,7 +47,7 @@
47
47
  content: attr(aria-label);
48
48
 
49
49
  /* Override .material-icons-round text styling */
50
- font-family: Roboto, sans-serif;
50
+ font-family: Roboto, sans-serif, TengwarTelcontar;
51
51
  line-height: calc(@material-icons-width / 2);
52
52
  white-space: nowrap;
53
53
  font-size: 13px;
@@ -0,0 +1,16 @@
1
+ # Maintenance of translations
2
+
3
+ Most translations are maintained by Google, but need internal scripts run to
4
+ sync between our internal translation system and GitHub. Changes made directly
5
+ on GitHub are welcome, but need to be pushed back into Google's internal
6
+ systems by a Googler to avoid having them overwritten later.
7
+
8
+ The following locales are fake "meta-languages" that are used only for testing.
9
+ They are automatically maintained by our internal systems:
10
+ - ar-XB (Right-to-left English (not Arabic), to help identify RTL issues)
11
+ - en-XA (Accented English, accents added to help spot hard-coded text)
12
+
13
+ The following locales are not maintained by Google at all, and must be kept
14
+ up-to-date by the community:
15
+ - oc (Occitan)
16
+ - sjn (Sindarin, see sjn-translations.yaml for more information)
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "‏‮Unmute‬‏",
36
36
  "UNRECOGNIZED_LANGUAGE": "‏‮Unrecognized‬‏",
37
37
  "VOLUME": "‏‮Volume‬‏"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "إعادة الصوت",
36
36
  "UNRECOGNIZED_LANGUAGE": "غير معروف",
37
37
  "VOLUME": "مستوى الصوت"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Включване на звука",
36
36
  "UNRECOGNIZED_LANGUAGE": "Неразпознато",
37
37
  "VOLUME": "Звук"
38
- }
38
+ }
@@ -7,10 +7,10 @@
7
7
  "CAPTIONS": "Subtítols",
8
8
  "CAST": "Emet…",
9
9
  "ENTER_LOOP_MODE": "Reprodueix en bucle el vídeo actual",
10
- "ENTER_PICTURE_IN_PICTURE": "Entra al mode de pantalla en pantalla",
10
+ "ENTER_PICTURE_IN_PICTURE": "Entra a imatge sobre imatge",
11
11
  "EXIT_FULL_SCREEN": "Surt del mode de pantalla completa",
12
12
  "EXIT_LOOP_MODE": "Deixa de reproduir en bucle el vídeo actual",
13
- "EXIT_PICTURE_IN_PICTURE": "Surt del mode de pantalla en pantalla",
13
+ "EXIT_PICTURE_IN_PICTURE": "Surt d'imatge sobre imatge",
14
14
  "FAST_FORWARD": "Avança ràpidament",
15
15
  "FULL_SCREEN": "Pantalla completa",
16
16
  "LANGUAGE": "Idioma",
@@ -22,8 +22,8 @@
22
22
  "NOT_APPLICABLE": "No aplicable",
23
23
  "OFF": "Desactivat",
24
24
  "ON": "Activat",
25
- "PAUSE": "Atura",
26
- "PICTURE_IN_PICTURE": "Pantalla en pantalla",
25
+ "PAUSE": "Posa en pausa",
26
+ "PICTURE_IN_PICTURE": "Imatge sobre imatge",
27
27
  "PLAY": "Reprodueix",
28
28
  "PLAYBACK_RATE": "Velocitat de reproducció",
29
29
  "RESOLUTION": "Resolució",
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Deixa de silenciar",
36
36
  "UNRECOGNIZED_LANGUAGE": "No reconegut",
37
37
  "VOLUME": "Volum"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Zapnout zvuk",
36
36
  "UNRECOGNIZED_LANGUAGE": "Neznámé",
37
37
  "VOLUME": "Hlasitost"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Slå lyden til",
36
36
  "UNRECOGNIZED_LANGUAGE": "Ikke genkendt",
37
37
  "VOLUME": "Lydstyrke"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Stummschaltung aufheben",
36
36
  "UNRECOGNIZED_LANGUAGE": "Unbekannt",
37
37
  "VOLUME": "Lautstärke"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Κατάργηση σίγασης",
36
36
  "UNRECOGNIZED_LANGUAGE": "Μη αναγνωρίσιμο",
37
37
  "VOLUME": "Ένταση"
38
- }
38
+ }
@@ -37,4 +37,4 @@
37
37
  "UNMUTE": "Unmute",
38
38
  "UNRECOGNIZED_LANGUAGE": "Unrecognised",
39
39
  "VOLUME": "volume"
40
- }
40
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "[Ûñmûţé one]",
36
36
  "UNRECOGNIZED_LANGUAGE": "[Ûñŕéçöĝñîžéð one two]",
37
37
  "VOLUME": "[Vöļûmé one]"
38
- }
38
+ }
@@ -26,17 +26,17 @@
26
26
  "PICTURE_IN_PICTURE": "Pantalla en pantalla",
27
27
  "PLAY": "Reproducir",
28
28
  "PLAYBACK_RATE": "Velocidad de reproducción",
29
- "RECENTER_VR": "Recentrar",
29
+ "RECENTER_VR": "Volver a centrar",
30
30
  "RESOLUTION": "Resolución",
31
31
  "REWIND": "Retroceder",
32
32
  "SEEK": "Buscar",
33
33
  "SKIP_AD": "Omitir anuncio",
34
34
  "SKIP_TO_LIVE": "Adelantar hasta la transmisión en vivo",
35
35
  "SUBTITLE_FORCED": "Forzado",
36
- "SURROUND": "Envolvente",
37
- "TOGGLE_STEREOSCOPIC": "Alternar estereoscópico",
36
+ "SURROUND": "Sonido envolvente",
37
+ "TOGGLE_STEREOSCOPIC": "Activar o desactivar el modo estereoscópico",
38
38
  "UNDETERMINED_LANGUAGE": "Sin especificar",
39
39
  "UNMUTE": "Dejar de silenciar",
40
40
  "UNRECOGNIZED_LANGUAGE": "No reconocida",
41
41
  "VOLUME": "Volumen"
42
- }
42
+ }
@@ -28,7 +28,7 @@
28
28
  "PLAY": "Reproducir",
29
29
  "PLAYBACK_RATE": "Velocidad de reproducción",
30
30
  "QUALITY": "Calidad",
31
- "RECENTER_VR": "Recentrar",
31
+ "RECENTER_VR": "Volver a centrar",
32
32
  "RESOLUTION": "Resolución",
33
33
  "REWIND": "Rebobinar",
34
34
  "SEEK": "Buscar",
@@ -36,9 +36,9 @@
36
36
  "SKIP_TO_LIVE": "Ir al vídeo en directo",
37
37
  "SUBTITLE_FORCED": "Forzado",
38
38
  "SURROUND": "Envolvente",
39
- "TOGGLE_STEREOSCOPIC": "Alternar estereoscópico",
39
+ "TOGGLE_STEREOSCOPIC": "Activar/Desactivar estereoscópica",
40
40
  "UNDETERMINED_LANGUAGE": "Sin especificar",
41
41
  "UNMUTE": "Activar sonido",
42
42
  "UNRECOGNIZED_LANGUAGE": "No reconocida",
43
43
  "VOLUME": "Volumen"
44
- }
44
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "باصدا کردن",
36
36
  "UNRECOGNIZED_LANGUAGE": "ناشناس",
37
37
  "VOLUME": "میزان صدا"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Poista mykistys",
36
36
  "UNRECOGNIZED_LANGUAGE": "Tunnistamaton",
37
37
  "VOLUME": "Äänenvoimakkuus"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "I-unmute",
36
36
  "UNRECOGNIZED_LANGUAGE": "Hindi nakikilala",
37
37
  "VOLUME": "Volume"
38
- }
38
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "AD_DURATION": "Durée de l'annonce",
3
- "AD_PROGRESS": "Annonce [AD_ON] sur [NUM_ADS]",
4
- "AD_STATISTICS": "Statistiques de l'annonce",
5
- "AD_TIME": "Annonce : [AD_TIME]",
3
+ "AD_PROGRESS": "Annonce [AD_ON] sur [NUM_ADS]",
4
+ "AD_STATISTICS": "Statistiques sur les annonces",
5
+ "AD_TIME": "Annonce : [AD_TIME]",
6
6
  "AIRPLAY": "AirPlay",
7
7
  "AUTO_QUALITY": "Automatique",
8
8
  "BACK": "Retour",
@@ -30,7 +30,7 @@
30
30
  "PLAYBACK_RATE": "Vitesse de lecture",
31
31
  "QUALITY": "Qualité",
32
32
  "RECENTER_VR": "Recentrer",
33
- "REPLAY": "Rejouer",
33
+ "REPLAY": "Revoir",
34
34
  "RESOLUTION": "Résolution",
35
35
  "REWIND": "Retour arrière",
36
36
  "SEEK": "Chercher",
@@ -39,9 +39,9 @@
39
39
  "STATISTICS": "Statistiques",
40
40
  "SUBTITLE_FORCED": "Forcé",
41
41
  "SURROUND": "Surround",
42
- "TOGGLE_STEREOSCOPIC": "Stéréoscopique ON/OFF",
42
+ "TOGGLE_STEREOSCOPIC": "Activer/Désactiver le mode stéréoscopique",
43
43
  "UNDETERMINED_LANGUAGE": "Langue indéterminée",
44
44
  "UNMUTE": "Réactiver le son",
45
45
  "UNRECOGNIZED_LANGUAGE": "Non reconnu",
46
46
  "VOLUME": "Volume"
47
- }
47
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "अनम्यूट करें",
36
36
  "UNRECOGNIZED_LANGUAGE": "अपरिचित",
37
37
  "VOLUME": "मात्रा"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Uključi zvuk",
36
36
  "UNRECOGNIZED_LANGUAGE": "Nije prepoznato",
37
37
  "VOLUME": "Glasnoća"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Némítás feloldása",
36
36
  "UNRECOGNIZED_LANGUAGE": "Azonosítatlan",
37
37
  "VOLUME": "Hangerő"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Bunyikan",
36
36
  "UNRECOGNIZED_LANGUAGE": "Tidak dikenal",
37
37
  "VOLUME": "Volume"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Riattiva audio",
36
36
  "UNRECOGNIZED_LANGUAGE": "Non riconosciuto",
37
37
  "VOLUME": "Volume"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "בטל השתקה",
36
36
  "UNRECOGNIZED_LANGUAGE": "לא מוכר",
37
37
  "VOLUME": "עוצמת קול"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "ミュートを解除",
36
36
  "UNRECOGNIZED_LANGUAGE": "不明",
37
37
  "VOLUME": "音量"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "음소거 해제",
36
36
  "UNRECOGNIZED_LANGUAGE": "알 수 없음",
37
37
  "VOLUME": "볼륨"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Įjungti garsą",
36
36
  "UNRECOGNIZED_LANGUAGE": "Neatpažinta",
37
37
  "VOLUME": "Apimtis"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Ieslēgt skaņu",
36
36
  "UNRECOGNIZED_LANGUAGE": "Neatpazīts",
37
37
  "VOLUME": "Skaļums"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Dempen opheffen",
36
36
  "UNRECOGNIZED_LANGUAGE": "Onbekend",
37
37
  "VOLUME": "Volume"
38
- }
38
+ }
@@ -35,4 +35,4 @@
35
35
  "UNMUTE": "Slå på lyden",
36
36
  "UNRECOGNIZED_LANGUAGE": "Ukjent",
37
37
  "VOLUME": "Volum"
38
- }
38
+ }
@@ -8,8 +8,8 @@
8
8
  "BACK": "Wstecz",
9
9
  "CAPTIONS": "Napisy",
10
10
  "CAST": "Przesyłaj...",
11
- "ENTER_LOOP_MODE": "Odtwarzaj bieżący film w pętli",
12
- "ENTER_PICTURE_IN_PICTURE": "Włącz tryb obrazu w obrazie",
11
+ "ENTER_LOOP_MODE": "Odtwarzaj bieżący film w pętli",
12
+ "ENTER_PICTURE_IN_PICTURE": "Włącz tryb obrazu w obrazie",
13
13
  "EXIT_FULL_SCREEN": "Zamknij pełny ekran",
14
14
  "EXIT_LOOP_MODE": "Wyłącz odtwarzanie bieżącego filmu w pętli",
15
15
  "EXIT_PICTURE_IN_PICTURE": "Wyłącz tryb obrazu w obrazie",
@@ -29,8 +29,8 @@
29
29
  "PLAY": "Odtwórz",
30
30
  "PLAYBACK_RATE": "Szybkość odtwarzania",
31
31
  "QUALITY": "Jakość",
32
- "RECENTER_VR": "Wycentruj",
33
- "REPLAY": "Odtwórz od nowa",
32
+ "RECENTER_VR": "Wyśrodkuj",
33
+ "REPLAY": "Odtwórz ponownie",
34
34
  "RESOLUTION": "Rozdzielczość",
35
35
  "REWIND": "Przewiń do tyłu",
36
36
  "SEEK": "Szukaj",
@@ -39,9 +39,9 @@
39
39
  "STATISTICS": "Statystyki",
40
40
  "SUBTITLE_FORCED": "Wymuszone",
41
41
  "SURROUND": "Przestrzenny",
42
- "TOGGLE_STEREOSCOPIC": "Przełącz widok stereoskopowy",
42
+ "TOGGLE_STEREOSCOPIC": "Przełącz tryb stereoskopowy",
43
43
  "UNDETERMINED_LANGUAGE": "Nie określono",
44
44
  "UNMUTE": "Wyłącz wyciszenie",
45
45
  "UNRECOGNIZED_LANGUAGE": "Nierozpoznany",
46
46
  "VOLUME": "Głośność"
47
- }
47
+ }
@@ -29,19 +29,19 @@
29
29
  "PLAY": "Reproduzir",
30
30
  "PLAYBACK_RATE": "Velocidade da reprodução",
31
31
  "QUALITY": "Qualidade",
32
- "RECENTER_VR": "Recentralizar",
33
- "REPLAY": "Replay",
32
+ "RECENTER_VR": "Centralizar",
33
+ "REPLAY": "Repetir",
34
34
  "RESOLUTION": "Resolução",
35
- "REWIND": "Retroceder",
35
+ "REWIND": "Voltar",
36
36
  "SEEK": "Procurar",
37
37
  "SKIP_AD": "Pular anúncio",
38
38
  "SKIP_TO_LIVE": "Pular para transmissão ao vivo",
39
39
  "STATISTICS": "Estatísticas",
40
- "SUBTITLE_FORCED": "Forçado",
40
+ "SUBTITLE_FORCED": "Exibição forçada",
41
41
  "SURROUND": "Surround",
42
- "TOGGLE_STEREOSCOPIC": "Alternar estereoscópico",
42
+ "TOGGLE_STEREOSCOPIC": "Alternar imagem estereoscópica",
43
43
  "UNDETERMINED_LANGUAGE": "Indeterminado",
44
44
  "UNMUTE": "Ativar som",
45
45
  "UNRECOGNIZED_LANGUAGE": "Não reconhecido",
46
46
  "VOLUME": "Volume"
47
- }
47
+ }