WP RSS Aggregator - Version 4.17.6

Version Description

(2020-07-29) = Added - A link in the New/Edit Feed Source page on how to find an RSS feed.

Changed - The "Force feed" option turns off SSL verification. - Improved wording on the Help page. - Dates in templates can now be translated. - The link to the article on how to find an RSS feed now links to an article from the plugin's knowledge base. - The "Unique Titles" feed option can now be set to default to the global setting.

Fixed - Rewrite rules would always get flushed when plugins tamper with them, such as Polylang Pro. - The "Delete All Imported Items" reset option was deleting all posts on the site. - Image options would not show up when using Feed to Post to import Feed Items.

Download this release

Release Info

Developer Mekku
Plugin Icon 128x128 WP RSS Aggregator
Version 4.17.6
Comparing to
See all releases

Code changes from version 4.17.5 to 4.17.6

Files changed (97) hide show
  1. CHANGELOG.md +19 -0
  2. css/admin-editor.css +3 -1
  3. css/admin-general-styles.css +5 -0
  4. includes/Aventura/Wprss/Core/Licensing/Settings.php +3 -3
  5. includes/admin-display.php +0 -16
  6. includes/admin-help.php +2 -3
  7. includes/admin-metaboxes.php +31 -13
  8. includes/admin-options.php +2 -2
  9. includes/feed-access.php +6 -1
  10. includes/feed-importing.php +3 -0
  11. includes/feed-processing.php +5 -0
  12. js/admin-custom.js +14 -2
  13. languages/{default.mo → wprss-en.mo} +0 -0
  14. languages/{default.po → wprss-en.po} +251 -195
  15. readme.txt +17 -1
  16. src/Handlers/CustomFeed/RegisterCustomFeedHandler.php +2 -7
  17. src/Modules/FeedSourcesModule.php +1 -1
  18. src/Modules/ImagesModule.php +2 -4
  19. src/Modules/TwigModule.php +3 -1
  20. src/Twig/Extensions/Date/TwigDateTranslator.php +115 -0
  21. templates/admin/tools/bulk_add.twig +1 -1
  22. templates/admin/tools/export.twig +1 -1
  23. templates/admin/tools/import.twig +1 -1
  24. templates/admin/tools/logs.twig +1 -1
  25. templates/admin/tools/reset.twig +2 -2
  26. vendor/composer/autoload_classmap.php +54 -0
  27. vendor/composer/autoload_files.php +1 -0
  28. vendor/composer/autoload_psr4.php +2 -0
  29. vendor/composer/autoload_static.php +65 -0
  30. vendor/composer/installed.json +149 -2
  31. vendor/symfony/polyfill-mbstring/LICENSE +19 -0
  32. vendor/symfony/polyfill-mbstring/Mbstring.php +847 -0
  33. vendor/symfony/polyfill-mbstring/README.md +13 -0
  34. vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -0
  35. vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -0
  36. vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1414 -0
  37. vendor/symfony/polyfill-mbstring/bootstrap.php +141 -0
  38. vendor/symfony/polyfill-mbstring/composer.json +38 -0
  39. vendor/symfony/translation/.gitignore +3 -0
  40. vendor/symfony/translation/Catalogue/AbstractOperation.php +155 -0
  41. vendor/symfony/translation/Catalogue/DiffOperation.php +33 -0
  42. vendor/symfony/translation/Catalogue/MergeOperation.php +55 -0
  43. vendor/symfony/translation/Catalogue/OperationInterface.php +77 -0
  44. vendor/symfony/translation/Catalogue/TargetOperation.php +69 -0
  45. vendor/symfony/translation/DataCollector/TranslationDataCollector.php +144 -0
  46. vendor/symfony/translation/DataCollectorTranslator.php +163 -0
  47. vendor/symfony/translation/Dumper/CsvFileDumper.php +73 -0
  48. vendor/symfony/translation/Dumper/DumperInterface.php +31 -0
  49. vendor/symfony/translation/Dumper/FileDumper.php +145 -0
  50. vendor/symfony/translation/Dumper/IcuResFileDumper.php +116 -0
  51. vendor/symfony/translation/Dumper/IniFileDumper.php +55 -0
  52. vendor/symfony/translation/Dumper/JsonFileDumper.php +54 -0
  53. vendor/symfony/translation/Dumper/MoFileDumper.php +92 -0
  54. vendor/symfony/translation/Dumper/PhpFileDumper.php +48 -0
  55. vendor/symfony/translation/Dumper/PoFileDumper.php +71 -0
  56. vendor/symfony/translation/Dumper/QtFileDumper.php +60 -0
  57. vendor/symfony/translation/Dumper/XliffFileDumper.php +193 -0
  58. vendor/symfony/translation/Dumper/YamlFileDumper.php +64 -0
  59. vendor/symfony/translation/Exception/ExceptionInterface.php +21 -0
  60. vendor/symfony/translation/Exception/InvalidResourceException.php +21 -0
  61. vendor/symfony/translation/Exception/NotFoundResourceException.php +21 -0
  62. vendor/symfony/translation/Extractor/AbstractFileExtractor.php +83 -0
  63. vendor/symfony/translation/Extractor/ChainExtractor.php +60 -0
  64. vendor/symfony/translation/Extractor/ExtractorInterface.php +38 -0
  65. vendor/symfony/translation/IdentityTranslator.php +63 -0
  66. vendor/symfony/translation/Interval.php +107 -0
  67. vendor/symfony/translation/LICENSE +19 -0
  68. vendor/symfony/translation/Loader/ArrayLoader.php +66 -0
  69. vendor/symfony/translation/Loader/CsvFileLoader.php +65 -0
  70. vendor/symfony/translation/Loader/FileLoader.php +65 -0
  71. vendor/symfony/translation/Loader/IcuDatFileLoader.php +62 -0
  72. vendor/symfony/translation/Loader/IcuResFileLoader.php +92 -0
  73. vendor/symfony/translation/Loader/IniFileLoader.php +28 -0
  74. vendor/symfony/translation/Loader/JsonFileLoader.php +64 -0
  75. vendor/symfony/translation/Loader/LoaderInterface.php +38 -0
  76. vendor/symfony/translation/Loader/MoFileLoader.php +148 -0
  77. vendor/symfony/translation/Loader/PhpFileLoader.php +28 -0
  78. vendor/symfony/translation/Loader/PoFileLoader.php +148 -0
  79. vendor/symfony/translation/Loader/QtFileLoader.php +77 -0
  80. vendor/symfony/translation/Loader/XliffFileLoader.php +326 -0
  81. vendor/symfony/translation/Loader/YamlFileLoader.php +48 -0
  82. vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-1.2-strict.xsd +2223 -0
  83. vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd +411 -0
  84. vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd +309 -0
  85. vendor/symfony/translation/LoggingTranslator.php +135 -0
  86. vendor/symfony/translation/MessageCatalogue.php +270 -0
  87. vendor/symfony/translation/MessageCatalogueInterface.php +136 -0
  88. vendor/symfony/translation/MessageSelector.php +86 -0
  89. vendor/symfony/translation/MetadataAwareInterface.php +54 -0
  90. vendor/symfony/translation/PluralizationRules.php +216 -0
  91. vendor/symfony/translation/Translator.php +476 -0
  92. vendor/symfony/translation/TranslatorBagInterface.php +31 -0
  93. vendor/symfony/translation/TranslatorInterface.php +65 -0
  94. vendor/symfony/translation/Util/ArrayConverter.php +99 -0
  95. vendor/symfony/translation/Writer/TranslationWriter.php +84 -0
  96. vendor/symfony/translation/composer.json +48 -0
  97. wp-rss-aggregator.php +2 -2
CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file.
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  ## [4.17.5] - 2020-04-22
8
  ### Changed
9
  * Now showing a case study of a site using the Pro Plan in the on-boarding wizard.
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
 
7
+ ## [4.17.6] - 2020-07-29
8
+ ### Added
9
+ * A link in the New/Edit Feed Source page on how to find an RSS feed.
10
+
11
+ ### Changed
12
+ * The "Force feed" option turns off SSL verification.
13
+ * Improved wording on the Help page.
14
+ * Dates in templates can now be translated.
15
+ * The link to the article on how to find an RSS feed now links to an article from the plugin's knowledge base.
16
+ * The "Unique Titles" feed option can now be set to default to the global setting.
17
+
18
+ ### Fixed
19
+ * Rewrite rules would always get flushed when plugins tamper with them, such as Polylang Pro.
20
+ * The "Delete All Imported Items" reset option was deleting all posts on the site.
21
+ * Image options would not show up when using Feed to Post to import Feed Items.
22
+
23
+ ### Removed
24
+ * A `gettext` filter that changes the text for saving feeds, for performance reasons.
25
+
26
  ## [4.17.5] - 2020-04-22
27
  ### Changed
28
  * Now showing a case study of a site using the Pro Plan in the on-boarding wizard.
css/admin-editor.css CHANGED
@@ -109,9 +109,11 @@
109
  vertical-align: top;
110
  }
111
 
112
- #validate-feed-link {
113
  font-size: 0.85em;
114
  text-decoration: none;
 
 
115
  margin-left: 3px;
116
  }
117
 
109
  vertical-align: top;
110
  }
111
 
112
+ .wprss-after-url-link {
113
  font-size: 0.85em;
114
  text-decoration: none;
115
+ }
116
+ #validate-feed-link {
117
  margin-left: 3px;
118
  }
119
 
css/admin-general-styles.css CHANGED
@@ -22,3 +22,8 @@ table.plugins tbody tr.wprss-et-plugin-row-msg > td > div > p::before {
22
  content: "\f348";
23
  color: #00a0d2;
24
  }
 
 
 
 
 
22
  content: "\f348";
23
  color: #00a0d2;
24
  }
25
+
26
+ /* Hide the image options in the new/edit page */
27
+ .postbox-container #wpra-images {
28
+ display: none;
29
+ }
includes/Aventura/Wprss/Core/Licensing/Settings.php CHANGED
@@ -180,7 +180,7 @@ class Settings {
180
  // License key field
181
  add_settings_field(
182
  sprintf( 'wprss_settings_%s_license', $_addonId ),
183
- __( 'License Key', WPRSS_TEXT_DOMAIN ),
184
  array( $this, 'renderLicenseKeyField' ),
185
  'wprss_settings_license_keys',
186
  sprintf( 'wprss_settings_%s_licenses_section', $_addonId ),
@@ -189,7 +189,7 @@ class Settings {
189
  // Activate license button
190
  add_settings_field(
191
  sprintf( 'wprss_settings_%s_activate_license', $_addonId ),
192
- __( 'Activate License', WPRSS_TEXT_DOMAIN ),
193
  array( $this, 'renderActivateLicenseButton' ),
194
  'wprss_settings_license_keys',
195
  sprintf( 'wprss_settings_%s_licenses_section', $_addonId ),
@@ -297,7 +297,7 @@ class Settings {
297
  if ( $status === 'item_name_mismatch' ) $status = 'invalid';
298
 
299
  $valid = $status == 'valid';
300
- $btnText = $valid ? 'Deactivate License' : 'Activate License';
301
  $btnName = "wprss_{$addonId}_license_" . ( $valid? 'deactivate' : 'activate' );
302
  $btnClass = "button-" . ( $valid ? 'deactivate' : 'activate' ) . "-license";
303
  wp_nonce_field( "wprss_{$addonId}_license_nonce", "wprss_{$addonId}_license_nonce", false ); ?>
180
  // License key field
181
  add_settings_field(
182
  sprintf( 'wprss_settings_%s_license', $_addonId ),
183
+ __( 'License key', WPRSS_TEXT_DOMAIN ),
184
  array( $this, 'renderLicenseKeyField' ),
185
  'wprss_settings_license_keys',
186
  sprintf( 'wprss_settings_%s_licenses_section', $_addonId ),
189
  // Activate license button
190
  add_settings_field(
191
  sprintf( 'wprss_settings_%s_activate_license', $_addonId ),
192
+ __( 'Activate license', WPRSS_TEXT_DOMAIN ),
193
  array( $this, 'renderActivateLicenseButton' ),
194
  'wprss_settings_license_keys',
195
  sprintf( 'wprss_settings_%s_licenses_section', $_addonId ),
297
  if ( $status === 'item_name_mismatch' ) $status = 'invalid';
298
 
299
  $valid = $status == 'valid';
300
+ $btnText = $valid ? 'Deactivate license' : 'Activate license';
301
  $btnName = "wprss_{$addonId}_license_" . ( $valid? 'deactivate' : 'activate' );
302
  $btnClass = "button-" . ( $valid ? 'deactivate' : 'activate' ) . "-license";
303
  wp_nonce_field( "wprss_{$addonId}_license_nonce", "wprss_{$addonId}_license_nonce", false ); ?>
includes/admin-display.php CHANGED
@@ -664,22 +664,6 @@
664
  }
665
 
666
 
667
- add_filter( 'gettext', 'wprss_change_publish_button_text', 10, 2 );
668
- /**
669
- * Modify 'Publish' button text when adding a new feed source
670
- *
671
- * @since 2.0
672
- */
673
- function wprss_change_publish_button_text( $translation, $text ) {
674
- if ( 'wprss_feed' == get_post_type()) {
675
- if ( $text == 'Publish' )
676
- return __( 'Publish Feed', WPRSS_TEXT_DOMAIN );
677
- }
678
- return apply_filters( 'wprss_change_publish_button_text', $translation );
679
- }
680
-
681
-
682
-
683
  add_action( 'wp_before_admin_bar_render', 'wprss_modify_admin_bar' );
684
  /**
685
  * Removes the old "View Source" menu item from the admin bar and adds a new
664
  }
665
 
666
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
667
  add_action( 'wp_before_admin_bar_render', 'wprss_modify_admin_bar' );
668
  /**
669
  * Removes the old "View Source" menu item from the admin bar and adds a new
includes/admin-help.php CHANGED
@@ -60,11 +60,10 @@
60
  <form method="POST">
61
  <p>
62
  <?php _e('The help beacon is an interactive button that appears on the bottom-right section of WP RSS Aggregator admin pages.', WPRSS_TEXT_DOMAIN); ?>
63
- <?php _e('It provides access to our documentation and (if you have a valid license for any of our add-ons) you can also contact our support team directly.', WPRSS_TEXT_DOMAIN); ?>
64
  </p>
65
  <p>
66
- <?php _e('The beacon tracks what pages you were on before clicking it. This helps it provide relevant help results and also helps the support team better understand the problem you are facing.', WPRSS_TEXT_DOMAIN); ?>
67
- <?php _e('The beacon only works on WP RSS Aggregator admin pages and does not track your mouse clicks and keyboard input.', WPRSS_TEXT_DOMAIN); ?>
68
  </p>
69
  <?php if (wprss_is_help_beacon_enabled()): ?>
70
  <p><?php _e('The support beacon is currently <b>enabled</b>.', WPRSS_TEXT_DOMAIN); ?></p>
60
  <form method="POST">
61
  <p>
62
  <?php _e('The help beacon is an interactive button that appears on the bottom-right section of WP RSS Aggregator admin pages.', WPRSS_TEXT_DOMAIN); ?>
63
+ <?php _e('It provides access to our extensive knowledge base where you can find the answers to the most commonly asked questions.', WPRSS_TEXT_DOMAIN); ?>
64
  </p>
65
  <p>
66
+ <?php _e('The beacon only works on WP RSS Aggregator admin pages and does not track your mouse clicks and/or keyboard input.', WPRSS_TEXT_DOMAIN); ?>
 
67
  </p>
68
  <?php if (wprss_is_help_beacon_enabled()): ?>
69
  <p><?php _e('The support beacon is currently <b>enabled</b>.', WPRSS_TEXT_DOMAIN); ?></p>
includes/admin-metaboxes.php CHANGED
@@ -93,7 +93,7 @@
93
  'label' => __( 'URL', WPRSS_TEXT_DOMAIN ),
94
  'id' => $prefix .'url',
95
  'type' => 'url',
96
- 'after' => 'wprss_validate_feed_link',
97
  'placeholder' => 'https://'
98
  );
99
 
@@ -103,15 +103,20 @@
103
  'type' => 'number'
104
  );
105
 
106
- $wprss_meta_fields[ 'enclosure' ] = array(
107
- 'label' => __( 'Link to enclosure', WPRSS_TEXT_DOMAIN ),
108
- 'id' => $prefix . 'enclosure',
109
- 'type' => 'checkbox'
110
- );
111
-
112
  $wprss_meta_fields[ 'unique_titles' ] = array(
113
  'label' => __( 'Unique titles only', WPRSS_TEXT_DOMAIN ),
114
  'id' => $prefix . 'unique_titles',
 
 
 
 
 
 
 
 
 
 
 
115
  'type' => 'checkbox'
116
  );
117
 
@@ -284,14 +289,22 @@
284
 
285
 
286
  /**
287
- * Adds the link that validates the feed
 
288
  * @since 3.9.5
289
  */
290
- function wprss_validate_feed_link() {
291
  ?>
292
  <i id="wprss-url-spinner" class="fa fa-fw fa-refresh fa-spin wprss-updating-feed-icon" title="<?php _e( 'Updating feed source', WPRSS_TEXT_DOMAIN ) ?>"></i>
293
  <div id="wprss-url-error" style="color:red"></div>
294
- <a href="#" id="validate-feed-link">Validate feed</a>
 
 
 
 
 
 
 
295
  <script type="text/javascript">
296
  (function($){
297
  // When the DOM is ready
@@ -378,9 +391,9 @@
378
  foreach ( $meta_fields as $field ) {
379
  $old = get_post_meta( $post_id, $field[ 'id' ], true );
380
  $new = trim( $_POST[ $field[ 'id' ] ] );
381
- if ( $new !== '' && $new != $old ) {
382
  update_post_meta( $post_id, $field[ 'id' ], $new );
383
- } elseif ( '' == $new && $old ) {
384
  delete_post_meta( $post_id, $field[ 'id' ], $old );
385
  }
386
  } // end foreach
@@ -485,7 +498,12 @@
485
  <?php wprss_log_obj( 'Failed to preview feed.', $feed->get_error_message(), NULL, WPRSS_LOG_LEVEL_INFO ); ?>
486
  </span>
487
  <?php
488
- echo wpautop( sprintf( __( 'Not sure where to find the RSS feed on a website? <a target="_blank" href="%1$s">Click here</a> for a visual guide. ', WPRSS_TEXT_DOMAIN ), 'https://webtrends.about.com/od/webfeedsyndicationrss/ss/rss_howto.htm' ) );
 
 
 
 
 
489
  }
490
 
491
  }
93
  'label' => __( 'URL', WPRSS_TEXT_DOMAIN ),
94
  'id' => $prefix .'url',
95
  'type' => 'url',
96
+ 'after' => 'wprss_after_url',
97
  'placeholder' => 'https://'
98
  );
99
 
103
  'type' => 'number'
104
  );
105
 
 
 
 
 
 
 
106
  $wprss_meta_fields[ 'unique_titles' ] = array(
107
  'label' => __( 'Unique titles only', WPRSS_TEXT_DOMAIN ),
108
  'id' => $prefix . 'unique_titles',
109
+ 'type' => 'select',
110
+ 'options' => [
111
+ ['value' => '', 'label' => 'Default'],
112
+ ['value' => '1', 'label' => 'Yes'],
113
+ ['value' => '0', 'label' => 'No'],
114
+ ]
115
+ );
116
+
117
+ $wprss_meta_fields[ 'enclosure' ] = array(
118
+ 'label' => __( 'Link to enclosure', WPRSS_TEXT_DOMAIN ),
119
+ 'id' => $prefix . 'enclosure',
120
  'type' => 'checkbox'
121
  );
122
 
289
 
290
 
291
  /**
292
+ * Renders content after the URL field
293
+ *
294
  * @since 3.9.5
295
  */
296
+ function wprss_after_url() {
297
  ?>
298
  <i id="wprss-url-spinner" class="fa fa-fw fa-refresh fa-spin wprss-updating-feed-icon" title="<?php _e( 'Updating feed source', WPRSS_TEXT_DOMAIN ) ?>"></i>
299
  <div id="wprss-url-error" style="color:red"></div>
300
+ <a href="#" id="validate-feed-link" class="wprss-after-url-link">Validate feed</a>
301
+ <span> | </span>
302
+ <a href="https://kb.wprssaggregator.com/article/55-how-to-find-an-rss-feed"
303
+ class="wprss-after-url-link"
304
+ target="_blank">
305
+ <?= __('How to find an RSS feed', 'wprss') ?>
306
+ </a>
307
+ <script type="text/javascript">
308
  <script type="text/javascript">
309
  (function($){
310
  // When the DOM is ready
391
  foreach ( $meta_fields as $field ) {
392
  $old = get_post_meta( $post_id, $field[ 'id' ], true );
393
  $new = trim( $_POST[ $field[ 'id' ] ] );
394
+ if ( $new !== $old || empty($old) ) {
395
  update_post_meta( $post_id, $field[ 'id' ], $new );
396
+ } elseif ( empty($new) && !empty($old) ) {
397
  delete_post_meta( $post_id, $field[ 'id' ], $old );
398
  }
399
  } // end foreach
498
  <?php wprss_log_obj( 'Failed to preview feed.', $feed->get_error_message(), NULL, WPRSS_LOG_LEVEL_INFO ); ?>
499
  </span>
500
  <?php
501
+ echo wpautop(
502
+ sprintf(
503
+ __('Not sure where to find the RSS feed on a website? <a target="_blank" href="%1$s">Click here</a> for a visual guide.', 'wprss'),
504
+ 'https://kb.wprssaggregator.com/article/55-how-to-find-an-rss-feed'
505
+ )
506
+ );
507
  }
508
 
509
  }
includes/admin-options.php CHANGED
@@ -195,7 +195,7 @@
195
 
196
  $settings['styles'] = array(
197
  'styles-disable' => array(
198
- 'label' => __( 'Disable Styles', 'wprss' ),
199
  'callback' => 'wprss_setting_styles_disable_callback'
200
  )
201
  );
@@ -890,7 +890,7 @@
890
  }
891
 
892
  if ( isset($input['unique_titles']) ) {
893
- $output['unique_titles'] = (int) $input['unique_titles'];
894
  }
895
 
896
  if ( isset($input['cron_interval']) && $input['cron_interval'] != $current_cron_interval ) {
195
 
196
  $settings['styles'] = array(
197
  'styles-disable' => array(
198
+ 'label' => __( 'Disable styles', 'wprss' ),
199
  'callback' => 'wprss_setting_styles_disable_callback'
200
  )
201
  );
890
  }
891
 
892
  if ( isset($input['unique_titles']) ) {
893
+ $output['unique_titles'] = $input['unique_titles'];
894
  }
895
 
896
  if ( isset($input['cron_interval']) && $input['cron_interval'] != $current_cron_interval ) {
includes/feed-access.php CHANGED
@@ -228,7 +228,7 @@ class WPRSS_Feed_Access
228
 
229
  $fields[self::SETTING_KEY_FEED_REQUEST_USERAGENT] = array(
230
  'id' => self::SETTING_KEY_FEED_REQUEST_USERAGENT,
231
- 'label' => $wprss->__('Feed Request Useragent'),
232
  'placeholder' => $wprss->__('Leave blank to inherit general setting')
233
  );
234
 
@@ -424,6 +424,11 @@ class WPRSS_SimplePie_File extends SimplePie_File {
424
  curl_setopt( $fp, CURLOPT_MAXREDIRS, $redirects );
425
  }
426
 
 
 
 
 
 
427
  $this->_before_curl_exec( $fp, $url );
428
 
429
  $this->headers = curl_exec( $fp );
228
 
229
  $fields[self::SETTING_KEY_FEED_REQUEST_USERAGENT] = array(
230
  'id' => self::SETTING_KEY_FEED_REQUEST_USERAGENT,
231
+ 'label' => $wprss->__('Feed request useragent'),
232
  'placeholder' => $wprss->__('Leave blank to inherit general setting')
233
  );
234
 
424
  curl_setopt( $fp, CURLOPT_MAXREDIRS, $redirects );
425
  }
426
 
427
+ global $wpraNoSslVerification;
428
+ if ($wpraNoSslVerification) {
429
+ curl_setopt( $fp, CURLOPT_SSL_VERIFYPEER, 0 );
430
+ }
431
+
432
  $this->_before_curl_exec( $fp, $url );
433
 
434
  $this->headers = curl_exec( $fp );
includes/feed-importing.php CHANGED
@@ -344,6 +344,9 @@ function wprss_get_feed_cache_dir()
344
  // If turned on, force the feed
345
  if ($force_feed == 'true' || $param_force_feed) {
346
  $feed->force_feed(true);
 
 
 
347
  }
348
  }
349
 
344
  // If turned on, force the feed
345
  if ($force_feed == 'true' || $param_force_feed) {
346
  $feed->force_feed(true);
347
+
348
+ global $wpraNoSslVerification;
349
+ $wpraNoSslVerification = true;
350
  }
351
  }
352
 
includes/feed-processing.php CHANGED
@@ -92,6 +92,11 @@
92
  'value' => (string) $source_id,
93
  'compare' => '=',
94
  ];
 
 
 
 
 
95
  }
96
 
97
  return apply_filters('wprss_get_feed_items_for_source_args', $args, $source_id);
92
  'value' => (string) $source_id,
93
  'compare' => '=',
94
  ];
95
+ } else {
96
+ $args['meta_query'][] = [
97
+ 'key' => 'wprss_feed_id',
98
+ 'compare' => 'EXISTS',
99
+ ];
100
  }
101
 
102
  return apply_filters('wprss_get_feed_items_for_source_args', $args, $source_id);
js/admin-custom.js CHANGED
@@ -604,17 +604,23 @@ if ( !String.prototype.trim ) {
604
  // Image options in feed source edit page
605
  (function($) {
606
  function update() {
 
 
 
607
  var ftImage = $('#wpra_ft_image').val();
608
  var downloadImages = $('#wpra_download_images').prop('checked') === true;
609
  var ftImagesEnabled = (ftImage !== '');
610
- var useDefaultftImage = (ftImage === 'default');
 
 
 
611
 
612
  // Only show the "must have ft image" and "remove ft image" options if featured images are enabled
613
  $('#wpra_siphon_ft_image').toggle(ftImagesEnabled);
614
  $('#wpra_must_have_ft_image').toggle(ftImagesEnabled);
615
 
616
  // Show the image minimum size options if either featured images or image downloading are enabled
617
- $('#wpra_image_min_size_row').toggle( (ftImagesEnabled || downloadImages) && !useDefaultftImage );
618
  }
619
 
620
  $(document).ready(function () {
@@ -624,6 +630,12 @@ if ( !String.prototype.trim ) {
624
  $('#wpra_ft_image').on('change', update);
625
  $('#wpra_download_images').on('change', update);
626
 
 
 
 
 
 
 
627
  update();
628
 
629
  var gallery = new WpraGallery({
604
  // Image options in feed source edit page
605
  (function($) {
606
  function update() {
607
+ var f2pTypeSelector = $('select#wprss_ftp_post_type');
608
+ var showMetaBox = (f2pTypeSelector.length === 0) || (f2pTypeSelector.val() === 'wprss_feed_item');
609
+
610
  var ftImage = $('#wpra_ft_image').val();
611
  var downloadImages = $('#wpra_download_images').prop('checked') === true;
612
  var ftImagesEnabled = (ftImage !== '');
613
+ var useDefaultFtImage = (ftImage === 'default');
614
+
615
+ // Only show the meta box when F2P is not active, or it is and the Post Type is "Feed Item"
616
+ $('#wpra-images').toggle(showMetaBox);
617
 
618
  // Only show the "must have ft image" and "remove ft image" options if featured images are enabled
619
  $('#wpra_siphon_ft_image').toggle(ftImagesEnabled);
620
  $('#wpra_must_have_ft_image').toggle(ftImagesEnabled);
621
 
622
  // Show the image minimum size options if either featured images or image downloading are enabled
623
+ $('#wpra_image_min_size_row').toggle( (ftImagesEnabled || downloadImages) && !useDefaultFtImage );
624
  }
625
 
626
  $(document).ready(function () {
630
  $('#wpra_ft_image').on('change', update);
631
  $('#wpra_download_images').on('change', update);
632
 
633
+ // If the F2P Post Type selector is on the page, update the image options when the post type selection changes
634
+ var f2pTypeSelector = $('select#wprss_ftp_post_type');
635
+ if (f2pTypeSelector.length) {
636
+ f2pTypeSelector.on('change', update);
637
+ }
638
+
639
  update();
640
 
641
  var gallery = new WpraGallery({
languages/{default.mo → wprss-en.mo} RENAMED
Binary file
languages/{default.po → wprss-en.po} RENAMED
@@ -1,15 +1,15 @@
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WP RSS Aggregator\n"
4
- "POT-Creation-Date: 2020-01-20 11:05+0100\n"
5
- "PO-Revision-Date: 2020-01-20 11:06+0100\n"
6
  "Last-Translator: \n"
7
  "Language-Team: RebelCode\n"
8
  "Language: en_US\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "X-Generator: Poedit 2.2.4\n"
13
  "X-Poedit-Basepath: ..\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
  "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
@@ -26,6 +26,8 @@ msgstr ""
26
  "X-Poedit-SearchPathExcluded-4: fonts\n"
27
  "X-Poedit-SearchPathExcluded-5: webpack\n"
28
  "X-Poedit-SearchPathExcluded-6: test\n"
 
 
29
 
30
  #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:93
31
  msgid "No nonce"
@@ -57,11 +59,11 @@ msgid "License"
57
  msgstr ""
58
 
59
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:183
60
- msgid "License Key"
61
  msgstr ""
62
 
63
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:192
64
- msgid "Activate License"
65
  msgstr ""
66
 
67
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:221
@@ -337,22 +339,18 @@ msgstr ""
337
  msgid "ID: %1$s"
338
  msgstr ""
339
 
340
- #: includes/admin-display.php:481
341
  msgid "Could not schedule fetch: source ID must be specified"
342
  msgstr ""
343
 
344
- #: includes/admin-display.php:519 includes/admin-display.php:568
345
  msgid "Failed to schedule cron"
346
  msgstr ""
347
 
348
- #: includes/admin-display.php:550 includes/admin-display.php:601
349
  msgid "Source ID was not specified"
350
  msgstr ""
351
 
352
- #: includes/admin-display.php:698
353
- msgid "Publish Feed"
354
- msgstr ""
355
-
356
  #: includes/admin-editor.php:117
357
  msgid ""
358
  "To select more than one feed source, click and drag with your mouse pointer "
@@ -669,7 +667,7 @@ msgstr ""
669
  msgid "The maximum number of feed items in the custom feed."
670
  msgstr ""
671
 
672
- #: includes/admin-help-settings.php:93 src/Modules/FeedTemplatesModule.php:467
673
  msgid ""
674
  "Check this box to make the feed item titles link to the original article."
675
  msgstr ""
@@ -682,7 +680,7 @@ msgid ""
682
  "<em>Leave empty for no limit.</em>"
683
  msgstr ""
684
 
685
- #: includes/admin-help-settings.php:100 src/Modules/FeedTemplatesModule.php:473
686
  msgid ""
687
  "Check this box to show the author for each feed item, if it is available."
688
  msgstr ""
@@ -713,7 +711,7 @@ msgid ""
713
  "to be displayed."
714
  msgstr ""
715
 
716
- #: includes/admin-help-settings.php:114 src/Modules/FeedTemplatesModule.php:479
717
  msgid ""
718
  "Choose how you want links to be opened. This applies to the feed item title "
719
  "and the source link."
@@ -728,33 +726,33 @@ msgid ""
728
  "certain links, such as links to feed items in this case."
729
  msgstr ""
730
 
731
- #: includes/admin-help-settings.php:125 src/Modules/FeedTemplatesModule.php:470
732
  msgid "Enable this option to show the feed source name for each feed item."
733
  msgstr ""
734
 
735
- #: includes/admin-help-settings.php:127 src/Modules/FeedTemplatesModule.php:471
736
  msgid ""
737
  "Enter the text that you want to show before the source name. A space is "
738
  "automatically added between this text and the feed source name."
739
  msgstr ""
740
 
741
- #: includes/admin-help-settings.php:129 src/Modules/FeedTemplatesModule.php:472
742
  msgid ""
743
  "Enable this option to link the feed source name to the RSS feed's source "
744
  "site."
745
  msgstr ""
746
 
747
- #: includes/admin-help-settings.php:135 src/Modules/FeedTemplatesModule.php:475
748
  msgid "Enable this to show the feed item's date."
749
  msgstr ""
750
 
751
- #: includes/admin-help-settings.php:137 src/Modules/FeedTemplatesModule.php:476
752
  msgid ""
753
  "Enter the text that you want to show before the feed item date. A space is "
754
  "automatically added between this text and the date."
755
  msgstr ""
756
 
757
- #: includes/admin-help-settings.php:139 src/Modules/FeedTemplatesModule.php:477
758
  msgid "The format to use for the feed item dates, as a PHP date format."
759
  msgstr ""
760
 
@@ -853,116 +851,109 @@ msgstr ""
853
 
854
  #: includes/admin-help.php:63
855
  msgid ""
856
- "It provides access to our documentation and (if you have a valid license for "
857
- "any of our add-ons) you can also contact our support team directly."
858
  msgstr ""
859
 
860
  #: includes/admin-help.php:66
861
  msgid ""
862
- "The beacon tracks what pages you were on before clicking it. This helps it "
863
- "provide relevant help results and also helps the support team better "
864
- "understand the problem you are facing."
865
- msgstr ""
866
-
867
- #: includes/admin-help.php:67
868
- msgid ""
869
  "The beacon only works on WP RSS Aggregator admin pages and does not track "
870
- "your mouse clicks and keyboard input."
871
  msgstr ""
872
 
873
- #: includes/admin-help.php:70
874
  msgid "The support beacon is currently <b>enabled</b>."
875
  msgstr ""
876
 
877
- #: includes/admin-help.php:72
878
  msgid "Disable support beacon"
879
  msgstr ""
880
 
881
- #: includes/admin-help.php:75
882
  msgid ""
883
  "By enabling the help beacon, you are consenting to this data collection."
884
  msgstr ""
885
 
886
- #: includes/admin-help.php:77
887
  msgid "Enable support beacon"
888
  msgstr ""
889
 
890
- #: includes/admin-help.php:108
891
  msgid "Premium Support"
892
  msgstr ""
893
 
894
- #: includes/admin-help.php:111
895
  #, php-format
896
  msgid ""
897
  "Contact us <a href=\"%s\" target=\"%s=\">here</a> for pre-sales and premium "
898
  "support."
899
  msgstr ""
900
 
901
- #: includes/admin-help.php:168
902
  msgid "Email Support"
903
  msgstr ""
904
 
905
- #: includes/admin-help.php:169
906
  msgid ""
907
  "If you still can't find an answer to your query after reading the "
908
  "documentation and going through the FAQ, just fill out the support request "
909
  "form below. We'll be happy to help you out."
910
  msgstr ""
911
 
912
- #: includes/admin-help.php:176
913
  msgid "From: "
914
  msgstr ""
915
 
916
- #: includes/admin-help.php:181
917
  msgid "Replies will be sent to this email address."
918
  msgstr ""
919
 
920
- #: includes/admin-help.php:190
921
  msgid "Attachments"
922
  msgstr ""
923
 
924
- #: includes/admin-help.php:193
925
  msgid "WP RSS Aggregator log file"
926
  msgstr ""
927
 
928
- #: includes/admin-help.php:196
929
  msgid "WordPress debugging information"
930
  msgstr ""
931
 
932
- #: includes/admin-help.php:201
933
  msgid "Send Message"
934
  msgstr ""
935
 
936
- #: includes/admin-help.php:214
937
  msgid "Support Forums"
938
  msgstr ""
939
 
940
- #: includes/admin-help.php:217
941
  #, php-format
942
  msgid ""
943
  "Users of the free version of WP RSS Aggregator can ask questions on the <a "
944
  "href=\"%s\">support forum</a>."
945
  msgstr ""
946
 
947
- #: includes/admin-help.php:253
948
  #, php-format
949
  msgid ""
950
  "There was an error sending the form. Please use the <a href=\"%s\" target="
951
  "\"_blank\">contact form on our site.</a>"
952
  msgstr ""
953
 
954
- #: includes/admin-help.php:283
955
  #, php-format
956
  msgid ""
957
  "Please fill out all the fields in the form, including the <strong>%s</"
958
  "strong> field."
959
  msgstr ""
960
 
961
- #: includes/admin-help.php:291
962
  msgid "Please enter a valid email address."
963
  msgstr ""
964
 
965
- #: includes/admin-help.php:1078
966
  msgid ""
967
  "Could not enqueue tooltip content: the queue method is not a valid callable."
968
  msgstr ""
@@ -971,29 +962,29 @@ msgstr ""
971
  msgid "Welcome to WP RSS Aggregator"
972
  msgstr ""
973
 
974
- #: includes/admin-intro-page.php:93
975
  #, php-format
976
  msgid "Missing intro step param \"%s\""
977
  msgstr ""
978
 
979
- #: includes/admin-intro-page.php:120
980
  msgid "Missing feed URL parameter"
981
  msgstr ""
982
 
983
- #: includes/admin-intro-page.php:125
984
  msgid "The given feed URL is invalid"
985
  msgstr ""
986
 
987
- #: includes/admin-intro-page.php:196
988
  msgid "Failed to retrieve items"
989
  msgstr ""
990
 
991
- #: includes/admin-intro-page.php:279
992
  #, php-format
993
  msgid "Failed to import the feed source \"%s\" with URL \"%s\""
994
  msgstr ""
995
 
996
- #: includes/admin-intro-page.php:373
997
  msgctxt "default name of shortcode page"
998
  msgid "Feeds"
999
  msgstr ""
@@ -1027,100 +1018,104 @@ msgstr ""
1027
  msgid "Limit"
1028
  msgstr ""
1029
 
1030
- #: includes/admin-metaboxes.php:107
1031
- msgid "Link to enclosure"
1032
  msgstr ""
1033
 
1034
- #: includes/admin-metaboxes.php:113 includes/admin-options.php:136
1035
- msgid "Unique titles only"
1036
  msgstr ""
1037
 
1038
- #: includes/admin-metaboxes.php:120 includes/admin-options-legacy.php:70
1039
  msgid "Link source"
1040
  msgstr ""
1041
 
1042
- #: includes/admin-metaboxes.php:127
1043
  msgid "Use source info"
1044
  msgstr ""
1045
 
1046
- #: includes/admin-metaboxes.php:267 includes/admin-metaboxes.php:557
1047
- #: includes/admin-metaboxes.php:653 includes/admin-options.php:565
1048
- #: includes/admin-options.php:694 includes/admin-options.php:801
1049
- #: includes/feed-access.php:263 src/Modules/FeedTemplatesModule.php:391
1050
  msgid "Default"
1051
  msgstr ""
1052
 
1053
- #: includes/admin-metaboxes.php:292
1054
  msgid "Updating feed source"
1055
  msgstr ""
1056
 
1057
- #: includes/admin-metaboxes.php:451
 
 
 
 
1058
  #, php-format
1059
  msgid "Latest %1$s feed items out of %2$s available from %3$s"
1060
  msgstr ""
1061
 
1062
- #: includes/admin-metaboxes.php:460 includes/scripts.php:56
1063
  msgid "ago"
1064
  msgstr ""
1065
 
1066
- #: includes/admin-metaboxes.php:462
1067
  msgid "No Date"
1068
  msgstr ""
1069
 
1070
- #: includes/admin-metaboxes.php:484
1071
  msgid ""
1072
  "<strong>Invalid feed URL</strong> - Double check the feed source URL setting "
1073
  "above."
1074
  msgstr ""
1075
 
1076
- #: includes/admin-metaboxes.php:488
1077
  #, php-format
1078
  msgid ""
1079
  "Not sure where to find the RSS feed on a website? <a target=\"_blank\" href="
1080
- "\"%1$s\">Click here</a> for a visual guide. "
1081
  msgstr ""
1082
 
1083
- #: includes/admin-metaboxes.php:493
1084
  msgid "No feed URL defined yet"
1085
  msgstr ""
1086
 
1087
- #: includes/admin-metaboxes.php:518
1088
  msgid "Force the feed"
1089
  msgstr ""
1090
 
1091
- #: includes/admin-metaboxes.php:552
1092
  msgid "Active"
1093
  msgstr ""
1094
 
1095
- #: includes/admin-metaboxes.php:553
1096
  msgid "Paused"
1097
  msgstr ""
1098
 
1099
- #: includes/admin-metaboxes.php:650
1100
  msgid "Limit items by age:"
1101
  msgstr ""
1102
 
1103
- #: includes/admin-metaboxes.php:684
1104
  msgid "Need help?"
1105
  msgstr ""
1106
 
1107
- #: includes/admin-metaboxes.php:686
1108
  msgid "Check out the support forum"
1109
  msgstr ""
1110
 
1111
- #: includes/admin-metaboxes.php:689
1112
  msgid "Suggest a new feature"
1113
  msgstr ""
1114
 
1115
- #: includes/admin-metaboxes.php:703
1116
  msgid "Give it a 5 star rating on WordPress.org"
1117
  msgstr ""
1118
 
1119
- #: includes/admin-metaboxes.php:719
1120
  msgid "Follow WP Mayor on Twitter."
1121
  msgstr ""
1122
 
1123
- #: includes/admin-metaboxes.php:720
1124
  msgid "Like WP Mayor on Facebook."
1125
  msgstr ""
1126
 
@@ -1206,17 +1201,17 @@ msgstr ""
1206
  msgid "Options that control how the feed item's date is displayed."
1207
  msgstr ""
1208
 
1209
- #: includes/admin-options-legacy.php:177 includes/admin-options.php:430
1210
  msgid "No limit"
1211
  msgstr ""
1212
 
1213
  #: includes/admin-options-legacy.php:215
1214
- #: src/Modules/FeedTemplatesModule.php:536
1215
  msgid "Original page link"
1216
  msgstr ""
1217
 
1218
  #: includes/admin-options-legacy.php:216
1219
- #: src/Modules/FeedTemplatesModule.php:537
1220
  msgid "Embedded video player link"
1221
  msgstr ""
1222
 
@@ -1268,204 +1263,207 @@ msgstr ""
1268
  msgid "Licenses"
1269
  msgstr ""
1270
 
1271
- #: includes/admin-options.php:116
 
 
 
 
1272
  msgid "Save Settings"
1273
  msgstr ""
1274
 
1275
- #: includes/admin-options.php:132
1276
  msgid "Update interval"
1277
  msgstr ""
1278
 
1279
- #: includes/admin-options.php:140
1280
  msgid "Import order"
1281
  msgstr ""
1282
 
1283
- #: includes/admin-options.php:144
1284
  msgid "Limit items by age"
1285
  msgstr ""
1286
 
1287
- #: includes/admin-options.php:148
1288
  msgid "Limit feed items stored per feed"
1289
  msgstr ""
1290
 
1291
- #: includes/admin-options.php:152
1292
  msgid "Limit feed items stored"
1293
  msgstr ""
1294
 
1295
- #: includes/admin-options.php:156
1296
  msgid "Limit feed items per import"
1297
  msgstr ""
1298
 
1299
- #: includes/admin-options.php:160
1300
  msgid "Schedule future items"
1301
  msgstr ""
1302
 
1303
- #: includes/admin-options.php:167
1304
  msgid "Custom feed URL"
1305
  msgstr ""
1306
 
1307
- #: includes/admin-options.php:171
1308
  msgid "Custom feed title"
1309
  msgstr ""
1310
 
1311
- #: includes/admin-options.php:175
1312
  msgid "Custom feed limit"
1313
  msgstr ""
1314
 
1315
- #: includes/admin-options.php:188
1316
- msgid "Disable Styles"
1317
  msgstr ""
1318
 
1319
- #: includes/admin-options.php:219 templates/admin/tools/import.twig:1
1320
- #: templates/admin/tools/import.twig:13
1321
  msgid "Import Settings"
1322
  msgstr ""
1323
 
1324
- #: includes/admin-options.php:230
1325
  msgid "Custom RSS Feed"
1326
  msgstr ""
1327
 
1328
- #: includes/admin-options.php:240
1329
  msgid "Advanced Settings"
1330
  msgstr ""
1331
 
1332
- #: includes/admin-options.php:244
1333
  msgid "Styles"
1334
  msgstr ""
1335
 
1336
- #: includes/admin-options.php:385
1337
  msgid "Configure how WP RSS Aggregator imports RSS feed items."
1338
  msgstr ""
1339
 
1340
- #: includes/admin-options.php:395
1341
  msgid ""
1342
  "WP RSS Aggregator creates a custom RSS feed on your site that includes all "
1343
  "of your imported items. Use the below options to set it up."
1344
  msgstr ""
1345
 
1346
- #: includes/admin-options.php:404
1347
  msgid "Only change these options if you know what you are doing!"
1348
  msgstr ""
1349
 
1350
- #: includes/admin-options.php:413
1351
  msgid ""
1352
  "If you would like to disable all styles used in this plugin, tick the "
1353
  "checkbox."
1354
  msgstr ""
1355
 
1356
- #: includes/admin-options.php:464 includes/admin-options.php:594
1357
  msgid "No Limit"
1358
  msgstr ""
1359
 
1360
- #: includes/admin-options.php:541
1361
  msgid "Open custom feed"
1362
  msgstr ""
1363
 
1364
- #: includes/admin-options.php:629
1365
  msgid "Latest items first"
1366
  msgstr ""
1367
 
1368
- #: includes/admin-options.php:630
1369
  msgid "Oldest items first"
1370
  msgstr ""
1371
 
1372
- #: includes/admin-options.php:631
1373
  msgid "Original feed order"
1374
  msgstr ""
1375
 
1376
- #: includes/admin-options.php:656
1377
  msgid "Generate Random Code"
1378
  msgstr ""
1379
 
1380
- #: includes/admin-options.php:661
1381
  msgid ""
1382
  "Enter the code to use to securely reset the plugin and deactivate it. Be "
1383
  "sure to save this code somewhere safe."
1384
  msgstr ""
1385
 
1386
- #: includes/admin-options.php:667
1387
  msgid ""
1388
  "Leave this empty to disable the secure reset function.<br/>\n"
1389
  " You use this code by adding any of the following to any URL on "
1390
  "your site."
1391
  msgstr ""
1392
 
1393
- #: includes/admin-options.php:670
1394
  msgid "Resets your WP RSS Aggregator settings"
1395
  msgstr ""
1396
 
1397
- #: includes/admin-options.php:671
1398
  msgid "Deactivates WP RSS Aggregator"
1399
  msgstr ""
1400
 
1401
- #: includes/admin-options.php:672
1402
  msgid "Does both of the above"
1403
  msgstr ""
1404
 
1405
- #: includes/admin-options.php:676
1406
  msgid ""
1407
  "Use the above actions only when absolutely necessary, or when instructed to "
1408
  "by support staff."
1409
  msgstr ""
1410
 
1411
- #: includes/admin-options.php:692
1412
  msgid "On"
1413
  msgstr ""
1414
 
1415
- #: includes/admin-options.php:693
1416
  msgid "Off"
1417
  msgstr ""
1418
 
1419
- #: includes/admin-options.php:805
1420
  #, php-format
1421
  msgid "%s year"
1422
  msgid_plural "%s years"
1423
  msgstr[0] ""
1424
  msgstr[1] ""
1425
 
1426
- #: includes/admin-options.php:806
1427
  #, php-format
1428
  msgid "%s month"
1429
  msgid_plural "%s months"
1430
  msgstr[0] ""
1431
  msgstr[1] ""
1432
 
1433
- #: includes/admin-options.php:807
1434
  #, php-format
1435
  msgid "%s week"
1436
  msgid_plural "%s weeks"
1437
  msgstr[0] ""
1438
  msgstr[1] ""
1439
 
1440
- #: includes/admin-options.php:808
1441
  #, php-format
1442
  msgid "%s day"
1443
  msgid_plural "%s days"
1444
  msgstr[0] ""
1445
  msgstr[1] ""
1446
 
1447
- #: includes/admin-options.php:809
1448
  #, php-format
1449
  msgid "%s hour"
1450
  msgid_plural "%s hours"
1451
  msgstr[0] ""
1452
  msgstr[1] ""
1453
 
1454
- #: includes/admin-options.php:810
1455
  #, php-format
1456
  msgid "%s minute"
1457
  msgid_plural "%s minutes"
1458
  msgstr[0] ""
1459
  msgstr[1] ""
1460
 
1461
- #: includes/admin-options.php:811
1462
  #, php-format
1463
  msgid "%s second"
1464
  msgid_plural "%s seconds"
1465
  msgstr[0] ""
1466
  msgstr[1] ""
1467
 
1468
- #: includes/admin-options.php:816
1469
  msgid "now"
1470
  msgstr ""
1471
 
@@ -1583,7 +1581,7 @@ msgstr ""
1583
  msgid "Certificate path"
1584
  msgstr ""
1585
 
1586
- #: includes/feed-access.php:206
1587
  msgid "Feed request useragent"
1588
  msgstr ""
1589
 
@@ -1591,10 +1589,6 @@ msgstr ""
1591
  msgid "Enable feed cache"
1592
  msgstr ""
1593
 
1594
- #: includes/feed-access.php:231
1595
- msgid "Feed Request Useragent"
1596
- msgstr ""
1597
-
1598
  #: includes/feed-access.php:232
1599
  msgid "Leave blank to inherit general setting"
1600
  msgstr ""
@@ -1617,17 +1611,17 @@ msgid ""
1617
  "the blacklist"
1618
  msgstr ""
1619
 
1620
- #: includes/feed-importing.php:380
1621
  #, php-format
1622
  msgid "Failed to fetch the RSS feed. Error: %s"
1623
  msgstr ""
1624
 
1625
- #: includes/feed-importing.php:827
1626
  #, php-format
1627
  msgid "The importing process failed after %d seconds with the message: \"%s\""
1628
  msgstr ""
1629
 
1630
- #: includes/feed-processing.php:467
1631
  msgid "The plugin failed to schedule a fetch for this feed. Please try again."
1632
  msgstr ""
1633
 
@@ -2072,39 +2066,39 @@ msgstr ""
2072
  msgid "No Templates Found In Trash"
2073
  msgstr ""
2074
 
2075
- #: src/Modules/FeedTemplatesModule.php:438
2076
  #: src/Templates/Feeds/Types/ListTemplateType.php:99
2077
  msgid "Source:"
2078
  msgstr ""
2079
 
2080
- #: src/Modules/FeedTemplatesModule.php:441
2081
  #: src/Templates/Feeds/Types/ListTemplateType.php:111
2082
  msgid "By"
2083
  msgstr ""
2084
 
2085
- #: src/Modules/FeedTemplatesModule.php:443
2086
  #: src/Templates/Feeds/Types/ListTemplateType.php:119
2087
  msgid "Published on:"
2088
  msgstr ""
2089
 
2090
- #: src/Modules/FeedTemplatesModule.php:465
2091
  msgid ""
2092
  "The maximum number of feed items to display when using the shortcode. This "
2093
  "enables pagination if set to a number smaller than the number of items to be "
2094
  "displayed."
2095
  msgstr ""
2096
 
2097
- #: src/Modules/FeedTemplatesModule.php:466
2098
  msgid ""
2099
  "Set the maximum number of characters to show for feed item titles.<hr/"
2100
  "><em>Leave empty for no limit.</em>"
2101
  msgstr ""
2102
 
2103
- #: src/Modules/FeedTemplatesModule.php:468
2104
  msgid "Enable this option to show the pagination beneath feed items."
2105
  msgstr ""
2106
 
2107
- #: src/Modules/FeedTemplatesModule.php:469
2108
  msgid ""
2109
  "The type of pagination to use when showing feed items on multiple pages. The "
2110
  "first shows two links, \"Older\" and \"Newer\", which allow you to navigate "
@@ -2112,77 +2106,77 @@ msgid ""
2112
  "links for the next and previous pages."
2113
  msgstr ""
2114
 
2115
- #: src/Modules/FeedTemplatesModule.php:474
2116
  msgid ""
2117
  "Enter the text that you want to show before the author name. A space is "
2118
  "automatically added between this text and the author name."
2119
  msgstr ""
2120
 
2121
- #: src/Modules/FeedTemplatesModule.php:478
2122
  msgid ""
2123
  "Enable this option to show the elapsed time from the feed item's date and "
2124
  "time to the present time. <em>Eg. 2 hours ago</em>"
2125
  msgstr ""
2126
 
2127
- #: src/Modules/FeedTemplatesModule.php:480
2128
  msgid ""
2129
  "Enable this option to set all links displayed as \"NoFollow\".<hr/>\"Nofollow"
2130
  "\" provides a way to tell search engines to <em>not</em> follow certain "
2131
  "links, such as links to feed items in this case."
2132
  msgstr ""
2133
 
2134
- #: src/Modules/FeedTemplatesModule.php:481
2135
  msgid ""
2136
  "Tick this box to have feed items link to their embedded content, if they "
2137
  "have any. This works especially well when links are set to <em>\"Open in a "
2138
  "lightbox\"</em>."
2139
  msgstr ""
2140
 
2141
- #: src/Modules/FeedTemplatesModule.php:482
2142
  msgid "Enable this option to show bullets next to feed items."
2143
  msgstr ""
2144
 
2145
- #: src/Modules/FeedTemplatesModule.php:483
2146
  msgid "The bullet type to use for feed items."
2147
  msgstr ""
2148
 
2149
- #: src/Modules/FeedTemplatesModule.php:484
2150
  msgid ""
2151
  "You can add your own HTML class name to the template output. This lets you "
2152
  "customize your template further using custom CSS styling or custom JS "
2153
  "functionality."
2154
  msgstr ""
2155
 
2156
- #: src/Modules/FeedTemplatesModule.php:496
2157
  #: src/Templates/Feeds/Types/ListTemplateType.php:29
2158
  msgid "List"
2159
  msgstr ""
2160
 
2161
- #: src/Modules/FeedTemplatesModule.php:523
2162
  msgid "Open in same tab/window"
2163
  msgstr ""
2164
 
2165
- #: src/Modules/FeedTemplatesModule.php:524
2166
  msgid "Open in a new tab"
2167
  msgstr ""
2168
 
2169
- #: src/Modules/FeedTemplatesModule.php:525
2170
  msgid "Open in a lightbox"
2171
  msgstr ""
2172
 
2173
- #: src/Modules/FeedTemplatesModule.php:528
2174
  msgid "Older/Newer"
2175
  msgstr ""
2176
 
2177
- #: src/Modules/FeedTemplatesModule.php:529
2178
  msgid "Numbered"
2179
  msgstr ""
2180
 
2181
- #: src/Modules/FeedTemplatesModule.php:532
2182
  msgid "Bullets"
2183
  msgstr ""
2184
 
2185
- #: src/Modules/FeedTemplatesModule.php:533
2186
  msgid "Numbers"
2187
  msgstr ""
2188
 
@@ -2190,11 +2184,11 @@ msgstr ""
2190
  msgid "Image"
2191
  msgstr ""
2192
 
2193
- #: src/Modules/ImagesModule.php:191 src/Modules/ImagesModule.php:288
2194
  msgid "Images"
2195
  msgstr ""
2196
 
2197
- #: src/Modules/ImagesModule.php:270
2198
  msgid ""
2199
  "This option allows you to select which feed item image to use as the "
2200
  "featured image. Automatic best image detection will attempt to find the "
@@ -2341,15 +2335,15 @@ msgstr ""
2341
  msgid "Template \"%s\" does not exist"
2342
  msgstr ""
2343
 
2344
- #: src/Templates/Feeds/MasterFeedsTemplate.php:259
2345
  #: src/Templates/Feeds/TemplateTypeTemplate.php:179
2346
  msgid "The \"items\" must be a collection instance"
2347
  msgstr ""
2348
 
2349
- #: src/Templates/Feeds/MasterFeedsTemplate.php:287
2350
  msgid ""
2351
- "Template \"{0}\" does not exist or could not be loaded. The \"{1}\" template "
2352
- "was used is instead."
2353
  msgstr ""
2354
 
2355
  #: src/Templates/Feeds/Types/AbstractFeedTemplateType.php:85
@@ -2369,6 +2363,56 @@ msgstr ""
2369
  msgid "Could not render twig template: "
2370
  msgstr ""
2371
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2372
  #: src/Ui/BlacklistTable.php:52
2373
  msgid "There are no blacklisted items"
2374
  msgstr ""
@@ -2381,25 +2425,25 @@ msgstr ""
2381
  msgid "Delete"
2382
  msgstr ""
2383
 
2384
- #: wp-rss-aggregator.php:470
2385
  msgid "Attempted to load an invalid WP RSS Aggregator module"
2386
  msgstr ""
2387
 
2388
- #: wp-rss-aggregator.php:491
2389
  msgid ""
2390
  "<b>WP RSS Aggregator</b> has encountered an error. If this problem persists, "
2391
  "kindly contact customer support and provide the following details:"
2392
  msgstr ""
2393
 
2394
- #: wp-rss-aggregator.php:524
2395
  msgid "Deactivate WP RSS Aggregator and its addons"
2396
  msgstr ""
2397
 
2398
- #: wp-rss-aggregator.php:525
2399
  msgid "Deactivate WP RSS Aggregator"
2400
  msgstr ""
2401
 
2402
- #: wp-rss-aggregator.php:533
2403
  msgid ""
2404
  "<b>WP RSS Aggregator</b> has encountered a critical error. The safest course "
2405
  "of action is to deactivate the plugin and any of its add-ons on this site "
@@ -2409,34 +2453,34 @@ msgid ""
2409
  "how it happened."
2410
  msgstr ""
2411
 
2412
- #: wp-rss-aggregator.php:542
2413
  msgid "WP RSS Aggregator Error"
2414
  msgstr ""
2415
 
2416
- #: wp-rss-aggregator.php:566
2417
  msgid "Click to show error details"
2418
  msgstr ""
2419
 
2420
- #: wp-rss-aggregator.php:569
2421
  msgid "Error Message:"
2422
  msgstr ""
2423
 
2424
- #: wp-rss-aggregator.php:573
2425
  msgid "Occurred at:"
2426
  msgstr ""
2427
 
2428
- #: wp-rss-aggregator.php:577
2429
  msgid "Stack trace:"
2430
  msgstr ""
2431
 
2432
- #: wp-rss-aggregator.php:696 wp-rss-aggregator.php:790
2433
  msgid ""
2434
  "As of version 4.13, WP RSS Aggregator will stop supporting PHP 5.3 and will "
2435
  "require PHP 5.4 or later. Kindly contact your site's hosting provider for "
2436
  "PHP version update options."
2437
  msgstr ""
2438
 
2439
- #: wp-rss-aggregator.php:718
2440
  #, php-format
2441
  msgid ""
2442
  "<p><strong>%2$s requires WordPress to be of version %1$s or higher.</"
@@ -2445,28 +2489,28 @@ msgid ""
2445
  "services.</p>"
2446
  msgstr ""
2447
 
2448
- #: wp-rss-aggregator.php:740
2449
  msgid "WP RSS Aggregator cannot be activated."
2450
  msgstr ""
2451
 
2452
- #: wp-rss-aggregator.php:741
2453
  msgid "WP RSS Aggregator has been deactivated."
2454
  msgstr ""
2455
 
2456
- #: wp-rss-aggregator.php:746
2457
  msgctxt ""
2458
  "Used like \"Kindly contact your hosting provider or contact support for more "
2459
  "information.\""
2460
  msgid "contact support"
2461
  msgstr ""
2462
 
2463
- #: wp-rss-aggregator.php:753
2464
  #, php-format
2465
  msgid ""
2466
  "The plugin requires version %s or later and your site's PHP version is %s."
2467
  msgstr ""
2468
 
2469
- #: wp-rss-aggregator.php:759
2470
  #, php-format
2471
  msgctxt "the \"%s\" part is a link with text = \"contact support\""
2472
  msgid ""
@@ -2474,22 +2518,22 @@ msgid ""
2474
  "more information."
2475
  msgstr ""
2476
 
2477
- #: wp-rss-aggregator.php:768
2478
  msgid "WP RSS Aggregator - PHP version error"
2479
  msgstr ""
2480
 
2481
- #: wp-rss-aggregator.php:808
2482
  #, php-format
2483
  msgid "%2$s requires WordPress version %1$s or higher."
2484
  msgstr ""
2485
 
2486
- #: wp-rss-aggregator.php:1017
2487
  msgid ""
2488
  "The Excerpts & Thumbnails addon has been discontinued in favor of the "
2489
  "Templates addon."
2490
  msgstr ""
2491
 
2492
- #: wp-rss-aggregator.php:1018
2493
  msgid "Click here to learn more."
2494
  msgstr ""
2495
 
@@ -2643,7 +2687,7 @@ msgid "Feed Name, http://www.myfeed.com"
2643
  msgstr ""
2644
 
2645
  #: templates/admin/tools/bulk_add.twig:14
2646
- msgid "Add Feeds"
2647
  msgstr ""
2648
 
2649
  #: templates/admin/tools/crons.twig:20
@@ -2682,7 +2726,7 @@ msgstr ""
2682
  msgid "Time"
2683
  msgstr ""
2684
 
2685
- #: templates/admin/tools/export.twig:1 templates/admin/tools/export.twig:13
2686
  msgid "Export Settings"
2687
  msgstr ""
2688
 
@@ -2692,12 +2736,20 @@ msgid ""
2692
  "its add-ons."
2693
  msgstr ""
2694
 
 
 
 
 
2695
  #: templates/admin/tools/import.twig:2
2696
  msgid ""
2697
  "Upload an exported settings file to import your settings for WP RSS "
2698
  "Aggregator and its add-ons"
2699
  msgstr ""
2700
 
 
 
 
 
2701
  #: templates/admin/tools/logs.twig:2
2702
  msgid "Debug Log"
2703
  msgstr ""
@@ -2771,11 +2823,11 @@ msgid "(Once per day, logs older than the set amount of days are deleted)"
2771
  msgstr ""
2772
 
2773
  #: templates/admin/tools/logs.twig:113
2774
- msgid "Save Log Options"
2775
  msgstr ""
2776
 
2777
- #: templates/admin/tools/reset.twig:1 templates/admin/tools/reset.twig:14
2778
- msgid "Delete all imported items"
2779
  msgstr ""
2780
 
2781
  #: templates/admin/tools/reset.twig:2
@@ -2788,6 +2840,10 @@ msgid ""
2788
  "feeds, meaning that you may be unable to re-import them later."
2789
  msgstr ""
2790
 
 
 
 
 
2791
  #: templates/admin/tools/reset.twig:18
2792
  msgid "Restore Default Settings"
2793
  msgstr ""
@@ -2803,7 +2859,7 @@ msgid ""
2803
  msgstr ""
2804
 
2805
  #: templates/admin/tools/reset.twig:30
2806
- msgid "Reset Settings to Default"
2807
  msgstr ""
2808
 
2809
  #: templates/admin/tools/sys_info.twig:17
1
  msgid ""
2
  msgstr ""
3
  "Project-Id-Version: WP RSS Aggregator\n"
4
+ "POT-Creation-Date: 2020-07-22 10:29+0200\n"
5
+ "PO-Revision-Date: 2020-07-22 10:30+0200\n"
6
  "Last-Translator: \n"
7
  "Language-Team: RebelCode\n"
8
  "Language: en_US\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.3.1\n"
13
  "X-Poedit-Basepath: ..\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
  "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
26
  "X-Poedit-SearchPathExcluded-4: fonts\n"
27
  "X-Poedit-SearchPathExcluded-5: webpack\n"
28
  "X-Poedit-SearchPathExcluded-6: test\n"
29
+ "X-Poedit-SearchPathExcluded-7: build\n"
30
+ "X-Poedit-SearchPathExcluded-8: images\n"
31
 
32
  #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:93
33
  msgid "No nonce"
59
  msgstr ""
60
 
61
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:183
62
+ msgid "License key"
63
  msgstr ""
64
 
65
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:192
66
+ msgid "Activate license"
67
  msgstr ""
68
 
69
  #: includes/Aventura/Wprss/Core/Licensing/Settings.php:221
339
  msgid "ID: %1$s"
340
  msgstr ""
341
 
342
+ #: includes/admin-display.php:459
343
  msgid "Could not schedule fetch: source ID must be specified"
344
  msgstr ""
345
 
346
+ #: includes/admin-display.php:497 includes/admin-display.php:546
347
  msgid "Failed to schedule cron"
348
  msgstr ""
349
 
350
+ #: includes/admin-display.php:528 includes/admin-display.php:579
351
  msgid "Source ID was not specified"
352
  msgstr ""
353
 
 
 
 
 
354
  #: includes/admin-editor.php:117
355
  msgid ""
356
  "To select more than one feed source, click and drag with your mouse pointer "
667
  msgid "The maximum number of feed items in the custom feed."
668
  msgstr ""
669
 
670
+ #: includes/admin-help-settings.php:93 src/Modules/FeedTemplatesModule.php:465
671
  msgid ""
672
  "Check this box to make the feed item titles link to the original article."
673
  msgstr ""
680
  "<em>Leave empty for no limit.</em>"
681
  msgstr ""
682
 
683
+ #: includes/admin-help-settings.php:100 src/Modules/FeedTemplatesModule.php:471
684
  msgid ""
685
  "Check this box to show the author for each feed item, if it is available."
686
  msgstr ""
711
  "to be displayed."
712
  msgstr ""
713
 
714
+ #: includes/admin-help-settings.php:114 src/Modules/FeedTemplatesModule.php:477
715
  msgid ""
716
  "Choose how you want links to be opened. This applies to the feed item title "
717
  "and the source link."
726
  "certain links, such as links to feed items in this case."
727
  msgstr ""
728
 
729
+ #: includes/admin-help-settings.php:125 src/Modules/FeedTemplatesModule.php:468
730
  msgid "Enable this option to show the feed source name for each feed item."
731
  msgstr ""
732
 
733
+ #: includes/admin-help-settings.php:127 src/Modules/FeedTemplatesModule.php:469
734
  msgid ""
735
  "Enter the text that you want to show before the source name. A space is "
736
  "automatically added between this text and the feed source name."
737
  msgstr ""
738
 
739
+ #: includes/admin-help-settings.php:129 src/Modules/FeedTemplatesModule.php:470
740
  msgid ""
741
  "Enable this option to link the feed source name to the RSS feed's source "
742
  "site."
743
  msgstr ""
744
 
745
+ #: includes/admin-help-settings.php:135 src/Modules/FeedTemplatesModule.php:473
746
  msgid "Enable this to show the feed item's date."
747
  msgstr ""
748
 
749
+ #: includes/admin-help-settings.php:137 src/Modules/FeedTemplatesModule.php:474
750
  msgid ""
751
  "Enter the text that you want to show before the feed item date. A space is "
752
  "automatically added between this text and the date."
753
  msgstr ""
754
 
755
+ #: includes/admin-help-settings.php:139 src/Modules/FeedTemplatesModule.php:475
756
  msgid "The format to use for the feed item dates, as a PHP date format."
757
  msgstr ""
758
 
851
 
852
  #: includes/admin-help.php:63
853
  msgid ""
854
+ "It provides access to our extensive knowledge base where you can find the "
855
+ "answers to the most commonly asked questions."
856
  msgstr ""
857
 
858
  #: includes/admin-help.php:66
859
  msgid ""
 
 
 
 
 
 
 
860
  "The beacon only works on WP RSS Aggregator admin pages and does not track "
861
+ "your mouse clicks and/or keyboard input."
862
  msgstr ""
863
 
864
+ #: includes/admin-help.php:69
865
  msgid "The support beacon is currently <b>enabled</b>."
866
  msgstr ""
867
 
868
+ #: includes/admin-help.php:71
869
  msgid "Disable support beacon"
870
  msgstr ""
871
 
872
+ #: includes/admin-help.php:74
873
  msgid ""
874
  "By enabling the help beacon, you are consenting to this data collection."
875
  msgstr ""
876
 
877
+ #: includes/admin-help.php:76
878
  msgid "Enable support beacon"
879
  msgstr ""
880
 
881
+ #: includes/admin-help.php:107
882
  msgid "Premium Support"
883
  msgstr ""
884
 
885
+ #: includes/admin-help.php:110
886
  #, php-format
887
  msgid ""
888
  "Contact us <a href=\"%s\" target=\"%s=\">here</a> for pre-sales and premium "
889
  "support."
890
  msgstr ""
891
 
892
+ #: includes/admin-help.php:167
893
  msgid "Email Support"
894
  msgstr ""
895
 
896
+ #: includes/admin-help.php:168
897
  msgid ""
898
  "If you still can't find an answer to your query after reading the "
899
  "documentation and going through the FAQ, just fill out the support request "
900
  "form below. We'll be happy to help you out."
901
  msgstr ""
902
 
903
+ #: includes/admin-help.php:175
904
  msgid "From: "
905
  msgstr ""
906
 
907
+ #: includes/admin-help.php:180
908
  msgid "Replies will be sent to this email address."
909
  msgstr ""
910
 
911
+ #: includes/admin-help.php:189
912
  msgid "Attachments"
913
  msgstr ""
914
 
915
+ #: includes/admin-help.php:192
916
  msgid "WP RSS Aggregator log file"
917
  msgstr ""
918
 
919
+ #: includes/admin-help.php:195
920
  msgid "WordPress debugging information"
921
  msgstr ""
922
 
923
+ #: includes/admin-help.php:200
924
  msgid "Send Message"
925
  msgstr ""
926
 
927
+ #: includes/admin-help.php:213
928
  msgid "Support Forums"
929
  msgstr ""
930
 
931
+ #: includes/admin-help.php:216
932
  #, php-format
933
  msgid ""
934
  "Users of the free version of WP RSS Aggregator can ask questions on the <a "
935
  "href=\"%s\">support forum</a>."
936
  msgstr ""
937
 
938
+ #: includes/admin-help.php:252
939
  #, php-format
940
  msgid ""
941
  "There was an error sending the form. Please use the <a href=\"%s\" target="
942
  "\"_blank\">contact form on our site.</a>"
943
  msgstr ""
944
 
945
+ #: includes/admin-help.php:282
946
  #, php-format
947
  msgid ""
948
  "Please fill out all the fields in the form, including the <strong>%s</"
949
  "strong> field."
950
  msgstr ""
951
 
952
+ #: includes/admin-help.php:290
953
  msgid "Please enter a valid email address."
954
  msgstr ""
955
 
956
+ #: includes/admin-help.php:1077
957
  msgid ""
958
  "Could not enqueue tooltip content: the queue method is not a valid callable."
959
  msgstr ""
962
  msgid "Welcome to WP RSS Aggregator"
963
  msgstr ""
964
 
965
+ #: includes/admin-intro-page.php:95
966
  #, php-format
967
  msgid "Missing intro step param \"%s\""
968
  msgstr ""
969
 
970
+ #: includes/admin-intro-page.php:122
971
  msgid "Missing feed URL parameter"
972
  msgstr ""
973
 
974
+ #: includes/admin-intro-page.php:127
975
  msgid "The given feed URL is invalid"
976
  msgstr ""
977
 
978
+ #: includes/admin-intro-page.php:198
979
  msgid "Failed to retrieve items"
980
  msgstr ""
981
 
982
+ #: includes/admin-intro-page.php:281
983
  #, php-format
984
  msgid "Failed to import the feed source \"%s\" with URL \"%s\""
985
  msgstr ""
986
 
987
+ #: includes/admin-intro-page.php:375
988
  msgctxt "default name of shortcode page"
989
  msgid "Feeds"
990
  msgstr ""
1018
  msgid "Limit"
1019
  msgstr ""
1020
 
1021
+ #: includes/admin-metaboxes.php:107 includes/admin-options.php:146
1022
+ msgid "Unique titles only"
1023
  msgstr ""
1024
 
1025
+ #: includes/admin-metaboxes.php:118
1026
+ msgid "Link to enclosure"
1027
  msgstr ""
1028
 
1029
+ #: includes/admin-metaboxes.php:125 includes/admin-options-legacy.php:70
1030
  msgid "Link source"
1031
  msgstr ""
1032
 
1033
+ #: includes/admin-metaboxes.php:132
1034
  msgid "Use source info"
1035
  msgstr ""
1036
 
1037
+ #: includes/admin-metaboxes.php:272 includes/admin-metaboxes.php:575
1038
+ #: includes/admin-metaboxes.php:671 includes/admin-options.php:575
1039
+ #: includes/admin-options.php:704 includes/admin-options.php:811
1040
+ #: includes/feed-access.php:263 src/Modules/FeedTemplatesModule.php:390
1041
  msgid "Default"
1042
  msgstr ""
1043
 
1044
+ #: includes/admin-metaboxes.php:298
1045
  msgid "Updating feed source"
1046
  msgstr ""
1047
 
1048
+ #: includes/admin-metaboxes.php:305
1049
+ msgid "How to find an RSS feed"
1050
+ msgstr ""
1051
+
1052
+ #: includes/admin-metaboxes.php:464
1053
  #, php-format
1054
  msgid "Latest %1$s feed items out of %2$s available from %3$s"
1055
  msgstr ""
1056
 
1057
+ #: includes/admin-metaboxes.php:473 includes/scripts.php:56
1058
  msgid "ago"
1059
  msgstr ""
1060
 
1061
+ #: includes/admin-metaboxes.php:475
1062
  msgid "No Date"
1063
  msgstr ""
1064
 
1065
+ #: includes/admin-metaboxes.php:497
1066
  msgid ""
1067
  "<strong>Invalid feed URL</strong> - Double check the feed source URL setting "
1068
  "above."
1069
  msgstr ""
1070
 
1071
+ #: includes/admin-metaboxes.php:503
1072
  #, php-format
1073
  msgid ""
1074
  "Not sure where to find the RSS feed on a website? <a target=\"_blank\" href="
1075
+ "\"%1$s\">Click here</a> for a visual guide."
1076
  msgstr ""
1077
 
1078
+ #: includes/admin-metaboxes.php:511
1079
  msgid "No feed URL defined yet"
1080
  msgstr ""
1081
 
1082
+ #: includes/admin-metaboxes.php:536
1083
  msgid "Force the feed"
1084
  msgstr ""
1085
 
1086
+ #: includes/admin-metaboxes.php:570
1087
  msgid "Active"
1088
  msgstr ""
1089
 
1090
+ #: includes/admin-metaboxes.php:571
1091
  msgid "Paused"
1092
  msgstr ""
1093
 
1094
+ #: includes/admin-metaboxes.php:668
1095
  msgid "Limit items by age:"
1096
  msgstr ""
1097
 
1098
+ #: includes/admin-metaboxes.php:702
1099
  msgid "Need help?"
1100
  msgstr ""
1101
 
1102
+ #: includes/admin-metaboxes.php:704
1103
  msgid "Check out the support forum"
1104
  msgstr ""
1105
 
1106
+ #: includes/admin-metaboxes.php:707
1107
  msgid "Suggest a new feature"
1108
  msgstr ""
1109
 
1110
+ #: includes/admin-metaboxes.php:721
1111
  msgid "Give it a 5 star rating on WordPress.org"
1112
  msgstr ""
1113
 
1114
+ #: includes/admin-metaboxes.php:737
1115
  msgid "Follow WP Mayor on Twitter."
1116
  msgstr ""
1117
 
1118
+ #: includes/admin-metaboxes.php:738
1119
  msgid "Like WP Mayor on Facebook."
1120
  msgstr ""
1121
 
1201
  msgid "Options that control how the feed item's date is displayed."
1202
  msgstr ""
1203
 
1204
+ #: includes/admin-options-legacy.php:177 includes/admin-options.php:440
1205
  msgid "No limit"
1206
  msgstr ""
1207
 
1208
  #: includes/admin-options-legacy.php:215
1209
+ #: src/Modules/FeedTemplatesModule.php:534
1210
  msgid "Original page link"
1211
  msgstr ""
1212
 
1213
  #: includes/admin-options-legacy.php:216
1214
+ #: src/Modules/FeedTemplatesModule.php:535
1215
  msgid "Embedded video player link"
1216
  msgstr ""
1217
 
1263
  msgid "Licenses"
1264
  msgstr ""
1265
 
1266
+ #: includes/admin-options.php:113
1267
+ msgid "You do not have access to this page"
1268
+ msgstr ""
1269
+
1270
+ #: includes/admin-options.php:126
1271
  msgid "Save Settings"
1272
  msgstr ""
1273
 
1274
+ #: includes/admin-options.php:142
1275
  msgid "Update interval"
1276
  msgstr ""
1277
 
1278
+ #: includes/admin-options.php:150
1279
  msgid "Import order"
1280
  msgstr ""
1281
 
1282
+ #: includes/admin-options.php:154
1283
  msgid "Limit items by age"
1284
  msgstr ""
1285
 
1286
+ #: includes/admin-options.php:158
1287
  msgid "Limit feed items stored per feed"
1288
  msgstr ""
1289
 
1290
+ #: includes/admin-options.php:162
1291
  msgid "Limit feed items stored"
1292
  msgstr ""
1293
 
1294
+ #: includes/admin-options.php:166
1295
  msgid "Limit feed items per import"
1296
  msgstr ""
1297
 
1298
+ #: includes/admin-options.php:170
1299
  msgid "Schedule future items"
1300
  msgstr ""
1301
 
1302
+ #: includes/admin-options.php:177
1303
  msgid "Custom feed URL"
1304
  msgstr ""
1305
 
1306
+ #: includes/admin-options.php:181
1307
  msgid "Custom feed title"
1308
  msgstr ""
1309
 
1310
+ #: includes/admin-options.php:185
1311
  msgid "Custom feed limit"
1312
  msgstr ""
1313
 
1314
+ #: includes/admin-options.php:198
1315
+ msgid "Disable styles"
1316
  msgstr ""
1317
 
1318
+ #: includes/admin-options.php:229 templates/admin/tools/import.twig:1
 
1319
  msgid "Import Settings"
1320
  msgstr ""
1321
 
1322
+ #: includes/admin-options.php:240
1323
  msgid "Custom RSS Feed"
1324
  msgstr ""
1325
 
1326
+ #: includes/admin-options.php:250
1327
  msgid "Advanced Settings"
1328
  msgstr ""
1329
 
1330
+ #: includes/admin-options.php:254
1331
  msgid "Styles"
1332
  msgstr ""
1333
 
1334
+ #: includes/admin-options.php:395
1335
  msgid "Configure how WP RSS Aggregator imports RSS feed items."
1336
  msgstr ""
1337
 
1338
+ #: includes/admin-options.php:405
1339
  msgid ""
1340
  "WP RSS Aggregator creates a custom RSS feed on your site that includes all "
1341
  "of your imported items. Use the below options to set it up."
1342
  msgstr ""
1343
 
1344
+ #: includes/admin-options.php:414
1345
  msgid "Only change these options if you know what you are doing!"
1346
  msgstr ""
1347
 
1348
+ #: includes/admin-options.php:423
1349
  msgid ""
1350
  "If you would like to disable all styles used in this plugin, tick the "
1351
  "checkbox."
1352
  msgstr ""
1353
 
1354
+ #: includes/admin-options.php:474 includes/admin-options.php:604
1355
  msgid "No Limit"
1356
  msgstr ""
1357
 
1358
+ #: includes/admin-options.php:551
1359
  msgid "Open custom feed"
1360
  msgstr ""
1361
 
1362
+ #: includes/admin-options.php:639
1363
  msgid "Latest items first"
1364
  msgstr ""
1365
 
1366
+ #: includes/admin-options.php:640
1367
  msgid "Oldest items first"
1368
  msgstr ""
1369
 
1370
+ #: includes/admin-options.php:641
1371
  msgid "Original feed order"
1372
  msgstr ""
1373
 
1374
+ #: includes/admin-options.php:666
1375
  msgid "Generate Random Code"
1376
  msgstr ""
1377
 
1378
+ #: includes/admin-options.php:671
1379
  msgid ""
1380
  "Enter the code to use to securely reset the plugin and deactivate it. Be "
1381
  "sure to save this code somewhere safe."
1382
  msgstr ""
1383
 
1384
+ #: includes/admin-options.php:677
1385
  msgid ""
1386
  "Leave this empty to disable the secure reset function.<br/>\n"
1387
  " You use this code by adding any of the following to any URL on "
1388
  "your site."
1389
  msgstr ""
1390
 
1391
+ #: includes/admin-options.php:680
1392
  msgid "Resets your WP RSS Aggregator settings"
1393
  msgstr ""
1394
 
1395
+ #: includes/admin-options.php:681
1396
  msgid "Deactivates WP RSS Aggregator"
1397
  msgstr ""
1398
 
1399
+ #: includes/admin-options.php:682
1400
  msgid "Does both of the above"
1401
  msgstr ""
1402
 
1403
+ #: includes/admin-options.php:686
1404
  msgid ""
1405
  "Use the above actions only when absolutely necessary, or when instructed to "
1406
  "by support staff."
1407
  msgstr ""
1408
 
1409
+ #: includes/admin-options.php:702
1410
  msgid "On"
1411
  msgstr ""
1412
 
1413
+ #: includes/admin-options.php:703
1414
  msgid "Off"
1415
  msgstr ""
1416
 
1417
+ #: includes/admin-options.php:815
1418
  #, php-format
1419
  msgid "%s year"
1420
  msgid_plural "%s years"
1421
  msgstr[0] ""
1422
  msgstr[1] ""
1423
 
1424
+ #: includes/admin-options.php:816
1425
  #, php-format
1426
  msgid "%s month"
1427
  msgid_plural "%s months"
1428
  msgstr[0] ""
1429
  msgstr[1] ""
1430
 
1431
+ #: includes/admin-options.php:817
1432
  #, php-format
1433
  msgid "%s week"
1434
  msgid_plural "%s weeks"
1435
  msgstr[0] ""
1436
  msgstr[1] ""
1437
 
1438
+ #: includes/admin-options.php:818
1439
  #, php-format
1440
  msgid "%s day"
1441
  msgid_plural "%s days"
1442
  msgstr[0] ""
1443
  msgstr[1] ""
1444
 
1445
+ #: includes/admin-options.php:819
1446
  #, php-format
1447
  msgid "%s hour"
1448
  msgid_plural "%s hours"
1449
  msgstr[0] ""
1450
  msgstr[1] ""
1451
 
1452
+ #: includes/admin-options.php:820
1453
  #, php-format
1454
  msgid "%s minute"
1455
  msgid_plural "%s minutes"
1456
  msgstr[0] ""
1457
  msgstr[1] ""
1458
 
1459
+ #: includes/admin-options.php:821
1460
  #, php-format
1461
  msgid "%s second"
1462
  msgid_plural "%s seconds"
1463
  msgstr[0] ""
1464
  msgstr[1] ""
1465
 
1466
+ #: includes/admin-options.php:826
1467
  msgid "now"
1468
  msgstr ""
1469
 
1581
  msgid "Certificate path"
1582
  msgstr ""
1583
 
1584
+ #: includes/feed-access.php:206 includes/feed-access.php:231
1585
  msgid "Feed request useragent"
1586
  msgstr ""
1587
 
1589
  msgid "Enable feed cache"
1590
  msgstr ""
1591
 
 
 
 
 
1592
  #: includes/feed-access.php:232
1593
  msgid "Leave blank to inherit general setting"
1594
  msgstr ""
1611
  "the blacklist"
1612
  msgstr ""
1613
 
1614
+ #: includes/feed-importing.php:383
1615
  #, php-format
1616
  msgid "Failed to fetch the RSS feed. Error: %s"
1617
  msgstr ""
1618
 
1619
+ #: includes/feed-importing.php:830
1620
  #, php-format
1621
  msgid "The importing process failed after %d seconds with the message: \"%s\""
1622
  msgstr ""
1623
 
1624
+ #: includes/feed-processing.php:471
1625
  msgid "The plugin failed to schedule a fetch for this feed. Please try again."
1626
  msgstr ""
1627
 
2066
  msgid "No Templates Found In Trash"
2067
  msgstr ""
2068
 
2069
+ #: src/Modules/FeedTemplatesModule.php:436
2070
  #: src/Templates/Feeds/Types/ListTemplateType.php:99
2071
  msgid "Source:"
2072
  msgstr ""
2073
 
2074
+ #: src/Modules/FeedTemplatesModule.php:439
2075
  #: src/Templates/Feeds/Types/ListTemplateType.php:111
2076
  msgid "By"
2077
  msgstr ""
2078
 
2079
+ #: src/Modules/FeedTemplatesModule.php:441
2080
  #: src/Templates/Feeds/Types/ListTemplateType.php:119
2081
  msgid "Published on:"
2082
  msgstr ""
2083
 
2084
+ #: src/Modules/FeedTemplatesModule.php:463
2085
  msgid ""
2086
  "The maximum number of feed items to display when using the shortcode. This "
2087
  "enables pagination if set to a number smaller than the number of items to be "
2088
  "displayed."
2089
  msgstr ""
2090
 
2091
+ #: src/Modules/FeedTemplatesModule.php:464
2092
  msgid ""
2093
  "Set the maximum number of characters to show for feed item titles.<hr/"
2094
  "><em>Leave empty for no limit.</em>"
2095
  msgstr ""
2096
 
2097
+ #: src/Modules/FeedTemplatesModule.php:466
2098
  msgid "Enable this option to show the pagination beneath feed items."
2099
  msgstr ""
2100
 
2101
+ #: src/Modules/FeedTemplatesModule.php:467
2102
  msgid ""
2103
  "The type of pagination to use when showing feed items on multiple pages. The "
2104
  "first shows two links, \"Older\" and \"Newer\", which allow you to navigate "
2106
  "links for the next and previous pages."
2107
  msgstr ""
2108
 
2109
+ #: src/Modules/FeedTemplatesModule.php:472
2110
  msgid ""
2111
  "Enter the text that you want to show before the author name. A space is "
2112
  "automatically added between this text and the author name."
2113
  msgstr ""
2114
 
2115
+ #: src/Modules/FeedTemplatesModule.php:476
2116
  msgid ""
2117
  "Enable this option to show the elapsed time from the feed item's date and "
2118
  "time to the present time. <em>Eg. 2 hours ago</em>"
2119
  msgstr ""
2120
 
2121
+ #: src/Modules/FeedTemplatesModule.php:478
2122
  msgid ""
2123
  "Enable this option to set all links displayed as \"NoFollow\".<hr/>\"Nofollow"
2124
  "\" provides a way to tell search engines to <em>not</em> follow certain "
2125
  "links, such as links to feed items in this case."
2126
  msgstr ""
2127
 
2128
+ #: src/Modules/FeedTemplatesModule.php:479
2129
  msgid ""
2130
  "Tick this box to have feed items link to their embedded content, if they "
2131
  "have any. This works especially well when links are set to <em>\"Open in a "
2132
  "lightbox\"</em>."
2133
  msgstr ""
2134
 
2135
+ #: src/Modules/FeedTemplatesModule.php:480
2136
  msgid "Enable this option to show bullets next to feed items."
2137
  msgstr ""
2138
 
2139
+ #: src/Modules/FeedTemplatesModule.php:481
2140
  msgid "The bullet type to use for feed items."
2141
  msgstr ""
2142
 
2143
+ #: src/Modules/FeedTemplatesModule.php:482
2144
  msgid ""
2145
  "You can add your own HTML class name to the template output. This lets you "
2146
  "customize your template further using custom CSS styling or custom JS "
2147
  "functionality."
2148
  msgstr ""
2149
 
2150
+ #: src/Modules/FeedTemplatesModule.php:494
2151
  #: src/Templates/Feeds/Types/ListTemplateType.php:29
2152
  msgid "List"
2153
  msgstr ""
2154
 
2155
+ #: src/Modules/FeedTemplatesModule.php:521
2156
  msgid "Open in same tab/window"
2157
  msgstr ""
2158
 
2159
+ #: src/Modules/FeedTemplatesModule.php:522
2160
  msgid "Open in a new tab"
2161
  msgstr ""
2162
 
2163
+ #: src/Modules/FeedTemplatesModule.php:523
2164
  msgid "Open in a lightbox"
2165
  msgstr ""
2166
 
2167
+ #: src/Modules/FeedTemplatesModule.php:526
2168
  msgid "Older/Newer"
2169
  msgstr ""
2170
 
2171
+ #: src/Modules/FeedTemplatesModule.php:527
2172
  msgid "Numbered"
2173
  msgstr ""
2174
 
2175
+ #: src/Modules/FeedTemplatesModule.php:530
2176
  msgid "Bullets"
2177
  msgstr ""
2178
 
2179
+ #: src/Modules/FeedTemplatesModule.php:531
2180
  msgid "Numbers"
2181
  msgstr ""
2182
 
2184
  msgid "Image"
2185
  msgstr ""
2186
 
2187
+ #: src/Modules/ImagesModule.php:191 src/Modules/ImagesModule.php:289
2188
  msgid "Images"
2189
  msgstr ""
2190
 
2191
+ #: src/Modules/ImagesModule.php:271
2192
  msgid ""
2193
  "This option allows you to select which feed item image to use as the "
2194
  "featured image. Automatic best image detection will attempt to find the "
2335
  msgid "Template \"%s\" does not exist"
2336
  msgstr ""
2337
 
2338
+ #: src/Templates/Feeds/MasterFeedsTemplate.php:247
2339
  #: src/Templates/Feeds/TemplateTypeTemplate.php:179
2340
  msgid "The \"items\" must be a collection instance"
2341
  msgstr ""
2342
 
2343
+ #: src/Templates/Feeds/MasterFeedsTemplate.php:273
2344
  msgid ""
2345
+ "Template \"{0}\" does not exist or could not be loaded. The default template "
2346
+ "was used instead."
2347
  msgstr ""
2348
 
2349
  #: src/Templates/Feeds/Types/AbstractFeedTemplateType.php:85
2363
  msgid "Could not render twig template: "
2364
  msgstr ""
2365
 
2366
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:63
2367
+ msgid "day"
2368
+ msgid_plural "days"
2369
+ msgstr[0] ""
2370
+ msgstr[1] ""
2371
+
2372
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:66
2373
+ msgid "hour"
2374
+ msgid_plural "hours"
2375
+ msgstr[0] ""
2376
+ msgstr[1] ""
2377
+
2378
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:69
2379
+ msgid "minute"
2380
+ msgid_plural "minutes"
2381
+ msgstr[0] ""
2382
+ msgstr[1] ""
2383
+
2384
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:72
2385
+ msgid "second"
2386
+ msgid_plural "seconds"
2387
+ msgstr[0] ""
2388
+ msgstr[1] ""
2389
+
2390
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:75
2391
+ msgid "month"
2392
+ msgid_plural "months"
2393
+ msgstr[0] ""
2394
+ msgstr[1] ""
2395
+
2396
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:78
2397
+ msgid "year"
2398
+ msgid_plural "years"
2399
+ msgstr[0] ""
2400
+ msgstr[1] ""
2401
+
2402
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:87
2403
+ msgctxt "Format for past feed item dates, example: \"5 hours ago\""
2404
+ msgid "{number} {unit} ago"
2405
+ msgid_plural "{number} {unit} ago"
2406
+ msgstr[0] ""
2407
+ msgstr[1] ""
2408
+
2409
+ #: src/Twig/Extensions/Date/TwigDateTranslator.php:88
2410
+ msgctxt "Format for future feed item dates, example: \"in 2 days\""
2411
+ msgid "in {number} {unit}"
2412
+ msgid_plural "in {number} {unit}"
2413
+ msgstr[0] ""
2414
+ msgstr[1] "in {number} {unit}"
2415
+
2416
  #: src/Ui/BlacklistTable.php:52
2417
  msgid "There are no blacklisted items"
2418
  msgstr ""
2425
  msgid "Delete"
2426
  msgstr ""
2427
 
2428
+ #: wp-rss-aggregator.php:467
2429
  msgid "Attempted to load an invalid WP RSS Aggregator module"
2430
  msgstr ""
2431
 
2432
+ #: wp-rss-aggregator.php:488
2433
  msgid ""
2434
  "<b>WP RSS Aggregator</b> has encountered an error. If this problem persists, "
2435
  "kindly contact customer support and provide the following details:"
2436
  msgstr ""
2437
 
2438
+ #: wp-rss-aggregator.php:521
2439
  msgid "Deactivate WP RSS Aggregator and its addons"
2440
  msgstr ""
2441
 
2442
+ #: wp-rss-aggregator.php:522
2443
  msgid "Deactivate WP RSS Aggregator"
2444
  msgstr ""
2445
 
2446
+ #: wp-rss-aggregator.php:530
2447
  msgid ""
2448
  "<b>WP RSS Aggregator</b> has encountered a critical error. The safest course "
2449
  "of action is to deactivate the plugin and any of its add-ons on this site "
2453
  "how it happened."
2454
  msgstr ""
2455
 
2456
+ #: wp-rss-aggregator.php:539
2457
  msgid "WP RSS Aggregator Error"
2458
  msgstr ""
2459
 
2460
+ #: wp-rss-aggregator.php:563
2461
  msgid "Click to show error details"
2462
  msgstr ""
2463
 
2464
+ #: wp-rss-aggregator.php:566
2465
  msgid "Error Message:"
2466
  msgstr ""
2467
 
2468
+ #: wp-rss-aggregator.php:570
2469
  msgid "Occurred at:"
2470
  msgstr ""
2471
 
2472
+ #: wp-rss-aggregator.php:574
2473
  msgid "Stack trace:"
2474
  msgstr ""
2475
 
2476
+ #: wp-rss-aggregator.php:693 wp-rss-aggregator.php:787
2477
  msgid ""
2478
  "As of version 4.13, WP RSS Aggregator will stop supporting PHP 5.3 and will "
2479
  "require PHP 5.4 or later. Kindly contact your site's hosting provider for "
2480
  "PHP version update options."
2481
  msgstr ""
2482
 
2483
+ #: wp-rss-aggregator.php:715
2484
  #, php-format
2485
  msgid ""
2486
  "<p><strong>%2$s requires WordPress to be of version %1$s or higher.</"
2489
  "services.</p>"
2490
  msgstr ""
2491
 
2492
+ #: wp-rss-aggregator.php:737
2493
  msgid "WP RSS Aggregator cannot be activated."
2494
  msgstr ""
2495
 
2496
+ #: wp-rss-aggregator.php:738
2497
  msgid "WP RSS Aggregator has been deactivated."
2498
  msgstr ""
2499
 
2500
+ #: wp-rss-aggregator.php:743
2501
  msgctxt ""
2502
  "Used like \"Kindly contact your hosting provider or contact support for more "
2503
  "information.\""
2504
  msgid "contact support"
2505
  msgstr ""
2506
 
2507
+ #: wp-rss-aggregator.php:750
2508
  #, php-format
2509
  msgid ""
2510
  "The plugin requires version %s or later and your site's PHP version is %s."
2511
  msgstr ""
2512
 
2513
+ #: wp-rss-aggregator.php:756
2514
  #, php-format
2515
  msgctxt "the \"%s\" part is a link with text = \"contact support\""
2516
  msgid ""
2518
  "more information."
2519
  msgstr ""
2520
 
2521
+ #: wp-rss-aggregator.php:765
2522
  msgid "WP RSS Aggregator - PHP version error"
2523
  msgstr ""
2524
 
2525
+ #: wp-rss-aggregator.php:805
2526
  #, php-format
2527
  msgid "%2$s requires WordPress version %1$s or higher."
2528
  msgstr ""
2529
 
2530
+ #: wp-rss-aggregator.php:1014
2531
  msgid ""
2532
  "The Excerpts & Thumbnails addon has been discontinued in favor of the "
2533
  "Templates addon."
2534
  msgstr ""
2535
 
2536
+ #: wp-rss-aggregator.php:1015
2537
  msgid "Click here to learn more."
2538
  msgstr ""
2539
 
2687
  msgstr ""
2688
 
2689
  #: templates/admin/tools/bulk_add.twig:14
2690
+ msgid "Add feeds"
2691
  msgstr ""
2692
 
2693
  #: templates/admin/tools/crons.twig:20
2726
  msgid "Time"
2727
  msgstr ""
2728
 
2729
+ #: templates/admin/tools/export.twig:1
2730
  msgid "Export Settings"
2731
  msgstr ""
2732
 
2736
  "its add-ons."
2737
  msgstr ""
2738
 
2739
+ #: templates/admin/tools/export.twig:13
2740
+ msgid "Export settings"
2741
+ msgstr ""
2742
+
2743
  #: templates/admin/tools/import.twig:2
2744
  msgid ""
2745
  "Upload an exported settings file to import your settings for WP RSS "
2746
  "Aggregator and its add-ons"
2747
  msgstr ""
2748
 
2749
+ #: templates/admin/tools/import.twig:13
2750
+ msgid "Import settings"
2751
+ msgstr ""
2752
+
2753
  #: templates/admin/tools/logs.twig:2
2754
  msgid "Debug Log"
2755
  msgstr ""
2823
  msgstr ""
2824
 
2825
  #: templates/admin/tools/logs.twig:113
2826
+ msgid "Save log options"
2827
  msgstr ""
2828
 
2829
+ #: templates/admin/tools/reset.twig:1
2830
+ msgid "Delete All Imported Items"
2831
  msgstr ""
2832
 
2833
  #: templates/admin/tools/reset.twig:2
2840
  "feeds, meaning that you may be unable to re-import them later."
2841
  msgstr ""
2842
 
2843
+ #: templates/admin/tools/reset.twig:14
2844
+ msgid "Delete all imported items"
2845
+ msgstr ""
2846
+
2847
  #: templates/admin/tools/reset.twig:18
2848
  msgid "Restore Default Settings"
2849
  msgstr ""
2859
  msgstr ""
2860
 
2861
  #: templates/admin/tools/reset.twig:30
2862
+ msgid "Reset settings to default"
2863
  msgstr ""
2864
 
2865
  #: templates/admin/tools/sys_info.twig:17
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: RSS import, RSS aggregator, feed import, content curation, feed to post, n
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.4
7
  Requires PHP: 5.4
8
- Stable tag: 4.17.5
9
  License: GPLv3
10
 
11
  The most popular RSS aggregator for WordPress. Build a news aggregator with content from unlimited sources within minutes. Simple, robust & powerful.
@@ -253,6 +253,22 @@ Our complete Knowledge Base with FAQs can be found [here](https://kb.wprssaggreg
253
 
254
  == Changelog ==
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  = 4.17.5 (2020-04-22) =
257
  **Changed**
258
  - Now showing a case study of a site using the Pro Plan in the on-boarding wizard.
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.4
7
  Requires PHP: 5.4
8
+ Stable tag: 4.17.6
9
  License: GPLv3
10
 
11
  The most popular RSS aggregator for WordPress. Build a news aggregator with content from unlimited sources within minutes. Simple, robust & powerful.
253
 
254
  == Changelog ==
255
 
256
+ = 4.17.6 (2020-07-29) =
257
+ **Added**
258
+ - A link in the New/Edit Feed Source page on how to find an RSS feed.
259
+
260
+ **Changed**
261
+ - The "Force feed" option turns off SSL verification.
262
+ - Improved wording on the Help page.
263
+ - Dates in templates can now be translated.
264
+ - The link to the article on how to find an RSS feed now links to an article from the plugin's knowledge base.
265
+ - The "Unique Titles" feed option can now be set to default to the global setting.
266
+
267
+ **Fixed**
268
+ - Rewrite rules would always get flushed when plugins tamper with them, such as Polylang Pro.
269
+ - The "Delete All Imported Items" reset option was deleting all posts on the site.
270
+ - Image options would not show up when using Feed to Post to import Feed Items.
271
+
272
  = 4.17.5 (2020-04-22) =
273
  **Changed**
274
  - Now showing a case study of a site using the Pro Plan in the on-boarding wizard.
src/Handlers/CustomFeed/RegisterCustomFeedHandler.php CHANGED
@@ -103,13 +103,8 @@ class RegisterCustomFeedHandler
103
 
104
  // If there are existing rules
105
  if (is_array($rules)) {
106
- // Get all the array keys that match the given pattern
107
- // The resulting array will only contain the second part of each matching key ($matches[1])
108
- $feeds = array_keys($rules, 'index.php?&feed=$matches[1]');
109
-
110
- // Check if the rewrite rule for the custom feed is already registered
111
- foreach ($feeds as $feed) {
112
- if (strpos($feed, $customFeedUrl) !== false) {
113
  return true;
114
  }
115
  }
103
 
104
  // If there are existing rules
105
  if (is_array($rules)) {
106
+ foreach ($rules as $key => $value) {
107
+ if (strpos($key, $customFeedUrl) !== false && preg_match('/[?&]feed=\$matches\[\d]/', $value)) {
 
 
 
 
 
108
  return true;
109
  }
110
  }
src/Modules/FeedSourcesModule.php CHANGED
@@ -117,7 +117,7 @@ class FeedSourcesModule implements ModuleInterface
117
  'url' => '',
118
  'import_source' => false,
119
  'import_limit' => 0,
120
- 'unique_titles_only' => false,
121
  'def_ft_image' => null,
122
  'import_ft_images' => '',
123
  'download_images' => false,
117
  'url' => '',
118
  'import_source' => false,
119
  'import_limit' => 0,
120
+ 'unique_titles_only' => wprss_get_general_setting('unique_titles'),
121
  'def_ft_image' => null,
122
  'import_ft_images' => '',
123
  'download_images' => false,
src/Modules/ImagesModule.php CHANGED
@@ -360,10 +360,8 @@ class ImagesModule implements ModuleInterface
360
 
361
  // Check if the images UI is enabled
362
  if ($c->get('wpra/images/ui_enabled')) {
363
- // The handler that registers the images meta box, if Feed to Post's version is not being used
364
- if (!class_exists('WPRSS_FTP_Meta')) {
365
- add_action('add_meta_boxes', $c->get('wpra/images/feeds/meta_box/handler/register'));
366
- }
367
 
368
  // Show the developer images meta box for feed items, if the developer filter is enabled
369
  if (wpra_is_dev_mode()) {
360
 
361
  // Check if the images UI is enabled
362
  if ($c->get('wpra/images/ui_enabled')) {
363
+ // The handler that registers the images meta box
364
+ add_action('add_meta_boxes', $c->get('wpra/images/feeds/meta_box/handler/register'));
 
 
365
 
366
  // Show the developer images meta box for feed items, if the developer filter is enabled
367
  if (wpra_is_dev_mode()) {
src/Modules/TwigModule.php CHANGED
@@ -4,8 +4,10 @@ namespace RebelCode\Wpra\Core\Modules;
4
 
5
  use Psr\Container\ContainerInterface;
6
  use RebelCode\Wpra\Core\Data\Collections\TwigTemplateCollection;
 
7
  use RebelCode\Wpra\Core\Twig\Extensions\I18n\WpI18nExtension;
8
  use RebelCode\Wpra\Core\Twig\Extensions\WpraExtension;
 
9
  use Twig\Environment as TwigEnvironment;
10
  use Twig\Extension\CoreExtension;
11
  use Twig\Extension\DebugExtension;
@@ -128,7 +130,7 @@ class TwigModule implements ModuleInterface
128
  * @since 4.13
129
  */
130
  'wpra/twig/extensions/date' => function (ContainerInterface $c) {
131
- return new DateExtension();
132
  },
133
  /*
134
  * The text extension for Twig.
4
 
5
  use Psr\Container\ContainerInterface;
6
  use RebelCode\Wpra\Core\Data\Collections\TwigTemplateCollection;
7
+ use RebelCode\Wpra\Core\Twig\Extensions\Date\TwigDateTranslator;
8
  use RebelCode\Wpra\Core\Twig\Extensions\I18n\WpI18nExtension;
9
  use RebelCode\Wpra\Core\Twig\Extensions\WpraExtension;
10
+ use Symfony\Component\Translation\TranslatorInterface;
11
  use Twig\Environment as TwigEnvironment;
12
  use Twig\Extension\CoreExtension;
13
  use Twig\Extension\DebugExtension;
130
  * @since 4.13
131
  */
132
  'wpra/twig/extensions/date' => function (ContainerInterface $c) {
133
+ return new DateExtension(new TwigDateTranslator());
134
  },
135
  /*
136
  * The text extension for Twig.
src/Twig/Extensions/Date/TwigDateTranslator.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace RebelCode\Wpra\Core\Twig\Extensions\Date;
4
+
5
+ use Symfony\Component\Translation\TranslatorInterface;
6
+
7
+ /**
8
+ * Translator for Twig dates.
9
+ *
10
+ * @since [*next-version*]
11
+ */
12
+ class TwigDateTranslator implements TranslatorInterface
13
+ {
14
+ /**
15
+ * The prefix of the $id parameter of the {@link transChoice} method.
16
+ */
17
+ const ID_PREFIX = "diff.";
18
+ /**
19
+ * The length of the {@link ID_PREFIX} constant.
20
+ *
21
+ * This is pre-calculated for performance reasons to avoid recalculating for every date that needs translation.
22
+ */
23
+ const ID_PREFIX_LEN = 5;
24
+
25
+ /**
26
+ * @inheritDoc
27
+ *
28
+ * @since [*next-version*]
29
+ */
30
+ public function trans($id, array $parameters = [], $domain = null, $locale = null)
31
+ {
32
+ return $id . "TRANS";
33
+ }
34
+
35
+ /**
36
+ * @inheritDoc
37
+ *
38
+ * @since [*next-version*]
39
+ */
40
+ public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
41
+ {
42
+ if (stripos($id, static::ID_PREFIX) !== 0) {
43
+ return $id;
44
+ }
45
+
46
+ // Get the part after the prefix
47
+ $suffix = substr($id, static::ID_PREFIX_LEN);
48
+
49
+ // Get the parts
50
+ $parts = explode('.', $suffix);
51
+ if (count($parts) < 2) {
52
+ return $id;
53
+ }
54
+
55
+ // The first part is the type ("ago" or "in")
56
+ // The second part is the date unit
57
+ $type = strtolower($parts[0]);
58
+ $unit = strtolower($parts[1]);
59
+
60
+ // Translate the unit
61
+ switch ($unit) {
62
+ case 'day':
63
+ $unit = _n('day', 'days', $number, 'wprss');
64
+ break;
65
+ case 'hour':
66
+ $unit = _n('hour', 'hours', $number, 'wprss');
67
+ break;
68
+ case 'minute':
69
+ $unit = _n('minute', 'minutes', $number, 'wprss');
70
+ break;
71
+ case 'second':
72
+ $unit = _n('second', 'seconds', $number, 'wprss');
73
+ break;
74
+ case 'month':
75
+ $unit = _n('month', 'months', $number, 'wprss');
76
+ break;
77
+ case 'year':
78
+ $unit = _n('year', 'years', $number, 'wprss');
79
+ break;
80
+ default:
81
+ return $id;
82
+ }
83
+
84
+ // Prepare the format. These strings can and should be made available for translation. The tokens are expected
85
+ // to still be present after translation.
86
+ $format = ($type === 'ago')
87
+ ? _nx('{number} {unit} ago', '{number} {unit} ago', $number, 'Format for past feed item dates, example: "5 hours ago"', 'wprss')
88
+ : _nx('in {number} {unit}', 'in {number} {unit}', $number, 'Format for future feed item dates, example: "in 2 days"', 'wprss');
89
+
90
+ // Replace tokens in the format and return the resulting translating and interpolated string
91
+ return strtr($format, [
92
+ '{number}' => $number,
93
+ '{unit}' => $unit,
94
+ ]);
95
+ }
96
+
97
+ /**
98
+ * @inheritDoc
99
+ *
100
+ * @since [*next-version*]
101
+ */
102
+ public function setLocale($locale)
103
+ {
104
+ }
105
+
106
+ /**
107
+ * @inheritDoc
108
+ *
109
+ * @since [*next-version*]
110
+ */
111
+ public function getLocale()
112
+ {
113
+ return get_locale();
114
+ }
115
+ }
templates/admin/tools/bulk_add.twig CHANGED
@@ -11,6 +11,6 @@
11
  <textarea rows="6" cols="80" form="bulk-add-form" name="wpra_bulk_feeds" autofocus></textarea>
12
 
13
  <p>
14
- <input type="submit" class="button-secondary" name="wpra_bulk_add" value="{{ "Add Feeds"|trans|e('html_attr') }}" />
15
  </p>
16
  </form>
11
  <textarea rows="6" cols="80" form="bulk-add-form" name="wpra_bulk_feeds" autofocus></textarea>
12
 
13
  <p>
14
+ <input type="submit" class="button-secondary" name="wpra_bulk_add" value="{{ "Add feeds"|trans|e('html_attr') }}" />
15
  </p>
16
  </form>
templates/admin/tools/export.twig CHANGED
@@ -10,7 +10,7 @@
10
 
11
  <button type="submit" class="button button-secondary">
12
  <i class="fa fa-download"></i>
13
- {% trans "Export Settings" %}
14
  </button>
15
  </p>
16
  </form>
10
 
11
  <button type="submit" class="button button-secondary">
12
  <i class="fa fa-download"></i>
13
+ {% trans "Export settings" %}
14
  </button>
15
  </p>
16
  </form>
templates/admin/tools/import.twig CHANGED
@@ -10,7 +10,7 @@
10
 
11
  <button type="submit" class="button button-secondary">
12
  <i class="fa fa-upload"></i>
13
- {% trans "Import Settings" %}
14
  </button>
15
  </p>
16
  </form>
10
 
11
  <button type="submit" class="button button-secondary">
12
  <i class="fa fa-upload"></i>
13
+ {% trans "Import settings" %}
14
  </button>
15
  </p>
16
  </form>
templates/admin/tools/logs.twig CHANGED
@@ -110,7 +110,7 @@
110
 
111
  <div class="wpra-submit-wrap">
112
  <button type="submit" name="wpra-log-options" class="button" value="1">
113
- {% trans "Save Log Options" %}
114
  </button>
115
  </div>
116
  </form>
110
 
111
  <div class="wpra-submit-wrap">
112
  <button type="submit" name="wpra-log-options" class="button" value="1">
113
+ {% trans "Save log options" %}
114
  </button>
115
  </div>
116
  </form>
templates/admin/tools/reset.twig CHANGED
@@ -1,4 +1,4 @@
1
- <h3>{% trans "Delete all imported items" %}</h3>
2
  <p>{% trans "Click the button below to delete all imported items and posts." %}</p>
3
  <p>
4
  {% trans "Kindly note that old items may no longer be present in their respective RSS feeds, meaning that you may be unable to re-import them later." %}
@@ -27,6 +27,6 @@
27
  <input type="submit"
28
  class="button button-red"
29
  name="wpra_reset_settings_submit"
30
- value="{{ "Reset Settings to Default"|trans|e('html_attr') }}"
31
  />
32
  </form>
1
+ <h3>{% trans "Delete All Imported Items" %}</h3>
2
  <p>{% trans "Click the button below to delete all imported items and posts." %}</p>
3
  <p>
4
  {% trans "Kindly note that old items may no longer be present in their respective RSS feeds, meaning that you may be unable to re-import them later." %}
27
  <input type="submit"
28
  class="button button-red"
29
  name="wpra_reset_settings_submit"
30
+ value="{{ "Reset settings to default"|trans|e('html_attr') }}"
31
  />
32
  </form>
vendor/composer/autoload_classmap.php CHANGED
@@ -454,6 +454,7 @@ return array(
454
  'RebelCode\\Wpra\\Core\\Templates\\Feeds\\Types\\ListTemplateType' => $baseDir . '/src/Templates/Feeds/Types/ListTemplateType.php',
455
  'RebelCode\\Wpra\\Core\\Templates\\NullTemplate' => $baseDir . '/src/Templates/NullTemplate.php',
456
  'RebelCode\\Wpra\\Core\\Templates\\TwigTemplate' => $baseDir . '/src/Templates/TwigTemplate.php',
 
457
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransNode' => $baseDir . '/src/Twig/Extensions/I18n/I18nTransNode.php',
458
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransTokenParser' => $baseDir . '/src/Twig/Extensions/I18n/I18nTransTokenParser.php',
459
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\WpI18nExtension' => $baseDir . '/src/Twig/Extensions/I18n/WpI18nExtension.php',
@@ -481,7 +482,60 @@ return array(
481
  'RebelCode\\Wpra\\Core\\Wp\\PluginInfo' => $baseDir . '/src/Wp/PluginInfo.php',
482
  'RebelCode\\Wpra\\Core\\Wp\\WpExtensionInterface' => $baseDir . '/src/Wp/WpExtensionInterface.php',
483
  'RebelCode\\Wpra\\Core\\Wp\\WpRolesProxy' => $baseDir . '/src/Wp/WpRolesProxy.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
 
485
  'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php',
486
  'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php',
487
  'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php',
454
  'RebelCode\\Wpra\\Core\\Templates\\Feeds\\Types\\ListTemplateType' => $baseDir . '/src/Templates/Feeds/Types/ListTemplateType.php',
455
  'RebelCode\\Wpra\\Core\\Templates\\NullTemplate' => $baseDir . '/src/Templates/NullTemplate.php',
456
  'RebelCode\\Wpra\\Core\\Templates\\TwigTemplate' => $baseDir . '/src/Templates/TwigTemplate.php',
457
+ 'RebelCode\\Wpra\\Core\\Twig\\Extensions\\Date\\TwigDateTranslator' => $baseDir . '/src/Twig/Extensions/Date/TwigDateTranslator.php',
458
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransNode' => $baseDir . '/src/Twig/Extensions/I18n/I18nTransNode.php',
459
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransTokenParser' => $baseDir . '/src/Twig/Extensions/I18n/I18nTransTokenParser.php',
460
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\WpI18nExtension' => $baseDir . '/src/Twig/Extensions/I18n/WpI18nExtension.php',
482
  'RebelCode\\Wpra\\Core\\Wp\\PluginInfo' => $baseDir . '/src/Wp/PluginInfo.php',
483
  'RebelCode\\Wpra\\Core\\Wp\\WpExtensionInterface' => $baseDir . '/src/Wp/WpExtensionInterface.php',
484
  'RebelCode\\Wpra\\Core\\Wp\\WpRolesProxy' => $baseDir . '/src/Wp/WpRolesProxy.php',
485
+ 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php',
486
+ 'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => $vendorDir . '/symfony/translation/Catalogue/DiffOperation.php',
487
+ 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php',
488
+ 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php',
489
+ 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php',
490
+ 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php',
491
+ 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php',
492
+ 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php',
493
+ 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php',
494
+ 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php',
495
+ 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php',
496
+ 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php',
497
+ 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php',
498
+ 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php',
499
+ 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php',
500
+ 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php',
501
+ 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php',
502
+ 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php',
503
+ 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php',
504
+ 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php',
505
+ 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php',
506
+ 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php',
507
+ 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php',
508
+ 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php',
509
+ 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php',
510
+ 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php',
511
+ 'Symfony\\Component\\Translation\\Interval' => $vendorDir . '/symfony/translation/Interval.php',
512
+ 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php',
513
+ 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php',
514
+ 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php',
515
+ 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php',
516
+ 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php',
517
+ 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php',
518
+ 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php',
519
+ 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php',
520
+ 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php',
521
+ 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php',
522
+ 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php',
523
+ 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php',
524
+ 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php',
525
+ 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php',
526
+ 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php',
527
+ 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php',
528
+ 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php',
529
+ 'Symfony\\Component\\Translation\\MessageSelector' => $vendorDir . '/symfony/translation/MessageSelector.php',
530
+ 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php',
531
+ 'Symfony\\Component\\Translation\\PluralizationRules' => $vendorDir . '/symfony/translation/PluralizationRules.php',
532
+ 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php',
533
+ 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php',
534
+ 'Symfony\\Component\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation/TranslatorInterface.php',
535
+ 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php',
536
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php',
537
  'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php',
538
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php',
539
  'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php',
540
  'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php',
541
  'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php',
vendor/composer/autoload_files.php CHANGED
@@ -7,5 +7,6 @@ $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
 
10
  'bbf73f3db644d3dced353b837903e74c' => $vendorDir . '/php-di/php-di/src/DI/functions.php',
11
  );
7
 
8
  return array(
9
  '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
10
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
11
  'bbf73f3db644d3dced353b837903e74c' => $vendorDir . '/php-di/php-di/src/DI/functions.php',
12
  );
vendor/composer/autoload_psr4.php CHANGED
@@ -8,7 +8,9 @@ $baseDir = dirname($vendorDir);
8
  return array(
9
  'Twig\\Extensions\\' => array($vendorDir . '/twig/extensions/src'),
10
  'Twig\\' => array($vendorDir . '/twig/twig/src'),
 
11
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
 
12
  'RebelCode\\Wpra\\Core\\' => array($baseDir . '/src'),
13
  'RebelCode\\Entities\\' => array($baseDir . '/lib/Entities'),
14
  'RebelCode\\Composer\\' => array($vendorDir . '/rebelcode/composer-cleanup-plugin/src'),
8
  return array(
9
  'Twig\\Extensions\\' => array($vendorDir . '/twig/extensions/src'),
10
  'Twig\\' => array($vendorDir . '/twig/twig/src'),
11
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
12
  'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
13
+ 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
14
  'RebelCode\\Wpra\\Core\\' => array($baseDir . '/src'),
15
  'RebelCode\\Entities\\' => array($baseDir . '/lib/Entities'),
16
  'RebelCode\\Composer\\' => array($vendorDir . '/rebelcode/composer-cleanup-plugin/src'),
vendor/composer/autoload_static.php CHANGED
@@ -8,6 +8,7 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
8
  {
9
  public static $files = array (
10
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
 
11
  'bbf73f3db644d3dced353b837903e74c' => __DIR__ . '/..' . '/php-di/php-di/src/DI/functions.php',
12
  );
13
 
@@ -19,7 +20,9 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
19
  ),
20
  'S' =>
21
  array (
 
22
  'Symfony\\Polyfill\\Ctype\\' => 23,
 
23
  ),
24
  'R' =>
25
  array (
@@ -66,10 +69,18 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
66
  array (
67
  0 => __DIR__ . '/..' . '/twig/twig/src',
68
  ),
 
 
 
 
69
  'Symfony\\Polyfill\\Ctype\\' =>
70
  array (
71
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
72
  ),
 
 
 
 
73
  'RebelCode\\Wpra\\Core\\' =>
74
  array (
75
  0 => __DIR__ . '/../..' . '/src',
@@ -642,6 +653,7 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
642
  'RebelCode\\Wpra\\Core\\Templates\\Feeds\\Types\\ListTemplateType' => __DIR__ . '/../..' . '/src/Templates/Feeds/Types/ListTemplateType.php',
643
  'RebelCode\\Wpra\\Core\\Templates\\NullTemplate' => __DIR__ . '/../..' . '/src/Templates/NullTemplate.php',
644
  'RebelCode\\Wpra\\Core\\Templates\\TwigTemplate' => __DIR__ . '/../..' . '/src/Templates/TwigTemplate.php',
 
645
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransNode' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/I18nTransNode.php',
646
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransTokenParser' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/I18nTransTokenParser.php',
647
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\WpI18nExtension' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/WpI18nExtension.php',
@@ -669,7 +681,60 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
669
  'RebelCode\\Wpra\\Core\\Wp\\PluginInfo' => __DIR__ . '/../..' . '/src/Wp/PluginInfo.php',
670
  'RebelCode\\Wpra\\Core\\Wp\\WpExtensionInterface' => __DIR__ . '/../..' . '/src/Wp/WpExtensionInterface.php',
671
  'RebelCode\\Wpra\\Core\\Wp\\WpRolesProxy' => __DIR__ . '/../..' . '/src/Wp/WpRolesProxy.php',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
672
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
 
673
  'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php',
674
  'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php',
675
  'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php',
8
  {
9
  public static $files = array (
10
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
11
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
12
  'bbf73f3db644d3dced353b837903e74c' => __DIR__ . '/..' . '/php-di/php-di/src/DI/functions.php',
13
  );
14
 
20
  ),
21
  'S' =>
22
  array (
23
+ 'Symfony\\Polyfill\\Mbstring\\' => 26,
24
  'Symfony\\Polyfill\\Ctype\\' => 23,
25
+ 'Symfony\\Component\\Translation\\' => 30,
26
  ),
27
  'R' =>
28
  array (
69
  array (
70
  0 => __DIR__ . '/..' . '/twig/twig/src',
71
  ),
72
+ 'Symfony\\Polyfill\\Mbstring\\' =>
73
+ array (
74
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
75
+ ),
76
  'Symfony\\Polyfill\\Ctype\\' =>
77
  array (
78
  0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
79
  ),
80
+ 'Symfony\\Component\\Translation\\' =>
81
+ array (
82
+ 0 => __DIR__ . '/..' . '/symfony/translation',
83
+ ),
84
  'RebelCode\\Wpra\\Core\\' =>
85
  array (
86
  0 => __DIR__ . '/../..' . '/src',
653
  'RebelCode\\Wpra\\Core\\Templates\\Feeds\\Types\\ListTemplateType' => __DIR__ . '/../..' . '/src/Templates/Feeds/Types/ListTemplateType.php',
654
  'RebelCode\\Wpra\\Core\\Templates\\NullTemplate' => __DIR__ . '/../..' . '/src/Templates/NullTemplate.php',
655
  'RebelCode\\Wpra\\Core\\Templates\\TwigTemplate' => __DIR__ . '/../..' . '/src/Templates/TwigTemplate.php',
656
+ 'RebelCode\\Wpra\\Core\\Twig\\Extensions\\Date\\TwigDateTranslator' => __DIR__ . '/../..' . '/src/Twig/Extensions/Date/TwigDateTranslator.php',
657
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransNode' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/I18nTransNode.php',
658
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\I18nTransTokenParser' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/I18nTransTokenParser.php',
659
  'RebelCode\\Wpra\\Core\\Twig\\Extensions\\I18n\\WpI18nExtension' => __DIR__ . '/../..' . '/src/Twig/Extensions/I18n/WpI18nExtension.php',
681
  'RebelCode\\Wpra\\Core\\Wp\\PluginInfo' => __DIR__ . '/../..' . '/src/Wp/PluginInfo.php',
682
  'RebelCode\\Wpra\\Core\\Wp\\WpExtensionInterface' => __DIR__ . '/../..' . '/src/Wp/WpExtensionInterface.php',
683
  'RebelCode\\Wpra\\Core\\Wp\\WpRolesProxy' => __DIR__ . '/../..' . '/src/Wp/WpRolesProxy.php',
684
+ 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php',
685
+ 'Symfony\\Component\\Translation\\Catalogue\\DiffOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/DiffOperation.php',
686
+ 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php',
687
+ 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php',
688
+ 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php',
689
+ 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php',
690
+ 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php',
691
+ 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php',
692
+ 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php',
693
+ 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php',
694
+ 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php',
695
+ 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php',
696
+ 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php',
697
+ 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php',
698
+ 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php',
699
+ 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php',
700
+ 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php',
701
+ 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php',
702
+ 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php',
703
+ 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php',
704
+ 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php',
705
+ 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php',
706
+ 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php',
707
+ 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php',
708
+ 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php',
709
+ 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php',
710
+ 'Symfony\\Component\\Translation\\Interval' => __DIR__ . '/..' . '/symfony/translation/Interval.php',
711
+ 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php',
712
+ 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php',
713
+ 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php',
714
+ 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php',
715
+ 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php',
716
+ 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php',
717
+ 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php',
718
+ 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php',
719
+ 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php',
720
+ 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php',
721
+ 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php',
722
+ 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php',
723
+ 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php',
724
+ 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php',
725
+ 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php',
726
+ 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php',
727
+ 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php',
728
+ 'Symfony\\Component\\Translation\\MessageSelector' => __DIR__ . '/..' . '/symfony/translation/MessageSelector.php',
729
+ 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php',
730
+ 'Symfony\\Component\\Translation\\PluralizationRules' => __DIR__ . '/..' . '/symfony/translation/PluralizationRules.php',
731
+ 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php',
732
+ 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php',
733
+ 'Symfony\\Component\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorInterface.php',
734
+ 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php',
735
+ 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php',
736
  'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php',
737
+ 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php',
738
  'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php',
739
  'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php',
740
  'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php',
vendor/composer/installed.json CHANGED
@@ -153,7 +153,8 @@
153
  "email": "development@dhii.co"
154
  }
155
  ],
156
- "description": "Collection base classes that do not depend on other non-collection packages, on which there is a dependency of other collection packages that depend on this package. This is done to avoid circular reference in the collection toolchain"
 
157
  },
158
  {
159
  "name": "dhii/collections-interface",
@@ -605,7 +606,8 @@
605
  "email": "development@dhii.co"
606
  }
607
  ],
608
- "description": "A base for internationalization consumers"
 
609
  },
610
  {
611
  "name": "dhii/i18n-interface",
@@ -1673,6 +1675,151 @@
1673
  "portable"
1674
  ]
1675
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1676
  {
1677
  "name": "twig/extensions",
1678
  "version": "v1.5.4",
153
  "email": "development@dhii.co"
154
  }
155
  ],
156
+ "description": "Collection base classes that do not depend on other non-collection packages, on which there is a dependency of other collection packages that depend on this package. This is done to avoid circular reference in the collection toolchain",
157
+ "abandoned": "dhii/collections"
158
  },
159
  {
160
  "name": "dhii/collections-interface",
606
  "email": "development@dhii.co"
607
  }
608
  ],
609
+ "description": "A base for internationalization consumers",
610
+ "abandoned": true
611
  },
612
  {
613
  "name": "dhii/i18n-interface",
1675
  "portable"
1676
  ]
1677
  },
1678
+ {
1679
+ "name": "symfony/polyfill-mbstring",
1680
+ "version": "v1.17.1",
1681
+ "version_normalized": "1.17.1.0",
1682
+ "source": {
1683
+ "type": "git",
1684
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
1685
+ "reference": "7110338d81ce1cbc3e273136e4574663627037a7"
1686
+ },
1687
+ "dist": {
1688
+ "type": "zip",
1689
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7",
1690
+ "reference": "7110338d81ce1cbc3e273136e4574663627037a7",
1691
+ "shasum": ""
1692
+ },
1693
+ "require": {
1694
+ "php": ">=5.3.3"
1695
+ },
1696
+ "suggest": {
1697
+ "ext-mbstring": "For best performance"
1698
+ },
1699
+ "time": "2020-06-06T08:46:27+00:00",
1700
+ "type": "library",
1701
+ "extra": {
1702
+ "branch-alias": {
1703
+ "dev-master": "1.17-dev"
1704
+ },
1705
+ "thanks": {
1706
+ "name": "symfony/polyfill",
1707
+ "url": "https://github.com/symfony/polyfill"
1708
+ }
1709
+ },
1710
+ "installation-source": "dist",
1711
+ "autoload": {
1712
+ "psr-4": {
1713
+ "Symfony\\Polyfill\\Mbstring\\": ""
1714
+ },
1715
+ "files": [
1716
+ "bootstrap.php"
1717
+ ]
1718
+ },
1719
+ "notification-url": "https://packagist.org/downloads/",
1720
+ "license": [
1721
+ "MIT"
1722
+ ],
1723
+ "authors": [
1724
+ {
1725
+ "name": "Nicolas Grekas",
1726
+ "email": "p@tchwork.com"
1727
+ },
1728
+ {
1729
+ "name": "Symfony Community",
1730
+ "homepage": "https://symfony.com/contributors"
1731
+ }
1732
+ ],
1733
+ "description": "Symfony polyfill for the Mbstring extension",
1734
+ "homepage": "https://symfony.com",
1735
+ "keywords": [
1736
+ "compatibility",
1737
+ "mbstring",
1738
+ "polyfill",
1739
+ "portable",
1740
+ "shim"
1741
+ ],
1742
+ "funding": [
1743
+ {
1744
+ "url": "https://symfony.com/sponsor",
1745
+ "type": "custom"
1746
+ },
1747
+ {
1748
+ "url": "https://github.com/fabpot",
1749
+ "type": "github"
1750
+ },
1751
+ {
1752
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1753
+ "type": "tidelift"
1754
+ }
1755
+ ]
1756
+ },
1757
+ {
1758
+ "name": "symfony/translation",
1759
+ "version": "v2.8.52",
1760
+ "version_normalized": "2.8.52.0",
1761
+ "source": {
1762
+ "type": "git",
1763
+ "url": "https://github.com/symfony/translation.git",
1764
+ "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089"
1765
+ },
1766
+ "dist": {
1767
+ "type": "zip",
1768
+ "url": "https://api.github.com/repos/symfony/translation/zipball/fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1769
+ "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1770
+ "shasum": ""
1771
+ },
1772
+ "require": {
1773
+ "php": ">=5.3.9",
1774
+ "symfony/polyfill-mbstring": "~1.0"
1775
+ },
1776
+ "conflict": {
1777
+ "symfony/config": "<2.7"
1778
+ },
1779
+ "require-dev": {
1780
+ "psr/log": "~1.0",
1781
+ "symfony/config": "~2.8",
1782
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
1783
+ "symfony/yaml": "~2.2|~3.0.0"
1784
+ },
1785
+ "suggest": {
1786
+ "psr/log-implementation": "To use logging capability in translator",
1787
+ "symfony/config": "",
1788
+ "symfony/yaml": ""
1789
+ },
1790
+ "time": "2018-11-24T21:16:41+00:00",
1791
+ "type": "library",
1792
+ "extra": {
1793
+ "branch-alias": {
1794
+ "dev-master": "2.8-dev"
1795
+ }
1796
+ },
1797
+ "installation-source": "dist",
1798
+ "autoload": {
1799
+ "psr-4": {
1800
+ "Symfony\\Component\\Translation\\": ""
1801
+ },
1802
+ "exclude-from-classmap": [
1803
+ "/Tests/"
1804
+ ]
1805
+ },
1806
+ "notification-url": "https://packagist.org/downloads/",
1807
+ "license": [
1808
+ "MIT"
1809
+ ],
1810
+ "authors": [
1811
+ {
1812
+ "name": "Fabien Potencier",
1813
+ "email": "fabien@symfony.com"
1814
+ },
1815
+ {
1816
+ "name": "Symfony Community",
1817
+ "homepage": "https://symfony.com/contributors"
1818
+ }
1819
+ ],
1820
+ "description": "Symfony Translation Component",
1821
+ "homepage": "https://symfony.com"
1822
+ },
1823
  {
1824
  "name": "twig/extensions",
1825
  "version": "v1.5.4",
vendor/symfony/polyfill-mbstring/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2015-2019 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,847 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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_chr - Returns a specific character from its Unicode code point
19
+ * - mb_convert_encoding - Convert character encoding
20
+ * - mb_convert_variables - Convert character code in variable(s)
21
+ * - mb_decode_mimeheader - Decode string in MIME header field
22
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
23
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
24
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
25
+ * - mb_convert_case - Perform case folding on a string
26
+ * - mb_detect_encoding - Detect character encoding
27
+ * - mb_get_info - Get internal settings of mbstring
28
+ * - mb_http_input - Detect HTTP input character encoding
29
+ * - mb_http_output - Set/Get HTTP output character encoding
30
+ * - mb_internal_encoding - Set/Get internal character encoding
31
+ * - mb_list_encodings - Returns an array of all supported encodings
32
+ * - mb_ord - Returns the Unicode code point of a character
33
+ * - mb_output_handler - Callback function converts character encoding in output buffer
34
+ * - mb_scrub - Replaces ill-formed byte sequences with substitute characters
35
+ * - mb_strlen - Get string length
36
+ * - mb_strpos - Find position of first occurrence of string in a string
37
+ * - mb_strrpos - Find position of last occurrence of a string in a string
38
+ * - mb_str_split - Convert a string to an array
39
+ * - mb_strtolower - Make a string lowercase
40
+ * - mb_strtoupper - Make a string uppercase
41
+ * - mb_substitute_character - Set/Get substitution character
42
+ * - mb_substr - Get part of string
43
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
44
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
45
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
46
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
47
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
48
+ * - mb_strstr - Finds first occurrence of a string within another
49
+ * - mb_strwidth - Return width of string
50
+ * - mb_substr_count - Count the number of substring occurrences
51
+ *
52
+ * Not implemented:
53
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
54
+ * - mb_ereg_* - Regular expression with multibyte support
55
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
56
+ * - mb_preferred_mime_name - Get MIME charset string
57
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
58
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
59
+ * - mb_send_mail - Send encoded mail
60
+ * - mb_split - Split multibyte string using regular expression
61
+ * - mb_strcut - Get part of string
62
+ * - mb_strimwidth - Get truncated string with specified width
63
+ *
64
+ * @author Nicolas Grekas <p@tchwork.com>
65
+ *
66
+ * @internal
67
+ */
68
+ final class Mbstring
69
+ {
70
+ const MB_CASE_FOLD = PHP_INT_MAX;
71
+
72
+ private static $encodingList = array('ASCII', 'UTF-8');
73
+ private static $language = 'neutral';
74
+ private static $internalEncoding = 'UTF-8';
75
+ private static $caseFold = array(
76
+ array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
77
+ array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'),
78
+ );
79
+
80
+ public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
81
+ {
82
+ if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
83
+ $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
84
+ } else {
85
+ $fromEncoding = self::getEncoding($fromEncoding);
86
+ }
87
+
88
+ $toEncoding = self::getEncoding($toEncoding);
89
+
90
+ if ('BASE64' === $fromEncoding) {
91
+ $s = base64_decode($s);
92
+ $fromEncoding = $toEncoding;
93
+ }
94
+
95
+ if ('BASE64' === $toEncoding) {
96
+ return base64_encode($s);
97
+ }
98
+
99
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
100
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
101
+ $fromEncoding = 'Windows-1252';
102
+ }
103
+ if ('UTF-8' !== $fromEncoding) {
104
+ $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
105
+ }
106
+
107
+ return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
108
+ }
109
+
110
+ if ('HTML-ENTITIES' === $fromEncoding) {
111
+ $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
112
+ $fromEncoding = 'UTF-8';
113
+ }
114
+
115
+ return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
116
+ }
117
+
118
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
119
+ {
120
+ $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
121
+
122
+ $ok = true;
123
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
124
+ if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
125
+ $ok = false;
126
+ }
127
+ });
128
+
129
+ return $ok ? $fromEncoding : false;
130
+ }
131
+
132
+ public static function mb_decode_mimeheader($s)
133
+ {
134
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
135
+ }
136
+
137
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
138
+ {
139
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
140
+ }
141
+
142
+ public static function mb_decode_numericentity($s, $convmap, $encoding = null)
143
+ {
144
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
145
+ trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
146
+
147
+ return null;
148
+ }
149
+
150
+ if (!\is_array($convmap) || !$convmap) {
151
+ return false;
152
+ }
153
+
154
+ if (null !== $encoding && !\is_scalar($encoding)) {
155
+ trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
156
+
157
+ return ''; // Instead of null (cf. mb_encode_numericentity).
158
+ }
159
+
160
+ $s = (string) $s;
161
+ if ('' === $s) {
162
+ return '';
163
+ }
164
+
165
+ $encoding = self::getEncoding($encoding);
166
+
167
+ if ('UTF-8' === $encoding) {
168
+ $encoding = null;
169
+ if (!preg_match('//u', $s)) {
170
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
171
+ }
172
+ } else {
173
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
174
+ }
175
+
176
+ $cnt = floor(\count($convmap) / 4) * 4;
177
+
178
+ for ($i = 0; $i < $cnt; $i += 4) {
179
+ // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
180
+ $convmap[$i] += $convmap[$i + 2];
181
+ $convmap[$i + 1] += $convmap[$i + 2];
182
+ }
183
+
184
+ $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
185
+ $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
186
+ for ($i = 0; $i < $cnt; $i += 4) {
187
+ if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
188
+ return Mbstring::mb_chr($c - $convmap[$i + 2]);
189
+ }
190
+ }
191
+
192
+ return $m[0];
193
+ }, $s);
194
+
195
+ if (null === $encoding) {
196
+ return $s;
197
+ }
198
+
199
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
200
+ }
201
+
202
+ public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
203
+ {
204
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
205
+ trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
206
+
207
+ return null;
208
+ }
209
+
210
+ if (!\is_array($convmap) || !$convmap) {
211
+ return false;
212
+ }
213
+
214
+ if (null !== $encoding && !\is_scalar($encoding)) {
215
+ trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
216
+
217
+ return null; // Instead of '' (cf. mb_decode_numericentity).
218
+ }
219
+
220
+ if (null !== $is_hex && !\is_scalar($is_hex)) {
221
+ trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
222
+
223
+ return null;
224
+ }
225
+
226
+ $s = (string) $s;
227
+ if ('' === $s) {
228
+ return '';
229
+ }
230
+
231
+ $encoding = self::getEncoding($encoding);
232
+
233
+ if ('UTF-8' === $encoding) {
234
+ $encoding = null;
235
+ if (!preg_match('//u', $s)) {
236
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
237
+ }
238
+ } else {
239
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
240
+ }
241
+
242
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
243
+
244
+ $cnt = floor(\count($convmap) / 4) * 4;
245
+ $i = 0;
246
+ $len = \strlen($s);
247
+ $result = '';
248
+
249
+ while ($i < $len) {
250
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
251
+ $uchr = substr($s, $i, $ulen);
252
+ $i += $ulen;
253
+ $c = self::mb_ord($uchr);
254
+
255
+ for ($j = 0; $j < $cnt; $j += 4) {
256
+ if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
257
+ $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
258
+ $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
259
+ continue 2;
260
+ }
261
+ }
262
+ $result .= $uchr;
263
+ }
264
+
265
+ if (null === $encoding) {
266
+ return $result;
267
+ }
268
+
269
+ return iconv('UTF-8', $encoding.'//IGNORE', $result);
270
+ }
271
+
272
+ public static function mb_convert_case($s, $mode, $encoding = null)
273
+ {
274
+ $s = (string) $s;
275
+ if ('' === $s) {
276
+ return '';
277
+ }
278
+
279
+ $encoding = self::getEncoding($encoding);
280
+
281
+ if ('UTF-8' === $encoding) {
282
+ $encoding = null;
283
+ if (!preg_match('//u', $s)) {
284
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
285
+ }
286
+ } else {
287
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
288
+ }
289
+
290
+ if (MB_CASE_TITLE == $mode) {
291
+ static $titleRegexp = null;
292
+ if (null === $titleRegexp) {
293
+ $titleRegexp = self::getData('titleCaseRegexp');
294
+ }
295
+ $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
296
+ } else {
297
+ if (MB_CASE_UPPER == $mode) {
298
+ static $upper = null;
299
+ if (null === $upper) {
300
+ $upper = self::getData('upperCase');
301
+ }
302
+ $map = $upper;
303
+ } else {
304
+ if (self::MB_CASE_FOLD === $mode) {
305
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
306
+ }
307
+
308
+ static $lower = null;
309
+ if (null === $lower) {
310
+ $lower = self::getData('lowerCase');
311
+ }
312
+ $map = $lower;
313
+ }
314
+
315
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
316
+
317
+ $i = 0;
318
+ $len = \strlen($s);
319
+
320
+ while ($i < $len) {
321
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
322
+ $uchr = substr($s, $i, $ulen);
323
+ $i += $ulen;
324
+
325
+ if (isset($map[$uchr])) {
326
+ $uchr = $map[$uchr];
327
+ $nlen = \strlen($uchr);
328
+
329
+ if ($nlen == $ulen) {
330
+ $nlen = $i;
331
+ do {
332
+ $s[--$nlen] = $uchr[--$ulen];
333
+ } while ($ulen);
334
+ } else {
335
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
336
+ $len += $nlen - $ulen;
337
+ $i += $nlen - $ulen;
338
+ }
339
+ }
340
+ }
341
+ }
342
+
343
+ if (null === $encoding) {
344
+ return $s;
345
+ }
346
+
347
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
348
+ }
349
+
350
+ public static function mb_internal_encoding($encoding = null)
351
+ {
352
+ if (null === $encoding) {
353
+ return self::$internalEncoding;
354
+ }
355
+
356
+ $encoding = self::getEncoding($encoding);
357
+
358
+ if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
359
+ self::$internalEncoding = $encoding;
360
+
361
+ return true;
362
+ }
363
+
364
+ return false;
365
+ }
366
+
367
+ public static function mb_language($lang = null)
368
+ {
369
+ if (null === $lang) {
370
+ return self::$language;
371
+ }
372
+
373
+ switch ($lang = strtolower($lang)) {
374
+ case 'uni':
375
+ case 'neutral':
376
+ self::$language = $lang;
377
+
378
+ return true;
379
+ }
380
+
381
+ return false;
382
+ }
383
+
384
+ public static function mb_list_encodings()
385
+ {
386
+ return array('UTF-8');
387
+ }
388
+
389
+ public static function mb_encoding_aliases($encoding)
390
+ {
391
+ switch (strtoupper($encoding)) {
392
+ case 'UTF8':
393
+ case 'UTF-8':
394
+ return array('utf8');
395
+ }
396
+
397
+ return false;
398
+ }
399
+
400
+ public static function mb_check_encoding($var = null, $encoding = null)
401
+ {
402
+ if (null === $encoding) {
403
+ if (null === $var) {
404
+ return false;
405
+ }
406
+ $encoding = self::$internalEncoding;
407
+ }
408
+
409
+ return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
410
+ }
411
+
412
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
413
+ {
414
+ if (null === $encodingList) {
415
+ $encodingList = self::$encodingList;
416
+ } else {
417
+ if (!\is_array($encodingList)) {
418
+ $encodingList = array_map('trim', explode(',', $encodingList));
419
+ }
420
+ $encodingList = array_map('strtoupper', $encodingList);
421
+ }
422
+
423
+ foreach ($encodingList as $enc) {
424
+ switch ($enc) {
425
+ case 'ASCII':
426
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
427
+ return $enc;
428
+ }
429
+ break;
430
+
431
+ case 'UTF8':
432
+ case 'UTF-8':
433
+ if (preg_match('//u', $str)) {
434
+ return 'UTF-8';
435
+ }
436
+ break;
437
+
438
+ default:
439
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
440
+ return $enc;
441
+ }
442
+ }
443
+ }
444
+
445
+ return false;
446
+ }
447
+
448
+ public static function mb_detect_order($encodingList = null)
449
+ {
450
+ if (null === $encodingList) {
451
+ return self::$encodingList;
452
+ }
453
+
454
+ if (!\is_array($encodingList)) {
455
+ $encodingList = array_map('trim', explode(',', $encodingList));
456
+ }
457
+ $encodingList = array_map('strtoupper', $encodingList);
458
+
459
+ foreach ($encodingList as $enc) {
460
+ switch ($enc) {
461
+ default:
462
+ if (strncmp($enc, 'ISO-8859-', 9)) {
463
+ return false;
464
+ }
465
+ // no break
466
+ case 'ASCII':
467
+ case 'UTF8':
468
+ case 'UTF-8':
469
+ }
470
+ }
471
+
472
+ self::$encodingList = $encodingList;
473
+
474
+ return true;
475
+ }
476
+
477
+ public static function mb_strlen($s, $encoding = null)
478
+ {
479
+ $encoding = self::getEncoding($encoding);
480
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
481
+ return \strlen($s);
482
+ }
483
+
484
+ return @iconv_strlen($s, $encoding);
485
+ }
486
+
487
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
488
+ {
489
+ $encoding = self::getEncoding($encoding);
490
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
491
+ return strpos($haystack, $needle, $offset);
492
+ }
493
+
494
+ $needle = (string) $needle;
495
+ if ('' === $needle) {
496
+ trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
497
+
498
+ return false;
499
+ }
500
+
501
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
502
+ }
503
+
504
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
505
+ {
506
+ $encoding = self::getEncoding($encoding);
507
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
508
+ return strrpos($haystack, $needle, $offset);
509
+ }
510
+
511
+ if ($offset != (int) $offset) {
512
+ $offset = 0;
513
+ } elseif ($offset = (int) $offset) {
514
+ if ($offset < 0) {
515
+ if (0 > $offset += self::mb_strlen($needle)) {
516
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
517
+ }
518
+ $offset = 0;
519
+ } else {
520
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
521
+ }
522
+ }
523
+
524
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
525
+
526
+ return false !== $pos ? $offset + $pos : false;
527
+ }
528
+
529
+ public static function mb_str_split($string, $split_length = 1, $encoding = null)
530
+ {
531
+ if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
532
+ trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
533
+
534
+ return null;
535
+ }
536
+
537
+ if (1 > $split_length = (int) $split_length) {
538
+ trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
539
+
540
+ return false;
541
+ }
542
+
543
+ if (null === $encoding) {
544
+ $encoding = mb_internal_encoding();
545
+ }
546
+
547
+ if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
548
+ $rx = '/(';
549
+ while (65535 < $split_length) {
550
+ $rx .= '.{65535}';
551
+ $split_length -= 65535;
552
+ }
553
+ $rx .= '.{'.$split_length.'})/us';
554
+
555
+ return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
556
+ }
557
+
558
+ $result = array();
559
+ $length = mb_strlen($string, $encoding);
560
+
561
+ for ($i = 0; $i < $length; $i += $split_length) {
562
+ $result[] = mb_substr($string, $i, $split_length, $encoding);
563
+ }
564
+
565
+ return $result;
566
+ }
567
+
568
+ public static function mb_strtolower($s, $encoding = null)
569
+ {
570
+ return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
571
+ }
572
+
573
+ public static function mb_strtoupper($s, $encoding = null)
574
+ {
575
+ return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
576
+ }
577
+
578
+ public static function mb_substitute_character($c = null)
579
+ {
580
+ if (0 === strcasecmp($c, 'none')) {
581
+ return true;
582
+ }
583
+
584
+ return null !== $c ? false : 'none';
585
+ }
586
+
587
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
588
+ {
589
+ $encoding = self::getEncoding($encoding);
590
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
591
+ return (string) substr($s, $start, null === $length ? 2147483647 : $length);
592
+ }
593
+
594
+ if ($start < 0) {
595
+ $start = iconv_strlen($s, $encoding) + $start;
596
+ if ($start < 0) {
597
+ $start = 0;
598
+ }
599
+ }
600
+
601
+ if (null === $length) {
602
+ $length = 2147483647;
603
+ } elseif ($length < 0) {
604
+ $length = iconv_strlen($s, $encoding) + $length - $start;
605
+ if ($length < 0) {
606
+ return '';
607
+ }
608
+ }
609
+
610
+ return (string) iconv_substr($s, $start, $length, $encoding);
611
+ }
612
+
613
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
614
+ {
615
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
616
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
617
+
618
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
619
+ }
620
+
621
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
622
+ {
623
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
624
+
625
+ return self::getSubpart($pos, $part, $haystack, $encoding);
626
+ }
627
+
628
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
629
+ {
630
+ $encoding = self::getEncoding($encoding);
631
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
632
+ return strrchr($haystack, $needle, $part);
633
+ }
634
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
635
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
636
+
637
+ return self::getSubpart($pos, $part, $haystack, $encoding);
638
+ }
639
+
640
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
641
+ {
642
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
643
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
644
+
645
+ return self::getSubpart($pos, $part, $haystack, $encoding);
646
+ }
647
+
648
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
649
+ {
650
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
651
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
652
+
653
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
654
+ }
655
+
656
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
657
+ {
658
+ $pos = strpos($haystack, $needle);
659
+ if (false === $pos) {
660
+ return false;
661
+ }
662
+ if ($part) {
663
+ return substr($haystack, 0, $pos);
664
+ }
665
+
666
+ return substr($haystack, $pos);
667
+ }
668
+
669
+ public static function mb_get_info($type = 'all')
670
+ {
671
+ $info = array(
672
+ 'internal_encoding' => self::$internalEncoding,
673
+ 'http_output' => 'pass',
674
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
675
+ 'func_overload' => 0,
676
+ 'func_overload_list' => 'no overload',
677
+ 'mail_charset' => 'UTF-8',
678
+ 'mail_header_encoding' => 'BASE64',
679
+ 'mail_body_encoding' => 'BASE64',
680
+ 'illegal_chars' => 0,
681
+ 'encoding_translation' => 'Off',
682
+ 'language' => self::$language,
683
+ 'detect_order' => self::$encodingList,
684
+ 'substitute_character' => 'none',
685
+ 'strict_detection' => 'Off',
686
+ );
687
+
688
+ if ('all' === $type) {
689
+ return $info;
690
+ }
691
+ if (isset($info[$type])) {
692
+ return $info[$type];
693
+ }
694
+
695
+ return false;
696
+ }
697
+
698
+ public static function mb_http_input($type = '')
699
+ {
700
+ return false;
701
+ }
702
+
703
+ public static function mb_http_output($encoding = null)
704
+ {
705
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
706
+ }
707
+
708
+ public static function mb_strwidth($s, $encoding = null)
709
+ {
710
+ $encoding = self::getEncoding($encoding);
711
+
712
+ if ('UTF-8' !== $encoding) {
713
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
714
+ }
715
+
716
+ $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);
717
+
718
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
719
+ }
720
+
721
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
722
+ {
723
+ return substr_count($haystack, $needle);
724
+ }
725
+
726
+ public static function mb_output_handler($contents, $status)
727
+ {
728
+ return $contents;
729
+ }
730
+
731
+ public static function mb_chr($code, $encoding = null)
732
+ {
733
+ if (0x80 > $code %= 0x200000) {
734
+ $s = \chr($code);
735
+ } elseif (0x800 > $code) {
736
+ $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
737
+ } elseif (0x10000 > $code) {
738
+ $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
739
+ } else {
740
+ $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
741
+ }
742
+
743
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
744
+ $s = mb_convert_encoding($s, $encoding, 'UTF-8');
745
+ }
746
+
747
+ return $s;
748
+ }
749
+
750
+ public static function mb_ord($s, $encoding = null)
751
+ {
752
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
753
+ $s = mb_convert_encoding($s, 'UTF-8', $encoding);
754
+ }
755
+
756
+ if (1 === \strlen($s)) {
757
+ return \ord($s);
758
+ }
759
+
760
+ $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
761
+ if (0xF0 <= $code) {
762
+ return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
763
+ }
764
+ if (0xE0 <= $code) {
765
+ return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
766
+ }
767
+ if (0xC0 <= $code) {
768
+ return (($code - 0xC0) << 6) + $s[2] - 0x80;
769
+ }
770
+
771
+ return $code;
772
+ }
773
+
774
+ private static function getSubpart($pos, $part, $haystack, $encoding)
775
+ {
776
+ if (false === $pos) {
777
+ return false;
778
+ }
779
+ if ($part) {
780
+ return self::mb_substr($haystack, 0, $pos, $encoding);
781
+ }
782
+
783
+ return self::mb_substr($haystack, $pos, null, $encoding);
784
+ }
785
+
786
+ private static function html_encoding_callback(array $m)
787
+ {
788
+ $i = 1;
789
+ $entities = '';
790
+ $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
791
+
792
+ while (isset($m[$i])) {
793
+ if (0x80 > $m[$i]) {
794
+ $entities .= \chr($m[$i++]);
795
+ continue;
796
+ }
797
+ if (0xF0 <= $m[$i]) {
798
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
799
+ } elseif (0xE0 <= $m[$i]) {
800
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
801
+ } else {
802
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
803
+ }
804
+
805
+ $entities .= '&#'.$c.';';
806
+ }
807
+
808
+ return $entities;
809
+ }
810
+
811
+ private static function title_case(array $s)
812
+ {
813
+ return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
814
+ }
815
+
816
+ private static function getData($file)
817
+ {
818
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
819
+ return require $file;
820
+ }
821
+
822
+ return false;
823
+ }
824
+
825
+ private static function getEncoding($encoding)
826
+ {
827
+ if (null === $encoding) {
828
+ return self::$internalEncoding;
829
+ }
830
+
831
+ if ('UTF-8' === $encoding) {
832
+ return 'UTF-8';
833
+ }
834
+
835
+ $encoding = strtoupper($encoding);
836
+
837
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
838
+ return 'CP850';
839
+ }
840
+
841
+ if ('UTF8' === $encoding) {
842
+ return 'UTF-8';
843
+ }
844
+
845
+ return $encoding;
846
+ }
847
+ }
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](https://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.php ADDED
@@ -0,0 +1,1397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'A' => 'a',
5
+ 'B' => 'b',
6
+ 'C' => 'c',
7
+ 'D' => 'd',
8
+ 'E' => 'e',
9
+ 'F' => 'f',
10
+ 'G' => 'g',
11
+ 'H' => 'h',
12
+ 'I' => 'i',
13
+ 'J' => 'j',
14
+ 'K' => 'k',
15
+ 'L' => 'l',
16
+ 'M' => 'm',
17
+ 'N' => 'n',
18
+ 'O' => 'o',
19
+ 'P' => 'p',
20
+ 'Q' => 'q',
21
+ 'R' => 'r',
22
+ 'S' => 's',
23
+ 'T' => 't',
24
+ 'U' => 'u',
25
+ 'V' => 'v',
26
+ 'W' => 'w',
27
+ 'X' => 'x',
28
+ 'Y' => 'y',
29
+ 'Z' => 'z',
30
+ 'À' => 'à',
31
+ 'Á' => 'á',
32
+ 'Â' => 'â',
33
+ 'Ã' => 'ã',
34
+ 'Ä' => 'ä',
35
+ 'Å' => 'å',
36
+ 'Æ' => 'æ',
37
+ 'Ç' => 'ç',
38
+ 'È' => 'è',
39
+ 'É' => 'é',
40
+ 'Ê' => 'ê',
41
+ 'Ë' => 'ë',
42
+ 'Ì' => 'ì',
43
+ 'Í' => 'í',
44
+ 'Î' => 'î',
45
+ 'Ï' => 'ï',
46
+ 'Ð' => 'ð',
47
+ 'Ñ' => 'ñ',
48
+ 'Ò' => 'ò',
49
+ 'Ó' => 'ó',
50
+ 'Ô' => 'ô',
51
+ 'Õ' => 'õ',
52
+ 'Ö' => 'ö',
53
+ 'Ø' => 'ø',
54
+ 'Ù' => 'ù',
55
+ 'Ú' => 'ú',
56
+ 'Û' => 'û',
57
+ 'Ü' => 'ü',
58
+ 'Ý' => 'ý',
59
+ 'Þ' => 'þ',
60
+ 'Ā' => 'ā',
61
+ 'Ă' => 'ă',
62
+ 'Ą' => 'ą',
63
+ 'Ć' => 'ć',
64
+ 'Ĉ' => 'ĉ',
65
+ 'Ċ' => 'ċ',
66
+ 'Č' => 'č',
67
+ 'Ď' => 'ď',
68
+ 'Đ' => 'đ',
69
+ 'Ē' => 'ē',
70
+ 'Ĕ' => 'ĕ',
71
+ 'Ė' => 'ė',
72
+ 'Ę' => 'ę',
73
+ 'Ě' => 'ě',
74
+ 'Ĝ' => 'ĝ',
75
+ 'Ğ' => 'ğ',
76
+ 'Ġ' => 'ġ',
77
+ 'Ģ' => 'ģ',
78
+ 'Ĥ' => 'ĥ',
79
+ 'Ħ' => 'ħ',
80
+ 'Ĩ' => 'ĩ',
81
+ 'Ī' => 'ī',
82
+ 'Ĭ' => 'ĭ',
83
+ 'Į' => 'į',
84
+ 'İ' => 'i',
85
+ 'IJ' => 'ij',
86
+ 'Ĵ' => 'ĵ',
87
+ 'Ķ' => 'ķ',
88
+ 'Ĺ' => 'ĺ',
89
+ 'Ļ' => 'ļ',
90
+ 'Ľ' => 'ľ',
91
+ 'Ŀ' => 'ŀ',
92
+ 'Ł' => 'ł',
93
+ 'Ń' => 'ń',
94
+ 'Ņ' => 'ņ',
95
+ 'Ň' => 'ň',
96
+ 'Ŋ' => 'ŋ',
97
+ 'Ō' => 'ō',
98
+ 'Ŏ' => 'ŏ',
99
+ 'Ő' => 'ő',
100
+ 'Œ' => 'œ',
101
+ 'Ŕ' => 'ŕ',
102
+ 'Ŗ' => 'ŗ',
103
+ 'Ř' => 'ř',
104
+ 'Ś' => 'ś',
105
+ 'Ŝ' => 'ŝ',
106
+ 'Ş' => 'ş',
107
+ 'Š' => 'š',
108
+ 'Ţ' => 'ţ',
109
+ 'Ť' => 'ť',
110
+ 'Ŧ' => 'ŧ',
111
+ 'Ũ' => 'ũ',
112
+ 'Ū' => 'ū',
113
+ 'Ŭ' => 'ŭ',
114
+ 'Ů' => 'ů',
115
+ 'Ű' => 'ű',
116
+ 'Ų' => 'ų',
117
+ 'Ŵ' => 'ŵ',
118
+ 'Ŷ' => 'ŷ',
119
+ 'Ÿ' => 'ÿ',
120
+ 'Ź' => 'ź',
121
+ 'Ż' => 'ż',
122
+ 'Ž' => 'ž',
123
+ 'Ɓ' => 'ɓ',
124
+ 'Ƃ' => 'ƃ',
125
+ 'Ƅ' => 'ƅ',
126
+ 'Ɔ' => 'ɔ',
127
+ 'Ƈ' => 'ƈ',
128
+ 'Ɖ' => 'ɖ',
129
+ 'Ɗ' => 'ɗ',
130
+ 'Ƌ' => 'ƌ',
131
+ 'Ǝ' => 'ǝ',
132
+ 'Ə' => 'ə',
133
+ 'Ɛ' => 'ɛ',
134
+ 'Ƒ' => 'ƒ',
135
+ 'Ɠ' => 'ɠ',
136
+ 'Ɣ' => 'ɣ',
137
+ 'Ɩ' => 'ɩ',
138
+ 'Ɨ' => 'ɨ',
139
+ 'Ƙ' => 'ƙ',
140
+ 'Ɯ' => 'ɯ',
141
+ 'Ɲ' => 'ɲ',
142
+ 'Ɵ' => 'ɵ',
143
+ 'Ơ' => 'ơ',
144
+ 'Ƣ' => 'ƣ',
145
+ 'Ƥ' => 'ƥ',
146
+ 'Ʀ' => 'ʀ',
147
+ 'Ƨ' => 'ƨ',
148
+ 'Ʃ' => 'ʃ',
149
+ 'Ƭ' => 'ƭ',
150
+ 'Ʈ' => 'ʈ',
151
+ 'Ư' => 'ư',
152
+ 'Ʊ' => 'ʊ',
153
+ 'Ʋ' => 'ʋ',
154
+ 'Ƴ' => 'ƴ',
155
+ 'Ƶ' => 'ƶ',
156
+ 'Ʒ' => 'ʒ',
157
+ 'Ƹ' => 'ƹ',
158
+ 'Ƽ' => 'ƽ',
159
+ 'DŽ' => 'dž',
160
+ 'Dž' => 'dž',
161
+ 'LJ' => 'lj',
162
+ 'Lj' => 'lj',
163
+ 'NJ' => 'nj',
164
+ 'Nj' => 'nj',
165
+ 'Ǎ' => 'ǎ',
166
+ 'Ǐ' => 'ǐ',
167
+ 'Ǒ' => 'ǒ',
168
+ 'Ǔ' => 'ǔ',
169
+ 'Ǖ' => 'ǖ',
170
+ 'Ǘ' => 'ǘ',
171
+ 'Ǚ' => 'ǚ',
172
+ 'Ǜ' => 'ǜ',
173
+ 'Ǟ' => 'ǟ',
174
+ 'Ǡ' => 'ǡ',
175
+ 'Ǣ' => 'ǣ',
176
+ 'Ǥ' => 'ǥ',
177
+ 'Ǧ' => 'ǧ',
178
+ 'Ǩ' => 'ǩ',
179
+ 'Ǫ' => 'ǫ',
180
+ 'Ǭ' => 'ǭ',
181
+ 'Ǯ' => 'ǯ',
182
+ 'DZ' => 'dz',
183
+ 'Dz' => 'dz',
184
+ 'Ǵ' => 'ǵ',
185
+ 'Ƕ' => 'ƕ',
186
+ 'Ƿ' => 'ƿ',
187
+ 'Ǹ' => 'ǹ',
188
+ 'Ǻ' => 'ǻ',
189
+ 'Ǽ' => 'ǽ',
190
+ 'Ǿ' => 'ǿ',
191
+ 'Ȁ' => 'ȁ',
192
+ 'Ȃ' => 'ȃ',
193
+ 'Ȅ' => 'ȅ',
194
+ 'Ȇ' => 'ȇ',
195
+ 'Ȉ' => 'ȉ',
196
+ 'Ȋ' => 'ȋ',
197
+ 'Ȍ' => 'ȍ',
198
+ 'Ȏ' => 'ȏ',
199
+ 'Ȑ' => 'ȑ',
200
+ 'Ȓ' => 'ȓ',
201
+ 'Ȕ' => 'ȕ',
202
+ 'Ȗ' => 'ȗ',
203
+ 'Ș' => 'ș',
204
+ 'Ț' => 'ț',
205
+ 'Ȝ' => 'ȝ',
206
+ 'Ȟ' => 'ȟ',
207
+ 'Ƞ' => 'ƞ',
208
+ 'Ȣ' => 'ȣ',
209
+ 'Ȥ' => 'ȥ',
210
+ 'Ȧ' => 'ȧ',
211
+ 'Ȩ' => 'ȩ',
212
+ 'Ȫ' => 'ȫ',
213
+ 'Ȭ' => 'ȭ',
214
+ 'Ȯ' => 'ȯ',
215
+ 'Ȱ' => 'ȱ',
216
+ 'Ȳ' => 'ȳ',
217
+ 'Ⱥ' => 'ⱥ',
218
+ 'Ȼ' => 'ȼ',
219
+ 'Ƚ' => 'ƚ',
220
+ 'Ⱦ' => 'ⱦ',
221
+ 'Ɂ' => 'ɂ',
222
+ 'Ƀ' => 'ƀ',
223
+ 'Ʉ' => 'ʉ',
224
+ 'Ʌ' => 'ʌ',
225
+ 'Ɇ' => 'ɇ',
226
+ 'Ɉ' => 'ɉ',
227
+ 'Ɋ' => 'ɋ',
228
+ 'Ɍ' => 'ɍ',
229
+ 'Ɏ' => 'ɏ',
230
+ 'Ͱ' => 'ͱ',
231
+ 'Ͳ' => 'ͳ',
232
+ 'Ͷ' => 'ͷ',
233
+ 'Ϳ' => 'ϳ',
234
+ 'Ά' => 'ά',
235
+ 'Έ' => 'έ',
236
+ 'Ή' => 'ή',
237
+ 'Ί' => 'ί',
238
+ 'Ό' => 'ό',
239
+ 'Ύ' => 'ύ',
240
+ 'Ώ' => 'ώ',
241
+ 'Α' => 'α',
242
+ 'Β' => 'β',
243
+ 'Γ' => 'γ',
244
+ 'Δ' => 'δ',
245
+ 'Ε' => 'ε',
246
+ 'Ζ' => 'ζ',
247
+ 'Η' => 'η',
248
+ 'Θ' => 'θ',
249
+ 'Ι' => 'ι',
250
+ 'Κ' => 'κ',
251
+ 'Λ' => 'λ',
252
+ 'Μ' => 'μ',
253
+ 'Ν' => 'ν',
254
+ 'Ξ' => 'ξ',
255
+ 'Ο' => 'ο',
256
+ 'Π' => 'π',
257
+ 'Ρ' => 'ρ',
258
+ 'Σ' => 'σ',
259
+ 'Τ' => 'τ',
260
+ 'Υ' => 'υ',
261
+ 'Φ' => 'φ',
262
+ 'Χ' => 'χ',
263
+ 'Ψ' => 'ψ',
264
+ 'Ω' => 'ω',
265
+ 'Ϊ' => 'ϊ',
266
+ 'Ϋ' => 'ϋ',
267
+ 'Ϗ' => 'ϗ',
268
+ 'Ϙ' => 'ϙ',
269
+ 'Ϛ' => 'ϛ',
270
+ 'Ϝ' => 'ϝ',
271
+ 'Ϟ' => 'ϟ',
272
+ 'Ϡ' => 'ϡ',
273
+ 'Ϣ' => 'ϣ',
274
+ 'Ϥ' => 'ϥ',
275
+ 'Ϧ' => 'ϧ',
276
+ 'Ϩ' => 'ϩ',
277
+ 'Ϫ' => 'ϫ',
278
+ 'Ϭ' => 'ϭ',
279
+ 'Ϯ' => 'ϯ',
280
+ 'ϴ' => 'θ',
281
+ 'Ϸ' => 'ϸ',
282
+ 'Ϲ' => 'ϲ',
283
+ 'Ϻ' => 'ϻ',
284
+ 'Ͻ' => 'ͻ',
285
+ 'Ͼ' => 'ͼ',
286
+ 'Ͽ' => 'ͽ',
287
+ 'Ѐ' => 'ѐ',
288
+ 'Ё' => 'ё',
289
+ 'Ђ' => 'ђ',
290
+ 'Ѓ' => 'ѓ',
291
+ 'Є' => 'є',
292
+ 'Ѕ' => 'ѕ',
293
+ 'І' => 'і',
294
+ 'Ї' => 'ї',
295
+ 'Ј' => 'ј',
296
+ 'Љ' => 'љ',
297
+ 'Њ' => 'њ',
298
+ 'Ћ' => 'ћ',
299
+ 'Ќ' => 'ќ',
300
+ 'Ѝ' => 'ѝ',
301
+ 'Ў' => 'ў',
302
+ 'Џ' => 'џ',
303
+ 'А' => 'а',
304
+ 'Б' => 'б',
305
+ 'В' => 'в',
306
+ 'Г' => 'г',
307
+ 'Д' => 'д',
308
+ 'Е' => 'е',
309
+ 'Ж' => 'ж',
310
+ 'З' => 'з',
311
+ 'И' => 'и',
312
+ 'Й' => 'й',
313
+ 'К' => 'к',
314
+ 'Л' => 'л',
315
+ 'М' => 'м',
316
+ 'Н' => 'н',
317
+ 'О' => 'о',
318
+ 'П' => 'п',
319
+ 'Р' => 'р',
320
+ 'С' => 'с',
321
+ 'Т' => 'т',
322
+ 'У' => 'у',
323
+ 'Ф' => 'ф',
324
+ 'Х' => 'х',
325
+ 'Ц' => 'ц',
326
+ 'Ч' => 'ч',
327
+ 'Ш' => 'ш',
328
+ 'Щ' => 'щ',
329
+ 'Ъ' => 'ъ',
330
+ 'Ы' => 'ы',
331
+ 'Ь' => 'ь',
332
+ 'Э' => 'э',
333
+ 'Ю' => 'ю',
334
+ 'Я' => 'я',
335
+ 'Ѡ' => 'ѡ',
336
+ 'Ѣ' => 'ѣ',
337
+ 'Ѥ' => 'ѥ',
338
+ 'Ѧ' => 'ѧ',
339
+ 'Ѩ' => 'ѩ',
340
+ 'Ѫ' => 'ѫ',
341
+ 'Ѭ' => 'ѭ',
342
+ 'Ѯ' => 'ѯ',
343
+ 'Ѱ' => 'ѱ',
344
+ 'Ѳ' => 'ѳ',
345
+ 'Ѵ' => 'ѵ',
346
+ 'Ѷ' => 'ѷ',
347
+ 'Ѹ' => 'ѹ',
348
+ 'Ѻ' => 'ѻ',
349
+ 'Ѽ' => 'ѽ',
350
+ 'Ѿ' => 'ѿ',
351
+ 'Ҁ' => 'ҁ',
352
+ 'Ҋ' => 'ҋ',
353
+ 'Ҍ' => 'ҍ',
354
+ 'Ҏ' => 'ҏ',
355
+ 'Ґ' => 'ґ',
356
+ 'Ғ' => 'ғ',
357
+ 'Ҕ' => 'ҕ',
358
+ 'Җ' => 'җ',
359
+ 'Ҙ' => 'ҙ',
360
+ 'Қ' => 'қ',
361
+ 'Ҝ' => 'ҝ',
362
+ 'Ҟ' => 'ҟ',
363
+ 'Ҡ' => 'ҡ',
364
+ 'Ң' => 'ң',
365
+ 'Ҥ' => 'ҥ',
366
+ 'Ҧ' => 'ҧ',
367
+ 'Ҩ' => 'ҩ',
368
+ 'Ҫ' => 'ҫ',
369
+ 'Ҭ' => 'ҭ',
370
+ 'Ү' => 'ү',
371
+ 'Ұ' => 'ұ',
372
+ 'Ҳ' => 'ҳ',
373
+ 'Ҵ' => 'ҵ',
374
+ 'Ҷ' => 'ҷ',
375
+ 'Ҹ' => 'ҹ',
376
+ 'Һ' => 'һ',
377
+ 'Ҽ' => 'ҽ',
378
+ 'Ҿ' => 'ҿ',
379
+ 'Ӏ' => 'ӏ',
380
+ 'Ӂ' => 'ӂ',
381
+ 'Ӄ' => 'ӄ',
382
+ 'Ӆ' => 'ӆ',
383
+ 'Ӈ' => 'ӈ',
384
+ 'Ӊ' => 'ӊ',
385
+ 'Ӌ' => 'ӌ',
386
+ 'Ӎ' => 'ӎ',
387
+ 'Ӑ' => 'ӑ',
388
+ 'Ӓ' => 'ӓ',
389
+ 'Ӕ' => 'ӕ',
390
+ 'Ӗ' => 'ӗ',
391
+ 'Ә' => 'ә',
392
+ 'Ӛ' => 'ӛ',
393
+ 'Ӝ' => 'ӝ',
394
+ 'Ӟ' => 'ӟ',
395
+ 'Ӡ' => 'ӡ',
396
+ 'Ӣ' => 'ӣ',
397
+ 'Ӥ' => 'ӥ',
398
+ 'Ӧ' => 'ӧ',
399
+ 'Ө' => 'ө',
400
+ 'Ӫ' => 'ӫ',
401
+ 'Ӭ' => 'ӭ',
402
+ 'Ӯ' => 'ӯ',
403
+ 'Ӱ' => 'ӱ',
404
+ 'Ӳ' => 'ӳ',
405
+ 'Ӵ' => 'ӵ',
406
+ 'Ӷ' => 'ӷ',
407
+ 'Ӹ' => 'ӹ',
408
+ 'Ӻ' => 'ӻ',
409
+ 'Ӽ' => 'ӽ',
410
+ 'Ӿ' => 'ӿ',
411
+ 'Ԁ' => 'ԁ',
412
+ 'Ԃ' => 'ԃ',
413
+ 'Ԅ' => 'ԅ',
414
+ 'Ԇ' => 'ԇ',
415
+ 'Ԉ' => 'ԉ',
416
+ 'Ԋ' => 'ԋ',
417
+ 'Ԍ' => 'ԍ',
418
+ 'Ԏ' => 'ԏ',
419
+ 'Ԑ' => 'ԑ',
420
+ 'Ԓ' => 'ԓ',
421
+ 'Ԕ' => 'ԕ',
422
+ 'Ԗ' => 'ԗ',
423
+ 'Ԙ' => 'ԙ',
424
+ 'Ԛ' => 'ԛ',
425
+ 'Ԝ' => 'ԝ',
426
+ 'Ԟ' => 'ԟ',
427
+ 'Ԡ' => 'ԡ',
428
+ 'Ԣ' => 'ԣ',
429
+ 'Ԥ' => 'ԥ',
430
+ 'Ԧ' => 'ԧ',
431
+ 'Ԩ' => 'ԩ',
432
+ 'Ԫ' => 'ԫ',
433
+ 'Ԭ' => 'ԭ',
434
+ 'Ԯ' => 'ԯ',
435
+ 'Ա' => 'ա',
436
+ 'Բ' => 'բ',
437
+ 'Գ' => 'գ',
438
+ 'Դ' => 'դ',
439
+ 'Ե' => 'ե',
440
+ 'Զ' => 'զ',
441
+ 'Է' => 'է',
442
+ 'Ը' => 'ը',
443
+ 'Թ' => 'թ',
444
+ 'Ժ' => 'ժ',
445
+ 'Ի' => 'ի',
446
+ 'Լ' => 'լ',
447
+ 'Խ' => 'խ',
448
+ 'Ծ' => 'ծ',
449
+ 'Կ' => 'կ',
450
+ 'Հ' => 'հ',
451
+ 'Ձ' => 'ձ',
452
+ 'Ղ' => 'ղ',
453
+ 'Ճ' => 'ճ',
454
+ 'Մ' => 'մ',
455
+ 'Յ' => 'յ',
456
+ 'Ն' => 'ն',
457
+ 'Շ' => 'շ',
458
+ 'Ո' => 'ո',
459
+ 'Չ' => 'չ',
460
+ 'Պ' => 'պ',
461
+ 'Ջ' => 'ջ',
462
+ 'Ռ' => 'ռ',
463
+ 'Ս' => 'ս',
464
+ 'Վ' => 'վ',
465
+ 'Տ' => 'տ',
466
+ 'Ր' => 'ր',
467
+ 'Ց' => 'ց',
468
+ 'Ւ' => 'ւ',
469
+ 'Փ' => 'փ',
470
+ 'Ք' => 'ք',
471
+ 'Օ' => 'օ',
472
+ 'Ֆ' => 'ֆ',
473
+ 'Ⴀ' => 'ⴀ',
474
+ 'Ⴁ' => 'ⴁ',
475
+ 'Ⴂ' => 'ⴂ',
476
+ 'Ⴃ' => 'ⴃ',
477
+ 'Ⴄ' => 'ⴄ',
478
+ 'Ⴅ' => 'ⴅ',
479
+ 'Ⴆ' => 'ⴆ',
480
+ 'Ⴇ' => 'ⴇ',
481
+ 'Ⴈ' => 'ⴈ',
482
+ 'Ⴉ' => 'ⴉ',
483
+ 'Ⴊ' => 'ⴊ',
484
+ 'Ⴋ' => 'ⴋ',
485
+ 'Ⴌ' => 'ⴌ',
486
+ 'Ⴍ' => 'ⴍ',
487
+ 'Ⴎ' => 'ⴎ',
488
+ 'Ⴏ' => 'ⴏ',
489
+ 'Ⴐ' => 'ⴐ',
490
+ 'Ⴑ' => 'ⴑ',
491
+ 'Ⴒ' => 'ⴒ',
492
+ 'Ⴓ' => 'ⴓ',
493
+ 'Ⴔ' => 'ⴔ',
494
+ 'Ⴕ' => 'ⴕ',
495
+ 'Ⴖ' => 'ⴖ',
496
+ 'Ⴗ' => 'ⴗ',
497
+ 'Ⴘ' => 'ⴘ',
498
+ 'Ⴙ' => 'ⴙ',
499
+ 'Ⴚ' => 'ⴚ',
500
+ 'Ⴛ' => 'ⴛ',
501
+ 'Ⴜ' => 'ⴜ',
502
+ 'Ⴝ' => 'ⴝ',
503
+ 'Ⴞ' => 'ⴞ',
504
+ 'Ⴟ' => 'ⴟ',
505
+ 'Ⴠ' => 'ⴠ',
506
+ 'Ⴡ' => 'ⴡ',
507
+ 'Ⴢ' => 'ⴢ',
508
+ 'Ⴣ' => 'ⴣ',
509
+ 'Ⴤ' => 'ⴤ',
510
+ 'Ⴥ' => 'ⴥ',
511
+ 'Ⴧ' => 'ⴧ',
512
+ 'Ⴭ' => 'ⴭ',
513
+ 'Ꭰ' => 'ꭰ',
514
+ 'Ꭱ' => 'ꭱ',
515
+ 'Ꭲ' => 'ꭲ',
516
+ 'Ꭳ' => 'ꭳ',
517
+ 'Ꭴ' => 'ꭴ',
518
+ 'Ꭵ' => 'ꭵ',
519
+ 'Ꭶ' => 'ꭶ',
520
+ 'Ꭷ' => 'ꭷ',
521
+ 'Ꭸ' => 'ꭸ',
522
+ 'Ꭹ' => 'ꭹ',
523
+ 'Ꭺ' => 'ꭺ',
524
+ 'Ꭻ' => 'ꭻ',
525
+ 'Ꭼ' => 'ꭼ',
526
+ 'Ꭽ' => 'ꭽ',
527
+ 'Ꭾ' => 'ꭾ',
528
+ 'Ꭿ' => 'ꭿ',
529
+ 'Ꮀ' => 'ꮀ',
530
+ 'Ꮁ' => 'ꮁ',
531
+ 'Ꮂ' => 'ꮂ',
532
+ 'Ꮃ' => 'ꮃ',
533
+ 'Ꮄ' => 'ꮄ',
534
+ 'Ꮅ' => 'ꮅ',
535
+ 'Ꮆ' => 'ꮆ',
536
+ 'Ꮇ' => 'ꮇ',
537
+ 'Ꮈ' => 'ꮈ',
538
+ 'Ꮉ' => 'ꮉ',
539
+ 'Ꮊ' => 'ꮊ',
540
+ 'Ꮋ' => 'ꮋ',
541
+ 'Ꮌ' => 'ꮌ',
542
+ 'Ꮍ' => 'ꮍ',
543
+ 'Ꮎ' => 'ꮎ',
544
+ 'Ꮏ' => 'ꮏ',
545
+ 'Ꮐ' => 'ꮐ',
546
+ 'Ꮑ' => 'ꮑ',
547
+ 'Ꮒ' => 'ꮒ',
548
+ 'Ꮓ' => 'ꮓ',
549
+ 'Ꮔ' => 'ꮔ',
550
+ 'Ꮕ' => 'ꮕ',
551
+ 'Ꮖ' => 'ꮖ',
552
+ 'Ꮗ' => 'ꮗ',
553
+ 'Ꮘ' => 'ꮘ',
554
+ 'Ꮙ' => 'ꮙ',
555
+ 'Ꮚ' => 'ꮚ',
556
+ 'Ꮛ' => 'ꮛ',
557
+ 'Ꮜ' => 'ꮜ',
558
+ 'Ꮝ' => 'ꮝ',
559
+ 'Ꮞ' => 'ꮞ',
560
+ 'Ꮟ' => 'ꮟ',
561
+ 'Ꮠ' => 'ꮠ',
562
+ 'Ꮡ' => 'ꮡ',
563
+ 'Ꮢ' => 'ꮢ',
564
+ 'Ꮣ' => 'ꮣ',
565
+ 'Ꮤ' => 'ꮤ',
566
+ 'Ꮥ' => 'ꮥ',
567
+ 'Ꮦ' => 'ꮦ',
568
+ 'Ꮧ' => 'ꮧ',
569
+ 'Ꮨ' => 'ꮨ',
570
+ 'Ꮩ' => 'ꮩ',
571
+ 'Ꮪ' => 'ꮪ',
572
+ 'Ꮫ' => 'ꮫ',
573
+ 'Ꮬ' => 'ꮬ',
574
+ 'Ꮭ' => 'ꮭ',
575
+ 'Ꮮ' => 'ꮮ',
576
+ 'Ꮯ' => 'ꮯ',
577
+ 'Ꮰ' => 'ꮰ',
578
+ 'Ꮱ' => 'ꮱ',
579
+ 'Ꮲ' => 'ꮲ',
580
+ 'Ꮳ' => 'ꮳ',
581
+ 'Ꮴ' => 'ꮴ',
582
+ 'Ꮵ' => 'ꮵ',
583
+ 'Ꮶ' => 'ꮶ',
584
+ 'Ꮷ' => 'ꮷ',
585
+ 'Ꮸ' => 'ꮸ',
586
+ 'Ꮹ' => 'ꮹ',
587
+ 'Ꮺ' => 'ꮺ',
588
+ 'Ꮻ' => 'ꮻ',
589
+ 'Ꮼ' => 'ꮼ',
590
+ 'Ꮽ' => 'ꮽ',
591
+ 'Ꮾ' => 'ꮾ',
592
+ 'Ꮿ' => 'ꮿ',
593
+ 'Ᏸ' => 'ᏸ',
594
+ 'Ᏹ' => 'ᏹ',
595
+ 'Ᏺ' => 'ᏺ',
596
+ 'Ᏻ' => 'ᏻ',
597
+ 'Ᏼ' => 'ᏼ',
598
+ 'Ᏽ' => 'ᏽ',
599
+ 'Ა' => 'ა',
600
+ 'Ბ' => 'ბ',
601
+ 'Გ' => 'გ',
602
+ 'Დ' => 'დ',
603
+ 'Ე' => 'ე',
604
+ 'Ვ' => 'ვ',
605
+ 'Ზ' => 'ზ',
606
+ 'Თ' => 'თ',
607
+ 'Ი' => 'ი',
608
+ 'Კ' => 'კ',
609
+ 'Ლ' => 'ლ',
610
+ 'Მ' => 'მ',
611
+ 'Ნ' => 'ნ',
612
+ 'Ო' => 'ო',
613
+ 'Პ' => 'პ',
614
+ 'Ჟ' => 'ჟ',
615
+ 'Რ' => 'რ',
616
+ 'Ს' => 'ს',
617
+ 'Ტ' => 'ტ',
618
+ 'Უ' => 'უ',
619
+ 'Ფ' => 'ფ',
620
+ 'Ქ' => 'ქ',
621
+ 'Ღ' => 'ღ',
622
+ 'Ყ' => 'ყ',
623
+ 'Შ' => 'შ',
624
+ 'Ჩ' => 'ჩ',
625
+ 'Ც' => 'ც',
626
+ 'Ძ' => 'ძ',
627
+ 'Წ' => 'წ',
628
+ 'Ჭ' => 'ჭ',
629
+ 'Ხ' => 'ხ',
630
+ 'Ჯ' => 'ჯ',
631
+ 'Ჰ' => 'ჰ',
632
+ 'Ჱ' => 'ჱ',
633
+ 'Ჲ' => 'ჲ',
634
+ 'Ჳ' => 'ჳ',
635
+ 'Ჴ' => 'ჴ',
636
+ 'Ჵ' => 'ჵ',
637
+ 'Ჶ' => 'ჶ',
638
+ 'Ჷ' => 'ჷ',
639
+ 'Ჸ' => 'ჸ',
640
+ 'Ჹ' => 'ჹ',
641
+ 'Ჺ' => 'ჺ',
642
+ 'Ჽ' => 'ჽ',
643
+ 'Ჾ' => 'ჾ',
644
+ 'Ჿ' => 'ჿ',
645
+ 'Ḁ' => 'ḁ',
646
+ 'Ḃ' => 'ḃ',
647
+ 'Ḅ' => 'ḅ',
648
+ 'Ḇ' => 'ḇ',
649
+ 'Ḉ' => 'ḉ',
650
+ 'Ḋ' => 'ḋ',
651
+ 'Ḍ' => 'ḍ',
652
+ 'Ḏ' => 'ḏ',
653
+ 'Ḑ' => 'ḑ',
654
+ 'Ḓ' => 'ḓ',
655
+ 'Ḕ' => 'ḕ',
656
+ 'Ḗ' => 'ḗ',
657
+ 'Ḙ' => 'ḙ',
658
+ 'Ḛ' => 'ḛ',
659
+ 'Ḝ' => 'ḝ',
660
+ 'Ḟ' => 'ḟ',
661
+ 'Ḡ' => 'ḡ',
662
+ 'Ḣ' => 'ḣ',
663
+ 'Ḥ' => 'ḥ',
664
+ 'Ḧ' => 'ḧ',
665
+ 'Ḩ' => 'ḩ',
666
+ 'Ḫ' => 'ḫ',
667
+ 'Ḭ' => 'ḭ',
668
+ 'Ḯ' => 'ḯ',
669
+ 'Ḱ' => 'ḱ',
670
+ 'Ḳ' => 'ḳ',
671
+ 'Ḵ' => 'ḵ',
672
+ 'Ḷ' => 'ḷ',
673
+ 'Ḹ' => 'ḹ',
674
+ 'Ḻ' => 'ḻ',
675
+ 'Ḽ' => 'ḽ',
676
+ 'Ḿ' => 'ḿ',
677
+ 'Ṁ' => 'ṁ',
678
+ 'Ṃ' => 'ṃ',
679
+ 'Ṅ' => 'ṅ',
680
+ 'Ṇ' => 'ṇ',
681
+ 'Ṉ' => 'ṉ',
682
+ 'Ṋ' => 'ṋ',
683
+ 'Ṍ' => 'ṍ',
684
+ 'Ṏ' => 'ṏ',
685
+ 'Ṑ' => 'ṑ',
686
+ 'Ṓ' => 'ṓ',
687
+ 'Ṕ' => 'ṕ',
688
+ 'Ṗ' => 'ṗ',
689
+ 'Ṙ' => 'ṙ',
690
+ 'Ṛ' => 'ṛ',
691
+ 'Ṝ' => 'ṝ',
692
+ 'Ṟ' => 'ṟ',
693
+ 'Ṡ' => 'ṡ',
694
+ 'Ṣ' => 'ṣ',
695
+ 'Ṥ' => 'ṥ',
696
+ 'Ṧ' => 'ṧ',
697
+ 'Ṩ' => 'ṩ',
698
+ 'Ṫ' => 'ṫ',
699
+ 'Ṭ' => 'ṭ',
700
+ 'Ṯ' => 'ṯ',
701
+ 'Ṱ' => 'ṱ',
702
+ 'Ṳ' => 'ṳ',
703
+ 'Ṵ' => 'ṵ',
704
+ 'Ṷ' => 'ṷ',
705
+ 'Ṹ' => 'ṹ',
706
+ 'Ṻ' => 'ṻ',
707
+ 'Ṽ' => 'ṽ',
708
+ 'Ṿ' => 'ṿ',
709
+ 'Ẁ' => 'ẁ',
710
+ 'Ẃ' => 'ẃ',
711
+ 'Ẅ' => 'ẅ',
712
+ 'Ẇ' => 'ẇ',
713
+ 'Ẉ' => 'ẉ',
714
+ 'Ẋ' => 'ẋ',
715
+ 'Ẍ' => 'ẍ',
716
+ 'Ẏ' => 'ẏ',
717
+ 'Ẑ' => 'ẑ',
718
+ 'Ẓ' => 'ẓ',
719
+ 'Ẕ' => 'ẕ',
720
+ 'ẞ' => 'ß',
721
+ 'Ạ' => 'ạ',
722
+ 'Ả' => 'ả',
723
+ 'Ấ' => 'ấ',
724
+ 'Ầ' => 'ầ',
725
+ 'Ẩ' => 'ẩ',
726
+ 'Ẫ' => 'ẫ',
727
+ 'Ậ' => 'ậ',
728
+ 'Ắ' => 'ắ',
729
+ 'Ằ' => 'ằ',
730
+ 'Ẳ' => 'ẳ',
731
+ 'Ẵ' => 'ẵ',
732
+ 'Ặ' => 'ặ',
733
+ 'Ẹ' => 'ẹ',
734
+ 'Ẻ' => 'ẻ',
735
+ 'Ẽ' => 'ẽ',
736
+ 'Ế' => 'ế',
737
+ 'Ề' => 'ề',
738
+ 'Ể' => 'ể',
739
+ 'Ễ' => 'ễ',
740
+ 'Ệ' => 'ệ',
741
+ 'Ỉ' => 'ỉ',
742
+ 'Ị' => 'ị',
743
+ 'Ọ' => 'ọ',
744
+ 'Ỏ' => 'ỏ',
745
+ 'Ố' => 'ố',
746
+ 'Ồ' => 'ồ',
747
+ 'Ổ' => 'ổ',
748
+ 'Ỗ' => 'ỗ',
749
+ 'Ộ' => 'ộ',
750
+ 'Ớ' => 'ớ',
751
+ 'Ờ' => 'ờ',
752
+ 'Ở' => 'ở',
753
+ 'Ỡ' => 'ỡ',
754
+ 'Ợ' => 'ợ',
755
+ 'Ụ' => 'ụ',
756
+ 'Ủ' => 'ủ',
757
+ 'Ứ' => 'ứ',
758
+ 'Ừ' => 'ừ',
759
+ 'Ử' => 'ử',
760
+ 'Ữ' => 'ữ',
761
+ 'Ự' => 'ự',
762
+ 'Ỳ' => 'ỳ',
763
+ 'Ỵ' => 'ỵ',
764
+ 'Ỷ' => 'ỷ',
765
+ 'Ỹ' => 'ỹ',
766
+ 'Ỻ' => 'ỻ',
767
+ 'Ỽ' => 'ỽ',
768
+ 'Ỿ' => 'ỿ',
769
+ 'Ἀ' => 'ἀ',
770
+ 'Ἁ' => 'ἁ',
771
+ 'Ἂ' => 'ἂ',
772
+ 'Ἃ' => 'ἃ',
773
+ 'Ἄ' => 'ἄ',
774
+ 'Ἅ' => 'ἅ',
775
+ 'Ἆ' => 'ἆ',
776
+ 'Ἇ' => 'ἇ',
777
+ 'Ἐ' => 'ἐ',
778
+ 'Ἑ' => 'ἑ',
779
+ 'Ἒ' => 'ἒ',
780
+ 'Ἓ' => 'ἓ',
781
+ 'Ἔ' => 'ἔ',
782
+ 'Ἕ' => 'ἕ',
783
+ 'Ἠ' => 'ἠ',
784
+ 'Ἡ' => 'ἡ',
785
+ 'Ἢ' => 'ἢ',
786
+ 'Ἣ' => 'ἣ',
787
+ 'Ἤ' => 'ἤ',
788
+ 'Ἥ' => 'ἥ',
789
+ 'Ἦ' => 'ἦ',
790
+ 'Ἧ' => 'ἧ',
791
+ 'Ἰ' => 'ἰ',
792
+ 'Ἱ' => 'ἱ',
793
+ 'Ἲ' => 'ἲ',
794
+ 'Ἳ' => 'ἳ',
795
+ 'Ἴ' => 'ἴ',
796
+ 'Ἵ' => 'ἵ',
797
+ 'Ἶ' => 'ἶ',
798
+ 'Ἷ' => 'ἷ',
799
+ 'Ὀ' => 'ὀ',
800
+ 'Ὁ' => 'ὁ',
801
+ 'Ὂ' => 'ὂ',
802
+ 'Ὃ' => 'ὃ',
803
+ 'Ὄ' => 'ὄ',
804
+ 'Ὅ' => 'ὅ',
805
+ 'Ὑ' => 'ὑ',
806
+ 'Ὓ' => 'ὓ',
807
+ 'Ὕ' => 'ὕ',
808
+ 'Ὗ' => 'ὗ',
809
+ 'Ὠ' => 'ὠ',
810
+ 'Ὡ' => 'ὡ',
811
+ 'Ὢ' => 'ὢ',
812
+ 'Ὣ' => 'ὣ',
813
+ 'Ὤ' => 'ὤ',
814
+ 'Ὥ' => 'ὥ',
815
+ 'Ὦ' => 'ὦ',
816
+ 'Ὧ' => 'ὧ',
817
+ 'ᾈ' => 'ᾀ',
818
+ 'ᾉ' => 'ᾁ',
819
+ 'ᾊ' => 'ᾂ',
820
+ 'ᾋ' => 'ᾃ',
821
+ 'ᾌ' => 'ᾄ',
822
+ 'ᾍ' => 'ᾅ',
823
+ 'ᾎ' => 'ᾆ',
824
+ 'ᾏ' => 'ᾇ',
825
+ 'ᾘ' => 'ᾐ',
826
+ 'ᾙ' => 'ᾑ',
827
+ 'ᾚ' => 'ᾒ',
828
+ 'ᾛ' => 'ᾓ',
829
+ 'ᾜ' => 'ᾔ',
830
+ 'ᾝ' => 'ᾕ',
831
+ 'ᾞ' => 'ᾖ',
832
+ 'ᾟ' => 'ᾗ',
833
+ 'ᾨ' => 'ᾠ',
834
+ 'ᾩ' => 'ᾡ',
835
+ 'ᾪ' => 'ᾢ',
836
+ 'ᾫ' => 'ᾣ',
837
+ 'ᾬ' => 'ᾤ',
838
+ 'ᾭ' => 'ᾥ',
839
+ 'ᾮ' => 'ᾦ',
840
+ 'ᾯ' => 'ᾧ',
841
+ 'Ᾰ' => 'ᾰ',
842
+ 'Ᾱ' => 'ᾱ',
843
+ 'Ὰ' => 'ὰ',
844
+ 'Ά' => 'ά',
845
+ 'ᾼ' => 'ᾳ',
846
+ 'Ὲ' => 'ὲ',
847
+ 'Έ' => 'έ',
848
+ 'Ὴ' => 'ὴ',
849
+ 'Ή' => 'ή',
850
+ 'ῌ' => 'ῃ',
851
+ 'Ῐ' => 'ῐ',
852
+ 'Ῑ' => 'ῑ',
853
+ 'Ὶ' => 'ὶ',
854
+ 'Ί' => 'ί',
855
+ 'Ῠ' => 'ῠ',
856
+ 'Ῡ' => 'ῡ',
857
+ 'Ὺ' => 'ὺ',
858
+ 'Ύ' => 'ύ',
859
+ 'Ῥ' => 'ῥ',
860
+ 'Ὸ' => 'ὸ',
861
+ 'Ό' => 'ό',
862
+ 'Ὼ' => 'ὼ',
863
+ 'Ώ' => 'ώ',
864
+ 'ῼ' => 'ῳ',
865
+ 'Ω' => 'ω',
866
+ 'K' => 'k',
867
+ 'Å' => 'å',
868
+ 'Ⅎ' => 'ⅎ',
869
+ 'Ⅰ' => 'ⅰ',
870
+ 'Ⅱ' => 'ⅱ',
871
+ 'Ⅲ' => 'ⅲ',
872
+ 'Ⅳ' => 'ⅳ',
873
+ 'Ⅴ' => 'ⅴ',
874
+ 'Ⅵ' => 'ⅵ',
875
+ 'Ⅶ' => 'ⅶ',
876
+ 'Ⅷ' => 'ⅷ',
877
+ 'Ⅸ' => 'ⅸ',
878
+ 'Ⅹ' => 'ⅹ',
879
+ 'Ⅺ' => 'ⅺ',
880
+ 'Ⅻ' => 'ⅻ',
881
+ 'Ⅼ' => 'ⅼ',
882
+ 'Ⅽ' => 'ⅽ',
883
+ 'Ⅾ' => 'ⅾ',
884
+ 'Ⅿ' => 'ⅿ',
885
+ 'Ↄ' => 'ↄ',
886
+ 'Ⓐ' => 'ⓐ',
887
+ 'Ⓑ' => 'ⓑ',
888
+ 'Ⓒ' => 'ⓒ',
889
+ 'Ⓓ' => 'ⓓ',
890
+ 'Ⓔ' => 'ⓔ',
891
+ 'Ⓕ' => 'ⓕ',
892
+ 'Ⓖ' => 'ⓖ',
893
+ 'Ⓗ' => 'ⓗ',
894
+ 'Ⓘ' => 'ⓘ',
895
+ 'Ⓙ' => 'ⓙ',
896
+ 'Ⓚ' => 'ⓚ',
897
+ 'Ⓛ' => 'ⓛ',
898
+ 'Ⓜ' => 'ⓜ',
899
+ 'Ⓝ' => 'ⓝ',
900
+ 'Ⓞ' => 'ⓞ',
901
+ 'Ⓟ' => 'ⓟ',
902
+ 'Ⓠ' => 'ⓠ',
903
+ 'Ⓡ' => 'ⓡ',
904
+ 'Ⓢ' => 'ⓢ',
905
+ 'Ⓣ' => 'ⓣ',
906
+ 'Ⓤ' => 'ⓤ',
907
+ 'Ⓥ' => 'ⓥ',
908
+ 'Ⓦ' => 'ⓦ',
909
+ 'Ⓧ' => 'ⓧ',
910
+ 'Ⓨ' => 'ⓨ',
911
+ 'Ⓩ' => 'ⓩ',
912
+ 'Ⰰ' => 'ⰰ',
913
+ 'Ⰱ' => 'ⰱ',
914
+ 'Ⰲ' => 'ⰲ',
915
+ 'Ⰳ' => 'ⰳ',
916
+ 'Ⰴ' => 'ⰴ',
917
+ 'Ⰵ' => 'ⰵ',
918
+ 'Ⰶ' => 'ⰶ',
919
+ 'Ⰷ' => 'ⰷ',
920
+ 'Ⰸ' => 'ⰸ',
921
+ 'Ⰹ' => 'ⰹ',
922
+ 'Ⰺ' => 'ⰺ',
923
+ 'Ⰻ' => 'ⰻ',
924
+ 'Ⰼ' => 'ⰼ',
925
+ 'Ⰽ' => 'ⰽ',
926
+ 'Ⰾ' => 'ⰾ',
927
+ 'Ⰿ' => 'ⰿ',
928
+ 'Ⱀ' => 'ⱀ',
929
+ 'Ⱁ' => 'ⱁ',
930
+ 'Ⱂ' => 'ⱂ',
931
+ 'Ⱃ' => 'ⱃ',
932
+ 'Ⱄ' => 'ⱄ',
933
+ 'Ⱅ' => 'ⱅ',
934
+ 'Ⱆ' => 'ⱆ',
935
+ 'Ⱇ' => 'ⱇ',
936
+ 'Ⱈ' => 'ⱈ',
937
+ 'Ⱉ' => 'ⱉ',
938
+ 'Ⱊ' => 'ⱊ',
939
+ 'Ⱋ' => 'ⱋ',
940
+ 'Ⱌ' => 'ⱌ',
941
+ 'Ⱍ' => 'ⱍ',
942
+ 'Ⱎ' => 'ⱎ',
943
+ 'Ⱏ' => 'ⱏ',
944
+ 'Ⱐ' => 'ⱐ',
945
+ 'Ⱑ' => 'ⱑ',
946
+ 'Ⱒ' => 'ⱒ',
947
+ 'Ⱓ' => 'ⱓ',
948
+ 'Ⱔ' => 'ⱔ',
949
+ 'Ⱕ' => 'ⱕ',
950
+ 'Ⱖ' => 'ⱖ',
951
+ 'Ⱗ' => 'ⱗ',
952
+ 'Ⱘ' => 'ⱘ',
953
+ 'Ⱙ' => 'ⱙ',
954
+ 'Ⱚ' => 'ⱚ',
955
+ 'Ⱛ' => 'ⱛ',
956
+ 'Ⱜ' => 'ⱜ',
957
+ 'Ⱝ' => 'ⱝ',
958
+ 'Ⱞ' => 'ⱞ',
959
+ 'Ⱡ' => 'ⱡ',
960
+ 'Ɫ' => 'ɫ',
961
+ 'Ᵽ' => 'ᵽ',
962
+ 'Ɽ' => 'ɽ',
963
+ 'Ⱨ' => 'ⱨ',
964
+ 'Ⱪ' => 'ⱪ',
965
+ 'Ⱬ' => 'ⱬ',
966
+ 'Ɑ' => 'ɑ',
967
+ 'Ɱ' => 'ɱ',
968
+ 'Ɐ' => 'ɐ',
969
+ 'Ɒ' => 'ɒ',
970
+ 'Ⱳ' => 'ⱳ',
971
+ 'Ⱶ' => 'ⱶ',
972
+ 'Ȿ' => 'ȿ',
973
+ 'Ɀ' => 'ɀ',
974
+ 'Ⲁ' => 'ⲁ',
975
+ 'Ⲃ' => 'ⲃ',
976
+ 'Ⲅ' => 'ⲅ',
977
+ 'Ⲇ' => 'ⲇ',
978
+ 'Ⲉ' => 'ⲉ',
979
+ 'Ⲋ' => 'ⲋ',
980
+ 'Ⲍ' => 'ⲍ',
981
+ 'Ⲏ' => 'ⲏ',
982
+ 'Ⲑ' => 'ⲑ',
983
+ 'Ⲓ' => 'ⲓ',
984
+ 'Ⲕ' => 'ⲕ',
985
+ 'Ⲗ' => 'ⲗ',
986
+ 'Ⲙ' => 'ⲙ',
987
+ 'Ⲛ' => 'ⲛ',
988
+ 'Ⲝ' => 'ⲝ',
989
+ 'Ⲟ' => 'ⲟ',
990
+ 'Ⲡ' => 'ⲡ',
991
+ 'Ⲣ' => 'ⲣ',
992
+ 'Ⲥ' => 'ⲥ',
993
+ 'Ⲧ' => 'ⲧ',
994
+ 'Ⲩ' => 'ⲩ',
995
+ 'Ⲫ' => 'ⲫ',
996
+ 'Ⲭ' => 'ⲭ',
997
+ 'Ⲯ' => 'ⲯ',
998
+ 'Ⲱ' => 'ⲱ',
999
+ 'Ⲳ' => 'ⲳ',
1000
+ 'Ⲵ' => 'ⲵ',
1001
+ 'Ⲷ' => 'ⲷ',
1002
+ 'Ⲹ' => 'ⲹ',
1003
+ 'Ⲻ' => 'ⲻ',
1004
+ 'Ⲽ' => 'ⲽ',
1005
+ 'Ⲿ' => 'ⲿ',
1006
+ 'Ⳁ' => 'ⳁ',
1007
+ 'Ⳃ' => 'ⳃ',
1008
+ 'Ⳅ' => 'ⳅ',
1009
+ 'Ⳇ' => 'ⳇ',
1010
+ 'Ⳉ' => 'ⳉ',
1011
+ 'Ⳋ' => 'ⳋ',
1012
+ 'Ⳍ' => 'ⳍ',
1013
+ 'Ⳏ' => 'ⳏ',
1014
+ 'Ⳑ' => 'ⳑ',
1015
+ 'Ⳓ' => 'ⳓ',
1016
+ 'Ⳕ' => 'ⳕ',
1017
+ 'Ⳗ' => 'ⳗ',
1018
+ 'Ⳙ' => 'ⳙ',
1019
+ 'Ⳛ' => 'ⳛ',
1020
+ 'Ⳝ' => 'ⳝ',
1021
+ 'Ⳟ' => 'ⳟ',
1022
+ 'Ⳡ' => 'ⳡ',
1023
+ 'Ⳣ' => 'ⳣ',
1024
+ 'Ⳬ' => 'ⳬ',
1025
+ 'Ⳮ' => 'ⳮ',
1026
+ 'Ⳳ' => 'ⳳ',
1027
+ 'Ꙁ' => 'ꙁ',
1028
+ 'Ꙃ' => 'ꙃ',
1029
+ 'Ꙅ' => 'ꙅ',
1030
+ 'Ꙇ' => 'ꙇ',
1031
+ 'Ꙉ' => 'ꙉ',
1032
+ 'Ꙋ' => 'ꙋ',
1033
+ 'Ꙍ' => 'ꙍ',
1034
+ 'Ꙏ' => 'ꙏ',
1035
+ 'Ꙑ' => 'ꙑ',
1036
+ 'Ꙓ' => 'ꙓ',
1037
+ 'Ꙕ' => 'ꙕ',
1038
+ 'Ꙗ' => 'ꙗ',
1039
+ 'Ꙙ' => 'ꙙ',
1040
+ 'Ꙛ' => 'ꙛ',
1041
+ 'Ꙝ' => 'ꙝ',
1042
+ 'Ꙟ' => 'ꙟ',
1043
+ 'Ꙡ' => 'ꙡ',
1044
+ 'Ꙣ' => 'ꙣ',
1045
+ 'Ꙥ' => 'ꙥ',
1046
+ 'Ꙧ' => 'ꙧ',
1047
+ 'Ꙩ' => 'ꙩ',
1048
+ 'Ꙫ' => 'ꙫ',
1049
+ 'Ꙭ' => 'ꙭ',
1050
+ 'Ꚁ' => 'ꚁ',
1051
+ 'Ꚃ' => 'ꚃ',
1052
+ 'Ꚅ' => 'ꚅ',
1053
+ 'Ꚇ' => 'ꚇ',
1054
+ 'Ꚉ' => 'ꚉ',
1055
+ 'Ꚋ' => 'ꚋ',
1056
+ 'Ꚍ' => 'ꚍ',
1057
+ 'Ꚏ' => 'ꚏ',
1058
+ 'Ꚑ' => 'ꚑ',
1059
+ 'Ꚓ' => 'ꚓ',
1060
+ 'Ꚕ' => 'ꚕ',
1061
+ 'Ꚗ' => 'ꚗ',
1062
+ 'Ꚙ' => 'ꚙ',
1063
+ 'Ꚛ' => 'ꚛ',
1064
+ 'Ꜣ' => 'ꜣ',
1065
+ 'Ꜥ' => 'ꜥ',
1066
+ 'Ꜧ' => 'ꜧ',
1067
+ 'Ꜩ' => 'ꜩ',
1068
+ 'Ꜫ' => 'ꜫ',
1069
+ 'Ꜭ' => 'ꜭ',
1070
+ 'Ꜯ' => 'ꜯ',
1071
+ 'Ꜳ' => 'ꜳ',
1072
+ 'Ꜵ' => 'ꜵ',
1073
+ 'Ꜷ' => 'ꜷ',
1074
+ 'Ꜹ' => 'ꜹ',
1075
+ 'Ꜻ' => 'ꜻ',
1076
+ 'Ꜽ' => 'ꜽ',
1077
+ 'Ꜿ' => 'ꜿ',
1078
+ 'Ꝁ' => 'ꝁ',
1079
+ 'Ꝃ' => 'ꝃ',
1080
+ 'Ꝅ' => 'ꝅ',
1081
+ 'Ꝇ' => 'ꝇ',
1082
+ 'Ꝉ' => 'ꝉ',
1083
+ 'Ꝋ' => 'ꝋ',
1084
+ 'Ꝍ' => 'ꝍ',
1085
+ 'Ꝏ' => 'ꝏ',
1086
+ 'Ꝑ' => 'ꝑ',
1087
+ 'Ꝓ' => 'ꝓ',
1088
+ 'Ꝕ' => 'ꝕ',
1089
+ 'Ꝗ' => 'ꝗ',
1090
+ 'Ꝙ' => 'ꝙ',
1091
+ 'Ꝛ' => 'ꝛ',
1092
+ 'Ꝝ' => 'ꝝ',
1093
+ 'Ꝟ' => 'ꝟ',
1094
+ 'Ꝡ' => 'ꝡ',
1095
+ 'Ꝣ' => 'ꝣ',
1096
+ 'Ꝥ' => 'ꝥ',
1097
+ 'Ꝧ' => 'ꝧ',
1098
+ 'Ꝩ' => 'ꝩ',
1099
+ 'Ꝫ' => 'ꝫ',
1100
+ 'Ꝭ' => 'ꝭ',
1101
+ 'Ꝯ' => 'ꝯ',
1102
+ 'Ꝺ' => 'ꝺ',
1103
+ 'Ꝼ' => 'ꝼ',
1104
+ 'Ᵹ' => 'ᵹ',
1105
+ 'Ꝿ' => 'ꝿ',
1106
+ 'Ꞁ' => 'ꞁ',
1107
+ 'Ꞃ' => 'ꞃ',
1108
+ 'Ꞅ' => 'ꞅ',
1109
+ 'Ꞇ' => 'ꞇ',
1110
+ 'Ꞌ' => 'ꞌ',
1111
+ 'Ɥ' => 'ɥ',
1112
+ 'Ꞑ' => 'ꞑ',
1113
+ 'Ꞓ' => 'ꞓ',
1114
+ 'Ꞗ' => 'ꞗ',
1115
+ 'Ꞙ' => 'ꞙ',
1116
+ 'Ꞛ' => 'ꞛ',
1117
+ 'Ꞝ' => 'ꞝ',
1118
+ 'Ꞟ' => 'ꞟ',
1119
+ 'Ꞡ' => 'ꞡ',
1120
+ 'Ꞣ' => 'ꞣ',
1121
+ 'Ꞥ' => 'ꞥ',
1122
+ 'Ꞧ' => 'ꞧ',
1123
+ 'Ꞩ' => 'ꞩ',
1124
+ 'Ɦ' => 'ɦ',
1125
+ 'Ɜ' => 'ɜ',
1126
+ 'Ɡ' => 'ɡ',
1127
+ 'Ɬ' => 'ɬ',
1128
+ 'Ɪ' => 'ɪ',
1129
+ 'Ʞ' => 'ʞ',
1130
+ 'Ʇ' => 'ʇ',
1131
+ 'Ʝ' => 'ʝ',
1132
+ 'Ꭓ' => 'ꭓ',
1133
+ 'Ꞵ' => 'ꞵ',
1134
+ 'Ꞷ' => 'ꞷ',
1135
+ 'Ꞹ' => 'ꞹ',
1136
+ 'Ꞻ' => 'ꞻ',
1137
+ 'Ꞽ' => 'ꞽ',
1138
+ 'Ꞿ' => 'ꞿ',
1139
+ 'Ꟃ' => 'ꟃ',
1140
+ 'Ꞔ' => 'ꞔ',
1141
+ 'Ʂ' => 'ʂ',
1142
+ 'Ᶎ' => 'ᶎ',
1143
+ 'Ꟈ' => 'ꟈ',
1144
+ 'Ꟊ' => 'ꟊ',
1145
+ 'Ꟶ' => 'ꟶ',
1146
+ 'A' => 'a',
1147
+ 'B' => 'b',
1148
+ 'C' => 'c',
1149
+ 'D' => 'd',
1150
+ 'E' => 'e',
1151
+ 'F' => 'f',
1152
+ 'G' => 'g',
1153
+ 'H' => 'h',
1154
+ 'I' => 'i',
1155
+ 'J' => 'j',
1156
+ 'K' => 'k',
1157
+ 'L' => 'l',
1158
+ 'M' => 'm',
1159
+ 'N' => 'n',
1160
+ 'O' => 'o',
1161
+ 'P' => 'p',
1162
+ 'Q' => 'q',
1163
+ 'R' => 'r',
1164
+ 'S' => 's',
1165
+ 'T' => 't',
1166
+ 'U' => 'u',
1167
+ 'V' => 'v',
1168
+ 'W' => 'w',
1169
+ 'X' => 'x',
1170
+ 'Y' => 'y',
1171
+ 'Z' => 'z',
1172
+ '𐐀' => '𐐨',
1173
+ '𐐁' => '𐐩',
1174
+ '𐐂' => '𐐪',
1175
+ '𐐃' => '𐐫',
1176
+ '𐐄' => '𐐬',
1177
+ '𐐅' => '𐐭',
1178
+ '𐐆' => '𐐮',
1179
+ '𐐇' => '𐐯',
1180
+ '𐐈' => '𐐰',
1181
+ '𐐉' => '𐐱',
1182
+ '𐐊' => '𐐲',
1183
+ '𐐋' => '𐐳',
1184
+ '𐐌' => '𐐴',
1185
+ '𐐍' => '𐐵',
1186
+ '𐐎' => '𐐶',
1187
+ '𐐏' => '𐐷',
1188
+ '𐐐' => '𐐸',
1189
+ '𐐑' => '𐐹',
1190
+ '𐐒' => '𐐺',
1191
+ '𐐓' => '𐐻',
1192
+ '𐐔' => '𐐼',
1193
+ '𐐕' => '𐐽',
1194
+ '𐐖' => '𐐾',
1195
+ '𐐗' => '𐐿',
1196
+ '𐐘' => '𐑀',
1197
+ '𐐙' => '𐑁',
1198
+ '𐐚' => '𐑂',
1199
+ '𐐛' => '𐑃',
1200
+ '𐐜' => '𐑄',
1201
+ '𐐝' => '𐑅',
1202
+ '𐐞' => '𐑆',
1203
+ '𐐟' => '𐑇',
1204
+ '𐐠' => '𐑈',
1205
+ '𐐡' => '𐑉',
1206
+ '𐐢' => '𐑊',
1207
+ '𐐣' => '𐑋',
1208
+ '𐐤' => '𐑌',
1209
+ '𐐥' => '𐑍',
1210
+ '𐐦' => '𐑎',
1211
+ '𐐧' => '𐑏',
1212
+ '𐒰' => '𐓘',
1213
+ '𐒱' => '𐓙',
1214
+ '𐒲' => '𐓚',
1215
+ '𐒳' => '𐓛',
1216
+ '𐒴' => '𐓜',
1217
+ '𐒵' => '𐓝',
1218
+ '𐒶' => '𐓞',
1219
+ '𐒷' => '𐓟',
1220
+ '𐒸' => '𐓠',
1221
+ '𐒹' => '𐓡',
1222
+ '𐒺' => '𐓢',
1223
+ '𐒻' => '𐓣',
1224
+ '𐒼' => '𐓤',
1225
+ '𐒽' => '𐓥',
1226
+ '𐒾' => '𐓦',
1227
+ '𐒿' => '𐓧',
1228
+ '𐓀' => '𐓨',
1229
+ '𐓁' => '𐓩',
1230
+ '𐓂' => '𐓪',
1231
+ '𐓃' => '𐓫',
1232
+ '𐓄' => '𐓬',
1233
+ '𐓅' => '𐓭',
1234
+ '𐓆' => '𐓮',
1235
+ '𐓇' => '𐓯',
1236
+ '𐓈' => '𐓰',
1237
+ '𐓉' => '𐓱',
1238
+ '𐓊' => '𐓲',
1239
+ '𐓋' => '𐓳',
1240
+ '𐓌' => '𐓴',
1241
+ '𐓍' => '𐓵',
1242
+ '𐓎' => '𐓶',
1243
+ '𐓏' => '𐓷',
1244
+ '𐓐' => '𐓸',
1245
+ '𐓑' => '𐓹',
1246
+ '𐓒' => '𐓺',
1247
+ '𐓓' => '𐓻',
1248
+ '𐲀' => '𐳀',
1249
+ '𐲁' => '𐳁',
1250
+ '𐲂' => '𐳂',
1251
+ '𐲃' => '𐳃',
1252
+ '𐲄' => '𐳄',
1253
+ '𐲅' => '𐳅',
1254
+ '𐲆' => '𐳆',
1255
+ '𐲇' => '𐳇',
1256
+ '𐲈' => '𐳈',
1257
+ '𐲉' => '𐳉',
1258
+ '𐲊' => '𐳊',
1259
+ '𐲋' => '𐳋',
1260
+ '𐲌' => '𐳌',
1261
+ '𐲍' => '𐳍',
1262
+ '𐲎' => '𐳎',
1263
+ '𐲏' => '𐳏',
1264
+ '𐲐' => '𐳐',
1265
+ '𐲑' => '𐳑',
1266
+ '𐲒' => '𐳒',
1267
+ '𐲓' => '𐳓',
1268
+ '𐲔' => '𐳔',
1269
+ '𐲕' => '𐳕',
1270
+ '𐲖' => '𐳖',
1271
+ '𐲗' => '𐳗',
1272
+ '𐲘' => '𐳘',
1273
+ '𐲙' => '𐳙',
1274
+ '𐲚' => '𐳚',
1275
+ '𐲛' => '𐳛',
1276
+ '𐲜' => '𐳜',
1277
+ '𐲝' => '𐳝',
1278
+ '𐲞' => '𐳞',
1279
+ '𐲟' => '𐳟',
1280
+ '𐲠' => '𐳠',
1281
+ '𐲡' => '𐳡',
1282
+ '𐲢' => '𐳢',
1283
+ '𐲣' => '𐳣',
1284
+ '𐲤' => '𐳤',
1285
+ '𐲥' => '𐳥',
1286
+ '𐲦' => '𐳦',
1287
+ '𐲧' => '𐳧',
1288
+ '𐲨' => '𐳨',
1289
+ '𐲩' => '𐳩',
1290
+ '𐲪' => '𐳪',
1291
+ '𐲫' => '𐳫',
1292
+ '𐲬' => '𐳬',
1293
+ '𐲭' => '𐳭',
1294
+ '𐲮' => '𐳮',
1295
+ '𐲯' => '𐳯',
1296
+ '𐲰' => '𐳰',
1297
+ '𐲱' => '𐳱',
1298
+ '𐲲' => '𐳲',
1299
+ '𑢠' => '𑣀',
1300
+ '𑢡' => '𑣁',
1301
+ '𑢢' => '𑣂',
1302
+ '𑢣' => '𑣃',
1303
+ '𑢤' => '𑣄',
1304
+ '𑢥' => '𑣅',
1305
+ '𑢦' => '𑣆',
1306
+ '𑢧' => '𑣇',
1307
+ '𑢨' => '𑣈',
1308
+ '𑢩' => '𑣉',
1309
+ '𑢪' => '𑣊',
1310
+ '𑢫' => '𑣋',
1311
+ '𑢬' => '𑣌',
1312
+ '𑢭' => '𑣍',
1313
+ '𑢮' => '𑣎',
1314
+ '𑢯' => '𑣏',
1315
+ '𑢰' => '𑣐',
1316
+ '𑢱' => '𑣑',
1317
+ '𑢲' => '𑣒',
1318
+ '𑢳' => '𑣓',
1319
+ '𑢴' => '𑣔',
1320
+ '𑢵' => '𑣕',
1321
+ '𑢶' => '𑣖',
1322
+ '𑢷' => '𑣗',
1323
+ '𑢸' => '𑣘',
1324
+ '𑢹' => '𑣙',
1325
+ '𑢺' => '𑣚',
1326
+ '𑢻' => '𑣛',
1327
+ '𑢼' => '𑣜',
1328
+ '𑢽' => '𑣝',
1329
+ '𑢾' => '𑣞',
1330
+ '𑢿' => '𑣟',
1331
+ '𖹀' => '𖹠',
1332
+ '𖹁' => '𖹡',
1333
+ '𖹂' => '𖹢',
1334
+ '𖹃' => '𖹣',
1335
+ '𖹄' => '𖹤',
1336
+ '𖹅' => '𖹥',
1337
+ '𖹆' => '𖹦',
1338
+ '𖹇' => '𖹧',
1339
+ '𖹈' => '𖹨',
1340
+ '𖹉' => '𖹩',
1341
+ '𖹊' => '𖹪',
1342
+ '𖹋' => '𖹫',
1343
+ '𖹌' => '𖹬',
1344
+ '𖹍' => '𖹭',
1345
+ '𖹎' => '𖹮',
1346
+ '𖹏' => '𖹯',
1347
+ '𖹐' => '𖹰',
1348
+ '𖹑' => '𖹱',
1349
+ '𖹒' => '𖹲',
1350
+ '𖹓' => '𖹳',
1351
+ '𖹔' => '𖹴',
1352
+ '𖹕' => '𖹵',
1353
+ '𖹖' => '𖹶',
1354
+ '𖹗' => '𖹷',
1355
+ '𖹘' => '𖹸',
1356
+ '𖹙' => '𖹹',
1357
+ '𖹚' => '𖹺',
1358
+ '𖹛' => '𖹻',
1359
+ '𖹜' => '𖹼',
1360
+ '𖹝' => '𖹽',
1361
+ '𖹞' => '𖹾',
1362
+ '𖹟' => '𖹿',
1363
+ '𞤀' => '𞤢',
1364
+ '𞤁' => '𞤣',
1365
+ '𞤂' => '𞤤',
1366
+ '𞤃' => '𞤥',
1367
+ '𞤄' => '𞤦',
1368
+ '𞤅' => '𞤧',
1369
+ '𞤆' => '𞤨',
1370
+ '𞤇' => '𞤩',
1371
+ '𞤈' => '𞤪',
1372
+ '𞤉' => '𞤫',
1373
+ '𞤊' => '𞤬',
1374
+ '𞤋' => '𞤭',
1375
+ '𞤌' => '𞤮',
1376
+ '𞤍' => '𞤯',
1377
+ '𞤎' => '𞤰',
1378
+ '𞤏' => '𞤱',
1379
+ '𞤐' => '𞤲',
1380
+ '𞤑' => '𞤳',
1381
+ '𞤒' => '𞤴',
1382
+ '𞤓' => '𞤵',
1383
+ '𞤔' => '𞤶',
1384
+ '𞤕' => '𞤷',
1385
+ '𞤖' => '𞤸',
1386
+ '𞤗' => '𞤹',
1387
+ '𞤘' => '𞤺',
1388
+ '𞤙' => '𞤻',
1389
+ '𞤚' => '𞤼',
1390
+ '𞤛' => '𞤽',
1391
+ '𞤜' => '𞤾',
1392
+ '𞤝' => '𞤿',
1393
+ '𞤞' => '𞥀',
1394
+ '𞤟' => '𞥁',
1395
+ '𞤠' => '𞥂',
1396
+ '𞤡' => '𞥃',
1397
+ );
vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
+
5
+ return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php ADDED
@@ -0,0 +1,1414 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ return array (
4
+ 'a' => 'A',
5
+ 'b' => 'B',
6
+ 'c' => 'C',
7
+ 'd' => 'D',
8
+ 'e' => 'E',
9
+ 'f' => 'F',
10
+ 'g' => 'G',
11
+ 'h' => 'H',
12
+ 'i' => 'I',
13
+ 'j' => 'J',
14
+ 'k' => 'K',
15
+ 'l' => 'L',
16
+ 'm' => 'M',
17
+ 'n' => 'N',
18
+ 'o' => 'O',
19
+ 'p' => 'P',
20
+ 'q' => 'Q',
21
+ 'r' => 'R',
22
+ 's' => 'S',
23
+ 't' => 'T',
24
+ 'u' => 'U',
25
+ 'v' => 'V',
26
+ 'w' => 'W',
27
+ 'x' => 'X',
28
+ 'y' => 'Y',
29
+ 'z' => 'Z',
30
+ 'µ' => 'Μ',
31
+ 'à' => 'À',
32
+ 'á' => 'Á',
33
+ 'â' => 'Â',
34
+ 'ã' => 'Ã',
35
+ 'ä' => 'Ä',
36
+ 'å' => 'Å',
37
+ 'æ' => 'Æ',
38
+ 'ç' => 'Ç',
39
+ 'è' => 'È',
40
+ 'é' => 'É',
41
+ 'ê' => 'Ê',
42
+ 'ë' => 'Ë',
43
+ 'ì' => 'Ì',
44
+ 'í' => 'Í',
45
+ 'î' => 'Î',
46
+ 'ï' => 'Ï',
47
+ 'ð' => 'Ð',
48
+ 'ñ' => 'Ñ',
49
+ 'ò' => 'Ò',
50
+ 'ó' => 'Ó',
51
+ 'ô' => 'Ô',
52
+ 'õ' => 'Õ',
53
+ 'ö' => 'Ö',
54
+ 'ø' => 'Ø',
55
+ 'ù' => 'Ù',
56
+ 'ú' => 'Ú',
57
+ 'û' => 'Û',
58
+ 'ü' => 'Ü',
59
+ 'ý' => 'Ý',
60
+ 'þ' => 'Þ',
61
+ 'ÿ' => 'Ÿ',
62
+ 'ā' => 'Ā',
63
+ 'ă' => 'Ă',
64
+ 'ą' => 'Ą',
65
+ 'ć' => 'Ć',
66
+ 'ĉ' => 'Ĉ',
67
+ 'ċ' => 'Ċ',
68
+ 'č' => 'Č',
69
+ 'ď' => 'Ď',
70
+ 'đ' => 'Đ',
71
+ 'ē' => 'Ē',
72
+ 'ĕ' => 'Ĕ',
73
+ 'ė' => 'Ė',
74
+ 'ę' => 'Ę',
75
+ 'ě' => 'Ě',
76
+ 'ĝ' => 'Ĝ',
77
+ 'ğ' => 'Ğ',
78
+ 'ġ' => 'Ġ',
79
+ 'ģ' => 'Ģ',
80
+ 'ĥ' => 'Ĥ',
81
+ 'ħ' => 'Ħ',
82
+ 'ĩ' => 'Ĩ',
83
+ 'ī' => 'Ī',
84
+ 'ĭ' => 'Ĭ',
85
+ 'į' => 'Į',
86
+ 'ı' => 'I',
87
+ 'ij' => 'IJ',
88
+ 'ĵ' => 'Ĵ',
89
+ 'ķ' => 'Ķ',
90
+ 'ĺ' => 'Ĺ',
91
+ 'ļ' => 'Ļ',
92
+ 'ľ' => 'Ľ',
93
+ 'ŀ' => 'Ŀ',
94
+ 'ł' => 'Ł',
95
+ 'ń' => 'Ń',
96
+ 'ņ' => 'Ņ',
97
+ 'ň' => 'Ň',
98
+ 'ŋ' => 'Ŋ',
99
+ 'ō' => 'Ō',
100
+ 'ŏ' => 'Ŏ',
101
+ 'ő' => 'Ő',
102
+ 'œ' => 'Œ',
103
+ 'ŕ' => 'Ŕ',
104
+ 'ŗ' => 'Ŗ',
105
+ 'ř' => 'Ř',
106
+ 'ś' => 'Ś',
107
+ 'ŝ' => 'Ŝ',
108
+ 'ş' => 'Ş',
109
+ 'š' => 'Š',
110
+ 'ţ' => 'Ţ',
111
+ 'ť' => 'Ť',
112
+ 'ŧ' => 'Ŧ',
113
+ 'ũ' => 'Ũ',
114
+ 'ū' => 'Ū',
115
+ 'ŭ' => 'Ŭ',
116
+ 'ů' => 'Ů',
117
+ 'ű' => 'Ű',
118
+ 'ų' => 'Ų',
119
+ 'ŵ' => 'Ŵ',
120
+ 'ŷ' => 'Ŷ',
121
+ 'ź' => 'Ź',
122
+ 'ż' => 'Ż',
123
+ 'ž' => 'Ž',
124
+ 'ſ' => 'S',
125
+ 'ƀ' => 'Ƀ',
126
+ 'ƃ' => 'Ƃ',
127
+ 'ƅ' => 'Ƅ',
128
+ 'ƈ' => 'Ƈ',
129
+ 'ƌ' => 'Ƌ',
130
+ 'ƒ' => 'Ƒ',
131
+ 'ƕ' => 'Ƕ',
132
+ 'ƙ' => 'Ƙ',
133
+ 'ƚ' => 'Ƚ',
134
+ 'ƞ' => 'Ƞ',
135
+ 'ơ' => 'Ơ',
136
+ 'ƣ' => 'Ƣ',
137
+ 'ƥ' => 'Ƥ',
138
+ 'ƨ' => 'Ƨ',
139
+ 'ƭ' => 'Ƭ',
140
+ 'ư' => 'Ư',
141
+ 'ƴ' => 'Ƴ',
142
+ 'ƶ' => 'Ƶ',
143
+ 'ƹ' => 'Ƹ',
144
+ 'ƽ' => 'Ƽ',
145
+ 'ƿ' => 'Ƿ',
146
+ 'Dž' => 'DŽ',
147
+ 'dž' => 'DŽ',
148
+ 'Lj' => 'LJ',
149
+ 'lj' => 'LJ',
150
+ 'Nj' => 'NJ',
151
+ 'nj' => 'NJ',
152
+ 'ǎ' => 'Ǎ',
153
+ 'ǐ' => 'Ǐ',
154
+ 'ǒ' => 'Ǒ',
155
+ 'ǔ' => 'Ǔ',
156
+ 'ǖ' => 'Ǖ',
157
+ 'ǘ' => 'Ǘ',
158
+ 'ǚ' => 'Ǚ',
159
+ 'ǜ' => 'Ǜ',
160
+ 'ǝ' => 'Ǝ',
161
+ 'ǟ' => 'Ǟ',
162
+ 'ǡ' => 'Ǡ',
163
+ 'ǣ' => 'Ǣ',
164
+ 'ǥ' => 'Ǥ',
165
+ 'ǧ' => 'Ǧ',
166
+ 'ǩ' => 'Ǩ',
167
+ 'ǫ' => 'Ǫ',
168
+ 'ǭ' => 'Ǭ',
169
+ 'ǯ' => 'Ǯ',
170
+ 'Dz' => 'DZ',
171
+ 'dz' => 'DZ',
172
+ 'ǵ' => 'Ǵ',
173
+ 'ǹ' => 'Ǹ',
174
+ 'ǻ' => 'Ǻ',
175
+ 'ǽ' => 'Ǽ',
176
+ 'ǿ' => 'Ǿ',
177
+ 'ȁ' => 'Ȁ',
178
+ 'ȃ' => 'Ȃ',
179
+ 'ȅ' => 'Ȅ',
180
+ 'ȇ' => 'Ȇ',
181
+ 'ȉ' => 'Ȉ',
182
+ 'ȋ' => 'Ȋ',
183
+ 'ȍ' => 'Ȍ',
184
+ 'ȏ' => 'Ȏ',
185
+ 'ȑ' => 'Ȑ',
186
+ 'ȓ' => 'Ȓ',
187
+ 'ȕ' => 'Ȕ',
188
+ 'ȗ' => 'Ȗ',
189
+ 'ș' => 'Ș',
190
+ 'ț' => 'Ț',
191
+ 'ȝ' => 'Ȝ',
192
+ 'ȟ' => 'Ȟ',
193
+ 'ȣ' => 'Ȣ',
194
+ 'ȥ' => 'Ȥ',
195
+ 'ȧ' => 'Ȧ',
196
+ 'ȩ' => 'Ȩ',
197
+ 'ȫ' => 'Ȫ',
198
+ 'ȭ' => 'Ȭ',
199
+ 'ȯ' => 'Ȯ',
200
+ 'ȱ' => 'Ȱ',
201
+ 'ȳ' => 'Ȳ',
202
+ 'ȼ' => 'Ȼ',
203
+ 'ȿ' => 'Ȿ',
204
+ 'ɀ' => 'Ɀ',
205
+ 'ɂ' => 'Ɂ',
206
+ 'ɇ' => 'Ɇ',
207
+ 'ɉ' => 'Ɉ',
208
+ 'ɋ' => 'Ɋ',
209
+ 'ɍ' => 'Ɍ',
210
+ 'ɏ' => 'Ɏ',
211
+ 'ɐ' => 'Ɐ',
212
+ 'ɑ' => 'Ɑ',
213
+ 'ɒ' => 'Ɒ',
214
+ 'ɓ' => 'Ɓ',
215
+ 'ɔ' => 'Ɔ',
216
+ 'ɖ' => 'Ɖ',
217
+ 'ɗ' => 'Ɗ',
218
+ 'ə' => 'Ə',
219
+ 'ɛ' => 'Ɛ',
220
+ 'ɜ' => 'Ɜ',
221
+ 'ɠ' => 'Ɠ',
222
+ 'ɡ' => 'Ɡ',
223
+ 'ɣ' => 'Ɣ',
224
+ 'ɥ' => 'Ɥ',
225
+ 'ɦ' => 'Ɦ',
226
+ 'ɨ' => 'Ɨ',
227
+ 'ɩ' => 'Ɩ',
228
+ 'ɪ' => 'Ɪ',
229
+ 'ɫ' => 'Ɫ',
230
+ 'ɬ' => 'Ɬ',
231
+ 'ɯ' => 'Ɯ',
232
+ 'ɱ' => 'Ɱ',
233
+ 'ɲ' => 'Ɲ',
234
+ 'ɵ' => 'Ɵ',
235
+ 'ɽ' => 'Ɽ',
236
+ 'ʀ' => 'Ʀ',
237
+ 'ʂ' => 'Ʂ',
238
+ 'ʃ' => 'Ʃ',
239
+ 'ʇ' => 'Ʇ',
240
+ 'ʈ' => 'Ʈ',
241
+ 'ʉ' => 'Ʉ',
242
+ 'ʊ' => 'Ʊ',
243
+ 'ʋ' => 'Ʋ',
244
+ 'ʌ' => 'Ʌ',
245
+ 'ʒ' => 'Ʒ',
246
+ 'ʝ' => 'Ʝ',
247
+ 'ʞ' => 'Ʞ',
248
+ 'ͅ' => 'Ι',
249
+ 'ͱ' => 'Ͱ',
250
+ 'ͳ' => 'Ͳ',
251
+ 'ͷ' => 'Ͷ',
252
+ 'ͻ' => 'Ͻ',
253
+ 'ͼ' => 'Ͼ',
254
+ 'ͽ' => 'Ͽ',
255
+ 'ά' => 'Ά',
256
+ 'έ' => 'Έ',
257
+ 'ή' => 'Ή',
258
+ 'ί' => 'Ί',
259
+ 'α' => 'Α',
260
+ 'β' => 'Β',
261
+ 'γ' => 'Γ',
262
+ 'δ' => 'Δ',
263
+ 'ε' => 'Ε',
264
+ 'ζ' => 'Ζ',
265
+ 'η' => 'Η',
266
+ 'θ' => 'Θ',
267
+ 'ι' => 'Ι',
268
+ 'κ' => 'Κ',
269
+ 'λ' => 'Λ',
270
+ 'μ' => 'Μ',
271
+ 'ν' => 'Ν',
272
+ 'ξ' => 'Ξ',
273
+ 'ο' => 'Ο',
274
+ 'π' => 'Π',
275
+ 'ρ' => 'Ρ',
276
+ 'ς' => 'Σ',
277
+ 'σ' => 'Σ',
278
+ 'τ' => 'Τ',
279
+ 'υ' => 'Υ',
280
+ 'φ' => 'Φ',
281
+ 'χ' => 'Χ',
282
+ 'ψ' => 'Ψ',
283
+ 'ω' => 'Ω',
284
+ 'ϊ' => 'Ϊ',
285
+ 'ϋ' => 'Ϋ',
286
+ 'ό' => 'Ό',
287
+ 'ύ' => 'Ύ',
288
+ 'ώ' => 'Ώ',
289
+ 'ϐ' => 'Β',
290
+ 'ϑ' => 'Θ',
291
+ 'ϕ' => 'Φ',
292
+ 'ϖ' => 'Π',
293
+ 'ϗ' => 'Ϗ',
294
+ 'ϙ' => 'Ϙ',
295
+ 'ϛ' => 'Ϛ',
296
+ 'ϝ' => 'Ϝ',
297
+ 'ϟ' => 'Ϟ',
298
+ 'ϡ' => 'Ϡ',
299
+ 'ϣ' => 'Ϣ',
300
+ 'ϥ' => 'Ϥ',
301
+ 'ϧ' => 'Ϧ',
302
+ 'ϩ' => 'Ϩ',
303
+ 'ϫ' => 'Ϫ',
304
+ 'ϭ' => 'Ϭ',
305
+ 'ϯ' => 'Ϯ',
306
+ 'ϰ' => 'Κ',
307
+ 'ϱ' => 'Ρ',
308
+ 'ϲ' => 'Ϲ',
309
+ 'ϳ' => 'Ϳ',
310
+ 'ϵ' => 'Ε',
311
+ 'ϸ' => 'Ϸ',
312
+ 'ϻ' => 'Ϻ',
313
+ 'а' => 'А',
314
+ 'б' => 'Б',
315
+ 'в' => 'В',
316
+ 'г' => 'Г',
317
+ 'д' => 'Д',
318
+ 'е' => 'Е',
319
+ 'ж' => 'Ж',
320
+ 'з' => 'З',
321
+ 'и' => 'И',
322
+ 'й' => 'Й',
323
+ 'к' => 'К',
324
+ 'л' => 'Л',
325
+ 'м' => 'М',
326
+ 'н' => 'Н',
327
+ 'о' => 'О',
328
+ 'п' => 'П',
329
+ 'р' => 'Р',
330
+ 'с' => 'С',
331
+ 'т' => 'Т',
332
+ 'у' => 'У',
333
+ 'ф' => 'Ф',
334
+ 'х' => 'Х',
335
+ 'ц' => 'Ц',
336
+ 'ч' => 'Ч',
337
+ 'ш' => 'Ш',
338
+ 'щ' => 'Щ',
339
+ 'ъ' => 'Ъ',
340
+ 'ы' => 'Ы',
341
+ 'ь' => 'Ь',
342
+ 'э' => 'Э',
343
+ 'ю' => 'Ю',
344
+ 'я' => 'Я',
345
+ 'ѐ' => 'Ѐ',
346
+ 'ё' => 'Ё',
347
+ 'ђ' => 'Ђ',
348
+ 'ѓ' => 'Ѓ',
349
+ 'є' => 'Є',
350
+ 'ѕ' => 'Ѕ',
351
+ 'і' => 'І',
352
+ 'ї' => 'Ї',
353
+ 'ј' => 'Ј',
354
+ 'љ' => 'Љ',
355
+ 'њ' => 'Њ',
356
+ 'ћ' => 'Ћ',
357
+ 'ќ' => 'Ќ',
358
+ 'ѝ' => 'Ѝ',
359
+ 'ў' => 'Ў',
360
+ 'џ' => 'Џ',
361
+ 'ѡ' => 'Ѡ',
362
+ 'ѣ' => 'Ѣ',
363
+ 'ѥ' => 'Ѥ',
364
+ 'ѧ' => 'Ѧ',
365
+ 'ѩ' => 'Ѩ',
366
+ 'ѫ' => 'Ѫ',
367
+ 'ѭ' => 'Ѭ',
368
+ 'ѯ' => 'Ѯ',
369
+ 'ѱ' => 'Ѱ',
370
+ 'ѳ' => 'Ѳ',
371
+ 'ѵ' => 'Ѵ',
372
+ 'ѷ' => 'Ѷ',
373
+ 'ѹ' => 'Ѹ',
374
+ 'ѻ' => 'Ѻ',
375
+ 'ѽ' => 'Ѽ',
376
+ 'ѿ' => 'Ѿ',
377
+ 'ҁ' => 'Ҁ',
378
+ 'ҋ' => 'Ҋ',
379
+ 'ҍ' => 'Ҍ',
380
+ 'ҏ' => 'Ҏ',
381
+ 'ґ' => 'Ґ',
382
+ 'ғ' => 'Ғ',
383
+ 'ҕ' => 'Ҕ',
384
+ 'җ' => 'Җ',
385
+ 'ҙ' => 'Ҙ',
386
+ 'қ' => 'Қ',
387
+ 'ҝ' => 'Ҝ',
388
+ 'ҟ' => 'Ҟ',
389
+ 'ҡ' => 'Ҡ',
390
+ 'ң' => 'Ң',
391
+ 'ҥ' => 'Ҥ',
392
+ 'ҧ' => 'Ҧ',
393
+ 'ҩ' => 'Ҩ',
394
+ 'ҫ' => 'Ҫ',
395
+ 'ҭ' => 'Ҭ',
396
+ 'ү' => 'Ү',
397
+ 'ұ' => 'Ұ',
398
+ 'ҳ' => 'Ҳ',
399
+ 'ҵ' => 'Ҵ',
400
+ 'ҷ' => 'Ҷ',
401
+ 'ҹ' => 'Ҹ',
402
+ 'һ' => 'Һ',
403
+ 'ҽ' => 'Ҽ',
404
+ 'ҿ' => 'Ҿ',
405
+ 'ӂ' => 'Ӂ',
406
+ 'ӄ' => 'Ӄ',
407
+ 'ӆ' => 'Ӆ',
408
+ 'ӈ' => 'Ӈ',
409
+ 'ӊ' => 'Ӊ',
410
+ 'ӌ' => 'Ӌ',
411
+ 'ӎ' => 'Ӎ',
412
+ 'ӏ' => 'Ӏ',
413
+ 'ӑ' => 'Ӑ',
414
+ 'ӓ' => 'Ӓ',
415
+ 'ӕ' => 'Ӕ',
416
+ 'ӗ' => 'Ӗ',
417
+ 'ә' => 'Ә',
418
+ 'ӛ' => 'Ӛ',
419
+ 'ӝ' => 'Ӝ',
420
+ 'ӟ' => 'Ӟ',
421
+ 'ӡ' => 'Ӡ',
422
+ 'ӣ' => 'Ӣ',
423
+ 'ӥ' => 'Ӥ',
424
+ 'ӧ' => 'Ӧ',
425
+ 'ө' => 'Ө',
426
+ 'ӫ' => 'Ӫ',
427
+ 'ӭ' => 'Ӭ',
428
+ 'ӯ' => 'Ӯ',
429
+ 'ӱ' => 'Ӱ',
430
+ 'ӳ' => 'Ӳ',
431
+ 'ӵ' => 'Ӵ',
432
+ 'ӷ' => 'Ӷ',
433
+ 'ӹ' => 'Ӹ',
434
+ 'ӻ' => 'Ӻ',
435
+ 'ӽ' => 'Ӽ',
436
+ 'ӿ' => 'Ӿ',
437
+ 'ԁ' => 'Ԁ',
438
+ 'ԃ' => 'Ԃ',
439
+ 'ԅ' => 'Ԅ',
440
+ 'ԇ' => 'Ԇ',
441
+ 'ԉ' => 'Ԉ',
442
+ 'ԋ' => 'Ԋ',
443
+ 'ԍ' => 'Ԍ',
444
+ 'ԏ' => 'Ԏ',
445
+ 'ԑ' => 'Ԑ',
446
+ 'ԓ' => 'Ԓ',
447
+ 'ԕ' => 'Ԕ',
448
+ 'ԗ' => 'Ԗ',
449
+ 'ԙ' => 'Ԙ',
450
+ 'ԛ' => 'Ԛ',
451
+ 'ԝ' => 'Ԝ',
452
+ 'ԟ' => 'Ԟ',
453
+ 'ԡ' => 'Ԡ',
454
+ 'ԣ' => 'Ԣ',
455
+ 'ԥ' => 'Ԥ',
456
+ 'ԧ' => 'Ԧ',
457
+ 'ԩ' => 'Ԩ',
458
+ 'ԫ' => 'Ԫ',
459
+ 'ԭ' => 'Ԭ',
460
+ 'ԯ' => 'Ԯ',
461
+ 'ա' => 'Ա',
462
+ 'բ' => 'Բ',
463
+ 'գ' => 'Գ',
464
+ 'դ' => 'Դ',
465
+ 'ե' => 'Ե',
466
+ 'զ' => 'Զ',
467
+ 'է' => 'Է',
468
+ 'ը' => 'Ը',
469
+ 'թ' => 'Թ',
470
+ 'ժ' => 'Ժ',
471
+ 'ի' => 'Ի',
472
+ 'լ' => 'Լ',
473
+ 'խ' => 'Խ',
474
+ 'ծ' => 'Ծ',
475
+ 'կ' => 'Կ',
476
+ 'հ' => 'Հ',
477
+ 'ձ' => 'Ձ',
478
+ 'ղ' => 'Ղ',
479
+ 'ճ' => 'Ճ',
480
+ 'մ' => 'Մ',
481
+ 'յ' => 'Յ',
482
+ 'ն' => 'Ն',
483
+ 'շ' => 'Շ',
484
+ 'ո' => 'Ո',
485
+ 'չ' => 'Չ',
486
+ 'պ' => 'Պ',
487
+ 'ջ' => 'Ջ',
488
+ 'ռ' => 'Ռ',
489
+ 'ս' => 'Ս',
490
+ 'վ' => 'Վ',
491
+ 'տ' => 'Տ',
492
+ 'ր' => 'Ր',
493
+ 'ց' => 'Ց',
494
+ 'ւ' => 'Ւ',
495
+ 'փ' => 'Փ',
496
+ 'ք' => 'Ք',
497
+ 'օ' => 'Օ',
498
+ 'ֆ' => 'Ֆ',
499
+ 'ა' => 'Ა',
500
+ 'ბ' => 'Ბ',
501
+ 'გ' => 'Გ',
502
+ 'დ' => 'Დ',
503
+ 'ე' => 'Ე',
504
+ 'ვ' => 'Ვ',
505
+ 'ზ' => 'Ზ',
506
+ 'თ' => 'Თ',
507
+ 'ი' => 'Ი',
508
+ 'კ' => 'Კ',
509
+ 'ლ' => 'Ლ',
510
+ 'მ' => 'Მ',
511
+ 'ნ' => 'Ნ',
512
+ 'ო' => 'Ო',
513
+ 'პ' => 'Პ',
514
+ 'ჟ' => 'Ჟ',
515
+ 'რ' => 'Რ',
516
+ 'ს' => 'Ს',
517
+ 'ტ' => 'Ტ',
518
+ 'უ' => 'Უ',
519
+ 'ფ' => 'Ფ',
520
+ 'ქ' => 'Ქ',
521
+ 'ღ' => 'Ღ',
522
+ 'ყ' => 'Ყ',
523
+ 'შ' => 'Შ',
524
+ 'ჩ' => 'Ჩ',
525
+ 'ც' => 'Ც',
526
+ 'ძ' => 'Ძ',
527
+ 'წ' => 'Წ',
528
+ 'ჭ' => 'Ჭ',
529
+ 'ხ' => 'Ხ',
530
+ 'ჯ' => 'Ჯ',
531
+ 'ჰ' => 'Ჰ',
532
+ 'ჱ' => 'Ჱ',
533
+ 'ჲ' => 'Ჲ',
534
+ 'ჳ' => 'Ჳ',
535
+ 'ჴ' => 'Ჴ',
536
+ 'ჵ' => 'Ჵ',
537
+ 'ჶ' => 'Ჶ',
538
+ 'ჷ' => 'Ჷ',
539
+ 'ჸ' => 'Ჸ',
540
+ 'ჹ' => 'Ჹ',
541
+ 'ჺ' => 'Ჺ',
542
+ 'ჽ' => 'Ჽ',
543
+ 'ჾ' => 'Ჾ',
544
+ 'ჿ' => 'Ჿ',
545
+ 'ᏸ' => 'Ᏸ',
546
+ 'ᏹ' => 'Ᏹ',
547
+ 'ᏺ' => 'Ᏺ',
548
+ 'ᏻ' => 'Ᏻ',
549
+ 'ᏼ' => 'Ᏼ',
550
+ 'ᏽ' => 'Ᏽ',
551
+ 'ᲀ' => 'В',
552
+ 'ᲁ' => 'Д',
553
+ 'ᲂ' => 'О',
554
+ 'ᲃ' => 'С',
555
+ 'ᲄ' => 'Т',
556
+ 'ᲅ' => 'Т',
557
+ 'ᲆ' => 'Ъ',
558
+ 'ᲇ' => 'Ѣ',
559
+ 'ᲈ' => 'Ꙋ',
560
+ 'ᵹ' => 'Ᵹ',
561
+ 'ᵽ' => 'Ᵽ',
562
+ 'ᶎ' => 'Ᶎ',
563
+ 'ḁ' => 'Ḁ',
564
+ 'ḃ' => 'Ḃ',
565
+ 'ḅ' => 'Ḅ',
566
+ 'ḇ' => 'Ḇ',
567
+ 'ḉ' => 'Ḉ',
568
+ 'ḋ' => 'Ḋ',
569
+ 'ḍ' => 'Ḍ',
570
+ 'ḏ' => 'Ḏ',
571
+ 'ḑ' => 'Ḑ',
572
+ 'ḓ' => 'Ḓ',
573
+ 'ḕ' => 'Ḕ',
574
+ 'ḗ' => 'Ḗ',
575
+ 'ḙ' => 'Ḙ',
576
+ 'ḛ' => 'Ḛ',
577
+ 'ḝ' => 'Ḝ',
578
+ 'ḟ' => 'Ḟ',
579
+ 'ḡ' => 'Ḡ',
580
+ 'ḣ' => 'Ḣ',
581
+ 'ḥ' => 'Ḥ',
582
+ 'ḧ' => 'Ḧ',
583
+ 'ḩ' => 'Ḩ',
584
+ 'ḫ' => 'Ḫ',
585
+ 'ḭ' => 'Ḭ',
586
+ 'ḯ' => 'Ḯ',
587
+ 'ḱ' => 'Ḱ',
588
+ 'ḳ' => 'Ḳ',
589
+ 'ḵ' => 'Ḵ',
590
+ 'ḷ' => 'Ḷ',
591
+ 'ḹ' => 'Ḹ',
592
+ 'ḻ' => 'Ḻ',
593
+ 'ḽ' => 'Ḽ',
594
+ 'ḿ' => 'Ḿ',
595
+ 'ṁ' => 'Ṁ',
596
+ 'ṃ' => 'Ṃ',
597
+ 'ṅ' => 'Ṅ',
598
+ 'ṇ' => 'Ṇ',
599
+ 'ṉ' => 'Ṉ',
600
+ 'ṋ' => 'Ṋ',
601
+ 'ṍ' => 'Ṍ',
602
+ 'ṏ' => 'Ṏ',
603
+ 'ṑ' => 'Ṑ',
604
+ 'ṓ' => 'Ṓ',
605
+ 'ṕ' => 'Ṕ',
606
+ 'ṗ' => 'Ṗ',
607
+ 'ṙ' => 'Ṙ',
608
+ 'ṛ' => 'Ṛ',
609
+ 'ṝ' => 'Ṝ',
610
+ 'ṟ' => 'Ṟ',
611
+ 'ṡ' => 'Ṡ',
612
+ 'ṣ' => 'Ṣ',
613
+ 'ṥ' => 'Ṥ',
614
+ 'ṧ' => 'Ṧ',
615
+ 'ṩ' => 'Ṩ',
616
+ 'ṫ' => 'Ṫ',
617
+ 'ṭ' => 'Ṭ',
618
+ 'ṯ' => 'Ṯ',
619
+ 'ṱ' => 'Ṱ',
620
+ 'ṳ' => 'Ṳ',
621
+ 'ṵ' => 'Ṵ',
622
+ 'ṷ' => 'Ṷ',
623
+ 'ṹ' => 'Ṹ',
624
+ 'ṻ' => 'Ṻ',
625
+ 'ṽ' => 'Ṽ',
626
+ 'ṿ' => 'Ṿ',
627
+ 'ẁ' => 'Ẁ',
628
+ 'ẃ' => 'Ẃ',
629
+ 'ẅ' => 'Ẅ',
630
+ 'ẇ' => 'Ẇ',
631
+ 'ẉ' => 'Ẉ',
632
+ 'ẋ' => 'Ẋ',
633
+ 'ẍ' => 'Ẍ',
634
+ 'ẏ' => 'Ẏ',
635
+ 'ẑ' => 'Ẑ',
636
+ 'ẓ' => 'Ẓ',
637
+ 'ẕ' => 'Ẕ',
638
+ 'ẛ' => 'Ṡ',
639
+ 'ạ' => 'Ạ',
640
+ 'ả' => 'Ả',
641
+ 'ấ' => 'Ấ',
642
+ 'ầ' => 'Ầ',
643
+ 'ẩ' => 'Ẩ',
644
+ 'ẫ' => 'Ẫ',
645
+ 'ậ' => 'Ậ',
646
+ 'ắ' => 'Ắ',
647
+ 'ằ' => 'Ằ',
648
+ 'ẳ' => 'Ẳ',
649
+ 'ẵ' => 'Ẵ',
650
+ 'ặ' => 'Ặ',
651
+ 'ẹ' => 'Ẹ',
652
+ 'ẻ' => 'Ẻ',
653
+ 'ẽ' => 'Ẽ',
654
+ 'ế' => 'Ế',
655
+ 'ề' => 'Ề',
656
+ 'ể' => 'Ể',
657
+ 'ễ' => 'Ễ',
658
+ 'ệ' => 'Ệ',
659
+ 'ỉ' => 'Ỉ',
660
+ 'ị' => 'Ị',
661
+ 'ọ' => 'Ọ',
662
+ 'ỏ' => 'Ỏ',
663
+ 'ố' => 'Ố',
664
+ 'ồ' => 'Ồ',
665
+ 'ổ' => 'Ổ',
666
+ 'ỗ' => 'Ỗ',
667
+ 'ộ' => 'Ộ',
668
+ 'ớ' => 'Ớ',
669
+ 'ờ' => 'Ờ',
670
+ 'ở' => 'Ở',
671
+ 'ỡ' => 'Ỡ',
672
+ 'ợ' => 'Ợ',
673
+ 'ụ' => 'Ụ',
674
+ 'ủ' => 'Ủ',
675
+ 'ứ' => 'Ứ',
676
+ 'ừ' => 'Ừ',
677
+ 'ử' => 'Ử',
678
+ 'ữ' => 'Ữ',
679
+ 'ự' => 'Ự',
680
+ 'ỳ' => 'Ỳ',
681
+ 'ỵ' => 'Ỵ',
682
+ 'ỷ' => 'Ỷ',
683
+ 'ỹ' => 'Ỹ',
684
+ 'ỻ' => 'Ỻ',
685
+ 'ỽ' => 'Ỽ',
686
+ 'ỿ' => 'Ỿ',
687
+ 'ἀ' => 'Ἀ',
688
+ 'ἁ' => 'Ἁ',
689
+ 'ἂ' => 'Ἂ',
690
+ 'ἃ' => 'Ἃ',
691
+ 'ἄ' => 'Ἄ',
692
+ 'ἅ' => 'Ἅ',
693
+ 'ἆ' => 'Ἆ',
694
+ 'ἇ' => 'Ἇ',
695
+ 'ἐ' => 'Ἐ',
696
+ 'ἑ' => 'Ἑ',
697
+ 'ἒ' => 'Ἒ',
698
+ 'ἓ' => 'Ἓ',
699
+ 'ἔ' => 'Ἔ',
700
+ 'ἕ' => 'Ἕ',
701
+ 'ἠ' => 'Ἠ',
702
+ 'ἡ' => 'Ἡ',
703
+ 'ἢ' => 'Ἢ',
704
+ 'ἣ' => 'Ἣ',
705
+ 'ἤ' => 'Ἤ',
706
+ 'ἥ' => 'Ἥ',
707
+ 'ἦ' => 'Ἦ',
708
+ 'ἧ' => 'Ἧ',
709
+ 'ἰ' => 'Ἰ',
710
+ 'ἱ' => 'Ἱ',
711
+ 'ἲ' => 'Ἲ',
712
+ 'ἳ' => 'Ἳ',
713
+ 'ἴ' => 'Ἴ',
714
+ 'ἵ' => 'Ἵ',
715
+ 'ἶ' => 'Ἶ',
716
+ 'ἷ' => 'Ἷ',
717
+ 'ὀ' => 'Ὀ',
718
+ 'ὁ' => 'Ὁ',
719
+ 'ὂ' => 'Ὂ',
720
+ 'ὃ' => 'Ὃ',
721
+ 'ὄ' => 'Ὄ',
722
+ 'ὅ' => 'Ὅ',
723
+ 'ὑ' => 'Ὑ',
724
+ 'ὓ' => 'Ὓ',
725
+ 'ὕ' => 'Ὕ',
726
+ 'ὗ' => 'Ὗ',
727
+ 'ὠ' => 'Ὠ',
728
+ 'ὡ' => 'Ὡ',
729
+ 'ὢ' => 'Ὢ',
730
+ 'ὣ' => 'Ὣ',
731
+ 'ὤ' => 'Ὤ',
732
+ 'ὥ' => 'Ὥ',
733
+ 'ὦ' => 'Ὦ',
734
+ 'ὧ' => 'Ὧ',
735
+ 'ὰ' => 'Ὰ',
736
+ 'ά' => 'Ά',
737
+ 'ὲ' => 'Ὲ',
738
+ 'έ' => 'Έ',
739
+ 'ὴ' => 'Ὴ',
740
+ 'ή' => 'Ή',
741
+ 'ὶ' => 'Ὶ',
742
+ 'ί' => 'Ί',
743
+ 'ὸ' => 'Ὸ',
744
+ 'ό' => 'Ό',
745
+ 'ὺ' => 'Ὺ',
746
+ 'ύ' => 'Ύ',
747
+ 'ὼ' => 'Ὼ',
748
+ 'ώ' => 'Ώ',
749
+ 'ᾀ' => 'ᾈ',
750
+ 'ᾁ' => 'ᾉ',
751
+ 'ᾂ' => 'ᾊ',
752
+ 'ᾃ' => 'ᾋ',
753
+ 'ᾄ' => 'ᾌ',
754
+ 'ᾅ' => 'ᾍ',
755
+ 'ᾆ' => 'ᾎ',
756
+ 'ᾇ' => 'ᾏ',
757
+ 'ᾐ' => 'ᾘ',
758
+ 'ᾑ' => 'ᾙ',
759
+ 'ᾒ' => 'ᾚ',
760
+ 'ᾓ' => 'ᾛ',
761
+ 'ᾔ' => 'ᾜ',
762
+ 'ᾕ' => 'ᾝ',
763
+ 'ᾖ' => 'ᾞ',
764
+ 'ᾗ' => 'ᾟ',
765
+ 'ᾠ' => 'ᾨ',
766
+ 'ᾡ' => 'ᾩ',
767
+ 'ᾢ' => 'ᾪ',
768
+ 'ᾣ' => 'ᾫ',
769
+ 'ᾤ' => 'ᾬ',
770
+ 'ᾥ' => 'ᾭ',
771
+ 'ᾦ' => 'ᾮ',
772
+ 'ᾧ' => 'ᾯ',
773
+ 'ᾰ' => 'Ᾰ',
774
+ 'ᾱ' => 'Ᾱ',
775
+ 'ᾳ' => 'ᾼ',
776
+ 'ι' => 'Ι',
777
+ 'ῃ' => 'ῌ',
778
+ 'ῐ' => 'Ῐ',
779
+ 'ῑ' => 'Ῑ',
780
+ 'ῠ' => 'Ῠ',
781
+ 'ῡ' => 'Ῡ',
782
+ 'ῥ' => 'Ῥ',
783
+ 'ῳ' => 'ῼ',
784
+ 'ⅎ' => 'Ⅎ',
785
+ 'ⅰ' => 'Ⅰ',
786
+ 'ⅱ' => 'Ⅱ',
787
+ 'ⅲ' => 'Ⅲ',
788
+ 'ⅳ' => 'Ⅳ',
789
+ 'ⅴ' => 'Ⅴ',
790
+ 'ⅵ' => 'Ⅵ',
791
+ 'ⅶ' => 'Ⅶ',
792
+ 'ⅷ' => 'Ⅷ',
793
+ 'ⅸ' => 'Ⅸ',
794
+ 'ⅹ' => 'Ⅹ',
795
+ 'ⅺ' => 'Ⅺ',
796
+ 'ⅻ' => 'Ⅻ',
797
+ 'ⅼ' => 'Ⅼ',
798
+ 'ⅽ' => 'Ⅽ',
799
+ 'ⅾ' => 'Ⅾ',
800
+ 'ⅿ' => 'Ⅿ',
801
+ 'ↄ' => 'Ↄ',
802
+ 'ⓐ' => 'Ⓐ',
803
+ 'ⓑ' => 'Ⓑ',
804
+ 'ⓒ' => 'Ⓒ',
805
+ 'ⓓ' => 'Ⓓ',
806
+ 'ⓔ' => 'Ⓔ',
807
+ 'ⓕ' => 'Ⓕ',
808
+ 'ⓖ' => 'Ⓖ',
809
+ 'ⓗ' => 'Ⓗ',
810
+ 'ⓘ' => 'Ⓘ',
811
+ 'ⓙ' => 'Ⓙ',
812
+ 'ⓚ' => 'Ⓚ',
813
+ 'ⓛ' => 'Ⓛ',
814
+ 'ⓜ' => 'Ⓜ',
815
+ 'ⓝ' => 'Ⓝ',
816
+ 'ⓞ' => 'Ⓞ',
817
+ 'ⓟ' => 'Ⓟ',
818
+ 'ⓠ' => 'Ⓠ',
819
+ 'ⓡ' => 'Ⓡ',
820
+ 'ⓢ' => 'Ⓢ',
821
+ 'ⓣ' => 'Ⓣ',
822
+ 'ⓤ' => 'Ⓤ',
823
+ 'ⓥ' => 'Ⓥ',
824
+ 'ⓦ' => 'Ⓦ',
825
+ 'ⓧ' => 'Ⓧ',
826
+ 'ⓨ' => 'Ⓨ',
827
+ 'ⓩ' => 'Ⓩ',
828
+ 'ⰰ' => 'Ⰰ',
829
+ 'ⰱ' => 'Ⰱ',
830
+ 'ⰲ' => 'Ⰲ',
831
+ 'ⰳ' => 'Ⰳ',
832
+ 'ⰴ' => 'Ⰴ',
833
+ 'ⰵ' => 'Ⰵ',
834
+ 'ⰶ' => 'Ⰶ',
835
+ 'ⰷ' => 'Ⰷ',
836
+ 'ⰸ' => 'Ⰸ',
837
+ 'ⰹ' => 'Ⰹ',
838
+ 'ⰺ' => 'Ⰺ',
839
+ 'ⰻ' => 'Ⰻ',
840
+ 'ⰼ' => 'Ⰼ',
841
+ 'ⰽ' => 'Ⰽ',
842
+ 'ⰾ' => 'Ⰾ',
843
+ 'ⰿ' => 'Ⰿ',
844
+ 'ⱀ' => 'Ⱀ',
845
+ 'ⱁ' => 'Ⱁ',
846
+ 'ⱂ' => 'Ⱂ',
847
+ 'ⱃ' => 'Ⱃ',
848
+ 'ⱄ' => 'Ⱄ',
849
+ 'ⱅ' => 'Ⱅ',
850
+ 'ⱆ' => 'Ⱆ',
851
+ 'ⱇ' => 'Ⱇ',
852
+ 'ⱈ' => 'Ⱈ',
853
+ 'ⱉ' => 'Ⱉ',
854
+ 'ⱊ' => 'Ⱊ',
855
+ 'ⱋ' => 'Ⱋ',
856
+ 'ⱌ' => 'Ⱌ',
857
+ 'ⱍ' => 'Ⱍ',
858
+ 'ⱎ' => 'Ⱎ',
859
+ 'ⱏ' => 'Ⱏ',
860
+ 'ⱐ' => 'Ⱐ',
861
+ 'ⱑ' => 'Ⱑ',
862
+ 'ⱒ' => 'Ⱒ',
863
+ 'ⱓ' => 'Ⱓ',
864
+ 'ⱔ' => 'Ⱔ',
865
+ 'ⱕ' => 'Ⱕ',
866
+ 'ⱖ' => 'Ⱖ',
867
+ 'ⱗ' => 'Ⱗ',
868
+ 'ⱘ' => 'Ⱘ',
869
+ 'ⱙ' => 'Ⱙ',
870
+ 'ⱚ' => 'Ⱚ',
871
+ 'ⱛ' => 'Ⱛ',
872
+ 'ⱜ' => 'Ⱜ',
873
+ 'ⱝ' => 'Ⱝ',
874
+ 'ⱞ' => 'Ⱞ',
875
+ 'ⱡ' => 'Ⱡ',
876
+ 'ⱥ' => 'Ⱥ',
877
+ 'ⱦ' => 'Ⱦ',
878
+ 'ⱨ' => 'Ⱨ',
879
+ 'ⱪ' => 'Ⱪ',
880
+ 'ⱬ' => 'Ⱬ',
881
+ 'ⱳ' => 'Ⱳ',
882
+ 'ⱶ' => 'Ⱶ',
883
+ 'ⲁ' => 'Ⲁ',
884
+ 'ⲃ' => 'Ⲃ',
885
+ 'ⲅ' => 'Ⲅ',
886
+ 'ⲇ' => 'Ⲇ',
887
+ 'ⲉ' => 'Ⲉ',
888
+ 'ⲋ' => 'Ⲋ',
889
+ 'ⲍ' => 'Ⲍ',
890
+ 'ⲏ' => 'Ⲏ',
891
+ 'ⲑ' => 'Ⲑ',
892
+ 'ⲓ' => 'Ⲓ',
893
+ 'ⲕ' => 'Ⲕ',
894
+ 'ⲗ' => 'Ⲗ',
895
+ 'ⲙ' => 'Ⲙ',
896
+ 'ⲛ' => 'Ⲛ',
897
+ 'ⲝ' => 'Ⲝ',
898
+ 'ⲟ' => 'Ⲟ',
899
+ 'ⲡ' => 'Ⲡ',
900
+ 'ⲣ' => 'Ⲣ',
901
+ 'ⲥ' => 'Ⲥ',
902
+ 'ⲧ' => 'Ⲧ',
903
+ 'ⲩ' => 'Ⲩ',
904
+ 'ⲫ' => 'Ⲫ',
905
+ 'ⲭ' => 'Ⲭ',
906
+ 'ⲯ' => 'Ⲯ',
907
+ 'ⲱ' => 'Ⲱ',
908
+ 'ⲳ' => 'Ⲳ',
909
+ 'ⲵ' => 'Ⲵ',
910
+ 'ⲷ' => 'Ⲷ',
911
+ 'ⲹ' => 'Ⲹ',
912
+ 'ⲻ' => 'Ⲻ',
913
+ 'ⲽ' => 'Ⲽ',
914
+ 'ⲿ' => 'Ⲿ',
915
+ 'ⳁ' => 'Ⳁ',
916
+ 'ⳃ' => 'Ⳃ',
917
+ 'ⳅ' => 'Ⳅ',
918
+ 'ⳇ' => 'Ⳇ',
919
+ 'ⳉ' => 'Ⳉ',
920
+ 'ⳋ' => 'Ⳋ',
921
+ 'ⳍ' => 'Ⳍ',
922
+ 'ⳏ' => 'Ⳏ',
923
+ 'ⳑ' => 'Ⳑ',
924
+ 'ⳓ' => 'Ⳓ',
925
+ 'ⳕ' => 'Ⳕ',
926
+ 'ⳗ' => 'Ⳗ',
927
+ 'ⳙ' => 'Ⳙ',
928
+ 'ⳛ' => 'Ⳛ',
929
+ 'ⳝ' => 'Ⳝ',
930
+ 'ⳟ' => 'Ⳟ',
931
+ 'ⳡ' => 'Ⳡ',
932
+ 'ⳣ' => 'Ⳣ',
933
+ 'ⳬ' => 'Ⳬ',
934
+ 'ⳮ' => 'Ⳮ',
935
+ 'ⳳ' => 'Ⳳ',
936
+ 'ⴀ' => 'Ⴀ',
937
+ 'ⴁ' => 'Ⴁ',
938
+ 'ⴂ' => 'Ⴂ',
939
+ 'ⴃ' => 'Ⴃ',
940
+ 'ⴄ' => 'Ⴄ',
941
+ 'ⴅ' => 'Ⴅ',
942
+ 'ⴆ' => 'Ⴆ',
943
+ 'ⴇ' => 'Ⴇ',
944
+ 'ⴈ' => 'Ⴈ',
945
+ 'ⴉ' => 'Ⴉ',
946
+ 'ⴊ' => 'Ⴊ',
947
+ 'ⴋ' => 'Ⴋ',
948
+ 'ⴌ' => 'Ⴌ',
949
+ 'ⴍ' => 'Ⴍ',
950
+ 'ⴎ' => 'Ⴎ',
951
+ 'ⴏ' => 'Ⴏ',
952
+ 'ⴐ' => 'Ⴐ',
953
+ 'ⴑ' => 'Ⴑ',
954
+ 'ⴒ' => 'Ⴒ',
955
+ 'ⴓ' => 'Ⴓ',
956
+ 'ⴔ' => 'Ⴔ',
957
+ 'ⴕ' => 'Ⴕ',
958
+ 'ⴖ' => 'Ⴖ',
959
+ 'ⴗ' => 'Ⴗ',
960
+ 'ⴘ' => 'Ⴘ',
961
+ 'ⴙ' => 'Ⴙ',
962
+ 'ⴚ' => 'Ⴚ',
963
+ 'ⴛ' => 'Ⴛ',
964
+ 'ⴜ' => 'Ⴜ',
965
+ 'ⴝ' => 'Ⴝ',
966
+ 'ⴞ' => 'Ⴞ',
967
+ 'ⴟ' => 'Ⴟ',
968
+ 'ⴠ' => 'Ⴠ',
969
+ 'ⴡ' => 'Ⴡ',
970
+ 'ⴢ' => 'Ⴢ',
971
+ 'ⴣ' => 'Ⴣ',
972
+ 'ⴤ' => 'Ⴤ',
973
+ 'ⴥ' => 'Ⴥ',
974
+ 'ⴧ' => 'Ⴧ',
975
+ 'ⴭ' => 'Ⴭ',
976
+ 'ꙁ' => 'Ꙁ',
977
+ 'ꙃ' => 'Ꙃ',
978
+ 'ꙅ' => 'Ꙅ',
979
+ 'ꙇ' => 'Ꙇ',
980
+ 'ꙉ' => 'Ꙉ',
981
+ 'ꙋ' => 'Ꙋ',
982
+ 'ꙍ' => 'Ꙍ',
983
+ 'ꙏ' => 'Ꙏ',
984
+ 'ꙑ' => 'Ꙑ',
985
+ 'ꙓ' => 'Ꙓ',
986
+ 'ꙕ' => 'Ꙕ',
987
+ 'ꙗ' => 'Ꙗ',
988
+ 'ꙙ' => 'Ꙙ',
989
+ 'ꙛ' => 'Ꙛ',
990
+ 'ꙝ' => 'Ꙝ',
991
+ 'ꙟ' => 'Ꙟ',
992
+ 'ꙡ' => 'Ꙡ',
993
+ 'ꙣ' => 'Ꙣ',
994
+ 'ꙥ' => 'Ꙥ',
995
+ 'ꙧ' => 'Ꙧ',
996
+ 'ꙩ' => 'Ꙩ',
997
+ 'ꙫ' => 'Ꙫ',
998
+ 'ꙭ' => 'Ꙭ',
999
+ 'ꚁ' => 'Ꚁ',
1000
+ 'ꚃ' => 'Ꚃ',
1001
+ 'ꚅ' => 'Ꚅ',
1002
+ 'ꚇ' => 'Ꚇ',
1003
+ 'ꚉ' => 'Ꚉ',
1004
+ 'ꚋ' => 'Ꚋ',
1005
+ 'ꚍ' => 'Ꚍ',
1006
+ 'ꚏ' => 'Ꚏ',
1007
+ 'ꚑ' => 'Ꚑ',
1008
+ 'ꚓ' => 'Ꚓ',
1009
+ 'ꚕ' => 'Ꚕ',
1010
+ 'ꚗ' => 'Ꚗ',
1011
+ 'ꚙ' => 'Ꚙ',
1012
+ 'ꚛ' => 'Ꚛ',
1013
+ 'ꜣ' => 'Ꜣ',
1014
+ 'ꜥ' => 'Ꜥ',
1015
+ 'ꜧ' => 'Ꜧ',
1016
+ 'ꜩ' => 'Ꜩ',
1017
+ 'ꜫ' => 'Ꜫ',
1018
+ 'ꜭ' => 'Ꜭ',
1019
+ 'ꜯ' => 'Ꜯ',
1020
+ 'ꜳ' => 'Ꜳ',
1021
+ 'ꜵ' => 'Ꜵ',
1022
+ 'ꜷ' => 'Ꜷ',
1023
+ 'ꜹ' => 'Ꜹ',
1024
+ 'ꜻ' => 'Ꜻ',
1025
+ 'ꜽ' => 'Ꜽ',
1026
+ 'ꜿ' => 'Ꜿ',
1027
+ 'ꝁ' => 'Ꝁ',
1028
+ 'ꝃ' => 'Ꝃ',
1029
+ 'ꝅ' => 'Ꝅ',
1030
+ 'ꝇ' => 'Ꝇ',
1031
+ 'ꝉ' => 'Ꝉ',
1032
+ 'ꝋ' => 'Ꝋ',
1033
+ 'ꝍ' => 'Ꝍ',
1034
+ 'ꝏ' => 'Ꝏ',
1035
+ 'ꝑ' => 'Ꝑ',
1036
+ 'ꝓ' => 'Ꝓ',
1037
+ 'ꝕ' => 'Ꝕ',
1038
+ 'ꝗ' => 'Ꝗ',
1039
+ 'ꝙ' => 'Ꝙ',
1040
+ 'ꝛ' => 'Ꝛ',
1041
+ 'ꝝ' => 'Ꝝ',
1042
+ 'ꝟ' => 'Ꝟ',
1043
+ 'ꝡ' => 'Ꝡ',
1044
+ 'ꝣ' => 'Ꝣ',
1045
+ 'ꝥ' => 'Ꝥ',
1046
+ 'ꝧ' => 'Ꝧ',
1047
+ 'ꝩ' => 'Ꝩ',
1048
+ 'ꝫ' => 'Ꝫ',
1049
+ 'ꝭ' => 'Ꝭ',
1050
+ 'ꝯ' => 'Ꝯ',
1051
+ 'ꝺ' => 'Ꝺ',
1052
+ 'ꝼ' => 'Ꝼ',
1053
+ 'ꝿ' => 'Ꝿ',
1054
+ 'ꞁ' => 'Ꞁ',
1055
+ 'ꞃ' => 'Ꞃ',
1056
+ 'ꞅ' => 'Ꞅ',
1057
+ 'ꞇ' => 'Ꞇ',
1058
+ 'ꞌ' => 'Ꞌ',
1059
+ 'ꞑ' => 'Ꞑ',
1060
+ 'ꞓ' => 'Ꞓ',
1061
+ 'ꞔ' => 'Ꞔ',
1062
+ 'ꞗ' => 'Ꞗ',
1063
+ 'ꞙ' => 'Ꞙ',
1064
+ 'ꞛ' => 'Ꞛ',
1065
+ 'ꞝ' => 'Ꞝ',
1066
+ 'ꞟ' => 'Ꞟ',
1067
+ 'ꞡ' => 'Ꞡ',
1068
+ 'ꞣ' => 'Ꞣ',
1069
+ 'ꞥ' => 'Ꞥ',
1070
+ 'ꞧ' => 'Ꞧ',
1071
+ 'ꞩ' => 'Ꞩ',
1072
+ 'ꞵ' => 'Ꞵ',
1073
+ 'ꞷ' => 'Ꞷ',
1074
+ 'ꞹ' => 'Ꞹ',
1075
+ 'ꞻ' => 'Ꞻ',
1076
+ 'ꞽ' => 'Ꞽ',
1077
+ 'ꞿ' => 'Ꞿ',
1078
+ 'ꟃ' => 'Ꟃ',
1079
+ 'ꟈ' => 'Ꟈ',
1080
+ 'ꟊ' => 'Ꟊ',
1081
+ 'ꟶ' => 'Ꟶ',
1082
+ 'ꭓ' => 'Ꭓ',
1083
+ 'ꭰ' => 'Ꭰ',
1084
+ 'ꭱ' => 'Ꭱ',
1085
+ 'ꭲ' => 'Ꭲ',
1086
+ 'ꭳ' => 'Ꭳ',
1087
+ 'ꭴ' => 'Ꭴ',
1088
+ 'ꭵ' => 'Ꭵ',
1089
+ 'ꭶ' => 'Ꭶ',
1090
+ 'ꭷ' => 'Ꭷ',
1091
+ 'ꭸ' => 'Ꭸ',
1092
+ 'ꭹ' => 'Ꭹ',
1093
+ 'ꭺ' => 'Ꭺ',
1094
+ 'ꭻ' => 'Ꭻ',
1095
+ 'ꭼ' => 'Ꭼ',
1096
+ 'ꭽ' => 'Ꭽ',
1097
+ 'ꭾ' => 'Ꭾ',
1098
+ 'ꭿ' => 'Ꭿ',
1099
+ 'ꮀ' => 'Ꮀ',
1100
+ 'ꮁ' => 'Ꮁ',
1101
+ 'ꮂ' => 'Ꮂ',
1102
+ 'ꮃ' => 'Ꮃ',
1103
+ 'ꮄ' => 'Ꮄ',
1104
+ 'ꮅ' => 'Ꮅ',
1105
+ 'ꮆ' => 'Ꮆ',
1106
+ 'ꮇ' => 'Ꮇ',
1107
+ 'ꮈ' => 'Ꮈ',
1108
+ 'ꮉ' => 'Ꮉ',
1109
+ 'ꮊ' => 'Ꮊ',
1110
+ 'ꮋ' => 'Ꮋ',
1111
+ 'ꮌ' => 'Ꮌ',
1112
+ 'ꮍ' => 'Ꮍ',
1113
+ 'ꮎ' => 'Ꮎ',
1114
+ 'ꮏ' => 'Ꮏ',
1115
+ 'ꮐ' => 'Ꮐ',
1116
+ 'ꮑ' => 'Ꮑ',
1117
+ 'ꮒ' => 'Ꮒ',
1118
+ 'ꮓ' => 'Ꮓ',
1119
+ 'ꮔ' => 'Ꮔ',
1120
+ 'ꮕ' => 'Ꮕ',
1121
+ 'ꮖ' => 'Ꮖ',
1122
+ 'ꮗ' => 'Ꮗ',
1123
+ 'ꮘ' => 'Ꮘ',
1124
+ 'ꮙ' => 'Ꮙ',
1125
+ 'ꮚ' => 'Ꮚ',
1126
+ 'ꮛ' => 'Ꮛ',
1127
+ 'ꮜ' => 'Ꮜ',
1128
+ 'ꮝ' => 'Ꮝ',
1129
+ 'ꮞ' => 'Ꮞ',
1130
+ 'ꮟ' => 'Ꮟ',
1131
+ 'ꮠ' => 'Ꮠ',
1132
+ 'ꮡ' => 'Ꮡ',
1133
+ 'ꮢ' => 'Ꮢ',
1134
+ 'ꮣ' => 'Ꮣ',
1135
+ 'ꮤ' => 'Ꮤ',
1136
+ 'ꮥ' => 'Ꮥ',
1137
+ 'ꮦ' => 'Ꮦ',
1138
+ 'ꮧ' => 'Ꮧ',
1139
+ 'ꮨ' => 'Ꮨ',
1140
+ 'ꮩ' => 'Ꮩ',
1141
+ 'ꮪ' => 'Ꮪ',
1142
+ 'ꮫ' => 'Ꮫ',
1143
+ 'ꮬ' => 'Ꮬ',
1144
+ 'ꮭ' => 'Ꮭ',
1145
+ 'ꮮ' => 'Ꮮ',
1146
+ 'ꮯ' => 'Ꮯ',
1147
+ 'ꮰ' => 'Ꮰ',
1148
+ 'ꮱ' => 'Ꮱ',
1149
+ 'ꮲ' => 'Ꮲ',
1150
+ 'ꮳ' => 'Ꮳ',
1151
+ 'ꮴ' => 'Ꮴ',
1152
+ 'ꮵ' => 'Ꮵ',
1153
+ 'ꮶ' => 'Ꮶ',
1154
+ 'ꮷ' => 'Ꮷ',
1155
+ 'ꮸ' => 'Ꮸ',
1156
+ 'ꮹ' => 'Ꮹ',
1157
+ 'ꮺ' => 'Ꮺ',
1158
+ 'ꮻ' => 'Ꮻ',
1159
+ 'ꮼ' => 'Ꮼ',
1160
+ 'ꮽ' => 'Ꮽ',
1161
+ 'ꮾ' => 'Ꮾ',
1162
+ 'ꮿ' => 'Ꮿ',
1163
+ 'a' => 'A',
1164
+ 'b' => 'B',
1165
+ 'c' => 'C',
1166
+ 'd' => 'D',
1167
+ 'e' => 'E',
1168
+ 'f' => 'F',
1169
+ 'g' => 'G',
1170
+ 'h' => 'H',
1171
+ 'i' => 'I',
1172
+ 'j' => 'J',
1173
+ 'k' => 'K',
1174
+ 'l' => 'L',
1175
+ 'm' => 'M',
1176
+ 'n' => 'N',
1177
+ 'o' => 'O',
1178
+ 'p' => 'P',
1179
+ 'q' => 'Q',
1180
+ 'r' => 'R',
1181
+ 's' => 'S',
1182
+ 't' => 'T',
1183
+ 'u' => 'U',
1184
+ 'v' => 'V',
1185
+ 'w' => 'W',
1186
+ 'x' => 'X',
1187
+ 'y' => 'Y',
1188
+ 'z' => 'Z',
1189
+ '𐐨' => '𐐀',
1190
+ '𐐩' => '𐐁',
1191
+ '𐐪' => '𐐂',
1192
+ '𐐫' => '𐐃',
1193
+ '𐐬' => '𐐄',
1194
+ '𐐭' => '𐐅',
1195
+ '𐐮' => '𐐆',
1196
+ '𐐯' => '𐐇',
1197
+ '𐐰' => '𐐈',
1198
+ '𐐱' => '𐐉',
1199
+ '𐐲' => '𐐊',
1200
+ '𐐳' => '𐐋',
1201
+ '𐐴' => '𐐌',
1202
+ '𐐵' => '𐐍',
1203
+ '𐐶' => '𐐎',
1204
+ '𐐷' => '𐐏',
1205
+ '𐐸' => '𐐐',
1206
+ '𐐹' => '𐐑',
1207
+ '𐐺' => '𐐒',
1208
+ '𐐻' => '𐐓',
1209
+ '𐐼' => '𐐔',
1210
+ '𐐽' => '𐐕',
1211
+ '𐐾' => '𐐖',
1212
+ '𐐿' => '𐐗',
1213
+ '𐑀' => '𐐘',
1214
+ '𐑁' => '𐐙',
1215
+ '𐑂' => '𐐚',
1216
+ '𐑃' => '𐐛',
1217
+ '𐑄' => '𐐜',
1218
+ '𐑅' => '𐐝',
1219
+ '𐑆' => '𐐞',
1220
+ '𐑇' => '𐐟',
1221
+ '𐑈' => '𐐠',
1222
+ '𐑉' => '𐐡',
1223
+ '𐑊' => '𐐢',
1224
+ '𐑋' => '𐐣',
1225
+ '𐑌' => '𐐤',
1226
+ '𐑍' => '𐐥',
1227
+ '𐑎' => '𐐦',
1228
+ '𐑏' => '𐐧',
1229
+ '𐓘' => '𐒰',
1230
+ '𐓙' => '𐒱',
1231
+ '𐓚' => '𐒲',
1232
+ '𐓛' => '𐒳',
1233
+ '𐓜' => '𐒴',
1234
+ '𐓝' => '𐒵',
1235
+ '𐓞' => '𐒶',
1236
+ '𐓟' => '𐒷',
1237
+ '𐓠' => '𐒸',
1238
+ '𐓡' => '𐒹',
1239
+ '𐓢' => '𐒺',
1240
+ '𐓣' => '𐒻',
1241
+ '𐓤' => '𐒼',
1242
+ '𐓥' => '𐒽',
1243
+ '𐓦' => '𐒾',
1244
+ '𐓧' => '𐒿',
1245
+ '𐓨' => '𐓀',
1246
+ '𐓩' => '𐓁',
1247
+ '𐓪' => '𐓂',
1248
+ '𐓫' => '𐓃',
1249
+ '𐓬' => '𐓄',
1250
+ '𐓭' => '𐓅',
1251
+ '𐓮' => '𐓆',
1252
+ '𐓯' => '𐓇',
1253
+ '𐓰' => '𐓈',
1254
+ '𐓱' => '𐓉',
1255
+ '𐓲' => '𐓊',
1256
+ '𐓳' => '𐓋',
1257
+ '𐓴' => '𐓌',
1258
+ '𐓵' => '𐓍',
1259
+ '𐓶' => '𐓎',
1260
+ '𐓷' => '𐓏',
1261
+ '𐓸' => '𐓐',
1262
+ '𐓹' => '𐓑',
1263
+ '𐓺' => '𐓒',
1264
+ '𐓻' => '𐓓',
1265
+ '𐳀' => '𐲀',
1266
+ '𐳁' => '𐲁',
1267
+ '𐳂' => '𐲂',
1268
+ '𐳃' => '𐲃',
1269
+ '𐳄' => '𐲄',
1270
+ '𐳅' => '𐲅',
1271
+ '𐳆' => '𐲆',
1272
+ '𐳇' => '𐲇',
1273
+ '𐳈' => '𐲈',
1274
+ '𐳉' => '𐲉',
1275
+ '𐳊' => '𐲊',
1276
+ '𐳋' => '𐲋',
1277
+ '𐳌' => '𐲌',
1278
+ '𐳍' => '𐲍',
1279
+ '𐳎' => '𐲎',
1280
+ '𐳏' => '𐲏',
1281
+ '𐳐' => '𐲐',
1282
+ '𐳑' => '𐲑',
1283
+ '𐳒' => '𐲒',
1284
+ '𐳓' => '𐲓',
1285
+ '𐳔' => '𐲔',
1286
+ '𐳕' => '𐲕',
1287
+ '𐳖' => '𐲖',
1288
+ '𐳗' => '𐲗',
1289
+ '𐳘' => '𐲘',
1290
+ '𐳙' => '𐲙',
1291
+ '𐳚' => '𐲚',
1292
+ '𐳛' => '𐲛',
1293
+ '𐳜' => '𐲜',
1294
+ '𐳝' => '𐲝',
1295
+ '𐳞' => '𐲞',
1296
+ '𐳟' => '𐲟',
1297
+ '𐳠' => '𐲠',
1298
+ '𐳡' => '𐲡',
1299
+ '𐳢' => '𐲢',
1300
+ '𐳣' => '𐲣',
1301
+ '𐳤' => '𐲤',
1302
+ '𐳥' => '𐲥',
1303
+ '𐳦' => '𐲦',
1304
+ '𐳧' => '𐲧',
1305
+ '𐳨' => '𐲨',
1306
+ '𐳩' => '𐲩',
1307
+ '𐳪' => '𐲪',
1308
+ '𐳫' => '𐲫',
1309
+ '𐳬' => '𐲬',
1310
+ '𐳭' => '𐲭',
1311
+ '𐳮' => '𐲮',
1312
+ '𐳯' => '𐲯',
1313
+ '𐳰' => '𐲰',
1314
+ '𐳱' => '𐲱',
1315
+ '𐳲' => '𐲲',
1316
+ '𑣀' => '𑢠',
1317
+ '𑣁' => '𑢡',
1318
+ '𑣂' => '𑢢',
1319
+ '𑣃' => '𑢣',
1320
+ '𑣄' => '𑢤',
1321
+ '𑣅' => '𑢥',
1322
+ '𑣆' => '𑢦',
1323
+ '𑣇' => '𑢧',
1324
+ '𑣈' => '𑢨',
1325
+ '𑣉' => '𑢩',
1326
+ '𑣊' => '𑢪',
1327
+ '𑣋' => '𑢫',
1328
+ '𑣌' => '𑢬',
1329
+ '𑣍' => '𑢭',
1330
+ '𑣎' => '𑢮',
1331
+ '𑣏' => '𑢯',
1332
+ '𑣐' => '𑢰',
1333
+ '𑣑' => '𑢱',
1334
+ '𑣒' => '𑢲',
1335
+ '𑣓' => '𑢳',
1336
+ '𑣔' => '𑢴',
1337
+ '𑣕' => '𑢵',
1338
+ '𑣖' => '𑢶',
1339
+ '𑣗' => '𑢷',
1340
+ '𑣘' => '𑢸',
1341
+ '𑣙' => '𑢹',
1342
+ '𑣚' => '𑢺',
1343
+ '𑣛' => '𑢻',
1344
+ '𑣜' => '𑢼',
1345
+ '𑣝' => '𑢽',
1346
+ '𑣞' => '𑢾',
1347
+ '𑣟' => '𑢿',
1348
+ '𖹠' => '𖹀',
1349
+ '𖹡' => '𖹁',
1350
+ '𖹢' => '𖹂',
1351
+ '𖹣' => '𖹃',
1352
+ '𖹤' => '𖹄',
1353
+ '𖹥' => '𖹅',
1354
+ '𖹦' => '𖹆',
1355
+ '𖹧' => '𖹇',
1356
+ '𖹨' => '𖹈',
1357
+ '𖹩' => '𖹉',
1358
+ '𖹪' => '𖹊',
1359
+ '𖹫' => '𖹋',
1360
+ '𖹬' => '𖹌',
1361
+ '𖹭' => '𖹍',
1362
+ '𖹮' => '𖹎',
1363
+ '𖹯' => '𖹏',
1364
+ '𖹰' => '𖹐',
1365
+ '𖹱' => '𖹑',
1366
+ '𖹲' => '𖹒',
1367
+ '𖹳' => '𖹓',
1368
+ '𖹴' => '𖹔',
1369
+ '𖹵' => '𖹕',
1370
+ '𖹶' => '𖹖',
1371
+ '𖹷' => '𖹗',
1372
+ '𖹸' => '𖹘',
1373
+ '𖹹' => '𖹙',
1374
+ '𖹺' => '𖹚',
1375
+ '𖹻' => '𖹛',
1376
+ '𖹼' => '𖹜',
1377
+ '𖹽' => '𖹝',
1378
+ '𖹾' => '𖹞',
1379
+ '𖹿' => '𖹟',
1380
+ '𞤢' => '𞤀',
1381
+ '𞤣' => '𞤁',
1382
+ '𞤤' => '𞤂',
1383
+ '𞤥' => '𞤃',
1384
+ '𞤦' => '𞤄',
1385
+ '𞤧' => '𞤅',
1386
+ '𞤨' => '𞤆',
1387
+ '𞤩' => '𞤇',
1388
+ '𞤪' => '𞤈',
1389
+ '𞤫' => '𞤉',
1390
+ '𞤬' => '𞤊',
1391
+ '𞤭' => '𞤋',
1392
+ '𞤮' => '𞤌',
1393
+ '𞤯' => '𞤍',
1394
+ '𞤰' => '𞤎',
1395
+ '𞤱' => '𞤏',
1396
+ '𞤲' => '𞤐',
1397
+ '𞤳' => '𞤑',
1398
+ '𞤴' => '𞤒',
1399
+ '𞤵' => '𞤓',
1400
+ '𞤶' => '𞤔',
1401
+ '𞤷' => '𞤕',
1402
+ '𞤸' => '𞤖',
1403
+ '𞤹' => '𞤗',
1404
+ '𞤺' => '𞤘',
1405
+ '𞤻' => '𞤙',
1406
+ '𞤼' => '𞤚',
1407
+ '𞤽' => '𞤛',
1408
+ '𞤾' => '𞤜',
1409
+ '𞤿' => '𞤝',
1410
+ '𞥀' => '𞤞',
1411
+ '𞥁' => '𞤟',
1412
+ '𞥂' => '𞤠',
1413
+ '𞥃' => '𞤡',
1414
+ );
vendor/symfony/polyfill-mbstring/bootstrap.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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_convert_encoding')) {
15
+ function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
16
+ }
17
+ if (!function_exists('mb_decode_mimeheader')) {
18
+ function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
19
+ }
20
+ if (!function_exists('mb_encode_mimeheader')) {
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
+ }
23
+ if (!function_exists('mb_decode_numericentity')) {
24
+ function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }
25
+ }
26
+ if (!function_exists('mb_encode_numericentity')) {
27
+ function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }
28
+ }
29
+ if (!function_exists('mb_convert_case')) {
30
+ function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
31
+ }
32
+ if (!function_exists('mb_internal_encoding')) {
33
+ function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
34
+ }
35
+ if (!function_exists('mb_language')) {
36
+ function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
37
+ }
38
+ if (!function_exists('mb_list_encodings')) {
39
+ function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
40
+ }
41
+ if (!function_exists('mb_encoding_aliases')) {
42
+ function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
43
+ }
44
+ if (!function_exists('mb_check_encoding')) {
45
+ function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
46
+ }
47
+ if (!function_exists('mb_detect_encoding')) {
48
+ function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
49
+ }
50
+ if (!function_exists('mb_detect_order')) {
51
+ function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
52
+ }
53
+ if (!function_exists('mb_parse_str')) {
54
+ function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
55
+ }
56
+ if (!function_exists('mb_strlen')) {
57
+ function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
58
+ }
59
+ if (!function_exists('mb_strpos')) {
60
+ function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
61
+ }
62
+ if (!function_exists('mb_strtolower')) {
63
+ function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
64
+ }
65
+ if (!function_exists('mb_strtoupper')) {
66
+ function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
67
+ }
68
+ if (!function_exists('mb_substitute_character')) {
69
+ function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
70
+ }
71
+ if (!function_exists('mb_substr')) {
72
+ function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
73
+ }
74
+ if (!function_exists('mb_stripos')) {
75
+ function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
76
+ }
77
+ if (!function_exists('mb_stristr')) {
78
+ function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
79
+ }
80
+ if (!function_exists('mb_strrchr')) {
81
+ function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
82
+ }
83
+ if (!function_exists('mb_strrichr')) {
84
+ function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
85
+ }
86
+ if (!function_exists('mb_strripos')) {
87
+ function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
88
+ }
89
+ if (!function_exists('mb_strrpos')) {
90
+ function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
91
+ }
92
+ if (!function_exists('mb_strstr')) {
93
+ function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
94
+ }
95
+ if (!function_exists('mb_get_info')) {
96
+ function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
97
+ }
98
+ if (!function_exists('mb_http_output')) {
99
+ function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
100
+ }
101
+ if (!function_exists('mb_strwidth')) {
102
+ function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
103
+ }
104
+ if (!function_exists('mb_substr_count')) {
105
+ function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
106
+ }
107
+ if (!function_exists('mb_output_handler')) {
108
+ function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
109
+ }
110
+ if (!function_exists('mb_http_input')) {
111
+ function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
112
+ }
113
+ if (!function_exists('mb_convert_variables')) {
114
+ 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, $a, $b, $c, $d, $e, $f); }
115
+ }
116
+ if (!function_exists('mb_ord')) {
117
+ function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); }
118
+ }
119
+ if (!function_exists('mb_chr')) {
120
+ function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
121
+ }
122
+ if (!function_exists('mb_scrub')) {
123
+ function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
124
+ }
125
+ if (!function_exists('mb_str_split')) {
126
+ function mb_str_split($string, $split_length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $split_length, $encoding); }
127
+ }
128
+
129
+ if (extension_loaded('mbstring')) {
130
+ return;
131
+ }
132
+
133
+ if (!defined('MB_CASE_UPPER')) {
134
+ define('MB_CASE_UPPER', 0);
135
+ }
136
+ if (!defined('MB_CASE_LOWER')) {
137
+ define('MB_CASE_LOWER', 1);
138
+ }
139
+ if (!defined('MB_CASE_TITLE')) {
140
+ define('MB_CASE_TITLE', 2);
141
+ }
vendor/symfony/polyfill-mbstring/composer.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "suggest": {
26
+ "ext-mbstring": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-master": "1.17-dev"
32
+ },
33
+ "thanks": {
34
+ "name": "symfony/polyfill",
35
+ "url": "https://github.com/symfony/polyfill"
36
+ }
37
+ }
38
+ }
vendor/symfony/translation/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ vendor/
2
+ composer.lock
3
+ phpunit.xml
vendor/symfony/translation/Catalogue/AbstractOperation.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Catalogue;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+ use Symfony\Component\Translation\MessageCatalogueInterface;
16
+
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
+ protected $source;
28
+ protected $target;
29
+ protected $result;
30
+
31
+ /**
32
+ * @var array|null The domains affected by this operation
33
+ */
34
+ private $domains;
35
+
36
+ /**
37
+ * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
38
+ *
39
+ * The data structure of this array is as follows:
40
+ *
41
+ * array(
42
+ * 'domain 1' => array(
43
+ * 'all' => array(...),
44
+ * 'new' => array(...),
45
+ * 'obsolete' => array(...)
46
+ * ),
47
+ * 'domain 2' => array(
48
+ * 'all' => array(...),
49
+ * 'new' => array(...),
50
+ * 'obsolete' => array(...)
51
+ * ),
52
+ * ...
53
+ * )
54
+ *
55
+ * @var array The array that stores 'all', 'new' and 'obsolete' messages
56
+ */
57
+ protected $messages;
58
+
59
+ /**
60
+ * @throws \LogicException
61
+ */
62
+ public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
63
+ {
64
+ if ($source->getLocale() !== $target->getLocale()) {
65
+ throw new \LogicException('Operated catalogues must belong to the same locale.');
66
+ }
67
+
68
+ $this->source = $source;
69
+ $this->target = $target;
70
+ $this->result = new MessageCatalogue($source->getLocale());
71
+ $this->messages = array();
72
+ }
73
+
74
+ /**
75
+ * {@inheritdoc}
76
+ */
77
+ public function getDomains()
78
+ {
79
+ if (null === $this->domains) {
80
+ $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains())));
81
+ }
82
+
83
+ return $this->domains;
84
+ }
85
+
86
+ /**
87
+ * {@inheritdoc}
88
+ */
89
+ public function getMessages($domain)
90
+ {
91
+ if (!\in_array($domain, $this->getDomains())) {
92
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
93
+ }
94
+
95
+ if (!isset($this->messages[$domain]['all'])) {
96
+ $this->processDomain($domain);
97
+ }
98
+
99
+ return $this->messages[$domain]['all'];
100
+ }
101
+
102
+ /**
103
+ * {@inheritdoc}
104
+ */
105
+ public function getNewMessages($domain)
106
+ {
107
+ if (!\in_array($domain, $this->getDomains())) {
108
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
109
+ }
110
+
111
+ if (!isset($this->messages[$domain]['new'])) {
112
+ $this->processDomain($domain);
113
+ }
114
+
115
+ return $this->messages[$domain]['new'];
116
+ }
117
+
118
+ /**
119
+ * {@inheritdoc}
120
+ */
121
+ public function getObsoleteMessages($domain)
122
+ {
123
+ if (!\in_array($domain, $this->getDomains())) {
124
+ throw new \InvalidArgumentException(sprintf('Invalid domain: %s.', $domain));
125
+ }
126
+
127
+ if (!isset($this->messages[$domain]['obsolete'])) {
128
+ $this->processDomain($domain);
129
+ }
130
+
131
+ return $this->messages[$domain]['obsolete'];
132
+ }
133
+
134
+ /**
135
+ * {@inheritdoc}
136
+ */
137
+ public function getResult()
138
+ {
139
+ foreach ($this->getDomains() as $domain) {
140
+ if (!isset($this->messages[$domain])) {
141
+ $this->processDomain($domain);
142
+ }
143
+ }
144
+
145
+ return $this->result;
146
+ }
147
+
148
+ /**
149
+ * Performs operation on source and target catalogues for the given domain and
150
+ * stores the results.
151
+ *
152
+ * @param string $domain The domain which the operation will be performed for
153
+ */
154
+ abstract protected function processDomain($domain);
155
+ }
vendor/symfony/translation/Catalogue/DiffOperation.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Catalogue;
13
+
14
+ @trigger_error('The '.__NAMESPACE__.'\DiffOperation class is deprecated since Symfony 2.8 and will be removed in 3.0. Use the TargetOperation class in the same namespace instead.', E_USER_DEPRECATED);
15
+
16
+ /**
17
+ * Diff operation between two catalogues.
18
+ *
19
+ * The name of 'Diff' is misleading because the operation
20
+ * has nothing to do with diff:
21
+ *
22
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
23
+ * all = intersection ∪ (target ∖ intersection) = target
24
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
25
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
26
+ *
27
+ * @author Jean-François Simon <contact@jfsimon.fr>
28
+ *
29
+ * @deprecated since version 2.8, to be removed in 3.0. Use TargetOperation instead.
30
+ */
31
+ class DiffOperation extends TargetOperation
32
+ {
33
+ }
vendor/symfony/translation/Catalogue/MergeOperation.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\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
+ */
23
+ class MergeOperation extends AbstractOperation
24
+ {
25
+ /**
26
+ * {@inheritdoc}
27
+ */
28
+ protected function processDomain($domain)
29
+ {
30
+ $this->messages[$domain] = array(
31
+ 'all' => array(),
32
+ 'new' => array(),
33
+ 'obsolete' => array(),
34
+ );
35
+
36
+ foreach ($this->source->all($domain) as $id => $message) {
37
+ $this->messages[$domain]['all'][$id] = $message;
38
+ $this->result->add(array($id => $message), $domain);
39
+ if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) {
40
+ $this->result->setMetadata($id, $keyMetadata, $domain);
41
+ }
42
+ }
43
+
44
+ foreach ($this->target->all($domain) as $id => $message) {
45
+ if (!$this->source->has($id, $domain)) {
46
+ $this->messages[$domain]['all'][$id] = $message;
47
+ $this->messages[$domain]['new'][$id] = $message;
48
+ $this->result->add(array($id => $message), $domain);
49
+ if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) {
50
+ $this->result->setMetadata($id, $keyMetadata, $domain);
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
vendor/symfony/translation/Catalogue/OperationInterface.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Catalogue;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogueInterface;
15
+
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
36
+ {
37
+ /**
38
+ * Returns domains affected by operation.
39
+ *
40
+ * @return array
41
+ */
42
+ public function getDomains();
43
+
44
+ /**
45
+ * Returns all valid messages ('all') after operation.
46
+ *
47
+ * @param string $domain
48
+ *
49
+ * @return array
50
+ */
51
+ public function getMessages($domain);
52
+
53
+ /**
54
+ * Returns new messages ('new') after operation.
55
+ *
56
+ * @param string $domain
57
+ *
58
+ * @return array
59
+ */
60
+ public function getNewMessages($domain);
61
+
62
+ /**
63
+ * Returns obsolete messages ('obsolete') after operation.
64
+ *
65
+ * @param string $domain
66
+ *
67
+ * @return array
68
+ */
69
+ public function getObsoleteMessages($domain);
70
+
71
+ /**
72
+ * Returns resulting catalogue ('result').
73
+ *
74
+ * @return MessageCatalogueInterface
75
+ */
76
+ public function getResult();
77
+ }
vendor/symfony/translation/Catalogue/TargetOperation.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\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}
28
+ */
29
+ protected function processDomain($domain)
30
+ {
31
+ $this->messages[$domain] = array(
32
+ 'all' => array(),
33
+ 'new' => array(),
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;
49
+ $this->result->add(array($id => $message), $domain);
50
+ if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) {
51
+ $this->result->setMetadata($id, $keyMetadata, $domain);
52
+ }
53
+ } else {
54
+ $this->messages[$domain]['obsolete'][$id] = $message;
55
+ }
56
+ }
57
+
58
+ foreach ($this->target->all($domain) as $id => $message) {
59
+ if (!$this->source->has($id, $domain)) {
60
+ $this->messages[$domain]['all'][$id] = $message;
61
+ $this->messages[$domain]['new'][$id] = $message;
62
+ $this->result->add(array($id => $message), $domain);
63
+ if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) {
64
+ $this->result->setMetadata($id, $keyMetadata, $domain);
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
vendor/symfony/translation/DataCollector/TranslationDataCollector.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\DataCollector;
13
+
14
+ use Symfony\Component\HttpFoundation\Request;
15
+ use Symfony\Component\HttpFoundation\Response;
16
+ use Symfony\Component\HttpKernel\DataCollector\DataCollector;
17
+ use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
18
+ use Symfony\Component\Translation\DataCollectorTranslator;
19
+
20
+ /**
21
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
22
+ */
23
+ class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface
24
+ {
25
+ private $translator;
26
+
27
+ public function __construct(DataCollectorTranslator $translator)
28
+ {
29
+ $this->translator = $translator;
30
+ }
31
+
32
+ /**
33
+ * {@inheritdoc}
34
+ */
35
+ public function lateCollect()
36
+ {
37
+ $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages());
38
+
39
+ $this->data = $this->computeCount($messages);
40
+ $this->data['messages'] = $messages;
41
+ }
42
+
43
+ /**
44
+ * {@inheritdoc}
45
+ */
46
+ public function collect(Request $request, Response $response, \Exception $exception = null)
47
+ {
48
+ }
49
+
50
+ /**
51
+ * @return array
52
+ */
53
+ public function getMessages()
54
+ {
55
+ return isset($this->data['messages']) ? $this->data['messages'] : array();
56
+ }
57
+
58
+ /**
59
+ * @return int
60
+ */
61
+ public function getCountMissings()
62
+ {
63
+ return isset($this->data[DataCollectorTranslator::MESSAGE_MISSING]) ? $this->data[DataCollectorTranslator::MESSAGE_MISSING] : 0;
64
+ }
65
+
66
+ /**
67
+ * @return int
68
+ */
69
+ public function getCountFallbacks()
70
+ {
71
+ return isset($this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK]) ? $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] : 0;
72
+ }
73
+
74
+ /**
75
+ * @return int
76
+ */
77
+ public function getCountDefines()
78
+ {
79
+ return isset($this->data[DataCollectorTranslator::MESSAGE_DEFINED]) ? $this->data[DataCollectorTranslator::MESSAGE_DEFINED] : 0;
80
+ }
81
+
82
+ /**
83
+ * {@inheritdoc}
84
+ */
85
+ public function getName()
86
+ {
87
+ return 'translation';
88
+ }
89
+
90
+ private function sanitizeCollectedMessages($messages)
91
+ {
92
+ $result = array();
93
+ foreach ($messages as $key => $message) {
94
+ $messageId = $message['locale'].$message['domain'].$message['id'];
95
+
96
+ if (!isset($result[$messageId])) {
97
+ $message['count'] = 1;
98
+ $message['parameters'] = !empty($message['parameters']) ? array($message['parameters']) : array();
99
+ $messages[$key]['translation'] = $this->sanitizeString($message['translation']);
100
+ $result[$messageId] = $message;
101
+ } else {
102
+ if (!empty($message['parameters'])) {
103
+ $result[$messageId]['parameters'][] = $message['parameters'];
104
+ }
105
+
106
+ ++$result[$messageId]['count'];
107
+ }
108
+
109
+ unset($messages[$key]);
110
+ }
111
+
112
+ return $result;
113
+ }
114
+
115
+ private function computeCount($messages)
116
+ {
117
+ $count = array(
118
+ DataCollectorTranslator::MESSAGE_DEFINED => 0,
119
+ DataCollectorTranslator::MESSAGE_MISSING => 0,
120
+ DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0,
121
+ );
122
+
123
+ foreach ($messages as $message) {
124
+ ++$count[$message['state']];
125
+ }
126
+
127
+ return $count;
128
+ }
129
+
130
+ private function sanitizeString($string, $length = 80)
131
+ {
132
+ $string = trim(preg_replace('/\s+/', ' ', $string));
133
+
134
+ if (false !== $encoding = mb_detect_encoding($string, null, true)) {
135
+ if (mb_strlen($string, $encoding) > $length) {
136
+ return mb_substr($string, 0, $length - 3, $encoding).'...';
137
+ }
138
+ } elseif (\strlen($string) > $length) {
139
+ return substr($string, 0, $length - 3).'...';
140
+ }
141
+
142
+ return $string;
143
+ }
144
+ }
vendor/symfony/translation/DataCollectorTranslator.php ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
16
+ */
17
+ class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface
18
+ {
19
+ const MESSAGE_DEFINED = 0;
20
+ const MESSAGE_MISSING = 1;
21
+ const MESSAGE_EQUALS_FALLBACK = 2;
22
+
23
+ /**
24
+ * @var TranslatorInterface|TranslatorBagInterface
25
+ */
26
+ private $translator;
27
+
28
+ private $messages = array();
29
+
30
+ /**
31
+ * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
32
+ */
33
+ public function __construct(TranslatorInterface $translator)
34
+ {
35
+ if (!$translator instanceof TranslatorBagInterface) {
36
+ throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator)));
37
+ }
38
+
39
+ $this->translator = $translator;
40
+ }
41
+
42
+ /**
43
+ * {@inheritdoc}
44
+ */
45
+ public function trans($id, array $parameters = array(), $domain = null, $locale = null)
46
+ {
47
+ $trans = $this->translator->trans($id, $parameters, $domain, $locale);
48
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters);
49
+
50
+ return $trans;
51
+ }
52
+
53
+ /**
54
+ * {@inheritdoc}
55
+ */
56
+ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
57
+ {
58
+ $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
59
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number);
60
+
61
+ return $trans;
62
+ }
63
+
64
+ /**
65
+ * {@inheritdoc}
66
+ */
67
+ public function setLocale($locale)
68
+ {
69
+ $this->translator->setLocale($locale);
70
+ }
71
+
72
+ /**
73
+ * {@inheritdoc}
74
+ */
75
+ public function getLocale()
76
+ {
77
+ return $this->translator->getLocale();
78
+ }
79
+
80
+ /**
81
+ * {@inheritdoc}
82
+ */
83
+ public function getCatalogue($locale = null)
84
+ {
85
+ return $this->translator->getCatalogue($locale);
86
+ }
87
+
88
+ /**
89
+ * Gets the fallback locales.
90
+ *
91
+ * @return array The fallback locales
92
+ */
93
+ public function getFallbackLocales()
94
+ {
95
+ if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) {
96
+ return $this->translator->getFallbackLocales();
97
+ }
98
+
99
+ return array();
100
+ }
101
+
102
+ /**
103
+ * Passes through all unknown calls onto the translator object.
104
+ */
105
+ public function __call($method, $args)
106
+ {
107
+ return \call_user_func_array(array($this->translator, $method), $args);
108
+ }
109
+
110
+ /**
111
+ * @return array
112
+ */
113
+ public function getCollectedMessages()
114
+ {
115
+ return $this->messages;
116
+ }
117
+
118
+ /**
119
+ * @param string|null $locale
120
+ * @param string|null $domain
121
+ * @param string $id
122
+ * @param string $translation
123
+ * @param array|null $parameters
124
+ * @param int|null $number
125
+ */
126
+ private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null)
127
+ {
128
+ if (null === $domain) {
129
+ $domain = 'messages';
130
+ }
131
+
132
+ $id = (string) $id;
133
+ $catalogue = $this->translator->getCatalogue($locale);
134
+ $locale = $catalogue->getLocale();
135
+ if ($catalogue->defines($id, $domain)) {
136
+ $state = self::MESSAGE_DEFINED;
137
+ } elseif ($catalogue->has($id, $domain)) {
138
+ $state = self::MESSAGE_EQUALS_FALLBACK;
139
+
140
+ $fallbackCatalogue = $catalogue->getFallbackCatalogue();
141
+ while ($fallbackCatalogue) {
142
+ if ($fallbackCatalogue->defines($id, $domain)) {
143
+ $locale = $fallbackCatalogue->getLocale();
144
+ break;
145
+ }
146
+
147
+ $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
148
+ }
149
+ } else {
150
+ $state = self::MESSAGE_MISSING;
151
+ }
152
+
153
+ $this->messages[] = array(
154
+ 'locale' => $locale,
155
+ 'domain' => $domain,
156
+ 'id' => $id,
157
+ 'translation' => $translation,
158
+ 'parameters' => $parameters,
159
+ 'transChoiceNumber' => $number,
160
+ 'state' => $state,
161
+ );
162
+ }
163
+ }
vendor/symfony/translation/Dumper/CsvFileDumper.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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * CsvFileDumper generates a csv formatted string representation of a message catalogue.
18
+ *
19
+ * @author Stealth35
20
+ */
21
+ class CsvFileDumper extends FileDumper
22
+ {
23
+ private $delimiter = ';';
24
+ private $enclosure = '"';
25
+
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function format(MessageCatalogue $messages, $domain = 'messages')
30
+ {
31
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
32
+
33
+ return $this->formatCatalogue($messages, $domain);
34
+ }
35
+
36
+ /**
37
+ * {@inheritdoc}
38
+ */
39
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
40
+ {
41
+ $handle = fopen('php://memory', 'r+b');
42
+
43
+ foreach ($messages->all($domain) as $source => $target) {
44
+ fputcsv($handle, array($source, $target), $this->delimiter, $this->enclosure);
45
+ }
46
+
47
+ rewind($handle);
48
+ $output = stream_get_contents($handle);
49
+ fclose($handle);
50
+
51
+ return $output;
52
+ }
53
+
54
+ /**
55
+ * Sets the delimiter and escape character for CSV.
56
+ *
57
+ * @param string $delimiter Delimiter character
58
+ * @param string $enclosure Enclosure character
59
+ */
60
+ public function setCsvControl($delimiter = ';', $enclosure = '"')
61
+ {
62
+ $this->delimiter = $delimiter;
63
+ $this->enclosure = $enclosure;
64
+ }
65
+
66
+ /**
67
+ * {@inheritdoc}
68
+ */
69
+ protected function getExtension()
70
+ {
71
+ return 'csv';
72
+ }
73
+ }
vendor/symfony/translation/Dumper/DumperInterface.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * DumperInterface is the interface implemented by all translation dumpers.
18
+ * There is no common option.
19
+ *
20
+ * @author Michel Salib <michelsalib@hotmail.com>
21
+ */
22
+ interface DumperInterface
23
+ {
24
+ /**
25
+ * Dumps the message catalogue.
26
+ *
27
+ * @param MessageCatalogue $messages The message catalogue
28
+ * @param array $options Options that are used by the dumper
29
+ */
30
+ public function dump(MessageCatalogue $messages, $options = array());
31
+ }
vendor/symfony/translation/Dumper/FileDumper.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s).
18
+ * Performs backup of already existing files.
19
+ *
20
+ * Options:
21
+ * - path (mandatory): the directory where the files should be saved
22
+ *
23
+ * @author Michel Salib <michelsalib@hotmail.com>
24
+ */
25
+ abstract class FileDumper implements DumperInterface
26
+ {
27
+ /**
28
+ * A template for the relative paths to files.
29
+ *
30
+ * @var string
31
+ */
32
+ protected $relativePathTemplate = '%domain%.%locale%.%extension%';
33
+
34
+ /**
35
+ * Make file backup before the dump.
36
+ *
37
+ * @var bool
38
+ */
39
+ private $backup = true;
40
+
41
+ /**
42
+ * Sets the template for the relative paths to files.
43
+ *
44
+ * @param string $relativePathTemplate A template for the relative paths to files
45
+ */
46
+ public function setRelativePathTemplate($relativePathTemplate)
47
+ {
48
+ $this->relativePathTemplate = $relativePathTemplate;
49
+ }
50
+
51
+ /**
52
+ * Sets backup flag.
53
+ *
54
+ * @param bool $backup
55
+ */
56
+ public function setBackup($backup)
57
+ {
58
+ $this->backup = $backup;
59
+ }
60
+
61
+ /**
62
+ * {@inheritdoc}
63
+ */
64
+ public function dump(MessageCatalogue $messages, $options = array())
65
+ {
66
+ if (!array_key_exists('path', $options)) {
67
+ throw new \InvalidArgumentException('The file dumper needs a path option.');
68
+ }
69
+
70
+ // save a file for each domain
71
+ foreach ($messages->getDomains() as $domain) {
72
+ // backup
73
+ $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale());
74
+ if (file_exists($fullpath)) {
75
+ if ($this->backup) {
76
+ copy($fullpath, $fullpath.'~');
77
+ }
78
+ } else {
79
+ $directory = \dirname($fullpath);
80
+ if (!file_exists($directory) && !@mkdir($directory, 0777, true)) {
81
+ throw new \RuntimeException(sprintf('Unable to create directory "%s".', $directory));
82
+ }
83
+ }
84
+ // save file
85
+ file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Transforms a domain of a message catalogue to its string representation.
91
+ *
92
+ * Override this function in child class if $options is used for message formatting.
93
+ *
94
+ * @param MessageCatalogue $messages
95
+ * @param string $domain
96
+ * @param array $options
97
+ *
98
+ * @return string representation
99
+ */
100
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
101
+ {
102
+ @trigger_error('The '.__METHOD__.' method will replace the format method in 3.0. You should overwrite it instead of overwriting format instead.', E_USER_DEPRECATED);
103
+
104
+ return $this->format($messages, $domain);
105
+ }
106
+
107
+ /**
108
+ * Transforms a domain of a message catalogue to its string representation.
109
+ *
110
+ * @param MessageCatalogue $messages
111
+ * @param string $domain
112
+ *
113
+ * @return string representation
114
+ *
115
+ * @deprecated since version 2.8, to be removed in 3.0. Overwrite formatCatalogue() instead.
116
+ */
117
+ protected function format(MessageCatalogue $messages, $domain)
118
+ {
119
+ throw new \LogicException('The "FileDumper::format" method needs to be overwritten, you should implement either "format" or "formatCatalogue".');
120
+ }
121
+
122
+ /**
123
+ * Gets the file extension of the dumper.
124
+ *
125
+ * @return string file extension
126
+ */
127
+ abstract protected function getExtension();
128
+
129
+ /**
130
+ * Gets the relative file path using the template.
131
+ *
132
+ * @param string $domain The domain
133
+ * @param string $locale The locale
134
+ *
135
+ * @return string The relative file path
136
+ */
137
+ private function getRelativePath($domain, $locale)
138
+ {
139
+ return strtr($this->relativePathTemplate, array(
140
+ '%domain%' => $domain,
141
+ '%locale%' => $locale,
142
+ '%extension%' => $this->getExtension(),
143
+ ));
144
+ }
145
+ }
vendor/symfony/translation/Dumper/IcuResFileDumper.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue.
18
+ *
19
+ * @author Stealth35
20
+ */
21
+ class IcuResFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ protected $relativePathTemplate = '%domain%/%locale%.%extension%';
27
+
28
+ /**
29
+ * {@inheritdoc}
30
+ */
31
+ public function format(MessageCatalogue $messages, $domain = 'messages')
32
+ {
33
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
34
+
35
+ return $this->formatCatalogue($messages, $domain);
36
+ }
37
+
38
+ /**
39
+ * {@inheritdoc}
40
+ */
41
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
42
+ {
43
+ $data = $indexes = $resources = '';
44
+
45
+ foreach ($messages->all($domain) as $source => $target) {
46
+ $indexes .= pack('v', \strlen($data) + 28);
47
+ $data .= $source."\0";
48
+ }
49
+
50
+ $data .= $this->writePadding($data);
51
+
52
+ $keyTop = $this->getPosition($data);
53
+
54
+ foreach ($messages->all($domain) as $source => $target) {
55
+ $resources .= pack('V', $this->getPosition($data));
56
+
57
+ $data .= pack('V', \strlen($target))
58
+ .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8')
59
+ .$this->writePadding($data)
60
+ ;
61
+ }
62
+
63
+ $resOffset = $this->getPosition($data);
64
+
65
+ $data .= pack('v', \count($messages->all($domain)))
66
+ .$indexes
67
+ .$this->writePadding($data)
68
+ .$resources
69
+ ;
70
+
71
+ $bundleTop = $this->getPosition($data);
72
+
73
+ $root = pack('V7',
74
+ $resOffset + (2 << 28), // Resource Offset + Resource Type
75
+ 6, // Index length
76
+ $keyTop, // Index keys top
77
+ $bundleTop, // Index resources top
78
+ $bundleTop, // Index bundle top
79
+ \count($messages->all($domain)), // Index max table length
80
+ 0 // Index attributes
81
+ );
82
+
83
+ $header = pack('vC2v4C12@32',
84
+ 32, // Header size
85
+ 0xDA, 0x27, // Magic number 1 and 2
86
+ 20, 0, 0, 2, // Rest of the header, ..., Size of a char
87
+ 0x52, 0x65, 0x73, 0x42, // Data format identifier
88
+ 1, 2, 0, 0, // Data version
89
+ 1, 4, 0, 0 // Unicode version
90
+ );
91
+
92
+ return $header.$root.$data;
93
+ }
94
+
95
+ private function writePadding($data)
96
+ {
97
+ $padding = \strlen($data) % 4;
98
+
99
+ if ($padding) {
100
+ return str_repeat("\xAA", 4 - $padding);
101
+ }
102
+ }
103
+
104
+ private function getPosition($data)
105
+ {
106
+ return (\strlen($data) + 28) / 4;
107
+ }
108
+
109
+ /**
110
+ * {@inheritdoc}
111
+ */
112
+ protected function getExtension()
113
+ {
114
+ return 'res';
115
+ }
116
+ }
vendor/symfony/translation/Dumper/IniFileDumper.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * IniFileDumper generates an ini formatted string representation of a message catalogue.
18
+ *
19
+ * @author Stealth35
20
+ */
21
+ class IniFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
+ {
38
+ $output = '';
39
+
40
+ foreach ($messages->all($domain) as $source => $target) {
41
+ $escapeTarget = str_replace('"', '\"', $target);
42
+ $output .= $source.'="'.$escapeTarget."\"\n";
43
+ }
44
+
45
+ return $output;
46
+ }
47
+
48
+ /**
49
+ * {@inheritdoc}
50
+ */
51
+ protected function getExtension()
52
+ {
53
+ return 'ini';
54
+ }
55
+ }
vendor/symfony/translation/Dumper/JsonFileDumper.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * JsonFileDumper generates an json formatted string representation of a message catalogue.
18
+ *
19
+ * @author singles
20
+ */
21
+ class JsonFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
+ {
38
+ if (isset($options['json_encoding'])) {
39
+ $flags = $options['json_encoding'];
40
+ } else {
41
+ $flags = \defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0;
42
+ }
43
+
44
+ return json_encode($messages->all($domain), $flags);
45
+ }
46
+
47
+ /**
48
+ * {@inheritdoc}
49
+ */
50
+ protected function getExtension()
51
+ {
52
+ return 'json';
53
+ }
54
+ }
vendor/symfony/translation/Dumper/MoFileDumper.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\Loader\MoFileLoader;
15
+ use Symfony\Component\Translation\MessageCatalogue;
16
+
17
+ /**
18
+ * MoFileDumper generates a gettext formatted string representation of a message catalogue.
19
+ *
20
+ * @author Stealth35
21
+ */
22
+ class MoFileDumper extends FileDumper
23
+ {
24
+ /**
25
+ * {@inheritdoc}
26
+ */
27
+ public function format(MessageCatalogue $messages, $domain = 'messages')
28
+ {
29
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
30
+
31
+ return $this->formatCatalogue($messages, $domain);
32
+ }
33
+
34
+ /**
35
+ * {@inheritdoc}
36
+ */
37
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
38
+ {
39
+ $sources = $targets = $sourceOffsets = $targetOffsets = '';
40
+ $offsets = array();
41
+ $size = 0;
42
+
43
+ foreach ($messages->all($domain) as $source => $target) {
44
+ $offsets[] = array_map('strlen', array($sources, $source, $targets, $target));
45
+ $sources .= "\0".$source;
46
+ $targets .= "\0".$target;
47
+ ++$size;
48
+ }
49
+
50
+ $header = array(
51
+ 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC,
52
+ 'formatRevision' => 0,
53
+ 'count' => $size,
54
+ 'offsetId' => MoFileLoader::MO_HEADER_SIZE,
55
+ 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size),
56
+ 'sizeHashes' => 0,
57
+ 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size),
58
+ );
59
+
60
+ $sourcesSize = \strlen($sources);
61
+ $sourcesStart = $header['offsetHashes'] + 1;
62
+
63
+ foreach ($offsets as $offset) {
64
+ $sourceOffsets .= $this->writeLong($offset[1])
65
+ .$this->writeLong($offset[0] + $sourcesStart);
66
+ $targetOffsets .= $this->writeLong($offset[3])
67
+ .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize);
68
+ }
69
+
70
+ $output = implode('', array_map(array($this, 'writeLong'), $header))
71
+ .$sourceOffsets
72
+ .$targetOffsets
73
+ .$sources
74
+ .$targets
75
+ ;
76
+
77
+ return $output;
78
+ }
79
+
80
+ /**
81
+ * {@inheritdoc}
82
+ */
83
+ protected function getExtension()
84
+ {
85
+ return 'mo';
86
+ }
87
+
88
+ private function writeLong($str)
89
+ {
90
+ return pack('V*', $str);
91
+ }
92
+ }
vendor/symfony/translation/Dumper/PhpFileDumper.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * PhpFileDumper generates PHP files from a message catalogue.
18
+ *
19
+ * @author Michel Salib <michelsalib@hotmail.com>
20
+ */
21
+ class PhpFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ protected function format(MessageCatalogue $messages, $domain)
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
+ {
38
+ return "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n";
39
+ }
40
+
41
+ /**
42
+ * {@inheritdoc}
43
+ */
44
+ protected function getExtension()
45
+ {
46
+ return 'php';
47
+ }
48
+ }
vendor/symfony/translation/Dumper/PoFileDumper.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * PoFileDumper generates a gettext formatted string representation of a message catalogue.
18
+ *
19
+ * @author Stealth35
20
+ */
21
+ class PoFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain = 'messages')
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
+ {
38
+ $output = 'msgid ""'."\n";
39
+ $output .= 'msgstr ""'."\n";
40
+ $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n";
41
+ $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n";
42
+ $output .= '"Language: '.$messages->getLocale().'\n"'."\n";
43
+ $output .= "\n";
44
+
45
+ $newLine = false;
46
+ foreach ($messages->all($domain) as $source => $target) {
47
+ if ($newLine) {
48
+ $output .= "\n";
49
+ } else {
50
+ $newLine = true;
51
+ }
52
+ $output .= sprintf('msgid "%s"'."\n", $this->escape($source));
53
+ $output .= sprintf('msgstr "%s"', $this->escape($target));
54
+ }
55
+
56
+ return $output;
57
+ }
58
+
59
+ /**
60
+ * {@inheritdoc}
61
+ */
62
+ protected function getExtension()
63
+ {
64
+ return 'po';
65
+ }
66
+
67
+ private function escape($str)
68
+ {
69
+ return addcslashes($str, "\0..\37\42\134");
70
+ }
71
+ }
vendor/symfony/translation/Dumper/QtFileDumper.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * QtFileDumper generates ts files from a message catalogue.
18
+ *
19
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
20
+ */
21
+ class QtFileDumper extends FileDumper
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function format(MessageCatalogue $messages, $domain)
27
+ {
28
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
29
+
30
+ return $this->formatCatalogue($messages, $domain);
31
+ }
32
+
33
+ /**
34
+ * {@inheritdoc}
35
+ */
36
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
37
+ {
38
+ $dom = new \DOMDocument('1.0', 'utf-8');
39
+ $dom->formatOutput = true;
40
+ $ts = $dom->appendChild($dom->createElement('TS'));
41
+ $context = $ts->appendChild($dom->createElement('context'));
42
+ $context->appendChild($dom->createElement('name', $domain));
43
+
44
+ foreach ($messages->all($domain) as $source => $target) {
45
+ $message = $context->appendChild($dom->createElement('message'));
46
+ $message->appendChild($dom->createElement('source', $source));
47
+ $message->appendChild($dom->createElement('translation', $target));
48
+ }
49
+
50
+ return $dom->saveXML();
51
+ }
52
+
53
+ /**
54
+ * {@inheritdoc}
55
+ */
56
+ protected function getExtension()
57
+ {
58
+ return 'ts';
59
+ }
60
+ }
vendor/symfony/translation/Dumper/XliffFileDumper.php ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * XliffFileDumper generates xliff files from a message catalogue.
18
+ *
19
+ * @author Michel Salib <michelsalib@hotmail.com>
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 format(MessageCatalogue $messages, $domain)
53
+ {
54
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
55
+
56
+ return $this->formatCatalogue($messages, $domain);
57
+ }
58
+
59
+ /**
60
+ * {@inheritdoc}
61
+ */
62
+ protected function getExtension()
63
+ {
64
+ return 'xlf';
65
+ }
66
+
67
+ private function dumpXliff1($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
68
+ {
69
+ $toolInfo = array('tool-id' => 'symfony', 'tool-name' => 'Symfony');
70
+ if (array_key_exists('tool_info', $options)) {
71
+ $toolInfo = array_merge($toolInfo, $options['tool_info']);
72
+ }
73
+
74
+ $dom = new \DOMDocument('1.0', 'utf-8');
75
+ $dom->formatOutput = true;
76
+
77
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
78
+ $xliff->setAttribute('version', '1.2');
79
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
80
+
81
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
82
+ $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale));
83
+ $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
84
+ $xliffFile->setAttribute('datatype', 'plaintext');
85
+ $xliffFile->setAttribute('original', 'file.ext');
86
+
87
+ $xliffHead = $xliffFile->appendChild($dom->createElement('header'));
88
+ $xliffTool = $xliffHead->appendChild($dom->createElement('tool'));
89
+ foreach ($toolInfo as $id => $value) {
90
+ $xliffTool->setAttribute($id, $value);
91
+ }
92
+
93
+ $xliffBody = $xliffFile->appendChild($dom->createElement('body'));
94
+ foreach ($messages->all($domain) as $source => $target) {
95
+ $translation = $dom->createElement('trans-unit');
96
+
97
+ $translation->setAttribute('id', md5($source));
98
+ $translation->setAttribute('resname', $source);
99
+
100
+ $s = $translation->appendChild($dom->createElement('source'));
101
+ $s->appendChild($dom->createTextNode($source));
102
+
103
+ // Does the target contain characters requiring a CDATA section?
104
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
105
+
106
+ $targetElement = $dom->createElement('target');
107
+ $metadata = $messages->getMetadata($source, $domain);
108
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
109
+ foreach ($metadata['target-attributes'] as $name => $value) {
110
+ $targetElement->setAttribute($name, $value);
111
+ }
112
+ }
113
+ $t = $translation->appendChild($targetElement);
114
+ $t->appendChild($text);
115
+
116
+ if ($this->hasMetadataArrayInfo('notes', $metadata)) {
117
+ foreach ($metadata['notes'] as $note) {
118
+ if (!isset($note['content'])) {
119
+ continue;
120
+ }
121
+
122
+ $n = $translation->appendChild($dom->createElement('note'));
123
+ $n->appendChild($dom->createTextNode($note['content']));
124
+
125
+ if (isset($note['priority'])) {
126
+ $n->setAttribute('priority', $note['priority']);
127
+ }
128
+
129
+ if (isset($note['from'])) {
130
+ $n->setAttribute('from', $note['from']);
131
+ }
132
+ }
133
+ }
134
+
135
+ $xliffBody->appendChild($translation);
136
+ }
137
+
138
+ return $dom->saveXML();
139
+ }
140
+
141
+ private function dumpXliff2($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
142
+ {
143
+ $dom = new \DOMDocument('1.0', 'utf-8');
144
+ $dom->formatOutput = true;
145
+
146
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
147
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0');
148
+ $xliff->setAttribute('version', '2.0');
149
+ $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale));
150
+ $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale()));
151
+
152
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
153
+ $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale());
154
+
155
+ foreach ($messages->all($domain) as $source => $target) {
156
+ $translation = $dom->createElement('unit');
157
+ $translation->setAttribute('id', md5($source));
158
+
159
+ $segment = $translation->appendChild($dom->createElement('segment'));
160
+
161
+ $s = $segment->appendChild($dom->createElement('source'));
162
+ $s->appendChild($dom->createTextNode($source));
163
+
164
+ // Does the target contain characters requiring a CDATA section?
165
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
166
+
167
+ $targetElement = $dom->createElement('target');
168
+ $metadata = $messages->getMetadata($source, $domain);
169
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
170
+ foreach ($metadata['target-attributes'] as $name => $value) {
171
+ $targetElement->setAttribute($name, $value);
172
+ }
173
+ }
174
+ $t = $segment->appendChild($targetElement);
175
+ $t->appendChild($text);
176
+
177
+ $xliffFile->appendChild($translation);
178
+ }
179
+
180
+ return $dom->saveXML();
181
+ }
182
+
183
+ /**
184
+ * @param string $key
185
+ * @param array|null $metadata
186
+ *
187
+ * @return bool
188
+ */
189
+ private function hasMetadataArrayInfo($key, $metadata = null)
190
+ {
191
+ return null !== $metadata && array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || \is_array($metadata[$key]));
192
+ }
193
+ }
vendor/symfony/translation/Dumper/YamlFileDumper.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Dumper;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+ use Symfony\Component\Translation\Util\ArrayConverter;
16
+ use Symfony\Component\Yaml\Yaml;
17
+
18
+ /**
19
+ * YamlFileDumper generates yaml files from a message catalogue.
20
+ *
21
+ * @author Michel Salib <michelsalib@hotmail.com>
22
+ */
23
+ class YamlFileDumper extends FileDumper
24
+ {
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
+ /**
48
+ * {@inheritdoc}
49
+ */
50
+ protected function format(MessageCatalogue $messages, $domain)
51
+ {
52
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
53
+
54
+ return $this->formatCatalogue($messages, $domain);
55
+ }
56
+
57
+ /**
58
+ * {@inheritdoc}
59
+ */
60
+ protected function getExtension()
61
+ {
62
+ return 'yml';
63
+ }
64
+ }
vendor/symfony/translation/Exception/ExceptionInterface.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Exception;
13
+
14
+ /**
15
+ * Exception interface for all exceptions thrown by the component.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ interface ExceptionInterface
20
+ {
21
+ }
vendor/symfony/translation/Exception/InvalidResourceException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Exception;
13
+
14
+ /**
15
+ * Thrown when a resource cannot be loaded.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/translation/Exception/NotFoundResourceException.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Exception;
13
+
14
+ /**
15
+ * Thrown when a resource does not exist.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface
20
+ {
21
+ }
vendor/symfony/translation/Extractor/AbstractFileExtractor.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Extractor;
13
+
14
+ /**
15
+ * Base class used by classes that extract translation messages from files.
16
+ *
17
+ * @author Marcos D. Sánchez <marcosdsanchez@gmail.com>
18
+ */
19
+ abstract class AbstractFileExtractor
20
+ {
21
+ /**
22
+ * @param string|array $resource Files, a file or a directory
23
+ *
24
+ * @return array
25
+ */
26
+ protected function extractFiles($resource)
27
+ {
28
+ if (\is_array($resource) || $resource instanceof \Traversable) {
29
+ $files = array();
30
+ foreach ($resource as $file) {
31
+ if ($this->canBeExtracted($file)) {
32
+ $files[] = $this->toSplFileInfo($file);
33
+ }
34
+ }
35
+ } elseif (is_file($resource)) {
36
+ $files = $this->canBeExtracted($resource) ? array($this->toSplFileInfo($resource)) : array();
37
+ } else {
38
+ $files = $this->extractFromDirectory($resource);
39
+ }
40
+
41
+ return $files;
42
+ }
43
+
44
+ /**
45
+ * @param string $file
46
+ *
47
+ * @return \SplFileInfo
48
+ */
49
+ private function toSplFileInfo($file)
50
+ {
51
+ return ($file instanceof \SplFileInfo) ? $file : new \SplFileInfo($file);
52
+ }
53
+
54
+ /**
55
+ * @param string $file
56
+ *
57
+ * @return bool
58
+ *
59
+ * @throws \InvalidArgumentException
60
+ */
61
+ protected function isFile($file)
62
+ {
63
+ if (!is_file($file)) {
64
+ throw new \InvalidArgumentException(sprintf('The "%s" file does not exist.', $file));
65
+ }
66
+
67
+ return true;
68
+ }
69
+
70
+ /**
71
+ * @param string $file
72
+ *
73
+ * @return bool
74
+ */
75
+ abstract protected function canBeExtracted($file);
76
+
77
+ /**
78
+ * @param string|array $resource Files, a file or a directory
79
+ *
80
+ * @return array files to be extracted
81
+ */
82
+ abstract protected function extractFromDirectory($resource);
83
+ }
vendor/symfony/translation/Extractor/ChainExtractor.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Extractor;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * ChainExtractor extracts translation messages from template files.
18
+ *
19
+ * @author Michel Salib <michelsalib@hotmail.com>
20
+ */
21
+ class ChainExtractor implements ExtractorInterface
22
+ {
23
+ /**
24
+ * The extractors.
25
+ *
26
+ * @var ExtractorInterface[]
27
+ */
28
+ private $extractors = array();
29
+
30
+ /**
31
+ * Adds a loader to the translation extractor.
32
+ *
33
+ * @param string $format The format of the loader
34
+ * @param ExtractorInterface $extractor The loader
35
+ */
36
+ public function addExtractor($format, ExtractorInterface $extractor)
37
+ {
38
+ $this->extractors[$format] = $extractor;
39
+ }
40
+
41
+ /**
42
+ * {@inheritdoc}
43
+ */
44
+ public function setPrefix($prefix)
45
+ {
46
+ foreach ($this->extractors as $extractor) {
47
+ $extractor->setPrefix($prefix);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * {@inheritdoc}
53
+ */
54
+ public function extract($directory, MessageCatalogue $catalogue)
55
+ {
56
+ foreach ($this->extractors as $extractor) {
57
+ $extractor->extract($directory, $catalogue);
58
+ }
59
+ }
60
+ }
vendor/symfony/translation/Extractor/ExtractorInterface.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Extractor;
13
+
14
+ use Symfony\Component\Translation\MessageCatalogue;
15
+
16
+ /**
17
+ * Extracts translation messages from a directory or files to the catalogue.
18
+ * New found messages are injected to the catalogue using the prefix.
19
+ *
20
+ * @author Michel Salib <michelsalib@hotmail.com>
21
+ */
22
+ interface ExtractorInterface
23
+ {
24
+ /**
25
+ * Extracts translation messages from files, a file or a directory to the catalogue.
26
+ *
27
+ * @param string|array $resource Files, a file or a directory
28
+ * @param MessageCatalogue $catalogue The catalogue
29
+ */
30
+ public function extract($resource, MessageCatalogue $catalogue);
31
+
32
+ /**
33
+ * Sets the prefix that should be used for new found messages.
34
+ *
35
+ * @param string $prefix The prefix
36
+ */
37
+ public function setPrefix($prefix);
38
+ }
vendor/symfony/translation/IdentityTranslator.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * IdentityTranslator does not translate anything.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class IdentityTranslator implements TranslatorInterface
20
+ {
21
+ private $selector;
22
+ private $locale;
23
+
24
+ /**
25
+ * @param MessageSelector|null $selector The message selector for pluralization
26
+ */
27
+ public function __construct(MessageSelector $selector = null)
28
+ {
29
+ $this->selector = $selector ?: new MessageSelector();
30
+ }
31
+
32
+ /**
33
+ * {@inheritdoc}
34
+ */
35
+ public function setLocale($locale)
36
+ {
37
+ $this->locale = $locale;
38
+ }
39
+
40
+ /**
41
+ * {@inheritdoc}
42
+ */
43
+ public function getLocale()
44
+ {
45
+ return $this->locale ?: \Locale::getDefault();
46
+ }
47
+
48
+ /**
49
+ * {@inheritdoc}
50
+ */
51
+ public function trans($id, array $parameters = array(), $domain = null, $locale = null)
52
+ {
53
+ return strtr((string) $id, $parameters);
54
+ }
55
+
56
+ /**
57
+ * {@inheritdoc}
58
+ */
59
+ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
60
+ {
61
+ return strtr($this->selector->choose((string) $id, (int) $number, $locale ?: $this->getLocale()), $parameters);
62
+ }
63
+ }
vendor/symfony/translation/Interval.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * Tests if a given number belongs to a given math interval.
16
+ *
17
+ * An interval can represent a finite set of numbers:
18
+ *
19
+ * {1,2,3,4}
20
+ *
21
+ * An interval can represent numbers between two numbers:
22
+ *
23
+ * [1, +Inf]
24
+ * ]-1,2[
25
+ *
26
+ * The left delimiter can be [ (inclusive) or ] (exclusive).
27
+ * The right delimiter can be [ (exclusive) or ] (inclusive).
28
+ * Beside numbers, you can use -Inf and +Inf for the infinite.
29
+ *
30
+ * @author Fabien Potencier <fabien@symfony.com>
31
+ *
32
+ * @see http://en.wikipedia.org/wiki/Interval_%28mathematics%29#The_ISO_notation
33
+ */
34
+ class Interval
35
+ {
36
+ /**
37
+ * Tests if the given number is in the math interval.
38
+ *
39
+ * @param int $number A number
40
+ * @param string $interval An interval
41
+ *
42
+ * @return bool
43
+ *
44
+ * @throws \InvalidArgumentException
45
+ */
46
+ public static function test($number, $interval)
47
+ {
48
+ $interval = trim($interval);
49
+
50
+ if (!preg_match('/^'.self::getIntervalRegexp().'$/x', $interval, $matches)) {
51
+ throw new \InvalidArgumentException(sprintf('"%s" is not a valid interval.', $interval));
52
+ }
53
+
54
+ if ($matches[1]) {
55
+ foreach (explode(',', $matches[2]) as $n) {
56
+ if ($number == $n) {
57
+ return true;
58
+ }
59
+ }
60
+ } else {
61
+ $leftNumber = self::convertNumber($matches['left']);
62
+ $rightNumber = self::convertNumber($matches['right']);
63
+
64
+ return
65
+ ('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber)
66
+ && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber)
67
+ ;
68
+ }
69
+
70
+ return false;
71
+ }
72
+
73
+ /**
74
+ * Returns a Regexp that matches valid intervals.
75
+ *
76
+ * @return string A Regexp (without the delimiters)
77
+ */
78
+ public static function getIntervalRegexp()
79
+ {
80
+ return <<<EOF
81
+ ({\s*
82
+ (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*)
83
+ \s*})
84
+
85
+ |
86
+
87
+ (?P<left_delimiter>[\[\]])
88
+ \s*
89
+ (?P<left>-Inf|\-?\d+(\.\d+)?)
90
+ \s*,\s*
91
+ (?P<right>\+?Inf|\-?\d+(\.\d+)?)
92
+ \s*
93
+ (?P<right_delimiter>[\[\]])
94
+ EOF;
95
+ }
96
+
97
+ private static function convertNumber($number)
98
+ {
99
+ if ('-Inf' === $number) {
100
+ return log(0);
101
+ } elseif ('+Inf' === $number || 'Inf' === $number) {
102
+ return -log(0);
103
+ }
104
+
105
+ return (float) $number;
106
+ }
107
+ }
vendor/symfony/translation/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2004-2018 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/translation/Loader/ArrayLoader.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\MessageCatalogue;
15
+
16
+ /**
17
+ * ArrayLoader loads translations from a PHP array.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ class ArrayLoader implements LoaderInterface
22
+ {
23
+ /**
24
+ * {@inheritdoc}
25
+ */
26
+ public function load($resource, $locale, $domain = 'messages')
27
+ {
28
+ $this->flatten($resource);
29
+ $catalogue = new MessageCatalogue($locale);
30
+ $catalogue->add($resource, $domain);
31
+
32
+ return $catalogue;
33
+ }
34
+
35
+ /**
36
+ * Flattens an nested array of translations.
37
+ *
38
+ * The scheme used is:
39
+ * 'key' => array('key2' => array('key3' => 'value'))
40
+ * Becomes:
41
+ * 'key.key2.key3' => 'value'
42
+ *
43
+ * This function takes an array by reference and will modify it
44
+ *
45
+ * @param array &$messages The array that will be flattened
46
+ * @param array $subnode Current subnode being parsed, used internally for recursive calls
47
+ * @param string $path Current path being parsed, used internally for recursive calls
48
+ */
49
+ private function flatten(array &$messages, array $subnode = null, $path = null)
50
+ {
51
+ if (null === $subnode) {
52
+ $subnode = &$messages;
53
+ }
54
+ foreach ($subnode as $key => $value) {
55
+ if (\is_array($value)) {
56
+ $nodePath = $path ? $path.'.'.$key : $key;
57
+ $this->flatten($messages, $value, $nodePath);
58
+ if (null === $path) {
59
+ unset($messages[$key]);
60
+ }
61
+ } elseif (null !== $path) {
62
+ $messages[$path.'.'.$key] = $value;
63
+ }
64
+ }
65
+ }
66
+ }
vendor/symfony/translation/Loader/CsvFileLoader.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\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 = '"';
25
+ private $escape = '\\';
26
+
27
+ /**
28
+ * {@inheritdoc}
29
+ */
30
+ protected function loadResource($resource)
31
+ {
32
+ $messages = array();
33
+
34
+ try {
35
+ $file = new \SplFileObject($resource, 'rb');
36
+ } catch (\RuntimeException $e) {
37
+ throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e);
38
+ }
39
+
40
+ $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY);
41
+ $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape);
42
+
43
+ foreach ($file as $data) {
44
+ if ('#' !== substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) {
45
+ $messages[$data[0]] = $data[1];
46
+ }
47
+ }
48
+
49
+ return $messages;
50
+ }
51
+
52
+ /**
53
+ * Sets the delimiter, enclosure, and escape character for CSV.
54
+ *
55
+ * @param string $delimiter Delimiter character
56
+ * @param string $enclosure Enclosure character
57
+ * @param string $escape Escape character
58
+ */
59
+ public function setCsvControl($delimiter = ';', $enclosure = '"', $escape = '\\')
60
+ {
61
+ $this->delimiter = $delimiter;
62
+ $this->enclosure = $enclosure;
63
+ $this->escape = $escape;
64
+ }
65
+ }
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\Config\Resource\FileResource;
15
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
16
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
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/IcuDatFileLoader.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Config\Resource\FileResource;
15
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
16
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
17
+ use Symfony\Component\Translation\MessageCatalogue;
18
+
19
+ /**
20
+ * IcuResFileLoader loads translations from a resource bundle.
21
+ *
22
+ * @author stealth35
23
+ */
24
+ class IcuDatFileLoader extends IcuResFileLoader
25
+ {
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function load($resource, $locale, $domain = 'messages')
30
+ {
31
+ if (!stream_is_local($resource.'.dat')) {
32
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
33
+ }
34
+
35
+ if (!file_exists($resource.'.dat')) {
36
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
37
+ }
38
+
39
+ try {
40
+ $rb = new \ResourceBundle($locale, $resource);
41
+ } catch (\Exception $e) {
42
+ // HHVM compatibility: constructor throws on invalid resource
43
+ $rb = null;
44
+ }
45
+
46
+ if (!$rb) {
47
+ throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
48
+ } elseif (intl_is_failure($rb->getErrorCode())) {
49
+ throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
50
+ }
51
+
52
+ $messages = $this->flatten($rb);
53
+ $catalogue = new MessageCatalogue($locale);
54
+ $catalogue->add($messages, $domain);
55
+
56
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
57
+ $catalogue->addResource(new FileResource($resource.'.dat'));
58
+ }
59
+
60
+ return $catalogue;
61
+ }
62
+ }
vendor/symfony/translation/Loader/IcuResFileLoader.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Config\Resource\DirectoryResource;
15
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
16
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
17
+ use Symfony\Component\Translation\MessageCatalogue;
18
+
19
+ /**
20
+ * IcuResFileLoader loads translations from a resource bundle.
21
+ *
22
+ * @author stealth35
23
+ */
24
+ class IcuResFileLoader implements LoaderInterface
25
+ {
26
+ /**
27
+ * {@inheritdoc}
28
+ */
29
+ public function load($resource, $locale, $domain = 'messages')
30
+ {
31
+ if (!stream_is_local($resource)) {
32
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
33
+ }
34
+
35
+ if (!is_dir($resource)) {
36
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
37
+ }
38
+
39
+ try {
40
+ $rb = new \ResourceBundle($locale, $resource);
41
+ } catch (\Exception $e) {
42
+ // HHVM compatibility: constructor throws on invalid resource
43
+ $rb = null;
44
+ }
45
+
46
+ if (!$rb) {
47
+ throw new InvalidResourceException(sprintf('Cannot load resource "%s"', $resource));
48
+ } elseif (intl_is_failure($rb->getErrorCode())) {
49
+ throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode());
50
+ }
51
+
52
+ $messages = $this->flatten($rb);
53
+ $catalogue = new MessageCatalogue($locale);
54
+ $catalogue->add($messages, $domain);
55
+
56
+ if (class_exists('Symfony\Component\Config\Resource\DirectoryResource')) {
57
+ $catalogue->addResource(new DirectoryResource($resource));
58
+ }
59
+
60
+ return $catalogue;
61
+ }
62
+
63
+ /**
64
+ * Flattens an ResourceBundle.
65
+ *
66
+ * The scheme used is:
67
+ * key { key2 { key3 { "value" } } }
68
+ * Becomes:
69
+ * 'key.key2.key3' => 'value'
70
+ *
71
+ * This function takes an array by reference and will modify it
72
+ *
73
+ * @param \ResourceBundle $rb The ResourceBundle that will be flattened
74
+ * @param array $messages Used internally for recursive calls
75
+ * @param string $path Current path being parsed, used internally for recursive calls
76
+ *
77
+ * @return array the flattened ResourceBundle
78
+ */
79
+ protected function flatten(\ResourceBundle $rb, array &$messages = array(), $path = null)
80
+ {
81
+ foreach ($rb as $key => $value) {
82
+ $nodePath = $path ? $path.'.'.$key : $key;
83
+ if ($value instanceof \ResourceBundle) {
84
+ $this->flatten($value, $messages, $nodePath);
85
+ } else {
86
+ $messages[$nodePath] = $value;
87
+ }
88
+ }
89
+
90
+ return $messages;
91
+ }
92
+ }
vendor/symfony/translation/Loader/IniFileLoader.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /**
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 ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
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);
31
+
32
+ if (0 < $errorCode = json_last_error()) {
33
+ throw new InvalidResourceException(sprintf('Error parsing JSON - %s', $this->getJSONErrorMessage($errorCode)));
34
+ }
35
+ }
36
+
37
+ return $messages;
38
+ }
39
+
40
+ /**
41
+ * Translates JSON_ERROR_* constant into meaningful message.
42
+ *
43
+ * @param int $errorCode Error code returned by json_last_error() call
44
+ *
45
+ * @return string Message string
46
+ */
47
+ private function getJSONErrorMessage($errorCode)
48
+ {
49
+ switch ($errorCode) {
50
+ case JSON_ERROR_DEPTH:
51
+ return 'Maximum stack depth exceeded';
52
+ case JSON_ERROR_STATE_MISMATCH:
53
+ return 'Underflow or the modes mismatch';
54
+ case JSON_ERROR_CTRL_CHAR:
55
+ return 'Unexpected control character found';
56
+ case JSON_ERROR_SYNTAX:
57
+ return 'Syntax error, malformed JSON';
58
+ case JSON_ERROR_UTF8:
59
+ return 'Malformed UTF-8 characters, possibly incorrectly encoded';
60
+ default:
61
+ return 'Unknown error';
62
+ }
63
+ }
64
+ }
vendor/symfony/translation/Loader/LoaderInterface.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Translation\MessageCatalogue;
17
+
18
+ /**
19
+ * LoaderInterface is the interface implemented by all translation loaders.
20
+ *
21
+ * @author Fabien Potencier <fabien@symfony.com>
22
+ */
23
+ interface LoaderInterface
24
+ {
25
+ /**
26
+ * Loads a locale.
27
+ *
28
+ * @param mixed $resource A resource
29
+ * @param string $locale A locale
30
+ * @param string $domain The domain
31
+ *
32
+ * @return MessageCatalogue A MessageCatalogue instance
33
+ *
34
+ * @throws NotFoundResourceException when the resource cannot be found
35
+ * @throws InvalidResourceException when the resource cannot be loaded
36
+ */
37
+ public function load($resource, $locale, $domain = 'messages');
38
+ }
vendor/symfony/translation/Loader/MoFileLoader.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
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
23
+ * detecting if the machine used to create that file was little endian.
24
+ */
25
+ const MO_LITTLE_ENDIAN_MAGIC = 0x950412de;
26
+
27
+ /**
28
+ * Magic used for validating the format of a MO file as well as
29
+ * detecting if the machine used to create that file was big endian.
30
+ */
31
+ const MO_BIG_ENDIAN_MAGIC = 0xde120495;
32
+
33
+ /**
34
+ * The size of the header of a MO file in bytes.
35
+ */
36
+ const MO_HEADER_SIZE = 28;
37
+
38
+ /**
39
+ * Parses machine object (MO) format, independent of the machine's endian it
40
+ * was created on. Both 32bit and 64bit systems are supported.
41
+ *
42
+ * {@inheritdoc}
43
+ */
44
+ protected function loadResource($resource)
45
+ {
46
+ $stream = fopen($resource, 'r');
47
+
48
+ $stat = fstat($stream);
49
+
50
+ if ($stat['size'] < self::MO_HEADER_SIZE) {
51
+ throw new InvalidResourceException('MO stream content has an invalid format.');
52
+ }
53
+ $magic = unpack('V1', fread($stream, 4));
54
+ $magic = hexdec(substr(dechex(current($magic)), -8));
55
+
56
+ if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) {
57
+ $isBigEndian = false;
58
+ } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) {
59
+ $isBigEndian = true;
60
+ } else {
61
+ throw new InvalidResourceException('MO stream content has an invalid format.');
62
+ }
63
+
64
+ // formatRevision
65
+ $this->readLong($stream, $isBigEndian);
66
+ $count = $this->readLong($stream, $isBigEndian);
67
+ $offsetId = $this->readLong($stream, $isBigEndian);
68
+ $offsetTranslated = $this->readLong($stream, $isBigEndian);
69
+ // sizeHashes
70
+ $this->readLong($stream, $isBigEndian);
71
+ // offsetHashes
72
+ $this->readLong($stream, $isBigEndian);
73
+
74
+ $messages = array();
75
+
76
+ for ($i = 0; $i < $count; ++$i) {
77
+ $pluralId = null;
78
+ $translated = null;
79
+
80
+ fseek($stream, $offsetId + $i * 8);
81
+
82
+ $length = $this->readLong($stream, $isBigEndian);
83
+ $offset = $this->readLong($stream, $isBigEndian);
84
+
85
+ if ($length < 1) {
86
+ continue;
87
+ }
88
+
89
+ fseek($stream, $offset);
90
+ $singularId = fread($stream, $length);
91
+
92
+ if (false !== strpos($singularId, "\000")) {
93
+ list($singularId, $pluralId) = explode("\000", $singularId);
94
+ }
95
+
96
+ fseek($stream, $offsetTranslated + $i * 8);
97
+ $length = $this->readLong($stream, $isBigEndian);
98
+ $offset = $this->readLong($stream, $isBigEndian);
99
+
100
+ if ($length < 1) {
101
+ continue;
102
+ }
103
+
104
+ fseek($stream, $offset);
105
+ $translated = fread($stream, $length);
106
+
107
+ if (false !== strpos($translated, "\000")) {
108
+ $translated = explode("\000", $translated);
109
+ }
110
+
111
+ $ids = array('singular' => $singularId, 'plural' => $pluralId);
112
+ $item = compact('ids', 'translated');
113
+
114
+ if (\is_array($item['translated'])) {
115
+ $messages[$item['ids']['singular']] = stripcslashes($item['translated'][0]);
116
+ if (isset($item['ids']['plural'])) {
117
+ $plurals = array();
118
+ foreach ($item['translated'] as $plural => $translated) {
119
+ $plurals[] = sprintf('{%d} %s', $plural, $translated);
120
+ }
121
+ $messages[$item['ids']['plural']] = stripcslashes(implode('|', $plurals));
122
+ }
123
+ } elseif (!empty($item['ids']['singular'])) {
124
+ $messages[$item['ids']['singular']] = stripcslashes($item['translated']);
125
+ }
126
+ }
127
+
128
+ fclose($stream);
129
+
130
+ return array_filter($messages);
131
+ }
132
+
133
+ /**
134
+ * Reads an unsigned long from stream respecting endianness.
135
+ *
136
+ * @param resource $stream
137
+ * @param bool $isBigEndian
138
+ *
139
+ * @return int
140
+ */
141
+ private function readLong($stream, $isBigEndian)
142
+ {
143
+ $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4));
144
+ $result = current($result);
145
+
146
+ return (int) substr($result, -8);
147
+ }
148
+ }
vendor/symfony/translation/Loader/PhpFileLoader.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /**
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 ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /**
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
+ *
23
+ * From http://www.gnu.org/software/gettext/manual/gettext.html#PO-Files
24
+ * we should be able to parse files having:
25
+ *
26
+ * white-space
27
+ * # translator-comments
28
+ * #. extracted-comments
29
+ * #: reference...
30
+ * #, flag...
31
+ * #| msgid previous-untranslated-string
32
+ * msgid untranslated-string
33
+ * msgstr translated-string
34
+ *
35
+ * extra or different lines are:
36
+ *
37
+ * #| msgctxt previous-context
38
+ * #| msgid previous-untranslated-string
39
+ * msgctxt context
40
+ *
41
+ * #| msgid previous-untranslated-string-singular
42
+ * #| msgid_plural previous-untranslated-string-plural
43
+ * msgid untranslated-string-singular
44
+ * msgid_plural untranslated-string-plural
45
+ * msgstr[0] translated-string-case-0
46
+ * ...
47
+ * msgstr[N] translated-string-case-n
48
+ *
49
+ * The definition states:
50
+ * - white-space and comments are optional.
51
+ * - msgid "" that an empty singleline defines a header.
52
+ *
53
+ * This parser sacrifices some features of the reference implementation the
54
+ * differences to that implementation are as follows.
55
+ * - No support for comments spanning multiple lines.
56
+ * - Translator and extracted comments are treated as being the same type.
57
+ * - Message IDs are allowed to have other encodings as just US-ASCII.
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
+
67
+ $defaults = array(
68
+ 'ids' => array(),
69
+ 'translated' => null,
70
+ );
71
+
72
+ $messages = array();
73
+ $item = $defaults;
74
+ $flags = array();
75
+
76
+ while ($line = fgets($stream)) {
77
+ $line = trim($line);
78
+
79
+ if ('' === $line) {
80
+ // Whitespace indicated current item is done
81
+ if (!\in_array('fuzzy', $flags)) {
82
+ $this->addMessage($messages, $item);
83
+ }
84
+ $item = $defaults;
85
+ $flags = array();
86
+ } elseif ('#,' === substr($line, 0, 2)) {
87
+ $flags = array_map('trim', explode(',', substr($line, 2)));
88
+ } elseif ('msgid "' === substr($line, 0, 7)) {
89
+ // We start a new msg so save previous
90
+ // TODO: this fails when comments or contexts are added
91
+ $this->addMessage($messages, $item);
92
+ $item = $defaults;
93
+ $item['ids']['singular'] = substr($line, 7, -1);
94
+ } elseif ('msgstr "' === substr($line, 0, 8)) {
95
+ $item['translated'] = substr($line, 8, -1);
96
+ } elseif ('"' === $line[0]) {
97
+ $continues = isset($item['translated']) ? 'translated' : 'ids';
98
+
99
+ if (\is_array($item[$continues])) {
100
+ end($item[$continues]);
101
+ $item[$continues][key($item[$continues])] .= substr($line, 1, -1);
102
+ } else {
103
+ $item[$continues] .= substr($line, 1, -1);
104
+ }
105
+ } elseif ('msgid_plural "' === substr($line, 0, 14)) {
106
+ $item['ids']['plural'] = substr($line, 14, -1);
107
+ } elseif ('msgstr[' === substr($line, 0, 7)) {
108
+ $size = strpos($line, ']');
109
+ $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1);
110
+ }
111
+ }
112
+ // save last item
113
+ if (!\in_array('fuzzy', $flags)) {
114
+ $this->addMessage($messages, $item);
115
+ }
116
+ fclose($stream);
117
+
118
+ return $messages;
119
+ }
120
+
121
+ /**
122
+ * Save a translation item to the messages.
123
+ *
124
+ * A .po file could contain by error missing plural indexes. We need to
125
+ * fix these before saving them.
126
+ */
127
+ private function addMessage(array &$messages, array $item)
128
+ {
129
+ if (\is_array($item['translated'])) {
130
+ $messages[stripcslashes($item['ids']['singular'])] = stripcslashes($item['translated'][0]);
131
+ if (isset($item['ids']['plural'])) {
132
+ $plurals = $item['translated'];
133
+ // PO are by definition indexed so sort by index.
134
+ ksort($plurals);
135
+ // Make sure every index is filled.
136
+ end($plurals);
137
+ $count = key($plurals);
138
+ // Fill missing spots with '-'.
139
+ $empties = array_fill(0, $count + 1, '-');
140
+ $plurals += $empties;
141
+ ksort($plurals);
142
+ $messages[stripcslashes($item['ids']['plural'])] = stripcslashes(implode('|', $plurals));
143
+ }
144
+ } elseif (!empty($item['ids']['singular'])) {
145
+ $messages[stripcslashes($item['ids']['singular'])] = stripcslashes($item['translated']);
146
+ }
147
+ }
148
+ }
vendor/symfony/translation/Loader/QtFileLoader.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Config\Resource\FileResource;
15
+ use Symfony\Component\Config\Util\XmlUtils;
16
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
17
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
18
+ use Symfony\Component\Translation\MessageCatalogue;
19
+
20
+ /**
21
+ * QtFileLoader loads translations from QT Translations XML files.
22
+ *
23
+ * @author Benjamin Eberlei <kontakt@beberlei.de>
24
+ */
25
+ class QtFileLoader implements LoaderInterface
26
+ {
27
+ /**
28
+ * {@inheritdoc}
29
+ */
30
+ public function load($resource, $locale, $domain = 'messages')
31
+ {
32
+ if (!stream_is_local($resource)) {
33
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
34
+ }
35
+
36
+ if (!file_exists($resource)) {
37
+ throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
38
+ }
39
+
40
+ try {
41
+ $dom = XmlUtils::loadFile($resource);
42
+ } catch (\InvalidArgumentException $e) {
43
+ throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e);
44
+ }
45
+
46
+ $internalErrors = libxml_use_internal_errors(true);
47
+ libxml_clear_errors();
48
+
49
+ $xpath = new \DOMXPath($dom);
50
+ $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]');
51
+
52
+ $catalogue = new MessageCatalogue($locale);
53
+ if (1 == $nodes->length) {
54
+ $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message');
55
+ foreach ($translations as $translation) {
56
+ $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue;
57
+
58
+ if (!empty($translationValue)) {
59
+ $catalogue->set(
60
+ (string) $translation->getElementsByTagName('source')->item(0)->nodeValue,
61
+ $translationValue,
62
+ $domain
63
+ );
64
+ }
65
+ $translation = $translation->nextSibling;
66
+ }
67
+
68
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
69
+ $catalogue->addResource(new FileResource($resource));
70
+ }
71
+ }
72
+
73
+ libxml_use_internal_errors($internalErrors);
74
+
75
+ return $catalogue;
76
+ }
77
+ }
vendor/symfony/translation/Loader/XliffFileLoader.php ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Config\Resource\FileResource;
15
+ use Symfony\Component\Config\Util\XmlUtils;
16
+ use Symfony\Component\Translation\Exception\InvalidResourceException;
17
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
18
+ use Symfony\Component\Translation\MessageCatalogue;
19
+
20
+ /**
21
+ * XliffFileLoader loads translations from XLIFF files.
22
+ *
23
+ * @author Fabien Potencier <fabien@symfony.com>
24
+ */
25
+ class XliffFileLoader implements LoaderInterface
26
+ {
27
+ /**
28
+ * {@inheritdoc}
29
+ */
30
+ public function load($resource, $locale, $domain = 'messages')
31
+ {
32
+ if (!stream_is_local($resource)) {
33
+ throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
34
+ }
35
+
36
+ if (!file_exists($resource)) {
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
+
86
+ if (!(isset($attributes['resname']) || isset($translation->source))) {
87
+ continue;
88
+ }
89
+
90
+ $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source;
91
+ // If the xlf file has another encoding specified, try to convert it because
92
+ // simple_xml will always return utf-8 encoded values
93
+ $target = $this->utf8ToCharset((string) (isset($translation->target) ? $translation->target : $translation->source), $encoding);
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
+ /**
146
+ * Convert a UTF8 string to the specified encoding.
147
+ *
148
+ * @param string $content String to decode
149
+ * @param string $encoding Target encoding
150
+ *
151
+ * @return string
152
+ */
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
+ * Validates and parses the given file into a DOMDocument.
164
+ *
165
+ * @param string $file
166
+ * @param \DOMDocument $dom
167
+ * @param string $schema source of the schema
168
+ *
169
+ * @throws \RuntimeException
170
+ * @throws InvalidResourceException
171
+ */
172
+ private function validateSchema($file, \DOMDocument $dom, $schema)
173
+ {
174
+ $internalErrors = libxml_use_internal_errors(true);
175
+
176
+ $disableEntities = libxml_disable_entity_loader(false);
177
+
178
+ if (!@$dom->schemaValidateSource($schema)) {
179
+ libxml_disable_entity_loader($disableEntities);
180
+
181
+ throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $file, implode("\n", $this->getXmlErrors($internalErrors))));
182
+ }
183
+
184
+ libxml_disable_entity_loader($disableEntities);
185
+
186
+ $dom->normalizeDocument();
187
+
188
+ libxml_clear_errors();
189
+ libxml_use_internal_errors($internalErrors);
190
+ }
191
+
192
+ private function getSchema($xliffVersion)
193
+ {
194
+ if ('1.2' === $xliffVersion) {
195
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
196
+ $xmlUri = 'http://www.w3.org/2001/xml.xsd';
197
+ } elseif ('2.0' === $xliffVersion) {
198
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd');
199
+ $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
200
+ } else {
201
+ throw new \InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
202
+ }
203
+
204
+ return $this->fixXmlLocation($schemaSource, $xmlUri);
205
+ }
206
+
207
+ /**
208
+ * Internally changes the URI of a dependent xsd to be loaded locally.
209
+ *
210
+ * @param string $schemaSource Current content of schema file
211
+ * @param string $xmlUri External URI of XML to convert to local
212
+ *
213
+ * @return string
214
+ */
215
+ private function fixXmlLocation($schemaSource, $xmlUri)
216
+ {
217
+ $newPath = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
218
+ $parts = explode('/', $newPath);
219
+ $locationstart = 'file:///';
220
+ if (0 === stripos($newPath, 'phar://')) {
221
+ $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
222
+ if ($tmpfile) {
223
+ copy($newPath, $tmpfile);
224
+ $parts = explode('/', str_replace('\\', '/', $tmpfile));
225
+ } else {
226
+ array_shift($parts);
227
+ $locationstart = 'phar:///';
228
+ }
229
+ }
230
+ $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
231
+ $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts));
232
+
233
+ return str_replace($xmlUri, $newPath, $schemaSource);
234
+ }
235
+
236
+ /**
237
+ * Returns the XML errors of the internal XML parser.
238
+ *
239
+ * @param bool $internalErrors
240
+ *
241
+ * @return array An array of errors
242
+ */
243
+ private function getXmlErrors($internalErrors)
244
+ {
245
+ $errors = array();
246
+ foreach (libxml_get_errors() as $error) {
247
+ $errors[] = sprintf('[%s %s] %s (in %s - line %d, column %d)',
248
+ LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR',
249
+ $error->code,
250
+ trim($error->message),
251
+ $error->file ?: 'n/a',
252
+ $error->line,
253
+ $error->column
254
+ );
255
+ }
256
+
257
+ libxml_clear_errors();
258
+ libxml_use_internal_errors($internalErrors);
259
+
260
+ return $errors;
261
+ }
262
+
263
+ /**
264
+ * Gets xliff file version based on the root "version" attribute.
265
+ * Defaults to 1.2 for backwards compatibility.
266
+ *
267
+ * @param \DOMDocument $dom
268
+ *
269
+ * @throws \InvalidArgumentException
270
+ *
271
+ * @return string
272
+ */
273
+ private function getVersionNumber(\DOMDocument $dom)
274
+ {
275
+ /** @var \DOMNode $xliff */
276
+ foreach ($dom->getElementsByTagName('xliff') as $xliff) {
277
+ $version = $xliff->attributes->getNamedItem('version');
278
+ if ($version) {
279
+ return $version->nodeValue;
280
+ }
281
+
282
+ $namespace = $xliff->attributes->getNamedItem('xmlns');
283
+ if ($namespace) {
284
+ if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) {
285
+ throw new \InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace));
286
+ }
287
+
288
+ return substr($namespace, 34);
289
+ }
290
+ }
291
+
292
+ // Falls back to v1.2
293
+ return '1.2';
294
+ }
295
+
296
+ /*
297
+ * @param \SimpleXMLElement|null $noteElement
298
+ * @param string|null $encoding
299
+ *
300
+ * @return array
301
+ */
302
+ private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, $encoding = null)
303
+ {
304
+ $notes = array();
305
+
306
+ if (null === $noteElement) {
307
+ return $notes;
308
+ }
309
+
310
+ foreach ($noteElement as $xmlNote) {
311
+ $noteAttributes = $xmlNote->attributes();
312
+ $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
313
+ if (isset($noteAttributes['priority'])) {
314
+ $note['priority'] = (int) $noteAttributes['priority'];
315
+ }
316
+
317
+ if (isset($noteAttributes['from'])) {
318
+ $note['from'] = (string) $noteAttributes['from'];
319
+ }
320
+
321
+ $notes[] = $note;
322
+ }
323
+
324
+ return $notes;
325
+ }
326
+ }
vendor/symfony/translation/Loader/YamlFileLoader.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Yaml\Exception\ParseException;
16
+ use Symfony\Component\Yaml\Parser as YamlParser;
17
+
18
+ /**
19
+ * YamlFileLoader loads translations from Yaml files.
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
+
40
+ try {
41
+ $messages = $this->yamlParser->parse(file_get_contents($resource));
42
+ } catch (ParseException $e) {
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-1.2-strict.xsd ADDED
@@ -0,0 +1,2223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+
3
+ <!--
4
+
5
+ May-19-2004:
6
+ - Changed the <choice> for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements
7
+ to <choice> itself.
8
+ - Added <choice> for ElemType_trans-unit to allow "any order" for <context-group>, <count-group>, <prop-group>, <note>, and
9
+ <alt-trans>.
10
+
11
+ Oct-2005
12
+ - updated version info to 1.2
13
+ - equiv-trans attribute to <trans-unit> element
14
+ - merged-trans attribute for <group> element
15
+ - Add the <seg-source> element as optional in the <trans-unit> and <alt-trans> content models, at the same level as <source>
16
+ - Create a new value "seg" for the mtype attribute of the <mrk> element
17
+ - Add mid as an optional attribute for the <alt-trans> element
18
+
19
+ Nov-14-2005
20
+ - Changed name attribute for <context-group> from required to optional
21
+ - Added extension point at <xliff>
22
+
23
+ Jan-9-2006
24
+ - Added alttranstype type attribute to <alt-trans>, and values
25
+
26
+ Jan-10-2006
27
+ - Corrected error with overwritten purposeValueList
28
+ - Corrected name="AttrType_Version", attribute should have been "name"
29
+
30
+ -->
31
+ <xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en">
32
+ <!-- Import for xml:lang and xml:space -->
33
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>
34
+ <!-- Attributes Lists -->
35
+ <xsd:simpleType name="XTend">
36
+ <xsd:restriction base="xsd:string">
37
+ <xsd:pattern value="x-[^\s]+"/>
38
+ </xsd:restriction>
39
+ </xsd:simpleType>
40
+ <xsd:simpleType name="context-typeValueList">
41
+ <xsd:annotation>
42
+ <xsd:documentation>Values for the attribute 'context-type'.</xsd:documentation>
43
+ </xsd:annotation>
44
+ <xsd:restriction base="xsd:string">
45
+ <xsd:enumeration value="database">
46
+ <xsd:annotation>
47
+ <xsd:documentation>Indicates a database content.</xsd:documentation>
48
+ </xsd:annotation>
49
+ </xsd:enumeration>
50
+ <xsd:enumeration value="element">
51
+ <xsd:annotation>
52
+ <xsd:documentation>Indicates the content of an element within an XML document.</xsd:documentation>
53
+ </xsd:annotation>
54
+ </xsd:enumeration>
55
+ <xsd:enumeration value="elementtitle">
56
+ <xsd:annotation>
57
+ <xsd:documentation>Indicates the name of an element within an XML document.</xsd:documentation>
58
+ </xsd:annotation>
59
+ </xsd:enumeration>
60
+ <xsd:enumeration value="linenumber">
61
+ <xsd:annotation>
62
+ <xsd:documentation>Indicates the line number from the sourcefile (see context-type="sourcefile") where the &lt;source&gt; is found.</xsd:documentation>
63
+ </xsd:annotation>
64
+ </xsd:enumeration>
65
+ <xsd:enumeration value="numparams">
66
+ <xsd:annotation>
67
+ <xsd:documentation>Indicates a the number of parameters contained within the &lt;source&gt;.</xsd:documentation>
68
+ </xsd:annotation>
69
+ </xsd:enumeration>
70
+ <xsd:enumeration value="paramnotes">
71
+ <xsd:annotation>
72
+ <xsd:documentation>Indicates notes pertaining to the parameters in the &lt;source&gt;.</xsd:documentation>
73
+ </xsd:annotation>
74
+ </xsd:enumeration>
75
+ <xsd:enumeration value="record">
76
+ <xsd:annotation>
77
+ <xsd:documentation>Indicates the content of a record within a database.</xsd:documentation>
78
+ </xsd:annotation>
79
+ </xsd:enumeration>
80
+ <xsd:enumeration value="recordtitle">
81
+ <xsd:annotation>
82
+ <xsd:documentation>Indicates the name of a record within a database.</xsd:documentation>
83
+ </xsd:annotation>
84
+ </xsd:enumeration>
85
+ <xsd:enumeration value="sourcefile">
86
+ <xsd:annotation>
87
+ <xsd:documentation>Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original &lt;file&gt; attribute in that this sourcefile is one of many that make up that file.</xsd:documentation>
88
+ </xsd:annotation>
89
+ </xsd:enumeration>
90
+ </xsd:restriction>
91
+ </xsd:simpleType>
92
+ <xsd:simpleType name="count-typeValueList">
93
+ <xsd:annotation>
94
+ <xsd:documentation>Values for the attribute 'count-type'.</xsd:documentation>
95
+ </xsd:annotation>
96
+ <xsd:restriction base="xsd:NMTOKEN">
97
+ <xsd:enumeration value="num-usages">
98
+ <xsd:annotation>
99
+ <xsd:documentation>Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.</xsd:documentation>
100
+ </xsd:annotation>
101
+ </xsd:enumeration>
102
+ <xsd:enumeration value="repetition">
103
+ <xsd:annotation>
104
+ <xsd:documentation>Indicates the count units are translation units existing already in the same document.</xsd:documentation>
105
+ </xsd:annotation>
106
+ </xsd:enumeration>
107
+ <xsd:enumeration value="total">
108
+ <xsd:annotation>
109
+ <xsd:documentation>Indicates a total count.</xsd:documentation>
110
+ </xsd:annotation>
111
+ </xsd:enumeration>
112
+ </xsd:restriction>
113
+ </xsd:simpleType>
114
+ <xsd:simpleType name="InlineDelimitersValueList">
115
+ <xsd:annotation>
116
+ <xsd:documentation>Values for the attribute 'ctype' when used other elements than &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
117
+ </xsd:annotation>
118
+ <xsd:restriction base="xsd:NMTOKEN">
119
+ <xsd:enumeration value="bold">
120
+ <xsd:annotation>
121
+ <xsd:documentation>Indicates a run of bolded text.</xsd:documentation>
122
+ </xsd:annotation>
123
+ </xsd:enumeration>
124
+ <xsd:enumeration value="italic">
125
+ <xsd:annotation>
126
+ <xsd:documentation>Indicates a run of text in italics.</xsd:documentation>
127
+ </xsd:annotation>
128
+ </xsd:enumeration>
129
+ <xsd:enumeration value="underlined">
130
+ <xsd:annotation>
131
+ <xsd:documentation>Indicates a run of underlined text.</xsd:documentation>
132
+ </xsd:annotation>
133
+ </xsd:enumeration>
134
+ <xsd:enumeration value="link">
135
+ <xsd:annotation>
136
+ <xsd:documentation>Indicates a run of hyper-text.</xsd:documentation>
137
+ </xsd:annotation>
138
+ </xsd:enumeration>
139
+ </xsd:restriction>
140
+ </xsd:simpleType>
141
+ <xsd:simpleType name="InlinePlaceholdersValueList">
142
+ <xsd:annotation>
143
+ <xsd:documentation>Values for the attribute 'ctype' when used with &lt;ph&gt; or &lt;x&gt;.</xsd:documentation>
144
+ </xsd:annotation>
145
+ <xsd:restriction base="xsd:NMTOKEN">
146
+ <xsd:enumeration value="image">
147
+ <xsd:annotation>
148
+ <xsd:documentation>Indicates a inline image.</xsd:documentation>
149
+ </xsd:annotation>
150
+ </xsd:enumeration>
151
+ <xsd:enumeration value="pb">
152
+ <xsd:annotation>
153
+ <xsd:documentation>Indicates a page break.</xsd:documentation>
154
+ </xsd:annotation>
155
+ </xsd:enumeration>
156
+ <xsd:enumeration value="lb">
157
+ <xsd:annotation>
158
+ <xsd:documentation>Indicates a line break.</xsd:documentation>
159
+ </xsd:annotation>
160
+ </xsd:enumeration>
161
+ </xsd:restriction>
162
+ </xsd:simpleType>
163
+ <xsd:simpleType name="mime-typeValueList">
164
+ <xsd:restriction base="xsd:string">
165
+ <xsd:pattern value="(text|multipart|message|application|image|audio|video|model)(/.+)*"/>
166
+ </xsd:restriction>
167
+ </xsd:simpleType>
168
+ <xsd:simpleType name="datatypeValueList">
169
+ <xsd:annotation>
170
+ <xsd:documentation>Values for the attribute 'datatype'.</xsd:documentation>
171
+ </xsd:annotation>
172
+ <xsd:restriction base="xsd:NMTOKEN">
173
+ <xsd:enumeration value="asp">
174
+ <xsd:annotation>
175
+ <xsd:documentation>Indicates Active Server Page data.</xsd:documentation>
176
+ </xsd:annotation>
177
+ </xsd:enumeration>
178
+ <xsd:enumeration value="c">
179
+ <xsd:annotation>
180
+ <xsd:documentation>Indicates C source file data.</xsd:documentation>
181
+ </xsd:annotation>
182
+ </xsd:enumeration>
183
+ <xsd:enumeration value="cdf">
184
+ <xsd:annotation>
185
+ <xsd:documentation>Indicates Channel Definition Format (CDF) data.</xsd:documentation>
186
+ </xsd:annotation>
187
+ </xsd:enumeration>
188
+ <xsd:enumeration value="cfm">
189
+ <xsd:annotation>
190
+ <xsd:documentation>Indicates ColdFusion data.</xsd:documentation>
191
+ </xsd:annotation>
192
+ </xsd:enumeration>
193
+ <xsd:enumeration value="cpp">
194
+ <xsd:annotation>
195
+ <xsd:documentation>Indicates C++ source file data.</xsd:documentation>
196
+ </xsd:annotation>
197
+ </xsd:enumeration>
198
+ <xsd:enumeration value="csharp">
199
+ <xsd:annotation>
200
+ <xsd:documentation>Indicates C-Sharp data.</xsd:documentation>
201
+ </xsd:annotation>
202
+ </xsd:enumeration>
203
+ <xsd:enumeration value="cstring">
204
+ <xsd:annotation>
205
+ <xsd:documentation>Indicates strings from C, ASM, and driver files data.</xsd:documentation>
206
+ </xsd:annotation>
207
+ </xsd:enumeration>
208
+ <xsd:enumeration value="csv">
209
+ <xsd:annotation>
210
+ <xsd:documentation>Indicates comma-separated values data.</xsd:documentation>
211
+ </xsd:annotation>
212
+ </xsd:enumeration>
213
+ <xsd:enumeration value="database">
214
+ <xsd:annotation>
215
+ <xsd:documentation>Indicates database data.</xsd:documentation>
216
+ </xsd:annotation>
217
+ </xsd:enumeration>
218
+ <xsd:enumeration value="documentfooter">
219
+ <xsd:annotation>
220
+ <xsd:documentation>Indicates portions of document that follows data and contains metadata.</xsd:documentation>
221
+ </xsd:annotation>
222
+ </xsd:enumeration>
223
+ <xsd:enumeration value="documentheader">
224
+ <xsd:annotation>
225
+ <xsd:documentation>Indicates portions of document that precedes data and contains metadata.</xsd:documentation>
226
+ </xsd:annotation>
227
+ </xsd:enumeration>
228
+ <xsd:enumeration value="filedialog">
229
+ <xsd:annotation>
230
+ <xsd:documentation>Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).</xsd:documentation>
231
+ </xsd:annotation>
232
+ </xsd:enumeration>
233
+ <xsd:enumeration value="form">
234
+ <xsd:annotation>
235
+ <xsd:documentation>Indicates standard user input screen data.</xsd:documentation>
236
+ </xsd:annotation>
237
+ </xsd:enumeration>
238
+ <xsd:enumeration value="html">
239
+ <xsd:annotation>
240
+ <xsd:documentation>Indicates HyperText Markup Language (HTML) data - document instance.</xsd:documentation>
241
+ </xsd:annotation>
242
+ </xsd:enumeration>
243
+ <xsd:enumeration value="htmlbody">
244
+ <xsd:annotation>
245
+ <xsd:documentation>Indicates content within an HTML document’s &lt;body&gt; element.</xsd:documentation>
246
+ </xsd:annotation>
247
+ </xsd:enumeration>
248
+ <xsd:enumeration value="ini">
249
+ <xsd:annotation>
250
+ <xsd:documentation>Indicates Windows INI file data.</xsd:documentation>
251
+ </xsd:annotation>
252
+ </xsd:enumeration>
253
+ <xsd:enumeration value="interleaf">
254
+ <xsd:annotation>
255
+ <xsd:documentation>Indicates Interleaf data.</xsd:documentation>
256
+ </xsd:annotation>
257
+ </xsd:enumeration>
258
+ <xsd:enumeration value="javaclass">
259
+ <xsd:annotation>
260
+ <xsd:documentation>Indicates Java source file data (extension '.java').</xsd:documentation>
261
+ </xsd:annotation>
262
+ </xsd:enumeration>
263
+ <xsd:enumeration value="javapropertyresourcebundle">
264
+ <xsd:annotation>
265
+ <xsd:documentation>Indicates Java property resource bundle data.</xsd:documentation>
266
+ </xsd:annotation>
267
+ </xsd:enumeration>
268
+ <xsd:enumeration value="javalistresourcebundle">
269
+ <xsd:annotation>
270
+ <xsd:documentation>Indicates Java list resource bundle data.</xsd:documentation>
271
+ </xsd:annotation>
272
+ </xsd:enumeration>
273
+ <xsd:enumeration value="javascript">
274
+ <xsd:annotation>
275
+ <xsd:documentation>Indicates JavaScript source file data.</xsd:documentation>
276
+ </xsd:annotation>
277
+ </xsd:enumeration>
278
+ <xsd:enumeration value="jscript">
279
+ <xsd:annotation>
280
+ <xsd:documentation>Indicates JScript source file data.</xsd:documentation>
281
+ </xsd:annotation>
282
+ </xsd:enumeration>
283
+ <xsd:enumeration value="layout">
284
+ <xsd:annotation>
285
+ <xsd:documentation>Indicates information relating to formatting.</xsd:documentation>
286
+ </xsd:annotation>
287
+ </xsd:enumeration>
288
+ <xsd:enumeration value="lisp">
289
+ <xsd:annotation>
290
+ <xsd:documentation>Indicates LISP source file data.</xsd:documentation>
291
+ </xsd:annotation>
292
+ </xsd:enumeration>
293
+ <xsd:enumeration value="margin">
294
+ <xsd:annotation>
295
+ <xsd:documentation>Indicates information relating to margin formats.</xsd:documentation>
296
+ </xsd:annotation>
297
+ </xsd:enumeration>
298
+ <xsd:enumeration value="menufile">
299
+ <xsd:annotation>
300
+ <xsd:documentation>Indicates a file containing menu.</xsd:documentation>
301
+ </xsd:annotation>
302
+ </xsd:enumeration>
303
+ <xsd:enumeration value="messagefile">
304
+ <xsd:annotation>
305
+ <xsd:documentation>Indicates numerically identified string table.</xsd:documentation>
306
+ </xsd:annotation>
307
+ </xsd:enumeration>
308
+ <xsd:enumeration value="mif">
309
+ <xsd:annotation>
310
+ <xsd:documentation>Indicates Maker Interchange Format (MIF) data.</xsd:documentation>
311
+ </xsd:annotation>
312
+ </xsd:enumeration>
313
+ <xsd:enumeration value="mimetype">
314
+ <xsd:annotation>
315
+ <xsd:documentation>Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.</xsd:documentation>
316
+ </xsd:annotation>
317
+ </xsd:enumeration>
318
+ <xsd:enumeration value="mo">
319
+ <xsd:annotation>
320
+ <xsd:documentation>Indicates GNU Machine Object data.</xsd:documentation>
321
+ </xsd:annotation>
322
+ </xsd:enumeration>
323
+ <xsd:enumeration value="msglib">
324
+ <xsd:annotation>
325
+ <xsd:documentation>Indicates Message Librarian strings created by Novell's Message Librarian Tool.</xsd:documentation>
326
+ </xsd:annotation>
327
+ </xsd:enumeration>
328
+ <xsd:enumeration value="pagefooter">
329
+ <xsd:annotation>
330
+ <xsd:documentation>Indicates information to be displayed at the bottom of each page of a document.</xsd:documentation>
331
+ </xsd:annotation>
332
+ </xsd:enumeration>
333
+ <xsd:enumeration value="pageheader">
334
+ <xsd:annotation>
335
+ <xsd:documentation>Indicates information to be displayed at the top of each page of a document.</xsd:documentation>
336
+ </xsd:annotation>
337
+ </xsd:enumeration>
338
+ <xsd:enumeration value="parameters">
339
+ <xsd:annotation>
340
+ <xsd:documentation>Indicates a list of property values (e.g., settings within INI files or preferences dialog).</xsd:documentation>
341
+ </xsd:annotation>
342
+ </xsd:enumeration>
343
+ <xsd:enumeration value="pascal">
344
+ <xsd:annotation>
345
+ <xsd:documentation>Indicates Pascal source file data.</xsd:documentation>
346
+ </xsd:annotation>
347
+ </xsd:enumeration>
348
+ <xsd:enumeration value="php">
349
+ <xsd:annotation>
350
+ <xsd:documentation>Indicates Hypertext Preprocessor data.</xsd:documentation>
351
+ </xsd:annotation>
352
+ </xsd:enumeration>
353
+ <xsd:enumeration value="plaintext">
354
+ <xsd:annotation>
355
+ <xsd:documentation>Indicates plain text file (no formatting other than, possibly, wrapping).</xsd:documentation>
356
+ </xsd:annotation>
357
+ </xsd:enumeration>
358
+ <xsd:enumeration value="po">
359
+ <xsd:annotation>
360
+ <xsd:documentation>Indicates GNU Portable Object file.</xsd:documentation>
361
+ </xsd:annotation>
362
+ </xsd:enumeration>
363
+ <xsd:enumeration value="report">
364
+ <xsd:annotation>
365
+ <xsd:documentation>Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.</xsd:documentation>
366
+ </xsd:annotation>
367
+ </xsd:enumeration>
368
+ <xsd:enumeration value="resources">
369
+ <xsd:annotation>
370
+ <xsd:documentation>Indicates Windows .NET binary resources.</xsd:documentation>
371
+ </xsd:annotation>
372
+ </xsd:enumeration>
373
+ <xsd:enumeration value="resx">
374
+ <xsd:annotation>
375
+ <xsd:documentation>Indicates Windows .NET Resources.</xsd:documentation>
376
+ </xsd:annotation>
377
+ </xsd:enumeration>
378
+ <xsd:enumeration value="rtf">
379
+ <xsd:annotation>
380
+ <xsd:documentation>Indicates Rich Text Format (RTF) data.</xsd:documentation>
381
+ </xsd:annotation>
382
+ </xsd:enumeration>
383
+ <xsd:enumeration value="sgml">
384
+ <xsd:annotation>
385
+ <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - document instance.</xsd:documentation>
386
+ </xsd:annotation>
387
+ </xsd:enumeration>
388
+ <xsd:enumeration value="sgmldtd">
389
+ <xsd:annotation>
390
+ <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).</xsd:documentation>
391
+ </xsd:annotation>
392
+ </xsd:enumeration>
393
+ <xsd:enumeration value="svg">
394
+ <xsd:annotation>
395
+ <xsd:documentation>Indicates Scalable Vector Graphic (SVG) data.</xsd:documentation>
396
+ </xsd:annotation>
397
+ </xsd:enumeration>
398
+ <xsd:enumeration value="vbscript">
399
+ <xsd:annotation>
400
+ <xsd:documentation>Indicates VisualBasic Script source file.</xsd:documentation>
401
+ </xsd:annotation>
402
+ </xsd:enumeration>
403
+ <xsd:enumeration value="warning">
404
+ <xsd:annotation>
405
+ <xsd:documentation>Indicates warning message.</xsd:documentation>
406
+ </xsd:annotation>
407
+ </xsd:enumeration>
408
+ <xsd:enumeration value="winres">
409
+ <xsd:annotation>
410
+ <xsd:documentation>Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).</xsd:documentation>
411
+ </xsd:annotation>
412
+ </xsd:enumeration>
413
+ <xsd:enumeration value="xhtml">
414
+ <xsd:annotation>
415
+ <xsd:documentation>Indicates Extensible HyperText Markup Language (XHTML) data - document instance.</xsd:documentation>
416
+ </xsd:annotation>
417
+ </xsd:enumeration>
418
+ <xsd:enumeration value="xml">
419
+ <xsd:annotation>
420
+ <xsd:documentation>Indicates Extensible Markup Language (XML) data - document instance.</xsd:documentation>
421
+ </xsd:annotation>
422
+ </xsd:enumeration>
423
+ <xsd:enumeration value="xmldtd">
424
+ <xsd:annotation>
425
+ <xsd:documentation>Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).</xsd:documentation>
426
+ </xsd:annotation>
427
+ </xsd:enumeration>
428
+ <xsd:enumeration value="xsl">
429
+ <xsd:annotation>
430
+ <xsd:documentation>Indicates Extensible Stylesheet Language (XSL) data.</xsd:documentation>
431
+ </xsd:annotation>
432
+ </xsd:enumeration>
433
+ <xsd:enumeration value="xul">
434
+ <xsd:annotation>
435
+ <xsd:documentation>Indicates XUL elements.</xsd:documentation>
436
+ </xsd:annotation>
437
+ </xsd:enumeration>
438
+ </xsd:restriction>
439
+ </xsd:simpleType>
440
+ <xsd:simpleType name="mtypeValueList">
441
+ <xsd:annotation>
442
+ <xsd:documentation>Values for the attribute 'mtype'.</xsd:documentation>
443
+ </xsd:annotation>
444
+ <xsd:restriction base="xsd:NMTOKEN">
445
+ <xsd:enumeration value="abbrev">
446
+ <xsd:annotation>
447
+ <xsd:documentation>Indicates the marked text is an abbreviation.</xsd:documentation>
448
+ </xsd:annotation>
449
+ </xsd:enumeration>
450
+ <xsd:enumeration value="abbreviated-form">
451
+ <xsd:annotation>
452
+ <xsd:documentation>ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.</xsd:documentation>
453
+ </xsd:annotation>
454
+ </xsd:enumeration>
455
+ <xsd:enumeration value="abbreviation">
456
+ <xsd:annotation>
457
+ <xsd:documentation>ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').</xsd:documentation>
458
+ </xsd:annotation>
459
+ </xsd:enumeration>
460
+ <xsd:enumeration value="acronym">
461
+ <xsd:annotation>
462
+ <xsd:documentation>ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').</xsd:documentation>
463
+ </xsd:annotation>
464
+ </xsd:enumeration>
465
+ <xsd:enumeration value="appellation">
466
+ <xsd:annotation>
467
+ <xsd:documentation>ISO-12620: A proper-name term, such as the name of an agency or other proper entity.</xsd:documentation>
468
+ </xsd:annotation>
469
+ </xsd:enumeration>
470
+ <xsd:enumeration value="collocation">
471
+ <xsd:annotation>
472
+ <xsd:documentation>ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.</xsd:documentation>
473
+ </xsd:annotation>
474
+ </xsd:enumeration>
475
+ <xsd:enumeration value="common-name">
476
+ <xsd:annotation>
477
+ <xsd:documentation>ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.</xsd:documentation>
478
+ </xsd:annotation>
479
+ </xsd:enumeration>
480
+ <xsd:enumeration value="datetime">
481
+ <xsd:annotation>
482
+ <xsd:documentation>Indicates the marked text is a date and/or time.</xsd:documentation>
483
+ </xsd:annotation>
484
+ </xsd:enumeration>
485
+ <xsd:enumeration value="equation">
486
+ <xsd:annotation>
487
+ <xsd:documentation>ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.</xsd:documentation>
488
+ </xsd:annotation>
489
+ </xsd:enumeration>
490
+ <xsd:enumeration value="expanded-form">
491
+ <xsd:annotation>
492
+ <xsd:documentation>ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.</xsd:documentation>
493
+ </xsd:annotation>
494
+ </xsd:enumeration>
495
+ <xsd:enumeration value="formula">
496
+ <xsd:annotation>
497
+ <xsd:documentation>ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.</xsd:documentation>
498
+ </xsd:annotation>
499
+ </xsd:enumeration>
500
+ <xsd:enumeration value="head-term">
501
+ <xsd:annotation>
502
+ <xsd:documentation>ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.</xsd:documentation>
503
+ </xsd:annotation>
504
+ </xsd:enumeration>
505
+ <xsd:enumeration value="initialism">
506
+ <xsd:annotation>
507
+ <xsd:documentation>ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').</xsd:documentation>
508
+ </xsd:annotation>
509
+ </xsd:enumeration>
510
+ <xsd:enumeration value="international-scientific-term">
511
+ <xsd:annotation>
512
+ <xsd:documentation>ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.</xsd:documentation>
513
+ </xsd:annotation>
514
+ </xsd:enumeration>
515
+ <xsd:enumeration value="internationalism">
516
+ <xsd:annotation>
517
+ <xsd:documentation>ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.</xsd:documentation>
518
+ </xsd:annotation>
519
+ </xsd:enumeration>
520
+ <xsd:enumeration value="logical-expression">
521
+ <xsd:annotation>
522
+ <xsd:documentation>ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.</xsd:documentation>
523
+ </xsd:annotation>
524
+ </xsd:enumeration>
525
+ <xsd:enumeration value="materials-management-unit">
526
+ <xsd:annotation>
527
+ <xsd:documentation>ISO-12620 2.1.17: A unit to track object.</xsd:documentation>
528
+ </xsd:annotation>
529
+ </xsd:enumeration>
530
+ <xsd:enumeration value="name">
531
+ <xsd:annotation>
532
+ <xsd:documentation>Indicates the marked text is a name.</xsd:documentation>
533
+ </xsd:annotation>
534
+ </xsd:enumeration>
535
+ <xsd:enumeration value="near-synonym">
536
+ <xsd:annotation>
537
+ <xsd:documentation>ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.</xsd:documentation>
538
+ </xsd:annotation>
539
+ </xsd:enumeration>
540
+ <xsd:enumeration value="part-number">
541
+ <xsd:annotation>
542
+ <xsd:documentation>ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.</xsd:documentation>
543
+ </xsd:annotation>
544
+ </xsd:enumeration>
545
+ <xsd:enumeration value="phrase">
546
+ <xsd:annotation>
547
+ <xsd:documentation>Indicates the marked text is a phrase.</xsd:documentation>
548
+ </xsd:annotation>
549
+ </xsd:enumeration>
550
+ <xsd:enumeration value="phraseological-unit">
551
+ <xsd:annotation>
552
+ <xsd:documentation>ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.</xsd:documentation>
553
+ </xsd:annotation>
554
+ </xsd:enumeration>
555
+ <xsd:enumeration value="protected">
556
+ <xsd:annotation>
557
+ <xsd:documentation>Indicates the marked text should not be translated.</xsd:documentation>
558
+ </xsd:annotation>
559
+ </xsd:enumeration>
560
+ <xsd:enumeration value="romanized-form">
561
+ <xsd:annotation>
562
+ <xsd:documentation>ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.</xsd:documentation>
563
+ </xsd:annotation>
564
+ </xsd:enumeration>
565
+ <xsd:enumeration value="seg">
566
+ <xsd:annotation>
567
+ <xsd:documentation>Indicates that the marked text represents a segment.</xsd:documentation>
568
+ </xsd:annotation>
569
+ </xsd:enumeration>
570
+ <xsd:enumeration value="set-phrase">
571
+ <xsd:annotation>
572
+ <xsd:documentation>ISO-12620 2.1.18.2: A fixed, lexicalized phrase.</xsd:documentation>
573
+ </xsd:annotation>
574
+ </xsd:enumeration>
575
+ <xsd:enumeration value="short-form">
576
+ <xsd:annotation>
577
+ <xsd:documentation>ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').</xsd:documentation>
578
+ </xsd:annotation>
579
+ </xsd:enumeration>
580
+ <xsd:enumeration value="sku">
581
+ <xsd:annotation>
582
+ <xsd:documentation>ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.</xsd:documentation>
583
+ </xsd:annotation>
584
+ </xsd:enumeration>
585
+ <xsd:enumeration value="standard-text">
586
+ <xsd:annotation>
587
+ <xsd:documentation>ISO-12620 2.1.19: A fixed chunk of recurring text.</xsd:documentation>
588
+ </xsd:annotation>
589
+ </xsd:enumeration>
590
+ <xsd:enumeration value="symbol">
591
+ <xsd:annotation>
592
+ <xsd:documentation>ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.</xsd:documentation>
593
+ </xsd:annotation>
594
+ </xsd:enumeration>
595
+ <xsd:enumeration value="synonym">
596
+ <xsd:annotation>
597
+ <xsd:documentation>ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.</xsd:documentation>
598
+ </xsd:annotation>
599
+ </xsd:enumeration>
600
+ <xsd:enumeration value="synonymous-phrase">
601
+ <xsd:annotation>
602
+ <xsd:documentation>ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.</xsd:documentation>
603
+ </xsd:annotation>
604
+ </xsd:enumeration>
605
+ <xsd:enumeration value="term">
606
+ <xsd:annotation>
607
+ <xsd:documentation>Indicates the marked text is a term.</xsd:documentation>
608
+ </xsd:annotation>
609
+ </xsd:enumeration>
610
+ <xsd:enumeration value="transcribed-form">
611
+ <xsd:annotation>
612
+ <xsd:documentation>ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.</xsd:documentation>
613
+ </xsd:annotation>
614
+ </xsd:enumeration>
615
+ <xsd:enumeration value="transliterated-form">
616
+ <xsd:annotation>
617
+ <xsd:documentation>ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.</xsd:documentation>
618
+ </xsd:annotation>
619
+ </xsd:enumeration>
620
+ <xsd:enumeration value="truncated-term">
621
+ <xsd:annotation>
622
+ <xsd:documentation>ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').</xsd:documentation>
623
+ </xsd:annotation>
624
+ </xsd:enumeration>
625
+ <xsd:enumeration value="variant">
626
+ <xsd:annotation>
627
+ <xsd:documentation>ISO-12620 2.1.9: One of the alternate forms of a term.</xsd:documentation>
628
+ </xsd:annotation>
629
+ </xsd:enumeration>
630
+ </xsd:restriction>
631
+ </xsd:simpleType>
632
+ <xsd:simpleType name="restypeValueList">
633
+ <xsd:annotation>
634
+ <xsd:documentation>Values for the attribute 'restype'.</xsd:documentation>
635
+ </xsd:annotation>
636
+ <xsd:restriction base="xsd:NMTOKEN">
637
+ <xsd:enumeration value="auto3state">
638
+ <xsd:annotation>
639
+ <xsd:documentation>Indicates a Windows RC AUTO3STATE control.</xsd:documentation>
640
+ </xsd:annotation>
641
+ </xsd:enumeration>
642
+ <xsd:enumeration value="autocheckbox">
643
+ <xsd:annotation>
644
+ <xsd:documentation>Indicates a Windows RC AUTOCHECKBOX control.</xsd:documentation>
645
+ </xsd:annotation>
646
+ </xsd:enumeration>
647
+ <xsd:enumeration value="autoradiobutton">
648
+ <xsd:annotation>
649
+ <xsd:documentation>Indicates a Windows RC AUTORADIOBUTTON control.</xsd:documentation>
650
+ </xsd:annotation>
651
+ </xsd:enumeration>
652
+ <xsd:enumeration value="bedit">
653
+ <xsd:annotation>
654
+ <xsd:documentation>Indicates a Windows RC BEDIT control.</xsd:documentation>
655
+ </xsd:annotation>
656
+ </xsd:enumeration>
657
+ <xsd:enumeration value="bitmap">
658
+ <xsd:annotation>
659
+ <xsd:documentation>Indicates a bitmap, for example a BITMAP resource in Windows.</xsd:documentation>
660
+ </xsd:annotation>
661
+ </xsd:enumeration>
662
+ <xsd:enumeration value="button">
663
+ <xsd:annotation>
664
+ <xsd:documentation>Indicates a button object, for example a BUTTON control Windows.</xsd:documentation>
665
+ </xsd:annotation>
666
+ </xsd:enumeration>
667
+ <xsd:enumeration value="caption">
668
+ <xsd:annotation>
669
+ <xsd:documentation>Indicates a caption, such as the caption of a dialog box.</xsd:documentation>
670
+ </xsd:annotation>
671
+ </xsd:enumeration>
672
+ <xsd:enumeration value="cell">
673
+ <xsd:annotation>
674
+ <xsd:documentation>Indicates the cell in a table, for example the content of the &lt;td&gt; element in HTML.</xsd:documentation>
675
+ </xsd:annotation>
676
+ </xsd:enumeration>
677
+ <xsd:enumeration value="checkbox">
678
+ <xsd:annotation>
679
+ <xsd:documentation>Indicates check box object, for example a CHECKBOX control in Windows.</xsd:documentation>
680
+ </xsd:annotation>
681
+ </xsd:enumeration>
682
+ <xsd:enumeration value="checkboxmenuitem">
683
+ <xsd:annotation>
684
+ <xsd:documentation>Indicates a menu item with an associated checkbox.</xsd:documentation>
685
+ </xsd:annotation>
686
+ </xsd:enumeration>
687
+ <xsd:enumeration value="checkedlistbox">
688
+ <xsd:annotation>
689
+ <xsd:documentation>Indicates a list box, but with a check-box for each item.</xsd:documentation>
690
+ </xsd:annotation>
691
+ </xsd:enumeration>
692
+ <xsd:enumeration value="colorchooser">
693
+ <xsd:annotation>
694
+ <xsd:documentation>Indicates a color selection dialog.</xsd:documentation>
695
+ </xsd:annotation>
696
+ </xsd:enumeration>
697
+ <xsd:enumeration value="combobox">
698
+ <xsd:annotation>
699
+ <xsd:documentation>Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.</xsd:documentation>
700
+ </xsd:annotation>
701
+ </xsd:enumeration>
702
+ <xsd:enumeration value="comboboxexitem">
703
+ <xsd:annotation>
704
+ <xsd:documentation>Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).</xsd:documentation>
705
+ </xsd:annotation>
706
+ </xsd:enumeration>
707
+ <xsd:enumeration value="comboboxitem">
708
+ <xsd:annotation>
709
+ <xsd:documentation>Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).</xsd:documentation>
710
+ </xsd:annotation>
711
+ </xsd:enumeration>
712
+ <xsd:enumeration value="component">
713
+ <xsd:annotation>
714
+ <xsd:documentation>Indicates a UI base class element that cannot be represented by any other element.</xsd:documentation>
715
+ </xsd:annotation>
716
+ </xsd:enumeration>
717
+ <xsd:enumeration value="contextmenu">
718
+ <xsd:annotation>
719
+ <xsd:documentation>Indicates a context menu.</xsd:documentation>
720
+ </xsd:annotation>
721
+ </xsd:enumeration>
722
+ <xsd:enumeration value="ctext">
723
+ <xsd:annotation>
724
+ <xsd:documentation>Indicates a Windows RC CTEXT control.</xsd:documentation>
725
+ </xsd:annotation>
726
+ </xsd:enumeration>
727
+ <xsd:enumeration value="cursor">
728
+ <xsd:annotation>
729
+ <xsd:documentation>Indicates a cursor, for example a CURSOR resource in Windows.</xsd:documentation>
730
+ </xsd:annotation>
731
+ </xsd:enumeration>
732
+ <xsd:enumeration value="datetimepicker">
733
+ <xsd:annotation>
734
+ <xsd:documentation>Indicates a date/time picker.</xsd:documentation>
735
+ </xsd:annotation>
736
+ </xsd:enumeration>
737
+ <xsd:enumeration value="defpushbutton">
738
+ <xsd:annotation>
739
+ <xsd:documentation>Indicates a Windows RC DEFPUSHBUTTON control.</xsd:documentation>
740
+ </xsd:annotation>
741
+ </xsd:enumeration>
742
+ <xsd:enumeration value="dialog">
743
+ <xsd:annotation>
744
+ <xsd:documentation>Indicates a dialog box.</xsd:documentation>
745
+ </xsd:annotation>
746
+ </xsd:enumeration>
747
+ <xsd:enumeration value="dlginit">
748
+ <xsd:annotation>
749
+ <xsd:documentation>Indicates a Windows RC DLGINIT resource block.</xsd:documentation>
750
+ </xsd:annotation>
751
+ </xsd:enumeration>
752
+ <xsd:enumeration value="edit">
753
+ <xsd:annotation>
754
+ <xsd:documentation>Indicates an edit box object, for example an EDIT control in Windows.</xsd:documentation>
755
+ </xsd:annotation>
756
+ </xsd:enumeration>
757
+ <xsd:enumeration value="file">
758
+ <xsd:annotation>
759
+ <xsd:documentation>Indicates a filename.</xsd:documentation>
760
+ </xsd:annotation>
761
+ </xsd:enumeration>
762
+ <xsd:enumeration value="filechooser">
763
+ <xsd:annotation>
764
+ <xsd:documentation>Indicates a file dialog.</xsd:documentation>
765
+ </xsd:annotation>
766
+ </xsd:enumeration>
767
+ <xsd:enumeration value="fn">
768
+ <xsd:annotation>
769
+ <xsd:documentation>Indicates a footnote.</xsd:documentation>
770
+ </xsd:annotation>
771
+ </xsd:enumeration>
772
+ <xsd:enumeration value="font">
773
+ <xsd:annotation>
774
+ <xsd:documentation>Indicates a font name.</xsd:documentation>
775
+ </xsd:annotation>
776
+ </xsd:enumeration>
777
+ <xsd:enumeration value="footer">
778
+ <xsd:annotation>
779
+ <xsd:documentation>Indicates a footer.</xsd:documentation>
780
+ </xsd:annotation>
781
+ </xsd:enumeration>
782
+ <xsd:enumeration value="frame">
783
+ <xsd:annotation>
784
+ <xsd:documentation>Indicates a frame object.</xsd:documentation>
785
+ </xsd:annotation>
786
+ </xsd:enumeration>
787
+ <xsd:enumeration value="grid">
788
+ <xsd:annotation>
789
+ <xsd:documentation>Indicates a XUL grid element.</xsd:documentation>
790
+ </xsd:annotation>
791
+ </xsd:enumeration>
792
+ <xsd:enumeration value="groupbox">
793
+ <xsd:annotation>
794
+ <xsd:documentation>Indicates a groupbox object, for example a GROUPBOX control in Windows.</xsd:documentation>
795
+ </xsd:annotation>
796
+ </xsd:enumeration>
797
+ <xsd:enumeration value="header">
798
+ <xsd:annotation>
799
+ <xsd:documentation>Indicates a header item.</xsd:documentation>
800
+ </xsd:annotation>
801
+ </xsd:enumeration>
802
+ <xsd:enumeration value="heading">
803
+ <xsd:annotation>
804
+ <xsd:documentation>Indicates a heading, such has the content of &lt;h1&gt;, &lt;h2&gt;, etc. in HTML.</xsd:documentation>
805
+ </xsd:annotation>
806
+ </xsd:enumeration>
807
+ <xsd:enumeration value="hedit">
808
+ <xsd:annotation>
809
+ <xsd:documentation>Indicates a Windows RC HEDIT control.</xsd:documentation>
810
+ </xsd:annotation>
811
+ </xsd:enumeration>
812
+ <xsd:enumeration value="hscrollbar">
813
+ <xsd:annotation>
814
+ <xsd:documentation>Indicates a horizontal scrollbar.</xsd:documentation>
815
+ </xsd:annotation>
816
+ </xsd:enumeration>
817
+ <xsd:enumeration value="icon">
818
+ <xsd:annotation>
819
+ <xsd:documentation>Indicates an icon, for example an ICON resource in Windows.</xsd:documentation>
820
+ </xsd:annotation>
821
+ </xsd:enumeration>
822
+ <xsd:enumeration value="iedit">
823
+ <xsd:annotation>
824
+ <xsd:documentation>Indicates a Windows RC IEDIT control.</xsd:documentation>
825
+ </xsd:annotation>
826
+ </xsd:enumeration>
827
+ <xsd:enumeration value="keywords">
828
+ <xsd:annotation>
829
+ <xsd:documentation>Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.</xsd:documentation>
830
+ </xsd:annotation>
831
+ </xsd:enumeration>
832
+ <xsd:enumeration value="label">
833
+ <xsd:annotation>
834
+ <xsd:documentation>Indicates a label object.</xsd:documentation>
835
+ </xsd:annotation>
836
+ </xsd:enumeration>
837
+ <xsd:enumeration value="linklabel">
838
+ <xsd:annotation>
839
+ <xsd:documentation>Indicates a label that is also a HTML link (not necessarily a URL).</xsd:documentation>
840
+ </xsd:annotation>
841
+ </xsd:enumeration>
842
+ <xsd:enumeration value="list">
843
+ <xsd:annotation>
844
+ <xsd:documentation>Indicates a list (a group of list-items, for example an &lt;ol&gt; or &lt;ul&gt; element in HTML).</xsd:documentation>
845
+ </xsd:annotation>
846
+ </xsd:enumeration>
847
+ <xsd:enumeration value="listbox">
848
+ <xsd:annotation>
849
+ <xsd:documentation>Indicates a listbox object, for example an LISTBOX control in Windows.</xsd:documentation>
850
+ </xsd:annotation>
851
+ </xsd:enumeration>
852
+ <xsd:enumeration value="listitem">
853
+ <xsd:annotation>
854
+ <xsd:documentation>Indicates an list item (an entry in a list).</xsd:documentation>
855
+ </xsd:annotation>
856
+ </xsd:enumeration>
857
+ <xsd:enumeration value="ltext">
858
+ <xsd:annotation>
859
+ <xsd:documentation>Indicates a Windows RC LTEXT control.</xsd:documentation>
860
+ </xsd:annotation>
861
+ </xsd:enumeration>
862
+ <xsd:enumeration value="menu">
863
+ <xsd:annotation>
864
+ <xsd:documentation>Indicates a menu (a group of menu-items).</xsd:documentation>
865
+ </xsd:annotation>
866
+ </xsd:enumeration>
867
+ <xsd:enumeration value="menubar">
868
+ <xsd:annotation>
869
+ <xsd:documentation>Indicates a toolbar containing one or more tope level menus.</xsd:documentation>
870
+ </xsd:annotation>
871
+ </xsd:enumeration>
872
+ <xsd:enumeration value="menuitem">
873
+ <xsd:annotation>
874
+ <xsd:documentation>Indicates a menu item (an entry in a menu).</xsd:documentation>
875
+ </xsd:annotation>
876
+ </xsd:enumeration>
877
+ <xsd:enumeration value="menuseparator">
878
+ <xsd:annotation>
879
+ <xsd:documentation>Indicates a XUL menuseparator element.</xsd:documentation>
880
+ </xsd:annotation>
881
+ </xsd:enumeration>
882
+ <xsd:enumeration value="message">
883
+ <xsd:annotation>
884
+ <xsd:documentation>Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.</xsd:documentation>
885
+ </xsd:annotation>
886
+ </xsd:enumeration>
887
+ <xsd:enumeration value="monthcalendar">
888
+ <xsd:annotation>
889
+ <xsd:documentation>Indicates a calendar control.</xsd:documentation>
890
+ </xsd:annotation>
891
+ </xsd:enumeration>
892
+ <xsd:enumeration value="numericupdown">
893
+ <xsd:annotation>
894
+ <xsd:documentation>Indicates an edit box beside a spin control.</xsd:documentation>
895
+ </xsd:annotation>
896
+ </xsd:enumeration>
897
+ <xsd:enumeration value="panel">
898
+ <xsd:annotation>
899
+ <xsd:documentation>Indicates a catch all for rectangular areas.</xsd:documentation>
900
+ </xsd:annotation>
901
+ </xsd:enumeration>
902
+ <xsd:enumeration value="popupmenu">
903
+ <xsd:annotation>
904
+ <xsd:documentation>Indicates a standalone menu not necessarily associated with a menubar.</xsd:documentation>
905
+ </xsd:annotation>
906
+ </xsd:enumeration>
907
+ <xsd:enumeration value="pushbox">
908
+ <xsd:annotation>
909
+ <xsd:documentation>Indicates a pushbox object, for example a PUSHBOX control in Windows.</xsd:documentation>
910
+ </xsd:annotation>
911
+ </xsd:enumeration>
912
+ <xsd:enumeration value="pushbutton">
913
+ <xsd:annotation>
914
+ <xsd:documentation>Indicates a Windows RC PUSHBUTTON control.</xsd:documentation>
915
+ </xsd:annotation>
916
+ </xsd:enumeration>
917
+ <xsd:enumeration value="radio">
918
+ <xsd:annotation>
919
+ <xsd:documentation>Indicates a radio button object.</xsd:documentation>
920
+ </xsd:annotation>
921
+ </xsd:enumeration>
922
+ <xsd:enumeration value="radiobuttonmenuitem">
923
+ <xsd:annotation>
924
+ <xsd:documentation>Indicates a menuitem with associated radio button.</xsd:documentation>
925
+ </xsd:annotation>
926
+ </xsd:enumeration>
927
+ <xsd:enumeration value="rcdata">
928
+ <xsd:annotation>
929
+ <xsd:documentation>Indicates raw data resources for an application.</xsd:documentation>
930
+ </xsd:annotation>
931
+ </xsd:enumeration>
932
+ <xsd:enumeration value="row">
933
+ <xsd:annotation>
934
+ <xsd:documentation>Indicates a row in a table.</xsd:documentation>
935
+ </xsd:annotation>
936
+ </xsd:enumeration>
937
+ <xsd:enumeration value="rtext">
938
+ <xsd:annotation>
939
+ <xsd:documentation>Indicates a Windows RC RTEXT control.</xsd:documentation>
940
+ </xsd:annotation>
941
+ </xsd:enumeration>
942
+ <xsd:enumeration value="scrollpane">
943
+ <xsd:annotation>
944
+ <xsd:documentation>Indicates a user navigable container used to show a portion of a document.</xsd:documentation>
945
+ </xsd:annotation>
946
+ </xsd:enumeration>
947
+ <xsd:enumeration value="separator">
948
+ <xsd:annotation>
949
+ <xsd:documentation>Indicates a generic divider object (e.g. menu group separator).</xsd:documentation>
950
+ </xsd:annotation>
951
+ </xsd:enumeration>
952
+ <xsd:enumeration value="shortcut">
953
+ <xsd:annotation>
954
+ <xsd:documentation>Windows accelerators, shortcuts in resource or property files.</xsd:documentation>
955
+ </xsd:annotation>
956
+ </xsd:enumeration>
957
+ <xsd:enumeration value="spinner">
958
+ <xsd:annotation>
959
+ <xsd:documentation>Indicates a UI control to indicate process activity but not progress.</xsd:documentation>
960
+ </xsd:annotation>
961
+ </xsd:enumeration>
962
+ <xsd:enumeration value="splitter">
963
+ <xsd:annotation>
964
+ <xsd:documentation>Indicates a splitter bar.</xsd:documentation>
965
+ </xsd:annotation>
966
+ </xsd:enumeration>
967
+ <xsd:enumeration value="state3">
968
+ <xsd:annotation>
969
+ <xsd:documentation>Indicates a Windows RC STATE3 control.</xsd:documentation>
970
+ </xsd:annotation>
971
+ </xsd:enumeration>
972
+ <xsd:enumeration value="statusbar">
973
+ <xsd:annotation>
974
+ <xsd:documentation>Indicates a window for providing feedback to the users, like 'read-only', etc.</xsd:documentation>
975
+ </xsd:annotation>
976
+ </xsd:enumeration>
977
+ <xsd:enumeration value="string">
978
+ <xsd:annotation>
979
+ <xsd:documentation>Indicates a string, for example an entry in a STRINGTABLE resource in Windows.</xsd:documentation>
980
+ </xsd:annotation>
981
+ </xsd:enumeration>
982
+ <xsd:enumeration value="tabcontrol">
983
+ <xsd:annotation>
984
+ <xsd:documentation>Indicates a layers of controls with a tab to select layers.</xsd:documentation>
985
+ </xsd:annotation>
986
+ </xsd:enumeration>
987
+ <xsd:enumeration value="table">
988
+ <xsd:annotation>
989
+ <xsd:documentation>Indicates a display and edits regular two-dimensional tables of cells.</xsd:documentation>
990
+ </xsd:annotation>
991
+ </xsd:enumeration>
992
+ <xsd:enumeration value="textbox">
993
+ <xsd:annotation>
994
+ <xsd:documentation>Indicates a XUL textbox element.</xsd:documentation>
995
+ </xsd:annotation>
996
+ </xsd:enumeration>
997
+ <xsd:enumeration value="togglebutton">
998
+ <xsd:annotation>
999
+ <xsd:documentation>Indicates a UI button that can be toggled to on or off state.</xsd:documentation>
1000
+ </xsd:annotation>
1001
+ </xsd:enumeration>
1002
+ <xsd:enumeration value="toolbar">
1003
+ <xsd:annotation>
1004
+ <xsd:documentation>Indicates an array of controls, usually buttons.</xsd:documentation>
1005
+ </xsd:annotation>
1006
+ </xsd:enumeration>
1007
+ <xsd:enumeration value="tooltip">
1008
+ <xsd:annotation>
1009
+ <xsd:documentation>Indicates a pop up tool tip text.</xsd:documentation>
1010
+ </xsd:annotation>
1011
+ </xsd:enumeration>
1012
+ <xsd:enumeration value="trackbar">
1013
+ <xsd:annotation>
1014
+ <xsd:documentation>Indicates a bar with a pointer indicating a position within a certain range.</xsd:documentation>
1015
+ </xsd:annotation>
1016
+ </xsd:enumeration>
1017
+ <xsd:enumeration value="tree">
1018
+ <xsd:annotation>
1019
+ <xsd:documentation>Indicates a control that displays a set of hierarchical data.</xsd:documentation>
1020
+ </xsd:annotation>
1021
+ </xsd:enumeration>
1022
+ <xsd:enumeration value="uri">
1023
+ <xsd:annotation>
1024
+ <xsd:documentation>Indicates a URI (URN or URL).</xsd:documentation>
1025
+ </xsd:annotation>
1026
+ </xsd:enumeration>
1027
+ <xsd:enumeration value="userbutton">
1028
+ <xsd:annotation>
1029
+ <xsd:documentation>Indicates a Windows RC USERBUTTON control.</xsd:documentation>
1030
+ </xsd:annotation>
1031
+ </xsd:enumeration>
1032
+ <xsd:enumeration value="usercontrol">
1033
+ <xsd:annotation>
1034
+ <xsd:documentation>Indicates a user-defined control like CONTROL control in Windows.</xsd:documentation>
1035
+ </xsd:annotation>
1036
+ </xsd:enumeration>
1037
+ <xsd:enumeration value="var">
1038
+ <xsd:annotation>
1039
+ <xsd:documentation>Indicates the text of a variable.</xsd:documentation>
1040
+ </xsd:annotation>
1041
+ </xsd:enumeration>
1042
+ <xsd:enumeration value="versioninfo">
1043
+ <xsd:annotation>
1044
+ <xsd:documentation>Indicates version information about a resource like VERSIONINFO in Windows.</xsd:documentation>
1045
+ </xsd:annotation>
1046
+ </xsd:enumeration>
1047
+ <xsd:enumeration value="vscrollbar">
1048
+ <xsd:annotation>
1049
+ <xsd:documentation>Indicates a vertical scrollbar.</xsd:documentation>
1050
+ </xsd:annotation>
1051
+ </xsd:enumeration>
1052
+ <xsd:enumeration value="window">
1053
+ <xsd:annotation>
1054
+ <xsd:documentation>Indicates a graphical window.</xsd:documentation>
1055
+ </xsd:annotation>
1056
+ </xsd:enumeration>
1057
+ </xsd:restriction>
1058
+ </xsd:simpleType>
1059
+ <xsd:simpleType name="size-unitValueList">
1060
+ <xsd:annotation>
1061
+ <xsd:documentation>Values for the attribute 'size-unit'.</xsd:documentation>
1062
+ </xsd:annotation>
1063
+ <xsd:restriction base="xsd:NMTOKEN">
1064
+ <xsd:enumeration value="byte">
1065
+ <xsd:annotation>
1066
+ <xsd:documentation>Indicates a size in 8-bit bytes.</xsd:documentation>
1067
+ </xsd:annotation>
1068
+ </xsd:enumeration>
1069
+ <xsd:enumeration value="char">
1070
+ <xsd:annotation>
1071
+ <xsd:documentation>Indicates a size in Unicode characters.</xsd:documentation>
1072
+ </xsd:annotation>
1073
+ </xsd:enumeration>
1074
+ <xsd:enumeration value="col">
1075
+ <xsd:annotation>
1076
+ <xsd:documentation>Indicates a size in columns. Used for HTML text area.</xsd:documentation>
1077
+ </xsd:annotation>
1078
+ </xsd:enumeration>
1079
+ <xsd:enumeration value="cm">
1080
+ <xsd:annotation>
1081
+ <xsd:documentation>Indicates a size in centimeters.</xsd:documentation>
1082
+ </xsd:annotation>
1083
+ </xsd:enumeration>
1084
+ <xsd:enumeration value="dlgunit">
1085
+ <xsd:annotation>
1086
+ <xsd:documentation>Indicates a size in dialog units, as defined in Windows resources.</xsd:documentation>
1087
+ </xsd:annotation>
1088
+ </xsd:enumeration>
1089
+ <xsd:enumeration value="em">
1090
+ <xsd:annotation>
1091
+ <xsd:documentation>Indicates a size in 'font-size' units (as defined in CSS).</xsd:documentation>
1092
+ </xsd:annotation>
1093
+ </xsd:enumeration>
1094
+ <xsd:enumeration value="ex">
1095
+ <xsd:annotation>
1096
+ <xsd:documentation>Indicates a size in 'x-height' units (as defined in CSS).</xsd:documentation>
1097
+ </xsd:annotation>
1098
+ </xsd:enumeration>
1099
+ <xsd:enumeration value="glyph">
1100
+ <xsd:annotation>
1101
+ <xsd:documentation>Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'</xsd:documentation>
1102
+ </xsd:annotation>
1103
+ </xsd:enumeration>
1104
+ <xsd:enumeration value="in">
1105
+ <xsd:annotation>
1106
+ <xsd:documentation>Indicates a size in inches.</xsd:documentation>
1107
+ </xsd:annotation>
1108
+ </xsd:enumeration>
1109
+ <xsd:enumeration value="mm">
1110
+ <xsd:annotation>
1111
+ <xsd:documentation>Indicates a size in millimeters.</xsd:documentation>
1112
+ </xsd:annotation>
1113
+ </xsd:enumeration>
1114
+ <xsd:enumeration value="percent">
1115
+ <xsd:annotation>
1116
+ <xsd:documentation>Indicates a size in percentage.</xsd:documentation>
1117
+ </xsd:annotation>
1118
+ </xsd:enumeration>
1119
+ <xsd:enumeration value="pixel">
1120
+ <xsd:annotation>
1121
+ <xsd:documentation>Indicates a size in pixels.</xsd:documentation>
1122
+ </xsd:annotation>
1123
+ </xsd:enumeration>
1124
+ <xsd:enumeration value="point">
1125
+ <xsd:annotation>
1126
+ <xsd:documentation>Indicates a size in point.</xsd:documentation>
1127
+ </xsd:annotation>
1128
+ </xsd:enumeration>
1129
+ <xsd:enumeration value="row">
1130
+ <xsd:annotation>
1131
+ <xsd:documentation>Indicates a size in rows. Used for HTML text area.</xsd:documentation>
1132
+ </xsd:annotation>
1133
+ </xsd:enumeration>
1134
+ </xsd:restriction>
1135
+ </xsd:simpleType>
1136
+ <xsd:simpleType name="stateValueList">
1137
+ <xsd:annotation>
1138
+ <xsd:documentation>Values for the attribute 'state'.</xsd:documentation>
1139
+ </xsd:annotation>
1140
+ <xsd:restriction base="xsd:NMTOKEN">
1141
+ <xsd:enumeration value="final">
1142
+ <xsd:annotation>
1143
+ <xsd:documentation>Indicates the terminating state.</xsd:documentation>
1144
+ </xsd:annotation>
1145
+ </xsd:enumeration>
1146
+ <xsd:enumeration value="needs-adaptation">
1147
+ <xsd:annotation>
1148
+ <xsd:documentation>Indicates only non-textual information needs adaptation.</xsd:documentation>
1149
+ </xsd:annotation>
1150
+ </xsd:enumeration>
1151
+ <xsd:enumeration value="needs-l10n">
1152
+ <xsd:annotation>
1153
+ <xsd:documentation>Indicates both text and non-textual information needs adaptation.</xsd:documentation>
1154
+ </xsd:annotation>
1155
+ </xsd:enumeration>
1156
+ <xsd:enumeration value="needs-review-adaptation">
1157
+ <xsd:annotation>
1158
+ <xsd:documentation>Indicates only non-textual information needs review.</xsd:documentation>
1159
+ </xsd:annotation>
1160
+ </xsd:enumeration>
1161
+ <xsd:enumeration value="needs-review-l10n">
1162
+ <xsd:annotation>
1163
+ <xsd:documentation>Indicates both text and non-textual information needs review.</xsd:documentation>
1164
+ </xsd:annotation>
1165
+ </xsd:enumeration>
1166
+ <xsd:enumeration value="needs-review-translation">
1167
+ <xsd:annotation>
1168
+ <xsd:documentation>Indicates that only the text of the item needs to be reviewed.</xsd:documentation>
1169
+ </xsd:annotation>
1170
+ </xsd:enumeration>
1171
+ <xsd:enumeration value="needs-translation">
1172
+ <xsd:annotation>
1173
+ <xsd:documentation>Indicates that the item needs to be translated.</xsd:documentation>
1174
+ </xsd:annotation>
1175
+ </xsd:enumeration>
1176
+ <xsd:enumeration value="new">
1177
+ <xsd:annotation>
1178
+ <xsd:documentation>Indicates that the item is new. For example, translation units that were not in a previous version of the document.</xsd:documentation>
1179
+ </xsd:annotation>
1180
+ </xsd:enumeration>
1181
+ <xsd:enumeration value="signed-off">
1182
+ <xsd:annotation>
1183
+ <xsd:documentation>Indicates that changes are reviewed and approved.</xsd:documentation>
1184
+ </xsd:annotation>
1185
+ </xsd:enumeration>
1186
+ <xsd:enumeration value="translated">
1187
+ <xsd:annotation>
1188
+ <xsd:documentation>Indicates that the item has been translated.</xsd:documentation>
1189
+ </xsd:annotation>
1190
+ </xsd:enumeration>
1191
+ </xsd:restriction>
1192
+ </xsd:simpleType>
1193
+ <xsd:simpleType name="state-qualifierValueList">
1194
+ <xsd:annotation>
1195
+ <xsd:documentation>Values for the attribute 'state-qualifier'.</xsd:documentation>
1196
+ </xsd:annotation>
1197
+ <xsd:restriction base="xsd:NMTOKEN">
1198
+ <xsd:enumeration value="exact-match">
1199
+ <xsd:annotation>
1200
+ <xsd:documentation>Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.</xsd:documentation>
1201
+ </xsd:annotation>
1202
+ </xsd:enumeration>
1203
+ <xsd:enumeration value="fuzzy-match">
1204
+ <xsd:annotation>
1205
+ <xsd:documentation>Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).</xsd:documentation>
1206
+ </xsd:annotation>
1207
+ </xsd:enumeration>
1208
+ <xsd:enumeration value="id-match">
1209
+ <xsd:annotation>
1210
+ <xsd:documentation>Indicates a match based on matching IDs (in addition to matching text).</xsd:documentation>
1211
+ </xsd:annotation>
1212
+ </xsd:enumeration>
1213
+ <xsd:enumeration value="leveraged-glossary">
1214
+ <xsd:annotation>
1215
+ <xsd:documentation>Indicates a translation derived from a glossary.</xsd:documentation>
1216
+ </xsd:annotation>
1217
+ </xsd:enumeration>
1218
+ <xsd:enumeration value="leveraged-inherited">
1219
+ <xsd:annotation>
1220
+ <xsd:documentation>Indicates a translation derived from existing translation.</xsd:documentation>
1221
+ </xsd:annotation>
1222
+ </xsd:enumeration>
1223
+ <xsd:enumeration value="leveraged-mt">
1224
+ <xsd:annotation>
1225
+ <xsd:documentation>Indicates a translation derived from machine translation.</xsd:documentation>
1226
+ </xsd:annotation>
1227
+ </xsd:enumeration>
1228
+ <xsd:enumeration value="leveraged-repository">
1229
+ <xsd:annotation>
1230
+ <xsd:documentation>Indicates a translation derived from a translation repository.</xsd:documentation>
1231
+ </xsd:annotation>
1232
+ </xsd:enumeration>
1233
+ <xsd:enumeration value="leveraged-tm">
1234
+ <xsd:annotation>
1235
+ <xsd:documentation>Indicates a translation derived from a translation memory.</xsd:documentation>
1236
+ </xsd:annotation>
1237
+ </xsd:enumeration>
1238
+ <xsd:enumeration value="mt-suggestion">
1239
+ <xsd:annotation>
1240
+ <xsd:documentation>Indicates the translation is suggested by machine translation.</xsd:documentation>
1241
+ </xsd:annotation>
1242
+ </xsd:enumeration>
1243
+ <xsd:enumeration value="rejected-grammar">
1244
+ <xsd:annotation>
1245
+ <xsd:documentation>Indicates that the item has been rejected because of incorrect grammar.</xsd:documentation>
1246
+ </xsd:annotation>
1247
+ </xsd:enumeration>
1248
+ <xsd:enumeration value="rejected-inaccurate">
1249
+ <xsd:annotation>
1250
+ <xsd:documentation>Indicates that the item has been rejected because it is incorrect.</xsd:documentation>
1251
+ </xsd:annotation>
1252
+ </xsd:enumeration>
1253
+ <xsd:enumeration value="rejected-length">
1254
+ <xsd:annotation>
1255
+ <xsd:documentation>Indicates that the item has been rejected because it is too long or too short.</xsd:documentation>
1256
+ </xsd:annotation>
1257
+ </xsd:enumeration>
1258
+ <xsd:enumeration value="rejected-spelling">
1259
+ <xsd:annotation>
1260
+ <xsd:documentation>Indicates that the item has been rejected because of incorrect spelling.</xsd:documentation>
1261
+ </xsd:annotation>
1262
+ </xsd:enumeration>
1263
+ <xsd:enumeration value="tm-suggestion">
1264
+ <xsd:annotation>
1265
+ <xsd:documentation>Indicates the translation is suggested by translation memory.</xsd:documentation>
1266
+ </xsd:annotation>
1267
+ </xsd:enumeration>
1268
+ </xsd:restriction>
1269
+ </xsd:simpleType>
1270
+ <xsd:simpleType name="unitValueList">
1271
+ <xsd:annotation>
1272
+ <xsd:documentation>Values for the attribute 'unit'.</xsd:documentation>
1273
+ </xsd:annotation>
1274
+ <xsd:restriction base="xsd:NMTOKEN">
1275
+ <xsd:enumeration value="word">
1276
+ <xsd:annotation>
1277
+ <xsd:documentation>Refers to words.</xsd:documentation>
1278
+ </xsd:annotation>
1279
+ </xsd:enumeration>
1280
+ <xsd:enumeration value="page">
1281
+ <xsd:annotation>
1282
+ <xsd:documentation>Refers to pages.</xsd:documentation>
1283
+ </xsd:annotation>
1284
+ </xsd:enumeration>
1285
+ <xsd:enumeration value="trans-unit">
1286
+ <xsd:annotation>
1287
+ <xsd:documentation>Refers to &lt;trans-unit&gt; elements.</xsd:documentation>
1288
+ </xsd:annotation>
1289
+ </xsd:enumeration>
1290
+ <xsd:enumeration value="bin-unit">
1291
+ <xsd:annotation>
1292
+ <xsd:documentation>Refers to &lt;bin-unit&gt; elements.</xsd:documentation>
1293
+ </xsd:annotation>
1294
+ </xsd:enumeration>
1295
+ <xsd:enumeration value="glyph">
1296
+ <xsd:annotation>
1297
+ <xsd:documentation>Refers to glyphs.</xsd:documentation>
1298
+ </xsd:annotation>
1299
+ </xsd:enumeration>
1300
+ <xsd:enumeration value="item">
1301
+ <xsd:annotation>
1302
+ <xsd:documentation>Refers to &lt;trans-unit&gt; and/or &lt;bin-unit&gt; elements.</xsd:documentation>
1303
+ </xsd:annotation>
1304
+ </xsd:enumeration>
1305
+ <xsd:enumeration value="instance">
1306
+ <xsd:annotation>
1307
+ <xsd:documentation>Refers to the occurrences of instances defined by the count-type value.</xsd:documentation>
1308
+ </xsd:annotation>
1309
+ </xsd:enumeration>
1310
+ <xsd:enumeration value="character">
1311
+ <xsd:annotation>
1312
+ <xsd:documentation>Refers to characters.</xsd:documentation>
1313
+ </xsd:annotation>
1314
+ </xsd:enumeration>
1315
+ <xsd:enumeration value="line">
1316
+ <xsd:annotation>
1317
+ <xsd:documentation>Refers to lines.</xsd:documentation>
1318
+ </xsd:annotation>
1319
+ </xsd:enumeration>
1320
+ <xsd:enumeration value="sentence">
1321
+ <xsd:annotation>
1322
+ <xsd:documentation>Refers to sentences.</xsd:documentation>
1323
+ </xsd:annotation>
1324
+ </xsd:enumeration>
1325
+ <xsd:enumeration value="paragraph">
1326
+ <xsd:annotation>
1327
+ <xsd:documentation>Refers to paragraphs.</xsd:documentation>
1328
+ </xsd:annotation>
1329
+ </xsd:enumeration>
1330
+ <xsd:enumeration value="segment">
1331
+ <xsd:annotation>
1332
+ <xsd:documentation>Refers to segments.</xsd:documentation>
1333
+ </xsd:annotation>
1334
+ </xsd:enumeration>
1335
+ <xsd:enumeration value="placeable">
1336
+ <xsd:annotation>
1337
+ <xsd:documentation>Refers to placeables (inline elements).</xsd:documentation>
1338
+ </xsd:annotation>
1339
+ </xsd:enumeration>
1340
+ </xsd:restriction>
1341
+ </xsd:simpleType>
1342
+ <xsd:simpleType name="priorityValueList">
1343
+ <xsd:annotation>
1344
+ <xsd:documentation>Values for the attribute 'priority'.</xsd:documentation>
1345
+ </xsd:annotation>
1346
+ <xsd:restriction base="xsd:positiveInteger">
1347
+ <xsd:enumeration value="1">
1348
+ <xsd:annotation>
1349
+ <xsd:documentation>Highest priority.</xsd:documentation>
1350
+ </xsd:annotation>
1351
+ </xsd:enumeration>
1352
+ <xsd:enumeration value="2">
1353
+ <xsd:annotation>
1354
+ <xsd:documentation>High priority.</xsd:documentation>
1355
+ </xsd:annotation>
1356
+ </xsd:enumeration>
1357
+ <xsd:enumeration value="3">
1358
+ <xsd:annotation>
1359
+ <xsd:documentation>High priority, but not as important as 2.</xsd:documentation>
1360
+ </xsd:annotation>
1361
+ </xsd:enumeration>
1362
+ <xsd:enumeration value="4">
1363
+ <xsd:annotation>
1364
+ <xsd:documentation>High priority, but not as important as 3.</xsd:documentation>
1365
+ </xsd:annotation>
1366
+ </xsd:enumeration>
1367
+ <xsd:enumeration value="5">
1368
+ <xsd:annotation>
1369
+ <xsd:documentation>Medium priority, but more important than 6.</xsd:documentation>
1370
+ </xsd:annotation>
1371
+ </xsd:enumeration>
1372
+ <xsd:enumeration value="6">
1373
+ <xsd:annotation>
1374
+ <xsd:documentation>Medium priority, but less important than 5.</xsd:documentation>
1375
+ </xsd:annotation>
1376
+ </xsd:enumeration>
1377
+ <xsd:enumeration value="7">
1378
+ <xsd:annotation>
1379
+ <xsd:documentation>Low priority, but more important than 8.</xsd:documentation>
1380
+ </xsd:annotation>
1381
+ </xsd:enumeration>
1382
+ <xsd:enumeration value="8">
1383
+ <xsd:annotation>
1384
+ <xsd:documentation>Low priority, but more important than 9.</xsd:documentation>
1385
+ </xsd:annotation>
1386
+ </xsd:enumeration>
1387
+ <xsd:enumeration value="9">
1388
+ <xsd:annotation>
1389
+ <xsd:documentation>Low priority.</xsd:documentation>
1390
+ </xsd:annotation>
1391
+ </xsd:enumeration>
1392
+ <xsd:enumeration value="10">
1393
+ <xsd:annotation>
1394
+ <xsd:documentation>Lowest priority.</xsd:documentation>
1395
+ </xsd:annotation>
1396
+ </xsd:enumeration>
1397
+ </xsd:restriction>
1398
+ </xsd:simpleType>
1399
+ <xsd:simpleType name="reformatValueYesNo">
1400
+ <xsd:restriction base="xsd:string">
1401
+ <xsd:enumeration value="yes">
1402
+ <xsd:annotation>
1403
+ <xsd:documentation>This value indicates that all properties can be reformatted. This value must be used alone.</xsd:documentation>
1404
+ </xsd:annotation>
1405
+ </xsd:enumeration>
1406
+ <xsd:enumeration value="no">
1407
+ <xsd:annotation>
1408
+ <xsd:documentation>This value indicates that no properties should be reformatted. This value must be used alone.</xsd:documentation>
1409
+ </xsd:annotation>
1410
+ </xsd:enumeration>
1411
+ </xsd:restriction>
1412
+ </xsd:simpleType>
1413
+ <xsd:simpleType name="reformatValueList">
1414
+ <xsd:list>
1415
+ <xsd:simpleType>
1416
+ <xsd:union memberTypes="xlf:XTend">
1417
+ <xsd:simpleType>
1418
+ <xsd:restriction base="xsd:string">
1419
+ <xsd:enumeration value="coord">
1420
+ <xsd:annotation>
1421
+ <xsd:documentation>This value indicates that all information in the coord attribute can be modified.</xsd:documentation>
1422
+ </xsd:annotation>
1423
+ </xsd:enumeration>
1424
+ <xsd:enumeration value="coord-x">
1425
+ <xsd:annotation>
1426
+ <xsd:documentation>This value indicates that the x information in the coord attribute can be modified.</xsd:documentation>
1427
+ </xsd:annotation>
1428
+ </xsd:enumeration>
1429
+ <xsd:enumeration value="coord-y">
1430
+ <xsd:annotation>
1431
+ <xsd:documentation>This value indicates that the y information in the coord attribute can be modified.</xsd:documentation>
1432
+ </xsd:annotation>
1433
+ </xsd:enumeration>
1434
+ <xsd:enumeration value="coord-cx">
1435
+ <xsd:annotation>
1436
+ <xsd:documentation>This value indicates that the cx information in the coord attribute can be modified.</xsd:documentation>
1437
+ </xsd:annotation>
1438
+ </xsd:enumeration>
1439
+ <xsd:enumeration value="coord-cy">
1440
+ <xsd:annotation>
1441
+ <xsd:documentation>This value indicates that the cy information in the coord attribute can be modified.</xsd:documentation>
1442
+ </xsd:annotation>
1443
+ </xsd:enumeration>
1444
+ <xsd:enumeration value="font">
1445
+ <xsd:annotation>
1446
+ <xsd:documentation>This value indicates that all the information in the font attribute can be modified.</xsd:documentation>
1447
+ </xsd:annotation>
1448
+ </xsd:enumeration>
1449
+ <xsd:enumeration value="font-name">
1450
+ <xsd:annotation>
1451
+ <xsd:documentation>This value indicates that the name information in the font attribute can be modified.</xsd:documentation>
1452
+ </xsd:annotation>
1453
+ </xsd:enumeration>
1454
+ <xsd:enumeration value="font-size">
1455
+ <xsd:annotation>
1456
+ <xsd:documentation>This value indicates that the size information in the font attribute can be modified.</xsd:documentation>
1457
+ </xsd:annotation>
1458
+ </xsd:enumeration>
1459
+ <xsd:enumeration value="font-weight">
1460
+ <xsd:annotation>
1461
+ <xsd:documentation>This value indicates that the weight information in the font attribute can be modified.</xsd:documentation>
1462
+ </xsd:annotation>
1463
+ </xsd:enumeration>
1464
+ <xsd:enumeration value="css-style">
1465
+ <xsd:annotation>
1466
+ <xsd:documentation>This value indicates that the information in the css-style attribute can be modified.</xsd:documentation>
1467
+ </xsd:annotation>
1468
+ </xsd:enumeration>
1469
+ <xsd:enumeration value="style">
1470
+ <xsd:annotation>
1471
+ <xsd:documentation>This value indicates that the information in the style attribute can be modified.</xsd:documentation>
1472
+ </xsd:annotation>
1473
+ </xsd:enumeration>
1474
+ <xsd:enumeration value="ex-style">
1475
+ <xsd:annotation>
1476
+ <xsd:documentation>This value indicates that the information in the exstyle attribute can be modified.</xsd:documentation>
1477
+ </xsd:annotation>
1478
+ </xsd:enumeration>
1479
+ </xsd:restriction>
1480
+ </xsd:simpleType>
1481
+ </xsd:union>
1482
+ </xsd:simpleType>
1483
+ </xsd:list>
1484
+ </xsd:simpleType>
1485
+ <xsd:simpleType name="purposeValueList">
1486
+ <xsd:restriction base="xsd:string">
1487
+ <xsd:enumeration value="information">
1488
+ <xsd:annotation>
1489
+ <xsd:documentation>Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.</xsd:documentation>
1490
+ </xsd:annotation>
1491
+ </xsd:enumeration>
1492
+ <xsd:enumeration value="location">
1493
+ <xsd:annotation>
1494
+ <xsd:documentation>Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.</xsd:documentation>
1495
+ </xsd:annotation>
1496
+ </xsd:enumeration>
1497
+ <xsd:enumeration value="match">
1498
+ <xsd:annotation>
1499
+ <xsd:documentation>Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.</xsd:documentation>
1500
+ </xsd:annotation>
1501
+ </xsd:enumeration>
1502
+ </xsd:restriction>
1503
+ </xsd:simpleType>
1504
+ <xsd:simpleType name="alttranstypeValueList">
1505
+ <xsd:restriction base="xsd:string">
1506
+ <xsd:enumeration value="proposal">
1507
+ <xsd:annotation>
1508
+ <xsd:documentation>Represents a translation proposal from a translation memory or other resource.</xsd:documentation>
1509
+ </xsd:annotation>
1510
+ </xsd:enumeration>
1511
+ <xsd:enumeration value="previous-version">
1512
+ <xsd:annotation>
1513
+ <xsd:documentation>Represents a previous version of the target element.</xsd:documentation>
1514
+ </xsd:annotation>
1515
+ </xsd:enumeration>
1516
+ <xsd:enumeration value="rejected">
1517
+ <xsd:annotation>
1518
+ <xsd:documentation>Represents a rejected version of the target element.</xsd:documentation>
1519
+ </xsd:annotation>
1520
+ </xsd:enumeration>
1521
+ <xsd:enumeration value="reference">
1522
+ <xsd:annotation>
1523
+ <xsd:documentation>Represents a translation to be used for reference purposes only, for example from a related product or a different language.</xsd:documentation>
1524
+ </xsd:annotation>
1525
+ </xsd:enumeration>
1526
+ <xsd:enumeration value="accepted">
1527
+ <xsd:annotation>
1528
+ <xsd:documentation>Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.</xsd:documentation>
1529
+ </xsd:annotation>
1530
+ </xsd:enumeration>
1531
+ </xsd:restriction>
1532
+ </xsd:simpleType>
1533
+ <!-- Other Types -->
1534
+ <xsd:complexType name="ElemType_ExternalReference">
1535
+ <xsd:choice>
1536
+ <xsd:element ref="xlf:internal-file"/>
1537
+ <xsd:element ref="xlf:external-file"/>
1538
+ </xsd:choice>
1539
+ </xsd:complexType>
1540
+ <xsd:simpleType name="AttrType_purpose">
1541
+ <xsd:list>
1542
+ <xsd:simpleType>
1543
+ <xsd:union memberTypes="xlf:purposeValueList xlf:XTend"/>
1544
+ </xsd:simpleType>
1545
+ </xsd:list>
1546
+ </xsd:simpleType>
1547
+ <xsd:simpleType name="AttrType_datatype">
1548
+ <xsd:union memberTypes="xlf:datatypeValueList xlf:XTend"/>
1549
+ </xsd:simpleType>
1550
+ <xsd:simpleType name="AttrType_restype">
1551
+ <xsd:union memberTypes="xlf:restypeValueList xlf:XTend"/>
1552
+ </xsd:simpleType>
1553
+ <xsd:simpleType name="AttrType_alttranstype">
1554
+ <xsd:union memberTypes="xlf:alttranstypeValueList xlf:XTend"/>
1555
+ </xsd:simpleType>
1556
+ <xsd:simpleType name="AttrType_context-type">
1557
+ <xsd:union memberTypes="xlf:context-typeValueList xlf:XTend"/>
1558
+ </xsd:simpleType>
1559
+ <xsd:simpleType name="AttrType_state">
1560
+ <xsd:union memberTypes="xlf:stateValueList xlf:XTend"/>
1561
+ </xsd:simpleType>
1562
+ <xsd:simpleType name="AttrType_state-qualifier">
1563
+ <xsd:union memberTypes="xlf:state-qualifierValueList xlf:XTend"/>
1564
+ </xsd:simpleType>
1565
+ <xsd:simpleType name="AttrType_count-type">
1566
+ <xsd:union memberTypes="xlf:restypeValueList xlf:count-typeValueList xlf:datatypeValueList xlf:stateValueList xlf:state-qualifierValueList xlf:XTend"/>
1567
+ </xsd:simpleType>
1568
+ <xsd:simpleType name="AttrType_InlineDelimiters">
1569
+ <xsd:union memberTypes="xlf:InlineDelimitersValueList xlf:XTend"/>
1570
+ </xsd:simpleType>
1571
+ <xsd:simpleType name="AttrType_InlinePlaceholders">
1572
+ <xsd:union memberTypes="xlf:InlinePlaceholdersValueList xlf:XTend"/>
1573
+ </xsd:simpleType>
1574
+ <xsd:simpleType name="AttrType_size-unit">
1575
+ <xsd:union memberTypes="xlf:size-unitValueList xlf:XTend"/>
1576
+ </xsd:simpleType>
1577
+ <xsd:simpleType name="AttrType_mtype">
1578
+ <xsd:union memberTypes="xlf:mtypeValueList xlf:XTend"/>
1579
+ </xsd:simpleType>
1580
+ <xsd:simpleType name="AttrType_unit">
1581
+ <xsd:union memberTypes="xlf:unitValueList xlf:XTend"/>
1582
+ </xsd:simpleType>
1583
+ <xsd:simpleType name="AttrType_priority">
1584
+ <xsd:union memberTypes="xlf:priorityValueList"/>
1585
+ </xsd:simpleType>
1586
+ <xsd:simpleType name="AttrType_reformat">
1587
+ <xsd:union memberTypes="xlf:reformatValueYesNo xlf:reformatValueList"/>
1588
+ </xsd:simpleType>
1589
+ <xsd:simpleType name="AttrType_YesNo">
1590
+ <xsd:restriction base="xsd:NMTOKEN">
1591
+ <xsd:enumeration value="yes"/>
1592
+ <xsd:enumeration value="no"/>
1593
+ </xsd:restriction>
1594
+ </xsd:simpleType>
1595
+ <xsd:simpleType name="AttrType_Position">
1596
+ <xsd:restriction base="xsd:NMTOKEN">
1597
+ <xsd:enumeration value="open"/>
1598
+ <xsd:enumeration value="close"/>
1599
+ </xsd:restriction>
1600
+ </xsd:simpleType>
1601
+ <xsd:simpleType name="AttrType_assoc">
1602
+ <xsd:restriction base="xsd:NMTOKEN">
1603
+ <xsd:enumeration value="preceding"/>
1604
+ <xsd:enumeration value="following"/>
1605
+ <xsd:enumeration value="both"/>
1606
+ </xsd:restriction>
1607
+ </xsd:simpleType>
1608
+ <xsd:simpleType name="AttrType_annotates">
1609
+ <xsd:restriction base="xsd:NMTOKEN">
1610
+ <xsd:enumeration value="source"/>
1611
+ <xsd:enumeration value="target"/>
1612
+ <xsd:enumeration value="general"/>
1613
+ </xsd:restriction>
1614
+ </xsd:simpleType>
1615
+ <xsd:simpleType name="AttrType_Coordinates">
1616
+ <xsd:annotation>
1617
+ <xsd:documentation>Values for the attribute 'coord'.</xsd:documentation>
1618
+ </xsd:annotation>
1619
+ <xsd:restriction base="xsd:string">
1620
+ <xsd:pattern value="(-?\d+|#);(-?\d+|#);(-?\d+|#);(-?\d+|#)"/>
1621
+ </xsd:restriction>
1622
+ </xsd:simpleType>
1623
+ <xsd:simpleType name="AttrType_Version">
1624
+ <xsd:annotation>
1625
+ <xsd:documentation>Version values: 1.0 and 1.1 are allowed for backward compatibility.</xsd:documentation>
1626
+ </xsd:annotation>
1627
+ <xsd:restriction base="xsd:string">
1628
+ <xsd:enumeration value="1.2"/>
1629
+ <xsd:enumeration value="1.1"/>
1630
+ <xsd:enumeration value="1.0"/>
1631
+ </xsd:restriction>
1632
+ </xsd:simpleType>
1633
+ <!-- Groups -->
1634
+ <xsd:group name="ElemGroup_TextContent">
1635
+ <xsd:choice>
1636
+ <xsd:element ref="xlf:g"/>
1637
+ <xsd:element ref="xlf:bpt"/>
1638
+ <xsd:element ref="xlf:ept"/>
1639
+ <xsd:element ref="xlf:ph"/>
1640
+ <xsd:element ref="xlf:it"/>
1641
+ <xsd:element ref="xlf:mrk"/>
1642
+ <xsd:element ref="xlf:x"/>
1643
+ <xsd:element ref="xlf:bx"/>
1644
+ <xsd:element ref="xlf:ex"/>
1645
+ </xsd:choice>
1646
+ </xsd:group>
1647
+ <xsd:attributeGroup name="AttrGroup_TextContent">
1648
+ <xsd:attribute name="id" type="xsd:string" use="required"/>
1649
+ <xsd:attribute name="xid" type="xsd:string" use="optional"/>
1650
+ <xsd:attribute name="equiv-text" type="xsd:string" use="optional"/>
1651
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1652
+ </xsd:attributeGroup>
1653
+ <!-- XLIFF Structure -->
1654
+ <xsd:element name="xliff">
1655
+ <xsd:complexType>
1656
+ <xsd:sequence maxOccurs="unbounded">
1657
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1658
+ <xsd:element ref="xlf:file"/>
1659
+ </xsd:sequence>
1660
+ <xsd:attribute name="version" type="xlf:AttrType_Version" use="required"/>
1661
+ <xsd:attribute ref="xml:lang" use="optional"/>
1662
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1663
+ </xsd:complexType>
1664
+ </xsd:element>
1665
+ <xsd:element name="file">
1666
+ <xsd:complexType>
1667
+ <xsd:sequence>
1668
+ <xsd:element minOccurs="0" ref="xlf:header"/>
1669
+ <xsd:element ref="xlf:body"/>
1670
+ </xsd:sequence>
1671
+ <xsd:attribute name="original" type="xsd:string" use="required"/>
1672
+ <xsd:attribute name="source-language" type="xsd:language" use="required"/>
1673
+ <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="required"/>
1674
+ <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1675
+ <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1676
+ <xsd:attribute ref="xml:space" use="optional"/>
1677
+ <xsd:attribute name="category" type="xsd:string" use="optional"/>
1678
+ <xsd:attribute name="target-language" type="xsd:language" use="optional"/>
1679
+ <xsd:attribute name="product-name" type="xsd:string" use="optional"/>
1680
+ <xsd:attribute name="product-version" type="xsd:string" use="optional"/>
1681
+ <xsd:attribute name="build-num" type="xsd:string" use="optional"/>
1682
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1683
+ </xsd:complexType>
1684
+ <xsd:unique name="U_group_id">
1685
+ <xsd:selector xpath=".//xlf:group"/>
1686
+ <xsd:field xpath="@id"/>
1687
+ </xsd:unique>
1688
+ <xsd:key name="K_unit_id">
1689
+ <xsd:selector xpath=".//xlf:trans-unit|.//xlf:bin-unit"/>
1690
+ <xsd:field xpath="@id"/>
1691
+ </xsd:key>
1692
+ <xsd:keyref name="KR_unit_id" refer="xlf:K_unit_id">
1693
+ <xsd:selector xpath=".//bpt|.//ept|.//it|.//ph|.//g|.//x|.//bx|.//ex|.//sub"/>
1694
+ <xsd:field xpath="@xid"/>
1695
+ </xsd:keyref>
1696
+ <xsd:key name="K_tool-id">
1697
+ <xsd:selector xpath="xlf:header/xlf:tool"/>
1698
+ <xsd:field xpath="@tool-id"/>
1699
+ </xsd:key>
1700
+ <xsd:keyref name="KR_file_tool-id" refer="xlf:K_tool-id">
1701
+ <xsd:selector xpath="."/>
1702
+ <xsd:field xpath="@tool-id"/>
1703
+ </xsd:keyref>
1704
+ <xsd:keyref name="KR_phase_tool-id" refer="xlf:K_tool-id">
1705
+ <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1706
+ <xsd:field xpath="@tool-id"/>
1707
+ </xsd:keyref>
1708
+ <xsd:keyref name="KR_alt-trans_tool-id" refer="xlf:K_tool-id">
1709
+ <xsd:selector xpath=".//xlf:trans-unit/xlf:alt-trans"/>
1710
+ <xsd:field xpath="@tool-id"/>
1711
+ </xsd:keyref>
1712
+ <xsd:key name="K_count-group_name">
1713
+ <xsd:selector xpath=".//xlf:count-group"/>
1714
+ <xsd:field xpath="@name"/>
1715
+ </xsd:key>
1716
+ <xsd:unique name="U_context-group_name">
1717
+ <xsd:selector xpath=".//xlf:context-group"/>
1718
+ <xsd:field xpath="@name"/>
1719
+ </xsd:unique>
1720
+ <xsd:key name="K_phase-name">
1721
+ <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/>
1722
+ <xsd:field xpath="@phase-name"/>
1723
+ </xsd:key>
1724
+ <xsd:keyref name="KR_phase-name" refer="xlf:K_phase-name">
1725
+ <xsd:selector xpath=".//xlf:count|.//xlf:trans-unit|.//xlf:target|.//bin-unit|.//bin-target"/>
1726
+ <xsd:field xpath="@phase-name"/>
1727
+ </xsd:keyref>
1728
+ <xsd:unique name="U_uid">
1729
+ <xsd:selector xpath=".//xlf:external-file"/>
1730
+ <xsd:field xpath="@uid"/>
1731
+ </xsd:unique>
1732
+ </xsd:element>
1733
+ <xsd:element name="header">
1734
+ <xsd:complexType>
1735
+ <xsd:sequence>
1736
+ <xsd:element minOccurs="0" name="skl" type="xlf:ElemType_ExternalReference"/>
1737
+ <xsd:element minOccurs="0" ref="xlf:phase-group"/>
1738
+ <xsd:choice maxOccurs="unbounded" minOccurs="0">
1739
+ <xsd:element name="glossary" type="xlf:ElemType_ExternalReference"/>
1740
+ <xsd:element name="reference" type="xlf:ElemType_ExternalReference"/>
1741
+ <xsd:element ref="xlf:count-group"/>
1742
+ <xsd:element ref="xlf:note"/>
1743
+ <xsd:element ref="xlf:tool"/>
1744
+ </xsd:choice>
1745
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1746
+ </xsd:sequence>
1747
+ </xsd:complexType>
1748
+ </xsd:element>
1749
+ <xsd:element name="internal-file">
1750
+ <xsd:complexType>
1751
+ <xsd:simpleContent>
1752
+ <xsd:extension base="xsd:string">
1753
+ <xsd:attribute name="form" type="xsd:string"/>
1754
+ <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1755
+ </xsd:extension>
1756
+ </xsd:simpleContent>
1757
+ </xsd:complexType>
1758
+ </xsd:element>
1759
+ <xsd:element name="external-file">
1760
+ <xsd:complexType>
1761
+ <xsd:attribute name="href" type="xsd:string" use="required"/>
1762
+ <xsd:attribute name="crc" type="xsd:NMTOKEN"/>
1763
+ <xsd:attribute name="uid" type="xsd:NMTOKEN"/>
1764
+ </xsd:complexType>
1765
+ </xsd:element>
1766
+ <xsd:element name="note">
1767
+ <xsd:complexType>
1768
+ <xsd:simpleContent>
1769
+ <xsd:extension base="xsd:string">
1770
+ <xsd:attribute ref="xml:lang" use="optional"/>
1771
+ <xsd:attribute default="1" name="priority" type="xlf:AttrType_priority" use="optional"/>
1772
+ <xsd:attribute name="from" type="xsd:string" use="optional"/>
1773
+ <xsd:attribute default="general" name="annotates" type="xlf:AttrType_annotates" use="optional"/>
1774
+ </xsd:extension>
1775
+ </xsd:simpleContent>
1776
+ </xsd:complexType>
1777
+ </xsd:element>
1778
+ <xsd:element name="phase-group">
1779
+ <xsd:complexType>
1780
+ <xsd:sequence maxOccurs="unbounded">
1781
+ <xsd:element ref="xlf:phase"/>
1782
+ </xsd:sequence>
1783
+ </xsd:complexType>
1784
+ </xsd:element>
1785
+ <xsd:element name="phase">
1786
+ <xsd:complexType>
1787
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1788
+ <xsd:element ref="xlf:note"/>
1789
+ </xsd:sequence>
1790
+ <xsd:attribute name="phase-name" type="xsd:string" use="required"/>
1791
+ <xsd:attribute name="process-name" type="xsd:string" use="required"/>
1792
+ <xsd:attribute name="company-name" type="xsd:string" use="optional"/>
1793
+ <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
1794
+ <xsd:attribute name="date" type="xsd:dateTime" use="optional"/>
1795
+ <xsd:attribute name="job-id" type="xsd:string" use="optional"/>
1796
+ <xsd:attribute name="contact-name" type="xsd:string" use="optional"/>
1797
+ <xsd:attribute name="contact-email" type="xsd:string" use="optional"/>
1798
+ <xsd:attribute name="contact-phone" type="xsd:string" use="optional"/>
1799
+ </xsd:complexType>
1800
+ </xsd:element>
1801
+ <xsd:element name="count-group">
1802
+ <xsd:complexType>
1803
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
1804
+ <xsd:element ref="xlf:count"/>
1805
+ </xsd:sequence>
1806
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
1807
+ </xsd:complexType>
1808
+ </xsd:element>
1809
+ <xsd:element name="count">
1810
+ <xsd:complexType>
1811
+ <xsd:simpleContent>
1812
+ <xsd:extension base="xsd:string">
1813
+ <xsd:attribute name="count-type" type="xlf:AttrType_count-type" use="optional"/>
1814
+ <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1815
+ <xsd:attribute default="word" name="unit" type="xlf:AttrType_unit" use="optional"/>
1816
+ </xsd:extension>
1817
+ </xsd:simpleContent>
1818
+ </xsd:complexType>
1819
+ </xsd:element>
1820
+ <xsd:element name="context-group">
1821
+ <xsd:complexType>
1822
+ <xsd:sequence maxOccurs="unbounded">
1823
+ <xsd:element ref="xlf:context"/>
1824
+ </xsd:sequence>
1825
+ <xsd:attribute name="name" type="xsd:string" use="optional"/>
1826
+ <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1827
+ <xsd:attribute name="purpose" type="xlf:AttrType_purpose" use="optional"/>
1828
+ </xsd:complexType>
1829
+ </xsd:element>
1830
+ <xsd:element name="context">
1831
+ <xsd:complexType>
1832
+ <xsd:simpleContent>
1833
+ <xsd:extension base="xsd:string">
1834
+ <xsd:attribute name="context-type" type="xlf:AttrType_context-type" use="required"/>
1835
+ <xsd:attribute default="no" name="match-mandatory" type="xlf:AttrType_YesNo" use="optional"/>
1836
+ <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
1837
+ </xsd:extension>
1838
+ </xsd:simpleContent>
1839
+ </xsd:complexType>
1840
+ </xsd:element>
1841
+ <xsd:element name="tool">
1842
+ <xsd:complexType mixed="true">
1843
+ <xsd:sequence>
1844
+ <xsd:any namespace="##any" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
1845
+ </xsd:sequence>
1846
+ <xsd:attribute name="tool-id" type="xsd:string" use="required"/>
1847
+ <xsd:attribute name="tool-name" type="xsd:string" use="required"/>
1848
+ <xsd:attribute name="tool-version" type="xsd:string" use="optional"/>
1849
+ <xsd:attribute name="tool-company" type="xsd:string" use="optional"/>
1850
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1851
+ </xsd:complexType>
1852
+ </xsd:element>
1853
+ <xsd:element name="body">
1854
+ <xsd:complexType>
1855
+ <xsd:choice maxOccurs="unbounded" minOccurs="0">
1856
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1857
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1858
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1859
+ </xsd:choice>
1860
+ </xsd:complexType>
1861
+ </xsd:element>
1862
+ <xsd:element name="group">
1863
+ <xsd:complexType>
1864
+ <xsd:sequence>
1865
+ <xsd:sequence>
1866
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
1867
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:count-group"/>
1868
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
1869
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1870
+ </xsd:sequence>
1871
+ <xsd:choice maxOccurs="unbounded">
1872
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/>
1873
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/>
1874
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/>
1875
+ </xsd:choice>
1876
+ </xsd:sequence>
1877
+ <xsd:attribute name="id" type="xsd:string" use="optional"/>
1878
+ <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1879
+ <xsd:attribute default="default" ref="xml:space" use="optional"/>
1880
+ <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1881
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1882
+ <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1883
+ <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1884
+ <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1885
+ <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1886
+ <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1887
+ <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1888
+ <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1889
+ <xsd:attribute name="font" type="xsd:string" use="optional"/>
1890
+ <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1891
+ <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1892
+ <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1893
+ <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1894
+ <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1895
+ <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1896
+ <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1897
+ <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1898
+ <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1899
+ <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1900
+ <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1901
+ <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1902
+ <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1903
+ <xsd:attribute default="no" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1904
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1905
+ </xsd:complexType>
1906
+ </xsd:element>
1907
+ <xsd:element name="trans-unit">
1908
+ <xsd:complexType>
1909
+ <xsd:sequence>
1910
+ <xsd:element ref="xlf:source"/>
1911
+ <xsd:element minOccurs="0" ref="xlf:seg-source"/>
1912
+ <xsd:element minOccurs="0" ref="xlf:target"/>
1913
+ <xsd:choice maxOccurs="unbounded" minOccurs="0">
1914
+ <xsd:element ref="xlf:context-group"/>
1915
+ <xsd:element ref="xlf:count-group"/>
1916
+ <xsd:element ref="xlf:note"/>
1917
+ <xsd:element ref="xlf:alt-trans"/>
1918
+ </xsd:choice>
1919
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
1920
+ </xsd:sequence>
1921
+ <xsd:attribute name="id" type="xsd:string" use="required"/>
1922
+ <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
1923
+ <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
1924
+ <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
1925
+ <xsd:attribute default="default" ref="xml:space" use="optional"/>
1926
+ <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
1927
+ <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
1928
+ <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
1929
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
1930
+ <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
1931
+ <xsd:attribute name="extype" type="xsd:string" use="optional"/>
1932
+ <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
1933
+ <xsd:attribute name="menu" type="xsd:string" use="optional"/>
1934
+ <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
1935
+ <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
1936
+ <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
1937
+ <xsd:attribute name="font" type="xsd:string" use="optional"/>
1938
+ <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
1939
+ <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
1940
+ <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
1941
+ <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/>
1942
+ <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/>
1943
+ <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/>
1944
+ <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/>
1945
+ <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/>
1946
+ <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/>
1947
+ <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/>
1948
+ <xsd:attribute name="charclass" type="xsd:string" use="optional"/>
1949
+ <xsd:attribute default="yes" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/>
1950
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1951
+ </xsd:complexType>
1952
+ <xsd:unique name="U_tu_segsrc_mid">
1953
+ <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
1954
+ <xsd:field xpath="@mid"/>
1955
+ </xsd:unique>
1956
+ <xsd:keyref name="KR_tu_segsrc_mid" refer="xlf:U_tu_segsrc_mid">
1957
+ <xsd:selector xpath="./xlf:target/xlf:mrk|./xlf:alt-trans"/>
1958
+ <xsd:field xpath="@mid"/>
1959
+ </xsd:keyref>
1960
+ </xsd:element>
1961
+ <xsd:element name="source">
1962
+ <xsd:complexType mixed="true">
1963
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1964
+ <xsd:attribute ref="xml:lang" use="optional"/>
1965
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1966
+ </xsd:complexType>
1967
+ <xsd:unique name="U_source_bpt_rid">
1968
+ <xsd:selector xpath=".//xlf:bpt"/>
1969
+ <xsd:field xpath="@rid"/>
1970
+ </xsd:unique>
1971
+ <xsd:keyref name="KR_source_ept_rid" refer="xlf:U_source_bpt_rid">
1972
+ <xsd:selector xpath=".//xlf:ept"/>
1973
+ <xsd:field xpath="@rid"/>
1974
+ </xsd:keyref>
1975
+ <xsd:unique name="U_source_bx_rid">
1976
+ <xsd:selector xpath=".//xlf:bx"/>
1977
+ <xsd:field xpath="@rid"/>
1978
+ </xsd:unique>
1979
+ <xsd:keyref name="KR_source_ex_rid" refer="xlf:U_source_bx_rid">
1980
+ <xsd:selector xpath=".//xlf:ex"/>
1981
+ <xsd:field xpath="@rid"/>
1982
+ </xsd:keyref>
1983
+ </xsd:element>
1984
+ <xsd:element name="seg-source">
1985
+ <xsd:complexType mixed="true">
1986
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
1987
+ <xsd:attribute ref="xml:lang" use="optional"/>
1988
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
1989
+ </xsd:complexType>
1990
+ <xsd:unique name="U_segsrc_bpt_rid">
1991
+ <xsd:selector xpath=".//xlf:bpt"/>
1992
+ <xsd:field xpath="@rid"/>
1993
+ </xsd:unique>
1994
+ <xsd:keyref name="KR_segsrc_ept_rid" refer="xlf:U_segsrc_bpt_rid">
1995
+ <xsd:selector xpath=".//xlf:ept"/>
1996
+ <xsd:field xpath="@rid"/>
1997
+ </xsd:keyref>
1998
+ <xsd:unique name="U_segsrc_bx_rid">
1999
+ <xsd:selector xpath=".//xlf:bx"/>
2000
+ <xsd:field xpath="@rid"/>
2001
+ </xsd:unique>
2002
+ <xsd:keyref name="KR_segsrc_ex_rid" refer="xlf:U_segsrc_bx_rid">
2003
+ <xsd:selector xpath=".//xlf:ex"/>
2004
+ <xsd:field xpath="@rid"/>
2005
+ </xsd:keyref>
2006
+ </xsd:element>
2007
+ <xsd:element name="target">
2008
+ <xsd:complexType mixed="true">
2009
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2010
+ <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2011
+ <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2012
+ <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2013
+ <xsd:attribute ref="xml:lang" use="optional"/>
2014
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2015
+ <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2016
+ <xsd:attribute name="font" type="xsd:string" use="optional"/>
2017
+ <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2018
+ <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2019
+ <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2020
+ <xsd:attribute default="yes" name="equiv-trans" type="xlf:AttrType_YesNo" use="optional"/>
2021
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2022
+ </xsd:complexType>
2023
+ <xsd:unique name="U_target_bpt_rid">
2024
+ <xsd:selector xpath=".//xlf:bpt"/>
2025
+ <xsd:field xpath="@rid"/>
2026
+ </xsd:unique>
2027
+ <xsd:keyref name="KR_target_ept_rid" refer="xlf:U_target_bpt_rid">
2028
+ <xsd:selector xpath=".//xlf:ept"/>
2029
+ <xsd:field xpath="@rid"/>
2030
+ </xsd:keyref>
2031
+ <xsd:unique name="U_target_bx_rid">
2032
+ <xsd:selector xpath=".//xlf:bx"/>
2033
+ <xsd:field xpath="@rid"/>
2034
+ </xsd:unique>
2035
+ <xsd:keyref name="KR_target_ex_rid" refer="xlf:U_target_bx_rid">
2036
+ <xsd:selector xpath=".//xlf:ex"/>
2037
+ <xsd:field xpath="@rid"/>
2038
+ </xsd:keyref>
2039
+ </xsd:element>
2040
+ <xsd:element name="alt-trans">
2041
+ <xsd:complexType>
2042
+ <xsd:sequence>
2043
+ <xsd:element minOccurs="0" ref="xlf:source"/>
2044
+ <xsd:element minOccurs="0" ref="xlf:seg-source"/>
2045
+ <xsd:element maxOccurs="1" ref="xlf:target"/>
2046
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/>
2047
+ <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/>
2048
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2049
+ </xsd:sequence>
2050
+ <xsd:attribute name="match-quality" type="xsd:string" use="optional"/>
2051
+ <xsd:attribute name="tool-id" type="xsd:string" use="optional"/>
2052
+ <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/>
2053
+ <xsd:attribute ref="xml:lang" use="optional"/>
2054
+ <xsd:attribute name="origin" type="xsd:string" use="optional"/>
2055
+ <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2056
+ <xsd:attribute default="default" ref="xml:space" use="optional"/>
2057
+ <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2058
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2059
+ <xsd:attribute name="extradata" type="xsd:string" use="optional"/>
2060
+ <xsd:attribute name="extype" type="xsd:string" use="optional"/>
2061
+ <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/>
2062
+ <xsd:attribute name="menu" type="xsd:string" use="optional"/>
2063
+ <xsd:attribute name="menu-option" type="xsd:string" use="optional"/>
2064
+ <xsd:attribute name="menu-name" type="xsd:string" use="optional"/>
2065
+ <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2066
+ <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/>
2067
+ <xsd:attribute name="font" type="xsd:string" use="optional"/>
2068
+ <xsd:attribute name="css-style" type="xsd:string" use="optional"/>
2069
+ <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/>
2070
+ <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/>
2071
+ <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2072
+ <xsd:attribute default="proposal" name="alttranstype" type="xlf:AttrType_alttranstype" use="optional"/>
2073
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2074
+ </xsd:complexType>
2075
+ <xsd:unique name="U_at_segsrc_mid">
2076
+ <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/>
2077
+ <xsd:field xpath="@mid"/>
2078
+ </xsd:unique>
2079
+ <xsd:keyref name="KR_at_segsrc_mid" refer="xlf:U_at_segsrc_mid">
2080
+ <xsd:selector xpath="./xlf:target/xlf:mrk"/>
2081
+ <xsd:field xpath="@mid"/>
2082
+ </xsd:keyref>
2083
+ </xsd:element>
2084
+ <xsd:element name="bin-unit">
2085
+ <xsd:complexType>
2086
+ <xsd:sequence>
2087
+ <xsd:element ref="xlf:bin-source"/>
2088
+ <xsd:element minOccurs="0" ref="xlf:bin-target"/>
2089
+ <xsd:choice maxOccurs="unbounded" minOccurs="0">
2090
+ <xsd:element ref="xlf:context-group"/>
2091
+ <xsd:element ref="xlf:count-group"/>
2092
+ <xsd:element ref="xlf:note"/>
2093
+ <xsd:element ref="xlf:trans-unit"/>
2094
+ </xsd:choice>
2095
+ <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/>
2096
+ </xsd:sequence>
2097
+ <xsd:attribute name="id" type="xsd:string" use="required"/>
2098
+ <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="required"/>
2099
+ <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/>
2100
+ <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/>
2101
+ <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/>
2102
+ <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2103
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2104
+ <xsd:attribute name="phase-name" type="xsd:string" use="optional"/>
2105
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2106
+ </xsd:complexType>
2107
+ </xsd:element>
2108
+ <xsd:element name="bin-source">
2109
+ <xsd:complexType>
2110
+ <xsd:choice>
2111
+ <xsd:element ref="xlf:internal-file"/>
2112
+ <xsd:element ref="xlf:external-file"/>
2113
+ </xsd:choice>
2114
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2115
+ </xsd:complexType>
2116
+ </xsd:element>
2117
+ <xsd:element name="bin-target">
2118
+ <xsd:complexType>
2119
+ <xsd:choice>
2120
+ <xsd:element ref="xlf:internal-file"/>
2121
+ <xsd:element ref="xlf:external-file"/>
2122
+ </xsd:choice>
2123
+ <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="optional"/>
2124
+ <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/>
2125
+ <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/>
2126
+ <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/>
2127
+ <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/>
2128
+ <xsd:attribute name="resname" type="xsd:string" use="optional"/>
2129
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2130
+ </xsd:complexType>
2131
+ </xsd:element>
2132
+ <!-- Element for inline codes -->
2133
+ <xsd:element name="g">
2134
+ <xsd:complexType mixed="true">
2135
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2136
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2137
+ <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2138
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2139
+ </xsd:complexType>
2140
+ </xsd:element>
2141
+ <xsd:element name="x">
2142
+ <xsd:complexType>
2143
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2144
+ <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2145
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2146
+ </xsd:complexType>
2147
+ </xsd:element>
2148
+ <xsd:element name="bx">
2149
+ <xsd:complexType>
2150
+ <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2151
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2152
+ <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/>
2153
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2154
+ </xsd:complexType>
2155
+ </xsd:element>
2156
+ <xsd:element name="ex">
2157
+ <xsd:complexType>
2158
+ <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2159
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2160
+ </xsd:complexType>
2161
+ </xsd:element>
2162
+ <xsd:element name="ph">
2163
+ <xsd:complexType mixed="true">
2164
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2165
+ <xsd:element ref="xlf:sub"/>
2166
+ </xsd:sequence>
2167
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/>
2168
+ <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2169
+ <xsd:attribute name="assoc" type="xlf:AttrType_assoc" use="optional"/>
2170
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2171
+ </xsd:complexType>
2172
+ </xsd:element>
2173
+ <xsd:element name="bpt">
2174
+ <xsd:complexType mixed="true">
2175
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2176
+ <xsd:element ref="xlf:sub"/>
2177
+ </xsd:sequence>
2178
+ <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2179
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2180
+ <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2181
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2182
+ </xsd:complexType>
2183
+ </xsd:element>
2184
+ <xsd:element name="ept">
2185
+ <xsd:complexType mixed="true">
2186
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2187
+ <xsd:element ref="xlf:sub"/>
2188
+ </xsd:sequence>
2189
+ <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2190
+ <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2191
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2192
+ </xsd:complexType>
2193
+ </xsd:element>
2194
+ <xsd:element name="it">
2195
+ <xsd:complexType mixed="true">
2196
+ <xsd:sequence maxOccurs="unbounded" minOccurs="0">
2197
+ <xsd:element ref="xlf:sub"/>
2198
+ </xsd:sequence>
2199
+ <xsd:attribute name="pos" type="xlf:AttrType_Position" use="required"/>
2200
+ <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/>
2201
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2202
+ <xsd:attribute name="crc" type="xsd:string" use="optional"/>
2203
+ <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/>
2204
+ </xsd:complexType>
2205
+ </xsd:element>
2206
+ <xsd:element name="sub">
2207
+ <xsd:complexType mixed="true">
2208
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2209
+ <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/>
2210
+ <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/>
2211
+ <xsd:attribute name="xid" type="xsd:string" use="optional"/>
2212
+ </xsd:complexType>
2213
+ </xsd:element>
2214
+ <xsd:element name="mrk">
2215
+ <xsd:complexType mixed="true">
2216
+ <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/>
2217
+ <xsd:attribute name="mtype" type="xlf:AttrType_mtype" use="required"/>
2218
+ <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/>
2219
+ <xsd:attribute name="comment" type="xsd:string" use="optional"/>
2220
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
2221
+ </xsd:complexType>
2222
+ </xsd:element>
2223
+ </xsd:schema>
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/Loader/schema/dic/xliff-core/xml.xsd ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version='1.0'?>
2
+ <?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
3
+ <xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
4
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
5
+ xmlns ="http://www.w3.org/1999/xhtml"
6
+ xml:lang="en">
7
+
8
+ <xs:annotation>
9
+ <xs:documentation>
10
+ <div>
11
+ <h1>About the XML namespace</h1>
12
+
13
+ <div class="bodytext">
14
+ <p>
15
+
16
+ This schema document describes the XML namespace, in a form
17
+ suitable for import by other schema documents.
18
+ </p>
19
+ <p>
20
+ See <a href="http://www.w3.org/XML/1998/namespace.html">
21
+ http://www.w3.org/XML/1998/namespace.html</a> and
22
+ <a href="http://www.w3.org/TR/REC-xml">
23
+ http://www.w3.org/TR/REC-xml</a> for information
24
+ about this namespace.
25
+ </p>
26
+
27
+ <p>
28
+ Note that local names in this namespace are intended to be
29
+ defined only by the World Wide Web Consortium or its subgroups.
30
+ The names currently defined in this namespace are listed below.
31
+ They should not be used with conflicting semantics by any Working
32
+ Group, specification, or document instance.
33
+ </p>
34
+ <p>
35
+ See further below in this document for more information about <a
36
+ href="#usage">how to refer to this schema document from your own
37
+ XSD schema documents</a> and about <a href="#nsversioning">the
38
+ namespace-versioning policy governing this schema document</a>.
39
+ </p>
40
+ </div>
41
+ </div>
42
+
43
+ </xs:documentation>
44
+ </xs:annotation>
45
+
46
+ <xs:attribute name="lang">
47
+ <xs:annotation>
48
+ <xs:documentation>
49
+ <div>
50
+
51
+ <h3>lang (as an attribute name)</h3>
52
+ <p>
53
+
54
+ denotes an attribute whose value
55
+ is a language code for the natural language of the content of
56
+ any element; its value is inherited. This name is reserved
57
+ by virtue of its definition in the XML specification.</p>
58
+
59
+ </div>
60
+ <div>
61
+ <h4>Notes</h4>
62
+ <p>
63
+ Attempting to install the relevant ISO 2- and 3-letter
64
+ codes as the enumerated possible values is probably never
65
+ going to be a realistic possibility.
66
+ </p>
67
+ <p>
68
+
69
+ See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
70
+ http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
71
+ and the IANA language subtag registry at
72
+ <a href="http://www.iana.org/assignments/language-subtag-registry">
73
+ http://www.iana.org/assignments/language-subtag-registry</a>
74
+ for further information.
75
+ </p>
76
+ <p>
77
+
78
+ The union allows for the 'un-declaration' of xml:lang with
79
+ the empty string.
80
+ </p>
81
+ </div>
82
+ </xs:documentation>
83
+ </xs:annotation>
84
+ <xs:simpleType>
85
+ <xs:union memberTypes="xs:language">
86
+ <xs:simpleType>
87
+ <xs:restriction base="xs:string">
88
+ <xs:enumeration value=""/>
89
+
90
+ </xs:restriction>
91
+ </xs:simpleType>
92
+ </xs:union>
93
+ </xs:simpleType>
94
+ </xs:attribute>
95
+
96
+ <xs:attribute name="space">
97
+ <xs:annotation>
98
+ <xs:documentation>
99
+
100
+ <div>
101
+
102
+ <h3>space (as an attribute name)</h3>
103
+ <p>
104
+ denotes an attribute whose
105
+ value is a keyword indicating what whitespace processing
106
+ discipline is intended for the content of the element; its
107
+ value is inherited. This name is reserved by virtue of its
108
+ definition in the XML specification.</p>
109
+
110
+ </div>
111
+ </xs:documentation>
112
+ </xs:annotation>
113
+ <xs:simpleType>
114
+
115
+ <xs:restriction base="xs:NCName">
116
+ <xs:enumeration value="default"/>
117
+ <xs:enumeration value="preserve"/>
118
+ </xs:restriction>
119
+ </xs:simpleType>
120
+ </xs:attribute>
121
+
122
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
123
+ <xs:documentation>
124
+
125
+ <div>
126
+
127
+ <h3>base (as an attribute name)</h3>
128
+ <p>
129
+ denotes an attribute whose value
130
+ provides a URI to be used as the base for interpreting any
131
+ relative URIs in the scope of the element on which it
132
+ appears; its value is inherited. This name is reserved
133
+ by virtue of its definition in the XML Base specification.</p>
134
+
135
+ <p>
136
+ See <a
137
+ href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
138
+ for information about this attribute.
139
+ </p>
140
+
141
+ </div>
142
+ </xs:documentation>
143
+ </xs:annotation>
144
+ </xs:attribute>
145
+
146
+ <xs:attribute name="id" type="xs:ID">
147
+ <xs:annotation>
148
+ <xs:documentation>
149
+ <div>
150
+
151
+ <h3>id (as an attribute name)</h3>
152
+ <p>
153
+
154
+ denotes an attribute whose value
155
+ should be interpreted as if declared to be of type ID.
156
+ This name is reserved by virtue of its definition in the
157
+ xml:id specification.</p>
158
+
159
+ <p>
160
+ See <a
161
+ href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
162
+ for information about this attribute.
163
+ </p>
164
+ </div>
165
+ </xs:documentation>
166
+ </xs:annotation>
167
+
168
+ </xs:attribute>
169
+
170
+ <xs:attributeGroup name="specialAttrs">
171
+ <xs:attribute ref="xml:base"/>
172
+ <xs:attribute ref="xml:lang"/>
173
+ <xs:attribute ref="xml:space"/>
174
+ <xs:attribute ref="xml:id"/>
175
+ </xs:attributeGroup>
176
+
177
+ <xs:annotation>
178
+
179
+ <xs:documentation>
180
+ <div>
181
+
182
+ <h3>Father (in any context at all)</h3>
183
+
184
+ <div class="bodytext">
185
+ <p>
186
+ denotes Jon Bosak, the chair of
187
+ the original XML Working Group. This name is reserved by
188
+ the following decision of the W3C XML Plenary and
189
+ XML Coordination groups:
190
+ </p>
191
+ <blockquote>
192
+ <p>
193
+
194
+ In appreciation for his vision, leadership and
195
+ dedication the W3C XML Plenary on this 10th day of
196
+ February, 2000, reserves for Jon Bosak in perpetuity
197
+ the XML name "xml:Father".
198
+ </p>
199
+ </blockquote>
200
+ </div>
201
+ </div>
202
+ </xs:documentation>
203
+ </xs:annotation>
204
+
205
+ <xs:annotation>
206
+ <xs:documentation>
207
+
208
+ <div xml:id="usage" id="usage">
209
+ <h2><a name="usage">About this schema document</a></h2>
210
+
211
+ <div class="bodytext">
212
+ <p>
213
+ This schema defines attributes and an attribute group suitable
214
+ for use by schemas wishing to allow <code>xml:base</code>,
215
+ <code>xml:lang</code>, <code>xml:space</code> or
216
+ <code>xml:id</code> attributes on elements they define.
217
+ </p>
218
+
219
+ <p>
220
+ To enable this, such a schema must import this schema for
221
+ the XML namespace, e.g. as follows:
222
+ </p>
223
+ <pre>
224
+ &lt;schema.. .>
225
+ .. .
226
+ &lt;import namespace="http://www.w3.org/XML/1998/namespace"
227
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
228
+ </pre>
229
+ <p>
230
+ or
231
+ </p>
232
+ <pre>
233
+
234
+ &lt;import namespace="http://www.w3.org/XML/1998/namespace"
235
+ schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
236
+ </pre>
237
+ <p>
238
+ Subsequently, qualified reference to any of the attributes or the
239
+ group defined below will have the desired effect, e.g.
240
+ </p>
241
+ <pre>
242
+ &lt;type.. .>
243
+ .. .
244
+ &lt;attributeGroup ref="xml:specialAttrs"/>
245
+ </pre>
246
+ <p>
247
+ will define a type which will schema-validate an instance element
248
+ with any of those attributes.
249
+ </p>
250
+
251
+ </div>
252
+ </div>
253
+ </xs:documentation>
254
+ </xs:annotation>
255
+
256
+ <xs:annotation>
257
+ <xs:documentation>
258
+ <div id="nsversioning" xml:id="nsversioning">
259
+ <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
260
+
261
+ <div class="bodytext">
262
+ <p>
263
+ In keeping with the XML Schema WG's standard versioning
264
+ policy, this schema document will persist at
265
+ <a href="http://www.w3.org/2009/01/xml.xsd">
266
+ http://www.w3.org/2009/01/xml.xsd</a>.
267
+ </p>
268
+ <p>
269
+ At the date of issue it can also be found at
270
+ <a href="http://www.w3.org/2001/xml.xsd">
271
+ http://www.w3.org/2001/xml.xsd</a>.
272
+ </p>
273
+
274
+ <p>
275
+ The schema document at that URI may however change in the future,
276
+ in order to remain compatible with the latest version of XML
277
+ Schema itself, or with the XML namespace itself. In other words,
278
+ if the XML Schema or XML namespaces change, the version of this
279
+ document at <a href="http://www.w3.org/2001/xml.xsd">
280
+ http://www.w3.org/2001/xml.xsd
281
+ </a>
282
+ will change accordingly; the version at
283
+ <a href="http://www.w3.org/2009/01/xml.xsd">
284
+ http://www.w3.org/2009/01/xml.xsd
285
+ </a>
286
+ will not change.
287
+ </p>
288
+ <p>
289
+
290
+ Previous dated (and unchanging) versions of this schema
291
+ document are at:
292
+ </p>
293
+ <ul>
294
+ <li><a href="http://www.w3.org/2009/01/xml.xsd">
295
+ http://www.w3.org/2009/01/xml.xsd</a></li>
296
+ <li><a href="http://www.w3.org/2007/08/xml.xsd">
297
+ http://www.w3.org/2007/08/xml.xsd</a></li>
298
+ <li><a href="http://www.w3.org/2004/10/xml.xsd">
299
+
300
+ http://www.w3.org/2004/10/xml.xsd</a></li>
301
+ <li><a href="http://www.w3.org/2001/03/xml.xsd">
302
+ http://www.w3.org/2001/03/xml.xsd</a></li>
303
+ </ul>
304
+ </div>
305
+ </div>
306
+ </xs:documentation>
307
+ </xs:annotation>
308
+
309
+ </xs:schema>
vendor/symfony/translation/LoggingTranslator.php ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ use Psr\Log\LoggerInterface;
15
+
16
+ /**
17
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
+ */
19
+ class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface
20
+ {
21
+ /**
22
+ * @var TranslatorInterface|TranslatorBagInterface
23
+ */
24
+ private $translator;
25
+
26
+ private $logger;
27
+
28
+ /**
29
+ * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
30
+ * @param LoggerInterface $logger
31
+ */
32
+ public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
33
+ {
34
+ if (!$translator instanceof TranslatorBagInterface) {
35
+ throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator)));
36
+ }
37
+
38
+ $this->translator = $translator;
39
+ $this->logger = $logger;
40
+ }
41
+
42
+ /**
43
+ * {@inheritdoc}
44
+ */
45
+ public function trans($id, array $parameters = array(), $domain = null, $locale = null)
46
+ {
47
+ $trans = $this->translator->trans($id, $parameters, $domain, $locale);
48
+ $this->log($id, $domain, $locale);
49
+
50
+ return $trans;
51
+ }
52
+
53
+ /**
54
+ * {@inheritdoc}
55
+ */
56
+ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
57
+ {
58
+ $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
59
+ $this->log($id, $domain, $locale);
60
+
61
+ return $trans;
62
+ }
63
+
64
+ /**
65
+ * {@inheritdoc}
66
+ */
67
+ public function setLocale($locale)
68
+ {
69
+ $this->translator->setLocale($locale);
70
+ }
71
+
72
+ /**
73
+ * {@inheritdoc}
74
+ */
75
+ public function getLocale()
76
+ {
77
+ return $this->translator->getLocale();
78
+ }
79
+
80
+ /**
81
+ * {@inheritdoc}
82
+ */
83
+ public function getCatalogue($locale = null)
84
+ {
85
+ return $this->translator->getCatalogue($locale);
86
+ }
87
+
88
+ /**
89
+ * Gets the fallback locales.
90
+ *
91
+ * @return array The fallback locales
92
+ */
93
+ public function getFallbackLocales()
94
+ {
95
+ if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) {
96
+ return $this->translator->getFallbackLocales();
97
+ }
98
+
99
+ return array();
100
+ }
101
+
102
+ /**
103
+ * Passes through all unknown calls onto the translator object.
104
+ */
105
+ public function __call($method, $args)
106
+ {
107
+ return \call_user_func_array(array($this->translator, $method), $args);
108
+ }
109
+
110
+ /**
111
+ * Logs for missing translations.
112
+ *
113
+ * @param string $id
114
+ * @param string|null $domain
115
+ * @param string|null $locale
116
+ */
117
+ private function log($id, $domain, $locale)
118
+ {
119
+ if (null === $domain) {
120
+ $domain = 'messages';
121
+ }
122
+
123
+ $id = (string) $id;
124
+ $catalogue = $this->translator->getCatalogue($locale);
125
+ if ($catalogue->defines($id, $domain)) {
126
+ return;
127
+ }
128
+
129
+ if ($catalogue->has($id, $domain)) {
130
+ $this->logger->debug('Translation use fallback catalogue.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()));
131
+ } else {
132
+ $this->logger->warning('Translation not found.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()));
133
+ }
134
+ }
135
+ }
vendor/symfony/translation/MessageCatalogue.php ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ use Symfony\Component\Config\Resource\ResourceInterface;
15
+
16
+ /**
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface
20
+ {
21
+ private $messages = array();
22
+ private $metadata = array();
23
+ private $resources = array();
24
+ private $locale;
25
+ private $fallbackCatalogue;
26
+ private $parent;
27
+
28
+ /**
29
+ * @param string $locale The locale
30
+ * @param array $messages An array of messages classified by domain
31
+ */
32
+ public function __construct($locale, array $messages = array())
33
+ {
34
+ $this->locale = $locale;
35
+ $this->messages = $messages;
36
+ }
37
+
38
+ /**
39
+ * {@inheritdoc}
40
+ */
41
+ public function getLocale()
42
+ {
43
+ return $this->locale;
44
+ }
45
+
46
+ /**
47
+ * {@inheritdoc}
48
+ */
49
+ public function getDomains()
50
+ {
51
+ return array_keys($this->messages);
52
+ }
53
+
54
+ /**
55
+ * {@inheritdoc}
56
+ */
57
+ public function all($domain = null)
58
+ {
59
+ if (null === $domain) {
60
+ return $this->messages;
61
+ }
62
+
63
+ return isset($this->messages[$domain]) ? $this->messages[$domain] : array();
64
+ }
65
+
66
+ /**
67
+ * {@inheritdoc}
68
+ */
69
+ public function set($id, $translation, $domain = 'messages')
70
+ {
71
+ $this->add(array($id => $translation), $domain);
72
+ }
73
+
74
+ /**
75
+ * {@inheritdoc}
76
+ */
77
+ public function has($id, $domain = 'messages')
78
+ {
79
+ if (isset($this->messages[$domain][$id])) {
80
+ return true;
81
+ }
82
+
83
+ if (null !== $this->fallbackCatalogue) {
84
+ return $this->fallbackCatalogue->has($id, $domain);
85
+ }
86
+
87
+ return false;
88
+ }
89
+
90
+ /**
91
+ * {@inheritdoc}
92
+ */
93
+ public function defines($id, $domain = 'messages')
94
+ {
95
+ return isset($this->messages[$domain][$id]);
96
+ }
97
+
98
+ /**
99
+ * {@inheritdoc}
100
+ */
101
+ public function get($id, $domain = 'messages')
102
+ {
103
+ if (isset($this->messages[$domain][$id])) {
104
+ return $this->messages[$domain][$id];
105
+ }
106
+
107
+ if (null !== $this->fallbackCatalogue) {
108
+ return $this->fallbackCatalogue->get($id, $domain);
109
+ }
110
+
111
+ return $id;
112
+ }
113
+
114
+ /**
115
+ * {@inheritdoc}
116
+ */
117
+ public function replace($messages, $domain = 'messages')
118
+ {
119
+ $this->messages[$domain] = array();
120
+
121
+ $this->add($messages, $domain);
122
+ }
123
+
124
+ /**
125
+ * {@inheritdoc}
126
+ */
127
+ public function add($messages, $domain = 'messages')
128
+ {
129
+ if (!isset($this->messages[$domain])) {
130
+ $this->messages[$domain] = $messages;
131
+ } else {
132
+ $this->messages[$domain] = array_replace($this->messages[$domain], $messages);
133
+ }
134
+ }
135
+
136
+ /**
137
+ * {@inheritdoc}
138
+ */
139
+ public function addCatalogue(MessageCatalogueInterface $catalogue)
140
+ {
141
+ if ($catalogue->getLocale() !== $this->locale) {
142
+ throw new \LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
143
+ }
144
+
145
+ foreach ($catalogue->all() as $domain => $messages) {
146
+ $this->add($messages, $domain);
147
+ }
148
+
149
+ foreach ($catalogue->getResources() as $resource) {
150
+ $this->addResource($resource);
151
+ }
152
+
153
+ if ($catalogue instanceof MetadataAwareInterface) {
154
+ $metadata = $catalogue->getMetadata('', '');
155
+ $this->addMetadata($metadata);
156
+ }
157
+ }
158
+
159
+ /**
160
+ * {@inheritdoc}
161
+ */
162
+ public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
163
+ {
164
+ // detect circular references
165
+ $c = $catalogue;
166
+ while ($c = $c->getFallbackCatalogue()) {
167
+ if ($c->getLocale() === $this->getLocale()) {
168
+ throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
169
+ }
170
+ }
171
+
172
+ $c = $this;
173
+ do {
174
+ if ($c->getLocale() === $catalogue->getLocale()) {
175
+ throw new \LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
176
+ }
177
+
178
+ foreach ($catalogue->getResources() as $resource) {
179
+ $c->addResource($resource);
180
+ }
181
+ } while ($c = $c->parent);
182
+
183
+ $catalogue->parent = $this;
184
+ $this->fallbackCatalogue = $catalogue;
185
+
186
+ foreach ($catalogue->getResources() as $resource) {
187
+ $this->addResource($resource);
188
+ }
189
+ }
190
+
191
+ /**
192
+ * {@inheritdoc}
193
+ */
194
+ public function getFallbackCatalogue()
195
+ {
196
+ return $this->fallbackCatalogue;
197
+ }
198
+
199
+ /**
200
+ * {@inheritdoc}
201
+ */
202
+ public function getResources()
203
+ {
204
+ return array_values($this->resources);
205
+ }
206
+
207
+ /**
208
+ * {@inheritdoc}
209
+ */
210
+ public function addResource(ResourceInterface $resource)
211
+ {
212
+ $this->resources[$resource->__toString()] = $resource;
213
+ }
214
+
215
+ /**
216
+ * {@inheritdoc}
217
+ */
218
+ public function getMetadata($key = '', $domain = 'messages')
219
+ {
220
+ if ('' == $domain) {
221
+ return $this->metadata;
222
+ }
223
+
224
+ if (isset($this->metadata[$domain])) {
225
+ if ('' == $key) {
226
+ return $this->metadata[$domain];
227
+ }
228
+
229
+ if (isset($this->metadata[$domain][$key])) {
230
+ return $this->metadata[$domain][$key];
231
+ }
232
+ }
233
+ }
234
+
235
+ /**
236
+ * {@inheritdoc}
237
+ */
238
+ public function setMetadata($key, $value, $domain = 'messages')
239
+ {
240
+ $this->metadata[$domain][$key] = $value;
241
+ }
242
+
243
+ /**
244
+ * {@inheritdoc}
245
+ */
246
+ public function deleteMetadata($key = '', $domain = 'messages')
247
+ {
248
+ if ('' == $domain) {
249
+ $this->metadata = array();
250
+ } elseif ('' == $key) {
251
+ unset($this->metadata[$domain]);
252
+ } else {
253
+ unset($this->metadata[$domain][$key]);
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Adds current values with the new values.
259
+ *
260
+ * @param array $values Values to add
261
+ */
262
+ private function addMetadata(array $values)
263
+ {
264
+ foreach ($values as $domain => $keys) {
265
+ foreach ($keys as $key => $value) {
266
+ $this->setMetadata($key, $value, $domain);
267
+ }
268
+ }
269
+ }
270
+ }
vendor/symfony/translation/MessageCatalogueInterface.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ use Symfony\Component\Config\Resource\ResourceInterface;
15
+
16
+ /**
17
+ * MessageCatalogueInterface.
18
+ *
19
+ * @author Fabien Potencier <fabien@symfony.com>
20
+ */
21
+ interface MessageCatalogueInterface
22
+ {
23
+ /**
24
+ * Gets the catalogue locale.
25
+ *
26
+ * @return string The locale
27
+ */
28
+ public function getLocale();
29
+
30
+ /**
31
+ * Gets the domains.
32
+ *
33
+ * @return array An array of domains
34
+ */
35
+ public function getDomains();
36
+
37
+ /**
38
+ * Gets the messages within a given domain.
39
+ *
40
+ * If $domain is null, it returns all messages.
41
+ *
42
+ * @param string $domain The domain name
43
+ *
44
+ * @return array An array of messages
45
+ */
46
+ public function all($domain = null);
47
+
48
+ /**
49
+ * Sets a message translation.
50
+ *
51
+ * @param string $id The message id
52
+ * @param string $translation The messages translation
53
+ * @param string $domain The domain name
54
+ */
55
+ public function set($id, $translation, $domain = 'messages');
56
+
57
+ /**
58
+ * Checks if a message has a translation.
59
+ *
60
+ * @param string $id The message id
61
+ * @param string $domain The domain name
62
+ *
63
+ * @return bool true if the message has a translation, false otherwise
64
+ */
65
+ public function has($id, $domain = 'messages');
66
+
67
+ /**
68
+ * Checks if a message has a translation (it does not take into account the fallback mechanism).
69
+ *
70
+ * @param string $id The message id
71
+ * @param string $domain The domain name
72
+ *
73
+ * @return bool true if the message has a translation, false otherwise
74
+ */
75
+ public function defines($id, $domain = 'messages');
76
+
77
+ /**
78
+ * Gets a message translation.
79
+ *
80
+ * @param string $id The message id
81
+ * @param string $domain The domain name
82
+ *
83
+ * @return string The message translation
84
+ */
85
+ public function get($id, $domain = 'messages');
86
+
87
+ /**
88
+ * Sets translations for a given domain.
89
+ *
90
+ * @param array $messages An array of translations
91
+ * @param string $domain The domain name
92
+ */
93
+ public function replace($messages, $domain = 'messages');
94
+
95
+ /**
96
+ * Adds translations for a given domain.
97
+ *
98
+ * @param array $messages An array of translations
99
+ * @param string $domain The domain name
100
+ */
101
+ public function add($messages, $domain = 'messages');
102
+
103
+ /**
104
+ * Merges translations from the given Catalogue into the current one.
105
+ *
106
+ * The two catalogues must have the same locale.
107
+ */
108
+ public function addCatalogue(MessageCatalogueInterface $catalogue);
109
+
110
+ /**
111
+ * Merges translations from the given Catalogue into the current one
112
+ * only when the translation does not exist.
113
+ *
114
+ * This is used to provide default translations when they do not exist for the current locale.
115
+ */
116
+ public function addFallbackCatalogue(MessageCatalogueInterface $catalogue);
117
+
118
+ /**
119
+ * Gets the fallback catalogue.
120
+ *
121
+ * @return self|null A MessageCatalogueInterface instance or null when no fallback has been set
122
+ */
123
+ public function getFallbackCatalogue();
124
+
125
+ /**
126
+ * Returns an array of resources loaded to build this collection.
127
+ *
128
+ * @return ResourceInterface[] An array of resources
129
+ */
130
+ public function getResources();
131
+
132
+ /**
133
+ * Adds a resource for this collection.
134
+ */
135
+ public function addResource(ResourceInterface $resource);
136
+ }
vendor/symfony/translation/MessageSelector.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * MessageSelector.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ * @author Bernhard Schussek <bschussek@gmail.com>
19
+ */
20
+ class MessageSelector
21
+ {
22
+ /**
23
+ * Given a message with different plural translations separated by a
24
+ * pipe (|), this method returns the correct portion of the message based
25
+ * on the given number, locale and the pluralization rules in the message
26
+ * itself.
27
+ *
28
+ * The message supports two different types of pluralization rules:
29
+ *
30
+ * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples
31
+ * indexed: There is one apple|There are %count% apples
32
+ *
33
+ * The indexed solution can also contain labels (e.g. one: There is one apple).
34
+ * This is purely for making the translations more clear - it does not
35
+ * affect the functionality.
36
+ *
37
+ * The two methods can also be mixed:
38
+ * {0} There are no apples|one: There is one apple|more: There are %count% apples
39
+ *
40
+ * @param string $message The message being translated
41
+ * @param int $number The number of items represented for the message
42
+ * @param string $locale The locale to use for choosing
43
+ *
44
+ * @return string
45
+ *
46
+ * @throws \InvalidArgumentException
47
+ */
48
+ public function choose($message, $number, $locale)
49
+ {
50
+ $parts = explode('|', $message);
51
+ $explicitRules = array();
52
+ $standardRules = array();
53
+ foreach ($parts as $part) {
54
+ $part = trim($part);
55
+
56
+ if (preg_match('/^(?P<interval>'.Interval::getIntervalRegexp().')\s*(?P<message>.*?)$/xs', $part, $matches)) {
57
+ $explicitRules[$matches['interval']] = $matches['message'];
58
+ } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) {
59
+ $standardRules[] = $matches[1];
60
+ } else {
61
+ $standardRules[] = $part;
62
+ }
63
+ }
64
+
65
+ // try to match an explicit rule, then fallback to the standard ones
66
+ foreach ($explicitRules as $interval => $m) {
67
+ if (Interval::test($number, $interval)) {
68
+ return $m;
69
+ }
70
+ }
71
+
72
+ $position = PluralizationRules::get($number, $locale);
73
+
74
+ if (!isset($standardRules[$position])) {
75
+ // when there's exactly one rule given, and that rule is a standard
76
+ // rule, use this rule
77
+ if (1 === \count($parts) && isset($standardRules[0])) {
78
+ return $standardRules[0];
79
+ }
80
+
81
+ throw new \InvalidArgumentException(sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $message, $locale, $number));
82
+ }
83
+
84
+ return $standardRules[$position];
85
+ }
86
+ }
vendor/symfony/translation/MetadataAwareInterface.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * MetadataAwareInterface.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ interface MetadataAwareInterface
20
+ {
21
+ /**
22
+ * Gets metadata for the given domain and key.
23
+ *
24
+ * Passing an empty domain will return an array with all metadata indexed by
25
+ * domain and then by key. Passing an empty key will return an array with all
26
+ * metadata for the given domain.
27
+ *
28
+ * @param string $key The key
29
+ * @param string $domain The domain name
30
+ *
31
+ * @return mixed The value that was set or an array with the domains/keys or null
32
+ */
33
+ public function getMetadata($key = '', $domain = 'messages');
34
+
35
+ /**
36
+ * Adds metadata to a message domain.
37
+ *
38
+ * @param string $key The key
39
+ * @param mixed $value The value
40
+ * @param string $domain The domain name
41
+ */
42
+ public function setMetadata($key, $value, $domain = 'messages');
43
+
44
+ /**
45
+ * Deletes metadata for the given key and domain.
46
+ *
47
+ * Passing an empty domain will delete all metadata. Passing an empty key will
48
+ * delete all metadata for the given domain.
49
+ *
50
+ * @param string $key The key
51
+ * @param string $domain The domain name
52
+ */
53
+ public function deleteMetadata($key = '', $domain = 'messages');
54
+ }
vendor/symfony/translation/PluralizationRules.php ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * Returns the plural rules for a given locale.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ class PluralizationRules
20
+ {
21
+ private static $rules = array();
22
+
23
+ /**
24
+ * Returns the plural position to use for the given locale and number.
25
+ *
26
+ * @param int $number The number
27
+ * @param string $locale The locale
28
+ *
29
+ * @return int The plural position
30
+ */
31
+ public static function get($number, $locale)
32
+ {
33
+ if ('pt_BR' === $locale) {
34
+ // temporary set a locale for brazilian
35
+ $locale = 'xbr';
36
+ }
37
+
38
+ if (\strlen($locale) > 3) {
39
+ $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
40
+ }
41
+
42
+ if (isset(self::$rules[$locale])) {
43
+ $return = \call_user_func(self::$rules[$locale], $number);
44
+
45
+ if (!\is_int($return) || $return < 0) {
46
+ return 0;
47
+ }
48
+
49
+ return $return;
50
+ }
51
+
52
+ /*
53
+ * The plural rules are derived from code of the Zend Framework (2010-09-25),
54
+ * which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
55
+ * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
56
+ */
57
+ switch ($locale) {
58
+ case 'az':
59
+ case 'bo':
60
+ case 'dz':
61
+ case 'id':
62
+ case 'ja':
63
+ case 'jv':
64
+ case 'ka':
65
+ case 'km':
66
+ case 'kn':
67
+ case 'ko':
68
+ case 'ms':
69
+ case 'th':
70
+ case 'tr':
71
+ case 'vi':
72
+ case 'zh':
73
+ return 0;
74
+
75
+ case 'af':
76
+ case 'bn':
77
+ case 'bg':
78
+ case 'ca':
79
+ case 'da':
80
+ case 'de':
81
+ case 'el':
82
+ case 'en':
83
+ case 'eo':
84
+ case 'es':
85
+ case 'et':
86
+ case 'eu':
87
+ case 'fa':
88
+ case 'fi':
89
+ case 'fo':
90
+ case 'fur':
91
+ case 'fy':
92
+ case 'gl':
93
+ case 'gu':
94
+ case 'ha':
95
+ case 'he':
96
+ case 'hu':
97
+ case 'is':
98
+ case 'it':
99
+ case 'ku':
100
+ case 'lb':
101
+ case 'ml':
102
+ case 'mn':
103
+ case 'mr':
104
+ case 'nah':
105
+ case 'nb':
106
+ case 'ne':
107
+ case 'nl':
108
+ case 'nn':
109
+ case 'no':
110
+ case 'oc':
111
+ case 'om':
112
+ case 'or':
113
+ case 'pa':
114
+ case 'pap':
115
+ case 'ps':
116
+ case 'pt':
117
+ case 'so':
118
+ case 'sq':
119
+ case 'sv':
120
+ case 'sw':
121
+ case 'ta':
122
+ case 'te':
123
+ case 'tk':
124
+ case 'ur':
125
+ case 'zu':
126
+ return (1 == $number) ? 0 : 1;
127
+
128
+ case 'am':
129
+ case 'bh':
130
+ case 'fil':
131
+ case 'fr':
132
+ case 'gun':
133
+ case 'hi':
134
+ case 'hy':
135
+ case 'ln':
136
+ case 'mg':
137
+ case 'nso':
138
+ case 'xbr':
139
+ case 'ti':
140
+ case 'wa':
141
+ return ((0 == $number) || (1 == $number)) ? 0 : 1;
142
+
143
+ case 'be':
144
+ case 'bs':
145
+ case 'hr':
146
+ case 'ru':
147
+ case 'sh':
148
+ case 'sr':
149
+ case 'uk':
150
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
151
+
152
+ case 'cs':
153
+ case 'sk':
154
+ return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
155
+
156
+ case 'ga':
157
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2);
158
+
159
+ case 'lt':
160
+ return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
161
+
162
+ case 'sl':
163
+ return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3));
164
+
165
+ case 'mk':
166
+ return (1 == $number % 10) ? 0 : 1;
167
+
168
+ case 'mt':
169
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
170
+
171
+ case 'lv':
172
+ return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2);
173
+
174
+ case 'pl':
175
+ return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
176
+
177
+ case 'cy':
178
+ return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3));
179
+
180
+ case 'ro':
181
+ return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
182
+
183
+ case 'ar':
184
+ return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))));
185
+
186
+ default:
187
+ return 0;
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Overrides the default plural rule for a given locale.
193
+ *
194
+ * @param callable $rule A PHP callable
195
+ * @param string $locale The locale
196
+ *
197
+ * @throws \LogicException
198
+ */
199
+ public static function set($rule, $locale)
200
+ {
201
+ if ('pt_BR' === $locale) {
202
+ // temporary set a locale for brazilian
203
+ $locale = 'xbr';
204
+ }
205
+
206
+ if (\strlen($locale) > 3) {
207
+ $locale = substr($locale, 0, -\strlen(strrchr($locale, '_')));
208
+ }
209
+
210
+ if (!\is_callable($rule)) {
211
+ throw new \LogicException('The given rule can not be called');
212
+ }
213
+
214
+ self::$rules[$locale] = $rule;
215
+ }
216
+ }
vendor/symfony/translation/Translator.php ADDED
@@ -0,0 +1,476 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ use Symfony\Component\Config\ConfigCacheFactory;
15
+ use Symfony\Component\Config\ConfigCacheFactoryInterface;
16
+ use Symfony\Component\Config\ConfigCacheInterface;
17
+ use Symfony\Component\Translation\Exception\NotFoundResourceException;
18
+ use Symfony\Component\Translation\Loader\LoaderInterface;
19
+
20
+ /**
21
+ * @author Fabien Potencier <fabien@symfony.com>
22
+ */
23
+ class Translator implements TranslatorInterface, TranslatorBagInterface
24
+ {
25
+ /**
26
+ * @var MessageCatalogueInterface[]
27
+ */
28
+ protected $catalogues = array();
29
+
30
+ /**
31
+ * @var string
32
+ */
33
+ protected $locale;
34
+
35
+ /**
36
+ * @var array
37
+ */
38
+ private $fallbackLocales = array();
39
+
40
+ /**
41
+ * @var LoaderInterface[]
42
+ */
43
+ private $loaders = array();
44
+
45
+ /**
46
+ * @var array
47
+ */
48
+ private $resources = array();
49
+
50
+ /**
51
+ * @var MessageSelector
52
+ */
53
+ private $selector;
54
+
55
+ /**
56
+ * @var string
57
+ */
58
+ private $cacheDir;
59
+
60
+ /**
61
+ * @var bool
62
+ */
63
+ private $debug;
64
+
65
+ /**
66
+ * @var ConfigCacheFactoryInterface|null
67
+ */
68
+ private $configCacheFactory;
69
+
70
+ /**
71
+ * @param string $locale The locale
72
+ * @param MessageSelector|null $selector The message selector for pluralization
73
+ * @param string|null $cacheDir The directory to use for the cache
74
+ * @param bool $debug Use cache in debug mode ?
75
+ *
76
+ * @throws \InvalidArgumentException If a locale contains invalid characters
77
+ */
78
+ public function __construct($locale, MessageSelector $selector = null, $cacheDir = null, $debug = false)
79
+ {
80
+ $this->setLocale($locale);
81
+ $this->selector = $selector ?: new MessageSelector();
82
+ $this->cacheDir = $cacheDir;
83
+ $this->debug = $debug;
84
+ }
85
+
86
+ public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
87
+ {
88
+ $this->configCacheFactory = $configCacheFactory;
89
+ }
90
+
91
+ /**
92
+ * Adds a Loader.
93
+ *
94
+ * @param string $format The name of the loader (@see addResource())
95
+ * @param LoaderInterface $loader A LoaderInterface instance
96
+ */
97
+ public function addLoader($format, LoaderInterface $loader)
98
+ {
99
+ $this->loaders[$format] = $loader;
100
+ }
101
+
102
+ /**
103
+ * Adds a Resource.
104
+ *
105
+ * @param string $format The name of the loader (@see addLoader())
106
+ * @param mixed $resource The resource name
107
+ * @param string $locale The locale
108
+ * @param string $domain The domain
109
+ *
110
+ * @throws \InvalidArgumentException If the locale contains invalid characters
111
+ */
112
+ public function addResource($format, $resource, $locale, $domain = null)
113
+ {
114
+ if (null === $domain) {
115
+ $domain = 'messages';
116
+ }
117
+
118
+ $this->assertValidLocale($locale);
119
+
120
+ $this->resources[$locale][] = array($format, $resource, $domain);
121
+
122
+ if (\in_array($locale, $this->fallbackLocales)) {
123
+ $this->catalogues = array();
124
+ } else {
125
+ unset($this->catalogues[$locale]);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * {@inheritdoc}
131
+ */
132
+ public function setLocale($locale)
133
+ {
134
+ $this->assertValidLocale($locale);
135
+ $this->locale = $locale;
136
+ }
137
+
138
+ /**
139
+ * {@inheritdoc}
140
+ */
141
+ public function getLocale()
142
+ {
143
+ return $this->locale;
144
+ }
145
+
146
+ /**
147
+ * Sets the fallback locale(s).
148
+ *
149
+ * @param string|array $locales The fallback locale(s)
150
+ *
151
+ * @throws \InvalidArgumentException If a locale contains invalid characters
152
+ *
153
+ * @deprecated since version 2.3, to be removed in 3.0. Use setFallbackLocales() instead
154
+ */
155
+ public function setFallbackLocale($locales)
156
+ {
157
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.3 and will be removed in 3.0. Use the setFallbackLocales() method instead.', E_USER_DEPRECATED);
158
+
159
+ $this->setFallbackLocales(\is_array($locales) ? $locales : array($locales));
160
+ }
161
+
162
+ /**
163
+ * Sets the fallback locales.
164
+ *
165
+ * @param array $locales The fallback locales
166
+ *
167
+ * @throws \InvalidArgumentException If a locale contains invalid characters
168
+ */
169
+ public function setFallbackLocales(array $locales)
170
+ {
171
+ // needed as the fallback locales are linked to the already loaded catalogues
172
+ $this->catalogues = array();
173
+
174
+ foreach ($locales as $locale) {
175
+ $this->assertValidLocale($locale);
176
+ }
177
+
178
+ $this->fallbackLocales = $locales;
179
+ }
180
+
181
+ /**
182
+ * Gets the fallback locales.
183
+ *
184
+ * @return array The fallback locales
185
+ */
186
+ public function getFallbackLocales()
187
+ {
188
+ return $this->fallbackLocales;
189
+ }
190
+
191
+ /**
192
+ * {@inheritdoc}
193
+ */
194
+ public function trans($id, array $parameters = array(), $domain = null, $locale = null)
195
+ {
196
+ if (null === $domain) {
197
+ $domain = 'messages';
198
+ }
199
+
200
+ return strtr($this->getCatalogue($locale)->get((string) $id, $domain), $parameters);
201
+ }
202
+
203
+ /**
204
+ * {@inheritdoc}
205
+ */
206
+ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
207
+ {
208
+ if (null === $domain) {
209
+ $domain = 'messages';
210
+ }
211
+
212
+ $id = (string) $id;
213
+ $catalogue = $this->getCatalogue($locale);
214
+ $locale = $catalogue->getLocale();
215
+ while (!$catalogue->defines($id, $domain)) {
216
+ if ($cat = $catalogue->getFallbackCatalogue()) {
217
+ $catalogue = $cat;
218
+ $locale = $catalogue->getLocale();
219
+ } else {
220
+ break;
221
+ }
222
+ }
223
+
224
+ return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
225
+ }
226
+
227
+ /**
228
+ * {@inheritdoc}
229
+ */
230
+ public function getCatalogue($locale = null)
231
+ {
232
+ if (null === $locale) {
233
+ $locale = $this->getLocale();
234
+ } else {
235
+ $this->assertValidLocale($locale);
236
+ }
237
+
238
+ if (!isset($this->catalogues[$locale])) {
239
+ $this->loadCatalogue($locale);
240
+ }
241
+
242
+ return $this->catalogues[$locale];
243
+ }
244
+
245
+ /**
246
+ * Gets the loaders.
247
+ *
248
+ * @return array LoaderInterface[]
249
+ */
250
+ protected function getLoaders()
251
+ {
252
+ return $this->loaders;
253
+ }
254
+
255
+ /**
256
+ * Collects all messages for the given locale.
257
+ *
258
+ * @param string|null $locale Locale of translations, by default is current locale
259
+ *
260
+ * @return array[array] indexed by catalog
261
+ *
262
+ * @deprecated since version 2.8, to be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.
263
+ */
264
+ public function getMessages($locale = null)
265
+ {
266
+ @trigger_error('The '.__METHOD__.' method is deprecated since Symfony 2.8 and will be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.', E_USER_DEPRECATED);
267
+
268
+ $catalogue = $this->getCatalogue($locale);
269
+ $messages = $catalogue->all();
270
+ while ($catalogue = $catalogue->getFallbackCatalogue()) {
271
+ $messages = array_replace_recursive($catalogue->all(), $messages);
272
+ }
273
+
274
+ return $messages;
275
+ }
276
+
277
+ /**
278
+ * @param string $locale
279
+ */
280
+ protected function loadCatalogue($locale)
281
+ {
282
+ if (null === $this->cacheDir) {
283
+ $this->initializeCatalogue($locale);
284
+ } else {
285
+ $this->initializeCacheCatalogue($locale);
286
+ }
287
+ }
288
+
289
+ /**
290
+ * @param string $locale
291
+ */
292
+ protected function initializeCatalogue($locale)
293
+ {
294
+ $this->assertValidLocale($locale);
295
+
296
+ try {
297
+ $this->doLoadCatalogue($locale);
298
+ } catch (NotFoundResourceException $e) {
299
+ if (!$this->computeFallbackLocales($locale)) {
300
+ throw $e;
301
+ }
302
+ }
303
+ $this->loadFallbackCatalogues($locale);
304
+ }
305
+
306
+ /**
307
+ * @param string $locale
308
+ */
309
+ private function initializeCacheCatalogue($locale)
310
+ {
311
+ if (isset($this->catalogues[$locale])) {
312
+ /* Catalogue already initialized. */
313
+ return;
314
+ }
315
+
316
+ $this->assertValidLocale($locale);
317
+ $self = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
318
+ $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale),
319
+ function (ConfigCacheInterface $cache) use ($self, $locale) {
320
+ $self->dumpCatalogue($locale, $cache);
321
+ }
322
+ );
323
+
324
+ if (isset($this->catalogues[$locale])) {
325
+ /* Catalogue has been initialized as it was written out to cache. */
326
+ return;
327
+ }
328
+
329
+ /* Read catalogue from cache. */
330
+ $this->catalogues[$locale] = include $cache->getPath();
331
+ }
332
+
333
+ /**
334
+ * 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.
335
+ *
336
+ * @internal
337
+ */
338
+ public function dumpCatalogue($locale, ConfigCacheInterface $cache)
339
+ {
340
+ $this->initializeCatalogue($locale);
341
+ $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
342
+
343
+ $content = sprintf(<<<EOF
344
+ <?php
345
+
346
+ use Symfony\Component\Translation\MessageCatalogue;
347
+
348
+ \$catalogue = new MessageCatalogue('%s', %s);
349
+
350
+ %s
351
+ return \$catalogue;
352
+
353
+ EOF
354
+ ,
355
+ $locale,
356
+ var_export($this->catalogues[$locale]->all(), true),
357
+ $fallbackContent
358
+ );
359
+
360
+ $cache->write($content, $this->catalogues[$locale]->getResources());
361
+ }
362
+
363
+ private function getFallbackContent(MessageCatalogue $catalogue)
364
+ {
365
+ $fallbackContent = '';
366
+ $current = '';
367
+ $replacementPattern = '/[^a-z0-9_]/i';
368
+ $fallbackCatalogue = $catalogue->getFallbackCatalogue();
369
+ while ($fallbackCatalogue) {
370
+ $fallback = $fallbackCatalogue->getLocale();
371
+ $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback));
372
+ $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current));
373
+
374
+ $fallbackContent .= sprintf(<<<'EOF'
375
+ $catalogue%s = new MessageCatalogue('%s', %s);
376
+ $catalogue%s->addFallbackCatalogue($catalogue%s);
377
+
378
+ EOF
379
+ ,
380
+ $fallbackSuffix,
381
+ $fallback,
382
+ var_export($fallbackCatalogue->all(), true),
383
+ $currentSuffix,
384
+ $fallbackSuffix
385
+ );
386
+ $current = $fallbackCatalogue->getLocale();
387
+ $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
388
+ }
389
+
390
+ return $fallbackContent;
391
+ }
392
+
393
+ private function getCatalogueCachePath($locale)
394
+ {
395
+ return $this->cacheDir.'/catalogue.'.$locale.'.'.sha1(serialize($this->fallbackLocales)).'.php';
396
+ }
397
+
398
+ private function doLoadCatalogue($locale)
399
+ {
400
+ $this->catalogues[$locale] = new MessageCatalogue($locale);
401
+
402
+ if (isset($this->resources[$locale])) {
403
+ foreach ($this->resources[$locale] as $resource) {
404
+ if (!isset($this->loaders[$resource[0]])) {
405
+ throw new \RuntimeException(sprintf('The "%s" translation loader is not registered.', $resource[0]));
406
+ }
407
+ $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
408
+ }
409
+ }
410
+ }
411
+
412
+ private function loadFallbackCatalogues($locale)
413
+ {
414
+ $current = $this->catalogues[$locale];
415
+
416
+ foreach ($this->computeFallbackLocales($locale) as $fallback) {
417
+ if (!isset($this->catalogues[$fallback])) {
418
+ $this->initializeCatalogue($fallback);
419
+ }
420
+
421
+ $fallbackCatalogue = new MessageCatalogue($fallback, $this->catalogues[$fallback]->all());
422
+ foreach ($this->catalogues[$fallback]->getResources() as $resource) {
423
+ $fallbackCatalogue->addResource($resource);
424
+ }
425
+ $current->addFallbackCatalogue($fallbackCatalogue);
426
+ $current = $fallbackCatalogue;
427
+ }
428
+ }
429
+
430
+ protected function computeFallbackLocales($locale)
431
+ {
432
+ $locales = array();
433
+ foreach ($this->fallbackLocales as $fallback) {
434
+ if ($fallback === $locale) {
435
+ continue;
436
+ }
437
+
438
+ $locales[] = $fallback;
439
+ }
440
+
441
+ if (false !== strrchr($locale, '_')) {
442
+ array_unshift($locales, substr($locale, 0, -\strlen(strrchr($locale, '_'))));
443
+ }
444
+
445
+ return array_unique($locales);
446
+ }
447
+
448
+ /**
449
+ * Asserts that the locale is valid, throws an Exception if not.
450
+ *
451
+ * @param string $locale Locale to tests
452
+ *
453
+ * @throws \InvalidArgumentException If the locale contains invalid characters
454
+ */
455
+ protected function assertValidLocale($locale)
456
+ {
457
+ if (1 !== preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
458
+ throw new \InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale));
459
+ }
460
+ }
461
+
462
+ /**
463
+ * Provides the ConfigCache factory implementation, falling back to a
464
+ * default implementation if necessary.
465
+ *
466
+ * @return ConfigCacheFactoryInterface $configCacheFactory
467
+ */
468
+ private function getConfigCacheFactory()
469
+ {
470
+ if (!$this->configCacheFactory) {
471
+ $this->configCacheFactory = new ConfigCacheFactory($this->debug);
472
+ }
473
+
474
+ return $this->configCacheFactory;
475
+ }
476
+ }
vendor/symfony/translation/TranslatorBagInterface.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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;
13
+
14
+ /**
15
+ * TranslatorBagInterface.
16
+ *
17
+ * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
18
+ */
19
+ interface TranslatorBagInterface
20
+ {
21
+ /**
22
+ * Gets the catalogue by locale.
23
+ *
24
+ * @param string|null $locale The locale or null to use the default
25
+ *
26
+ * @return MessageCatalogueInterface
27
+ *
28
+ * @throws \InvalidArgumentException If the locale contains invalid characters
29
+ */
30
+ public function getCatalogue($locale = null);
31
+ }
vendor/symfony/translation/TranslatorInterface.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;
13
+
14
+ /**
15
+ * TranslatorInterface.
16
+ *
17
+ * @author Fabien Potencier <fabien@symfony.com>
18
+ */
19
+ interface TranslatorInterface
20
+ {
21
+ /**
22
+ * Translates the given message.
23
+ *
24
+ * @param string $id The message id (may also be an object that can be cast to string)
25
+ * @param array $parameters An array of parameters for the message
26
+ * @param string|null $domain The domain for the message or null to use the default
27
+ * @param string|null $locale The locale or null to use the default
28
+ *
29
+ * @return string The translated string
30
+ *
31
+ * @throws \InvalidArgumentException If the locale contains invalid characters
32
+ */
33
+ public function trans($id, array $parameters = array(), $domain = null, $locale = null);
34
+
35
+ /**
36
+ * Translates the given choice message by choosing a translation according to a number.
37
+ *
38
+ * @param string $id The message id (may also be an object that can be cast to string)
39
+ * @param int $number The number to use to find the indice of the message
40
+ * @param array $parameters An array of parameters for the message
41
+ * @param string|null $domain The domain for the message or null to use the default
42
+ * @param string|null $locale The locale or null to use the default
43
+ *
44
+ * @return string The translated string
45
+ *
46
+ * @throws \InvalidArgumentException If the locale contains invalid characters
47
+ */
48
+ public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null);
49
+
50
+ /**
51
+ * Sets the current locale.
52
+ *
53
+ * @param string $locale The locale
54
+ *
55
+ * @throws \InvalidArgumentException If the locale contains invalid characters
56
+ */
57
+ public function setLocale($locale);
58
+
59
+ /**
60
+ * Returns the current locale.
61
+ *
62
+ * @return string The locale
63
+ */
64
+ public function getLocale();
65
+ }
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/Writer/TranslationWriter.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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\Writer;
13
+
14
+ use Symfony\Component\Translation\Dumper\DumperInterface;
15
+ use Symfony\Component\Translation\MessageCatalogue;
16
+
17
+ /**
18
+ * TranslationWriter writes translation messages.
19
+ *
20
+ * @author Michel Salib <michelsalib@hotmail.com>
21
+ */
22
+ class TranslationWriter
23
+ {
24
+ private $dumpers = array();
25
+
26
+ /**
27
+ * Adds a dumper to the writer.
28
+ *
29
+ * @param string $format The format of the dumper
30
+ * @param DumperInterface $dumper The dumper
31
+ */
32
+ public function addDumper($format, DumperInterface $dumper)
33
+ {
34
+ $this->dumpers[$format] = $dumper;
35
+ }
36
+
37
+ /**
38
+ * Disables dumper backup.
39
+ */
40
+ public function disableBackup()
41
+ {
42
+ foreach ($this->dumpers as $dumper) {
43
+ if (method_exists($dumper, 'setBackup')) {
44
+ $dumper->setBackup(false);
45
+ }
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Obtains the list of supported formats.
51
+ *
52
+ * @return array
53
+ */
54
+ public function getFormats()
55
+ {
56
+ return array_keys($this->dumpers);
57
+ }
58
+
59
+ /**
60
+ * Writes translation from the catalogue according to the selected format.
61
+ *
62
+ * @param MessageCatalogue $catalogue The message catalogue to dump
63
+ * @param string $format The format to use to dump the messages
64
+ * @param array $options Options that are passed to the dumper
65
+ *
66
+ * @throws \InvalidArgumentException
67
+ */
68
+ public function writeTranslations(MessageCatalogue $catalogue, $format, $options = array())
69
+ {
70
+ if (!isset($this->dumpers[$format])) {
71
+ throw new \InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format));
72
+ }
73
+
74
+ // get the right dumper
75
+ $dumper = $this->dumpers[$format];
76
+
77
+ if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) {
78
+ throw new \RuntimeException(sprintf('Translation Writer was not able to create directory "%s"', $options['path']));
79
+ }
80
+
81
+ // save
82
+ $dumper->dump($catalogue, $options);
83
+ }
84
+ }
vendor/symfony/translation/composer.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "symfony/translation",
3
+ "type": "library",
4
+ "description": "Symfony Translation Component",
5
+ "keywords": [],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Fabien Potencier",
11
+ "email": "fabien@symfony.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=5.3.9",
20
+ "symfony/polyfill-mbstring": "~1.0"
21
+ },
22
+ "require-dev": {
23
+ "symfony/config": "~2.8",
24
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
25
+ "symfony/yaml": "~2.2|~3.0.0",
26
+ "psr/log": "~1.0"
27
+ },
28
+ "conflict": {
29
+ "symfony/config": "<2.7"
30
+ },
31
+ "suggest": {
32
+ "symfony/config": "",
33
+ "symfony/yaml": "",
34
+ "psr/log-implementation": "To use logging capability in translator"
35
+ },
36
+ "autoload": {
37
+ "psr-4": { "Symfony\\Component\\Translation\\": "" },
38
+ "exclude-from-classmap": [
39
+ "/Tests/"
40
+ ]
41
+ },
42
+ "minimum-stability": "dev",
43
+ "extra": {
44
+ "branch-alias": {
45
+ "dev-master": "2.8-dev"
46
+ }
47
+ }
48
+ }
wp-rss-aggregator.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: WP RSS Aggregator
5
  * Plugin URI: https://www.wprssaggregator.com/#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wpraplugin
6
  * Description: Imports and aggregates multiple RSS Feeds.
7
- * Version: 4.17.5
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
@@ -76,7 +76,7 @@ use RebelCode\Wpra\Core\Plugin;
76
 
77
  // Set the version number of the plugin.
78
  if( !defined( 'WPRSS_VERSION' ) )
79
- define( 'WPRSS_VERSION', '4.17.5' );
80
 
81
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
82
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );
4
  * Plugin Name: WP RSS Aggregator
5
  * Plugin URI: https://www.wprssaggregator.com/#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wpraplugin
6
  * Description: Imports and aggregates multiple RSS Feeds.
7
+ * Version: 4.17.6
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
76
 
77
  // Set the version number of the plugin.
78
  if( !defined( 'WPRSS_VERSION' ) )
79
+ define( 'WPRSS_VERSION', '4.17.6' );
80
 
81
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
82
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );