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 | 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
- assets/css/admin-activation.min.css +1 -1
- assets/css/admin-add-calendar.min.css +1 -1
- assets/css/admin.min.css +1 -1
- assets/css/default-calendar-grid.min.css +1 -1
- assets/css/default-calendar-list.min.css +1 -1
- assets/js/admin-add-calendar.min.js +1 -1
- assets/js/admin.js +64 -63
- assets/js/admin.min.js +2 -2
- assets/js/default-calendar.min.js +1 -1
- google-calendar-events.php +2 -2
- includes/admin/metaboxes/settings.php +1 -1
- includes/admin/welcome.php +1 -1
- includes/calendars/admin/default-calendar-admin.php +14 -0
- includes/events/event-builder.php +19 -7
- readme.txt +6 -1
- vendor/autoload_52.php +1 -1
- vendor/composer/ClassLoader.php +3 -3
- vendor/composer/autoload_classmap.php +5 -40
- vendor/composer/autoload_files.php +2 -1
- vendor/composer/autoload_psr4.php +1 -0
- vendor/composer/autoload_real.php +8 -4
- vendor/composer/autoload_real_52.php +4 -3
- vendor/composer/installed.json +73 -14
- vendor/symfony/polyfill-mbstring/LICENSE +19 -0
- vendor/symfony/polyfill-mbstring/Mbstring.php +604 -0
- vendor/symfony/polyfill-mbstring/README.md +13 -0
- vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser +1 -0
- vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser +1 -0
- vendor/symfony/polyfill-mbstring/bootstrap.php +51 -0
- vendor/symfony/polyfill-mbstring/composer.json +34 -0
- vendor/symfony/translation/CHANGELOG.md +22 -0
- vendor/symfony/translation/Catalogue/AbstractOperation.php +33 -8
- vendor/symfony/translation/Catalogue/MergeOperation.php +5 -1
- vendor/symfony/translation/Catalogue/OperationInterface.php +18 -4
- vendor/symfony/translation/Catalogue/{DiffOperation.php → TargetOperation.php} +17 -3
- vendor/symfony/translation/DataCollector/TranslationDataCollector.php +6 -1
- vendor/symfony/translation/DataCollectorTranslator.php +8 -4
- vendor/symfony/translation/Dumper/CsvFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/FileDumper.php +3 -2
- vendor/symfony/translation/Dumper/IcuResFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/IniFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/JsonFileDumper.php +8 -2
- vendor/symfony/translation/Dumper/MoFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/PhpFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/PoFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/QtFileDumper.php +1 -1
- vendor/symfony/translation/Dumper/XliffFileDumper.php +91 -17
- vendor/symfony/translation/Dumper/YamlFileDumper.php +13 -2
- vendor/symfony/translation/Loader/CsvFileLoader.php +3 -19
- vendor/symfony/translation/Loader/FileLoader.php +65 -0
- vendor/symfony/translation/Loader/IniFileLoader.php +3 -23
- vendor/symfony/translation/Loader/JsonFileLoader.php +3 -20
- vendor/symfony/translation/Loader/MoFileLoader.php +3 -40
- vendor/symfony/translation/Loader/PhpFileLoader.php +3 -23
- vendor/symfony/translation/Loader/PoFileLoader.php +3 -40
- vendor/symfony/translation/Loader/XliffFileLoader.php +191 -62
- vendor/symfony/translation/Loader/YamlFileLoader.php +7 -33
- vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd +411 -0
- vendor/symfony/translation/PluralizationRules.php +1 -7
- vendor/symfony/translation/README.md +1 -1
- vendor/symfony/translation/Tests/Catalogue/{DiffOperationTest.php → TargetOperationTest.php} +4 -3
- vendor/symfony/translation/Tests/DataCollector/TranslationDataCollectorTest.php +28 -1
- vendor/symfony/translation/Tests/DataCollectorTranslatorTest.php +18 -0
- vendor/symfony/translation/Tests/Dumper/CsvFileDumperTest.php +2 -6
- vendor/symfony/translation/Tests/Dumper/FileDumperTest.php +14 -1
- vendor/symfony/translation/Tests/Dumper/IcuResFileDumperTest.php +2 -11
- vendor/symfony/translation/Tests/Dumper/IniFileDumperTest.php +2 -6
- vendor/symfony/translation/Tests/Dumper/JsonFileDumperTest.php +11 -9
- vendor/symfony/translation/Tests/Dumper/MoFileDumperTest.php +2 -5
- vendor/symfony/translation/Tests/Dumper/PhpFileDumperTest.php +2 -6
- vendor/symfony/translation/Tests/Dumper/PoFileDumperTest.php +2 -5
- vendor/symfony/translation/Tests/Dumper/QtFileDumperTest.php +2 -6
- vendor/symfony/translation/Tests/Dumper/XliffFileDumperTest.php +55 -7
- vendor/symfony/translation/Tests/Dumper/YamlFileDumperTest.php +20 -6
- vendor/symfony/translation/Tests/Loader/XliffFileLoaderTest.php +27 -3
- vendor/symfony/translation/Tests/TranslatorCacheTest.php +3 -3
- vendor/symfony/translation/Tests/TranslatorTest.php +0 -114
- vendor/symfony/translation/Tests/Util/ArrayConverterTest.php +73 -0
- vendor/symfony/translation/Tests/fixtures/messages.yml +3 -0
- vendor/symfony/translation/Tests/fixtures/messages_linear.yml +2 -0
- vendor/symfony/translation/Tests/fixtures/resources-2.0-clean.xlf +23 -0
- vendor/symfony/translation/Tests/fixtures/resources-2.0.xlf +25 -0
- vendor/symfony/translation/Tests/fixtures/resources-clean.xlf +3 -0
- vendor/symfony/translation/Tests/fixtures/resources-target-attributes.xlf +14 -0
- vendor/symfony/translation/Tests/fixtures/resources-tool-info.xlf +14 -0
- vendor/symfony/translation/Tests/fixtures/resources.dump.json +1 -0
- vendor/symfony/translation/Tests/fixtures/with-attributes.xlf +21 -0
- vendor/symfony/translation/Translator.php +4 -44
- vendor/symfony/translation/Util/ArrayConverter.php +99 -0
- vendor/symfony/translation/composer.json +7 -6
assets/css/admin-activation.min.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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/css/admin-add-calendar.min.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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/css/admin.min.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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/css/default-calendar-grid.min.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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/css/default-calendar-list.min.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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-add-calendar.min.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
/*! Simple Calendar - 3.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 |
-
(
|
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
|
72 |
-
ul
|
73 |
-
tabs
|
74 |
-
tab
|
75 |
-
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
|
126 |
-
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
|
194 |
-
select
|
195 |
-
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
|
207 |
preview = preview.trim() + selected.data( 'preview' );
|
208 |
} else {
|
209 |
-
format
|
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
|
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
|
248 |
-
max
|
249 |
|
250 |
field.on( 'change', function() {
|
251 |
|
@@ -269,12 +270,12 @@
|
|
269 |
|
270 |
options.each( function( e, option ) {
|
271 |
|
272 |
-
var show
|
273 |
-
showMany
|
274 |
-
hide
|
275 |
-
hideMany
|
276 |
|
277 |
-
var
|
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
|
312 |
-
field
|
313 |
-
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
|
387 |
-
method
|
388 |
-
data
|
389 |
action: 'simcal_clear_cache',
|
390 |
-
id
|
391 |
},
|
392 |
beforeSend: function() {
|
393 |
spinner.fadeToggle();
|
394 |
},
|
395 |
-
success
|
396 |
spinner.fadeToggle();
|
397 |
},
|
398 |
-
error
|
399 |
console.log( response );
|
400 |
}
|
401 |
} );
|
@@ -409,11 +410,11 @@
|
|
409 |
|
410 |
var nlMetaBox = $( '#simcal-drip' ),
|
411 |
signupDiv = nlMetaBox.find( '.signup' ),
|
412 |
-
thankYou
|
413 |
-
nlForm
|
414 |
-
name
|
415 |
-
nameReal
|
416 |
-
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
|
454 |
-
method
|
455 |
-
data
|
456 |
-
action
|
457 |
-
add_on
|
458 |
-
license_key
|
459 |
license_action: manage_license_action,
|
460 |
-
nonce
|
461 |
},
|
462 |
beforeSend: function() {
|
463 |
spinner.fadeToggle();
|
464 |
},
|
465 |
-
success
|
466 |
spinner.fadeToggle();
|
467 |
if ( 'activate_license' == manage_license_action ) {
|
468 |
if ( 'valid' == response.data ) {
|
@@ -486,7 +487,7 @@
|
|
486 |
}
|
487 |
}
|
488 |
},
|
489 |
-
error
|
490 |
console.log( response );
|
491 |
spinner.fadeToggle();
|
492 |
}
|
@@ -506,25 +507,25 @@
|
|
506 |
return;
|
507 |
}
|
508 |
|
509 |
-
$.ajax({
|
510 |
-
url
|
511 |
-
method
|
512 |
-
data
|
513 |
action: 'simcal_reset_add_ons_licenses',
|
514 |
-
nonce
|
515 |
},
|
516 |
beforeSend: function() {
|
517 |
spinner.toggle();
|
518 |
},
|
519 |
-
success: function
|
520 |
if ( 'success' == response.data ) {
|
521 |
location.reload();
|
522 |
} else {
|
523 |
console.log( response );
|
524 |
}
|
525 |
},
|
526 |
-
error
|
527 |
-
console.log(response);
|
528 |
}
|
529 |
} );
|
530 |
|
@@ -532,4 +533,4 @@
|
|
532 |
|
533 |
} );
|
534 |
|
535 |
-
}
|
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.
|
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");
|
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.
|
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 |
* 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.
|
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
|
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
|
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 → Settings → 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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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
|
887 |
-
$
|
888 |
|
889 |
if ( ! empty( $organizer['email'] ) && ( 'show' == $attr['email'] ) ) {
|
890 |
-
$
|
891 |
}
|
892 |
|
893 |
-
return '<div class="simcal-organizer" itemprop="organizer" itemscope itemtype="https://schema.org/Person">' . $
|
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 |
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
|
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 . '/
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
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
|
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('
|
23 |
self::$loader = $loader = new xrstf_Composer52_ClassLoader();
|
24 |
-
spl_autoload_unregister(array('
|
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/
|
187 |
"reference": "c12147245286b5b9053d1745995677e6df36e96d"
|
188 |
},
|
189 |
"dist": {
|
190 |
"type": "zip",
|
191 |
-
"url": "https://api.github.com/repos/
|
192 |
"reference": "c12147245286b5b9053d1745995677e6df36e96d",
|
193 |
"shasum": ""
|
194 |
},
|
@@ -300,43 +300,102 @@
|
|
300 |
"google"
|
301 |
]
|
302 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
303 |
{
|
304 |
"name": "symfony/translation",
|
305 |
-
"version": "
|
306 |
-
"version_normalized": "
|
307 |
"source": {
|
308 |
"type": "git",
|
309 |
"url": "https://github.com/symfony/translation.git",
|
310 |
-
"reference": "
|
311 |
},
|
312 |
"dist": {
|
313 |
"type": "zip",
|
314 |
-
"url": "https://api.github.com/repos/symfony/translation/zipball/
|
315 |
-
"reference": "
|
316 |
"shasum": ""
|
317 |
},
|
318 |
"require": {
|
319 |
-
"php": ">=5.
|
|
|
320 |
},
|
321 |
"conflict": {
|
322 |
-
"symfony/config": "<2.
|
323 |
},
|
324 |
"require-dev": {
|
325 |
"psr/log": "~1.0",
|
326 |
-
"symfony/config": "~2.
|
327 |
-
"symfony/intl": "~2.
|
328 |
-
"symfony/yaml": "~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:
|
336 |
"type": "library",
|
337 |
"extra": {
|
338 |
"branch-alias": {
|
339 |
-
"dev-master": "
|
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 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
*
|
|
|
|
|
|
|
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 |
-
*
|
|
|
|
|
|
|
|
|
|
|
16 |
*
|
17 |
-
* @author
|
18 |
*/
|
19 |
-
class
|
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 (
|
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 $
|
|
|
|
|
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
|
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->
|
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
|
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
|
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
|
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
|
27 |
{
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
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 |
-
|
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
|
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
|
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
|
32 |
{
|
|
|
|
|
|
|
|
|
|
|
33 |
if (array_key_exists('default_locale', $options)) {
|
34 |
-
$
|
35 |
} else {
|
36 |
-
$
|
37 |
}
|
38 |
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
}
|
41 |
|
42 |
/**
|
43 |
* {@inheritdoc}
|
44 |
*/
|
45 |
-
protected function
|
|
|
|
|
|
|
|
|
|
|
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('_', '-', $
|
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 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
$t->appendChild($text);
|
75 |
|
76 |
-
|
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 |
-
*
|
|
|
|
|
|
|
104 |
*/
|
105 |
-
|
106 |
{
|
107 |
-
return
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
24 |
{
|
25 |
private $delimiter = ';';
|
26 |
private $enclosure = '"';
|
@@ -29,16 +27,8 @@ class CsvFileLoader extends ArrayLoader
|
|
29 |
/**
|
30 |
* {@inheritdoc}
|
31 |
*/
|
32 |
-
|
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 |
-
|
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
|
24 |
{
|
25 |
/**
|
26 |
* {@inheritdoc}
|
27 |
*/
|
28 |
-
|
29 |
{
|
30 |
-
|
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
|
24 |
{
|
25 |
/**
|
26 |
* {@inheritdoc}
|
27 |
*/
|
28 |
-
|
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 |
-
|
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
|
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 |
-
* @
|
82 |
-
*
|
83 |
-
* @return array
|
84 |
-
*
|
85 |
-
* @throws InvalidResourceException If stream content has an invalid format.
|
86 |
*/
|
87 |
-
|
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
|
24 |
{
|
25 |
/**
|
26 |
* {@inheritdoc}
|
27 |
*/
|
28 |
-
|
29 |
{
|
30 |
-
|
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
|
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 |
-
* @
|
97 |
-
*
|
98 |
-
* @return array
|
99 |
*/
|
100 |
-
|
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 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
66 |
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
|
71 |
-
|
72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
|
74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
}
|
76 |
-
}
|
77 |
|
78 |
-
|
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 |
-
|
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 |
-
*
|
112 |
-
*
|
113 |
-
* @param string
|
114 |
-
*
|
115 |
-
* @throws \RuntimeException
|
116 |
-
*
|
117 |
-
* @return \SimpleXMLElement
|
118 |
*
|
119 |
* @throws InvalidResourceException
|
120 |
*/
|
121 |
-
private function
|
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 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
26 |
{
|
27 |
private $yamlParser;
|
28 |
|
29 |
/**
|
30 |
* {@inheritdoc}
|
31 |
*/
|
32 |
-
|
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 |
-
|
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/
|
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\
|
15 |
use Symfony\Component\Translation\MessageCatalogue;
|
16 |
use Symfony\Component\Translation\MessageCatalogueInterface;
|
17 |
|
18 |
-
class
|
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
|
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' =>
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
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->
|
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 |
-
|
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->
|
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
|
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->
|
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
|
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->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
-
|
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
|
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 |
-
|
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
|
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->
|
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
|
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 |
-
|
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
|
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->
|
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
|
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->
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
);
|
38 |
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
20 |
{
|
21 |
$catalogue = new MessageCatalogue('en');
|
22 |
-
$catalogue->add(
|
|
|
|
|
|
|
|
|
23 |
|
24 |
-
$tempDir = sys_get_temp_dir();
|
25 |
$dumper = new YamlFileDumper();
|
26 |
-
$dumper->dump($catalogue, array('path' => $tempDir));
|
27 |
|
28 |
-
$this->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
|
30 |
-
|
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\
|
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\
|
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
|
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 |
-
|
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 ($
|
325 |
-
$
|
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.
|
|
|
20 |
},
|
21 |
"require-dev": {
|
22 |
-
"symfony/config": "~2.
|
23 |
-
"symfony/intl": "~2.
|
24 |
-
"symfony/yaml": "~2.
|
25 |
"psr/log": "~1.0"
|
26 |
},
|
27 |
"conflict": {
|
28 |
-
"symfony/config": "<2.
|
29 |
},
|
30 |
"suggest": {
|
31 |
"symfony/config": "",
|
@@ -41,7 +42,7 @@
|
|
41 |
"minimum-stability": "dev",
|
42 |
"extra": {
|
43 |
"branch-alias": {
|
44 |
-
"dev-master": "
|
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 |
}
|