Simple Calendar – Google Calendar Plugin - Version 3.0.8

Version Description

  • December 1, 2015 =

  • Fix: Fixed bug for Google Calendar Pro add-on organizer event builder code.

  • Fix: Fixed some inconsistencies with all-day events and multi-day events when combined.

Download this release

Release Info

Developer pderksen
Plugin Icon 128x128 Simple Calendar – Google Calendar Plugin
Version 3.0.8
Comparing to
See all releases

Code changes from version 3.0.7 to 3.0.8

Files changed (90) hide show
  1. assets/css/admin-activation.min.css +1 -1
  2. assets/css/admin-add-calendar.min.css +1 -1
  3. assets/css/admin.min.css +1 -1
  4. assets/css/default-calendar-grid.min.css +1 -1
  5. assets/css/default-calendar-list.min.css +1 -1
  6. assets/js/admin-add-calendar.min.js +1 -1
  7. assets/js/admin.js +64 -63
  8. assets/js/admin.min.js +2 -2
  9. assets/js/default-calendar.min.js +1 -1
  10. google-calendar-events.php +2 -2
  11. includes/admin/metaboxes/settings.php +1 -1
  12. includes/admin/welcome.php +1 -1
  13. includes/calendars/admin/default-calendar-admin.php +14 -0
  14. includes/events/event-builder.php +19 -7
  15. readme.txt +6 -1
  16. vendor/autoload_52.php +1 -1
  17. vendor/composer/ClassLoader.php +3 -3
  18. vendor/composer/autoload_classmap.php +5 -40
  19. vendor/composer/autoload_files.php +2 -1
  20. vendor/composer/autoload_psr4.php +1 -0
  21. vendor/composer/autoload_real.php +8 -4
  22. vendor/composer/autoload_real_52.php +4 -3
  23. vendor/composer/installed.json +73 -14
  24. vendor/symfony/polyfill-mbstring/LICENSE +19 -0
  25. vendor/symfony/polyfill-mbstring/Mbstring.php +604 -0
  26. vendor/symfony/polyfill-mbstring/README.md +13 -0
  27. vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser +1 -0
  28. vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser +1 -0
  29. vendor/symfony/polyfill-mbstring/bootstrap.php +51 -0
  30. vendor/symfony/polyfill-mbstring/composer.json +34 -0
  31. vendor/symfony/translation/CHANGELOG.md +22 -0
  32. vendor/symfony/translation/Catalogue/AbstractOperation.php +33 -8
  33. vendor/symfony/translation/Catalogue/MergeOperation.php +5 -1
  34. vendor/symfony/translation/Catalogue/OperationInterface.php +18 -4
  35. vendor/symfony/translation/Catalogue/{DiffOperation.php → TargetOperation.php} +17 -3
  36. vendor/symfony/translation/DataCollector/TranslationDataCollector.php +6 -1
  37. vendor/symfony/translation/DataCollectorTranslator.php +8 -4
  38. vendor/symfony/translation/Dumper/CsvFileDumper.php +1 -1
  39. vendor/symfony/translation/Dumper/FileDumper.php +3 -2
  40. vendor/symfony/translation/Dumper/IcuResFileDumper.php +1 -1
  41. vendor/symfony/translation/Dumper/IniFileDumper.php +1 -1
  42. vendor/symfony/translation/Dumper/JsonFileDumper.php +8 -2
  43. vendor/symfony/translation/Dumper/MoFileDumper.php +1 -1
  44. vendor/symfony/translation/Dumper/PhpFileDumper.php +1 -1
  45. vendor/symfony/translation/Dumper/PoFileDumper.php +1 -1
  46. vendor/symfony/translation/Dumper/QtFileDumper.php +1 -1
  47. vendor/symfony/translation/Dumper/XliffFileDumper.php +91 -17
  48. vendor/symfony/translation/Dumper/YamlFileDumper.php +13 -2
  49. vendor/symfony/translation/Loader/CsvFileLoader.php +3 -19
  50. vendor/symfony/translation/Loader/FileLoader.php +65 -0
  51. vendor/symfony/translation/Loader/IniFileLoader.php +3 -23
  52. vendor/symfony/translation/Loader/JsonFileLoader.php +3 -20
  53. vendor/symfony/translation/Loader/MoFileLoader.php +3 -40
  54. vendor/symfony/translation/Loader/PhpFileLoader.php +3 -23
  55. vendor/symfony/translation/Loader/PoFileLoader.php +3 -40
  56. vendor/symfony/translation/Loader/XliffFileLoader.php +191 -62
  57. vendor/symfony/translation/Loader/YamlFileLoader.php +7 -33
  58. vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd +411 -0
  59. vendor/symfony/translation/PluralizationRules.php +1 -7
  60. vendor/symfony/translation/README.md +1 -1
  61. vendor/symfony/translation/Tests/Catalogue/{DiffOperationTest.php → TargetOperationTest.php} +4 -3
  62. vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php +28 -1
  63. vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php +18 -0
  64. vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php +2 -6
  65. vendor/symfony/translation/Tests/Dumper/FileDumperTest.php +14 -1
  66. vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php +2 -11
  67. vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php +2 -6
  68. vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php +11 -9
  69. vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php +2 -5
  70. vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php +2 -6
  71. vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php +2 -5
  72. vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php +2 -6
  73. vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php +55 -7
  74. vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php +20 -6
  75. vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php +27 -3
  76. vendor/symfony/translation/Tests/TranslatorCacheTest.php +3 -3
  77. vendor/symfony/translation/Tests/TranslatorTest.php +0 -114
  78. vendor/symfony/translation/Tests/Util/ArrayConverterTest.php +73 -0
  79. vendor/symfony/translation/Tests/fixtures/messages.yml +3 -0
  80. vendor/symfony/translation/Tests/fixtures/messages_linear.yml +2 -0
  81. vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf +23 -0
  82. vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf +25 -0
  83. vendor/symfony/translation/Tests/fixtures/resources-clean.xlf +3 -0
  84. vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf +14 -0
  85. vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf +14 -0
  86. vendor/symfony/translation/Tests/fixtures/resources.dump.json +1 -0
  87. vendor/symfony/translation/Tests/fixtures/with-attributes.xlf +21 -0
  88. vendor/symfony/translation/Translator.php +4 -44
  89. vendor/symfony/translation/Util/ArrayConverter.php +99 -0
  90. vendor/symfony/translation/composer.json +7 -6
assets/css/admin-activation.min.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.7
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/css/admin-add-calendar.min.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.7
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/css/admin.min.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.7
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/css/default-calendar-grid.min.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.7
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/css/default-calendar-list.min.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.7
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/js/admin-add-calendar.min.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.0
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
assets/js/admin.js CHANGED
@@ -1,4 +1,4 @@
1
- ( function( window, undefined ) {
2
  'use strict';
3
 
4
  jQuery( function( $ ) {
@@ -44,9 +44,9 @@
44
  return;
45
  }
46
  calendarSettings.toggleClass( 'closed' );
47
- });
48
 
49
- });
50
 
51
  // Tabbed Panels in Settings Meta Box.
52
  $( document.body ).on( 'simcal-init-tabbed-panels', function() {
@@ -67,12 +67,12 @@
67
  // Swap feed type tabs and panels according to selection.
68
  $( '#_feed_type' ).on( 'change', function() {
69
 
70
- var selected = $( this ).find( 'option:selected'),
71
- feed = selected.val(),
72
- ul = $( '.simcal-tabs' ),
73
- tabs = ul.find( '> .simcal-feed-type' ),
74
- tab = ul.find( '> .simcal-feed-type-' + feed),
75
- a = ul.find( '> li:first-child > a' );
76
 
77
  tabs.each( function() {
78
  $( this ).hide();
@@ -122,8 +122,8 @@
122
  // Select2 enhanced select.
123
  $( '.simcal-field-select-enhanced' ).each( function( e, i ) {
124
 
125
- var field = $( i ),
126
- noResults = field.data( 'noresults' ),
127
  allowClear = field.data( 'allowclear' );
128
 
129
  field.select2( {
@@ -133,7 +133,7 @@
133
  placeholder: ''
134
  },
135
  dir: simcal_admin.text_dir != 'undefined' ? simcal_admin.text_dir : 'ltr',
136
- tokenSeparators: [','],
137
  width: '100%',
138
  language: {
139
  noResults: function() {
@@ -148,7 +148,7 @@
148
  fieldDatePicker.each( function( e, i ) {
149
 
150
  var input = $( i ).find( 'input' ),
151
- args = {
152
  autoSize: true,
153
  changeMonth: true,
154
  changeYear: true,
@@ -182,18 +182,18 @@
182
  select.each( function( e, i ) {
183
  $( i ).on( 'change', function() {
184
  formatDateTime( $( this ).closest( 'div.simcal-field-datetime-format' ) );
185
- });
186
- });
187
 
188
  formatDateTime( i );
189
  } );
190
  // Helper function for datetime formatter field.
191
  function formatDateTime( field ) {
192
 
193
- var input = $( field ).find( 'input' ),
194
- select = $( field ).find( '> div select' ),
195
- code = $( field ).find( 'code' ),
196
- format = '',
197
  preview = '';
198
 
199
  select.each( function( i, e ) {
@@ -203,23 +203,24 @@
203
 
204
  if ( value.length ) {
205
  if ( selected.data( 'trim' ) ) {
206
- format = format.trim() + $( e ).val();
207
  preview = preview.trim() + selected.data( 'preview' );
208
  } else {
209
- format += $( e ).val() + ' ';
210
  preview += selected.data( 'preview' ) + ' ';
211
  }
212
  }
213
 
214
- });
215
 
216
  input.val( format );
217
  code.text( preview );
218
  }
 
219
  // If PHP datetime formatter is used, this will live preview the user input.
220
  $( '.simcal-field-datetime-format-php' ).each( function( e, i ) {
221
 
222
- var input = $( i ).find( 'input' ),
223
  preview = $( i ).find( 'code' );
224
 
225
  $( input ).on( 'keyup', function() {
@@ -244,8 +245,8 @@
244
  $( 'input[type="number"].simcal-field' ).each( function( e, i ) {
245
 
246
  var field = $( i ),
247
- min = field.attr( 'min' ),
248
- max = field.attr( 'max' );
249
 
250
  field.on( 'change', function() {
251
 
@@ -269,12 +270,12 @@
269
 
270
  options.each( function( e, option ) {
271
 
272
- var show = $( option ).data( 'show-field' ),
273
- showMany = $( option ).data( 'show-fields'),
274
- hide = $( option ).data( 'hide-field' ),
275
- hideMany = $( option ).data( 'hide-fields' );
276
 
277
- var fieldShow = show ? $( '#' + show ) : '',
278
  fieldHide = hide ? $( '#' + hide ) : '';
279
 
280
  if ( $( option ).is( ':selected' ) ) {
@@ -308,9 +309,9 @@
308
 
309
  options.each( function( e, option ) {
310
 
311
- var id = $( option ).data( 'show-field' ),
312
- field = id.length ? $( '#' + id ) : '',
313
- next = id.length ? field.next() : '';
314
 
315
  if ( field.length ) {
316
  if ( $( option ).is( ':selected' ) ) {
@@ -355,7 +356,7 @@
355
  el = $( this ).nextUntil().not( 'i' );
356
  next = el.length ? el.next() : '';
357
 
358
- if (value == trigger) {
359
  el.show();
360
  if ( next.hasClass( 'select2' ) ) {
361
  next.show();
@@ -383,19 +384,19 @@
383
  var spinner = $( this ).find( 'i' );
384
 
385
  $.ajax( {
386
- url : simcal_admin.ajax_url,
387
- method : 'POST',
388
- data : {
389
  action: 'simcal_clear_cache',
390
- id : $( this ).data( 'id' )
391
  },
392
  beforeSend: function() {
393
  spinner.fadeToggle();
394
  },
395
- success : function() {
396
  spinner.fadeToggle();
397
  },
398
- error : function( response ) {
399
  console.log( response );
400
  }
401
  } );
@@ -409,11 +410,11 @@
409
 
410
  var nlMetaBox = $( '#simcal-drip' ),
411
  signupDiv = nlMetaBox.find( '.signup' ),
412
- thankYou = nlMetaBox.find( '.thank-you' ),
413
- nlForm = $( '#simcal-drip-form' ),
414
- name = nlMetaBox.find( '#simcal-drip-field-first_name' ),
415
- nameReal = nlForm.find( '#simcal-drip-real-field-first_name' ),
416
- email = nlMetaBox.find( '#simcal-drip-field-email' ),
417
  emailReal = nlForm.find( '#simcal-drip-real-field-email' );
418
 
419
  nameReal.val( name.val() );
@@ -450,19 +451,19 @@
450
  }
451
 
452
  $.ajax( {
453
- url : simcal_admin.ajax_url,
454
- method : 'POST',
455
- data : {
456
- action : 'simcal_manage_add_on_license',
457
- add_on : $( this ).data('add-on'),
458
- license_key : field.val(),
459
  license_action: manage_license_action,
460
- nonce : $( '#simcal_license_manager' ).val()
461
  },
462
  beforeSend: function() {
463
  spinner.fadeToggle();
464
  },
465
- success : function( response ) {
466
  spinner.fadeToggle();
467
  if ( 'activate_license' == manage_license_action ) {
468
  if ( 'valid' == response.data ) {
@@ -486,7 +487,7 @@
486
  }
487
  }
488
  },
489
- error : function( response ) {
490
  console.log( response );
491
  spinner.fadeToggle();
492
  }
@@ -506,25 +507,25 @@
506
  return;
507
  }
508
 
509
- $.ajax({
510
- url : simcal_admin.ajax_url,
511
- method : 'POST',
512
- data : {
513
  action: 'simcal_reset_add_ons_licenses',
514
- nonce : $( '#simcal_license_manager' ).val()
515
  },
516
  beforeSend: function() {
517
  spinner.toggle();
518
  },
519
- success: function ( response ) {
520
  if ( 'success' == response.data ) {
521
  location.reload();
522
  } else {
523
  console.log( response );
524
  }
525
  },
526
- error : function ( response ) {
527
- console.log(response);
528
  }
529
  } );
530
 
@@ -532,4 +533,4 @@
532
 
533
  } );
534
 
535
- } )( this );
1
+ (function( window, undefined ) {
2
  'use strict';
3
 
4
  jQuery( function( $ ) {
44
  return;
45
  }
46
  calendarSettings.toggleClass( 'closed' );
47
+ } );
48
 
49
+ } );
50
 
51
  // Tabbed Panels in Settings Meta Box.
52
  $( document.body ).on( 'simcal-init-tabbed-panels', function() {
67
  // Swap feed type tabs and panels according to selection.
68
  $( '#_feed_type' ).on( 'change', function() {
69
 
70
+ var selected = $( this ).find( 'option:selected' ),
71
+ feed = selected.val(),
72
+ ul = $( '.simcal-tabs' ),
73
+ tabs = ul.find( '> .simcal-feed-type' ),
74
+ tab = ul.find( '> .simcal-feed-type-' + feed ),
75
+ a = ul.find( '> li:first-child > a' );
76
 
77
  tabs.each( function() {
78
  $( this ).hide();
122
  // Select2 enhanced select.
123
  $( '.simcal-field-select-enhanced' ).each( function( e, i ) {
124
 
125
+ var field = $( i ),
126
+ noResults = field.data( 'noresults' ),
127
  allowClear = field.data( 'allowclear' );
128
 
129
  field.select2( {
133
  placeholder: ''
134
  },
135
  dir: simcal_admin.text_dir != 'undefined' ? simcal_admin.text_dir : 'ltr',
136
+ tokenSeparators: [ ',' ],
137
  width: '100%',
138
  language: {
139
  noResults: function() {
148
  fieldDatePicker.each( function( e, i ) {
149
 
150
  var input = $( i ).find( 'input' ),
151
+ args = {
152
  autoSize: true,
153
  changeMonth: true,
154
  changeYear: true,
182
  select.each( function( e, i ) {
183
  $( i ).on( 'change', function() {
184
  formatDateTime( $( this ).closest( 'div.simcal-field-datetime-format' ) );
185
+ } );
186
+ } );
187
 
188
  formatDateTime( i );
189
  } );
190
  // Helper function for datetime formatter field.
191
  function formatDateTime( field ) {
192
 
193
+ var input = $( field ).find( 'input' ),
194
+ select = $( field ).find( '> div select' ),
195
+ code = $( field ).find( 'code' ),
196
+ format = '',
197
  preview = '';
198
 
199
  select.each( function( i, e ) {
203
 
204
  if ( value.length ) {
205
  if ( selected.data( 'trim' ) ) {
206
+ format = format.trim() + $( e ).val();
207
  preview = preview.trim() + selected.data( 'preview' );
208
  } else {
209
+ format += $( e ).val() + ' ';
210
  preview += selected.data( 'preview' ) + ' ';
211
  }
212
  }
213
 
214
+ } );
215
 
216
  input.val( format );
217
  code.text( preview );
218
  }
219
+
220
  // If PHP datetime formatter is used, this will live preview the user input.
221
  $( '.simcal-field-datetime-format-php' ).each( function( e, i ) {
222
 
223
+ var input = $( i ).find( 'input' ),
224
  preview = $( i ).find( 'code' );
225
 
226
  $( input ).on( 'keyup', function() {
245
  $( 'input[type="number"].simcal-field' ).each( function( e, i ) {
246
 
247
  var field = $( i ),
248
+ min = field.attr( 'min' ),
249
+ max = field.attr( 'max' );
250
 
251
  field.on( 'change', function() {
252
 
270
 
271
  options.each( function( e, option ) {
272
 
273
+ var show = $( option ).data( 'show-field' ),
274
+ showMany = $( option ).data( 'show-fields' ),
275
+ hide = $( option ).data( 'hide-field' ),
276
+ hideMany = $( option ).data( 'hide-fields' );
277
 
278
+ var fieldShow = show ? $( '#' + show ) : '',
279
  fieldHide = hide ? $( '#' + hide ) : '';
280
 
281
  if ( $( option ).is( ':selected' ) ) {
309
 
310
  options.each( function( e, option ) {
311
 
312
+ var id = $( option ).data( 'show-field' ),
313
+ field = id.length ? $( '#' + id ) : '',
314
+ next = id.length ? field.next() : '';
315
 
316
  if ( field.length ) {
317
  if ( $( option ).is( ':selected' ) ) {
356
  el = $( this ).nextUntil().not( 'i' );
357
  next = el.length ? el.next() : '';
358
 
359
+ if ( value == trigger ) {
360
  el.show();
361
  if ( next.hasClass( 'select2' ) ) {
362
  next.show();
384
  var spinner = $( this ).find( 'i' );
385
 
386
  $.ajax( {
387
+ url: simcal_admin.ajax_url,
388
+ method: 'POST',
389
+ data: {
390
  action: 'simcal_clear_cache',
391
+ id: $( this ).data( 'id' )
392
  },
393
  beforeSend: function() {
394
  spinner.fadeToggle();
395
  },
396
+ success: function() {
397
  spinner.fadeToggle();
398
  },
399
+ error: function( response ) {
400
  console.log( response );
401
  }
402
  } );
410
 
411
  var nlMetaBox = $( '#simcal-drip' ),
412
  signupDiv = nlMetaBox.find( '.signup' ),
413
+ thankYou = nlMetaBox.find( '.thank-you' ),
414
+ nlForm = $( '#simcal-drip-form' ),
415
+ name = nlMetaBox.find( '#simcal-drip-field-first_name' ),
416
+ nameReal = nlForm.find( '#simcal-drip-real-field-first_name' ),
417
+ email = nlMetaBox.find( '#simcal-drip-field-email' ),
418
  emailReal = nlForm.find( '#simcal-drip-real-field-email' );
419
 
420
  nameReal.val( name.val() );
451
  }
452
 
453
  $.ajax( {
454
+ url: simcal_admin.ajax_url,
455
+ method: 'POST',
456
+ data: {
457
+ action: 'simcal_manage_add_on_license',
458
+ add_on: $( this ).data( 'add-on' ),
459
+ license_key: field.val(),
460
  license_action: manage_license_action,
461
+ nonce: $( '#simcal_license_manager' ).val()
462
  },
463
  beforeSend: function() {
464
  spinner.fadeToggle();
465
  },
466
+ success: function( response ) {
467
  spinner.fadeToggle();
468
  if ( 'activate_license' == manage_license_action ) {
469
  if ( 'valid' == response.data ) {
487
  }
488
  }
489
  },
490
+ error: function( response ) {
491
  console.log( response );
492
  spinner.fadeToggle();
493
  }
507
  return;
508
  }
509
 
510
+ $.ajax( {
511
+ url: simcal_admin.ajax_url,
512
+ method: 'POST',
513
+ data: {
514
  action: 'simcal_reset_add_ons_licenses',
515
+ nonce: $( '#simcal_license_manager' ).val()
516
  },
517
  beforeSend: function() {
518
  spinner.toggle();
519
  },
520
+ success: function( response ) {
521
  if ( 'success' == response.data ) {
522
  location.reload();
523
  } else {
524
  console.log( response );
525
  }
526
  },
527
+ error: function( response ) {
528
+ console.log( response );
529
  }
530
  } );
531
 
533
 
534
  } );
535
 
536
+ })( this );
assets/js/admin.min.js CHANGED
@@ -1,6 +1,6 @@
1
- /*! Simple Calendar - 3.0.0
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
5
 
6
- !function(a,b){"use strict";jQuery(function(a){function b(b){var c=a(b).find("input"),d=a(b).find("> div select"),e=a(b).find("code"),f="",g="";d.each(function(b,c){var d=a(c).val(),e=a(c).find("> option:selected");d.length&&(e.data("trim")?(f=f.trim()+a(c).val(),g=g.trim()+e.data("preview")):(f+=a(c).val()+" ",g+=e.data("preview")+" "))}),c.val(f),e.text(g)}a(".simcal-help-tip").tipTip({attribute:"data-tip",delay:200,fadeIn:50,fadeOut:50}),a(".simcal-shortcode-tip").tipTip({activation:"click",defaultPosition:"top",delay:200,fadeIn:50,fadeOut:50});var c=a("#simcal-calendar-settings"),d=c.find(".simcal-box-handle"),e=c.find(".hndle");a(d).appendTo(e),a(function(){a(e).unbind("click.postboxes"),c.on("click","h3.hndle",function(b){a(b.target).filter("input, option, label, select").length||c.toggleClass("closed")})}),a(document.body).on("simcal-init-tabbed-panels",function(){a(".simcal-tabs").show(),a(".simcal-tabs a").click(function(){var b=a(this).closest("div.simcal-panels-wrap");return a("ul.simcal-tabs li",b).removeClass("active"),a(this).parent().addClass("active"),a("div.simcal-panel",b).hide(),a(a(this).attr("href")).show(),!1}),a("div.simcal-panels-wrap").each(function(){a(this).find("ul.simcal-tabs > li").eq(0).find("a").click()})}).trigger("simcal-init-tabbed-panels"),a("#_feed_type").on("change",function(){var b=a(this).find("option:selected"),c=b.val(),d=a(".simcal-tabs"),e=d.find("> .simcal-feed-type"),f=d.find("> .simcal-feed-type-"+c),g=d.find("> li:first-child > a");e.each(function(){a(this).hide()}),f.show(),g.trigger("click")}).trigger("change"),c.show();var f=a("#_calendar_view_default-calendar"),g=a("#default-calendar-settings"),h=g.find(".simcal-default-calendar-grid"),i=g.find(".simcal-default-calendar-list"),j=g.find(".simcal-default-calendar-list-grouped");f.on("change",function(){var b=a(this).val();"grid"==b?(i.hide(),j.hide(),h.show()):"list"==b?(h.hide(),j.hide(),i.show()):"list-grouped"==b&&(h.hide(),i.hide(),j.show())}).trigger("change"),a(".simcal-field-color-picker").wpColorPicker(),a(".simcal-field-select-enhanced").each(function(b,c){var d=a(c),e=d.data("noresults"),f=d.data("allowclear");d.select2({allowClear:"undefined"!=f?f:!1,placeholder:{id:"",placeholder:""},dir:"undefined"!=simcal_admin.text_dir?simcal_admin.text_dir:"ltr",tokenSeparators:[","],width:"100%",language:{noResults:function(){return"undefined"!=e?e:""}}})});var k=a(".simcal-field-date-picker");k.each(function(b,c){var d=a(c).find("input"),e={autoSize:!0,changeMonth:!0,changeYear:!0,dateFormat:"yy-mm-dd",firstDay:1,prevText:'<i class="simcal-icon-left"></i>',nextText:'<i class="simcal-icon-right"></i>',yearRange:"1900:2050",beforeShow:function(b,c){a("#ui-datepicker-div").addClass("simcal-date-picker")}};a(d).datepicker(e),a(d).datepicker("option",a.datepicker.regional[simcal_admin.locale])});var l=a(".simcal-field-datetime-format");l.sortable({items:"> div",stop:function(){b(a(this))}}),l.each(function(c,d){var e=a(d).find("> div select");e.each(function(c,d){a(d).on("change",function(){b(a(this).closest("div.simcal-field-datetime-format"))})}),b(d)}),a(".simcal-field-datetime-format-php").each(function(b,c){var d=a(c).find("input"),e=a(c).find("code");a(d).on("keyup",function(){var b={action:"simcal_date_i18n_input_preview",value:d.val()};a.post(simcal_admin.ajax_url,b,function(b){a(e).text(b.data)})})}),a('input[type="number"].simcal-field').each(function(b,c){var d=a(c),e=d.attr("min"),f=d.attr("max");d.on("change",function(){var b=a(this).val();e&&e>b&&a(this).val(e),f&&b>f&&a(this).val(f)})}),a(".simcal-field-switch-other").on("change",function(){var b=a(this).find("option");b.each(function(b,c){var d=a(c).data("show-field"),e=a(c).data("show-fields"),f=a(c).data("hide-field"),g=a(c).data("hide-fields"),h=d?a("#"+d):"",i=f?a("#"+f):"";if(a(c).is(":selected")){if(h&&h.show(),i&&i.hide(),e){var j=g.split(",");a(j).each(function(b,c){a("#"+c).hide()})}if(g){var k=g.split(",");a(k).each(function(b,c){a("#"+c).hide()})}}})}).trigger("change"),a(".simcal-field-show-other").on("change",function(){var b=a(this).find("option");b.each(function(b,c){var d=a(c).data("show-field"),e=d.length?a("#"+d):"",f=d.length?e.next():"";e.length&&(a(c).is(":selected")?(e.show(),f.hasClass("select2")&&f.show()):(e.hide(),f.hasClass("select2")&&f.hide()))})}).trigger("change"),a(".simcal-field-show-next").on("change",function(){var b,c,d,e;a(this).is(":checkbox")?(d=a(this).parent().next(),a(this).is(":checked")?d.show():d.hide()):(b=a(this).val(),c=a(this).data("show-next-if-value"),d=a(this).nextUntil().not("i"),e=d.length?d.next():"",b==c?(d.show(),e.hasClass("select2")&&e.show()):(d.hide(),e.hasClass("select2")&&e.hide()))}).trigger("change"),a("#simcal-clear-cache").on("click",function(b){b.preventDefault();var c=a(this).find("i");a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_clear_cache",id:a(this).data("id")},beforeSend:function(){c.fadeToggle()},success:function(){c.fadeToggle()},error:function(a){console.log(a)}})}),a("#simcal-drip-signup").on("click",function(b){b.preventDefault();var c=a("#simcal-drip"),d=c.find(".signup"),e=c.find(".thank-you"),f=a("#simcal-drip-form"),g=c.find("#simcal-drip-field-first_name"),h=f.find("#simcal-drip-real-field-first_name"),i=c.find("#simcal-drip-field-email"),j=f.find("#simcal-drip-real-field-email");console.log(g.val()),console.log(i.val()),h.val(g.val()),j.val(i.val()),d.hide(),e.show(),f.submit()}),a(".simcal-addon-manage-license").on("click",function(b){b.preventDefault();var c="",d=a(this),e=d.closest(".simcal-addon-manage-license-buttons"),f=d.closest(".simcal-addon-manage-license-field").find("> input"),g=e.find(".error"),h=d.find("i");if(a(this).hasClass("activate"))c="activate_license";else{if(!a(this).hasClass("deactivate"))return;c="deactivate_license"}a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_manage_add_on_license",add_on:a(this).data("add-on"),license_key:f.val(),license_action:c,nonce:a("#simcal_license_manager").val()},beforeSend:function(){h.fadeToggle()},success:function(b){h.fadeToggle(),"activate_license"==c?"valid"==b.data?(d.hide(),f.attr("disabled","disabled"),a(e).find(".label").show(),a(e).find(".deactivate").show(),g.hide()):g.show().text(b.data):"deactivated"==b.data?(d.hide(),f.removeAttr("disabled"),a(e).find(".label").hide(),a(e).find(".activate").show(),g.hide()):g.show().text(b.data)},error:function(a){console.log(a),h.fadeToggle()}})}),a("#simcal-reset-licenses").on("click",function(b){b.preventDefault();var c=a(this).data("dialog"),d=confirm(c);!0===d&&a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_reset_add_ons_licenses",nonce:a("#simcal_license_manager").val()},success:function(a){"success"==a.data?location.reload():console.log(a)},error:function(a){console.log(a)}})})})}(this);
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
5
 
6
+ !function(a,b){"use strict";jQuery(function(a){function b(b){var c=a(b).find("input"),d=a(b).find("> div select"),e=a(b).find("code"),f="",g="";d.each(function(b,c){var d=a(c).val(),e=a(c).find("> option:selected");d.length&&(e.data("trim")?(f=f.trim()+a(c).val(),g=g.trim()+e.data("preview")):(f+=a(c).val()+" ",g+=e.data("preview")+" "))}),c.val(f),e.text(g)}a(".simcal-help-tip").tipTip({attribute:"data-tip",delay:200,fadeIn:50,fadeOut:50}),a(".simcal-shortcode-tip").tipTip({activation:"click",defaultPosition:"top",delay:200,fadeIn:50,fadeOut:50});var c=a("#simcal-calendar-settings"),d=c.find(".simcal-box-handle"),e=c.find(".hndle");a(d).appendTo(e),a(function(){a(e).unbind("click.postboxes"),c.on("click","h3.hndle",function(b){a(b.target).filter("input, option, label, select").length||c.toggleClass("closed")})}),a(document.body).on("simcal-init-tabbed-panels",function(){a(".simcal-tabs").show(),a(".simcal-tabs a").click(function(){var b=a(this).closest("div.simcal-panels-wrap");return a("ul.simcal-tabs li",b).removeClass("active"),a(this).parent().addClass("active"),a("div.simcal-panel",b).hide(),a(a(this).attr("href")).show(),!1}),a("div.simcal-panels-wrap").each(function(){a(this).find("ul.simcal-tabs > li").eq(0).find("a").click()})}).trigger("simcal-init-tabbed-panels"),a("#_feed_type").on("change",function(){var b=a(this).find("option:selected"),c=b.val(),d=a(".simcal-tabs"),e=d.find("> .simcal-feed-type"),f=d.find("> .simcal-feed-type-"+c),g=d.find("> li:first-child > a");e.each(function(){a(this).hide()}),f.show(),g.trigger("click")}).trigger("change"),c.show();var f=a("#_calendar_view_default-calendar"),g=a("#default-calendar-settings"),h=g.find(".simcal-default-calendar-grid"),i=g.find(".simcal-default-calendar-list"),j=g.find(".simcal-default-calendar-list-grouped");f.on("change",function(){var b=a(this).val();"grid"==b?(i.hide(),j.hide(),h.show()):"list"==b?(h.hide(),j.hide(),i.show()):"list-grouped"==b&&(h.hide(),i.hide(),j.show())}).trigger("change"),a(".simcal-field-color-picker").wpColorPicker(),a(".simcal-field-select-enhanced").each(function(b,c){var d=a(c),e=d.data("noresults"),f=d.data("allowclear");d.select2({allowClear:"undefined"!=f?f:!1,placeholder:{id:"",placeholder:""},dir:"undefined"!=simcal_admin.text_dir?simcal_admin.text_dir:"ltr",tokenSeparators:[","],width:"100%",language:{noResults:function(){return"undefined"!=e?e:""}}})});var k=a(".simcal-field-date-picker");k.each(function(b,c){var d=a(c).find("input"),e={autoSize:!0,changeMonth:!0,changeYear:!0,dateFormat:"yy-mm-dd",firstDay:1,prevText:'<i class="simcal-icon-left"></i>',nextText:'<i class="simcal-icon-right"></i>',yearRange:"1900:2050",beforeShow:function(b,c){a("#ui-datepicker-div").addClass("simcal-date-picker")}};a(d).datepicker(e),a(d).datepicker("option",a.datepicker.regional[simcal_admin.locale])});var l=a(".simcal-field-datetime-format");l.sortable({items:"> div",stop:function(){b(a(this))}}),l.each(function(c,d){var e=a(d).find("> div select");e.each(function(c,d){a(d).on("change",function(){b(a(this).closest("div.simcal-field-datetime-format"))})}),b(d)}),a(".simcal-field-datetime-format-php").each(function(b,c){var d=a(c).find("input"),e=a(c).find("code");a(d).on("keyup",function(){var b={action:"simcal_date_i18n_input_preview",value:d.val()};a.post(simcal_admin.ajax_url,b,function(b){a(e).text(b.data)})})}),a('input[type="number"].simcal-field').each(function(b,c){var d=a(c),e=d.attr("min"),f=d.attr("max");d.on("change",function(){var b=a(this).val();e&&e>b&&a(this).val(e),f&&b>f&&a(this).val(f)})}),a(".simcal-field-switch-other").on("change",function(){var b=a(this).find("option");b.each(function(b,c){var d=a(c).data("show-field"),e=a(c).data("show-fields"),f=a(c).data("hide-field"),g=a(c).data("hide-fields"),h=d?a("#"+d):"",i=f?a("#"+f):"";if(a(c).is(":selected")){if(h&&h.show(),i&&i.hide(),e){var j=g.split(",");a(j).each(function(b,c){a("#"+c).hide()})}if(g){var k=g.split(",");a(k).each(function(b,c){a("#"+c).hide()})}}})}).trigger("change"),a(".simcal-field-show-other").on("change",function(){var b=a(this).find("option");b.each(function(b,c){var d=a(c).data("show-field"),e=d.length?a("#"+d):"",f=d.length?e.next():"";e.length&&(a(c).is(":selected")?(e.show(),f.hasClass("select2")&&f.show()):(e.hide(),f.hasClass("select2")&&f.hide()))})}).trigger("change"),a(".simcal-field-show-next").on("change",function(){var b,c,d,e;a(this).is(":checkbox")?(d=a(this).parent().next(),a(this).is(":checked")?d.show():d.hide()):(b=a(this).val(),c=a(this).data("show-next-if-value"),d=a(this).nextUntil().not("i"),e=d.length?d.next():"",b==c?(d.show(),e.hasClass("select2")&&e.show()):(d.hide(),e.hasClass("select2")&&e.hide()))}).trigger("change"),a("#simcal-clear-cache").on("click",function(b){b.preventDefault();var c=a(this).find("i");a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_clear_cache",id:a(this).data("id")},beforeSend:function(){c.fadeToggle()},success:function(){c.fadeToggle()},error:function(a){console.log(a)}})}),a("#simcal-drip-signup").on("click",function(b){b.preventDefault();var c=a("#simcal-drip"),d=c.find(".signup"),e=c.find(".thank-you"),f=a("#simcal-drip-form"),g=c.find("#simcal-drip-field-first_name"),h=f.find("#simcal-drip-real-field-first_name"),i=c.find("#simcal-drip-field-email"),j=f.find("#simcal-drip-real-field-email");h.val(g.val()),j.val(i.val()),d.hide(),e.show(),f.submit()}),a(".simcal-addon-manage-license").on("click",function(b){b.preventDefault();var c="",d=a(this),e=d.closest(".simcal-addon-manage-license-buttons"),f=d.closest(".simcal-addon-manage-license-field").find("> input"),g=e.find(".error"),h=d.find("i");if(a(this).hasClass("activate"))c="activate_license";else{if(!a(this).hasClass("deactivate"))return;c="deactivate_license"}a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_manage_add_on_license",add_on:a(this).data("add-on"),license_key:f.val(),license_action:c,nonce:a("#simcal_license_manager").val()},beforeSend:function(){h.fadeToggle()},success:function(b){h.fadeToggle(),"activate_license"==c?"valid"==b.data?(d.hide(),f.attr("disabled","disabled"),a(e).find(".label").show(),a(e).find(".deactivate").show(),g.hide()):g.show().text(b.data):"deactivated"==b.data?(d.hide(),f.removeAttr("disabled"),a(e).find(".label").hide(),a(e).find(".activate").show(),g.hide()):g.show().text(b.data)},error:function(a){console.log(a),h.fadeToggle()}})}),a("#simcal-reset-licenses").on("click",function(b){b.preventDefault();var c=a(this).find("i"),d=a(this).data("dialog"),e=confirm(d);!0===e&&a.ajax({url:simcal_admin.ajax_url,method:"POST",data:{action:"simcal_reset_add_ons_licenses",nonce:a("#simcal_license_manager").val()},beforeSend:function(){c.toggle()},success:function(a){"success"==a.data?location.reload():console.log(a)},error:function(a){console.log(a)}})})})}(this);
assets/js/default-calendar.min.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! Simple Calendar - 3.0.0
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
1
+ /*! Simple Calendar - 3.0.8
2
  * https://simplecalendar.io
3
  * Copyright (c) Moonstone Media 2015
4
  * Licensed GPLv2+ */
google-calendar-events.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Simple Calendar
4
  * Plugin URI: https://simplecalendar.io
5
  * Description: Add Google Calendar events to your WordPress site in minutes. Beautiful calendar displays. Fully responsive.
6
- * Version: 3.0.7
7
  * Author: Moonstone Media
8
  * Author URI: https://simplecalendar.io
9
  * Text Domain: google-calendar-events
@@ -29,7 +29,7 @@ if ( version_compare( PHP_VERSION, '5.3.0' ) === -1 ) {
29
  $this_plugin_path = trailingslashit( dirname( __FILE__ ) );
30
  $this_plugin_dir = plugin_dir_url( __FILE__ );
31
  $this_plugin_constants = array(
32
- 'SIMPLE_CALENDAR_VERSION' => '3.0.7',
33
  'SIMPLE_CALENDAR_MAIN_FILE' => __FILE__,
34
  'SIMPLE_CALENDAR_URL' => $this_plugin_dir,
35
  'SIMPLE_CALENDAR_ASSETS' => $this_plugin_dir . 'assets/',
3
  * Plugin Name: Simple Calendar
4
  * Plugin URI: https://simplecalendar.io
5
  * Description: Add Google Calendar events to your WordPress site in minutes. Beautiful calendar displays. Fully responsive.
6
+ * Version: 3.0.8
7
  * Author: Moonstone Media
8
  * Author URI: https://simplecalendar.io
9
  * Text Domain: google-calendar-events
29
  $this_plugin_path = trailingslashit( dirname( __FILE__ ) );
30
  $this_plugin_dir = plugin_dir_url( __FILE__ );
31
  $this_plugin_constants = array(
32
+ 'SIMPLE_CALENDAR_VERSION' => '3.0.8',
33
  'SIMPLE_CALENDAR_MAIN_FILE' => __FILE__,
34
  'SIMPLE_CALENDAR_URL' => $this_plugin_dir,
35
  'SIMPLE_CALENDAR_ASSETS' => $this_plugin_dir . 'assets/',
includes/admin/metaboxes/settings.php CHANGED
@@ -238,7 +238,7 @@ class Settings implements Meta_Box {
238
  ?>
239
  <table>
240
  <thead>
241
- <tr><th colspan="2"><?php _e( 'Events settings', 'google-calendar-events' ); ?></th></tr>
242
  </thead>
243
  <tbody class="simcal-panel-section simcal-panel-section-events-range">
244
  <tr class="simcal-panel-field">
238
  ?>
239
  <table>
240
  <thead>
241
+ <tr><th colspan="2"><?php _e( 'Events setting', 'google-calendar-events' ); ?></th></tr>
242
  </thead>
243
  <tbody class="simcal-panel-section simcal-panel-section-events-range">
244
  <tr class="simcal-panel-field">
includes/admin/welcome.php CHANGED
@@ -132,7 +132,7 @@ class Welcome {
132
  <a href="<?php echo admin_url( 'edit.php?post_type=calendar' ); ?>"
133
  class="button button-primary"
134
  ><?php _e( 'Calendars', 'google-calendar-events' ); ?></a>
135
- <a href="<?php echo admin_url( 'admin.php?page=simple-calendar_settings' ); ?>"
136
  class="button button-primary"
137
  ><?php _e( 'Settings', 'google-calendar-events' ); ?></a>
138
  <a href="<?php echo simcal_ga_campaign_url( simcal_get_url( 'add-ons' ), 'core-plugin', 'welcome-page' ); ?>"
132
  <a href="<?php echo admin_url( 'edit.php?post_type=calendar' ); ?>"
133
  class="button button-primary"
134
  ><?php _e( 'Calendars', 'google-calendar-events' ); ?></a>
135
+ <a href="<?php echo esc_url( add_query_arg( 'page', 'simple-calendar_settings', admin_url( 'admin.php' ) ) ); ?>"
136
  class="button button-primary"
137
  ><?php _e( 'Settings', 'google-calendar-events' ); ?></a>
138
  <a href="<?php echo simcal_ga_campaign_url( simcal_get_url( 'add-ons' ), 'core-plugin', 'welcome-page' ); ?>"
includes/calendars/admin/default-calendar-admin.php CHANGED
@@ -84,6 +84,19 @@ class Default_Calendar_Admin {
84
  <tr><th colspan="2"><?php _e( 'Default calendar', 'google-calendar-events' ); ?></th></tr>
85
  </thead>
86
  <tbody class="simcal-panel-section">
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  <tr class="simcal-panel-field simcal-default-calendar-grid" style="display: none;">
88
  <th><label for="_default_calendar_event_bubbles_action"><?php _e( 'Event bubbles', 'google-calendar-events' ); ?></label></th>
89
  <td>
@@ -354,6 +367,7 @@ class Default_Calendar_Admin {
354
  ?>
355
  </td>
356
  </tr>
 
357
  </tbody>
358
  <?php
359
 
84
  <tr><th colspan="2"><?php _e( 'Default calendar', 'google-calendar-events' ); ?></th></tr>
85
  </thead>
86
  <tbody class="simcal-panel-section">
87
+
88
+ <tr class="simcal-panel-field simcal-default-calendar-grid simcal-default-calendar-list" style="display: none;">
89
+ <th></th>
90
+ <td>
91
+ <p class="description">
92
+ <?php _e( "Tip: If calendar styles appear to be missing and/or navigation isn't working, try going to", 'google-calendar-events' ); ?>
93
+ <a href="<?php echo esc_url( add_query_arg( array ( 'page' => 'simple-calendar_settings', 'tab' => 'advanced' ), admin_url( 'admin.php' ) ) ); ?>">
94
+ <?php _e( 'Calendars &rarr; Settings &rarr; Advanced', 'google-calendar-events' ); ?></a>
95
+ <?php _e( 'and enable', 'google-calendar-events' ); ?> <strong><?php _e( 'Always Enqueue', 'google-calendar-events' ); ?></strong>.
96
+ </p>
97
+ </td>
98
+ </tr>
99
+
100
  <tr class="simcal-panel-field simcal-default-calendar-grid" style="display: none;">
101
  <th><label for="_default_calendar_event_bubbles_action"><?php _e( 'Event bubbles', 'google-calendar-events' ); ?></label></th>
102
  <td>
367
  ?>
368
  </td>
369
  </tr>
370
+
371
  </tbody>
372
  <?php
373
 
includes/events/event-builder.php CHANGED
@@ -233,8 +233,13 @@ class Event_Builder {
233
  case 'length' :
234
  case 'duration' :
235
  if ( false !== $event->end ) {
236
- $duration = $event->start - $event->end;
237
- $value = human_time_diff( $event->start, $event->end );
 
 
 
 
 
238
  } else {
239
  $duration = '-1';
240
  $value = __( 'No end time', 'google-calendar-events' );
@@ -622,6 +627,8 @@ class Event_Builder {
622
 
623
  if ( $end instanceof Carbon ) {
624
 
 
 
625
  $output .= '-' .
626
  ' <span class="simcal-event-start simcal-event-end-date" ' .
627
  'data-event-start="' . $end->getTimestamp() . '" ' .
@@ -691,7 +698,12 @@ class Event_Builder {
691
  if ( 'human' == $format ) {
692
  $value = human_time_diff( $event_dt->getTimestamp(), Carbon::now( $event->timezone )->getTimestamp() );
693
  } else {
694
- $value = date_i18n( $dt_format, $event_dt->getTimestamp() );
 
 
 
 
 
695
  }
696
 
697
  return '<span class="simcal-event-' . $bound . ' ' . 'simcal-event-' . $bound . '-' . $format . '"' .
@@ -883,14 +895,14 @@ class Event_Builder {
883
  'email' => 'hide', // show/hide attendee email address
884
  ), (array) shortcode_parse_atts( $attr ) );
885
 
886
- $photo = 'hide' != $attr['photo'] ? '<img class="avatar avatar-128 photo" src="' . $organizer['photo'] . '" itemprop="image" />' : '';
887
- $organizer = $photo . '<span itemprop="name">' . $organizer['name'] . '</span>';
888
 
889
  if ( ! empty( $organizer['email'] ) && ( 'show' == $attr['email'] ) ) {
890
- $organizer = sprintf( '<a href="mailto:' . $organizer['email'] . '" itemprop="email">%s</a>', $organizer );
891
  }
892
 
893
- return '<div class="simcal-organizer" itemprop="organizer" itemscope itemtype="https://schema.org/Person">' . $organizer . '</div>';
894
  }
895
 
896
  /**
233
  case 'length' :
234
  case 'duration' :
235
  if ( false !== $event->end ) {
236
+ $duration = $event->start - $event->end - 1000;
237
+
238
+ if ( $event->whole_day ) {
239
+ $value = human_time_diff( $event->start, ( $event->end - 86500 ) );
240
+ } else {
241
+ $value = human_time_diff( $event->start, $event->end );
242
+ }
243
  } else {
244
  $duration = '-1';
245
  $value = __( 'No end time', 'google-calendar-events' );
627
 
628
  if ( $end instanceof Carbon ) {
629
 
630
+ $end = ( $event->whole_day ? Carbon::createFromTimestamp( $end->getTimestamp() )->startOfDay()->subSeconds( 1 ) : $end );
631
+
632
  $output .= '-' .
633
  ' <span class="simcal-event-start simcal-event-end-date" ' .
634
  'data-event-start="' . $end->getTimestamp() . '" ' .
698
  if ( 'human' == $format ) {
699
  $value = human_time_diff( $event_dt->getTimestamp(), Carbon::now( $event->timezone )->getTimestamp() );
700
  } else {
701
+
702
+ if ( $event->whole_day ) {
703
+ $value = date_i18n( $dt_format, $event_dt->getTimestamp() - 86400 );
704
+ } else {
705
+ $value = date_i18n( $dt_format, $event_dt->getTimestamp() );
706
+ }
707
  }
708
 
709
  return '<span class="simcal-event-' . $bound . ' ' . 'simcal-event-' . $bound . '-' . $format . '"' .
895
  'email' => 'hide', // show/hide attendee email address
896
  ), (array) shortcode_parse_atts( $attr ) );
897
 
898
+ $photo = 'hide' != $attr['photo'] ? '<img class="avatar avatar-128 photo" src="' . $organizer['photo'] . '" itemprop="image" />' : '';
899
+ $organizer_html = $photo . '<span itemprop="name">' . $organizer['name'] . '</span>';
900
 
901
  if ( ! empty( $organizer['email'] ) && ( 'show' == $attr['email'] ) ) {
902
+ $organizer_html = sprintf( '<a href="mailto:' . $organizer['email'] . '" itemprop="email">%s</a>', $organizer_html );
903
  }
904
 
905
+ return '<div class="simcal-organizer" itemprop="organizer" itemscope itemtype="https://schema.org/Person">' . $organizer_html . '</div>';
906
  }
907
 
908
  /**
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: moonstonemedia, pderksen, nickyoung87, nekojira, rosshanney
3
  Tags: calendar, calendars, calendar manager, custom calendar, custom calendars, event, events, events feed, google calendar, google
4
  Requires at least: 4.0
5
  Tested up to: 4.4
6
- Stable tag: 3.0.7
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -78,6 +78,11 @@ We'd love your help! Here's a few things you can do:
78
 
79
  == Changelog ==
80
 
 
 
 
 
 
81
  = 3.0.7 - November 28, 2015 =
82
 
83
  * Fix: Fixed all day multi-day events showing on an extra day.
3
  Tags: calendar, calendars, calendar manager, custom calendar, custom calendars, event, events, events feed, google calendar, google
4
  Requires at least: 4.0
5
  Tested up to: 4.4
6
+ Stable tag: 3.0.8
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
78
 
79
  == Changelog ==
80
 
81
+ = 3.0.8 - December 1, 2015 =
82
+
83
+ * Fix: Fixed bug for Google Calendar Pro add-on organizer event builder code.
84
+ * Fix: Fixed some inconsistencies with all-day events and multi-day events when combined.
85
+
86
  = 3.0.7 - November 28, 2015 =
87
 
88
  * Fix: Fixed all day multi-day events showing on an extra day.
vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInit27040a253c81c51e285a136069f687e1::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -13,9 +13,7 @@
13
  namespace Composer\Autoload;
14
 
15
  /**
16
- * ClassLoader implements a PSR-0 class loader
17
- *
18
- * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
19
  *
20
  * $loader = new \Composer\Autoload\ClassLoader();
21
  *
@@ -39,6 +37,8 @@ namespace Composer\Autoload;
39
  *
40
  * @author Fabien Potencier <fabien@symfony.com>
41
  * @author Jordi Boggiano <j.boggiano@seld.be>
 
 
42
  */
43
  class ClassLoader
44
  {
13
  namespace Composer\Autoload;
14
 
15
  /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
 
 
17
  *
18
  * $loader = new \Composer\Autoload\ClassLoader();
19
  *
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see http://www.php-fig.org/psr/psr-0/
41
+ * @see http://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
vendor/composer/autoload_classmap.php CHANGED
@@ -3552,10 +3552,11 @@ return array(
3552
  'Google_Verifier_Pem' => $vendorDir . '/google/apiclient/src/Google/Verifier/Pem.php',
3553
  'Mexitek\\PHPColors\\Color' => $vendorDir . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php',
3554
  'Parsedown' => $vendorDir . '/erusev/parsedown/Parsedown.php',
 
3555
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
3556
- 'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => $vendorDir . '/symfony/translation/Catalogue/DiffOperation.php',
3557
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
3558
  'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php',
 
3559
  'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php',
3560
  'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php',
3561
  'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php',
@@ -3580,6 +3581,7 @@ return array(
3580
  'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php',
3581
  'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php',
3582
  'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php',
 
3583
  'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php',
3584
  'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php',
3585
  'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php',
@@ -3597,49 +3599,12 @@ return array(
3597
  'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php',
3598
  'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php',
3599
  'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php',
3600
- 'Symfony\\Component\\Translation\\Tests\\Catalogue\\AbstractOperationTest' => $vendorDir . '/symfony/translation/Tests/Catalogue/AbstractOperationTest.php',
3601
- 'Symfony\\Component\\Translation\\Tests\\Catalogue\\DiffOperationTest' => $vendorDir . '/symfony/translation/Tests/Catalogue/DiffOperationTest.php',
3602
- 'Symfony\\Component\\Translation\\Tests\\Catalogue\\MergeOperationTest' => $vendorDir . '/symfony/translation/Tests/Catalogue/MergeOperationTest.php',
3603
- 'Symfony\\Component\\Translation\\Tests\\DataCollectorTranslatorTest' => $vendorDir . '/symfony/translation/Tests/DataCollectorTranslatorTest.php',
3604
- 'Symfony\\Component\\Translation\\Tests\\DataCollector\\TranslationDataCollectorTest' => $vendorDir . '/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php',
3605
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\ConcreteFileDumper' => $vendorDir . '/symfony/translation/Tests/Dumper/FileDumperTest.php',
3606
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\CsvFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/CsvFileDumperTest.php',
3607
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\FileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/FileDumperTest.php',
3608
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\IcuResFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php',
3609
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\IniFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/IniFileDumperTest.php',
3610
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\JsonFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/JsonFileDumperTest.php',
3611
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\MoFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/MoFileDumperTest.php',
3612
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\PhpFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/PhpFileDumperTest.php',
3613
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\PoFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/PoFileDumperTest.php',
3614
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\QtFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/QtFileDumperTest.php',
3615
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\XliffFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/XliffFileDumperTest.php',
3616
- 'Symfony\\Component\\Translation\\Tests\\Dumper\\YamlFileDumperTest' => $vendorDir . '/symfony/translation/Tests/Dumper/YamlFileDumperTest.php',
3617
- 'Symfony\\Component\\Translation\\Tests\\IdentityTranslatorTest' => $vendorDir . '/symfony/translation/Tests/IdentityTranslatorTest.php',
3618
- 'Symfony\\Component\\Translation\\Tests\\IntervalTest' => $vendorDir . '/symfony/translation/Tests/IntervalTest.php',
3619
- 'Symfony\\Component\\Translation\\Tests\\Loader\\CsvFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/CsvFileLoaderTest.php',
3620
- 'Symfony\\Component\\Translation\\Tests\\Loader\\IcuDatFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/IcuDatFileLoaderTest.php',
3621
- 'Symfony\\Component\\Translation\\Tests\\Loader\\IcuResFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/IcuResFileLoaderTest.php',
3622
- 'Symfony\\Component\\Translation\\Tests\\Loader\\IniFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/IniFileLoaderTest.php',
3623
- 'Symfony\\Component\\Translation\\Tests\\Loader\\JsonFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/JsonFileLoaderTest.php',
3624
- 'Symfony\\Component\\Translation\\Tests\\Loader\\LocalizedTestCase' => $vendorDir . '/symfony/translation/Tests/Loader/LocalizedTestCase.php',
3625
- 'Symfony\\Component\\Translation\\Tests\\Loader\\MoFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/MoFileLoaderTest.php',
3626
- 'Symfony\\Component\\Translation\\Tests\\Loader\\PhpFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/PhpFileLoaderTest.php',
3627
- 'Symfony\\Component\\Translation\\Tests\\Loader\\PoFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/PoFileLoaderTest.php',
3628
- 'Symfony\\Component\\Translation\\Tests\\Loader\\QtFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/QtFileLoaderTest.php',
3629
- 'Symfony\\Component\\Translation\\Tests\\Loader\\XliffFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/XliffFileLoaderTest.php',
3630
- 'Symfony\\Component\\Translation\\Tests\\Loader\\YamlFileLoaderTest' => $vendorDir . '/symfony/translation/Tests/Loader/YamlFileLoaderTest.php',
3631
- 'Symfony\\Component\\Translation\\Tests\\LoggingTranslatorTest' => $vendorDir . '/symfony/translation/Tests/LoggingTranslatorTest.php',
3632
- 'Symfony\\Component\\Translation\\Tests\\MessageCatalogueTest' => $vendorDir . '/symfony/translation/Tests/MessageCatalogueTest.php',
3633
- 'Symfony\\Component\\Translation\\Tests\\MessageSelectorTest' => $vendorDir . '/symfony/translation/Tests/MessageSelectorTest.php',
3634
- 'Symfony\\Component\\Translation\\Tests\\PluralizationRulesTest' => $vendorDir . '/symfony/translation/Tests/PluralizationRulesTest.php',
3635
- 'Symfony\\Component\\Translation\\Tests\\StaleResource' => $vendorDir . '/symfony/translation/Tests/TranslatorCacheTest.php',
3636
- 'Symfony\\Component\\Translation\\Tests\\StringClass' => $vendorDir . '/symfony/translation/Tests/TranslatorTest.php',
3637
- 'Symfony\\Component\\Translation\\Tests\\TranslatorCacheTest' => $vendorDir . '/symfony/translation/Tests/TranslatorCacheTest.php',
3638
- 'Symfony\\Component\\Translation\\Tests\\TranslatorTest' => $vendorDir . '/symfony/translation/Tests/TranslatorTest.php',
3639
  'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php',
3640
  'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php',
3641
  'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php',
 
3642
  'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php',
 
3643
  'WP_Requirements' => $vendorDir . '/nekojira/wp-requirements/src/wp-requirements.php',
3644
  'xrstf\\Composer52\\AutoloadGenerator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php',
3645
  'xrstf\\Composer52\\Generator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php',
3552
  'Google_Verifier_Pem' => $vendorDir . '/google/apiclient/src/Google/Verifier/Pem.php',
3553
  'Mexitek\\PHPColors\\Color' => $vendorDir . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php',
3554
  'Parsedown' => $vendorDir . '/erusev/parsedown/Parsedown.php',
3555
+ 'ParsedownTest' => $vendorDir . '/erusev/parsedown/test/ParsedownTest.php',
3556
  'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
 
3557
  'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
3558
  'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php',
3559
+ 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php',
3560
  'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php',
3561
  'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php',
3562
  'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php',
3581
  'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php',
3582
  'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php',
3583
  'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php',
3584
+ 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php',
3585
  'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php',
3586
  'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php',
3587
  'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php',
3599
  'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php',
3600
  'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php',
3601
  'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3602
  'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php',
3603
  'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php',
3604
  'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php',
3605
+ 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php',
3606
  'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php',
3607
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
3608
  'WP_Requirements' => $vendorDir . '/nekojira/wp-requirements/src/wp-requirements.php',
3609
  'xrstf\\Composer52\\AutoloadGenerator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php',
3610
  'xrstf\\Composer52\\Generator' => $vendorDir . '/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php',
vendor/composer/autoload_files.php CHANGED
@@ -6,5 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- $vendorDir . '/cbschuld/browser.php/lib/Browser.php',
 
10
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
10
+ 'f15d016d70663d5e96ccd2b863511eb8' => $vendorDir . '/cbschuld/browser.php/lib/Browser.php',
11
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
10
  'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
11
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
10
  'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
11
  'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
12
  );
vendor/composer/autoload_real.php CHANGED
@@ -41,15 +41,19 @@ class ComposerAutoloaderInitb05cc36e87bb588ad318e9240739102b
41
  $loader->register(true);
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
- foreach ($includeFiles as $file) {
45
- composerRequireb05cc36e87bb588ad318e9240739102b($file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequireb05cc36e87bb588ad318e9240739102b($file)
53
  {
54
- require $file;
 
 
 
 
55
  }
41
  $loader->register(true);
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
+ foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequireb05cc36e87bb588ad318e9240739102b($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequireb05cc36e87bb588ad318e9240739102b($fileIdentifier, $file)
53
  {
54
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
+ require $file;
56
+
57
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
58
+ }
59
  }
vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6 {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
@@ -39,6 +39,7 @@ class ComposerAutoloaderInit32f3aa28b02326664e796abdc182ebb6 {
39
 
40
  $loader->register(true);
41
 
 
42
  require $vendorDir . '/cbschuld/browser.php/lib/Browser.php';
43
 
44
  return $loader;
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInit27040a253c81c51e285a136069f687e1 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit27040a253c81c51e285a136069f687e1', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit27040a253c81c51e285a136069f687e1', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
39
 
40
  $loader->register(true);
41
 
42
+ // require $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php'; // disabled because of PHP 5.3 syntax
43
  require $vendorDir . '/cbschuld/browser.php/lib/Browser.php';
44
 
45
  return $loader;
vendor/composer/installed.json CHANGED
@@ -183,12 +183,12 @@
183
  "version_normalized": "1.4.1.0",
184
  "source": {
185
  "type": "git",
186
- "url": "https://github.com/nekojira/wp-requirements.git",
187
  "reference": "c12147245286b5b9053d1745995677e6df36e96d"
188
  },
189
  "dist": {
190
  "type": "zip",
191
- "url": "https://api.github.com/repos/nekojira/wp-requirements/zipball/c12147245286b5b9053d1745995677e6df36e96d",
192
  "reference": "c12147245286b5b9053d1745995677e6df36e96d",
193
  "shasum": ""
194
  },
@@ -300,43 +300,102 @@
300
  "google"
301
  ]
302
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
  {
304
  "name": "symfony/translation",
305
- "version": "v2.7.7",
306
- "version_normalized": "2.7.7.0",
307
  "source": {
308
  "type": "git",
309
  "url": "https://github.com/symfony/translation.git",
310
- "reference": "e4ecb9c3ba1304eaf24de15c2d7a428101c1982f"
311
  },
312
  "dist": {
313
  "type": "zip",
314
- "url": "https://api.github.com/repos/symfony/translation/zipball/e4ecb9c3ba1304eaf24de15c2d7a428101c1982f",
315
- "reference": "e4ecb9c3ba1304eaf24de15c2d7a428101c1982f",
316
  "shasum": ""
317
  },
318
  "require": {
319
- "php": ">=5.3.9"
 
320
  },
321
  "conflict": {
322
- "symfony/config": "<2.7"
323
  },
324
  "require-dev": {
325
  "psr/log": "~1.0",
326
- "symfony/config": "~2.7",
327
- "symfony/intl": "~2.4",
328
- "symfony/yaml": "~2.2"
329
  },
330
  "suggest": {
331
  "psr/log": "To use logging capability in translator",
332
  "symfony/config": "",
333
  "symfony/yaml": ""
334
  },
335
- "time": "2015-11-18 13:41:01",
336
  "type": "library",
337
  "extra": {
338
  "branch-alias": {
339
- "dev-master": "2.7-dev"
340
  }
341
  },
342
  "installation-source": "dist",
183
  "version_normalized": "1.4.1.0",
184
  "source": {
185
  "type": "git",
186
+ "url": "https://github.com/unfulvio/wp-requirements.git",
187
  "reference": "c12147245286b5b9053d1745995677e6df36e96d"
188
  },
189
  "dist": {
190
  "type": "zip",
191
+ "url": "https://api.github.com/repos/unfulvio/wp-requirements/zipball/c12147245286b5b9053d1745995677e6df36e96d",
192
  "reference": "c12147245286b5b9053d1745995677e6df36e96d",
193
  "shasum": ""
194
  },
300
  "google"
301
  ]
302
  },
303
+ {
304
+ "name": "symfony/polyfill-mbstring",
305
+ "version": "v1.0.0",
306
+ "version_normalized": "1.0.0.0",
307
+ "source": {
308
+ "type": "git",
309
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
310
+ "reference": "0b6a8940385311a24e060ec1fe35680e17c74497"
311
+ },
312
+ "dist": {
313
+ "type": "zip",
314
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0b6a8940385311a24e060ec1fe35680e17c74497",
315
+ "reference": "0b6a8940385311a24e060ec1fe35680e17c74497",
316
+ "shasum": ""
317
+ },
318
+ "require": {
319
+ "php": ">=5.3.3"
320
+ },
321
+ "time": "2015-11-04 20:28:58",
322
+ "type": "library",
323
+ "extra": {
324
+ "branch-alias": {
325
+ "dev-master": "1.0-dev"
326
+ }
327
+ },
328
+ "installation-source": "dist",
329
+ "autoload": {
330
+ "psr-4": {
331
+ "Symfony\\Polyfill\\Mbstring\\": ""
332
+ },
333
+ "files": [
334
+ "bootstrap.php"
335
+ ]
336
+ },
337
+ "notification-url": "https://packagist.org/downloads/",
338
+ "license": [
339
+ "MIT"
340
+ ],
341
+ "authors": [
342
+ {
343
+ "name": "Nicolas Grekas",
344
+ "email": "p@tchwork.com"
345
+ },
346
+ {
347
+ "name": "Symfony Community",
348
+ "homepage": "https://symfony.com/contributors"
349
+ }
350
+ ],
351
+ "description": "Symfony polyfill for the Mbstring extension",
352
+ "homepage": "https://symfony.com",
353
+ "keywords": [
354
+ "compatibility",
355
+ "mbstring",
356
+ "polyfill",
357
+ "portable",
358
+ "shim"
359
+ ]
360
+ },
361
  {
362
  "name": "symfony/translation",
363
+ "version": "v3.0.0",
364
+ "version_normalized": "3.0.0.0",
365
  "source": {
366
  "type": "git",
367
  "url": "https://github.com/symfony/translation.git",
368
+ "reference": "7f14717150a7445f8475864d1235875dd04061fb"
369
  },
370
  "dist": {
371
  "type": "zip",
372
+ "url": "https://api.github.com/repos/symfony/translation/zipball/7f14717150a7445f8475864d1235875dd04061fb",
373
+ "reference": "7f14717150a7445f8475864d1235875dd04061fb",
374
  "shasum": ""
375
  },
376
  "require": {
377
+ "php": ">=5.5.9",
378
+ "symfony/polyfill-mbstring": "~1.0"
379
  },
380
  "conflict": {
381
+ "symfony/config": "<2.8"
382
  },
383
  "require-dev": {
384
  "psr/log": "~1.0",
385
+ "symfony/config": "~2.8|~3.0",
386
+ "symfony/intl": "~2.8|~3.0",
387
+ "symfony/yaml": "~2.8|~3.0"
388
  },
389
  "suggest": {
390
  "psr/log": "To use logging capability in translator",
391
  "symfony/config": "",
392
  "symfony/yaml": ""
393
  },
394
+ "time": "2015-11-18 13:48:51",
395
  "type": "library",
396
  "extra": {
397
  "branch-alias": {
398
+ "dev-master": "3.0-dev"
399
  }
400
  },
401
  "installation-source": "dist",
vendor/symfony/polyfill-mbstring/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2014-2015 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-mbstring/Mbstring.php ADDED
@@ -0,0 +1,604 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Polyfill\Mbstring;
13
+
14
+ /**
15
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
16
+ *
17
+ * Implemented:
18
+ * - mb_convert_encoding - Convert character encoding
19
+ * - mb_convert_variables - Convert character code in variable(s)
20
+ * - mb_decode_mimeheader - Decode string in MIME header field
21
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
22
+ * - mb_convert_case - Perform case folding on a string
23
+ * - mb_get_info - Get internal settings of mbstring
24
+ * - mb_http_input - Detect HTTP input character encoding
25
+ * - mb_http_output - Set/Get HTTP output character encoding
26
+ * - mb_internal_encoding - Set/Get internal character encoding
27
+ * - mb_list_encodings - Returns an array of all supported encodings
28
+ * - mb_output_handler - Callback function converts character encoding in output buffer
29
+ * - mb_strlen - Get string length
30
+ * - mb_strpos - Find position of first occurrence of string in a string
31
+ * - mb_strrpos - Find position of last occurrence of a string in a string
32
+ * - mb_strtolower - Make a string lowercase
33
+ * - mb_strtoupper - Make a string uppercase
34
+ * - mb_substitute_character - Set/Get substitution character
35
+ * - mb_substr - Get part of string
36
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
37
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
38
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
39
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
40
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
41
+ * - mb_strstr - Finds first occurrence of a string within anothers
42
+ * - mb_strwidth - Return width of string
43
+ * - mb_substr_count - Count the number of substring occurrences
44
+ *
45
+ * Not implemented:
46
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
47
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
48
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
49
+ * - mb_ereg_* - Regular expression with multibyte support
50
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
51
+ * - mb_preferred_mime_name - Get MIME charset string
52
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
53
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
54
+ * - mb_send_mail - Send encoded mail
55
+ * - mb_split - Split multibyte string using regular expression
56
+ * - mb_strcut - Get part of string
57
+ * - mb_strimwidth - Get truncated string with specified width
58
+ *
59
+ * @author Nicolas Grekas <p@tchwork.com>
60
+ *
61
+ * @internal
62
+ */
63
+ final class Mbstring
64
+ {
65
+ const MB_CASE_FOLD = PHP_INT_MAX;
66
+
67
+ private static $encodingList = array('ASCII', 'UTF-8');
68
+ private static $language = 'neutral';
69
+ private static $internalEncoding = 'UTF-8';
70
+ private static $caseFold = array(
71
+ array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
72
+ array('μ','s','ι', 'σ','β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1",'ι'),
73
+ );
74
+
75
+ public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
76
+ {
77
+ if (is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
78
+ $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
79
+ } else {
80
+ $fromEncoding = self::getEncoding($fromEncoding);
81
+ }
82
+
83
+ $toEncoding = self::getEncoding($toEncoding);
84
+
85
+ if ('BASE64' === $fromEncoding) {
86
+ $s = base64_decode($s);
87
+ $fromEncoding = $toEncoding;
88
+ }
89
+
90
+ if ('BASE64' === $toEncoding) {
91
+ return base64_encode($s);
92
+ }
93
+
94
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
95
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
96
+ $fromEncoding = 'Windows-1252';
97
+ }
98
+ if ('UTF-8' !== $fromEncoding) {
99
+ $s = iconv($fromEncoding, 'UTF-8', $s);
100
+ }
101
+
102
+ return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
103
+ }
104
+
105
+ if ('HTML-ENTITIES' === $fromEncoding) {
106
+ $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
107
+ $fromEncoding = 'UTF-8';
108
+ }
109
+
110
+ return iconv($fromEncoding, $toEncoding, $s);
111
+ }
112
+
113
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
114
+ {
115
+ $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
116
+
117
+ $ok = true;
118
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
119
+ if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
120
+ $ok = false;
121
+ }
122
+ });
123
+
124
+ return $ok ? $fromEncoding : false;
125
+ }
126
+
127
+ public static function mb_decode_mimeheader($s)
128
+ {
129
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
130
+ }
131
+
132
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
133
+ {
134
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
135
+ }
136
+
137
+ public static function mb_convert_case($s, $mode, $encoding = null)
138
+ {
139
+ if ('' === $s .= '') {
140
+ return '';
141
+ }
142
+
143
+ $encoding = self::getEncoding($encoding);
144
+
145
+ if ('UTF-8' === $encoding) {
146
+ $encoding = null;
147
+ } else {
148
+ $s = iconv($encoding, 'UTF-8', $s);
149
+ }
150
+
151
+ if (MB_CASE_TITLE == $mode) {
152
+ $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
153
+ $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
154
+ } else {
155
+ if (MB_CASE_UPPER == $mode) {
156
+ static $upper = null;
157
+ if (null === $upper) {
158
+ $upper = self::getData('upperCase');
159
+ }
160
+ $map = $upper;
161
+ } else {
162
+ if (self::MB_CASE_FOLD === $mode) {
163
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
164
+ }
165
+
166
+ static $lower = null;
167
+ if (null === $lower) {
168
+ $lower = self::getData('lowerCase');
169
+ }
170
+ $map = $lower;
171
+ }
172
+
173
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
174
+
175
+ $i = 0;
176
+ $len = strlen($s);
177
+
178
+ while ($i < $len) {
179
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
180
+ $uchr = substr($s, $i, $ulen);
181
+ $i += $ulen;
182
+
183
+ if (isset($map[$uchr])) {
184
+ $uchr = $map[$uchr];
185
+ $nlen = strlen($uchr);
186
+
187
+ if ($nlen == $ulen) {
188
+ $nlen = $i;
189
+ do {
190
+ $s[--$nlen] = $uchr[--$ulen];
191
+ } while ($ulen);
192
+ } else {
193
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
194
+ $len += $nlen - $ulen;
195
+ $i += $nlen - $ulen;
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ if (null === $encoding) {
202
+ return $s;
203
+ }
204
+
205
+ return iconv('UTF-8', $encoding, $s);
206
+ }
207
+
208
+ public static function mb_internal_encoding($encoding = null)
209
+ {
210
+ if (null === $encoding) {
211
+ return self::$internalEncoding;
212
+ }
213
+
214
+ $encoding = self::getEncoding($encoding);
215
+
216
+ if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
217
+ self::$internalEncoding = $encoding;
218
+
219
+ return true;
220
+ }
221
+
222
+ return false;
223
+ }
224
+
225
+ public static function mb_language($lang = null)
226
+ {
227
+ if (null === $lang) {
228
+ return self::$language;
229
+ }
230
+
231
+ switch ($lang = strtolower($lang)) {
232
+ case 'uni':
233
+ case 'neutral':
234
+ self::$language = $lang;
235
+
236
+ return true;
237
+ }
238
+
239
+ return false;
240
+ }
241
+
242
+ public static function mb_list_encodings()
243
+ {
244
+ return array('UTF-8');
245
+ }
246
+
247
+ public static function mb_encoding_aliases($encoding)
248
+ {
249
+ switch (strtoupper($encoding)) {
250
+ case 'UTF8':
251
+ case 'UTF-8':
252
+ return array('utf8');
253
+ }
254
+
255
+ return false;
256
+ }
257
+
258
+ public static function mb_check_encoding($var = null, $encoding = null)
259
+ {
260
+ if (null === $encoding) {
261
+ if (null === $var) {
262
+ return false;
263
+ }
264
+ $encoding = self::$internalEncoding;
265
+ }
266
+
267
+ return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
268
+ }
269
+
270
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
271
+ {
272
+ if (null === $encodingList) {
273
+ $encodingList = self::$encodingList;
274
+ } else {
275
+ if (!is_array($encodingList)) {
276
+ $encodingList = array_map('trim', explode(',', $encodingList));
277
+ }
278
+ $encodingList = array_map('strtoupper', $encodingList);
279
+ }
280
+
281
+ foreach ($encodingList as $enc) {
282
+ switch ($enc) {
283
+ case 'ASCII':
284
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
285
+ return $enc;
286
+ }
287
+ break;
288
+
289
+ case 'UTF8':
290
+ case 'UTF-8':
291
+ if (preg_match('//u', $str)) {
292
+ return 'UTF-8';
293
+ }
294
+ break;
295
+
296
+ default:
297
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
298
+ return $enc;
299
+ }
300
+ }
301
+ }
302
+
303
+ return false;
304
+ }
305
+
306
+ public static function mb_detect_order($encodingList = null)
307
+ {
308
+ if (null === $encodingList) {
309
+ return self::$encodingList;
310
+ }
311
+
312
+ if (!is_array($encodingList)) {
313
+ $encodingList = array_map('trim', explode(',', $encodingList));
314
+ }
315
+ $encodingList = array_map('strtoupper', $encodingList);
316
+
317
+ foreach ($encodingList as $enc) {
318
+ switch ($enc) {
319
+ default:
320
+ if (strncmp($enc, 'ISO-8859-', 9)) {
321
+ return false;
322
+ }
323
+ case 'ASCII':
324
+ case 'UTF8':
325
+ case 'UTF-8':
326
+ }
327
+ }
328
+
329
+ self::$encodingList = $encodingList;
330
+
331
+ return true;
332
+ }
333
+
334
+ public static function mb_strlen($s, $encoding = null)
335
+ {
336
+ $encoding = self::getEncoding($encoding);
337
+
338
+ return iconv_strlen($s, $encoding);
339
+ }
340
+
341
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
342
+ {
343
+ $encoding = self::getEncoding($encoding);
344
+
345
+ if ('' === $needle .= '') {
346
+ trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
347
+
348
+ return false;
349
+ }
350
+
351
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
352
+ }
353
+
354
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
355
+ {
356
+ $encoding = self::getEncoding($encoding);
357
+
358
+ if ($offset != (int) $offset) {
359
+ $offset = 0;
360
+ } elseif ($offset = (int) $offset) {
361
+ if ($offset < 0) {
362
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
363
+ $offset = 0;
364
+ } else {
365
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
366
+ }
367
+ }
368
+
369
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
370
+
371
+ return false !== $pos ? $offset + $pos : false;
372
+ }
373
+
374
+ public static function mb_strtolower($s, $encoding = null)
375
+ {
376
+ return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
377
+ }
378
+
379
+ public static function mb_strtoupper($s, $encoding = null)
380
+ {
381
+ return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
382
+ }
383
+
384
+ public static function mb_substitute_character($c = null)
385
+ {
386
+ if (0 === strcasecmp($c, 'none')) {
387
+ return true;
388
+ }
389
+
390
+ return null !== $c ? false : 'none';
391
+ }
392
+
393
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
394
+ {
395
+ $encoding = self::getEncoding($encoding);
396
+
397
+ if ($start < 0) {
398
+ $start = iconv_strlen($s, $encoding) + $start;
399
+ if ($start < 0) {
400
+ $start = 0;
401
+ }
402
+ }
403
+
404
+ if (null === $length) {
405
+ $length = 2147483647;
406
+ } elseif ($length < 0) {
407
+ $length = iconv_strlen($s, $encoding) + $length - $start;
408
+ if ($length < 0) {
409
+ return '';
410
+ }
411
+ }
412
+
413
+ return iconv_substr($s, $start, $length, $encoding).'';
414
+ }
415
+
416
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
417
+ {
418
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
419
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
420
+
421
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
422
+ }
423
+
424
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
425
+ {
426
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
427
+
428
+ return self::getSubpart($pos, $part, $haystack, $encoding);
429
+ }
430
+
431
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
432
+ {
433
+ $encoding = self::getEncoding($encoding);
434
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
435
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
436
+
437
+ return self::getSubpart($pos, $part, $haystack, $encoding);
438
+ }
439
+
440
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
441
+ {
442
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
443
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
444
+
445
+ return self::getSubpart($pos, $part, $haystack, $encoding);
446
+ }
447
+
448
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
449
+ {
450
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
451
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
452
+
453
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
454
+ }
455
+
456
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
457
+ {
458
+ $pos = strpos($haystack, $needle);
459
+ if (false === $pos) {
460
+ return false;
461
+ }
462
+ if ($part) {
463
+ return substr($haystack, 0, $pos);
464
+ }
465
+
466
+ return substr($haystack, $pos);
467
+ }
468
+
469
+ public static function mb_get_info($type = 'all')
470
+ {
471
+ $info = array(
472
+ 'internal_encoding' => self::$internalEncoding,
473
+ 'http_output' => 'pass',
474
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
475
+ 'func_overload' => 0,
476
+ 'func_overload_list' => 'no overload',
477
+ 'mail_charset' => 'UTF-8',
478
+ 'mail_header_encoding' => 'BASE64',
479
+ 'mail_body_encoding' => 'BASE64',
480
+ 'illegal_chars' => 0,
481
+ 'encoding_translation' => 'Off',
482
+ 'language' => self::$language,
483
+ 'detect_order' => self::$encodingList,
484
+ 'substitute_character' => 'none',
485
+ 'strict_detection' => 'Off',
486
+ );
487
+
488
+ if ('all' === $type) {
489
+ return $info;
490
+ }
491
+ if (isset($info[$type])) {
492
+ return $info[$type];
493
+ }
494
+
495
+ return false;
496
+ }
497
+
498
+ public static function mb_http_input($type = '')
499
+ {
500
+ return false;
501
+ }
502
+
503
+ public static function mb_http_output($encoding = null)
504
+ {
505
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
506
+ }
507
+
508
+ public static function mb_strwidth($s, $encoding = null)
509
+ {
510
+ $encoding = self::getEncoding($encoding);
511
+
512
+ if ('UTF-8' !== $encoding) {
513
+ $s = iconv($encoding, 'UTF-8', $s);
514
+ }
515
+
516
+ $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
517
+
518
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
519
+ }
520
+
521
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
522
+ {
523
+ return substr_count($haystack, $needle);
524
+ }
525
+
526
+ public static function mb_output_handler($contents, $status)
527
+ {
528
+ return $contents;
529
+ }
530
+
531
+ private static function getSubpart($pos, $part, $haystack, $encoding)
532
+ {
533
+ if (false === $pos) {
534
+ return false;
535
+ }
536
+ if ($part) {
537
+ return self::mb_substr($haystack, 0, $pos, $encoding);
538
+ }
539
+
540
+ return self::mb_substr($haystack, $pos, null, $encoding);
541
+ }
542
+
543
+ private static function html_encoding_callback($m)
544
+ {
545
+ $i = 1;
546
+ $entities = '';
547
+ $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
548
+
549
+ while (isset($m[$i])) {
550
+ if (0x80 > $m[$i]) {
551
+ $entities .= chr($m[$i++]);
552
+ continue;
553
+ }
554
+ if (0xF0 <= $m[$i]) {
555
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
556
+ } elseif (0xE0 <= $m[$i]) {
557
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
558
+ } else {
559
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
560
+ }
561
+
562
+ $entities .= '&#'.$c.';';
563
+ }
564
+
565
+ return $entities;
566
+ }
567
+
568
+ private static function title_case_lower($s)
569
+ {
570
+ return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
571
+ }
572
+
573
+ private static function title_case_upper($s)
574
+ {
575
+ return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
576
+ }
577
+
578
+ private static function getData($file)
579
+ {
580
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.ser')) {
581
+ return unserialize(file_get_contents($file));
582
+ }
583
+
584
+ return false;
585
+ }
586
+
587
+ private static function getEncoding($encoding)
588
+ {
589
+ if (null === $encoding) {
590
+ return self::$internalEncoding;
591
+ }
592
+
593
+ $encoding = strtoupper($encoding);
594
+
595
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
596
+ return 'CP850';
597
+ }
598
+ if ('UTF8' === $encoding) {
599
+ return 'UTF-8';
600
+ }
601
+
602
+ return $encoding;
603
+ }
604
+ }
vendor/symfony/polyfill-mbstring/README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Symfony Polyfill / Mbstring
2
+ ===========================
3
+
4
+ This component provides a partial, native PHP implementation for the
5
+ [Mbstring](http://php.net/mbstring) extension.
6
+
7
+ More information can be found in the
8
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
9
+
10
+ License
11
+ =======
12
+
13
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser ADDED
@@ -0,0 +1 @@
 
1
+ a:1092:{s:1:"A";s:1:"a";s:1:"B";s:1:"b";s:1:"C";s:1:"c";s:1:"D";s:1:"d";s:1:"E";s:1:"e";s:1:"F";s:1:"f";s:1:"G";s:1:"g";s:1:"H";s:1:"h";s:1:"I";s:1:"i";s:1:"J";s:1:"j";s:1:"K";s:1:"k";s:1:"L";s:1:"l";s:1:"M";s:1:"m";s:1:"N";s:1:"n";s:1:"O";s:1:"o";s:1:"P";s:1:"p";s:1:"Q";s:1:"q";s:1:"R";s:1:"r";s:1:"S";s:1:"s";s:1:"T";s:1:"t";s:1:"U";s:1:"u";s:1:"V";s:1:"v";s:1:"W";s:1:"w";s:1:"X";s:1:"x";s:1:"Y";s:1:"y";s:1:"Z";s:1:"z";s:2:"À";s:2:"à";s:2:"Á";s:2:"á";s:2:"Â";s:2:"â";s:2:"Ã";s:2:"ã";s:2:"Ä";s:2:"ä";s:2:"Å";s:2:"å";s:2:"Æ";s:2:"æ";s:2:"Ç";s:2:"ç";s:2:"È";s:2:"è";s:2:"É";s:2:"é";s:2:"Ê";s:2:"ê";s:2:"Ë";s:2:"ë";s:2:"Ì";s:2:"ì";s:2:"Í";s:2:"í";s:2:"Î";s:2:"î";s:2:"Ï";s:2:"ï";s:2:"Ð";s:2:"ð";s:2:"Ñ";s:2:"ñ";s:2:"Ò";s:2:"ò";s:2:"Ó";s:2:"ó";s:2:"Ô";s:2:"ô";s:2:"Õ";s:2:"õ";s:2:"Ö";s:2:"ö";s:2:"Ø";s:2:"ø";s:2:"Ù";s:2:"ù";s:2:"Ú";s:2:"ú";s:2:"Û";s:2:"û";s:2:"Ü";s:2:"ü";s:2:"Ý";s:2:"ý";s:2:"Þ";s:2:"þ";s:2:"Ā";s:2:"ā";s:2:"Ă";s:2:"ă";s:2:"Ą";s:2:"ą";s:2:"Ć";s:2:"ć";s:2:"Ĉ";s:2:"ĉ";s:2:"Ċ";s:2:"ċ";s:2:"Č";s:2:"č";s:2:"Ď";s:2:"ď";s:2:"Đ";s:2:"đ";s:2:"Ē";s:2:"ē";s:2:"Ĕ";s:2:"ĕ";s:2:"Ė";s:2:"ė";s:2:"Ę";s:2:"ę";s:2:"Ě";s:2:"ě";s:2:"Ĝ";s:2:"ĝ";s:2:"Ğ";s:2:"ğ";s:2:"Ġ";s:2:"ġ";s:2:"Ģ";s:2:"ģ";s:2:"Ĥ";s:2:"ĥ";s:2:"Ħ";s:2:"ħ";s:2:"Ĩ";s:2:"ĩ";s:2:"Ī";s:2:"ī";s:2:"Ĭ";s:2:"ĭ";s:2:"Į";s:2:"į";s:2:"İ";s:1:"i";s:2:"IJ";s:2:"ij";s:2:"Ĵ";s:2:"ĵ";s:2:"Ķ";s:2:"ķ";s:2:"Ĺ";s:2:"ĺ";s:2:"Ļ";s:2:"ļ";s:2:"Ľ";s:2:"ľ";s:2:"Ŀ";s:2:"ŀ";s:2:"Ł";s:2:"ł";s:2:"Ń";s:2:"ń";s:2:"Ņ";s:2:"ņ";s:2:"Ň";s:2:"ň";s:2:"Ŋ";s:2:"ŋ";s:2:"Ō";s:2:"ō";s:2:"Ŏ";s:2:"ŏ";s:2:"Ő";s:2:"ő";s:2:"Œ";s:2:"œ";s:2:"Ŕ";s:2:"ŕ";s:2:"Ŗ";s:2:"ŗ";s:2:"Ř";s:2:"ř";s:2:"Ś";s:2:"ś";s:2:"Ŝ";s:2:"ŝ";s:2:"Ş";s:2:"ş";s:2:"Š";s:2:"š";s:2:"Ţ";s:2:"ţ";s:2:"Ť";s:2:"ť";s:2:"Ŧ";s:2:"ŧ";s:2:"Ũ";s:2:"ũ";s:2:"Ū";s:2:"ū";s:2:"Ŭ";s:2:"ŭ";s:2:"Ů";s:2:"ů";s:2:"Ű";s:2:"ű";s:2:"Ų";s:2:"ų";s:2:"Ŵ";s:2:"ŵ";s:2:"Ŷ";s:2:"ŷ";s:2:"Ÿ";s:2:"ÿ";s:2:"Ź";s:2:"ź";s:2:"Ż";s:2:"ż";s:2:"Ž";s:2:"ž";s:2:"Ɓ";s:2:"ɓ";s:2:"Ƃ";s:2:"ƃ";s:2:"Ƅ";s:2:"ƅ";s:2:"Ɔ";s:2:"ɔ";s:2:"Ƈ";s:2:"ƈ";s:2:"Ɖ";s:2:"ɖ";s:2:"Ɗ";s:2:"ɗ";s:2:"Ƌ";s:2:"ƌ";s:2:"Ǝ";s:2:"ǝ";s:2:"Ə";s:2:"ə";s:2:"Ɛ";s:2:"ɛ";s:2:"Ƒ";s:2:"ƒ";s:2:"Ɠ";s:2:"ɠ";s:2:"Ɣ";s:2:"ɣ";s:2:"Ɩ";s:2:"ɩ";s:2:"Ɨ";s:2:"ɨ";s:2:"Ƙ";s:2:"ƙ";s:2:"Ɯ";s:2:"ɯ";s:2:"Ɲ";s:2:"ɲ";s:2:"Ɵ";s:2:"ɵ";s:2:"Ơ";s:2:"ơ";s:2:"Ƣ";s:2:"ƣ";s:2:"Ƥ";s:2:"ƥ";s:2:"Ʀ";s:2:"ʀ";s:2:"Ƨ";s:2:"ƨ";s:2:"Ʃ";s:2:"ʃ";s:2:"Ƭ";s:2:"ƭ";s:2:"Ʈ";s:2:"ʈ";s:2:"Ư";s:2:"ư";s:2:"Ʊ";s:2:"ʊ";s:2:"Ʋ";s:2:"ʋ";s:2:"Ƴ";s:2:"ƴ";s:2:"Ƶ";s:2:"ƶ";s:2:"Ʒ";s:2:"ʒ";s:2:"Ƹ";s:2:"ƹ";s:2:"Ƽ";s:2:"ƽ";s:2:"DŽ";s:2:"dž";s:2:"Dž";s:2:"dž";s:2:"LJ";s:2:"lj";s:2:"Lj";s:2:"lj";s:2:"NJ";s:2:"nj";s:2:"Nj";s:2:"nj";s:2:"Ǎ";s:2:"ǎ";s:2:"Ǐ";s:2:"ǐ";s:2:"Ǒ";s:2:"ǒ";s:2:"Ǔ";s:2:"ǔ";s:2:"Ǖ";s:2:"ǖ";s:2:"Ǘ";s:2:"ǘ";s:2:"Ǚ";s:2:"ǚ";s:2:"Ǜ";s:2:"ǜ";s:2:"Ǟ";s:2:"ǟ";s:2:"Ǡ";s:2:"ǡ";s:2:"Ǣ";s:2:"ǣ";s:2:"Ǥ";s:2:"ǥ";s:2:"Ǧ";s:2:"ǧ";s:2:"Ǩ";s:2:"ǩ";s:2:"Ǫ";s:2:"ǫ";s:2:"Ǭ";s:2:"ǭ";s:2:"Ǯ";s:2:"ǯ";s:2:"DZ";s:2:"dz";s:2:"Dz";s:2:"dz";s:2:"Ǵ";s:2:"ǵ";s:2:"Ƕ";s:2:"ƕ";s:2:"Ƿ";s:2:"ƿ";s:2:"Ǹ";s:2:"ǹ";s:2:"Ǻ";s:2:"ǻ";s:2:"Ǽ";s:2:"ǽ";s:2:"Ǿ";s:2:"ǿ";s:2:"Ȁ";s:2:"ȁ";s:2:"Ȃ";s:2:"ȃ";s:2:"Ȅ";s:2:"ȅ";s:2:"Ȇ";s:2:"ȇ";s:2:"Ȉ";s:2:"ȉ";s:2:"Ȋ";s:2:"ȋ";s:2:"Ȍ";s:2:"ȍ";s:2:"Ȏ";s:2:"ȏ";s:2:"Ȑ";s:2:"ȑ";s:2:"Ȓ";s:2:"ȓ";s:2:"Ȕ";s:2:"ȕ";s:2:"Ȗ";s:2:"ȗ";s:2:"Ș";s:2:"ș";s:2:"Ț";s:2:"ț";s:2:"Ȝ";s:2:"ȝ";s:2:"Ȟ";s:2:"ȟ";s:2:"Ƞ";s:2:"ƞ";s:2:"Ȣ";s:2:"ȣ";s:2:"Ȥ";s:2:"ȥ";s:2:"Ȧ";s:2:"ȧ";s:2:"Ȩ";s:2:"ȩ";s:2:"Ȫ";s:2:"ȫ";s:2:"Ȭ";s:2:"ȭ";s:2:"Ȯ";s:2:"ȯ";s:2:"Ȱ";s:2:"ȱ";s:2:"Ȳ";s:2:"ȳ";s:2:"Ⱥ";s:3:"ⱥ";s:2:"Ȼ";s:2:"ȼ";s:2:"Ƚ";s:2:"ƚ";s:2:"Ⱦ";s:3:"ⱦ";s:2:"Ɂ";s:2:"ɂ";s:2:"Ƀ";s:2:"ƀ";s:2:"Ʉ";s:2:"ʉ";s:2:"Ʌ";s:2:"ʌ";s:2:"Ɇ";s:2:"ɇ";s:2:"Ɉ";s:2:"ɉ";s:2:"Ɋ";s:2:"ɋ";s:2:"Ɍ";s:2:"ɍ";s:2:"Ɏ";s:2:"ɏ";s:2:"Ͱ";s:2:"ͱ";s:2:"Ͳ";s:2:"ͳ";s:2:"Ͷ";s:2:"ͷ";s:2:"Ϳ";s:2:"ϳ";s:2:"Ά";s:2:"ά";s:2:"Έ";s:2:"έ";s:2:"Ή";s:2:"ή";s:2:"Ί";s:2:"ί";s:2:"Ό";s:2:"ό";s:2:"Ύ";s:2:"ύ";s:2:"Ώ";s:2:"ώ";s:2:"Α";s:2:"α";s:2:"Β";s:2:"β";s:2:"Γ";s:2:"γ";s:2:"Δ";s:2:"δ";s:2:"Ε";s:2:"ε";s:2:"Ζ";s:2:"ζ";s:2:"Η";s:2:"η";s:2:"Θ";s:2:"θ";s:2:"Ι";s:2:"ι";s:2:"Κ";s:2:"κ";s:2:"Λ";s:2:"λ";s:2:"Μ";s:2:"μ";s:2:"Ν";s:2:"ν";s:2:"Ξ";s:2:"ξ";s:2:"Ο";s:2:"ο";s:2:"Π";s:2:"π";s:2:"Ρ";s:2:"ρ";s:2:"Σ";s:2:"σ";s:2:"Τ";s:2:"τ";s:2:"Υ";s:2:"υ";s:2:"Φ";s:2:"φ";s:2:"Χ";s:2:"χ";s:2:"Ψ";s:2:"ψ";s:2:"Ω";s:2:"ω";s:2:"Ϊ";s:2:"ϊ";s:2:"Ϋ";s:2:"ϋ";s:2:"Ϗ";s:2:"ϗ";s:2:"Ϙ";s:2:"ϙ";s:2:"Ϛ";s:2:"ϛ";s:2:"Ϝ";s:2:"ϝ";s:2:"Ϟ";s:2:"ϟ";s:2:"Ϡ";s:2:"ϡ";s:2:"Ϣ";s:2:"ϣ";s:2:"Ϥ";s:2:"ϥ";s:2:"Ϧ";s:2:"ϧ";s:2:"Ϩ";s:2:"ϩ";s:2:"Ϫ";s:2:"ϫ";s:2:"Ϭ";s:2:"ϭ";s:2:"Ϯ";s:2:"ϯ";s:2:"ϴ";s:2:"θ";s:2:"Ϸ";s:2:"ϸ";s:2:"Ϲ";s:2:"ϲ";s:2:"Ϻ";s:2:"ϻ";s:2:"Ͻ";s:2:"ͻ";s:2:"Ͼ";s:2:"ͼ";s:2:"Ͽ";s:2:"ͽ";s:2:"Ѐ";s:2:"ѐ";s:2:"Ё";s:2:"ё";s:2:"Ђ";s:2:"ђ";s:2:"Ѓ";s:2:"ѓ";s:2:"Є";s:2:"є";s:2:"Ѕ";s:2:"ѕ";s:2:"І";s:2:"і";s:2:"Ї";s:2:"ї";s:2:"Ј";s:2:"ј";s:2:"Љ";s:2:"љ";s:2:"Њ";s:2:"њ";s:2:"Ћ";s:2:"ћ";s:2:"Ќ";s:2:"ќ";s:2:"Ѝ";s:2:"ѝ";s:2:"Ў";s:2:"ў";s:2:"Џ";s:2:"џ";s:2:"А";s:2:"а";s:2:"Б";s:2:"б";s:2:"В";s:2:"в";s:2:"Г";s:2:"г";s:2:"Д";s:2:"д";s:2:"Е";s:2:"е";s:2:"Ж";s:2:"ж";s:2:"З";s:2:"з";s:2:"И";s:2:"и";s:2:"Й";s:2:"й";s:2:"К";s:2:"к";s:2:"Л";s:2:"л";s:2:"М";s:2:"м";s:2:"Н";s:2:"н";s:2:"О";s:2:"о";s:2:"П";s:2:"п";s:2:"Р";s:2:"р";s:2:"С";s:2:"с";s:2:"Т";s:2:"т";s:2:"У";s:2:"у";s:2:"Ф";s:2:"ф";s:2:"Х";s:2:"х";s:2:"Ц";s:2:"ц";s:2:"Ч";s:2:"ч";s:2:"Ш";s:2:"ш";s:2:"Щ";s:2:"щ";s:2:"Ъ";s:2:"ъ";s:2:"Ы";s:2:"ы";s:2:"Ь";s:2:"ь";s:2:"Э";s:2:"э";s:2:"Ю";s:2:"ю";s:2:"Я";s:2:"я";s:2:"Ѡ";s:2:"ѡ";s:2:"Ѣ";s:2:"ѣ";s:2:"Ѥ";s:2:"ѥ";s:2:"Ѧ";s:2:"ѧ";s:2:"Ѩ";s:2:"ѩ";s:2:"Ѫ";s:2:"ѫ";s:2:"Ѭ";s:2:"ѭ";s:2:"Ѯ";s:2:"ѯ";s:2:"Ѱ";s:2:"ѱ";s:2:"Ѳ";s:2:"ѳ";s:2:"Ѵ";s:2:"ѵ";s:2:"Ѷ";s:2:"ѷ";s:2:"Ѹ";s:2:"ѹ";s:2:"Ѻ";s:2:"ѻ";s:2:"Ѽ";s:2:"ѽ";s:2:"Ѿ";s:2:"ѿ";s:2:"Ҁ";s:2:"ҁ";s:2:"Ҋ";s:2:"ҋ";s:2:"Ҍ";s:2:"ҍ";s:2:"Ҏ";s:2:"ҏ";s:2:"Ґ";s:2:"ґ";s:2:"Ғ";s:2:"ғ";s:2:"Ҕ";s:2:"ҕ";s:2:"Җ";s:2:"җ";s:2:"Ҙ";s:2:"ҙ";s:2:"Қ";s:2:"қ";s:2:"Ҝ";s:2:"ҝ";s:2:"Ҟ";s:2:"ҟ";s:2:"Ҡ";s:2:"ҡ";s:2:"Ң";s:2:"ң";s:2:"Ҥ";s:2:"ҥ";s:2:"Ҧ";s:2:"ҧ";s:2:"Ҩ";s:2:"ҩ";s:2:"Ҫ";s:2:"ҫ";s:2:"Ҭ";s:2:"ҭ";s:2:"Ү";s:2:"ү";s:2:"Ұ";s:2:"ұ";s:2:"Ҳ";s:2:"ҳ";s:2:"Ҵ";s:2:"ҵ";s:2:"Ҷ";s:2:"ҷ";s:2:"Ҹ";s:2:"ҹ";s:2:"Һ";s:2:"һ";s:2:"Ҽ";s:2:"ҽ";s:2:"Ҿ";s:2:"ҿ";s:2:"Ӏ";s:2:"ӏ";s:2:"Ӂ";s:2:"ӂ";s:2:"Ӄ";s:2:"ӄ";s:2:"Ӆ";s:2:"ӆ";s:2:"Ӈ";s:2:"ӈ";s:2:"Ӊ";s:2:"ӊ";s:2:"Ӌ";s:2:"ӌ";s:2:"Ӎ";s:2:"ӎ";s:2:"Ӑ";s:2:"ӑ";s:2:"Ӓ";s:2:"ӓ";s:2:"Ӕ";s:2:"ӕ";s:2:"Ӗ";s:2:"ӗ";s:2:"Ә";s:2:"ә";s:2:"Ӛ";s:2:"ӛ";s:2:"Ӝ";s:2:"ӝ";s:2:"Ӟ";s:2:"ӟ";s:2:"Ӡ";s:2:"ӡ";s:2:"Ӣ";s:2:"ӣ";s:2:"Ӥ";s:2:"ӥ";s:2:"Ӧ";s:2:"ӧ";s:2:"Ө";s:2:"ө";s:2:"Ӫ";s:2:"ӫ";s:2:"Ӭ";s:2:"ӭ";s:2:"Ӯ";s:2:"ӯ";s:2:"Ӱ";s:2:"ӱ";s:2:"Ӳ";s:2:"ӳ";s:2:"Ӵ";s:2:"ӵ";s:2:"Ӷ";s:2:"ӷ";s:2:"Ӹ";s:2:"ӹ";s:2:"Ӻ";s:2:"ӻ";s:2:"Ӽ";s:2:"ӽ";s:2:"Ӿ";s:2:"ӿ";s:2:"Ԁ";s:2:"ԁ";s:2:"Ԃ";s:2:"ԃ";s:2:"Ԅ";s:2:"ԅ";s:2:"Ԇ";s:2:"ԇ";s:2:"Ԉ";s:2:"ԉ";s:2:"Ԋ";s:2:"ԋ";s:2:"Ԍ";s:2:"ԍ";s:2:"Ԏ";s:2:"ԏ";s:2:"Ԑ";s:2:"ԑ";s:2:"Ԓ";s:2:"ԓ";s:2:"Ԕ";s:2:"ԕ";s:2:"Ԗ";s:2:"ԗ";s:2:"Ԙ";s:2:"ԙ";s:2:"Ԛ";s:2:"ԛ";s:2:"Ԝ";s:2:"ԝ";s:2:"Ԟ";s:2:"ԟ";s:2:"Ԡ";s:2:"ԡ";s:2:"Ԣ";s:2:"ԣ";s:2:"Ԥ";s:2:"ԥ";s:2:"Ԧ";s:2:"ԧ";s:2:"Ԩ";s:2:"ԩ";s:2:"Ԫ";s:2:"ԫ";s:2:"Ԭ";s:2:"ԭ";s:2:"Ԯ";s:2:"ԯ";s:2:"Ա";s:2:"ա";s:2:"Բ";s:2:"բ";s:2:"Գ";s:2:"գ";s:2:"Դ";s:2:"դ";s:2:"Ե";s:2:"ե";s:2:"Զ";s:2:"զ";s:2:"Է";s:2:"է";s:2:"Ը";s:2:"ը";s:2:"Թ";s:2:"թ";s:2:"Ժ";s:2:"ժ";s:2:"Ի";s:2:"ի";s:2:"Լ";s:2:"լ";s:2:"Խ";s:2:"խ";s:2:"Ծ";s:2:"ծ";s:2:"Կ";s:2:"կ";s:2:"Հ";s:2:"հ";s:2:"Ձ";s:2:"ձ";s:2:"Ղ";s:2:"ղ";s:2:"Ճ";s:2:"ճ";s:2:"Մ";s:2:"մ";s:2:"Յ";s:2:"յ";s:2:"Ն";s:2:"ն";s:2:"Շ";s:2:"շ";s:2:"Ո";s:2:"ո";s:2:"Չ";s:2:"չ";s:2:"Պ";s:2:"պ";s:2:"Ջ";s:2:"ջ";s:2:"Ռ";s:2:"ռ";s:2:"Ս";s:2:"ս";s:2:"Վ";s:2:"վ";s:2:"Տ";s:2:"տ";s:2:"Ր";s:2:"ր";s:2:"Ց";s:2:"ց";s:2:"Ւ";s:2:"ւ";s:2:"Փ";s:2:"փ";s:2:"Ք";s:2:"ք";s:2:"Օ";s:2:"օ";s:2:"Ֆ";s:2:"ֆ";s:3:"Ⴀ";s:3:"ⴀ";s:3:"Ⴁ";s:3:"ⴁ";s:3:"Ⴂ";s:3:"ⴂ";s:3:"Ⴃ";s:3:"ⴃ";s:3:"Ⴄ";s:3:"ⴄ";s:3:"Ⴅ";s:3:"ⴅ";s:3:"Ⴆ";s:3:"ⴆ";s:3:"Ⴇ";s:3:"ⴇ";s:3:"Ⴈ";s:3:"ⴈ";s:3:"Ⴉ";s:3:"ⴉ";s:3:"Ⴊ";s:3:"ⴊ";s:3:"Ⴋ";s:3:"ⴋ";s:3:"Ⴌ";s:3:"ⴌ";s:3:"Ⴍ";s:3:"ⴍ";s:3:"Ⴎ";s:3:"ⴎ";s:3:"Ⴏ";s:3:"ⴏ";s:3:"Ⴐ";s:3:"ⴐ";s:3:"Ⴑ";s:3:"ⴑ";s:3:"Ⴒ";s:3:"ⴒ";s:3:"Ⴓ";s:3:"ⴓ";s:3:"Ⴔ";s:3:"ⴔ";s:3:"Ⴕ";s:3:"ⴕ";s:3:"Ⴖ";s:3:"ⴖ";s:3:"Ⴗ";s:3:"ⴗ";s:3:"Ⴘ";s:3:"ⴘ";s:3:"Ⴙ";s:3:"ⴙ";s:3:"Ⴚ";s:3:"ⴚ";s:3:"Ⴛ";s:3:"ⴛ";s:3:"Ⴜ";s:3:"ⴜ";s:3:"Ⴝ";s:3:"ⴝ";s:3:"Ⴞ";s:3:"ⴞ";s:3:"Ⴟ";s:3:"ⴟ";s:3:"Ⴠ";s:3:"ⴠ";s:3:"Ⴡ";s:3:"ⴡ";s:3:"Ⴢ";s:3:"ⴢ";s:3:"Ⴣ";s:3:"ⴣ";s:3:"Ⴤ";s:3:"ⴤ";s:3:"Ⴥ";s:3:"ⴥ";s:3:"Ⴧ";s:3:"ⴧ";s:3:"Ⴭ";s:3:"ⴭ";s:3:"Ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"ḇ";s:3:"Ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"ḓ";s:3:"Ḕ";s:3:"ḕ";s:3:"Ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"ḛ";s:3:"Ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"ḭ";s:3:"Ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"ḷ";s:3:"Ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"ṋ";s:3:"Ṍ";s:3:"ṍ";s:3:"Ṏ";s:3:"ṏ";s:3:"Ṑ";s:3:"ṑ";s:3:"Ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"ṛ";s:3:"Ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"ṣ";s:3:"Ṥ";s:3:"ṥ";s:3:"Ṧ";s:3:"ṧ";s:3:"Ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"ṷ";s:3:"Ṹ";s:3:"ṹ";s:3:"Ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẞ";s:2:"ß";s:3:"Ạ";s:3:"ạ";s:3:"Ả";s:3:"ả";s:3:"Ấ";s:3:"ấ";s:3:"Ầ";s:3:"ầ";s:3:"Ẩ";s:3:"ẩ";s:3:"Ẫ";s:3:"ẫ";s:3:"Ậ";s:3:"ậ";s:3:"Ắ";s:3:"ắ";s:3:"Ằ";s:3:"ằ";s:3:"Ẳ";s:3:"ẳ";s:3:"Ẵ";s:3:"ẵ";s:3:"Ặ";s:3:"ặ";s:3:"Ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"ẽ";s:3:"Ế";s:3:"ế";s:3:"Ề";s:3:"ề";s:3:"Ể";s:3:"ể";s:3:"Ễ";s:3:"ễ";s:3:"Ệ";s:3:"ệ";s:3:"Ỉ";s:3:"ỉ";s:3:"Ị";s:3:"ị";s:3:"Ọ";s:3:"ọ";s:3:"Ỏ";s:3:"ỏ";s:3:"Ố";s:3:"ố";s:3:"Ồ";s:3:"ồ";s:3:"Ổ";s:3:"ổ";s:3:"Ỗ";s:3:"ỗ";s:3:"Ộ";s:3:"ộ";s:3:"Ớ";s:3:"ớ";s:3:"Ờ";s:3:"ờ";s:3:"Ở";s:3:"ở";s:3:"Ỡ";s:3:"ỡ";s:3:"Ợ";s:3:"ợ";s:3:"Ụ";s:3:"ụ";s:3:"Ủ";s:3:"ủ";s:3:"Ứ";s:3:"ứ";s:3:"Ừ";s:3:"ừ";s:3:"Ử";s:3:"ử";s:3:"Ữ";s:3:"ữ";s:3:"Ự";s:3:"ự";s:3:"Ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"ỹ";s:3:"Ỻ";s:3:"ỻ";s:3:"Ỽ";s:3:"ỽ";s:3:"Ỿ";s:3:"ỿ";s:3:"Ἀ";s:3:"ἀ";s:3:"Ἁ";s:3:"ἁ";s:3:"Ἂ";s:3:"ἂ";s:3:"Ἃ";s:3:"ἃ";s:3:"Ἄ";s:3:"ἄ";s:3:"Ἅ";s:3:"ἅ";s:3:"Ἆ";s:3:"ἆ";s:3:"Ἇ";s:3:"ἇ";s:3:"Ἐ";s:3:"ἐ";s:3:"Ἑ";s:3:"ἑ";s:3:"Ἒ";s:3:"ἒ";s:3:"Ἓ";s:3:"ἓ";s:3:"Ἔ";s:3:"ἔ";s:3:"Ἕ";s:3:"ἕ";s:3:"Ἠ";s:3:"ἠ";s:3:"Ἡ";s:3:"ἡ";s:3:"Ἢ";s:3:"ἢ";s:3:"Ἣ";s:3:"ἣ";s:3:"Ἤ";s:3:"ἤ";s:3:"Ἥ";s:3:"ἥ";s:3:"Ἦ";s:3:"ἦ";s:3:"Ἧ";s:3:"ἧ";s:3:"Ἰ";s:3:"ἰ";s:3:"Ἱ";s:3:"ἱ";s:3:"Ἲ";s:3:"ἲ";s:3:"Ἳ";s:3:"ἳ";s:3:"Ἴ";s:3:"ἴ";s:3:"Ἵ";s:3:"ἵ";s:3:"Ἶ";s:3:"ἶ";s:3:"Ἷ";s:3:"ἷ";s:3:"Ὀ";s:3:"ὀ";s:3:"Ὁ";s:3:"ὁ";s:3:"Ὂ";s:3:"ὂ";s:3:"Ὃ";s:3:"ὃ";s:3:"Ὄ";s:3:"ὄ";s:3:"Ὅ";s:3:"ὅ";s:3:"Ὑ";s:3:"ὑ";s:3:"Ὓ";s:3:"ὓ";s:3:"Ὕ";s:3:"ὕ";s:3:"Ὗ";s:3:"ὗ";s:3:"Ὠ";s:3:"ὠ";s:3:"Ὡ";s:3:"ὡ";s:3:"Ὢ";s:3:"ὢ";s:3:"Ὣ";s:3:"ὣ";s:3:"Ὤ";s:3:"ὤ";s:3:"Ὥ";s:3:"ὥ";s:3:"Ὦ";s:3:"ὦ";s:3:"Ὧ";s:3:"ὧ";s:3:"ᾈ";s:3:"ᾀ";s:3:"ᾉ";s:3:"ᾁ";s:3:"ᾊ";s:3:"ᾂ";s:3:"ᾋ";s:3:"ᾃ";s:3:"ᾌ";s:3:"ᾄ";s:3:"ᾍ";s:3:"ᾅ";s:3:"ᾎ";s:3:"ᾆ";s:3:"ᾏ";s:3:"ᾇ";s:3:"ᾘ";s:3:"ᾐ";s:3:"ᾙ";s:3:"ᾑ";s:3:"ᾚ";s:3:"ᾒ";s:3:"ᾛ";s:3:"ᾓ";s:3:"ᾜ";s:3:"ᾔ";s:3:"ᾝ";s:3:"ᾕ";s:3:"ᾞ";s:3:"ᾖ";s:3:"ᾟ";s:3:"ᾗ";s:3:"ᾨ";s:3:"ᾠ";s:3:"ᾩ";s:3:"ᾡ";s:3:"ᾪ";s:3:"ᾢ";s:3:"ᾫ";s:3:"ᾣ";s:3:"ᾬ";s:3:"ᾤ";s:3:"ᾭ";s:3:"ᾥ";s:3:"ᾮ";s:3:"ᾦ";s:3:"ᾯ";s:3:"ᾧ";s:3:"Ᾰ";s:3:"ᾰ";s:3:"Ᾱ";s:3:"ᾱ";s:3:"Ὰ";s:3:"ὰ";s:3:"Ά";s:3:"ά";s:3:"ᾼ";s:3:"ᾳ";s:3:"Ὲ";s:3:"ὲ";s:3:"Έ";s:3:"έ";s:3:"Ὴ";s:3:"ὴ";s:3:"Ή";s:3:"ή";s:3:"ῌ";s:3:"ῃ";s:3:"Ῐ";s:3:"ῐ";s:3:"Ῑ";s:3:"ῑ";s:3:"Ὶ";s:3:"ὶ";s:3:"Ί";s:3:"ί";s:3:"Ῠ";s:3:"ῠ";s:3:"Ῡ";s:3:"ῡ";s:3:"Ὺ";s:3:"ὺ";s:3:"Ύ";s:3:"ύ";s:3:"Ῥ";s:3:"ῥ";s:3:"Ὸ";s:3:"ὸ";s:3:"Ό";s:3:"ό";s:3:"Ὼ";s:3:"ὼ";s:3:"Ώ";s:3:"ώ";s:3:"ῼ";s:3:"ῳ";s:3:"Ω";s:2:"ω";s:3:"K";s:1:"k";s:3:"Å";s:2:"å";s:3:"Ⅎ";s:3:"ⅎ";s:3:"Ⅰ";s:3:"ⅰ";s:3:"Ⅱ";s:3:"ⅱ";s:3:"Ⅲ";s:3:"ⅲ";s:3:"Ⅳ";s:3:"ⅳ";s:3:"Ⅴ";s:3:"ⅴ";s:3:"Ⅵ";s:3:"ⅵ";s:3:"Ⅶ";s:3:"ⅶ";s:3:"Ⅷ";s:3:"ⅷ";s:3:"Ⅸ";s:3:"ⅸ";s:3:"Ⅹ";s:3:"ⅹ";s:3:"Ⅺ";s:3:"ⅺ";s:3:"Ⅻ";s:3:"ⅻ";s:3:"Ⅼ";s:3:"ⅼ";s:3:"Ⅽ";s:3:"ⅽ";s:3:"Ⅾ";s:3:"ⅾ";s:3:"Ⅿ";s:3:"ⅿ";s:3:"Ↄ";s:3:"ↄ";s:3:"Ⓐ";s:3:"ⓐ";s:3:"Ⓑ";s:3:"ⓑ";s:3:"Ⓒ";s:3:"ⓒ";s:3:"Ⓓ";s:3:"ⓓ";s:3:"Ⓔ";s:3:"ⓔ";s:3:"Ⓕ";s:3:"ⓕ";s:3:"Ⓖ";s:3:"ⓖ";s:3:"Ⓗ";s:3:"ⓗ";s:3:"Ⓘ";s:3:"ⓘ";s:3:"Ⓙ";s:3:"ⓙ";s:3:"Ⓚ";s:3:"ⓚ";s:3:"Ⓛ";s:3:"ⓛ";s:3:"Ⓜ";s:3:"ⓜ";s:3:"Ⓝ";s:3:"ⓝ";s:3:"Ⓞ";s:3:"ⓞ";s:3:"Ⓟ";s:3:"ⓟ";s:3:"Ⓠ";s:3:"ⓠ";s:3:"Ⓡ";s:3:"ⓡ";s:3:"Ⓢ";s:3:"ⓢ";s:3:"Ⓣ";s:3:"ⓣ";s:3:"Ⓤ";s:3:"ⓤ";s:3:"Ⓥ";s:3:"ⓥ";s:3:"Ⓦ";s:3:"ⓦ";s:3:"Ⓧ";s:3:"ⓧ";s:3:"Ⓨ";s:3:"ⓨ";s:3:"Ⓩ";s:3:"ⓩ";s:3:"Ⰰ";s:3:"ⰰ";s:3:"Ⰱ";s:3:"ⰱ";s:3:"Ⰲ";s:3:"ⰲ";s:3:"Ⰳ";s:3:"ⰳ";s:3:"Ⰴ";s:3:"ⰴ";s:3:"Ⰵ";s:3:"ⰵ";s:3:"Ⰶ";s:3:"ⰶ";s:3:"Ⰷ";s:3:"ⰷ";s:3:"Ⰸ";s:3:"ⰸ";s:3:"Ⰹ";s:3:"ⰹ";s:3:"Ⰺ";s:3:"ⰺ";s:3:"Ⰻ";s:3:"ⰻ";s:3:"Ⰼ";s:3:"ⰼ";s:3:"Ⰽ";s:3:"ⰽ";s:3:"Ⰾ";s:3:"ⰾ";s:3:"Ⰿ";s:3:"ⰿ";s:3:"Ⱀ";s:3:"ⱀ";s:3:"Ⱁ";s:3:"ⱁ";s:3:"Ⱂ";s:3:"ⱂ";s:3:"Ⱃ";s:3:"ⱃ";s:3:"Ⱄ";s:3:"ⱄ";s:3:"Ⱅ";s:3:"ⱅ";s:3:"Ⱆ";s:3:"ⱆ";s:3:"Ⱇ";s:3:"ⱇ";s:3:"Ⱈ";s:3:"ⱈ";s:3:"Ⱉ";s:3:"ⱉ";s:3:"Ⱊ";s:3:"ⱊ";s:3:"Ⱋ";s:3:"ⱋ";s:3:"Ⱌ";s:3:"ⱌ";s:3:"Ⱍ";s:3:"ⱍ";s:3:"Ⱎ";s:3:"ⱎ";s:3:"Ⱏ";s:3:"ⱏ";s:3:"Ⱐ";s:3:"ⱐ";s:3:"Ⱑ";s:3:"ⱑ";s:3:"Ⱒ";s:3:"ⱒ";s:3:"Ⱓ";s:3:"ⱓ";s:3:"Ⱔ";s:3:"ⱔ";s:3:"Ⱕ";s:3:"ⱕ";s:3:"Ⱖ";s:3:"ⱖ";s:3:"Ⱗ";s:3:"ⱗ";s:3:"Ⱘ";s:3:"ⱘ";s:3:"Ⱙ";s:3:"ⱙ";s:3:"Ⱚ";s:3:"ⱚ";s:3:"Ⱛ";s:3:"ⱛ";s:3:"Ⱜ";s:3:"ⱜ";s:3:"Ⱝ";s:3:"ⱝ";s:3:"Ⱞ";s:3:"ⱞ";s:3:"Ⱡ";s:3:"ⱡ";s:3:"Ɫ";s:2:"ɫ";s:3:"Ᵽ";s:3:"ᵽ";s:3:"Ɽ";s:2:"ɽ";s:3:"Ⱨ";s:3:"ⱨ";s:3:"Ⱪ";s:3:"ⱪ";s:3:"Ⱬ";s:3:"ⱬ";s:3:"Ɑ";s:2:"ɑ";s:3:"Ɱ";s:2:"ɱ";s:3:"Ɐ";s:2:"ɐ";s:3:"Ɒ";s:2:"ɒ";s:3:"Ⱳ";s:3:"ⱳ";s:3:"Ⱶ";s:3:"ⱶ";s:3:"Ȿ";s:2:"ȿ";s:3:"Ɀ";s:2:"ɀ";s:3:"Ⲁ";s:3:"ⲁ";s:3:"Ⲃ";s:3:"ⲃ";s:3:"Ⲅ";s:3:"ⲅ";s:3:"Ⲇ";s:3:"ⲇ";s:3:"Ⲉ";s:3:"ⲉ";s:3:"Ⲋ";s:3:"ⲋ";s:3:"Ⲍ";s:3:"ⲍ";s:3:"Ⲏ";s:3:"ⲏ";s:3:"Ⲑ";s:3:"ⲑ";s:3:"Ⲓ";s:3:"ⲓ";s:3:"Ⲕ";s:3:"ⲕ";s:3:"Ⲗ";s:3:"ⲗ";s:3:"Ⲙ";s:3:"ⲙ";s:3:"Ⲛ";s:3:"ⲛ";s:3:"Ⲝ";s:3:"ⲝ";s:3:"Ⲟ";s:3:"ⲟ";s:3:"Ⲡ";s:3:"ⲡ";s:3:"Ⲣ";s:3:"ⲣ";s:3:"Ⲥ";s:3:"ⲥ";s:3:"Ⲧ";s:3:"ⲧ";s:3:"Ⲩ";s:3:"ⲩ";s:3:"Ⲫ";s:3:"ⲫ";s:3:"Ⲭ";s:3:"ⲭ";s:3:"Ⲯ";s:3:"ⲯ";s:3:"Ⲱ";s:3:"ⲱ";s:3:"Ⲳ";s:3:"ⲳ";s:3:"Ⲵ";s:3:"ⲵ";s:3:"Ⲷ";s:3:"ⲷ";s:3:"Ⲹ";s:3:"ⲹ";s:3:"Ⲻ";s:3:"ⲻ";s:3:"Ⲽ";s:3:"ⲽ";s:3:"Ⲿ";s:3:"ⲿ";s:3:"Ⳁ";s:3:"ⳁ";s:3:"Ⳃ";s:3:"ⳃ";s:3:"Ⳅ";s:3:"ⳅ";s:3:"Ⳇ";s:3:"ⳇ";s:3:"Ⳉ";s:3:"ⳉ";s:3:"Ⳋ";s:3:"ⳋ";s:3:"Ⳍ";s:3:"ⳍ";s:3:"Ⳏ";s:3:"ⳏ";s:3:"Ⳑ";s:3:"ⳑ";s:3:"Ⳓ";s:3:"ⳓ";s:3:"Ⳕ";s:3:"ⳕ";s:3:"Ⳗ";s:3:"ⳗ";s:3:"Ⳙ";s:3:"ⳙ";s:3:"Ⳛ";s:3:"ⳛ";s:3:"Ⳝ";s:3:"ⳝ";s:3:"Ⳟ";s:3:"ⳟ";s:3:"Ⳡ";s:3:"ⳡ";s:3:"Ⳣ";s:3:"ⳣ";s:3:"Ⳬ";s:3:"ⳬ";s:3:"Ⳮ";s:3:"ⳮ";s:3:"Ⳳ";s:3:"ⳳ";s:3:"Ꙁ";s:3:"ꙁ";s:3:"Ꙃ";s:3:"ꙃ";s:3:"Ꙅ";s:3:"ꙅ";s:3:"Ꙇ";s:3:"ꙇ";s:3:"Ꙉ";s:3:"ꙉ";s:3:"Ꙋ";s:3:"ꙋ";s:3:"Ꙍ";s:3:"ꙍ";s:3:"Ꙏ";s:3:"ꙏ";s:3:"Ꙑ";s:3:"ꙑ";s:3:"Ꙓ";s:3:"ꙓ";s:3:"Ꙕ";s:3:"ꙕ";s:3:"Ꙗ";s:3:"ꙗ";s:3:"Ꙙ";s:3:"ꙙ";s:3:"Ꙛ";s:3:"ꙛ";s:3:"Ꙝ";s:3:"ꙝ";s:3:"Ꙟ";s:3:"ꙟ";s:3:"Ꙡ";s:3:"ꙡ";s:3:"Ꙣ";s:3:"ꙣ";s:3:"Ꙥ";s:3:"ꙥ";s:3:"Ꙧ";s:3:"ꙧ";s:3:"Ꙩ";s:3:"ꙩ";s:3:"Ꙫ";s:3:"ꙫ";s:3:"Ꙭ";s:3:"ꙭ";s:3:"Ꚁ";s:3:"ꚁ";s:3:"Ꚃ";s:3:"ꚃ";s:3:"Ꚅ";s:3:"ꚅ";s:3:"Ꚇ";s:3:"ꚇ";s:3:"Ꚉ";s:3:"ꚉ";s:3:"Ꚋ";s:3:"ꚋ";s:3:"Ꚍ";s:3:"ꚍ";s:3:"Ꚏ";s:3:"ꚏ";s:3:"Ꚑ";s:3:"ꚑ";s:3:"Ꚓ";s:3:"ꚓ";s:3:"Ꚕ";s:3:"ꚕ";s:3:"Ꚗ";s:3:"ꚗ";s:3:"Ꚙ";s:3:"ꚙ";s:3:"Ꚛ";s:3:"ꚛ";s:3:"Ꜣ";s:3:"ꜣ";s:3:"Ꜥ";s:3:"ꜥ";s:3:"Ꜧ";s:3:"ꜧ";s:3:"Ꜩ";s:3:"ꜩ";s:3:"Ꜫ";s:3:"ꜫ";s:3:"Ꜭ";s:3:"ꜭ";s:3:"Ꜯ";s:3:"ꜯ";s:3:"Ꜳ";s:3:"ꜳ";s:3:"Ꜵ";s:3:"ꜵ";s:3:"Ꜷ";s:3:"ꜷ";s:3:"Ꜹ";s:3:"ꜹ";s:3:"Ꜻ";s:3:"ꜻ";s:3:"Ꜽ";s:3:"ꜽ";s:3:"Ꜿ";s:3:"ꜿ";s:3:"Ꝁ";s:3:"ꝁ";s:3:"Ꝃ";s:3:"ꝃ";s:3:"Ꝅ";s:3:"ꝅ";s:3:"Ꝇ";s:3:"ꝇ";s:3:"Ꝉ";s:3:"ꝉ";s:3:"Ꝋ";s:3:"ꝋ";s:3:"Ꝍ";s:3:"ꝍ";s:3:"Ꝏ";s:3:"ꝏ";s:3:"Ꝑ";s:3:"ꝑ";s:3:"Ꝓ";s:3:"ꝓ";s:3:"Ꝕ";s:3:"ꝕ";s:3:"Ꝗ";s:3:"ꝗ";s:3:"Ꝙ";s:3:"ꝙ";s:3:"Ꝛ";s:3:"ꝛ";s:3:"Ꝝ";s:3:"ꝝ";s:3:"Ꝟ";s:3:"ꝟ";s:3:"Ꝡ";s:3:"ꝡ";s:3:"Ꝣ";s:3:"ꝣ";s:3:"Ꝥ";s:3:"ꝥ";s:3:"Ꝧ";s:3:"ꝧ";s:3:"Ꝩ";s:3:"ꝩ";s:3:"Ꝫ";s:3:"ꝫ";s:3:"Ꝭ";s:3:"ꝭ";s:3:"Ꝯ";s:3:"ꝯ";s:3:"Ꝺ";s:3:"ꝺ";s:3:"Ꝼ";s:3:"ꝼ";s:3:"Ᵹ";s:3:"ᵹ";s:3:"Ꝿ";s:3:"ꝿ";s:3:"Ꞁ";s:3:"ꞁ";s:3:"Ꞃ";s:3:"ꞃ";s:3:"Ꞅ";s:3:"ꞅ";s:3:"Ꞇ";s:3:"ꞇ";s:3:"Ꞌ";s:3:"ꞌ";s:3:"Ɥ";s:2:"ɥ";s:3:"Ꞑ";s:3:"ꞑ";s:3:"Ꞓ";s:3:"ꞓ";s:3:"Ꞗ";s:3:"ꞗ";s:3:"Ꞙ";s:3:"ꞙ";s:3:"Ꞛ";s:3:"ꞛ";s:3:"Ꞝ";s:3:"ꞝ";s:3:"Ꞟ";s:3:"ꞟ";s:3:"Ꞡ";s:3:"ꞡ";s:3:"Ꞣ";s:3:"ꞣ";s:3:"Ꞥ";s:3:"ꞥ";s:3:"Ꞧ";s:3:"ꞧ";s:3:"Ꞩ";s:3:"ꞩ";s:3:"Ɦ";s:2:"ɦ";s:3:"Ɜ";s:2:"ɜ";s:3:"Ɡ";s:2:"ɡ";s:3:"Ɬ";s:2:"ɬ";s:3:"Ʞ";s:2:"ʞ";s:3:"Ʇ";s:2:"ʇ";s:3:"A";s:3:"a";s:3:"B";s:3:"b";s:3:"C";s:3:"c";s:3:"D";s:3:"d";s:3:"E";s:3:"e";s:3:"F";s:3:"f";s:3:"G";s:3:"g";s:3:"H";s:3:"h";s:3:"I";s:3:"i";s:3:"J";s:3:"j";s:3:"K";s:3:"k";s:3:"L";s:3:"l";s:3:"M";s:3:"m";s:3:"N";s:3:"n";s:3:"O";s:3:"o";s:3:"P";s:3:"p";s:3:"Q";s:3:"q";s:3:"R";s:3:"r";s:3:"S";s:3:"s";s:3:"T";s:3:"t";s:3:"U";s:3:"u";s:3:"V";s:3:"v";s:3:"W";s:3:"w";s:3:"X";s:3:"x";s:3:"Y";s:3:"y";s:3:"Z";s:3:"z";s:4:"𐐀";s:4:"𐐨";s:4:"𐐁";s:4:"𐐩";s:4:"𐐂";s:4:"𐐪";s:4:"𐐃";s:4:"𐐫";s:4:"𐐄";s:4:"𐐬";s:4:"𐐅";s:4:"𐐭";s:4:"𐐆";s:4:"𐐮";s:4:"𐐇";s:4:"𐐯";s:4:"𐐈";s:4:"𐐰";s:4:"𐐉";s:4:"𐐱";s:4:"𐐊";s:4:"𐐲";s:4:"𐐋";s:4:"𐐳";s:4:"𐐌";s:4:"𐐴";s:4:"𐐍";s:4:"𐐵";s:4:"𐐎";s:4:"𐐶";s:4:"𐐏";s:4:"𐐷";s:4:"𐐐";s:4:"𐐸";s:4:"𐐑";s:4:"𐐹";s:4:"𐐒";s:4:"𐐺";s:4:"𐐓";s:4:"𐐻";s:4:"𐐔";s:4:"𐐼";s:4:"𐐕";s:4:"𐐽";s:4:"𐐖";s:4:"𐐾";s:4:"𐐗";s:4:"𐐿";s:4:"𐐘";s:4:"𐑀";s:4:"𐐙";s:4:"𐑁";s:4:"𐐚";s:4:"𐑂";s:4:"𐐛";s:4:"𐑃";s:4:"𐐜";s:4:"𐑄";s:4:"𐐝";s:4:"𐑅";s:4:"𐐞";s:4:"𐑆";s:4:"𐐟";s:4:"𐑇";s:4:"𐐠";s:4:"𐑈";s:4:"𐐡";s:4:"𐑉";s:4:"𐐢";s:4:"𐑊";s:4:"𐐣";s:4:"𐑋";s:4:"𐐤";s:4:"𐑌";s:4:"𐐥";s:4:"𐑍";s:4:"𐐦";s:4:"𐑎";s:4:"𐐧";s:4:"𐑏";s:4:"𑢠";s:4:"𑣀";s:4:"𑢡";s:4:"𑣁";s:4:"𑢢";s:4:"𑣂";s:4:"𑢣";s:4:"𑣃";s:4:"𑢤";s:4:"𑣄";s:4:"𑢥";s:4:"𑣅";s:4:"𑢦";s:4:"𑣆";s:4:"𑢧";s:4:"𑣇";s:4:"𑢨";s:4:"𑣈";s:4:"𑢩";s:4:"𑣉";s:4:"𑢪";s:4:"𑣊";s:4:"𑢫";s:4:"𑣋";s:4:"𑢬";s:4:"𑣌";s:4:"𑢭";s:4:"𑣍";s:4:"𑢮";s:4:"𑣎";s:4:"𑢯";s:4:"𑣏";s:4:"𑢰";s:4:"𑣐";s:4:"𑢱";s:4:"𑣑";s:4:"𑢲";s:4:"𑣒";s:4:"𑢳";s:4:"𑣓";s:4:"𑢴";s:4:"𑣔";s:4:"𑢵";s:4:"𑣕";s:4:"𑢶";s:4:"𑣖";s:4:"𑢷";s:4:"𑣗";s:4:"𑢸";s:4:"𑣘";s:4:"𑢹";s:4:"𑣙";s:4:"𑢺";s:4:"𑣚";s:4:"𑢻";s:4:"𑣛";s:4:"𑢼";s:4:"𑣜";s:4:"𑢽";s:4:"𑣝";s:4:"𑢾";s:4:"𑣞";s:4:"𑢿";s:4:"𑣟";}
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser ADDED
@@ -0,0 +1 @@
 
1
+ a:1100:{s:1:"a";s:1:"A";s:1:"b";s:1:"B";s:1:"c";s:1:"C";s:1:"d";s:1:"D";s:1:"e";s:1:"E";s:1:"f";s:1:"F";s:1:"g";s:1:"G";s:1:"h";s:1:"H";s:1:"i";s:1:"I";s:1:"j";s:1:"J";s:1:"k";s:1:"K";s:1:"l";s:1:"L";s:1:"m";s:1:"M";s:1:"n";s:1:"N";s:1:"o";s:1:"O";s:1:"p";s:1:"P";s:1:"q";s:1:"Q";s:1:"r";s:1:"R";s:1:"s";s:1:"S";s:1:"t";s:1:"T";s:1:"u";s:1:"U";s:1:"v";s:1:"V";s:1:"w";s:1:"W";s:1:"x";s:1:"X";s:1:"y";s:1:"Y";s:1:"z";s:1:"Z";s:2:"µ";s:2:"Μ";s:2:"à";s:2:"À";s:2:"á";s:2:"Á";s:2:"â";s:2:"Â";s:2:"ã";s:2:"Ã";s:2:"ä";s:2:"Ä";s:2:"å";s:2:"Å";s:2:"æ";s:2:"Æ";s:2:"ç";s:2:"Ç";s:2:"è";s:2:"È";s:2:"é";s:2:"É";s:2:"ê";s:2:"Ê";s:2:"ë";s:2:"Ë";s:2:"ì";s:2:"Ì";s:2:"í";s:2:"Í";s:2:"î";s:2:"Î";s:2:"ï";s:2:"Ï";s:2:"ð";s:2:"Ð";s:2:"ñ";s:2:"Ñ";s:2:"ò";s:2:"Ò";s:2:"ó";s:2:"Ó";s:2:"ô";s:2:"Ô";s:2:"õ";s:2:"Õ";s:2:"ö";s:2:"Ö";s:2:"ø";s:2:"Ø";s:2:"ù";s:2:"Ù";s:2:"ú";s:2:"Ú";s:2:"û";s:2:"Û";s:2:"ü";s:2:"Ü";s:2:"ý";s:2:"Ý";s:2:"þ";s:2:"Þ";s:2:"ÿ";s:2:"Ÿ";s:2:"ā";s:2:"Ā";s:2:"ă";s:2:"Ă";s:2:"ą";s:2:"Ą";s:2:"ć";s:2:"Ć";s:2:"ĉ";s:2:"Ĉ";s:2:"ċ";s:2:"Ċ";s:2:"č";s:2:"Č";s:2:"ď";s:2:"Ď";s:2:"đ";s:2:"Đ";s:2:"ē";s:2:"Ē";s:2:"ĕ";s:2:"Ĕ";s:2:"ė";s:2:"Ė";s:2:"ę";s:2:"Ę";s:2:"ě";s:2:"Ě";s:2:"ĝ";s:2:"Ĝ";s:2:"ğ";s:2:"Ğ";s:2:"ġ";s:2:"Ġ";s:2:"ģ";s:2:"Ģ";s:2:"ĥ";s:2:"Ĥ";s:2:"ħ";s:2:"Ħ";s:2:"ĩ";s:2:"Ĩ";s:2:"ī";s:2:"Ī";s:2:"ĭ";s:2:"Ĭ";s:2:"į";s:2:"Į";s:2:"ı";s:1:"I";s:2:"ij";s:2:"IJ";s:2:"ĵ";s:2:"Ĵ";s:2:"ķ";s:2:"Ķ";s:2:"ĺ";s:2:"Ĺ";s:2:"ļ";s:2:"Ļ";s:2:"ľ";s:2:"Ľ";s:2:"ŀ";s:2:"Ŀ";s:2:"ł";s:2:"Ł";s:2:"ń";s:2:"Ń";s:2:"ņ";s:2:"Ņ";s:2:"ň";s:2:"Ň";s:2:"ŋ";s:2:"Ŋ";s:2:"ō";s:2:"Ō";s:2:"ŏ";s:2:"Ŏ";s:2:"ő";s:2:"Ő";s:2:"œ";s:2:"Œ";s:2:"ŕ";s:2:"Ŕ";s:2:"ŗ";s:2:"Ŗ";s:2:"ř";s:2:"Ř";s:2:"ś";s:2:"Ś";s:2:"ŝ";s:2:"Ŝ";s:2:"ş";s:2:"Ş";s:2:"š";s:2:"Š";s:2:"ţ";s:2:"Ţ";s:2:"ť";s:2:"Ť";s:2:"ŧ";s:2:"Ŧ";s:2:"ũ";s:2:"Ũ";s:2:"ū";s:2:"Ū";s:2:"ŭ";s:2:"Ŭ";s:2:"ů";s:2:"Ů";s:2:"ű";s:2:"Ű";s:2:"ų";s:2:"Ų";s:2:"ŵ";s:2:"Ŵ";s:2:"ŷ";s:2:"Ŷ";s:2:"ź";s:2:"Ź";s:2:"ż";s:2:"Ż";s:2:"ž";s:2:"Ž";s:2:"ſ";s:1:"S";s:2:"ƀ";s:2:"Ƀ";s:2:"ƃ";s:2:"Ƃ";s:2:"ƅ";s:2:"Ƅ";s:2:"ƈ";s:2:"Ƈ";s:2:"ƌ";s:2:"Ƌ";s:2:"ƒ";s:2:"Ƒ";s:2:"ƕ";s:2:"Ƕ";s:2:"ƙ";s:2:"Ƙ";s:2:"ƚ";s:2:"Ƚ";s:2:"ƞ";s:2:"Ƞ";s:2:"ơ";s:2:"Ơ";s:2:"ƣ";s:2:"Ƣ";s:2:"ƥ";s:2:"Ƥ";s:2:"ƨ";s:2:"Ƨ";s:2:"ƭ";s:2:"Ƭ";s:2:"ư";s:2:"Ư";s:2:"ƴ";s:2:"Ƴ";s:2:"ƶ";s:2:"Ƶ";s:2:"ƹ";s:2:"Ƹ";s:2:"ƽ";s:2:"Ƽ";s:2:"ƿ";s:2:"Ƿ";s:2:"Dž";s:2:"DŽ";s:2:"dž";s:2:"DŽ";s:2:"Lj";s:2:"LJ";s:2:"lj";s:2:"LJ";s:2:"Nj";s:2:"NJ";s:2:"nj";s:2:"NJ";s:2:"ǎ";s:2:"Ǎ";s:2:"ǐ";s:2:"Ǐ";s:2:"ǒ";s:2:"Ǒ";s:2:"ǔ";s:2:"Ǔ";s:2:"ǖ";s:2:"Ǖ";s:2:"ǘ";s:2:"Ǘ";s:2:"ǚ";s:2:"Ǚ";s:2:"ǜ";s:2:"Ǜ";s:2:"ǝ";s:2:"Ǝ";s:2:"ǟ";s:2:"Ǟ";s:2:"ǡ";s:2:"Ǡ";s:2:"ǣ";s:2:"Ǣ";s:2:"ǥ";s:2:"Ǥ";s:2:"ǧ";s:2:"Ǧ";s:2:"ǩ";s:2:"Ǩ";s:2:"ǫ";s:2:"Ǫ";s:2:"ǭ";s:2:"Ǭ";s:2:"ǯ";s:2:"Ǯ";s:2:"Dz";s:2:"DZ";s:2:"dz";s:2:"DZ";s:2:"ǵ";s:2:"Ǵ";s:2:"ǹ";s:2:"Ǹ";s:2:"ǻ";s:2:"Ǻ";s:2:"ǽ";s:2:"Ǽ";s:2:"ǿ";s:2:"Ǿ";s:2:"ȁ";s:2:"Ȁ";s:2:"ȃ";s:2:"Ȃ";s:2:"ȅ";s:2:"Ȅ";s:2:"ȇ";s:2:"Ȇ";s:2:"ȉ";s:2:"Ȉ";s:2:"ȋ";s:2:"Ȋ";s:2:"ȍ";s:2:"Ȍ";s:2:"ȏ";s:2:"Ȏ";s:2:"ȑ";s:2:"Ȑ";s:2:"ȓ";s:2:"Ȓ";s:2:"ȕ";s:2:"Ȕ";s:2:"ȗ";s:2:"Ȗ";s:2:"ș";s:2:"Ș";s:2:"ț";s:2:"Ț";s:2:"ȝ";s:2:"Ȝ";s:2:"ȟ";s:2:"Ȟ";s:2:"ȣ";s:2:"Ȣ";s:2:"ȥ";s:2:"Ȥ";s:2:"ȧ";s:2:"Ȧ";s:2:"ȩ";s:2:"Ȩ";s:2:"ȫ";s:2:"Ȫ";s:2:"ȭ";s:2:"Ȭ";s:2:"ȯ";s:2:"Ȯ";s:2:"ȱ";s:2:"Ȱ";s:2:"ȳ";s:2:"Ȳ";s:2:"ȼ";s:2:"Ȼ";s:2:"ȿ";s:3:"Ȿ";s:2:"ɀ";s:3:"Ɀ";s:2:"ɂ";s:2:"Ɂ";s:2:"ɇ";s:2:"Ɇ";s:2:"ɉ";s:2:"Ɉ";s:2:"ɋ";s:2:"Ɋ";s:2:"ɍ";s:2:"Ɍ";s:2:"ɏ";s:2:"Ɏ";s:2:"ɐ";s:3:"Ɐ";s:2:"ɑ";s:3:"Ɑ";s:2:"ɒ";s:3:"Ɒ";s:2:"ɓ";s:2:"Ɓ";s:2:"ɔ";s:2:"Ɔ";s:2:"ɖ";s:2:"Ɖ";s:2:"ɗ";s:2:"Ɗ";s:2:"ə";s:2:"Ə";s:2:"ɛ";s:2:"Ɛ";s:2:"ɜ";s:3:"Ɜ";s:2:"ɠ";s:2:"Ɠ";s:2:"ɡ";s:3:"Ɡ";s:2:"ɣ";s:2:"Ɣ";s:2:"ɥ";s:3:"Ɥ";s:2:"ɦ";s:3:"Ɦ";s:2:"ɨ";s:2:"Ɨ";s:2:"ɩ";s:2:"Ɩ";s:2:"ɫ";s:3:"Ɫ";s:2:"ɬ";s:3:"Ɬ";s:2:"ɯ";s:2:"Ɯ";s:2:"ɱ";s:3:"Ɱ";s:2:"ɲ";s:2:"Ɲ";s:2:"ɵ";s:2:"Ɵ";s:2:"ɽ";s:3:"Ɽ";s:2:"ʀ";s:2:"Ʀ";s:2:"ʃ";s:2:"Ʃ";s:2:"ʇ";s:3:"Ʇ";s:2:"ʈ";s:2:"Ʈ";s:2:"ʉ";s:2:"Ʉ";s:2:"ʊ";s:2:"Ʊ";s:2:"ʋ";s:2:"Ʋ";s:2:"ʌ";s:2:"Ʌ";s:2:"ʒ";s:2:"Ʒ";s:2:"ʞ";s:3:"Ʞ";s:2:"ͅ";s:2:"Ι";s:2:"ͱ";s:2:"Ͱ";s:2:"ͳ";s:2:"Ͳ";s:2:"ͷ";s:2:"Ͷ";s:2:"ͻ";s:2:"Ͻ";s:2:"ͼ";s:2:"Ͼ";s:2:"ͽ";s:2:"Ͽ";s:2:"ά";s:2:"Ά";s:2:"έ";s:2:"Έ";s:2:"ή";s:2:"Ή";s:2:"ί";s:2:"Ί";s:2:"α";s:2:"Α";s:2:"β";s:2:"Β";s:2:"γ";s:2:"Γ";s:2:"δ";s:2:"Δ";s:2:"ε";s:2:"Ε";s:2:"ζ";s:2:"Ζ";s:2:"η";s:2:"Η";s:2:"θ";s:2:"Θ";s:2:"ι";s:2:"Ι";s:2:"κ";s:2:"Κ";s:2:"λ";s:2:"Λ";s:2:"μ";s:2:"Μ";s:2:"ν";s:2:"Ν";s:2:"ξ";s:2:"Ξ";s:2:"ο";s:2:"Ο";s:2:"π";s:2:"Π";s:2:"ρ";s:2:"Ρ";s:2:"ς";s:2:"Σ";s:2:"σ";s:2:"Σ";s:2:"τ";s:2:"Τ";s:2:"υ";s:2:"Υ";s:2:"φ";s:2:"Φ";s:2:"χ";s:2:"Χ";s:2:"ψ";s:2:"Ψ";s:2:"ω";s:2:"Ω";s:2:"ϊ";s:2:"Ϊ";s:2:"ϋ";s:2:"Ϋ";s:2:"ό";s:2:"Ό";s:2:"ύ";s:2:"Ύ";s:2:"ώ";s:2:"Ώ";s:2:"ϐ";s:2:"Β";s:2:"ϑ";s:2:"Θ";s:2:"ϕ";s:2:"Φ";s:2:"ϖ";s:2:"Π";s:2:"ϗ";s:2:"Ϗ";s:2:"ϙ";s:2:"Ϙ";s:2:"ϛ";s:2:"Ϛ";s:2:"ϝ";s:2:"Ϝ";s:2:"ϟ";s:2:"Ϟ";s:2:"ϡ";s:2:"Ϡ";s:2:"ϣ";s:2:"Ϣ";s:2:"ϥ";s:2:"Ϥ";s:2:"ϧ";s:2:"Ϧ";s:2:"ϩ";s:2:"Ϩ";s:2:"ϫ";s:2:"Ϫ";s:2:"ϭ";s:2:"Ϭ";s:2:"ϯ";s:2:"Ϯ";s:2:"ϰ";s:2:"Κ";s:2:"ϱ";s:2:"Ρ";s:2:"ϲ";s:2:"Ϲ";s:2:"ϳ";s:2:"Ϳ";s:2:"ϵ";s:2:"Ε";s:2:"ϸ";s:2:"Ϸ";s:2:"ϻ";s:2:"Ϻ";s:2:"а";s:2:"А";s:2:"б";s:2:"Б";s:2:"в";s:2:"В";s:2:"г";s:2:"Г";s:2:"д";s:2:"Д";s:2:"е";s:2:"Е";s:2:"ж";s:2:"Ж";s:2:"з";s:2:"З";s:2:"и";s:2:"И";s:2:"й";s:2:"Й";s:2:"к";s:2:"К";s:2:"л";s:2:"Л";s:2:"м";s:2:"М";s:2:"н";s:2:"Н";s:2:"о";s:2:"О";s:2:"п";s:2:"П";s:2:"р";s:2:"Р";s:2:"с";s:2:"С";s:2:"т";s:2:"Т";s:2:"у";s:2:"У";s:2:"ф";s:2:"Ф";s:2:"х";s:2:"Х";s:2:"ц";s:2:"Ц";s:2:"ч";s:2:"Ч";s:2:"ш";s:2:"Ш";s:2:"щ";s:2:"Щ";s:2:"ъ";s:2:"Ъ";s:2:"ы";s:2:"Ы";s:2:"ь";s:2:"Ь";s:2:"э";s:2:"Э";s:2:"ю";s:2:"Ю";s:2:"я";s:2:"Я";s:2:"ѐ";s:2:"Ѐ";s:2:"ё";s:2:"Ё";s:2:"ђ";s:2:"Ђ";s:2:"ѓ";s:2:"Ѓ";s:2:"є";s:2:"Є";s:2:"ѕ";s:2:"Ѕ";s:2:"і";s:2:"І";s:2:"ї";s:2:"Ї";s:2:"ј";s:2:"Ј";s:2:"љ";s:2:"Љ";s:2:"њ";s:2:"Њ";s:2:"ћ";s:2:"Ћ";s:2:"ќ";s:2:"Ќ";s:2:"ѝ";s:2:"Ѝ";s:2:"ў";s:2:"Ў";s:2:"џ";s:2:"Џ";s:2:"ѡ";s:2:"Ѡ";s:2:"ѣ";s:2:"Ѣ";s:2:"ѥ";s:2:"Ѥ";s:2:"ѧ";s:2:"Ѧ";s:2:"ѩ";s:2:"Ѩ";s:2:"ѫ";s:2:"Ѫ";s:2:"ѭ";s:2:"Ѭ";s:2:"ѯ";s:2:"Ѯ";s:2:"ѱ";s:2:"Ѱ";s:2:"ѳ";s:2:"Ѳ";s:2:"ѵ";s:2:"Ѵ";s:2:"ѷ";s:2:"Ѷ";s:2:"ѹ";s:2:"Ѹ";s:2:"ѻ";s:2:"Ѻ";s:2:"ѽ";s:2:"Ѽ";s:2:"ѿ";s:2:"Ѿ";s:2:"ҁ";s:2:"Ҁ";s:2:"ҋ";s:2:"Ҋ";s:2:"ҍ";s:2:"Ҍ";s:2:"ҏ";s:2:"Ҏ";s:2:"ґ";s:2:"Ґ";s:2:"ғ";s:2:"Ғ";s:2:"ҕ";s:2:"Ҕ";s:2:"җ";s:2:"Җ";s:2:"ҙ";s:2:"Ҙ";s:2:"қ";s:2:"Қ";s:2:"ҝ";s:2:"Ҝ";s:2:"ҟ";s:2:"Ҟ";s:2:"ҡ";s:2:"Ҡ";s:2:"ң";s:2:"Ң";s:2:"ҥ";s:2:"Ҥ";s:2:"ҧ";s:2:"Ҧ";s:2:"ҩ";s:2:"Ҩ";s:2:"ҫ";s:2:"Ҫ";s:2:"ҭ";s:2:"Ҭ";s:2:"ү";s:2:"Ү";s:2:"ұ";s:2:"Ұ";s:2:"ҳ";s:2:"Ҳ";s:2:"ҵ";s:2:"Ҵ";s:2:"ҷ";s:2:"Ҷ";s:2:"ҹ";s:2:"Ҹ";s:2:"һ";s:2:"Һ";s:2:"ҽ";s:2:"Ҽ";s:2:"ҿ";s:2:"Ҿ";s:2:"ӂ";s:2:"Ӂ";s:2:"ӄ";s:2:"Ӄ";s:2:"ӆ";s:2:"Ӆ";s:2:"ӈ";s:2:"Ӈ";s:2:"ӊ";s:2:"Ӊ";s:2:"ӌ";s:2:"Ӌ";s:2:"ӎ";s:2:"Ӎ";s:2:"ӏ";s:2:"Ӏ";s:2:"ӑ";s:2:"Ӑ";s:2:"ӓ";s:2:"Ӓ";s:2:"ӕ";s:2:"Ӕ";s:2:"ӗ";s:2:"Ӗ";s:2:"ә";s:2:"Ә";s:2:"ӛ";s:2:"Ӛ";s:2:"ӝ";s:2:"Ӝ";s:2:"ӟ";s:2:"Ӟ";s:2:"ӡ";s:2:"Ӡ";s:2:"ӣ";s:2:"Ӣ";s:2:"ӥ";s:2:"Ӥ";s:2:"ӧ";s:2:"Ӧ";s:2:"ө";s:2:"Ө";s:2:"ӫ";s:2:"Ӫ";s:2:"ӭ";s:2:"Ӭ";s:2:"ӯ";s:2:"Ӯ";s:2:"ӱ";s:2:"Ӱ";s:2:"ӳ";s:2:"Ӳ";s:2:"ӵ";s:2:"Ӵ";s:2:"ӷ";s:2:"Ӷ";s:2:"ӹ";s:2:"Ӹ";s:2:"ӻ";s:2:"Ӻ";s:2:"ӽ";s:2:"Ӽ";s:2:"ӿ";s:2:"Ӿ";s:2:"ԁ";s:2:"Ԁ";s:2:"ԃ";s:2:"Ԃ";s:2:"ԅ";s:2:"Ԅ";s:2:"ԇ";s:2:"Ԇ";s:2:"ԉ";s:2:"Ԉ";s:2:"ԋ";s:2:"Ԋ";s:2:"ԍ";s:2:"Ԍ";s:2:"ԏ";s:2:"Ԏ";s:2:"ԑ";s:2:"Ԑ";s:2:"ԓ";s:2:"Ԓ";s:2:"ԕ";s:2:"Ԕ";s:2:"ԗ";s:2:"Ԗ";s:2:"ԙ";s:2:"Ԙ";s:2:"ԛ";s:2:"Ԛ";s:2:"ԝ";s:2:"Ԝ";s:2:"ԟ";s:2:"Ԟ";s:2:"ԡ";s:2:"Ԡ";s:2:"ԣ";s:2:"Ԣ";s:2:"ԥ";s:2:"Ԥ";s:2:"ԧ";s:2:"Ԧ";s:2:"ԩ";s:2:"Ԩ";s:2:"ԫ";s:2:"Ԫ";s:2:"ԭ";s:2:"Ԭ";s:2:"ԯ";s:2:"Ԯ";s:2:"ա";s:2:"Ա";s:2:"բ";s:2:"Բ";s:2:"գ";s:2:"Գ";s:2:"դ";s:2:"Դ";s:2:"ե";s:2:"Ե";s:2:"զ";s:2:"Զ";s:2:"է";s:2:"Է";s:2:"ը";s:2:"Ը";s:2:"թ";s:2:"Թ";s:2:"ժ";s:2:"Ժ";s:2:"ի";s:2:"Ի";s:2:"լ";s:2:"Լ";s:2:"խ";s:2:"Խ";s:2:"ծ";s:2:"Ծ";s:2:"կ";s:2:"Կ";s:2:"հ";s:2:"Հ";s:2:"ձ";s:2:"Ձ";s:2:"ղ";s:2:"Ղ";s:2:"ճ";s:2:"Ճ";s:2:"մ";s:2:"Մ";s:2:"յ";s:2:"Յ";s:2:"ն";s:2:"Ն";s:2:"շ";s:2:"Շ";s:2:"ո";s:2:"Ո";s:2:"չ";s:2:"Չ";s:2:"պ";s:2:"Պ";s:2:"ջ";s:2:"Ջ";s:2:"ռ";s:2:"Ռ";s:2:"ս";s:2:"Ս";s:2:"վ";s:2:"Վ";s:2:"տ";s:2:"Տ";s:2:"ր";s:2:"Ր";s:2:"ց";s:2:"Ց";s:2:"ւ";s:2:"Ւ";s:2:"փ";s:2:"Փ";s:2:"ք";s:2:"Ք";s:2:"օ";s:2:"Օ";s:2:"ֆ";s:2:"Ֆ";s:3:"ᵹ";s:3:"Ᵹ";s:3:"ᵽ";s:3:"Ᵽ";s:3:"ḁ";s:3:"Ḁ";s:3:"ḃ";s:3:"Ḃ";s:3:"ḅ";s:3:"Ḅ";s:3:"ḇ";s:3:"Ḇ";s:3:"ḉ";s:3:"Ḉ";s:3:"ḋ";s:3:"Ḋ";s:3:"ḍ";s:3:"Ḍ";s:3:"ḏ";s:3:"Ḏ";s:3:"ḑ";s:3:"Ḑ";s:3:"ḓ";s:3:"Ḓ";s:3:"ḕ";s:3:"Ḕ";s:3:"ḗ";s:3:"Ḗ";s:3:"ḙ";s:3:"Ḙ";s:3:"ḛ";s:3:"Ḛ";s:3:"ḝ";s:3:"Ḝ";s:3:"ḟ";s:3:"Ḟ";s:3:"ḡ";s:3:"Ḡ";s:3:"ḣ";s:3:"Ḣ";s:3:"ḥ";s:3:"Ḥ";s:3:"ḧ";s:3:"Ḧ";s:3:"ḩ";s:3:"Ḩ";s:3:"ḫ";s:3:"Ḫ";s:3:"ḭ";s:3:"Ḭ";s:3:"ḯ";s:3:"Ḯ";s:3:"ḱ";s:3:"Ḱ";s:3:"ḳ";s:3:"Ḳ";s:3:"ḵ";s:3:"Ḵ";s:3:"ḷ";s:3:"Ḷ";s:3:"ḹ";s:3:"Ḹ";s:3:"ḻ";s:3:"Ḻ";s:3:"ḽ";s:3:"Ḽ";s:3:"ḿ";s:3:"Ḿ";s:3:"ṁ";s:3:"Ṁ";s:3:"ṃ";s:3:"Ṃ";s:3:"ṅ";s:3:"Ṅ";s:3:"ṇ";s:3:"Ṇ";s:3:"ṉ";s:3:"Ṉ";s:3:"ṋ";s:3:"Ṋ";s:3:"ṍ";s:3:"Ṍ";s:3:"ṏ";s:3:"Ṏ";s:3:"ṑ";s:3:"Ṑ";s:3:"ṓ";s:3:"Ṓ";s:3:"ṕ";s:3:"Ṕ";s:3:"ṗ";s:3:"Ṗ";s:3:"ṙ";s:3:"Ṙ";s:3:"ṛ";s:3:"Ṛ";s:3:"ṝ";s:3:"Ṝ";s:3:"ṟ";s:3:"Ṟ";s:3:"ṡ";s:3:"Ṡ";s:3:"ṣ";s:3:"Ṣ";s:3:"ṥ";s:3:"Ṥ";s:3:"ṧ";s:3:"Ṧ";s:3:"ṩ";s:3:"Ṩ";s:3:"ṫ";s:3:"Ṫ";s:3:"ṭ";s:3:"Ṭ";s:3:"ṯ";s:3:"Ṯ";s:3:"ṱ";s:3:"Ṱ";s:3:"ṳ";s:3:"Ṳ";s:3:"ṵ";s:3:"Ṵ";s:3:"ṷ";s:3:"Ṷ";s:3:"ṹ";s:3:"Ṹ";s:3:"ṻ";s:3:"Ṻ";s:3:"ṽ";s:3:"Ṽ";s:3:"ṿ";s:3:"Ṿ";s:3:"ẁ";s:3:"Ẁ";s:3:"ẃ";s:3:"Ẃ";s:3:"ẅ";s:3:"Ẅ";s:3:"ẇ";s:3:"Ẇ";s:3:"ẉ";s:3:"Ẉ";s:3:"ẋ";s:3:"Ẋ";s:3:"ẍ";s:3:"Ẍ";s:3:"ẏ";s:3:"Ẏ";s:3:"ẑ";s:3:"Ẑ";s:3:"ẓ";s:3:"Ẓ";s:3:"ẕ";s:3:"Ẕ";s:3:"ẛ";s:3:"Ṡ";s:3:"ạ";s:3:"Ạ";s:3:"ả";s:3:"Ả";s:3:"ấ";s:3:"Ấ";s:3:"ầ";s:3:"Ầ";s:3:"ẩ";s:3:"Ẩ";s:3:"ẫ";s:3:"Ẫ";s:3:"ậ";s:3:"Ậ";s:3:"ắ";s:3:"Ắ";s:3:"ằ";s:3:"Ằ";s:3:"ẳ";s:3:"Ẳ";s:3:"ẵ";s:3:"Ẵ";s:3:"ặ";s:3:"Ặ";s:3:"ẹ";s:3:"Ẹ";s:3:"ẻ";s:3:"Ẻ";s:3:"ẽ";s:3:"Ẽ";s:3:"ế";s:3:"Ế";s:3:"ề";s:3:"Ề";s:3:"ể";s:3:"Ể";s:3:"ễ";s:3:"Ễ";s:3:"ệ";s:3:"Ệ";s:3:"ỉ";s:3:"Ỉ";s:3:"ị";s:3:"Ị";s:3:"ọ";s:3:"Ọ";s:3:"ỏ";s:3:"Ỏ";s:3:"ố";s:3:"Ố";s:3:"ồ";s:3:"Ồ";s:3:"ổ";s:3:"Ổ";s:3:"ỗ";s:3:"Ỗ";s:3:"ộ";s:3:"Ộ";s:3:"ớ";s:3:"Ớ";s:3:"ờ";s:3:"Ờ";s:3:"ở";s:3:"Ở";s:3:"ỡ";s:3:"Ỡ";s:3:"ợ";s:3:"Ợ";s:3:"ụ";s:3:"Ụ";s:3:"ủ";s:3:"Ủ";s:3:"ứ";s:3:"Ứ";s:3:"ừ";s:3:"Ừ";s:3:"ử";s:3:"Ử";s:3:"ữ";s:3:"Ữ";s:3:"ự";s:3:"Ự";s:3:"ỳ";s:3:"Ỳ";s:3:"ỵ";s:3:"Ỵ";s:3:"ỷ";s:3:"Ỷ";s:3:"ỹ";s:3:"Ỹ";s:3:"ỻ";s:3:"Ỻ";s:3:"ỽ";s:3:"Ỽ";s:3:"ỿ";s:3:"Ỿ";s:3:"ἀ";s:3:"Ἀ";s:3:"ἁ";s:3:"Ἁ";s:3:"ἂ";s:3:"Ἂ";s:3:"ἃ";s:3:"Ἃ";s:3:"ἄ";s:3:"Ἄ";s:3:"ἅ";s:3:"Ἅ";s:3:"ἆ";s:3:"Ἆ";s:3:"ἇ";s:3:"Ἇ";s:3:"ἐ";s:3:"Ἐ";s:3:"ἑ";s:3:"Ἑ";s:3:"ἒ";s:3:"Ἒ";s:3:"ἓ";s:3:"Ἓ";s:3:"ἔ";s:3:"Ἔ";s:3:"ἕ";s:3:"Ἕ";s:3:"ἠ";s:3:"Ἠ";s:3:"ἡ";s:3:"Ἡ";s:3:"ἢ";s:3:"Ἢ";s:3:"ἣ";s:3:"Ἣ";s:3:"ἤ";s:3:"Ἤ";s:3:"ἥ";s:3:"Ἥ";s:3:"ἦ";s:3:"Ἦ";s:3:"ἧ";s:3:"Ἧ";s:3:"ἰ";s:3:"Ἰ";s:3:"ἱ";s:3:"Ἱ";s:3:"ἲ";s:3:"Ἲ";s:3:"ἳ";s:3:"Ἳ";s:3:"ἴ";s:3:"Ἴ";s:3:"ἵ";s:3:"Ἵ";s:3:"ἶ";s:3:"Ἶ";s:3:"ἷ";s:3:"Ἷ";s:3:"ὀ";s:3:"Ὀ";s:3:"ὁ";s:3:"Ὁ";s:3:"ὂ";s:3:"Ὂ";s:3:"ὃ";s:3:"Ὃ";s:3:"ὄ";s:3:"Ὄ";s:3:"ὅ";s:3:"Ὅ";s:3:"ὑ";s:3:"Ὑ";s:3:"ὓ";s:3:"Ὓ";s:3:"ὕ";s:3:"Ὕ";s:3:"ὗ";s:3:"Ὗ";s:3:"ὠ";s:3:"Ὠ";s:3:"ὡ";s:3:"Ὡ";s:3:"ὢ";s:3:"Ὢ";s:3:"ὣ";s:3:"Ὣ";s:3:"ὤ";s:3:"Ὤ";s:3:"ὥ";s:3:"Ὥ";s:3:"ὦ";s:3:"Ὦ";s:3:"ὧ";s:3:"Ὧ";s:3:"ὰ";s:3:"Ὰ";s:3:"ά";s:3:"Ά";s:3:"ὲ";s:3:"Ὲ";s:3:"έ";s:3:"Έ";s:3:"ὴ";s:3:"Ὴ";s:3:"ή";s:3:"Ή";s:3:"ὶ";s:3:"Ὶ";s:3:"ί";s:3:"Ί";s:3:"ὸ";s:3:"Ὸ";s:3:"ό";s:3:"Ό";s:3:"ὺ";s:3:"Ὺ";s:3:"ύ";s:3:"Ύ";s:3:"ὼ";s:3:"Ὼ";s:3:"ώ";s:3:"Ώ";s:3:"ᾀ";s:3:"ᾈ";s:3:"ᾁ";s:3:"ᾉ";s:3:"ᾂ";s:3:"ᾊ";s:3:"ᾃ";s:3:"ᾋ";s:3:"ᾄ";s:3:"ᾌ";s:3:"ᾅ";s:3:"ᾍ";s:3:"ᾆ";s:3:"ᾎ";s:3:"ᾇ";s:3:"ᾏ";s:3:"ᾐ";s:3:"ᾘ";s:3:"ᾑ";s:3:"ᾙ";s:3:"ᾒ";s:3:"ᾚ";s:3:"ᾓ";s:3:"ᾛ";s:3:"ᾔ";s:3:"ᾜ";s:3:"ᾕ";s:3:"ᾝ";s:3:"ᾖ";s:3:"ᾞ";s:3:"ᾗ";s:3:"ᾟ";s:3:"ᾠ";s:3:"ᾨ";s:3:"ᾡ";s:3:"ᾩ";s:3:"ᾢ";s:3:"ᾪ";s:3:"ᾣ";s:3:"ᾫ";s:3:"ᾤ";s:3:"ᾬ";s:3:"ᾥ";s:3:"ᾭ";s:3:"ᾦ";s:3:"ᾮ";s:3:"ᾧ";s:3:"ᾯ";s:3:"ᾰ";s:3:"Ᾰ";s:3:"ᾱ";s:3:"Ᾱ";s:3:"ᾳ";s:3:"ᾼ";s:3:"ι";s:2:"Ι";s:3:"ῃ";s:3:"ῌ";s:3:"ῐ";s:3:"Ῐ";s:3:"ῑ";s:3:"Ῑ";s:3:"ῠ";s:3:"Ῠ";s:3:"ῡ";s:3:"Ῡ";s:3:"ῥ";s:3:"Ῥ";s:3:"ῳ";s:3:"ῼ";s:3:"ⅎ";s:3:"Ⅎ";s:3:"ⅰ";s:3:"Ⅰ";s:3:"ⅱ";s:3:"Ⅱ";s:3:"ⅲ";s:3:"Ⅲ";s:3:"ⅳ";s:3:"Ⅳ";s:3:"ⅴ";s:3:"Ⅴ";s:3:"ⅵ";s:3:"Ⅵ";s:3:"ⅶ";s:3:"Ⅶ";s:3:"ⅷ";s:3:"Ⅷ";s:3:"ⅸ";s:3:"Ⅸ";s:3:"ⅹ";s:3:"Ⅹ";s:3:"ⅺ";s:3:"Ⅺ";s:3:"ⅻ";s:3:"Ⅻ";s:3:"ⅼ";s:3:"Ⅼ";s:3:"ⅽ";s:3:"Ⅽ";s:3:"ⅾ";s:3:"Ⅾ";s:3:"ⅿ";s:3:"Ⅿ";s:3:"ↄ";s:3:"Ↄ";s:3:"ⓐ";s:3:"Ⓐ";s:3:"ⓑ";s:3:"Ⓑ";s:3:"ⓒ";s:3:"Ⓒ";s:3:"ⓓ";s:3:"Ⓓ";s:3:"ⓔ";s:3:"Ⓔ";s:3:"ⓕ";s:3:"Ⓕ";s:3:"ⓖ";s:3:"Ⓖ";s:3:"ⓗ";s:3:"Ⓗ";s:3:"ⓘ";s:3:"Ⓘ";s:3:"ⓙ";s:3:"Ⓙ";s:3:"ⓚ";s:3:"Ⓚ";s:3:"ⓛ";s:3:"Ⓛ";s:3:"ⓜ";s:3:"Ⓜ";s:3:"ⓝ";s:3:"Ⓝ";s:3:"ⓞ";s:3:"Ⓞ";s:3:"ⓟ";s:3:"Ⓟ";s:3:"ⓠ";s:3:"Ⓠ";s:3:"ⓡ";s:3:"Ⓡ";s:3:"ⓢ";s:3:"Ⓢ";s:3:"ⓣ";s:3:"Ⓣ";s:3:"ⓤ";s:3:"Ⓤ";s:3:"ⓥ";s:3:"Ⓥ";s:3:"ⓦ";s:3:"Ⓦ";s:3:"ⓧ";s:3:"Ⓧ";s:3:"ⓨ";s:3:"Ⓨ";s:3:"ⓩ";s:3:"Ⓩ";s:3:"ⰰ";s:3:"Ⰰ";s:3:"ⰱ";s:3:"Ⰱ";s:3:"ⰲ";s:3:"Ⰲ";s:3:"ⰳ";s:3:"Ⰳ";s:3:"ⰴ";s:3:"Ⰴ";s:3:"ⰵ";s:3:"Ⰵ";s:3:"ⰶ";s:3:"Ⰶ";s:3:"ⰷ";s:3:"Ⰷ";s:3:"ⰸ";s:3:"Ⰸ";s:3:"ⰹ";s:3:"Ⰹ";s:3:"ⰺ";s:3:"Ⰺ";s:3:"ⰻ";s:3:"Ⰻ";s:3:"ⰼ";s:3:"Ⰼ";s:3:"ⰽ";s:3:"Ⰽ";s:3:"ⰾ";s:3:"Ⰾ";s:3:"ⰿ";s:3:"Ⰿ";s:3:"ⱀ";s:3:"Ⱀ";s:3:"ⱁ";s:3:"Ⱁ";s:3:"ⱂ";s:3:"Ⱂ";s:3:"ⱃ";s:3:"Ⱃ";s:3:"ⱄ";s:3:"Ⱄ";s:3:"ⱅ";s:3:"Ⱅ";s:3:"ⱆ";s:3:"Ⱆ";s:3:"ⱇ";s:3:"Ⱇ";s:3:"ⱈ";s:3:"Ⱈ";s:3:"ⱉ";s:3:"Ⱉ";s:3:"ⱊ";s:3:"Ⱊ";s:3:"ⱋ";s:3:"Ⱋ";s:3:"ⱌ";s:3:"Ⱌ";s:3:"ⱍ";s:3:"Ⱍ";s:3:"ⱎ";s:3:"Ⱎ";s:3:"ⱏ";s:3:"Ⱏ";s:3:"ⱐ";s:3:"Ⱐ";s:3:"ⱑ";s:3:"Ⱑ";s:3:"ⱒ";s:3:"Ⱒ";s:3:"ⱓ";s:3:"Ⱓ";s:3:"ⱔ";s:3:"Ⱔ";s:3:"ⱕ";s:3:"Ⱕ";s:3:"ⱖ";s:3:"Ⱖ";s:3:"ⱗ";s:3:"Ⱗ";s:3:"ⱘ";s:3:"Ⱘ";s:3:"ⱙ";s:3:"Ⱙ";s:3:"ⱚ";s:3:"Ⱚ";s:3:"ⱛ";s:3:"Ⱛ";s:3:"ⱜ";s:3:"Ⱜ";s:3:"ⱝ";s:3:"Ⱝ";s:3:"ⱞ";s:3:"Ⱞ";s:3:"ⱡ";s:3:"Ⱡ";s:3:"ⱥ";s:2:"Ⱥ";s:3:"ⱦ";s:2:"Ⱦ";s:3:"ⱨ";s:3:"Ⱨ";s:3:"ⱪ";s:3:"Ⱪ";s:3:"ⱬ";s:3:"Ⱬ";s:3:"ⱳ";s:3:"Ⱳ";s:3:"ⱶ";s:3:"Ⱶ";s:3:"ⲁ";s:3:"Ⲁ";s:3:"ⲃ";s:3:"Ⲃ";s:3:"ⲅ";s:3:"Ⲅ";s:3:"ⲇ";s:3:"Ⲇ";s:3:"ⲉ";s:3:"Ⲉ";s:3:"ⲋ";s:3:"Ⲋ";s:3:"ⲍ";s:3:"Ⲍ";s:3:"ⲏ";s:3:"Ⲏ";s:3:"ⲑ";s:3:"Ⲑ";s:3:"ⲓ";s:3:"Ⲓ";s:3:"ⲕ";s:3:"Ⲕ";s:3:"ⲗ";s:3:"Ⲗ";s:3:"ⲙ";s:3:"Ⲙ";s:3:"ⲛ";s:3:"Ⲛ";s:3:"ⲝ";s:3:"Ⲝ";s:3:"ⲟ";s:3:"Ⲟ";s:3:"ⲡ";s:3:"Ⲡ";s:3:"ⲣ";s:3:"Ⲣ";s:3:"ⲥ";s:3:"Ⲥ";s:3:"ⲧ";s:3:"Ⲧ";s:3:"ⲩ";s:3:"Ⲩ";s:3:"ⲫ";s:3:"Ⲫ";s:3:"ⲭ";s:3:"Ⲭ";s:3:"ⲯ";s:3:"Ⲯ";s:3:"ⲱ";s:3:"Ⲱ";s:3:"ⲳ";s:3:"Ⲳ";s:3:"ⲵ";s:3:"Ⲵ";s:3:"ⲷ";s:3:"Ⲷ";s:3:"ⲹ";s:3:"Ⲹ";s:3:"ⲻ";s:3:"Ⲻ";s:3:"ⲽ";s:3:"Ⲽ";s:3:"ⲿ";s:3:"Ⲿ";s:3:"ⳁ";s:3:"Ⳁ";s:3:"ⳃ";s:3:"Ⳃ";s:3:"ⳅ";s:3:"Ⳅ";s:3:"ⳇ";s:3:"Ⳇ";s:3:"ⳉ";s:3:"Ⳉ";s:3:"ⳋ";s:3:"Ⳋ";s:3:"ⳍ";s:3:"Ⳍ";s:3:"ⳏ";s:3:"Ⳏ";s:3:"ⳑ";s:3:"Ⳑ";s:3:"ⳓ";s:3:"Ⳓ";s:3:"ⳕ";s:3:"Ⳕ";s:3:"ⳗ";s:3:"Ⳗ";s:3:"ⳙ";s:3:"Ⳙ";s:3:"ⳛ";s:3:"Ⳛ";s:3:"ⳝ";s:3:"Ⳝ";s:3:"ⳟ";s:3:"Ⳟ";s:3:"ⳡ";s:3:"Ⳡ";s:3:"ⳣ";s:3:"Ⳣ";s:3:"ⳬ";s:3:"Ⳬ";s:3:"ⳮ";s:3:"Ⳮ";s:3:"ⳳ";s:3:"Ⳳ";s:3:"ⴀ";s:3:"Ⴀ";s:3:"ⴁ";s:3:"Ⴁ";s:3:"ⴂ";s:3:"Ⴂ";s:3:"ⴃ";s:3:"Ⴃ";s:3:"ⴄ";s:3:"Ⴄ";s:3:"ⴅ";s:3:"Ⴅ";s:3:"ⴆ";s:3:"Ⴆ";s:3:"ⴇ";s:3:"Ⴇ";s:3:"ⴈ";s:3:"Ⴈ";s:3:"ⴉ";s:3:"Ⴉ";s:3:"ⴊ";s:3:"Ⴊ";s:3:"ⴋ";s:3:"Ⴋ";s:3:"ⴌ";s:3:"Ⴌ";s:3:"ⴍ";s:3:"Ⴍ";s:3:"ⴎ";s:3:"Ⴎ";s:3:"ⴏ";s:3:"Ⴏ";s:3:"ⴐ";s:3:"Ⴐ";s:3:"ⴑ";s:3:"Ⴑ";s:3:"ⴒ";s:3:"Ⴒ";s:3:"ⴓ";s:3:"Ⴓ";s:3:"ⴔ";s:3:"Ⴔ";s:3:"ⴕ";s:3:"Ⴕ";s:3:"ⴖ";s:3:"Ⴖ";s:3:"ⴗ";s:3:"Ⴗ";s:3:"ⴘ";s:3:"Ⴘ";s:3:"ⴙ";s:3:"Ⴙ";s:3:"ⴚ";s:3:"Ⴚ";s:3:"ⴛ";s:3:"Ⴛ";s:3:"ⴜ";s:3:"Ⴜ";s:3:"ⴝ";s:3:"Ⴝ";s:3:"ⴞ";s:3:"Ⴞ";s:3:"ⴟ";s:3:"Ⴟ";s:3:"ⴠ";s:3:"Ⴠ";s:3:"ⴡ";s:3:"Ⴡ";s:3:"ⴢ";s:3:"Ⴢ";s:3:"ⴣ";s:3:"Ⴣ";s:3:"ⴤ";s:3:"Ⴤ";s:3:"ⴥ";s:3:"Ⴥ";s:3:"ⴧ";s:3:"Ⴧ";s:3:"ⴭ";s:3:"Ⴭ";s:3:"ꙁ";s:3:"Ꙁ";s:3:"ꙃ";s:3:"Ꙃ";s:3:"ꙅ";s:3:"Ꙅ";s:3:"ꙇ";s:3:"Ꙇ";s:3:"ꙉ";s:3:"Ꙉ";s:3:"ꙋ";s:3:"Ꙋ";s:3:"ꙍ";s:3:"Ꙍ";s:3:"ꙏ";s:3:"Ꙏ";s:3:"ꙑ";s:3:"Ꙑ";s:3:"ꙓ";s:3:"Ꙓ";s:3:"ꙕ";s:3:"Ꙕ";s:3:"ꙗ";s:3:"Ꙗ";s:3:"ꙙ";s:3:"Ꙙ";s:3:"ꙛ";s:3:"Ꙛ";s:3:"ꙝ";s:3:"Ꙝ";s:3:"ꙟ";s:3:"Ꙟ";s:3:"ꙡ";s:3:"Ꙡ";s:3:"ꙣ";s:3:"Ꙣ";s:3:"ꙥ";s:3:"Ꙥ";s:3:"ꙧ";s:3:"Ꙧ";s:3:"ꙩ";s:3:"Ꙩ";s:3:"ꙫ";s:3:"Ꙫ";s:3:"ꙭ";s:3:"Ꙭ";s:3:"ꚁ";s:3:"Ꚁ";s:3:"ꚃ";s:3:"Ꚃ";s:3:"ꚅ";s:3:"Ꚅ";s:3:"ꚇ";s:3:"Ꚇ";s:3:"ꚉ";s:3:"Ꚉ";s:3:"ꚋ";s:3:"Ꚋ";s:3:"ꚍ";s:3:"Ꚍ";s:3:"ꚏ";s:3:"Ꚏ";s:3:"ꚑ";s:3:"Ꚑ";s:3:"ꚓ";s:3:"Ꚓ";s:3:"ꚕ";s:3:"Ꚕ";s:3:"ꚗ";s:3:"Ꚗ";s:3:"ꚙ";s:3:"Ꚙ";s:3:"ꚛ";s:3:"Ꚛ";s:3:"ꜣ";s:3:"Ꜣ";s:3:"ꜥ";s:3:"Ꜥ";s:3:"ꜧ";s:3:"Ꜧ";s:3:"ꜩ";s:3:"Ꜩ";s:3:"ꜫ";s:3:"Ꜫ";s:3:"ꜭ";s:3:"Ꜭ";s:3:"ꜯ";s:3:"Ꜯ";s:3:"ꜳ";s:3:"Ꜳ";s:3:"ꜵ";s:3:"Ꜵ";s:3:"ꜷ";s:3:"Ꜷ";s:3:"ꜹ";s:3:"Ꜹ";s:3:"ꜻ";s:3:"Ꜻ";s:3:"ꜽ";s:3:"Ꜽ";s:3:"ꜿ";s:3:"Ꜿ";s:3:"ꝁ";s:3:"Ꝁ";s:3:"ꝃ";s:3:"Ꝃ";s:3:"ꝅ";s:3:"Ꝅ";s:3:"ꝇ";s:3:"Ꝇ";s:3:"ꝉ";s:3:"Ꝉ";s:3:"ꝋ";s:3:"Ꝋ";s:3:"ꝍ";s:3:"Ꝍ";s:3:"ꝏ";s:3:"Ꝏ";s:3:"ꝑ";s:3:"Ꝑ";s:3:"ꝓ";s:3:"Ꝓ";s:3:"ꝕ";s:3:"Ꝕ";s:3:"ꝗ";s:3:"Ꝗ";s:3:"ꝙ";s:3:"Ꝙ";s:3:"ꝛ";s:3:"Ꝛ";s:3:"ꝝ";s:3:"Ꝝ";s:3:"ꝟ";s:3:"Ꝟ";s:3:"ꝡ";s:3:"Ꝡ";s:3:"ꝣ";s:3:"Ꝣ";s:3:"ꝥ";s:3:"Ꝥ";s:3:"ꝧ";s:3:"Ꝧ";s:3:"ꝩ";s:3:"Ꝩ";s:3:"ꝫ";s:3:"Ꝫ";s:3:"ꝭ";s:3:"Ꝭ";s:3:"ꝯ";s:3:"Ꝯ";s:3:"ꝺ";s:3:"Ꝺ";s:3:"ꝼ";s:3:"Ꝼ";s:3:"ꝿ";s:3:"Ꝿ";s:3:"ꞁ";s:3:"Ꞁ";s:3:"ꞃ";s:3:"Ꞃ";s:3:"ꞅ";s:3:"Ꞅ";s:3:"ꞇ";s:3:"Ꞇ";s:3:"ꞌ";s:3:"Ꞌ";s:3:"ꞑ";s:3:"Ꞑ";s:3:"ꞓ";s:3:"Ꞓ";s:3:"ꞗ";s:3:"Ꞗ";s:3:"ꞙ";s:3:"Ꞙ";s:3:"ꞛ";s:3:"Ꞛ";s:3:"ꞝ";s:3:"Ꞝ";s:3:"ꞟ";s:3:"Ꞟ";s:3:"ꞡ";s:3:"Ꞡ";s:3:"ꞣ";s:3:"Ꞣ";s:3:"ꞥ";s:3:"Ꞥ";s:3:"ꞧ";s:3:"Ꞧ";s:3:"ꞩ";s:3:"Ꞩ";s:3:"a";s:3:"A";s:3:"b";s:3:"B";s:3:"c";s:3:"C";s:3:"d";s:3:"D";s:3:"e";s:3:"E";s:3:"f";s:3:"F";s:3:"g";s:3:"G";s:3:"h";s:3:"H";s:3:"i";s:3:"I";s:3:"j";s:3:"J";s:3:"k";s:3:"K";s:3:"l";s:3:"L";s:3:"m";s:3:"M";s:3:"n";s:3:"N";s:3:"o";s:3:"O";s:3:"p";s:3:"P";s:3:"q";s:3:"Q";s:3:"r";s:3:"R";s:3:"s";s:3:"S";s:3:"t";s:3:"T";s:3:"u";s:3:"U";s:3:"v";s:3:"V";s:3:"w";s:3:"W";s:3:"x";s:3:"X";s:3:"y";s:3:"Y";s:3:"z";s:3:"Z";s:4:"𐐨";s:4:"𐐀";s:4:"𐐩";s:4:"𐐁";s:4:"𐐪";s:4:"𐐂";s:4:"𐐫";s:4:"𐐃";s:4:"𐐬";s:4:"𐐄";s:4:"𐐭";s:4:"𐐅";s:4:"𐐮";s:4:"𐐆";s:4:"𐐯";s:4:"𐐇";s:4:"𐐰";s:4:"𐐈";s:4:"𐐱";s:4:"𐐉";s:4:"𐐲";s:4:"𐐊";s:4:"𐐳";s:4:"𐐋";s:4:"𐐴";s:4:"𐐌";s:4:"𐐵";s:4:"𐐍";s:4:"𐐶";s:4:"𐐎";s:4:"𐐷";s:4:"𐐏";s:4:"𐐸";s:4:"𐐐";s:4:"𐐹";s:4:"𐐑";s:4:"𐐺";s:4:"𐐒";s:4:"𐐻";s:4:"𐐓";s:4:"𐐼";s:4:"𐐔";s:4:"𐐽";s:4:"𐐕";s:4:"𐐾";s:4:"𐐖";s:4:"𐐿";s:4:"𐐗";s:4:"𐑀";s:4:"𐐘";s:4:"𐑁";s:4:"𐐙";s:4:"𐑂";s:4:"𐐚";s:4:"𐑃";s:4:"𐐛";s:4:"𐑄";s:4:"𐐜";s:4:"𐑅";s:4:"𐐝";s:4:"𐑆";s:4:"𐐞";s:4:"𐑇";s:4:"𐐟";s:4:"𐑈";s:4:"𐐠";s:4:"𐑉";s:4:"𐐡";s:4:"𐑊";s:4:"𐐢";s:4:"𐑋";s:4:"𐐣";s:4:"𐑌";s:4:"𐐤";s:4:"𐑍";s:4:"𐐥";s:4:"𐑎";s:4:"𐐦";s:4:"𐑏";s:4:"𐐧";s:4:"𑣀";s:4:"𑢠";s:4:"𑣁";s:4:"𑢡";s:4:"𑣂";s:4:"𑢢";s:4:"𑣃";s:4:"𑢣";s:4:"𑣄";s:4:"𑢤";s:4:"𑣅";s:4:"𑢥";s:4:"𑣆";s:4:"𑢦";s:4:"𑣇";s:4:"𑢧";s:4:"𑣈";s:4:"𑢨";s:4:"𑣉";s:4:"𑢩";s:4:"𑣊";s:4:"𑢪";s:4:"𑣋";s:4:"𑢫";s:4:"𑣌";s:4:"𑢬";s:4:"𑣍";s:4:"𑢭";s:4:"𑣎";s:4:"𑢮";s:4:"𑣏";s:4:"𑢯";s:4:"𑣐";s:4:"𑢰";s:4:"𑣑";s:4:"𑢱";s:4:"𑣒";s:4:"𑢲";s:4:"𑣓";s:4:"𑢳";s:4:"𑣔";s:4:"𑢴";s:4:"𑣕";s:4:"𑢵";s:4:"𑣖";s:4:"𑢶";s:4:"𑣗";s:4:"𑢷";s:4:"𑣘";s:4:"𑢸";s:4:"𑣙";s:4:"𑢹";s:4:"𑣚";s:4:"𑢺";s:4:"𑣛";s:4:"𑢻";s:4:"𑣜";s:4:"𑢼";s:4:"𑣝";s:4:"𑢽";s:4:"𑣞";s:4:"𑢾";s:4:"𑣟";s:4:"𑢿";}
vendor/symfony/polyfill-mbstring/bootstrap.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Mbstring as p;
13
+
14
+ if (!function_exists('mb_strlen')) {
15
+ define('MB_CASE_UPPER', 0);
16
+ define('MB_CASE_LOWER', 1);
17
+ define('MB_CASE_TITLE', 2);
18
+
19
+ function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
20
+ function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
21
+ function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
22
+ function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
23
+ function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
24
+ function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
25
+ function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
26
+ function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
27
+ function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
28
+ function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
29
+ function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
30
+ function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
31
+ function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
32
+ function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
33
+ function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
34
+ function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
35
+ function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
36
+ function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
37
+ function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
38
+ function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
39
+ function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
40
+ function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
41
+ function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
42
+ function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
43
+ function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
44
+ function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
45
+ function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
46
+ function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
47
+ function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
48
+ function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
49
+ function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
50
+ function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $v0, $a, $b, $c, $d, $e, $f); }
51
+ }
vendor/symfony/polyfill-mbstring/composer.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/polyfill-mbstring",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for the Mbstring extension",
5
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Nicolas Grekas",
11
+ "email": "p@tchwork.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=5.3.3"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
23
+ "files": [ "bootstrap.php" ]
24
+ },
25
+ "suggests": {
26
+ "ext-mbstring": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-master": "1.0-dev"
32
+ }
33
+ }
34
+ }
vendor/symfony/translation/CHANGELOG.md CHANGED
@@ -1,6 +1,28 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  2.7.0
5
  -----
6
 
1
  CHANGELOG
2
  =========
3
 
4
+ 3.0.0
5
+ -----
6
+
7
+ * removed `FileDumper::format()` method.
8
+ * Changed the visibility of the locale property in `Translator` from protected to private.
9
+
10
+ 2.8.0
11
+ -----
12
+
13
+ * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead.
14
+ * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead.
15
+ * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file.
16
+ * added option `json_encoding` to JsonFileDumper
17
+ * added options `as_tree`, `inline` to YamlFileDumper
18
+ * added support for XLIFF 2.0.
19
+ * added support for XLIFF target and tool attributes.
20
+ * added message parameters to DataCollectorTranslator.
21
+ * [DEPRECATION] The `DiffOperation` class has been deprecated and
22
+ will be removed in Symfony 3.0, since its operation has nothing to do with 'diff',
23
+ so the class name is misleading. The `TargetOperation` class should be used for
24
+ this use-case instead.
25
+
26
  2.7.0
27
  -----
28
 
vendor/symfony/translation/Catalogue/AbstractOperation.php CHANGED
@@ -17,38 +17,60 @@ use Symfony\Component\Translation\MessageCatalogueInterface;
17
  /**
18
  * Base catalogues binary operation class.
19
  *
 
 
 
20
  * @author Jean-François Simon <contact@jfsimon.fr>
21
  */
22
  abstract class AbstractOperation implements OperationInterface
23
  {
24
  /**
25
- * @var MessageCatalogueInterface
26
  */
27
  protected $source;
28
 
29
  /**
30
- * @var MessageCatalogueInterface
31
  */
32
  protected $target;
33
 
34
  /**
35
- * @var MessageCatalogue
36
  */
37
  protected $result;
38
 
39
  /**
40
- * @var null|array
41
  */
42
  private $domains;
43
 
44
  /**
45
- * @var array
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  */
47
  protected $messages;
48
 
49
  /**
50
- * @param MessageCatalogueInterface $source
51
- * @param MessageCatalogueInterface $target
52
  *
53
  * @throws \LogicException
54
  */
@@ -140,7 +162,10 @@ abstract class AbstractOperation implements OperationInterface
140
  }
141
 
142
  /**
143
- * @param string $domain
 
 
 
144
  */
145
  abstract protected function processDomain($domain);
146
  }
17
  /**
18
  * Base catalogues binary operation class.
19
  *
20
+ * A catalogue binary operation performs operation on
21
+ * source (the left argument) and target (the right argument) catalogues.
22
+ *
23
  * @author Jean-François Simon <contact@jfsimon.fr>
24
  */
25
  abstract class AbstractOperation implements OperationInterface
26
  {
27
  /**
28
+ * @var MessageCatalogueInterface The source catalogue
29
  */
30
  protected $source;
31
 
32
  /**
33
+ * @var MessageCatalogueInterface The target catalogue
34
  */
35
  protected $target;
36
 
37
  /**
38
+ * @var MessageCatalogue The result catalogue
39
  */
40
  protected $result;
41
 
42
  /**
43
+ * @var null|array The domains affected by this operation
44
  */
45
  private $domains;
46
 
47
  /**
48
+ * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
49
+ *
50
+ * The data structure of this array is as follows:
51
+ * ```php
52
+ * array(
53
+ * 'domain 1' => array(
54
+ * 'all' => array(...),
55
+ * 'new' => array(...),
56
+ * 'obsolete' => array(...)
57
+ * ),
58
+ * 'domain 2' => array(
59
+ * 'all' => array(...),
60
+ * 'new' => array(...),
61
+ * 'obsolete' => array(...)
62
+ * ),
63
+ * ...
64
+ * )
65
+ * ```
66
+ *
67
+ * @var array The array that stores 'all', 'new' and 'obsolete' messages
68
  */
69
  protected $messages;
70
 
71
  /**
72
+ * @param MessageCatalogueInterface $source The source catalogue
73
+ * @param MessageCatalogueInterface $target The target catalogue
74
  *
75
  * @throws \LogicException
76
  */
162
  }
163
 
164
  /**
165
+ * Performs operation on source and target catalogues for the given domain and
166
+ * stores the results.
167
+ *
168
+ * @param string $domain The domain which the operation will be performed for
169
  */
170
  abstract protected function processDomain($domain);
171
  }
vendor/symfony/translation/Catalogue/MergeOperation.php CHANGED
@@ -12,7 +12,11 @@
12
  namespace Symfony\Component\Translation\Catalogue;
13
 
14
  /**
15
- * Merge operation between two catalogues.
 
 
 
 
16
  *
17
  * @author Jean-François Simon <contact@jfsimon.fr>
18
  */
12
  namespace Symfony\Component\Translation\Catalogue;
13
 
14
  /**
15
+ * Merge operation between two catalogues as follows:
16
+ * all = source ∪ target = {x: x ∈ source ∨ x ∈ target}
17
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
18
+ * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅
19
+ * Basically, the result contains messages from both catalogues.
20
  *
21
  * @author Jean-François Simon <contact@jfsimon.fr>
22
  */
vendor/symfony/translation/Catalogue/OperationInterface.php CHANGED
@@ -16,6 +16,20 @@ use Symfony\Component\Translation\MessageCatalogueInterface;
16
  /**
17
  * Represents an operation on catalogue(s).
18
  *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
20
  */
21
  interface OperationInterface
@@ -28,7 +42,7 @@ interface OperationInterface
28
  public function getDomains();
29
 
30
  /**
31
- * Returns all valid messages after operation.
32
  *
33
  * @param string $domain
34
  *
@@ -37,7 +51,7 @@ interface OperationInterface
37
  public function getMessages($domain);
38
 
39
  /**
40
- * Returns new messages after operation.
41
  *
42
  * @param string $domain
43
  *
@@ -46,7 +60,7 @@ interface OperationInterface
46
  public function getNewMessages($domain);
47
 
48
  /**
49
- * Returns obsolete messages after operation.
50
  *
51
  * @param string $domain
52
  *
@@ -55,7 +69,7 @@ interface OperationInterface
55
  public function getObsoleteMessages($domain);
56
 
57
  /**
58
- * Returns resulting catalogue.
59
  *
60
  * @return MessageCatalogueInterface
61
  */
16
  /**
17
  * Represents an operation on catalogue(s).
18
  *
19
+ * An instance of this interface performs an operation on one or more catalogues and
20
+ * stores intermediate and final results of the operation.
21
+ *
22
+ * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and
23
+ * the following results are stored:
24
+ *
25
+ * Messages: also called 'all', are valid messages for the given domain after the operation is performed.
26
+ *
27
+ * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}).
28
+ *
29
+ * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}).
30
+ *
31
+ * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'.
32
+ *
33
  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
34
  */
35
  interface OperationInterface
42
  public function getDomains();
43
 
44
  /**
45
+ * Returns all valid messages ('all') after operation.
46
  *
47
  * @param string $domain
48
  *
51
  public function getMessages($domain);
52
 
53
  /**
54
+ * Returns new messages ('new') after operation.
55
  *
56
  * @param string $domain
57
  *
60
  public function getNewMessages($domain);
61
 
62
  /**
63
+ * Returns obsolete messages ('obsolete') after operation.
64
  *
65
  * @param string $domain
66
  *
69
  public function getObsoleteMessages($domain);
70
 
71
  /**
72
+ * Returns resulting catalogue ('result').
73
  *
74
  * @return MessageCatalogueInterface
75
  */
vendor/symfony/translation/Catalogue/{DiffOperation.php → TargetOperation.php} RENAMED
@@ -12,11 +12,16 @@
12
  namespace Symfony\Component\Translation\Catalogue;
13
 
14
  /**
15
- * Diff operation between two catalogues.
 
 
 
 
 
16
  *
17
- * @author Jean-François Simon <contact@jfsimon.fr>
18
  */
19
- class DiffOperation extends AbstractOperation
20
  {
21
  /**
22
  * {@inheritdoc}
@@ -29,6 +34,15 @@ class DiffOperation extends AbstractOperation
29
  'obsolete' => array(),
30
  );
31
 
 
 
 
 
 
 
 
 
 
32
  foreach ($this->source->all($domain) as $id => $message) {
33
  if ($this->target->has($id, $domain)) {
34
  $this->messages[$domain]['all'][$id] = $message;
12
  namespace Symfony\Component\Translation\Catalogue;
13
 
14
  /**
15
+ * Target operation between two catalogues:
16
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
17
+ * all = intersection ∪ (target ∖ intersection) = target
18
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
19
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
20
+ * Basically, the result contains messages from the target catalogue.
21
  *
22
+ * @author Michael Lee <michael.lee@zerustech.com>
23
  */
24
+ class TargetOperation extends AbstractOperation
25
  {
26
  /**
27
  * {@inheritdoc}
34
  'obsolete' => array(),
35
  );
36
 
37
+ // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``,
38
+ // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
39
+ //
40
+ // For 'new' messages, the code can't be simplied as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));``
41
+ // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback}
42
+ //
43
+ // For 'obsolete' messages, the code can't be simplifed as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))``
44
+ // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
45
+
46
  foreach ($this->source->all($domain) as $id => $message) {
47
  if ($this->target->has($id, $domain)) {
48
  $this->messages[$domain]['all'][$id] = $message;
vendor/symfony/translation/DataCollector/TranslationDataCollector.php CHANGED
@@ -101,9 +101,14 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto
101
 
102
  if (!isset($result[$messageId])) {
103
  $message['count'] = 1;
 
104
  $messages[$key]['translation'] = $this->sanitizeString($message['translation']);
105
  $result[$messageId] = $message;
106
  } else {
 
 
 
 
107
  ++$result[$messageId]['count'];
108
  }
109
 
@@ -132,7 +137,7 @@ class TranslationDataCollector extends DataCollector implements LateDataCollecto
132
  {
133
  $string = trim(preg_replace('/\s+/', ' ', $string));
134
 
135
- if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($string)) {
136
  if (mb_strlen($string, $encoding) > $length) {
137
  return mb_substr($string, 0, $length - 3, $encoding).'...';
138
  }
101
 
102
  if (!isset($result[$messageId])) {
103
  $message['count'] = 1;
104
+ $message['parameters'] = !empty($message['parameters']) ? array($message['parameters']) : array();
105
  $messages[$key]['translation'] = $this->sanitizeString($message['translation']);
106
  $result[$messageId] = $message;
107
  } else {
108
+ if (!empty($message['parameters'])) {
109
+ $result[$messageId]['parameters'][] = $message['parameters'];
110
+ }
111
+
112
  ++$result[$messageId]['count'];
113
  }
114
 
137
  {
138
  $string = trim(preg_replace('/\s+/', ' ', $string));
139
 
140
+ if (false !== $encoding = mb_detect_encoding($string, null, true)) {
141
  if (mb_strlen($string, $encoding) > $length) {
142
  return mb_substr($string, 0, $length - 3, $encoding).'...';
143
  }
vendor/symfony/translation/DataCollectorTranslator.php CHANGED
@@ -48,7 +48,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter
48
  public function trans($id, array $parameters = array(), $domain = null, $locale = null)
49
  {
50
  $trans = $this->translator->trans($id, $parameters, $domain, $locale);
51
- $this->collectMessage($locale, $domain, $id, $trans);
52
 
53
  return $trans;
54
  }
@@ -59,7 +59,7 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter
59
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
60
  {
61
  $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
62
- $this->collectMessage($locale, $domain, $id, $trans);
63
 
64
  return $trans;
65
  }
@@ -108,9 +108,11 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter
108
  * @param string|null $locale
109
  * @param string|null $domain
110
  * @param string $id
111
- * @param string $trans
 
 
112
  */
113
- private function collectMessage($locale, $domain, $id, $translation)
114
  {
115
  if (null === $domain) {
116
  $domain = 'messages';
@@ -142,6 +144,8 @@ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInter
142
  'domain' => $domain,
143
  'id' => $id,
144
  'translation' => $translation,
 
 
145
  'state' => $state,
146
  );
147
  }
48
  public function trans($id, array $parameters = array(), $domain = null, $locale = null)
49
  {
50
  $trans = $this->translator->trans($id, $parameters, $domain, $locale);
51
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters);
52
 
53
  return $trans;
54
  }
59
  public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
60
  {
61
  $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
62
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number);
63
 
64
  return $trans;
65
  }
108
  * @param string|null $locale
109
  * @param string|null $domain
110
  * @param string $id
111
+ * @param string $translation
112
+ * @param array|null $parameters
113
+ * @param int|null $number
114
  */
115
+ private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null)
116
  {
117
  if (null === $domain) {
118
  $domain = 'messages';
144
  'domain' => $domain,
145
  'id' => $id,
146
  'translation' => $translation,
147
+ 'parameters' => $parameters,
148
+ 'transChoiceNumber' => $number,
149
  'state' => $state,
150
  );
151
  }
vendor/symfony/translation/Dumper/CsvFileDumper.php CHANGED
@@ -26,7 +26,7 @@ class CsvFileDumper extends FileDumper
26
  /**
27
  * {@inheritdoc}
28
  */
29
- public function format(MessageCatalogue $messages, $domain = 'messages')
30
  {
31
  $handle = fopen('php://memory', 'rb+');
32
 
26
  /**
27
  * {@inheritdoc}
28
  */
29
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
30
  {
31
  $handle = fopen('php://memory', 'rb+');
32
 
vendor/symfony/translation/Dumper/FileDumper.php CHANGED
@@ -82,7 +82,7 @@ abstract class FileDumper implements DumperInterface
82
  }
83
  }
84
  // save file
85
- file_put_contents($fullpath, $this->format($messages, $domain));
86
  }
87
  }
88
 
@@ -91,10 +91,11 @@ abstract class FileDumper implements DumperInterface
91
  *
92
  * @param MessageCatalogue $messages
93
  * @param string $domain
 
94
  *
95
  * @return string representation
96
  */
97
- abstract protected function format(MessageCatalogue $messages, $domain);
98
 
99
  /**
100
  * Gets the file extension of the dumper.
82
  }
83
  }
84
  // save file
85
+ file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));
86
  }
87
  }
88
 
91
  *
92
  * @param MessageCatalogue $messages
93
  * @param string $domain
94
+ * @param array $options
95
  *
96
  * @return string representation
97
  */
98
+ abstract public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array());
99
 
100
  /**
101
  * Gets the file extension of the dumper.
vendor/symfony/translation/Dumper/IcuResFileDumper.php CHANGED
@@ -28,7 +28,7 @@ class IcuResFileDumper extends FileDumper
28
  /**
29
  * {@inheritdoc}
30
  */
31
- public function format(MessageCatalogue $messages, $domain = 'messages')
32
  {
33
  $data = $indexes = $resources = '';
34
 
28
  /**
29
  * {@inheritdoc}
30
  */
31
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
32
  {
33
  $data = $indexes = $resources = '';
34
 
vendor/symfony/translation/Dumper/IniFileDumper.php CHANGED
@@ -23,7 +23,7 @@ class IniFileDumper extends FileDumper
23
  /**
24
  * {@inheritdoc}
25
  */
26
- public function format(MessageCatalogue $messages, $domain = 'messages')
27
  {
28
  $output = '';
29
 
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
  $output = '';
29
 
vendor/symfony/translation/Dumper/JsonFileDumper.php CHANGED
@@ -23,9 +23,15 @@ class JsonFileDumper extends FileDumper
23
  /**
24
  * {@inheritdoc}
25
  */
26
- public function format(MessageCatalogue $messages, $domain = 'messages')
27
  {
28
- return json_encode($messages->all($domain), defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0);
 
 
 
 
 
 
29
  }
30
 
31
  /**
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
+ if (isset($options['json_encoding'])) {
29
+ $flags = $options['json_encoding'];
30
+ } else {
31
+ $flags = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0;
32
+ }
33
+
34
+ return json_encode($messages->all($domain), $flags);
35
  }
36
 
37
  /**
vendor/symfony/translation/Dumper/MoFileDumper.php CHANGED
@@ -24,7 +24,7 @@ class MoFileDumper extends FileDumper
24
  /**
25
  * {@inheritdoc}
26
  */
27
- public function format(MessageCatalogue $messages, $domain = 'messages')
28
  {
29
  $output = $sources = $targets = $sourceOffsets = $targetOffsets = '';
30
  $offsets = array();
24
  /**
25
  * {@inheritdoc}
26
  */
27
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
28
  {
29
  $output = $sources = $targets = $sourceOffsets = $targetOffsets = '';
30
  $offsets = array();
vendor/symfony/translation/Dumper/PhpFileDumper.php CHANGED
@@ -23,7 +23,7 @@ class PhpFileDumper extends FileDumper
23
  /**
24
  * {@inheritdoc}
25
  */
26
- protected function format(MessageCatalogue $messages, $domain)
27
  {
28
  $output = "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n";
29
 
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
  $output = "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n";
29
 
vendor/symfony/translation/Dumper/PoFileDumper.php CHANGED
@@ -23,7 +23,7 @@ class PoFileDumper extends FileDumper
23
  /**
24
  * {@inheritdoc}
25
  */
26
- public function format(MessageCatalogue $messages, $domain = 'messages')
27
  {
28
  $output = 'msgid ""'."\n";
29
  $output .= 'msgstr ""'."\n";
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
  $output = 'msgid ""'."\n";
29
  $output .= 'msgstr ""'."\n";
vendor/symfony/translation/Dumper/QtFileDumper.php CHANGED
@@ -23,7 +23,7 @@ class QtFileDumper extends FileDumper
23
  /**
24
  * {@inheritdoc}
25
  */
26
- public function format(MessageCatalogue $messages, $domain)
27
  {
28
  $dom = new \DOMDocument('1.0', 'utf-8');
29
  $dom->formatOutput = true;
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
  $dom = new \DOMDocument('1.0', 'utf-8');
29
  $dom->formatOutput = true;
vendor/symfony/translation/Dumper/XliffFileDumper.php CHANGED
@@ -20,30 +20,47 @@ use Symfony\Component\Translation\MessageCatalogue;
20
  */
21
  class XliffFileDumper extends FileDumper
22
  {
23
- /**
24
- * @var string
25
- */
26
- private $defaultLocale;
27
-
28
  /**
29
  * {@inheritdoc}
30
  */
31
- public function dump(MessageCatalogue $messages, $options = array())
32
  {
 
 
 
 
 
33
  if (array_key_exists('default_locale', $options)) {
34
- $this->defaultLocale = $options['default_locale'];
35
  } else {
36
- $this->defaultLocale = \Locale::getDefault();
37
  }
38
 
39
- parent::dump($messages, $options);
 
 
 
 
 
 
 
40
  }
41
 
42
  /**
43
  * {@inheritdoc}
44
  */
45
- protected function format(MessageCatalogue $messages, $domain)
 
 
 
 
 
46
  {
 
 
 
 
 
47
  $dom = new \DOMDocument('1.0', 'utf-8');
48
  $dom->formatOutput = true;
49
 
@@ -52,11 +69,17 @@ class XliffFileDumper extends FileDumper
52
  $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
53
 
54
  $xliffFile = $xliff->appendChild($dom->createElement('file'));
55
- $xliffFile->setAttribute('source-language', str_replace('_', '-', $this->defaultLocale));
56
  $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
57
  $xliffFile->setAttribute('datatype', 'plaintext');
58
  $xliffFile->setAttribute('original', 'file.ext');
59
 
 
 
 
 
 
 
60
  $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
61
  foreach ($messages->all($domain) as $source => $target) {
62
  $translation = $dom->createElement('trans-unit');
@@ -70,11 +93,17 @@ class XliffFileDumper extends FileDumper
70
  // Does the target contain characters requiring a CDATA section?
71
  $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
72
 
73
- $t = $translation->appendChild($dom->createElement('target'));
 
 
 
 
 
 
 
74
  $t->appendChild($text);
75
 
76
- $metadata = $messages->getMetadata($source, $domain);
77
- if (null !== $metadata && array_key_exists('notes', $metadata) && is_array($metadata['notes'])) {
78
  foreach ($metadata['notes'] as $note) {
79
  if (!isset($note['content'])) {
80
  continue;
@@ -99,11 +128,56 @@ class XliffFileDumper extends FileDumper
99
  return $dom->saveXML();
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  /**
103
- * {@inheritdoc}
 
 
 
104
  */
105
- protected function getExtension()
106
  {
107
- return 'xlf';
108
  }
109
  }
20
  */
21
  class XliffFileDumper extends FileDumper
22
  {
 
 
 
 
 
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
27
  {
28
+ $xliffVersion = '1.2';
29
+ if (array_key_exists('xliff_version', $options)) {
30
+ $xliffVersion = $options['xliff_version'];
31
+ }
32
+
33
  if (array_key_exists('default_locale', $options)) {
34
+ $defaultLocale = $options['default_locale'];
35
  } else {
36
+ $defaultLocale = \Locale::getDefault();
37
  }
38
 
39
+ if ('1.2' === $xliffVersion) {
40
+ return $this->dumpXliff1($defaultLocale, $messages, $domain, $options);
41
+ }
42
+ if ('2.0' === $xliffVersion) {
43
+ return $this->dumpXliff2($defaultLocale, $messages, $domain, $options);
44
+ }
45
+
46
+ throw new \InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
47
  }
48
 
49
  /**
50
  * {@inheritdoc}
51
  */
52
+ protected function getExtension()
53
+ {
54
+ return 'xlf';
55
+ }
56
+
57
+ private function dumpXliff1($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
58
  {
59
+ $toolInfo = array('tool-id' => 'symfony', 'tool-name' => 'Symfony');
60
+ if (array_key_exists('tool_info', $options)) {
61
+ $toolInfo = array_merge($toolInfo, $options['tool_info']);
62
+ }
63
+
64
  $dom = new \DOMDocument('1.0', 'utf-8');
65
  $dom->formatOutput = true;
66
 
69
  $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
70
 
71
  $xliffFile = $xliff->appendChild($dom->createElement('file'));
72
+ $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale));
73
  $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
74
  $xliffFile->setAttribute('datatype', 'plaintext');
75
  $xliffFile->setAttribute('original', 'file.ext');
76
 
77
+ $xliffHead = $xliffFile->appendChild($dom->createElement('header'));
78
+ $xliffTool = $xliffHead->appendChild($dom->createElement('tool'));
79
+ foreach ($toolInfo as $id => $value) {
80
+ $xliffTool->setAttribute($id, $value);
81
+ }
82
+
83
  $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
84
  foreach ($messages->all($domain) as $source => $target) {
85
  $translation = $dom->createElement('trans-unit');
93
  // Does the target contain characters requiring a CDATA section?
94
  $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
95
 
96
+ $targetElement = $dom->createElement('target');
97
+ $metadata = $messages->getMetadata($source, $domain);
98
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
99
+ foreach ($metadata['target-attributes'] as $name => $value) {
100
+ $targetElement->setAttribute($name, $value);
101
+ }
102
+ }
103
+ $t = $translation->appendChild($targetElement);
104
  $t->appendChild($text);
105
 
106
+ if ($this->hasMetadataArrayInfo('notes', $metadata)) {
 
107
  foreach ($metadata['notes'] as $note) {
108
  if (!isset($note['content'])) {
109
  continue;
128
  return $dom->saveXML();
129
  }
130
 
131
+ private function dumpXliff2($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
132
+ {
133
+ $dom = new \DOMDocument('1.0', 'utf-8');
134
+ $dom->formatOutput = true;
135
+
136
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
137
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0');
138
+ $xliff->setAttribute('version', '2.0');
139
+ $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale));
140
+ $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale()));
141
+
142
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
143
+ $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale());
144
+
145
+ foreach ($messages->all($domain) as $source => $target) {
146
+ $translation = $dom->createElement('unit');
147
+ $translation->setAttribute('id', md5($source));
148
+
149
+ $segment = $translation->appendChild($dom->createElement('segment'));
150
+
151
+ $s = $segment->appendChild($dom->createElement('source'));
152
+ $s->appendChild($dom->createTextNode($source));
153
+
154
+ // Does the target contain characters requiring a CDATA section?
155
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
156
+
157
+ $targetElement = $dom->createElement('target');
158
+ $metadata = $messages->getMetadata($source, $domain);
159
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
160
+ foreach ($metadata['target-attributes'] as $name => $value) {
161
+ $targetElement->setAttribute($name, $value);
162
+ }
163
+ }
164
+ $t = $segment->appendChild($targetElement);
165
+ $t->appendChild($text);
166
+
167
+ $xliffFile->appendChild($translation);
168
+ }
169
+
170
+ return $dom->saveXML();
171
+ }
172
+
173
  /**
174
+ * @param string $key
175
+ * @param array|null $metadata
176
+ *
177
+ * @return bool
178
  */
179
+ private function hasMetadataArrayInfo($key, $metadata = null)
180
  {
181
+ return null !== $metadata && array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || is_array($metadata[$key]));
182
  }
183
  }
vendor/symfony/translation/Dumper/YamlFileDumper.php CHANGED
@@ -12,6 +12,7 @@
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
 
15
  use Symfony\Component\Yaml\Yaml;
16
 
17
  /**
@@ -24,13 +25,23 @@ class YamlFileDumper extends FileDumper
24
  /**
25
  * {@inheritdoc}
26
  */
27
- protected function format(MessageCatalogue $messages, $domain)
28
  {
29
  if (!class_exists('Symfony\Component\Yaml\Yaml')) {
30
  throw new \LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
31
  }
32
 
33
- return Yaml::dump($messages->all($domain));
 
 
 
 
 
 
 
 
 
 
34
  }
35
 
36
  /**
12
  namespace Symfony\Component\Translation\Dumper;
13
 
14
  use Symfony\Component\Translation\MessageCatalogue;
15
+ use Symfony\Component\Translation\Util\ArrayConverter;
16
  use Symfony\Component\Yaml\Yaml;
17
 
18
  /**
25
  /**
26
  * {@inheritdoc}
27
  */
28
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
29
  {
30
  if (!class_exists('Symfony\Component\Yaml\Yaml')) {
31
  throw new \LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
32
  }
33
 
34
+ $data = $messages->all($domain);
35
+
36
+ if (isset($options['as_tree']) && $options['as_tree']) {
37
+ $data = ArrayConverter::expandToTree($data);
38
+ }
39
+
40
+ if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) {
41
+ return Yaml::dump($data, $inline);
42
+ }
43
+
44
+ return Yaml::dump($data);
45
  }
46
 
47
  /**
vendor/symfony/translation/Loader/CsvFileLoader.php CHANGED
@@ -11,16 +11,14 @@
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidResourceException;
15
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
 
18
  /**
19
  * CsvFileLoader loads translations from CSV files.
20
  *
21
  * @author Saša Stamenković <umpirsky@gmail.com>
22
  */
23
- class CsvFileLoader extends ArrayLoader
24
  {
25
  private $delimiter = ';';
26
  private $enclosure = '"';
@@ -29,16 +27,8 @@ class CsvFileLoader extends ArrayLoader
29
  /**
30
  * {@inheritdoc}
31
  */
32
- public function load($resource, $locale, $domain = 'messages')
33
  {
34
- if (!stream_is_local($resource)) {
35
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
36
- }
37
-
38
- if (!file_exists($resource)) {
39
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
40
- }
41
-
42
  $messages = array();
43
 
44
  try {
@@ -56,13 +46,7 @@ class CsvFileLoader extends ArrayLoader
56
  }
57
  }
58
 
59
- $catalogue = parent::load($messages, $locale, $domain);
60
-
61
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
62
- $catalogue->addResource(new FileResource($resource));
63
- }
64
-
65
- return $catalogue;
66
  }
67
 
68
  /**
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
 
14
  use Symfony\Component\Translation\Exception\NotFoundResourceException;
 
15
 
16
  /**
17
  * CsvFileLoader loads translations from CSV files.
18
  *
19
  * @author Saša Stamenković <umpirsky@gmail.com>
20
  */
21
+ class CsvFileLoader extends FileLoader
22
  {
23
  private $delimiter = ';';
24
  private $enclosure = '"';
27
  /**
28
  * {@inheritdoc}
29
  */
30
+ protected function loadResource($resource)
31
  {
 
 
 
 
 
 
 
 
32
  $messages = array();
33
 
34
  try {
46
  }
47
  }
48
 
49
+ return $messages;
 
 
 
 
 
 
50
  }
51
 
52
  /**
vendor/symfony/translation/Loader/FileLoader.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Translation\Loader;
13
+
14
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
15
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
+ use Symfony\Component\Config\Resource\FileResource;
17
+
18
+ /**
19
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
20
+ */
21
+ abstract class FileLoader extends ArrayLoader
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function load($resource, $locale, $domain = 'messages')
27
+ {
28
+ if (!stream_is_local($resource)) {
29
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
30
+ }
31
+
32
+ if (!file_exists($resource)) {
33
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
34
+ }
35
+
36
+ $messages = $this->loadResource($resource);
37
+
38
+ // empty resource
39
+ if (null === $messages) {
40
+ $messages = array();
41
+ }
42
+
43
+ // not an array
44
+ if (!is_array($messages)) {
45
+ throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource));
46
+ }
47
+
48
+ $catalogue = parent::load($messages, $locale, $domain);
49
+
50
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
51
+ $catalogue->addResource(new FileResource($resource));
52
+ }
53
+
54
+ return $catalogue;
55
+ }
56
+
57
+ /*
58
+ * @param string $resource
59
+ *
60
+ * @return array
61
+ *
62
+ * @throws InvalidResourceException If stream content has an invalid format.
63
+ */
64
+ abstract protected function loadResource($resource);
65
+ }
vendor/symfony/translation/Loader/IniFileLoader.php CHANGED
@@ -11,38 +11,18 @@
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
-
18
  /**
19
  * IniFileLoader loads translations from an ini file.
20
  *
21
  * @author stealth35
22
  */
23
- class IniFileLoader extends ArrayLoader
24
  {
25
  /**
26
  * {@inheritdoc}
27
  */
28
- public function load($resource, $locale, $domain = 'messages')
29
  {
30
- if (!stream_is_local($resource)) {
31
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
32
- }
33
-
34
- if (!file_exists($resource)) {
35
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
36
- }
37
-
38
- $messages = parse_ini_file($resource, true);
39
-
40
- $catalogue = parent::load($messages, $locale, $domain);
41
-
42
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
43
- $catalogue->addResource(new FileResource($resource));
44
- }
45
-
46
- return $catalogue;
47
  }
48
  }
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
 
 
 
 
14
  /**
15
  * IniFileLoader loads translations from an ini file.
16
  *
17
  * @author stealth35
18
  */
19
+ class IniFileLoader extends FileLoader
20
  {
21
  /**
22
  * {@inheritdoc}
23
  */
24
+ protected function loadResource($resource)
25
  {
26
+ return parse_ini_file($resource, true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  }
28
  }
vendor/symfony/translation/Loader/JsonFileLoader.php CHANGED
@@ -12,29 +12,19 @@
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
 
18
  /**
19
  * JsonFileLoader loads translations from an json file.
20
  *
21
  * @author singles
22
  */
23
- class JsonFileLoader extends ArrayLoader
24
  {
25
  /**
26
  * {@inheritdoc}
27
  */
28
- public function load($resource, $locale, $domain = 'messages')
29
  {
30
- if (!stream_is_local($resource)) {
31
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
32
- }
33
-
34
- if (!file_exists($resource)) {
35
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
36
- }
37
-
38
  $messages = array();
39
  if ($data = file_get_contents($resource)) {
40
  $messages = json_decode($data, true);
@@ -44,14 +34,7 @@ class JsonFileLoader extends ArrayLoader
44
  }
45
  }
46
 
47
- if (null === $messages) {
48
- $messages = array();
49
- }
50
-
51
- $catalogue = parent::load($messages, $locale, $domain);
52
- $catalogue->addResource(new FileResource($resource));
53
-
54
- return $catalogue;
55
  }
56
 
57
  /**
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
 
 
15
 
16
  /**
17
  * JsonFileLoader loads translations from an json file.
18
  *
19
  * @author singles
20
  */
21
+ class JsonFileLoader extends FileLoader
22
  {
23
  /**
24
  * {@inheritdoc}
25
  */
26
+ protected function loadResource($resource)
27
  {
 
 
 
 
 
 
 
 
28
  $messages = array();
29
  if ($data = file_get_contents($resource)) {
30
  $messages = json_decode($data, true);
34
  }
35
  }
36
 
37
+ return $messages;
 
 
 
 
 
 
 
38
  }
39
 
40
  /**
vendor/symfony/translation/Loader/MoFileLoader.php CHANGED
@@ -12,13 +12,11 @@
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
 
18
  /**
19
  * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
20
  */
21
- class MoFileLoader extends ArrayLoader
22
  {
23
  /**
24
  * Magic used for validating the format of a MO file as well as
@@ -43,48 +41,13 @@ class MoFileLoader extends ArrayLoader
43
  */
44
  const MO_HEADER_SIZE = 28;
45
 
46
- public function load($resource, $locale, $domain = 'messages')
47
- {
48
- if (!stream_is_local($resource)) {
49
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
50
- }
51
-
52
- if (!file_exists($resource)) {
53
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
54
- }
55
-
56
- $messages = $this->parse($resource);
57
-
58
- // empty file
59
- if (null === $messages) {
60
- $messages = array();
61
- }
62
-
63
- // not an array
64
- if (!is_array($messages)) {
65
- throw new InvalidResourceException(sprintf('The file "%s" must contain a valid mo file.', $resource));
66
- }
67
-
68
- $catalogue = parent::load($messages, $locale, $domain);
69
-
70
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
71
- $catalogue->addResource(new FileResource($resource));
72
- }
73
-
74
- return $catalogue;
75
- }
76
-
77
  /**
78
  * Parses machine object (MO) format, independent of the machine's endian it
79
  * was created on. Both 32bit and 64bit systems are supported.
80
  *
81
- * @param resource $resource
82
- *
83
- * @return array
84
- *
85
- * @throws InvalidResourceException If stream content has an invalid format.
86
  */
87
- private function parse($resource)
88
  {
89
  $stream = fopen($resource, 'r');
90
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
 
 
15
 
16
  /**
17
  * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
18
  */
19
+ class MoFileLoader extends FileLoader
20
  {
21
  /**
22
  * Magic used for validating the format of a MO file as well as
41
  */
42
  const MO_HEADER_SIZE = 28;
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  /**
45
  * Parses machine object (MO) format, independent of the machine's endian it
46
  * was created on. Both 32bit and 64bit systems are supported.
47
  *
48
+ * {@inheritdoc}
 
 
 
 
49
  */
50
+ protected function loadResource($resource)
51
  {
52
  $stream = fopen($resource, 'r');
53
 
vendor/symfony/translation/Loader/PhpFileLoader.php CHANGED
@@ -11,38 +11,18 @@
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
-
18
  /**
19
  * PhpFileLoader loads translations from PHP files returning an array of translations.
20
  *
21
  * @author Fabien Potencier <fabien@symfony.com>
22
  */
23
- class PhpFileLoader extends ArrayLoader
24
  {
25
  /**
26
  * {@inheritdoc}
27
  */
28
- public function load($resource, $locale, $domain = 'messages')
29
  {
30
- if (!stream_is_local($resource)) {
31
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
32
- }
33
-
34
- if (!file_exists($resource)) {
35
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
36
- }
37
-
38
- $messages = require $resource;
39
-
40
- $catalogue = parent::load($messages, $locale, $domain);
41
-
42
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
43
- $catalogue->addResource(new FileResource($resource));
44
- }
45
-
46
- return $catalogue;
47
  }
48
  }
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
 
 
 
 
14
  /**
15
  * PhpFileLoader loads translations from PHP files returning an array of translations.
16
  *
17
  * @author Fabien Potencier <fabien@symfony.com>
18
  */
19
+ class PhpFileLoader extends FileLoader
20
  {
21
  /**
22
  * {@inheritdoc}
23
  */
24
+ protected function loadResource($resource)
25
  {
26
+ return require $resource;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  }
28
  }
vendor/symfony/translation/Loader/PoFileLoader.php CHANGED
@@ -11,47 +11,12 @@
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
- use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
-
18
  /**
19
  * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
20
  * @copyright Copyright (c) 2012, Clemens Tolboom
21
  */
22
- class PoFileLoader extends ArrayLoader
23
  {
24
- public function load($resource, $locale, $domain = 'messages')
25
- {
26
- if (!stream_is_local($resource)) {
27
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
28
- }
29
-
30
- if (!file_exists($resource)) {
31
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
32
- }
33
-
34
- $messages = $this->parse($resource);
35
-
36
- // empty file
37
- if (null === $messages) {
38
- $messages = array();
39
- }
40
-
41
- // not an array
42
- if (!is_array($messages)) {
43
- throw new InvalidResourceException(sprintf('The file "%s" must contain a valid po file.', $resource));
44
- }
45
-
46
- $catalogue = parent::load($messages, $locale, $domain);
47
-
48
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
49
- $catalogue->addResource(new FileResource($resource));
50
- }
51
-
52
- return $catalogue;
53
- }
54
-
55
  /**
56
  * Parses portable object (PO) format.
57
  *
@@ -93,11 +58,9 @@ class PoFileLoader extends ArrayLoader
93
  *
94
  * Items with an empty id are ignored.
95
  *
96
- * @param resource $resource
97
- *
98
- * @return array
99
  */
100
- private function parse($resource)
101
  {
102
  $stream = fopen($resource, 'r');
103
 
11
 
12
  namespace Symfony\Component\Translation\Loader;
13
 
 
 
 
 
14
  /**
15
  * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
16
  * @copyright Copyright (c) 2012, Clemens Tolboom
17
  */
18
+ class PoFileLoader extends FileLoader
19
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  /**
21
  * Parses portable object (PO) format.
22
  *
58
  *
59
  * Items with an empty id are ignored.
60
  *
61
+ * {@inheritdoc}
 
 
62
  */
63
+ protected function loadResource($resource)
64
  {
65
  $stream = fopen($resource, 'r');
66
 
vendor/symfony/translation/Loader/XliffFileLoader.php CHANGED
@@ -37,10 +37,49 @@ class XliffFileLoader implements LoaderInterface
37
  throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
38
  }
39
 
40
- list($xml, $encoding) = $this->parseFile($resource);
41
- $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
42
-
43
  $catalogue = new MessageCatalogue($locale);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  foreach ($xml->xpath('//xliff:trans-unit') as $translation) {
45
  $attributes = $translation->attributes();
46
 
@@ -55,31 +94,52 @@ class XliffFileLoader implements LoaderInterface
55
 
56
  $catalogue->set((string) $source, $target, $domain);
57
 
58
- if (isset($translation->note)) {
59
- $notes = array();
60
- foreach ($translation->note as $xmlNote) {
61
- $noteAttributes = $xmlNote->attributes();
62
- $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
63
- if (isset($noteAttributes['priority'])) {
64
- $note['priority'] = (int) $noteAttributes['priority'];
65
- }
 
 
66
 
67
- if (isset($noteAttributes['from'])) {
68
- $note['from'] = (string) $noteAttributes['from'];
69
- }
70
 
71
- $notes[] = $note;
72
- }
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
- $catalogue->setMetadata((string) $source, array('notes' => $notes), $domain);
 
 
 
 
 
 
 
 
 
 
 
75
  }
76
- }
77
 
78
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
79
- $catalogue->addResource(new FileResource($resource));
80
  }
81
-
82
- return $catalogue;
83
  }
84
 
85
  /**
@@ -93,57 +153,24 @@ class XliffFileLoader implements LoaderInterface
93
  private function utf8ToCharset($content, $encoding = null)
94
  {
95
  if ('UTF-8' !== $encoding && !empty($encoding)) {
96
- if (function_exists('mb_convert_encoding')) {
97
- return mb_convert_encoding($content, $encoding, 'UTF-8');
98
- }
99
-
100
- if (function_exists('iconv')) {
101
- return iconv('UTF-8', $encoding, $content);
102
- }
103
-
104
- throw new \RuntimeException('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
105
  }
106
 
107
  return $content;
108
  }
109
 
110
  /**
111
- * Validates and parses the given file into a SimpleXMLElement.
112
- *
113
- * @param string $file
114
- *
115
- * @throws \RuntimeException
116
- *
117
- * @return \SimpleXMLElement
118
  *
119
  * @throws InvalidResourceException
120
  */
121
- private function parseFile($file)
122
  {
123
- try {
124
- $dom = XmlUtils::loadFile($file);
125
- } catch (\InvalidArgumentException $e) {
126
- throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $file, $e->getMessage()), $e->getCode(), $e);
127
- }
128
-
129
  $internalErrors = libxml_use_internal_errors(true);
130
 
131
- $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
132
- $parts = explode('/', $location);
133
- if (0 === stripos($location, 'phar://')) {
134
- $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
135
- if ($tmpfile) {
136
- copy($location, $tmpfile);
137
- $parts = explode('/', str_replace('\\', '/', $tmpfile));
138
- }
139
- }
140
- $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
141
- $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
142
-
143
- $source = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
144
- $source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source);
145
-
146
- if (!@$dom->schemaValidateSource($source)) {
147
  throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $file, implode("\n", $this->getXmlErrors($internalErrors))));
148
  }
149
 
@@ -151,8 +178,46 @@ class XliffFileLoader implements LoaderInterface
151
 
152
  libxml_clear_errors();
153
  libxml_use_internal_errors($internalErrors);
 
154
 
155
- return array(simplexml_import_dom($dom), strtoupper($dom->encoding));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  }
157
 
158
  /**
@@ -181,4 +246,68 @@ class XliffFileLoader implements LoaderInterface
181
 
182
  return $errors;
183
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  }
37
  throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
38
  }
39
 
 
 
 
40
  $catalogue = new MessageCatalogue($locale);
41
+ $this->extract($resource, $catalogue, $domain);
42
+
43
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
44
+ $catalogue->addResource(new FileResource($resource));
45
+ }
46
+
47
+ return $catalogue;
48
+ }
49
+
50
+ private function extract($resource, MessageCatalogue $catalogue, $domain)
51
+ {
52
+ try {
53
+ $dom = XmlUtils::loadFile($resource);
54
+ } catch (\InvalidArgumentException $e) {
55
+ throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $resource, $e->getMessage()), $e->getCode(), $e);
56
+ }
57
+
58
+ $xliffVersion = $this->getVersionNumber($dom);
59
+ $this->validateSchema($xliffVersion, $dom, $this->getSchema($xliffVersion));
60
+
61
+ if ('1.2' === $xliffVersion) {
62
+ $this->extractXliff1($dom, $catalogue, $domain);
63
+ }
64
+
65
+ if ('2.0' === $xliffVersion) {
66
+ $this->extractXliff2($dom, $catalogue, $domain);
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Extract messages and metadata from DOMDocument into a MessageCatalogue.
72
+ *
73
+ * @param \DOMDocument $dom Source to extract messages and metadata
74
+ * @param MessageCatalogue $catalogue Catalogue where we'll collect messages and metadata
75
+ * @param string $domain The domain
76
+ */
77
+ private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, $domain)
78
+ {
79
+ $xml = simplexml_import_dom($dom);
80
+ $encoding = strtoupper($dom->encoding);
81
+
82
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
83
  foreach ($xml->xpath('//xliff:trans-unit') as $translation) {
84
  $attributes = $translation->attributes();
85
 
94
 
95
  $catalogue->set((string) $source, $target, $domain);
96
 
97
+ $metadata = array();
98
+ if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
99
+ $metadata['notes'] = $notes;
100
+ }
101
+ if (isset($translation->target) && $translation->target->attributes()) {
102
+ $metadata['target-attributes'] = array();
103
+ foreach ($translation->target->attributes() as $key => $value) {
104
+ $metadata['target-attributes'][$key] = (string) $value;
105
+ }
106
+ }
107
 
108
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
109
+ }
110
+ }
111
 
112
+ /**
113
+ * @param \DOMDocument $dom
114
+ * @param MessageCatalogue $catalogue
115
+ * @param string $domain
116
+ */
117
+ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, $domain)
118
+ {
119
+ $xml = simplexml_import_dom($dom);
120
+ $encoding = strtoupper($dom->encoding);
121
+
122
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
123
+
124
+ foreach ($xml->xpath('//xliff:unit/xliff:segment') as $segment) {
125
+ $source = $segment->source;
126
 
127
+ // If the xlf file has another encoding specified, try to convert it because
128
+ // simple_xml will always return utf-8 encoded values
129
+ $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding);
130
+
131
+ $catalogue->set((string) $source, $target, $domain);
132
+
133
+ $metadata = array();
134
+ if (isset($segment->target) && $segment->target->attributes()) {
135
+ $metadata['target-attributes'] = array();
136
+ foreach ($segment->target->attributes() as $key => $value) {
137
+ $metadata['target-attributes'][$key] = (string) $value;
138
+ }
139
  }
 
140
 
141
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
 
142
  }
 
 
143
  }
144
 
145
  /**
153
  private function utf8ToCharset($content, $encoding = null)
154
  {
155
  if ('UTF-8' !== $encoding && !empty($encoding)) {
156
+ return mb_convert_encoding($content, $encoding, 'UTF-8');
 
 
 
 
 
 
 
 
157
  }
158
 
159
  return $content;
160
  }
161
 
162
  /**
163
+ * @param string $file
164
+ * @param \DOMDocument $dom
165
+ * @param string $schema source of the schema
 
 
 
 
166
  *
167
  * @throws InvalidResourceException
168
  */
169
+ private function validateSchema($file, \DOMDocument $dom, $schema)
170
  {
 
 
 
 
 
 
171
  $internalErrors = libxml_use_internal_errors(true);
172
 
173
+ if (!@$dom->schemaValidateSource($schema)) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $file, implode("\n", $this->getXmlErrors($internalErrors))));
175
  }
176
 
178
 
179
  libxml_clear_errors();
180
  libxml_use_internal_errors($internalErrors);
181
+ }
182
 
183
+ private function getSchema($xliffVersion)
184
+ {
185
+ if ('1.2' === $xliffVersion) {
186
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
187
+ $xmlUri = 'http://www.w3.org/2001/xml.xsd';
188
+ } elseif ('2.0' === $xliffVersion) {
189
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd');
190
+ $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
191
+ } else {
192
+ throw new \InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
193
+ }
194
+
195
+ return $this->fixXmlLocation($schemaSource, $xmlUri);
196
+ }
197
+
198
+ /**
199
+ * Internally changes the URI of a dependent xsd to be loaded locally.
200
+ *
201
+ * @param string $schemaSource Current content of schema file
202
+ * @param string $xmlUri External URI of XML to convert to local
203
+ *
204
+ * @return string
205
+ */
206
+ private function fixXmlLocation($schemaSource, $xmlUri)
207
+ {
208
+ $newPath = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
209
+ $parts = explode('/', $newPath);
210
+ if (0 === stripos($newPath, 'phar://')) {
211
+ $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
212
+ if ($tmpfile) {
213
+ copy($newPath, $tmpfile);
214
+ $parts = explode('/', str_replace('\\', '/', $tmpfile));
215
+ }
216
+ }
217
+ $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
218
+ $newPath = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
219
+
220
+ return str_replace($xmlUri, $newPath, $schemaSource);
221
  }
222
 
223
  /**
246
 
247
  return $errors;
248
  }
249
+
250
+ /**
251
+ * Gets xliff file version based on the root "version" attribute.
252
+ * Defaults to 1.2 for backwards compatibility.
253
+ *
254
+ * @param \DOMDocument $dom
255
+ *
256
+ * @throws \InvalidArgumentException
257
+ *
258
+ * @return string
259
+ */
260
+ private function getVersionNumber(\DOMDocument $dom)
261
+ {
262
+ /** @var \DOMNode $xliff */
263
+ foreach ($dom->getElementsByTagName('xliff') as $xliff) {
264
+ $version = $xliff->attributes->getNamedItem('version');
265
+ if ($version) {
266
+ return $version->nodeValue;
267
+ }
268
+
269
+ $namespace = $xliff->attributes->getNamedItem('xmlns');
270
+ if ($namespace) {
271
+ if (substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34) !== 0) {
272
+ throw new \InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace));
273
+ }
274
+
275
+ return substr($namespace, 34);
276
+ }
277
+ }
278
+
279
+ // Falls back to v1.2
280
+ return '1.2';
281
+ }
282
+
283
+ /*
284
+ * @param \SimpleXMLElement|null $noteElement
285
+ * @param string|null $encoding
286
+ *
287
+ * @return array
288
+ */
289
+ private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, $encoding = null)
290
+ {
291
+ $notes = array();
292
+
293
+ if (null === $noteElement) {
294
+ return $notes;
295
+ }
296
+
297
+ foreach ($noteElement as $xmlNote) {
298
+ $noteAttributes = $xmlNote->attributes();
299
+ $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
300
+ if (isset($noteAttributes['priority'])) {
301
+ $note['priority'] = (int) $noteAttributes['priority'];
302
+ }
303
+
304
+ if (isset($noteAttributes['from'])) {
305
+ $note['from'] = (string) $noteAttributes['from'];
306
+ }
307
+
308
+ $notes[] = $note;
309
+ }
310
+
311
+ return $notes;
312
+ }
313
  }
vendor/symfony/translation/Loader/YamlFileLoader.php CHANGED
@@ -12,8 +12,6 @@
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
15
- use Symfony\Component\Translation\Exception\NotFoundResourceException;
16
- use Symfony\Component\Config\Resource\FileResource;
17
  use Symfony\Component\Yaml\Parser as YamlParser;
18
  use Symfony\Component\Yaml\Exception\ParseException;
19
 
@@ -22,28 +20,20 @@ use Symfony\Component\Yaml\Exception\ParseException;
22
  *
23
  * @author Fabien Potencier <fabien@symfony.com>
24
  */
25
- class YamlFileLoader extends ArrayLoader
26
  {
27
  private $yamlParser;
28
 
29
  /**
30
  * {@inheritdoc}
31
  */
32
- public function load($resource, $locale, $domain = 'messages')
33
  {
34
- if (!stream_is_local($resource)) {
35
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
36
- }
37
-
38
- if (!file_exists($resource)) {
39
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
40
- }
41
-
42
- if (!class_exists('Symfony\Component\Yaml\Parser')) {
43
- throw new \LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
44
- }
45
-
46
  if (null === $this->yamlParser) {
 
 
 
 
47
  $this->yamlParser = new YamlParser();
48
  }
49
 
@@ -53,22 +43,6 @@ class YamlFileLoader extends ArrayLoader
53
  throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
54
  }
55
 
56
- // empty file
57
- if (null === $messages) {
58
- $messages = array();
59
- }
60
-
61
- // not an array
62
- if (!is_array($messages)) {
63
- throw new InvalidResourceException(sprintf('The file "%s" must contain a YAML array.', $resource));
64
- }
65
-
66
- $catalogue = parent::load($messages, $locale, $domain);
67
-
68
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
69
- $catalogue->addResource(new FileResource($resource));
70
- }
71
-
72
- return $catalogue;
73
  }
74
  }
12
  namespace Symfony\Component\Translation\Loader;
13
 
14
  use Symfony\Component\Translation\Exception\InvalidResourceException;
 
 
15
  use Symfony\Component\Yaml\Parser as YamlParser;
16
  use Symfony\Component\Yaml\Exception\ParseException;
17
 
20
  *
21
  * @author Fabien Potencier <fabien@symfony.com>
22
  */
23
+ class YamlFileLoader extends FileLoader
24
  {
25
  private $yamlParser;
26
 
27
  /**
28
  * {@inheritdoc}
29
  */
30
+ protected function loadResource($resource)
31
  {
 
 
 
 
 
 
 
 
 
 
 
 
32
  if (null === $this->yamlParser) {
33
+ if (!class_exists('Symfony\Component\Yaml\Parser')) {
34
+ throw new \LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
35
+ }
36
+
37
  $this->yamlParser = new YamlParser();
38
  }
39
 
43
  throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
44
  }
45
 
46
+ return $messages;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
  }
vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+
4
+ XLIFF Version 2.0
5
+ OASIS Standard
6
+ 05 August 2014
7
+ Copyright (c) OASIS Open 2014. All rights reserved.
8
+ Source: http://docs.oasis-open.org/xliff/xliff-core/v2.0/os/schemas/
9
+ -->
10
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
11
+ elementFormDefault="qualified"
12
+ xmlns:xlf="urn:oasis:names:tc:xliff:document:2.0"
13
+ targetNamespace="urn:oasis:names:tc:xliff:document:2.0">
14
+
15
+ <!-- Import -->
16
+
17
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
18
+ schemaLocation="informativeCopiesOf3rdPartySchemas/w3c/xml.xsd"/>
19
+
20
+ <!-- Element Group -->
21
+
22
+ <xs:group name="inline">
23
+ <xs:choice>
24
+ <xs:element ref="xlf:cp"/>
25
+ <xs:element ref="xlf:ph"/>
26
+ <xs:element ref="xlf:pc"/>
27
+ <xs:element ref="xlf:sc"/>
28
+ <xs:element ref="xlf:ec"/>
29
+ <xs:element ref="xlf:mrk"/>
30
+ <xs:element ref="xlf:sm"/>
31
+ <xs:element ref="xlf:em"/>
32
+ </xs:choice>
33
+ </xs:group>
34
+
35
+ <!-- Attribute Types -->
36
+
37
+ <xs:simpleType name="yesNo">
38
+ <xs:restriction base="xs:string">
39
+ <xs:enumeration value="yes"/>
40
+ <xs:enumeration value="no"/>
41
+ </xs:restriction>
42
+ </xs:simpleType>
43
+
44
+ <xs:simpleType name="yesNoFirstNo">
45
+ <xs:restriction base="xs:string">
46
+ <xs:enumeration value="yes"/>
47
+ <xs:enumeration value="firstNo"/>
48
+ <xs:enumeration value="no"/>
49
+ </xs:restriction>
50
+ </xs:simpleType>
51
+
52
+ <xs:simpleType name="dirValue">
53
+ <xs:restriction base="xs:string">
54
+ <xs:enumeration value="ltr"/>
55
+ <xs:enumeration value="rtl"/>
56
+ <xs:enumeration value="auto"/>
57
+ </xs:restriction>
58
+ </xs:simpleType>
59
+
60
+ <xs:simpleType name="appliesTo">
61
+ <xs:restriction base="xs:string">
62
+ <xs:enumeration value="source"/>
63
+ <xs:enumeration value="target"/>
64
+ </xs:restriction>
65
+ </xs:simpleType>
66
+
67
+ <xs:simpleType name="userDefinedValue">
68
+ <xs:restriction base="xs:string">
69
+ <xs:pattern value="[^\s:]+:[^\s:]+"/>
70
+ </xs:restriction>
71
+ </xs:simpleType>
72
+
73
+ <xs:simpleType name="attrType_type">
74
+ <xs:restriction base="xs:string">
75
+ <xs:enumeration value="fmt"/>
76
+ <xs:enumeration value="ui"/>
77
+ <xs:enumeration value="quote"/>
78
+ <xs:enumeration value="link"/>
79
+ <xs:enumeration value="image"/>
80
+ <xs:enumeration value="other"/>
81
+ </xs:restriction>
82
+ </xs:simpleType>
83
+
84
+ <xs:simpleType name="typeForMrkValues">
85
+ <xs:restriction base="xs:NMTOKEN">
86
+ <xs:enumeration value="generic"/>
87
+ <xs:enumeration value="comment"/>
88
+ <xs:enumeration value="term"/>
89
+ </xs:restriction>
90
+ </xs:simpleType>
91
+
92
+ <xs:simpleType name="attrType_typeForMrk">
93
+ <xs:union memberTypes="xlf:typeForMrkValues xlf:userDefinedValue"/>
94
+ </xs:simpleType>
95
+
96
+ <xs:simpleType name="priorityValue">
97
+ <xs:restriction base="xs:positiveInteger">
98
+ <xs:minInclusive value="1"/>
99
+ <xs:maxInclusive value="10"/>
100
+ </xs:restriction>
101
+ </xs:simpleType>
102
+
103
+ <xs:simpleType name="stateType">
104
+ <xs:restriction base="xs:string">
105
+ <xs:enumeration value="initial"/>
106
+ <xs:enumeration value="translated"/>
107
+ <xs:enumeration value="reviewed"/>
108
+ <xs:enumeration value="final"/>
109
+ </xs:restriction>
110
+ </xs:simpleType>
111
+
112
+ <!-- Structural Elements -->
113
+
114
+ <xs:element name="xliff">
115
+ <xs:complexType mixed="false">
116
+ <xs:sequence>
117
+ <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:file"/>
118
+ </xs:sequence>
119
+ <xs:attribute name="version" use="required"/>
120
+ <xs:attribute name="srcLang" use="required"/>
121
+ <xs:attribute name="trgLang" use="optional"/>
122
+ <xs:attribute ref="xml:space" use="optional" default="default"/>
123
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
124
+ </xs:complexType>
125
+ </xs:element>
126
+
127
+ <xs:element name="file">
128
+ <xs:complexType mixed="false">
129
+ <xs:sequence>
130
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:skeleton"/>
131
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
132
+ processContents="lax"/>
133
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/>
134
+ <xs:choice minOccurs="1" maxOccurs="unbounded">
135
+ <xs:element ref="xlf:unit"/>
136
+ <xs:element ref="xlf:group"/>
137
+ </xs:choice>
138
+ </xs:sequence>
139
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
140
+ <xs:attribute name="canResegment" use="optional" type="xlf:yesNo" default="yes"/>
141
+ <xs:attribute name="original" use="optional"/>
142
+ <xs:attribute name="translate" use="optional" type="xlf:yesNo" default="yes"/>
143
+ <xs:attribute name="srcDir" use="optional" type="xlf:dirValue" default="auto"/>
144
+ <xs:attribute name="trgDir" use="optional" type="xlf:dirValue" default="auto"/>
145
+ <xs:attribute ref="xml:space" use="optional"/>
146
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
147
+ </xs:complexType>
148
+ </xs:element>
149
+
150
+ <xs:element name="skeleton">
151
+ <xs:complexType mixed="true">
152
+ <xs:sequence>
153
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
154
+ processContents="lax"/>
155
+ </xs:sequence>
156
+ <xs:attribute name="href" use="optional"/>
157
+ </xs:complexType>
158
+ </xs:element>
159
+
160
+ <xs:element name="group">
161
+ <xs:complexType mixed="false">
162
+ <xs:sequence>
163
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
164
+ processContents="lax"/>
165
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/>
166
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
167
+ <xs:element ref="xlf:unit"/>
168
+ <xs:element ref="xlf:group"/>
169
+ </xs:choice>
170
+ </xs:sequence>
171
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
172
+ <xs:attribute name="name" use="optional"/>
173
+ <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/>
174
+ <xs:attribute name="translate" use="optional" type="xlf:yesNo"/>
175
+ <xs:attribute name="srcDir" use="optional" type="xlf:dirValue"/>
176
+ <xs:attribute name="trgDir" use="optional" type="xlf:dirValue"/>
177
+ <xs:attribute name="type" use="optional" type="xlf:userDefinedValue"/>
178
+ <xs:attribute ref="xml:space" use="optional"/>
179
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
180
+ </xs:complexType>
181
+ </xs:element>
182
+
183
+ <xs:element name="unit">
184
+ <xs:complexType mixed="false">
185
+ <xs:sequence>
186
+ <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"
187
+ processContents="lax"/>
188
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/>
189
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:originalData"/>
190
+ <xs:choice minOccurs="1" maxOccurs="unbounded">
191
+ <xs:element ref="xlf:segment"/>
192
+ <xs:element ref="xlf:ignorable"/>
193
+ </xs:choice>
194
+ </xs:sequence>
195
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
196
+ <xs:attribute name="name" use="optional"/>
197
+ <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/>
198
+ <xs:attribute name="translate" use="optional" type="xlf:yesNo"/>
199
+ <xs:attribute name="srcDir" use="optional" type="xlf:dirValue"/>
200
+ <xs:attribute name="trgDir" use="optional" type="xlf:dirValue"/>
201
+ <xs:attribute ref="xml:space" use="optional"/>
202
+ <xs:attribute name="type" use="optional" type="xlf:userDefinedValue"/>
203
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
204
+ </xs:complexType>
205
+ </xs:element>
206
+
207
+ <xs:element name="segment">
208
+ <xs:complexType mixed="false">
209
+ <xs:sequence>
210
+ <xs:element minOccurs="1" maxOccurs="1" ref="xlf:source"/>
211
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:target"/>
212
+ </xs:sequence>
213
+ <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/>
214
+ <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/>
215
+ <xs:attribute name="state" use="optional" type="xlf:stateType" default="initial"/>
216
+ <xs:attribute name="subState" use="optional"/>
217
+ </xs:complexType>
218
+ </xs:element>
219
+
220
+ <xs:element name="ignorable">
221
+ <xs:complexType mixed="false">
222
+ <xs:sequence>
223
+ <xs:element minOccurs="1" maxOccurs="1" ref="xlf:source"/>
224
+ <xs:element minOccurs="0" maxOccurs="1" ref="xlf:target"/>
225
+ </xs:sequence>
226
+ <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/>
227
+ </xs:complexType>
228
+ </xs:element>
229
+
230
+ <xs:element name="notes">
231
+ <xs:complexType mixed="false">
232
+ <xs:sequence>
233
+ <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:note"/>
234
+ </xs:sequence>
235
+ </xs:complexType>
236
+ </xs:element>
237
+
238
+ <xs:element name="note">
239
+ <xs:complexType mixed="true">
240
+ <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/>
241
+ <xs:attribute name="appliesTo" use="optional" type="xlf:appliesTo"/>
242
+ <xs:attribute name="category" use="optional"/>
243
+ <xs:attribute name="priority" use="optional" type="xlf:priorityValue" default="1"/>
244
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
245
+ </xs:complexType>
246
+ </xs:element>
247
+
248
+ <xs:element name="originalData">
249
+ <xs:complexType mixed="false">
250
+ <xs:sequence>
251
+ <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:data"/>
252
+ </xs:sequence>
253
+ </xs:complexType>
254
+ </xs:element>
255
+
256
+ <xs:element name="data">
257
+ <xs:complexType mixed="true">
258
+ <xs:sequence>
259
+ <xs:element minOccurs="0" maxOccurs="unbounded" ref="xlf:cp"/>
260
+ </xs:sequence>
261
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
262
+ <xs:attribute name="dir" use="optional" type="xlf:dirValue" default="auto"/>
263
+ <xs:attribute ref="xml:space" use="optional" fixed="preserve"/>
264
+ </xs:complexType>
265
+ </xs:element>
266
+
267
+ <xs:element name="source">
268
+ <xs:complexType mixed="true">
269
+ <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/>
270
+ <xs:attribute ref="xml:lang" use="optional"/>
271
+ <xs:attribute ref="xml:space" use="optional"/>
272
+ </xs:complexType>
273
+ </xs:element>
274
+
275
+ <xs:element name="target">
276
+ <xs:complexType mixed="true">
277
+ <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/>
278
+ <xs:attribute ref="xml:lang" use="optional"/>
279
+ <xs:attribute ref="xml:space" use="optional"/>
280
+ <xs:attribute name="order" use="optional" type="xs:positiveInteger"/>
281
+ </xs:complexType>
282
+ </xs:element>
283
+
284
+ <!-- Inline Elements -->
285
+
286
+ <xs:element name="cp">
287
+ <!-- Code Point -->
288
+ <xs:complexType mixed="false">
289
+ <xs:attribute name="hex" use="required" type="xs:hexBinary"/>
290
+ </xs:complexType>
291
+ </xs:element>
292
+
293
+ <xs:element name="ph">
294
+ <!-- Placeholder -->
295
+ <xs:complexType mixed="false">
296
+ <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/>
297
+ <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/>
298
+ <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/>
299
+ <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/>
300
+ <xs:attribute name="disp" use="optional"/>
301
+ <xs:attribute name="equiv" use="optional"/>
302
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
303
+ <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/>
304
+ <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/>
305
+ <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/>
306
+ <xs:attribute name="type" use="optional" type="xlf:attrType_type"/>
307
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
308
+ </xs:complexType>
309
+ </xs:element>
310
+
311
+ <xs:element name="pc">
312
+ <!-- Paired Code -->
313
+ <xs:complexType mixed="true">
314
+ <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/>
315
+ <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/>
316
+ <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/>
317
+ <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo"/>
318
+ <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/>
319
+ <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/>
320
+ <xs:attribute name="dispEnd" use="optional"/>
321
+ <xs:attribute name="dispStart" use="optional"/>
322
+ <xs:attribute name="equivEnd" use="optional"/>
323
+ <xs:attribute name="equivStart" use="optional"/>
324
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
325
+ <xs:attribute name="dataRefEnd" use="optional" type="xs:NMTOKEN"/>
326
+ <xs:attribute name="dataRefStart" use="optional" type="xs:NMTOKEN"/>
327
+ <xs:attribute name="subFlowsEnd" use="optional" type="xs:NMTOKENS"/>
328
+ <xs:attribute name="subFlowsStart" use="optional" type="xs:NMTOKENS"/>
329
+ <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/>
330
+ <xs:attribute name="type" use="optional" type="xlf:attrType_type"/>
331
+ <xs:attribute name="dir" use="optional" type="xlf:dirValue"/>
332
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
333
+ </xs:complexType>
334
+ </xs:element>
335
+
336
+ <xs:element name="sc">
337
+ <!-- Start Code -->
338
+ <xs:complexType mixed="false">
339
+ <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/>
340
+ <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/>
341
+ <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo" default="yes"/>
342
+ <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/>
343
+ <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/>
344
+ <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/>
345
+ <xs:attribute name="dir" use="optional" type="xlf:dirValue"/>
346
+ <xs:attribute name="disp" use="optional"/>
347
+ <xs:attribute name="equiv" use="optional"/>
348
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
349
+ <xs:attribute name="isolated" use="optional" type="xlf:yesNo" default="no"/>
350
+ <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/>
351
+ <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/>
352
+ <xs:attribute name="type" use="optional" type="xlf:attrType_type"/>
353
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
354
+ </xs:complexType>
355
+ </xs:element>
356
+
357
+ <xs:element name="ec">
358
+ <!-- End Code -->
359
+ <xs:complexType mixed="false">
360
+ <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/>
361
+ <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/>
362
+ <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo" default="yes"/>
363
+ <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/>
364
+ <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/>
365
+ <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/>
366
+ <xs:attribute name="dir" use="optional" type="xlf:dirValue"/>
367
+ <xs:attribute name="disp" use="optional"/>
368
+ <xs:attribute name="equiv" use="optional"/>
369
+ <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/>
370
+ <xs:attribute name="isolated" use="optional" type="xlf:yesNo" default="no"/>
371
+ <xs:attribute name="startRef" use="optional" type="xs:NMTOKEN"/>
372
+ <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/>
373
+ <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/>
374
+ <xs:attribute name="type" use="optional" type="xlf:attrType_type"/>
375
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
376
+ </xs:complexType>
377
+ </xs:element>
378
+
379
+ <xs:element name="mrk">
380
+ <!-- Annotation Marker -->
381
+ <xs:complexType mixed="true">
382
+ <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/>
383
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
384
+ <xs:attribute name="translate" use="optional" type="xlf:yesNo"/>
385
+ <xs:attribute name="type" use="optional" type="xlf:attrType_typeForMrk"/>
386
+ <xs:attribute name="ref" use="optional" type="xs:anyURI"/>
387
+ <xs:attribute name="value" use="optional"/>
388
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
389
+ </xs:complexType>
390
+ </xs:element>
391
+
392
+ <xs:element name="sm">
393
+ <!-- Start Annotation Marker -->
394
+ <xs:complexType mixed="false">
395
+ <xs:attribute name="id" use="required" type="xs:NMTOKEN"/>
396
+ <xs:attribute name="translate" use="optional" type="xlf:yesNo"/>
397
+ <xs:attribute name="type" use="optional" type="xlf:attrType_typeForMrk"/>
398
+ <xs:attribute name="ref" use="optional" type="xs:anyURI"/>
399
+ <xs:attribute name="value" use="optional"/>
400
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
401
+ </xs:complexType>
402
+ </xs:element>
403
+
404
+ <xs:element name="em">
405
+ <!-- End Annotation Marker -->
406
+ <xs:complexType mixed="false">
407
+ <xs:attribute name="startRef" use="required" type="xs:NMTOKEN"/>
408
+ </xs:complexType>
409
+ </xs:element>
410
+
411
+ </xs:schema>
vendor/symfony/translation/PluralizationRules.php CHANGED
@@ -192,10 +192,8 @@ class PluralizationRules
192
  *
193
  * @param callable $rule A PHP callable
194
  * @param string $locale The locale
195
- *
196
- * @throws \LogicException
197
  */
198
- public static function set($rule, $locale)
199
  {
200
  if ('pt_BR' === $locale) {
201
  // temporary set a locale for brazilian
@@ -206,10 +204,6 @@ class PluralizationRules
206
  $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
207
  }
208
 
209
- if (!is_callable($rule)) {
210
- throw new \LogicException('The given rule can not be called');
211
- }
212
-
213
  self::$rules[$locale] = $rule;
214
  }
215
  }
192
  *
193
  * @param callable $rule A PHP callable
194
  * @param string $locale The locale
 
 
195
  */
196
+ public static function set(callable $rule, $locale)
197
  {
198
  if ('pt_BR' === $locale) {
199
  // temporary set a locale for brazilian
204
  $locale = substr($locale, 0, -strlen(strrchr($locale, '_')));
205
  }
206
 
 
 
 
 
207
  self::$rules[$locale] = $rule;
208
  }
209
  }
vendor/symfony/translation/README.md CHANGED
@@ -28,7 +28,7 @@ https://github.com/silexphp/Silex/blob/master/src/Silex/Provider/TranslationServ
28
 
29
  Documentation:
30
 
31
- https://symfony.com/doc/2.7/book/translation.html
32
 
33
  You can run the unit tests with the following command:
34
 
28
 
29
  Documentation:
30
 
31
+ https://symfony.com/doc/3.0/book/translation.html
32
 
33
  You can run the unit tests with the following command:
34
 
vendor/symfony/translation/Tests/Catalogue/{DiffOperationTest.php → TargetOperationTest.php} RENAMED
@@ -11,11 +11,11 @@
11
 
12
  namespace Symfony\Component\Translation\Tests\Catalogue;
13
 
14
- use Symfony\Component\Translation\Catalogue\DiffOperation;
15
  use Symfony\Component\Translation\MessageCatalogue;
16
  use Symfony\Component\Translation\MessageCatalogueInterface;
17
 
18
- class DiffOperationTest extends AbstractOperationTest
19
  {
20
  public function testGetMessagesFromSingleDomain()
21
  {
@@ -77,6 +77,7 @@ class DiffOperationTest extends AbstractOperationTest
77
 
78
  protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
79
  {
80
- return new DiffOperation($source, $target);
81
  }
 
82
  }
11
 
12
  namespace Symfony\Component\Translation\Tests\Catalogue;
13
 
14
+ use Symfony\Component\Translation\Catalogue\TargetOperation;
15
  use Symfony\Component\Translation\MessageCatalogue;
16
  use Symfony\Component\Translation\MessageCatalogueInterface;
17
 
18
+ class TargetOperationTest extends AbstractOperationTest
19
  {
20
  public function testGetMessagesFromSingleDomain()
21
  {
77
 
78
  protected function createOperation(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
79
  {
80
+ return new TargetOperation($source, $target);
81
  }
82
+
83
  }
vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php CHANGED
@@ -46,6 +46,8 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
46
  'locale' => 'en',
47
  'domain' => 'messages',
48
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
 
 
49
  ),
50
  array(
51
  'id' => 'bar',
@@ -53,6 +55,8 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
53
  'locale' => 'fr',
54
  'domain' => 'messages',
55
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
 
 
56
  ),
57
  array(
58
  'id' => 'choice',
@@ -60,6 +64,8 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
60
  'locale' => 'en',
61
  'domain' => 'messages',
62
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
 
 
63
  ),
64
  array(
65
  'id' => 'choice',
@@ -67,6 +73,17 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
67
  'locale' => 'en',
68
  'domain' => 'messages',
69
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
 
 
 
 
 
 
 
 
 
 
 
70
  ),
71
  );
72
  $expectedMessages = array(
@@ -77,6 +94,8 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
77
  'domain' => 'messages',
78
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
79
  'count' => 1,
 
 
80
  ),
81
  array(
82
  'id' => 'bar',
@@ -85,6 +104,8 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
85
  'domain' => 'messages',
86
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
87
  'count' => 1,
 
 
88
  ),
89
  array(
90
  'id' => 'choice',
@@ -92,7 +113,13 @@ class TranslationDataCollectorTest extends \PHPUnit_Framework_TestCase
92
  'locale' => 'en',
93
  'domain' => 'messages',
94
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
95
- 'count' => 2,
 
 
 
 
 
 
96
  ),
97
  );
98
 
46
  'locale' => 'en',
47
  'domain' => 'messages',
48
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
49
+ 'parameters' => array(),
50
+ 'transChoiceNumber' => null,
51
  ),
52
  array(
53
  'id' => 'bar',
55
  'locale' => 'fr',
56
  'domain' => 'messages',
57
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
58
+ 'parameters' => array(),
59
+ 'transChoiceNumber' => null,
60
  ),
61
  array(
62
  'id' => 'choice',
64
  'locale' => 'en',
65
  'domain' => 'messages',
66
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
67
+ 'parameters' => array('%count%' => 3),
68
+ 'transChoiceNumber' => 3,
69
  ),
70
  array(
71
  'id' => 'choice',
73
  'locale' => 'en',
74
  'domain' => 'messages',
75
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
76
+ 'parameters' => array('%count%' => 3),
77
+ 'transChoiceNumber' => 3,
78
+ ),
79
+ array(
80
+ 'id' => 'choice',
81
+ 'translation' => 'choice',
82
+ 'locale' => 'en',
83
+ 'domain' => 'messages',
84
+ 'state' => DataCollectorTranslator::MESSAGE_MISSING,
85
+ 'parameters' => array('%count%' => 4, '%foo%' => 'bar'),
86
+ 'transChoiceNumber' => 4,
87
  ),
88
  );
89
  $expectedMessages = array(
94
  'domain' => 'messages',
95
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
96
  'count' => 1,
97
+ 'parameters' => array(),
98
+ 'transChoiceNumber' => null,
99
  ),
100
  array(
101
  'id' => 'bar',
104
  'domain' => 'messages',
105
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
106
  'count' => 1,
107
+ 'parameters' => array(),
108
+ 'transChoiceNumber' => null,
109
  ),
110
  array(
111
  'id' => 'choice',
113
  'locale' => 'en',
114
  'domain' => 'messages',
115
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
116
+ 'count' => 3,
117
+ 'parameters' => array(
118
+ array('%count%' => 3),
119
+ array('%count%' => 3),
120
+ array('%count%' => 4, '%foo%' => 'bar'),
121
+ ),
122
+ 'transChoiceNumber' => 3,
123
  ),
124
  );
125
 
vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php CHANGED
@@ -26,6 +26,7 @@ class DataCollectorTranslatorTest extends \PHPUnit_Framework_TestCase
26
  $collector->trans('bar');
27
  $collector->transChoice('choice', 0);
28
  $collector->trans('bar_ru');
 
29
 
30
  $expectedMessages = array();
31
  $expectedMessages[] = array(
@@ -34,6 +35,8 @@ class DataCollectorTranslatorTest extends \PHPUnit_Framework_TestCase
34
  'locale' => 'en',
35
  'domain' => 'messages',
36
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
 
 
37
  );
38
  $expectedMessages[] = array(
39
  'id' => 'bar',
@@ -41,6 +44,8 @@ class DataCollectorTranslatorTest extends \PHPUnit_Framework_TestCase
41
  'locale' => 'fr',
42
  'domain' => 'messages',
43
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
 
 
44
  );
45
  $expectedMessages[] = array(
46
  'id' => 'choice',
@@ -48,6 +53,8 @@ class DataCollectorTranslatorTest extends \PHPUnit_Framework_TestCase
48
  'locale' => 'en',
49
  'domain' => 'messages',
50
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
 
 
51
  );
52
  $expectedMessages[] = array(
53
  'id' => 'bar_ru',
@@ -55,6 +62,17 @@ class DataCollectorTranslatorTest extends \PHPUnit_Framework_TestCase
55
  'locale' => 'ru',
56
  'domain' => 'messages',
57
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
 
 
 
 
 
 
 
 
 
 
 
58
  );
59
 
60
  $this->assertEquals($expectedMessages, $collector->getCollectedMessages());
26
  $collector->trans('bar');
27
  $collector->transChoice('choice', 0);
28
  $collector->trans('bar_ru');
29
+ $collector->trans('bar_ru', array('foo' => 'bar'));
30
 
31
  $expectedMessages = array();
32
  $expectedMessages[] = array(
35
  'locale' => 'en',
36
  'domain' => 'messages',
37
  'state' => DataCollectorTranslator::MESSAGE_DEFINED,
38
+ 'parameters' => array(),
39
+ 'transChoiceNumber' => null,
40
  );
41
  $expectedMessages[] = array(
42
  'id' => 'bar',
44
  'locale' => 'fr',
45
  'domain' => 'messages',
46
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
47
+ 'parameters' => array(),
48
+ 'transChoiceNumber' => null,
49
  );
50
  $expectedMessages[] = array(
51
  'id' => 'choice',
53
  'locale' => 'en',
54
  'domain' => 'messages',
55
  'state' => DataCollectorTranslator::MESSAGE_MISSING,
56
+ 'parameters' => array(),
57
+ 'transChoiceNumber' => 0,
58
  );
59
  $expectedMessages[] = array(
60
  'id' => 'bar_ru',
62
  'locale' => 'ru',
63
  'domain' => 'messages',
64
  'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
65
+ 'parameters' => array(),
66
+ 'transChoiceNumber' => null,
67
+ );
68
+ $expectedMessages[] = array(
69
+ 'id' => 'bar_ru',
70
+ 'translation' => 'bar (ru)',
71
+ 'locale' => 'ru',
72
+ 'domain' => 'messages',
73
+ 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK,
74
+ 'parameters' => array('foo' => 'bar'),
75
+ 'transChoiceNumber' => null,
76
  );
77
 
78
  $this->assertEquals($expectedMessages, $collector->getCollectedMessages());
vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php CHANGED
@@ -16,18 +16,14 @@ use Symfony\Component\Translation\Dumper\CsvFileDumper;
16
 
17
  class CsvFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar', 'bar' => 'foo
23
  foo', 'foo;foo' => 'bar'));
24
 
25
- $tempDir = sys_get_temp_dir();
26
  $dumper = new CsvFileDumper();
27
- $dumper->dump($catalogue, array('path' => $tempDir));
28
 
29
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/valid.csv'), file_get_contents($tempDir.'/messages.en.csv'));
30
-
31
- unlink($tempDir.'/messages.en.csv');
32
  }
33
  }
16
 
17
  class CsvFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar', 'bar' => 'foo
23
  foo', 'foo;foo' => 'bar'));
24
 
 
25
  $dumper = new CsvFileDumper();
 
26
 
27
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/valid.csv', $dumper->formatCatalogue($catalogue, 'messages'));
 
 
28
  }
29
  }
vendor/symfony/translation/Tests/Dumper/FileDumperTest.php CHANGED
@@ -16,6 +16,19 @@ use Symfony\Component\Translation\Dumper\FileDumper;
16
 
17
  class FileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  public function testDumpBackupsFileIfExisting()
20
  {
21
  $tempDir = sys_get_temp_dir();
@@ -58,7 +71,7 @@ class FileDumperTest extends \PHPUnit_Framework_TestCase
58
 
59
  class ConcreteFileDumper extends FileDumper
60
  {
61
- protected function format(MessageCatalogue $messages, $domain)
62
  {
63
  return '';
64
  }
16
 
17
  class FileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testDump()
20
+ {
21
+ $tempDir = sys_get_temp_dir();
22
+
23
+ $catalogue = new MessageCatalogue('en');
24
+ $catalogue->add(array('foo' => 'bar'));
25
+
26
+ $dumper = new ConcreteFileDumper();
27
+ $dumper->dump($catalogue, array('path' => $tempDir));
28
+
29
+ $this->assertTrue(file_exists($tempDir.'/messages.en.concrete'));
30
+ }
31
+
32
  public function testDumpBackupsFileIfExisting()
33
  {
34
  $tempDir = sys_get_temp_dir();
71
 
72
  class ConcreteFileDumper extends FileDumper
73
  {
74
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
75
  {
76
  return '';
77
  }
vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php CHANGED
@@ -16,22 +16,13 @@ use Symfony\Component\Translation\Dumper\IcuResFileDumper;
16
 
17
  class IcuResFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- /**
20
- * @requires extension mbstring
21
- */
22
- public function testDump()
23
  {
24
  $catalogue = new MessageCatalogue('en');
25
  $catalogue->add(array('foo' => 'bar'));
26
 
27
- $tempDir = sys_get_temp_dir().'/IcuResFileDumperTest';
28
  $dumper = new IcuResFileDumper();
29
- $dumper->dump($catalogue, array('path' => $tempDir));
30
 
31
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resourcebundle/res/en.res'), file_get_contents($tempDir.'/messages/en.res'));
32
-
33
- @unlink($tempDir.'/messages/en.res');
34
- @rmdir($tempDir.'/messages');
35
- @rmdir($tempDir);
36
  }
37
  }
16
 
17
  class IcuResFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
 
 
 
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new IcuResFileDumper();
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resourcebundle/res/en.res', $dumper->formatCatalogue($catalogue, 'messages'));
 
 
 
 
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php CHANGED
@@ -16,17 +16,13 @@ use Symfony\Component\Translation\Dumper\IniFileDumper;
16
 
17
  class IniFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new IniFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
 
28
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ini'), file_get_contents($tempDir.'/messages.en.ini'));
29
-
30
- unlink($tempDir.'/messages.en.ini');
31
  }
32
  }
16
 
17
  class IniFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new IniFileDumper();
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.ini', $dumper->formatCatalogue($catalogue, 'messages'));
 
 
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php CHANGED
@@ -16,21 +16,23 @@ use Symfony\Component\Translation\Dumper\JsonFileDumper;
16
 
17
  class JsonFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
- if (PHP_VERSION_ID < 50400) {
22
- $this->markTestIncomplete('PHP below 5.4 doesn\'t support JSON pretty printing');
23
- }
24
-
25
  $catalogue = new MessageCatalogue('en');
26
  $catalogue->add(array('foo' => 'bar'));
27
 
28
- $tempDir = sys_get_temp_dir();
29
  $dumper = new JsonFileDumper();
30
- $dumper->dump($catalogue, array('path' => $tempDir));
31
 
32
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.json'), file_get_contents($tempDir.'/messages.en.json'));
 
 
 
 
 
 
 
 
33
 
34
- unlink($tempDir.'/messages.en.json');
35
  }
36
  }
16
 
17
  class JsonFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
 
 
 
 
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new JsonFileDumper();
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.json', $dumper->formatCatalogue($catalogue, 'messages'));
27
+ }
28
+
29
+ public function testDumpWithCustomEncoding()
30
+ {
31
+ $catalogue = new MessageCatalogue('en');
32
+ $catalogue->add(array('foo' => '"bar"'));
33
+
34
+ $dumper = new JsonFileDumper();
35
 
36
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.dump.json', $dumper->formatCatalogue($catalogue, 'messages', array('json_encoding' => JSON_HEX_QUOT)));
37
  }
38
  }
vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php CHANGED
@@ -16,16 +16,13 @@ use Symfony\Component\Translation\Dumper\MoFileDumper;
16
 
17
  class MoFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new MoFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.mo'), file_get_contents($tempDir.'/messages.en.mo'));
28
 
29
- unlink($tempDir.'/messages.en.mo');
30
  }
31
  }
16
 
17
  class MoFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new MoFileDumper();
 
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.mo', $dumper->formatCatalogue($catalogue, 'messages'));
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php CHANGED
@@ -16,17 +16,13 @@ use Symfony\Component\Translation\Dumper\PhpFileDumper;
16
 
17
  class PhpFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new PhpFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
 
28
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.php'), file_get_contents($tempDir.'/messages.en.php'));
29
-
30
- unlink($tempDir.'/messages.en.php');
31
  }
32
  }
16
 
17
  class PhpFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new PhpFileDumper();
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.php', $dumper->formatCatalogue($catalogue, 'messages'));
 
 
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php CHANGED
@@ -16,16 +16,13 @@ use Symfony\Component\Translation\Dumper\PoFileDumper;
16
 
17
  class PoFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new PoFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.po'), file_get_contents($tempDir.'/messages.en.po'));
28
 
29
- unlink($tempDir.'/messages.en.po');
30
  }
31
  }
16
 
17
  class PoFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'));
23
 
 
24
  $dumper = new PoFileDumper();
 
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.po', $dumper->formatCatalogue($catalogue, 'messages'));
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php CHANGED
@@ -16,17 +16,13 @@ use Symfony\Component\Translation\Dumper\QtFileDumper;
16
 
17
  class QtFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'), 'resources');
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new QtFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
 
28
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.ts'), file_get_contents($tempDir.'/resources.en.ts'));
29
-
30
- unlink($tempDir.'/resources.en.ts');
31
  }
32
  }
16
 
17
  class QtFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
  $catalogue->add(array('foo' => 'bar'), 'resources');
23
 
 
24
  $dumper = new QtFileDumper();
 
25
 
26
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/resources.ts', $dumper->formatCatalogue($catalogue, 'resources'));
 
 
27
  }
28
  }
vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php CHANGED
@@ -16,7 +16,7 @@ use Symfony\Component\Translation\Dumper\XliffFileDumper;
16
 
17
  class XliffFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en_US');
22
  $catalogue->add(array(
@@ -27,15 +27,63 @@ class XliffFileDumperTest extends \PHPUnit_Framework_TestCase
27
  $catalogue->setMetadata('foo', array('notes' => array(array('priority' => 1, 'from' => 'bar', 'content' => 'baz'))));
28
  $catalogue->setMetadata('key', array('notes' => array(array('content' => 'baz'), array('content' => 'qux'))));
29
 
30
- $tempDir = sys_get_temp_dir();
31
  $dumper = new XliffFileDumper();
32
- $dumper->dump($catalogue, array('path' => $tempDir, 'default_locale' => 'fr_FR'));
33
 
34
- $this->assertEquals(
35
- file_get_contents(__DIR__.'/../fixtures/resources-clean.xlf'),
36
- file_get_contents($tempDir.'/messages.en_US.xlf')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  );
38
 
39
- unlink($tempDir.'/messages.en_US.xlf');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
  }
16
 
17
  class XliffFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en_US');
22
  $catalogue->add(array(
27
  $catalogue->setMetadata('foo', array('notes' => array(array('priority' => 1, 'from' => 'bar', 'content' => 'baz'))));
28
  $catalogue->setMetadata('key', array('notes' => array(array('content' => 'baz'), array('content' => 'qux'))));
29
 
 
30
  $dumper = new XliffFileDumper();
 
31
 
32
+ $this->assertStringEqualsFile(
33
+ __DIR__.'/../fixtures/resources-clean.xlf',
34
+ $dumper->formatCatalogue($catalogue, 'messages', array('default_locale' => 'fr_FR'))
35
+ );
36
+ }
37
+
38
+ public function testFormatCatalogueXliff2()
39
+ {
40
+ $catalogue = new MessageCatalogue('en_US');
41
+ $catalogue->add(array(
42
+ 'foo' => 'bar',
43
+ 'key' => '',
44
+ 'key.with.cdata' => '<source> & <target>',
45
+ ));
46
+ $catalogue->setMetadata('key', array('target-attributes' => array('order' => 1)));
47
+
48
+ $dumper = new XliffFileDumper();
49
+
50
+ $this->assertStringEqualsFile(
51
+ __DIR__.'/../fixtures/resources-2.0-clean.xlf',
52
+ $dumper->formatCatalogue($catalogue, 'messages', array('default_locale' => 'fr_FR', 'xliff_version' => '2.0'))
53
+ );
54
+ }
55
+
56
+ public function testFormatCatalogueWithCustomToolInfo()
57
+ {
58
+ $options = array(
59
+ 'default_locale' => 'en_US',
60
+ 'tool_info' => array('tool-id' => 'foo', 'tool-name' => 'foo', 'tool-version' => '0.0', 'tool-company' => 'Foo'),
61
  );
62
 
63
+ $catalogue = new MessageCatalogue('en_US');
64
+ $catalogue->add(array('foo' => 'bar'));
65
+
66
+ $dumper = new XliffFileDumper();
67
+
68
+ $this->assertStringEqualsFile(
69
+ __DIR__.'/../fixtures/resources-tool-info.xlf',
70
+ $dumper->formatCatalogue($catalogue, 'messages', $options)
71
+ );
72
+ }
73
+
74
+ public function testFormatCatalogueWithTargetAttributesMetadata()
75
+ {
76
+ $catalogue = new MessageCatalogue('en_US');
77
+ $catalogue->add(array(
78
+ 'foo' => 'bar',
79
+ ));
80
+ $catalogue->setMetadata('foo', array('target-attributes' => array('state' => 'needs-translation')));
81
+
82
+ $dumper = new XliffFileDumper();
83
+
84
+ $this->assertStringEqualsFile(
85
+ __DIR__.'/../fixtures/resources-target-attributes.xlf',
86
+ $dumper->formatCatalogue($catalogue, 'messages', array('default_locale' => 'fr_FR'))
87
+ );
88
  }
89
  }
vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php CHANGED
@@ -16,17 +16,31 @@ use Symfony\Component\Translation\Dumper\YamlFileDumper;
16
 
17
  class YamlFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
- public function testDump()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
- $catalogue->add(array('foo' => 'bar'));
 
 
 
 
23
 
24
- $tempDir = sys_get_temp_dir();
25
  $dumper = new YamlFileDumper();
26
- $dumper->dump($catalogue, array('path' => $tempDir));
27
 
28
- $this->assertEquals(file_get_contents(__DIR__.'/../fixtures/resources.yml'), file_get_contents($tempDir.'/messages.en.yml'));
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- unlink($tempDir.'/messages.en.yml');
31
  }
32
  }
16
 
17
  class YamlFileDumperTest extends \PHPUnit_Framework_TestCase
18
  {
19
+ public function testTreeFormatCatalogue()
20
  {
21
  $catalogue = new MessageCatalogue('en');
22
+ $catalogue->add(
23
+ array(
24
+ 'foo.bar1' => 'value1',
25
+ 'foo.bar2' => 'value2',
26
+ ));
27
 
 
28
  $dumper = new YamlFileDumper();
 
29
 
30
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/messages.yml', $dumper->formatCatalogue($catalogue, 'messages', array('as_tree' => true, 'inline' => 999)));
31
+ }
32
+
33
+ public function testLinearFormatCatalogue()
34
+ {
35
+ $catalogue = new MessageCatalogue('en');
36
+ $catalogue->add(
37
+ array(
38
+ 'foo.bar1' => 'value1',
39
+ 'foo.bar2' => 'value2',
40
+ ));
41
+
42
+ $dumper = new YamlFileDumper();
43
 
44
+ $this->assertStringEqualsFile(__DIR__.'/../fixtures/messages_linear.yml', $dumper->formatCatalogue($catalogue, 'messages'));
45
  }
46
  }
vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php CHANGED
@@ -62,9 +62,6 @@ class XliffFileLoaderTest extends \PHPUnit_Framework_TestCase
62
  $this->assertEquals(array('foo' => 'bar', 'extra' => 'extra', 'key' => '', 'test' => 'with'), $catalogue->all('domain1'));
63
  }
64
 
65
- /**
66
- * @requires extension mbstring
67
- */
68
  public function testEncoding()
69
  {
70
  $loader = new XliffFileLoader();
@@ -75,6 +72,15 @@ class XliffFileLoaderTest extends \PHPUnit_Framework_TestCase
75
  $this->assertEquals(array('notes' => array(array('content' => utf8_decode('bäz')))), $catalogue->getMetadata('foo', 'domain1'));
76
  }
77
 
 
 
 
 
 
 
 
 
 
78
  /**
79
  * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
80
  */
@@ -142,4 +148,22 @@ class XliffFileLoaderTest extends \PHPUnit_Framework_TestCase
142
  // message with empty target
143
  $this->assertEquals(array('notes' => array(array('content' => 'baz'), array('priority' => 2, 'from' => 'bar', 'content' => 'qux'))), $catalogue->getMetadata('key', 'domain1'));
144
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
  }
62
  $this->assertEquals(array('foo' => 'bar', 'extra' => 'extra', 'key' => '', 'test' => 'with'), $catalogue->all('domain1'));
63
  }
64
 
 
 
 
65
  public function testEncoding()
66
  {
67
  $loader = new XliffFileLoader();
72
  $this->assertEquals(array('notes' => array(array('content' => utf8_decode('bäz')))), $catalogue->getMetadata('foo', 'domain1'));
73
  }
74
 
75
+ public function testTargetAttributesAreStoredCorrectly()
76
+ {
77
+ $loader = new XliffFileLoader();
78
+ $catalogue = $loader->load(__DIR__.'/../fixtures/with-attributes.xlf', 'en', 'domain1');
79
+
80
+ $metadata = $catalogue->getMetadata('foo', 'domain1');
81
+ $this->assertEquals('translated', $metadata['target-attributes']['state']);
82
+ }
83
+
84
  /**
85
  * @expectedException \Symfony\Component\Translation\Exception\InvalidResourceException
86
  */
148
  // message with empty target
149
  $this->assertEquals(array('notes' => array(array('content' => 'baz'), array('priority' => 2, 'from' => 'bar', 'content' => 'qux'))), $catalogue->getMetadata('key', 'domain1'));
150
  }
151
+
152
+ public function testLoadVersion2()
153
+ {
154
+ $loader = new XliffFileLoader();
155
+ $resource = __DIR__.'/../fixtures/resources-2.0.xlf';
156
+ $catalogue = $loader->load($resource, 'en', 'domain1');
157
+
158
+ $this->assertEquals('en', $catalogue->getLocale());
159
+ $this->assertEquals(array(new FileResource($resource)), $catalogue->getResources());
160
+ $this->assertSame(array(), libxml_get_errors());
161
+
162
+ $domains = $catalogue->all();
163
+ $this->assertCount(3, $domains['domain1']);
164
+ $this->assertContainsOnly('string', $catalogue->all('domain1'));
165
+
166
+ // target attributes
167
+ $this->assertEquals(array('target-attributes' => array('order' => 1)), $catalogue->getMetadata('bar', 'domain1'));
168
+ }
169
  }
vendor/symfony/translation/Tests/TranslatorCacheTest.php CHANGED
@@ -11,7 +11,7 @@
11
 
12
  namespace Symfony\Component\Translation\Tests;
13
 
14
- use Symfony\Component\Config\Resource\ResourceInterface;
15
  use Symfony\Component\Translation\Loader\ArrayLoader;
16
  use Symfony\Component\Translation\Loader\LoaderInterface;
17
  use Symfony\Component\Translation\Translator;
@@ -228,7 +228,7 @@ class TranslatorCacheTest extends \PHPUnit_Framework_TestCase
228
 
229
  public function testRefreshCacheWhenResourcesAreNoLongerFresh()
230
  {
231
- $resource = $this->getMock('Symfony\Component\Config\Resource\ResourceInterface');
232
  $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
233
  $resource->method('isFresh')->will($this->returnValue(false));
234
  $loader
@@ -281,7 +281,7 @@ class TranslatorCacheTest extends \PHPUnit_Framework_TestCase
281
  }
282
  }
283
 
284
- class StaleResource implements ResourceInterface
285
  {
286
  public function isFresh($timestamp)
287
  {
11
 
12
  namespace Symfony\Component\Translation\Tests;
13
 
14
+ use Symfony\Component\Config\Resource\SelfCheckingResourceInterface;
15
  use Symfony\Component\Translation\Loader\ArrayLoader;
16
  use Symfony\Component\Translation\Loader\LoaderInterface;
17
  use Symfony\Component\Translation\Translator;
228
 
229
  public function testRefreshCacheWhenResourcesAreNoLongerFresh()
230
  {
231
+ $resource = $this->getMock('Symfony\Component\Config\Resource\SelfCheckingResourceInterface');
232
  $loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
233
  $resource->method('isFresh')->will($this->returnValue(false));
234
  $loader
281
  }
282
  }
283
 
284
+ class StaleResource implements SelfCheckingResourceInterface
285
  {
286
  public function isFresh($timestamp)
287
  {
vendor/symfony/translation/Tests/TranslatorTest.php CHANGED
@@ -495,120 +495,6 @@ class TranslatorTest extends \PHPUnit_Framework_TestCase
495
  // unchanged if it can't be found
496
  $this->assertEquals('some_message2', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
497
  }
498
-
499
- /**
500
- * @dataProvider dataProviderGetMessages
501
- */
502
- public function testGetMessages($resources, $locale, $expected)
503
- {
504
- $locales = array_keys($resources);
505
- $_locale = null !== $locale ? $locale : reset($locales);
506
- $locales = array_slice($locales, 0, array_search($_locale, $locales));
507
-
508
- $translator = new Translator($_locale, new MessageSelector());
509
- $translator->setFallbackLocales(array_reverse($locales));
510
- $translator->addLoader('array', new ArrayLoader());
511
- foreach ($resources as $_locale => $domainMessages) {
512
- foreach ($domainMessages as $domain => $messages) {
513
- $translator->addResource('array', $messages, $_locale, $domain);
514
- }
515
- }
516
- $result = $translator->getMessages($locale);
517
-
518
- $this->assertEquals($expected, $result);
519
- }
520
-
521
- public function dataProviderGetMessages()
522
- {
523
- $resources = array(
524
- 'en' => array(
525
- 'jsmessages' => array(
526
- 'foo' => 'foo (EN)',
527
- 'bar' => 'bar (EN)',
528
- ),
529
- 'messages' => array(
530
- 'foo' => 'foo messages (EN)',
531
- ),
532
- 'validators' => array(
533
- 'int' => 'integer (EN)',
534
- ),
535
- ),
536
- 'pt-PT' => array(
537
- 'messages' => array(
538
- 'foo' => 'foo messages (PT)',
539
- ),
540
- 'validators' => array(
541
- 'str' => 'integer (PT)',
542
- ),
543
- ),
544
- 'pt_BR' => array(
545
- 'validators' => array(
546
- 'int' => 'integer (BR)',
547
- ),
548
- ),
549
- );
550
-
551
- return array(
552
- array($resources, null,
553
- array(
554
- 'jsmessages' => array(
555
- 'foo' => 'foo (EN)',
556
- 'bar' => 'bar (EN)',
557
- ),
558
- 'messages' => array(
559
- 'foo' => 'foo messages (EN)',
560
- ),
561
- 'validators' => array(
562
- 'int' => 'integer (EN)',
563
- ),
564
- ),
565
- ),
566
- array($resources, 'en',
567
- array(
568
- 'jsmessages' => array(
569
- 'foo' => 'foo (EN)',
570
- 'bar' => 'bar (EN)',
571
- ),
572
- 'messages' => array(
573
- 'foo' => 'foo messages (EN)',
574
- ),
575
- 'validators' => array(
576
- 'int' => 'integer (EN)',
577
- ),
578
- ),
579
- ),
580
- array($resources, 'pt-PT',
581
- array(
582
- 'jsmessages' => array(
583
- 'foo' => 'foo (EN)',
584
- 'bar' => 'bar (EN)',
585
- ),
586
- 'messages' => array(
587
- 'foo' => 'foo messages (PT)',
588
- ),
589
- 'validators' => array(
590
- 'int' => 'integer (EN)',
591
- 'str' => 'integer (PT)',
592
- ),
593
- ),
594
- ),
595
- array($resources, 'pt_BR',
596
- array(
597
- 'jsmessages' => array(
598
- 'foo' => 'foo (EN)',
599
- 'bar' => 'bar (EN)',
600
- ),
601
- 'messages' => array(
602
- 'foo' => 'foo messages (PT)',
603
- ),
604
- 'validators' => array(
605
- 'int' => 'integer (BR)',
606
- 'str' => 'integer (PT)',
607
- ),
608
- ),
609
- ),
610
- );
611
- }
612
  }
613
 
614
  class StringClass
495
  // unchanged if it can't be found
496
  $this->assertEquals('some_message2', $translator->transChoice('some_message2', 10, array('%count%' => 10)));
497
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
  }
499
 
500
  class StringClass
vendor/symfony/translation/Tests/Util/ArrayConverterTest.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Translation\Tests\Util;
13
+
14
+ use Symfony\Component\Translation\Util\ArrayConverter;
15
+
16
+ class ArrayConverterTest extends \PHPUnit_Framework_TestCase
17
+ {
18
+ /**
19
+ * @dataProvider messsagesData
20
+ */
21
+ public function testDump($input, $expectedOutput)
22
+ {
23
+ $this->assertEquals($expectedOutput, ArrayConverter::expandToTree($input));
24
+ }
25
+
26
+ public function messsagesData()
27
+ {
28
+ return array(
29
+ array(
30
+ // input
31
+ array(
32
+ 'foo1' => 'bar',
33
+ 'foo.bar' => 'value',
34
+ ),
35
+ // expected output
36
+ array(
37
+ 'foo1' => 'bar',
38
+ 'foo' => array('bar' => 'value'),
39
+ ),
40
+ ),
41
+ array(
42
+ // input
43
+ array(
44
+ 'foo.bar' => 'value1',
45
+ 'foo.bar.test' => 'value2',
46
+ ),
47
+ // expected output
48
+ array(
49
+ 'foo' => array(
50
+ 'bar' => 'value1',
51
+ 'bar.test' => 'value2',
52
+ ),
53
+ ),
54
+ ),
55
+ array(
56
+ // input
57
+ array(
58
+ 'foo.level2.level3.level4' => 'value1',
59
+ 'foo.level2' => 'value2',
60
+ 'foo.bar' => 'value3',
61
+ ),
62
+ // expected output
63
+ array(
64
+ 'foo' => array(
65
+ 'level2' => 'value2',
66
+ 'level2.level3.level4' => 'value1',
67
+ 'bar' => 'value3',
68
+ ),
69
+ ),
70
+ ),
71
+ );
72
+ }
73
+ }
vendor/symfony/translation/Tests/fixtures/messages.yml ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ foo:
2
+ bar1: value1
3
+ bar2: value2
vendor/symfony/translation/Tests/fixtures/messages_linear.yml ADDED
@@ -0,0 +1,2 @@
 
 
1
+ foo.bar1: value1
2
+ foo.bar2: value2
vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="fr-FR" trgLang="en-US">
3
+ <file id="messages.en_US">
4
+ <unit id="acbd18db4cc2f85cedef654fccc4a4d8">
5
+ <segment>
6
+ <source>foo</source>
7
+ <target>bar</target>
8
+ </segment>
9
+ </unit>
10
+ <unit id="3c6e0b8a9c15224a8228b9a98ca1531d">
11
+ <segment>
12
+ <source>key</source>
13
+ <target order="1"></target>
14
+ </segment>
15
+ </unit>
16
+ <unit id="18e6a493872558d949b4c16ea1fa6ab6">
17
+ <segment>
18
+ <source>key.with.cdata</source>
19
+ <target><![CDATA[<source> & <target>]]></target>
20
+ </segment>
21
+ </unit>
22
+ </file>
23
+ </xliff>
vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en-US" trgLang="ja-JP">
2
+ <file id="f1" original="Graphic Example.psd">
3
+ <skeleton href="Graphic Example.psd.skl"/>
4
+ <unit id="1">
5
+ <segment>
6
+ <source>Quetzal</source>
7
+ <target>Quetzal</target>
8
+ </segment>
9
+ </unit>
10
+ <group id="1">
11
+ <unit id="2">
12
+ <segment>
13
+ <source>foo</source>
14
+ <target>XLIFF 文書を編集、または処理 するアプリケーションです。</target>
15
+ </segment>
16
+ </unit>
17
+ <unit id="3">
18
+ <segment>
19
+ <source>bar</source>
20
+ <target order="1">XLIFF データ・マネージャ</target>
21
+ </segment>
22
+ </unit>
23
+ </group>
24
+ </file>
25
+ </xliff>
vendor/symfony/translation/Tests/fixtures/resources-clean.xlf CHANGED
@@ -1,6 +1,9 @@
1
  <?xml version="1.0" encoding="utf-8"?>
2
  <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3
  <file source-language="fr-FR" target-language="en-US" datatype="plaintext" original="file.ext">
 
 
 
4
  <body>
5
  <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
6
  <source>foo</source>
1
  <?xml version="1.0" encoding="utf-8"?>
2
  <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3
  <file source-language="fr-FR" target-language="en-US" datatype="plaintext" original="file.ext">
4
+ <header>
5
+ <tool tool-id="symfony" tool-name="Symfony"/>
6
+ </header>
7
  <body>
8
  <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
9
  <source>foo</source>
vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3
+ <file source-language="fr-FR" target-language="en-US" datatype="plaintext" original="file.ext">
4
+ <header>
5
+ <tool tool-id="symfony" tool-name="Symfony"/>
6
+ </header>
7
+ <body>
8
+ <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
9
+ <source>foo</source>
10
+ <target state="needs-translation">bar</target>
11
+ </trans-unit>
12
+ </body>
13
+ </file>
14
+ </xliff>
vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3
+ <file source-language="en-US" target-language="en-US" datatype="plaintext" original="file.ext">
4
+ <header>
5
+ <tool tool-id="foo" tool-name="foo" tool-version="0.0" tool-company="Foo"/>
6
+ </header>
7
+ <body>
8
+ <trans-unit id="acbd18db4cc2f85cedef654fccc4a4d8" resname="foo">
9
+ <source>foo</source>
10
+ <target>bar</target>
11
+ </trans-unit>
12
+ </body>
13
+ </file>
14
+ </xliff>
vendor/symfony/translation/Tests/fixtures/resources.dump.json ADDED
@@ -0,0 +1 @@
 
1
+ {"foo":"\u0022bar\u0022"}
vendor/symfony/translation/Tests/fixtures/with-attributes.xlf ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
3
+ <file source-language="en" datatype="plaintext" original="file.ext">
4
+ <body>
5
+ <trans-unit id="1">
6
+ <source>foo</source>
7
+ <target state="translated">bar</target>
8
+ </trans-unit>
9
+ <trans-unit id="2">
10
+ <source>extra</source>
11
+ <target state="needs-translation">bar</target>
12
+ </trans-unit>
13
+ <trans-unit id="3">
14
+ <source>key</source>
15
+ <target></target>
16
+ <note>baz</note>
17
+ <note priority="2" from="bar">qux</note>
18
+ </trans-unit>
19
+ </body>
20
+ </file>
21
+ </xliff>
vendor/symfony/translation/Translator.php CHANGED
@@ -32,7 +32,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
32
  /**
33
  * @var string
34
  */
35
- protected $locale;
36
 
37
  /**
38
  * @var array
@@ -152,22 +152,6 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
152
  return $this->locale;
153
  }
154
 
155
- /**
156
- * Sets the fallback locale(s).
157
- *
158
- * @param string|array $locales The fallback locale(s)
159
- *
160
- * @throws \InvalidArgumentException If a locale contains invalid characters
161
- *
162
- * @deprecated since version 2.3, to be removed in 3.0. Use setFallbackLocales() instead.
163
- */
164
- public function setFallbackLocale($locales)
165
- {
166
- @trigger_error('The '.__METHOD__.' method is deprecated since version 2.3 and will be removed in 3.0. Use the setFallbackLocales() method instead.', E_USER_DEPRECATED);
167
-
168
- $this->setFallbackLocales(is_array($locales) ? $locales : array($locales));
169
- }
170
-
171
  /**
172
  * Sets the fallback locales.
173
  *
@@ -261,24 +245,6 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
261
  return $this->loaders;
262
  }
263
 
264
- /**
265
- * Collects all messages for the given locale.
266
- *
267
- * @param string|null $locale Locale of translations, by default is current locale
268
- *
269
- * @return array[array] indexed by catalog
270
- */
271
- public function getMessages($locale = null)
272
- {
273
- $catalogue = $this->getCatalogue($locale);
274
- $messages = $catalogue->all();
275
- while ($catalogue = $catalogue->getFallbackCatalogue()) {
276
- $messages = array_replace_recursive($catalogue->all(), $messages);
277
- }
278
-
279
- return $messages;
280
- }
281
-
282
  /**
283
  * @param string $locale
284
  */
@@ -319,10 +285,9 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
319
  }
320
 
321
  $this->assertValidLocale($locale);
322
- $self = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
323
  $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
324
- function (ConfigCacheInterface $cache) use ($self, $locale) {
325
- $self->dumpCatalogue($locale, $cache);
326
  }
327
  );
328
 
@@ -335,12 +300,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
335
  $this->catalogues[$locale] = include $cache->getPath();
336
  }
337
 
338
- /**
339
- * This method is public because it needs to be callable from a closure in PHP 5.3. It should be made protected (or even private, if possible) in 3.0.
340
- *
341
- * @internal
342
- */
343
- public function dumpCatalogue($locale, ConfigCacheInterface $cache)
344
  {
345
  $this->initializeCatalogue($locale);
346
  $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
32
  /**
33
  * @var string
34
  */
35
+ private $locale;
36
 
37
  /**
38
  * @var array
152
  return $this->locale;
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  /**
156
  * Sets the fallback locales.
157
  *
245
  return $this->loaders;
246
  }
247
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  /**
249
  * @param string $locale
250
  */
285
  }
286
 
287
  $this->assertValidLocale($locale);
 
288
  $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
289
+ function (ConfigCacheInterface $cache) use ($locale) {
290
+ $this->dumpCatalogue($locale, $cache);
291
  }
292
  );
293
 
300
  $this->catalogues[$locale] = include $cache->getPath();
301
  }
302
 
303
+ private function dumpCatalogue($locale, ConfigCacheInterface $cache)
 
 
 
 
 
304
  {
305
  $this->initializeCatalogue($locale);
306
  $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
vendor/symfony/translation/Util/ArrayConverter.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Translation\Util;
13
+
14
+ /**
15
+ * ArrayConverter generates tree like structure from a message catalogue.
16
+ * e.g. this
17
+ * 'foo.bar1' => 'test1',
18
+ * 'foo.bar2' => 'test2'
19
+ * converts to follows:
20
+ * foo:
21
+ * bar1: test1
22
+ * bar2: test2.
23
+ *
24
+ * @author Gennady Telegin <gtelegin@gmail.com>
25
+ */
26
+ class ArrayConverter
27
+ {
28
+ /**
29
+ * Converts linear messages array to tree-like array.
30
+ * For example this rray('foo.bar' => 'value') will be converted to array('foo' => array('bar' => 'value')).
31
+ *
32
+ * @param array $messages Linear messages array
33
+ *
34
+ * @return array Tree-like messages array
35
+ */
36
+ public static function expandToTree(array $messages)
37
+ {
38
+ $tree = array();
39
+
40
+ foreach ($messages as $id => $value) {
41
+ $referenceToElement = &self::getElementByPath($tree, explode('.', $id));
42
+
43
+ $referenceToElement = $value;
44
+
45
+ unset($referenceToElement);
46
+ }
47
+
48
+ return $tree;
49
+ }
50
+
51
+ private static function &getElementByPath(array &$tree, array $parts)
52
+ {
53
+ $elem = &$tree;
54
+ $parentOfElem = null;
55
+
56
+ foreach ($parts as $i => $part) {
57
+ if (isset($elem[$part]) && is_string($elem[$part])) {
58
+ /* Process next case:
59
+ * 'foo': 'test1',
60
+ * 'foo.bar': 'test2'
61
+ *
62
+ * $tree['foo'] was string before we found array {bar: test2}.
63
+ * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2';
64
+ */
65
+ $elem = &$elem[ implode('.', array_slice($parts, $i)) ];
66
+ break;
67
+ }
68
+ $parentOfElem = &$elem;
69
+ $elem = &$elem[$part];
70
+ }
71
+
72
+ if (is_array($elem) && count($elem) > 0 && $parentOfElem) {
73
+ /* Process next case:
74
+ * 'foo.bar': 'test1'
75
+ * 'foo': 'test2'
76
+ *
77
+ * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`.
78
+ * Cancel treating $tree['foo'] as array and cancel back it expansion,
79
+ * e.g. make it $tree['foo.bar'] = 'test1' again.
80
+ */
81
+ self::cancelExpand($parentOfElem, $part, $elem);
82
+ }
83
+
84
+ return $elem;
85
+ }
86
+
87
+ private static function cancelExpand(array &$tree, $prefix, array $node)
88
+ {
89
+ $prefix .= '.';
90
+
91
+ foreach ($node as $id => $value) {
92
+ if (is_string($value)) {
93
+ $tree[$prefix.$id] = $value;
94
+ } else {
95
+ self::cancelExpand($tree, $prefix.$id, $value);
96
+ }
97
+ }
98
+ }
99
+ }
vendor/symfony/translation/composer.json CHANGED
@@ -16,16 +16,17 @@
16
  }
17
  ],
18
  "require": {
19
- "php": ">=5.3.9"
 
20
  },
21
  "require-dev": {
22
- "symfony/config": "~2.7",
23
- "symfony/intl": "~2.4",
24
- "symfony/yaml": "~2.2",
25
  "psr/log": "~1.0"
26
  },
27
  "conflict": {
28
- "symfony/config": "<2.7"
29
  },
30
  "suggest": {
31
  "symfony/config": "",
@@ -41,7 +42,7 @@
41
  "minimum-stability": "dev",
42
  "extra": {
43
  "branch-alias": {
44
- "dev-master": "2.7-dev"
45
  }
46
  }
47
  }
16
  }
17
  ],
18
  "require": {
19
+ "php": ">=5.5.9",
20
+ "symfony/polyfill-mbstring": "~1.0"
21
  },
22
  "require-dev": {
23
+ "symfony/config": "~2.8|~3.0",
24
+ "symfony/intl": "~2.8|~3.0",
25
+ "symfony/yaml": "~2.8|~3.0",
26
  "psr/log": "~1.0"
27
  },
28
  "conflict": {
29
+ "symfony/config": "<2.8"
30
  },
31
  "suggest": {
32
  "symfony/config": "",
42
  "minimum-stability": "dev",
43
  "extra": {
44
  "branch-alias": {
45
+ "dev-master": "3.0-dev"
46
  }
47
  }
48
  }