shaka-player 4.11.2 → 4.11.3

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 (72) hide show
  1. package/dist/locales.js +55 -55
  2. package/dist/shaka-player.compiled.d.ts +9 -0
  3. package/dist/shaka-player.compiled.debug.d.ts +9 -0
  4. package/dist/shaka-player.compiled.debug.externs.js +13 -0
  5. package/dist/shaka-player.compiled.debug.js +226 -222
  6. package/dist/shaka-player.compiled.debug.map +3 -3
  7. package/dist/shaka-player.compiled.externs.js +13 -0
  8. package/dist/shaka-player.compiled.js +344 -341
  9. package/dist/shaka-player.compiled.map +3 -3
  10. package/dist/shaka-player.ui.d.ts +9 -0
  11. package/dist/shaka-player.ui.debug.d.ts +9 -0
  12. package/dist/shaka-player.ui.debug.externs.js +13 -0
  13. package/dist/shaka-player.ui.debug.js +101 -97
  14. package/dist/shaka-player.ui.debug.map +3 -3
  15. package/dist/shaka-player.ui.externs.js +13 -0
  16. package/dist/shaka-player.ui.js +475 -471
  17. package/dist/shaka-player.ui.map +3 -3
  18. package/lib/dash/dash_parser.js +3 -3
  19. package/lib/dash/mpd_utils.js +0 -3
  20. package/lib/dash/segment_template.js +11 -2
  21. package/lib/media/presentation_timeline.js +16 -0
  22. package/lib/media/segment_index.js +4 -4
  23. package/lib/media/streaming_engine.js +2 -1
  24. package/lib/player.js +4 -2
  25. package/lib/text/ttml_text_parser.js +1 -1
  26. package/lib/util/periods.js +56 -3
  27. package/lib/util/tXml.js +17 -9
  28. package/package.json +1 -1
  29. package/ui/locales/ar-XB.json +1 -1
  30. package/ui/locales/ar.json +1 -1
  31. package/ui/locales/bg.json +1 -1
  32. package/ui/locales/ca.json +5 -5
  33. package/ui/locales/cs.json +1 -1
  34. package/ui/locales/da.json +1 -1
  35. package/ui/locales/de.json +1 -1
  36. package/ui/locales/el.json +1 -1
  37. package/ui/locales/en-GB.json +1 -1
  38. package/ui/locales/en-XA.json +1 -1
  39. package/ui/locales/es-419.json +4 -4
  40. package/ui/locales/es.json +4 -4
  41. package/ui/locales/fa.json +1 -1
  42. package/ui/locales/fi.json +1 -1
  43. package/ui/locales/fil.json +1 -1
  44. package/ui/locales/fr.json +5 -5
  45. package/ui/locales/hi.json +1 -1
  46. package/ui/locales/hr.json +1 -1
  47. package/ui/locales/hu.json +1 -1
  48. package/ui/locales/id.json +1 -1
  49. package/ui/locales/it.json +1 -1
  50. package/ui/locales/iw.json +1 -1
  51. package/ui/locales/ja.json +1 -1
  52. package/ui/locales/ko.json +1 -1
  53. package/ui/locales/lt.json +1 -1
  54. package/ui/locales/lv.json +1 -1
  55. package/ui/locales/nl.json +1 -1
  56. package/ui/locales/no.json +1 -1
  57. package/ui/locales/pl.json +5 -5
  58. package/ui/locales/pt-BR.json +7 -7
  59. package/ui/locales/pt-PT.json +8 -8
  60. package/ui/locales/ro.json +1 -1
  61. package/ui/locales/ru.json +1 -1
  62. package/ui/locales/sk.json +1 -1
  63. package/ui/locales/sl.json +1 -1
  64. package/ui/locales/sr.json +1 -1
  65. package/ui/locales/sv.json +1 -1
  66. package/ui/locales/th.json +1 -1
  67. package/ui/locales/tr.json +1 -1
  68. package/ui/locales/uk.json +1 -1
  69. package/ui/locales/vi.json +1 -1
  70. package/ui/locales/zh-HK.json +1 -1
  71. package/ui/locales/zh-TW.json +1 -1
  72. package/ui/locales/zh.json +1 -1
@@ -1492,14 +1492,14 @@ shaka.dash.DashParser = class {
1492
1492
  */
1493
1493
  cleanStreamMap_() {
1494
1494
  const oldPeriodIds = Object.keys(this.indexStreamMap_);
1495
- if (oldPeriodIds.length === this.lastManifestUpdatePeriodIds_.length) {
1496
- return;
1497
- }
1498
1495
  const diffPeriodsIDs = oldPeriodIds.filter((pId) => {
1499
1496
  return !this.lastManifestUpdatePeriodIds_.includes(pId);
1500
1497
  });
1501
1498
  for (const pId of diffPeriodsIDs) {
1502
1499
  for (const contextId of this.indexStreamMap_[pId]) {
1500
+ if (this.periodCombiner_) {
1501
+ this.periodCombiner_.deleteStream(this.streamMap_[contextId], pId);
1502
+ }
1503
1503
  delete this.streamMap_[contextId];
1504
1504
  }
1505
1505
  delete this.indexStreamMap_[pId];
@@ -481,9 +481,6 @@ shaka.dash.MpdUtils = class {
481
481
  // Move the children of the loaded xml into the current element.
482
482
  while (rootElem.children.length) {
483
483
  const child = rootElem.children.shift();
484
- if (TXml.isNode(child)) {
485
- child.parent = element;
486
- }
487
484
  element.children.push(child);
488
485
  }
489
486
 
@@ -86,10 +86,19 @@ shaka.dash.SegmentTemplate = class {
86
86
  };
87
87
  } else if (info.segmentDuration) {
88
88
  if (!isUpdate && context.adaptationSet.contentType !== 'image') {
89
+ const periodStart = context.periodInfo.start;
90
+ const periodId = context.period.id;
91
+ const initialPeriodDuration = context.periodInfo.duration;
92
+ const periodDuration =
93
+ (periodId != null && periodDurationMap[periodId]) ||
94
+ initialPeriodDuration;
95
+ const periodEnd = periodDuration ?
96
+ (periodStart + periodDuration) : Infinity;
97
+
89
98
  context.presentationTimeline.notifyMaxSegmentDuration(
90
99
  info.segmentDuration);
91
- context.presentationTimeline.notifyMinSegmentStartTime(
92
- context.periodInfo.start);
100
+ context.presentationTimeline.notifyPeriodDuration(
101
+ periodStart, periodEnd);
93
102
  }
94
103
 
95
104
  return {
@@ -331,6 +331,22 @@ shaka.media.PresentationTimeline = class {
331
331
  }
332
332
 
333
333
 
334
+ /**
335
+ * Gives PresentationTimeline an startTime and endTime of the period.
336
+ * This should be only set for Dash.
337
+ *
338
+ * @param {number} startTime
339
+ * @param {number} endTime
340
+ * @export
341
+ */
342
+ notifyPeriodDuration(startTime, endTime) {
343
+ this.notifyMinSegmentStartTime(startTime);
344
+ if (endTime != Infinity && !this.isLive()) {
345
+ this.maxSegmentEndTime_ = Math.max(this.maxSegmentEndTime_, endTime);
346
+ }
347
+ }
348
+
349
+
334
350
  /**
335
351
  * Gets the end time of the last available segment.
336
352
  *
@@ -834,10 +834,10 @@ shaka.media.MetaSegmentIndex = class extends shaka.media.SegmentIndex {
834
834
  * @export
835
835
  */
836
836
  evict(time) {
837
- // evict() is only used internally by the DASH and HLS parser on
838
- // SegmentIndexes, but never on MetaSegmentIndex.
839
- goog.asserts.assert(
840
- false, 'evict() should not be used in MetaSegmentIndex!');
837
+ for (const index of this.indexes_) {
838
+ index.evict(time);
839
+ }
840
+ this.evictEmpty();
841
841
  }
842
842
 
843
843
  /**
@@ -2505,7 +2505,8 @@ shaka.media.StreamingEngine = class {
2505
2505
  async evict_(mediaState, presentationTime) {
2506
2506
  const segmentIndex = mediaState.stream.segmentIndex;
2507
2507
  if (segmentIndex instanceof shaka.media.MetaSegmentIndex) {
2508
- segmentIndex.evictEmpty();
2508
+ segmentIndex.evict(
2509
+ this.manifest_.presentationTimeline.getSeekRangeStart());
2509
2510
  }
2510
2511
 
2511
2512
  const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);
package/lib/player.js CHANGED
@@ -7231,11 +7231,13 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
7231
7231
  this.playhead_.notifyOfBufferingChange();
7232
7232
  // Skip the initial buffer gap
7233
7233
  const startTime = this.mediaSourceEngine_.bufferStart(contentType);
7234
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
7234
7235
  if (
7235
7236
  !this.isLive() &&
7236
7237
  // If not paused then GapJumpingController will handle this gap.
7237
7238
  this.video_.paused &&
7238
7239
  startTime != null &&
7240
+ contentType != ContentType.TEXT &&
7239
7241
  startTime > 0 &&
7240
7242
  this.playhead_.getTime() < startTime
7241
7243
  ) {
@@ -8062,8 +8064,8 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
8062
8064
  * @define {string} A version number taken from git at compile time.
8063
8065
  * @export
8064
8066
  */
8065
- // eslint-disable-next-line no-useless-concat
8066
- shaka.Player.version = 'v4.11.2' + '-uncompiled'; // x-release-please-version
8067
+ // eslint-disable-next-line no-useless-concat, max-len
8068
+ shaka.Player.version = 'v4.11.3' + '-uncompiled'; // x-release-please-version
8067
8069
 
8068
8070
  // Initialize the deprecation system using the version string we just set
8069
8071
  // on the player.
@@ -65,7 +65,7 @@ shaka.text.TtmlTextParser = class {
65
65
  return cues;
66
66
  }
67
67
 
68
- const tt = TXml.parseXmlString(str, 'tt');
68
+ const tt = TXml.parseXmlString(str, 'tt', /* includeParent= */ true);
69
69
  if (!tt) {
70
70
  throw new shaka.util.Error(
71
71
  shaka.util.Error.Severity.CRITICAL,
@@ -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
  }
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
  }
@@ -110,9 +113,10 @@ shaka.util.TXml = class {
110
113
  * parseXML / html into a DOM Object,
111
114
  * with no validation and some failure tolerance
112
115
  * @param {string} S your XML to parse
116
+ * @param {boolean} includeParent
113
117
  * @return {Array.<shaka.extern.xml.Node>}
114
118
  */
115
- static parse(S) {
119
+ static parse(S, includeParent) {
116
120
  let pos = 0;
117
121
 
118
122
  const openBracket = '<';
@@ -287,9 +291,11 @@ shaka.util.TXml = class {
287
291
  children,
288
292
  parent: null,
289
293
  };
290
- for (let i = 0; i < children.length; i++) {
291
- if (typeof children[i] !== 'string') {
292
- children[i].parent = node;
294
+ if (includeParent) {
295
+ for (let i = 0; i < children.length; i++) {
296
+ if (typeof children[i] !== 'string') {
297
+ children[i].parent = node;
298
+ }
293
299
  }
294
300
  }
295
301
  return node;
@@ -331,7 +337,9 @@ shaka.util.TXml = class {
331
337
  for (let i = 0; i < childrenLength; i++) {
332
338
  const childrenValue = children[i];
333
339
  if (typeof childrenValue !== 'string') {
334
- childrenValue.parent = node;
340
+ if (includeParent) {
341
+ childrenValue.parent = node;
342
+ }
335
343
  } else if (i == childrenLength - 1 && childrenValue == '\n') {
336
344
  children.pop();
337
345
  }
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.11.2",
4
+ "version": "4.11.3",
5
5
  "homepage": "https://github.com/shaka-project/shaka-player",
6
6
  "author": "Google",
7
7
  "maintainers": [
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "‏‮Unmute‬‏",
47
47
  "UNRECOGNIZED_LANGUAGE": "‏‮Unrecognized‬‏",
48
48
  "VOLUME": "‏‮Volume‬‏"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "إعادة الصوت",
47
47
  "UNRECOGNIZED_LANGUAGE": "غير معروف",
48
48
  "VOLUME": "مستوى الصوت"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Включване на звука",
47
47
  "UNRECOGNIZED_LANGUAGE": "Неразпознато",
48
48
  "VOLUME": "Звук"
49
- }
49
+ }
@@ -11,10 +11,10 @@
11
11
  "CHAPTERS": "Capítols",
12
12
  "DOWNLOAD_VIDEO_FRAME": "Desa el fotograma del vídeo",
13
13
  "ENTER_LOOP_MODE": "Reprodueix en bucle el vídeo actual",
14
- "ENTER_PICTURE_IN_PICTURE": "Entra al mode de pantalla en pantalla",
14
+ "ENTER_PICTURE_IN_PICTURE": "Entra a imatge sobre imatge",
15
15
  "EXIT_FULL_SCREEN": "Surt del mode de pantalla completa",
16
16
  "EXIT_LOOP_MODE": "Deixa de reproduir en bucle el vídeo actual",
17
- "EXIT_PICTURE_IN_PICTURE": "Surt del mode de pantalla en pantalla",
17
+ "EXIT_PICTURE_IN_PICTURE": "Surt d'imatge sobre imatge",
18
18
  "FAST_FORWARD": "Avança ràpidament",
19
19
  "FULL_SCREEN": "Pantalla completa",
20
20
  "LANGUAGE": "Idioma",
@@ -26,8 +26,8 @@
26
26
  "NOT_APPLICABLE": "No aplicable",
27
27
  "OFF": "Desactivat",
28
28
  "ON": "Activat",
29
- "PAUSE": "Atura",
30
- "PICTURE_IN_PICTURE": "Pantalla en pantalla",
29
+ "PAUSE": "Posa en pausa",
30
+ "PICTURE_IN_PICTURE": "Imatge sobre imatge",
31
31
  "PLAY": "Reprodueix",
32
32
  "PLAYBACK_RATE": "Velocitat de reproducció",
33
33
  "QUALITY": "Qualitat",
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Deixa de silenciar",
47
47
  "UNRECOGNIZED_LANGUAGE": "No reconegut",
48
48
  "VOLUME": "Volum"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Zapnout zvuk",
47
47
  "UNRECOGNIZED_LANGUAGE": "Neznámé",
48
48
  "VOLUME": "Hlasitost"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Slå lyden til",
47
47
  "UNRECOGNIZED_LANGUAGE": "Ikke genkendt",
48
48
  "VOLUME": "Lydstyrke"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Stummschaltung aufheben",
47
47
  "UNRECOGNIZED_LANGUAGE": "Unbekannt",
48
48
  "VOLUME": "Lautstärke"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Κατάργηση σίγασης",
47
47
  "UNRECOGNIZED_LANGUAGE": "Μη αναγνωρίσιμο",
48
48
  "VOLUME": "Ένταση"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Unmute",
47
47
  "UNRECOGNIZED_LANGUAGE": "Unrecognised",
48
48
  "VOLUME": "volume"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "[Ûñmûţé one]",
47
47
  "UNRECOGNIZED_LANGUAGE": "[Ûñŕéçöĝñîžéð one two]",
48
48
  "VOLUME": "[Vöļûmé one]"
49
- }
49
+ }
@@ -31,7 +31,7 @@
31
31
  "PLAY": "Reproducir",
32
32
  "PLAYBACK_RATE": "Velocidad de reproducción",
33
33
  "QUALITY": "Calidad",
34
- "RECENTER_VR": "Recentrar",
34
+ "RECENTER_VR": "Volver a centrar",
35
35
  "REPLAY": "Volver a reproducir",
36
36
  "RESOLUTION": "Resolución",
37
37
  "REWIND": "Retroceder",
@@ -40,10 +40,10 @@
40
40
  "SKIP_TO_LIVE": "Adelantar hasta la transmisión en vivo",
41
41
  "STATISTICS": "Estadísticas",
42
42
  "SUBTITLE_FORCED": "Forzado",
43
- "SURROUND": "Envolvente",
44
- "TOGGLE_STEREOSCOPIC": "Alternar estereoscópico",
43
+ "SURROUND": "Sonido envolvente",
44
+ "TOGGLE_STEREOSCOPIC": "Activar o desactivar el modo estereoscópico",
45
45
  "UNDETERMINED_LANGUAGE": "Sin especificar",
46
46
  "UNMUTE": "Dejar de silenciar",
47
47
  "UNRECOGNIZED_LANGUAGE": "No reconocida",
48
48
  "VOLUME": "Volumen"
49
- }
49
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "AD_DURATION": "Duración del anuncio",
3
3
  "AD_PROGRESS": "Anuncio [AD_ON] de [NUM_ADS]",
4
- "AD_STATISTICS": "Estadísticas de anuncios",
4
+ "AD_STATISTICS": "Estadísticas del anuncio",
5
5
  "AD_TIME": "Anuncio: [AD_TIME]",
6
6
  "AIRPLAY": "AirPlay",
7
7
  "AUTO_QUALITY": "Automático",
@@ -31,7 +31,7 @@
31
31
  "PLAY": "Reproducir",
32
32
  "PLAYBACK_RATE": "Velocidad de reproducción",
33
33
  "QUALITY": "Calidad",
34
- "RECENTER_VR": "Recentrar",
34
+ "RECENTER_VR": "Volver a centrar",
35
35
  "REPLAY": "Volver a reproducir",
36
36
  "RESOLUTION": "Resolución",
37
37
  "REWIND": "Rebobinar",
@@ -41,9 +41,9 @@
41
41
  "STATISTICS": "Estadísticas",
42
42
  "SUBTITLE_FORCED": "Forzado",
43
43
  "SURROUND": "Envolvente",
44
- "TOGGLE_STEREOSCOPIC": "Alternar estereoscópico",
44
+ "TOGGLE_STEREOSCOPIC": "Activar/Desactivar estereoscópica",
45
45
  "UNDETERMINED_LANGUAGE": "Sin especificar",
46
46
  "UNMUTE": "Activar sonido",
47
47
  "UNRECOGNIZED_LANGUAGE": "No reconocida",
48
48
  "VOLUME": "Volumen"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "باصدا کردن",
47
47
  "UNRECOGNIZED_LANGUAGE": "ناشناس",
48
48
  "VOLUME": "میزان صدا"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Poista mykistys",
47
47
  "UNRECOGNIZED_LANGUAGE": "Tunnistamaton",
48
48
  "VOLUME": "Äänenvoimakkuus"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "I-unmute",
47
47
  "UNRECOGNIZED_LANGUAGE": "Hindi nakikilala",
48
48
  "VOLUME": "Volume"
49
- }
49
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "AD_DURATION": "Durée de l'annonce",
3
3
  "AD_PROGRESS": "Annonce [AD_ON] sur [NUM_ADS]",
4
- "AD_STATISTICS": "Statistiques de l'annonce",
4
+ "AD_STATISTICS": "Statistiques sur les annonces",
5
5
  "AD_TIME": "Annonce : [AD_TIME]",
6
6
  "AIRPLAY": "AirPlay",
7
7
  "AUTO_QUALITY": "Automatique",
@@ -9,7 +9,7 @@
9
9
  "CAPTIONS": "Sous-titres",
10
10
  "CAST": "Caster…",
11
11
  "CHAPTERS": "Chapitres",
12
- "DOWNLOAD_VIDEO_FRAME": "Enregistrer l'image vidéo",
12
+ "DOWNLOAD_VIDEO_FRAME": "Télécharger l'image de la vidéo",
13
13
  "ENTER_LOOP_MODE": "Lire en boucle la vidéo en cours",
14
14
  "ENTER_PICTURE_IN_PICTURE": "Utiliser le mode Picture-in-Picture",
15
15
  "EXIT_FULL_SCREEN": "Quitter le mode plein écran",
@@ -32,7 +32,7 @@
32
32
  "PLAYBACK_RATE": "Vitesse de lecture",
33
33
  "QUALITY": "Qualité",
34
34
  "RECENTER_VR": "Recentrer",
35
- "REPLAY": "Rejouer",
35
+ "REPLAY": "Revoir",
36
36
  "RESOLUTION": "Résolution",
37
37
  "REWIND": "Retour arrière",
38
38
  "SEEK": "Chercher",
@@ -41,9 +41,9 @@
41
41
  "STATISTICS": "Statistiques",
42
42
  "SUBTITLE_FORCED": "Forcé",
43
43
  "SURROUND": "Surround",
44
- "TOGGLE_STEREOSCOPIC": "Stéréoscopique ON/OFF",
44
+ "TOGGLE_STEREOSCOPIC": "Activer/Désactiver le mode stéréoscopique",
45
45
  "UNDETERMINED_LANGUAGE": "Langue indéterminée",
46
46
  "UNMUTE": "Réactiver le son",
47
47
  "UNRECOGNIZED_LANGUAGE": "Non reconnu",
48
48
  "VOLUME": "Volume"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "अनम्यूट करें",
47
47
  "UNRECOGNIZED_LANGUAGE": "अपरिचित",
48
48
  "VOLUME": "मात्रा"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Uključi zvuk",
47
47
  "UNRECOGNIZED_LANGUAGE": "Nije prepoznato",
48
48
  "VOLUME": "Glasnoća"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Némítás feloldása",
47
47
  "UNRECOGNIZED_LANGUAGE": "Azonosítatlan",
48
48
  "VOLUME": "Hangerő"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Bunyikan",
47
47
  "UNRECOGNIZED_LANGUAGE": "Tidak dikenal",
48
48
  "VOLUME": "Volume"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Riattiva audio",
47
47
  "UNRECOGNIZED_LANGUAGE": "Non riconosciuto",
48
48
  "VOLUME": "Volume"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "בטל השתקה",
47
47
  "UNRECOGNIZED_LANGUAGE": "לא מוכר",
48
48
  "VOLUME": "עוצמת קול"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "ミュートを解除",
47
47
  "UNRECOGNIZED_LANGUAGE": "不明",
48
48
  "VOLUME": "音量"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "음소거 해제",
47
47
  "UNRECOGNIZED_LANGUAGE": "알 수 없음",
48
48
  "VOLUME": "볼륨"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Įjungti garsą",
47
47
  "UNRECOGNIZED_LANGUAGE": "Neatpažinta",
48
48
  "VOLUME": "Apimtis"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Ieslēgt skaņu",
47
47
  "UNRECOGNIZED_LANGUAGE": "Neatpazīts",
48
48
  "VOLUME": "Skaļums"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Geluid aanzetten",
47
47
  "UNRECOGNIZED_LANGUAGE": "Onbekend",
48
48
  "VOLUME": "Volume"
49
- }
49
+ }
@@ -46,4 +46,4 @@
46
46
  "UNMUTE": "Slå på lyden",
47
47
  "UNRECOGNIZED_LANGUAGE": "Ukjent",
48
48
  "VOLUME": "Volum"
49
- }
49
+ }
@@ -9,7 +9,7 @@
9
9
  "CAPTIONS": "Napisy",
10
10
  "CAST": "Przesyłaj...",
11
11
  "CHAPTERS": "Rozdziały",
12
- "DOWNLOAD_VIDEO_FRAME": "Zapisz klatkę wideo",
12
+ "DOWNLOAD_VIDEO_FRAME": "Zapisz klatkę filmu",
13
13
  "ENTER_LOOP_MODE": "Odtwarzaj bieżący film w pętli",
14
14
  "ENTER_PICTURE_IN_PICTURE": "Włącz tryb obrazu w obrazie",
15
15
  "EXIT_FULL_SCREEN": "Zamknij pełny ekran",
@@ -31,8 +31,8 @@
31
31
  "PLAY": "Odtwórz",
32
32
  "PLAYBACK_RATE": "Szybkość odtwarzania",
33
33
  "QUALITY": "Jakość",
34
- "RECENTER_VR": "Wycentruj",
35
- "REPLAY": "Odtwórz od nowa",
34
+ "RECENTER_VR": "Wyśrodkuj",
35
+ "REPLAY": "Odtwórz ponownie",
36
36
  "RESOLUTION": "Rozdzielczość",
37
37
  "REWIND": "Przewiń do tyłu",
38
38
  "SEEK": "Szukaj",
@@ -41,9 +41,9 @@
41
41
  "STATISTICS": "Statystyki",
42
42
  "SUBTITLE_FORCED": "Wymuszone",
43
43
  "SURROUND": "Przestrzenny",
44
- "TOGGLE_STEREOSCOPIC": "Przełącz widok stereoskopowy",
44
+ "TOGGLE_STEREOSCOPIC": "Przełącz tryb stereoskopowy",
45
45
  "UNDETERMINED_LANGUAGE": "Nie określono",
46
46
  "UNMUTE": "Wyłącz wyciszenie",
47
47
  "UNRECOGNIZED_LANGUAGE": "Nierozpoznany",
48
48
  "VOLUME": "Głośność"
49
- }
49
+ }