mediaelement_rails 0.5.1 → 0.7.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e6de3b42c57e45c1a61a60d8ec98c0fd66ee2df4
4
+ data.tar.gz: df336f0708e2a50975aa669cd3956ffbb109b89d
5
+ SHA512:
6
+ metadata.gz: 4c8ebde5252b5680454c8e8cb7fb8e45fcaaf71251aee75c617c95f0971915e2bafb1a9fb67828dae8e185843e11b1b550e3f1d310b828f90358e12fdce0cfbb
7
+ data.tar.gz: b3776c5c16c5176593279a4d7b3d6959def7d73eb429b261c9612134403fdeae489aa7d739ded0c34a4897c51ec2bf300e47526a542e09893515bd61e75541a6
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ ## Changelog
2
+
3
+ ### v0.7.0
4
+
5
+ - Updated MediaElement.js to 2.13.2
6
+ - Change "git co" to "git checkout" in thor script
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2011 YOURNAME
1
+ Copyright 2014 Pete Browne, Tobias Schlottke, Mark Oleson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MediaelementRails #
2
2
 
3
- This neat project brings the cool [MediaElement.js](http://mediaelementjs.com/) (HTML5/Flash/Silverlight video player) to the Rails asset pipeline. __*NOTE:*__ This gem requires jquery, which shouldn't be an issue.
3
+ This neat project brings the cool [MediaElement.js](http://mediaelementjs.com/) 2.13.2 (HTML5/Flash/Silverlight video player) to the Rails asset pipeline. __*NOTE:*__ This gem requires jquery to be included, which shouldn't be an issue.
4
4
 
5
5
  ## All you have to do is: ##
6
6
 
@@ -34,7 +34,7 @@ Load the Mediaelement CSS in your `application.css`:
34
34
 
35
35
  ## Wanna use MediaElement (not the player) only? ##
36
36
 
37
- This is easy as hell too!
37
+ This is easy as hell too!
38
38
  Don't include any CSS and include the following in your `application.js` to get it working:
39
39
 
40
40
  ``` javascript
@@ -45,4 +45,9 @@ Don't include any CSS and include the following in your `application.js` to get
45
45
 
46
46
  Nothing special! This project includes all assets you might need.
47
47
 
48
- This project rocks and uses MIT-LICENSE.
48
+ ## Todo ##
49
+
50
+ - Add support for `flashmediaelement-cdn.swf` for cases when the assets are hosted on a different domain than the rails application.
51
+ - Setup [appraisal](https://github.com/thoughtbot/appraisal) gem to test against rails 3.x and 4.x
52
+
53
+ This project rocks and uses MIT-LICENSE.
File without changes
File without changes
@@ -7,7 +7,7 @@
7
7
  * for browsers that don't understand HTML5 or can't play the provided codec
8
8
  * Can play MP4 (H.264), Ogg, WebM, FLV, WMV, WMA, ACC, and MP3
9
9
  *
10
- * Copyright 2010-2012, John Dyer (http://j.hn)
10
+ * Copyright 2010-2013, John Dyer (http://j.hn)
11
11
  * License: MIT
12
12
  *
13
13
  */
@@ -15,7 +15,8 @@
15
15
  var mejs = mejs || {};
16
16
 
17
17
  // version number
18
- mejs.version = '2.11.0';
18
+ mejs.version = '2.13.2';
19
+
19
20
 
20
21
  // player number (for missing, same id attr)
21
22
  mejs.meIndex = 0;
@@ -37,7 +38,6 @@ mejs.plugins = {
37
38
  ]
38
39
  };
39
40
 
40
-
41
41
  /*
42
42
  Utility methods
43
43
  */
@@ -57,27 +57,47 @@ mejs.Utility = {
57
57
  var
58
58
  i = 0,
59
59
  j,
60
- path = '',
61
- name = '',
62
- script,
60
+ codePath = '',
61
+ testname = '',
62
+ slashPos,
63
+ filenamePos,
64
+ scriptUrl,
65
+ scriptPath,
66
+ scriptFilename,
63
67
  scripts = document.getElementsByTagName('script'),
64
68
  il = scripts.length,
65
69
  jl = scriptNames.length;
66
-
70
+
71
+ // go through all <script> tags
67
72
  for (; i < il; i++) {
68
- script = scripts[i].src;
73
+ scriptUrl = scripts[i].src;
74
+ slashPos = scriptUrl.lastIndexOf('/');
75
+ if (slashPos > -1) {
76
+ scriptFilename = scriptUrl.substring(slashPos + 1);
77
+ scriptPath = scriptUrl.substring(0, slashPos + 1);
78
+ } else {
79
+ scriptFilename = scriptUrl;
80
+ scriptPath = '';
81
+ }
82
+
83
+ // see if any <script> tags have a file name that matches the
69
84
  for (j = 0; j < jl; j++) {
70
- name = scriptNames[j];
71
- if (script.indexOf(name) > -1) {
72
- path = script.substring(0, script.indexOf(name));
85
+ testname = scriptNames[j];
86
+ filenamePos = scriptFilename.indexOf(testname);
87
+ if (filenamePos > -1) {
88
+ codePath = scriptPath;
73
89
  break;
74
90
  }
75
91
  }
76
- if (path !== '') {
92
+
93
+ // if we found a path, then break and return it
94
+ if (codePath !== '') {
77
95
  break;
78
96
  }
79
97
  }
80
- return path;
98
+
99
+ // send the best path back
100
+ return codePath;
81
101
  },
82
102
  secondsToTimeCode: function(time, forceHours, showFrameCount, fps) {
83
103
  //add framecount
@@ -297,13 +317,14 @@ mejs.MediaFeatures = {
297
317
  t.isiOS = t.isiPhone || t.isiPad;
298
318
  t.isAndroid = (ua.match(/android/i) !== null);
299
319
  t.isBustedAndroid = (ua.match(/android 2\.[12]/) !== null);
300
- t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1);
320
+ t.isBustedNativeHTTPS = (location.protocol === 'https:' && (ua.match(/android [12]\./) !== null || ua.match(/macintosh.* version.* safari/) !== null));
321
+ t.isIE = (nav.appName.toLowerCase().indexOf("microsoft") != -1 || nav.appName.toLowerCase().match(/trident/gi) !== null);
301
322
  t.isChrome = (ua.match(/chrome/gi) !== null);
302
323
  t.isFirefox = (ua.match(/firefox/gi) !== null);
303
324
  t.isWebkit = (ua.match(/webkit/gi) !== null);
304
- t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit;
325
+ t.isGecko = (ua.match(/gecko/gi) !== null) && !t.isWebkit && !t.isIE;
305
326
  t.isOpera = (ua.match(/opera/gi) !== null);
306
- t.hasTouch = ('ontouchstart' in window);
327
+ t.hasTouch = ('ontouchstart' in window); // && window.ontouchstart != null); // this breaks iOS 7
307
328
 
308
329
  // borrowed from Modernizr
309
330
  t.svg = !! document.createElementNS &&
@@ -316,35 +337,62 @@ mejs.MediaFeatures = {
316
337
 
317
338
  t.supportsMediaTag = (typeof v.canPlayType !== 'undefined' || t.isBustedAndroid);
318
339
 
340
+ // Fix for IE9 on Windows 7N / Windows 7KN (Media Player not installer)
341
+ try{
342
+ v.canPlayType("video/mp4");
343
+ }catch(e){
344
+ t.supportsMediaTag = false;
345
+ }
346
+
319
347
  // detect native JavaScript fullscreen (Safari/Firefox only, Chrome still fails)
320
348
 
321
349
  // iOS
322
350
  t.hasSemiNativeFullScreen = (typeof v.webkitEnterFullscreen !== 'undefined');
323
351
 
324
- // Webkit/firefox
352
+ // W3C
353
+ t.hasNativeFullscreen = (typeof v.requestFullscreen !== 'undefined');
354
+
355
+ // webkit/firefox/IE11+
325
356
  t.hasWebkitNativeFullScreen = (typeof v.webkitRequestFullScreen !== 'undefined');
326
357
  t.hasMozNativeFullScreen = (typeof v.mozRequestFullScreen !== 'undefined');
358
+ t.hasMsNativeFullScreen = (typeof v.msRequestFullscreen !== 'undefined');
327
359
 
328
- t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen);
360
+ t.hasTrueNativeFullScreen = (t.hasWebkitNativeFullScreen || t.hasMozNativeFullScreen || t.hasMsNativeFullScreen);
329
361
  t.nativeFullScreenEnabled = t.hasTrueNativeFullScreen;
362
+
363
+ // Enabled?
330
364
  if (t.hasMozNativeFullScreen) {
331
- t.nativeFullScreenEnabled = v.mozFullScreenEnabled;
365
+ t.nativeFullScreenEnabled = document.mozFullScreenEnabled;
366
+ } else if (t.hasMsNativeFullScreen) {
367
+ t.nativeFullScreenEnabled = document.msFullscreenEnabled;
332
368
  }
333
369
 
334
-
335
- if (this.isChrome) {
370
+ if (t.isChrome) {
336
371
  t.hasSemiNativeFullScreen = false;
337
372
  }
338
373
 
339
374
  if (t.hasTrueNativeFullScreen) {
340
- t.fullScreenEventName = (t.hasWebkitNativeFullScreen) ? 'webkitfullscreenchange' : 'mozfullscreenchange';
341
375
 
376
+ t.fullScreenEventName = '';
377
+ if (t.hasWebkitNativeFullScreen) {
378
+ t.fullScreenEventName = 'webkitfullscreenchange';
379
+
380
+ } else if (t.hasMozNativeFullScreen) {
381
+ t.fullScreenEventName = 'mozfullscreenchange';
382
+
383
+ } else if (t.hasMsNativeFullScreen) {
384
+ t.fullScreenEventName = 'MSFullscreenChange';
385
+ }
342
386
 
343
387
  t.isFullScreen = function() {
344
388
  if (v.mozRequestFullScreen) {
345
389
  return d.mozFullScreen;
390
+
346
391
  } else if (v.webkitRequestFullScreen) {
347
392
  return d.webkitIsFullScreen;
393
+
394
+ } else if (v.hasMsNativeFullScreen) {
395
+ return d.msFullscreenElement !== null;
348
396
  }
349
397
  }
350
398
 
@@ -352,16 +400,26 @@ mejs.MediaFeatures = {
352
400
 
353
401
  if (t.hasWebkitNativeFullScreen) {
354
402
  el.webkitRequestFullScreen();
403
+
355
404
  } else if (t.hasMozNativeFullScreen) {
356
405
  el.mozRequestFullScreen();
406
+
407
+ } else if (t.hasMsNativeFullScreen) {
408
+ el.msRequestFullscreen();
409
+
357
410
  }
358
411
  }
359
412
 
360
413
  t.cancelFullScreen = function() {
361
414
  if (t.hasWebkitNativeFullScreen) {
362
415
  document.webkitCancelFullScreen();
416
+
363
417
  } else if (t.hasMozNativeFullScreen) {
364
418
  document.mozCancelFullScreen();
419
+
420
+ } else if (t.hasMsNativeFullScreen) {
421
+ document.msExitFullscreen();
422
+
365
423
  }
366
424
  }
367
425
 
@@ -544,7 +602,7 @@ mejs.PluginMediaElement.prototype = {
544
602
 
545
603
  positionFullscreenButton: function(x,y,visibleAndAbove) {
546
604
  if (this.pluginApi != null && this.pluginApi.positionFullscreenButton) {
547
- this.pluginApi.positionFullscreenButton(x,y,visibleAndAbove);
605
+ this.pluginApi.positionFullscreenButton(Math.floor(x),Math.floor(y),visibleAndAbove);
548
606
  }
549
607
  },
550
608
 
@@ -756,6 +814,10 @@ mejs.MediaPluginBridge = {
756
814
  bufferedTime,
757
815
  pluginMediaElement = this.pluginMediaElements[id];
758
816
 
817
+ if(!pluginMediaElement){
818
+ return;
819
+ }
820
+
759
821
  // fake event object to mimic real HTML media event.
760
822
  e = {
761
823
  type: eventName,
@@ -800,6 +862,8 @@ mejs.MediaElementDefaults = {
800
862
  plugins: ['flash','silverlight','youtube','vimeo'],
801
863
  // shows debug errors on screen
802
864
  enablePluginDebug: false,
865
+ // use plugin for browsers that have trouble with Basic Authentication on HTTPS sites
866
+ httpsBasicAuthSite: false,
803
867
  // overrides the type specified, useful for dynamic instantiation
804
868
  type: '',
805
869
  // path to Flash and Silverlight plugins
@@ -810,6 +874,10 @@ mejs.MediaElementDefaults = {
810
874
  flashStreamer: '',
811
875
  // turns on the smoothing filter in Flash
812
876
  enablePluginSmoothing: false,
877
+ // enabled pseudo-streaming (seek) on .mp4 files
878
+ enablePseudoStreaming: false,
879
+ // start query parameter sent to server for pseudo-streaming
880
+ pseudoStreamingStartQueryParam: 'start',
813
881
  // name of silverlight file
814
882
  silverlightName: 'silverlightmediaelement.xap',
815
883
  // default if the <video width> is not specified
@@ -966,7 +1034,7 @@ mejs.HtmlMediaElementShim = {
966
1034
 
967
1035
 
968
1036
  // test for native playback first
969
- if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native')) {
1037
+ if (supportsMediaTag && (options.mode === 'auto' || options.mode === 'auto_plugin' || options.mode === 'native') && !(mejs.MediaFeatures.isBustedNativeHTTPS && options.httpsBasicAuthSite === true)) {
970
1038
 
971
1039
  if (!isMediaTag) {
972
1040
 
@@ -1075,7 +1143,7 @@ mejs.HtmlMediaElementShim = {
1075
1143
 
1076
1144
  getTypeFromFile: function(url) {
1077
1145
  url = url.split('?')[0];
1078
- var ext = url.substring(url.lastIndexOf('.') + 1);
1146
+ var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
1079
1147
  return (/(mp4|m4v|ogg|ogv|webm|webmv|flv|wmv|mpeg|mov)/gi.test(ext) ? 'video' : 'audio') + '/' + this.getTypeFromExtension(ext);
1080
1148
  },
1081
1149
 
@@ -1110,9 +1178,13 @@ mejs.HtmlMediaElementShim = {
1110
1178
  errorContainer.style.height = htmlMediaElement.height + 'px';
1111
1179
  } catch (e) {}
1112
1180
 
1113
- errorContainer.innerHTML = (poster !== '') ?
1114
- '<a href="' + playback.url + '"><img src="' + poster + '" width="100%" height="100%" /></a>' :
1115
- '<a href="' + playback.url + '"><span>' + mejs.i18n.t('Download File') + '</span></a>';
1181
+ if (options.customError) {
1182
+ errorContainer.innerHTML = options.customError;
1183
+ } else {
1184
+ errorContainer.innerHTML = (poster !== '') ?
1185
+ '<a href="' + playback.url + '"><img src="' + poster + '" width="100%" height="100%" /></a>' :
1186
+ '<a href="' + playback.url + '"><span>' + mejs.i18n.t('Download File') + '</span></a>';
1187
+ }
1116
1188
 
1117
1189
  htmlMediaElement.parentNode.insertBefore(errorContainer, htmlMediaElement);
1118
1190
  htmlMediaElement.style.display = 'none';
@@ -1154,8 +1226,8 @@ mejs.HtmlMediaElementShim = {
1154
1226
  }
1155
1227
 
1156
1228
  if (playback.isVideo) {
1157
- width = (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
1158
- height = (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
1229
+ width = (options.pluginWidth > 0) ? options.pluginWidth : (options.videoWidth > 0) ? options.videoWidth : (htmlMediaElement.getAttribute('width') !== null) ? htmlMediaElement.getAttribute('width') : options.defaultVideoWidth;
1230
+ height = (options.pluginHeight > 0) ? options.pluginHeight : (options.videoHeight > 0) ? options.videoHeight : (htmlMediaElement.getAttribute('height') !== null) ? htmlMediaElement.getAttribute('height') : options.defaultVideoHeight;
1159
1231
 
1160
1232
  // in case of '%' make sure it's encoded
1161
1233
  width = mejs.Utility.encodeUrl(width);
@@ -1192,7 +1264,8 @@ mejs.HtmlMediaElementShim = {
1192
1264
  'startvolume=' + options.startVolume,
1193
1265
  'timerrate=' + options.timerRate,
1194
1266
  'flashstreamer=' + options.flashStreamer,
1195
- 'height=' + height];
1267
+ 'height=' + height,
1268
+ 'pseudostreamstart=' + options.pseudoStreamingStartQueryParam];
1196
1269
 
1197
1270
  if (playback.url !== null) {
1198
1271
  if (playback.method == 'flash') {
@@ -1207,6 +1280,9 @@ mejs.HtmlMediaElementShim = {
1207
1280
  if (options.enablePluginSmoothing) {
1208
1281
  initVars.push('smoothing=true');
1209
1282
  }
1283
+ if (options.enablePseudoStreaming) {
1284
+ initVars.push('pseudostreaming=true');
1285
+ }
1210
1286
  if (controls) {
1211
1287
  initVars.push('controls=true'); // shows controls in the plugin if desired
1212
1288
  }
@@ -1242,6 +1318,7 @@ mejs.HtmlMediaElementShim = {
1242
1318
  '<param name="wmode" value="transparent" />' +
1243
1319
  '<param name="allowScriptAccess" value="always" />' +
1244
1320
  '<param name="allowFullScreen" value="true" />' +
1321
+ '<param name="scale" value="default" />' +
1245
1322
  '</object>';
1246
1323
 
1247
1324
  } else {
@@ -1260,6 +1337,7 @@ mejs.HtmlMediaElementShim = {
1260
1337
  'flashvars="' + initVars.join('&') + '" ' +
1261
1338
  'width="' + width + '" ' +
1262
1339
  'height="' + height + '" ' +
1340
+ 'scale="default"' +
1263
1341
  'class="mejs-shim"></embed>';
1264
1342
  }
1265
1343
  break;
@@ -1289,7 +1367,7 @@ mejs.HtmlMediaElementShim = {
1289
1367
 
1290
1368
  // DEMO Code. Does NOT work.
1291
1369
  case 'vimeo':
1292
- //console.log('vimeoid');
1370
+ //
1293
1371
 
1294
1372
  pluginMediaElement.vimeoid = playback.url.substr(playback.url.lastIndexOf('/')+1);
1295
1373
 
@@ -1310,6 +1388,8 @@ mejs.HtmlMediaElementShim = {
1310
1388
  }
1311
1389
  // hide original element
1312
1390
  htmlMediaElement.style.display = 'none';
1391
+ // prevent browser from autoplaying when using a plugin
1392
+ htmlMediaElement.removeAttribute('autoplay');
1313
1393
 
1314
1394
  // FYI: options.success will be fired by the MediaPluginBridge
1315
1395
 
@@ -1375,7 +1455,7 @@ mejs.YouTubeApi = {
1375
1455
  loadIframeApi: function() {
1376
1456
  if (!this.isIframeStarted) {
1377
1457
  var tag = document.createElement('script');
1378
- tag.src = "http://www.youtube.com/player_api";
1458
+ tag.src = "//www.youtube.com/player_api";
1379
1459
  var firstScriptTag = document.getElementsByTagName('script')[0];
1380
1460
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
1381
1461
  this.isIframeStarted = true;
@@ -1493,7 +1573,7 @@ mejs.YouTubeApi = {
1493
1573
  */
1494
1574
 
1495
1575
  var specialIEContainer,
1496
- youtubeUrl = 'http://www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
1576
+ youtubeUrl = '//www.youtube.com/apiplayer?enablejsapi=1&amp;playerapiid=' + settings.pluginId + '&amp;version=3&amp;autoplay=0&amp;controls=0&amp;modestbranding=1&loop=0';
1497
1577
 
1498
1578
  if (mejs.MediaFeatures.isIE) {
1499
1579
 
@@ -1592,30 +1672,26 @@ window.mejs = mejs;
1592
1672
  window.MediaElement = mejs.MediaElement;
1593
1673
 
1594
1674
  /*!
1595
- * Adds Internationalization and localization to objects.
1596
- *
1597
- * What is the concept beyond i18n?
1598
- * http://en.wikipedia.org/wiki/Internationalization_and_localization
1675
+ * Adds Internationalization and localization to mediaelement.
1599
1676
  *
1677
+ * This file does not contain translations, you have to add the manually.
1678
+ * The schema is always the same: me-i18n-locale-[ISO_639-1 Code].js
1600
1679
  *
1601
- * This file both i18n methods and locale which is used to translate
1602
- * strings into other languages.
1680
+ * Examples are provided both for german and chinese translation.
1603
1681
  *
1604
- * Default translations are not available, you have to add them
1605
- * through locale objects which are named exactly as the langcode
1606
- * they stand for. The default language is always english (en).
1607
1682
  *
1683
+ * What is the concept beyond i18n?
1684
+ * http://en.wikipedia.org/wiki/Internationalization_and_localization
1608
1685
  *
1609
- * Wrapper built to be able to attach the i18n object to
1610
- * other objects without changing more than one line.
1686
+ * What langcode should i use?
1687
+ * http://en.wikipedia.org/wiki/ISO_639-1
1611
1688
  *
1612
1689
  *
1613
- * LICENSE:
1690
+ * License?
1614
1691
  *
1615
1692
  * The i18n file uses methods from the Drupal project (drupal.js):
1616
1693
  * - i18n.methods.t() (modified)
1617
1694
  * - i18n.methods.checkPlain() (full copy)
1618
- * - i18n.methods.formatString() (full copy)
1619
1695
  *
1620
1696
  * The Drupal project is (like mediaelementjs) licensed under GPLv2.
1621
1697
  * - http://drupal.org/licensing/faq/#q1
@@ -1626,19 +1702,17 @@ window.MediaElement = mejs.MediaElement;
1626
1702
  * @author
1627
1703
  * Tim Latz (latz.tim@gmail.com)
1628
1704
  *
1629
- * @see
1630
- * me-i18n-locale.js
1631
1705
  *
1632
1706
  * @params
1633
- * - $ - zepto || jQuery ..
1634
1707
  * - context - document, iframe ..
1635
1708
  * - exports - CommonJS, window ..
1636
1709
  *
1637
1710
  */
1638
- ;(function($, context, exports, undefined) {
1711
+ ;(function(context, exports, undefined) {
1639
1712
  "use strict";
1640
1713
  var i18n = {
1641
1714
  "locale": {
1715
+ "language" : '',
1642
1716
  "strings" : {}
1643
1717
  },
1644
1718
  "methods" : {}
@@ -1647,20 +1721,19 @@ window.MediaElement = mejs.MediaElement;
1647
1721
 
1648
1722
 
1649
1723
  /**
1650
- * Get the current browser's language
1651
- *
1652
- * @see: i18n.methods.t()
1724
+ * Get language, fallback to browser's language if empty
1653
1725
  */
1654
- i18n.locale.getLanguage = function () {
1655
- return {
1656
- "language" : navigator.language
1657
- };
1726
+ i18n.getLanguage = function () {
1727
+ var language = i18n.locale.language || window.navigator.userLanguage || window.navigator.language;
1728
+ // convert to iso 639-1 (2-letters, lower case)
1729
+ return language.substr(0, 2).toLowerCase();
1658
1730
  };
1659
1731
 
1660
- /**
1661
- * Store the language the locale object was initialized with
1662
- */
1663
- i18n.locale.INIT_LANGUAGE = i18n.locale.getLanguage();
1732
+ // i18n fixes for compatibility with WordPress
1733
+ if ( typeof mejsL10n != 'undefined' ) {
1734
+ i18n.locale.language = mejsL10n.language;
1735
+ }
1736
+
1664
1737
 
1665
1738
 
1666
1739
  /**
@@ -1684,74 +1757,28 @@ window.MediaElement = mejs.MediaElement;
1684
1757
  return str;
1685
1758
  };
1686
1759
 
1687
- /**
1688
- * Replace placeholders with sanitized values in a string.
1689
- *
1690
- * @param str
1691
- * A string with placeholders.
1692
- * @param args
1693
- * An object of replacements pairs to make. Incidences of any key in this
1694
- * array are replaced with the corresponding value. Based on the first
1695
- * character of the key, the value is escaped and/or themed:
1696
- * - !variable: inserted as is
1697
- * - @variable: escape plain text to HTML (i18n.methods.checkPlain)
1698
- * - %variable: escape text and theme as a placeholder for user-submitted
1699
- * content (checkPlain + <em class="placeholder" > )
1700
- *
1701
- * @see i18n.methods.t()
1702
- */
1703
- i18n.methods.formatString = function(str, args) {
1704
- // Transform arguments before inserting them.
1705
- for (var key in args) {
1706
- switch (key.charAt(0)) {
1707
- // Escaped only.
1708
- case '@':
1709
- args[key] = i18n.methods.checkPlain(args[key]);
1710
- break;
1711
- // Pass-through.
1712
- case '!':
1713
- break;
1714
- // Escaped and placeholder.
1715
- case '%':
1716
- default:
1717
- args[key] = '<em class="placeholder">' + i18n.methods.checkPlain(args[key]) + '</em>';
1718
- break;
1719
- }
1720
- str = str.replace(key, args[key]);
1721
- }
1722
- return str;
1723
- };
1724
-
1725
1760
  /**
1726
1761
  * Translate strings to the page language or a given language.
1727
1762
  *
1728
- * See the documentation of the server-side t() function for further details.
1729
1763
  *
1730
1764
  * @param str
1731
1765
  * A string containing the English string to translate.
1732
- * @param args
1733
- * An object of replacements pairs to make after translation. Incidences
1734
- * of any key in this array are replaced with the corresponding value.
1735
- * See i18n.methods.formatString().
1736
1766
  *
1737
1767
  * @param options
1738
1768
  * - 'context' (defaults to the default context): The context the source string
1739
1769
  * belongs to.
1740
1770
  *
1741
1771
  * @return
1742
- * The translated string.
1772
+ * The translated string, escaped via i18n.methods.checkPlain()
1743
1773
  */
1744
- i18n.methods.t = function (str, args, options) {
1774
+ i18n.methods.t = function (str, options) {
1745
1775
 
1746
1776
  // Fetch the localized version of the string.
1747
1777
  if (i18n.locale.strings && i18n.locale.strings[options.context] && i18n.locale.strings[options.context][str]) {
1748
1778
  str = i18n.locale.strings[options.context][str];
1749
1779
  }
1750
1780
 
1751
- if (args) {
1752
- str = i18n.methods.formatString(str, args);
1753
- }
1754
- return str;
1781
+ return i18n.methods.checkPlain(str);
1755
1782
  };
1756
1783
 
1757
1784
 
@@ -1761,35 +1788,47 @@ window.MediaElement = mejs.MediaElement;
1761
1788
  * @see i18n.methods.t()
1762
1789
  * @throws InvalidArgumentException
1763
1790
  */
1764
- i18n.t = function(str, args, options) {
1791
+ i18n.t = function(str, options) {
1765
1792
 
1766
1793
  if (typeof str === 'string' && str.length > 0) {
1767
1794
 
1768
- // check every time due languge can change for
1795
+ // check every time due language can change for
1769
1796
  // different reasons (translation, lang switcher ..)
1770
- var lang = i18n.locale.getLanguage();
1797
+ var language = i18n.getLanguage();
1771
1798
 
1772
1799
  options = options || {
1773
- "context" : lang.language
1800
+ "context" : language
1774
1801
  };
1775
1802
 
1776
- return i18n.methods.t(str, args, options);
1803
+ return i18n.methods.t(str, options);
1777
1804
  }
1778
1805
  else {
1779
1806
  throw {
1780
1807
  "name" : 'InvalidArgumentException',
1781
1808
  "message" : 'First argument is either not a string or empty.'
1782
- }
1809
+ };
1783
1810
  }
1784
1811
  };
1785
1812
 
1786
1813
  // end i18n
1787
1814
  exports.i18n = i18n;
1788
- }(jQuery, document, mejs));
1815
+ }(document, mejs));
1816
+
1817
+ // i18n fixes for compatibility with WordPress
1818
+ ;(function(exports, undefined) {
1819
+
1820
+ "use strict";
1821
+
1822
+ if ( typeof mejsL10n != 'undefined' ) {
1823
+ exports[mejsL10n.language] = mejsL10n.strings;
1824
+ }
1825
+
1826
+ }(mejs.i18n.locale.strings));
1827
+
1789
1828
  /*!
1790
1829
  * This is a i18n.locale language object.
1791
1830
  *
1792
- *<de> German translation by Tim Latz, latz.tim@gmail.com
1831
+ * German translation by Tim Latz, latz.tim@gmail.com
1793
1832
  *
1794
1833
  * @author
1795
1834
  * Tim Latz (latz.tim@gmail.com)
@@ -1804,11 +1843,42 @@ window.MediaElement = mejs.MediaElement;
1804
1843
 
1805
1844
  "use strict";
1806
1845
 
1807
- exports.de = {
1808
- "Fullscreen" : "Vollbild",
1809
- "Go Fullscreen" : "Vollbild an",
1810
- "Turn off Fullscreen" : "Vollbild aus",
1811
- "Close" : "Schließen"
1812
- };
1846
+ if (typeof exports.de === 'undefined') {
1847
+ exports.de = {
1848
+ "Fullscreen" : "Vollbild",
1849
+ "Go Fullscreen" : "Vollbild an",
1850
+ "Turn off Fullscreen" : "Vollbild aus",
1851
+ "Close" : "Schließen"
1852
+ };
1853
+ }
1813
1854
 
1814
1855
  }(mejs.i18n.locale.strings));
1856
+ /*!
1857
+ * This is a i18n.locale language object.
1858
+ *
1859
+ * Traditional chinese translation by Tim Latz, latz.tim@gmail.com
1860
+ *
1861
+ * @author
1862
+ * Tim Latz (latz.tim@gmail.com)
1863
+ *
1864
+ * @see
1865
+ * me-i18n.js
1866
+ *
1867
+ * @params
1868
+ * - exports - CommonJS, window ..
1869
+ */
1870
+ ;(function(exports, undefined) {
1871
+
1872
+ "use strict";
1873
+
1874
+ if (typeof exports.zh === 'undefined') {
1875
+ exports.zh = {
1876
+ "Fullscreen" : "全螢幕",
1877
+ "Go Fullscreen" : "全屏模式",
1878
+ "Turn off Fullscreen" : "退出全屏模式",
1879
+ "Close" : "關閉"
1880
+ };
1881
+ }
1882
+
1883
+ }(mejs.i18n.locale.strings));
1884
+