8000 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 90e51d60536d6..d4dafb2aa0029 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@ | Q | A | ------------- | --- -| Branch? | 7.3 for features / 5.4, 6.4, 7.1, and 7.2 for bug fixes +| Branch? | 7.4 for features / 6.4, 7.2, or 7.3 for bug fixes | Bug fix? | yes/no | New feature? | yes/no | Deprecations? | yes/no diff --git a/.github/build-packages.php b/.github/build-packages.php index d69a3c8198ec0..4793b8483d7ed 100644 --- a/.github/build-packages.php +++ b/.github/build-packages.php @@ -1,5 +1,15 @@ '__unset' !== $v); + }, []); + + return $expandedVersions ?? []; +} + if (3 > $_SERVER['argc']) { echo "Usage: branch version dir1 dir2 ... dirN\n"; exit(1); @@ -52,11 +62,13 @@ $packages[$package->name][$package->version] = $package; - $versions = @file_get_contents('https://repo.packagist.org/p/'.$package->name.'.json') ?: sprintf('{"packages":{"%s":{"%s":%s}}}', $package->name, $package->version, file_get_contents($dir.'/composer.json')); - $versions = json_decode($versions)->packages->{$package->name}; + foreach (['.json', '~dev.json'] as $ext) { + $versions = @file_get_contents('https://repo.packagist.org/p2/'.$package->name.$ext) ?: '[]'; + $versions = json_decode($versions, true)['packages'][$package->name] ?? []; - foreach ($versions as $v => $package) { - $packages[$package->name] += [$v => $package]; + foreach (expandComposerMetadata($versions) as $p) { + $packages[$package->name] += [$p['version'] => $p]; + } } } diff --git a/.github/expected-missing-return-types.diff b/.github/expected-missing-return-types.diff index 30ac60ab98ad7..d838ce9f7c759 100644 --- a/.github/expected-missing-return-types.diff +++ b/.github/expected-missing-return-types.diff @@ -177,6 +177,23 @@ diff --git a/src/Symfony/Component/DependencyInjection/Extension/PrependExtensio - public function prepend(ContainerBuilder $container); + public function prepend(ContainerBuilder $container): void; } +diff --git a/src/Symfony/Component/Emoji/EmojiTransliterator.php b/src/Symfony/Component/Emoji/EmojiTransliterator.php +--- a/src/Symfony/Component/Emoji/EmojiTransliterator.php ++++ b/src/Symfony/Component/Emoji/EmojiTransliterator.php +@@ -88,5 +88,5 @@ final class EmojiTransliterator extends \Transliterator + */ + #[\ReturnTypeWillChange] +- public function getErrorCode(): int|false ++ public function getErrorCode(): int + { + return isset($this->transliterator) ? $this->transliterator->getErrorCode() : 0; +@@ -97,5 +97,5 @@ final class EmojiTransliterator extends \Transliterator + */ + #[\ReturnTypeWillChange] +- public function getErrorMessage(): string|false ++ public function getErrorMessage(): string + { + return isset($this->transliterator) ? $this->transliterator->getErrorMessage() : ''; diff --git a/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php b/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php --- a/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php +++ b/src/Symfony/Component/EventDispatcher/EventSubscriberInterface.php diff --git a/.github/get-modified-packages.php b/.github/get-modified-packages.php index 11478cbe935c0..24de414fdd266 100644 --- a/.github/get-modified-packages.php +++ b/.github/get-modified-packages.php @@ -22,7 +22,7 @@ function getPackageType(string $packageDir): string return match (true) { str_contains($packageDir, 'Symfony/Bridge/') => 'bridge', str_contains($packageDir, 'Symfony/Bundle/') => 'bundle', - preg_match('@Symfony/Component/[^/]+/Bridge/@', $packageDir) => 'component_bridge', + 1 === preg_match('@Symfony/Component/[^/]+/Bridge/@', $packageDir) => 'component_bridge', str_contains($packageDir, 'Symfony/Component/') => 'component', str_contains($packageDir, 'Symfony/Contracts/') => 'contract', str_ends_with($packageDir, 'Symfony/Contracts') => 'contracts', diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 0265b619c8be6..a2a3f8853882a 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -19,7 +19,7 @@ jobs: tests: name: Integration - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: matrix: @@ -81,6 +81,26 @@ jobs: REDIS_MASTER_HOST: redis REDIS_MASTER_SET: redis_sentinel REDIS_SENTINEL_QUORUM: 1 + redis-primary: + image: bitnami/redis:latest + ports: + - 16381:6379 + env: + ALLOW_EMPTY_PASSWORD: "yes" + REDIS_REPLICATION_MODE: "master" + options: >- + --name=redis-primary + redis-replica: + image: bitnami/redis:latest + ports: + - 16382:6379 + env: + ALLOW_EMPTY_PASSWORD: "yes" + REDIS_REPLICATION_MODE: "slave" + REDIS_MASTER_HOST: redis-primary + REDIS_MASTER_PORT_NUMBER: "6379" + options: >- + --name=redis-replica memcached: image: memcached:1.6.5 ports: @@ -152,7 +172,7 @@ jobs: run: | echo "::group::apt-get update" sudo wget -O - https://packages.couchbase.com/clients/c/repos/deb/couchbase.key | sudo apt-key add - - echo "deb https://packages.couchbase.com/clients/c/repos/deb/ubuntu2004 focal focal/main" | sudo tee /etc/apt/sources.list.d/couchbase.list + echo "deb https://packages.couchbase.com/clients/c/repos/deb/ubuntu2404 noble noble/main" | sudo tee /etc/apt/sources.list.d/couchbase.list sudo apt-get update echo "::endgroup::" @@ -239,6 +259,7 @@ jobs: REDIS_CLUSTER_HOSTS: 'localhost:7000 localhost:7001 localhost:7002 localhost:7003 localhost:7004 localhost:7005' REDIS_SENTINEL_HOSTS: 'unreachable-host:26379 localhost:26379 localhost:26379' REDIS_SENTINEL_SERVICE: redis_sentinel + REDIS_REPLICATION_HOSTS: 'localhost:16382 localhost:16381' MESSENGER_REDIS_DSN: redis://127.0.0.1:7006/messages MESSENGER_AMQP_DSN: amqp://localhost/%2f/messages MESSENGER_SQS_DSN: "sqs://localhost:4566/messages?sslmode=disable&poll_timeout=0.01" diff --git a/.github/workflows/intl-data-tests.yml b/.github/workflows/intl-data-tests.yml index a02bd73ac5b8f..193b3dd1df14d 100644 --- a/.github/workflows/intl-data-tests.yml +++ b/.github/workflows/intl-data-tests.yml @@ -36,7 +36,7 @@ permissions: jobs: tests: name: Intl/Emoji data - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout diff --git a/.github/workflows/package-tests.yml b/.github/workflows/package-tests.yml index bc6f8eec683c7..55d1c82e3661a 100644 --- a/.github/workflows/package-tests.yml +++ b/.github/workflows/package-tests.yml @@ -11,7 +11,7 @@ permissions: jobs: verify: name: Verify Packages - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/phpunit-bridge.yml b/.github/workflows/phpunit-bridge.yml index fd169dfae782d..669fad2a3447f 100644 --- a/.github/workflows/phpunit-bridge.yml +++ b/.github/workflows/phpunit-bridge.yml @@ -22,7 +22,7 @@ permissions: jobs: lint: name: Lint PhpUnitBridge - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml index a165d0c7dc126..33a5f58b44c6a 100644 --- a/.github/workflows/psalm.yml +++ b/.github/workflows/psalm.yml @@ -17,7 +17,7 @@ permissions: jobs: psalm: name: Psalm - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 env: php-version: '8.2' diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index c2929a461dfef..677e6e6a30d91 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -6,7 +6,7 @@ on: schedule: - cron: '34 4 * * 6' push: - branches: [ "7.3" ] + branches: [ "7.4" ] # Declare default permissions as read only. permissions: read-all @@ -14,7 +14,7 @@ permissions: read-all jobs: analysis: name: Scorecards analysis - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: # Needed to upload the results to code-scanning dashboard. security-events: write diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 0e8c7cc123143..b6ec737456821 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -33,10 +33,11 @@ jobs: mode: low-deps - php: '8.3' - php: '8.4' + - php: '8.5' #mode: experimental fail-fast: false - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout @@ -91,7 +92,7 @@ jobs: # Create local composer packages for each patched components and reference them in composer.json files when cross-testing components if [[ ! "${{ matrix.mode }}" = *-deps ]]; then - php .github/build-packages.php HEAD^ $SYMFONY_VERSION src/Symfony/Bridge/PhpUnit + php .github/build-packages.php HEAD^ $SYMFONY_VERSION src/Symfony/Bridge/PhpUnit else echo SYMFONY_DEPRECATIONS_HELPER=weak >> $GITHUB_ENV cp composer.json composer.json.orig diff --git a/CHANGELOG-7.1.md b/CHANGELOG-7.1.md index 747dcf2c9962c..f46dc88b01503 100644 --- a/CHANGELOG-7.1.md +++ b/CHANGELOG-7.1.md @@ -7,6 +7,62 @@ in 7.1 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v7.1.0...v7.1.1 +* 7.1.10 (2024-12-31) + + * bug #59304 [PropertyInfo] Remove ``@internal`` from `PropertyReadInfo` and `PropertyWriteInfo` (Dario Guarracino) + * bug #59228 [HttpFoundation] Avoid mime type guess with temp files in `BinaryFileResponse` (alexandre-daubois) + * bug #59318 [Finder] Fix using `==` as default operator in `DateComparator` (MatTheCat) + * bug #59321 [HtmlSanitizer] reject URLs containing whitespaces (xabbuh) + * bug #59250 [HttpClient] Fix a typo in NoPrivateNetworkHttpClient (Jontsa) + * bug #59103 [Messenger] ensure exception on rollback does not hide previous exception (nikophil) + * bug #59226 [FrameworkBundle] require the writer to implement getFormats() in the translation:extract (xabbuh) + * bug #59213 [FrameworkBundle] don't require fake notifier transports to be installed as non-dev dependencies (xabbuh) + * bug #59066 Fix resolve enum in string type resolver (DavidBadura) + * bug #59156 [PropertyInfo] Fix interface handling in PhpStanTypeHelper (mtarld) + * bug #59160 [BeanstalkMessenger] Round delay to an integer to avoid deprecation warning (plantas) + * bug #59012 [PropertyInfo] Fix interface handling in `PhpStanTypeHelper` (janedbal) + * bug #59134 [HttpKernel] Denormalize request data using the csv format when using "#[MapQueryString]" or "#[MapRequestPayload]" (except for content data) (ovidiuenache) + * bug #59140 [WebProfilerBundle] fix: white-space in highlighted code (chr-hertel) + * bug #59124 [FrameworkBundle] fix: notifier push channel bus abstract arg (raphael-geffroy) + * bug #59069 [Console] Fix division by 0 error (Rindula) + * bug #59070 [PropertyInfo] evaluate access flags for properties with asymmetric visibility (xabbuh) + * bug #59062 [HttpClient] Always set CURLOPT_CUSTOMREQUEST to the correct HTTP method in CurlHttpClient (KurtThiemann) + * bug #59023 [HttpClient] Fix streaming and redirecting with NoPrivateNetworkHttpClient (nicolas-grekas) + +* 7.1.9 (2024-11-27) + + * bug #59013 [HttpClient] Fix checking for private IPs before connecting (nicolas-grekas) + * bug #58562 [HttpClient] Close gracefull when the server closes the connection abruptly (discordier) + * bug #59007 [Dotenv] read runtime config from composer.json in debug dotenv command (xabbuh) + * bug #58963 [PropertyInfo] Fix write visibility for Asymmetric Visibility and Virtual Properties (xabbuh, pan93412) + * bug #58983 [Translation] [Bridge][Lokalise] Fix empty keys array in PUT, DELETE requests causing Lokalise API error (DominicLuidold) + * bug #58956 [DoctrineBridge] Fix `Connection::createSchemaManager()` for Doctrine DBAL v2 (neodevcode) + * bug #58959 [PropertyInfo] consider write property visibility to decide whether a property is writable (xabbuh) + * bug #58964 [TwigBridge] do not add child nodes to EmptyNode instances (xabbuh) + * bug #58952 [Cache] silence warnings issued by Redis Sentinel on connection issues (xabbuh) + * bug #58859 [AssetMapper] ignore missing directory in `isVendor()` (alexislefebvre) + * bug #58917 [OptionsResolver] Allow Union/Intersection Types in Resolved Closures (zanbaldwin) + * bug #58822 [DependencyInjection] Fix checking for interfaces in ContainerBuilder::getReflectionClass() (donquixote) + * bug #58865 Dynamically fix compatibility with doctrine/data-fixtures v2 (greg0ire) + * bug #58921 [HttpKernel] Ensure `HttpCache::getTraceKey()` does not throw exception (lyrixx) + * bug #58908 [DoctrineBridge] don't call `EntityManager::initializeObject()` with scalar values (xabbuh) + * bug #58938 [Cache] make RelayProxyTrait compatible with relay extension 0.9.0 (xabbuh) + * bug #58924 [HttpClient] Fix empty hosts in option "resolve" (nicolas-grekas) + * bug #58915 [HttpClient] Fix option "resolve" with IPv6 addresses (nicolas-grekas) + * bug #58919 [WebProfilerBundle] Twig deprecations (mazodude) + * bug #58914 [HttpClient] Fix option "bindto" with IPv6 addresses (nicolas-grekas) + * bug #58870 [Serializer][Validator] prevent failures around not existing TypeInfo classes (xabbuh) + * bug #58872 [PropertyInfo][Serializer][Validator] TypeInfo 7.2 compatibility (mtarld) + * bug #58875 [HttpClient] Removed body size limit (Carl Julian Sauter) + * bug #58866 [Validator] fix compatibility with PHP < 8.2.4 (xabbuh) + * bug #58862 [Notifier] Fix GoIpTransport (nicolas-grekas) + * bug #58860 [HttpClient] Fix catching some invalid Location headers (nicolas-grekas) + * bug #58836 Work around `parse_url()` bug (bis) (nicolas-grekas) + * bug #58818 [Messenger] silence PHP warnings issued by `Redis::connect()` (xabbuh) + * bug #58828 [PhpUnitBridge] fix dumping tests to skip with data providers (xabbuh) + * bug #58842 [Routing] Fix: lost priority when defining hosts in configuration (BeBlood) + * bug #58850 [HttpClient] fix PHP 7.2 compatibility (xabbuh) + * 7.1.8 (2024-11-13) * security #cve-2024-50342 [HttpClient] Resolve hostnames in NoPrivateNetworkHttpClient (nicolas-grekas) diff --git a/CHANGELOG-7.2.md b/CHANGELOG-7.2.md index b4cfcd1b36e09..d6d188669de42 100644 --- a/CHANGELOG-7.2.md +++ b/CHANGELOG-7.2.md @@ -7,6 +7,259 @@ in 7.2 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v7.2.0...v7.2.1 +* 7.2.7 (2025-05-29) + + * bug #60549 [Translation] Add intl-icu fallback for MessageCatalogue metadata (pontus-mp) + * bug #60571 [ErrorHandler] Do not transform file to link if it does not exist (lyrixx) + * bug #60494 [Messenger] fix: Add argument as integer (overexpOG) + * bug #60524 [Notifier] Fix Clicksend transport (BafS) + * bug #60478 [Validator] add missing `$extensions` and `$extensionsMessage` to the `Image` constraint (xabbuh) + * bug #60484 [PhpUnitBridge] Clean up mocked features only when ``@group`` is present (HypeMC) + * bug #60490 [PhpUnitBridge] set path to the PHPUnit autoload file (xabbuh) + * bug #60423 [DependencyInjection] Make `DefinitionErrorExceptionPass` consider `IGNORE_ON_UNINITIALIZED_REFERENCE` and `RUNTIME_EXCEPTION_ON_INVALID_REFERENCE` the same (MatTheCat) + * bug #60439 [FrameworkBundle] Fix declaring field-attr tags in xml config files (nicolas-grekas) + * bug #60428 [DependencyInjection] Fix missing binding for ServiceCollectionInterface when declaring a service subscriber (nicolas-grekas) + * bug #60421 [VarExporter] Fixed lazy-loading ghost objects generation with property hooks (cheack) + * bug #60266 [Security] Exclude remember_me from default login authenticators (santysisi) + * bug #60400 [Config] Fix generated comment for multiline "info" (GromNaN) + * bug #60260 [Serializer] Prevent `Cannot traverse an already closed generator` error by materializing Traversable input (santysisi) + * bug #60292 [HttpFoundation] Encode path in `X-Accel-Redirect` header (Athorcis) + * bug #58643 [SecurityBundle] Use Composer `InstalledVersions` to check if flex is installed (andyexeter) + * bug #60275 [DoctrineBridge] Fix UniqueEntityValidator Stringable identifiers (GiuseppeArcuti, wkania) + * bug #60293 [Messenger] fix asking users to select an option if `--force` option is used in `messenger:failed:retry` command (W0rma) + * bug #60379 [Security] Avoid failing when PersistentRememberMeHandler handles a malformed cookie (Seldaek) + * bug #60373 [FrameworkBundle] Ensure `Email` class exists before using it (Kocal) + * bug #60365 [FrameworkBundle] ensure that all supported e-mail validation modes can be configured (xabbuh) + * bug #60350 [Security][LoginLink] Throw `InvalidLoginLinkException` on invalid parameters (davidszkiba) + * bug #60340 [String] fix EmojiTransliterator return type compatibility with PHP 8.5 (xabbuh) + +* 7.2.6 (2025-05-02) + + * bug #60288 [VarExporter] dump default value for property hooks if present (xabbuh) + * bug #60267 [Contracts] Fix `ServiceMethodsSubscriberTrait` for nullable service (StevenRenaux) + * bug #60268 [Contracts] Fix `ServiceSubscriberTrait` for nullable service (StevenRenaux) + * bug #60256 [Mailer][Postmark] drop the `Date` header using the API transport (xabbuh) + * bug #60258 [VarExporter] Fix: Use correct closure call for property-specific logic in $notByRef (Hakayashii, denjas) + * bug #60269 [Notifier] [Discord] Fix value limits (norkunas) + * bug #60270 [Validator] [WordCount] Treat 0 as one character word and do not exclude it (sidz) + * bug #60248 [Messenger] Revert " Add call to `gc_collect_cycles()` after each message is handled" (jwage) + * bug #60236 [String] Support nexus -> nexuses pluralization (KorvinSzanto) + * bug #60238 [Lock] read (possible) error from Redis instance where evalSha() was called (xabbuh) + * bug #60194 [Workflow] Fix dispatch of entered event when the subject is already in this marking (lyrixx) + * bug #60174 [PhpUnitBridge] properly clean up mocked features after tests have run (xabbuh) + * bug #60172 [Cache] Fix invalidating on save failures with Array|ApcuAdapter (nicolas-grekas) + * bug #60122 [Cache] ArrayAdapter serialization exception clean $expiries (bastien-wink) + * bug #60167 [Cache] Fix proxying third party PSR-6 cache items (Dmitry Danilson) + * bug #60165 [HttpKernel] Do not ignore enum in controller arguments when it has an `#[Autowire]` attribute (ruudk) + * bug #60168 [Console] Correctly convert `SIGSYS` to its name (cs278) + * bug #60166 [Security] fix(security): fix OIDC user identifier (vincentchalamon) + * bug #60124 [Validator] : fix url validation when punycode is on tld but not on domain (joelwurtz) + * bug #60137 [Config] ResourceCheckerConfigCache metadata unserialize emits warning (Colin Michoudet) + * bug #60057 [Mailer] Fix `Trying to access array offset on value of type null` error by adding null checking (khushaalan) + * bug #60094 [DoctrineBridge] Fix support for entities that leverage native lazy objects (nicolas-grekas) + * bug #60094 [DoctrineBridge] Fix support for entities that leverage native lazy objects (nicolas-grekas) + +* 7.2.5 (2025-03-28) + + * bug #60054 [Form] Use duplicate_preferred_choices to set value of ChoiceType (aleho) + * bug #60026 [Serializer] Fix ObjectNormalizer default context with named serializers (HypeMC) + * bug #60030 [Cache][DoctrineBridge][HttpFoundation][Lock][Messenger] use `Table::addPrimaryKeyConstraint()` with Doctrine DBAL 4.3+ (xabbuh) + * bug #59844 [TypeInfo] Fix `isSatisfiedBy` not traversing type tree (mtarld) + * bug #59858 Update `JsDelivrEsmResolver::IMPORT_REGEX` to support dynamic imports (natepage) + * bug #60019 [HttpKernel] Fix `TraceableEventDispatcher` when the `Stopwatch` service has been reset (lyrixx) + * bug #59975 [HttpKernel] Only remove `E_WARNING` from error level during kernel init (fritzmg) + * bug #59988 [FrameworkBundle] Remove redundant `name` attribute from `default_context` (HypeMC) + * bug #59963 [TypeInfo] Fix ``@var`` tag reading for promoted properties (mtarld) + * bug #59949 [Process] Use a pipe for stderr in pty mode to avoid mixed output between stdout and stderr (joelwurtz) + * bug #59940 [Cache] Fix missing cache data in profiler (dcmbrs) + * bug #59965 [VarExporter] Fix support for hooks and asymmetric visibility (nicolas-grekas) + * bug #59924 Extract no type ``@param`` annotation with `PhpStanExtractor` (thomasdubuffet) + * bug #59908 [Messenger] Reduce keepalive request noise (ro0NL) + * bug #59874 [Console] fix progress bar messing output in section when there is an EOL (joelwurtz) + * bug #59888 [PhpUnitBridge] don't trigger "internal" deprecations for PHPUnit Stub objects (xabbuh) + * bug #59830 [Yaml] drop comments while lexing unquoted strings (xabbuh) + * bug #59884 [VarExporter] Fix support for asymmetric visibility (nicolas-grekas) + * bug #59881 [VarExporter] Fix support for abstract properties (nicolas-grekas) + * bug #59841 [Cache] fix cache data collector on late collect (dcmbrs) + +* 7.2.4 (2025-02-26) + + * bug #59198 [Messenger] Filter out non-consumable receivers when registering `ConsumeMessagesCommand` (wazum) + * bug #59781 [Mailer] fix multiple transports default injection (fkropfhamer) + * bug #59836 [Mailer][Postmark] Set CID for attachments when it exists (IssamRaouf) + * bug #59829 [FrameworkBundle] Disable the keys normalization of the CSRF form field attributes (sukei) + * bug #59840 Fix PHP warning in GetSetMethodNormalizer when a "set()" method is defined (Pepperoni1337) + * bug #59818 [TypeInfo] Fix create union with nullable type (mtarld) + * bug #59810 [DependencyInjection] Defer check for circular references instead of skipping them (biozshock) + * bug #59811 [Validator] Synchronize IBAN formats (alexandre-daubois) + * bug #59796 [Mime] use address for body at `PathHeader` (tinect) + * bug #59803 [Semaphore] allow redis cluster/sentinel dsn (smoench) + * bug #59779 [DomCrawler] Bug #43921 Check for null parent nodes in the case of orphaned branches (ttk) + * bug #59776 [WebProfilerBundle] fix rendering notifier message options (xabbuh) + * bug #59769 Enable `JSON_PRESERVE_ZERO_FRACTION` in `jsonRequest` method (raffaelecarelle) + * bug #59774 [TwigBridge] Fix compatibility with Twig 3.21 (alexandre-daubois) + * bug #59761 [VarExporter] Fix lazy objects with hooked properties (nicolas-grekas) + * bug #59763 [HttpClient] Don't send any default content-type when the body is empty (nicolas-grekas) + * bug #59747 [Translation] check empty notes (davidvancl) + * bug #59751 [Cache] Tests for Redis Replication with cache (DemigodCode) + * bug #59752 [BrowserKit] Fix submitting forms with empty file fields (nicolas-grekas) + * bug #59742 [Notifier] [BlueSky] Change the value returned as the message ID (javiereguiluz) + * bug #59033 [WebProfilerBundle] Fix interception for non conventional redirects (Huluti) + * bug #59713 [DependencyInjection] Do not preload functions (biozshock) + * bug #59723 [DependencyInjection] Fix cloned lazy services not sharing their dependencies when dumped with PhpDumper (pvandommelen) + * bug #59727 [HttpClient] Fix activity tracking leading to negative timeout errors (nicolas-grekas) + * bug #59728 [Form][FrameworkBundle] Use auto-configuration to make the default CSRF token id apply only to the app; not to bundles (nicolas-grekas) + * bug #59262 [DependencyInjection] Fix env default processor with scalar node (tBibaut) + * bug #59699 [Serializer] Handle default context in named Serializer (HypeMC) + * bug #59640 [Security] Return null instead of empty username to fix deprecation notice (phasdev) + * bug #59661 [Lock] Fix Predis error handling (HypeMC) + * bug #59596 [Mime] use `isRendered` method to ensure we can avoid rendering an email twice (walva) + * bug #59689 [HttpClient] Fix buffering AsyncResponse with no passthru (nicolas-grekas) + * bug #59654 [HttpClient] Fix uploading files > 2GB (nicolas-grekas) + * bug #59648 [HttpClient] Fix retrying requests with `Psr18Client` and NTLM connections (nicolas-grekas, ajgarlag) + * bug #59681 [TypeInfo] Fix promoted property phpdoc reading (mtarld) + +* 7.2.3 (2025-01-29) + + * bug #58889 [Serializer] Handle default context in Serializer (Valmonzo) + * bug #59631 [HttpClient] Fix processing a NativeResponse after its client has been reset (Jean-Beru) + * bug #59590 [Security] Throw an explicit error when refreshing a token with a null user (alexandre-daubois) + * bug #59625 [FrameworkBundle] Add missing `not-compromised-password` entry in XSD (alexandre-daubois) + * bug #59610 [Mailer] Ensure TransportExceptionInterface populates stream debug data (bytestream) + * bug #59598 [Mime] Fix body validity check in `Email` when using `Message::setBody()` (alexandre-daubois) + * bug #59513 [Messenger ] Extract retry delay from nested `RecoverableExceptionInterface` (AydinHassan) + * bug #59544 [AssetMapper] Fix CssCompiler matches url in comments (smnandre) + * bug #59575 [DoctrineBridge] Add support for doctrine/persistence 4 (greg0ire) + * bug #59611 [Mailer][Notifier] Fix channel parameter value to fixed value for Mailer and Notifier Sweego Transports (welcoMattic) + * bug #59399 [DomCrawler] Make `ChoiceFormField::isDisabled` return `true` for unchecked disabled checkboxes (MatTheCat) + * bug #59581 [Cache] Don't clear system caches on `cache:clear` (nicolas-grekas) + * bug #59579 [FrameworkBundle] Fix patching refs to the tmp warmup dir in files generated by optional cache warmers (nicolas-grekas) + * bug #59580 [Config] Add missing `json_encode` flags when creating `.meta.json` files (nicolas-grekas) + * bug #57459 [PropertyInfo] convert legacy types to TypeInfo types if getType() is not implemented (xabbuh) + * bug #59525 [HtmlSanitizer] Fix access to undefined keys in UrlSanitizer (Antoine Beyet) + * bug #59538 [VarDumper] fix dumped markup (xabbuh) + * bug #59508 [Messenger] [AMQP] Improve AMQP connection issues (AurelienPillevesse) + * bug #59501 [Serializer] [ObjectNormalizer] Filter int when using FILTER_BOOL (DjordyKoert) + * bug #59515 [FrameworkBundle] Fix wiring ConsoleProfilerListener (nicolas-grekas) + * bug #59136 [DependencyInjection] Reset env vars with `kernel.reset` (faizanakram99) + * bug #59488 [Lock] Make sure RedisStore will also support Valkey (PatNowak) + * bug #59486 [Validator] Update sr_Cyrl 120:This value is not a valid slug. (kaznovac) + * bug #59403 [FrameworkBundle][HttpFoundation] Reset Request's formats using the service resetter (nicolas-grekas) + * bug #59404 [Mailer] Fix SMTP stream EOF handling on Windows by using feof() (skmedix) + * bug #59390 [VarDumper] Fix blank strings display (MatTheCat) + * bug #59446 [Routing] Fix configuring a single route's hosts (MatTheCat) + * bug #58901 [HttpClient] Ignore RuntimeExceptions thrown when rewinding the PSR-7 created in HttplugWaitLoop::createPsr7Response (KurtThiemann) + * bug #59046 [HttpClient] Fix Undefined array key `connection` (PhilETaylor) + * bug #59055 [HttpFoundation] Fixed `IpUtils::anonymize` exception when using IPv6 link-local addresses with RFC4007 scoping (jbtronics) + * bug #59256 [Mailer] Fix Sendmail memory leak (rch7) + * bug #59375 [RemoteEvent][Webhook] fix SendgridPayloadConverter category support (ericabouaf) + * bug #59367 [PropertyInfo] Make sure that SerializerExtractor returns null for invalid class metadata (wuchen90) + * bug #59376 [RemoteEvent][Webhook] Fix `SendgridRequestParser` and `SendgridPayloadConverter` (ericabouaf) + * bug #59381 [Yaml] fix inline notation with inline comment (alexpott) + * bug #59352 [Messenger] Fix `TransportMessageIdStamp` not always added (HypeMC) + * bug #59185 [DoctrineBridge] Fix compatibility to Doctrine persistence 2.5 in Doctrine Bridge 6.4 to avoid Projects stuck on 6.3 (alexander-schranz) + * bug #59245 [PropertyInfo] Fix add missing composer conflict (mtarld) + * bug #59292 [WebProfilerBundle] Fix event delegation on links inside toggles (MatTheCat) + * bug #59362 [Doctrine][Messenger] Prevents multiple TransportMessageIdStamp being stored in envelope (rtreffler) + * bug #59323 [Serializer] Fix exception thrown by `YamlEncoder` (VincentLanglet) + * bug #59293 [AssetMapper] Fix JavaScript compiler creates self-referencing imports (smnandre) + * bug #59296 [Form] do not render hidden CSRF token forms with autocomplete set to off (xabbuh) + * bug #59349 [Yaml] reject inline notations followed by invalid content (xabbuh) + * bug #59229 [WebProfilerBundle] fix loading of toolbar stylesheet (alexislefebvre) + * bug #59363 [VarDumper] Fix displaying closure's "this" from anonymous classes (nicolas-grekas) + * bug #59364 [ErrorHandler] Don't trigger "internal" deprecations for anonymous LazyClosure instances (nicolas-grekas) + * bug #59221 [PropertyAccess] Fix compatibility with PHP 8.4 asymmetric visibility (Florian-Merle) + * bug #59348 [Lock] Fix predis command error checking (dciprian-petrisor) + * bug #59357 [HttpKernel] Don't override existing `LoggerInterface` autowiring alias in `LoggerPass` (nicolas-grekas) + * bug #59347 [Security] Fix triggering session tracking from ContextListener (nicolas-grekas) + * bug #59146 [Security] Use the session only if it is started when using `SameOriginCsrfTokenManager` (Thibault G) + * bug #59188 [HttpClient] Fix `reset()` not called on decorated clients (HypeMC) + * bug #59339 [SecurityBundle] Remove outdated guard from security xsd schema (chalasr) + * bug #59343 [Security] Adjust parameter order in exception message (Link1515) + * bug #59342 [SecurityBundle] Do not pass traceable authenticators to `security.helper` (MatTheCat) + * bug #59320 [HttpClient] fix amphp http client v5 unix socket (praswicaksono) + * bug #59312 [Yaml] Fix parsing of unquoted strings in Parser::lexUnquotedString() to ignore spaces (Link1515) + * bug #59334 [ErrorHandler] [A11y] Simple proposal for color updates on error stack traces against colorblindness (DocFX) + +* 7.2.2 (2024-12-31) + + * bug #59304 [PropertyInfo] Remove ``@internal`` from `PropertyReadInfo` and `PropertyWriteInfo` (Dario Guarracino) + * bug #59252 [Stopwatch] bug #54854 undefined key error when trying to fetch a mis… (Alex Niedre) + * bug #59278 [SecurityBundle] Do not replace authenticators service by their traceable version (MatTheCat) + * bug #59228 [HttpFoundation] Avoid mime type guess with temp files in `BinaryFileResponse` (alexandre-daubois) + * bug #59318 [Finder] Fix using `==` as default operator in `DateComparator` (MatTheCat) + * bug #59321 [HtmlSanitizer] reject URLs containing whitespaces (xabbuh) + * bug #59310 [Validator] the "max" option can be zero (xabbuh) + * bug #59271 [TypeInfo] Fix PHPDoc resolving of union with mixed (mtarld) + * bug #59269 [Security/Csrf] Trust "Referer" at the same level as "Origin" (nicolas-grekas) + * bug #59250 [HttpClient] Fix a typo in NoPrivateNetworkHttpClient (Jontsa) + * bug #59103 [Messenger] ensure exception on rollback does not hide previous exception (nikophil) + * bug #59226 [FrameworkBundle] require the writer to implement getFormats() in the translation:extract (xabbuh) + * bug #59213 [FrameworkBundle] don't require fake notifier transports to be installed as non-dev dependencies (xabbuh) + * bug #59113 [FrameworkBundle][Translation] fix translation lint compatibility with the `PseudoLocalizationTranslator` (xabbuh) + * bug #59060 [Validator] set the violat 8000 ion path only if the `errorPath` option is set (xabbuh) + * bug #59066 Fix resolve enum in string type resolver (DavidBadura) + * bug #59156 [PropertyInfo] Fix interface handling in PhpStanTypeHelper (mtarld) + * bug #59160 [BeanstalkMessenger] Round delay to an integer to avoid deprecation warning (plantas) + * bug #59012 [PropertyInfo] Fix interface handling in `PhpStanTypeHelper` (janedbal) + * bug #59134 [HttpKernel] Denormalize request data using the csv format when using "#[MapQueryString]" or "#[MapRequestPayload]" (except for content data) (ovidiuenache) + * bug #59140 [WebProfilerBundle] fix: white-space in highlighted code (chr-hertel) + +* 7.2.1 (2024-12-11) + + * bug #59145 [TypeInfo] Make `Type::nullable` method no-op on every nullable type (mtarld) + * bug #59122 [Notifier] fix desktop channel bus abstract arg (raphael-geffroy) + * bug #59124 [FrameworkBundle] fix: notifier push channel bus abstract arg (raphael-geffroy) + * bug #59069 [Console] Fix division by 0 error (Rindula) + * bug #59086 [FrameworkBundle] Make uri_signer lazy and improve error when kernel.secret is empty (nicolas-grekas) + * bug #59099 [sendgrid-mailer] Fix null check on region (AUDUL) + * bug #59070 [PropertyInfo] evaluate access flags for properties with asymmetric visibility (xabbuh) + * bug #59062 [HttpClient] Always set CURLOPT_CUSTOMREQUEST to the correct HTTP method in CurlHttpClient (KurtThiemann) + * bug #59059 [TwigBridge] generate conflict-free variable names (xabbuh) + +* 7.2.0 (2024-11-29) + + * bug #59023 [HttpClient] Fix streaming and redirecting with NoPrivateNetworkHttpClient (nicolas-grekas) + * bug #59014 [Form] Allow integer for the `calendar` option of `DateType` (alexandre-daubois) + * bug #59013 [HttpClient] Fix checking for private IPs before connecting (nicolas-grekas) + * bug #58562 [HttpClient] Close gracefull when the server closes the connection abruptly (discordier) + * bug #59007 [Dotenv] read runtime config from composer.json in debug dotenv command (xabbuh) + * bug #58963 [PropertyInfo] Fix write visibility for Asymmetric Visibility and Virtual Properties (xabbuh, pan93412) + * bug #58983 [Translation] [Bridge][Lokalise] Fix empty keys array in PUT, DELETE requests causing Lokalise API error (DominicLuidold) + * bug #58956 [DoctrineBridge] Fix `Connection::createSchemaManager()` for Doctrine DBAL v2 (neodevcode) + * bug #58959 [PropertyInfo] consider write property visibility to decide whether a property is writable (xabbuh) + * bug #58964 [TwigBridge] do not add child nodes to EmptyNode instances (xabbuh) + * bug #58950 [FrameworkBundle] Revert " Deprecate making `cache.app` adapter taggable" (keulinho) + * bug #58952 [Cache] silence warnings issued by Redis Sentinel on connection issues (xabbuh) + * bug #58953 [HttpClient] Fix computing stats for PUSH with Amp (nicolas-grekas) + * bug #58943 [FrameworkBundle] Revert " Don't auto-register form/csrf when the corresponding components are not installed" (nicolas-grekas) + * bug #58937 [FrameworkBundle] Don't auto-register form/csrf when the corresponding components are not installed (nicolas-grekas) + * bug #58859 [AssetMapper] ignore missing directory in `isVendor()` (alexislefebvre) + * bug #58917 [OptionsResolver] Allow Union/Intersection Types in Resolved Closures (zanbaldwin) + * bug #58822 [DependencyInjection] Fix checking for interfaces in ContainerBuilder::getReflectionClass() (donquixote) + * bug #58865 Dynamically fix compatibility with doctrine/data-fixtures v2 (greg0ire) + * bug #58921 [HttpKernel] Ensure `HttpCache::getTraceKey()` does not throw exception (lyrixx) + * bug #58908 [DoctrineBridge] don't call `EntityManager::initializeObject()` with scalar values (xabbuh) + * bug #58938 [Cache] make RelayProxyTrait compatible with relay extension 0.9.0 (xabbuh) + * bug #58924 [HttpClient] Fix empty hosts in option "resolve" (nicolas-grekas) + * bug #58915 [HttpClient] Fix option "resolve" with IPv6 addresses (nicolas-grekas) + * bug #58919 [WebProfilerBundle] Twig deprecations (mazodude) + * bug #58914 [HttpClient] Fix option "bindto" with IPv6 addresses (nicolas-grekas) + * bug #58888 [Mailer][Notifier] Sweego is backing their bridges, thanks to them! (nicolas-grekas) + * bug #58885 [PropertyInfo][Serializer][TypeInfo][Validator] TypeInfo 7.1 compatibility (mtarld) + * bug #58870 [Serializer][Validator] prevent failures around not existing TypeInfo classes (xabbuh) + * bug #58872 [PropertyInfo][Serializer][Validator] TypeInfo 7.2 compatibility (mtarld) + * bug #58875 [HttpClient] Removed body size limit (Carl Julian Sauter) + * bug #58866 [Validator] fix compatibility with PHP < 8.2.4 (xabbuh) + * bug #58862 [Notifier] Fix GoIpTransport (nicolas-grekas) + * bug #58860 [HttpClient] Fix catching some invalid Location headers (nicolas-grekas) + * bug #58834 [FrameworkBundle] ensure `validator.translation_domain` parameter is always set (xabbuh) + * bug #58836 Work around `parse_url()` bug (bis) (nicolas-grekas) + * bug #58818 [Messenger] silence PHP warnings issued by `Redis::connect()` (xabbuh) + * bug #58828 [PhpUnitBridge] fix dumping tests to skip with data providers (xabbuh) + * bug #58842 [Routing] Fix: lost priority when defining hosts in configuration (BeBlood) + * bug #58850 [HttpClient] fix PHP 7.2 compatibility (xabbuh) + * 7.2.0-RC1 (2024-11-13) * feature #58852 [TypeInfo] Remove ``@experimental`` tag (mtarld) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index bcc33dc4892f2..3e7f5ec2b6e78 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -12,15 +12,15 @@ The Symfony Connect username in parenthesis allows to get more information - Robin Chalas (chalas_r) - Tobias Schultze (tobion) - Grégoire Pineau (lyrixx) - - Thomas Calvet (fancyweb) - Alexandre Daubois (alexandre-daubois) + - Thomas Calvet (fancyweb) - Christophe Coevoet (stof) - Wouter de Jong (wouterj) - Jordi Boggiano (seldaek) - Maxime Steinhausser (ogizanagi) - Kévin Dunglas (dunglas) - - Victor Berchet (victor) - Javier Eguiluz (javier.eguiluz) + - Victor Berchet (victor) - Ryan Weaver (weaverryan) - Jérémy DERUSSÉ (jderusse) - Jules Pietri (heah) @@ -30,16 +30,16 @@ The Symfony Connect username in parenthesis allows to get more information - Kris Wallsmith (kriswallsmith) - Jakub Zalas (jakubzalas) - Yonel Ceruto (yonelceruto) + - HypeMC (hypemc) - Hugo Hamon (hhamon) - Tobias Nyholm (tobias) - - HypeMC (hypemc) - Jérôme Tamarelle (gromnan) - - Samuel ROZE (sroze) - Antoine Lamirault (alamirault) + - Samuel ROZE (sroze) - Pascal Borreli (pborreli) - Romain Neutron - - Joseph Bielawski (stloyd) - Kevin Bond (kbond) + - Joseph Bielawski (stloyd) - Drak (drak) - Abdellatif Ait boudad (aitboudad) - Lukas Kahwe Smith (lsmith) @@ -50,25 +50,27 @@ The Symfony Connect username in parenthesis allows to get more information - Benjamin Eberlei (beberlei) - Igor Wiedler - Jan Schädlich (jschaedl) + - Mathias Arlaud (mtarld) - Mathieu Lechat (mat_the_cat) + - Simon André (simonandre) + - Vincent Langlet (deviling) - Matthias Pigulla (mpdude) - Gabriel Ostrolucký (gadelat) - - Simon André (simonandre) - Jonathan Wage (jwage) - - Vincent Langlet (deviling) - Valentin Udaltsov (vudaltsov) - - Mathias Arlaud (mtarld) - - Alexandre Salomé (alexandresalome) - Grégoire Paris (greg0ire) + - Alexandre Salomé (alexandresalome) - William DURAND - ornicar - Dany Maillard (maidmaid) - Eriksen Costa - Diego Saint Esteben (dosten) + - Dariusz Ruminski - stealth35 ‏ (stealth35) - Alexander Mols (asm89) - Gábor Egyed (1ed) - Francis Besset (francisbesset) + - Mathieu Santostefano (welcomattic) - Titouan Galopin (tgalopin) - Pierre du Plessis (pierredup) - David Maicher (dmaicher) @@ -77,51 +79,51 @@ The Symfony Connect username in parenthesis allows to get more information - Iltar van der Berg - Miha Vrhovnik (mvrhov) - Gary PEGEOT (gary-p) - - Mathieu Santostefano (welcomattic) + - Alexander Schranz (alexander-schranz) - Saša Stamenković (umpirsky) - Allison Guilhem (a_guilhem) - - Alexander Schranz (alexander-schranz) - Mathieu Piot (mpiot) - Vasilij Duško (staff) - Sarah Khalil (saro0h) - Laurent VOULLEMIER (lvo) - Konstantin Kudryashov (everzet) - Guilhem N (guilhemn) - - Dariusz Ruminski - Bilal Amarni (bamarni) - Eriksen Costa - Florin Patan (florinpatan) - Vladimir Reznichenko (kalessil) - Peter Rehm (rpet) - Henrik Bjørnskov (henrikbjorn) - - David Buchmann (dbu) - Ruud Kamphuis (ruudk) + - David Buchmann (dbu) + - Tomas Norkūnas (norkunas) - Andrej Hudec (pulzarraider) - Jáchym Toušek (enumag) - - Tomas Norkūnas (norkunas) + - Hubert Lenoir (hubert_lenoir) - Christian Raue - Eric Clemmons (ericclemmons) - Denis (yethee) + - Alex Pott - Michel Weimerskirch (mweimerskirch) - Issei Murasawa (issei_m) - Arnout Boks (aboks) - Douglas Greenshields (shieldo) - Frank A. Fiebig (fafiebig) - Baldini - - Alex Pott - Fran Moreno (franmomu) + - Antoine Makdessi (amakdessi) - Charles Sarrazin (csarrazi) - Henrik Westphal (snc) - Dariusz Górecki (canni) - - Hubert Lenoir (hubert_lenoir) - Ener-Getick - - Antoine Makdessi (amakdessi) - Graham Campbell (graham) + - Joel Wurtz (brouznouf) + - Massimiliano Arione (garak) - Tugdual Saunier (tucksaun) - Lee McDermott - Brandon Turner - - Massimiliano Arione (garak) - Luis Cordova (cordoval) + - Phil E. Taylor (philetaylor) - Konstantin Myakshin (koc) - Daniel Holmes (dholmes) - Julien Falque (julienfalque) @@ -129,10 +131,9 @@ The Symfony Connect username in parenthesis allows to get more information - Bart van den Burg (burgov) - Vasilij Dusko | CREATION - Jordan Alliot (jalliot) - - Phil E. Taylor (philetaylor) - Théo FIDRY - - Joel Wurtz (brouznouf) - John Wards (johnwards) + - Valtteri R (valtzu) - Yanick Witschi (toflar) - Antoine Hérault (herzult) - Konstantin.Myakshin @@ -148,18 +149,19 @@ The Symfony Connect username in parenthesis allows to get more information - Jérôme Vasseur (jvasseur) - Peter Kokot (peterkokot) - Brice BERNARD (brikou) + - Jacob Dreesen (jdreesen) + - Nicolas Philippe (nikophil) - Martin Auswöger - Michal Piotrowski - marc.weistroff - Lars Strojny (lstrojny) - lenar - Vladimir Tsykun (vtsykun) - - Jacob Dreesen (jdreesen) - Włodzimierz Gajda (gajdaw) - - Valtteri R (valtzu) - - Nicolas Philippe (nikophil) - Javier Spagnoletti (phansys) - Adrien Brault (adrienbrault) + - Florent Morselli (spomky_) + - soyuka - Florian Voutzinos (florianv) - Teoh Han Hui (teohhanhui) - Przemysław Bogusz (przemyslaw-bogusz) @@ -169,16 +171,19 @@ The Symfony Connect username in parenthesis allows to get more information - Maximilian Beckers (maxbeckers) - Baptiste Clavié (talus) - Alexander Schwenn (xelaris) + - Maxime Helias (maxhelias) - Fabien Pennequin (fabienpennequin) + - Dāvis Zālītis (k0d3r1s) - Gordon Franke (gimler) - Malte Schlüter (maltemaltesich) - jeremyFreeAgent (jeremyfreeagent) - Michael Babker (mbabker) + - Alexis Lefebvre + - Hugo Alliaume (kocal) + - Christopher Hertel (chertel) - Joshua Thijssen - Vasilij Dusko - Daniel Wehner (dawehner) - - Maxime Helias (maxhelias) - - Dāvis Zālītis (k0d3r1s) - Robert Schönthal (digitalkaoz) - Smaine Milianni (ismail1432) - François-Xavier de Guillebon (de-gui_f) @@ -193,36 +198,34 @@ The Symfony Connect username in parenthesis allows to get more information - Jhonny Lidfors (jhonne) - Juti Noppornpitak (shiroyuki) - Gregor Harlan (gharlan) - - Hugo Alliaume (kocal) - Anthony MARTIN - Sebastian Hörl (blogsh) - Tigran Azatyan (tigranazatyan) - Florent Mata (fmata) - - Christopher Hertel (chertel) - Jonathan Scheiber (jmsche) - Daniel Gomes (danielcsgomes) - Hidenori Goto (hidenorigoto) + - Thomas Landauer (thomas-landauer) - Arnaud Kleinpeter (nanocom) - Guilherme Blanco (guilhermeblanco) + - David Prévot (taffit) - Saif Eddin Gmati (azjezz) - Farhad Safarov (safarov) - - Alexis Lefebvre - SpacePossum - Richard van Laak (rvanlaak) - Andreas Braun - Pablo Godel (pgodel) - Alessandro Chitolina (alekitto) + - Jan Rosier (rosier) - Rafael Dohms (rdohms) - Roman Martinuk (a2a4) - - Thomas Landauer (thomas-landauer) - jwdeitch - - David Prévot (taffit) - Jérôme Parmentier (lctrs) - Ahmed TAILOULOUTE (ahmedtai) - Simon Berger - - soyuka - Jérémy Derussé - Matthieu Napoli (mnapoli) + - Bob van de Vijver (bobvandevijver) - Tomas Votruba (tomas_votruba) - Arman Hosseini (arman) - Sokolov Evgeniy (ewgraf) @@ -233,16 +236,15 @@ The Symfony Connect username in parenthesis allows to get more information - George Mponos (gmponos) - Richard Shank (iampersistent) - Roland Franssen :) + - Fritz Michael Gschwantner (fritzmg) - Romain Monteil (ker0x) - Sergey (upyx) - - Florent Morselli (spomky_) - Marco Pivetta (ocramius) - Antonio Pauletich (x-coder264) - Vincent Touzet (vincenttouzet) - Fabien Bourigault (fbourigault) - Olivier Dolbeau (odolbeau) - Rouven Weßling (realityking) - - Bob van de Vijver (bobvandevijver) - Daniel Burger - Ben Davies (bendavies) - YaFou @@ -251,9 +253,9 @@ The Symfony Connect username in parenthesis allows to get more information - Oleg Voronkovich - Helmer Aaviksoo - Alessandro Lai (jean85) - - Jan Rosier (rosier) - 77web - Gocha Ossinkine (ossinkine) + - matlec - Jesse Rushlow (geeshoe) - Matthieu Ouellette-Vachon (maoueh) - Michał Pipa (michal.pipa) @@ -265,17 +267,18 @@ The Symfony Connect username in parenthesis allows to get more information - Artur Kotyrba - Wouter J - Tyson Andre - - Fritz Michael Gschwantner (fritzmg) - GDIBass - Samuel NELA (snela) - Baptiste Leduc (korbeil) - Vincent AUBERT (vincent) + - Nate Wiebe (natewiebe13) - Michael Voříšek - zairig imad (zairigimad) - Colin O'Dell (colinodell) - Sébastien Alfaiate (seb33300) - James Halsall (jaitsu) - Christian Scheb + - Alex Hofbauer (alexhofbauer) - Mikael Pajunen - Warnar Boekkooi (boekkooi) - Justin Hileman (bobthecow) @@ -293,27 +296,35 @@ The Symfony Connect username in parenthesis allows to get more information - Richard Miller - Quynh Xuan Nguyen (seriquynh) - Victor Bocharsky (bocharsky_bw) + - Asis Pattisahusiwa - Aleksandar Jakovljevic (ajakov) - Mario A. Alvarez Garcia (nomack84) - Thomas Rabaix (rande) - D (denderello) - DQNEO - Chi-teck + - Marko Kaznovac (kaznovac) + - Stiven Llupa (sllupa) - Andre Rømcke (andrerom) - Bram Leeda (bram123) - Patrick Landolt (scube) - Karoly Gossler (connorhu) - Timo Bakx (timobakx) + - Quentin Devos - Giorgio Premi + - Alan Poulain (alanpoulain) - Ruben Gonzalez (rubenrua) - Benjamin Dulau (dbenjamin) - Markus Fasselt (digilist) - Denis Brumann (dbrumann) - mcfedr (mcfedr) + - Loick Piera (pyrech) - Remon van de Kamp - Mathieu Lemoine (lemoinem) - Christian Schmidt - Andreas Hucks (meandmymonkey) + - Artem Lopata + - Indra Gunawan (indragunawan) - Noel Guilbert (noel) - Bastien Jaillot (bastnic) - Soner Sayakci @@ -321,22 +332,22 @@ The Symfony Connect username in parenthesis allows to get more information - Stepan Anchugov (kix) - bronze1man - sun (sun) + - Filippo Tessarotto (slamdunk) - Larry Garfield (crell) - Leo Feyer - Nikolay Labinskiy (e-moe) - - Asis Pattisahusiwa - Martin Schuhfuß (usefulthink) - apetitpa + - wkania - Guilliam Xavier - Pierre Minnieur (pminnieur) - Dominique Bongiraud - - Stiven Llupa (sllupa) - Hugo Monteiro (monteiro) - Dmitrii Poddubnyi (karser) - Julien Pauli + - Jonathan H. Wage - Michael Lee (zerustech) - Florian Lonqueu-Brochard (florianlb) - - Nate Wiebe (natewiebe13) - Joe Bennett (kralos) - Leszek Prabucki (l3l0) - Wojciech Kania @@ -349,64 +360,63 @@ The Symfony Connect username in parenthesis allows to get more information - John Kary (johnkary) - Võ Xuân Tiến (tienvx) - fd6130 (fdtvui) + - Antonio J. García Lagar (ajgarlag) - Priyadi Iman Nurcahyo (priyadi) - - Alan Poulain (alanpoulain) + - Oleg Andreyev (oleg.andreyev) - Maciej Malarz (malarzm) - Marcin Sikoń (marphi) - Michele Orselli (orso) + - Arjen van der Meijden - Sven Paulus (subsven) - - Indra Gunawan (indragunawan) - Peter Kruithof (pkruithof) - - Alex Hofbauer (alexhofbauer) - Maxime Veber (nek-) - Valentine Boineau (valentineboineau) - Rui Marinho (ruimarinho) - - Filippo Tessarotto (slamdunk) - Jeroen Noten (jeroennoten) - Possum - Jérémie Augustin (jaugustin) - Edi Modrić (emodric) - Pascal Montoya - - Loick Piera (pyrech) - Julien Brochet - François Pluchino (francoispluchino) + - W0rma - Tristan Darricau (tristandsensio) - Jan Sorgalla (jsor) - henrikbjorn - Marcel Beerta (mazen) + - Evert Harmeling (evertharmeling) - Mantis Development - - Marko Kaznovac (kaznovac) - Hidde Wieringa (hiddewie) - dFayet - Rob Frawley 2nd (robfrawley) - Renan (renanbr) - - Jonathan H. Wage - Nikita Konstantinov (unkind) - Dariusz - Daniel Gorgan - Francois Zaninotto + - Aurélien Pillevesse (aurelienpillevesse) - Daniel Tschinder - Christian Schmidt - Alexander Kotynia (olden) + - Matthieu Lempereur (mryamous) - Elnur Abdurrakhimov (elnur) - Manuel Reinhard (sprain) - - Antonio J. García Lagar (ajgarlag) + - Zan Baldwin (zanbaldwin) + - Tim Goudriaan (codedmonkey) - BoShurik - - Quentin Devos - Adam Prager (padam87) - Benoît Burnichon (bburnichon) - maxime.steinhausser - - Oleg Andreyev (oleg.andreyev) + - Iker Ibarguren (ikerib) - Roman Ring (inori) - Xavier Montaña Carreras (xmontana) - - Arjen van der Meijden - Romaric Drigon (romaricdrigon) - Sylvain Fabre (sylfabre) - Xavier Perez - Arjen Brouwer (arjenjb) - - Artem Lopata - Patrick McDougle (patrick-mcdougle) - Arnt Gulbrandsen + - Michel Roca (mroca) - Marc Weistroff (futurecat) - Michał (bambucha15) - Danny Berger (dpb587) @@ -415,10 +425,11 @@ The Symfony Connect username in parenthesis allows to get more information - Pierre-Yves Lebecq (pylebecq) - Benjamin Leveque (benji07) - Jordan Samouh (jordansamouh) + - David Badura (davidbadura) - Sullivan SENECHAL (soullivaneuh) - Uwe Jäger (uwej711) - javaDeveloperKid - - W0rma + - Chris Smith (cs278) - Lynn van der Berg (kjarli) - Michaël Perrin (michael.perrin) - Eugene Leonovich (rybakit) @@ -428,9 +439,9 @@ The Symfony Connect username in parenthesis allows to get more information - GordonsLondon - Ray - Philipp Cordes (corphi) + - Fabien S (bafs) - Chekote - Thomas Adam - - Evert Harmeling (evertharmeling) - Anderson Müller - jdhoek - Jurica Vlahoviček (vjurica) @@ -454,17 +465,15 @@ The Symfony Connect username in parenthesis allows to get more information - renanbr - Sébastien Lavoie (lavoiesl) - Alex Rock (pierstoval) - - Matthieu Lempereur (mryamous) - Wodor Wodorski - Beau Simensen (simensen) - Magnus Nordlander (magnusnordlander) - - Tim Goudriaan (codedmonkey) - Robert Kiss (kepten) - - Zan Baldwin (zanbaldwin) - Alexandre Quercia (alquerci) - Marcos Sánchez - Emanuele Panzeri (thepanz) - Zmey + - Santiago San Martin (santysisi) - Kim Hemsø Rasmussen (kimhemsoe) - Maximilian Reichel (phramz) - Samaël Villette (samadu61) @@ -472,10 +481,10 @@ The Symfony Connect username in parenthesis allows to get more information - Pascal Luna (skalpa) - Wouter Van Hecke - Baptiste Lafontaine (magnetik) - - Iker Ibarguren (ikerib) - Michael Hirschler (mvhirsch) - Michael Holm (hollo) - Robert Meijers + - roman joly (eltharin) - Blanchon Vincent (blanchonvincent) - Cédric Anne - Christian Schmidt @@ -483,14 +492,16 @@ The Symfony Connect username in parenthesis allows to get more information - Marco Petersen (ocrampete16) - Bohan Yang (brentybh) - Vilius Grigaliūnas - - David Badura (davidbadura) - - Chris Smith (cs278) + - Jordane VASPARD (elementaire) - Thomas Bisignani (toma) - Florian Klein (docteurklein) + - Pierre Ambroise (dotordu) + - Raphaël Geffroy (raphael-geffroy) - Damien Alexandre (damienalexandre) - Manuel Kießling (manuelkiessling) - Alexey Kopytko (sanmai) - Warxcell (warxcell) + - SiD (plbsid) - Atsuhiro KUBO (iteman) - rudy onfroy (ronfroy) - Serkan Yildiz (srknyldz) @@ -500,7 +511,6 @@ The Symfony Connect username in parenthesis allows to get more information - Gabor Toth (tgabi333) - realmfoo - Joppe De Cuyper (joppedc) - - Fabien S (bafs) - Simon Podlipsky (simpod) - Thomas Tourlourat (armetiz) - Andrey Esaulov (andremaha) @@ -509,6 +519,8 @@ The Symfony Connect username in parenthesis allows to get more information - Ismael Ambrosi (iambrosi) - Craig Duncan (duncan3dc) - Emmanuel BORGES + - Mathieu Rochette (mathroc) + - Karoly Negyesi (chx) - Aurelijus Valeiša (aurelijus) - Jan Decavele (jandc) - Gustavo Piltcher @@ -534,7 +546,8 @@ The Symfony Connect username in parenthesis allows to get more information - Ahmed Raafat - Philippe Segatori - Thibaut Cheymol (tcheymol) - - Aurélien Pillevesse (aurelienpillevesse) + - Vincent Chalamon + - Raffaele Carelle - Erin Millard - Matthew Lewinski (lewinski) - Islam Israfilov (islam93) @@ -558,6 +571,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kai Dederichs - Pavel Kirpitsov (pavel-kirpichyov) - Artur Eshenbrener + - Issam Raouf (iraouf) - Harm van Tilborg (hvt) - Thomas Perez (scullwm) - Gwendolen Lynch @@ -566,6 +580,7 @@ The Symfony Connect username in parenthesis allows to get more information - mondrake (mondrake) - Yaroslav Kiliba - FORT Pierre-Louis (plfort) + - Jan Böhmer - Terje Bråten - Gonzalo Vilaseca (gonzalovilaseca) - Tarmo Leppänen (tarlepp) @@ -573,6 +588,7 @@ The Symfony Connect username in parenthesis allows to get more information - Daniel STANCU - Kristen Gilden - Robbert Klarenbeek (robbertkl) + - Dalibor Karlović - Hamza Makraz (makraz) - Eric Masoero (eric-masoero) - Vitalii Ekert (comrade42) @@ -581,8 +597,6 @@ The Symfony Connect username in parenthesis allows to get more information - hossein zolfi (ocean) - Alexander Menshchikov - Clément Gautier (clementgautier) - - roman joly (eltharin) - - Jordane VASPARD (elementaire) - James Gilliland (neclimdul) - Sanpi (sanpi) - Eduardo Gulias (egulias) @@ -599,11 +613,12 @@ The Symfony Connect username in parenthesis allows to get more information - Kirill chEbba Chebunin - Pol Dellaiera (drupol) - Alex (aik099) + - Kieran Brahney - Fabien Villepinte - - SiD (plbsid) - Greg Thornton (xdissent) - Alex Bowers - - Michel Roca (mroca) + - Kev + - kor3k kor3k (kor3k) - Costin Bereveanu (schniper) - Andrii Dembitskyi - Gasan Guseynov (gassan) @@ -621,11 +636,11 @@ The Symfony Connect username in parenthesis allows to get more information - Saif Eddin G - Endre Fejes - Tobias Naumann (tna) - - Mathieu Rochette (mathroc) - Daniel Beyer - Ivan Sarastov (isarastov) - flack (flack) - Shein Alexey + - Link1515 - Joe Lencioni - Daniel Tschinder - Diego Agulló (aeoris) @@ -633,7 +648,6 @@ The Symfony Connect username in parenthesis allows to get more information - Kai - Alain Hippolyte (aloneh) - Grenier Kévin (mcsky_biig) - - Karoly Negyesi (chx) - Xavier HAUSHERR - Albert Jessurum (ajessu) - Romain Pierre @@ -649,7 +663,9 @@ The Symfony Connect username in parenthesis allows to get more information - a.dmitryuk - Anthon Pang (robocoder) - Julien Galenski (ruian) + - Benjamin Morel - Ben Scott (bpscott) + - Shyim - Pablo Lozano (arkadis) - Brian King - quentin neyrat (qneyrat) @@ -662,12 +678,15 @@ The Symfony Connect username in parenthesis allows to get more information - Ahmed Ghanem (ahmedghanem00) - Valentin Jonovs - geoffrey + - Quentin Dequippe (qdequippe) - Benoit Galati (benoitgalati) - Benjamin (yzalis) - Jeanmonod David (jeanmonod) - Webnet team (webnet) + - Christian Gripp (core23) - Tobias Bönner - Nicolas Rigaud + - PHAS Developer - Ben Ramsey (ramsey) - Berny Cantos (xphere81) - Antonio Jose Cerezo (ajcerezo) @@ -677,23 +696,29 @@ The Symfony Connect username in parenthesis allows to get more information - Lescot Edouard (idetox) - Dennis Fridrich (dfridrich) - Mohammad Emran Hasan (phpfour) + - Florian Merle (florian-merle) - Dmitriy Mamontov (mamontovdmitriy) - Jan Schumann - Matheo Daninos (mathdns) - Neil Peyssard (nepey) - Niklas Fiekas - Mark Challoner (markchalloner) + - Andreas Hennings - Markus Bachmann (baachi) - Gunnstein Lye (glye) - Erkhembayar Gantulga (erheme318) + - Yi-Jyun Pan - Sergey Melesh (sergex) - Greg Anderson + - Arnaud De Abreu (arnaud-deabreu) - lancergr - Benjamin Zaslavsky (tiriel) - Tri Pham (phamuyentri) - Angelov Dejan (angelov) - Ivan Nikolaev (destillat) - Gildas Quéméner (gquemener) + - Ioan Ovidiu Enache (ionutenache) + - Mokhtar Tlili (sf-djuba) - Maxim Dovydenok (dovydenok-maxim) - Laurent Masforné (heisenberg) - Claude Khedhiri (ck-developer) @@ -731,17 +756,19 @@ The Symfony Connect username in parenthesis allows to get more information - Vitaliy Tverdokhlib (vitaliytv) - Ariel Ferrandini (aferrandini) - BASAK Semih (itsemih) - - Jan Böhmer - Dirk Pahl (dirkaholic) - Cédric Lombardot (cedriclombardot) - Jérémy REYNAUD (babeuloula) + - Faizan Akram Dar (faizanakram) - Arkadius Stefanski (arkadius) + - Andy Palmer (andyexeter) - Jonas Flodén (flojon) - AnneKir - Tobias Weichart - Arnaud POINTET (oipnet) - Tristan Pouliquen - Miro Michalicka + - Hans Mackowiak - M. Vondano - Dominik Zogg - Maximilian Zumbansen @@ -752,15 +779,18 @@ The Symfony Connect username in parenthesis allows to get more information - François Dume (franek) - Jerzy Lekowski (jlekowski) - Raulnet + - Petrisor Ciprian Daniel - Oleksiy (alexndlm) - William Arslett (warslett) - Giso Stallenberg (gisostallenberg) - Rob Bast - Roberto Espinoza (respinoza) + - Steven RENAUX (steven_renaux) - Marvin Feldmann (breyndotechse) - Soufian EZ ZANTAR (soezz) - Marek Zajac - Adam Harvey + - Klaus Silveira (klaussilveira) - ilyes kooli (skafandri) - Anton Bakai - battye @@ -772,7 +802,6 @@ The Symfony Connect username in parenthesis allows to get more information - Patrick Reimers (preimers) - Brayden Williams (redstar504) - insekticid - - Kieran Brahney - Jérémy M (th3mouk) - Trent Steel (trsteel88) - boombatower @@ -787,6 +816,7 @@ The Symfony Connect username in parenthesis allows to get more information - Joshua Nye - Martin Kirilov (wucdbm) - Koen Reiniers (koenre) + - Kurt Thiemann - Nathan Dench (ndenc2) - Gijs van Lammeren - Sebastian Bergmann @@ -794,9 +824,9 @@ The Symfony Connect username in parenthesis allows to get more information - Matthew Grasmick - Miroslav Šustek (sustmi) - Pablo Díez (pablodip) - - Kev - Kevin McBride - Sergio Santoro + - Jonas Elfering - Philipp Rieber (bicpi) - Dmitriy Derepko - Manuel de Ruiter (manuel) @@ -804,7 +834,6 @@ The Symfony Connect username in parenthesis allows to get more information - nikos.sotiropoulos - BENOIT POLASZEK (bpolaszek) - Eduardo Oliveira (entering) - - kor3k kor3k (kor3k) - Oleksii Zhurbytskyi - Bilge - Anatoly Pashin (b1rdex) @@ -821,6 +850,7 @@ The Symfony Connect username in parenthesis allows to get more information - Jérôme Vieilledent (lolautruche) - Roman Anasal - Filip Procházka (fprochazka) + - Sergey Panteleev - Jeroen Thora (bolle) - Markus Lanthaler (lanthaler) - Gigino Chianese (sajito) @@ -837,9 +867,10 @@ The Symfony Connect username in parenthesis allows to get more information - Andrew Udvare (audvare) - siganushka (siganushka) - alexpods + - Quentin Schuler (sukei) - Adam Szaraniec - Dariusz Ruminski - - Pierre Ambroise (dotordu) + - Bahman Mehrdad (bahman) - Romain Gautier (mykiwi) - Matthieu Bontemps - Erik Trapman @@ -854,6 +885,7 @@ The Symfony Connect username in parenthesis allows to get more information - Fabrice Bernhard (fabriceb) - Matthijs van den Bos (matthijs) - Markus S. (staabm) + - PatNowak - Bhavinkumar Nakrani (bhavin4u) - Jaik Dean (jaikdean) - Krzysztof Piasecki (krzysztek) @@ -899,6 +931,7 @@ The Symfony Connect username in parenthesis allows to get more information - Daniel Tiringer - Lenar Lõhmus - Ilija Tovilo (ilijatovilo) + - Maxime Pinot (maximepinot) - Sander Toonen (xatoo) - Zach Badgett (zachbadgett) - Loïc Faugeron @@ -908,9 +941,7 @@ The Symfony Connect username in parenthesis allows to get more information - Markus Staab - Forfarle (forfarle) - Johnny Robeson (johnny) - - Shyim - Disquedur - - Benjamin Morel - Guilherme Ferreira - Geoffrey Tran (geoff) - Jannik Zschiesche @@ -926,12 +957,10 @@ The Symfony Connect username in parenthesis allows to get more information - Pierre-Emmanuel Tanguy (petanguy) - Julien Maulny - Gennadi Janzen - - Quentin Dequippe (qdequippe) - johan Vlaar - Paul Oms - James Hemery - wuchen90 - - PHAS Developer - Wouter van der Loop (toppy-hennie) - Ninos - julien57 @@ -949,7 +978,6 @@ The Symfony Connect username in parenthesis allows to get more information - Franck RANAIVO-HARISOA (franckranaivo) - Yi-Jyun Pan - Egor Taranov - - Andreas Hennings - Arnaud Frézet - Philippe Segatori - Jon Gotlin (jongotlin) @@ -975,12 +1003,12 @@ The Symfony Connect username in parenthesis allows to get more information - Noémi Salaün (noemi-salaun) - Sinan Eldem (sineld) - Gennady Telegin - - Yi-Jyun Pan + - Benedikt Lenzen (demigodcode) - ampaze - Alexandre Dupuy (satchette) - Michel Hunziker - Malte Blättermann - - Arnaud De Abreu (arnaud-deabreu) + - Ilya Levin (ilyachase) - Simeon Kolev (simeon_kolev9) - Joost van Driel (j92) - Jonas Elfering @@ -998,6 +1026,8 @@ The Symfony Connect username in parenthesis allows to get more information - Åsmund Garfors - Maxime Douailin - Jean Pasdeloup + - Maxime COLIN (maximecolin) + - Loïc Ovigne (oviglo) - Lorenzo Millucci (lmillucci) - Javier López (loalf) - Reinier Kip @@ -1025,7 +1055,6 @@ The Symfony Connect username in parenthesis allows to get more information - Rodrigo Aguilera - Vladimir Varlamov (iamvar) - Aurimas Niekis (gcds) - - Vincent Chalamon - Matthieu Calie (matth--) - Sem Schidler (xvilo) - Benjamin Schoch (bschoch) @@ -1039,10 +1068,8 @@ The Symfony Connect username in parenthesis allows to get more information - Pierrick VIGNAND (pierrick) - Alex Bogomazov (alebo) - aaa2000 (aaa2000) - - Andy Palmer (andyexeter) - Andrew Neil Forster (krciga22) - Stefan Warman (warmans) - - Faizan Akram Dar (faizanakram) - Tristan Maindron (tmaindron) - Behnoush Norouzali (behnoush) - Marko H. Tamminen (gzumba) @@ -1064,6 +1091,7 @@ The Symfony Connect username in parenthesis allows to get more information - Quentin de Longraye (quentinus95) - Chris Heng (gigablah) - Mickaël Buliard (mbuliard) + - Jan Nedbal - Cornel Cruceru (amne) - Richard Bradley - Jan Walther (janwalther) @@ -1077,6 +1105,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kevin SCHNEKENBURGER - Geordie - Fabien Salles (blacked) + - Tim Düsterhus - Andreas Erhard (andaris) - alexpozzi - Michael Devery (mickadoo) @@ -1088,6 +1117,7 @@ The Symfony Connect username in parenthesis allows to get more information - Luca Saba (lucasaba) - Sascha Grossenbacher (berdir) - Guillaume Aveline + - nathanpage - Robin Lehrmann - Szijarto Tamas - Thomas P @@ -1144,7 +1174,6 @@ The Symfony Connect username in parenthesis allows to get more information - Chris Jones (magikid) - Massimiliano Braglia (massimilianobraglia) - Thijs-jan Veldhuizen (tjveldhuizen) - - Petrisor Ciprian Daniel - Richard Quadling - James Hudson (mrthehud) - Raphaëll Roussel @@ -1156,7 +1185,6 @@ The Symfony Connect username in parenthesis allows to get more information - Aleksandr Volochnev (exelenz) - Robin van der Vleuten (robinvdvleuten) - Grinbergs Reinis (shima5) - - Klaus Silveira (klaussilveira) - Michael Piecko (michael.piecko) - Toni Peric (tperic) - yclian @@ -1176,7 +1204,6 @@ The Symfony Connect username in parenthesis allows to get more information - Gert de Pagter - Julien DIDIER (juliendidier) - Ворожцов Максим (myks92) - - Dalibor Karlović - Randy Geraads - Kevin van Sonsbeek (kevin_van_sonsbeek) - Simo Heinonen (simoheinonen) @@ -1191,6 +1218,7 @@ The Symfony Connect username in parenthesis allows to get more infor 10000 mation - Arun Philip - Pascal Helfenstein - Jesper Skytte (greew) + - NanoSector - Petar Obradović - Baldur Rensch (brensch) - Carl Casbolt (carlcasbolt) @@ -1208,8 +1236,8 @@ The Symfony Connect username in parenthesis allows to get more information - Travis Carden (traviscarden) - mfettig - Besnik Br - - Issam Raouf (iraouf) - Simon Mönch + - Valmonzo - Sherin Bloemendaal - Jose Gonzalez - Jonathan (jlslew) @@ -1217,6 +1245,7 @@ The Symfony Connect username in parenthesis allows to get more information - aegypius - Ilia (aliance) - Christian Stoller (naitsirch) + - COMBROUSE Dimitri - Dave Marshall (davedevelopment) - Jakub Kulhan (jakubkulhan) - Paweł Niedzielski (steveb) @@ -1241,9 +1270,9 @@ The Symfony Connect username in parenthesis allows to get more information - Thorry84 - Romanavr - michaelwilliams - - Raphaël Geffroy (raphael-geffroy) - Alexandre Parent - 1emming + - Eric Abouaf (neyric) - Nykopol (nykopol) - Thibault Richard (t-richard) - Jordan Deitch @@ -1262,10 +1291,10 @@ The Symfony Connect username in parenthesis allows to get more information - shubhalgupta - Felds Liscia (felds) - Benjamin Lebon - - Sergey Panteleev - Alexander Grimalovsky (flying) - Andrew Hilobok (hilobok) - Noah Heck (myesain) + - Sébastien JEAN (sebastien76) - Christian Soronellas (theunic) - Max Baldanza - Volodymyr Panivko @@ -1280,6 +1309,7 @@ The Symfony Connect username in parenthesis allows to get more information - izzyp - Jeroen Fiege (fieg) - Martin (meckhardt) + - Wu (wu-agriconomie) - Marcel Hernandez - Evan C - buffcode @@ -1295,6 +1325,7 @@ The Symfony Connect username in parenthesis allows to get more information - _sir_kane (waly) - Olivier Maisonneuve - Gálik Pál + - Bálint Szekeres - Andrei C. (moldman) - Mike Meier (mykon) - Pedro Miguel Maymone de Resende (pedroresende) @@ -1306,6 +1337,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kagan Balga (kagan-balga) - Nikita Nefedov (nikita2206) - Alex Bacart + - StefanoTarditi - cgonzalez - hugovms - Ben @@ -1324,12 +1356,10 @@ The Symfony Connect username in parenthesis allows to get more information - James Michael DuPont - Tinjo Schöni - Carlos Buenosvinos (carlosbuenosvinos) - - Christian Gripp (core23) - Jake (jakesoft) - Rustam Bakeev (nommyde) - Vincent CHALAMON - Ivan Kurnosov - - Bahman Mehrdad (bahman) - Christopher Hall (mythmakr) - Patrick Dawkins (pjcdawkins) - Paul Kamer (pkamer) @@ -1342,6 +1372,7 @@ The Symfony Connect username in parenthesis allows to get more information - Francisco Alvarez (sormes) - Martin Parsiegla (spea) - Maxim Tugaev (tugmaks) + - ywisax - Manuel Alejandro Paz Cetina - Denis Charrier (brucewouaigne) - Youssef Benhssaien (moghreb) @@ -1352,7 +1383,6 @@ The Symfony Connect username in parenthesis allows to get more information - Pierre Vanliefland (pvanliefland) - Roy Klutman (royklutman) - Sofiane HADDAG (sofhad) - - Quentin Schuler (sukei) - Antoine M - frost-nzcr4 - Shahriar56 @@ -1362,6 +1392,7 @@ The Symfony Connect username in parenthesis allows to get more information - Oriol Viñals - arai - Achilles Kaloeridis (achilles) + - Sébastien Despont (bouillou) - Laurent Bassin (lbassin) - Mouad ZIANI (mouadziani) - Tomasz Ignatiuk @@ -1394,6 +1425,7 @@ The Symfony Connect username in parenthesis allows to get more information - Johnny Peck (johnnypeck) - Jordi Sala Morales (jsala) - Sander De la Marche (sanderdlm) + - skmedix (skmedix) - Loic Chardonnet - Ivan Menshykov - David Romaní @@ -1418,6 +1450,7 @@ The Symfony Connect username in parenthesis allows to get more information - Jason Woods - mwsaz - bogdan + - wanxiangchwng - Geert De Deckere - grizlik - Derek ROTH @@ -1432,7 +1465,6 @@ The Symfony Connect username in parenthesis allows to get more information - Dmytro Boiko (eagle) - Shin Ohno (ganchiku) - Matthieu Mota (matthieumota) - - Maxime Pinot (maximepinot) - Jean-Baptiste GOMOND (mjbgo) - Jakub Podhorsky (podhy) - abdul malik ikhsan (samsonasik) @@ -1447,7 +1479,6 @@ The Symfony Connect username in parenthesis allows to get more information - Morten Wulff (wulff) - Kieran - Don Pinkster - - Jonas Elfering - Maksim Muruev - Emil Einarsson - 243083df @@ -1466,7 +1497,6 @@ The Symfony Connect username in parenthesis allows to get more information - Johnson Page (jwpage) - Kuba Werłos (kuba) - Ruben Gonzalez (rubenruateltek) - - Mokhtar Tlili (sf-djuba) - Michael Roterman (wtfzdotnet) - Philipp Keck - Pavol Tuka @@ -1482,6 +1512,7 @@ The Symfony Connect username in parenthesis allows to get more information - Dominik Ulrich - den - Gábor Tóth + - Bastien THOMAS - ouardisoft - Daniel Cestari - Matt Janssen @@ -1509,7 +1540,9 @@ The Symfony Connect username in parenthesis allows to get more information - Rootie - Sébastien Santoro (dereckson) - Daniel Alejandro Castro Arellano (lexcast) + - Jiří Bok - Vincent Chalamon + - Farhad Hedayatifard - Alan ZARLI - Thomas Jarrand - Baptiste Leduc (bleduc) @@ -1530,8 +1563,10 @@ The Symfony Connect username in parenthesis allows to get more information - Guillaume Gammelin - Valérian Galliat - Sorin Pop (sorinpop) + - Elías Fernández - d-ph - Stewart Malik + - Frank Schulze (xit) - Renan Taranto (renan-taranto) - Ninos Ego - Samael tomas @@ -1573,10 +1608,12 @@ The Symfony Connect username in parenthesis allows to get more information - Jérôme Nadaud (jnadaud) - Frank Naegler - Sam Malone + - Damien Fernandes - Ha Phan (haphan) - Chris Jones (leek) - neghmurken - stefan.r + - Florian Cellier - xaav - Jean-Christophe Cuvelier [Artack] - Mahmoud Mostafa (mahmoud) @@ -1600,7 +1637,6 @@ The Symfony Connect username in parenthesis allows to get more information - Grégoire Hébert (gregoirehebert) - Franz Wilding (killerpoke) - Ferenczi Krisztian (fchris82) - - Ioan Ovidiu Enache (ionutenache) - Artyum Petrov - Oleg Golovakhin (doc_tr) - Guillaume Smolders (guillaumesmo) @@ -1617,6 +1653,7 @@ The Symfony Connect username in parenthesis allows to get more information - Michael H. Arieli - Miloš Milutinović - Jitendra Adhikari (adhocore) + - Kevin Jansen - Nicolas Martin (cocorambo) - Tom Panier (neemzy) - Fred Cox @@ -1624,6 +1661,7 @@ The Symfony Connect username in parenthesis allows to get more information - Luciano Mammino (loige) - LHommet Nicolas (nicolaslh) - fabios + - eRIZ - Sander Coolen (scoolen) - Vic D'Elfant (vicdelfant) - Amirreza Shafaat (amirrezashafaat) @@ -1631,6 +1669,7 @@ The Symfony Connect username in parenthesis allows to get more information - Adoni Pavlakis (adoni) - Nicolas Le Goff (nlegoff) - Maarten Nusteling (nusje2000) + - Peter van Dommelen - Anne-Sophie Bachelard - Gordienko Vladislav - Ahmed EBEN HASSINE (famas23) @@ -1639,12 +1678,13 @@ The Symfony Connect username in parenthesis allows to get more information - Chris de Kok - Eduard Bulava (nonanerz) - Andreas Kleemann (andesk) - - Ilya Levin (ilyachase) - Hubert Moreau (hmoreau) - Nicolas Appriou + - Silas Joisten (silasjoisten) - Igor Timoshenko (igor.timoshenko) - Pierre-Emmanuel CAPEL - Manuele Menozzi + - Yevhen Sidelnyk - “teerasak” - Anton Babenko (antonbabenko) - Irmantas Šiupšinskas (irmantas) @@ -1657,7 +1697,6 @@ The Symfony Connect username in parenthesis allows to get more information - Nicolas Valverde - Konstantin S. M. Möllers (ksmmoellers) - Ken Stanley - - Raffaele Carelle - ivan - Zachary Tong (polyfractal) - linh @@ -1674,6 +1713,7 @@ The Symfony Connect username in parenthesis allows to get more information - hamza - dantleech - Kajetan Kołtuniak (kajtii) + - Dan (dantleech) - Sander Goossens (sandergo90) - Rudy Onfroy - Tero Alén (tero) @@ -1690,6 +1730,7 @@ The Symfony Connect username in parenthesis allows to get more information - Abdiel Carrazana (abdielcs) - joris - Vadim Tyukov (vatson) + - alanzarli - Arman - Gabi Udrescu - Adamo Crespi (aerendir) @@ -1713,6 +1754,7 @@ The Symfony Connect username in parenthesis allows to get more information - Ondřej Frei - Bruno Rodrigues de Araujo (brunosinister) - Máximo Cuadros (mcuadros) + - Arkalo2 - Jacek Wilczyński (jacekwilczynski) - Christoph Kappestein - Camille Baronnet @@ -1743,11 +1785,13 @@ The Symfony Connect username in parenthesis allows to get more information - Asil Barkin Elik (asilelik) - Bhujagendra Ishaya - Guido Donnari + - Jérôme Dumas - Mert Simsek (mrtsmsk0) - Lin Clark - Christophe Meneses (c77men) - Jeremy David (jeremy.david) - Andrei O + - gr8b - Michał Marcin Brzuchalski (brzuchal) - Jordi Rejas - Troy McCabe @@ -1779,12 +1823,16 @@ The Symfony Connect username in parenthesis allows to get more information - Evgeny Anisiforov - otsch - TristanPouliquen + - Dominic Luidold - Piotr Antosik (antek88) - Nacho Martin (nacmartin) + - Thomas Bibaut - Thibaut Chieux - mwos + - Aydin Hassan - Volker Killesreiter (ol0lll) - Vedran Mihočinec (v-m-i) + - Rafał Treffler - Sergey Novikov (s12v) - creiner - Jan Pintr @@ -1819,11 +1867,13 @@ The Symfony Connect username in parenthesis allows to get more information - Philipp Fritsche - Léon Gersen - tarlepp + - Giuseppe Arcuti - Dustin Wilson - Benjamin Paap (benjaminpaap) - Claus Due (namelesscoder) - Christian - Alexandru Patranescu + - Sébastien Lévêque (legenyes) - ju1ius - Denis Golubovskiy (bukashk0zzz) - Arkadiusz Rzadkowolski (flies) @@ -1833,7 +1883,6 @@ The Symfony Connect username in parenthesis allows to get more information - Mikkel Paulson - Michał Strzelecki - Bert Ramakers - - Hans Mackowiak - Hugo Fonseca (fonsecas72) - Marc Duboc (icemad) - uncaught @@ -1873,6 +1922,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kamil Musial - Lucas Bustamante - Olaf Klischat + - Andrii - orlovv - Claude Dioudonnat - Jonathan Hedstrom @@ -1918,11 +1968,14 @@ The Symfony Connect username in parenthesis allows to get more information - Joas Schilling - Ener-Getick - Markus Thielen + - Peter Trebaticky - Moza Bogdan (bogdan_moza) - Viacheslav Sychov + - Zuruuh - Nicolas Sauveur (baishu) - Helmut Hummel (helhum) - Matt Brunt + - David Vancl - Carlos Ortega Huetos - Péter Buri (burci) - Evgeny Efimov (edefimov) @@ -1942,7 +1995,6 @@ The Symfony Connect username in parenthesis allows to get more information - Oleg Sedinkin (akeylimepie) - Jérémy Jourdin (jjk801) - BRAMILLE Sébastien (oktapodia) - - Loïc Ovigne (oviglo) - Artem Kolesnikov (tyomo4ka) - Markkus Millend - Clément @@ -1958,14 +2010,20 @@ The Symfony Connect username in parenthesis allows to get more information - rchoquet - v.shevelev - rvoisin + - Dan Brown - gitlost - Taras Girnyk + - Simon Mönch + - Barthold Bos - cthulhu - Andoni Larzabal (andonilarz) + - Wolfgang Klinger (wolfgangklingerplan2net) + - Staormin - Dmitry Derepko - Rémi Leclerc - Jan Vernarsky - Ionut Cioflan + - John Edmerson Pizarra - Sergio - Jonas Hünig - Mehrdad @@ -1973,6 +2031,7 @@ The Symfony Connect username in parenthesis allows to get more information - Eduardo García Sanz (coma) - Arend Hummeling - Makdessi Alex + - Dmitrii Baranov - fduch (fduch) - Juan Miguel Besada Vidal (soutlink) - Takashi Kanemoto (ttskch) @@ -2034,6 +2093,7 @@ The Symfony Connect username in parenthesis allows to get more information - Vladimir Mantulo (mantulo) - Boullé William (williamboulle) - Jesper Noordsij + - Bart Baaten - Frederic Godfrin - Paul Matthews - aim8604 @@ -2068,6 +2128,7 @@ The Symfony Connect username in parenthesis allows to get more information - Dalibor Karlović - Cesar Scur (cesarscur) - Cyril Vermandé (cyve) + - Daniele Orru' (danydev) - Raul Garcia Canet (juagarc4) - Sagrario Meneses - Dmitri Petmanson @@ -2086,7 +2147,9 @@ The Symfony Connect username in parenthesis allows to get more information - martkop26 - Raphaël Davaillaud - Sander Hagen + - Alexander Menk - cilefen (cilefen) + - Prasetyo Wicaksono (jowy) - Mo Di (modi) - Victor Truhanovich (victor_truhanovich) - Pablo Schläpfer @@ -2134,10 +2197,12 @@ The Symfony Connect username in parenthesis allows to get more information - Tim Ward - Adiel Cristo (arcristo) - Christian Flach (cmfcmf) + - Dennis Jaschinski (d.jaschinski) - Fabian Kropfhamer (fabiank) - Jeffrey Cafferata (jcidnl) - Junaid Farooq (junaidfarooq) - Lars Ambrosius Wallenborn (larsborn) + - Pavel Starosek (octisher) - Oriol Mangas Abellan (oriolman) - Sebastian Göttschkes (sgoettschkes) - Marcin Nowak @@ -2147,6 +2212,7 @@ The Symfony Connect username in parenthesis allows to get more information - omniError - Zander Baldwin - László GÖRÖG + - djordy - Kévin Gomez (kevin) - Mihai Nica (redecs) - Andrei Igna @@ -2161,6 +2227,7 @@ The Symfony Connect username in parenthesis allows to get more information - Maxime THIRY - Norman Soetbeer - Ludek Stepan + - Benjamin BOUDIER - Frederik Schwan - Mark van den Berg - Aaron Stephens (astephens) @@ -2191,6 +2258,7 @@ The Symfony Connect username in parenthesis allows to get more information - Harald Tollefsen - PabloKowalczyk - Matthieu + - ZiYao54 - Arend-Jan Tetteroo - Albin Kerouaton - Sébastien HOUZÉ @@ -2199,6 +2267,7 @@ The Symfony Connect username in parenthesis allows to get more information - wivaku - Markus Reinhold - Jingyu Wang + - es - steveYeah - Asrorbek (asrorbek) - Samy D (dinduks) @@ -2213,6 +2282,7 @@ The Symfony Connect username in parenthesis allows to get more information - Alan Scott - Juanmi Rodriguez Cerón - twifty + - David Szkiba - Andy Raines - François Poguet - Anthony Ferrara @@ -2231,6 +2301,7 @@ The Symfony Connect username in parenthesis allows to get more information - xdavidwu - Benjamin RICHARD - Raphaël Droz + - Vladimir Pakhomchik - pdommelen - Eric Stern - ShiraNai7 @@ -2248,8 +2319,9 @@ The Symfony Connect username in parenthesis allows to get more information - Ilya Chekalsky - Ostrzyciel - George Giannoulopoulos + - Thibault G - Alexander Pasichnik (alex_brizzz) - - Florian Merle (florian-merle) + - Felix Eymonot (hyanda) - Luis Ramirez (luisdeimos) - Ilia Sergunin (maranqz) - Daniel Richter (richtermeister) @@ -2260,6 +2332,7 @@ The Symfony Connect username in parenthesis allows to get more information - Willem Verspyck - Kim Laï Trinh - Johan de Ruijter + - InbarAbraham - Jason Desrosiers - m.chwedziak - marbul @@ -2276,7 +2349,9 @@ The Symfony Connect username in parenthesis allows to get more information - Frank Neff (fneff) - Volodymyr Kupriienko (greeflas) - Ilya Biryukov (ibiryukov) + - Mathieu Ledru (matyo91) - Roma (memphys) + - Jozef Môstka (mostkaj) - Florian Caron (shalalalala) - Serhiy Lunak (slunak) - Wojciech Błoszyk (wbloszyk) @@ -2305,6 +2380,7 @@ The Symfony Connect username in parenthesis allows to get more information - Tom Corrigan (tomcorrigan) - Luis Galeas - Bogdan Scordaliu + - Sven Scholz - Martin Pärtel - Daniel Rotter (danrot) - Frédéric Bouchery (fbouchery) @@ -2313,6 +2389,7 @@ The Symfony Connect username in parenthesis allows to get more information - Phillip Look (plook) - Foxprodev - Artfaith + - Tom Kaminski - developer-av - Max Summe - Ema Panz @@ -2374,6 +2451,8 @@ The Symfony Connect username in parenthesis allows to get more information - Ivan Tse - René Kerner - Nathaniel Catchpole + - Jontsa + - Igor Plantaš - upchuk - Adrien Samson (adriensamson) - Samuel Gordalina (gordalina) @@ -2381,7 +2460,6 @@ The Symfony Connect username in parenthesis allows to get more information - Nicolas Eeckeloo (neeckeloo) - Andriy Prokopenko (sleepyboy) - Dariusz Ruminski - - Bálint Szekeres - Starfox64 - Ivo Valchev - Thomas Hanke @@ -2392,8 +2470,10 @@ The Symfony Connect username in parenthesis allows to get more information - Wickex - tuqqu - Wojciech Gorczyca + - Ahmad Al-Naib - Neagu Cristian-Doru (cristian-neagu) - Mathieu Morlon (glutamatt) + - NIRAV MUKUNDBHAI PATEL (niravpatel919) - Owen Gray (otis) - Rafał Muszyński (rafmus90) - Sébastien Decrême (sebdec) @@ -2420,6 +2500,7 @@ The Symfony Connect username in parenthesis allows to get more information - Serhii Smirnov - Robert Queck - Peter Bouwdewijn + - Kurt Thiemann - Martins Eglitis - Daniil Gentili - Eduard Morcinek @@ -2428,6 +2509,7 @@ The Symfony Connect username in parenthesis allows to get more information - Matěj Humpál - Kasper Hansen - Nico Hiort af Ornäs + - Eddy - Amine Matmati - Kristen Gilden - caalholm @@ -2477,21 +2559,26 @@ The Symfony Connect username in parenthesis allows to get more information - Thomas Ploch - Victor Prudhomme - Simon Neidhold + - Wouter Ras + - Gil Hadad - Valentin VALCIU - Jeremiah VALERIE - Alexandre Beaujour - Franck Ranaivo-Harisoa + - Grégoire Rabasse - Cas van Dongen - Patrik Patie Gmitter - George Yiannoulopoulos - Yannick Snobbert - Kevin Dew - James Cowgill + - Žan V. Dragan - sensio - Julien Menth (cfjulien) - Lyubomir Grozdanov (lubo13) - Nicolas Schwartz (nicoschwartz) - Tim Jabs (rubinum) + - Schvoy Norbert (schvoy) - Stéphane Seng (stephaneseng) - Peter Schultz - Robert Korulczyk @@ -2499,6 +2586,7 @@ The Symfony Connect username in parenthesis allows to get more information - Benhssaein Youssef - Benoit Leveque - bill moll + - chillbram - Benjamin Bender - PaoRuby - Holger Lösken @@ -2544,6 +2632,7 @@ The Symfony Connect username in parenthesis allows to get more information - Thomas Beaujean - alireza - Michael Bessolov + - sauliusnord - Zdeněk Drahoš - Dan Harper - moldcraft @@ -2560,6 +2649,7 @@ The Symfony Connect username in parenthesis allows to get more information - Tobias Genberg (lorceroth) - Michael Simonson (mikes) - Nicolas Badey (nico-b) + - Florent Blaison (orkin) - Olivier Scherler (oscherler) - Flo Gleixner (redflo) - Romain Jacquart (romainjacquart) @@ -2588,7 +2678,9 @@ The Symfony Connect username in parenthesis allows to get more information - Tiago Garcia (tiagojsag) - Artiom - Jakub Simon + - TheMhv - Eviljeks + - Juliano Petronetto - robin.de.croock - Brandon Antonio Lorenzo - Bouke Haarsma @@ -2597,13 +2689,15 @@ The Symfony Connect username in parenthesis allows to get more information - Radosław Kowalewski - Enrico Schultz - tpetry + - Nikita Sklyarov - JustDylan23 - Juraj Surman - - ywisax - Martin Eckhardt - natechicago + - DaikiOnodera - Victor - Andreas Allacher + - Abdelilah Jabri - Alexis - Leonid Terentyev - Sergei Gorjunov @@ -2618,9 +2712,11 @@ The Symfony Connect username in parenthesis allows to get more information - Anton Sukhachev (mrsuh) - Pavlo Pelekh (pelekh) - Stefan Kleff (stefanxl) + - RichardGuilland - Marcel Siegert - ryunosuke - Bruno BOUTAREL + - Athorcis - John Stevenson - everyx - Richard Heine @@ -2678,10 +2774,12 @@ The Symfony Connect username in parenthesis allows to get more information - Abdouarrahmane FOUAD (fabdouarrahmane) - Jakub Janata (janatjak) - Jm Aribau (jmaribau) + - Maciej Paprocki (maciekpaprocki) - Matthew Foster (mfoster) - Paul Seiffert (seiffert) - Vasily Khayrulin (sirian) - Stas Soroka (stasyan) + - Thomas Dubuffet (thomasdubuffet) - Stefan Hüsges (tronsha) - Jake Bishop (yakobeyak) - Dan Blows @@ -2696,6 +2794,7 @@ The Symfony Connect username in parenthesis allows to get more information - Andrew Coulton - Ulugbek Miniyarov - Jeremy Benoist + - Antoine Beyet - Michal Gebauer - René Landgrebe - Phil Davis @@ -2746,6 +2845,7 @@ The Symfony Connect username in parenthesis allows to get more information - botbotbot - tatankat - Cláudio Cesar + - Sven Nolting - Timon van der Vorm - nuncanada - Thierry Marianne @@ -2775,16 +2875,17 @@ The Symfony Connect username in parenthesis allows to get more information - Botond Dani (picur) - Rémi Faivre (rfv) - Radek Wionczek (rwionczek) + - tinect (tinect) - Nick Stemerdink - Bernhard Rusch - David Stone - Vincent Bouzeran + - fabi - Grayson Koonce - Ruben Jansen - Wissame MEKHILEF - Mihai Stancu - shreypuranik - - NanoSector - Thibaut Salanon - Romain Dorgueil - Christopher Parotat @@ -2870,6 +2971,7 @@ The Symfony Connect username in parenthesis allows to get more information - Yasmany Cubela Medina (bitgandtter) - Michał Dąbrowski (defrag) - Aryel Tupinamba (dfkimera) + - Elías (eliasfernandez) - Hans Höchtl (hhoechtl) - Simone Fumagalli (hpatoio) - Brian Graham (incognito) @@ -2892,6 +2994,7 @@ The Symfony Connect username in parenthesis allows to get more information - Artem Lopata (bumz) - Soha Jin - alex + - Alex Niedre - evgkord - Roman Orlov - Simon Ackermann @@ -2917,7 +3020,6 @@ The Symfony Connect username in parenthesis allows to get more information - Julien Moulin (lizjulien) - Raito Akehanareru (raito) - Mauro Foti (skler) - - skmedix (skmedix) - Thibaut Arnoud (thibautarnoud) - Valmont Pehaut-Pietri (valmonzo) - Yannick Warnier (ywarnier) @@ -2957,6 +3059,7 @@ The Symfony Connect username in parenthesis allows to get more information - Viet Pham - Alan Bondarchuk - Pchol + - Benjamin Ellis - Shamimul Alam - Cyril HERRERA - dropfen @@ -2988,6 +3091,7 @@ The Symfony Connect username in parenthesis allows to get more information - Cyrille Bourgois (cyrilleb) - Damien Vauchel (damien_vauchel) - Dmitrii Fedorenko (dmifedorenko) + - William Pinaud (docfx) - Frédéric G. Marand (fgm) - Freek Van der Herten (freekmurze) - Luca Genuzio (genuzio) @@ -3018,6 +3122,7 @@ The Symfony Connect username in parenthesis allows to get more information - Darryl Hein (xmmedia) - Vladimir Sadicov (xtech) - Marcel Berteler + - Ruud Seberechts - sdkawata - Frederik Schmitt - Peter van Dommelen @@ -3055,6 +3160,7 @@ The Symfony Connect username in parenthesis allows to get more information - Pierre Rineau - Florian Morello - Maxim Lovchikov + - ivelin vasilev - adenkejawen - Florent SEVESTRE (aniki-taicho) - Ari Pringle (apringle) @@ -3073,6 +3179,7 @@ The Symfony Connect username in parenthesis allows to get more information - Ashura - Götz Gottwald - Alessandra Lai + - timesince - alangvazq - Christoph Krapp - Ernest Hymel @@ -3154,6 +3261,7 @@ The Symfony Connect username in parenthesis allows to get more information - dakur - florian-michael-mast - tourze + - Dario Guarracino - sam-bee - Vlad Dumitrache - wetternest @@ -3199,6 +3307,7 @@ The Symfony Connect username in parenthesis allows to get more information - Rosio (ben-rosio) - Simon Paarlberg (blamh) - Masao Maeda (brtriver) + - Alexander Dmitryuk (coden1) - Valery Maslov (coderberg) - Damien Harper (damien.harper) - Darius Leskauskas (darles) @@ -3209,6 +3318,7 @@ The Symfony Connect username in parenthesis allows to get more information - Dominik Hajduk (dominikalp) - Tomáš Polívka (draczris) - Dennis Smink (dsmink) + - Duncan de Boer (farmer-duck) - Franz Liedke (franzliedke) - Gaylord Poillon (gaylord_p) - gondo (gondo) @@ -3216,6 +3326,7 @@ The Symfony Connect username in parenthesis allows to get more information - Grummfy (grummfy) - Hadrien Cren (hcren) - Gusakov Nikita (hell0w0rd) + - Halil Hakan Karabay (hhkrby) - Oz (import) - Jaap van Otterdijk (jaapio) - Javier Núñez Berrocoso (javiernuber) @@ -3226,6 +3337,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kevin Verschaeve (keversc) - Kevin Herrera (kherge) - Kubicki Kamil (kubik) + - Lauris Binde (laurisb) - Luis Ramón López López (lrlopez) - Vladislav Nikolayev (luxemate) - Martin Mandl (m2mtech) @@ -3250,7 +3362,6 @@ The Symfony Connect username in parenthesis allows to get more information - Jimmy Leger (redpanda) - Ronny López (ronnylt) - Julius (sakalys) - - Sébastien JEAN (sebastien76) - Dmitry (staratel) - Marcin Szepczynski (szepczynski) - Tito Miguel Costa (titomiguelcosta) @@ -3265,11 +3376,13 @@ The Symfony Connect username in parenthesis allows to get more information - Pavel Barton - Exploit.cz - GuillaumeVerdon + - Dmitry Danilson - Marien Fressinaud - ureimers - akimsko - Youpie - Jason Stephens + - Korvin Szanto - srsbiz - Taylan Kasap - Michael Orlitzky @@ -3300,8 +3413,10 @@ The Symfony Connect username in parenthesis allows to get more information - Evgeniy Koval - Lars Moelleken - dasmfm + - Karel Syrový - Claas Augner - Mathias Geat + - neodevcode - Angel Fernando Quiroz Campos (angelfqc) - Arnaud Buathier (arnapou) - Curtis (ccorliss) @@ -3347,9 +3462,12 @@ The Symfony Connect username in parenthesis allows to get more information - jersoe - Brian Debuire - Eric Grimois + - Christian Schiffler - Piers Warmers - Sylvain Lorinet + - Pavol Tuka - klyk50 + - Colin Michoudet - jc - BenjaminBeck - Aurelijus Rožėnas @@ -3379,6 +3497,7 @@ The Symfony Connect username in parenthesis allows to get more information - Philipp - lol768 - jamogon + - Tom Hart - Vyacheslav Slinko - Benjamin Laugueux - guangwu @@ -3393,6 +3512,7 @@ The Symfony Connect username in parenthesis allows to get more information - Menno Holtkamp - Ser5 - Michael Hudson-Doyle + - Matthew Burns - Daniel Bannert - Karim Miladi - Michael Genereux @@ -3430,6 +3550,7 @@ The Symfony Connect username in parenthesis allows to get more information - brian978 - Michael Schneider - n-aleha + - Richard Čepas - Talha Zekeriya Durmuş - Anatol Belski - Javier @@ -3438,6 +3559,7 @@ The Symfony Connect username in parenthesis allows to get more information - Kaipi Yann - wiseguy1394 - adam-mospan + - AUDUL - Steve Hyde - AbdelatifAitBara - nerdgod @@ -3473,6 +3595,7 @@ The Symfony Connect username in parenthesis allows to get more information - mieszko4 - Steve Preston - ibasaw + - koyolgecen - Wojciech Skorodecki - Kevin Frantz - Neophy7e @@ -3482,7 +3605,6 @@ The Symfony Connect username in parenthesis allows to get more information - andrey-tech - David Ronchaud - Chris McGehee - - Bastien THOMAS - Shaun Simmons - Pierre-Louis LAUNAY - Arseny Razin @@ -3503,6 +3625,7 @@ The Symfony Connect username in parenthesis allows to get more information - satalaondrej - Matthias Dötsch - jonmldr + - Nowfel2501 - Yevgen Kovalienia - Lebnik - Shude @@ -3517,12 +3640,14 @@ The Symfony Connect username in parenthesis allows to get more information - Thorsten Hallwas - Brian Freytag - Arend Hummeling + - Joseph FRANCLIN - Marco Pfeiffer - Alex Nostadt - Michael Squires - Egor Gorbachev - Julian Krzefski - Derek Stephen McLean + - PatrickRedStar - Norman Soetbeer - zorn - Yuriy Potemkin @@ -3562,8 +3687,11 @@ The Symfony Connect username in parenthesis allows to get more information - Michal Čihař - parhs - Harry Wiseman + - Emilien Escalle + - jwaguet - Diego Campoy - Oncle Tom + - Roland Franssen :) - Sam Anthony - Christian Stocker - Oussama Elgoumri @@ -3590,18 +3718,19 @@ The Symfony Connect username in parenthesis allows to get more information - Sean Templeton - Willem Mouwen - db306 + - Bohdan Pliachenko - Dr. Gianluigi "Zane" Zanettini - Michaël VEROUX - Julia - Lin Lu - arduanov - - Valmonzo - sualko - Marc Bennewitz - Fabien - Martin Komischke - Yendric - ADmad + - Hugo Posnic - Nicolas Roudaire - Marc Jauvin - Matthias Meyer @@ -3624,11 +3753,11 @@ The Symfony Connect username in parenthesis allows to get more information - Bernd Matzner (bmatzner) - Vladimir Vasilev (bobahvas) - Anton (bonio) - - Sébastien Despont (bouillou) - Bram Tweedegolf (bram_tweedegolf) - Brandon Kelly (brandonkelly) - Choong Wei Tjeng (choonge) - Bermon Clément (chou666) + - Chris Shennan (chrisshennan) - Citia (citia) - Kousuke Ebihara (co3k) - Loïc Vernet (coil) @@ -3661,6 +3790,7 @@ The Symfony Connect username in parenthesis allows to get more information - Peter Orosz (ill_logical) - Ilia Lazarev (ilzrv) - Imangazaliev Muhammad (imangazaliev) + - wesign (inscrutable01) - Arkadiusz Kondas (itcraftsmanpl) - j0k (j0k) - joris de wit (jdewit) @@ -3734,6 +3864,7 @@ The Symfony Connect username in parenthesis allows to get more information - Julien Sanchez (sumbobyboys) - Ron Gähler (t-ronx) - Guillermo Gisinger (t3chn0r) + - Tomáš Korec (tomkorec) - Tom Newby (tomnewbyau) - Andrew Clark (tqt_andrew_clark) - Aaron Piotrowski (trowski) @@ -3771,9 +3902,11 @@ The Symfony Connect username in parenthesis allows to get more information - damaya - Kevin Weber - Alexandru Năstase + - Carl Julian Sauter - Dionysis Arvanitis - Sergey Fedotov - Konstantin Scheumann + - Josef Hlavatý - Michael - fh-github@fholzhauer.de - rogamoore @@ -3787,6 +3920,7 @@ The Symfony Connect username in parenthesis allows to get more information - Romain - Xavier REN - Kevin Meijer + - Ignacio Alveal - max - Alexander Bauer (abauer) - Ahmad Mayahi (ahmadmayahi) @@ -3801,7 +3935,6 @@ The Symfony Connect username in parenthesis allows to get more information - Courcier Marvin (helyakin) - Henne Van Och (hennevo) - Jeroen De Dauw (jeroendedauw) - - Maxime COLIN (maximecolin) - Muharrem Demirci (mdemirci) - Evgeny Z (meze) - Aleksandar Dimitrov (netbull) diff --git a/README.md b/README.md index ecac2d733dd13..d63c544916613 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,14 @@ Installation Sponsor ------- -Symfony 7.1 is [backed][27] by -- [Rector][29] -- [JoliCode][30] -- [Les-Tilleuls.coop][31] +Symfony 7.2 is [backed][27] by +- [Sulu][29] +- [Rector][30] + +**Sulu** is the CMS for Symfony developers. It provides pre-built content-management +features while giving developers the freedom to build, deploy, and maintain custom +solutions using full-stack Symfony. Sulu is ideal for creating complex websites, +integrating external tools, and building custom-built solutions. **Rector** helps successful and growing companies to get the most of the code they already have. Including upgrading to the latest Symfony LTS. They deliver @@ -28,15 +32,6 @@ automated refactoring, reduce maintenance costs, speed up feature delivery, and transform legacy code into a strategic asset. They can handle the dirty work, so you can focus on the features. -**JoliCode** is a team of passionate developers and open-source lovers, with a -strong expertise in PHP & Symfony technologies. They can help you build your -projects using state-of-the-art practices. - -**Les-Tilleuls.coop** is a team of 70+ Symfony experts who can help you design, develop and -fix your projects. They provide a wide range of professional services including development, -consulting, coaching, training and audits. They also are highly skilled in JS, Go and DevOps. -They are a worker cooperative! - Help Symfony by [sponsoring][28] its development! Documentation @@ -101,6 +96,5 @@ and supported by [Symfony contributors][19]. [26]: https://symfony.com/book [27]: https://symfony.com/backers [28]: https://symfony.com/sponsor -[29]: https://getrector.com -[30]: https://jolicode.com -[31]: https://les-tilleuls.coop +[29]: https://sulu.io +[30]: https://getrector.com diff --git a/composer.json b/composer.json index 49162a3b81f8a..0f9b274fd697c 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "composer/semver": "^3.0", "ext-xml": "*", "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^3.1|^4", "twig/twig": "^3.12", "psr/cache": "^2.0|^3.0", "psr/clock": "^1.0", diff --git a/phpunit b/phpunit index 94baca39735ba..dafe2953a0aa6 100755 --- a/phpunit +++ b/phpunit @@ -1,10 +1,6 @@ #!/usr/bin/env php diff --git a/src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php b/src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php index e4831557f01db..8e10891b0ba74 100644 --- a/src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php +++ b/src/Symfony/Bridge/Doctrine/Messenger/DoctrineTransactionMiddleware.php @@ -27,15 +27,17 @@ class DoctrineTransactionMiddleware extends AbstractDoctrineMiddleware protected function handleForManager(EntityManagerInterface $entityManager, Envelope $envelope, StackInterface $stack): Envelope { $entityManager->getConnection()->beginTransaction(); + + $success = false; try { $envelope = $stack->next()->handle($envelope, $stack); $entityManager->flush(); $entityManager->getConnection()->commit(); + $success = true; + return $envelope; } catch (\Throwable $exception) { - $entityManager->getConnection()->rollBack(); - if ($exception instanceof HandlerFailedException) { // Remove all HandledStamp from the envelope so the retry will execute all handlers again. // When a handler fails, the queries of allegedly successful previous handlers just got rolled back. @@ -43,6 +45,12 @@ protected function handleForManager(EntityManagerInterface $entityManager, Envel } throw $exception; + } finally { + $connection = $entityManager->getConnection(); + + if (!$success && $connection->isTransactionActive()) { + $connection->rollBack(); + } } } } diff --git a/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php b/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php index 6f3410313d00a..cfe07b37da493 100644 --- a/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php +++ b/src/Symfony/Bridge/Doctrine/SchemaListener/AbstractSchemaListener.php @@ -13,6 +13,9 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\TableNotFoundException; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; @@ -30,7 +33,12 @@ protected function getIsSameDatabaseChecker(Connection $connection): \Closure $table->addColumn('id', Types::INTEGER) ->setAutoincrement(true) ->setNotnull(true); - $table->setPrimaryKey(['id']); + + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted('id'))], true)); + } else { + $table->setPrimaryKey(['id']); + } $schemaManager->createTable($table); diff --git a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php index 251b011b5d44e..79cc0f0a31a4d 100644 --- a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php +++ b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php @@ -13,6 +13,9 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\ParameterType; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Types\Types; use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken; @@ -193,6 +196,11 @@ private function addTableToSchema(Schema $schema): void $table->addColumn('lastUsed', Types::DATETIME_IMMUTABLE); $table->addColumn('class', Types::STRING, ['length' => 100]); $table->addColumn('username', Types::STRING, ['length' => 200]); - $table->setPrimaryKey(['series']); + + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted('series'))], true)); + } else { + $table->setPrimaryKey(['series']); + } } } diff --git a/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php b/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php index c6ddb921f1e21..78b962dfdbcae 100644 --- a/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php +++ b/src/Symfony/Bridge/Doctrine/Security/User/EntityUserProvider.php @@ -100,6 +100,8 @@ public function refreshUser(UserInterface $user): UserInterface if ($refreshedUser instanceof Proxy && !$refreshedUser->__isInitialized()) { $refreshedUser->__load(); + } elseif (\PHP_VERSION_ID >= 80400 && ($r = new \ReflectionClass($refreshedUser))->isUninitializedLazyObject($refreshedUser)) { + $r->initializeLazyObject($refreshedUser); } return $refreshedUser; diff --git a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php index 898631bac842c..0bf8f81755dbd 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/ArgumentResolver/EntityValueResolverTest.php @@ -487,9 +487,12 @@ private function createRegistry(?ObjectManager $manager = null): ManagerRegistry ->method('getManagerForClass') ->willReturn($manager); - $registry->expects($this->any()) - ->method('getManager') - ->willReturn($manager); + if (null === $manager) { + $registry->method('getManager') + ->willThrowException(new \InvalidArgumentException()); + } else { + $registry->method('getManager')->willReturn($manager); + } return $registry; } diff --git a/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php b/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php index e8d36c892b942..40472ff73ef40 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php +++ b/src/Symfony/Bridge/Doctrine/Tests/DoctrineTestHelper.php @@ -47,6 +47,10 @@ public static function createTestEntityManager(?Configuration $config = null): E $config ??= self::createTestConfiguration(); $eventManager = new EventManager(); + if (\PHP_VERSION_ID >= 80400 && method_exists($config, 'enableNativeLazyObjects')) { + $config->enableNativeLazyObjects(true); + } + return new EntityManager(DriverManager::getConnection($params, $config, $eventManager), $config, $eventManager); } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/AssociatedEntityDto.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/AssociatedEntityDto.php new file mode 100644 index 0000000000000..d6f82f8214846 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/AssociatedEntityDto.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\Fixtures; + +class AssociatedEntityDto +{ + public $singleId; +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleAssociationToIntIdEntity.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleAssociationToIntIdEntity.php index 94becf73b5795..0373417b2c8bb 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleAssociationToIntIdEntity.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleAssociationToIntIdEntity.php @@ -14,6 +14,7 @@ use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Mapping\Id; +use Doctrine\ORM\Mapping\JoinColumn; use Doctrine\ORM\Mapping\OneToOne; #[Entity] @@ -21,6 +22,7 @@ class SingleAssociationToIntIdEntity { public function __construct( #[Id, OneToOne(cascade: ['ALL'])] + #[JoinColumn(nullable: false)] protected SingleIntIdNoToStringEntity $entity, #[Column(nullable: true)] diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php index 0970dea0669a9..3cebe3fe6e0a9 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntity.php @@ -16,7 +16,7 @@ use Doctrine\ORM\Mapping\Entity; use Doctrine\ORM\Mapping\Id; -#[Entity] +#[Entity(repositoryClass: SingleIntIdEntityRepository::class)] class SingleIntIdEntity { #[Column(type: Types::JSON, nullable: true)] diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntityRepository.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntityRepository.php new file mode 100644 index 0000000000000..597f264099328 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/SingleIntIdEntityRepository.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\Fixtures; + +use Doctrine\ORM\EntityRepository; + +class SingleIntIdEntityRepository extends EntityRepository +{ + public $result = null; + + public function findByCustom() + { + return $this->result; + } +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameDto.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameDto.php new file mode 100644 index 0000000000000..8c2c60d21ba85 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameDto.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\Fixtures; + +use Symfony\Component\Uid\Uuid; + +class UserUuidNameDto +{ + public function __construct( + public ?Uuid $id, + public ?string $fullName, + public ?string $address, + ) { + } +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameEntity.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameEntity.php new file mode 100644 index 0000000000000..3ac3ead8d201a --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/UserUuidNameEntity.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\Fixtures; + +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Entity; +use Doctrine\ORM\Mapping\Id; +use Symfony\Component\Uid\Uuid; + +#[Entity] +class UserUuidNameEntity +{ + public function __construct( + #[Id, Column] + public ?Uuid $id = null, + #[Column(unique: true)] + public ?string $fullName = null, + ) { + } +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Messenger/DoctrineTransactionMiddlewareTest.php b/src/Symfony/Bridge/Doctrine/Tests/Messenger/DoctrineTransactionMiddlewareTest.php index 977f32e30fa61..05e5dae1b34ac 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Messenger/DoctrineTransactionMiddlewareTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Messenger/DoctrineTransactionMiddlewareTest.php @@ -56,12 +56,9 @@ public function testMiddlewareWrapsInTransactionAndFlushes() public function testTransactionIsRolledBackOnException() { - $this->connection->expects($this->once()) - ->method('beginTransaction') - ; - $this->connection->expects($this->once()) - ->method('rollBack') - ; + $this->connection->expects($this->once())->method('beginTransaction'); + $this->connection->expects($this->once())->method('isTransactionActive')->willReturn(true); + $this->connection->expects($this->once())->method('rollBack'); $this->expectException(\RuntimeException::class); $this->expectExceptionMessage('Thrown from next middleware.'); @@ -69,6 +66,27 @@ public function testTransactionIsRolledBackOnException() $this->middleware->handle(new Envelope(new \stdClass()), $this->getThrowingStackMock()); } + public function testExceptionInRollBackDoesNotHidePreviousException() + { + $this->connection->expects($this->once())->method('beginTransaction'); + $this->connection->expects($this->once())->method('isTransactionActive')->willReturn(true); + $this->connection->expects($this->once())->method('rollBack')->willThrowException(new \RuntimeException('Thrown from rollBack.')); + + try { + $this->middleware->handle(new Envelope(new \stdClass()), $this->getThrowingStackMock()); + } catch (\Throwable $exception) { + } + + self::assertNotNull($exception); + self::assertInstanceOf(\RuntimeException::class, $exception); + self::assertSame('Thrown from rollBack.', $exception->getMessage()); + + $previous = $exception->getPrevious(); + self::assertNotNull($previous); + self::assertInstanceOf(\RuntimeException::class, $previous); + self::assertSame('Thrown from next middleware.', $previous->getMessage()); + } + public function testInvalidEntityManagerThrowsException() { $managerRegistry = $this->createMock(ManagerRegistry::class); diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineFooType.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineFooType.php index 93e9818f4383c..6619f911ae1e0 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineFooType.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineFooType.php @@ -41,7 +41,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform): ?str throw new ConversionException(sprintf('Expected "%s", got "%s"', 'Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\Foo', get_debug_type($value))); } - return $foo->bar; + return $value->bar; } public function convertToPHPValue($value, AbstractPlatform $platform): ?Foo diff --git a/src/Symfony/Bridge/Doctrine/Tests/Security/RememberMe/DoctrineTokenProviderPostgresTest.php b/src/Symfony/Bridge/Doctrine/Tests/Security/RememberMe/DoctrineTokenProviderPostgresTest.php index e0c897ce23232..53cbbb07a211c 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Security/RememberMe/DoctrineTokenProviderPostgresTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Security/RememberMe/DoctrineTokenProviderPostgresTest.php @@ -10,6 +10,7 @@ /** * @requires extension pdo_pgsql + * * @group integration */ class DoctrineTokenProviderPostgresTest extends DoctrineTokenProviderTest diff --git a/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php b/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php index a89ac84a7a9c1..82bc79f072ecd 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Security/User/EntityUserProviderTest.php @@ -11,6 +11,7 @@ namespace Symfony\Bridge\Doctrine\Tests\Security\User; +use Doctrine\ORM\Configuration; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Tools\SchemaTool; @@ -219,8 +220,13 @@ public function testRefreshedUserProxyIsLoaded() $provider = new EntityUserProvider($this->getManager($em), User::class); $refreshedUser = $provider->refreshUser($user); - $this->assertInstanceOf(Proxy::class, $refreshedUser); - $this->assertTrue($refreshedUser->__isInitialized()); + if (\PHP_VERSION_ID >= 80400 && method_exists(Configuration::class, 'enableNativeLazyObjects')) { + $this->assertFalse((new \ReflectionClass(User::class))->isUninitializedLazyObject($refreshedUser)); + $this->assertSame('user1', $refreshedUser->name); + } else { + $this->assertInstanceOf(Proxy::class, $refreshedUser); + $this->assertTrue($refreshedUser->__isInitialized()); + } } private function getManager($em, $name = null) diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php index 451046f2ec150..4d7a9b1f78f77 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php @@ -14,13 +14,12 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\DBAL\Types\Type; use Doctrine\ORM\EntityRepository; -use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Tools\SchemaTool; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectManager; use PHPUnit\Framework\MockObject\MockObject; use Symfony\Bridge\Doctrine\Tests\DoctrineTestHelper; +use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociatedEntityDto; use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\AssociationEntity2; use Symfony\Bridge\Doctrine\Tests\Fixtures\CompositeIntIdEntity; @@ -31,7 +30,6 @@ use Symfony\Bridge\Doctrine\Tests\Fixtures\Dto; use Symfony\Bridge\Doctrine\Tests\Fixtures\Employee; use Symfony\Bridge\Doctrine\Tests\Fixtures\HireAnEmployee; -use Symfony\Bridge\Doctrine\Tests\Fixtures\MockableRepository; use Symfony\Bridge\Doctrine\Tests\Fixtures\Person; use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdNoToStringEntity; @@ -43,9 +41,12 @@ use Symfony\Bridge\Doctrine\Tests\Fixtures\UpdateCompositeIntIdEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\UpdateCompositeObjectNoToStringIdEntity; use Symfony\Bridge\Doctrine\Tests\Fixtures\UpdateEmployeeProfile; +use Symfony\Bridge\Doctrine\Tests\Fixtures\UserUuidNameDto; +use Symfony\Bridge\Doctrine\Tests\Fixtures\UserUuidNameEntity; use Symfony\Bridge\Doctrine\Tests\TestRepositoryFactory; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator; +use Symfony\Component\Uid\Uuid; use Symfony\Component\Validator\Exception\ConstraintDefinitionException; use Symfony\Component\Validator\Exception\UnexpectedValueException; use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; @@ -83,59 +84,18 @@ protected function setUp(): void protected function createRegistryMock($em = null) { $registry = $this->createMock(ManagerRegistry::class); - $registry->expects($this->any()) - ->method('getManager') - ->with($this->equalTo(self::EM_NAME)) - ->willReturn($em); - return $registry; - } - - protected function createRepositoryMock(string $className) - { - $repositoryMock = $this->getMockBuilder(MockableRepository::class) - ->disableOriginalConstructor() - ->onlyMethods(['find', 'findAll', 'findOneBy', 'findBy', 'getClassName', 'findByCustom']) - ->getMock(); - - $repositoryMock->method('getClassName') - ->willReturn($className); - - return $repositoryMock; - } + if (null === $em) { + $registry->method('getManager') + ->with($this->equalTo(self::EM_NAME)) + ->willThrowException(new \InvalidArgumentException()); + } else { + $registry->method('getManager') + ->with($this->equalTo(self::EM_NAME)) + ->willReturn($em); + } - protected function createEntityManagerMock($repositoryMock) - { - $em = $this->createMock(ObjectManager::class); - $em->expects($this->any()) - ->method('getRepository') - ->willReturn($repositoryMock) - ; - - $classMetadata = $this->createMock( - class_exists(ClassMetadataInfo::class) ? ClassMetadataInfo::class : ClassMetadata::class - ); - $classMetadata - ->method('getName') - ->willReturn($repositoryMock->getClassName()) - ; - $classMetadata - ->expects($this->any()) - ->method('hasField') - ->willReturn(true) - ; - $refl = $this->createMock(\ReflectionProperty::class); - $refl - ->method('getValue') - ->willReturn(true) - ; - $classMetadata->reflFields = ['name' => $refl]; - $em->expects($this->any()) - ->method('getClassMetadata') - ->willReturn($classMetadata) - ; - - return $em; + return $registry; } protected function createValidator(): UniqueEntityValidator @@ -159,6 +119,7 @@ private function createSchema($em) $em->getClassMetadata(Employee::class), $em->getClassMetadata(CompositeObjectNoToStringIdEntity::class), $em->getClassMetadata(SingleIntIdStringWrapperNameEntity::class), + $em->getClassMetadata(UserUuidNameEntity::class), ]); } @@ -417,13 +378,7 @@ public function testValidateUniquenessWithValidCustomErrorPath() */ public function testValidateUniquenessUsingCustomRepositoryMethod(UniqueEntity $constraint) { - $repository = $this->createRepositoryMock(SingleIntIdEntity::class); - $repository->expects($this->once()) - ->method('findByCustom') - ->willReturn([]) - ; - $this->em = $this->createEntityManagerMock($repository); - $this->registry = $this->createRegistryMock($this->em); + $this->em->getRepository(SingleIntIdEntity::class)->result = []; $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -441,22 +396,12 @@ public function testValidateUniquenessWithUnrewoundArray(UniqueEntity $constrain { $entity = new SingleIntIdEntity(1, 'foo'); - $repository = $this->createRepositoryMock(SingleIntIdEntity::class); - $repository->expects($this->once()) - ->method('findByCustom') - ->willReturnCallback( - function () use ($entity) { - $returnValue = [ - $entity, - ]; - next($returnValue); - - return $returnValue; - } - ) - ; - $this->em = $this->createEntityManagerMock($repository); - $this->registry = $this->createRegistryMock($this->em); + $returnValue = [ + $entity, + ]; + next($returnValue); + + $this->em->getRepository(SingleIntIdEntity::class)->result = $returnValue; $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -489,13 +434,7 @@ public function testValidateResultTypes($entity1, $result) 'repositoryMethod' => 'findByCustom', ]); - $repository = $this->createRepositoryMock($entity1::class); - $repository->expects($this->once()) - ->method('findByCustom') - ->willReturn($result) - ; - $this->em = $this->createEntityManagerMock($repository); - $this->registry = $this->createRegistryMock($this->em); + $this->em->getRepository(SingleIntIdEntity::class)->result = $result; $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -609,11 +548,42 @@ public function testAssociatedEntityWithNull() $this->assertNoViolation(); } - public function testValidateUniquenessWithArrayValue() + public function testAssociatedEntityReferencedByPrimaryKey() { - $repository = $this->createRepositoryMock(SingleIntIdEntity::class); - $this->repositoryFactory->setRepository($this->em, SingleIntIdEntity::class, $repository); + $this->registry = $this->createRegistryMock($this->em); + $this->registry->expects($this->any()) + ->method('getManagerForClass') + ->willReturn($this->em); + $this->validator = $this->createValidator(); + $this->validator->initialize($this->context); + + $entity = new SingleIntIdEntity(1, 'foo'); + $associated = new AssociationEntity(); + $associated->single = $entity; + + $this->em->persist($entity); + $this->em->persist($associated); + $this->em->flush(); + $dto = new AssociatedEntityDto(); + $dto->singleId = 1; + + $this->validator->validate($dto, new UniqueEntity( + fields: ['singleId' => 'single'], + entityClass: AssociationEntity::class, + )); + + $this->buildViolation('This value is already used.') + ->atPath('property.path.single') + ->setParameter('{{ value }}', 1) + ->setInvalidValue(1) + ->setCode(UniqueEntity::NOT_UNIQUE_ERROR) + ->setCause([$associated]) + ->assertRaised(); + } + + public function testValidateUniquenessWithArrayValue() + { $constraint = new UniqueEntity([ 'message' => 'myMessage', 'fields' => ['phoneNumbers'], @@ -624,10 +594,7 @@ public function testValidateUniquenessWithArrayValue() $entity1 = new SingleIntIdEntity(1, 'foo'); $entity1->phoneNumbers[] = 123; - $repository->expects($this->once()) - ->method('findByCustom') - ->willReturn([$entity1]) - ; + $this->em->getRepository(SingleIntIdEntity::class)->result = $entity1; $this->em->persist($entity1); $this->em->flush(); @@ -677,8 +644,6 @@ public function testEntityManagerNullObject() // no "em" option set ]); - $this->em = null; - $this->registry = $this->createRegistryMock($this->em); $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -692,14 +657,6 @@ public function testEntityManagerNullObject() public function testValidateUniquenessOnNullResult() { - $repository = $this->createRepositoryMock(SingleIntIdEntity::class); - $repository - ->method('find') - ->willReturn(null) - ; - - $this->em = $this->createEntityManagerMock($repository); - $this->registry = $this->createRegistryMock($this->em); $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -880,13 +837,7 @@ public function testValidateUniquenessWithEmptyIterator($entity, $result) 'repositoryMethod' => 'findByCustom', ]); - $repository = $this->createRepositoryMock($entity::class); - $repository->expects($this->once()) - ->method('findByCustom') - ->willReturn($result) - ; - $this->em = $this->createEntityManagerMock($repository); - $this->registry = $this->createRegistryMock($this->em); + $this->em->getRepository(SingleIntIdEntity::class)->result = $result; $this->validator = $this->createValidator(); $this->validator->initialize($this->context); @@ -1454,4 +1405,25 @@ public function testEntityManagerNullObjectWhenDTODoctrineStyle() $this->validator->validate($dto, $constraint); } + + public function testUuidIdentifierWithSameValueDifferentInstanceDoesNotCauseViolation() + { + $uuidString = 'ec562e21-1fc8-4e55-8de7-a42389ac75c5'; + $existingPerson = new UserUuidNameEntity(Uuid::fromString($uuidString), 'Foo Bar'); + $this->em->persist($existingPerson); + $this->em->flush(); + + $dto = new UserUuidNameDto(Uuid::fromString($uuidString), 'Foo Bar', ''); + + $constraint = new UniqueEntity( + fields: ['fullName'], + entityClass: UserUuidNameEntity::class, + identifierFieldNames: ['id'], + em: self::EM_NAME, + ); + + $this->validator->validate($dto, $constraint); + + $this->assertNoViolation(); + } } diff --git a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php index c0a1232c59684..4aed1cd3a44c2 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php +++ b/src/Symfony/Bridge/Doctrine/Validator/Constraints/UniqueEntityValidator.php @@ -11,6 +11,7 @@ namespace Symfony\Bridge\Doctrine\Validator\Constraints; +use Doctrine\ORM\Mapping\ClassMetadata as OrmClassMetadata; use Doctrine\ORM\Mapping\MappingException as ORMMappingException; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\Mapping\ClassMetadata; @@ -69,10 +70,10 @@ public function validate(mixed $value, Constraint $constraint): void $entityClass = $constraint->entityClass ?? $value::class; if ($constraint->em) { - $em = $this->registry->getManager($constraint->em); - - if (!$em) { - throw new ConstraintDefinitionException(\sprintf('Object manager "%s" does not exist.', $constraint->em)); + try { + $em = $this->registry->getManager($constraint->em); + } catch (\InvalidArgumentException $e) { + throw new ConstraintDefinitionException(\sprintf('Object manager "%s" does not exist.', $constraint->em), 0, $e); } } else { $em = $this->registry->getManagerForClass($entityClass); @@ -196,6 +197,12 @@ public function validate(mixed $value, Constraint $constraint): void foreach ($constraint->identifierFieldNames as $identifierFieldName) { $propertyValue = $this->getPropertyValue($entityClass, $identifierFieldName, current($result)); + if ($fieldValues[$identifierFieldName] instanceof \Stringable) { + $fieldValues[$identifierFieldName] = (string) $fieldValues[$identifierFieldName]; + } + if ($propertyValue instanceof \Stringable) { + $propertyValue = (string) $propertyValue; + } if ($fieldValues[$identifierFieldName] !== $propertyValue) { $entityMatched = false; break; @@ -287,9 +294,13 @@ private function getFieldValues(mixed $object, ClassMetadata $class, array $fiel throw new ConstraintDefinitionException(\sprintf('The field "%s" is not a property of class "%s".', $fieldName, $objectClass)); } - $fieldValues[$entityFieldName] = $isValueEntity && $object instanceof ($class->getName()) - ? $class->reflFields[$fieldName]->getValue($object) - : $this->getPropertyValue($objectClass, $fieldName, $object); + if ($isValueEntity && $object instanceof ($class->getName()) && property_exists(OrmClassMetadata::class, 'propertyAccessors')) { + $fieldValues[$entityFieldName] = $class->propertyAccessors[$fieldName]->getValue($object); + } elseif ($isValueEntity && $object instanceof ($class->getName())) { + $fieldValues[$entityFieldName] = $class->reflFields[$fieldName]->getValue($object); + } else { + $fieldValues[$entityFieldName] = $this->getPropertyValue($objectClass, $fieldName, $objec 8000 t); + } } return $fieldValues; diff --git a/src/Symfony/Bridge/Doctrine/composer.json b/src/Symfony/Bridge/Doctrine/composer.json index 1ca2abc4b13c4..9d95a8af14ca7 100644 --- a/src/Symfony/Bridge/Doctrine/composer.json +++ b/src/Symfony/Bridge/Doctrine/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=8.2", "doctrine/event-manager": "^2", - "doctrine/persistence": "^3.1", + "doctrine/persistence": "^3.1|^4", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", diff --git a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php deleted file mode 100644 index 885e6ea585e54..0000000000000 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableClockMockSubscriber.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Bridge\PhpUnit\Extension; - -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; -use PHPUnit\Metadata\Group; -use Symfony\Bridge\PhpUnit\ClockMock; - -/** - * @internal - */ -class DisableClockMockSubscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $test = $event->test(); - - if (!$test instanceof TestMethod) { - return; - } - - foreach ($test->metadata() as $metadata) { - if ($metadata instanceof Group && 'time-sensitive' === $metadata->groupName()) { - ClockMock::withClockMock(false); - } - } - } -} diff --git a/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php b/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php deleted file mode 100644 index fc3e754d140d5..0000000000000 --- a/src/Symfony/Bridge/PhpUnit/Extension/DisableDnsMockSubscriber.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Bridge\PhpUnit\Extension; - -use PHPUnit\Event\Code\TestMethod; -use PHPUnit\Event\Test\Finished; -use PHPUnit\Event\Test\FinishedSubscriber; -use PHPUnit\Metadata\Group; -use Symfony\Bridge\PhpUnit\DnsMock; - -/** - * @internal - */ -class DisableDnsMockSubscriber implements FinishedSubscriber -{ - public function notify(Finished $event): void - { - $test = $event->test(); - - if (!$test instanceof TestMethod) { - return; - } - - foreach ($test->metadata() as $metadata) { - if ($metadata instanceof Group && 'dns-sensitive' === $metadata->groupName()) { - DnsMock::withMockedHosts([]); - } - } - } -} diff --git a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php index 1df4f20658905..c6a5a58e871a0 100644 --- a/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php +++ b/src/Symfony/Bridge/PhpUnit/SymfonyExtension.php @@ -11,12 +11,21 @@ namespace Symfony\Bridge\PhpUnit; +use PHPUnit\Event\Code\Test; +use PHPUnit\Event\Code\TestMethod; +use PHPUnit\Event\Test\BeforeTestMethodErrored; +use PHPUnit\Event\Test\BeforeTestMethodErroredSubscriber; +use PHPUnit\Event\Test\Errored; +use PHPUnit\Event\Test\ErroredSubscriber; +use PHPUnit\Event\Test\Finished; +use PHPUnit\Event\Test\FinishedSubscriber; +use PHPUnit\Event\Test\Skipped; +use PHPUnit\Event\Test\SkippedSubscriber; +use PHPUnit\Metadata\Group; use PHPUnit\Runner\Extension\Extension; use PHPUnit\Runner\Extension\Facade; use PHPUnit\Runner\Extension\ParameterCollection; use PHPUnit\TextUI\Configuration\Configuration; -use Symfony\Bridge\PhpUnit\Extension\DisableClockMockSubscriber; -use Symfony\Bridge\PhpUnit\Extension\DisableDnsMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\EnableClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterClockMockSubscriber; use Symfony\Bridge\PhpUnit\Extension\RegisterDnsMockSubscriber; @@ -38,7 +47,42 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete $facade->registerSubscriber(new RegisterClockMockSubscriber()); $facade->registerSubscriber(new EnableClockMockSubscriber()); - $facade->registerSubscriber(new DisableClockMockSubscriber()); + $facade->registerSubscriber(new class implements ErroredSubscriber { + public function notify(Errored $event): void + { + SymfonyExtension::disableClockMock($event->test()); + SymfonyExtension::disableDnsMock($event->test()); + } + }); + $facade->registerSubscriber(new class implements FinishedSubscriber { + public function notify(Finished $event): void + { + SymfonyExtension::disableClockMock($event->test()); + SymfonyExtension::disableDnsMock($event->test()); + } + }); + $facade->registerSubscriber(new class implements SkippedSubscriber { + public function notify(Skipped $event): void + { + SymfonyExtension::disableClockMock($event->test()); + SymfonyExtension::disableDnsMock($event->test()); + } + }); + + if (interface_exists(BeforeTestMethodErroredSubscriber::class)) { + $facade->registerSubscriber(new class implements BeforeTestMethodErroredSubscriber { + public function notify(BeforeTestMethodErrored $event): void + { + if (method_exists($event, 'test')) { + SymfonyExtension::disableClockMock($event->test()); + SymfonyExtension::disableDnsMock($event->test()); + } else { + ClockMock::withClockMock(false); + DnsMock::withMockedHosts([]); + } + } + }); + } if ($parameters->has('dns-mock-namespaces')) { foreach (explode(',', $parameters->get('dns-mock-namespaces')) as $namespace) { @@ -47,6 +91,43 @@ public function bootstrap(Configuration $configuration, Facade $facade, Paramete } $facade->registerSubscriber(new RegisterDnsMockSubscriber()); - $facade->registerSubscriber(new DisableDnsMockSubscriber()); + } + + /** + * @internal + */ + public static function disableClockMock(Test $test): void + { + if (self::hasGroup($test, 'time-sensitive')) { + ClockMock::withClockMock(false); + } + } + + /** + * @internal + */ + public static function disableDnsMock(Test $test): void + { + if (self::hasGroup($test, 'dns-sensitive')) { + DnsMock::withMockedHosts([]); + } + } + + /** + * @internal + */ + public static function hasGroup(Test $test, string $groupName): bool + { + if (!$test instanceof TestMethod) { + return false; + } + + foreach ($test->metadata() as $metadata) { + if ($metadata instanceof Group && $groupName === $metadata->groupName()) { + return true; + } + } + + return false; } } diff --git a/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php b/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php index 95dcc78ef026c..608bdd71cc945 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php +++ b/src/Symfony/Bridge/PhpUnit/Tests/Fixtures/symfonyextension/tests/bootstrap.php @@ -21,8 +21,6 @@ }); require __DIR__.'/../../../../SymfonyExtension.php'; -require __DIR__.'/../../../../Extension/DisableClockMockSubscriber.php'; -require __DIR__.'/../../../../Extension/DisableDnsMockSubscriber.php'; require __DIR__.'/../../../../Extension/EnableClockMockSubscriber.php'; require __DIR__.'/../../../../Extension/RegisterClockMockSubscriber.php'; require __DIR__.'/../../../../Extension/RegisterDnsMockSubscriber.php'; diff --git a/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtensionWithManualRegister.php b/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtensionWithManualRegister.php new file mode 100644 index 0000000000000..c02d6f1cf64ce --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/SymfonyExtensionWithManualRegister.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PhpUnit\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\ClockMock; +use Symfony\Bridge\PhpUnit\DnsMock; + +class SymfonyExtensionWithManualRegister extends TestCase +{ + public static function setUpBeforeClass(): void + { + ClockMock::register(self::class); + ClockMock::withClockMock(strtotime('2024-05-20 15:30:00')); + + DnsMock::register(self::class); + DnsMock::withMockedHosts([ + 'example.com' => [ + ['type' => 'A', 'ip' => '1.2.3.4'], + ], + ]); + } + + public static function tearDownAfterClass(): void + { + ClockMock::withClockMock(false); + DnsMock::withMockedHosts([]); + } + + public function testDate() + { + self::assertSame('2024-05-20 15:30:00', date('Y-m-d H:i:s')); + } + + public function testGetHostByName() + { + self::assertSame('1.2.3.4', gethostbyname('example.com')); + } + + public function testTime() + { + self::assertSame(1716219000, time()); + } + + public function testDnsGetRecord() + { + self::assertSame([[ + 'host' => 'example.com', + 'class' => 'IN', + 'ttl' => 1, + 'type' => 'A', + 'ip' => '1.2.3.4', + ]], dns_get_record('example.com')); + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt index 2c808c2f5930e..02b0a510e6301 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt +++ b/src/Symfony/Bridge/PhpUnit/Tests/symfonyextension.phpt @@ -5,6 +5,8 @@ if (!getenv('SYMFONY_PHPUNIT_VERSION') || version_compare(getenv('SYMFONY_PHPUNI --FILE-- 'composer.json', 'COMPOSER_VENDOR_DIR' => 'vendor', 'COMPOSER_BIN_DIR' => 'bin', + 'COMPOSER_NO_INTERACTION' => '1', 'SYMFONY_SIMPLE_PHPUNIT_BIN_DIR' => __DIR__, ]; @@ -234,10 +235,10 @@ @copy("$PHPUNIT_VERSION_DIR/phpunit.xsd", 'phpunit.xsd'); chdir("$PHPUNIT_VERSION_DIR"); if ($SYMFONY_PHPUNIT_REMOVE) { - $passthruOrFail("$COMPOSER remove --no-update --no-interaction ".$SYMFONY_PHPUNIT_REMOVE); + $passthruOrFail("$COMPOSER remove --no-update ".$SYMFONY_PHPUNIT_REMOVE); } if ($SYMFONY_PHPUNIT_REQUIRE) { - $passthruOrFail("$COMPOSER require --no-update --no-interaction ".$SYMFONY_PHPUNIT_REQUIRE); + $passthruOrFail("$COMPOSER require --no-update ".$SYMFONY_PHPUNIT_REQUIRE); } if (5.1 <= $PHPUNIT_VERSION && $PHPUNIT_VERSION < 5.4) { $passthruOrFail("$COMPOSER require --no-update phpunit/phpunit-mock-objects \"~3.1.0\""); @@ -386,6 +387,10 @@ class_exists(\SymfonyExcludeListSimplePhpunit::class, false) && PHPUnit\Util\Bla $cmd .= '%2$s'; } +if (version_compare($PHPUNIT_VERSION, '11.0', '>=')) { + $GLOBALS['_composer_autoload_path'] = "$PHPUNIT_DIR/$PHPUNIT_VERSION_DIR/vendor/autoload.php"; +} + if ($components) { $skippedTests = $_SERVER['SYMFONY_PHPUNIT_SKIPPED_TESTS'] ?? false; $runningProcs = []; diff --git a/src/Symfony/Bridge/PhpUnit/bootstrap.php b/src/Symfony/Bridge/PhpUnit/bootstrap.php index f11b7ab7f4945..50157aec4ad0f 100644 --- a/src/Symfony/Bridge/PhpUnit/bootstrap.php +++ b/src/Symfony/Bridge/PhpUnit/bootstrap.php @@ -14,7 +14,11 @@ use Symfony\Bridge\PhpUnit\DeprecationErrorHandler; // Detect if we need to serialize deprecations to a file. -if (in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && $file = getenv('SYMFONY_DEPRECATIONS_SERIALIZE')) { +if ( + // Skip if we're using PHPUnit >=10 + !class_exists(PHPUnit\Metadata\Metadata::class) + && in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && $file = getenv('SYMFONY_DEPRECATIONS_SERIALIZE') +) { DeprecationErrorHandler::collectDeprecations($file); return; @@ -46,6 +50,10 @@ } } -if ('disabled' !== getenv('SYMFONY_DEPRECATIONS_HELPER')) { +if ( + // Skip if we're using PHPUnit >=10 + !class_exists(PHPUnit\Metadata\Metadata::class, false) + && 'disabled' !== getenv('SYMFONY_DEPRECATIONS_HELPER') +) { DeprecationErrorHandler::register(getenv('SYMFONY_DEPRECATIONS_HELPER')); } diff --git a/src/Symfony/Bridge/PhpUnit/composer.json b/src/Symfony/Bridge/PhpUnit/composer.json index 1283dfe33a9b0..de9101f796d73 100644 --- a/src/Symfony/Bridge/PhpUnit/composer.json +++ b/src/Symfony/Bridge/PhpUnit/composer.json @@ -2,7 +2,9 @@ "name": "symfony/phpunit-bridge", "type": "symfony-bridge", "description": "Provides utilities for PHPUnit, especially user deprecation notices management", - "keywords": [], + "keywords": [ + "testing" + ], "homepage": "https://symfony.com", "license": "MIT", "authors": [ diff --git a/src/Symfony/Bridge/Twig/Extension/WebLinkExtension.php b/src/Symfony/Bridge/Twig/Extension/WebLinkExtension.php index 9eeb305aee36c..b06f0a8cedbe4 100644 --- a/src/Symfony/Bridge/Twig/Extension/WebLinkExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/WebLinkExtension.php @@ -44,7 +44,7 @@ public function getFunctions(): array /** * Adds a "Link" HTTP header. * - * @param string $rel The relation type (e.g. "preload", "prefetch", "prerender" or "dns-prefetch") + * @param string $rel The relation type (e.g. "preload", "prefetch", or "dns-prefetch") * @param array $attributes The attributes of this link (e.g. "['as' => true]", "['pr' => 0.5]") * * @return string The relation URI @@ -115,7 +115,11 @@ public function prefetch(string $uri, array $attributes = []): string } /** - * Indicates to the client that it should prerender this resource . + * Indicates to the client that it should prerender this resource. + * + * This feature is deprecated and superseded by the Speculation Rules API. + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/prerender * * @param array $attributes The attributes of this link (e.g. "['as' => true]", "['pr' => 0.5]") * diff --git a/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php b/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php index 162f8c5ff4c09..00b7ba00f1996 100644 --- a/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php +++ b/src/Symfony/Bridge/Twig/Mime/BodyRenderer.php @@ -43,7 +43,7 @@ public function render(Message $message): void return; } - if (null === $message->getTextTemplate() && null === $message->getHtmlTemplate()) { + if ($message->isRendered()) { // email has already been rendered return; } diff --git a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php index 9a0ecc9d97781..3b8196fae410e 100644 --- a/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php +++ b/src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php @@ -21,7 +21,8 @@ use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\FilterExpression; use Twig\Node\Expression\NameExpression; -use Twig\Node\Expression\Variable\LocalVariable; +use Twig\Node\Expression\Variable\AssignContextVariable; +use Twig\Node\Expression\Variable\ContextVariable; use Twig\Node\ModuleNode; use Twig\Node\Node; use Twig\Node\Nodes; @@ -34,7 +35,6 @@ final class TranslationDefaultDomainNodeVisitor implements NodeVisitorInterface { private Scope $scope; - private int $nestingLevel = 0; public function __construct() { @@ -48,22 +48,25 @@ public function enterNode(Node $node, Environment $env): Node } if ($node instanceof TransDefaultDomainNode) { - ++$this->nestingLevel; - if ($node->getNode('expr') instanceof ConstantExpression) { $this->scope->set('domain', $node->getNode('expr')); return $node; } + if (null === $templateName = $node->getTemplateName()) { + throw new \LogicException('Cannot traverse a node without a template name.'); + } + + $var = '__internal_trans_default_domain'.hash('xxh128', $templateName); + if (class_exists(Nodes::class)) { - $name = new LocalVariable(null, $node->getTemplateLine()); - $this->scope->set('domain', $name); + $name = new AssignContextVariable($var, $node->getTemplateLine()); + $this->scope->set('domain', new ContextVariable($var, $node->getTemplateLine())); return new SetNode(false, new Nodes([$name]), new Nodes([$node->getNode('expr')]), $node->getTemplateLine()); } - $var = '__internal_trans_default_domain_'.$this->nestingLevel; $name = new AssignNameExpression($var, $node->getTemplateLine()); $this->scope->set('domain', new NameExpression($var, $node->getTemplateLine())); @@ -105,8 +108,6 @@ public function enterNode(Node $node, Environment $env): Node public function leaveNode(Node $node, Environment $env): ?Node { if ($node instanceof TransDefaultDomainNode) { - --$this->nestingLevel; - return null; } diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig index 1e421d5f9f5a9..537849faebaa4 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig @@ -89,7 +89,7 @@ {{- block('choice_widget_options') -}} {%- else -%} - + {%- endif -%} {% endfor %} {%- endblock choice_widget_options -%} diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php index cfa2c5c6475cf..28e8997a12e9f 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractDivLayoutTestCase.php @@ -870,6 +870,56 @@ public function testMultipleChoiceExpandedWithLabelsSetFalseByCallable() ); } + public function testSingleChoiceWithoutDuplicatePreferredIsSelected() + { + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&d', [ + 'choices' => ['Choice&A' => '&a', 'Choice&B' => '&b', 'Choice&C' => '&c', 'Choice&D' => '&d'], + 'preferred_choices' => ['&b', '&d'], + 'duplicate_preferred_choices' => false, + 'multiple' => false, + 'expanded' => false, + ]); + + $this->assertWidgetMatchesXpath($form->createView(), ['separator' => '-- sep --'], + '/select + [@name="name"] + [ + ./option[@value="&d"][@selected="selected"] + /following-sibling::option[@disabled="disabled"][.="-- sep --"] + /following-sibling::option[@value="&a"][not(@selected)] + /following-sibling::option[@value="&c"][not(@selected)] + ] + [count(./option)=5] +' + ); + } + + public function testSingleChoiceWithoutDuplicateNotPreferredIsSelected() + { + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', '&d', [ + 'choices' => ['Choice&A' => '&a', 'Choice&B' => '&b', 'Choice&C' => '&c', 'Choice&D' => '&d'], + 'preferred_choices' => ['&b', '&d'], + 'duplicate_preferred_choices' => true, + 'multiple' => false, + 'expanded' => false, + ]); + + $this->assertWidgetMatchesXpath($form->createView(), ['separator' => '-- sep --'], + '/select + [@name="name"] + [ + ./option[@value="&d"][not(@selected)] + /following-sibling::option[@disabled="disabled"][.="-- sep --"] + /following-sibling::option[@value="&a"][not(@selected)] + /following-sibling::option[@value="&b"][not(@selected)] + /following-sibling::option[@value="&c"][not(@selected)] + /following-sibling::option[@value="&d"][@selected="selected"] + ] + [count(./option)=7] +' + ); + } + public function testFormEndWithRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php index d9079b1c7ef17..ccce1de340c02 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php @@ -80,7 +80,7 @@ public function testGenerateFragmentUri() ]); $twig->addRuntimeLoader($loader); - $this->assertSame('/_fragment?_hash=XCg0hX8QzSwik8Xuu9aMXhoCeI4oJOob7lUVacyOtyY%3D&_path=template%3Dfoo.html.twig%26_format%3Dhtml%26_locale%3Den%26_controller%3DSymfony%255CBundle%255CFrameworkBundle%255CController%255CTemplateController%253A%253AtemplateAction', $twig->render('index')); + $this->assertMatchesRegularExpression('#/_fragment\?_hash=.+&_path=template%3Dfoo.html.twig%26_format%3Dhtml%26_locale%3Den%26_controller%3DSymfony%255CBundle%255CFrameworkBundle%255CController%255CTemplateController%253A%253AtemplateAction$#', $twig->render('index')); } protected function getFragmentHandler($returnOrException): FragmentHandler diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php index 96f707cdfdf2c..f6dd5f623baee 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/TranslationExtensionTest.php @@ -206,6 +206,68 @@ public function testDefaultTranslationDomainWithNamedArguments() $this->assertEquals('foo (custom)foo (foo)foo (custom)foo (custom)foo (fr)foo (custom)foo (fr)', trim($template->render([]))); } + public function testDefaultTranslationDomainWithExpression() + { + $templates = [ + 'index' => ' + {%- extends "base" %} + + {%- trans_default_domain custom_domain %} + + {%- block content %} + {{- "foo"|trans }} + {%- endblock %} + ', + + 'base' => ' + {%- block content "" %} + ', + ]; + + $translator = new Translator('en'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', ['foo' => 'foo (messages)'], 'en'); + $translator->addResource('array', ['foo' => 'foo (custom)'], 'en', 'custom'); + $translator->addResource('array', ['foo' => 'foo (foo)'], 'en', 'foo'); + + $template = $this->getTemplate($templates, $translator); + + $this->assertEquals('foo (foo)', trim($template->render(['custom_domain' => 'foo']))); + } + + public function testDefaultTranslationDomainWithExpressionAndInheritance() + { + $templates = [ + 'index' => ' + {%- extends "base" %} + + {%- trans_default_domain foo_domain %} + + {%- block content %} + {{- "foo"|trans }} + {%- endblock %} + ', + + 'base' => ' + {%- trans_default_domain custom_domain %} + + {{- "foo"|trans }} + {%- block content "" %} + {{- "foo"|trans }} + ', + ]; + + $translator = new Translator('en'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', ['foo' => 'foo (messages)'], 'en'); + $translator->addResource('array', ['foo' => 'foo (custom)'], 'en', 'custom'); + $translator->addResource('array', ['foo' => 'foo (foo)'], 'en', 'foo'); + + $template = $this->getTemplate($templates, $translator); + + $this->assertEquals('foo (custom)foo (foo)foo (custom)', trim($template->render(['foo_domain' => 'foo', 'custom_domain' => 'custom']))); + } + private function getTemplate($template, ?TranslatorInterface $translator = null): TemplateWrapper { $translator ??= new Translator('en'); diff --git a/src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php b/src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php index f5d37e7d45c4e..cce8ee9a68839 100644 --- a/src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php @@ -105,10 +105,14 @@ public function testRenderedOnce() ; $email->textTemplate('text'); + $this->assertFalse($email->isRendered()); $renderer->render($email); + $this->assertTrue($email->isRendered()); + $this->assertEquals('Text', $email->getTextBody()); $email->text('reset'); + $this->assertTrue($email->isRendered()); $renderer->render($email); $this->assertEquals('reset', $email->getTextBody()); diff --git a/src/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php b/src/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php index dc419f5dad227..ab9113acf5c57 100644 --- a/src/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Node/SearchAndRenderBlockNodeTest.php @@ -21,6 +21,7 @@ use Twig\Node\Expression\ConditionalExpression; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\NameExpression; +use Twig\Node\Expression\Ternary\ConditionalTernary; use Twig\Node\Expression\Variable\ContextVariable; use Twig\Node\Node; use Twig\Node\Nodes; @@ -275,32 +276,32 @@ public function testCompileLabelWithLabelAndAttributes() public function testCompileLabelWithLabelThatEvaluatesToNull() { + if (class_exists(ConditionalTernary::class)) { + $conditional = new ConditionalTernary( + // if + new ConstantExpression(true, 0), + // then + new ConstantExpression(null, 0), + // else + new ConstantExpression(null, 0), + 0 + ); + } else { + $conditional = new ConditionalExpression( + // if + new ConstantExpression(true, 0), + // then + new ConstantExpression(null, 0), + // else + new ConstantExpression(null, 0), + 0 + ); + } + if (class_exists(Nodes::class)) { - $arguments = new Nodes([ - new ContextVariable('form', 0), - new ConditionalExpression( - // if - new ConstantExpression(true, 0), - // then - new ConstantExpression(null, 0), - // else - new ConstantExpression(null, 0), - 0 - ), - ]); + $arguments = new Nodes([new ContextVariable('form', 0), $conditional]); } else { - $arguments = new Node([ - new NameExpression('form', 0), - new ConditionalExpression( - // if - new ConstantExpression(true, 0), - // then - new ConstantExpression(null, 0), - // else - new ConstantExpression(null, 0), - 0 - ), - ]); + $arguments = new Node([new NameExpression('form', 0), $conditional]); } $node = new SearchAndRenderBlockNode(new TwigFunction('form_label'), $arguments, 0); @@ -322,18 +323,32 @@ public function testCompileLabelWithLabelThatEvaluatesToNull() public function testCompileLabelWithLabelThatEvaluatesToNullAndAttributes() { + if (class_exists(ConditionalTernary::class)) { + $conditional = new ConditionalTernary( + // if + new ConstantExpression(true, 0), + // then + new ConstantExpression(null, 0), + // else + new ConstantExpression(null, 0), + 0 + ); + } else { + $conditional = new ConditionalExpression( + // if + new ConstantExpression(true, 0), + // then + new ConstantExpression(null, 0), + // else + new ConstantExpression(null, 0), + 0 + ); + } + if (class_exists(Nodes::class)) { $arguments = new Nodes([ new ContextVariable('form', 0), - new ConditionalExpression( - // if - new ConstantExpression(true, 0), - // then - new ConstantExpression(null, 0), - // else - new ConstantExpression(null, 0), - 0 - ), + $conditional, new ArrayExpression([ new ConstantExpression('foo', 0), new ConstantExpress 8000 ion('bar', 0), @@ -344,12 +359,7 @@ public function testCompileLabelWithLabelThatEvaluatesToNullAndAttributes() } else { $arguments = new Node([ new NameExpression('form', 0), - new ConditionalExpression( - new ConstantExpression(true, 0), - new ConstantExpression(null, 0), - new ConstantExpression(null, 0), - 0 - ), + $conditional, new ArrayExpression([ new ConstantExpression('foo', 0), new ConstantExpression('bar', 0), diff --git a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php index a6910855e38b1..64ce92bc04355 100644 --- a/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php +++ b/src/Symfony/Bridge/Twig/Tests/NodeVisitor/TwigNodeProvider.php @@ -14,6 +14,7 @@ use Symfony\Bridge\Twig\Node\TransDefaultDomainNode; use Symfony\Bridge\Twig\Node\TransNode; use Twig\Node\BodyNode; +use Twig\Node\EmptyNode; use Twig\Node\Expression\ArrayExpression; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Expression\FilterExpression; @@ -27,13 +28,15 @@ class TwigNodeProvider { public static function getModule($content) { + $emptyNodeExists = class_exists(EmptyNode::class); + return new ModuleNode( new BodyNode([new ConstantExpression($content, 0)]), null, - new ArrayExpression([], 0), - new ArrayExpression([], 0), - new ArrayExpression([], 0), - null, + $emptyNodeExists ? new EmptyNode() : new ArrayExpression([], 0), + $emptyNodeExists ? new EmptyNode() : new ArrayExpression([], 0), + $emptyNodeExists ? new EmptyNode() : new ArrayExpression([], 0), + $emptyNodeExists ? new EmptyNode() : null, new Source('', '') ); } diff --git a/src/Symfony/Bridge/Twig/TokenParser/DumpTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/DumpTokenParser.php index e671f9ba0b7dd..9c12dc23dfba5 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/DumpTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/DumpTokenParser.php @@ -14,6 +14,7 @@ use Symfony\Bridge\Twig\Node\DumpNode; use Twig\Node\Expression\Variable\LocalVariable; use Twig\Node\Node; +use Twig\Node\Nodes; use Twig\Token; use Twig\TokenParser\AbstractTokenParser; @@ -34,13 +35,28 @@ public function parse(Token $token): Node { $values = null; if (!$this->parser->getStream()->test(Token::BLOCK_END_TYPE)) { - $values = $this->parser->getExpressionParser()->parseMultitargetExpression(); + $values = method_exists($this->parser, 'parseExpression') ? + $this->parseMultitargetExpression() : + $this->parser->getExpressionParser()->parseMultitargetExpression(); } $this->parser->getStream()->expect(Token::BLOCK_END_TYPE); return new DumpNode(class_exists(LocalVariable::class) ? new LocalVariable(null, $token->getLine()) : $this->parser->getVarName(), $values, $token->getLine(), $this->getTag()); } + private function parseMultitargetExpression(): Node + { + $targets = []; + while (true) { + $targets[] = $this->parser->parseExpression(); + if (!$this->parser->getStream()->nextIf(Token::PUNCTUATION_TYPE, ',')) { + break; + } + } + + return new Nodes($targets); + } + public function getTag(): string { return 'dump'; diff --git a/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php index 413a8f51ed02f..0988eae59846a 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/FormThemeTokenParser.php @@ -29,12 +29,16 @@ public function parse(Token $token): Node $lineno = $token->getLine(); $stream = $this->parser->getStream(); - $form = $this->parser->getExpressionParser()->parseExpression(); + $parseExpression = method_exists($this->parser, 'parseExpression') + ? $this->parser->parseExpression(...) + : $this->parser->getExpressionParser()->parseExpression(...); + + $form = $parseExpression(); $only = false; if ($this->parser->getStream()->test(Token::NAME_TYPE, 'with')) { $this->parser->getStream()->next(); - $resources = $this->parser->getExpressionParser()->parseExpression(); + $resources = $parseExpression(); if ($this->parser->getStream()->nextIf(Token::NAME_TYPE, 'only')) { $only = true; @@ -42,7 +46,7 @@ public function parse(Token $token): Node } else { $resources = new ArrayExpression([], $stream->getCurrent()->getLine()); do { - $resources->addElement($this->parser->getExpressionParser()->parseExpression()); + $resources->addElement($parseExpression()); } while (!$stream->test(Token::BLOCK_END_TYPE)); } diff --git a/src/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php index ac6baa6d88fa8..d77cbbf4a27de 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/StopwatchTokenParser.php @@ -36,7 +36,9 @@ public function parse(Token $token): Node $stream = $this->parser->getStream(); // {% stopwatch 'bar' %} - $name = $this->parser->getExpressionParser()->parseExpression(); + $name = method_exists($this->parser, 'parseExpression') ? + $this->parser->parseExpression() : + $this->parser->getExpressionParser()->parseExpression(); $stream->expect(Token::BLOCK_END_TYPE); diff --git a/src/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php index c6d850d07cbf7..a64a2332810e7 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/TransDefaultDomainTokenParser.php @@ -25,7 +25,9 @@ final class TransDefaultDomainTokenParser extends AbstractTokenParser { public function parse(Token $token): Node { - $expr = $this->parser->getExpressionParser()->parseExpression(); + $expr = method_exists($this->parser, 'parseExpression') ? + $this->parser->parseExpression() : + $this->parser->getExpressionParser()->parseExpression(); $this->parser->getStream()->expect(Token::BLOCK_END_TYPE); diff --git a/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php b/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php index 67b92dd8d55fd..f522356bc6774 100644 --- a/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php +++ b/src/Symfony/Bridge/Twig/TokenParser/TransTokenParser.php @@ -36,29 +36,33 @@ public function parse(Token $token): Node $vars = new ArrayExpression([], $lineno); $domain = null; $locale = null; + $parseExpression = method_exists($this->parser, 'parseExpression') + ? $this->parser->parseExpression(...) + : $this->parser->getExpressionParser()->parseExpression(...); + if (!$stream->test(Token::BLOCK_END_TYPE)) { if ($stream->test('count')) { // {% trans count 5 %} $stream->next(); - $count = $this->parser->getExpressionParser()->parseExpression(); + $count = $parseExpression(); } if ($stream->test('with')) { // {% trans with vars %} $stream->next(); - $vars = $this->parser->getExpressionParser()->parseExpression(); + $vars = $parseExpression(); } if ($stream->test('from')) { // {% trans from "messages" %} $stream->next(); - $domain = $this->parser->getExpressionParser()->parseExpression(); + $domain = $parseExpression(); } if ($stream->test('into')) { // {% trans into "fr" %} $stream->next(); - $locale = $this->parser->getExpressionParser()->parseExpression(); + $locale = $parseExpression(); } elseif (!$stream->test(Token::BLOCK_END_TYPE)) { throw new SyntaxError('Unexpected token. Twig was looking for the "with", "from", or "into" keyword.', $stream->getCurrent()->getLine(), $stream->getSourceContext()); } diff --git a/src/Symfony/Bridge/Twig/composer.json b/src/Symfony/Bridge/Twig/composer.json index 3af8ccbb7ecce..f0ae491de58a1 100644 --- a/src/Symfony/Bridge/Twig/composer.json +++ b/src/Symfony/Bridge/Twig/composer.json @@ -30,7 +30,7 @@ "symfony/dependency-injection": "^6.4|^7.0", "symfony/emoji": "^7.1", "symfony/finder": "^6.4|^7.0", - "symfony/form": "^6.4|^7.0", + "symfony/form": "^6.4.20|^7.2.5", "symfony/html-sanitizer": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php index f4281cd21eef8..4dc86130a8cc5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php @@ -86,7 +86,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int ['Timezone', date_default_timezone_get().' ('.(new \DateTimeImmutable())->format(\DateTimeInterface::W3C).')'], ['OPcache', \extension_loaded('Zend OPcache') ? (filter_var(\ini_get('opcache.enable'), FILTER_VALIDATE_BOOLEAN) ? 'Enabled' : 'Not enabled') : 'Not installed'], ['APCu', \extension_loaded('apcu') ? (filter_var(\ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? 'Enabled' : 'Not enabled') : 'Not installed'], - ['Xdebug', \extension_loaded('xdebug') ? ($xdebugMode && $xdebugMode !== 'off' ? 'Enabled (' . $xdebugMode . ')' : 'Not enabled') : 'Not installed'], + ['Xdebug', \extension_loaded('xdebug') ? ($xdebugMode && 'off' !== $xdebugMode ? 'Enabled (' . $xdebugMode . ')' : 'Not enabled') : 'Not installed'], ]; $io->table([], $rows); diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php index 4ef2f5a1d0d56..0e48ead596cca 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php @@ -146,6 +146,16 @@ protected function execute(InputInterface $input, OutputInterface $output): int } $this->warmupOptionals($useBuildDir ? $realCacheDir : $warmupDir, $warmupDir, $io); } + + // fix references to cached files with the real cache directory name + $search = [$warmupDir, str_replace('/', '\\/', $warmupDir), str_replace('\\', '\\\\', $warmupDir)]; + $replace = str_replace('\\', '/', $realBuildDir); + foreach (Finder::create()->files()->in($warmupDir) as $file) { + $content = str_replace($search, $replace, $this->filesystem->readFile($file), $count); + if ($count) { + file_put_contents($file, $content); + } + } } if (!$fs->exists($warmupDir.'/'.$containerDir)) { @@ -227,16 +237,6 @@ private function warmup(string $warmupDir, string $realBuildDir): void throw new \LogicException('Calling "cache:clear" with a kernel that does not implement "Symfony\Component\HttpKernel\RebootableInterface" is not supported.'); } $kernel->reboot($warmupDir); - - // fix references to cached files with the real cache directory name - $search = [$warmupDir, str_replace('\\', '\\\\', $warmupDir)]; - $replace = str_replace('\\', '/', $realBuildDir); - foreach (Finder::create()->files()->in($warmupDir) as $file) { - $content = str_replace($search, $replace, $this->filesystem->readFile($file), $count); - if ($count) { - file_put_contents($file, $content); - } - } } private function warmupOptionals(string $cacheDir, string $warmupDir, SymfonyStyle $io): void diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php index 46cdca9abf1de..2c5b8291bf189 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php @@ -287,7 +287,9 @@ private function findProperServiceName(InputInterface $input, SymfonyStyle $io, return $matchingServices[0]; } - return $io->choice('Select one of the following services to display its information', $matchingServices); + natsort($matchingServices); + + return $io->choice('Select one of the following services to display its information', array_values($matchingServices)); } private function findProperTagName(InputInterface $input, SymfonyStyle $io, ContainerBuilder $container, string $tagName): string @@ -305,7 +307,9 @@ private function findProperTagName(InputInterface $input, SymfonyStyle $io, Cont return $matchingTags[0]; } - return $io->choice('Select one of the following tags to display its information', $matchingTags); + natsort($matchingTags); + + return $io->choice('Select one of the following tags to display its information', array_values($matchingTags)); } private function findServiceIdsContaining(ContainerBuilder $container, string $name, bool $showHidden): array diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php index b26d3f9ad20dd..194d1c50d25d5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php @@ -62,6 +62,10 @@ public function __construct( private array $enabledLocales = [], ) { parent::__construct(); + + if (!method_exists($writer, 'getFormats')) { + throw new \InvalidArgumentException(sprintf('The writer class "%s" does not implement the "getFormats()" method.', $writer::class)); + } } protected function configure(): void diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationLintCommandPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationLintCommandPass.php new file mode 100644 index 0000000000000..4756795d1beff --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationLintCommandPass.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Translation\TranslatorBagInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +final class TranslationLintCommandPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container): void + { + if (!$container->hasDefinition('console.command.translation_lint') || !$container->has('translator')) { + return; + } + + $translatorClass = $container->getParameterBag()->resolveValue($container->findDefinition('translator')->getClass()); + + if (!is_subclass_of($translatorClass, TranslatorInterface::class) || !is_subclass_of($translatorClass, TranslatorBagInterface::class)) { + $container->removeDefinition('console.command.translation_lint'); + } + } +} diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php new file mode 100644 index 0000000000000..7542191d0e83e --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; + +class TranslationUpdateCommandPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container): void + { + if (!$container->hasDefinition('console.command.translation_extract')) { + return; + } + + $translationWriterClass = $container->getParameterBag()->resolveValue($container->findDefinition('translation.writer')->getClass()); + + if (!method_exists($translationWriterClass, 'getFormats')) { + $container->removeDefinition('console.command.translation_extract'); + } + } +} diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 678698f4d0747..5154393f2769e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -46,6 +46,7 @@ use Symfony\Component\Translation\Translator; use Symfony\Component\TypeInfo\Type; use Symfony\Component\Uid\Factory\UuidFactory; +use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Validation; use Symfony\Component\Webhook\Controller\WebhookController; use Symfony\Component\WebLink\HttpHeaderSerializer; @@ -250,6 +251,8 @@ private function addFormSection(ArrayNodeDefinition $rootNode, callable $enableI ->scalarNode('field_name')->defaultValue('_token')->end() ->arrayNode('field_attr') ->performNoDeepMerging() + ->normalizeKeys(false) + ->useAttributeAsKey('name') ->scalarPrototype()->end() ->defaultValue(['data-controller' => 'csrf-protection']) ->end() @@ -1017,7 +1020,7 @@ private function addValidationSection(ArrayNodeDefinition $rootNode, callable $e ->validate()->castToArray()->end() ->end() ->scalarNode('translation_domain')->defaultValue('validators')->end() - ->enumNode('email_validation_mode')->values(['html5', 'loose', 'strict'])->defaultValue('html5')->end() + ->enumNode('email_validation_mode')->values((class_exists(Email::class) ? Email::VALIDATION_MODES : ['html5-allow-no-tld', 'html5', 'strict']) + ['loose'])->defaultValue('html5')->end() ->arrayNode('mapping') ->addDefaultsIfNotSet() ->fixXmlConfig('path') diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 26cae1f306c8f..3c4e4f9f3a5eb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -120,6 +120,8 @@ use Symfony\Component\Mime\MimeTypeGuesserInterface; use Symfony\Component\Mime\MimeTypes; use Symfony\Component\Notifier\Bridge as NotifierBridge; +use Symfony\Component\Notifier\Bridge\FakeChat\FakeChatTransportFactory; +use Symfony\Component\Notifier\Bridge\FakeSms\FakeSmsTransportFactory; use Symfony\Component\Notifier\ChatterInterface; use Symfony\Component\Notifier\Notifier; use Symfony\Component\Notifier\Recipient\Recipient; @@ -310,10 +312,17 @@ public function load(array $configs, ContainerBuilder $container): void } } + $emptySecretHint = '"framework.secret" option'; if (isset($config['secret'])) { $container->setParameter('kernel.secret', $config['secret']); + $usedEnvs = []; + $container->resolveEnvPlaceholders($config['secret'], null, $usedEnvs); + + if ($usedEnvs) { + $emptySecretHint = \sprintf('"%s" env var%s', implode('", "', $usedEnvs), 1 === \count($usedEnvs) ? '' : 's'); + } } - $container->parameterCannotBeEmpty('kernel.secret', 'A non-empty value for the parameter "kernel.secret" is required. Did you forget to configure the "framework.secret" option?'); + $container->parameterCannotBeEmpty('kernel.secret', 'A non-empty value for the parameter "kernel.secret" is required. Did you forget to configure the '.$emptySecretHint.'?'); $container->setParameter('kernel.http_method_override', $config['http_method_override']); $container->setParameter('kernel.trust_x_sendfile_type_header', $config['trust_x_sendfile_type_header']); @@ -606,7 +615,7 @@ public function load(array $configs, ContainerBuilder $container): void $container->registerForAutoconfiguration(DataCollectorInterface::class) ->addTag('data_collector'); $container->registerForAutoconfiguration(FormTypeInterface::class) - ->addTag('form.type'); + ->addTag('form.type', ['csrf_token_id' => '%.form.type_extension.csrf.token_id%']); $container->registerForAutoconfiguration(FormTypeGuesserInterface::class) ->addTag('form.type_guesser'); $container->registerForAutoconfiguration(FormTypeExtensionInterface::class) @@ -722,7 +731,7 @@ static function (ChildDefinition $definition, AsPeriodicTask|AsCronTask $attribu $container->getDefinition('config_cache_factory')->setArguments([]); } - if (!$config['disallow_search_engine_index'] ?? false) { + if (!$config['disallow_search_engine_index']) { $container->removeDefinition('disallow_search_engine_index_response_listener'); } @@ -768,9 +777,7 @@ private function registerFormConfiguration(array $config, ContainerBuilder $cont $container->setParameter('form.type_extension.csrf.enabled', true); $container->setParameter('form.type_extension.csrf.field_name', $config['form']['csrf_protection']['field_name']); $container->setParameter('form.type_extension.csrf.field_attr', $config['form']['csrf_protection']['field_attr']); - - $container->getDefinition('form.type_extension.csrf') - ->replaceArgument(7, $config['form']['csrf_protection']['token_id']); + $container->setParameter('.form.type_extension.csrf.token_id', $config['form']['csrf_protection']['token_id']); } else { $container->setParameter('form.type_extension.csrf.enabled', false); } @@ -1939,24 +1946,14 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder $container->setParameter('serializer.default_context', $defaultContext); } - if (!$container->hasDefinition('serializer.normalizer.object')) { - return; - } - - $arguments = $container->getDefinition('serializer.normalizer.object')->getArguments(); - $context = $arguments[6] ?? $defaultContext; - - if (isset($config['circular_reference_handler']) && $config['circular_reference_handler']) { - $context += ['circular_reference_handler' => new Reference($config['circular_reference_handler'])]; - $container->getDefinition('serializer.normalizer.object')->setArgument(5, null); + if ($config['circular_reference_handler'] ?? false) { + $container->setParameter('.serializer.circular_reference_handler', $config['circular_reference_handler']); } if ($config['max_depth_handler'] ?? false) { - $context += ['max_depth_handler' => new Reference($config['max_depth_handler'])]; + $container->setParameter('.serializer.max_depth_handler', $config['max_depth_handler']); } - $container->getDefinition('serializer.normalizer.object')->setArgument(6, $context); - $container->getDefinition('serializer.normalizer.property')->setArgument(5, $defaultContext); $container->setParameter('.serializer.named_serializers', $config['named_serializers'] ?? []); @@ -2249,13 +2246,17 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder $transportRateLimiterReferences = []; foreach ($config['transports'] as $name => $transport) { $serializerId = $transport['serializer'] ?? 'messenger.default_serializer'; + $tags = [ + 'alias' => $name, + 'is_failure_transport' => \in_array($name, $failureTransports, true), + ]; + if (str_starts_with($transport['dsn'], 'sync://')) { + $tags['is_consumable'] = false; + } $transportDefinition = (new Definition(TransportInterface::class)) ->setFactory([new Reference('messenger.transport_factory'), 'createTransport']) ->setArguments([$transport['dsn'], $transport['options'] + ['transport_name' => $name], new Reference($serializerId)]) - ->addTag('messenger.receiver', [ - 'alias' => $name, - 'is_failure_transport' => \in_array($name, $failureTransports, true), - ]) + ->addTag('messenger.receiver', $tags) ; $container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition); $senderAliases[$name] = $transportId; @@ -2543,11 +2544,13 @@ private function registerHttpClientConfiguration(array $config, ContainerBuilder ->setFactory([ScopingHttpClient::class, 'forBaseUri']) ->setArguments([new Reference('http_client.transport'), $baseUri, $scopeConfig]) ->addTag('http_client.client') + ->addTag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore']) ; } else { $container->register($name, ScopingHttpClient::class) ->setArguments([new Reference('http_client.transport'), [$scope => $scopeConfig], $scope]) ->addTag('http_client.client') + ->addTag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore']) ; } @@ -2657,7 +2660,6 @@ private function registerMailerConfiguration(array $config, ContainerBuilder $co } $transports = $config['dsn'] ? ['main' => $config['dsn']] : $config['transports']; $container->getDefinition('mailer.transports')->setArgument(0, $transports); - $container->getDefinition('mailer.default_transport')->setArgument(0, current($transports)); $mailer = $container->getDefinition('mailer.mailer'); if (false === $messageBus = $config['message_bus']) { @@ -2777,7 +2779,7 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $ $container->removeDefinition('notifier.channel.email'); } - foreach (['texter', 'chatter', 'notifier.channel.chat', 'notifier.channel.email', 'notifier.channel.sms'] as $serviceId) { + foreach (['texter', 'chatter', 'notifier.channel.chat', 'notifier.channel.email', 'notifier.channel.sms', 'notifier.channel.push', 'notifier.channel.desktop'] as $serviceId) { if (!$container->hasDefinition($serviceId)) { continue; } @@ -2826,8 +2828,6 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $ NotifierBridge\Engagespot\EngagespotTransportFactory::class => 'notifier.transport_factory.engagespot', NotifierBridge\Esendex\EsendexTransportFactory::class => 'notifier.transport_factory.esendex', NotifierBridge\Expo\ExpoTransportFactory::class => 'notifier.transport_factory.expo', - NotifierBridge\FakeChat\FakeChatTransportFactory::class => 'notifier.transport_factory.fake-chat', - NotifierBridge\FakeSms\FakeSmsTransportFactory::class => 'notifier.transport_factory.fake-sms', NotifierBridge\Firebase\FirebaseTransportFactory::class => 'notifier.transport_factory.firebase', NotifierBridge\FortySixElks\FortySixElksTransportFactory::class => 'notifier.transport_factory.forty-six-elks', NotifierBridge\FreeMobile\FreeMobileTransportFactory::class => 'notifier.transport_factory.free-mobile', @@ -2915,20 +2915,26 @@ private function registerNotifierConfiguration(array $config, ContainerBuilder $ $container->removeDefinition($classToServices[NotifierBridge\Mercure\MercureTransportFactory::class]); } - if (ContainerBuilder::willBeAvailable('symfony/fake-chat-notifier', NotifierBridge\FakeChat\FakeChatTransportFactory::class, ['symfony/framework-bundle', 'symfony/notifier', 'symfony/mailer'])) { - $container->getDefinition($classToServices[NotifierBridge\FakeChat\FakeChatTransportFactory::class]) - ->replaceArgument(0, new Reference('mailer')) - ->replaceArgument(1, new Reference('logger')) + // don't use ContainerBuilder::willBeAvailable() as these are not needed in production + if (class_exists(FakeChatTransportFactory::class)) { + $container->getDefinition('notifier.transport_factory.fake-chat') + ->replaceArgument(0, new Reference('mailer', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) + ->replaceArgument(1, new Reference('logger', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) ->addArgument(new Reference('event_dispatcher', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) ->addArgument(new Reference('http_client', ContainerBuilder::NULL_ON_INVALID_REFERENCE)); + } else { + $container->removeDefinition('notifier.transport_factory.fake-chat'); } - if (ContainerBuilder::willBeAvailable('symfony/fake-sms-notifier', NotifierBridge\FakeSms\FakeSmsTransportFactory::class, ['symfony/framework-bundle', 'symfony/notifier', 'symfony/mailer'])) { - $container->getDefinition($classToServices[NotifierBridge\FakeSms\FakeSmsTransportFactory::class]) - ->replaceArgument(0, new Reference('mailer')) - ->replaceArgument(1, new Reference('logger')) + // don't use ContainerBuilder::willBeAvailable() as these are not needed in production + if (class_exists(FakeSmsTransportFactory::class)) { + $container->getDefinition('notifier.transport_factory.fake-sms') + ->replaceArgument(0, new Reference('mailer', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) + ->replaceArgument(1, new Reference('logger', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) ->addArgument(new Reference('event_dispatcher', ContainerBuilder::NULL_ON_INVALID_REFERENCE)) ->addArgument(new Reference('http_client', ContainerBuilder::NULL_ON_INVALID_REFERENCE)); + } else { + $container->removeDefinition('notifier.transpor 8000 t_factory.fake-sms'); } if (ContainerBuilder::willBeAvailable('symfony/bluesky-notifier', NotifierBridge\Bluesky\BlueskyTransportFactory::class, ['symfony/framework-bundle', 'symfony/notifier'])) { diff --git a/src/Symfony/Bundle/FrameworkBundle/EventListener/ConsoleProfilerListener.php b/src/Symfony/Bundle/FrameworkBundle/EventListener/ConsoleProfilerListener.php index 4a8c9015eefc0..712e2ead3fb2f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/EventListener/ConsoleProfilerListener.php +++ b/src/Symfony/Bundle/FrameworkBundle/EventListener/ConsoleProfilerListener.php @@ -38,6 +38,8 @@ final class ConsoleProfilerListener implements EventSubscriberInterface /** @var \SplObjectStorage */ private \SplObjectStorage $parents; + private bool $disabled = false; + public function __construct( private readonly Profiler $profiler, private readonly RequestStack $requestStack, @@ -66,7 +68,7 @@ public function initialize(ConsoleCommandEvent $event): void $input = $event->getInput(); if (!$input->hasOption('profile') || !$input->getOption('profile')) { - $this->profiler->disable(); + $this->disabled = true; return; } @@ -92,7 +94,12 @@ public function catch(ConsoleErrorEvent $event): void public function profile(ConsoleTerminateEvent $event): void { - if (!$this->cliMode || !$this->profiler->isEnabled()) { + $error = $this->error; + $this->error = null; + + if (!$this->cliMode || $this->disabled) { + $this->disabled = false; + return; } @@ -114,8 +121,7 @@ public function profile(ConsoleTerminateEvent $event): void $request->command->exitCode = $event->getExitCode(); $request->command->interruptedBySignal = $event->getInterruptingSignal(); - $profile = $this->profiler->collect($request, $request->getResponse(), $this->error); - $this->error = null; + $profile = $this->profiler->collect($request, $request->getResponse(), $error); $this->profiles[$request] = $profile; if ($this->parents[$request] = $this->requestStack->getParentRequest()) { diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index a1eb059bb01ce..e83c4dfe611d1 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -19,6 +19,8 @@ use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RemoveUnusedSessionMarshallingHandlerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerRealRefPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerWeakRefPass; +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationLintCommandPass; +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationUpdateCommandPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\UnusedTagsPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\VirtualRequestStackPass; use Symfony\Component\Cache\Adapter\ApcuAdapter; @@ -149,6 +151,8 @@ public function build(ContainerBuilder $container): void $this->addCompilerPassIfExists($container, AddConstraintValidatorsPass::class); $this->addCompilerPassIfExists($container, AddValidatorInitializersPass::class); $this->addCompilerPassIfExists($container, AddConsoleCommandPass::class, PassConfig::TYPE_BEFORE_REMOVING); + // must be registered before the AddConsoleCommandPass + $container->addCompilerPass(new TranslationLintCommandPass(), PassConfig::TYPE_BEFORE_REMOVING, 10); // must be registered as late as possible to get access to all Twig paths registered in // twig.template_iterator definition $this->addCompilerPassIfExists($container, TranslatorPass::class, PassConfig::TYPE_BEFORE_OPTIMIZATION, -32); @@ -181,6 +185,7 @@ public function build(ContainerBuilder $container): void // must be registered after MonologBundle's LoggerChannelPass $container->addCompilerPass(new ErrorLoggerCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32); $container->addCompilerPass(new VirtualRequestStackPass()); + $container->addCompilerPass(new TranslationUpdateCommandPass(), PassConfig::TYPE_BEFORE_REMOVING); if ($container->getParameter('kernel.debug')) { $container->addCompilerPass(new AddDebugLogProcessorPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 2); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.php index c63d087c864db..a86bb7c60fdcf 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.php @@ -24,7 +24,7 @@ param('validator.translation_domain'), service('form.server_params'), param('form.type_extension.csrf.field_attr'), - abstract_arg('framework.form.csrf_protection.token_id'), + param('.form.type_extension.csrf.token_id'), ]) ->tag('form.type_extension') ; diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/http_client.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/http_client.php index 12a5c01f6bd17..a562c2598ce01 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/http_client.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/http_client.php @@ -39,6 +39,7 @@ ->factory('current') ->args([[service('http_client.transport')]]) ->tag('http_client.client') + ->tag('kernel.reset', ['method' => 'reset', 'on_invalid' => 'ignore']) ->alias(HttpClientInterface::class, 'http_client') diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php index 9eb545ca268ea..f1dc560ab76f8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/mailer.php @@ -45,11 +45,7 @@ tagged_iterator('mailer.transport_factory'), ]) - ->set('mailer.default_transport', TransportInterface::class) - ->factory([service('mailer.transport_factory'), 'fromString']) - ->args([ - abstract_arg('env(MAILER_DSN)'), - ]) + ->alias('mailer.default_transport', 'mailer.transports') ->alias(TransportInterface::class, 'mailer.default_transport') ->set('mailer.messenger.message_handler', MessageHandler::class) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier.php index 04fa4ce510a2b..28900ad10d7bd 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/notifier.php @@ -75,11 +75,17 @@ ->tag('notifier.channel', ['channel' => 'email']) ->set('notifier.channel.push', PushChannel::class) - ->args([service('texter.transports'), service('messenger.default_bus')->ignoreOnInvalid()]) + ->args([ + service('texter.transports'), + abstract_arg('message bus'), + ]) ->tag('notifier.channel', ['channel' => 'push']) ->set('notifier.channel.desktop', DesktopChannel::class) - ->args([service('texter.transports'), service('messenger.default_bus')->ignoreOnInvalid()]) + ->args([ + service('texter.transports'), + abstract_arg('message bus'), + ]) ->tag('notifier.channel', ['channel' => 'desktop']) ->set('notifier.monolog_handler', NotifierHandler::class) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php index eaef795977d98..4ae34649b4aaf 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/profiling.php @@ -40,7 +40,7 @@ ->set('console_profiler_listener', ConsoleProfilerListener::class) ->args([ - service('profiler'), + service('.lazy_profiler'), service('.virtual_request_stack'), service('debug.stopwatch'), param('kernel.runtime_mode.cli'), @@ -48,6 +48,11 @@ ]) ->tag('kernel.event_subscriber') + ->set('.lazy_profiler', Profiler::class) + ->factory('current') + ->args([[service('profiler')]]) + ->lazy() + ->set('.virtual_request_stack', VirtualRequestStack::class) ->args([service('request_stack')]) ->public() diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index ed7cc744f0464..e99022acf7c45 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -79,7 +79,7 @@ - + @@ -278,6 +278,7 @@ + @@ -310,6 +311,11 @@ + + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php index d689d42995ef9..b291f51ac8546 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.php @@ -60,7 +60,7 @@ $container->services() ->set('serializer', Serializer::class) - ->args([[], []]) + ->args([[], [], []]) ->alias(SerializerInterface::class, 'serializer') ->alias(NormalizerInterface::class, 'serializer') @@ -129,7 +129,7 @@ service('property_info')->ignoreOnInvalid(), service('serializer.mapping.class_discriminator_resolver')->ignoreOnInvalid(), null, - null, + abstract_arg('default context, set in the SerializerPass'), service('property_info')->ignoreOnInvalid(), ]) ->tag('serializer.normalizer', ['built_in' => true, 'priority' => -1000]) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php index 53856f356d056..e5a86d8f411f5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.php @@ -100,6 +100,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] ->alias(HttpKernelInterface::class, 'http_kernel') ->set('request_stack', RequestStack::class) + ->tag('kernel.reset', ['method' => 'resetRequestFormats', 'on_invalid' => 'ignore']) ->public() ->alias(RequestStack::class, 'request_stack') @@ -157,6 +158,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] ->args([ new Parameter('kernel.secret'), ]) + ->lazy() ->alias(UriSigner::class, 'uri_signer') ->set('config_cache_factory', ResourceCheckerConfigCacheFactory::class) @@ -196,6 +198,7 @@ class_exists(WorkflowEvents::class) ? WorkflowEvents::ALIASES : [] tagged_iterator('container.env_var_loader'), ]) ->tag('container.env_var_processor') + ->tag('kernel.reset', ['method' => 'reset']) ->set('slugger', AsciiSlugger::class) ->args([ diff --git a/src/Symfony/Bundle/FrameworkBundle/Test/HttpClientAssertionsTrait.php b/src/Symfony/Bundle/FrameworkBundle/Test/HttpClientAssertionsTrait.php index 9d22a822fb851..4a8afbab4ab98 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Test/HttpClientAssertionsTrait.php +++ b/src/Symfony/Bundle/FrameworkBundle/Test/HttpClientAssertionsTrait.php @@ -14,10 +14,9 @@ use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Component\HttpClient\DataCollector\HttpClientDataCollector; -/* +/** * @author Mathieu Santostefano */ - trait HttpClientAssertionsTrait { public static function assertHttpClientRequest(string $expectedUrl, string $expectedMethod = 'GET', string|array|null $expectedBody = null, array $expectedHeaders = [], string $httpClientId = 'http_client'): void diff --git a/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php b/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php index b2c2eb4d23089..87925f73c9b52 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php +++ b/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php @@ -39,6 +39,14 @@ protected function tearDown(): void static::$booted = false; } + public static function tearDownAfterClass(): void + { + static::ensureKernelShutdown(); + static::$class = null; + static::$kernel = null; + static::$booted = false; + } + /** * @throws \RuntimeException * @throws \LogicException diff --git a/src/Symfony/Bundle/FrameworkBundle/Test/NotificationAssertionsTrait.php b/src/Symfony/Bundle/FrameworkBundle/Test/NotificationAssertionsTrait.php index b68473561eb4d..2c4c5467d4ebd 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Test/NotificationAssertionsTrait.php +++ b/src/Symfony/Bundle/FrameworkBundle/Test/NotificationAssertionsTrait.php @@ -17,7 +17,7 @@ use Symfony\Component\Notifier\Message\MessageInterface; use Symfony\Component\Notifier\Test\Constraint as NotifierConstraint; -/* +/** * @author Smaïne Milianni */ trait NotificationAssertionsTrait diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php index 53706d2e05e32..6f3363f3998a0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php @@ -699,6 +699,22 @@ public function testSerializerJsonDetailedErrorMessagesNotSetByDefaultWithDebugD $this->assertSame([], $config['serializer']['default_context'] ?? []); } + public function testFormCsrfProtectionFieldAttrDoNotNormalizeKeys() + { + $processor = new Processor(); + $config = $processor->processConfiguration(new Configuration(false), [ + [ + 'form' => [ + 'csrf_protection' => [ + 'field_attr' => ['data-example-attr' => 'value'], + ], + ], + ], + ]); + + $this->assertSame(['data-example-attr' => 'value'], $config['form']['csrf_protection']['field_attr'] ?? []); + } + protected static function getBundleDefaultConfig() { return [ diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_csrf_field_attr.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_csrf_field_attr.php new file mode 100644 index 0000000000000..103ee4797a1b8 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/form_csrf_field_attr.php @@ -0,0 +1,22 @@ +loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'csrf_protection' => [ + 'enabled' => true, + ], + 'form' => [ + 'csrf_protection' => [ + 'field-attr' => [ + 'data-foo' => 'bar', + 'data-bar' => 'baz', + ], + ], + ], + 'session' => [ + 'storage_factory_id' => 'session.storage.factory.native', + ], +]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_field_attr.xml similarity index 67% rename from src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml rename to src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_field_attr.xml index 4a05e9d33294e..1889703bec2a9 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_sets_field_name.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_field_attr.xml @@ -9,7 +9,13 @@ - + + + + bar + baz + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml deleted file mode 100644 index 09ef0ee167eb4..0000000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/form_csrf_under_form_sets_field_name.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_csrf_field_attr.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_csrf_field_attr.yml new file mode 100644 index 0000000000000..db519977548c4 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/form_csrf_field_attr.yml @@ -0,0 +1,16 @@ +framework: + annotations: false + http_method_override: false + handle_all_throwables: true + php_errors: + log: true + csrf_protection: + enabled: true + form: + csrf_protection: + enabled: true + field_attr: + data-foo: bar + data-bar: baz + session: + storage_factory_id: session.storage.factory.native diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php index 798217191e7c0..655f9180eceb2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php @@ -33,6 +33,7 @@ use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\Compiler\ResolveBindingsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveInstanceofConditionalsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveTaggedIteratorArgumentPass; @@ -67,6 +68,7 @@ use Symfony\Component\Notifier\TexterInterface; use Symfony\Component\PropertyAccess\PropertyAccessor; use Symfony\Component\Security\Core\AuthenticationEvents; +use Symfony\Component\Serializer\DependencyInjection\SerializerPass; use Symfony\Component\Serializer\Mapping\Loader\AttributeLoader; use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader; use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader; @@ -1411,6 +1413,17 @@ public function testFormsCanBeEnabledWithoutCsrfProtection() $this->assertFalse($container->getParameter('form.type_extension.csrf.enabled')); } + public function testFormCsrfFieldAttr() + { + $container = $this->createContainerFromFile('form_csrf_field_attr'); + + $expected = [ + 'data-foo' => 'bar', + 'data-bar' => 'baz', + ]; + $this->assertSame($expected, $container->getParameter('form.type_extension.csrf.field_attr')); + } + public function testStopwatchEnabledWithDebugModeEnabled() { $container = $this->createContainerFromFile('default_config', [ @@ -1447,9 +1460,6 @@ public function testSerializerEnabled() $this->assertEquals(AttributeLoader::class, $argument[0]->getClass()); $this->assertEquals(new Reference('serializer.name_converter.camel_case_to_snake_case'), $container->getDefinition('serializer.name_converter.metadata_aware')->getArgument(1)); $this->assertEquals(new Reference('property_info', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), $container->getDefinition('serializer.normalizer.object')->getArgument(3)); - $this->assertArrayHasKey('circular_reference_handler', $container->getDefinition('serializer.normalizer.object')->getArgument(6)); - $this->assertArrayHasKey('max_depth_handler', $container->getDefinition('serializer.normalizer.object')->getArgument(6)); - $this->assertEquals($container->getDefinition('serializer.normalizer.object')->getArgument(6)['max_depth_handler'], new Reference('my.max.depth.handler')); } public function testSerializerWithoutTranslator() @@ -1547,13 +1557,22 @@ public function testJsonSerializableNormalizerRegistered() public function testObjectNormalizerRegistered() { - $container = $this->createContainerFromFile('full'); + $container = $this->createContainerFromFile('full', compile: false); + $container->addCompilerPass(new SerializerPass()); + $container->addCompilerPass(new ResolveBindingsPass()); + $container->compile(); $definition = $container->getDefinition('serializer.normalizer.object'); $tag = $definition->getTag('serializer.normalizer'); $this->assertEquals(ObjectNormalizer::class, $definition->getClass()); $this->assertEquals(-1000, $tag[0]['priority']); + + $this->assertEquals([ + 'enable_max_depth' => true, + 'circular_reference_handler' => new Reference('my.circular.reference.handler'), + 'max_depth_handler' => new Reference('my.max.depth.handler'), + ], $definition->getArgument(6)); } public function testConstraintViolationListNormalizerRegistered() @@ -1950,8 +1969,12 @@ public function testHttpClientDefaultOptions() ]; $this->assertSame([$defaultOptions, 4], $container->getDefinition('http_client.transport')->getArguments()); + $this->assertTrue($container->getDefinition('http_client')->hasTag('kernel.reset')); + $this->assertTrue($container->hasDefinition('foo'), 'should have the "foo" service.'); - $this->assertSame(ScopingHttpClient::class, $container->getDefinition('foo')->getClass()); + $definition = $container->getDefinition('foo'); + $this->assertSame(ScopingHttpClient::class, $definition->getClass()); + $this->assertTrue($definition->hasTag('kernel.reset')); } public function testScopedHttpClientWithoutQueryOption() @@ -2101,8 +2124,7 @@ public function testMailer(string $configFile, array $expectedTransports, array $this->assertTrue($container->hasAlias('mailer')); $this->assertTrue($container->hasDefinition('mailer.transports')); $this->assertSame($expectedTransports, $container->getDefinition('mailer.transports')->getArgument(0)); - $this->assertTrue($container->hasDefinition('mailer.default_transport')); - $this->assertSame(current($expectedTransports), $container->getDefinition('mailer.default_transport')->getArgument(0)); + $this->assertTrue($container->hasAlias('mailer.default_transport')); $this->assertTrue($container->hasDefinition('mailer.envelope_listener')); $l = $container->getDefinition('mailer.envelope_listener'); $this->assertSame('sender@example.org', $l->getArgument(0)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php index deac159b6f9b0..ad979a01a96b3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php @@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Exception\LogicException; use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; +use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Workflow\Exception\InvalidDefinitionException; class PhpFrameworkExtensionTest extends FrameworkExtensionTestCase @@ -265,4 +266,31 @@ public function testRateLimiterIsTagged() $this->assertSame('first', $container->getDefinition('limiter.first')->getTag('rate_limiter')[0]['name']); $this->assertSame('second', $container->getDefinition('limiter.second')->getTag('rate_limiter')[0]['name']); } + + /** + * @dataProvider emailValidationModeProvider + */ + public function testValidatorEmailValidationMode(string $mode) + { + $this->expectNotToPerformAssertions(); + + $this->createContainerFromClosure(function (ContainerBuilder $container) use ($mode) { + $container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'validation' => [ + 'email_validation_mode' => $mode, + ], + ]); + }); + } + + public static function emailValidationModeProvider() + { + foreach (Email::VALIDATION_MODES as $mode) { + yield [$mode]; + } + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/CachePoolsTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/CachePoolsTest.php index 2608966586a78..23f4a116ef341 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/CachePoolsTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/CachePoolsTest.php @@ -88,10 +88,6 @@ private function doTestCachePools($options, $adapterClass) $pool2 = $container->get('cache.pool2'); $pool2->save($item); - $container->get('cache_clearer.alias')->clear($container->getParameter('kernel.cache_dir')); - $item = $pool1->getItem($key); - $this->assertFalse($item->isHit()); - $item = $pool2->getItem($key); $this->assertTrue($item->isHit()); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php index bb80a448429d5..95dcc36edcc4e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/ContainerDebugCommandTest.php @@ -53,7 +53,7 @@ public function testNoDebug() public function testNoDumpedXML() { - static::bootKernel(['test_case' => 'ContainerDebug', 'root_config' => 'config.yml', 'debug' => true, 'debug.container.dump' => false]); + static::bootKernel(['test_case' => 'ContainerDebug', 'root_config' => 'no_dump.yml', 'debug' => true]); $application = new Application(static::$kernel); $application->setAutoExit(false); @@ -139,14 +139,18 @@ public function testTagsPartialSearch() $tester->setInputs(['0']); $tester->run(['command' => 'debug:container', '--tag' => 'kernel.'], ['decorated' => false]); - $this->assertStringContainsString('Select one of the following tags to display its information', $tester->getDisplay()); - $this->assertStringContainsString('[0] kernel.event_subscriber', $tester->getDisplay()); - $this->assertStringContainsString('[1] kernel.locale_aware', $tester->getDisplay()); - $this->assertStringContainsString('[2] kernel.cache_warmer', $tester->getDisplay()); - $this->assertStringContainsString('[3] kernel.fragment_renderer', $tester->getDisplay()); - $this->assertStringContainsString('[4] kernel.reset', $tester->getDisplay()); - $this->assertStringContainsString('[5] kernel.cache_clearer', $tester->getDisplay()); - $this->assertStringContainsString('Symfony Container Services Tagged with "kernel.event_subscriber" Tag', $tester->getDisplay()); + $this->assertStringMatchesFormat(<<getDisplay() + ); } public function testDescribeEnvVars() diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/FragmentTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/FragmentTest.php index 6d8966a171ba2..48d5c327a3986 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/FragmentTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/FragmentTest.php @@ -50,6 +50,6 @@ public function testGenerateFragmentUri() $client = self::createClient(['test_case' => 'Fragment', 'root_config' => 'config.yml', 'debug' => true]); $client->request('GET', '/fragment_uri'); - $this->assertSame('/_fragment?_hash=CCRGN2D%2FoAJbeGz%2F%2FdoH3bNSPwLCrmwC1zAYCGIKJ0E%3D&_path=_format%3Dhtml%26_locale%3Den%26_controller%3DSymfony%255CBundle%255CFrameworkBundle%255CTests%255CFunctional%255CBundle%255CTestBundle%2 8000 55CController%255CFragmentController%253A%253AindexAction', $client->getResponse()->getContent()); + $this->assertMatchesRegularExpression('#/_fragment\?_hash=.+&_path=_format%3Dhtml%26_locale%3Den%26_controller%3DSymfony%255CBundle%255CFrameworkBundle%255CTests%255CFunctional%255CBundle%255CTestBundle%255CController%255CFragmentController%253A%253AindexAction$#', $client->getResponse()->getContent()); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/CachePools/default.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/CachePools/default.yml index c03efedd02bf7..377d3e7852064 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/CachePools/default.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/CachePools/default.yml @@ -1,7 +1,2 @@ imports: - { resource: ../config/default.yml } - -services: - cache_clearer.alias: - alias: cache_clearer - public: true diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerDebug/no_dump.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerDebug/no_dump.yml new file mode 100644 index 0000000000000..a9c709e9a6425 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerDebug/no_dump.yml @@ -0,0 +1,5 @@ +imports: + - { resource: config.yml } + +parameters: + debug.container.dump: false diff --git a/src/Symfony/Bundle/FrameworkBundle/composer.json b/src/Symfony/Bundle/FrameworkBundle/composer.json index 9b3e7c86ea3ff..6689b61b05990 100644 --- a/src/Symfony/Bundle/FrameworkBundle/composer.json +++ b/src/Symfony/Bundle/FrameworkBundle/composer.json @@ -59,7 +59,7 @@ "symfony/scheduler": "^6.4.4|^7.0.4", "symfony/security-bundle": "^6.4|^7.0", "symfony/semaphore": "^6.4|^7.0", - "symfony/serializer": "^7.1", + "symfony/serializer": "^7.2.5", "symfony/stopwatch": "^6.4|^7.0", "symfony/string": "^6.4|^7.0", "symfony/translation": "^6.4|^7.0", @@ -97,7 +97,7 @@ "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", "symfony/security-csrf": "<7.2", "symfony/security-core": "<6.4", - "symfony/serializer": "<7.1", + "symfony/serializer": "<7.2.5", "symfony/stopwatch": "<6.4", "symfony/translation": "<6.4", "symfony/twig-bridge": "<6.4", diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index 622b853d1d8c6..a07c6b346cfe7 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -11,6 +11,7 @@ namespace Symfony\Bundle\SecurityBundle\DependencyInjection; +use Composer\InstalledVersions; use Symfony\Bridge\Twig\Extension\LogoutUrlExtension; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AuthenticatorFactoryInterface; use Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\FirewallListenerFactoryInterface; @@ -61,7 +62,6 @@ use Symfony\Component\Security\Http\Authenticator\Debug\TraceableAuthenticator; use Symfony\Component\Security\Http\Authenticator\Debug\TraceableAuthenticatorManagerListener; use Symfony\Component\Security\Http\Event\CheckPassportEvent; -use Symfony\Flex\Command\InstallRecipesCommand; /** * SecurityExtension. @@ -92,7 +92,7 @@ public function prepend(ContainerBuilder $container): void public function load(array $configs, ContainerBuilder $container): void { if (!array_filter($configs)) { - $hint = class_exists(InstallRecipesCommand::class) ? 'Try running "composer symfony:recipes:install symfony/security-bundle".' : 'Please define your settings for the "security" config section.'; + $hint = class_exists(InstalledVersions::class) && InstalledVersions::isInstalled('symfony/flex') ? 'Try running "composer symfony:recipes:install symfony/security-bundle".' : 'Please define your settings for the "security" config section.'; throw new InvalidConfigurationException('The SecurityBundle is enabled but is not configured. '.$hint); } @@ -313,13 +313,13 @@ private function createFirewalls(array $config, ContainerBuilder $container): vo $authenticators[$name] = null; } else { $firewallAuthenticatorRefs = []; - foreach ($firewallAuthenticators as $authenticatorId) { - $firewallAuthenticatorRefs[$authenticatorId] = new Reference($authenticatorId); + foreach ($firewallAuthenticators as $originalAuthenticatorId => $managerAuthenticatorId) { + $firewallAuthenticatorRefs[$originalAuthenticatorId] = new Reference($originalAuthenticatorId); } $authenticators[$name] = ServiceLocatorTagPass::register($container, $firewallAuthenticatorRefs); } $contextId = 'security.firewall.map.context.'.$name; - $isLazy = !$firewall['stateless'] && (!empty($firewall['anonymous']['lazy']) || $firewall['lazy']); + $isLazy = !$firewall['stateless'] && $firewall['lazy']; $context = new ChildDefinition($isLazy ? 'security.firewall.lazy_context' : 'security.firewall.context'); $context = $container->setDefinition($contextId, $context); $context @@ -501,7 +501,7 @@ private function createFirewall(ContainerBuilder $container, string $id, array $ $configuredEntryPoint = $defaultEntryPoint; // authenticator manager - $authenticators = array_map(fn ($id) => new Reference($id), $firewallAuthenticationProviders); + $authenticators = array_map(fn ($id) => new Reference($id), $firewallAuthenticationProviders, []); $container ->setDefinition($managerId = 'security.authenticator.manager.'.$id, new ChildDefinition('security.authenticator.manager')) ->replaceArgument(0, $authenticators) @@ -625,11 +625,11 @@ private function createAuthenticationListeners(ContainerBuilder $container, stri $authenticators = $factory->createAuthenticator($container, $id, $firewall[$key], $userProvider); if (\is_array($authenticators)) { foreach ($authenticators as $authenticator) { - $authenticationProviders[] = $authenticator; + $authenticationProviders[$authenticator] = $authenticator; $entryPoints[] = $authenticator; } } else { - $authenticationProviders[] = $authenticators; + $authenticationProviders[$authenticators] = $authenticators; $entryPoints[$key] = $authenticators; } @@ -643,11 +643,13 @@ private function createAuthenticationListeners(ContainerBuilder $container, stri } if ($container->hasDefinition('debug.security.firewall')) { - foreach ($authenticationProviders as $authenticatorId) { - $container->register('debug.'.$authenticatorId, TraceableAuthenticator::class) - ->setDecoratedService($authenticatorId) - ->setArguments([new Reference('debug.'.$authenticatorId.'.inner')]) + foreach ($authenticationProviders as &$authenticatorId) { + $traceableId = 'debug.'.$authenticatorId; + $container + ->register($traceableId, TraceableAuthenticator::class) + ->setArguments([new Reference($authenticatorId)]) ; + $authenticatorId = $traceableId; } } @@ -679,7 +681,7 @@ private function getUserProvider(ContainerBuilder $container, string $id, array return $this->createMissingUserProvider($container, $id, $factoryKey); } - if ('remember_me' === $factoryKey || 'anonymous' === $factoryKey) { + if ('remember_me' === $factoryKey) { return 'security.user_providers'; } diff --git a/src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd b/src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd index ef10635e2ff99..a8623e0b50d84 100644 --- a/src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd +++ b/src/Symfony/Bundle/SecurityBundle/Resources/config/schema/security-1.0.xsd @@ -137,7 +137,6 @@ - @@ -254,14 +253,6 @@ - - - - - - - - diff --git a/src/Symfony/Bundle/SecurityBundle/Security.php b/src/Symfony/Bundle/SecurityBundle/Security.php index 915f766f5175b..252fce011b101 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security.php +++ b/src/Symfony/Bundle/SecurityBundle/Security.php @@ -158,8 +158,7 @@ private function getAuthenticator(?string $authenticatorName, string $firewallNa $firewallAuthenticatorLocator = $this->authenticators[$firewallName]; if (!$authenticatorName) { - $authenticatorIds = array_keys($firewallAuthenticatorLocator->getProvidedServices()); - + $authenticatorIds = array_filter(array_keys($firewallAuthenticatorLocator->getProvidedServices()), fn (string $authenticatorId) => $authenticatorId !== \sprintf('security.authenticator.remember_me.%s', $firewallName)); if (!$authenticatorIds) { throw new LogicException(\sprintf('No authenticator was found for the firewall "%s".', $firewallName)); } diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php index 23aa17b9adb57..d0f3549ab8f09 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/DependencyInjection/SecurityExtensionTest.php @@ -20,7 +20,9 @@ use Symfony\Component\Config\Definition\Builder\NodeDefinition; use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException; use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Compiler\DecoratorServicePass; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; +use Symfony\Component\DependencyInjection\Compiler\ResolveReferencesToAliasesPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\ExpressionLanguage\Expression; @@ -900,6 +902,34 @@ public function testCustomHasherWithMigrateFrom() ]); } + public function testAuthenticatorsDecoration() + { + $container = $this->getRawContainer(); + $container->setParameter('kernel.debug', true); + $container->getCompilerPassConfig()->setOptimizationPasses([ + new ResolveChildDefinitionsPass(), + new DecoratorServicePass(), + new ResolveReferencesToAliasesPass(), + ]); + + $container->register(TestAuthenticator::class); + $container->loadFromExtension('security', [ + 'firewalls' => ['main' => ['custom_authenticator' => TestAuthenticator::class]], + ]); + $container->compile(); + + /** @var Reference[] $managerAuthenticators */ + $managerAuthenticators = $container->getDefinition('security.authenticator.manager.main')->getArgument(0); + $this->assertCount(1, $managerAuthenticators); + $this->assertSame('debug.'.TestAuthenticator::class, (string) reset($managerAuthenticators), 'AuthenticatorManager must be injected traceable authenticators in debug mode.'); + + $this->assertTrue($container->hasDefinition(TestAuthenticator::class), 'Original authenticator must still exist in the container so it can be used outside of the AuthenticatorManager’s context.'); + + $securityHelperAuthenticatorLocator = $container->getDefinition($container->getDefinition('security.helper')->getArgument(1)['main']); + $this->assertArrayHasKey(TestAuthenticator::class, $authenticatorMap = $securityHelperAuthenticatorLocator->getArgument(0), 'When programmatically authenticating a user, authenticators’ name must be their original ID.'); + $this->assertSame(TestAuthenticator::class, (string) $authenticatorMap[TestAuthenticator::class]->getValues()[0], 'When programmatically authenticating a user, original authenticators must be used.'); + } + protected function getRawContainer() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php index d4b336b4eaa70..82a444ef10358 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php @@ -152,7 +152,10 @@ public function testLogin() $firewallAuthenticatorLocator ->expects($this->once()) ->method('getProvidedServices') - ->willReturn(['security.authenticator.custom.dev' => $authenticator]) + ->willReturn([ + 'security.authenticator.custom.dev' => $authenticator, + 'security.authenticator.remember_me.main' => $authenticator + ]) ; $firewallAuthenticatorLocator ->expects($this->once()) @@ -252,6 +255,49 @@ public function testLoginWithoutRequestContext() $security->login($user); } + public function testLoginFailsWhenTooManyAuthenticatorsFound() + { + $request = new Request(); + $authenticator = $this->createMock(AuthenticatorInterface::class); + $requestStack = $this->createMock(RequestStack::class); + $firewallMap = $this->createMock(FirewallMap::class); + $firewall = new FirewallConfig('main', 'main'); + $userAuthenticator = $this->createMock(UserAuthenticatorInterface::class); + $user = $this->createMock(UserInterface::class); + $userChecker = $this->createMock(UserCheckerInterface::class); + + $container = $this->createMock(ContainerInterface::class); + $container + ->expects($this->atLeastOnce()) + ->method('get') + ->willReturnMap([ + ['request_stack', $requestStack], + ['security.firewall.map', $firewallMap], + ['security.authenticator.managers_locator', $this->createContainer('main', $userAuthenticator)], + ['security.user_checker_locator', $this->createContainer('main', $userChecker)], + ]) + ; + + $requestStack->expects($this->once())->method('getCurrentRequest')->willReturn($request); + $firewallMap->expects($this->once())->method('getFirewallConfig')->willReturn($firewall); + + $firewallAuthenticatorLocator = $this->createMock(ServiceProviderInterface::class); + $firewallAuthenticatorLocator + ->expects($this->once()) + ->method('getProvidedServices') + ->willReturn([ + 'security.authenticator.custom.main' => $authenticator, + 'security.authenticator.other.main' => $authenticator + ]) + ; + + $security = new Security($container, ['main' => $firewallAuthenticatorLocator]); + + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('Too many authenticators were found for the current firewall "main". You must provide an instance of "Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface" to login programmatically. The available authenticators for the firewall "main" are "security.authenticator.custom.main" ,"security.authenticator.other.main'); + $security->login($user); + } + public function testLogout() { $request = new Request(); diff --git a/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php b/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php index a13421e7ac63f..c51cf309d527b 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php +++ b/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php @@ -99,7 +99,7 @@ public function onKernelResponse(ResponseEvent $event): void return; } - if ($response->headers->has('X-Debug-Token') && $response->isRedirect() && $this->interceptRedirects && 'html' === $request->getRequestFormat()) { + if ($response->headers->has('X-Debug-Token') && $response->isRedirect() && $this->interceptRedirects && 'html' === $request->getRequestFormat() && $response->headers->has('Location')) { if ($request->hasSession() && ($session = $request->getSession())->isStarted() && $session->getFlashBag() instanceof AutoExpireFlashBag) { // keep current flashes for one more request if using AutoExpireFlashBag $session->getFlashBag()->setAll($session->getFlashBag()->peekAll()); diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml index 26bbd96455adf..9f45f1b7490ae 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/config/routing/wdt.xml @@ -4,7 +4,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd"> - + web_profiler.controller.profiler::toolbarStylesheetAction diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/notifier.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/notifier.html.twig index 9de8d216e6d1f..ed363f1d92fe2 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/notifier.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Collector/notifier.html.twig @@ -151,7 +151,7 @@ {%- if message.getOptions() is null %} {{- '(empty)' }} {%- else %} - {{- message.getOptions()|json_encode(constant('JSON_PRETTY_PRINT')) }} + {{- message.getOptions().toArray()|json_encode(constant('JSON_PRETTY_PRINT')) }} {%- endif %} diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig index 597a8095a0af6..d7deaff6bb3b8 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig @@ -173,6 +173,12 @@ } toggle.addEventListener('click', (e) => { + const toggle = e.currentTarget; + + if (e.target.closest('a, .sf-toggle') !== toggle) { + return; + } + e.preventDefault(); if ('' !== window.getSelection().toString()) { @@ -180,9 +186,6 @@ return; } - /* needed because when the toggle contains HTML contents, user can click */ - /* on any of those elements instead of their parent '.sf-toggle' element */ - const toggle = e.target.closest('.sf-toggle'); const element = document.querySelector(toggle.getAttribute('data-toggle-selector')); toggle.classList.toggle('sf-toggle-on'); @@ -205,14 +208,6 @@ toggle.innerHTML = currentContent !== altContent ? altContent : originalContent; }); - /* Prevents from disallowing clicks on links inside toggles */ - const toggleLinks = toggle.querySelectorAll('a'); - toggleLinks.forEach((toggleLink) => { - toggleLink.addEventListener('click', (e) => { - e.stopPropagation(); - }); - }); - toggle.setAttribute('data-processed', 'true'); }); } diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/open.css.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/open.css.twig index af9f0a4ceaba3..55589c2945d88 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/open.css.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/open.css.twig @@ -40,6 +40,7 @@ #source .source-content ol li { margin: 0 0 2px 0; padding-left: 5px; + white-space: preserve nowrap; } #source .source-content ol li::marker { color: var(--color-muted); diff --git a/src/Symfony/Bundle/WebProfilerBundle/Tests/Controller/ProfilerControllerTest.php b/src/Symfony/Bundle/WebProfilerBundle/Tests/Controller/ProfilerControllerTest.php index 3933d30e48dc4..0e0a1e0aae79c 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Tests/Controller/ProfilerControllerTest.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Tests/Controller/ProfilerControllerTest.php @@ -152,15 +152,15 @@ public function testToolbarStylesheetActionWithProfilerDisabled() public function testToolbarStylesheetAction() { - $urlGenerator = $this->createMock(UrlGeneratorInterface::class); - $twig = $this->createMock(Environment::class); - $profiler = $this->createMock(Profiler::class); + $kernel = new WebProfilerBundleKernel(); + $client = new KernelBrowser($kernel); - $controller = new ProfilerController($urlGenerator, $profiler, $twig, []); + $client->request('GET', '/_wdt/styles'); + + $response = $client->getResponse(); - $response = $controller->toolbarStylesheetAction(); $this->assertSame(200, $response->getStatusCode()); - $this->assertSame('text/css', $response->headers->get('Content-Type')); + $this->assertSame('text/css; charset=UTF-8', $response->headers->get('Content-Type')); $this->assertSame('max-age=600, private', $response->headers->get('Cache-Control')); } diff --git a/src/Symfony/Bundle/WebProfilerBundle/Tests/EventListener/WebDebugToolbarListenerTest.php b/src/Symfony/Bundle/WebProfilerBundle/Tests/EventListener/WebDebugToolbarListenerTest.php index 33bf1a32d27f8..cf3c189204301 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Tests/EventListener/WebDebugToolbarListenerTest.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Tests/EventListener/WebDebugToolbarListenerTest.php @@ -63,6 +63,7 @@ public static function getInjectToolbarTests() public function testHtmlRedirectionIsIntercepted($statusCode) { $response = new Response('Some content', $statusCode); + $response->headers->set('Location', 'https://example.com/'); $response->headers->set('X-Debug-Token', 'xxxxxxxx'); $event = new ResponseEvent($this->createMock(Kernel::class), new Request(), HttpKernelInterface::MAIN_REQUEST, $response); @@ -76,6 +77,7 @@ public function testHtmlRedirectionIsIntercepted($statusCode) public function testNonHtmlRedirectionIsNotIntercepted() { $response = new Response('Some content', '301'); + $response->headers->set('Location', 'https://example.com/'); $response->headers->set('X-Debug-Token', 'xxxxxxxx'); $event = new ResponseEvent($this->createMock(Kernel::class), new Request([], [], ['_format' => 'json']), HttpKernelInterface::MAIN_REQUEST, $response); @@ -139,6 +141,7 @@ public function testToolbarIsNotInjectedOnContentDispositionAttachment() public function testToolbarIsNotInjectedOnRedirection($statusCode) { $response = new Response('', $statusCode); + $response->headers->set('Location', 'https://example.com/'); $response->headers->set('X-Debug-Token', 'xxxxxxxx'); $event = new ResponseEvent($this->createMock(Kernel::class), new Request(), HttpKernelInterface::MAIN_REQUEST, $response); diff --git a/src/Symfony/Component/AssetMapper/AssetMapperDevServerSubscriber.php b/src/Symfony/Component/AssetMapper/AssetMapperDevServerSubscriber.php index 5de0fc05b35ce..cbb07add152c5 100644 --- a/src/Symfony/Component/AssetMapper/AssetMapperDevServerSubscriber.php +++ b/src/Symfony/Component/AssetMapper/AssetMapperDevServerSubscriber.php @@ -109,7 +109,7 @@ public function __construct( private readonly ?CacheItemPoolInterface $cacheMapCache = null, private readonly ?Profiler $profiler = null, ) { - $this->publicPrefix = rtrim($publicPrefix, '/').'/'; + $this->publicPrefix = '/'.trim($publicPrefix, '/').'/'; $this->extensionsMap = array_merge(self::EXTENSIONS_MAP, $extensionsMap); } diff --git a/src/Symfony/Component/AssetMapper/Compiler/CssAssetUrlCompiler.php b/src/Symfony/Component/AssetMapper/Compiler/CssAssetUrlCompiler.php index b023fd232a1e6..28b06508a6876 100644 --- a/src/Symfony/Component/AssetMapper/Compiler/CssAssetUrlCompiler.php +++ b/src/Symfony/Component/AssetMapper/Compiler/CssAssetUrlCompiler.php @@ -35,7 +35,32 @@ public function __construct( public function compile(string $content, MappedAsset $asset, AssetMapperInterface $assetMapper): string { - return preg_replace_callback(self::ASSET_URL_PATTERN, function ($matches) use ($asset, $assetMapper) { + preg_match_all('/\/\*|\*\//', $content, $commentMatches, \PREG_OFFSET_CAPTURE); + + $start = null; + $commentBlocks = []; + foreach ($commentMatches[0] as $match) { + if ('/*' === $match[0]) { + $start = $match[1]; + } elseif ($start) { + $commentBlocks[] = [$start, $match[1]]; + $start = null; + } + } + + return preg_replace_callback(self::ASSET_URL_PATTERN, function ($matches) use ($asset, $assetMapper, $commentBlocks) { + $matchPos = $matches[0][1]; + + // Ignore matchs inside comments + foreach ($commentBlocks as $block) { + if ($matchPos > $block[0]) { + if ($matchPos < $block[1]) { + return $matches[0][0]; + } + break; + } + } + try { $resolvedSourcePath = Path::join(\dirname($asset->sourcePath), $matches[1]); } catch (RuntimeException $e) { diff --git a/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php b/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php index 78d056c7577ae..ef78cad44e8fc 100644 --- a/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php +++ b/src/Symfony/Component/AssetMapper/Compiler/JavaScriptImportPathCompiler.php @@ -92,6 +92,11 @@ public function compile(string $content, MappedAsset $asset, AssetMapperInterfac return $fullImportString; } + // Ignore self-referencing import + if ($dependentAsset->logicalPath === $asset->logicalPath) { + return $fullImportString; + } + // List as a JavaScript import. // This will cause the asset to be included in the importmap (for relative imports) // and will be used to generate the preloads in the importmap. diff --git a/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php b/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php index f2e4da9b96b49..b88f0e792d44f 100644 --- a/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php +++ b/src/Symfony/Component/AssetMapper/ImportMap/Resolver/JsDelivrEsmResolver.php @@ -28,7 +28,7 @@ final class JsDelivrEsmResolver implements PackageResolverInterface public const URL_PATTERN_DIST = self::URL_PATTERN_DIST_CSS.'/+esm'; public const URL_PATTERN_ENTRYPOINT = 'https://data.jsdelivr.com/v1/packages/npm/%s@%s/entrypoints'; - public const IMPORT_REGEX = '#(?:import\s*(?:[\w$]+,)?(?:(?:\{[^}]*\}|[\w$]+|\*\s*as\s+[\w$]+)\s*\bfrom\s*)?|export\s*(?:\{[^}]*\}|\*)\s*from\s*)("/npm/((?:@[^/]+/)?[^@]+?)(?:@([^/]+))?((?:/[^/]+)*?)/\+esm")#'; + public const IMPORT_REGEX = '#(?:import\s*(?:[\w$]+,)?(?:(?:\{[^}]*\}|[\w$]+|\*\s*as\s+[\w$]+)\s*\bfrom\s*)?|export\s*(?:\{[^}]*\}|\*)\s*from\s*|await\simport\()("/npm/((?:@[^/]+/)?[^@]+?)(?:@([^/]+))?((?:/[^/]+)*?)/\+esm")(?:\)*)#'; private const ES_MODULE_SHIMS = 'es-module-shims'; diff --git a/src/Symfony/Component/AssetMapper/Path/PublicAssetsPathResolver.php b/src/Symfony/Component/AssetMapper/Path/PublicAssetsPathResolver.php index fe839d591a99e..b33abafb0995d 100644 --- a/src/Symfony/Component/AssetMapper/Path/PublicAssetsPathResolver.php +++ b/src/Symfony/Component/AssetMapper/Path/PublicAssetsPathResolver.php @@ -18,8 +18,8 @@ class PublicAssetsPathResolver implements PublicAssetsPathResolverInterface public function __construct( string $publicPrefix = '/assets/', ) { - // ensure that the public prefix always ends with a single slash - $this->publicPrefix = rtrim($publicPrefix, '/').'/'; + // ensure that the public prefix always starts and ends with a single slash + $this->publicPrefix = '/'.trim($publicPrefix, '/').'/'; } public function resolvePublicPath(string $logicalPath): string diff --git a/src/Symfony/Component/AssetMapper/Tests/Compiler/CssAssetUrlCompilerTest.php b/src/Symfony/Component/AssetMapper/Tests/Compiler/CssAssetUrlCompilerTest.php index 999407c81a558..067168b059a71 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Compiler/CssAssetUrlCompilerTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/Compiler/CssAssetUrlCompilerTest.php @@ -114,6 +114,36 @@ public static function provideCompileTests(): iterable 'expectedOutput' => 'body { background: url("https://cdn.io/images/bar.png"); }', 'expectedDependencies' => [], ]; + + yield 'ignore_comments' => [ + 'input' => 'body { background: url("images/foo.png"); /* background: url("images/bar.png"); */ }', + 'expectedOutput' => 'body { background: url("images/foo.123456.png"); /* background: url("images/bar.png"); */ }', + 'expectedDependencies' => ['images/foo.png'], + ]; + + yield 'ignore_comment_after_rule' => [ + 'input' => 'body { background: url("images/foo.png"); } /* url("images/need-ignore.png") */', + 'expectedOutput' => 'body { backgroun 8000 d: url("images/foo.123456.png"); } /* url("images/need-ignore.png") */', + 'expectedDependencies' => ['images/foo.png'], + ]; + + yield 'ignore_comment_within_rule' => [ + 'input' => 'body { background: url("images/foo.png") /* url("images/need-ignore.png") */; }', + 'expectedOutput' => 'body { background: url("images/foo.123456.png") /* url("images/need-ignore.png") */; }', + 'expectedDependencies' => ['images/foo.png'], + ]; + + yield 'ignore_multiline_comment_after_rule' => [ + 'input' => 'body { + background: url("images/foo.png"); /* + url("images/need-ignore.png") */ + }', + 'expectedOutput' => 'body { + background: url("images/foo.123456.png"); /* + url("images/need-ignore.png") */ + }', + 'expectedDependencies' => ['images/foo.png'], + ]; } public function testCompileFindsRelativeFilesViaSourcePath() diff --git a/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php b/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php index 2bb847373d9c5..9b1b2377665b1 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/Compiler/JavaScriptImportPathCompilerTest.php @@ -574,6 +574,34 @@ public function testCompileHandlesCircularBareImportAssets() $this->assertSame($popperAsset->logicalPath, $bootstrapAsset->getJavaScriptImports()[0]->assetLogicalPath); } + public function testCompileIgnoresSelfReferencingBareImportAssets() + { + $bootstrapAsset = new MappedAsset('foo.js', 'foo.js', 'foo.js'); + + $importMapConfigReader = $this->createMock(ImportMapConfigReader::class); + $importMapConfigReader->expects($this->once()) + ->method('findRootImportMapEntry') + ->with('foobar') + ->willReturn(ImportMapEntry::createRemote('foobar', ImportMapType::JS, 'foo.js', '1.2.3', 'foobar', false)); + $importMapConfigReader->expects($this->any()) + ->method('convertPathToFilesystemPath') + ->with('foo.js') + ->willReturn('foo.js'); + + $assetMapper = $this->createMock(AssetMapperInterface::class); + $assetMapper->expects($this->once()) + ->method('getAssetFromSourcePath') + ->with('foo.js') + ->willReturn($bootstrapAsset); + + $compiler = new JavaScriptImportPathCompiler($importMapConfigReader); + $input = 'import { foo } from "foobar";'; + $compiler->compile($input, $bootstrapAsset, $assetMapper); + $this->assertCount(0, $bootstrapAsset->getDependencies()); + $this->assertCount(0, $bootstrapAsset->getFileDependencies()); + $this->assertCount(0, $bootstrapAsset->getJavaScriptImports()); + } + /** * @dataProvider provideMissingImportModeTests */ diff --git a/src/Symfony/Component/AssetMapper/Tests/Fixtures/AssetMapperTestAppKernel.php b/src/Symfony/Component/AssetMapper/Tests/Fixtures/AssetMapperTestAppKernel.php index d8c44a257bdc3..48958274572d3 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Fixtures/AssetMapperTestAppKernel.php +++ b/src/Symfony/Component/AssetMapper/Tests/Fixtures/AssetMapperTestAppKernel.php @@ -44,6 +44,7 @@ public function registerContainerConfiguration(LoaderInterface $loader): void 'assets' => null, 'asset_mapper' => [ 'paths' => ['dir1', 'dir2', 'non_ascii', 'assets'], + 'public_prefix' => 'assets' ], 'test' => true, ]); diff --git a/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php b/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php index 8b7d82c8c6f06..d9650fd7c29d3 100644 --- a/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/ImportMap/Resolver/JsDelivrEsmResolverTest.php @@ -693,6 +693,13 @@ public static function provideImportRegex(): iterable ['jquery', '3.7.0'], ], ]; + + yield 'dynamic import with path' => [ + 'return(await import("/npm/@datadog/browser-rum@6.3.0/esm/boot/startRecording.js/+esm")).startRecording', + [ + ['@datadog/browser-rum/esm/boot/startRecording.js', '6.3.0'], + ], + ]; } private static function createRemoteEntry(string $importName, string $version, ImportMapType $type = ImportMapType::JS, ?string $packageSpecifier = null): ImportMapEntry diff --git a/src/Symfony/Component/AssetMapper/Tests/Path/PublicAssetsPathResolverTest.php b/src/Symfony/Component/AssetMapper/Tests/Path/PublicAssetsPathResolverTest.php index 2144b98919527..be6ac04156ff6 100644 --- a/src/Symfony/Component/AssetMapper/Tests/Path/PublicAssetsPathResolverTest.php +++ b/src/Symfony/Component/AssetMapper/Tests/Path/PublicAssetsPathResolverTest.php @@ -26,7 +26,7 @@ public function testResolvePublicPath() $this->assertSame('/assets-prefix/foo/bar', $resolver->resolvePublicPath('foo/bar')); $resolver = new PublicAssetsPathResolver( - '/assets-prefix', // The trailing slash should be added automatically + 'assets-prefix', // The leading and trailing slash should be added automatically ); $this->assertSame('/assets-prefix/', $resolver->resolvePublicPath('')); $this->assertSame('/assets-prefix/foo/bar', $resolver->resolvePublicPath('/foo/bar')); diff --git a/src/Symfony/Component/BrowserKit/AbstractBrowser.php b/src/Symfony/Component/BrowserKit/AbstractBrowser.php index 9257ef561b05e..1269fcb69e8cb 100644 --- a/src/Symfony/Component/BrowserKit/AbstractBrowser.php +++ b/src/Symfony/Component/BrowserKit/AbstractBrowser.php @@ -163,7 +163,7 @@ public function xmlHttpRequest(string $method, string $uri, array $parameters = */ public function jsonRequest(string $method, string $uri, array $parameters = [], array $server = [], bool $changeHistory = true): Crawler { - $content = json_encode($parameters); + $content = json_encode($parameters, \JSON_PRESERVE_ZERO_FRACTION); $this->setServerParameter('CONTENT_TYPE', 'application/json'); $this->setServerParameter('HTTP_ACCEPT', 'application/json'); diff --git a/src/Symfony/Component/BrowserKit/HttpBrowser.php b/src/Symfony/Component/BrowserKit/HttpBrowser.php index c143a69e28fd4..4f044421e00e9 100644 --- a/src/Symfony/Component/BrowserKit/HttpBrowser.php +++ b/src/Symfony/Component/BrowserKit/HttpBrowser.php @@ -145,10 +145,15 @@ private function getUploadedFiles(array $files): array } if (!isset($file['tmp_name'])) { $uploadedFiles[$name] = $this->getUploadedFiles($file); + continue; } - if (isset($file['tmp_name'])) { - $uploadedFiles[$name] = DataPart::fromPath($file['tmp_name'], $file['name']); + + if ('' === $file['tmp_name']) { + $uploadedFiles[$name] = new DataPart('', ''); + continue; } + + $uploadedFiles[$name] = DataPart::fromPath($file['tmp_name'], $file['name']); } return $uploadedFiles; diff --git a/src/Symfony/Component/BrowserKit/Tests/AbstractBrowserTest.php b/src/Symfony/Component/BrowserKit/Tests/AbstractBrowserTest.php index ca822e245d6ef..7e759b035f7f0 100644 --- a/src/Symfony/Component/BrowserKit/Tests/AbstractBrowserTest.php +++ b/src/Symfony/Component/BrowserKit/Tests/AbstractBrowserTest.php @@ -68,12 +68,12 @@ public function testXmlHttpRequest() public function testJsonRequest() { $client = $this->getBrowser(); - $client->jsonRequest('GET', 'http://example.com/', ['param' => 1], [], true); + $client->jsonRequest('GET', 'http://example.com/', ['param' => 1, 'float' => 10.0], [], true); $this->assertSame('application/json', $client->getRequest()->getServer()['CONTENT_TYPE']); $this->assertSame('application/json', $client->getRequest()->getServer()['HTTP_ACCEPT']); $this->assertFalse($client->getServerParameter('CONTENT_TYPE', false)); $this->assertFalse($client->getServerParameter('HTTP_ACCEPT', false)); - $this->assertSame('{"param":1}', $client->getRequest()->getContent()); + $this->assertSame('{"param":1,"float":10.0}', $client->getRequest()->getContent()); } public function testGetRequestWithIpAsHttpHost() diff --git a/src/Symfony/Component/BrowserKit/Tests/HttpBrowserTest.php b/src/Symfony/Component/BrowserKit/Tests/HttpBrowserTest.php index e1f19b16ce814..3a2547d89f488 100644 --- a/src/Symfony/Component/BrowserKit/Tests/HttpBrowserTest.php +++ b/src/Symfony/Component/BrowserKit/Tests/HttpBrowserTest.php @@ -14,6 +14,8 @@ use Symfony\Component\BrowserKit\CookieJar; use Symfony\Component\BrowserKit\History; use Symfony\Component\BrowserKit\HttpBrowser; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\MockResponse; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -208,6 +210,37 @@ public static function forwardSlashesRequestPathProvider() ]; } + public function testEmptyUpload() + { + $client = new MockHttpClient(function ($method, $url, $options) { + $this->assertSame('POST', $method); + $this->assertSame('http://localhost/', $url); + $this->assertStringStartsWith('Content-Type: multipart/form-data; boundary=', $options['normalized_headers']['content-type'][0]); + + $body = ''; + while ('' !== $data = $options['body'](1024)) { + $body .= $data; + } + + $expected = <<assertStringMatchesFormat($expected, $body); + + return new MockResponse(); + }); + + $browser = new HttpBrowser($client); + $browser->request('POST', '/', [], ['file' => ['tmp_name' => '', 'name' => 'file']]); + } + private function uploadFile(string $data): string { $path = tempnam(sys_get_temp_dir(), 'http'); diff --git a/src/Symfony/Component/Cache/Adapter/ApcuAdapter.php b/src/Symfony/Component/Cache/Adapter/ApcuAdapter.php index ddb7210057df8..b234909fdadff 100644 --- a/src/Symfony/Component/Cache/Adapter/ApcuAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ApcuAdapter.php @@ -98,19 +98,10 @@ protected function doSave(array $values, int $lifetime): array|bool return $failed; } - try { - if (false === $failures = apcu_store($values, null, $lifetime)) { - $failures = $values; - } - - return array_keys($failures); - } catch (\Throwable $e) { - if (1 === \count($values)) { - // Workaround https://github.com/krakjoe/apcu/issues/170 - apcu_delete(array_key_first($values)); - } - - throw $e; + if (false === $failures = apcu_store($values, null, $lifetime)) { + $failures = $values; } + + return array_keys($failures); } } diff --git a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php index 7b92387742894..8941ae1cdb009 100644 --- a/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/ArrayAdapter.php @@ -307,7 +307,9 @@ private function freeze($value, string $key): string|int|float|bool|array|\UnitE try { $serialized = serialize($value); } catch (\Exception $e) { - unset($this->values[$key], $this->tags[$key]); + if (!isset($this->expiries[$key])) { + unset($this->values[$key]); + } $type = get_debug_type($value); $message = \sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage()); CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); diff --git a/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php b/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php index c69c777c993e7..d67464a4fd560 100644 --- a/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/DoctrineDbalAdapter.php @@ -19,6 +19,9 @@ use Doctrine\DBAL\Exception\TableNotFoundException; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Tools\DsnParser; use Symfony\Component\Cache\Exception\InvalidArgumentException; @@ -378,6 +381,11 @@ private function addTableToSchema(Schema $schema): void $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]); $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]); $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]); - $table->setPrimaryKey([$this->idCol]); + + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted($this->idCol))], true)); + } else { + $table->setPrimaryKey([$this->idCol]); + } } } diff --git a/src/Symfony/Component/Cache/CacheItem.php b/src/Symfony/Component/Cache/CacheItem.php index ec2c0c5c470d6..4ce8e0cd1948a 100644 --- a/src/Symfony/Component/Cache/CacheItem.php +++ b/src/Symfony/Component/Cache/CacheItem.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Cache; +use Psr\Cache\CacheItemInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Exception\LogicException; @@ -30,7 +31,7 @@ final class CacheItem implements ItemInterface protected float|int|null $expiry = null; protected array $metadata = []; protected array $newMetadata = []; - protected ?ItemInterface $innerItem = null; + protected ?CacheItemInterface $innerItem = null; protected ?string $poolHash = null; protected bool $isTaggable = false; diff --git a/src/Symfony/Component/Cache/DataCollector/CacheDataCollector.php b/src/Symfony/Component/Cache/DataCollector/CacheDataCollector.php index b9bcdaf132572..22a5a0391673f 100644 --- a/src/Symfony/Component/Cache/DataCollector/CacheDataCollector.php +++ b/src/Symfony/Component/Cache/DataCollector/CacheDataCollector.php @@ -38,15 +38,7 @@ public function addInstance(string $name, TraceableAdapter $instance): void public function collect(Request $request, Response $response, ?\Throwable $exception = null): void { - $empty = ['calls' => [], 'adapters' => [], 'config' => [], 'options' => [], 'statistics' => []]; - $this->data = ['instances' => $empty, 'total' => $empty]; - foreach ($this->instances as $name => $instance) { - $this->data['instances']['calls'][$name] = $instance->getCalls(); - $this->data['instances']['adapters'][$name] = get_debug_type($instance->getPool()); - } - - $this->data['instances']['statistics'] = $this->calculateStatistics(); - $this->data['total']['statistics'] = $this->calculateTotalStatistics(); + $this->lateCollect(); } public function reset(): void @@ -59,6 +51,15 @@ public function reset(): void public function lateCollect(): void { + $empty = ['calls' => [], 'adapters' => [], 'config' => [], 'options' => [], 'statistics' => []]; + $this->data = ['instances' => $empty, 'total' => $empty]; + foreach ($this->instances as $name => $instance) { + $this->data['instances']['calls'][$name] = $instance->getCalls(); + $this->data['instances']['adapters'][$name] = get_debug_type($instance->getPool()); + } + + $this->data['instances']['statistics'] = $this->calculateStatistics(); + $this->data['total']['statistics'] = $this->calculateTotalStatistics(); $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']); } diff --git a/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php b/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php index e62febbcbaa50..b4d77fd74a7a6 100644 --- a/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php +++ b/src/Symfony/Component/Cache/DependencyInjection/CachePoolPass.php @@ -194,10 +194,6 @@ public function process(ContainerBuilder $container): void $clearer->setArgument(0, $pools); } $clearer->addTag('cache.pool.clearer'); - - if ('cache.system_clearer' === $id) { - $clearer->addTag('kernel.cache_clearer'); - } } $allPoolsKeys = array_keys($allPools); diff --git a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php index da430296bcdcf..031191cabc4b1 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/AdapterTestCase.php @@ -350,6 +350,23 @@ public function testNumericKeysWorkAfterMemoryLeakPrevention() $this->assertEquals('value-50', $cache->getItem((string) 50)->get()); } + + public function testErrorsDontInvalidate() + { + if (isset($this->skippedTests[__FUNCTION__])) { + $this->markTestSkipped($this->skippedTests[__FUNCTION__]); + } + + $cache = $this->createCachePool(0, __FUNCTION__); + + $item = $cache->getItem('foo'); + $this->assertTrue($cache->save($item->set('bar'))); + $this->assertTrue($cache->hasItem('foo')); + + $item->set(static fn () => null); + $this->assertFalse($cache->save($item)); + $this->assertSame('bar', $cache->getItem('foo')->get()); + } } class NotUnserializable diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php index 5bbe4d1d7be13..ada3149d63d3c 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/PhpArrayAdapterTest.php @@ -42,6 +42,7 @@ class PhpArrayAdapterTest extends AdapterTestCase 'testSaveDeferredWhenChangingValues' => 'PhpArrayAdapter is read-only.', 'testSaveDeferredOverwrite' => 'PhpArrayAdapter is read-only.', 'testIsHitDeferred' => 'PhpArrayAdapter is read-only.', + 'testErrorsDontInvalidate' => 'PhpArrayAdapter is read-only.', 'testExpiresAt' => 'PhpArrayAdapter does not support expiration.', 'testExpiresAtWithNull' => 'PhpArrayAdapter does not support expiration.', diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php index 5fdd35cafb68c..d9afd85a8e1f6 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php @@ -36,6 +36,8 @@ public function testCreateConnection() $this->assertInstanceOf(StreamConnection::class, $connection); $redisHost = explode(':', $redisHost); + $connectionParameters = $connection->getParameters()->toArray(); + $params = [ 'scheme' => 'tcp', 'host' => $redisHost[0], @@ -46,7 +48,12 @@ public function testCreateConnection() 'tcp_nodelay' => true, 'database' => '1', ]; - $this->assertSame($params, $connection->getParameters()->toArray()); + + if (isset($connectionParameters['conn_uid'])) { + $params['conn_uid'] = $connectionParameters['conn_uid']; // if present, the value cannot be predicted + } + + $this->assertSame($params, $connectionParameters); } public function testCreateSslConnection() @@ -60,6 +67,8 @@ public function testCreateSslConnection() $this->assertInstanceOf(StreamConnection::class, $connection); $redisHost = explode(':', $redisHost); + $connectionParameters = $connection->getParameters()->toArray(); + $params = [ 'scheme' => 'tls', 'host' => $redisHost[0], @@ -71,7 +80,12 @@ public function testCreateSslConnection() 'tcp_nodelay' => true, 'database' => '1', ]; - $this->assertSame($params, $connection->getParameters()->toArray()); + + if (isset($connectionParameters['conn_uid'])) { + $params['conn_uid'] = $connectionParameters['conn_uid']; // if present, the value cannot be predicted + } + + $this->assertSame($params, $connectionParameters); } public function testAclUserPasswordAuth() diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PredisRedisReplicationAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PredisRedisReplicationAdapterTest.php new file mode 100644 index 0000000000000..cda92af8c7a6c --- /dev/null +++ b/src/Symfony/Component/Cache/Tests/Adapter/PredisRedisReplicationAdapterTest.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Tests\Adapter; + +use Symfony\Component\Cache\Adapter\RedisAdapter; + +/** + * @group integration + */ +class PredisRedisReplicationAdapterTest extends AbstractRedisAdapterTestCase +{ + public static function setUpBeforeClass(): void + { + if (!$hosts = getenv('REDIS_REPLICATION_HOSTS')) { + self::markTestSkipped('REDIS_REPLICATION_HOSTS env var is not defined.'); + } + + self::$redis = RedisAdapter::createConnection('redis:?host['.str_replace(' ', ']&host[', $hosts).'][role]=master', ['replication' => 'predis', 'class' => \Predis\Client::class, 'prefix' => 'prefix_']); + } +} diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PredisReplicationAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PredisReplicationAdapterTest.php new file mode 100644 index 0000000000000..28af1b5b4e27e --- /dev/null +++ b/src/Symfony/Component/Cache/Tests/Adapter/PredisReplicationAdapterTest.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Tests\Adapter; + +/** + * @group integration + */ +class PredisReplicationAdapterTest extends AbstractRedisAdapterTestCase +{ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + if (!$hosts = getenv('REDIS_REPLICATION_HOSTS')) { + self::markTestSkipped('REDIS_REPLICATION_HOSTS env var is not defined.'); + } + + $hosts = explode(' ', getenv('REDIS_REPLICATION_HOSTS')); + $lastArrayKey = array_key_last($hosts); + $hostTable = []; + foreach($hosts as $key => $host) { + $hostInformation = array_combine(['host', 'port'], explode(':', $host)); + if($lastArrayKey === $key) { + $hostInformation['role'] = 'master'; + } + $hostTable[] = $hostInformation; + } + + self::$redis = new \Predis\Client($hostTable, ['replication' => 'predis', 'prefix' => 'prefix_']); + } +} diff --git a/src/Symfony/Component/Cache/Tests/DataCollector/CacheDataCollectorTest.php b/src/Symfony/Component/Cache/Tests/DataCollector/CacheDataCollectorTest.php index bb102363cf758..cea761f5f99ac 100644 --- a/src/Symfony/Component/Cache/Tests/DataCollector/CacheDataCollectorTest.php +++ b/src/Symfony/Component/Cache/Tests/DataCollector/CacheDataCollectorTest.php @@ -17,6 +17,7 @@ use Symfony\Component\Cache\DataCollector\CacheDataCollector; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\VarDumper\Cloner\Data; class CacheDataCollectorTest extends TestCase { @@ -104,6 +105,27 @@ public function testCollectBeforeEnd() $this->assertSame(1, $stats[self::INSTANCE_NAME]['misses'], 'misses'); } + public function testLateCollect() + { + $adapter = new TraceableAdapter(new NullAdapter()); + + $collector = new CacheDataCollector(); + $collector->addInstance(self::INSTANCE_NAME, $adapter); + + $adapter->get('foo', function () use ($collector) { + $collector->lateCollect(); + + return 123; + }); + + $stats = $collector->getStatistics(); + $this->assertGreaterThan(0, $stats[self::INSTANCE_NAME]['time']); + $this->assertEquals($stats[self::INSTANCE_NAME]['hits'], 0, 'hits'); + $this->assertEquals($stats[self::INSTANCE_NAME]['misses'], 1, 'misses'); + $this->assertEquals($stats[self::INSTANCE_NAME]['calls'], 1, 'calls'); + $this->assertInstanceOf(Data::class, $collector->getCalls()); + } + private function getCacheDataCollectorStatisticsFromEvents(array $traceableAdapterEvents) { $traceableAdapterMock = $this->createMock(TraceableAdapter::class); diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index 87c689209fac6..f6bb9bbe101f1 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -17,6 +17,7 @@ use Predis\Connection\Aggregate\ReplicationInterface; use Predis\Connection\Cluster\ClusterInterface as Predis2ClusterInterface; use Predis\Connection\Cluster\RedisCluster as Predis2RedisCluster; +use Predis\Connection\Replication\ReplicationInterface as Predis2ReplicationInterface; use Predis\Response\ErrorInterface; use Predis\Response\Status; use Relay\Relay; @@ -479,9 +480,16 @@ protected function doClear(string $namespace): bool $cleared = true; $hosts = $this->getHosts(); $host = reset($hosts); - if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { - // Predis supports info command only on the master in replication environments - $hosts = [$host->getClientFor('master')]; + if ($host instanceof \Predis\Client) { + $connection = $host->getConnection(); + + if ($connection instanceof ReplicationInterface) { + $hosts = [$host->getClientFor('master')]; + } elseif ($connection instanceof Predis2ReplicationInterface) { + $connection->switchToMaster(); + + $hosts = [$host]; + } } foreach ($hosts as $host) { diff --git a/src/Symfony/Component/Cache/Traits/Relay/MoveTrait.php b/src/Symfony/Component/Cache/Traits/Relay/MoveTrait.php index 1f1b84c009399..18086f61d68c5 100644 --- a/src/Symfony/Component/Cache/Traits/Relay/MoveTrait.php +++ b/src/Symfony/Component/Cache/Traits/Relay/MoveTrait.php @@ -33,12 +33,12 @@ public function lmove($srckey, $dstkey, $srcpos, $dstpos): mixed */ trait MoveTrait { - public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|null|string + public function blmove($srckey, $dstkey, $srcpos, $dstpos, $timeout): \Relay\Relay|false|string|null { return $this->initializeLazyObject()->blmove(...\func_get_args()); } - public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|null|string + public function lmove($srckey, $dstkey, $srcpos, $dstpos): \Relay\Relay|false|string|null { return $this->initializeLazyObject()->lmove(...\func_get_args()); } diff --git a/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php b/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php index 08e91c2d11105..ddd6dbb291051 100644 --- a/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php +++ b/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php @@ -412,39 +412,39 @@ private function getComment(BaseNode $node): string { $comment = ''; if ('' !== $info = (string) $node->getInfo()) { - $comment .= ' * '.$info."\n"; + $comment .= $info."\n"; } if (!$node instanceof ArrayNode) { foreach ((array) ($node->getExample() ?? []) as $example) { - $comment .= ' * @example '.$example."\n"; + $comment .= '@example '.$example."\n"; } if ('' !== $default = $node->getDefaultValue()) { - $comment .= ' * @default '.(null === $default ? 'null' : var_export($default, true))."\n"; + $comment .= '@default '.(null === $default ? 'null' : var_export($default, true))."\n"; } if ($node instanceof EnumNode) { - $comment .= \sprintf(' * @param ParamConfigurator|%s $value', implode('|', array_unique(array_map(fn ($a) => !$a instanceof \UnitEnum ? var_export($a, true) : '\\'.ltrim(var_export($a, true), '\\'), $node->getValues()))))."\n"; + $comment .= \sprintf('@param ParamConfigurator|%s $value', implode('|', array_unique(array_map(fn ($a) => !$a instanceof \UnitEnum ? var_export($a, true) : '\\'.ltrim(var_export($a, true), '\\'), $node->getValues()))))."\n"; } else { $parameterTypes = $this->getParameterTypes($node); - $comment .= ' * @param ParamConfigurator|'.implode('|', $parameterTypes).' $value'."\n"; + $comment .= '@param ParamConfigurator|'.implode('|', $parameterTypes).' $value'."\n"; } } else { foreach ((array) ($node->getExample() ?? []) as $example) { - $comment .= ' * @example '.json_encode($example)."\n"; + $comment .= '@example '.json_encode($example)."\n"; } if ($node->hasDefaultValue() && [] != $default = $node->getDefaultValue()) { - $comment .= ' * @default '.json_encode($default)."\n"; + $comment .= '@default '.json_encode($default)."\n"; } } if ($node->isDeprecated()) { - $comment .= ' * @deprecated '.$node->getDeprecation($node->getName(), $node->getParent()->getName())['message']."\n"; + $comment .= '@deprecated '.$node->getDeprecation($node->getName(), $node->getParent()->getName())['message']."\n"; } - return $comment; + return $comment ? ' * '.str_replace("\n", "\n * ", rtrim($comment, "\n"))."\n" : ''; } /** diff --git a/src/Symfony/Component/Config/ResourceCheckerConfigCache.php b/src/Symfony/Component/Config/ResourceCheckerConfigCache.php index c201a3dcbf394..955aee7e575ad 100644 --- a/src/Symfony/Component/Config/ResourceCheckerConfigCache.php +++ b/src/Symfony/Component/Config/ResourceCheckerConfigCache.php @@ -127,8 +127,8 @@ public function write(string $content, ?array $metadata = null): void $ser = preg_replace_callback('/;O:(\d+):"/', static fn ($m) => ';O:'.(9 + $m[1]).':"Tracking\\', $ser); $ser = preg_replace_callback('/s:(\d+):"\0[^\0]++\0/', static fn ($m) => 's:'.($m[1] - \strlen($m[0]) + 6).':"', $ser); - $ser = unserialize($ser); - $ser = @json_encode($ser) ?: []; + $ser = unserialize($ser, ['allowed_classes' => false]); + $ser = @json_encode($ser, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE) ?: []; 8000 $ser = str_replace('"__PHP_Incomplete_Class_Name":"Tracking\\\\', '"@type":"', $ser); $ser = \sprintf('{"resources":%s}', $ser); diff --git a/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues.php b/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues.php index 153af57be9b5b..5c1259c20edd8 100644 --- a/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues.php +++ b/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues.php @@ -38,7 +38,13 @@ public function getConfigTreeBuilder(): TreeBuilder ->arrayPrototype() ->fixXmlConfig('option') ->children() - ->scalarNode('dsn')->end() + ->scalarNode('dsn') + ->info(<<<'INFO' + The DSN to use. This is a required option. + The info is used to describe the DSN, + it can be multi-line. + INFO) + ->end() ->scalarNode('serializer')->defaultNull()->end() ->arrayNode('options') ->normalizeKeys(false) diff --git a/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues/Symfony/Config/NodeInitialValues/Messenger/TransportsConfig.php b/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues/Symfony/Config/NodeInitialValues/Messenger/TransportsConfig.php index b9d8b48db3556..6a98166eccc94 100644 --- a/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues/Symfony/Config/NodeInitialValues/Messenger/TransportsConfig.php +++ b/src/Symfony/Component/Config/Tests/Builder/Fixtures/NodeInitialValues/Symfony/Config/NodeInitialValues/Messenger/TransportsConfig.php @@ -16,6 +16,9 @@ class TransportsConfig private $_usedProperties = []; /** + * The DSN to use. This is a required option. + * The info is used to describe the DSN, + * it can be multi-line. * @default null * @param ParamConfigurator|mixed $value * @return $this diff --git a/src/Symfony/Component/Config/Tests/ResourceCheckerConfigCacheTest.php b/src/Symfony/Component/Config/Tests/ResourceCheckerConfigCacheTest.php index 3dbbe43346f9b..ff0c96f76855d 100644 --- a/src/Symfony/Component/Config/Tests/ResourceCheckerConfigCacheTest.php +++ b/src/Symfony/Component/Config/Tests/ResourceCheckerConfigCacheTest.php @@ -168,6 +168,6 @@ public function testCacheWithCustomMetaFile() 'resource' => __FILE__, ], ], - ])); + ], \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); } } diff --git a/src/Symfony/Component/Console/Helper/ProgressBar.php b/src/Symfony/Component/Console/Helper/ProgressBar.php index 2dac1dfa237b7..dc3605ad2fee0 100644 --- a/src/Symfony/Component/Console/Helper/ProgressBar.php +++ b/src/Symfony/Component/Console/Helper/ProgressBar.php @@ -229,7 +229,7 @@ public function getEstimated(): float public function getRemaining(): float { - if (!$this->step) { + if (0 === $this->step || $this->step === $this->startingStep) { return 0; } @@ -513,12 +513,21 @@ private function overwrite(string $message): void if ($this->output instanceof ConsoleSectionOutput) { $messageLines = explode("\n", $this->previousMessage); $lineCount = \count($messageLines); + + $lastLineWithoutDecoration = Helper::removeDecoration($this->output->getFormatter(), end($messageLines) ?? ''); + + // When the last previous line is empty (without formatting) it is already cleared by the section output, so we don't need to clear it again + if ('' === $lastLineWithoutDecoration) { + --$lineCount; + } + foreach ($messageLines as $messageLine) { $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine)); if ($messageLineLength > $this->terminal->getWidth()) { $lineCount += floor($messageLineLength / $this->terminal->getWidth()); } } + $this->output->clear($lineCount); } else { $lineCount = substr_count($this->previousMessage, "\n"); diff --git a/src/Symfony/Component/Console/SignalRegistry/SignalMap.php b/src/Symfony/Component/Console/SignalRegistry/SignalMap.php index de419bda79821..2f9aa67c156db 100644 --- a/src/Symfony/Component/Console/SignalRegistry/SignalMap.php +++ b/src/Symfony/Component/Console/SignalRegistry/SignalMap.php @@ -27,7 +27,7 @@ public static function getSignalName(int $signal): ?string if (!isset(self::$map)) { $r = new \ReflectionExtension('pcntl'); $c = $r->getConstants(); - $map = array_filter($c, fn ($k) => str_starts_with($k, 'SIG') && !str_starts_with($k, 'SIG_'), \ARRAY_FILTER_USE_KEY); + $map = array_filter($c, fn ($k) => str_starts_with($k, 'SIG') && !str_starts_with($k, 'SIG_') && 'SIGBABY' !== $k, \ARRAY_FILTER_USE_KEY); self::$map = array_flip($map); } diff --git a/src/Symfony/Component/Console/Tests/ApplicationTest.php b/src/Symfony/Component/Console/Tests/ApplicationTest.php index 4693535051124..4f6e6cb96cf32 100644 --- a/src/Symfony/Component/Console/Tests/ApplicationTest.php +++ b/src/Symfony/Component/Console/Tests/ApplicationTest.php @@ -79,6 +79,7 @@ protected function tearDown(): void pcntl_signal(\SIGTERM, \SIG_DFL); pcntl_signal(\SIGUSR1, \SIG_DFL); pcntl_signal(\SIGUSR2, \SIG_DFL); + pcntl_signal(\SIGALRM, \SIG_DFL); } } diff --git a/src/Symfony/Component/Console/Tests/ConsoleEventsTest.php b/src/Symfony/Component/Console/Tests/ConsoleEventsTest.php index 9c04d2706e8da..408f8c0d35c58 100644 --- a/src/Symfony/Component/Console/Tests/ConsoleEventsTest.php +++ b/src/Symfony/Component/Console/Tests/ConsoleEventsTest.php @@ -39,6 +39,7 @@ protected function tearDown(): void pcntl_signal(\SIGTERM, \SIG_DFL); pcntl_signal(\SIGUSR1, \SIG_DFL); pcntl_signal(\SIGUSR2, \SIG_DFL); + pcntl_signal(\SIGALRM, \SIG_DFL); } } diff --git a/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php b/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php index 88b3e9228a2f2..0df42e738a6f6 100644 --- a/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php +++ b/src/Symfony/Component/Console/Tests/Helper/ProgressBarTest.php @@ -110,6 +110,16 @@ public function testRegularTimeEstimation() ); } + public function testRegularTimeRemainingWithDifferentStartAtAndCustomDisplay() + { + $this->expectNotToPerformAssertions(); + + ProgressBar::setFormatDefinition('custom', ' %current%/%max% [%bar%] %percent:3s%% %remaining% %estimated%'); + $bar = new ProgressBar($this->getOutputStream(), 1_200, 0); + $bar->setFormat('custom'); + $bar->start(1_200, 600); + } + public function testResumedTimeEstimation() { $bar = new ProgressBar($output = $this->getOutputStream(), 1_200, 0); @@ -406,6 +416,81 @@ public function testOverwriteWithSectionOutput() ); } + public function testOverwriteWithSectionOutputAndEol() + { + $sections = []; + $stream = $this->getOutputStream(true); + $output = new ConsoleSectionOutput($stream->getStream(), $sections, $stream->getVerbosity(), $stream->isDecorated(), new OutputFormatter()); + + $bar = new ProgressBar($output, 50, 0); + $bar->setFormat('[%bar%] %percent:3s%%' . PHP_EOL . '%message%' . PHP_EOL); + $bar->setMessage(''); + $bar->start(); + $bar->display(); + $bar->setMessage('Doing something...'); + $bar->advance(); + $bar->setMessage('Doing something foo...'); + $bar->advance(); + + rewind($output->getStream()); + $this->assertEquals(escapeshellcmd( + '[>---------------------------] 0%'.\PHP_EOL.\PHP_EOL. + "\x1b[2A\x1b[0J".'[>---------------------------] 2%'.\PHP_EOL. 'Doing something...' . \PHP_EOL . + "\x1b[2A\x1b[0J".'[=>--------------------------] 4%'.\PHP_EOL. 'Doing something foo...' . \PHP_EOL), + escapeshellcmd(stream_get_contents($output->getStream())) + ); + } + + public function testOverwriteWithSectionOutputAndEolWithEmptyMessage() + { + $sections = []; + $stream = $this->getOutputStream(true); + $output = new ConsoleSectionOutput($stream->getStream(), $sections, $stream->getVerbosity(), $stream->isDecorated(), new OutputFormatter()); + + $bar = new ProgressBar($output, 50, 0); + $bar->setFormat('[%bar%] %percent:3s%%' . PHP_EOL . '%message%'); + $bar->setMessage('Start'); + $bar->start(); + $bar->display(); + $bar->setMessage(''); + $bar->advance(); + $bar->setMessage('Doing something...'); + $bar->advance(); + + rewind($output->getStream()); + $this->assertEquals(escapeshellcmd( + '[>---------------------------] 0%'.\PHP_EOL.'Start'.\PHP_EOL. + "\x1b[2A\x1b[0J".'[>---------------------------] 2%'.\PHP_EOL . + "\x1b[1A\x1b[0J".'[=>--------------------------] 4%'.\PHP_EOL. 'Doing something...' . \PHP_EOL), + escapeshellcmd(stream_get_contents($output->getStream())) + ); + } + + public function testOverwriteWithSectionOutputAndEolWithEmptyMessageComment() + { + $sections = []; + $stream = $this->getOutputStream(true); + $output = new ConsoleSectionOutput($stream->getStream(), $sections, $stream->getVerbosity(), $stream->isDecorated(), new OutputFormatter()); + + $bar = new ProgressBar($output, 50, 0); + $bar->setFormat('[%bar%] %percent:3s%%' . PHP_EOL . '%message%'); + $bar->setMessage('Start'); + $bar->start(); + $bar->display(); + $bar->setMessage(''); + $bar->advance(); + $bar->setMessage('Doing something...'); + $bar->advance(); + + rewind($output->getStream()); + $this->assertEquals(escapeshellcmd( + '[>---------------------------] 0%'.\PHP_EOL."\x1b[33mStart\x1b[39m".\PHP_EOL. + "\x1b[2A\x1b[0J".'[>---------------------------] 2%'.\PHP_EOL . + "\x1b[1A\x1b[0J".'[=>--------------------------] 4%'.\PHP_EOL. "\x1b[33mDoing something...\x1b[39m" . \PHP_EOL), + escapeshellcmd(stream_get_contents($output->getStream())) + ); + } + public function testOverwriteWithAnsiSectionOutput() { // output has 43 visible characters plus 2 invisible ANSI characters diff --git a/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php index 887c5d7af01c5..3a0c49bb01e21 100644 --- a/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php +++ b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalMapTest.php @@ -18,14 +18,13 @@ class SignalMapTest extends TestCase { /** * @requires extension pcntl - * - * @testWith [2, "SIGINT"] - * [9, "SIGKILL"] - * [15, "SIGTERM"] */ - public function testSignalExists(int $signal, string $expected) + public function testSignalExists() { - $this->assertSame($expected, SignalMap::getSignalName($signal)); + $this->assertSame('SIGINT', SignalMap::getSignalName(\SIGINT)); + $this->assertSame('SIGKILL', SignalMap::getSignalName(\SIGKILL)); + $this->assertSame('SIGTERM', SignalMap::getSignalName(\SIGTERM)); + $this->assertSame('SIGSYS', SignalMap::getSignalName(\SIGSYS)); } public function testSignalDoesNotExist() diff --git a/src/Symfony/Component/Console/Tests/SignalRegistry/SignalRegistryTest.php b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalRegistryTest.php index f997f7c1d8cee..92d500f9ee4e5 100644 --- a/src/Symfony/Component/Console/Tests/SignalRegistry/SignalRegistryTest.php +++ b/src/Symfony/Component/Console/Tests/SignalRegistry/SignalRegistryTest.php @@ -27,6 +27,7 @@ protected function tearDown(): void pcntl_signal(\SIGTERM, \SIG_DFL); pcntl_signal(\SIGUSR1, \SIG_DFL); pcntl_signal(\SIGUSR2, \SIG_DFL); + pcntl_signal(\SIGALRM, \SIG_DFL); } public function testOneCallbackForASignalSignalIsHandled() diff --git a/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php b/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php index 2e649bdeaaadd..6b1a94dd3dd35 100644 --- a/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php +++ b/src/Symfony/Component/DependencyInjection/Attribute/AsTaggedItem.php @@ -20,8 +20,8 @@ class AsTaggedItem { /** - * @param string|null $index The property or method to use to index the item in the locator - * @param int|null $priority The priority of the item; the higher the number, the earlier the tagged service will be located in the locator + * @param string|null $index The property or method to use to index the item in the iterator/locator + * @param int|null $priority The priority of the item; the higher the number, the earlier the tagged service will be located in the iterator/locator */ public function __construct( public ?string $index = null, diff --git a/src/Symfony/Component/DependencyInjection/Attribute/Autoconfigure.php b/src/Symfony/Component/DependencyInjection/Attribute/Autoconfigure.php index dc2c84ca29a5e..06513fd903e01 100644 --- a/src/Symfony/Component/DependencyInjection/Attribute/Autoconfigure.php +++ b/src/Symfony/Component/DependencyInjection/Attribute/Autoconfigure.php @@ -28,7 +28,7 @@ class Autoconfigure * @param bool|null $shared Whether to declare the service as shared * @param bool|null $autowire Whether to declare the service as autowired * @param array|null $properties The properties to define when creating the service - * @param array|string|null $configurator A PHP function, reference or an array containing a class/Reference and a method to call after the service is fully initialized + * @param array{string, string}|string|null $configurator A PHP function, reference or an array containing a class/reference and a method to call after the service is fully initialized * @param string|null $constructor The public static method to use to instantiate the service */ public function __construct( diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php index 9b43d6e64aad5..7adb0b4d830e6 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php @@ -28,6 +28,7 @@ class CheckCircularReferencesPass implements CompilerPassInterface { private array $currentPath; private array $checkedNodes; + private array $checkedLazyNodes; /** * Checks the ContainerBuilder object for circular references. @@ -57,22 +58,36 @@ private function checkOutEdges(array $edges): void $node = $edge->getDestNode(); $id = $node->getId(); - if (empty($this->checkedNodes[$id])) { - // Don't check circular references for lazy edges - if (!$node->getValue() || (!$edge->isLazy() && !$edge->isWeak())) { - $searchKey = array_search($id, $this->currentPath); - $this->currentPath[] = $id; + if (!empty($this->checkedNodes[$id])) { + continue; + } + + $isLeaf = !!$node->getValue(); + $isConcrete = !$edge->isLazy() && !$edge->isWeak(); + + // Skip already checked lazy services if they are still lazy. Will not gain any new information. + if (!empty($this->checkedLazyNodes[$id]) && (!$isLeaf || !$isConcrete)) { + continue; + } - if (false !== $searchKey) { - throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey)); - } + // Process concrete references, otherwise defer check circular references for lazy edges. + if (!$isLeaf || $isConcrete) { + $searchKey = array_search($id, $this->currentPath); + $this->currentPath[] = $id; - $this->checkOutEdges($node->getOutEdges()); + if (false !== $searchKey) { + throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey)); } + $this->checkOutEdges($node->getOutEdges()); + $this->checkedNodes[$id] = true; - array_pop($this->currentPath); + unset($this->checkedLazyNodes[$id]); + } else { + $this->checkedLazyNodes[$id] = true; } + + array_pop($this->currentPath); } } } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php b/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php index 26ab135b1a99c..2d6ad689443e8 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/DefinitionErrorExceptionPass.php @@ -62,7 +62,10 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed } if ($value instanceof Reference && $this->currentId !== $targetId = (string) $value) { - if (ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) { + if ( + ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior() + || ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior() + ) { $this->sourceReferences[$targetId][$this->currentId] ??= true; } else { $this->sourceReferences[$targetId][$this->currentId] = false; diff --git a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index ddea146fd9e87..de4acb258c3a9 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -223,6 +223,8 @@ private function isInlineableDefinition(string $id, Definition $definition): boo return false; } - return $this->container->getDefinition($srcId)->isShared(); + $srcDefinition = $this->container->getDefinition($srcId); + + return $srcDefinition->isShared() && !$srcDefinition->isLazy(); } } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php index 77a1d7ef8ffc2..e3a4eba275a75 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/PriorityTaggedServiceTrait.php @@ -87,8 +87,7 @@ private function findAndSortTaggedServices(string|TaggedIteratorArgument $tagNam if (null === $index && null === $defaultIndex && $defaultPriorityMethod && $class) { $defaultIndex = PriorityTaggedServiceUtil::getDefault($container, $serviceId, $class, $defaultIndexMethod ?? 'getDefaultName', $tagName, $indexAttribute, $checkTaggedItem); } - $decorated = $definition->getTag('container.decorator')[0]['id'] ?? null; - $index = $index ?? $defaultIndex ?? $defaultIndex = $decorated ?? $serviceId; + $index ??= $defaultIndex ??= $definition->getTag('container.decorator')[0]['id'] ?? $serviceId; $services[] = [$priority, ++$i, $index, $serviceId, $class]; } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/RegisterServiceSubscribersPass.php b/src/Symfony/Component/DependencyInjection/Compiler/RegisterServiceSubscribersPass.php index 87470c39894e4..89b822bc53b44 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/RegisterServiceSubscribersPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/RegisterServiceSubscribersPass.php @@ -20,6 +20,7 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\TypedReference; use Symfony\Contracts\Service\Attribute\SubscribedService; +use Symfony\Contracts\Service\ServiceCollectionInterface; use Symfony\Contracts\Service\ServiceProviderInterface; use Symfony\Contracts\Service\ServiceSubscriberInterface; @@ -134,6 +135,7 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed $value->setBindings([ PsrContainerInterface::class => new BoundArgument($locatorRef, false), ServiceProviderInterface::class => new BoundArgument($locatorRef, false), + ServiceCollectionInterface::class => new BoundArgument($locatorRef, false), ] + $value->getBindings()); return parent::processValue($value); diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php index 81c14ac5cc4d0..eedc0f484243c 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php @@ -54,17 +54,41 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed $value->setClass(ServiceLocator::class); } - $services = $value->getArguments()[0] ?? null; + $values = $value->getArguments()[0] ?? null; + $services = []; - if ($services instanceof TaggedIteratorArgument) { - $services = $this->findAndSortTaggedServices($services, $this->container); - } - - if (!\is_array($services)) { + if ($values instanceof TaggedIteratorArgument) { + foreach ($this->findAndSortTaggedServices($values, $this->container) as $k => $v) { + $services[$k] = new ServiceClosureArgument($v); + } + } elseif (!\is_array($values)) { throw new InvalidArgumentException(\sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set.', $this->currentId)); + } else { + $i = 0; + + foreach ($values as $k => $v) { + if ($v instanceof ServiceClosureArgument) { + $services[$k] = $v; + continue; + } + + if ($i === $k) { + if ($v instanceof Reference) { + $k = (string) $v; + } + ++$i; + } elseif (\is_int($k)) { + $i = null; + } + + $services[$k] = new ServiceClosureArgument($v); + } + if (\count($services) === $i) { + ksort($services); + } } - $value->setArgument(0, self::map($services)); + $value->setArgument(0, $services); $id = '.service_locator.'.ContainerBuilder::hash($value); @@ -83,8 +107,12 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed public static function register(ContainerBuilder $container, array $map, ?string $callerId = null): Reference { + foreach ($map as $k => $v) { + $map[$k] = new ServiceClosureArgument($v); + } + $locator = (new Definition(ServiceLocator::class)) - ->addArgument(self::map($map)) + ->addArgument($map) ->addTag('container.service_locator'); if (null !== $callerId && $container->hasDefinition($callerId)) { @@ -109,29 +137,4 @@ public static function register(ContainerBuilder $container, array $map, ?string return new Reference($id); } - - public static function map(array $services): array - { - $i = 0; - - foreach ($services as $k => $v) { - if ($v instanceof ServiceClosureArgument) { - continue; - } - - if ($i === $k) { - if ($v instanceof Reference) { - unset($services[$k]); - $k = (string) $v; - } - ++$i; - } elseif (\is_int($k)) { - $i = null; - } - - $services[$k] = new ServiceClosureArgument($v); - } - - return $services; - } } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ValidateEnvPlaceholdersPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ValidateEnvPlaceholdersPass.php index 783080c09edc7..b656cf8d455e8 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ValidateEnvPlaceholdersPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ValidateEnvPlaceholdersPass.php @@ -46,17 +46,8 @@ public function process(ContainerBuilder $container): void $defaultBag = new ParameterBag($resolvingBag->all()); $envTypes = $resolvingBag->getProvidedTypes(); foreach ($resolvingBag->getEnvPlaceholders() + $resolvingBag->getUnusedEnvPlaceholders() as $env => $placeholders) { - $values = []; - if (false === $i = strpos($env, ':')) { - $default = $defaultBag->has("env($env)") ? $defaultBag->get("env($env)") : self::TYPE_FIXTURES['string']; - $defaultType = null !== $default ? get_debug_type($default) : 'string'; - $values[$defaultType] = $default; - } else { - $prefix = substr($env, 0, $i); - foreach ($envTypes[$prefix] ?? ['string'] as $type) { - $values[$type] = self::TYPE_FIXTURES[$type] ?? null; - } - } + $values = $this->getPlaceholderValues($env, $defaultBag, $envTypes); + foreach ($placeholders as $placeholder) { BaseNode::setPlaceholder($placeholder, $values); } @@ -97,4 +88,50 @@ public function getExtensionConfig(): array $this->extensionConfig = []; } } + + /** + * @param array> $envTypes + * + * @return array + */ + private function getPlaceholderValues(string $env, ParameterBag $defaultBag, array $envTypes): array + { + if (false === $i = strpos($env, ':')) { + [$default, $defaultType] = $this->getParameterDefaultAndDefaultType("env($env)", $defaultBag); + + return [$defaultType => $default]; + } + + $prefix = substr($env, 0, $i); + if ('default' === $prefix) { + $parts = explode(':', $env); + array_shift($parts); // Remove 'default' prefix + $parameter = array_shift($parts); // Retrieve and remove parameter + + [$defaultParameter, $defaultParameterType] = $this->getParameterDefaultAndDefaultType($parameter, $defaultBag); + + return [ + $defaultParameterType => $defaultParameter, + ...$this->getPlaceholderValues(implode(':', $parts), $defaultBag, $envTypes), + ]; + } + + $values = []; + foreach ($envTypes[$prefix] ?? ['string'] as $type) { + $values[$type] = self::TYPE_FIXTURES[$type] ?? null; + } + + return $values; + } + + /** + * @return array{0: string, 1: string} + */ + private function getParameterDefaultAndDefaultType(string $name, ParameterBag $defaultBag): array + { + $default = $defaultBag->has($name) ? $defaultBag->get($name) : self::TYPE_FIXTURES['string']; + $defaultType = null !== $default ? get_debug_type($default) : 'string'; + + return [$default, $defaultType]; + } } diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfony/Component/DependencyInjection/Container.php index e81f47406cf49..84c61f92f7617 100644 --- a/src/Symfony/Component/DependencyInjection/Container.php +++ b/src/Symfony/Component/DependencyInjection/Container.php @@ -291,6 +291,14 @@ public function reset(): void $this->envCache = $this->services = $this->factories = $this->privates = []; } + /** + * @internal + */ + public function resetEnvCache(): void + { + $this->envCache = []; + } + /** * Gets all service ids. * diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 7389ca6310447..b3fce29da599d 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -791,10 +791,11 @@ public function parameterCannotBeEmpty(string $name, string $message): void * * The parameter bag is frozen; * * Extension loading is disabled. * - * @param bool $resolveEnvPlaceholders Whether %env()% parameters should be resolved using the current - * env vars or be replaced by uniquely identifiable placeholders. - * Set to "true" when you want to use the current ContainerBuilder - * directly, keep to "false" when the container is dumped instead. + * @param bool $resolveEnvPlaceholders Whether %env()% parameters should be resolved at build time using + * the current env var values (true), or be resolved at runtime based + * on the environment (false). In general, this should be set to "true" + * when you want to use the current ContainerBuilder directly, and to + * "false" when the container is dumped instead. */ public function compile(bool $resolveEnvPlaceholders = false): void { diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index 37793a1ee02a8..ee7e519a0c8aa 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -338,7 +338,7 @@ class %s extends {$options['class']} EOF; foreach ($this->preload as $class) { - if (!$class || str_contains($class, '$') || \in_array($class, ['int', 'float', 'string', 'bool', 'resource', 'object', 'array', 'null', 'callable', 'iterable', 'mixed', 'void'], true)) { + if (!$class || str_contains($class, '$') || \in_array($class, ['int', 'float', 'string', 'bool', 'resource', 'object', 'array', 'null', 'callable', 'iterable', 'mixed', 'void', 'never'], true)) { continue; } if (!(class_exists($class, false) || interface_exists($class, false) || trait_exists($class, false)) || (new \ReflectionClass($class))->isUserDefined()) { @@ -831,8 +831,7 @@ private function addService(strin 8000 g $id, Definition $definition): array if ($class = $definition->getClass()) { $class = $class instanceof Parameter ? '%'.$class.'%' : $this->container->resolveEnvPlaceholders($class); $return[] = \sprintf(str_starts_with($class, '%') ? '@return object A %1$s instance' : '@return \%s', ltrim($class, '\\')); - } elseif ($definition->getFactory()) { - $factory = $definition->getFactory(); + } elseif ($factory = $definition->getFactory()) { if (\is_string($factory) && !str_starts_with($factory, '@=')) { $return[] = \sprintf('@return object An instance returned by %s()', $factory); } elseif (\is_array($factory) && (\is_string($factory[0]) || $factory[0] instanceof Definition || $factory[0] instanceof Reference)) { @@ -1152,9 +1151,7 @@ private function addNewInstance(Definition $definition, string $return = '', ?st $arguments[] = (\is_string($i) ? $i.': ' : '').$this->dumpValue($value); } - if (null !== $definition->getFactory()) { - $callable = $definition->getFactory(); - + if ($callable = $definition->getFactory()) { if ('current' === $callable && [0] === array_keys($definition->getArguments()) && \is_array($value) && [0] === array_keys($value)) { return $return.$this->dumpValue($value[0]).$tail; } @@ -2197,6 +2194,12 @@ private function isSingleUsePrivateNode(ServiceReferenceGraphNode $node): bool if ($edge->isLazy() || !$value instanceof Definition || !$value->isShared()) { return false; } + + // When the source node is a proxy or ghost, it will construct its references only when the node itself is initialized. + // Since the node can be cloned before being fully initialized, we do not know how often its references are used. + if ($this->getProxyDumper()->isProxyCandidate($value)) { + return false; + } $ids[$edge->getSourceNode()->getId()] = true; } @@ -2305,7 +2308,6 @@ private function getAutoloadFile(): ?string private function getClasses(Definition $definition, string $id): array { $classes = []; - $resolve = $this->container->getParameterBag()->resolveValue(...); while ($definition instanceof Definition) { foreach ($definition->getTag($this->preloadTags[0]) as $tag) { @@ -2317,24 +2319,24 @@ private function getClasses(Definition $definition, string $id): array } if ($class = $definition->getClass()) { - $classes[] = trim($resolve($class), '\\'); + $classes[] = trim($class, '\\'); } $factory = $definition->getFactory(); + if (\is_string($factory) && !str_starts_with($factory, '@=') && str_contains($factory, '::')) { + $factory = explode('::', $factory); + } + if (!\is_array($factory)) { - $factory = [$factory]; + $definition = $factory; + continue; } - if (\is_string($factory[0])) { - $factory[0] = $resolve($factory[0]); + $definition = $factory[0] ?? null; - if (false !== $i = strrpos($factory[0], '::')) { - $factory[0] = substr($factory[0], 0, $i); - } + if (\is_string($definition)) { $classes[] = trim($factory[0], '\\'); } - - $definition = $factory[0]; } return $classes; diff --git a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php index ec115500bb0cf..d79e7b90408b2 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php @@ -50,18 +50,18 @@ public function dump(array $options = []): string $this->dumper ??= new YmlDumper(); - return $this->container->resolveEnvPlaceholders($this->addParameters()."\n".$this->addServices()); + return $this->addParameters()."\n".$this->addServices(); } private function addService(string $id, Definition $definition): string { - $code = " $id:\n"; + $code = " {$this->dumper->dump($id)}:\n"; if ($class = $definition->getClass()) { if (str_starts_with($class, '\\')) { $class = substr($class, 1); } - $code .= \sprintf(" class: %s\n", $this->dumper->dump($class)); + $code .= \sprintf(" class: %s\n", $this->dumper->dump($this->container->resolveEnvPlaceholders($class))); } if (!$definition->isPrivate()) { @@ -87,7 +87,7 @@ private function addService(string $id, Definition $definition): string } if ($definition->getFile()) { - $code .= \sprintf(" file: %s\n", $this->dumper->dump($definition->getFile())); + $code .= \sprintf(" file: %s\n", $this->dumper->dump($this->container->resolveEnvPlaceholders($definition->getFile()))); } if ($definition->isSynthetic()) { @@ -238,7 +238,7 @@ private function dumpCallable(mixed $callable): mixed } } - return $callable; + return $this->container->resolveEnvPlaceholders($callable); } /** @@ -299,7 +299,7 @@ private function dumpValue(mixed $value): mixed if (\is_array($value)) { $code = []; foreach ($value as $k => $v) { - $code[$k] = $this->dumpValue($v); + $code[$this->container->resolveEnvPlaceholders($k)] = $this->dumpValue($v); } return $code; @@ -319,7 +319,7 @@ private function dumpValue(mixed $value): mixed throw new RuntimeException(\sprintf('Unable to dump a service container if a parameter is an object or a resource, got "%s".', get_debug_type($value))); } - return $value; + return $this->container->resolveEnvPlaceholders($value); } private function getServiceCall(string $id, ?Reference $reference = null): string @@ -359,7 +359,7 @@ private function prepareParameters(array $parameters, bool $escape = true): arra $filtered[$key] = $value; } - return $escape ? $this->escape($filtered) : $filtered; + return $escape ? $this->container->resolveEnvPlaceholders($this->escape($filtered)) : $filtered; } private function escape(array $arguments): array diff --git a/src/Symfony/Component/DependencyInjection/EnvVarProcessor.php b/src/Symfony/Component/DependencyInjection/EnvVarProcessor.php index c0e4e03ae3934..957dd5c564e9e 100644 --- a/src/Symfony/Component/DependencyInjection/EnvVarProcessor.php +++ b/src/Symfony/Component/DependencyInjection/EnvVarProcessor.php @@ -380,5 +380,9 @@ public function reset(): void { $this->loadedVars = []; $this->loaders = $this->originalLoaders; + + if ($this->container instanceof Container) { + $this->container->resetEnvCache(); + } } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php index c9bcb10878bec..20a0a7b5a8d5a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckCircularReferencesPassTest.php @@ -13,9 +13,12 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; +use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass; use Symfony\Component\DependencyInjection\Compiler\CheckCircularReferencesPass; use Symfony\Component\DependencyInjection\Compiler\Compiler; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; use Symfony\Component\DependencyInjection\Reference; @@ -126,6 +129,21 @@ public function testProcessIgnoresLazyServices() $this->addToAssertionCount(1); } + public function testProcessDefersLazyServices() + { + $container = new ContainerBuilder(); + + $container->register('a')->addArgument(new ServiceLocatorArgument(new TaggedIteratorArgument('tag', needsIndexes: true))); + $container->register('b')->addArgument(new Reference('c'))->addTag('tag'); + $container->register('c')->addArgument(new Reference('b')); + + (new ServiceLocatorTagPass())->process($container); + + $this->expectException(ServiceCircularReferenceException::class); + + $this->process($container); + } + public function testProcessIgnoresIteratorArguments() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php index 9ab5c27fcf763..5ed7be315114a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/DefinitionErrorExceptionPassTest.php @@ -64,6 +64,9 @@ public function testSkipNestedErrors() $container->register('foo', 'stdClass') ->addArgument(new Reference('bar', ContainerBuilder::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE)); + $container->register('baz', 'stdClass') + ->addArgument(new Reference('bar', ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE)); + $pass = new DefinitionErrorExceptionPass(); $pass->process($container); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php index 58cb1cd38bb6f..a0d1ec50f415a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveAutowireInlineAttributesPassTest.php @@ -18,7 +18,6 @@ use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php'; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php index 812b47c7a6f1f..9a93067756d50 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php @@ -86,6 +86,26 @@ public function testProcessValue() $this->assertSame(CustomDefinition::class, \get_class($locator('inlines.service'))); } + public function testServiceListIsOrdered() + { + $container = new ContainerBuilder(); + + $container->register('bar', CustomDefinition::class); + $container->register('baz', CustomDefinition::class); + + $container->register('foo', ServiceLocator::class) + ->setArguments([[ + new Reference('baz'), + new Reference('bar'), + ]]) + ->addTag('container.service_locator') + ; + + (new ServiceLocatorTagPass())->process($container); + + $this->assertSame(['bar', 'baz'], array_keys($container->getDefinition('foo')->getArgument(0))); + } + public function testServiceWithKeyOverwritesPreviousInheritedKey() { $container = new ContainerBuilder(); @@ -170,6 +190,27 @@ public function testTaggedServices() $this->assertSame(TestDefinition2::class, $locator('baz')::class); } + public function testTaggedServicesKeysAreKept() + { + $container = new ContainerBuilder(); + + $container->register('bar', TestDefinition1::class)->addTag('test_tag', ['index' => 0]); + $container->register('baz', TestDefinition2::class)->addTag('test_tag', ['index' => 1]); + + $container->register('foo', ServiceLocator::class) + ->setArguments([new TaggedIteratorArgument('test_tag', 'index', null, true)]) + ->addTag('container.service_locator') + ; + + (new ServiceLocatorTagPass())->process($container); + + /** @var ServiceLocator $locator */ + $locator = $container->get('foo'); + + $this->assertSame(TestDefinition1::class, $locator(0)::class); + $this->assertSame(TestDefinition2::class, $locator(1)::class); + } + public function testIndexedByServiceIdWithDecoration() { $container = new ContainerBuilder(); @@ -201,15 +242,33 @@ public function testIndexedByServiceIdWithDecoration() static::assertInstanceOf(DecoratedService::class, $locator->get(Service::class)); } - public function testDefinitionOrderIsTheSame() + public function testServicesKeysAreKept() { $container = new ContainerBuilder(); $container->register('service-1'); $container->register('service-2'); + $container->register('service-3'); $locator = ServiceLocatorTagPass::register($container, [ - new Reference('service-2'), new Reference('service-1'), + 'service-2' => new Reference('service-2'), + 'foo' => new Reference('service-3'), + ]); + $locator = $container->getDefinition($locator); + $factories = $locator->getArguments()[0]; + + static::assertSame([0, 'service-2', 'foo'], array_keys($factories)); + } + + public function testDefinitionOrderIsTheSame() + { + $container = new ContainerBuilder(); + $container->register('service-1'); + $container->register('service-2'); + + $locator = ServiceLocatorTagPass::register($container, [ + 'service-2' => new Reference('service-2'), + 'service-1' => new Reference('service-1'), ]); $locator = $container->getDefinition($locator); $factories = $locator->getArguments()[0]; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php index 8c5c4cc32323e..17ef87c3fffad 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ValidateEnvPlaceholdersPassTest.php @@ -73,6 +73,36 @@ public function testDefaultEnvWithoutPrefixIsValidatedInConfig() $this->doProcess($container); } + public function testDefaultProcessorWithScalarNode() + { + $container = new ContainerBuilder(); + $container->setParameter('parameter_int', 12134); + $container->setParameter('env(FLOATISH)', 4.2); + $container->registerExtension($ext = new EnvExtension()); + $container->prependExtensionConfig('env_extension', $expected = [ + 'scalar_node' => '%env(default:parameter_int:FLOATISH)%', + ]); + + $this->doProcess($container); + $this->assertSame($expected, $container->resolveEnvPlaceholders($ext->getConfig())); + } + + public function testDefaultProcessorAndAnotherProcessorWithScalarNode() + { + $this->expectException(InvalidTypeException::class); + $this->expectExceptionMessageMatches('/^Invalid type for path "env_extension\.scalar_node"\. Expected one of "bool", "int", "float", "string", but got one of "int", "array"\.$/'); + + $container = new ContainerBuilder(); + $container->setParameter('parameter_int', 12134); + $container->setParameter('env(JSON)', '{ "foo": "bar" }'); + $container->registerExtension($ext = new EnvExtension()); + $container->prependExtensionConfig('env_extension', [ + 'scalar_node' => '%env(default:parameter_int:json:JSON)%', + ]); + + $this->doProcess($container); + } + public function testEnvsAreValidatedInConfigWithInvalidPlaceholder() { $this->expectException(InvalidTypeException::class); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php index 5523c147e049b..95abb70878467 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php @@ -56,6 +56,8 @@ use Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\Wither; use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition; +use Symfony\Component\DependencyInjection\Tests\Fixtures\DependencyContainer; +use Symfony\Component\DependencyInjection\Tests\Fixtures\DependencyContainerInterface; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooClassWithEnumAttribute; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooUnitEnum; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooWithAbstractArgument; @@ -1668,6 +1670,59 @@ public function testWitherWithStaticReturnType() $this->assertInstanceOf(Foo::class, $wither->foo); } + public function testCloningLazyGhostWithDependency() + { + $container = new ContainerBuilder(); + $container->register('dependency', \stdClass::class); + $container->register(DependencyContainer::class) + ->addArgument(new Reference('dependency')) + ->setLazy(true) + ->setPublic(true); + + $container->compile(); + $dumper = new PhpDumper($container); + $dump = $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Service_CloningLazyGhostWithDependency']); + eval('?>'.$dump); + + $container = new \Symfony_DI_PhpDumper_Service_CloningLazyGhostWithDependency(); + + $bar = $container->get(DependencyContainer::class); + $this->assertInstanceOf(DependencyContainer::class, $bar); + + $first_clone = clone $bar; + $second_clone = clone $bar; + + $this->assertSame($first_clone->dependency, $second_clone->dependency); + } + + public function testCloningProxyWithDependency() + { + $container = new ContainerBuilder(); + $container->register('dependency', \stdClass::class); + $container->register(DependencyContainer::class) + ->addArgument(new Reference('dependency')) + ->setLazy(true) + ->addTag('proxy', [ + 'interface' => DependencyContainerInterface::class, + ]) + ->setPublic(true); + + $container->compile(); + $dumper = new PhpDumper($container); + $dump = $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Service_CloningProxyWithDependency']); + eval('?>'.$dump); + + $container = new \Symfony_DI_PhpDumper_Service_CloningProxyWithDependency(); + + $bar = $container->get(DependencyContainer::class); + $this->assertInstanceOf(DependencyContainerInterface::class, $bar); + + $first_clone = clone $bar; + $second_clone = clone $bar; + + $this->assertSame($first_clone->getDependency(), $second_clone->getDependency()); + } + public function testCurrentFactoryInlining() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php index f9ff3fff786a3..3a21d7aa9a9c5 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php @@ -215,6 +215,26 @@ public function testDumpNonScalarTags() $this->assertEquals(file_get_contents(self::$fixturesPath.'/yaml/services_with_array_tags.yml'), $dumper->dump()); } + public function testDumpResolvedEnvPlaceholders() + { + $container = new ContainerBuilder(); + $container->setParameter('%env(PARAMETER_NAME)%', '%env(PARAMETER_VALUE)%'); + $container + ->register('service', '%env(SERVICE_CLASS)%') + ->setFile('%env(SERVICE_FILE)%') + ->addArgument('%env(SERVICE_ARGUMENT)%') + ->setProperty('%env(SERVICE_PROPERTY_NAME)%', '%env(SERVICE_PROPERTY_VALUE)%') + ->addMethodCall('%env(SERVICE_METHOD_NAME)%', ['%env(SERVICE_METHOD_ARGUMENT)%']) + ->setFactory('%env(SERVICE_FACTORY)%') + ->setConfigurator('%env(SERVICE_CONFIGURATOR)%') + ->setPublic(true) + ; + $container->compile(); + $dumper = new YamlDumper($container); + + $this->assertEquals(file_get_contents(self::$fixturesPath.'/yaml/container_with_env_placeholders.yml'), $dumper->dump()); + } + private function assertEqualYamlStructure(string $expected, string $yaml, string $message = '') { $parser = new Parser(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainer.php new file mode 100644 index 0000000000000..5e222bdf060be --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainer.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Fixtures; + +class DependencyContainer implements DependencyContainerInterface +{ + public function __construct( + public mixed $dependency, + ) { + } + + public function getDependency(): mixed + { + return $this->dependency; + } +} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainerInterface.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainerInterface.php new file mode 100644 index 0000000000000..ed109cad78dcd --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/DependencyContainerInterface.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Tests\Fixtures; + +interface DependencyContainerInterface +{ + public function getDependency(): mixed; +} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml index 44dbbd571b788..97380f388ca2a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml @@ -11,7 +11,9 @@ services: - container.decorator: { id: bar, inner: b } file: file.php lazy: true - arguments: [!service { class: Class1 }] + arguments: ['@b'] + b: + class: Class1 bar: alias: foo public: true diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/from_callable.expected.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/from_callable.expected.yml index d4dbbbadd48bf..1ab1643af1b48 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/from_callable.expected.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/from_callable.expected.yml @@ -8,5 +8,7 @@ services: class: stdClass public: true lazy: true - arguments: [[!service { class: stdClass }, do]] + arguments: [['@bar', do]] factory: [Closure, fromCallable] + bar: + class: stdClass diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/callable_adapter_consumer.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/callable_adapter_consumer.php index ccd8d2e0bf63b..216dca434e489 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/callable_adapter_consumer.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/callable_adapter_consumer.php @@ -50,6 +50,6 @@ public function getRemovedIds(): array */ protected static function getBarService($container) { - return $container->services['bar'] = new \Symfony\Component\DependencyInjection\Tests\Dumper\CallableAdapterConsumer(new class(fn () => new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo()) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure implements \Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface { public function theMethod() { return $this->service->cloneFoo(...\func_get_args()); } }); + return $container->services['bar'] = new \Symfony\Component\DependencyInjection\Tests\Dumper\CallableAdapterConsumer(new class(fn () => (new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo())) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure implements \Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface { public function theMethod() { return $this->service->cloneFoo(...\func_get_args()); } }); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/closure_proxy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/closure_proxy.php index 2bef92604d3a9..eaf303c7d068c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/closure_proxy.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/closure_proxy.php @@ -55,6 +55,6 @@ protected function createProxy($class, \Closure $factory) */ protected static function getClosureProxyService($container, $lazyLoad = true) { - return $container->services['closure_proxy'] = new class(fn () => new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo()) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure implements \Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface { public function theMethod() { return $this->service->cloneFoo(...\func_get_args()); } }; + return $container->services['closure_proxy'] = new class(fn () => ($container->privates['foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo())) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure implements \Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface { public function theMethod() { return $this->service->cloneFoo(...\func_get_args()); } }; } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/lazy_closure.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/lazy_closure.php index 0af28f2650147..2bf27779df041 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/lazy_closure.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/lazy_closure.php @@ -57,7 +57,7 @@ protected function createProxy($class, \Closure $factory) */ protected static function getClosure1Service($container, $lazyLoad = true) { - return $container->services['closure1'] = (new class(fn () => new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo()) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure { public function cloneFoo(?\stdClass $bar = null): \Symfony\Component\DependencyInjection\Tests\Compiler\Foo { return $this->service->cloneFoo(...\func_get_args()); } })->cloneFoo(...); + return $container->services['closure1'] = (new class(fn () => ($container->privates['foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo())) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure { public function cloneFoo(?\stdClass $bar = null): \Symfony\Component\DependencyInjection\Tests\Compiler\Foo { return $this->service->cloneFoo(...\func_get_args()); } })->cloneFoo(...); } /** @@ -67,6 +67,6 @@ protected static function getClosure1Service($container, $lazyLoad = true) */ protected static function getClosure2Service($container, $lazyLoad = true) { - return $container->services['closure2'] = (new class(fn () => new \Symfony\Component\DependencyInjection\Tests\Compiler\FooVoid()) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure { public function __invoke(string $name): void { $this->service->__invoke(...\func_get_args()); } })->__invoke(...); + return $container->services['closure2'] = (new class(fn () => ($container->privates['foo_void'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\FooVoid())) extends \Symfony\Component\DependencyInjection\Argument\LazyClosure { public function __invoke(string $name): void { $this->service->__invoke(...\func_get_args()); } })->__invoke(...); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_private.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_private.php index 0a9c519c8e69c..0c234ac3934c3 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_private.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_private.php @@ -373,15 +373,13 @@ protected static function getManager2Service($container) */ protected static function getManager3Service($container, $lazyLoad = true) { - $a = ($container->services['listener3'] ?? self::getListener3Service($container)); + $a = ($container->privates['connection3'] ?? self::getConnection3Service($container)); if (isset($container->services['manager3'])) { return $container->services['manager3']; } - $b = new \stdClass(); - $b->listener = [$a]; - return $container->services['manager3'] = new \stdClass($b); + return $container->services['manager3'] = new \stdClass($a); } /** @@ -481,6 +479,34 @@ protected static function getBar6Service($container) return $container->privates['bar6'] = new \stdClass($a); } + /** + * Gets the private 'connection3' shared service. + * + * @return \stdClass + */ + protected static function getConnection3Service($container) + { + $container->privates['connection3'] = $instance = new \stdClass(); + + $instance->listener = [($container->services['listener3'] ?? self::getListener3Service($container))]; + + return $instance; + } + + /** + * Gets the private 'connection4' shared service. + * + * @return \stdClass + */ + protected static function getConnection4Service($container) + { + $container->privates['connection4'] = $instance = new \stdClass(); + + $instance->listener = [($container->services['listener4'] ?? self::getListener4Service($container))]; + + return $instance; + } + /** * Gets the private 'doctrine.listener' shared service. * @@ -572,13 +598,13 @@ protected static function getMailerInline_TransportFactory_AmazonService($contai */ protected static function getManager4Service($container, $lazyLoad = true) { - $a = new \stdClass(); + $a = ($container->privates['connection4'] ?? self::getConnection4Service($container)); - 8000 $container->privates['manager4'] = $instance = new \stdClass($a); - - $a->listener = [($container->services['listener4'] ?? self::getListener4Service($container))]; + if (isset($container->privates['manager4'])) { + return $container->privates['manager4']; + } - return $instance; + return $container->privates['manager4'] = new \stdClass($a); } /** diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php index 2250e860264dc..ae283e556a0da 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_almost_circular_public.php @@ -259,7 +259,7 @@ protected static function getDispatcher2Service($container, $lazyLoad = true) { $container->services['dispatcher2'] = $instance = new \stdClass(); - $instance->subscriber2 = new \stdClass(($container->services['manager2'] ?? self::getManager2Service($container))); + $instance->subscriber2 = ($container->privates['subscriber2'] ?? self::getSubscriber2Service($container)); return $instance; } @@ -820,4 +820,20 @@ protected static function getManager4Service($container, $lazyLoad = true) return $container->privates['manager4'] = new \stdClass($a); } + + /** + * Gets the private 'subscriber2' shared service. + * + * @return \stdClass + */ + protected static function getSubscriber2Service($container) + { + $a = ($container->services['manager2'] ?? self::getManager2Service($container)); + + if (isset($container->privates['subscriber2'])) { + return $container->privates['subscriber2']; + } + + return $container->privates['subscriber2'] = new \stdClass($a); + } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy.php index b2940c88569f4..b9e9164573672 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy.php @@ -61,7 +61,7 @@ protected static function getWitherService($container, $lazyLoad = true) $instance = new \Symfony\Component\DependencyInjection\Tests\Compiler\Wither(); - $a = new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo(); + $a = ($container->privates['Symfony\\Component\\DependencyInjection\\Tests\\Compiler\\Foo'] ??= new \Symfony\Component\DependencyInjection\Tests\Compiler\Foo()); $instance = $instance->withFoo1($a); $instance = $instance->withFoo2($a); @@ -76,7 +76,7 @@ class WitherProxy1991f2a extends \Symfony\Component\DependencyInjection\Tests\Co use \Symfony\Component\VarExporter\LazyProxyTrait; private const LAZY_OBJECT_PROPERTY_SCOPES = [ - 'foo' => [parent::class, 'foo', null], + 'foo' => [parent::class, 'foo', null, 4], ]; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy_non_shared.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy_non_shared.php index 0df7e0c98e274..d70588f655329 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy_non_shared.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_wither_lazy_non_shared.php @@ -78,7 +78,7 @@ class WitherProxyE94fdba extends \Symfony\Component\DependencyInjection\Tests\Co use \Symfony\Component\VarExporter\LazyProxyTrait; private const LAZY_OBJECT_PROPERTY_SCOPES = [ - 'foo' => [parent::class, 'foo', null], + 'foo' => [parent::class, 'foo', null, 4], ]; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/container_with_env_placeholders.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/container_with_env_placeholders.yml new file mode 100644 index 0000000000000..46c91130faecd --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/container_with_env_placeholders.yml @@ -0,0 +1,19 @@ +parameters: + '%env(PARAMETER_NAME)%': '%env(PARAMETER_VALUE)%' + +services: + service_container: + class: Symfony\Component\DependencyInjection\ContainerInterface + public: true + synthetic: true + service: + class: '%env(SERVICE_CLASS)%' + public: true + file: '%env(SERVICE_FILE)%' + arguments: ['%env(SERVICE_ARGUMENT)%'] + properties: { '%env(SERVICE_PROPERTY_NAME)%': '%env(SERVICE_PROPERTY_VALUE)%' } + calls: + - ['%env(SERVICE_METHOD_NAME)%', ['%env(SERVICE_METHOD_ARGUMENT)%']] + + factory: '%env(SERVICE_FACTORY)%' + configurator: '%env(SERVICE_CONFIGURATOR)%' diff --git a/src/Symfony/Component/DependencyInjection/composer.json b/src/Symfony/Component/DependencyInjection/composer.json index b5fda9bdeb990..460751088f451 100644 --- a/src/Symfony/Component/DependencyInjection/composer.json +++ b/src/Symfony/Component/DependencyInjection/composer.json @@ -20,7 +20,7 @@ "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^3.5", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4.20|^7.2.5" }, "require-dev": { "symfony/yaml": "^6.4|^7.0", diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Component/DomCrawler/Crawler.php index 23da2edc43867..e41875e268203 100644 --- a/src/Symfony/Component/DomCrawler/Crawler.php +++ b/src/Symfony/Component/DomCrawler/Crawler.php @@ -411,7 +411,7 @@ public function closest(string $selector): ?self $domNode = $this->getNode(0); - while (\XML_ELEMENT_NODE === $domNode->nodeType) { + while (null !== $domNode && \XML_ELEMENT_NODE === $domNode->nodeType) { $node = $this->createSubCrawler($domNode); if ($node->matches($selector)) { return $node; diff --git a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php index a486ff2d12a2c..25fba30d9e15a 100644 --- a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php +++ b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php @@ -45,6 +45,10 @@ public function hasValue(): bool */ public function isDisabled(): bool { + if ('checkbox' === $this->type) { + return parent::isDisabled(); + } + if (parent::isDisabled() && 'select' === $this->type) { return true; } diff --git a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php index 97b16b9fe6073..5cdbbbf45870d 100644 --- a/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php +++ b/src/Symfony/Component/DomCrawler/Tests/AbstractCrawlerTestCase.php @@ -1031,6 +1031,29 @@ public function testClosest() $this->assertNull($notFound); } + public function testClosestWithOrphanedNode() + { + $html = <<<'HTML' + + +
+
+
+ + +HTML; + + $crawler = $this->createCrawler($this->getDoctype().$html); + $foo = $crawler->filter('#foo'); + + $fooNode = $foo->getNode(0); + + $fooNode->parentNode->replaceChild($fooNode->ownerDocument->createElement('ol'), $fooNode); + + $body = $foo->closest('body'); + $this->assertNull($body); + } + public function testOuterHtml() { $html = <<<'HTML' diff --git a/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php b/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php index 176ea5927fe1c..5de407344d2f8 100644 --- a/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/Field/ChoiceFormFieldTest.php @@ -272,6 +272,17 @@ public function testCheckboxWithEmptyBooleanAttribute() $this->assertEquals('foo', $field->getValue()); } + public function testCheckboxIsDisabled() + { + $node = $this->createNode('input', '', ['type' => 'checkbox', 'name' => 'name', 'disabled' => '']); + $field = new ChoiceFormField($node); + + $this->assertTrue($field->isDisabled(), '->isDisabled() returns true when the checkbox is disabled, even if it is not checked'); + + $field->tick(); + $this->assertTrue($field->isDisabled(), '->isDisabled() returns true when the checkbox is disabled, even if it is checked'); + } + public function testTick() { $node = $this->createSelectNode(['foo' => false, 'bar' => false]); diff --git a/src/Symfony/Component/Dotenv/Command/DebugCommand.php b/src/Symfony/Component/Dotenv/Command/DebugCommand.php index 268330dcf4b0b..5729b94cbd8d8 100644 --- a/src/Symfony/Component/Dotenv/Command/DebugCommand.php +++ b/src/Symfony/Component/Dotenv/Command/DebugCommand.php @@ -77,7 +77,19 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 1; } - $filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? $this->projectDirectory.\DIRECTORY_SEPARATOR.'.env'; + if (!$filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? null) { + $dotenvPath = $this->projectDirectory; + + if (is_file($composerFile = $this->projectDirectory.'/composer.json')) { + $runtimeConfig = (json_decode(file_get_contents($composerFile), true))['extra']['runtime'] ?? []; + + if (isset($runtimeConfig['dotenv_path'])) { + $dotenvPath = $this->projectDirectory.'/'.$runtimeConfig['dotenv_path']; + } + } + + $filePath = $dotenvPath.'/.env'; + } $envFiles = $this->getEnvFiles($filePath); $availableFiles = array_filter($envFiles, 'is_file'); diff --git a/src/Symfony/Component/Emoji/EmojiTransliterator.php b/src/Symfony/Component/Emoji/EmojiTransliterator.php index 03fe1bd61a7d6..67dfe3fb3f56c 100644 --- a/src/Symfony/Component/Emoji/EmojiTransliterator.php +++ b/src/Symfony/Component/Emoji/EmojiTransliterator.php @@ -83,14 +83,22 @@ public function createInverse(): self return self::create($this->id, \Transliterator::REVERSE); } + /** + * @return int + */ + #[\ReturnTypeWillChange] public function getErrorCode(): int|false { return isset($this->transliterator) ? $this->transliterator->getErrorCode() : 0; } + /** + * @return string + */ + #[\ReturnTypeWillChange] public function getErrorMessage(): string|false { - return isset($this->transliterator) ? $this->transliterator->getErrorMessage() : false; + return isset($this->transliterator) ? $this->transliterator->getErrorMessage() : ''; } public static function listIDs(): array diff --git a/src/Symfony/Component/Emoji/Resources/bin/Makefile b/src/Symfony/Component/Emoji/Resources/bin/Makefile index 5ae726c112574..49e9e76e9a414 100644 --- a/src/Symfony/Component/Emoji/Resources/bin/Makefile +++ b/src/Symfony/Component/Emoji/Resources/bin/Makefile @@ -4,7 +4,7 @@ update: ## Update sources @composer update @curl https://api.github.com/emojis > vendor/github-emojis.json - @curl https://gitlab.com/gitlab-org/gitlab/-/raw/master/fixtures/emojis/index.json > vendor/gitlab-emojis.json + @curl https://gitlab.com/gitlab-org/gitlab/-/raw/master/fixtures/emojis/digests.json > vendor/gitlab-emojis.json @curl https://raw.githubusercontent.com/iamcal/emoji-data/master/emoji.json > vendor/slack-emojis.json @curl -L https://unicode.org/Public/emoji/latest/emoji-test.txt > vendor/emoji-test.txt diff --git a/src/Symfony/Component/Emoji/Resources/bin/build.php b/src/Symfony/Component/Emoji/Resources/bin/build.php index 93d8f97f7b87c..0b1475bb32923 100755 --- a/src/Symfony/Component/Emoji/Resources/bin/build.php +++ b/src/Symfony/Component/Emoji/Resources/bin/build.php @@ -149,14 +149,10 @@ public static function buildGitlabMaps(array $emojisCodePoints): array $emojis = json_decode((new Filesystem())->readFile(__DIR__.'/vendor/gitlab-emojis.json'), true, flags: JSON_THROW_ON_ERROR); $maps = []; - foreach ($emojis as $emojiItem) { + foreach ($emojis as $shortName => $emojiItem) { $emoji = $emojiItem['moji']; $emojiPriority = mb_strlen($emoji) << 1; - $maps[$emojiPriority + 1][$emojiItem['shortname']] = $emoji; - - foreach ($emojiItem['aliases'] as $alias) { - $maps[$emojiPriority][$alias] = $emoji; - } + $maps[$emojiPriority + 1][":$shortName:"] = $emoji; } return $maps; diff --git a/src/Symfony/Component/Emoji/Resources/data/emoji-gitlab.php b/src/Symfony/Component/Emoji/Resources/data/emoji-gitlab.php index da33e8ecd964b..c303e4fa4cd51 100644 --- a/src/Symfony/Component/Emoji/Resources/data/emoji-gitlab.php +++ b/src/Symfony/Component/Emoji/Resources/data/emoji-gitlab.php @@ -1,8 +1,230 @@ ':kiss_man_man_dark_skin_tone:', + '👨🏿‍❤️‍💋‍👨🏻' => ':kiss_man_man_dark_skin_tone_light_skin_tone:', + '👨🏿‍❤️‍💋‍👨🏾' => ':kiss_man_man_dark_skin_tone_medium_dark_skin_tone:', + '👨🏿‍❤️‍💋‍👨🏼' => ':kiss_man_man_dark_skin_tone_medium_light_skin_tone:', + '👨🏿‍❤️‍💋‍👨🏽' => ':kiss_man_man_dark_skin_tone_medium_skin_tone:', + '👨🏻‍❤️‍💋‍👨🏻' => ':kiss_man_man_light_skin_tone:', + '👨🏻‍❤️‍💋‍👨🏿' => ':kiss_man_man_light_skin_tone_dark_skin_tone:', + '👨🏻‍❤️‍💋‍👨🏾' => ':kiss_man_man_light_skin_tone_medium_dark_skin_tone:', + '👨🏻‍❤️‍💋‍👨🏼' => ':kiss_man_man_light_skin_tone_medium_light_skin_tone:', + '👨🏻‍❤️‍💋‍👨🏽' => ':kiss_man_man_light_skin_tone_medium_skin_tone:', + '👨🏾‍❤️‍💋‍👨🏾' => ':kiss_man_man_medium_dark_skin_tone:', + '👨🏾‍❤️‍💋‍👨🏿' => ':kiss_man_man_medium_dark_skin_tone_dark_skin_tone:', + '👨🏾‍❤️‍💋‍👨🏻' => ':kiss_man_man_medium_dark_skin_tone_light_skin_tone:', + '👨🏾‍❤️‍💋‍👨🏼' => ':kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone:', + '👨🏾‍❤️‍💋‍👨🏽' => ':kiss_man_man_medium_dark_skin_tone_medium_skin_tone:', + '👨🏼‍❤️‍💋‍👨🏼' => ':kiss_man_man_medium_light_skin_tone:', + '👨🏼‍❤️‍💋‍👨🏿' => ':kiss_man_man_medium_light_skin_tone_dark_skin_tone:', + '👨🏼‍❤️‍💋‍👨🏻' => ':kiss_man_man_medium_light_skin_tone_light_skin_tone:', + '👨🏼‍❤️‍💋‍👨🏾' => ':kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone:', + '👨🏼‍❤️‍💋‍👨🏽' => ':kiss_man_man_medium_light_skin_tone_medium_skin_tone:', + '👨🏽‍❤️‍💋‍👨🏽' => ':kiss_man_man_medium_skin_tone:', + '👨🏽‍❤️‍💋‍👨🏿' => ':kiss_man_man_medium_skin_tone_dark_skin_tone:', + '👨🏽‍❤️‍💋‍👨🏻' => ':kiss_man_man_medium_skin_tone_light_skin_tone:', + '👨🏽‍❤️‍💋‍👨🏾' => ':kiss_man_man_medium_skin_tone_medium_dark_skin_tone:', + '👨🏽‍❤️‍💋‍👨🏼' => ':kiss_man_man_medium_skin_tone_medium_light_skin_tone:', + '🧑🏿‍❤️‍💋‍🧑🏻' => ':kiss_person_person_dark_skin_tone_light_skin_tone:', + '🧑🏿‍❤️‍💋‍🧑🏾' => ':kiss_person_person_dark_skin_tone_medium_dark_skin_tone:', + '🧑🏿‍❤️‍💋‍🧑🏼' => ':kiss_person_person_dark_skin_tone_medium_light_skin_tone:', + '🧑🏿‍❤️‍💋‍🧑🏽' => ':kiss_person_person_dark_skin_tone_medium_skin_tone:', + '🧑🏻‍❤️‍💋‍🧑🏿' => ':kiss_person_person_light_skin_tone_dark_skin_tone:', + '🧑🏻‍❤️‍💋‍🧑🏾' => ':kiss_person_person_light_skin_tone_medium_dark_skin_tone:', + '🧑🏻‍❤️‍💋‍🧑🏼' => ':kiss_person_person_light_skin_tone_medium_light_skin_tone:', + '🧑🏻‍❤️‍💋‍🧑🏽' => ':kiss_person_person_light_skin_tone_medium_skin_tone:', + '🧑🏾‍❤️‍💋‍🧑🏿' => ':kiss_person_person_medium_dark_skin_tone_dark_skin_tone:', + '🧑🏾‍❤️‍💋‍🧑🏻' => ':kiss_person_person_medium_dark_skin_tone_light_skin_tone:', + '🧑🏾‍❤️‍💋‍🧑🏼' => ':kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone:', + '🧑🏾‍❤️‍💋‍🧑🏽' => ':kiss_person_person_medium_dark_skin_tone_medium_skin_tone:', + '🧑🏼‍❤️‍💋‍🧑🏿' => ':kiss_person_person_medium_light_skin_tone_dark_skin_tone:', + '🧑🏼‍❤️‍💋‍🧑🏻' => ':kiss_person_person_medium_light_skin_tone_light_skin_tone:', + '🧑🏼‍❤️‍💋‍🧑🏾' => ':kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone:', + '🧑🏼‍❤️‍💋‍🧑🏽' => ':kiss_person_person_medium_light_skin_tone_medium_skin_tone:', + '🧑🏽‍❤️‍💋‍🧑🏿' => ':kiss_person_person_medium_skin_tone_dark_skin_tone:', + '🧑🏽‍❤️‍💋‍🧑🏻' => ':kiss_person_person_medium_skin_tone_light_skin_tone:', + '🧑🏽‍❤️‍💋‍🧑🏾' => ':kiss_person_person_medium_skin_tone_medium_dark_skin_tone:', + '🧑🏽‍❤️‍💋‍🧑🏼' => ':kiss_person_person_medium_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍💋‍👨🏿' => ':kiss_woman_man_dark_skin_tone:', + '👩🏿‍❤️‍💋‍👨🏻' => ':kiss_woman_man_dark_skin_tone_light_skin_tone:', + '👩🏿‍❤️‍💋‍👨🏾' => ':kiss_woman_man_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍❤️‍💋‍👨🏼' => ':kiss_woman_man_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍💋‍👨🏽' => ':kiss_woman_man_dark_skin_tone_medium_skin_tone:', + '👩🏻‍❤️‍💋‍👨🏻' => ':kiss_woman_man_light_skin_tone:', + '👩🏻‍❤️‍💋‍👨🏿' => ':kiss_woman_man_light_skin_tone_dark_skin_tone:', + '👩🏻‍❤️‍💋‍👨🏾' => ':kiss_woman_man_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍❤️‍💋‍👨🏼' => ':kiss_woman_man_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍❤️‍💋‍👨🏽' => ':kiss_woman_man_light_skin_tone_medium_skin_tone:', + '👩🏾‍❤️‍💋‍👨🏾' => ':kiss_woman_man_medium_dark_skin_tone:', + '👩🏾‍❤️‍💋‍👨🏿' => ':kiss_woman_man_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍❤️‍💋‍👨🏻' => ':kiss_woman_man_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍❤️‍💋‍👨🏼' => ':kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍❤️‍💋‍👨🏽' => ':kiss_woman_man_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍❤️‍💋‍👨🏼' => ':kiss_woman_man_medium_light_skin_tone:', + '👩🏼‍❤️‍💋‍👨🏿' => ':kiss_woman_man_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍❤️‍💋‍👨🏻' => ':kiss_woman_man_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍❤️‍💋‍👨🏾' => ':kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍❤️‍💋‍👨🏽' => ':kiss_woman_man_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍❤️‍💋‍👨🏽' => ':kiss_woman_man_medium_skin_tone:', + '👩🏽‍❤️‍💋‍👨🏿' => ':kiss_woman_man_medium_skin_tone_dark_skin_tone:', + '👩🏽‍❤️‍💋‍👨🏻' => ':kiss_woman_man_medium_skin_tone_light_skin_tone:', + '👩🏽‍❤️‍💋‍👨🏾' => ':kiss_woman_man_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍❤️‍💋‍👨🏼' => ':kiss_woman_man_medium_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍💋‍👩🏿' => ':kiss_woman_woman_dark_skin_tone:', + '👩🏿‍❤️‍💋‍👩🏻' => ':kiss_woman_woman_dark_skin_tone_light_skin_tone:', + '👩🏿‍❤️‍💋‍👩🏾' => ':kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍❤️‍💋‍👩🏼' => ':kiss_woman_woman_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍💋‍👩🏽' => ':kiss_woman_woman_dark_skin_tone_medium_skin_tone:', + '👩🏻‍❤️‍💋‍👩🏻' => ':kiss_woman_woman_light_skin_tone:', + '👩🏻‍❤️‍💋‍👩🏿' => ':kiss_woman_woman_light_skin_tone_dark_skin_tone:', + '👩🏻‍❤️‍💋‍👩🏾' => ':kiss_woman_woman_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍❤️‍💋‍👩🏼' => ':kiss_woman_woman_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍❤️‍💋‍👩🏽' => ':kiss_woman_woman_light_skin_tone_medium_skin_tone:', + '👩🏾‍❤️‍💋‍👩🏾' => ':kiss_woman_woman_medium_dark_skin_tone:', + '👩🏾‍❤️‍💋‍👩🏿' => ':kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍❤️‍💋‍👩🏻' => ':kiss_woman_woman_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍❤️‍💋‍👩🏼' => ':kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍❤️‍💋‍👩🏽' => ':kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍❤️‍💋‍👩🏼' => ':kiss_woman_woman_medium_light_skin_tone:', + '👩🏼‍❤️‍💋‍👩🏿' => ':kiss_woman_woman_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍❤️‍💋‍👩🏻' => ':kiss_woman_woman_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍❤️‍💋‍👩🏾' => ':kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍❤️‍💋‍👩🏽' => ':kiss_woman_woman_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍❤️‍💋‍👩🏽' => ':kiss_woman_woman_medium_skin_tone:', + '👩🏽‍❤️‍💋‍👩🏿' => ':kiss_woman_woman_medium_skin_tone_dark_skin_tone:', + '👩🏽‍❤️‍💋‍👩🏻' => ':kiss_woman_woman_medium_skin_tone_light_skin_tone:', + '👩🏽‍❤️‍💋‍👩🏾' => ':kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍❤️‍💋‍👩🏼' => ':kiss_woman_woman_medium_skin_tone_medium_light_skin_tone:', + '👨🏿‍❤️‍👨🏿' => ':couple_with_heart_man_man_dark_skin_tone:', + '👨🏿‍❤️‍👨🏻' => ':couple_with_heart_man_man_dark_skin_tone_light_skin_tone:', + '👨🏿‍❤️‍👨🏾' => ':couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone:', + '👨🏿‍❤️‍👨🏼' => ':couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone:', + '👨🏿‍❤️‍👨🏽' => ':couple_with_heart_man_man_dark_skin_tone_medium_skin_tone:', + '👨🏻‍❤️‍👨🏻' => ':couple_with_heart_man_man_light_skin_tone:', + '👨🏻‍❤️‍👨🏿' => ':couple_with_heart_man_man_light_skin_tone_dark_skin_tone:', + '👨🏻‍❤️‍👨🏾' => ':couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone:', + '👨🏻‍❤️‍👨🏼' => ':couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone:', + '👨🏻‍❤️‍👨🏽' => ':couple_with_heart_man_man_light_skin_tone_medium_skin_tone:', + '👨🏾‍❤️‍👨🏾' => ':couple_with_heart_man_man_medium_dark_skin_tone:', + '👨🏾‍❤️‍👨🏿' => ':couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone:', + '👨🏾‍❤️‍👨🏻' => ':couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone:', + '👨🏾‍❤️‍👨🏼' => ':couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone:', + '👨🏾‍❤️‍👨🏽' => ':couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone:', + '👨🏼‍❤️‍👨🏼' => ':couple_with_heart_man_man_medium_light_skin_tone:', + '👨🏼‍❤️‍👨🏿' => ':couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone:', + '👨🏼‍❤️‍👨🏻' => ':couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone:', + '👨🏼‍❤️‍👨🏾' => ':couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone:', + '👨🏼‍❤️‍👨🏽' => ':couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone:', + '👨🏽‍❤️‍👨🏽' => ':couple_with_heart_man_man_medium_skin_tone:', + '👨🏽‍❤️‍👨🏿' => ':couple_with_heart_man_man_medium_skin_tone_dark_skin_tone:', + '👨🏽‍❤️‍👨🏻' => ':couple_with_heart_man_man_medium_skin_tone_light_skin_tone:', + '👨🏽‍❤️‍👨🏾' => ':couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone:', + '👨🏽‍❤️‍👨🏼' => ':couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone:', + '🧑🏿‍❤️‍🧑🏻' => ':couple_with_heart_person_person_dark_skin_tone_light_skin_tone:', + '🧑🏿‍❤️‍🧑🏾' => ':couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone:', + '🧑🏿‍❤️‍🧑🏼' => ':couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone:', + '🧑🏿‍❤️‍🧑🏽' => ':couple_with_heart_person_person_dark_skin_tone_medium_skin_tone:', + '🧑🏻‍❤️‍🧑🏿' => ':couple_with_heart_person_person_light_skin_tone_dark_skin_tone:', + '🧑🏻‍❤️‍🧑🏾' => ':couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone:', + '🧑🏻‍❤️‍🧑🏼' => ':couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone:', + '🧑🏻‍❤️‍🧑🏽' => ':couple_with_heart_person_person_light_skin_tone_medium_skin_tone:', + '🧑🏾‍❤️‍🧑🏿' => ':couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone:', + '🧑🏾‍❤️‍🧑🏻' => ':couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone:', + '🧑🏾‍❤️‍🧑🏼' => ':couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone:', + '🧑🏾‍❤️‍🧑🏽' => ':couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone:', + '🧑🏼‍❤️‍🧑🏿' => ':couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone:', + '🧑🏼‍❤️‍🧑🏻' => ':couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone:', + '🧑🏼‍❤️‍🧑🏾' => ':couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone:', + '🧑🏼‍❤️‍🧑🏽' => ':couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone:', + '🧑🏽‍❤️‍🧑🏿' => ':couple_with_heart_person_person_medium_skin_tone_dark_skin_tone:', + '🧑🏽‍❤️‍🧑🏻' => ':couple_with_heart_person_person_medium_skin_tone_light_skin_tone:', + '🧑🏽‍❤️‍🧑🏾' => ':couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone:', + '🧑🏽‍❤️‍🧑🏼' => ':couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍👨🏿' => ':couple_with_heart_woman_man_dark_skin_tone:', + '👩🏿‍❤️‍👨🏻' => ':couple_with_heart_woman_man_dark_skin_tone_light_skin_tone:', + '👩🏿‍❤️‍👨🏾' => ':couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍❤️‍👨🏼' => ':couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍👨🏽' => ':couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone:', + '👩🏻‍❤️‍👨🏻' => ':couple_with_heart_woman_man_light_skin_tone:', + '👩🏻‍❤️‍👨🏿' => ':couple_with_heart_woman_man_light_skin_tone_dark_skin_tone:', + '👩🏻‍❤️‍👨🏾' => ':couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍❤️‍👨🏼' => ':couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍❤️‍👨🏽' => ':couple_with_heart_woman_man_light_skin_tone_medium_skin_tone:', + '👩🏾‍❤️‍👨🏾' => ':couple_with_heart_woman_man_medium_dark_skin_tone:', + '👩🏾‍❤️‍👨🏿' => ':couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍❤️‍👨🏻' => ':couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍❤️‍👨🏼' => ':couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍❤️‍👨🏽' => ':couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍❤️‍👨🏼' => ':couple_with_heart_woman_man_medium_light_skin_tone:', + '👩🏼‍❤️‍👨🏿' => ':couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍❤️‍👨🏻' => ':couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍❤️‍👨🏾' => ':couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍❤️‍👨🏽' => ':couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍❤️‍👨🏽' => ':couple_with_heart_woman_man_medium_skin_tone:', + '👩🏽‍❤️‍👨🏿' => ':couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone:', + '👩🏽‍❤️‍👨🏻' => ':couple_with_heart_woman_man_medium_skin_tone_light_skin_tone:', + '👩🏽‍❤️‍👨🏾' => ':couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍❤️‍👨🏼' => ':couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍👩🏿' => ':couple_with_heart_woman_woman_dark_skin_tone:', + '👩🏿‍❤️‍👩🏻' => ':couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone:', + '👩🏿‍❤️‍👩🏾' => ':couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍❤️‍👩🏼' => ':couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍❤️‍👩🏽' => ':couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone:', + '👩🏻‍❤️‍👩🏻' => ':couple_with_heart_woman_woman_light_skin_tone:', + '👩🏻‍❤️‍👩🏿' => ':couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone:', + '👩🏻‍❤️‍👩🏾' => ':couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍❤️‍👩🏼' => ':couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍❤️‍👩🏽' => ':couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone:', + '👩🏾‍❤️‍👩🏾' => ':couple_with_heart_woman_woman_medium_dark_skin_tone:', + '👩🏾‍❤️‍👩🏿' => ':couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍❤️‍👩🏻' => ':couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍❤️‍👩🏼' => ':couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍❤️‍👩🏽' => ':couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍❤️‍👩🏼' => ':couple_with_heart_woman_woman_medium_light_skin_tone:', + '👩🏼‍❤️‍👩🏿' => ':couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍❤️‍👩🏻' => ':couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍❤️‍👩🏾' => ':couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍❤️‍👩🏽' => ':co ED48 uple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍❤️‍👩🏽' => ':couple_with_heart_woman_woman_medium_skin_tone:', + '👩🏽‍❤️‍👩🏿' => ':couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone:', + '👩🏽‍❤️‍👩🏻' => ':couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone:', + '👩🏽‍❤️‍👩🏾' => ':couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍❤️‍👩🏼' => ':couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone:', '👨‍❤️‍💋‍👨' => ':kiss_mm:', + '👩‍❤️‍💋‍👨' => ':kiss_woman_man:', '👩‍❤️‍💋‍👩' => ':kiss_ww:', + '🧎🏿‍♂️‍➡️' => ':man_kneeling_facing_right_dark_skin_tone:', + '🧎🏻‍♂️‍➡️' => ':man_kneeling_facing_right_light_skin_tone:', + '🧎🏾‍♂️‍➡️' => ':man_kneeling_facing_right_medium_dark_skin_tone:', + '🧎🏼‍♂️‍➡️' => ':man_kneeling_facing_right_medium_light_skin_tone:', + '🧎🏽‍♂️‍➡️' => ':man_kneeling_facing_right_medium_skin_tone:', + '🏃🏿‍♂️‍➡️' => ':man_running_facing_right_dark_skin_tone:', + '🏃🏻‍♂️‍➡️' => ':man_running_facing_right_light_skin_tone:', + '🏃🏾‍♂️‍➡️' => ':man_running_facing_right_medium_dark_skin_tone:', + '🏃🏼‍♂️‍➡️' => ':man_running_facing_right_medium_light_skin_tone:', + '🏃🏽‍♂️‍➡️' => ':man_running_facing_right_medium_skin_tone:', + '🚶🏿‍♂️‍➡️' => ':man_walking_facing_right_dark_skin_tone:', + '🚶🏻‍♂️‍➡️' => ':man_walking_facing_right_light_skin_tone:', + '🚶🏾‍♂️‍➡️' => ':man_walking_facing_right_medium_dark_skin_tone:', + '🚶🏼‍♂️‍➡️' => ':man_walking_facing_right_medium_light_skin_tone:', + '🚶🏽‍♂️‍➡️' => ':man_walking_facing_right_medium_skin_tone:', + '🧎🏿‍♀️‍➡️' => ':woman_kneeling_facing_right_dark_skin_tone:', + '🧎🏻‍♀️‍➡️' => ':woman_kneeling_facing_right_light_skin_tone:', + '🧎🏾‍♀️‍➡️' => ':woman_kneeling_facing_right_medium_dark_skin_tone:', + '🧎🏼‍♀️‍➡️' => ':woman_kneeling_facing_right_medium_light_skin_tone:', + '🧎🏽‍♀️‍➡️' => ':woman_kneeling_facing_right_medium_skin_tone:', + '🏃🏿‍♀️‍➡️' => ':woman_running_facing_right_dark_skin_tone:', + '🏃🏻‍♀️‍➡️' => ':woman_running_facing_right_light_skin_tone:', + '🏃🏾‍♀️‍➡️' => ':woman_running_facing_right_medium_dark_skin_tone:', + '🏃🏼‍♀️‍➡️' => ':woman_running_facing_right_medium_light_skin_tone:', + '🏃🏽‍♀️‍➡️' => ':woman_running_facing_right_medium_skin_tone:', + '🚶🏿‍♀️‍➡️' => ':woman_walking_facing_right_dark_skin_tone:', + '🚶🏻‍♀️‍➡️' => ':woman_walking_facing_right_light_skin_tone:', + '🚶🏾‍♀️‍➡️' => ':woman_walking_facing_right_medium_dark_skin_tone:', + '🚶🏼‍♀️‍➡️' => ':woman_walking_facing_right_medium_light_skin_tone:', + '🚶🏽‍♀️‍➡️' => ':woman_walking_facing_right_medium_skin_tone:', + '🧑‍🧑‍🧒‍🧒' => ':family_adult_adult_child_child:', '👨‍👨‍👦‍👦' => ':family_mmbb:', '👨‍👨‍👧‍👦' => ':family_mmgb:', '👨‍👨‍👧‍👧' => ':family_mmgg:', @@ -12,35 +234,1291 @@ '👩‍👩‍👦‍👦' => ':family_wwbb:', '👩‍👩‍👧‍👦' => ':family_wwgb:', '👩‍👩‍👧‍👧' => ':family_wwgg:', + '🏴󠁧󠁢󠁥󠁮󠁧󠁿' => ':flag_england:', + '🏴󠁧󠁢󠁳󠁣󠁴󠁿' => ':flag_scotland:', + '🏴󠁧󠁢󠁷󠁬󠁳󠁿' => ':flag_wales:', + '👨🏿‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right_dark_skin_tone:', + '👨🏻‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right_light_skin_tone:', + '👨🏾‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right_medium_dark_skin_tone:', + '👨🏼‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right_medium_light_skin_tone:', + '👨🏽‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right_medium_skin_tone:', + '👨🏿‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right_dark_skin_tone:', + '👨🏻‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right_light_skin_tone:', + '👨🏾‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:', + '👨🏼‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right_medium_light_skin_tone:', + '👨🏽‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right_medium_skin_tone:', + '🧎‍♂️‍➡️' => ':man_kneeling_facing_right:', + '🏃‍♂️‍➡️' => ':man_running_facing_right:', + '🚶‍♂️‍➡️' => ':man_walking_facing_right:', + '👨🏿‍🦯‍➡️' => ':man_with_white_cane_facing_right_dark_skin_tone:', + '👨🏻‍🦯‍➡️' => ':man_with_white_cane_facing_right_light_skin_tone:', + '👨🏾‍🦯‍➡️' => ':man_with_white_cane_facing_right_medium_dark_skin_tone:', + '👨🏼‍🦯‍➡️' => ':man_with_white_cane_facing_right_medium_light_skin_tone:', + '👨🏽‍🦯‍➡️' => ':man_with_white_cane_facing_right_medium_skin_tone:', + '👨🏿‍🤝‍👨🏻' => ':men_holding_hands_dark_skin_tone_light_skin_tone:', + '👨🏿‍🤝‍👨🏾' => ':men_holding_hands_dark_skin_tone_medium_dark_skin_tone:', + '👨🏿‍🤝‍👨🏼' => ':men_holding_hands_dark_skin_tone_medium_light_skin_tone:', + '👨🏿‍🤝‍👨🏽' => ':men_holding_hands_dark_skin_tone_medium_skin_tone:', + '👨🏻‍🤝‍👨🏿' => ':men_holding_hands_light_skin_tone_dark_skin_tone:', + '👨🏻‍🤝‍👨🏾' => ':men_holding_hands_light_skin_tone_medium_dark_skin_tone:', + '👨🏻‍🤝‍👨🏼' => ':men_holding_hands_light_skin_tone_medium_light_skin_tone:', + '👨🏻‍🤝‍👨🏽' => ':men_holding_hands_light_skin_tone_medium_skin_tone:', + '👨🏾‍🤝‍👨🏿' => ':men_holding_hands_medium_dark_skin_tone_dark_skin_tone:', + '👨🏾‍🤝‍👨🏻' => ':men_holding_hands_medium_dark_skin_tone_light_skin_tone:', + '👨🏾‍🤝‍👨🏼' => ':men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:', + '👨🏾‍🤝‍👨🏽' => ':men_holding_hands_medium_dark_skin_tone_medium_skin_tone:', + '👨🏼‍🤝‍👨🏿' => ':men_holding_hands_medium_light_skin_tone_dark_skin_tone:', + '👨🏼‍🤝‍👨🏻' => ':men_holding_hands_medium_light_skin_tone_light_skin_tone:', + '👨🏼‍🤝‍👨🏾' => ':men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:', + '👨🏼‍🤝‍👨🏽' => ':men_holding_hands_medium_light_skin_tone_medium_skin_tone:', + '👨🏽‍🤝‍👨🏿' => ':men_holding_hands_medium_skin_tone_dark_skin_tone:', + '👨🏽‍🤝‍👨🏻' => ':men_holding_hands_medium_skin_tone_light_skin_tone:', + '👨🏽‍🤝‍👨🏾' => ':men_holding_hands_medium_skin_tone_medium_dark_skin_tone:', + '👨🏽‍🤝‍👨🏼' => ':men_holding_hands_medium_skin_tone_medium_light_skin_tone:', + '🧑🏿‍🤝‍🧑🏿' => ':people_holding_hands_dark_skin_tone:', + '🧑🏿‍🤝‍🧑🏻' => ':people_holding_hands_dark_skin_tone_light_skin_tone:', + '🧑🏿‍🤝‍🧑🏾' => ':people_holding_hands_dark_skin_tone_medium_dark_skin_tone:', + '🧑🏿‍🤝‍🧑🏼' => ':people_holding_hands_dark_skin_tone_medium_light_skin_tone:', + '🧑🏿‍🤝‍🧑🏽' => ':people_holding_hands_dark_skin_tone_medium_skin_tone:', + '🧑🏻‍🤝‍🧑🏻' => ':people_holding_hands_light_skin_tone:', + '🧑🏻‍🤝‍🧑🏿' => ':people_holding_hands_light_skin_tone_dark_skin_tone:', + '🧑🏻‍🤝‍🧑🏾' => ':people_holding_hands_light_skin_tone_medium_dark_skin_tone:', + '🧑🏻‍🤝‍🧑🏼' => ':people_holding_hands_light_skin_tone_medium_light_skin_tone:', + '🧑🏻‍🤝‍🧑🏽' => ':people_holding_hands_light_skin_tone_medium_skin_tone:', + '🧑🏾‍🤝‍🧑🏾' => ':people_holding_hands_medium_dark_skin_tone:', + '🧑🏾‍🤝‍🧑🏿' => ':people_holding_hands_medium_dark_skin_tone_dark_skin_tone:', + '🧑🏾‍🤝‍🧑🏻' => ':people_holding_hands_medium_dark_skin_tone_light_skin_tone:', + '🧑🏾‍🤝‍🧑🏼' => ':people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:', + '🧑🏾‍🤝‍🧑🏽' => ':people_holding_hands_medium_dark_skin_tone_medium_skin_tone:', + '🧑🏼‍🤝‍🧑🏼' => ':people_holding_hands_medium_light_skin_tone:', + '🧑🏼‍🤝‍🧑🏿' => ':people_holding_hands_medium_light_skin_tone_dark_skin_tone:', + '🧑🏼‍🤝‍🧑🏻' => ':people_holding_hands_medium_light_skin_tone_light_skin_tone:', + '🧑🏼‍🤝‍🧑🏾' => ':people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:', + '🧑🏼‍🤝‍🧑🏽' => ':people_holding_hands_medium_light_skin_tone_medium_skin_tone:', + '🧑🏽‍🤝‍🧑🏽' => ':people_holding_hands_medium_skin_tone:', + '🧑🏽‍🤝‍🧑🏿' => ':people_holding_hands_medium_skin_tone_dark_skin_tone:', + '🧑🏽‍🤝‍🧑🏻' => ':people_holding_hands_medium_skin_tone_light_skin_tone:', + '🧑🏽‍🤝‍🧑🏾' => ':people_holding_hands_medium_skin_tone_medium_dark_skin_tone:', + '🧑🏽‍🤝‍🧑🏼' => ':people_holding_hands_medium_skin_tone_medium_light_skin_tone:', + '🧑🏿‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right_dark_skin_tone:', + '🧑🏻‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right_light_skin_tone:', + '🧑🏾‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right_medium_dark_skin_tone:', + '🧑🏼‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right_medium_light_skin_tone:', + '🧑🏽‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right_medium_skin_tone:', + '🧑🏿‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right_dark_skin_tone:', + '🧑🏻‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right_light_skin_tone:', + '🧑🏾‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:', + '🧑🏼‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right_medium_light_skin_tone:', + '🧑🏽‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right_medium_skin_tone:', + '🧑🏿‍🦯‍➡️' => ':person_with_white_cane_facing_right_dark_skin_tone:', + '🧑🏻‍🦯‍➡️' => ':person_with_white_cane_facing_right_light_skin_tone:', + '🧑🏾‍🦯‍➡️' => ':person_with_white_cane_facing_right_medium_dark_skin_tone:', + '🧑🏼‍🦯‍➡️' => ':person_with_white_cane_facing_right_medium_light_skin_tone:', + '🧑🏽‍🦯‍➡️' => ':person_with_white_cane_facing_right_medium_skin_tone:', + '👩🏿‍🤝‍👨🏻' => ':woman_and_man_holding_hands_dark_skin_tone_light_skin_tone:', + '👩🏿‍🤝‍👨🏾' => ':woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍🤝‍👨🏼' => ':woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍🤝‍👨🏽' => ':woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone:', + '👩🏻‍🤝‍👨🏿' => ':woman_and_man_holding_hands_light_skin_tone_dark_skin_tone:', + '👩🏻‍🤝‍👨🏾' => ':woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍🤝‍👨🏼' => ':woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍🤝‍👨🏽' => ':woman_and_man_holding_hands_light_skin_tone_medium_skin_tone:', + '👩🏾‍🤝‍👨🏿' => ':woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍🤝‍👨🏻' => ':woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍🤝‍👨🏼' => ':woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍🤝‍👨🏽' => ':woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍🤝‍👨🏿' => ':woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍🤝‍👨🏻' => ':woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍🤝‍👨🏾' => ':woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍🤝‍👨🏽' => ':woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍🤝‍👨🏿' => ':woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone:', + '👩🏽‍🤝‍👨🏻' => ':woman_and_man_holding_hands_medium_skin_tone_light_skin_tone:', + '👩🏽‍🤝‍👨🏾' => ':woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍🤝‍👨🏼' => ':woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone:', + '👩🏿‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right_dark_skin_tone:', + '👩🏻‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right_light_skin_tone:', + '👩🏾‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right_medium_dark_skin_tone:', + '👩🏼‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right_medium_light_skin_tone:', + '👩🏽‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right_medium_skin_tone:', + '👩🏿‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right_dark_skin_tone:', + '👩🏻‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right_light_skin_tone:', + '👩🏾‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:', + '👩🏼‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right_medium_light_skin_tone:', + '👩🏽‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right_medium_skin_tone:', + '🧎‍♀️‍➡️' => ':woman_kneeling_facing_right:', + '🏃‍♀️‍➡️' => ':woman_running_facing_right:', + '🚶‍♀️‍➡️' => ':woman_walking_facing_right:', + '👩🏿‍🦯‍➡️' => ':woman_with_white_cane_facing_right_dark_skin_tone:', + '👩🏻‍🦯‍➡️' => ':woman_with_white_cane_facing_right_light_skin_tone:', + '👩🏾‍🦯‍➡️' => ':woman_with_white_cane_facing_right_medium_dark_skin_tone:', + '👩🏼‍🦯‍➡️' => ':woman_with_white_cane_facing_right_medium_light_skin_tone:', + '👩🏽‍🦯‍➡️' => ':woman_with_white_cane_facing_right_medium_skin_tone:', + '👩🏿‍🤝‍👩🏻' => ':women_holding_hands_dark_skin_tone_light_skin_tone:', + '👩🏿‍🤝‍👩🏾' => ':women_holding_hands_dark_skin_tone_medium_dark_skin_tone:', + '👩🏿‍🤝‍👩🏼' => ':women_holding_hands_dark_skin_tone_medium_light_skin_tone:', + '👩🏿‍🤝‍👩🏽' => ':women_holding_hands_dark_skin_tone_medium_skin_tone:', + '👩🏻‍🤝‍👩🏿' => ':women_holding_hands_light_skin_tone_dark_skin_tone:', + '👩🏻‍🤝‍👩🏾' => ':women_holding_hands_light_skin_tone_medium_dark_skin_tone:', + '👩🏻‍🤝‍👩🏼' => ':women_holding_hands_light_skin_tone_medium_light_skin_tone:', + '👩🏻‍🤝‍👩🏽' => ':women_holding_hands_light_skin_tone_medium_skin_tone:', + '👩🏾‍🤝‍👩🏿' => ':women_holding_hands_medium_dark_skin_tone_dark_skin_tone:', + '👩🏾‍🤝‍👩🏻' => ':women_holding_hands_medium_dark_skin_tone_light_skin_tone:', + '👩🏾‍🤝‍👩🏼' => ':women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:', + '👩🏾‍🤝‍👩🏽' => ':women_holding_hands_medium_dark_skin_tone_medium_skin_tone:', + '👩🏼‍🤝‍👩🏿' => ':women_holding_hands_medium_light_skin_tone_dark_skin_tone:', + '👩🏼‍🤝‍👩🏻' => ':women_holding_hands_medium_light_skin_tone_light_skin_tone:', + '👩🏼‍🤝‍👩🏾' => ':women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:', + '👩🏼‍🤝‍👩🏽' => ':women_holding_hands_medium_light_skin_tone_medium_skin_tone:', + '👩🏽‍🤝‍👩🏿' => ':women_holding_hands_medium_skin_tone_dark_skin_tone:', + '👩🏽‍🤝‍👩🏻' => ':women_holding_hands_medium_skin_tone_light_skin_tone:', + '👩🏽‍🤝‍👩🏾' => ':women_holding_hands_medium_skin_tone_medium_dark_skin_tone:', + '👩🏽‍🤝‍👩🏼' => ':women_holding_hands_medium_skin_tone_medium_light_skin_tone:', '👨‍❤️‍👨' => ':couple_mm:', + '👩‍❤️‍👨' => ':couple_with_heart_woman_man:', '👩‍❤️‍👩' => ':couple_ww:', + '👨‍🦽‍➡️' => ':man_in_manual_wheelchair_facing_right:', + '👨‍🦼‍➡️' => ':man_in_motorized_wheelchair_facing_right:', + '👨‍🦯‍➡️' => ':man_with_white_cane_facing_right:', + '🧑‍🦽‍➡️' => ':person_in_manual_wheelchair_facing_right:', + '🧑‍🦼‍➡️' => ':person_in_motorized_wheelchair_facing_right:', + '🧑‍🦯‍➡️' => ':person_with_white_cane_facing_right:', + '👩‍🦽‍➡️' => ':woman_in_manual_wheelchair_facing_right:', + '👩‍🦼‍➡️' => ':woman_in_motorized_wheelchair_facing_right:', + '👩‍🦯‍➡️' => ':woman_with_white_cane_facing_right:', + '🧏🏿‍♂️' => ':deaf_man_dark_skin_tone:', + '🧏🏻‍♂️' => ':deaf_man_light_skin_tone:', + '🧏🏾‍♂️' => ':deaf_man_medium_dark_skin_tone:', + '🧏🏼‍♂️' => ':deaf_man_medium_light_skin_tone:', + '🧏🏽‍♂️' => ':deaf_man_medium_skin_tone:', + '🧏🏿‍♀️' => ':deaf_woman_dark_skin_tone:', + '🧏🏻‍♀️' => ':deaf_woman_light_skin_tone:', + '🧏🏾‍♀️' => ':deaf_woman_medium_dark_skin_tone:', + '🧏🏼‍♀️' => ':deaf_woman_medium_light_skin_tone:', + '🧏🏽‍♀️' => ':deaf_woman_medium_skin_tone:', + '👁️‍🗨️' => ':eye_in_speech_bubble:', + '🧑‍🧑‍🧒' => ':family_adult_adult_child:', + '🧑‍🧒‍🧒' => ':family_adult_child_child:', + '👨‍👦‍👦' => ':family_man_boy_boy:', + '👨‍👧‍👦' => ':family_man_girl_boy:', + '👨‍👧‍👧' => ':family_man_girl_girl:', + '👨‍👩‍👦' => ':family_man_woman_boy:', '👨‍👨‍👦' => ':family_mmb:', '👨‍👨‍👧' => ':family_mmg:', '👨‍👩‍👧' => ':family_mwg:', + '👩‍👦‍👦' => ':family_woman_boy_boy:', + '👩‍👧‍👦' => ':family_woman_girl_boy:', + '👩‍👧‍👧' => ':family_woman_girl_girl:', '👩‍👩‍👦' => ':family_wwb:', '👩‍👩‍👧' => ':family_wwg:', + '🫱🏿‍🫲🏻' => ':handshake_dark_skin_tone_light_skin_tone:', + '🫱🏿‍🫲🏾' => ':handshake_dark_skin_tone_medium_dark_skin_tone:', + '🫱🏿‍🫲🏼' => ':handshake_dark_skin_tone_medium_light_skin_tone:', + '🫱🏿‍🫲🏽' => ':handshake_dark_skin_tone_medium_skin_tone:', + '🫱🏻‍🫲🏿' => ':handshake_light_skin_tone_dark_skin_tone:', + '🫱🏻‍🫲🏾' => ':handshake_light_skin_tone_medium_dark_skin_tone:', + '🫱🏻‍🫲🏼' => ':handshake_light_skin_tone_medium_light_skin_tone:', + '🫱🏻‍🫲🏽' => ':handshake_light_skin_tone_medium_skin_tone:', + '🫱🏾‍🫲🏿' => ':handshake_medium_dark_skin_tone_dark_skin_tone:', + '🫱🏾‍🫲🏻' => ':handshake_medium_dark_skin_tone_light_skin_tone:', + '🫱🏾‍🫲🏼' => ':handshake_medium_dark_skin_tone_medium_light_skin_tone:', + '🫱🏾‍🫲🏽' => ':handshake_medium_dark_skin_tone_medium_skin_tone:', + '🫱🏼‍🫲🏿' => ':handshake_medium_light_skin_tone_dark_skin_tone:', + '🫱🏼‍🫲🏻' => ':handshake_medium_light_skin_tone_light_skin_tone:', + '🫱🏼‍🫲🏾' => ':handshake_medium_light_skin_tone_medium_dark_skin_tone:', + '🫱🏼‍🫲🏽' => ':handshake_medium_light_skin_tone_medium_skin_tone:', + '🫱🏽‍🫲🏿' => ':handshake_medium_skin_tone_dark_skin_tone:', + '🫱🏽‍🫲🏻' => ':handshake_medium_skin_tone_light_skin_tone:', + '🫱🏽‍🫲🏾' => ':handshake_medium_skin_tone_medium_dark_skin_tone:', + '🫱🏽‍🫲🏼' => ':handshake_medium_skin_tone_medium_light_skin_tone:', + '🧑🏿‍⚕️' => ':health_worker_dark_skin_tone:', + '🧑🏻‍⚕️' => ':health_worker_light_skin_tone:', + '🧑🏾‍⚕️' => ':health_worker_medium_dark_skin_tone:', + '🧑🏼‍⚕️' => ':health_worker_medium_light_skin_tone:', + '🧑🏽‍⚕️' => ':health_worker_medium_skin_tone:', + '🧑🏿‍⚖️' => ':judge_dark_skin_tone:', + '🧑🏻‍⚖️' => ':judge_light_skin_tone:', + '🧑🏾‍⚖️' => ':judge_medium_dark_skin_tone:', + '🧑🏼‍⚖️' => ':judge_medium_light_skin_tone:', + '🧑🏽‍⚖️' => ':judge_medium_skin_tone:', + '🚴🏿‍♂️' => ':man_biking_dark_skin_tone:', + '🚴🏻‍♂️' => ':man_biking_light_skin_tone:', + '🚴🏾‍♂️' => ':man_biking_medium_dark_skin_tone:', + '🚴🏼‍♂️' => ':man_biking_medium_light_skin_tone:', + '🚴🏽‍♂️' => ':man_biking_medium_skin_tone:', + '⛹️‍♂️' => ':man_bouncing_ball:', + '⛹🏿‍♂️' => ':man_bouncing_ball_dark_skin_tone:', + '⛹🏻‍♂️' => ':man_bouncing_ball_light_skin_tone:', + '⛹🏾‍♂️' => ':man_bouncing_ball_medium_dark_skin_tone:', + '⛹🏼‍♂️' => ':man_bouncing_ball_medium_light_skin_tone:', + '⛹🏽‍♂️' => ':man_bouncing_ball_medium_skin_tone:', + '🙇🏿‍♂️' => ':man_bowing_dark_skin_tone:', + '🙇🏻‍♂️' => ':man_bowing_light_skin_tone:', + '🙇🏾‍♂️' => ':man_bowing_medium_dark_skin_tone:', + '🙇🏼‍♂️' => ':man_bowing_medium_light_skin_tone:', + '🙇🏽‍♂️' => ':man_bowing_medium_skin_tone:', + '🤸🏿‍♂️' => ':man_cartwheeling_dark_skin_tone:', + '🤸🏻‍♂️' => ':man_cartwheeling_light_skin_tone:', + '🤸🏾‍♂️' => ':man_cartwheeling_medium_dark_skin_tone:', + '🤸🏼‍♂️' => ':man_cartwheeling_medium_light_skin_tone:', + '🤸🏽‍♂️' => ':man_cartwheeling_medium_skin_tone:', + '🧗🏿‍♂️' => ':man_climbing_dark_skin_tone:', + '🧗🏻‍♂️' => ':man_climbing_light_skin_tone:', + '🧗🏾‍♂️' => ':man_climbing_medium_dark_skin_tone:', + '🧗🏼‍♂️' => ':man_climbing_medium_light_skin_tone:', + '🧗🏽‍♂️' => ':man_climbing_medium_skin_tone:', + '👷🏿‍♂️' => ':man_construction_worker_dark_skin_tone:', + '👷🏻‍♂️' => ':man_construction_worker_light_skin_tone:', + '👷🏾‍♂️' => ':man_construction_worker_medium_dark_skin_tone:', + '👷🏼‍♂️' => ':man_construction_worker_medium_light_skin_tone:', + '👷🏽‍♂️' => ':man_construction_worker_medium_skin_tone:', + '🧔🏿‍♂️' => ':man_dark_skin_tone_beard:', + '👱🏿‍♂️' => ':man_dark_skin_tone_blond_hair:', + '🕵️‍♂️' => ':man_detective:', + '🕵🏿‍♂️' => ':man_detective_dark_skin_tone:', + '🕵🏻‍♂️' => ':man_detective_light_skin_tone:', + '🕵🏾‍♂️' => ':man_detective_medium_dark_skin_tone:', + '🕵🏼‍♂️' => ':man_detective_medium_light_skin_tone:', + '🕵🏽‍♂️' => ':man_detective_medium_skin_tone:', + '🧝🏿‍♂️' => ':man_elf_dark_skin_tone:', + '🧝🏻‍♂️' => ':man_elf_light_skin_tone:', + '🧝🏾‍♂️' => ':man_elf_medium_dark_skin_tone:', + '🧝🏼‍♂️' => ':man_elf_medium_light_skin_tone:', + '🧝🏽‍♂️' => ':man_elf_medium_skin_tone:', + '🤦🏿‍♂️' => ':man_facepalming_dark_skin_tone:', + '🤦🏻‍♂️' => ':man_facepalming_light_skin_tone:', + '🤦🏾‍♂️' => ':man_facepalming_medium_dark_skin_tone:', + '🤦🏼‍♂️' => ':man_facepalming_medium_light_skin_tone:', + '🤦🏽‍♂️' => ':man_facepalming_medium_skin_tone:', + '🧚🏿‍♂️' => ':man_fairy_dark_skin_tone:', + '🧚🏻‍♂️' => ':man_fairy_light_skin_tone:', + '🧚🏾‍♂️' => ':man_fairy_medium_dark_skin_tone:', + '🧚🏼‍♂️' => ':man_fairy_medium_light_skin_tone:', + '🧚🏽‍♂️' => ':man_fairy_medium_skin_tone:', + '🙍🏿‍♂️' => ':man_frowning_dark_skin_tone:', + '🙍🏻‍♂️' => ':man_frowning_light_skin_tone:', + '🙍🏾‍♂️' => ':man_frowning_medium_dark_skin_tone:', + '🙍🏼‍♂️' => ':man_frowning_medium_light_skin_tone:', + '🙍🏽‍♂️' => ':man_frowning_medium_skin_tone:', + '🙅🏿‍♂️' => ':man_gesturing_no_dark_skin_tone:', + '🙅🏻‍♂️' => ':man_gesturing_no_light_skin_tone:', + '🙅🏾‍♂️' => ':man_gesturing_no_medium_dark_skin_tone:', + '🙅🏼‍♂️' => ':man_gesturing_no_medium_light_skin_tone:', + '🙅🏽‍♂️' => ':man_gesturing_no_medium_skin_tone:', + '🙆🏿‍♂️' => ':man_gesturing_ok_dark_skin_tone:', + '🙆🏻‍♂️' => ':man_gesturing_ok_light_skin_tone:', + '🙆🏾‍♂️' => ':man_gesturing_ok_medium_dark_skin_tone:', + '🙆🏼‍♂️' => ':man_gesturing_ok_medium_light_skin_tone:', + '🙆🏽‍♂️' => ':man_gesturing_ok_medium_skin_tone:', + '💇🏿‍♂️' => ':man_getting_haircut_dark_skin_tone:', + '💇🏻‍♂️' => ':man_getting_haircut_light_skin_tone:', + '💇🏾‍♂️' => ':man_getting_haircut_medium_dark_skin_tone:', + '💇🏼‍♂️' => ':man_getting_haircut_medium_light_skin_tone:', + '💇🏽‍♂️' => ':man_getting_haircut_medium_skin_tone:', + '💆🏿‍♂️' => ':man_getting_massage_dark_skin_tone:', + '💆🏻‍♂️' => ':man_getting_massage_light_skin_tone:', + '💆🏾‍♂️' => ':man_getting_massage_medium_dark_skin_tone:', + '💆🏼‍♂️' => ':man_getting_massage_medium_light_skin_tone:', + '💆🏽‍♂️' => ':man_getting_massage_medium_skin_tone:', + '🏌️‍♂️' => ':man_golfing:', + '🏌🏿‍♂️' => ':man_golfing_dark_skin_tone:', + '🏌🏻‍♂️' => ':man_golfing_light_skin_tone:', + '🏌🏾‍♂️' => ':man_golfing_medium_dark_skin_tone:', + '🏌🏼‍♂️' => ':man_golfing_medium_light_skin_tone:', + '🏌🏽‍♂️' => ':man_golfing_medium_skin_tone:', + '💂🏿‍♂️' => ':man_guard_dark_skin_tone:', + '💂🏻‍♂️' => ':man_guard_light_skin_tone:', + '💂🏾‍♂️' => ':man_guard_medium_dark_skin_tone:', + '💂🏼‍♂️' => ':man_guard_medium_light_skin_tone:', + '💂🏽‍♂️' => ':man_guard_medium_skin_tone:', + '👨🏿‍⚕️' => ':man_health_worker_dark_skin_tone:', + '👨🏻‍⚕️' => ':man_health_worker_light_skin_tone:', + '👨🏾‍⚕️' => ':man_health_worker_medium_dark_skin_tone:', + '👨🏼‍⚕️' => ':man_health_worker_medium_light_skin_tone:', + '👨🏽‍⚕️' => ':man_health_worker_medium_skin_tone:', + '🧘🏿‍♂️' => ':man_in_lotus_position_dark_skin_tone:', + '🧘🏻‍♂️' => ':man_in_lotus_position_light_skin_tone:', + '🧘🏾‍♂️' => ':man_in_lotus_position_medium_dark_skin_tone:', + '🧘🏼‍♂️' => ':man_in_lotus_position_medium_light_skin_tone:', + '🧘🏽‍♂️' => ':man_in_lotus_position_medium_skin_tone:', + '🧖🏿‍♂️' => ':man_in_steamy_room_dark_skin_tone:', + '🧖🏻‍♂️' => ':man_in_steamy_room_light_skin_tone:', + '🧖🏾‍♂️' => ':man_in_steamy_room_medium_dark_skin_tone:', + '🧖🏼‍♂️' => ':man_in_steamy_room_medium_light_skin_tone:', + '🧖🏽‍♂️' => ':man_in_steamy_room_medium_skin_tone:', + '🤵🏿‍♂️' => ':man_in_tuxedo_dark_skin_tone:', + '🤵🏻‍♂️' => ':man_in_tuxedo_light_skin_tone:', + '🤵🏾‍♂️' => ':man_in_tuxedo_medium_dark_skin_tone:', + '🤵🏼‍♂️' => ':man_in_tuxedo_medium_light_skin_tone:', + '🤵🏽‍♂️' => ':man_in_tuxedo_medium_skin_tone:', + '👨🏿‍⚖️' => ':man_judge_dark_skin_tone:', + '👨🏻‍⚖️' => ':man_judge_light_skin_tone:', + '👨🏾‍⚖️' => ':man_judge_medium_dark_skin_tone:', + '👨🏼‍⚖️' => ':man_judge_medium_light_skin_tone:', + '👨🏽‍⚖️' => ':man_judge_medium_skin_tone:', + '🤹🏿‍♂️' => ':man_juggling_dark_skin_tone:', + '🤹🏻‍♂️' => ':man_juggling_light_skin_tone:', + '🤹🏾‍♂️' => ':man_juggling_medium_dark_skin_tone:', + '🤹🏼‍♂️' => ':man_juggling_medium_light_skin_tone:', + '🤹🏽‍♂️' => ':man_juggling_medium_skin_tone:', + '🧎🏿‍♂️' => ':man_kneeling_dark_skin_tone:', + '🧎🏻‍♂️' => ':man_kneeling_light_skin_tone:', + '🧎🏾‍♂️' => ':man_kneeling_medium_dark_skin_tone:', + '🧎🏼‍♂️' => ':man_kneeling_medium_light_skin_tone:', + '🧎🏽‍♂️' => ':man_kneeling_medium_skin_tone:', + '🏋️‍♂️' => ':man_lifting_weights:', + '🏋🏿‍♂️' => ':man_lifting_weights_dark_skin_tone:', + '🏋🏻‍♂️' => ':man_lifting_weights_light_skin_tone:', + '🏋🏾‍♂️' => ':man_lifting_weights_medium_dark_skin_tone:', + '🏋🏼‍♂️' => ':man_lifting_weights_medium_light_skin_tone:', + '🏋🏽‍♂️' => ':man_lifting_weights_medium_skin_tone:', + '🧔🏻‍♂️' => ':man_light_skin_tone_beard:', + '👱🏻‍♂️' => ':man_light_skin_tone_blond_hair:', + '🧙🏿‍♂️' => ':man_mage_dark_skin_tone:', + '🧙🏻‍♂️' => ':man_mage_light_skin_tone:', + '🧙🏾‍♂️' => ':man_mage_medium_dark_skin_tone:', + '🧙🏼‍♂️' => ':man_mage_medium_light_skin_tone:', + '🧙🏽‍♂️' => ':man_mage_medium_skin_tone:', + '🧔🏾‍♂️' => ':man_medium_dark_skin_tone_beard:', + '👱🏾‍♂️' => ':man_medium_dark_skin_tone_blond_hair:', + '🧔🏼‍♂️' => ':man_medium_light_skin_tone_beard:', + '👱🏼‍♂️' => ':man_medium_light_skin_tone_blond_hair:', + '🧔🏽‍♂️' => ':man_medium_skin_tone_beard:', + '👱🏽‍♂️' => ':man_medium_skin_tone_blond_hair:', + '🚵🏿‍♂️' => ':man_mountain_biking_dark_skin_tone:', + '🚵🏻‍♂️' => ':man_mountain_biking_light_skin_tone:', + '🚵🏾‍♂️' => ':man_mountain_biking_medium_dark_skin_tone:', + '🚵🏼‍♂️' => ':man_mountain_biking_medium_light_skin_tone:', + '🚵🏽‍♂️' => ':man_mountain_biking_medium_skin_tone:', + '👨🏿‍✈️' => ':man_pilot_dark_skin_tone:', + '👨🏻‍✈️' => ':man_pilot_light_skin_tone:', + '👨🏾‍✈️' => ':man_pilot_medium_dark_skin_tone:', + '👨🏼‍✈️' => ':man_pilot_medium_light_skin_tone:', + '👨🏽‍✈️' => ':man_pilot_medium_skin_tone:', + '🤾🏿‍♂️' => ':man_playing_handball_dark_skin_tone:', + '🤾🏻‍♂️' => ':man_playing_handball_light_skin_tone:', + '🤾🏾‍♂️' => ':man_playing_handball_medium_dark_skin_tone:', + '🤾🏼‍♂️' => ':man_playing_handball_medium_light_skin_tone:', + '🤾🏽‍♂️' => ':man_playing_handball_medium_skin_tone:', + '🤽🏿‍♂️' => ':man_playing_water_polo_dark_skin_tone:', + '🤽🏻‍♂️' => ':man_playing_water_polo_light_skin_tone:', + '🤽🏾‍♂️' => ':man_playing_water_polo_medium_dark_skin_tone:', + '🤽🏼‍♂️' => ':man_playing_water_polo_medium_light_skin_tone:', + '🤽🏽‍♂️' => ':man_playing_water_polo_medium_skin_tone:', + '👮🏿‍♂️' => ':man_police_officer_dark_skin_tone:', + '👮🏻‍♂️' => ':man_police_officer_light_skin_tone:', + '👮🏾‍♂️' => ':man_police_officer_medium_dark_skin_tone:', + '👮🏼‍♂️' => ':man_police_officer_medium_light_skin_tone:', + '👮🏽‍♂️' => ':man_police_officer_medium_skin_tone:', + '🙎🏿‍♂️' => ':man_pouting_dark_skin_tone:', + '🙎🏻‍♂️' => ':man_pouting_light_skin_tone:', + '🙎🏾‍♂️' => ':man_pouting_medium_dark_skin_tone:', + '🙎🏼‍♂️' => ':man_pouting_medium_light_skin_tone:', + '🙎🏽‍♂️' => ':man_pouting_medium_skin_tone:', + '🙋🏿‍♂️' => ':man_raising_hand_dark_skin_tone:', + '🙋🏻‍♂️' => ':man_raising_hand_light_skin_tone:', + '🙋🏾‍♂️' => ':man_raising_hand_medium_dark_skin_tone:', + '🙋🏼‍♂️' => ':man_raising_hand_medium_light_skin_tone:', + '🙋🏽‍♂️' => ':man_raising_hand_medium_skin_tone:', + '🚣🏿‍♂️' => ':man_rowing_boat_dark_skin_tone:', + '🚣🏻‍♂️' => ':man_rowing_boat_light_skin_tone:', + '🚣🏾‍♂️' => ':man_rowing_boat_medium_dark_skin_tone:', + '🚣🏼‍♂️' => ':man_rowing_boat_medium_light_skin_tone:', + '🚣🏽‍♂️' => ':man_rowing_boat_medium_skin_tone:', + '🏃🏿‍♂️' => ':man_running_dark_skin_tone:', + '🏃🏻‍♂️' => ':man_running_light_skin_tone:', + '🏃🏾‍♂️' => ':man_running_medium_dark_skin_tone:', + '🏃🏼‍♂️' => ':man_running_medium_light_skin_tone:', + '🏃🏽‍♂️' => ':man_running_medium_skin_tone:', + '🤷🏿‍♂️' => ':man_shrugging_dark_skin_tone:', + '🤷🏻‍♂️' => ':man_shrugging_light_skin_tone:', + '🤷🏾‍♂️' => ':man_shrugging_medium_dark_skin_tone:', + '🤷🏼‍♂️' => ':man_shrugging_medium_light_skin_tone:', + '🤷🏽‍♂️' => ':man_shrugging_medium_skin_tone:', + '🧍🏿‍♂️' => ':man_standing_dark_skin_tone:', + '🧍🏻‍♂️' => ':man_standing_light_skin_tone:', + '🧍🏾‍♂️' => ':man_standing_medium_dark_skin_tone:', + '🧍🏼‍♂️' => ':man_standing_medium_light_skin_tone:', + '🧍🏽‍♂️' => ':man_standing_medium_skin_tone:', + '🦸🏿‍♂️' => ':man_superhero_dark_skin_tone:', + '🦸🏻‍♂️' => ':man_superhero_light_skin_tone:', + '🦸🏾‍♂️' => ':man_superhero_medium_dark_skin_tone:', + '🦸🏼‍♂️' => ':man_superhero_medium_light_skin_tone:', + '🦸🏽‍♂️' => ':man_superhero_medium_skin_tone:', + '🦹🏿‍♂️' => ':man_supervillain_dark_skin_tone:', + '🦹🏻‍♂️' => ':man_supervillain_light_skin_tone:', + '🦹🏾‍♂️' => ':man_supervillain_medium_dark_skin_tone:', + '🦹🏼‍♂️' => ':man_supervillain_medium_light_skin_tone:', + '🦹🏽‍♂️' => ':man_supervillain_medium_skin_tone:', + '🏄🏿‍♂️' => ':man_surfing_dark_skin_tone:', + '🏄🏻‍♂️' => ':man_surfing_light_skin_tone:', + '🏄🏾‍♂️' => ':man_surfing_medium_dark_skin_tone:', + '🏄🏼‍♂️' => ':man_surfing_medium_light_skin_tone:', + '🏄🏽‍♂️' => ':man_surfing_medium_skin_tone:', + '🏊🏿‍♂️' => ':man_swimming_dark_skin_tone:', + '🏊🏻‍♂️' => ':man_swimming_light_skin_tone:', + '🏊🏾‍♂️' => ':man_swimming_medium_dark_skin_tone:', + '🏊🏼‍♂️' => ':man_swimming_medium_light_skin_tone:', + '🏊🏽‍♂️' => ':man_swimming_medium_skin_tone:', + '💁🏿‍♂️' => ':man_tipping_hand_dark_skin_tone:', + '💁🏻‍♂️' => ':man_tipping_hand_light_skin_tone:', + '💁🏾‍♂️' => ':man_tipping_hand_medium_dark_skin_tone:', + '💁🏼‍♂️' => ':man_tipping_hand_medium_light_skin_tone:', + '💁🏽‍♂️' => ':man_tipping_hand_medium_skin_tone:', + '🧛🏿‍♂️' => ':man_vampire_dark_skin_tone:', + '🧛🏻‍♂️' => ':man_vampire_light_skin_tone:', + '🧛🏾‍♂️' => ':man_vampire_medium_dark_skin_tone:', + '🧛🏼‍♂️' => ':man_vampire_medium_light_skin_tone:', + '🧛🏽‍♂️' => ':man_vampire_medium_skin_tone:', + '🚶🏿‍♂️' => ':man_walking_dark_skin_tone:', + '🚶🏻‍♂️' => ':man_walking_light_skin_tone:', + '🚶🏾‍♂️' => ':man_walking_medium_dark_skin_tone:', + '🚶🏼‍♂️' => ':man_walking_medium_light_skin_tone:', + '🚶🏽‍♂️' => ':man_walking_medium_skin_tone:', + '👳🏿‍♂️' => ':man_wearing_turban_dark_skin_tone:', + '👳🏻‍♂️' => ':man_wearing_turban_light_skin_tone:', + '👳🏾‍♂️' => ':man_wearing_turban_medium_dark_skin_tone:', + '👳🏼‍♂️' => ':man_wearing_turban_medium_light_skin_tone:', + '👳🏽‍♂️' => ':man_wearing_turban_medium_skin_tone:', + '👰🏿‍♂️' => ':man_with_veil_dark_skin_tone:', + '👰🏻‍♂️' => ':man_with_veil_light_skin_tone:', + '👰🏾‍♂️' => ':man_with_veil_medium_dark_skin_tone:', + '👰🏼‍♂️' => ':man_with_veil_medium_light_skin_tone:', + '👰🏽‍♂️' => ':man_with_veil_medium_skin_tone:', + '🧜🏿‍♀️' => ':mermaid_dark_skin_tone:', + '🧜🏻‍♀️' => ':mermaid_light_skin_tone:', + '🧜🏾‍♀️' => ':mermaid_medium_dark_skin_tone:', + '🧜🏼‍♀️' => ':mermaid_medium_light_skin_tone:', + '🧜🏽‍♀️' => ':mermaid_medium_skin_tone:', + '🧜🏿‍♂️' => ':merman_dark_skin_tone:', + '🧜🏻‍♂️' => ':merman_light_skin_tone:', + '🧜🏾‍♂️' => ':merman_medium_dark_skin_tone:', + '🧜🏼‍♂️' => ':merman_medium_light_skin_tone:', + '🧜🏽‍♂️' => ':merman_medium_skin_tone:', + '🧑‍🤝‍🧑' => ':people_holding_hands:', + '🧎🏿‍➡️' => ':person_kneeling_facing_right_dark_skin_tone:', + '🧎🏻‍➡️' => ':person_kneeling_facing_right_light_skin_tone:', + '🧎🏾‍➡️' => ':person_kneeling_facing_right_medium_dark_skin_tone:', + '🧎🏼‍➡️' => ':person_kneeling_facing_right_medium_light_skin_tone:', + '🧎🏽‍➡️' => ':person_kneeling_facing_right_medium_skin_tone:', + '🏃🏿‍➡️' => ':person_running_facing_right_dark_skin_tone:', + '🏃🏻‍➡️' => ':person_running_facing_right_light_skin_tone:', + '🏃🏾‍➡️' => ':person_running_facing_right_medium_dark_skin_tone:', + '🏃🏼‍➡️' => ':person_running_facing_right_medium_light_skin_tone:', + '🏃🏽‍➡️' => ':person_running_facing_right_medium_skin_tone:', + '🚶🏿‍➡️' => ':person_walking_facing_right_dark_skin_tone:', + '🚶🏻‍➡️' => ':person_walking_facing_right_light_skin_tone:', + '🚶🏾‍➡️' => ':person_walking_facing_right_medium_dark_skin_tone:', + '🚶🏼‍➡️' => ':person_walking_facing_right_medium_light_skin_tone:', + '🚶🏽‍➡️' => ':person_walking_facing_right_medium_skin_tone:', + '🧑🏿‍✈️' => ':pilot_dark_skin_tone:', + '🧑🏻‍✈️' => ':pilot_light_skin_tone:', + '🧑🏾‍✈️' => ':pilot_medium_dark_skin_tone:', + '🧑🏼‍✈️' => ':pilot_medium_light_skin_tone:', + '🧑🏽‍✈️' => ':pilot_medium_skin_tone:', + '🏳️‍⚧️' => ':transgender_flag:', + '🚴🏿‍♀️' => ':woman_biking_dark_skin_tone:', + '🚴🏻‍♀️' => ':woman_biking_light_skin_tone:', + '🚴🏾‍♀️' => ':woman_biking_medium_dark_skin_tone:', + '🚴🏼‍♀️' => ':woman_biking_medium_light_skin_tone:', + '🚴🏽‍♀️' => ':woman_biking_medium_skin_tone:', + '⛹️‍♀️' => ':woman_bouncing_ball:', + '⛹🏿‍♀️' => ':woman_bouncing_ball_dark_skin_tone:', + '⛹🏻‍♀️' => ':woman_bouncing_ball_light_skin_tone:', + '⛹🏾‍♀️' => ':woman_bouncing_ball_medium_dark_skin_tone:', + '⛹🏼‍♀️' => ':woman_bouncing_ball_medium_light_skin_tone:', + '⛹🏽‍♀️' => ':woman_bouncing_ball_medium_skin_tone:', + '🙇🏿‍♀️' => ':woman_bowing_dark_skin_tone:', + '🙇🏻‍♀️' => ':woman_bowing_light_skin_tone:', + '🙇🏾‍♀️' => ':woman_bowing_medium_dark_skin_tone:', + '🙇🏼‍♀️' => ':woman_bowing_medium_light_skin_tone:', + '🙇🏽‍♀️' => ':woman_bowing_medium_skin_tone:', + '🤸🏿‍♀️' => ':woman_cartwheeling_dark_skin_tone:', + '🤸🏻‍♀️' => ':woman_cartwheeling_light_skin_tone:', + '🤸🏾‍♀️' => ':woman_cartwheeling_medium_dark_skin_tone:', + '🤸🏼‍♀️' => ':woman_cartwheeling_medium_light_skin_tone:', + '🤸🏽‍♀️' => ':woman_cartwheeling_medium_skin_tone:', + '🧗🏿‍♀️' => ':woman_climbing_dark_skin_tone:', + '🧗🏻‍♀️' => ':woman_climbing_light_skin_tone:', + '🧗🏾‍♀️' => ':woman_climbing_medium_dark_skin_tone:', + '🧗🏼‍♀️' => ':woman_climbing_medium_light_skin_tone:', + '🧗🏽‍♀️' => ':woman_climbing_medium_skin_tone:', + '👷🏿‍♀️' => ':woman_construction_worker_dark_skin_tone:', + '👷🏻‍♀️' => ':woman_construction_worker_light_skin_tone:', + '👷🏾‍♀️' => ':woman_construction_worker_medium_dark_skin_tone:', + '👷🏼‍♀️' => ':woman_construction_worker_medium_light_skin_tone:', + '👷🏽‍♀️' => ':woman_construction_worker_medium_skin_tone:', + '🧔🏿‍♀️' => ':woman_dark_skin_tone_beard:', + '👱🏿‍♀️' => ':woman_dark_skin_tone_blond_hair:', + '🕵️‍♀️' => ':woman_detective:', + '🕵🏿‍♀️' => ':woman_detective_dark_skin_tone:', + '🕵🏻‍♀️' => ':woman_detective_light_skin_tone:', + '🕵🏾‍♀️' => ':woman_detective_medium_dark_skin_tone:', + '🕵🏼‍♀️' => ':woman_detective_medium_light_skin_tone:', + '🕵🏽‍♀️' => ':woman_detective_medium_skin_tone:', + '🧝🏿‍♀️' => ':woman_elf_dark_skin_tone:', + '🧝🏻‍♀️' => ':woman_elf_light_skin_tone:', + '🧝🏾‍♀️' => ':woman_elf_medium_dark_skin_tone:', + '🧝🏼‍♀️' => ':woman_elf_medium_light_skin_tone:', + '🧝🏽‍♀️' => ':woman_elf_medium_skin_tone:', + '🤦🏿‍♀️' => ':woman_facepalming_dark_skin_tone:', + '🤦🏻‍♀️' => ':woman_facepalming_light_skin_tone:', + '🤦🏾‍♀️' => ':woman_facepalming_medium_dark_skin_tone:', + '🤦🏼‍♀️' => ':woman_facepalming_medium_light_skin_tone:', + '🤦🏽‍♀️' => ':woman_facepalming_medium_skin_tone:', + '🧚🏿‍♀️' => ':woman_fairy_dark_skin_tone:', + '🧚🏻‍♀️' => ':woman_fairy_light_skin_tone:', + '🧚🏾‍♀️' => ':woman_fairy_medium_dark_skin_tone:', + '🧚🏼‍♀️' => ':woman_fairy_medium_light_skin_tone:', + '🧚🏽‍♀️' => ':woman_fairy_medium_skin_tone:', + '🙍🏿‍♀️' => ':woman_frowning_dark_skin_tone:', + '🙍🏻‍♀️' => ':woman_frowning_light_skin_tone:', + '🙍🏾‍♀️' => ':woman_frowning_medium_dark_skin_tone:', + '🙍🏼‍♀️' => ':woman_frowning_medium_light_skin_tone:', + '🙍🏽‍♀️' => ':woman_frowning_medium_skin_tone:', + '🙅🏿‍♀️' => ':woman_gesturing_no_dark_skin_tone:', + '🙅🏻‍♀️' => ':woman_gesturing_no_light_skin_tone:', + '🙅🏾‍♀️' => ':woman_gesturing_no_medium_dark_skin_tone:', + '🙅🏼‍♀️' => ':woman_gesturing_no_medium_light_skin_tone:', + '🙅🏽‍♀️' => ':woman_gesturing_no_medium_skin_tone:', + '🙆🏿‍♀️' => ':woman_gesturing_ok_dark_skin_tone:', + '🙆🏻‍♀️' => ':woman_gesturing_ok_light_skin_tone:', + '🙆🏾‍♀️' => ':woman_gesturing_ok_medium_dark_skin_tone:', + '🙆🏼‍♀️' => ':woman_gesturing_ok_medium_light_skin_tone:', + '🙆🏽‍♀️' => ':woman_gesturing_ok_medium_skin_tone:', + '💇🏿‍♀️' => ':woman_getting_haircut_dark_skin_tone:', + '💇🏻‍♀️' => ':woman_getting_haircut_light_skin_tone:', + '💇🏾‍♀️' => ':woman_getting_haircut_medium_dark_skin_tone:', + '💇🏼‍♀️' => ':woman_getting_haircut_medium_light_skin_tone:', + '💇🏽‍♀️' => ':woman_getting_haircut_medium_skin_tone:', + '💆🏿‍♀️' => ':woman_getting_massage_dark_skin_tone:', + '💆🏻‍♀️' => ':woman_getting_massage_light_skin_tone:', + '💆🏾‍♀️' => ':woman_getting_massage_medium_dark_skin_tone:', + '💆🏼‍♀️' => ':woman_getting_massage_medium_light_skin_tone:', + '💆🏽‍♀️' => ':woman_getting_massage_medium_skin_tone:', + '🏌️‍♀️' => ':woman_golfing:', + '🏌🏿‍♀️' => ':woman_golfing_dark_skin_tone:', + '🏌🏻‍♀️' => ':woman_golfing_light_skin_tone:', + '🏌🏾‍♀️' => ':woman_golfing_medium_dark_skin_tone:', + '🏌🏼‍♀️' => ':woman_golfing_medium_light_skin_tone:', + '🏌🏽‍♀️' => ':woman_golfing_medium_skin_tone:', + '💂🏿‍♀️' => ':woman_guard_dark_skin_tone:', + '💂🏻‍♀️' => ':woman_guard_light_skin_tone:', + '💂🏾‍♀️' => ':woman_guard_medium_dark_skin_tone:', + '💂🏼‍♀️' => ':woman_guard_medium_light_skin_tone:', + '💂🏽‍♀️' => ':woman_guard_medium_skin_tone:', + '👩🏿‍⚕️' => ':woman_health_worker_dark_skin_tone:', + '👩🏻‍⚕️' => ':woman_health_worker_light_skin_tone:', + '👩🏾‍⚕️' => ':woman_health_worker_medium_dark_skin_tone:', + '👩🏼‍⚕️' => ':woman_health_worker_medium_light_skin_tone:', + '👩🏽‍⚕️' => ':woman_health_worker_medium_skin_tone:', + '🧘🏿‍♀️' => ':woman_in_lotus_position_dark_skin_tone:', + '🧘🏻‍♀️' => ':woman_in_lotus_position_light_skin_tone:', + '🧘🏾‍♀️' => ':woman_in_lotus_position_medium_dark_skin_tone:', + '🧘🏼‍♀️' => ':woman_in_lotus_position_medium_light_skin_tone:', + '🧘🏽‍♀️' => ':woman_in_lotus_position_medium_skin_tone:', + '🧖🏿‍♀️' => ':woman_in_steamy_room_dark_skin_tone:', + '🧖🏻‍♀️' => ':woman_in_steamy_room_light_skin_tone:', + '🧖🏾‍♀️' => ':woman_in_steamy_room_medium_dark_skin_tone:', + '🧖🏼‍♀️' => ':woman_in_steamy_room_medium_light_skin_tone:', + '🧖🏽‍♀️' => ':woman_in_steamy_room_medium_skin_tone:', + '🤵🏿‍♀️' => ':woman_in_tuxedo_dark_skin_tone:', + '🤵🏻‍♀️' => ':woman_in_tuxedo_light_skin_tone:', + '🤵🏾‍♀️' => ':woman_in_tuxedo_medium_dark_skin_tone:', + '🤵🏼‍♀️' => ':woman_in_tuxedo_medium_light_skin_tone:', + '🤵🏽‍♀️' => ':woman_in_tuxedo_medium_skin_tone:', + '👩🏿‍⚖️' => ':woman_judge_dark_skin_tone:', + '👩🏻‍⚖️' => ':woman_judge_light_skin_tone:', + '👩🏾‍⚖️' => ':woman_judge_medium_dark_skin_tone:', + '👩🏼‍⚖️' => ':woman_judge_medium_light_skin_tone:', + '👩🏽‍⚖️' => ':woman_judge_medium_skin_tone:', + '🤹🏿‍♀️' => ':woman_juggling_dark_skin_tone:', + '🤹🏻‍♀️' => ':woman_juggling_light_skin_tone:', + '🤹🏾‍♀️' => ':woman_juggling_medium_dark_skin_tone:', + '🤹🏼‍♀️' => ':woman_juggling_medium_light_skin_tone:', + '🤹🏽‍♀️' => ':woman_juggling_medium_skin_tone:', + '🧎🏿‍♀️' => ':woman_kneeling_dark_skin_tone:', + '🧎🏻‍♀️' => ':woman_kneeling_light_skin_tone:', + '🧎🏾‍♀️' => ':woman_kneeling_medium_dark_skin_tone:', + '🧎🏼‍♀️' => ':woman_kneeling_medium_light_skin_tone:', + '🧎🏽‍♀️' => ':woman_kneeling_medium_skin_tone:', + '🏋️‍♀️' => ':woman_lifting_weights:', + '🏋🏿‍♀️' => ':woman_lifting_weights_dark_skin_tone:', + '🏋🏻‍♀️' => ':woman_lifting_weights_light_skin_tone:', + '🏋🏾‍♀️' => ':woman_lifting_weights_medium_dark_skin_tone:', + '🏋🏼‍♀️' => ':woman_lifting_weights_medium_light_skin_tone:', + '🏋🏽‍♀️' => ':woman_lifting_weights_medium_skin_tone:', + '🧔🏻‍♀️' => ':woman_light_skin_tone_beard:', + '👱🏻‍♀️' => ':woman_light_skin_tone_blond_hair:', + '🧙🏿‍♀️' => ':woman_mage_dark_skin_tone:', + '🧙🏻‍♀️' => ':woman_mage_light_skin_tone:', + '🧙🏾‍♀️' => ':woman_mage_medium_dark_skin_tone:', + '🧙🏼‍♀️' => ':woman_mage_medium_light_skin_tone:', + '🧙🏽‍♀️' => ':woman_mage_medium_skin_tone:', + '🧔🏾‍♀️' => ':woman_medium_dark_skin_tone_beard:', + '👱🏾‍♀️' => ':woman_medium_dark_skin_tone_blond_hair:', + '🧔🏼‍♀️' => ':woman_medium_light_skin_tone_beard:', + '👱🏼‍♀️' => ':woman_medium_light_skin_tone_blond_hair:', + '🧔🏽‍♀️' => ':woman_medium_skin_tone_beard:', + '👱🏽‍♀️' => ':woman_medium_skin_tone_blond_hair:', + '🚵🏿‍♀️' => ':woman_mountain_biking_dark_skin_tone:', + '🚵🏻‍♀️' => ':woman_mountain_biking_light_skin_tone:', + '🚵🏾‍♀️' => ':woman_mountain_biking_medium_dark_skin_tone:', + '🚵🏼‍♀️' => ':woman_mountain_biking_medium_light_skin_tone:', + '🚵🏽‍♀️' => ':woman_mountain_biking_medium_skin_tone:', + '👩🏿‍✈️' => ':woman_pilot_dark_skin_tone:', + '👩🏻‍✈️' => ':woman_pilot_light_skin_tone:', + '👩🏾‍✈️' => ':woman_pilot_medium_dark_skin_tone:', + '👩🏼‍✈️' => ':woman_pilot_medium_light_skin_tone:', + '👩🏽‍✈️' => ':woman_pilot_medium_skin_tone:', + '🤾🏿‍♀️' => ':woman_playing_handball_dark_skin_tone:', + '🤾🏻‍♀️' => ':woman_playing_handball_light_skin_tone:', + '🤾🏾‍♀️' => ':woman_playing_handball_medium_dark_skin_tone:', + '🤾🏼‍♀️' => ':woman_playing_handball_medium_light_skin_tone:', + '🤾🏽‍♀️' => ':woman_playing_handball_medium_skin_tone:', + '🤽🏿‍♀️' => ':woman_playing_water_polo_dark_skin_tone:', + '🤽🏻‍♀️' => ':woman_playing_water_polo_light_skin_tone:', + '🤽🏾‍♀️' => ':woman_playing_water_polo_medium_dark_skin_tone:', + '🤽🏼‍♀️' => ':woman_playing_water_polo_medium_light_skin_tone:', + '🤽🏽‍♀️' => ':woman_playing_water_polo_medium_skin_tone:', + '👮🏿‍♀️' => ':woman_police_officer_dark_skin_tone:', + '👮🏻‍♀️' => ':woman_police_officer_light_skin_tone:', + '👮🏾‍♀️' => ':woman_police_officer_medium_dark_skin_tone:', + '👮🏼‍♀️' => ':woman_police_officer_medium_light_skin_tone:', + '👮🏽‍♀️' => ':woman_police_officer_medium_skin_tone:', + '🙎🏿‍♀️' => ':woman_pouting_dark_skin_tone:', + '🙎🏻‍♀️' => ':woman_pouting_light_skin_tone:', + '🙎🏾‍♀️' => ':woman_pouting_medium_dark_skin_tone:', + '🙎🏼‍♀️' => ':woman_pouting_medium_light_skin_tone:', + '🙎🏽‍♀️' => ':woman_pouting_medium_skin_tone:', + '🙋🏿‍♀️' => ':woman_raising_hand_dark_skin_tone:', + '🙋🏻‍♀️' => ':woman_raising_hand_light_skin_tone:', + '🙋🏾‍♀️' => ':woman_raising_hand_medium_dark_skin_tone:', + '🙋🏼‍♀️' => ':woman_raising_hand_medium_light_skin_tone:', + '🙋🏽‍♀️' => ':woman_raising_hand_medium_skin_tone:', + '🚣🏿‍♀️' => ':woman_rowing_boat_dark_skin_tone:', + '🚣🏻‍♀️' => ':woman_rowing_boat_light_skin_tone:', + '🚣🏾‍♀️' => ':woman_rowing_boat_medium_dark_skin_tone:', + '🚣🏼‍♀️' => ':woman_rowing_boat_medium_light_skin_tone:', + '🚣🏽‍♀️' => ':woman_rowing_boat_medium_skin_tone:', + '🏃🏿‍♀️' => ':woman_running_dark_skin_tone:', + '🏃🏻‍♀️' => ':woman_running_light_skin_tone:', + '🏃🏾‍♀️' => ':woman_running_medium_dark_skin_tone:', + '🏃🏼‍♀️' => ':woman_running_medium_light_skin_tone:', + '🏃🏽‍♀️' => ':woman_running_medium_skin_tone:', + '🤷🏿‍♀️' => ':woman_shrugging_dark_skin_tone:', + '🤷🏻‍♀️' => ':woman_shrugging_light_skin_tone:', + '🤷🏾‍♀️' => ':woman_shrugging_medium_dark_skin_tone:', + '🤷🏼‍♀️' => ':woman_shrugging_medium_light_skin_tone:', + '🤷🏽‍♀️' => ':woman_shrugging_medium_skin_tone:', + '🧍🏿‍♀️' => ':woman_standing_dark_skin_tone:', + '🧍🏻‍♀️' => ':woman_standing_light_skin_tone:', + '🧍🏾‍♀️' => ':woman_standing_medium_dark_skin_tone:', + '🧍🏼‍♀️' => ':woman_standing_medium_light_skin_tone:', + '🧍🏽‍♀️' => ':woman_standing_medium_skin_tone:', + '🦸🏿‍♀️' => ':woman_superhero_dark_skin_tone:', + '🦸🏻‍♀️' => ':woman_superhero_light_skin_tone:', + '🦸🏾‍♀️' => ':woman_superhero_medium_dark_skin_tone:', + '🦸🏼‍♀️' => ':woman_superhero_medium_light_skin_tone:', + '🦸🏽‍♀️' => ':woman_superhero_medium_skin_tone:', + '🦹🏿‍♀️' => ':woman_supervillain_dark_skin_tone:', + '🦹🏻‍♀️' => ':woman_supervillain_light_skin_tone:', + '🦹🏾‍♀️' => ':woman_supervillain_medium_dark_skin_tone:', + '🦹🏼‍♀️' => ':woman_supervillain_medium_light_skin_tone:', + '🦹🏽‍♀️' => ':woman_supervillain_medium_skin_tone:', + '🏄🏿‍♀️' => ':woman_surfing_dark_skin_tone:', + '🏄🏻‍♀️' => ':woman_surfing_light_skin_tone:', + '🏄🏾‍♀️' => ':woman_surfing_medium_dark_skin_tone:', + '🏄🏼‍♀️' => ':woman_surfing_medium_light_skin_tone:', + '🏄🏽‍♀️' => ':woman_surfing_medium_skin_tone:', + '🏊🏿‍♀️' => ':woman_swimming_dark_skin_tone:', + '🏊🏻‍♀️' => ':woman_swimming_light_skin_tone:', + '🏊🏾‍♀️' => ':woman_swimming_medium_dark_skin_tone:', + '🏊🏼‍♀️' => ':woman_swimming_medium_light_skin_tone:', + '🏊🏽‍♀️' => ':woman_swimming_medium_skin_tone:', + '💁🏿‍♀️' => ':woman_tipping_hand_dark_skin_tone:', + '💁🏻‍♀️' => ':woman_tipping_hand_light_skin_tone:', + '💁🏾‍♀️' => ':woman_tipping_hand_medium_dark_skin_tone:', + '💁🏼‍♀️' => ':woman_tipping_hand_medium_light_skin_tone:', + '💁🏽‍♀️' => ':woman_tipping_hand_medium_skin_tone:', + '🧛🏿‍♀️' => ':woman_vampire_dark_skin_tone:', + '🧛🏻‍♀️' => ':woman_vampire_light_skin_tone:', + '🧛🏾‍♀️' => ':woman_vampire_medium_dark_skin_tone:', + '🧛🏼‍♀️' => ':woman_vampire_medium_light_skin_tone:', + '🧛🏽‍♀️' => ':woman_vampire_medium_skin_tone:', + '🚶🏿‍♀️' => ':woman_walking_dark_skin_tone:', + '🚶🏻‍♀️' => ':woman_walking_light_skin_tone:', + '🚶🏾‍♀️' => ':woman_walking_medium_dark_skin_tone:', + '🚶🏼‍♀️' => ':woman_walking_medium_light_skin_tone:', + '🚶🏽‍♀️' => ':woman_walking_medium_skin_tone:', + '👳🏿‍♀️' => ':woman_wearing_turban_dark_skin_tone:', + '👳🏻‍♀️' => ':woman_wearing_turban_light_skin_tone:', + '👳🏾‍♀️' => ':woman_wearing_turban_medium_dark_skin_tone:', + '👳🏼‍♀️' => ':woman_wearing_turban_medium_light_skin_tone:', + '👳🏽‍♀️' => ':woman_wearing_turban_medium_skin_tone:', + '👰🏿‍♀️' => ':woman_with_veil_dark_skin_tone:', + '👰🏻‍♀️' => ':woman_with_veil_light_skin_tone:', + '👰🏾‍♀️' => ':woman_with_veil_medium_dark_skin_tone:', + '👰🏼‍♀️' => ':woman_with_veil_medium_light_skin_tone:', + '👰🏽‍♀️' => ':woman_with_veil_medium_skin_tone:', + '🧑🏿‍🎨' => ':artist_dark_skin_tone:', + '🧑🏻‍🎨' => ':artist_light_skin_tone:', + '🧑🏾‍🎨' => ':artist_medium_dark_skin_tone:', + '🧑🏼‍🎨' => ':artist_medium_light_skin_tone:', + '🧑🏽‍🎨' => ':artist_medium_skin_tone:', + '🧑🏿‍🚀' => ':astronaut_dark_skin_tone:', + '🧑🏻‍🚀' => ':astronaut_light_skin_tone:', + '🧑🏾‍🚀' => ':astronaut_medium_dark_skin_tone:', + '🧑🏼‍🚀' => ':astronaut_medium_light_skin_tone:', + '🧑🏽‍🚀' => ':astronaut_medium_skin_tone:', + '⛓️‍💥' => ':broken_chain:', + '🧑🏿‍🍳' => ':cook_dark_skin_tone:', + '🧑🏻‍🍳' => ':cook_light_skin_tone:', + '🧑🏾‍🍳' => ':cook_medium_dark_skin_tone:', + '🧑🏼‍🍳' => ':cook_medium_light_skin_tone:', + '🧑🏽‍🍳' => ':cook_medium_skin_tone:', + '🧏‍♂️' => ':deaf_man:', + '🧏‍♀️' => ':deaf_woman:', + '😶‍🌫️' => ':face_in_clouds:', + '🧑🏿‍🏭' => ':factory_worker_dark_skin_tone:', + '🧑🏻‍🏭' => ':factory_worker_light_skin_tone:', + '🧑🏾‍🏭' => ':factory_worker_medium_dark_skin_tone:', + '🧑🏼‍🏭' => ':factory_worker_medium_light_skin_tone:', + '🧑🏽‍🏭' => ':factory_worker_medium_skin_tone:', + '🧑🏿‍🌾' => ':farmer_dark_skin_tone:', + '🧑🏻‍🌾' => ':farmer_light_skin_tone:', + '🧑🏾‍🌾' => ':farmer_medium_dark_skin_tone:', + '🧑🏼‍🌾' => ':farmer_medium_light_skin_tone:', + '🧑🏽‍🌾' => ':farmer_medium_skin_tone:', + '🧑🏿‍🚒' => ':firefighter_dark_skin_tone:', + '🧑🏻‍🚒' => ':firefighter_light_skin_tone:', + '🧑🏾‍🚒' => ':firefighter_medium_dark_skin_tone:', + '🧑🏼‍🚒' => ':firefighter_medium_light_skin_tone:', + '🧑🏽‍🚒' => ':firefighter_medium_skin_tone:', + '🏳️‍🌈' => ':gay_pride_flag:', + '🙂‍↔️' => ':head_shaking_horizontally:', + '🙂‍↕️' => ':head_shaking_vertically:', + '🧑‍⚕️' => ':health_worker:', + '❤️‍🔥' => ':heart_on_fire:', + '🧑‍⚖️' => ':judge:', + '👨🏿‍🎨' => ':man_artist_dark_skin_tone:', + '👨🏻‍🎨' => ':man_artist_light_skin_tone:', + '👨🏾‍🎨' => ':man_artist_medium_dark_skin_tone:', + '👨🏼‍🎨' => ':man_artist_medium_light_skin_tone:', + '👨🏽‍🎨' => ':man_artist_medium_skin_tone:', + '👨🏿‍🚀' => ':man_astronaut_dark_skin_tone:', + '👨🏻‍🚀' => ':man_astronaut_light_skin_tone:', + '👨🏾‍🚀' => ':man_astronaut_medium_dark_skin_tone:', + '👨🏼‍🚀' => ':man_astronaut_medium_light_skin_tone:', + '👨🏽‍🚀' => ':man_astronaut_medium_skin_tone:', + '🧔‍♂️' => ':man_beard:', + '🚴‍♂️' => ':man_biking:', + '👱‍♂️' => ':man_blond_hair:', + '🙇‍♂️' => ':man_bowing:', + '🤸‍♂️' => ':man_cartwheeling:', + '🧗‍♂️' => ':man_climbing:', + '👷‍♂️' => ':man_construction_worker:', + '👨🏿‍🍳' => ':man_cook_dark_skin_tone:', + '👨🏻‍🍳' => ':man_cook_light_skin_tone:', + '👨🏾‍🍳' => ':man_cook_medium_dark_skin_tone:', + '👨🏼‍🍳' => ':man_cook_medium_light_skin_tone:', + '👨🏽‍🍳' => ':man_cook_medium_skin_tone:', + '👨🏿‍🦲' => ':man_dark_skin_tone_bald:', + '👨🏿‍🦱' => ':man_dark_skin_tone_curly_hair:', + '👨🏿‍🦰' => ':man_dark_skin_tone_red_hair:', + '👨🏿‍🦳' => ':man_dark_skin_tone_white_hair:', + '🧝‍♂️' => ':man_elf:', + '🤦‍♂️' => ':man_facepalming:', + '👨🏿‍🏭' => ':man_factory_worker_dark_skin_tone:', + '👨🏻‍🏭' => ':man_factory_worker_light_skin_tone:', + '👨🏾‍🏭' => ':man_factory_worker_medium_dark_skin_tone:', + '👨🏼‍🏭' => ':man_factory_worker_medium_light_skin_tone:', + 1E80 '👨🏽‍🏭' => ':man_factory_worker_medium_skin_tone:', + '🧚‍♂️' => ':man_fairy:', + '👨🏿‍🌾' => ':man_farmer_dark_skin_tone:', + '👨🏻‍🌾' => ':man_farmer_light_skin_tone:', + '👨🏾‍🌾' => ':man_farmer_medium_dark_skin_tone:', + '👨🏼‍🌾' => ':man_farmer_medium_light_skin_tone:', + '👨🏽‍🌾' => ':man_farmer_medium_skin_tone:', + '👨🏿‍🍼' => ':man_feeding_baby_dark_skin_tone:', + '👨🏻‍🍼' => ':man_feeding_baby_light_skin_tone:', + '👨🏾‍🍼' => ':man_feeding_baby_medium_dark_skin_tone:', + '👨🏼‍🍼' => ':man_feeding_baby_medium_light_skin_tone:', + '👨🏽‍🍼' => ':man_feeding_baby_medium_skin_tone:', + '👨🏿‍🚒' => ':man_firefighter_dark_skin_tone:', + '👨🏻‍🚒' => ':man_firefighter_light_skin_tone:', + '👨🏾‍🚒' => ':man_firefighter_medium_dark_skin_tone:', + '👨🏼‍🚒' => ':man_firefighter_medium_light_skin_tone:', + '👨🏽‍🚒' => ':man_firefighter_medium_skin_tone:', + '🙍‍♂️' => ':man_frowning:', + '🧞‍♂️' => ':man_genie:', + '🙅‍♂️' => ':man_gesturing_no:', + '🙆‍♂️' => ':man_gesturing_ok:', + '💇‍♂️' => ':man_getting_haircut:', + '💆‍♂️' => ':man_getting_massage:', + '💂‍♂️' => ':man_guard:', + '👨‍⚕️' => ':man_health_worker:', + '🧘‍♂️' => ':man_in_lotus_position:', + '👨🏿‍🦽' => ':man_in_manual_wheelchair_dark_skin_tone:', + '👨🏻‍🦽' => ':man_in_manual_wheelchair_light_skin_tone:', + '👨🏾‍🦽' => ':man_in_manual_wheelchair_medium_dark_skin_tone:', + '👨🏼‍🦽' => ':man_in_manual_wheelchair_medium_light_skin_tone:', + '👨🏽‍🦽' => ':man_in_manual_wheelchair_medium_skin_tone:', + '👨🏿‍🦼' => ':man_in_motorized_wheelchair_dark_skin_tone:', + '👨🏻‍🦼' => ':man_in_motorized_wheelchair_light_skin_tone:', + '👨🏾‍🦼' => ':man_in_motorized_wheelchair_medium_dark_skin_tone:', + '👨🏼‍🦼' => ':man_in_motorized_wheelchair_medium_light_skin_tone:', + '👨🏽‍🦼' => ':man_in_motorized_wheelchair_medium_skin_tone:', + '🧖‍♂️' => ':man_in_steamy_room:', + '🤵‍♂️' => ':man_in_tuxedo:', + '👨‍⚖️' => ':man_judge:', + '🤹‍♂️' => ':man_juggling:', + '🧎‍♂️' => ':man_kneeling:', + '👨🏻‍🦲' => ':man_light_skin_tone_bald:', + '👨🏻‍🦱' => ':man_light_skin_tone_curly_hair:', + '👨🏻‍🦰' => ':man_light_skin_tone_red_hair:', + '👨🏻‍🦳' => ':man_light_skin_tone_white_hair:', + '🧙‍♂️' => ':man_mage:', + '👨🏿‍🔧' => ':man_mechanic_dark_skin_tone:', + '👨🏻‍🔧' => ':man_mechanic_light_skin_tone:', + '👨🏾‍🔧' => ':man_mechanic_medium_dark_skin_tone:', + '👨🏼‍🔧' => ':man_mechanic_medium_light_skin_tone:', + '👨🏽‍🔧' => ':man_mechanic_medium_skin_tone:', + '👨🏾‍🦲' => ':man_medium_dark_skin_tone_bald:', + '👨🏾‍🦱' => ':man_medium_dark_skin_tone_curly_hair:', + '👨🏾‍🦰' => ':man_medium_dark_skin_tone_red_hair:', + '👨🏾‍🦳' => ':man_medium_dark_skin_tone_white_hair:', + '👨🏼‍🦲' => ':man_medium_light_skin_tone_bald:', + '👨🏼‍🦱' => ':man_medium_light_skin_tone_curly_hair:', + '👨🏼‍🦰' => ':man_medium_light_skin_tone_red_hair:', + '👨🏼‍🦳' => ':man_medium_light_skin_tone_white_hair:', + '👨🏽‍🦲' => ':man_medium_skin_tone_bald:', + '👨🏽‍🦱' => ':man_medium_skin_tone_curly_hair:', + '👨🏽‍🦰' => ':man_medium_skin_tone_red_hair:', + '👨🏽‍🦳' => ':man_medium_skin_tone_white_hair:', + '🚵‍♂️' => ':man_mountain_biking:', + '👨🏿‍💼' => ':man_office_worker_dark_skin_tone:', + '👨🏻‍💼' => ':man_office_worker_light_skin_tone:', + '👨🏾‍💼' => ':man_office_worker_medium_dark_skin_tone:', + '👨🏼‍💼' => ':man_office_worker_medium_light_skin_tone:', + '👨🏽‍💼' => ':man_office_worker_medium_skin_tone:', + '👨‍✈️' => ':man_pilot:', + '🤾‍♂️' => ':man_playing_handball:', + '🤽‍♂️' => ':man_playing_water_polo:', + '👮‍♂️' => ':man_police_officer:', + '🙎‍♂️' => ':man_pouting:', + '🙋‍♂️' => ':man_raising_hand:', + '🚣‍♂️' => ':man_rowing_boat:', + '🏃‍♂️' => ':man_running:', + '👨🏿‍🔬' => ':man_scientist_dark_skin_tone:', + '👨🏻‍🔬' => ':man_scientist_light_skin_tone:', + '👨🏾‍🔬' => ':man_scientist_medium_dark_skin_tone:', + '👨🏼‍🔬' => ':man_scientist_medium_light_skin_tone:', + '👨🏽‍🔬' => ':man_scientist_medium_skin_tone:', + '🤷‍♂️' => ':man_shrugging:', + '👨🏿‍🎤' => ':man_singer_dark_skin_tone:', + '👨🏻‍🎤' => ':man_singer_light_skin_tone:', + '👨🏾‍🎤' => ':man_singer_medium_dark_skin_tone:', + '👨🏼‍🎤' => ':man_singer_medium_light_skin_tone:', + '👨🏽‍🎤' => ':man_singer_medium_skin_tone:', + '🧍‍♂️' => ':man_standing:', + '👨🏿‍🎓' => ':man_student_dark_skin_tone:', + '👨🏻‍🎓' => ':man_student_light_skin_tone:', + '👨🏾‍🎓' => ':man_student_medium_dark_skin_tone:', + '👨🏼‍🎓' => ':man_student_medium_light_skin_tone:', + '👨🏽‍🎓' => ':man_student_medium_skin_tone:', + '🦸‍♂️' => ':man_superhero:', + '🦹‍♂️' => ':man_supervillain:', + '🏄‍♂️' => ':man_surfing:', + '🏊‍♂️' => ':man_swimming:', + '👨🏿‍🏫' => ':man_teacher_dark_skin_tone:', + '👨🏻‍🏫' => ':man_teacher_light_skin_tone:', + '👨🏾‍🏫' => ':man_teacher_medium_dark_skin_tone:', + '👨🏼‍🏫' => ':man_teacher_medium_light_skin_tone:', + '👨🏽‍🏫' => ':man_teacher_medium_skin_tone:', + '👨🏿‍💻' => ':man_technologist_dark_skin_tone:', + '👨🏻‍💻' => ':man_technologist_light_skin_tone:', + '👨🏾‍💻' => ':man_technologist_medium_dark_skin_tone:', + '👨🏼‍💻' => ':man_technologist_medium_light_skin_tone:', + '👨🏽‍💻' => ':man_technologist_medium_skin_tone:', + '💁‍♂️' => ':man_tipping_hand:', + '🧛‍♂️' => ':man_vampire:', + '🚶‍♂️' => ':man_walking:', + '👳‍♂️' => ':man_wearing_turban:', + '👰‍♂️' => ':man_with_veil:', + '👨🏿‍🦯' => ':man_with_white_cane_dark_skin_tone:', + '👨🏻‍🦯' => ':man_with_white_cane_light_skin_tone:', + '👨🏾‍🦯' => ':man_with_white_cane_medium_dark_skin_tone:', + '👨🏼‍🦯' => ':man_with_white_cane_medium_light_skin_tone:', + '👨🏽‍🦯' => ':man_with_white_cane_medium_skin_tone:', + '🧟‍♂️' => ':man_zombie:', + '🧑🏿‍🔧' => ':mechanic_dark_skin_tone:', + '🧑🏻‍🔧' => ':mechanic_light_skin_tone:', + '🧑🏾‍🔧' => ':mechanic_medium_dark_skin_tone:', + '🧑🏼‍🔧' => ':mechanic_medium_light_skin_tone:', + '🧑🏽‍🔧' => ':mechanic_medium_skin_tone:', + '👯‍♂️' => ':men_with_bunny_ears:', + '🤼‍♂️' => ':men_wrestling:', + '❤️‍🩹' => ':mending_heart:', + '🧜‍♀️' => ':mermaid:', + '🧜‍♂️' => ':merman:', + '🧑🏿‍🎄' => ':mx_claus_dark_skin_tone:', + '🧑🏻‍🎄' => ':mx_claus_light_skin_tone:', + '🧑🏾‍🎄' => ':mx_claus_medium_dark_skin_tone:', + '🧑🏼‍🎄' => ':mx_claus_medium_light_skin_tone:', + '🧑🏽‍🎄' => ':mx_claus_medium_skin_tone:', + '🧑 F438 ‍💼' => ':office_worker_dark_skin_tone:', + '🧑🏻‍💼' => ':office_worker_light_skin_tone:', + '🧑🏾‍💼' => ':office_worker_medium_dark_skin_tone:', + '🧑🏼‍💼' => ':office_worker_medium_light_skin_tone:', + '🧑🏽‍💼' => ':office_worker_medium_skin_tone:', + '🧑🏿‍🦲' => ':person_dark_skin_tone_bald:', + '🧑🏿‍🦱' => ':person_dark_skin_tone_curly_hair:', + '🧑🏿‍🦰' => ':person_dark_skin_tone_red_hair:', + '🧑🏿‍🦳' => ':person_dark_skin_tone_white_hair:', + '🧑🏿‍🍼' => ':person_feeding_baby_dark_skin_tone:', + '🧑🏻‍🍼' => ':person_feeding_baby_light_skin_tone:', + '🧑🏾‍🍼' => ':person_feeding_baby_medium_dark_skin_tone:', + '🧑🏼‍🍼' => ':person_feeding_baby_medium_light_skin_tone:', + '🧑🏽‍🍼' => ':person_feeding_baby_medium_skin_tone:', + '🧑🏿‍🦽' => ':person_in_manual_wheelchair_dark_skin_tone:', + '🧑🏻‍🦽' => ':person_in_manual_wheelchair_light_skin_tone:', + '🧑🏾‍🦽' => ':person_in_manual_wheelchair_medium_dark_skin_tone:', + '🧑🏼‍🦽' => ':person_in_manual_wheelchair_medium_light_skin_tone:', + '🧑🏽‍🦽' => ':person_in_manual_wheelchair_medium_skin_tone:', + '🧑🏿‍🦼' => ':person_in_motorized_wheelchair_dark_skin_tone:', + '🧑🏻‍🦼' => ':person_in_motorized_wheelchair_light_skin_tone:', + '🧑🏾‍🦼' => ':person_in_motorized_wheelchair_medium_dark_skin_tone:', + '🧑🏼‍🦼' => ':person_in_motorized_wheelchair_medium_light_skin_tone:', + '🧑🏽‍🦼' => ':person_in_motorized_wheelchair_medium_skin_tone:', + '🧎‍➡️' => ':person_kneeling_facing_right:', + '🧑🏻‍🦲' => ':person_light_skin_tone_bald:', + '🧑🏻‍🦱' => ':person_light_skin_tone_curly_hair:', + '🧑🏻‍🦰' => ':person_light_skin_tone_red_hair:', + '🧑🏻‍🦳' => ':person_light_skin_tone_white_hair:', + '🧑🏾‍🦲' => ':person_medium_dark_skin_tone_bald:', + '🧑🏾‍🦱' => ':person_medium_dark_skin_tone_curly_hair:', + '🧑🏾‍🦰' => ':person_medium_dark_skin_tone_red_hair:', + '🧑🏾‍🦳' => ':person_medium_dark_skin_tone_white_hair:', + '🧑🏼‍🦲' => ':person_medium_light_skin_tone_bald:', + '🧑🏼‍🦱' => ':person_medium_light_skin_tone_curly_hair:', + '🧑🏼‍🦰' => ':person_medium_light_skin_tone_red_hair:', + '🧑🏼‍🦳' => ':person_medium_light_skin_tone_white_hair:', + '🧑🏽‍🦲' => ':person_medium_skin_tone_bald:', + '🧑🏽‍🦱' => ':person_medium_skin_tone_curly_hair:', + '🧑🏽‍🦰' => ':person_medium_skin_tone_red_hair:', + '🧑🏽‍🦳' => ':person_medium_skin_tone_white_hair:', + '🏃‍➡️' => ':person_running_facing_right:', + '🚶‍➡️' => ':person_walking_facing_right:', + '🧑🏿‍🦯' => ':person_with_white_cane_dark_skin_tone:', + '🧑🏻‍🦯' => ':person_with_white_cane_light_skin_tone:', + '🧑🏾‍🦯' => ':person_with_white_cane_medium_dark_skin_tone:', + '🧑🏼‍🦯' => ':person_with_white_cane_medium_light_skin_tone:', + '🧑🏽‍🦯' => ':person_with_white_cane_medium_skin_tone:', + '🧑‍✈️' => ':pilot:', + '🏴‍☠️' => ':pirate_flag:', + '🐻‍❄️' => ':polar_bear:', + '🧑🏿‍🔬' => ':scientist_dark_skin_tone:', + '🧑🏻‍🔬' => ':scientist_light_skin_tone:', + '🧑🏾‍🔬' => ':scientist_medium_dark_skin_tone:', + '🧑🏼‍🔬' => ':scientist_medium_light_skin_tone:', + '🧑🏽‍🔬' => ':scientist_medium_skin_tone:', + '🧑🏿‍🎤' => ':singer_dark_skin_tone:', + '🧑🏻‍🎤' => ':singer_light_skin_tone:', + '🧑🏾‍🎤' => ':singer_medium_dark_skin_tone:', + '🧑🏼‍🎤' => ':singer_medium_light_skin_tone:', + '🧑🏽‍🎤' => ':singer_medium_skin_tone:', + '🧑🏿‍🎓' => ':student_dark_skin_tone:', + '🧑🏻‍🎓' => ':student_light_skin_tone:', + '🧑🏾‍🎓' => ':student_medium_dark_skin_tone:', + '🧑🏼‍🎓' => ':student_medium_light_skin_tone:', + '🧑🏽‍🎓' => ':student_medium_skin_tone:', + '🧑🏿‍🏫' => ':teacher_dark_skin_tone:', + '🧑🏻‍🏫' => ':teacher_light_skin_tone:', + '🧑🏾‍🏫' => ':teacher_medium_dark_skin_tone:', + '🧑🏼‍🏫' => ':teacher_medium_light_skin_tone:', + '🧑🏽‍🏫' => ':teacher_medium_skin_tone:', + '🧑🏿‍💻' => ':technologist_dark_skin_tone:', + '🧑🏻‍💻' => ':technologist_light_skin_tone:', + '🧑🏾‍💻' => ':technologist_medium_dark_skin_tone:', + '🧑🏼‍💻' => ':technologist_medium_light_skin_tone:', + '🧑🏽‍💻' => ':technologist_medium_skin_tone:', + '👩🏿‍🎨' => ':woman_artist_dark_skin_tone:', + '👩🏻‍🎨' => ':woman_artist_light_skin_tone:', + '👩🏾‍🎨' => ':woman_artist_medium_dark_skin_tone:', + '👩🏼‍🎨' => ':woman_artist_medium_light_skin_tone:', + '👩🏽‍🎨' => ':woman_artist_medium_skin_tone:', + '👩🏿‍🚀' => ':woman_astronaut_dark_skin_tone:', + '👩🏻‍🚀' => ':woman_astronaut_light_skin_tone:', + '👩🏾‍🚀' => ':woman_astronaut_medium_dark_skin_tone:', + '👩🏼‍🚀' => ':woman_astronaut_medium_light_skin_tone:', + '👩🏽‍🚀' => ':woman_astronaut_medium_skin_tone:', + '🧔‍♀️' => ':woman_beard:', + '🚴‍♀️' => ':woman_biking:', + '👱‍♀️' => ':woman_blond_hair:', + '🙇‍♀️' => ':woman_bowing:', + '🤸‍♀️' => ':woman_cartwheeling:', + '🧗‍♀️' => ':woman_climbing:', + '👷‍♀️' => ':woman_construction_worker:', + '👩🏿‍🍳' => ':woman_cook_dark_skin_tone:', + '👩🏻‍🍳' => ':woman_cook_light_skin_tone:', + '👩🏾‍🍳' => ':woman_cook_medium_dark_skin_tone:', + '👩🏼‍🍳' => ':woman_cook_medium_light_skin_tone:', + '👩🏽‍🍳' => ':woman_cook_medium_skin_tone:', + '👩🏿‍🦲' => ':woman_dark_skin_tone_bald:', + '👩🏿‍🦱' => ':woman_dark_skin_tone_curly_hair:', + '👩🏿‍🦰' => ':woman_dark_skin_tone_red_hair:', + '👩🏿‍🦳' => ':woman_dark_skin_tone_white_hair:', + '🧝‍♀️' => ':woman_elf:', + '🤦‍♀️' => ':woman_facepalming:', + '👩🏿‍🏭' => ':woman_factory_worker_dark_skin_tone:', + '👩🏻‍🏭' => ':woman_factory_worker_light_skin_tone:', + '👩🏾‍🏭' => ':woman_factory_worker_medium_dark_skin_tone:', + '👩🏼‍🏭' => ':woman_factory_worker_medium_light_skin_tone:', + '👩🏽‍🏭' => ':woman_factory_worker_medium_skin_tone:', + '🧚‍♀️' => ':woman_fairy:', + '👩🏿‍🌾' => ':woman_farmer_dark_skin_tone:', + '👩🏻‍🌾' => ':woman_farmer_light_skin_tone:', + '👩🏾‍🌾' => ':woman_farmer_medium_dark_skin_tone:', + '👩🏼‍🌾' => ':woman_farmer_medium_light_skin_tone:', + '👩🏽‍🌾' => ':woman_farmer_medium_skin_tone:', + '👩🏿‍🍼' => ':woman_feeding_baby_dark_skin_tone:', + '👩🏻‍🍼' => ':woman_feeding_baby_light_skin_tone:', + '👩🏾‍🍼' => ':woman_feeding_baby_medium_dark_skin_tone:', + '👩🏼‍🍼' => ':woman_feeding_baby_medium_light_skin_tone:', + '👩🏽‍🍼' => ':woman_feeding_baby_medium_skin_tone:', + '👩🏿‍🚒' => ':woman_firefighter_dark_skin_tone:', + '👩🏻‍🚒' => ':woman_firefighter_light_skin_tone:', + '👩🏾‍🚒' => ':woman_firefighter_medium_dark_skin_tone:', + '👩🏼‍🚒' => ':woman_firefighter_medium_light_skin_tone:', + '👩🏽‍🚒' => ':woman_firefighter_medium_skin_tone:', + '🙍‍♀️' => ':woman_frowning:', + '🧞‍♀️' => ':woman_genie:', + '🙅‍♀️' => ':woman_gesturing_no:', + '🙆‍♀️' => ':woman_gesturing_ok:', + '💇‍♀️' => ':woman_getting_haircut:', + '💆‍♀️' => ':woman_getting_massage:', + '💂‍♀️' => ':woman_guard:', + '👩‍⚕️' => ':woman_health_worker:', + '🧘‍♀️' => ':woman_in_lotus_position:', + '👩🏿‍🦽' => ':woman_in_manual_wheelchair_dark_skin_tone:', + '👩🏻‍🦽' => ':woman_in_manual_wheelchair_light_skin_tone:', + '👩🏾‍🦽' => ':woman_in_manual_wheelchair_medium_dark_skin_tone:', + '👩🏼‍🦽' => ':woman_in_manual_wheelchair_medium_light_skin_tone:', + '👩🏽‍🦽' => ':woman_in_manual_wheelchair_medium_skin_tone:', + '👩🏿‍🦼' => ':woman_in_motorized_wheelchair_dark_skin_tone:', + '👩🏻‍🦼' => ':woman_in_motorized_wheelchair_light_skin_tone:', + '👩🏾‍🦼' => ':woman_in_motorized_wheelchair_medium_dark_skin_tone:', + '👩🏼‍🦼' => ':woman_in_motorized_wheelchair_medium_light_skin_tone:', + '👩🏽‍🦼' => ':woman_in_motorized_wheelchair_medium_skin_tone:', + '🧖‍♀️' => ':woman_in_steamy_room:', + '🤵‍♀️' => ':woman_in_tuxedo:', + '👩‍⚖️' => ':woman_judge:', + '🤹‍♀️' => ':woman_juggling:', + '🧎‍♀️' => ':woman_kneeling:', + '👩🏻‍🦲' => ':woman_light_skin_tone_bald:', + '👩🏻‍🦱' => ':woman_light_skin_tone_curly_hair:', + '👩🏻‍🦰' => ':woman_light_skin_tone_red_hair:', + '👩🏻‍🦳' => ':woman_light_skin_tone_white_hair:', + '🧙‍♀️' => ':woman_mage:', + '👩🏿‍🔧' => ':woman_mechanic_dark_skin_tone:', + '👩🏻‍🔧' => ':woman_mechanic_light_skin_tone:', + '👩🏾‍🔧' => ':woman_mechanic_medium_dark_skin_tone:', + '👩🏼‍🔧' => ':woman_mechanic_medium_light_skin_tone:', + '👩🏽‍🔧' => ':woman_mechanic_medium_skin_tone:', + '👩🏾‍🦲' => ':woman_medium_dark_skin_tone_bald:', + '👩🏾‍🦱' => ':woman_medium_dark_skin_tone_curly_hair:', + '👩🏾‍🦰' => ':woman_medium_dark_skin_tone_red_hair:', + '👩🏾‍🦳' => ':woman_medium_dark_skin_tone_white_hair:', + '👩🏼‍🦲' => ':woman_medium_light_skin_tone_bald:', + '👩🏼‍🦱' => ':woman_medium_light_skin_tone_curly_hair:', + '👩🏼‍🦰' => ':woman_medium_light_skin_tone_red_hair:', + '👩🏼‍🦳' => ':woman_medium_light_skin_tone_white_hair:', + '👩🏽‍🦲' => ':woman_medium_skin_tone_bald:', + '👩🏽‍🦱' => ':woman_medium_skin_tone_curly_hair:', + '👩🏽‍🦰' => ':woman_medium_skin_tone_red_hair:', + '👩🏽‍🦳' => ':woman_medium_skin_tone_white_hair:', + '🚵‍♀️' => ':woman_mountain_biking:', + '👩🏿‍💼' => ':woman_office_worker_dark_skin_tone:', + '👩🏻‍💼' => ':woman_office_worker_light_skin_tone:', + '👩🏾‍💼' => ':woman_office_worker_medium_dark_skin_tone:', + '👩🏼‍💼' => ':woman_office_worker_medium_light_skin_tone:', + '👩🏽‍💼' => ':woman_office_worker_medium_skin_tone:', + '👩‍✈️' => ':woman_pilot:', + '🤾‍♀️' => ':woman_playing_handball:', + '🤽‍♀️' => ':woman_playing_water_polo:', + '👮‍♀️' => ':woman_police_officer:', + '🙎‍♀️' => ':woman_pouting:', + '🙋‍♀️' => ':woman_raising_hand:', + '🚣‍♀️' => ':woman_rowing_boat:', + '🏃‍♀️' => ':woman_running:', + '👩🏿‍🔬' => ':woman_scientist_dark_skin_tone:', + '👩🏻‍🔬' => ':woman_scientist_light_skin_tone:', + '👩🏾‍🔬' => ':woman_scientist_medium_dark_skin_tone:', + '👩🏼‍🔬' => ':woman_scientist_medium_light_skin_tone:', + '👩🏽‍🔬' => ':woman_scientist_medium_skin_tone:', + '🤷‍♀️' => ':woman_shrugging:', + '👩🏿‍🎤' => ':woman_singer_dark_skin_tone:', + '👩🏻‍🎤' => ':woman_singer_light_skin_tone:', + '👩🏾‍🎤' => ':woman_singer_medium_dark_skin_tone:', + '👩🏼‍🎤' => ':woman_singer_medium_light_skin_tone:', + '👩🏽‍🎤' => ':woman_singer_medium_skin_tone:', + '🧍‍♀️' => ':woman_standing:', + '👩🏿‍🎓' => ':woman_student_dark_skin_tone:', + '👩🏻‍🎓' => ':woman_student_light_skin_tone:', + '👩🏾‍🎓' => ':woman_student_medium_dark_skin_tone:', + '👩🏼‍🎓' => ':woman_student_medium_light_skin_tone:', + '👩🏽‍🎓' => ':woman_student_medium_skin_tone:', + '🦸‍♀️' => ':woman_superhero:', + '🦹‍♀️' => ':woman_supervillain:', + '🏄‍♀️' => ':woman_surfing:', + '🏊‍♀️' => ':woman_swimming:', + '👩🏿‍🏫' => ':woman_teacher_dark_skin_tone:', + '👩🏻‍🏫' => ':woman_teacher_light_skin_tone:', + '👩🏾‍🏫' => ':woman_teacher_medium_dark_skin_tone:', + '👩🏼‍🏫' => ':woman_teacher_medium_light_skin_tone:', + '👩🏽‍🏫' => ':woman_teacher_medium_skin_tone:', + '👩🏿‍💻' => ':woman_technologist_dark_skin_tone:', + '👩🏻‍💻' => ':woman_technologist_light_skin_tone:', + '👩🏾‍💻' => ':woman_technologist_medium_dark_skin_tone:', + '👩🏼‍💻' => ':woman_technologist_medium_light_skin_tone:', + '👩🏽‍💻' => ':woman_technologist_medium_skin_tone:', + '💁‍♀️' => ':woman_tipping_hand:', + '🧛‍♀️' => ':woman_vampire:', + '🚶‍♀️' => ':woman_walking:', + '👳‍♀️' => ':woman_wearing_turban:', + '👰‍♀️' => ':woman_with_veil:', + '👩🏿‍🦯' => ':woman_with_white_cane_dark_skin_tone:', + '👩🏻‍🦯' => ':woman_with_white_cane_light_skin_tone:', + '👩🏾‍🦯' => ':woman_with_white_cane_medium_dark_skin_tone:', + '👩🏼‍🦯' => ':woman_with_white_cane_medium_light_skin_tone:', + '👩🏽‍🦯' => ':woman_with_white_cane_medium_skin_tone:', + '🧟‍♀️' => ':woman_zombie:', + '👯‍♀️' => ':women_with_bunny_ears:', + '🤼‍♀️' => ':women_wrestling:', + '🧑‍🎨' => ':artist:', + '*️⃣' => ':asterisk:', + '🧑‍🚀' => ':astronaut:', + '🐦‍⬛' => ':black_bird:', + '🐈‍⬛' => ':black_cat:', + '🍄‍🟫' => ':brown_mushroom:', + '🧑‍🍳' => ':cook:', '8️⃣' => ':eight:', - '👁‍🗨' => ':eye_in_speech_bubble:', + '😮‍💨' => ':face_exhaling:', + '😵‍💫' => ':face_with_spiral_eyes:', + '🧑‍🏭' => ':factory_worker:', + '🧑‍🧒' => ':family_adult_child:', + '👨‍👦' => ':family_man_boy:', + '👨‍👧' => ':family_man_girl:', + '👩‍👦' => ':family_woman_boy:', + '👩‍👧' => ':family_woman_girl:', + '🧑‍🌾' => ':farmer:', + '🧑‍🚒' => ':firefighter:', '5️⃣' => ':five:', '4️⃣' => ':four:', + '#️⃣' => ':hash:', + '🍋‍🟩' => ':lime:', + '👨‍🎨' => ':man_artist:', + '👨‍🚀' => ':man_astronaut:', + '👨‍🦲' => ':man_bald:', + '👨‍🍳' => ':man_cook:', + '👨‍🦱' => ':man_curly_hair:', + '👨‍🏭' => ':man_factory_worker:', + '👨‍🌾' => ':man_farmer:', + '👨‍🍼' => ':man_feeding_baby:', + '👨‍🚒' => ':man_firefighter:', + '👨‍🦽' => ':man_in_manual_wheelchair:', + '👨‍🦼' => ':man_in_motorized_wheelchair:', + '👨‍🔧' => ':man_mechanic:', + '👨‍💼' => ':man_office_worker:', + '👨‍🦰' => ':man_red_hair:', + '👨‍🔬' => ':man_scientist:', + '👨‍🎤' => ':man_singer:', + '👨‍🎓' => ':man_student:', + '👨‍🏫' => ':man_teacher:', + '👨‍💻' => ':man_technologist:', + '👨‍🦳' => ':man_white_hair:', + '👨‍🦯' => ':man_with_white_cane:', + '🧑‍🔧' => ':mechanic:', + '🧑‍🎄' => ':mx_claus:', '9️⃣' => ':nine:', + '🧑‍💼' => ':office_worker:', '1️⃣' => ':one:', + '🧑‍🦲' => ':person_bald:', + '🧑‍🦱' => ':person_curly_hair:', + '🧑‍🍼' => ':person_feeding_baby:', + '🧑‍🦽' => ':person_in_manual_wheelchair:', + '🧑‍🦼' => ':person_in_motorized_wheelchair:', + '🧑‍🦰' => ':person_red_hair:', + '🧑‍🦳' => ':person_white_hair:', + '🧑‍🦯' => ':person_with_white_cane:', + '🐦‍🔥' => ':phoenix:', + '🧑‍🔬' => ':scientist:', + '🐕‍🦺' => ':service_dog:', '7️⃣' => ':seven:', + '🧑‍🎤' => ':singer:', '6️⃣' => ':six:', + '🧑‍🎓' => ':student:', + '🧑‍🏫' => ':teacher:', + '🧑‍💻' => ':technologist:', '3️⃣' => ':three:', '2️⃣' => ':two:', + '👩‍🎨' => ':woman_artist:', + '👩‍🚀' => ':woman_astronaut:', + '👩‍🦲' => ':woman_bald:', + '👩‍🍳' => ':woman_cook:', + '👩‍🦱' => ':woman_curly_hair:', + '👩‍🏭' => ':woman_factory_worker:', + '👩‍🌾' => ':woman_farmer:', + '👩‍🍼' => ':woman_feeding_baby:', + '👩‍🚒' => ':woman_firefighter:', + '👩‍🦽' => ':woman_in_manual_wheelchair:', + '👩‍🦼' => ':woman_in_motorized_wheelchair:', + '👩‍🔧' => ':woman_mechanic:', + '👩‍💼' => ':woman_office_worker:', + '👩‍🦰' => ':woman_red_hair:', + '👩‍🔬' => ':woman_scientist:', + '👩‍🎤' => ':woman_singer:', + '👩‍🎓' => ':woman_student:', + '👩‍🏫' => ':woman_teacher:', + '👩‍💻' => ':woman_technologist:', + '👩‍🦳' => ':woman_white_hair:', + '👩‍🦯' => ':woman_with_white_cane:', '0️⃣' => ':zero:', + '🅰️' => ':a:', + '✈️' => ':airplane:', + '🛩️' => ':airplane_small:', + '⚗️' => ':alembic:', '👼🏻' => ':angel_tone1:', '👼🏼' => ':angel_tone2:', '👼🏽' => ':angel_tone3:', '👼🏾' => ':angel_tone4:', '👼🏿' => ':angel_tone5:', - '*⃣' => ':asterisk:', + '🗯️' => ':anger_right:', + '◀️' => ':arrow_backward:', + '⬇️' => ':arrow_down:', + '▶️' => ':arrow_forward:', + '⤵️' => ':arrow_heading_down:', + '⤴️' => ':arrow_heading_up:', + '⬅️' => ':arrow_left:', + '↙️' => ':arrow_lower_left:', + '↘️' => ':arrow_lower_right:', + '➡️' => ':arrow_right:', + '↪️' => ':arrow_right_hook:', + '⬆️' => ':arrow_up:', + '↕️' => ':arrow_up_down:', + '↖️' => ':arrow_upper_left:', + '↗️' => ':arrow_upper_right:', + '⚛️' => ':atom:', + '🅱️' => ':b:', '👶🏻' => ':baby_tone1:', '👶🏼' => ':baby_tone2:', '👶🏽' => ':baby_tone3:', '👶🏾' => ':baby_tone4:', '👶🏿' => ':baby_tone5:', + '🗳️' => ':ballot_box:', + '☑️' => ':ballot_box_with_check:', + '‼️' => ':bangbang:', + '⛹️' => ':basketball_player:', '⛹🏻' => ':basketball_player_tone1:', '⛹🏼' => ':basketball_player_tone2:', '⛹🏽' => ':basketball_player_tone3:', @@ -51,11 +1529,19 @@ '🛀🏽' => ':bath_tone3:', '🛀🏾' => ':bath_tone4:', '🛀🏿' => ':bath_tone5:', + '🏖️' => ':beach:', + '⛱️' => ':beach_umbrella:', + '🛏️' => ':bed:', + '🛎️' => ':bellhop:', '🚴🏻' => ':bicyclist_tone1:', '🚴🏼' => ':bicyclist_tone2:', '🚴🏽' => ':bicyclist_tone3:', '🚴🏾' => ':bicyclist_tone4:', '🚴🏿' => ':bicyclist_tone5:', + '☣️' => ':biohazard:', + '◼️' => ':black_medium_square:', + '✒️' => ':black_nib:', + '▪️' => ':black_small_square:', '🙇🏻' => ':bow_tone1:', '🙇🏼' => ':bow_tone2:', '🙇🏽' => ':bow_tone3:', @@ -66,51 +1552,130 @@ '👦🏽' => ':boy_tone3:', '👦🏾' => ':boy_tone4:', '👦🏿' => ':boy_tone5:', + '🤱🏿' => ':breast_feeding_dark_skin_tone:', + '🤱🏻' => ':breast_feeding_light_skin_tone:', + '🤱🏾' => ':breast_feeding_medium_dark_skin_tone:', + '🤱🏼' => ':breast_feeding_medium_light_skin_tone:', + '🤱🏽' => ':breast_feeding_medium_skin_tone:', '👰🏻' => ':bride_with_veil_tone1:', '👰🏼' => ':bride_with_veil_tone2:', '👰🏽' => ':bride_with_veil_tone3:', '👰🏾' => ':bride_with_veil_tone4:', '👰🏿' => ':bride_with_veil_tone5:', + '🗓️' => ':calendar_spiral:', '🤙🏻' => ':call_me_tone1:', '🤙🏼' => ':call_me_tone2:', '🤙🏽' => ':call_me_tone3:', '🤙🏾' => ':call_me_tone4:', '🤙🏿' => ':call_me_tone5:', + '🏕️' => ':camping:', + '🕯️' => ':candle:', + '🗃️' => ':card_box:', '🤸🏻' => ':cartwheel_tone1:', '🤸🏼' => ':cartwheel_tone2:', '🤸🏽' => ':cartwheel_tone3:', '🤸🏾' => ':cartwheel_tone4:', '🤸🏿' => ':cartwheel_tone5:', + '⛓️' => ':chains:', + '♟️' => ':chess_pawn:', + '🧒🏿' => ':child_dark_skin_tone:', + '🧒🏻' => ':child_light_skin_tone:', + '🧒🏾' => ':child_medium_dark_skin_tone:', + '🧒🏼' => ':child_medium_light_skin_tone:', + '🧒🏽' => ':child_medium_skin_tone:', + '🐿️' => ':chipmunk:', + '🏙️' => ':cityscape:', '👏🏻' => ':clap_tone1:', '👏🏼' => ':clap_tone2:', '👏🏽' => ':clap_tone3:', '👏🏾' => ':clap_tone4:', '👏🏿' => ':clap_tone5:', + '🏛️' => ':classical_building:', + '🕰️' => ':clock:', + '☁️' => ':cloud:', + '🌩️' => ':cloud_lightning:', + '🌧️' => ':cloud_rain:', + '🌨️' => ':cloud_snow:', + '🌪️' => ':cloud_tornado:', + '♣️' => ':clubs:', + '⚰️' => ':coffin:', + '☄️' => ':comet:', + '🗜️' => ':compression:', + '㊗️' => ':congratulations:', + '🏗️' => ':construction_site:', '👷🏻' => ':construction_worker_tone1:', '👷🏼' => ':construction_worker_tone2:', '👷🏽' => ':construction_worker_tone3:', '👷🏾' => ':construction_worker_tone4:', '👷🏿' => ':construction_worker_tone5:', + '🎛️' => ':control_knobs:', '👮🏻' => ':cop_tone1:', '👮🏼' => ':cop_tone2:', '👮🏽' => ':cop_tone3:', '👮🏾' => ':cop_tone4:', '👮🏿' => ':cop_tone5:', + '©️' => ':copyright:', + '🛋️' => ':couch:', + '💑🏿' => ':couple_with_heart_dark_skin_tone:', + '💑🏻' => ':couple_with_heart_light_skin_tone:', + '💑🏾' => ':couple_with_heart_medium_dark_skin_tone:', + '💑🏼' => ':couple_with_heart_medium_light_skin_tone:', + '💑🏽' => ':couple_with_heart_medium_skin_tone:', + '🖍️' => ':crayon:', + '✝️' => ':cross:', + '⚔️' => ':crossed_swords:', + '🛳️' => ':cruise_ship:', + '🗡️' => ':dagger:', '💃🏻' => ':dancer_tone1:', '💃🏼' => ':dancer_tone2:', '💃🏽' => ':dancer_tone3:', '💃🏾' => ':dancer_tone4:', '💃🏿' => ':dancer_tone5:', + '🕶️' => ':dark_sunglasses:', + '🧏🏿' => ':deaf_person_dark_skin_tone:', + '🧏🏻' => ':deaf_person_light_skin_tone:', + '🧏🏾' => ':deaf_person_medium_dark_skin_tone:', + '🧏🏼' => ':deaf_person_medium_light_skin_tone:', + '🧏🏽' => ':deaf_person_medium_skin_tone:', + '🏜️' => ':desert:', + '🖥️' => ':desktop:', + '♦️' => ':diamonds:', + '🗂️' => ':dividers:', + '🕊️' => ':dove:', '👂🏻' => ':ear_tone1:', '👂🏼' => ':ear_tone2:', '👂🏽' => ':ear_tone3:', '👂🏾' => ':ear_tone4:', '👂🏿' => ':ear_tone5:', + '🦻🏿' => ':ear_with_hearing_aid_dark_skin_tone:', + '🦻🏻' => ':ear_with_hearing_aid_light_skin_tone:', + '🦻🏾' => ':ear_with_hearing_aid_medium_dark_skin_tone:', + '🦻🏼' => ':ear_with_hearing_aid_medium_light_skin_tone:', + '🦻🏽' => ':ear_with_hearing_aid_medium_skin_tone:', + '✴️' => ':eight_pointed_black_star:', + '✳️' => ':eight_spoked_asterisk:', + '⏏️' => ':eject:', + '🧝🏿' => ':elf_dark_skin_tone:', + '🧝🏻' => ':elf_light_skin_tone:', + '🧝🏾' => ':elf_medium_dark_skin_tone:', + '🧝🏼' => ':elf_medium_light_skin_tone:', + '🧝🏽' => ':elf_medium_skin_tone:', + '✉️' => ':envelope:', + '👁️' => ':eye:', '🤦🏻' => ':face_palm_tone1:', '🤦🏼' => ':face_palm_tone2:', '🤦🏽' => ':face_palm_tone3:', '🤦🏾' => ':face_palm_tone4:', '🤦🏿' => ':face_palm_tone5:', + '🧚🏿' => ':fairy_dark_skin_tone:', + '🧚🏻' => ':fairy_light_skin_tone:', + '🧚🏾' => ':fairy_medium_dark_skin_tone:', + '🧚🏼' => ':fairy_medium_light_skin_tone:', + '🧚🏽' => ':fairy_medium_skin_tone:', + '♀️' => ':female_sign:', + '⛴️' => ':ferry:', + '🗄️' => ':file_cabinet:', + '🎞️' => ':film_frames:', '🤞🏻' => ':fingers_crossed_tone1:', '🤞🏼' => ':fingers_crossed_tone2:', '🤞🏽' => ':fingers_crossed_tone3:', @@ -360,6 +1925,7 @@ '🇺🇦' => ':flag_ua:', '🇺🇬' => ':flag_ug:', '🇺🇲' => ':flag_um:', + '🇺🇳' => ':flag_united_nations:', '🇺🇸' => ':flag_us:', '🇺🇾' => ':flag_uy:', '🇺🇿' => ':flag_uz:', @@ -371,6 +1937,7 @@ '🇻🇳' => ':flag_vn:', '🇻🇺' => ':flag_vu:', '🇼🇫' => ':flag_wf:', + '🏳️' => ':flag_white:', '🇼🇸' => ':flag_ws:', '🇽🇰' => ':flag_xk:', '🇾🇪' => ':flag_ye:', @@ -378,12 +1945,23 @@ '🇿🇦' => ':flag_za:', '🇿🇲' => ':flag_zm:', '🇿🇼' => ':flag_zw:', - '🏳🌈' => ':gay_pride_flag:', + '⚜️' => ':fleur-de-lis:', + '🌫️' => ':fog:', + '🦶🏿' => ':foot_dark_skin_tone:', + '🦶🏻' => ':foot_light_skin_tone:', + '🦶🏾' => ':foot_medium_dark_skin_tone:', + '🦶🏼' => ':foot_medium_light_skin_tone:', + '🦶🏽' => ':foot_medium_skin_tone:', + '🍽️' => ':fork_knife_plate:', + '🖼️' => ':frame_photo:', + '☹️' => ':frowning2:', + '⚙️' => ':gear:', '👧🏻' => ':girl_tone1:', '👧🏼' => ':girl_tone2:', '👧🏽' => ':girl_tone3:', '👧🏾' => ':girl_tone4:', '👧🏿' => ':girl_tone5:', + '🏌️' => ':golfer:', '💂🏻' => ':guardsman_tone1:', '💂🏼' => ':guardsman_tone2:', '💂🏽' => ':guardsman_tone3:', @@ -394,11 +1972,18 @@ '💇🏽' => ':haircut_tone3:', '💇🏾' => ':haircut_tone4:', '💇🏿' => ':haircut_tone5:', + '⚒️' => ':hammer_pick:', + '🖐️' => ':hand_splayed:', '🖐🏻' => ':hand_splayed_tone1:', '🖐🏼' => ':hand_splayed_tone2:', '🖐🏽' => ':hand_splayed_tone3:', '🖐🏾' => ':hand_splayed_tone4:', '🖐🏿' => ':hand_splayed_tone5:', + '🫰🏿' => ':hand_with_index_finger_and_thumb_crossed_dark_skin_tone:', + '🫰🏻' => ':hand_with_index_finger_and_thumb_crossed_light_skin_tone:', + '🫰🏾' => ':hand_with_index_finger_and_thumb_crossed_medium_dark_skin_tone:', + '🫰🏼' => ':hand_with_index_finger_and_thumb_crossed_medium_light_skin_tone:', + '🫰🏽' => ':hand_with_index_finger_and_thumb_crossed_medium_skin_tone:', '🤾🏻' => ':handball_tone1:', '🤾🏼' => ':handball_tone2:', '🤾🏽' => ':handball_tone3:', @@ -409,32 +1994,98 @@ '🤝🏽' => ':handshake_tone3:', '🤝🏾' => ':handshake_tone4:', '🤝🏿' => ':handshake_tone5:', - '#⃣' => ':hash:', + '❤️' => ':heart:', + '❣️' => ':heart_exclamation:', + '🫶🏿' => ':heart_hands_dark_skin_tone:', + '🫶🏻' => ':heart_hands_light_skin_tone:', + '🫶🏾' => ':heart_hands_medium_dark_skin_tone:', + '🫶🏼' => ':heart_hands_medium_light_skin_tone:', + '🫶🏽' => ':heart_hands_medium_skin_tone:', + '♥️' => ':hearts:', + '✔️' => ':heavy_check_mark:', + '✖️' => ':heavy_multiplication_x:', + '⛑️' => ':helmet_with_cross:', + '🕳️' => ':hole:', + '🏘️' => ':homes:', '🏇🏻' => ':horse_racing_tone1:', '🏇🏼' => ':horse_racing_tone2:', '🏇🏽' => ':horse_racing_tone3:', '🏇🏾' => ':horse_racing_tone4:', '🏇🏿' => ':horse_racing_tone5:', + '🌶️' => ':hot_pepper:', + '♨️' => ':hotsprings:', + '🏚️' => ':house_abandoned:', + '⛸️' => ':ice_skate:', + '🫵🏿' => ':index_pointing_at_the_viewer_dark_skin_tone:', + '🫵🏻' => ':index_pointing_at_the_viewer_light_skin_tone:', + '🫵🏾' => ':index_pointing_at_the_viewer_medium_dark_skin_tone:', + '🫵🏼' => ':index_pointing_at_the_viewer_medium_light_skin_tone:', + '🫵🏽' => ':index_pointing_at_the_viewer_medium_skin_tone:', + '♾️' => ':infinity:', '💁🏻' => ':information_desk_person_tone1:', '💁🏼' => ':information_desk_person_tone2:', '💁🏽' => ':information_desk_person_tone3:', '💁🏾' => ':information_desk_person_tone4:', '💁🏿' => ':information_desk_person_tone5:', + 'ℹ️' => ':information_source:', + '⁉️' => ':interrobang:', + '🏝️' => ':island:', + '🕹️' => ':joystick:', '🤹🏻' => ':juggling_tone1:', '🤹🏼' => ':juggling_tone2:', '🤹🏽' => ':juggling_tone3:', '🤹🏾' => ':juggling_tone4:', '🤹🏿' => ':juggling_tone5:', + '🗝️' => ':key2:', + '⌨️' => ':keyboard:', + '💏🏿' => ':kiss_dark_skin_tone:', + '💏🏻' => ':kiss_light_skin_tone:', + '💏🏾' => ':kiss_medium_dark_skin_tone:', + '💏🏼' => ':kiss_medium_light_skin_tone:', + '💏🏽' => ':kiss_medium_skin_tone:', + '🏷️' => ':label:', '🤛🏻' => ':left_facing_fist_tone1:', '🤛🏼' => ':left_facing_fist_tone2:', '🤛🏽' => ':left_facing_fist_tone3:', '🤛🏾' => ':left_facing_fist_tone4:', '🤛🏿' => ':left_facing_fist_tone5:', + '↔️' => ':left_right_arrow:', + '↩️' => ':leftwards_arrow_with_hook:', + '🫲🏿' => ':leftwards_hand_dark_skin_tone:', + '🫲🏻' => ':leftwards_hand_light_skin_tone:', + '🫲🏾' => ':leftwards_hand_medium_dark_skin_tone:', + '🫲🏼' => ':leftwards_hand_medium_light_skin_tone:', + '🫲🏽' => ':leftwards_hand_medium_skin_tone:', + '🫷🏿' => ':leftwards_pushing_hand_dark_skin_tone:', + '🫷🏻' => ':leftwards_pushing_hand_light_skin_tone:', + '🫷🏾' => ':leftwards_pushing_hand_medium_dark_skin_tone:', + '🫷🏼' => ':leftwards_pushing_hand_medium_light_skin_tone:', + '🫷🏽' => ':leftwards_pushing_hand_medium_skin_tone:', + '🦵🏿' => ':leg_dark_skin_tone:', + '🦵🏻' => ':leg_light_skin_tone:', + '🦵🏾' => ':leg_medium_dark_skin_tone:', + '🦵🏼' => ':leg_medium_light_skin_tone:', + '🦵🏽' => ':leg_medium_skin_tone:', + '🎚️' => ':level_slider:', + '🕴️' => ':levitate:', + '🏋️' => ':lifter:', '🏋🏻' => ':lifter_tone1:', '🏋🏼' => ':lifter_tone2:', '🏋🏽' => ':lifter_tone3:', '🏋🏾' => ':lifter_tone4:', '🏋🏿' => ':lifter_tone5:', + '🤟🏿' => ':love_you_gesture_dark_skin_tone:', + '🤟🏻' => ':love_you_gesture_light_skin_tone:', + '🤟🏾' => ':love_you_gesture_medium_dark_skin_tone:', + '🤟🏼' => ':love_you_gesture_medium_light_skin_tone:', + '🤟🏽' => ':love_you_gesture_medium_skin_tone:', + 'Ⓜ️' => ':m:', + '🧙🏿' => ':mage_dark_skin_tone:', + '🧙🏻' => ':mage_light_skin_tone:', + '🧙🏾' => ':mage_medium_dark_skin_tone:', + '🧙🏼' => ':mage_medium_light_skin_tone:', + '🧙🏽' => ':mage_medium_skin_tone:', + '♂️' => ':male_sign:', '🕺🏻' => ':man_dancing_tone1:', '🕺🏼' => ':man_dancing_tone2:', '🕺🏽' => ':man_dancing_tone3:', @@ -460,26 +2111,46 @@ '👳🏽' => ':man_with_turban_tone3:', '👳🏾' => ':man_with_turban_tone4:', '👳🏿' => ':man_with_turban_tone5:', + '🗺️' => ':map:', '💆🏻' => ':massage_tone1:', '💆🏼' => ':massage_tone2:', '💆🏽' => ':massage_tone3:', '💆🏾' => ':massage_tone4:', '💆🏿' => ':massage_tone5:', + '⚕️' => ':medical_symbol:', + '👬🏿' => ':men_holding_hands_dark_skin_tone:', + '👬🏻' => ':men_holding_hands_light_skin_tone:', + '👬🏾' => ':men_holding_hands_medium_dark_skin_tone:', + '👬🏼' => ':men_holding_hands_medium_light_skin_tone:', + '👬🏽' => ':men_holding_hands_medium_skin_tone:', + '🧜🏿' => ':merperson_dark_skin_tone:', + '🧜🏻' => ':merperson_light_skin_tone:', + '🧜🏾' => ':merperson_medium_dark_skin_tone:', + '🧜🏼' => ':merperson_medium_light_skin_tone:', + '🧜🏽' => ':merperson_medium_skin_tone:', '🤘🏻' => ':metal_tone1:', '🤘🏼' => ':metal_tone2:', '🤘🏽' => ':metal_tone3:', '🤘🏾' => ':metal_tone4:', '🤘🏿' => ':metal_tone5:', + '🎙️' => ':microphone2:', '🖕🏻' => ':middle_finger_tone1:', '🖕🏼' => ':middle_finger_tone2:', '🖕🏽' => ':middle_finger_tone3:', '🖕🏾' => ':middle_finger_tone4:', '🖕🏿' => ':middle_finger_tone5:', + '🎖️' => ':military_medal:', + '🛥️' => ':motorboat:', + '🏍️' => ':motorcycle:', + '🛣️' => ':motorway:', + '⛰️' => ':mountain:', '🚵🏻' => ':mountain_bicyclist_tone1:', '🚵🏼' => ':mountain_bicyclist_tone2:', '🚵🏽' => ':mountain_bicyclist_tone3:', '🚵🏾' => ':mountain_bicyclist_tone4:', '🚵🏿' => ':mountain_bicyclist_tone5:', + '🏔️' => ':mountain_snow:', + '🖱️' => ':mouse_three_button:', '🤶🏻' => ':mrs_claus_tone1:', '🤶🏼' => ':mrs_claus_tone2:', '🤶🏽' => ':mrs_claus_tone3:', @@ -495,6 +2166,12 @@ '💅🏽' => ':nail_care_tone3:', '💅🏾' => ':nail_care_tone4:', '💅🏿' => ':nail_care_tone5:', + '🗞️' => ':newspaper2:', + '🥷🏿' => ':ninja_dark_skin_tone:', + '🥷🏻' => ':ninja_light_skin_tone:', + '🥷🏾' => ':ninja_medium_dark_skin_tone:', + '🥷🏼' => ':ninja_medium_light_skin_tone:', + '🥷🏽' => ':ninja_medium_skin_tone:', '🙅🏻' => ':no_good_tone1:', '🙅🏼' => ':no_good_tone2:', '🙅🏽' => ':no_good_tone3:', @@ -505,6 +2182,9 @@ '👃🏽' => ':nose_tone3:', '👃🏾' => ':nose_tone4:', '👃🏿' => ':nose_tone5:', + '🗒️' => ':notepad_spiral:', + '🅾️' => ':o2:', + '🛢️' => ':oil:', '👌🏻' => ':ok_hand_tone1:', '👌🏼' => ':ok_hand_tone2:', '👌🏽' => ':ok_hand_tone3:', @@ -520,31 +2200,130 @@ '👴🏽' => ':older_man_tone3:', '👴🏾' => ':older_man_tone4:', '👴🏿' => ':older_man_tone5:', + '🧓🏿' => ':older_person_dark_skin_tone:', + '🧓🏻' => ':older_person_light_skin_tone:', + '🧓🏾' => ':older_person_medium_dark_skin_tone:', + '🧓🏼' => ':older_person_medium_light_skin_tone:', + '🧓🏽' => ':older_person_medium_skin_tone:', '👵🏻' => ':older_woman_tone1:', '👵🏼' => ':older_woman_tone2:', '👵🏽' => ':older_woman_tone3:', '👵🏾' => ':older_woman_tone4:', '👵🏿' => ':older_woman_tone5:', + '🕉️' => ':om_symbol:', '👐🏻' => ':open_hands_tone1:', '👐🏼' => ':open_hands_tone2:', '👐🏽' => ':open_hands_tone3:', '👐🏾' => ':open_hands_tone4:', '👐🏿' => ':open_hands_tone5:', + '☦️' => ':orthodox_cross:', + '🖌️' => ':paintbrush:', + '🫳🏿' => ':palm_down_hand_dark_skin_tone:', + '🫳🏻' => ':palm_down_hand_light_skin_tone:', + '🫳🏾' => ':palm_down_hand_medium_dark_skin_tone:', + '🫳🏼' => ':palm_down_hand_medium_light_skin_tone:', + '🫳🏽' => ':palm_down_hand_medium_skin_tone:', + '🫴🏿' => ':palm_up_hand_dark_skin_tone:', + '🫴🏻' => ':palm_up_hand_light_skin_tone:', + '🫴🏾' => ':palm_up_hand_medium_dark_skin_tone:', + '🫴🏼' => ':palm_up_hand_medium_light_skin_tone:', + '🫴🏽' => ':palm_up_hand_medium_skin_tone:', + '🤲🏿' => ':palms_up_together_dark_skin_tone:', + '🤲🏻' => ':palms_up_together_light_skin_tone:', + '🤲🏾' => ':palms_up_together_medium_dark_skin_tone:', + '🤲🏼' => ':palms_up_together_medium_light_skin_tone:', + '🤲🏽' => ':palms_up_together_medium_skin_tone:', + '🖇️' => ':paperclips:', + '🏞️' => ':park:', + '🅿️' => ':parking:', + '〽️' => ':part_alternation_mark:', + '⏸️' => ':pause_button:', + '☮️' => ':peace:', + '🖊️' => ':pen_ballpoint:', + '🖋️' => ':pen_fountain:', + '✏️' => ':pencil2:', + '🧗🏿' => ':person_climbing_dark_skin_tone:', + '🧗🏻' => ':person_climbing_light_skin_tone:', + '🧗🏾' => ':person_climbing_medium_dark_skin_tone:', + '🧗🏼' => ':person_climbing_medium_light_skin_tone:', + '🧗🏽' => ':person_climbing_medium_skin_tone:', + '🧑🏿' => ':person_dark_skin_tone:', + '🧔🏿' => ':person_dark_skin_tone_beard:', '🙍🏻' => ':person_frowning_tone1:', '🙍🏼' => ':person_frowning_tone2:', '🙍🏽' => ':person_frowning_tone3:', '🙍🏾' => ':person_frowning_tone4:', '🙍🏿' => ':person_frowning_tone5:', + '🏌🏿' => ':person_golfing_dark_skin_tone:', + '🏌🏻' => ':person_golfing_light_skin_tone:', + '🏌🏾' => ':person_golfing_medium_dark_skin_tone:', + '🏌🏼' => ':person_golfing_medium_light_skin_tone:', + '🏌🏽' => ':person_golfing_medium_skin_tone:', + '🛌🏿' => ':person_in_bed_dark_skin_tone:', + '🛌🏻' => ':person_in_bed_light_skin_tone:', + '🛌🏾' => ':person_in_bed_medium_dark_skin_tone:', + '🛌🏼' => ':person_in_bed_medium_light_skin_tone:', + '🛌🏽' => ':person_in_bed_medium_skin_tone:', + '🧘🏿' => ':person_in_lotus_position_dark_skin_tone:', + '🧘🏻' => ':person_in_lotus_position_light_skin_tone:', + '🧘🏾' => ':person_in_lotus_position_medium_dark_skin_tone:', + '🧘🏼' => ':person_in_lotus_position_medium_light_skin_tone:', + '🧘🏽' => ':person_in_lotus_position_medium_skin_tone:', + '🧖🏿' => ':person_in_steamy_room_dark_skin_tone:', + '🧖🏻' => ':person_in_steamy_room_light_skin_tone:', + '🧖🏾' => ':person_in_steamy_room_medium_dark_skin_tone:', + '🧖🏼' => ':person_in_steamy_room_medium_light_skin_tone:', + '🧖🏽' => ':person_in_steamy_room_medium_skin_tone:', + '🕴🏿' => ':person_in_suit_levitating_dark_skin_tone:', + '🕴🏻' => ':person_in_suit_levitating_light_skin_tone:', + '🕴🏾' => ':person_in_suit_levitating_medium_dark_skin_tone:', + '🕴🏼' => ':person_in_suit_levitating_medium_light_skin_tone:', + '🕴🏽' => ':person_in_suit_levitating_medium_skin_tone:', + '🧎🏿' => ':person_kneeling_dark_skin_tone:', + '🧎🏻' => ':person_kneeling_light_skin_tone:', + '🧎🏾' => ':person_kneeling_medium_dark_skin_tone:', + '🧎🏼' => ':person_kneeling_medium_light_skin_tone:', + '🧎🏽' => ':person_kneeling_medium_skin_tone:', + '🧑🏻' => ':person_light_skin_tone:', + '🧔🏻' => ':person_light_skin_tone_beard:', + '🧑🏾' => ':person_medium_dark_skin_tone:', + '🧔🏾' => ':person_medium_dark_skin_tone_beard:', + '🧑🏼' => ':person_medium_light_skin_tone:', + '🧔🏼' => ':person_medium_light_skin_tone_beard:', + '🧑🏽' => ':person_medium_skin_tone:', + '🧔🏽' => ':person_medium_skin_tone_beard:', + '🧍🏿' => ':person_standing_dark_skin_tone:', + '🧍🏻' => ':person_standing_light_skin_tone:', + '🧍🏾' => ':person_standing_medium_dark_skin_tone:', + '🧍🏼' => ':person_standing_medium_light_skin_tone:', + '🧍🏽' => ':person_standing_medium_skin_tone:', '👱🏻' => ':person_with_blond_hair_tone1:', '👱🏼' => ':person_with_blond_hair_tone2:', '👱🏽' => ':person_with_blond_hair_tone3:', '👱🏾' => ':person_with_blond_hair_tone4:', '👱🏿' => ':person_with_blond_hair_tone5:', + '🫅🏿' => ':person_with_crown_dark_skin_tone:', + '🫅🏻' => ':person_with_crown_light_skin_tone:', + '🫅🏾' => ':person_with_crown_medium_dark_skin_tone:', + '🫅🏼' => ':person_with_crown_medium_light_skin_tone:', + '🫅🏽' => ':person_with_crown_medium_skin_tone:', '🙎🏻' => ':person_with_pouting_face_tone1:', '🙎🏼' => ':person_with_pouting_face_tone2:', '🙎🏽' => ':person_with_pouting_face_tone3:', '🙎🏾' => ':person_with_pouting_face_tone4:', '🙎🏿' => ':person_with_pouting_face_tone5:', + '⛏️' => ':pick:', + '🤌🏿' => ':pinched_fingers_dark_skin_tone:', + '🤌🏻' => ':pinched_fingers_light_skin_tone:', + '🤌🏾' => ':pinched_fingers_medium_dark_skin_tone:', + '🤌🏼' => ':pinched_fingers_medium_light_skin_tone:', + '🤌🏽' => ':pinched_fingers_medium_skin_tone:', + '🤏🏿' => ':pinching_hand_dark_skin_tone:', + '🤏🏻' => ':pinching_hand_light_skin_tone:', + '🤏🏾' => ':pinching_hand_medium_dark_skin_tone:', + '🤏🏼' => ':pinching_hand_medium_light_skin_tone:', + '🤏🏽' => ':pinching_hand_medium_skin_tone:', + '⏯️' => ':play_pause:', '👇🏻' => ':point_down_tone1:', '👇🏼' => ':point_down_tone2:', '👇🏽' => ':point_down_tone3:', @@ -560,6 +2339,7 @@ '👉🏽' => ':point_right_tone3:', '👉🏾' => ':point_right_tone4:', '👉🏿' => ':point_right_tone5:', + '☝️' => ':point_up:', '👆🏻' => ':point_up_2_tone1:', '👆🏼' => ':point_up_2_tone2:', '👆🏽' => ':point_up_2_tone3:', @@ -575,6 +2355,16 @@ '🙏🏽' => ':pray_tone3:', '🙏🏾' => ':pray_tone4:', '🙏🏿' => ':pray_tone5:', + '🫃🏿' => ':pregnant_man_dark_skin_tone:', + '🫃🏻' => ':pregnant_man_light_skin_tone:', + '🫃🏾' => ':pregnant_man_medium_dark_skin_tone:', + '🫃🏼' => ':pregnant_man_medium_light_skin_tone:', + '🫃🏽' => ':pregnant_man_medium_skin_tone:', + '🫄🏿' => ':pregnant_person_dark_skin_tone:', + '🫄🏻' => ':pregnant_person_light_skin_tone:', + '🫄🏾' => ':pregnant_person_medium_dark_skin_tone:', + '🫄🏼' => ':pregnant_person_medium_light_skin_tone:', + '🫄🏽' => ':pregnant_person_medium_skin_tone:', '🤰🏻' => ':pregnant_woman_tone1:', '🤰🏼' => ':pregnant_woman_tone2:', '🤰🏽' => ':pregnant_woman_tone3:', @@ -590,11 +2380,16 @@ '👸🏽' => ':princess_tone3:', '👸🏾' => ':princess_tone4:', '👸🏿' => ':princess_tone5:', + '🖨️' => ':printer:', + '📽️' => ':projector:', '👊🏻' => ':punch_tone1:', '👊🏼' => ':punch_tone2:', '👊🏽' => ':punch_tone3:', '👊🏾' => ':punch_tone4:', '👊🏿' => ':punch_tone5:', + '🏎️' => ':race_car:', + '☢️' => ':radioactive:', + '🛤️' => ':railway_track:', '🤚🏻' => ':raised_back_of_hand_tone1:', '🤚🏼' => ':raised_back_of_hand_tone2:', '🤚🏽' => ':raised_back_of_hand_tone3:', @@ -615,11 +2410,27 @@ '🙋🏽' => ':raising_hand_tone3:', '🙋🏾' => ':raising_hand_tone4:', '🙋🏿' => ':raising_hand_tone5:', + '⏺️' => ':record_button:', + '♻️' => ':recycle:', + '®️' => ':registered:', + '☺️' => ':relaxed:', + '🎗️' => ':reminder_ribbon:', '🤜🏻' => ':right_facing_fist_tone1:', '🤜🏼' => ':right_facing_fist_tone2:', '🤜🏽' => ':right_facing_fist_tone3:', '🤜🏾' => ':right_facing_fist_tone4:', '🤜🏿' => ':right_facing_fist_tone5:', + '🫱🏿' => ':rightwards_hand_dark_skin_tone:', + '🫱🏻' => ':rightwards_hand_light_skin_tone:', + '🫱🏾' => ':rightwards_hand_medium_dark_skin_tone:', + '🫱🏼' => ':rightwards_hand_medium_light_skin_tone:', + '🫱🏽' => ':rightwards_hand_medium_skin_tone:', + '🫸🏿' => ':rightwards_pushing_hand_dark_skin_tone:', + '🫸🏻' => ':rightwards_pushing_hand_light_skin_tone:', + '🫸🏾' => ':rightwards_pushing_hand_medium_dark_skin_tone:', + '🫸🏼' => ':rightwards_pushing_hand_medium_light_skin_tone:', + '🫸🏽' => ':rightwards_pushing_hand_medium_skin_tone:', + '🏵️' => ':rosette:', '🚣🏻' => ':rowboat_tone1:', '🚣🏼' => ':rowboat_tone2:', '🚣🏽' => ':rowboat_tone3:', @@ -630,26 +2441,67 @@ '🏃🏽' => ':runner_tone3:', '🏃🏾' => ':runner_tone4:', '🏃🏿' => ':runner_tone5:', + '🈂️' => ':sa:', '🎅🏻' => ':santa_tone1:', '🎅🏼' => ':santa_tone2:', '🎅🏽' => ':santa_tone3:', '🎅🏾' => ':santa_tone4:', '🎅🏿' => ':santa_tone5:', + '🛰️' => ':satellite_orbital:', + '⚖️' => ':scales:', + '✂️' => ':scissors:', + '㊙️' => ':secret:', '🤳🏻' => ':selfie_tone1:', '🤳🏼' => ':selfie_tone2:', '🤳🏽' => ':selfie_tone3:', '🤳🏾' => ':selfie_tone4:', '🤳🏿' => ':selfie_tone5:', + '☘️' => ':shamrock:', + '🛡️' => ':shield:', + '⛩️' => ':shinto_shrine:', + '🛍️' => ':shopping_bags:', '🤷🏻' => ':shrug_tone1:', '🤷🏼' => ':shrug_tone2:', '🤷🏽' => ':shrug_tone3:', '🤷🏾' => ':shrug_tone4:', '🤷🏿' => ':shrug_tone5:', + '⛷️' => ':skier:', + '☠️' => ':skull_crossbones:', + '🏂🏿' => ':snowboarder_dark_skin_tone:', + '🏂🏻' => ':snowboarder_light_skin_tone:', + '🏂🏾' => ':snowboarder_medium_dark_skin_tone:', + '🏂🏼' => ':snowboarder_medium_light_skin_tone:', + '🏂🏽' => ':snowboarder_medium_skin_tone:', + '❄️' => ':snowflake:', + '☃️' => ':snowman2:', + '♠️' => ':spades:', + '❇️' => ':sparkle:', + '🗣️' => ':speaking_head:', + '🗨️' => ':speech_left:', + '🕷️' => ':spider:', + '🕸️' => ':spider_web:', + '🕵️' => ':spy:', '🕵🏻' => ':spy_tone1:', '🕵🏼' => ':spy_tone2:', '🕵🏽' => ':spy_tone3:', '🕵🏾' => ':spy_tone4:', '🕵🏿' => ':spy_tone5:', + '🏟️' => ':stadium:', + '☪️' => ':star_and_crescent:', + '✡️' => ':star_of_david:', + '⏹️' => ':stop_button:', + '⏱️' => ':stopwatch:', + '☀️' => ':sunny:', + '🦸🏿' => ':superhero_dark_skin_tone:', + '🦸🏻' => ':superhero_light_skin_tone:', + '🦸🏾' => ':superhero_medium_dark_skin_tone:', + '🦸🏼' => ':superhero_medium_light_skin_tone:', + '🦸🏽' => ':superhero_medium_skin_tone:', + '🦹🏿' => ':supervillain_dark_skin_tone:', + '🦹🏻' => ':supervillain_light_skin_tone:', + '🦹🏾' => ':supervillain_medium_dark_skin_tone:', + '🦹🏼' => ':supervillain_medium_light_skin_tone:', + '🦹🏽' => ':supervillain_medium_skin_tone:', '🏄🏻' => ':surfer_tone1:', '🏄🏼' => ':surfer_tone2:', '🏄🏽' => ':surfer_tone3:', @@ -660,6 +2512,8 @@ '🏊🏽' => ':swimmer_tone3:', '🏊🏾' => ':swimmer_tone4:', '🏊🏿' => ':swimmer_tone5:', + '☎️' => ':telephone:', + '🌡️' => ':thermometer:', '👎🏻' => ':thumbsdown_tone1:', '👎🏼' => ':thumbsdown_tone2:', '👎🏽' => ':thumbsdown_tone3:', @@ -670,11 +2524,29 @@ '👍🏽' => ':thumbsup_tone3:', '👍🏾' => ':thumbsup_tone4:', '👍🏿' => ':thumbsup_tone5:', + '⛈️' => ':thunder_cloud_rain:', + '🎟️' => ':tickets:', + '⏲️' => ':timer:', + '™️' => ':tm:', + '🛠️' => ':tools:', + '⏭️' => ':track_next:', + '⏮️' => ':track_previous:', + '🖲️' => ':trackball:', + '⚧️' => ':transgender_symbol:', + '🈷️' => ':u6708:', + '☂️' => ':umbrella2:', + '⚱️' => ':urn:', + '✌️' => ':v:', '✌🏻' => ':v_tone1:', '✌🏼' => ':v_tone2:', '✌🏽' => ':v_tone3:', '✌🏾' => ':v_tone4:', '✌🏿' => ':v_tone5:', + '🧛🏿' => ':vampire_dark_skin_tone:', + '🧛🏻' => ':vampire_light_skin_tone:', + '🧛🏾' => ':vampire_medium_dark_skin_tone:', + '🧛🏼' => ':vampire_medium_light_skin_tone:', + '🧛🏽' => ':vampire_medium_skin_tone:', '🖖🏻' => ':vulcan_tone1:', '🖖🏼' => ':vulcan_tone2:', '🖖🏽' => ':vulcan_tone3:', @@ -685,6 +2557,8 @@ '🚶🏽' => ':walking_tone3:', '🚶🏾' => ':walking_tone4:', '🚶🏿' => ':walking_tone5:', + '⚠️' => ':warning:', + '🗑️' => ':wastebasket:', '🤽🏻' => ':water_polo_tone1:', '🤽🏼' => ':water_polo_tone2:', '🤽🏽' => ':water_polo_tone3:', @@ -695,67 +2569,72 @@ '👋🏽' => ':wave_tone3:', '👋🏾' => ':wave_tone4:', '👋🏿' => ':wave_tone5:', + '〰️' => ':wavy_dash:', + '☸️' => ':wheel_of_dharma:', + '◻️' => ':white_medium_square:', + '▫️' => ':white_small_square:', + '🌥️' => ':white_sun_cloud:', + '🌦️' => ':white_sun_rain_cloud:', + '🌤️' => ':white_sun_small_cloud:', + '🌬️' => ':wind_blowing_face:', + '👫🏿' => ':woman_and_man_holding_hands_dark_skin_tone:', + '👫🏻' => ':woman_and_man_holding_hands_light_skin_tone:', + '👫🏾' => ':woman_and_man_holding_hands_medium_dark_skin_tone:', + '👫🏼' => ':woman_and_man_holding_hands_medium_light_skin_tone:', + '👫🏽' => ':woman_and_man_holding_hands_medium_skin_tone:', '👩🏻' => ':woman_tone1:', '👩🏼' => ':woman_tone2:', '👩🏽' => ':woman_tone3:', '👩🏾' => ':woman_tone4:', '👩🏿' => ':woman_tone5:', - '🤼🏻' => ':wrestlers_tone1:', - '🤼🏼' => ':wrestlers_tone2:', - '🤼🏽' => ':wrestlers_tone3:', - '🤼🏾' => ':wrestlers_tone4:', - '🤼🏿' => ':wrestlers_tone5:', + '🧕🏿' => ':woman_with_headscarf_dark_skin_tone:', + '🧕🏻' => ':woman_with_headscarf_light_skin_tone:', + '🧕🏾' => ':woman_with_headscarf_medium_dark_skin_tone:', + '🧕🏼' => ':woman_with_headscarf_medium_light_skin_tone:', + '🧕🏽' => ':woman_with_headscarf_medium_skin_tone:', + '👭🏿' => ':women_holding_hands_dark_skin_tone:', + '👭🏻' => ':women_holding_hands_light_skin_tone:', + '👭🏾' => ':women_holding_hands_medium_dark_skin_tone:', + '👭🏼' => ':women_holding_hands_medium_light_skin_tone:', + '👭🏽' => ':women_holding_hands_medium_skin_tone:', + '✍️' => ':writing_hand:', '✍🏻' => ':writing_hand_tone1:', '✍🏼' => ':writing_hand_tone2:', '✍🏽' => ':writing_hand_tone3:', '✍🏾' => ':writing_hand_tone4:', '✍🏿' => ':writing_hand_tone5:', + '☯️' => ':yin_yang:', '🎱' => ':8ball:', '💯' => ':100:', '🔢' => ':1234:', - '🅰' => ':a:', '🆎' => ':ab:', + '🧮' => ':abacus:', '🔤' => ':abc:', '🔡' => ':abcd:', '🉑' => ':accept:', + '🪗' => ':accordion:', + '🩹' => ':adhesive_bandage:', '🚡' => ':aerial_tramway:', - '✈' => ':airplane:', '🛬' => ':airplane_arriving:', '🛫' => ':airplane_departure:', - '🛩' => ':airplane_small:', '⏰' => ':alarm_clock:', - '⚗' => ':alembic:', '👽' => ':alien:', '🚑' => ':ambulance:', '🏺' => ':amphora:', + '🫀' => ':anatomical_heart:', '⚓' => ':anchor:', '👼' => ':angel:', '💢' => ':anger:', - '🗯' => ':anger_right:', '😠' => ':angry:', '😧' => ':anguished:', '🐜' => ':ant:', '🍎' => ':apple:', '♒' => ':aquarius:', '♈' => ':aries:', - '◀' => ':arrow_backward:', '⏬' => ':arrow_double_down:', '⏫' => ':arrow_double_up:', - '⬇' => ':arrow_down:', '🔽' => ':arrow_down_small:', - '▶' => ':arrow_forward:', - '⤵' => ':arrow_heading_down:', - '⤴' => ':arrow_heading_up:', - '⬅' => ':arrow_left:', - '↙' => ':arrow_lower_left:', - '↘' => ':arrow_lower_right:', - '➡' => ':arrow_right:', - '↪' => ':arrow_right_hook:', - '⬆' => ':arrow_up:', - '↕' => ':arrow_up_down:', '🔼' => ':arrow_up_small:', - '↖' => ':arrow_upper_left:', - '↗' => ':arrow_upper_right:', '🔃' => ':arrows_clockwise:', '🔄' => ':arrows_counterclockwise:', '🎨' => ':art:', @@ -763,85 +2642,103 @@ '😲' => ':astonished:', '👟' => ':athletic_shoe:', '🏧' => ':atm:', - '⚛' => ':atom:', + '🛺' => ':auto_rickshaw:', '🥑' => ':avocado:', - '🅱' => ':b:', + '🪓' => ':axe:', '👶' => ':baby:', '🍼' => ':baby_bottle:', '🐤' => ':baby_chick:', '🚼' => ':baby_symbol:', '🔙' => ':back:', '🥓' => ':bacon:', + '🦡' => ':badger:', '🏸' => ':badminton:', + '🥯' => ':bagel:', '🛄' => ':baggage_claim:', + '🦲' => ':bald:', + '🩰' => ':ballet_shoes:', '🎈' => ':balloon:', - '🗳' => ':ballot_box:', - '☑' => ':ballot_box_with_check:', '🎍' => ':bamboo:', '🍌' => ':banana:', - '‼' => ':bangbang:', + '🪕' => ':banjo:', '🏦' => ':bank:', '📊' => ':bar_chart:', '💈' => ':barber:', '⚾' => ':baseball:', + '🧺' => ':basket:', '🏀' => ':basketball:', - '⛹' => ':basketball_player:', '🦇' => ':bat:', '🛀' => ':bath:', '🛁' => ':bathtub:', '🔋' => ':battery:', - '🏖' => ':beach:', - '⛱' => ':beach_umbrella:', + '🫘' => ':beans:', '🐻' => ':bear:', - '🛏' => ':bed:', + '🦫' => ':beaver:', '🐝' => ':bee:', '🍺' => ':beer:', '🍻' => ':beers:', '🐞' => ':beetle:', '🔰' => ':beginner:', '🔔' => ':bell:', - '🛎' => ':bellhop:', + '🫑' => ':bell_pepper:', '🍱' => ':bento:', + '🧃' => ':beverage_box:', '🚴' => ':bicyclist:', '🚲' => ':bike:', '👙' => ':bikini:', - '☣' => ':biohazard:', + '🧢' => ':billed_cap:', '🐦' => ':bird:', '🎂' => ':birthday:', + '🦬' => ':bison:', + '🫦' => ':biting_lip:', '⚫' => ':black_circle:', '🖤' => ':black_heart:', '🃏' => ':black_joker:', '⬛' => ':black_large_square:', '◾' => ':black_medium_small_square:', - '◼' => ':black_medium_square:', - '✒' => ':black_nib:', - '▪' => ':black_small_square:', '🔲' => ':black_square_button:', '🌼' => ':blossom:', '🐡' => ':blowfish:', '📘' => ':blue_book:', '🚙' => ':blue_car:', '💙' => ':blue_heart:', + '🟦' => ':blue_square:', + '🫐' => ':blueberries:', '😊' => ':blush:', '🐗' => ':boar:', '💣' => ':bomb:', + '🦴' => ':bone:', '📖' => ':book:', '🔖' => ':bookmark:', '📑' => ':bookmark_tabs:', '📚' => ':books:', '💥' => ':boom:', + '🪃' => ':boomerang:', '👢' => ':boot:', '💐' => ':bouquet:', '🙇' => ':bow:', '🏹' => ':bow_and_arrow:', + '🥣' => ':bowl_with_spoon:', '🎳' => ':bowling:', '🥊' => ':boxing_glove:', '👦' => ':boy:', + '🧠' => ':brain:', '🍞' => ':bread:', + '🤱' => ':breast_feeding:', + '🧱' => ':brick:', '👰' => ':bride_with_veil:', '🌉' => ':bridge_at_night:', '💼' => ':briefcase:', + '🩲' => ':briefs:', + '🥦' => ':broccoli:', '💔' => ':broken_heart:', + '🧹' => ':broom:', + '🟤' => ':brown_circle:', + '🤎' => ':brown_heart:', + '🟫' => ':brown_square:', + '🧋' => ':bubble_tea:', + '🫧' => ':bubbles:', + '🪣' => ':bucket:', '🐛' => ':bug:', '💡' => ':bulb:', '🚅' => ':bullettrain_front:', @@ -851,32 +2748,31 @@ '🚏' => ':busstop:', '👤' => ':bust_in_silhouette:', '👥' => ':busts_in_silhouette:', + '🧈' => ':butter:', '🦋' => ':butterfly:', '🌵' => ':cactus:', '🍰' => ':cake:', '📆' => ':calendar:', - '🗓' => ':calendar_spiral:', '🤙' => ':call_me:', '📲' => ':calling:', '🐫' => ':camel:', '📷' => ':camera:', '📸' => ':camera_with_flash:', - '🏕' => ':camping:', '♋' => ':cancer:', - '🕯' => ':candle:', '🍬' => ':candy:', + '🥫' => ':canned_food:', '🛶' => ':canoe:', '🔠' => ':capital_abcd:', '♑' => ':capricorn:', - '🗃' => ':card_box:', '📇' => ':card_index:', '🎠' => ':carousel_horse:', + '🪚' => ':carpentry_saw:', '🥕' => ':carrot:', '🤸' => ':cartwheel:', '🐱' => ':cat:', '🐈' => ':cat2:', '💿' => ':cd:', - '⛓' => ':chains:', + '🪑' => ':chair:', '🍾' => ':champagne:', '🥂' => ':champagne_glass:', '💹' => ':chart:', @@ -888,22 +2784,20 @@ '🌸' => ':cherry_blossom:', '🌰' => ':chestnut:', '🐔' => ':chicken:', + '🧒' => ':child:', '🚸' => ':children_crossing:', - '🐿' => ':chipmunk:', '🍫' => ':chocolate_bar:', + '🥢' => ':chopsticks:', '🎄' => ':christmas_tree:', '⛪' => ':church:', '🎦' => ':cinema:', '🎪' => ':circus_tent:', '🌆' => ':city_dusk:', '🌇' => ':city_sunset:', - '🏙' => ':cityscape:', '🆑' => ':cl:', '👏' => ':clap:', '🎬' => ':clapper:', - '🏛' => ':classical_building:', '📋' => ':clipboard:', - '🕰' => ':clock:', '🕐' => ':clock1:', '🕑' => ':clock2:', '🕒' => ':clock3:', @@ -931,36 +2825,29 @@ '📕' => ':closed_book:', '🔐' => ':closed_lock_with_key:', '🌂' => ':closed_umbrella:', - '☁' => ':cloud:', - '🌩' => ':cloud_lightning:', - '🌧' => ':cloud_rain:', - '🌨' => ':cloud_snow:', - '🌪' => ':cloud_tornado:', '🤡' => ':clown:', - '♣' => ':clubs:', + '🧥' => ':coat:', + '🪳' => ':cockroach:', '🍸' => ':cocktail:', + '🥥' => ':coconut:', '☕' => ':coffee:', - '⚰' => ':coffin:', + '🪙' => ':coin:', + '🥶' => ':cold_face:', '😰' => ':cold_sweat:', - '☄' => ':comet:', - '🗜' => ':compression:', + '🧭' => ':compass:', '💻' => ':computer:', '🎊' => ':confetti_ball:', '😖' => ':confounded:', '😕' => ':confused:', - '㊗' => ':congratulations:', '🚧' => ':construction:', - '🏗' => ':construction_site:', '👷' => ':construction_worker:', - '🎛' => ':control_knobs:', '🏪' => ':convenience_store:', '🍪' => ':cookie:', '🍳' => ':cooking:', '🆒' => ':cool:', '👮' => ':cop:', - '©' => ':copyright:', + '🪸' => ':coral:', '🌽' => ':corn:', - '🛋' => ':couch:', '👫' => ':couple:', '💑' => ':couple_with_heart:', '💏' => ':couplekiss:', @@ -968,110 +2855,126 @@ '🐄' => ':cow2:', '🤠' => ':cowboy:', '🦀' => ':crab:', - '🖍' => ':crayon:', '💳' => ':credit_card:', '🌙' => ':crescent_moon:', '🏏' => ':cricket:', '🐊' => ':crocodile:', '🥐' => ':croissant:', - '✝' => ':cross:', '🎌' => ':crossed_flags:', - '⚔' => ':crossed_swords:', '👑' => ':crown:', - '🛳' => ':cruise_ship:', + '🩼' => ':crutch:', '😢' => ':cry:', '😿' => ':crying_cat_face:', '🔮' => ':crystal_ball:', '🥒' => ':cucumber:', + '🥤' => ':cup_with_straw:', + '🧁' => ':cupcake:', '💘' => ':cupid:', + '🥌' => ':curling_stone:', + '🦱' => ':curly_hair:', '➰' => ':curly_loop:', '💱' => ':currency_exchange:', '🍛' => ':curry:', '🍮' => ':custard:', '🛃' => ':customs:', + '🥩' => ':cut_of_meat:', '🌀' => ':cyclone:', - '🗡' => ':dagger:', '💃' => ':dancer:', '👯' => ':dancers:', '🍡' => ':dango:', - '🕶' => ':dark_sunglasses:', '🎯' => ':dart:', '💨' => ':dash:', '📅' => ':date:', + '🧏' => ':deaf_person:', '🌳' => ':deciduous_tree:', '🦌' => ':deer:', '🏬' => ':department_store:', - '🏜' => ':desert:', - '🖥' => ':desktop:', '💠' => ':diamond_shape_with_a_dot_inside:', - '♦' => ':diamonds:', '😞' => ':disappointed:', '😥' => ':disappointed_relieved:', - '🗂' => ':dividers:', + '🥸' => ':disguised_face:', + '🤿' => ':diving_mask:', + '🪔' => ':diya_lamp:', '💫' => ':dizzy:', '😵' => ':dizzy_face:', + '🧬' => ':dna:', '🚯' => ':do_not_litter:', + '🦤' => ':dodo:', '🐶' => ':dog:', '🐕' => ':dog2:', '💵' => ':dollar:', '🎎' => ':dolls:', '🐬' => ':dolphin:', + '🫏' => ':donkey:', '🚪' => ':door:', + '🫥' => ':dotted_line_face:', '🍩' => ':doughnut:', - '🕊' => ':dove:', '🐉' => ':dragon:', '🐲' => ':dragon_face:', '👗' => ':dress:', '🐪' => ':dromedary_camel:', '🤤' => ':drooling_face:', + '🩸' => ':drop_of_blood:', '💧' => ':droplet:', '🥁' => ':drum:', '🦆' => ':duck:', + '🥟' => ':dumpling:', '📀' => ':dvd:', '📧' => ':e-mail:', '🦅' => ':eagle:', '👂' => ':ear:', '🌾' => ':ear_of_rice:', + '🦻' => ':ear_with_hearing_aid:', '🌍' => ':earth_africa:', '🌎' => ':earth_americas:', '🌏' => ':earth_asia:', '🥚' => ':egg:', '🍆' => ':eggplant:', - '✴' => ':eight_pointed_black_star:', - '✳' => ':eight_spoked_asterisk:', - '⏏' => ':eject:', '🔌' => ':electric_plug:', 10000 '🐘' => ':elephant:', + '🛗' => ':elevator:', + '🧝' => ':elf:', + '🪹' => ':empty_nest:', '🔚' => ':end:', - '✉' => ':envelope:', '📩' => ':envelope_with_arrow:', '💶' => ':euro:', '🏰' => ':european_castle:', '🏤' => ':european_post_office:', '🌲' => ':evergreen_tree:', '❗' => ':exclamation:', + '🤯' => ':exploding_head:', '😑' => ':expressionless:', - '👁' => ':eye:', '👓' => ':eyeglasses:', '👀' => ':eyes:', + '🥹' => ':face_holding_back_tears:', '🤦' => ':face_palm:', + '🤮' => ':face_vomiting:', + '🫤' => ':face_with_diagonal_mouth:', + '🤭' => ':face_with_hand_over_mouth:', + '🧐' => ':face_with_monocle:', + '🫢' => ':face_with_open_eyes_and_hand_over_mouth:', + '🫣' => ':face_with_peeking_eye:', + '🤨' => ':face_with_raised_eyebrow:', + '🤬' => ':face_with_symbols_on_mouth:', '🏭' => ':factory:', + '🧚' => ':fairy:', + '🧆' => ':falafel:', '🍂' => ':fallen_leaf:', '👪' => ':family:', '⏩' => ':fast_forward:', '📠' => ':fax:', '😨' => ':fearful:', + '🪶' => ':feather:', '🐾' => ':feet:', '🤺' => ':fencer:', '🎡' => ':ferris_wheel:', - '⛴' => ':ferry:', '🏑' => ':field_hockey:', - '🗄' => ':file_cabinet:', '📁' => ':file_folder:', - '🎞' => ':film_frames:', '🤞' => ':fingers_crossed:', '🔥' => ':fire:', '🚒' => ':fire_engine:', + '🧯' => ':fire_extinguisher:', + '🧨' => ':firecracker:', '🎆' => ':fireworks:', '🥇' => ':first_place:', '🌓' => ':first_quarter_moon:', @@ -1081,65 +2984,80 @@ '🎣' => ':fishing_pole_and_fish:', '✊' => ':fist:', '🏴' => ':flag_black:', - '🏳' => ':flag_white:', '🎏' => ':flags:', + '🦩' => ':flamingo:', '🔦' => ':flashlight:', - '⚜' => ':fleur-de-lis:', + '🥿' => ':flat_shoe:', + '🫓' => ':flatbread:', '💾' => ':floppy_disk:', '🎴' => ':flower_playing_cards:', '😳' => ':flushed:', - '🌫' => ':fog:', + '🪈' => ':flute:', + '🪰' => ':fly:', + '🥏' => ':flying_disc:', + '🛸' => ':flying_saucer:', '🌁' => ':foggy:', + '🪭' => ':folding_hand_fan:', + '🫕' => ':fondue:', + '🦶' => ':foot:', '🏈' => ':football:', '👣' => ':footprints:', '🍴' => ':fork_and_knife:', - '🍽' => ':fork_knife_plate:', + '🥠' => ':fortune_cookie:', '⛲' => ':fountain:', '🍀' => ':four_leaf_clover:', '🦊' => ':fox:', - '🖼' => ':frame_photo:', '🆓' => ':free:', '🥖' => ':french_bread:', '🍤' => ':fried_shrimp:', '🍟' => ':fries:', '🐸' => ':frog:', '😦' => ':frowning:', - '☹' => ':frowning2:', '⛽' => ':fuelpump:', '🌕' => ':full_moon:', '🌝' => ':full_moon_with_face:', '🎲' => ':game_die:', - '⚙' => ':gear:', + '🧄' => ':garlic:', '💎' => ':gem:', '♊' => ':gemini:', + '🧞' => ':genie:', '👻' => ':ghost:', '🎁' => ':gift:', '💝' => ':gift_heart:', + '🫚' => ':ginger_root:', + '🦒' => ':giraffe:', '👧' => ':girl:', '🌐' => ':globe_with_meridians:', + '🧤' => ':gloves:', '🥅' => ':goal:', '🐐' => ':goat:', + '🥽' => ':goggles:', '⛳' => ':golf:', - '🏌' => ':golfer:', + '🪿' => ':goose:', '🦍' => ':gorilla:', '🍇' => ':grapes:', '🍏' => ':green_apple:', '📗' => ':green_book:', + '🟢' => ':green_circle:', '💚' => ':green_heart:', + '🟩' => ':green_square:', '❕' => ':grey_exclamation:', + '🩶' => ':grey_heart:', '❔' => ':grey_question:', '😬' => ':grimacing:', '😁' => ':grin:', '😀' => ':grinning:', '💂' => ':guardsman:', + '🦮' => ':guide_dog:', '🎸' => ':guitar:', '🔫' => ':gun:', + '🪮' => ':hair_pick:', '💇' => ':haircut:', '🍔' => ':hamburger:', '🔨' => ':hammer:', - '⚒' => ':hammer_pick:', + '🪬' => ':hamsa:', '🐹' => ':hamster:', - '🖐' => ':hand_splayed:', + '🫰' => ':hand_with_index_finger_and_thumb_crossed:', '👜' => ':handbag:', '🤾' => ':handball:', '🤝' => ':handshake:', @@ -1147,74 +3065,74 @@ '🐣' => ':hatching_chick:', '🤕' => ':head_bandage:', '🎧' => ':headphones:', + '🪦' => ':headstone:', '🙉' => ':hear_no_evil:', - '❤' => ':heart:', '💟' => ':heart_decoration:', - '❣' => ':heart_exclamation:', '😍' => ':heart_eyes:', '😻' => ':heart_eyes_cat:', + '🫶' => ':heart_hands:', '💓' => ':heartbeat:', '💗' => ':heartpulse:', - '♥' => ':hearts:', - '✔' => ':heavy_check_mark:', '➗' => ':heavy_division_sign:', '💲' => ':heavy_dollar_sign:', + '🟰' => ':heavy_equals_sign:', '➖' => ':heavy_minus_sign:', - '✖' => ':heavy_multiplication_x:', '➕' => ':heavy_plus_sign:', + '🦔' => ':hedgehog:', '🚁' => ':helicopter:', - '⛑' => ':helmet_with_cross:', '🌿' => ':herb:', '🌺' => ':hibiscus:', '🔆' => ':high_brightness:', '👠' => ':high_heel:', + '🥾' => ':hiking_boot:', + '🛕' => ':hindu_temple:', + '🦛' => ':hippopotamus:', '🏒' => ':hockey:', - '🕳' => ':hole:', - '🏘' => ':homes:', '🍯' => ':honey_pot:', + '🪝' => ':hook:', '🐴' => ':horse:', '🏇' => ':horse_racing:', '🏥' => ':hospital:', - '🌶' => ':hot_pepper:', + '🥵' => ':hot_face:', '🌭' => ':hotdog:', '🏨' => ':hotel:', - '♨' => ':hotsprings:', '⌛' => ':hourglass:', '⏳' => ':hourglass_flowing_sand:', '🏠' => ':house:', - '🏚' => ':house_abandoned:', '🏡' => ':house_with_garden:', '🤗' => ':hugging:', '😯' => ':hushed:', + '🛖' => ':hut:', + '🪻' => ':hyacinth:', + '🧊' => ':ice:', '🍨' => ':ice_cream:', - '⛸' => ':ice_skate:', '🍦' => ':icecream:', '🆔' => ':id:', + '🪪' => ':identification_card:', '🉐' => ':ideograph_advantage:', '👿' => ':imp:', '📥' => ':inbox_tray:', '📨' => ':incoming_envelope:', + '🫵' => ':index_pointing_at_the_viewer:', '💁' => ':information_desk_person:', - 'ℹ' => ':information_source:', '😇' => ':innocent:', - '⁉' => ':interrobang:', '📱' => ':iphone:', - '🏝' => ':island:', '🏮' => ':izakaya_lantern:', '🎃' => ':jack_o_lantern:', '🗾' => ':japan:', '🏯' => ':japanese_castle:', '👺' => ':japanese_goblin:', '👹' => ':japanese_ogre:', + '🫙' => ':jar:', '👖' => ':jeans:', + '🪼' => ':jellyfish:', '😂' => ':joy:', '😹' => ':joy_cat:', - '🕹' => ':joystick:', '🤹' => ':juggling:', '🕋' => ':kaaba:', + '🦘' => ':kangaroo:', '🔑' => ':key:', - '🗝' => ':key2:', - '⌨' => ':keyboard:', + '🪯' => ':khanda:', '👘' => ':kimono:', '💋' => ':kiss:', '😗' => ':kissing:', @@ -1222,82 +3140,106 @@ '😚' => ':kissing_closed_eyes:', '😘' => ':kissing_heart:', '😙' => ':kissing_smiling_eyes:', + '🪁' => ':kite:', '🥝' => ':kiwi:', '🔪' => ':knife:', + '🪢' => ':knot:', '🐨' => ':koala:', '🈁' => ':koko:', - '🏷' => ':label:', + '🥼' => ':lab_coat:', + '🥍' => ':lacrosse:', + '🪜' => ':ladder:', '🔵' => ':large_blue_circle:', '🔷' => ':large_blue_diamond:', '🔶' => ':large_orange_diamond:', '🌗' => ':last_quarter_moon:', '🌜' => ':last_quarter_moon_with_face:', '😆' => ':laughing:', + '🥬' => ':leafy_green:', '🍃' => ':leaves:', '📒' => ':ledger:', '🤛' => ':left_facing_fist:', '🛅' => ':left_luggage:', - '↔' => ':left_right_arrow:', - '↩' => ':leftwards_arrow_with_hook:', + '🫲' => ':leftwards_hand:', + '🫷' => ':leftwards_pushing_hand:', + '🦵' => ':leg:', '🍋' => ':lemon:', '♌' => ':leo:', '🐆' => ':leopard:', - '🎚' => ':level_slider:', - '🕴' => ':levitate:', '♎' => ':libra:', - '🏋' => ':lifter:', + '🩵' => ':light_blue_heart:', '🚈' => ':light_rail:', '🔗' => ':link:', '🦁' => ':lion_face:', '👄' => ':lips:', '💄' => ':lipstick:', '🦎' => ':lizard:', + '🦙' => ':llama:', + '🦞' => ':lobster:', '🔒' => ':lock:', '🔏' => ':lock_with_ink_pen:', '🍭' => ':lollipop:', + '🪘' => ':long_drum:', '➿' => ':loop:', + '🧴' => ':lotion_bottle:', + '🪷' => ':lotus:', '🔊' => ':loud_sound:', '📢' => ':loudspeaker:', '🏩' => ':love_hotel:', '💌' => ':love_letter:', + '🤟' => ':love_you_gesture:', + '🪫' => ':low_battery:', '🔅' => ':low_brightness:', + '🧳' => ':luggage:', + '🫁' => ':lungs:', '🤥' => ':lying_face:', - 'Ⓜ' => ':m:', '🔍' => ':mag:', '🔎' => ':mag_right:', + '🧙' => ':mage:', + '🪄' => ':magic_wand:', + '🧲' => ':magnet:', '🀄' => ':mahjong:', '📫' => ':mailbox:', '📪' => ':mailbox_closed:', '📬' => ':mailbox_with_mail:', '📭' => ':mailbox_with_no_mail:', + '🦣' => ':mammoth:', '👨' => ':man:', '🕺' => ':man_dancing:', - '🤵' => ':man_in_tuxedo:', '👲' => ':man_with_gua_pi_mao:', '👳' => ':man_with_turban:', + '🥭' => ':mango:', '👞' => ':mans_shoe:', - '🗺' => ':map:', + '🦽' => ':manual_wheelchair:', '🍁' => ':maple_leaf:', + '🪇' => ':maracas:', '🥋' => ':martial_arts_uniform:', '😷' => ':mask:', '💆' => ':massage:', + '🧉' => ':mate:', '🍖' => ':meat_on_bone:', + '🦾' => ':mechanical_arm:', + '🦿' => ':mechanical_leg:', '🏅' => ':medal:', '📣' => ':mega:', '🍈' => ':melon:', + '🫠' => ':melting_face:', '🕎' => ':menorah:', '🚹' => ':mens:', + '🧜' => ':merperson:', '🤘' => ':metal:', '🚇' => ':metro:', + '🦠' => ':microbe:', '🎤' => ':microphone:', - '🎙' => ':microphone2:', '🔬' => ':microscope:', '🖕' => ':middle_finger:', - '🎖' => ':military_medal:', + '🪖' => ':military_helmet:', '🥛' => ':milk:', '🌌' => ':milky_way:', '🚐' => ':minibus:', '💽' => ':minidisc:', + '🪞' => ':mirror:', + '🪩' => ':mirror_ball:', '📴' => ':mobile_phone_off:', '🤑' => ':money_mouth:', '💸' => ':money_with_wings:', @@ -1305,21 +3247,20 @@ '🐒' => ':monkey:', '🐵' => ':monkey_face:', '🚝' => ':monorail:', + '🥮' => ':moon_cake:', + '🫎' => ':moose:', '🎓' => ':mortar_board:', '🕌' => ':mosque:', + '🦟' => ':mosquito:', '🛵' => ':motor_scooter:', - '🛥' => ':motorboat:', - '🏍' => ':motorcycle:', - '🛣' => ':motorway:', + '🦼' => ':motorized_wheelchair:', '🗻' => ':mount_fuji:', - '⛰' => ':mountain:', '🚵' => ':mountain_bicyclist:', '🚠' => ':mountain_cableway:', '🚞' => ':mountain_railway:', - '🏔' => ':mountain_snow:', '🐭' => ':mouse:', '🐁' => ':mouse2:', - '🖱' => ':mouse_three_button:', + '🪤' => ':mouse_trap:', '🎥' => ':movie_camera:', '🗿' => ':moyai:', '🤶' => ':mrs_claus:', @@ -1332,17 +3273,20 @@ '💅' => ':nail_care:', '📛' => ':name_badge:', '🤢' => ':nauseated_face:', + '🧿' => ':nazar_amulet:', '👔' => ':necktie:', '❎' => ':negative_squared_cross_mark:', '🤓' => ':nerd:', + '🪺' => ':nest_with_eggs:', + '🪆' => ':nesting_dolls:', '😐' => ':neutral_face:', '🆕' => ':new:', '🌑' => ':new_moon:', '🌚' => ':new_moon_with_face:', '📰' => ':newspaper:', - '🗞' => ':newspaper2:', '🆖' => ':ng:', '🌃' => ':night_with_stars:', + '🥷' => ':ninja:', '🔕' => ':no_bell:', '🚳' => ':no_bicycles:', '⛔' => ':no_entry:', @@ -1356,83 +3300,103 @@ '👃' => ':nose:', '📓' => ':notebook:', '📔' => ':notebook_with_decorative_cover:', - '🗒' => ':notepad_spiral:', '🎶' => ':notes:', '🔩' => ':nut_and_bolt:', '⭕' => ':o:', - '🅾' => ':o2:', '🌊' => ':ocean:', '🛑' => ':octagonal_sign:', '🐙' => ':octopus:', '🍢' => ':oden:', '🏢' => ':office:', - '🛢' => ':oil:', '🆗' => ':ok:', '👌' => ':ok_hand:', '🙆' => ':ok_woman:', '👴' => ':older_man:', + '🧓' => ':older_person:', '👵' => ':older_woman:', - '🕉' => ':om_symbol:', + '🫒' => ':olive:', '🔛' => ':on:', '🚘' => ':oncoming_automobile:', '🚍' => ':oncoming_bus:', '🚔' => ':oncoming_police_car:', '🚖' => ':oncoming_taxi:', + '🩱' => ':one_piece_swimsuit:', + '🧅' => ':onion:', '📂' => ':open_file_folder:', '👐' => ':open_hands:', '😮' => ':open_mouth:', '⛎' => ':ophiuchus:', '📙' => ':orange_book:', - '☦' => ':orthodox_cross:', + '🟠' => ':orange_circle:', + '🧡' => ':orange_heart:', + '🟧' => ':orange_square:', + '🦧' => ':orangutan:', + '🦦' => ':otter:', '📤' => ':outbox_tray:', '🦉' => ':owl:', '🐂' => ':ox:', + '🦪' => ':oyster:', '📦' => ':package:', '📄' => ':page_facing_up:', '📃' => ':page_with_curl:', '📟' => ':pager:', - '🖌' => ':paintbrush:', + '🫳' => ':palm_down_hand:', '🌴' => ':palm_tree:', + '🫴' => ':palm_up_hand:', + '🤲' => ':palms_up_together:', '🥞' => ':pancakes:', '🐼' => ':panda_face:', '📎' => ':paperclip:', - '🖇' => ':paperclips:', - '🏞' => ':park:', - '🅿' => ':parking:', - '〽' => ':part_alternation_mark:', + '🪂' => ':parachute:', + '🦜' => ':parrot:', '⛅' => ':partly_sunny:', + '🥳' => ':partying_face:', '🛂' => ':passport_control:', - '⏸' => ':pause_button:', - '☮' => ':peace:', + '🫛' => ':pea_pod:', '🍑' => ':peach:', + '🦚' => ':peacock:', '🥜' => ':peanuts:', '🍐' => ':pear:', - '🖊' => ':pen_ballpoint:', - '🖋' => ':pen_fountain:', '📝' => ':pencil:', - '✏' => ':pencil2:', '🐧' => ':penguin:', '😔' => ':pensive:', + '🫂' => ':people_hugging:', '🎭' => ':performing_arts:', '😣' => ':persevere:', + '🧑' => ':person:', + '🧔' => ':person_beard:', + '🧗' => ':person_climbing:', '🙍' => ':person_frowning:', + '🧘' => ':person_in_lotus_position:', + '🧖' => ':person_in_steamy_room:', + '🧎' => ':person_kneeling:', + '🧍' => ':person_standing:', '👱' => ':person_with_blond_hair:', + '🫅' => ':person_with_crown:', '🙎' => ':person_with_pouting_face:', - '⛏' => ':pick:', + '🧫' => ':petri_dish:', + '🛻' => ':pickup_truck:', + '🥧' => ':pie:', '🐷' => ':pig:', '🐖' => ':pig2:', '🐽' => ':pig_nose:', '💊' => ':pill:', + '🪅' => ':pinata:', + '🤌' => ':pinched_fingers:', + '🤏' => ':pinching_hand:', '🍍' => ':pineapple:', '🏓' => ':ping_pong:', + '🩷' => ':pink_heart:', '♓' => ':pisces:', '🍕' => ':pizza:', + '🪧' => ':placard:', '🛐' => ':place_of_worship:', - '⏯' => ':play_pause:', + '🛝' => ':playground_slide:', + '🥺' => ':pleading_face:', + '🪠' => ':plunger:', '👇' => ':point_down:', '👈' => ':point_left:', '👉' => ':point_right:', - '☝' => ':point_up:', '👆' => ':point_up_2:', '🚓' => ':police_car:', '🐩' => ':poodle:', @@ -1443,33 +3407,37 @@ '📮' => ':postbox:', '🚰' => ':potable_water:', '🥔' => ':potato:', + '🪴' => ':potted_plant:', '👝' => ':pouch:', '🍗' => ':poultry_leg:', '💷' => ':pound:', + '🫗' => ':pouring_liquid:', '😾' => ':pouting_cat:', '🙏' => ':pray:', '📿' => ':prayer_beads:', + '🫃' => ':pregnant_man:', + '🫄' => ':pregnant_person:', '🤰' => ':pregnant_woman:', + '🥨' => ':pretzel:', '🤴' => ':prince:', '👸' => ':princess:', - '🖨' => ':printer:', - '📽' => ':projector:', '👊' => ':punch:', + '🟣' => ':purple_circle:', '💜' => ':purple_heart:', + '🟪' => ':purple_square:', '👛' => ':purse:', '📌' => ':pushpin:', '🚮' => ':put_litter_in_its_place:', + '🧩' => ':puzzle_piece:', '❓' => ':question:', '🐰' => ':rabbit:', '🐇' => ':rabbit2:', - '🏎' => ':race_car:', + '🦝' => ':raccoon:', '🐎' => ':racehorse:', '📻' => ':radio:', '🔘' => ':radio_button:', - '☢' => ':radioactive:', '😡' => ':rage:', '🚃' => ':railway_car:', - '🛤' => ':railway_track:', '🌈' => ':rainbow:', '🤚' => ':raised_back_of_hand:', '✋' => ':raised_hand:', @@ -1478,14 +3446,14 @@ '🐏' => ':ram:', '🍜' => ':ramen:', '🐀' => ':rat:', - '⏺' => ':record_button:', - '♻' => ':recycle:', + '🪒' => ':razor:', + '🧾' => ':receipt:', '🚗' => ':red_car:', '🔴' => ':red_circle:', - '®' => ':registered:', - '☺' => ':relaxed:', + '🧧' => ':red_envelope:', + '🦰' => ':red_hair:', + '🟥' => ':red_square:', '😌' => ':relieved:', - '🎗' => ':reminder_ribbon:', '🔁' => ':repeat:', '🔂' => ':repeat_one:', '🚻' => ':restroom:', @@ -1498,74 +3466,87 @@ '🍘' => ':rice_cracker:', '🎑' => ':rice_scene:', '🤜' => ':right_facing_fist:', + '🫱' => ':rightwards_hand:', + '🫸' => ':rightwards_pushing_hand:', '💍' => ':ring:', + '🛟' => ':ring_buoy:', + '🪐' => ':ringed_planet:', '🤖' => ':robot:', + '🪨' => ':rock:', '🚀' => ':rocket:', '🤣' => ':rofl:', + '🧻' => ':roll_of_paper:', '🎢' => ':roller_coaster:', + '🛼' => ':roller_skate:', '🙄' => ':rolling_eyes:', '🐓' => ':rooster:', '🌹' => ':rose:', - '🏵' => ':rosette:', '🚨' => ':rotating_light:', '📍' => ':round_pushpin:', '🚣' => ':rowboat:', '🏉' => ':rugby_football:', '🏃' => ':runner:', '🎽' => ':running_shirt_with_sash:', - '🈂' => ':sa:', + '🧷' => ':safety_pin:', + '🦺' => ':safety_vest:', '♐' => ':sagittarius:', '⛵' => ':sailboat:', '🍶' => ':sake:', '🥗' => ':salad:', + '🧂' => ':salt:', + '🫡' => ':saluting_face:', '👡' => ':sandal:', + '🥪' => ':sandwich:', '🎅' => ':santa:', + '🥻' => ':sari:', '📡' => ':satellite:', - '🛰' => ':satellite_orbital:', + '🦕' => ':sauropod:', '🎷' => ':saxophone:', - '⚖' => ':scales:', + '🧣' => ':scarf:', '🏫' => ':school:', '🎒' => ':school_satchel:', - '✂' => ':scissors:', '🛴' => ':scooter:', '🦂' => ':scorpion:', '♏' => ':scorpius:', '😱' => ':scream:', '🙀' => ':scream_cat:', + '🪛' => ':screwdriver:', '📜' => ':scroll:', + '🦭' => ':seal:', '💺' => ':seat:', '🥈' => ':second_place:', - '㊙' => ':secret:', '🙈' => ':see_no_evil:', '🌱' => ':seedling:', '🤳' => ':selfie:', + '🪡' => ':sewing_needle:', + '🫨' => ':shaking_face:', '🥘' => ':shallow_pan_of_food:', - '☘' => ':shamrock:', '🦈' => ':shark:', '🍧' => ':shaved_ice:', '🐑' => ':sheep:', '🐚' => ':shell:', - '🛡' => ':shield:', - '⛩' => ':shinto_shrine:', '🚢' => ':ship:', '👕' => ':shirt:', - '🛍' => ':shopping_bags:', '🛒' => ':shopping_cart:', + '🩳' => ':shorts:', '🚿' => ':shower:', '🦐' => ':shrimp:', '🤷' => ':shrug:', + '🤫' => ':shushing_face:', '📶' => ':signal_strength:', '🔯' => ':six_pointed_star:', + '🛹' => ':skateboard:', '🎿' => ':ski:', - '⛷' => ':skier:', '💀' => ':skull:', - '☠' => ':skull_crossbones:', + '🦨' => ':skunk:', + '🛷' => ':sled:', '😴' => ':sleeping:', '🛌' => ':sleeping_accommodation:', '😪' => ':sleepy:', '🙁' => ':slight_frown:', '🙂' => ':slight_smile:', '🎰' => ':slot_machine:', + '🦥' => ':sloth:', '🔹' => ':small_blue_diamond:', '🔸' => ':small_orange_diamond:', '🔺' => ':small_red_triangle:', @@ -1574,6 +3555,8 @@ '😸' => ':smile_cat:', '😃' => ':smiley:', '😺' => ':smiley_cat:', + '🥰' => ':smiling_face_with_hearts:', + '🥲' => ':smiling_face_with_tear:', '😈' => ':smiling_imp:', '😏' => ':smirk:', '😼' => ':smirk_cat:', @@ -1582,44 +3565,36 @@ '🐍' => ':snake:', '🤧' => ':sneezing_face:', '🏂' => ':snowboarder:', - '❄' => ':snowflake:', '⛄' => ':snowman:', - '☃' => ':snowman2:', + '🧼' => ':soap:', '😭' => ':sob:', '⚽' => ':soccer:', + '🧦' => ':socks:', + '🥎' => ':softball:', '🔜' => ':soon:', '🆘' => ':sos:', '🔉' => ':sound:', '👾' => ':space_invader:', - '♠' => ':spades:', '🍝' => ':spaghetti:', - '❇' => ':sparkle:', '🎇' => ':sparkler:', '✨' => ':sparkles:', '💖' => ':sparkling_heart:', '🙊' => ':speak_no_evil:', '🔈' => ':speaker:', - '🗣' => ':speaking_head:', '💬' => ':speech_balloon:', - '🗨' => ':speech_left:', '🚤' => ':speedboat:', - '🕷' => ':spider:', - '🕸' => ':spider_web:', + '🧽' => ':sponge:', '🥄' => ':spoon:', - '🕵' => ':spy:', '🦑' => ':squid:', - '🏟' => ':stadium:', '⭐' => ':star:', '🌟' => ':star2:', - '☪' => ':star_and_crescent:', - '✡' => ':star_of_david:', + '🤩' => ':star_struck:', '🌠' => ':stars:', '🚉' => ':station:', '🗽' => ':statue_of_liberty:', '🚂' => ':steam_locomotive:', + '🩺' => ':stethoscope:', '🍲' => ':stew:', - '⏹' => ':stop_button:', - '⏱' => ':stopwatch:', '📏' => ':straight_ruler:', '🍓' => ':strawberry:', '😛' => ':stuck_out_tongue:', @@ -1629,12 +3604,14 @@ '🌞' => ':sun_with_face:', '🌻' => ':sunflower:', '😎' => ':sunglasses:', - '☀' => ':sunny:', '🌅' => ':sunrise:', '🌄' => ':sunrise_over_mountains:', + '🦸' => ':superhero:', + '🦹' => ':supervillain:', '🏄' => ':surfer:', '🍣' => ':sushi:', '🚟' => ':suspension_railway:', + '🦢' => ':swan:', '😓' => ':sweat:', '💦' => ':sweat_drops:', '😅' => ':sweat_smile:', @@ -1643,34 +3620,36 @@ '🔣' => ':symbols:', '🕍' => ':synagogue:', '💉' => ':syringe:', + '🦖' => ':t_rex:', '🌮' => ':taco:', '🎉' => ':tada:', + '🥡' => ':takeout_box:', + '🫔' => ':tamale:', '🎋' => ':tanabata_tree:', '🍊' => ':tangerine:', '♉' => ':taurus:', '🚕' => ':taxi:', '🍵' => ':tea:', - '☎' => ':telephone:', + '🫖' => ':teapot:', + '🧸' => ':teddy_bear:', '📞' => ':telephone_receiver:', '🔭' => ':telescope:', '🔟' => ':ten:', '🎾' => ':tennis:', '⛺' => ':tent:', - '🌡' => ':thermometer:', + '🧪' => ':test_tube:', '🤒' => ':thermometer_face:', '🤔' => ':thinking:', '🥉' => ':third_place:', + '🩴' => ':thong_sandal:', '💭' => ':thought_balloon:', + '🧵' => ':thread:', '👎' => ':thumbsdown:', '👍' => ':thumbsup:', - '⛈' => ':thunder_cloud_rain:', '🎫' => ':ticket:', - '🎟' => ':tickets:', '🐯' => ':tiger:', '🐅' => ':tiger2:', - '⏲' => ':timer:', '😫' => ':tired_face:', - '™' => ':tm:', '🚽' => ':toilet:', '🗼' => ':tokyo_tower:', '🍅' => ':tomato:', @@ -1680,12 +3659,11 @@ '🏾' => ':tone4:', '🏿' => ':tone5:', '👅' => ':tongue:', - '🛠' => ':tools:', + '🧰' => ':toolbox:', + '🦷' => ':tooth:', + '🪥' => ':toothbrush:', '🔝' => ':top:', '🎩' => ':tophat:', - '⏭' => ':track_next:', - '⏮' => ':track_previous:', - '🖲' => ':trackball:', '🚜' => ':tractor:', '🚥' => ':traffic_light:', '🚋' => ':train:', @@ -1695,6 +3673,7 @@ '📐' => ':triangular_ruler:', '🔱' => ':trident:', '😤' => ':triumph:', + '🧌' => ':troll:', '🚎' => ':trolleybus:', '🏆' => ':trophy:', '🍹' => ':tropical_drink:', @@ -1716,21 +3695,18 @@ '🈹' => ':u5272:', '🈴' => ':u5408:', '🈯' => ':u6307:', - '🈷' => ':u6708:', '🈶' => ':u6709:', '🈚' => ':u7121:', '🈸' => ':u7533:', '🈲' => ':u7981:', '☔' => ':umbrella:', - '☂' => ':umbrella2:', '😒' => ':unamused:', '🔞' => ':underage:', '🦄' => ':unicorn:', '🔓' => ':unlock:', '🆙' => ':up:', '🙃' => ':upside_down:', - '⚱' => ':urn:', - '✌' => ':v:', + '🧛' => ':vampire:', '🚦' => ':vertical_traffic_light:', '📼' => ':vhs:', '📳' => ':vibration_mode:', @@ -1742,17 +3718,15 @@ '🏐' => ':volleyball:', '🆚' => ':vs:', '🖖' => ':vulcan:', + '🧇' => ':waffle:', '🚶' => ':walking:', '🌘' => ':waning_crescent_moon:', '🌖' => ':waning_gibbous_moon:', - '⚠' => ':warning:', - '🗑' => ':wastebasket:', '⌚' => ':watch:', '🐃' => ':water_buffalo:', '🤽' => ':water_polo:', '🍉' => ':watermelon:', '👋' => ':wave:', - '〰' => ':wavy_dash:', '🌒' => ':waxing_crescent_moon:', '🌔' => ':waxing_gibbous_moon:', '🚾' => ':wc:', @@ -1760,39 +3734,50 @@ '💒' => ':wedding:', '🐳' => ':whale:', '🐋' => ':whale2:', - '☸' => ':wheel_of_dharma:', + '🛞' => ':wheel:', '♿' => ':wheelchair:', + '🦯' => ':white_cane:', '✅' => ':white_check_mark:', '⚪' => ':white_circle:', '💮' => ':white_flower:', + '🦳' => ':white_hair:', + '🤍' => ':white_heart:', '⬜' => ':white_large_square:', '◽' => ':white_medium_small_square:', - '◻' => ':white_medium_square:', - '▫' => ':white_small_square:', '🔳' => ':white_square_button:', - '🌥' => ':white_sun_cloud:', - '🌦' => ':white_sun_rain_cloud:', - '🌤' => ':white_sun_small_cloud:', '🥀' => ':wilted_rose:', - '🌬' => ':wind_blowing_face:', '🎐' => ':wind_chime:', + '🪟' => ':window:', '🍷' => ':wine_glass:', + '🪽' => ':wing:', '😉' => ':wink:', + '🛜' => ':wireless:', '🐺' => ':wolf:', '👩' => ':woman:', + '🧕' => ':woman_with_headscarf:', '👚' => ':womans_clothes:', '👒' => ':womans_hat:', '🚺' => ':womens:', + '🪵' => ':wood:', + '🥴' => ':woozy_face:', + '🪱' => ':worm:', '😟' => ':worried:', '🔧' => ':wrench:', '🤼' => ':wrestlers:', - '✍' => ':writing_hand:', '❌' => ':x:', + '🩻' => ':x_ray:', + '🧶' => ':yarn:', + '🥱' => ':yawning_face:', + '🟡' => ':yellow_circle:', '💛' => ':yellow_heart:', + '🟨' => ':yellow_square:', '💴' => ':yen:', - '☯' => ':yin_yang:', + '🪀' => ':yo_yo:', '😋' => ':yum:', + '🤪' => ':zany_face:', '⚡' => ':zap:', + '🦓' => ':zebra:', '🤐' => ':zipper_mouth:', + '🧟' => ':zombie:', '💤' => ':zzz:', ]; diff --git a/src/Symfony/Component/Emoji/Resources/data/emoji-text.php b/src/Symfony/Component/Emoji/Resources/data/emoji-text.php index 6173fd4edbb7b..217df8e8350f1 100644 --- a/src/Symfony/Component/Emoji/Resources/data/emoji-text.php +++ b/src/Symfony/Component/Emoji/Resources/data/emoji-text.php @@ -1,9 +1,229 @@ ':kiss-man-man-dark-skin-tone:', + '👨🏿‍❤️‍💋‍👨🏻' => ':kiss-man-man-dark-skin-tone-light-skin-tone:', + '👨🏿‍❤️‍💋‍👨🏾' => ':kiss-man-man-dark-skin-tone-medium-dark-skin-tone:', + '👨🏿‍❤️‍💋‍👨🏼' => ':kiss-man-man-dark-skin-tone-medium-light-skin-tone:', + '👨🏿‍❤️‍💋‍👨🏽' => ':kiss-man-man-dark-skin-tone-medium-skin-tone:', + '👨🏻‍❤️‍💋‍👨🏻' => ':kiss-man-man-light-skin-tone:', + '👨🏻‍❤️‍💋‍👨🏿' => ':kiss-man-man-light-skin-tone-dark-skin-tone:', + '👨🏻‍❤️‍💋‍👨🏾' => ':kiss-man-man-light-skin-tone-medium-dark-skin-tone:', + '👨🏻‍❤️‍💋‍👨🏼' => ':kiss-man-man-light-skin-tone-medium-light-skin-tone:', + '👨🏻‍❤️‍💋‍👨🏽' => ':kiss-man-man-light-skin-tone-medium-skin-tone:', + '👨🏾‍❤️‍💋‍👨🏾' => ':kiss-man-man-medium-dark-skin-tone:', + '👨🏾‍❤️‍💋‍👨🏿' => ':kiss-man-man-medium-dark-skin-tone-dark-skin-tone:', + '👨🏾‍❤️‍💋‍👨🏻' => ':kiss-man-man-medium-dark-skin-tone-light-skin-tone:', + '👨🏾‍❤️‍💋‍👨🏼' => ':kiss-man-man-medium-dark-skin-tone-medium-light-skin-tone:', + '👨🏾‍❤️‍💋‍👨🏽' => ':kiss-man-man-medium-dark-skin-tone-medium-skin-tone:', + '👨🏼‍❤️‍💋‍👨🏼' => ':kiss-man-man-medium-light-skin-tone:', + '👨🏼‍❤️‍💋‍👨🏿' => ':kiss-man-man-medium-light-skin-tone-dark-skin-tone:', + '👨🏼‍❤️‍💋‍👨🏻' => ':kiss-man-man-medium-light-skin-tone-light-skin-tone:', + '👨🏼‍❤️‍💋‍👨🏾' => ':kiss-man-man-medium-light-skin-tone-medium-dark-skin-tone:', + '👨🏼‍❤️‍💋‍👨🏽' => ':kiss-man-man-medium-light-skin-tone-medium-skin-tone:', + '👨🏽‍❤️‍💋‍👨🏽' => ':kiss-man-man-medium-skin-tone:', + '👨🏽‍❤️‍💋‍👨🏿' => ':kiss-man-man-medium-skin-tone-dark-skin-tone:', + '👨🏽‍❤️‍💋‍👨🏻' => ':kiss-man-man-medium-skin-tone-light-skin-tone:', + '👨🏽‍❤️‍💋‍👨🏾' => ':kiss-man-man-medium-skin-tone-medium-dark-skin-tone:', + '👨🏽‍❤️‍💋‍👨🏼' => ':kiss-man-man-medium-skin-tone-medium-light-skin-tone:', + '🧑🏿‍❤️‍💋‍🧑🏻' => ':kiss-person-person-dark-skin-tone-light-skin-tone:', + '🧑🏿‍❤️‍💋‍🧑🏾' => ':kiss-person-person-dark-skin-tone-medium-dark-skin-tone:', + '🧑🏿‍❤️‍💋‍🧑🏼' => ':kiss-person-person-dark-skin-tone-medium-light-skin-tone:', + '🧑🏿‍❤️‍💋‍🧑🏽' => ':kiss-person-person-dark-skin-tone-medium-skin-tone:', + '🧑🏻‍❤️‍💋‍🧑🏿' => ':kiss-person-person-light-skin-tone-dark-skin-tone:', + '🧑🏻‍❤️‍💋‍🧑🏾' => ':kiss-person-person-light-skin-tone-medium-dark-skin-tone:', + '🧑🏻‍❤️‍💋‍🧑🏼' => ':kiss-person-person-light-skin-tone-medium-light-skin-tone:', + '🧑🏻‍❤️‍💋‍🧑🏽' => ':kiss-person-person-light-skin-tone-medium-skin-tone:', + '🧑🏾‍❤️‍💋‍🧑🏿' => ':kiss-person-person-medium-dark-skin-tone-dark-skin-tone:', + '🧑🏾‍❤️‍💋‍🧑🏻' => ':kiss-person-person-medium-dark-skin-tone-light-skin-tone:', + '🧑🏾‍❤️‍💋‍🧑🏼' => ':kiss-person-person-medium-dark-skin-tone-medium-light-skin-tone:', + '🧑🏾‍❤️‍💋‍🧑🏽' => ':kiss-person-person-medium-dark-skin-tone-medium-skin-tone:', + '🧑🏼‍❤️‍💋‍🧑🏿' => ':kiss-person-person-medium-light-skin-tone-dark-skin-tone:', + '🧑🏼‍❤️‍💋‍🧑🏻' => ':kiss-person-person-medium-light-skin-tone-light-skin-tone:', + '🧑🏼‍❤️‍💋‍🧑🏾' => ':kiss-person-person-medium-light-skin-tone-medium-dark-skin-tone:', + '🧑🏼‍❤️‍💋‍🧑🏽' => ':kiss-person-person-medium-light-skin-tone-medium-skin-tone:', + '🧑🏽‍❤️‍💋‍🧑🏿' => ':kiss-person-person-medium-skin-tone-dark-skin-tone:', + '🧑🏽‍❤️‍💋‍🧑🏻' => ':kiss-person-person-medium-skin-tone-light-skin-tone:', + '🧑🏽‍❤️‍💋‍🧑🏾' => ':kiss-person-person-medium-skin-tone-medium-dark-skin-tone:', + '🧑🏽‍❤️‍💋‍🧑🏼' => ':kiss-person-person-medium-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍💋‍👨🏿' => ':kiss-woman-man-dark-skin-tone:', + '👩🏿‍❤️‍💋‍👨🏻' => ':kiss-woman-man-dark-skin-tone-light-skin-tone:', + '👩🏿‍❤️‍💋‍👨🏾' => ':kiss-woman-man-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍❤️‍💋‍👨🏼' => ':kiss-woman-man-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍💋‍👨🏽' => ':kiss-woman-man-dark-skin-tone-medium-skin-tone:', + '👩🏻‍❤️‍💋‍👨🏻' => ':kiss-woman-man-light-skin-tone:', + '👩🏻‍❤️‍💋‍👨🏿' => ':kiss-woman-man-light-skin-tone-dark-skin-tone:', + '👩🏻‍❤️‍💋‍👨🏾' => ':kiss-woman-man-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍❤️‍💋‍👨🏼' => ':kiss-woman-man-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍❤️‍💋‍👨🏽' => ':kiss-woman-man-light-skin-tone-medium-skin-tone:', + '👩🏾‍❤️‍💋‍👨🏾' => ':kiss-woman-man-medium-dark-skin-tone:', + '👩🏾‍❤️‍💋‍👨🏿' => ':kiss-woman-man-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍❤️‍💋‍👨🏻' => ':kiss-woman-man-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍❤️‍💋‍👨🏼' => ':kiss-woman-man-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍❤️‍💋‍👨🏽' => ':kiss-woman-man-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍❤️‍💋‍👨🏼' => ':kiss-woman-man-medium-light-skin-tone:', + '👩🏼‍❤️‍💋‍👨🏿' => ':kiss-woman-man-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍❤️‍💋‍👨🏻' => ':kiss-woman-man-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍❤️‍💋‍👨🏾' => ':kiss-woman-man-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍❤️‍💋‍👨🏽' => ':kiss-woman-man-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍❤️‍💋‍👨🏽' => ':kiss-woman-man-medium-skin-tone:', + '👩🏽‍❤️‍💋‍👨🏿' => ':kiss-woman-man-medium-skin-tone-dark-skin-tone:', + '👩🏽‍❤️‍💋‍👨🏻' => ':kiss-woman-man-medium-skin-tone-light-skin-tone:', + '👩🏽‍❤️‍💋‍👨🏾' => ':kiss-woman-man-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍❤️‍💋‍👨🏼' => ':kiss-woman-man-medium-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍💋‍👩🏿' => ':kiss-woman-woman-dark-skin-tone:', + '👩🏿‍❤️‍💋‍👩🏻' => ':kiss-woman-woman-dark-skin-tone-light-skin-tone:', + '👩🏿‍❤️‍💋‍👩🏾' => ':kiss-woman-woman-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍❤️‍💋‍👩🏼' => ':kiss-woman-woman-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍💋‍👩🏽' => ':kiss-woman-woman-dark-skin-tone-medium-skin-tone:', + '👩🏻‍❤️‍💋‍👩🏻' => ':kiss-woman-woman-light-skin-tone:', + '👩🏻‍❤️‍💋‍👩🏿' => ':kiss-woman-woman-light-skin-tone-dark-skin-tone:', + '👩🏻‍❤️‍💋‍👩🏾' => ':kiss-woman-woman-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍❤️‍💋‍👩🏼' => ':kiss-woman-woman-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍❤️‍💋‍👩🏽' => ':kiss-woman-woman-light-skin-tone-medium-skin-tone:', + '👩🏾‍❤️‍💋‍👩🏾' => ':kiss-woman-woman-medium-dark-skin-tone:', + '👩🏾‍❤️‍💋‍👩🏿' => ':kiss-woman-woman-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍❤️‍💋‍👩🏻' => ':kiss-woman-woman-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍❤️‍💋‍👩🏼' => ':kiss-woman-woman-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍❤️‍💋‍👩🏽' => ':kiss-woman-woman-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍❤️‍💋‍👩🏼' => ':kiss-woman-woman-medium-light-skin-tone:', + '👩🏼‍❤️‍💋‍👩🏿' => ':kiss-woman-woman-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍❤️‍💋‍👩🏻' => ':kiss-woman-woman-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍❤️‍💋‍👩🏾' => ':kiss-woman-woman-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍❤️‍💋‍👩🏽' => ':kiss-woman-woman-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍❤️‍💋‍👩🏽' => ':kiss-woman-woman-medium-skin-tone:', + '👩🏽‍❤️‍💋‍👩🏿' => ':kiss-woman-woman-medium-skin-tone-dark-skin-tone:', + '👩🏽‍❤️‍💋‍👩🏻' => ':kiss-woman-woman-medium-skin-tone-light-skin-tone:', + '👩🏽‍❤️‍💋‍👩🏾' => ':kiss-woman-woman-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍❤️‍💋‍👩🏼' => ':kiss-woman-woman-medium-skin-tone-medium-light-skin-tone:', + '👨🏿‍❤️‍👨🏿' => ':couple-with-heart-man-man-dark-skin-tone:', + '👨🏿‍❤️‍👨🏻' => ':couple-with-heart-man-man-dark-skin-tone-light-skin-tone:', + '👨🏿‍❤️‍👨🏾' => ':couple-with-heart-man-man-dark-skin-tone-medium-dark-skin-tone:', + '👨🏿‍❤️‍👨🏼' => ':couple-with-heart-man-man-dark-skin-tone-medium-light-skin-tone:', + '👨🏿‍❤️‍👨🏽' => ':couple-with-heart-man-man-dark-skin-tone-medium-skin-tone:', + '👨🏻‍❤️‍👨🏻' => ':couple-with-heart-man-man-light-skin-tone:', + '👨🏻‍❤️‍👨🏿' => ':couple-with-heart-man-man-light-skin-tone-dark-skin-tone:', + '👨🏻‍❤️‍👨🏾' => ':couple-with-heart-man-man-light-skin-tone-medium-dark-skin-tone:', + '👨🏻‍❤️‍👨🏼' => ':couple-with-heart-man-man-light-skin-tone-medium-light-skin-tone:', + '👨🏻‍❤️‍👨🏽' => ':couple-with-heart-man-man-light-skin-tone-medium-skin-tone:', + '👨🏾‍❤️‍👨🏾' => ':couple-with-heart-man-man-medium-dark-skin-tone:', + '👨🏾‍❤️‍👨🏿' => ':couple-with-heart-man-man-medium-dark-skin-tone-dark-skin-tone:', + '👨🏾‍❤️‍👨🏻' => ':couple-with-heart-man-man-medium-dark-skin-tone-light-skin-tone:', + '👨🏾‍❤️‍👨🏼' => ':couple-with-heart-man-man-medium-dark-skin-tone-medium-light-skin-tone:', + '👨🏾‍❤️‍👨🏽' => ':couple-with-heart-man-man-medium-dark-skin-tone-medium-skin-tone:', + '👨🏼‍❤️‍👨🏼' => ':couple-with-heart-man-man-medium-light-skin-tone:', + '👨🏼‍❤️‍👨🏿' => ':couple-with-heart-man-man-medium-light-skin-tone-dark-skin-tone:', + '👨🏼‍❤️‍👨🏻' => ':couple-with-heart-man-man-medium-light-skin-tone-light-skin-tone:', + '👨🏼‍❤️‍👨🏾' => ':couple-with-heart-man-man-medium-light-skin-tone-medium-dark-skin-tone:', + '👨🏼‍❤️‍👨🏽' => ':couple-with-heart-man-man-medium-light-skin-tone-medium-skin-tone:', + '👨🏽‍❤️‍👨🏽' => ':couple-with-heart-man-man-medium-skin-tone:', + '👨🏽‍❤️‍👨🏿' => ':couple-with-heart-man-man-medium-skin-tone-dark-skin-tone:', + '👨🏽‍❤️‍👨🏻' => ':couple-with-heart-man-man-medium-skin-tone-light-skin-tone:', + '👨🏽‍❤️‍👨🏾' => ':couple-with-heart-man-man-medium-skin-tone-medium-dark-skin-tone:', + '👨🏽‍❤️‍👨🏼' => ':couple-with-heart-man-man-medium-skin-tone-medium-light-skin-tone:', + '🧑🏿‍❤️‍🧑🏻' => ':couple-with-heart-person-person-dark-skin-tone-light-skin-tone:', + '🧑🏿‍❤️‍🧑🏾' => ':couple-with-heart-person-person-dark-skin-tone-medium-dark-skin-tone:', + '🧑🏿‍❤️‍🧑🏼' => ':couple-with-heart-person-person-dark-skin-tone-medium-light-skin-tone:', + '🧑🏿‍❤️‍🧑🏽' => ':couple-with-heart-person-person-dark-skin-tone-medium-skin-tone:', + '🧑🏻‍❤️‍🧑🏿' => ':couple-with-heart-person-person-light-skin-tone-dark-skin-tone:', + '🧑🏻‍❤️‍🧑🏾' => ':couple-with-heart-person-person-light-skin-tone-medium-dark-skin-tone:', + '🧑🏻‍❤️‍🧑🏼' => ':couple-with-heart-person-person-light-skin-tone-medium-light-skin-tone:', + '🧑🏻‍❤️‍🧑🏽' => ':couple-with-heart-person-person-light-skin-tone-medium-skin-tone:', + '🧑🏾‍❤️‍🧑🏿' => ':couple-with-heart-person-person-medium-dark-skin-tone-dark-skin-tone:', + '🧑🏾‍❤️‍🧑🏻' => ':couple-with-heart-person-person-medium-dark-skin-tone-light-skin-tone:', + '🧑🏾‍❤️‍🧑🏼' => ':couple-with-heart-person-person-medium-dark-skin-tone-medium-light-skin-tone:', + '🧑🏾‍❤️‍🧑🏽' => ':couple-with-heart-person-person-medium-dark-skin-tone-medium-skin-tone:', + '🧑🏼‍❤️‍🧑🏿' => ':couple-with-heart-person-person-medium-light-skin-tone-dark-skin-tone:', + '🧑🏼‍❤️‍🧑🏻' => ':couple-with-heart-person-person-medium-light-skin-tone-light-skin-tone:', + '🧑🏼‍❤️‍🧑🏾' => ':couple-with-heart-person-person-medium-light-skin-tone-medium-dark-skin-tone:', + '🧑🏼‍❤️‍🧑🏽' => ':couple-with-heart-person-person-medium-light-skin-tone-medium-skin-tone:', + '🧑🏽‍❤️‍🧑🏿' => ':couple-with-heart-person-person-medium-skin-tone-dark-skin-tone:', + '🧑🏽‍❤️‍🧑🏻' => ':couple-with-heart-person-person-medium-skin-tone-light-skin-tone:', + '🧑🏽‍❤️‍🧑🏾' => ':couple-with-heart-person-person-medium-skin-tone-medium-dark-skin-tone:', + '🧑🏽‍❤️‍🧑🏼' => ':couple-with-heart-person-person-medium-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍👨🏿' => ':couple-with-heart-woman-man-dark-skin-tone:', + '👩🏿‍❤️‍👨🏻' => ':couple-with-heart-woman-man-dark-skin-tone-light-skin-tone:', + '👩🏿‍❤️‍👨🏾' => ':couple-with-heart-woman-man-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍❤️‍👨🏼' => ':couple-with-heart-woman-man-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍👨🏽' => ':couple-with-heart-woman-man-dark-skin-tone-medium-skin-tone:', + '👩🏻‍❤️‍👨🏻' => ':couple-with-heart-woman-man-light-skin-tone:', + '👩🏻‍❤️‍👨🏿' => ':couple-with-heart-woman-man-light-skin-tone-dark-skin-tone:', + '👩🏻‍❤️‍👨🏾' => ':couple-with-heart-woman-man-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍❤️‍👨🏼' => ':couple-with-heart-woman-man-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍❤️‍👨🏽' => ':couple-with-heart-woman-man-light-skin-tone-medium-skin-tone:', + '👩🏾‍❤️‍👨🏾' => ':couple-with-heart-woman-man-medium-dark-skin-tone:', + '👩🏾‍❤️‍👨🏿' => ':couple-with-heart-woman-man-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍❤️‍👨🏻' => ':couple-with-heart-woman-man-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍❤️‍👨🏼' => ':couple-with-heart-woman-man-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍❤️‍👨🏽' => ':couple-with-heart-woman-man-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍❤️‍👨🏼' => ':couple-with-heart-woman-man-medium-light-skin-tone:', + '👩🏼‍❤️‍👨🏿' => ':couple-with-heart-woman-man-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍❤️‍👨🏻' => ':couple-with-heart-woman-man-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍❤️‍👨🏾' => ':couple-with-heart-woman-man-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍❤️‍👨🏽' => ':couple-with-heart-woman-man-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍❤️‍👨🏽' => ':couple-with-heart-woman-man-medium-skin-tone:', + '👩🏽‍❤️‍👨🏿' => ':couple-with-heart-woman-man-medium-skin-tone-dark-skin-tone:', + '👩🏽‍❤️‍👨🏻' => ':couple-with-heart-woman-man-medium-skin-tone-light-skin-tone:', + '👩🏽‍❤️‍👨🏾' => ':couple-with-heart-woman-man-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍❤️‍👨🏼' => ':couple-with-heart-woman-man-medium-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍👩🏿' => ':couple-with-heart-woman-woman-dark-skin-tone:', + '👩🏿‍❤️‍👩🏻' => ':couple-with-heart-woman-woman-dark-skin-tone-light-skin-tone:', + '👩🏿‍❤️‍👩🏾' => ':couple-with-heart-woman-woman-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍❤️‍👩🏼' => ':couple-with-heart-woman-woman-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍❤️‍👩🏽' => ':couple-with-heart-woman-woman-dark-skin-tone-medium-skin-tone:', + '👩🏻‍❤️‍👩🏻' => ':couple-with-heart-woman-woman-light-skin-tone:', + '👩🏻‍❤️‍👩🏿' => ':couple-with-heart-woman-woman-light-skin-tone-dark-skin-tone:', + '👩🏻‍❤️‍👩🏾' => ':couple-with-heart-woman-woman-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍❤️‍👩🏼' => ':couple-with-heart-woman-woman-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍❤️‍👩🏽' => ':couple-with-heart-woman-woman-light-skin-tone-medium-skin-tone:', + '👩🏾‍❤️‍👩🏾' => ':couple-with-heart-woman-woman-medium-dark-skin-tone:', + '👩🏾‍❤️‍👩🏿' => ':couple-with-heart-woman-woman-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍❤️‍👩🏻' => ':couple-with-heart-woman-woman-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍❤️‍👩🏼' => ':couple-with-heart-woman-woman-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍❤️‍👩🏽' => ':couple-with-heart-woman-woman-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍❤️‍👩🏼' => ':couple-with-heart-woman-woman-medium-light-skin-tone:', + '👩🏼‍❤️‍👩🏿' => ':couple-with-heart-woman-woman-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍❤️‍👩🏻' => ':couple-with-heart-woman-woman-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍❤️‍👩🏾' => ':couple-with-heart-woman-woman-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍❤️‍👩🏽' => ':couple-with-heart-woman-woman-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍❤️‍👩🏽' => ':couple-with-heart-woman-woman-medium-skin-tone:', + '👩🏽‍❤️‍👩🏿' => ':couple-with-heart-woman-woman-medium-skin-tone-dark-skin-tone:', + '👩🏽‍❤️‍👩🏻' => ':couple-with-heart-woman-woman-medium-skin-tone-light-skin-tone:', + '👩🏽‍❤️‍👩🏾' => ':couple-with-heart-woman-woman-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍❤️‍👩🏼' => ':couple-with-heart-woman-woman-medium-skin-tone-medium-light-skin-tone:', '👨‍❤️‍💋‍👨' => ':man-kiss-man:', - '👩‍❤️‍💋‍👩' => ':woman-kiss-woman:', '👩‍❤️‍💋‍👨' => ':woman-kiss-man:', + '👩‍❤️‍💋‍👩' => ':woman-kiss-woman:', + '🧎🏿‍♂️‍➡️' => ':man-kneeling-facing-right-dark-skin-tone:', + '🧎🏻‍♂️‍➡️' => ':man-kneeling-facing-right-light-skin-tone:', + '🧎🏾‍♂️‍➡️' => ':man-kneeling-facing-right-medium-dark-skin-tone:', + '🧎🏼‍♂️‍➡️' => ':man-kneeling-facing-right-medium-light-skin-tone:', + '🧎🏽‍♂️‍➡️' => ':man-kneeling-facing-right-medium-skin-tone:', + '🏃🏿‍♂️‍➡️' => ':man-running-facing-right-dark-skin-tone:', + '🏃🏻‍♂️‍➡️' => ':man-running-facing-right-light-skin-tone:', + '🏃🏾‍♂️‍➡️' => ':man-running-facing-right-medium-dark-skin-tone:', + '🏃🏼‍♂️‍➡️' => ':man-running-facing-right-medium-light-skin-tone:', + '🏃🏽‍♂️‍➡️' => ':man-running-facing-right-medium-skin-tone:', + '🚶🏿‍♂️‍➡️' => ':man-walking-facing-right-dark-skin-tone:', + '🚶🏻‍♂️‍➡️' => ':man-walking-facing-right-light-skin-tone:', + '🚶🏾‍♂️‍➡️' => ':man-walking-facing-right-medium-dark-skin-tone:', + '🚶🏼‍♂️‍➡️' => ':man-walking-facing-right-medium-light-skin-tone:', + '🚶🏽‍♂️‍➡️' => ':man-walking-facing-right-medium-skin-tone:', + '🧎🏿‍♀️‍➡️' => ':woman-kneeling-facing-right-dark-skin-tone:', + '🧎🏻‍♀️‍➡️' => ':woman-kneeling-facing-right-light-skin-tone:', + '🧎🏾‍♀️‍➡️' => ':woman-kneeling-facing-right-medium-dark-skin-tone:', + '🧎🏼‍♀️‍➡️' => ':woman-kneeling-facing-right-medium-light-skin-tone:', + '🧎🏽‍♀️‍➡️' => ':woman-kneeling-facing-right-medium-skin-tone:', + '🏃🏿‍♀️‍➡️' => ':woman-running-facing-right-dark-skin-tone:', + '🏃🏻‍♀️‍➡️' => ':woman-running-facing-right-light-skin-tone:', + '🏃🏾‍♀️‍➡️' => ':woman-running-facing-right-medium-dark-skin-tone:', + '🏃🏼‍♀️‍➡️' => ':woman-running-facing-right-medium-light-skin-tone:', + '🏃🏽‍♀️‍➡️' => ':woman-running-facing-right-medium-skin-tone:', + '🚶🏿‍♀️‍➡️' => ':woman-walking-facing-right-dark-skin-tone:', + '🚶🏻‍♀️‍➡️' => ':woman-walking-facing-right-light-skin-tone:', + '🚶🏾‍♀️‍➡️' => ':woman-walking-facing-right-medium-dark-skin-tone:', + '🚶🏼‍♀️‍➡️' => ':woman-walking-facing-right-medium-light-skin-tone:', + '🚶🏽‍♀️‍➡️' => ':woman-walking-facing-right-medium-skin-tone:', '👨‍❤‍💋‍👨' => ':couplekiss-man-man:', '👩‍❤‍💋‍👨' => ':couplekiss-man-woman:', '👩‍❤‍💋‍👩' => ':couplekiss-woman-woman:', @@ -20,13 +240,144 @@ '👩‍👩‍👧‍👧' => ':woman-woman-girl-girl:', '🏴󠁧󠁢󠁳󠁣󠁴󠁿' => ':scotland:', '🏴󠁧󠁢󠁷󠁬󠁳󠁿' => ':wales:', + '👨🏿‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right-dark-skin-tone:', + '👨🏻‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right-light-skin-tone:', + '👨🏾‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right-medium-dark-skin-tone:', + '👨🏼‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right-medium-light-skin-tone:', + '👨🏽‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right-medium-skin-tone:', + '👨🏿‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right-dark-skin-tone:', + '👨🏻‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right-light-skin-tone:', + '👨🏾‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:', + '👨🏼‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right-medium-light-skin-tone:', + '👨🏽‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right-medium-skin-tone:', '🧎‍♂️‍➡️' => ':man-kneeling-facing-right:', '🏃‍♂️‍➡️' => ':man-running-facing-right:', '🚶‍♂️‍➡️' => ':man-walking-facing-right:', + '👨🏿‍🦯‍➡️' => ':man-with-white-cane-facing-right-dark-skin-tone:', + '👨🏻‍🦯‍➡️' => ':man-with-white-cane-facing-right-light-skin-tone:', + '👨🏾‍🦯‍➡️' => ':man-with-white-cane-facing-right-medium-dark-skin-tone:', + '👨🏼‍🦯‍➡️' => ':man-with-white-cane-facing-right-medium-light-skin-tone:', + '👨🏽‍🦯‍➡️' => ':man-with-white-cane-facing-right-medium-skin-tone:', + '👨🏿‍🤝‍👨🏻' => ':men-holding-hands-dark-skin-tone-light-skin-tone:', + '👨🏿‍🤝‍👨🏾' => ':men-holding-hands-dark-skin-tone-medium-dark-skin-tone:', + '👨🏿‍🤝‍👨🏼' => ':men-holding-hands-dark-skin-tone-medium-light-skin-tone:', + '👨🏿‍🤝‍👨🏽' => ':men-holding-hands-dark-skin-tone-medium-skin-tone:', + '👨🏻‍🤝‍👨🏿' => ':men-holding-hands-light-skin-tone-dark-skin-tone:', + '👨🏻‍🤝‍👨🏾' => ':men-holding-hands-light-skin-tone-medium-dark-skin-tone:', + '👨🏻‍🤝‍👨🏼' => ':men-holding-hands-light-skin-tone-medium-light-skin-tone:', + '👨🏻‍🤝‍👨🏽' => ':men-holding-hands-light-skin-tone-medium-skin-tone:', + '👨🏾‍🤝‍👨🏿' => ':men-holding-hands-medium-dark-skin-tone-dark-skin-tone:', + '👨🏾‍🤝‍👨🏻' => ':men-holding-hands-medium-dark-skin-tone-light-skin-tone:', + '👨🏾‍🤝‍👨🏼' => ':men-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:', + '👨🏾‍🤝‍👨🏽' => ':men-holding-hands-medium-dark-skin-tone-medium-skin-tone:', + '👨🏼‍🤝‍👨🏿' => ':men-holding-hands-medium-light-skin-tone-dark-skin-tone:', + '👨🏼‍🤝‍👨🏻' => ':men-holding-hands-medium-light-skin-tone-light-skin-tone:', + '👨🏼‍🤝‍👨🏾' => ':men-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:', + '👨🏼‍🤝‍👨🏽' => ':men-holding-hands-medium-light-skin-tone-medium-skin-tone:', + '👨🏽‍🤝‍👨🏿' => ':men-holding-hands-medium-skin-tone-dark-skin-tone:', + '👨🏽‍🤝‍👨🏻' => ':men-holding-hands-medium-skin-tone-light-skin-tone:', + '👨🏽‍🤝‍👨🏾' => ':men-holding-hands-medium-skin-tone-medium-dark-skin-tone:', + '👨🏽‍🤝‍👨🏼' => ':men-holding-hands-medium-skin-tone-medium-light-skin-tone:', + '🧑🏿‍🤝‍🧑🏿' => ':people-holding-hands-dark-skin-tone:', + '🧑🏿‍🤝‍🧑🏻' => ':people-holding-hands-dark-skin-tone-light-skin-tone:', + '🧑🏿‍🤝‍🧑🏾' => ':people-holding-hands-dark-skin-tone-medium-dark-skin-tone:', + '🧑🏿‍🤝‍🧑🏼' => ':people-holding-hands-dark-skin-tone-medium-light-skin-tone:', + '🧑🏿‍🤝‍🧑🏽' => ':people-holding-hands-dark-skin-tone-medium-skin-tone:', + '🧑🏻‍🤝‍🧑🏻' => ':people-holding-hands-light-skin-tone:', + '🧑🏻‍🤝‍🧑🏿' => ':people-holding-hands-light-skin-tone-dark-skin-tone:', + '🧑🏻‍🤝‍🧑🏾' => ':people-holding-hands-light-skin-tone-medium-dark-skin-tone:', + '🧑🏻‍🤝‍🧑🏼' => ':people-holding-hands-light-skin-tone-medium-light-skin-tone:', + '🧑🏻‍🤝‍🧑🏽' => ':people-holding-hands-light-skin-tone-medium-skin-tone:', + '🧑🏾‍🤝‍🧑🏾' => ':people-holding-hands-medium-dark-skin-tone:', + '🧑🏾‍🤝‍🧑🏿' => ':people-holding-hands-medium-dark-skin-tone-dark-skin-tone:', + '🧑🏾‍🤝‍🧑🏻' => ':people-holding-hands-medium-dark-skin-tone-light-skin-tone:', + '🧑🏾‍🤝‍🧑🏼' => ':people-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:', + '🧑🏾‍🤝‍🧑🏽' => ':people-holding-hands-medium-dark-skin-tone-medium-skin-tone:', + '🧑🏼‍🤝‍🧑🏼' => ':people-holding-hands-medium-light-skin-tone:', + '🧑🏼‍🤝‍🧑🏿' => ':people-holding-hands-medium-light-skin-tone-dark-skin-tone:', + '🧑🏼‍🤝‍🧑🏻' => ':people-holding-hands-medium-light-skin-tone-light-skin-tone:', + '🧑🏼‍🤝‍🧑🏾' => ':people-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:', + '🧑🏼‍🤝‍🧑🏽' => ':people-holding-hands-medium-light-skin-tone-medium-skin-tone:', + '🧑🏽‍🤝‍🧑🏽' => ':people-holding-hands-medium-skin-tone:', + '🧑🏽‍🤝‍🧑🏿' => ':people-holding-hands-medium-skin-tone-dark-skin-tone:', + '🧑🏽‍🤝‍🧑🏻' => ':people-holding-hands-medium-skin-tone-light-skin-tone:', + '🧑🏽‍🤝‍🧑🏾' => ':people-holding-hands-medium-skin-tone-medium-dark-skin-tone:', + '🧑🏽‍🤝‍🧑🏼' => ':people-holding-hands-medium-skin-tone-medium-light-skin-tone:', + '🧑🏿‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right-dark-skin-tone:', + '🧑🏻‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right-light-skin-tone:', + '🧑🏾‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right-medium-dark-skin-tone:', + '🧑🏼‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right-medium-light-skin-tone:', + '🧑🏽‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right-medium-skin-tone:', + '🧑🏿‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right-dark-skin-tone:', + '🧑🏻‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right-light-skin-tone:', + '🧑🏾‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:', + '🧑🏼‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right-medium-light-skin-tone:', + '🧑🏽‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right-medium-skin-tone:', + '🧑🏿‍🦯‍➡️' => ':person-with-white-cane-facing-right-dark-skin-tone:', + '🧑🏻‍🦯‍➡️' => ':person-with-white-cane-facing-right-light-skin-tone:', + '🧑🏾‍🦯‍➡️' => ':person-with-white-cane-facing-right-medium-dark-skin-tone:', + '🧑🏼‍🦯‍➡️' => ':person-with-white-cane-facing-right-medium-light-skin-tone:', + '🧑🏽‍🦯‍➡️' => ':person-with-white-cane-facing-right-medium-skin-tone:', + '👩🏿‍🤝‍👨🏻' => ':woman-and-man-holding-hands-dark-skin-tone-light-skin-tone:', + '👩🏿‍🤝‍👨🏾' => ':woman-and-man-holding-hands-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍🤝‍👨🏼' => ':woman-and-man-holding-hands-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍🤝‍👨🏽' => ':woman-and-man-holding-hands-dark-skin-tone-medium-skin-tone:', + '👩🏻‍🤝‍👨🏿' => ':woman-and-man-holding-hands-light-skin-tone-dark-skin-tone:', + '👩🏻‍🤝‍👨🏾' => ':woman-and-man-holding-hands-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍🤝‍👨🏼' => ':woman-and-man-holding-hands-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍🤝‍👨🏽' => ':woman-and-man-holding-hands-light-skin-tone-medium-skin-tone:', + '👩🏾‍🤝‍👨🏿' => ':woman-and-man-holding-hands-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍🤝‍👨🏻' => ':woman-and-man-holding-hands-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍🤝‍👨🏼' => ':woman-and-man-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍🤝‍👨🏽' => ':woman-and-man-holding-hands-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍🤝‍👨🏿' => ':woman-and-man-holding-hands-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍🤝‍👨🏻' => ':woman-and-man-holding-hands-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍🤝‍👨🏾' => ':woman-and-man-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍🤝‍👨🏽' => ':woman-and-man-holding-hands-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍🤝‍👨🏿' => ':woman-and-man-holding-hands-medium-skin-tone-dark-skin-tone:', + '👩🏽‍🤝‍👨🏻' => ':woman-and-man-holding-hands-medium-skin-tone-light-skin-tone:', + '👩🏽‍🤝‍👨🏾' => ':woman-and-man-holding-hands-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍🤝‍👨🏼' => ':woman-and-man-holding-hands-medium-skin-tone-medium-light-skin-tone:', + '👩🏿‍🦽‍➡️' => ':woman-in-manual-wheelchair-facing-right-dark-skin-tone:', + '👩🏻‍🦽‍➡️' => ':woman-in-manual-wheelchair-facing-right-light-skin-tone:', + '👩🏾‍🦽‍➡️' => ':woman-in-manual-wheelchair-facing-right-medium-dark-skin-tone:', + '👩🏼‍🦽‍➡️' => ':woman-in-manual-wheelchair-facing-right-medium-light-skin-tone:', + '👩🏽‍🦽‍➡️' => ':woman-in-manual-wheelchair-facing-right-medium-skin-tone:', + '👩🏿‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right-dark-skin-tone:', + '👩🏻‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right-light-skin-tone:', + '👩🏾‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:', + '👩🏼‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right-medium-light-skin-tone:', + '👩🏽‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right-medium-skin-tone:', '🧎‍♀️‍➡️' => ':woman-kneeling-facing-right:', '🏃‍♀️‍➡️' => ':woman-running-facing-right:', '🚶‍♀️‍➡️' => ':woman-walking-facing-right:', + '👩🏿‍🦯‍➡️' => ':woman-with-white-cane-facing-right-dark-skin-tone:', + '👩🏻‍🦯‍➡️' => ':woman-with-white-cane-facing-right-light-skin-tone:', + '👩🏾‍🦯‍➡️' => ':woman-with-white-cane-facing-right-medium-dark-skin-tone:', + '👩🏼‍🦯‍➡️' => ':woman-with-white-cane-facing-right-medium-light-skin-tone:', + '👩🏽‍🦯‍➡️' => ':woman-with-white-cane-facing-right-medium-skin-tone:', + '👩🏿‍🤝‍👩🏻' => ':women-holding-hands-dark-skin-tone-light-skin-tone:', + '👩🏿‍🤝‍👩🏾' => ':women-holding-hands-dark-skin-tone-medium-dark-skin-tone:', + '👩🏿‍🤝‍👩🏼' => ':women-holding-hands-dark-skin-tone-medium-light-skin-tone:', + '👩🏿‍🤝‍👩🏽' => ':women-holding-hands-dark-skin-tone-medium-skin-tone:', + '👩🏻‍🤝‍👩🏿' => ':women-holding-hands-light-skin-tone-dark-skin-tone:', + '👩🏻‍🤝‍👩🏾' => ':women-holding-hands-light-skin-tone-medium-dark-skin-tone:', + '👩🏻‍🤝‍👩🏼' => ':women-holding-hands-light-skin-tone-medium-light-skin-tone:', + '👩🏻‍🤝‍👩🏽' => ':women-holding-hands-light-skin-tone-medium-skin-tone:', + '👩🏾‍🤝‍👩🏿' => ':women-holding-hands-medium-dark-skin-tone-dark-skin-tone:', + '👩🏾‍🤝‍👩🏻' => ':women-holding-hands-medium-dark-skin-tone-light-skin-tone:', + '👩🏾‍🤝‍👩🏼' => ':women-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:', + '👩🏾‍🤝‍👩🏽' => ':women-holding-hands-medium-dark-skin-tone-medium-skin-tone:', + '👩🏼‍🤝‍👩🏿' => ':women-holding-hands-medium-light-skin-tone-dark-skin-tone:', + '👩🏼‍🤝‍👩🏻' => ':women-holding-hands-medium-light-skin-tone-light-skin-tone:', + '👩🏼‍🤝‍👩🏾' => ':women-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:', + '👩🏼‍🤝‍👩🏽' => ':women-holding-hands-medium-light-skin-tone-medium-skin-tone:', + '👩🏽‍🤝‍👩🏿' => ':women-holding-hands-medium-skin-tone-dark-skin-tone:', + '👩🏽‍🤝‍👩🏻' => ':women-holding-hands-medium-skin-tone-light-skin-tone:', + '👩🏽‍🤝‍👩🏾' => ':women-holding-hands-medium-skin-tone-medium-dark-skin-tone:', + '👩🏽‍🤝‍👩🏼' => ':women-holding-hands-medium-skin-tone-medium-light-skin-tone:', '👨‍❤️‍👨' => ':man-heart-man:', + '👩‍❤️‍👨' => ':woman-heart-man:', '👩‍❤️‍👩' => ':woman-heart-woman:', '👨‍🦽‍➡️' => ':man-in-manual-wheelchair-facing-right:', '👨‍🦼‍➡️' => ':man-in-motorized-wheelchair-facing-right:', @@ -34,13 +385,22 @@ '🧑‍🦽‍➡️' => ':person-in-manual-wheelchair-facing-right:', '🧑‍🦼‍➡️' => ':person-in-motorized-wheelchair-facing-right:', '🧑‍🦯‍➡️' => ':person-with-white-cane-facing-right:', - '👩‍❤️‍👨' => ':woman-heart-man:', '👩‍🦽‍➡ 10000 ' => ':woman-in-manual-wheelchair-facing-right:', '👩‍🦼‍➡️' => ':woman-in-motorized-wheelchair-facing-right:', '👩‍🦯‍➡️' => ':woman-with-white-cane-facing-right:', '👨‍❤‍👨' => ':couple-with-heart-man-man:', '👩‍❤‍👨' => ':couple-with-heart-woman-man:', '👩‍❤‍👩' => ':couple-with-heart-woman-woman:', + '🧏🏿‍♂️' => ':deaf-man-dark-skin-tone:', + '🧏🏻‍♂️' => ':deaf-man-light-skin-tone:', + '🧏🏾‍♂️' => ':deaf-man-medium-dark-skin-tone:', + '🧏🏼‍♂️' => ':deaf-man-medium-light-skin-tone:', + '🧏🏽‍♂️' => ':deaf-man-medium-skin-tone:', + '🧏🏿‍♀️' => ':deaf-woman-dark-skin-tone:', + '🧏🏻‍♀️' => ':deaf-woman-light-skin-tone:', + '🧏🏾‍♀️' => ':deaf-woman-medium-dark-skin-tone:', + '🧏🏼‍♀️' => ':deaf-woman-medium-light-skin-tone:', + '🧏🏽‍♀️' => ':deaf-woman-medium-skin-tone:', '👁️‍🗨️' => ':eye-in-speech-bubble:', '🧑‍🧑‍🧒' => ':family-adult-adult-child:', '🧑‍🧒‍🧒' => ':family-adult-child-child:', @@ -56,136 +416,997 @@ '👩‍👧‍👧' => ':woman-girl-girl:', '👩‍👩‍👦' => ':woman-woman-boy:', '👩‍👩‍👧' => ':woman-woman-girl:', - '🕵️‍♀️' => ':female-detective:', - '🕵️‍♂️' => ':male-detective:', + '🕵️‍♀️' => ':woman-detective:', + '🫱🏿‍🫲🏻' => ':handshake-dark-skin-tone-light-skin-tone:', + '🫱🏿‍🫲🏾' => ':handshake-dark-skin-tone-medium-dark-skin-tone:', + '🫱🏿‍🫲🏼' => ':handshake-dark-skin-tone-medium-light-skin-tone:', + '🫱🏿‍🫲🏽' => ':handshake-dark-skin-tone-medium-skin-tone:', + '🫱🏻‍🫲🏿' => ':handshake-light-skin-tone-dark-skin-tone:', + '🫱🏻‍🫲🏾' => ':handshake-light-skin-tone-medium-dark-skin-tone:', + '🫱🏻‍🫲🏼' => ':handshake-light-skin-tone-medium-light-skin-tone:', + '🫱🏻‍🫲🏽' => ':handshake-light-skin-tone-medium-skin-tone:', + '🫱🏾‍🫲🏿' => ':handshake-medium-dark-skin-tone-dark-skin-tone:', + '🫱🏾‍🫲🏻' => ':handshake-medium-dark-skin-tone-light-skin-tone:', + '🫱🏾‍🫲🏼' => ':handshake-medium-dark-skin-tone-medium-light-skin-tone:', + '🫱🏾‍🫲🏽' => ':handshake-medium-dark-skin-tone-medium-skin-tone:', + '🫱🏼‍🫲🏿' => ':handshake-medium-light-skin-tone-dark-skin-tone:', + '🫱🏼‍🫲🏻' => ':handshake-medium-light-skin-tone-light-skin-tone:', + '🫱🏼‍🫲🏾' => ':handshake-medium-light-skin-tone-medium-dark-skin-tone:', + '🫱🏼‍🫲🏽' => ':handshake-medium-light-skin-tone-medium-skin-tone:', + '🫱🏽‍🫲🏿' => ':handshake-medium-skin-tone-dark-skin-tone:', + '🫱🏽‍🫲🏻' => ':handshake-medium-skin-tone-light-skin-tone:', + '🫱🏽‍🫲🏾' => ':handshake-medium-skin-tone-medium-dark-skin-tone:', + '🫱🏽‍🫲🏼' => ':handshake-medium-skin-tone-medium-light-skin-tone:', + '🧑🏿‍⚕️' => ':health-worker-dark-skin-tone:', + '🧑🏻‍⚕️' => ':health-worker-light-skin-tone:', + '🧑🏾‍⚕️' => ':health-worker-medium-dark-skin-tone:', + '🧑🏼‍⚕️' => ':health-worker-medium-light-skin-tone:', + '🧑🏽‍⚕️' => ':health-worker-medium-skin-tone:', + '🧑🏿‍⚖️' => ':judge-dark-skin-tone:', + '🧑🏻‍⚖️' => ':judge-light-skin-tone:', + '🧑🏾‍⚖️' => ':judge-medium-dark-skin-tone:', + '🧑🏼‍⚖️' => ':judge-medium-light-skin-tone:', + '🧑🏽‍⚖️' => ':judge-medium-skin-tone:', + '🕵️‍♂️' => ':man-detective:', + '🚴🏿‍♂️' => ':man-biking-dark-skin-tone:', + '🚴🏻‍♂️' => ':man-biking-light-skin-tone:', + '🚴🏾‍♂️' => ':man-biking-medium-dark-skin-tone:', + '🚴🏼‍♂️' => ':man-biking-medium-light-skin-tone:', + '🚴🏽‍♂️' => ':man-biking-medium-skin-tone:', '⛹️‍♂️' => ':man-bouncing-ball:', + '⛹🏿‍♂️' => ':man-bouncing-ball-dark-skin-tone:', + '⛹🏻‍♂️' => ':man-bouncing-ball-light-skin-tone:', + '⛹🏾‍♂️' => ':man-bouncing-ball-medium-dark-skin-tone:', + '⛹🏼‍♂️' => ':man-bouncing-ball-medium-light-skin-tone:', + '⛹🏽‍♂️' => ':man-bouncing-ball-medium-skin-tone:', + '🙇🏿‍♂️' => ':man-bowing-dark-skin-tone:', + '🙇🏻‍♂️' => ':man-bowing-light-skin-tone:', + '🙇🏾‍♂️' => ':man-bowing-medium-dark-skin-tone:', + '🙇🏼‍♂️' => ':man-bowing-medium-light-skin-tone:', + '🙇🏽‍♂️' => ':man-bowing-medium-skin-tone:', + '🤸🏿‍♂️' => ':man-cartwheeling-dark-skin-tone:', + '🤸🏻‍♂️' => ':man-cartwheeling-light-skin-tone:', + '🤸🏾‍♂️' => ':man-cartwheeling-medium-dark-skin-tone:', + '🤸🏼‍♂️' => ':man-cartwheeling-medium-light-skin-tone:', + '🤸🏽‍♂️' => ':man-cartwheeling-medium-skin-tone:', + '🧗🏿‍♂️' => ':man-climbing-dark-skin-tone:', + '🧗🏻‍♂️' => ':man-climbing-light-skin-tone:', + '🧗🏾‍♂️' => ':man-climbing-medium-dark-skin-tone:', + '🧗🏼‍♂️' => ':man-climbing-medium-light-skin-tone:', + '🧗🏽‍♂️' => ':man-climbing-medium-skin-tone:', + '👷🏿‍♂️' => ':man-construction-worker-dark-skin-tone:', + '👷🏻‍♂️' => ':man-construction-worker-light-skin-tone:', + '👷🏾‍♂️' => ':man-construction-worker-medium-dark-skin-tone:', + '👷🏼‍♂️' => ':man-construction-worker-medium-light-skin-tone:', + '👷🏽‍♂️' => ':man-construction-worker-medium-skin-tone:', + '🧔🏿‍♂️' => ':man-dark-skin-tone-beard:', + '👱🏿‍♂️' => ':man-dark-skin-tone-blond-hair:', + '🕵🏿‍♂️' => ':man-detective-dark-skin-tone:', + '🕵🏻‍♂️' => ':man-detective-light-skin-tone:', + '🕵🏾‍♂️' => ':man-detective-medium-dark-skin-tone:', + '🕵🏼‍♂️' => ':man-detective-medium-light-skin-tone:', + '🕵🏽‍♂️' => ':man-detective-medium-skin-tone:', + '🧝🏿‍♂️' => ':man-elf-dark-skin-tone:', + '🧝🏻‍♂️' => ':man-elf-light-skin-tone:', + '🧝🏾‍♂️' => ':man-elf-medium-dark-skin-tone:', + '🧝🏼‍♂️' => ':man-elf-medium-light-skin-tone:', + '🧝🏽‍♂️' => ':man-elf-medium-skin-tone:', + '🤦🏿‍♂️' => ':man-facepalming-dark-skin-tone:', + '🤦🏻‍♂️' => ':man-facepalming-light-skin-tone:', + '🤦🏾‍♂️' => ':man-facepalming-medium-dark-skin-tone:', + '🤦🏼‍♂️' => ':man-facepalming-medium-light-skin-tone:', + '🤦🏽‍♂️' => ':man-facepalming-medium-skin-tone:', + '🧚🏿‍♂️' => ':man-fairy-dark-skin-tone:', + '🧚🏻‍♂️' => ':man-fairy-light-skin-tone:', + '🧚🏾‍♂️' => ':man-fairy-medium-dark-skin-tone:', + '🧚🏼‍♂️' => ':man-fairy-medium-light-skin-tone:', + '🧚🏽‍♂️' => ':man-fairy-medium-skin-tone:', + '🙍🏿‍♂️' => ':man-frowning-dark-skin-tone:', + '🙍🏻‍♂️' => ':man-frowning-light-skin-tone:', + '🙍🏾‍♂️' => ':man-frowning-medium-dark-skin-tone:', + '🙍🏼‍♂️' => ':man-frowning-medium-light-skin-tone:', + '🙍🏽‍♂️' => ':man-frowning-medium-skin-tone:', + '🙅🏿‍♂️' => ':man-gesturing-no-dark-skin-tone:', + '🙅🏻‍♂️' => ':man-gesturing-no-light-skin-tone:', + '🙅🏾‍♂️' => ':man-gesturing-no-medium-dark-skin-tone:', + '🙅🏼‍♂️' => ':man-gesturing-no-medium-light-skin-tone:', + '🙅🏽‍♂️' => ':man-gesturing-no-medium-skin-tone:', + '🙆🏿‍♂️' => ':man-gesturing-ok-dark-skin-tone:', + '🙆🏻‍♂️' => ':man-gesturing-ok-light-skin-tone:', + '🙆🏾‍♂️' => ':man-gesturing-ok-medium-dark-skin-tone:', + '🙆🏼‍♂️' => ':man-gesturing-ok-medium-light-skin-tone:', + '🙆🏽‍♂️' => ':man-gesturing-ok-medium-skin-tone:', + '💇🏿‍♂️' => ':man-getting-haircut-dark-skin-tone:', + '💇🏻‍♂️' => ':man-getting-haircut-light-skin-tone:', + '💇🏾‍♂️' => ':man-getting-haircut-medium-dark-skin-tone:', + '💇🏼‍♂️' => ':man-getting-haircut-medium-light-skin-tone:', + '💇🏽‍♂️' => ':man-getting-haircut-medium-skin-tone:', + '💆🏿‍♂️' => ':man-getting-massage-dark-skin-tone:', + '💆🏻‍♂️' => ':man-getting-massage-light-skin-tone:', + '💆🏾‍♂️' => ':man-getting-massage-medium-dark-skin-tone:', + '💆🏼‍♂️' => ':man-getting-massage-medium-light-skin-tone:', + '💆🏽‍♂️' => ':man-getting-massage-medium-skin-tone:', '🏌️‍♂️' => ':man-golfing:', + '🏌🏿‍♂️' => ':man-golfing-dark-skin-tone:', + '🏌🏻‍♂️' => ':man-golfing-light-skin-tone:', + '🏌🏾‍♂️' => ':man-golfing-medium-dark-skin-tone:', + '🏌🏼‍♂️' => ':man-golfing-medium-light-skin-tone:', + '🏌🏽‍♂️' => ':man-golfing-medium-skin-tone:', + '💂🏿‍♂️' => ':man-guard-dark-skin-tone:', + '💂🏻‍♂️' => ':man-guard-light-skin-tone:', + '💂🏾‍♂️' => ':man-guard-medium-dark-skin-tone:', + '💂🏼‍♂️' => ':man-guard-medium-light-skin-tone:', + '💂🏽‍♂️' => ':man-guard-medium-skin-tone:', + '👨🏿‍⚕️' => ':man-health-worker-dark-skin-tone:', + '👨🏻‍⚕️' => ':man-health-worker-light-skin-tone:', + '👨🏾‍⚕️' => ':man-health-worker-medium-dark-skin-tone:', + '👨🏼‍⚕️' => ':man-health-worker-medium-light-skin-tone:', + '👨🏽‍⚕️' => ':man-health-worker-medium-skin-tone:', + '🧘🏿‍♂️' => ':man-in-lotus-position-dark-skin-tone:', + '🧘🏻‍♂️' => ':man-in-lotus-position-light-skin-tone:', + '🧘🏾‍♂️' => ':man-in-lotus-position-medium-dark-skin-tone:', + '🧘🏼‍♂️' => ':man-in-lotus-position-medium-light-skin-tone:', + '🧘🏽‍♂️' => ':man-in-lotus-position-medium-skin-tone:', + '🧖🏿‍♂️' => ':man-in-steamy-room-dark-skin-tone:', + '🧖🏻‍♂️' => ':man-in-steamy-room-light-skin-tone:', + '🧖🏾‍♂️' => ':man-in-steamy-room-medium-dark-skin-tone:', + '🧖🏼‍♂️' => ':man-in-steamy-room-medium-light-skin-tone:', + '🧖🏽‍♂️' => ':man-in-steamy-room-medium-skin-tone:', + '🤵🏿‍♂️' => ':man-in-tuxedo-dark-skin-tone:', + '🤵🏻‍♂️' => ':man-in-tuxedo-light-skin-tone:', + '🤵🏾‍♂️' => ':man-in-tuxedo-medium-dark-skin-tone:', + '🤵🏼‍♂️' => ':man-in-tuxedo-medium-light-skin-tone:', + '🤵🏽‍♂️' => ':man-in-tuxedo-medium-skin-tone:', + '👨🏿‍⚖️' => ':man-judge-dark-skin-tone:', + '👨🏻‍⚖️' => ':man-judge-light-skin-tone:', + '👨🏾‍⚖️' => ':man-judge-medium-dark-skin-tone:', + '👨🏼‍⚖️' => ':man-judge-medium-light-skin-tone:', + '👨🏽‍⚖️' => ':man-judge-medium-skin-tone:', + '🤹🏿‍♂️' => ':man-juggling-dark-skin-tone:', + '🤹🏻‍♂️' => ':man-juggling-light-skin-tone:', + '🤹🏾‍♂️' => ':man-juggling-medium-dark-skin-tone:', + '🤹🏼‍♂️' => ':man-juggling-medium-light-skin-tone:', + '🤹🏽‍♂️' => ':man-juggling-medium-skin-tone:', + '🧎🏿‍♂️' => ':man-kneeling-dark-skin-tone:', + '🧎🏻‍♂️' => ':man-kneeling-light-skin-tone:', + '🧎🏾‍♂️' => ':man-kneeling-medium-dark-skin-tone:', + '🧎🏼‍♂️' => ':man-kneeling-medium-light-skin-tone:', + '🧎🏽‍♂️' => ':man-kneeling-medium-skin-tone:', '🏋️‍♂️' => ':man-lifting-weights:', + '🏋🏿‍♂️' => ':man-lifting-weights-dark-skin-tone:', + '🏋🏻‍♂️' => ':man-lifting-weights-light-skin-tone:', + '🏋🏾‍♂️' => ':man-lifting-weights-medium-dark-skin-tone:', + '🏋🏼‍♂️' => ':man-lifting-weights-medium-light-skin-tone:', + '🏋🏽‍♂️' => ':man-lifting-weights-medium-skin-tone:', + '🧔🏻‍♂️' => ':man-light-skin-tone-beard:', + '👱🏻‍♂️' => ':man-light-skin-tone-blond-hair:', + '🧙🏿‍♂️' => ':man-mage-dark-skin-tone:', + '🧙🏻‍♂️' => ':man-mage-light-skin-tone:', + '🧙🏾‍♂️' => ':man-mage-medium-dark-skin-tone:', + '🧙🏼‍♂️' => ':man-mage-medium-light-skin-tone:', + '🧙🏽‍♂️' => ':man-mage-medium-skin-tone:', + '🧔🏾‍♂️' => ':man-medium-dark-skin-tone-beard:', + '👱🏾‍♂️' => ':man-medium-dark-skin-tone-blond-hair:', + '🧔🏼‍♂️' => ':man-medium-light-skin-tone-beard:', + '👱🏼‍♂️' => ':man-medium-light-skin-tone-blond-hair:', + '🧔🏽‍♂️' => ':man-medium-skin-tone-beard:', + '👱🏽‍♂️' => ':man-medium-skin-tone-blond-hair:', + '🚵🏿‍♂️' => ':man-mountain-biking-dark-skin-tone:', + '🚵🏻‍♂️' => ':man-mountain-biking-light-skin-tone:', + '🚵🏾‍♂️' => ':man-mountain-biking-medium-dark-skin-tone:', + '🚵🏼‍♂️' => ':man-mountain-biking-medium-light-skin-tone:', + '🚵🏽‍♂️' => ':man-mountain-biking-medium-skin-tone:', + '👨🏿‍✈️' => ':man-pilot-dark-skin-tone:', + '👨🏻‍✈️' => ':man-pilot-light-skin-tone:', + '👨🏾‍✈️' => ':man-pilot-medium-dark-skin-tone:', + '👨🏼‍✈️' => ':man-pilot-medium-light-skin-tone:', + '👨🏽‍✈️' => ':man-pilot-medium-skin-tone:', + '🤾🏿‍♂️' => ':man-playing-handball-dark-skin-tone:', + '🤾🏻‍♂️' => ':man-playing-handball-light-skin-tone:', + '🤾🏾‍♂️' => ':man-playing-handball-medium-dark-skin-tone:', + '🤾🏼‍♂️' => ':man-playing-handball-medium-light-skin-tone:', + '🤾🏽‍♂️' => ':man-playing-handball-medium-skin-tone:', + '🤽🏿‍♂️' => ':man-playing-water-polo-dark-skin-tone:', + '🤽🏻‍♂️' => ':man-playing-water-polo-light-skin-tone:', + '🤽🏾‍♂️' => ':man-playing-water-polo-medium-dark-skin-tone:', + '🤽🏼‍♂️' => ':man-playing-water-polo-medium-light-skin-tone:', + '🤽🏽‍♂️' => ':man-playing-water-polo-medium-skin-tone:', + '👮🏿‍♂️' => ':man-police-officer-dark-skin-tone:', + '👮🏻‍♂️' => ':man-police-officer-light-skin-tone:', + '👮🏾‍♂️' => ':man-police-officer-medium-dark-skin-tone:', + '👮🏼‍♂️' => ':man-police-officer-medium-light-skin-tone:', + '👮🏽‍♂️' => ':man-police-officer-medium-skin-tone:', + '🙎🏿‍♂️' => ':man-pouting-dark-skin-tone:', + '🙎🏻‍♂️' => ':man-pouting-light-skin-tone:', + '🙎🏾‍♂️' => ':man-pouting-medium-dark-skin-tone:', + '🙎🏼‍♂️' => ':man-pouting-medium-light-skin-tone:', + '🙎🏽‍♂️' => ':man-pouting-medium-skin-tone:', + '🙋🏿‍♂️' => ':man-raising-hand-dark-skin-tone:', + '🙋🏻‍♂️' => ':man-raising-hand-light-skin-tone:', + '🙋🏾‍♂️' => ':man-raising-hand-medium-dark-skin-tone:', + '🙋🏼‍♂️' => ':man-raising-hand-medium-light-skin-tone:', + '🙋🏽‍♂️' => ':man-raising-hand-medium-skin-tone:', + '🚣🏿‍♂️' => ':man-rowing-boat-dark-skin-tone:', + '🚣🏻‍♂️' => ':man-rowing-boat-light-skin-tone:', + '🚣🏾‍♂️' => ':man-rowing-boat-medium-dark-skin-tone:', + '🚣🏼‍♂️' => ':man-rowing-boat-medium-light-skin-tone:', + '🚣🏽‍♂️' => ':man-rowing-boat-medium-skin-tone:', + '🏃🏿‍♂️' => ':man-running-dark-skin-tone:', + '🏃🏻‍♂️' => ':man-running-light-skin-tone:', + '🏃🏾‍♂️' => ':man-running-medium-dark-skin-tone:', + '🏃🏼‍♂️' => ':man-running-medium-light-skin-tone:', + '🏃🏽‍♂️' => ':man-running-medium-skin-tone:', + '🤷🏿‍♂️' => ':man-shrugging-dark-skin-tone:', + '🤷🏻‍♂️' => ':man-shrugging-light-skin-tone:', + '🤷🏾‍♂️' => ':man-shrugging-medium-dark-skin-tone:', + '🤷🏼‍♂️' => ':man-shrugging-medium-light-skin-tone:', + '🤷🏽‍♂️' => ':man-shrugging-medium-skin-tone:', + '🧍🏿‍♂️' => ':man-standing-dark-skin-tone:', + '🧍🏻‍♂️' => ':man-standing-light-skin-tone:', + '🧍🏾‍♂️' => ':man-standing-medium-dark-skin-tone:', + '🧍🏼‍♂️' => ':man-standing-medium-light-skin-tone:', + '🧍🏽‍♂️' => ':man-standing-medium-skin-tone:', + '🦸🏿‍♂️' => ':man-superhero-dark-skin-tone:', + '🦸🏻‍♂️' => ':man-superhero-light-skin-tone:', + '🦸🏾‍♂️' => ':man-superhero-medium-dark-skin-tone:', + '🦸🏼‍♂️' => ':man-superhero-medium-light-skin-tone:', + '🦸🏽‍♂️' => ':man-superhero-medium-skin-tone:', + '🦹🏿‍♂️' => ':man-supervillain-dark-skin-tone:', + '🦹🏻‍♂️' => ':man-supervillain-light-skin-tone:', + '🦹🏾‍♂️' => ':man-supervillain-medium-dark-skin-tone:', + '🦹🏼‍♂️' => ':man-supervillain-medium-light-skin-tone:', + '🦹🏽‍♂️' => ':man-supervillain-medium-skin-tone:', + '🏄🏿‍♂️' => ':man-surfing-dark-skin-tone:', + '🏄🏻‍♂️' => ':man-surfing-light-skin-tone:', + '🏄🏾‍♂️' => ':man-surfing-medium-dark-skin-tone:', + '🏄🏼‍♂️' => ':man-surfing-medium-light-skin-tone:', + '🏄🏽‍♂️' => ':man-surfing-medium-skin-tone:', + '🏊🏿‍♂️' => ':man-swimming-dark-skin-tone:', + '🏊🏻‍♂️' => ':man-swimming-light-skin-tone:', + '🏊🏾‍♂️' => ':man-swimming-medium-dark-skin-tone:', + '🏊🏼‍♂️' => ':man-swimming-medium-light-skin-tone:', + '🏊🏽‍♂️' => ':man-swimming-medium-skin-tone:', + '💁🏿‍♂️' => ':man-tipping-hand-dark-skin-tone:', + '💁🏻‍♂️' => ':man-tipping-hand-light-skin-tone:', + '💁🏾‍♂️' => ':man-tipping-hand-medium-dark-skin-tone:', + '💁🏼‍♂️' => ':man-tipping-hand-medium-light-skin-tone:', + '💁🏽‍♂️' => ':man-tipping-hand-medium-skin-tone:', + '🧛🏿‍♂️' => ':man-vampire-dark-skin-tone:', + '🧛🏻‍♂️' => ':man-vampire-light-skin-tone:', + '🧛🏾‍♂️' => ':man-vampire-medium-dark-skin-tone:', + '🧛🏼‍♂️' => ':man-vampire-medium-light-skin-tone:', + '🧛🏽‍♂️' => ':man-vampire-medium-skin-tone:', + '🚶🏿‍♂️' => ':man-walking-dark-skin-tone:', + '🚶🏻‍♂️' => ':man-walking-light-skin-tone:', + '🚶🏾‍♂️' => ':man-walking-medium-dark-skin-tone:', + '🚶🏼‍♂️' => ':man-walking-medium-light-skin-tone:', + '🚶🏽‍♂️' => ':man-walking-medium-skin-tone:', + '👳🏿‍♂️' => ':man-wearing-turban-dark-skin-tone:', + '👳🏻‍♂️' => ':man-wearing-turban-light-skin-tone:', + '👳🏾‍♂️' => ':man-wearing-turban-medium-dark-skin-tone:', + '👳🏼‍♂️' => ':man-wearing-turban-medium-light-skin-tone:', + '👳🏽‍♂️' => ':man-wearing-turban-medium-skin-tone:', + '👰🏿‍♂️' => ':man-with-veil-dark-skin-tone:', + '👰🏻‍♂️' => ':man-with-veil-light-skin-tone:', + '👰🏾‍♂️' => ':man-with-veil-medium-dark-skin-tone:', + '👰🏼‍♂️' => ':man-with-veil-medium-light-skin-tone:', + '👰🏽‍♂️' => ':man-with-veil-medium-skin-tone:', + '🧜🏿‍♀️' => ':mermaid-dark-skin-tone:', + '🧜🏻‍♀️' => ':mermaid-light-skin-tone:', + '🧜🏾‍♀️' => ':mermaid-medium-dark-skin-tone:', + '🧜🏼‍♀️' => ':mermaid-medium-light-skin-tone:', + '🧜🏽‍♀️' => ':mermaid-medium-skin-tone:', + '🧜🏿‍♂️' => ':merman-dark-skin-tone:', + '🧜🏻‍♂️' => ':merman-light-skin-tone:', + '🧜🏾‍♂️' => ':merman-medium-dark-skin-tone:', + '🧜🏼‍♂️' => ':merman-medium-light-skin-tone:', + '🧜🏽‍♂️' => ':merman-medium-skin-tone:', '🧑‍🤝‍🧑' => ':people-holding-hands:', + '🧎🏿‍➡️' => ':person-kneeling-facing-right-dark-skin-tone:', + '🧎🏻‍➡️' => ':person-kneeling-facing-right-light-skin-tone:', + '🧎🏾‍➡️' => ':person-kneeling-facing-right-medium-dark-skin-tone:', + '🧎🏼‍➡️' => ':person-kneeling-facing-right-medium-light-skin-tone:', + '🧎🏽‍➡️' => ':person-kneeling-facing-right-medium-skin-tone:', + '🏃🏿‍➡️' => ':person-running-facing-right-dark-skin-tone:', + '🏃🏻‍➡️' => ':person-running-facing-right-light-skin-tone:', + '🏃🏾‍➡️' => ':person-running-facing-right-medium-dark-skin-tone:', + '🏃🏼‍➡️' => ':person-running-facing-right-medium-light-skin-tone:', + '🏃🏽‍➡️' => ':person-running-facing-right-medium-skin-tone:', + '🚶🏿‍➡️' => ':person-walking-facing-right-dark-skin-tone:', + '🚶🏻‍➡️' => ':person-walking-facing-right-light-skin-tone:', + '🚶🏾‍➡️' => ':person-walking-facing-right-medium-dark-skin-tone:', + '🚶🏼‍➡️' => ':person-walking-facing-right-medium-light-skin-tone:', + '🚶🏽‍➡️' => ':person-walking-facing-right-medium-skin-tone:', + '🧑🏿‍✈️' => ':pilot-dark-skin-tone:', + '🧑🏻‍✈️' => ':pilot-light-skin-tone:', + '🧑🏾‍✈️' => ':pilot-medium-dark-skin-tone:', + '🧑🏼‍✈️' => ':pilot-medium-light-skin-tone:', + '🧑🏽‍✈️' => ':pilot-medium-skin-tone:', '🏳️‍⚧️' => ':transgender-flag:', + '🚴🏿‍♀️' => ':woman-biking-dark-skin-tone:', + '🚴🏻‍♀️' => ':woman-biking-light-skin-tone:', + '🚴🏾‍♀️' => ':woman-biking-medium-dark-skin-tone:', + '🚴🏼‍♀️' => ':woman-biking-medium-light-skin-tone:', + '🚴🏽‍♀️' => ':woman-biking-medium-skin-tone:', '⛹️‍♀️' => ':woman-bouncing-ball:', + '⛹🏿‍♀️' => ':woman-bouncing-ball-dark-skin-tone:', + '⛹🏻‍♀️' => ':woman-bouncing-ball-light-skin-tone:', + '⛹🏾‍♀️' => ':woman-bouncing-ball-medium-dark-skin-tone:', + '⛹🏼‍♀️' => ':woman-bouncing-ball-medium-light-skin-tone:', + '⛹🏽‍♀️' => ':woman-bouncing-ball-medium-skin-tone:', + '🙇🏿‍♀️' => ':woman-bowing-dark-skin-tone:', + '🙇🏻‍♀️' => ':woman-bowing-light-skin-tone:', + '🙇🏾‍♀️' => ':woman-bowing-medium-dark-skin-tone:', + '🙇🏼‍♀️' => ':woman-bowing-medium-light-skin-tone:', + '🙇🏽‍♀️' => ':woman-bowing-medium-skin-tone:', + '🤸🏿‍♀️' => ':woman-cartwheeling-dark-skin-tone:', + '🤸🏻‍♀️' => ':woman-cartwheeling-light-skin-tone:', + '🤸🏾‍♀️' => ':woman-cartwheeling-medium-dark-skin-tone:', + '🤸🏼‍♀️' => ':woman-cartwheeling-medium-light-skin-tone:', + '🤸🏽‍♀️' => ':woman-cartwheeling-medium-skin-tone:', + '🧗🏿‍♀️' => ':woman-climbing-dark-skin-tone:', + '🧗🏻‍♀️' => ':woman-climbing-light-skin-tone:', + '🧗🏾‍♀️' => ':woman-climbing-medium-dark-skin-tone:', + '🧗🏼‍♀️' => ':woman-climbing-medium-light-skin-tone:', + '🧗🏽‍♀️' => ':woman-climbing-medium-skin-tone:', + '👷🏿‍♀️' => ':woman-construction-worker-dark-skin-tone:', + '👷🏻‍♀️' => ':woman-construction-worker-light-skin-tone:', + '👷🏾‍♀️' => ':woman-construction-worker-medium-dark-skin-tone:', + '👷🏼‍♀️' => ':woman-construction-worker-medium-light-skin-tone:', + '👷🏽‍♀️' => ':woman-construction-worker-medium-skin-tone:', + '🧔🏿‍♀️' => ':woman-dark-skin-tone-beard:', + '👱🏿‍♀️' => ':woman-dark-skin-tone-blond-hair:', + '🕵🏿‍♀️' => ':woman-detective-dark-skin-tone:', + '🕵🏻‍♀️' => ':woman-detective-light-skin-tone:', + '🕵🏾‍♀️' => ':woman-detective-medium-dark-skin-tone:', + '🕵🏼‍♀️' => ':woman-detective-medium-light-skin-tone:', + '🕵🏽‍♀️' => ':woman-detective-medium-skin-tone:', + '🧝🏿‍♀️' => ':woman-elf-dark-skin-tone:', + '🧝🏻‍♀️' => ':woman-elf-light-skin-tone:', + '🧝🏾‍♀️' => ':woman-elf-medium-dark-skin-tone:', + '🧝🏼‍♀️' => ':woman-elf-medium-light-skin-tone:', + '🧝🏽‍♀️' => ':woman-elf-medium-skin-tone:', + '🤦🏿‍♀️' => ':woman-facepalming-dark-skin-tone:', + '🤦🏻‍♀️' => ':woman-facepalming-light-skin-tone:', + '🤦🏾‍♀️' => ':woman-facepalming-medium-dark-skin-tone:', + '🤦🏼‍♀️' => ':woman-facepalming-medium-light-skin-tone:', + '🤦🏽‍♀️' => ':woman-facepalming-medium-skin-tone:', + '🧚🏿‍♀️' => ':woman-fairy-dark-skin-tone:', + '🧚🏻‍♀️' => ':woman-fairy-light-skin-tone:', + '🧚🏾‍♀️' => ':woman-fairy-medium-dark-skin-tone:', + '🧚🏼‍♀️' => ':woman-fairy-medium-light-skin-tone:', + '🧚🏽‍♀️' => ':woman-fairy-medium-skin-tone:', + '🙍🏿‍♀️' => ':woman-frowning-dark-skin-tone:', + '🙍🏻‍♀️' => ':woman-frowning-light-skin-tone:', + '🙍🏾‍♀️' => ':woman-frowning-medium-dark-skin-tone:', + '🙍🏼‍♀️' => ':woman-frowning-medium-light-skin-tone:', + '🙍🏽‍♀️' => ':woman-frowning-medium-skin-tone:', + '🙅🏿‍♀️' => ':woman-gesturing-no-dark-skin-tone:', + '🙅🏻‍♀️' => ':woman-gesturing-no-light-skin-tone:', + '🙅🏾‍♀️' => ':woman-gesturing-no-medium-dark-skin-tone:', + '🙅🏼‍♀️' => ':woman-gesturing-no-medium-light-skin-tone:', + '🙅🏽‍♀️' => ':woman-gesturing-no-medium-skin-tone:', + '🙆🏿‍♀️' => ':woman-gesturing-ok-dark-skin-tone:', + '🙆🏻‍♀️' => ':woman-gesturing-ok-light-skin-tone:', + '🙆🏾‍♀️' => ':woman-gesturing-ok-medium-dark-skin-tone:', + '🙆🏼‍♀️' => ':woman-gesturing-ok-medium-light-skin-tone:', + '🙆🏽‍♀️' => ':woman-gesturing-ok-medium-skin-tone:', + '💇🏿‍♀️' => ':woman-getting-haircut-dark-skin-tone:', + '💇🏻‍♀️' => ':woman-getting-haircut-light-skin-tone:', + '💇🏾‍♀️' => ':woman-getting-haircut-medium-dark-skin-tone:', + '💇🏼‍♀️' => ':woman-getting-haircut-medium-light-skin-tone:', + '💇🏽‍♀️' => ':woman-getting-haircut-medium-skin-tone:', + '💆🏿‍♀️' => ':woman-getting-massage-dark-skin-tone:', + '💆🏻‍♀️' => ':woman-getting-massage-light-skin-tone:', + '💆🏾‍♀️' => ':woman-getting-massage-medium-dark-skin-tone:', + '💆🏼‍♀️' => ':woman-getting-massage-medium-light-skin-tone:', + '💆🏽‍♀️' => ':woman-getting-massage-medium-skin-tone:', '🏌️‍♀️' => ':woman-golfing:', + '🏌🏿‍♀️' => ':woman-golfing-dark-skin-tone:', + '🏌🏻‍♀️' => ':woman-golfing-light-skin-tone:', + '🏌🏾‍♀️' => ':woman-golfing-medium-dark-skin-tone:', + '🏌🏼‍♀️' => ':woman-golfing-medium-light-skin-tone:', + '🏌🏽‍♀️' => ':woman-golfing-medium-skin-tone:', + '💂🏿‍♀️' => ':woman-guard-dark-skin-tone:', + '💂🏻‍♀️' => ':woman-guard-light-skin-tone:', + '💂🏾‍♀️' => ':woman-guard-medium-dark-skin-tone:', + '💂🏼‍♀️' => ':woman-guard-medium-light-skin-tone:', + '💂🏽‍♀️' => ':woman-guard-medium-skin-tone:', + '👩🏿‍⚕️' => ':woman-health-worker-dark-skin-tone:', + '👩🏻‍⚕️' => ':woman-health-worker-light-skin-tone:', + '👩🏾‍⚕️' => ':woman-health-worker-medium-dark-skin-tone:', + '👩🏼‍⚕️' => ':woman-health-worker-medium-light-skin-tone:', + '👩🏽‍⚕️' => ':woman-health-worker-medium-skin-tone:', + '🧘🏿‍♀️' => ':woman-in-lotus-position-dark-skin-tone:', + '🧘🏻‍♀️' => ':woman-in-lotus-position-light-skin-tone:', + '🧘🏾‍♀️' => ':woman-in-lotus-position-medium-dark-skin-tone:', + '🧘🏼‍♀️' => ':woman-in-lotus-position-medium-light-skin-tone:', + '🧘🏽‍♀️' => ':woman-in-lotus-position-medium-skin-tone:', + '🧖🏿‍♀️' => ':woman-in-steamy-room-dark-skin-tone:', + '🧖🏻‍♀️' => ':woman-in-steamy-room-light-skin-tone:', + '🧖🏾‍♀️' => ':woman-in-steamy-room-medium-dark-skin-tone:', + '🧖🏼‍♀️' => ':woman-in-steamy-room-medium-light-skin-tone:', + '🧖🏽‍♀️' => ':woman-in-steamy-room-medium-skin-tone:', + '🤵🏿‍♀️' => ':woman-in-tuxedo-dark-skin-tone:', + '🤵🏻‍♀️' => ':woman-in-tuxedo-light-skin-tone:', + '🤵🏾‍♀️' => ':woman-in-tuxedo-medium-dark-skin-tone:', + '🤵🏼‍♀️' => ':woman-in-tuxedo-medium-light-skin-tone:', + '🤵🏽‍♀️' => ':woman-in-tuxedo-medium-skin-tone:', + '👩🏿‍⚖️' => ':woman-judge-dark-skin-tone:', + '👩🏻‍⚖️' => ':woman-judge-light-skin-tone:', + '👩🏾‍⚖️' => ':woman-judge-medium-dark-skin-tone:', + '👩🏼‍⚖️' => ':woman-judge-medium-light-skin-tone:', + '👩🏽‍⚖️' => ':woman-judge-medium-skin-tone:', + '🤹🏿‍♀️' => ':woman-juggling-dark-skin-tone:', + '🤹🏻‍♀️' => ':woman-juggling-light-skin-tone:', + '🤹🏾‍♀️' => ':woman-juggling-medium-dark-skin-tone:', + '🤹🏼‍♀️' => ':woman-juggling-medium-light-skin-tone:', + '🤹🏽‍♀️' => ':woman-juggling-medium-skin-tone:', + '🧎🏿‍♀️' => ':woman-kneeling-dark-skin-tone:', + '🧎🏻‍♀️' => ':woman-kneeling-light-skin-tone:', + '🧎🏾‍♀️' => ':woman-kneeling-medium-dark-skin-tone:', + '🧎🏼‍♀️' => ':woman-kneeling-medium-light-skin-tone:', + '🧎🏽‍♀️' => ':woman-kneeling-medium-skin-tone:', '🏋️‍♀️' => ':woman-lifting-weights:', - '👱‍♂️' => ':blond-haired-man:', - '👱‍♀️' => ':blond-haired-woman:', + '🏋🏿‍♀️' => ':woman-lifting-weights-dark-skin-tone:', + '🏋🏻‍♀️' => ':woman-lifting-weights-light-skin-tone:', + '🏋🏾‍♀️' => ':woman-lifting-weights-medium-dark-skin-tone:', + '🏋🏼‍♀️' => ':woman-lifting-weights-medium-light-skin-tone:', + '🏋🏽‍♀️' => ':woman-lifting-weights-medium-skin-tone:', + '🧔🏻‍♀️' => ':woman-light-skin-tone-beard:', + '👱🏻‍♀️' => ':woman-light-skin-tone-blond-hair:', + '🧙🏿‍♀️' => ':woman-mage-dark-skin-tone:', + '🧙🏻‍♀️' => ':woman-mage-light-skin-tone:', + '🧙🏾‍♀️' => ':woman-mage-medium-dark-skin-tone:', + '🧙🏼‍♀️' => ':woman-mage-medium-light-skin-tone:', + '🧙🏽‍♀️' => ':woman-mage-medium-skin-tone:', + '🧔🏾‍♀️' => ':woman-medium-dark-skin-tone-beard:', + '👱🏾‍♀️' => ':woman-medium-dark-skin-tone-blond-hair:', + '🧔🏼‍♀️' => ':woman-medium-light-skin-tone-beard:', + '👱🏼‍♀️' => ':woman-medium-light-skin-tone-blond-hair:', + '🧔🏽‍♀️' => ':woman-medium-skin-tone-beard:', + '👱🏽‍♀️' => ':woman-medium-skin-tone-blond-hair:', + '🚵🏿‍♀️' => ':woman-mountain-biking-dark-skin-tone:', + '🚵🏻‍♀️' => ':woman-mountain-biking-light-skin-tone:', + '🚵🏾‍♀️' => ':woman-mountain-biking-medium-dark-skin-tone:', + '🚵🏼‍♀️' => ':woman-mountain-biking-medium-light-skin-tone:', + '🚵🏽‍♀️' => ':woman-mountain-biking-medium-skin-tone:', + '👩🏿‍✈️' => ':woman-pilot-dark-skin-tone:', + '👩🏻‍✈️' => ':woman-pilot-light-skin-tone:', + '👩🏾‍✈️' => ':woman-pilot-medium-dark-skin-tone:', + '👩🏼‍✈️' => ':woman-pilot-medium-light-skin-tone:', + '👩🏽‍✈️' => ':woman-pilot-medium-skin-tone:', + '🤾🏿‍♀️' => ':woman-playing-handball-dark-skin-tone:', + '🤾🏻‍♀️' => ':woman-playing-handball-light-skin-tone:', + '🤾🏾‍♀️' => ':woman-playing-handball-medium-dark-skin-tone:', + '🤾🏼‍♀️' => ':woman-playing-handball-medium-light-skin-tone:', + '🤾🏽‍♀️' => ':woman-playing-handball-medium-skin-tone:', + '🤽🏿‍♀️' => ':woman-playing-water-polo-dark-skin-tone:', + '🤽🏻‍♀️' => ':woman-playing-water-polo-light-skin-tone:', + '🤽🏾‍♀️' => ':woman-playing-water-polo-medium-dark-skin-tone:', + '🤽🏼‍♀️' => ':woman-playing-water-polo-medium-light-skin-tone:', + '🤽🏽‍♀️' => ':woman-playing-water-polo-medium-skin-tone:', + '👮🏿‍♀️' => ':woman-police-officer-dark-skin-tone:', + '👮🏻‍♀️' => ':woman-police-officer-light-skin-tone:', + '👮🏾‍♀️' => ':woman-police-officer-medium-dark-skin-tone:', + '👮🏼‍♀️' => ':woman-police-officer-medium-light-skin-tone:', + '👮🏽‍♀️' => ':woman-police-officer-medium-skin-tone:', + '🙎🏿‍♀️' => ':woman-pouting-dark-skin-tone:', + '🙎🏻‍♀️' => ':woman-pouting-light-skin-tone:', + '🙎🏾‍♀️' => ':woman-pouting-medium-dark-skin-tone:', + '🙎🏼‍♀️' => ':woman-pouting-medium-light-skin-tone:', + '🙎🏽‍♀️' => ':woman-pouting-medium-skin-tone:', + '🙋🏿‍♀️' => ':woman-raising-hand-dark-skin-tone:', + '🙋🏻‍♀️' => ':woman-raising-hand-light-skin-tone:', + '🙋🏾‍♀️' => ':woman-raising-hand-medium-dark-skin-tone:', + '🙋🏼‍♀️' => ':woman-raising-hand-medium-light-skin-tone:', + '🙋🏽‍♀️' => ':woman-raising-hand-medium-skin-tone:', + '🚣🏿‍♀️' => ':woman-rowing-boat-dark-skin-tone:', + '🚣🏻‍♀️' => ':woman-rowing-boat-light-skin-tone:', + '🚣🏾‍♀️' => ':woman-rowing-boat-medium-dark-skin-tone:', + '🚣🏼‍♀️' => ':woman-rowing-boat-medium-light-skin-tone:', + '🚣🏽‍♀️' => ':woman-rowing-boat-medium-skin-tone:', + '🏃🏿‍♀️' => ':woman-running-dark-skin-tone:', + '🏃🏻‍♀️' => ':woman-running-light-skin-tone:', + '🏃🏾‍♀️' => ':woman-running-medium-dark-skin-tone:', + '🏃🏼‍♀️' => ':woman-running-medium-light-skin-tone:', + '🏃🏽‍♀️' => ':woman-running-medium-skin-tone:', + '🤷🏿‍♀️' => ':woman-shrugging-dark-skin-tone:', + '🤷🏻‍♀️' => ':woman-shrugging-light-skin-tone:', + '🤷🏾‍♀️' => ':woman-shrugging-medium-dark-skin-tone:', + '🤷🏼‍♀️' => ':woman-shrugging-medium-light-skin-tone:', + '🤷🏽‍♀️' => ':woman-shrugging-medium-skin-tone:', + '🧍🏿‍♀️' => ':woman-standing-dark-skin-tone:', + '🧍🏻‍♀️' => ':woman-standing-light-skin-tone:', + '🧍🏾‍♀️' => ':woman-standing-medium-dark-skin-tone:', + '🧍🏼‍♀️' => ':woman-standing-medium-light-skin-tone:', + '🧍🏽‍♀️' => ':woman-standing-medium-skin-tone:', + '🦸🏿‍♀️' => ':woman-superhero-dark-skin-tone:', + '🦸🏻‍♀️' => ':woman-superhero-light-skin-tone:', + '🦸🏾‍♀️' => ':woman-superhero-medium-dark-skin-tone:', + '🦸🏼‍♀️' => ':woman-superhero-medium-light-skin-tone:', + '🦸🏽‍♀️' => ':woman-superhero-medium-skin-tone:', + '🦹🏿‍♀️' => ':woman-supervillain-dark-skin-tone:', + '🦹🏻‍♀️' => ':woman-supervillain-light-skin-tone:', + '🦹🏾‍♀️' => ':woman-supervillain-medium-dark-skin-tone:', + '🦹🏼‍♀️' => ':woman-supervillain-medium-light-skin-tone:', + '🦹🏽‍♀️' => ':woman-supervillain-medium-skin-tone:', + '🏄🏿‍♀️' => ':woman-surfing-dark-skin-tone:', + '🏄🏻‍♀️' => ':woman-surfing-light-skin-tone:', + '🏄🏾‍♀️' => ':woman-surfing-medium-dark-skin-tone:', + '🏄🏼‍♀️' => ':woman-surfing-medium-light-skin-tone:', + '🏄🏽‍♀️' => ':woman-surfing-medium-skin-tone:', + '🏊🏿‍♀️' => ':woman-swimming-dark-skin-tone:', + '🏊🏻‍♀️' => ':woman-swimming-light-skin-tone:', + '🏊🏾‍♀️' => ':woman-swimming-medium-dark-skin-tone:', + '🏊🏼‍♀️' => ':woman-swimming-medium-light-skin-tone:', + '🏊🏽‍♀️' => ':woman-swimming-medium-skin-tone:', + '💁🏿‍♀️' => ':woman-tipping-hand-dark-skin-tone:', + '💁🏻‍♀️' => ':woman-tipping-hand-light-skin-tone:', + '💁🏾‍♀️' => ':woman-tipping-hand-medium-dark-skin-tone:', + '💁🏼‍♀️' => ':woman-tipping-hand-medium-light-skin-tone:', + '💁🏽‍♀️' => ':woman-tipping-hand-medium-skin-tone:', + '🧛🏿‍♀️' => ':woman-vampire-dark-skin-tone:', + '🧛🏻‍♀️' => ':woman-vampire-light-skin-tone:', + '🧛🏾‍♀️' => ':woman-vampire-medium-dark-skin-tone:', + '🧛🏼‍♀️' => ':woman-vampire-medium-light-skin-tone:', + '🧛🏽‍♀️' => ':woman-vampire-medium-skin-tone:', + '🚶🏿‍♀️' => ':woman-walking-dark-skin-tone:', + '🚶🏻‍♀️' => ':woman-walking-light-skin-tone:', + '🚶🏾‍♀️' => ':woman-walking-medium-dark-skin-tone:', + '🚶🏼‍♀️' => ':woman-walking-medium-light-skin-tone:', + '🚶🏽‍♀️' => ':woman-walking-medium-skin-tone:', + '👳🏿‍♀️' => ':woman-wearing-turban-dark-skin-tone:', + '👳🏻‍♀️' => ':woman-wearing-turban-light-skin-tone:', + '👳🏾‍♀️' => ':woman-wearing-turban-medium-dark-skin-tone:', + '👳🏼‍♀️' => ':woman-wearing-turban-medium-light-skin-tone:', + '👳🏽‍♀️' => ':woman-wearing-turban-medium-skin-tone:', + '👰🏿‍♀️' => ':woman-with-veil-dark-skin-tone:', + '👰🏻‍♀️' => ':woman-with-veil-light-skin-tone:', + '👰🏾‍♀️' => ':woman-with-veil-medium-dark-skin-tone:', + '👰🏼‍♀️' => ':woman-with-veil-medium-light-skin-tone:', + '👰🏽‍♀️' => ':woman-with-veil-medium-skin-tone:', + '🧑🏿‍🎨' => ':artist-dark-skin-tone:', + '🧑🏻‍🎨' => ':artist-light-skin-tone:', + '🧑🏾‍🎨' => ':artist-medium-dark-skin-tone:', + '🧑🏼‍🎨' => ':artist-medium-light-skin-tone:', + '🧑🏽‍🎨' => ':artist-medium-skin-tone:', + '🧑🏿‍🚀' => ':astronaut-dark-skin-tone:', + '🧑🏻‍🚀' => ':astronaut-light-skin-tone:', + '🧑🏾‍🚀' => ':astronaut-medium-dark-skin-tone:', + '🧑🏼‍🚀' => ':astronaut-medium-light-skin-tone:', + '🧑🏽‍🚀' => ':astronaut-medium-skin-tone:', + '👱‍♂️' => ':man-blond-hair:', + '👱‍♀️' => ':woman-blond-hair:', '⛓️‍💥' => ':broken-chain:', + '🧑🏿‍🍳' => ':cook-dark-skin-tone:', + '🧑🏻‍🍳' => ':cook-light-skin-tone:', + '🧑🏾‍🍳' => ':cook-medium-dark-skin-tone:', + '🧑🏼‍🍳' => ':cook-medium-light-skin-tone:', + '🧑🏽‍🍳' => ':cook-medium-skin-tone:', '🧏‍♂️' => ':deaf-man:', '🧏‍♀️' => ':deaf-woman:', '😶‍🌫️' => ':face-in-clouds:', - '👷‍♀️' => ':female-construction-worker:', - '👩‍⚕️' => ':female-doctor:', - '🧝‍♀️' => ':female-elf:', - '🧚‍♀️' => ':female-fairy:', - '🧞‍♀️' => ':female-genie:', - '💂‍♀️' => ':female-guard:', - '👩‍⚖️' => ':female-judge:', - '🧙‍♀️' => ':female-mage:', - '👩‍✈️' => ':female-pilot:', - '👮‍♀️' => ':female-police-officer:', - '🦸‍♀️' => ':female-superhero:', - '🦹‍♀️' => ':female-supervillain:', - '🧛‍♀️' => ':female-vampire:', - '🧟‍♀️' => ':female-zombie:', + '🧑🏿‍🏭' => ':factory-worker-dark-skin-tone:', + '🧑🏻‍🏭' => ':factory-worker-light-skin-tone:', + '🧑🏾‍🏭' => ':factory-worker-medium-dark-skin-tone:', + '🧑🏼‍🏭' => ':factory-worker-medium-light-skin-tone:', + '🧑🏽‍🏭' => ':factory-worker-medium-skin-tone:', + '🧑🏿‍🌾' => ':farmer-dark-skin-tone:', + '🧑🏻‍🌾' => ':farmer-light-skin-tone:', + '🧑🏾‍🌾' => ':farmer-medium-dark-skin-tone:', + '🧑🏼‍🌾' => ':farmer-medium-light-skin-tone:', + '🧑🏽‍🌾' => ':farmer-medium-skin-tone:', + '👷‍♀️' => ':woman-construction-worker:', + '👩‍⚕️' => ':woman-health-worker:', + '🧝‍♀️' => ':woman-elf:', + '🧚‍♀️' => ':woman-fairy:', + '🧞‍♀️' => ':woman-genie:', + '💂‍♀️' => ':woman-guard:', + '👩‍⚖️' => ':woman-judge:', + '🧙‍♀️' => ':woman-mage:', + '👩‍✈️' => ':woman-pilot:', + '👮‍♀️' => ':woman-police-officer:', + '🦸‍♀️' => ':woman-superhero:', + '🦹‍♀️' => ':woman-supervillain:', + '🧛‍♀️' => ':woman-vampire:', + '🧟‍♀️' => ':woman-zombie:', + '🧑🏿‍🚒' => ':firefighter-dark-skin-tone:', + '🧑🏻‍🚒' => ':firefighter-light-skin-tone:', + '🧑🏾‍🚒' => ':firefighter-medium-dark-skin-tone:', + '🧑🏼‍🚒' => ':firefighter-medium-light-skin-tone:', + '🧑🏽‍🚒' => ':firefighter-medium-skin-tone:', + '🏳️‍🌈' => ':rainbow-flag:', '🙂‍↔️' => ':head-shaking-horizontally:', '🙂‍↕️' => ':head-shaking-vertically:', '🧑‍⚕️' => ':health-worker:', '❤️‍🔥' => ':heart-on-fire:', '🧑‍⚖️' => ':judge:', - '👷‍♂️' => ':male-construction-worker:', - '👨‍⚕️' => ':male-doctor:', - '🧝‍♂️' => ':male-elf:', - '🧚‍♂️' => ':male-fairy:', - '🧞‍♂️' => ':male-genie:', - '💂‍♂️' => ':male-guard:', - '👨‍⚖️' => ':male-judge:', - '🧙‍♂️' => ':male-mage:', - '👨‍✈️' => ':male-pilot:', - '👮‍♂️' => ':male-police-officer:', - '🦸‍♂️' => ':male-superhero:', - '🦹‍♂️' => ':male-supervillain:', - '🧛‍♂️' => ':male-vampire:', - '🧟‍♂️' => ':male-zombie:', + '👷‍♂️' => ':man-construction-worker:', + '👨‍⚕️' => ':man-health-worker:', + '🧝‍♂️' => ':man-elf:', + '🧚‍♂️' => ':man-fairy:', + '🧞‍♂️' => ':man-genie:', + '💂‍♂️' => ':man-guard:', + '👨‍⚖️' => ':man-judge:', + '🧙‍♂️' => ':man-mage:', + '👨‍✈️' => ':man-pilot:', + '👮‍♂️' => ':man-police-officer:', + '🦸‍♂️' => ':man-superhero:', + '🦹‍♂️' => ':man-supervillain:', + '🧛‍♂️' => ':man-vampire:', + '🧟‍♂️' => ':man-zombie:', + '👨🏿‍🎨' => ':man-artist-dark-skin-tone:', + '👨🏻‍🎨' => ':man-artist-light-skin-tone:', + '👨🏾‍🎨' => ':man-artist-medium-dark-skin-tone:', + '👨🏼‍🎨' => ':man-artist-medium-light-skin-tone:', + '👨🏽‍🎨' => ':man-artist-medium-skin-tone:', + '👨🏿‍🚀' => ':man-astronaut-dark-skin-tone:', + '👨🏻‍🚀' => ':man-astronaut-light-skin-tone:', + '👨🏾‍🚀' => ':man-astronaut-medium-dark-skin-tone:', + '👨🏼‍🚀' => ':man-astronaut-medium-light-skin-tone:', + '👨🏽‍🚀' => ':man-astronaut-medium-skin-tone:', + '🧔‍♂️' => ':man-with-beard:', '🚴‍♂️' => ':man-biking:', '🙇‍♂️' => ':man-bowing:', '🤸‍♂️' => ':man-cartwheeling:', '🧗‍♂️' => ':man-climbing:', + '👨🏿‍🍳' => ':man-cook-dark-skin-tone:', + '👨🏻‍🍳' => ':man-cook-light-skin-tone:', + '👨🏾‍🍳' => ':man-cook-medium-dark-skin-tone:', + '👨🏼‍🍳' => ':man-cook-medium-light-skin-tone:', + '👨🏽‍🍳' => ':man-cook-medium-skin-tone:', + '👨🏿‍🦲' => ':man-dark-skin-tone-bald:', + '👨🏿‍🦱' => ':man-dark-skin-tone-curly-hair:', + '👨🏿‍🦰' => ':man-dark-skin-tone-red-hair:', + '👨🏿‍🦳' => ':man-dark-skin-tone-white-hair:', '🤦‍♂️' => ':man-facepalming:', + '👨🏿‍🏭' => ':man-factory-worker-dark-skin-tone:', + '👨🏻‍🏭' => ':man-factory-worker-light-skin-tone:', + '👨🏾‍🏭' => ':man-factory-worker-medium-dark-skin-tone:', + '👨🏼‍🏭' => ':man-factory-worker-medium-light-skin-tone:', + '👨🏽‍🏭' => ':man-factory-worker-medium-skin-tone:', + '👨🏿‍🌾' => ':man-farmer-dark-skin-tone:', + '👨🏻‍🌾' => ':man-farmer-light-skin-tone:', + '👨🏾‍🌾' => ':man-farmer-medium-dark-skin-tone:', + '👨🏼‍🌾' => ':man-farmer-medium-light-skin-tone:', + '👨🏽‍🌾' => ':man-farmer-medium-skin-tone:', + '👨🏿‍🍼' => ':man-feeding-baby-dark-skin-tone:', + '👨🏻‍🍼' => ':man-feeding-baby-light-skin-tone:', + '👨🏾‍🍼' => ':man-feeding-baby-medium-dark-skin-tone:', + '👨🏼‍🍼' => ':man-feeding-baby-medium-light-skin-tone:', + '👨🏽‍🍼' => ':man-feeding-baby-medium-skin-tone:', + '👨🏿‍🚒' => ':man-firefighter-dark-skin-tone:', + '👨🏻‍🚒' => ':man-firefighter-light-skin-tone:', + '👨🏾‍🚒' => ':man-firefighter-medium-dark-skin-tone:', + '👨🏼‍🚒' => ':man-firefighter-medium-light-skin-tone:', + '👨🏽‍🚒' => ':man-firefighter-medium-skin-tone:', '🙍‍♂️' => ':man-frowning:', '🙅‍♂️' => ':man-gesturing-no:', '🙆‍♂️' => ':man-gesturing-ok:', '💇‍♂️' => ':man-getting-haircut:', '💆‍♂️' => ':man-getting-massage:', '🧘‍♂️' => ':man-in-lotus-position:', + '👨🏿‍🦽' => ':man-in-manual-wheelchair-dark-skin-tone:', + '👨🏻‍🦽' => ':man-in-manual-wheelchair-light-skin-tone:', + '👨🏾‍🦽' => ':man-in-manual-wheelchair-medium-dark-skin-tone:', + '👨🏼‍🦽' => ':man-in-manual-wheelchair-medium-light-skin-tone:', + '👨🏽‍🦽' => ':man-in-manual-wheelchair-medium-skin-tone:', + '👨🏿‍🦼' => ':man-in-motorized-wheelchair-dark-skin-tone:', + '👨🏻‍🦼' => ':man-in-motorized-wheelchair-light-skin-tone:', + '👨🏾‍🦼' => ':man-in-motorized-wheelchair-medium-dark-skin-tone:', + '👨🏼‍🦼' => ':man-in-motorized-wheelchair-medium-light-skin-tone:', + '👨🏽‍🦼' => ':man-in-motorized-wheelchair-medium-skin-tone:', '🧖‍♂️' => ':man-in-steamy-room:', '🤵‍♂️' => ':man-in-tuxedo:', '🤹‍♂️' => ':man-juggling:', '🧎‍♂️' => ':man-kneeling:', + '👨🏻‍🦲' => ':man-light-skin-tone-bald:', + '👨🏻‍🦱' => ':man-light-skin-tone-curly-hair:', + '👨🏻‍🦰' => ':man-light-skin-tone-red-hair:', + '👨🏻‍🦳' => ':man-light-skin-tone-white-hair:', + '👨🏿‍🔧' => ':man-mechanic-dark-skin-tone:', + '👨🏻‍🔧' => ':man-mechanic-light-skin-tone:', + '👨🏾‍🔧' => ':man-mechanic-medium-dark-skin-tone:', + '👨🏼‍🔧' => ':man-mechanic-medium-light-skin-tone:', + '👨🏽‍🔧' => ':man-mechanic-medium-skin-tone:', + '👨🏾‍🦲' => ':man-medium-dark-skin-tone-bald:', + '👨🏾‍🦱' => ':man-medium-dark-skin-tone-curly-hair:', + '👨🏾‍🦰' => ':man-medium-dark-skin-tone-red-hair:', + '👨🏾‍🦳' => ':man-medium-dark-skin-tone-white-hair:', + '👨🏼‍🦲' => ':man-medium-light-skin-tone-bald:', + '👨🏼‍🦱' => ':man-medium-light-skin-tone-curly-hair:', + '👨🏼‍🦰' => ':man-medium-light-skin-tone-red-hair:', + '👨🏼‍🦳' => ':man-medium-light-skin-tone-white-hair:', + '👨🏽‍🦲' => ':man-medium-skin-tone-bald:', + '👨🏽‍🦱' => ':man-medium-skin-tone-curly-hair:', + '👨🏽‍🦰' => ':man-medium-skin-tone-red-hair:', + '👨🏽‍🦳' => ':man-medium-skin-tone-white-hair:', '🚵‍♂️' => ':man-mountain-biking:', + '👨🏿‍💼' => ':man-office-worker-dark-skin-tone:', + '👨🏻‍💼' => ':man-office-worker-light-skin-tone:', + '👨🏾‍💼' => ':man-office-worker-medium-dark-skin-tone:', + '👨🏼‍💼' => ':man-office-worker-medium-light-skin-tone:', + '👨🏽‍💼' => ':man-office-worker-medium-skin-tone:', '🤾‍♂️' => ':man-playing-handball:', '🤽‍♂️' => ':man-playing-water-polo:', '🙎‍♂️' => ':man-pouting:', '🙋‍♂️' => ':man-raising-hand:', '🚣‍♂️' => ':man-rowing-boat:', '🏃‍♂️' => ':man-running:', + '👨🏿‍🔬' => ':man-scientist-dark-skin-tone:', + '👨🏻‍🔬' => ':man-scientist-light-skin-tone:', + '👨🏾‍🔬' => ':man-scientist-medium-dark-skin-tone:', + '👨🏼‍🔬' => ':man-scientist-medium-light-skin-tone:', + '👨🏽‍🔬' => ':man-scientist-medium-skin-tone:', '🤷‍♂️' => ':man-shrugging:', + '👨🏿‍🎤' => ':man-singer-dark-skin-tone:', + '👨🏻‍🎤' => ':man-singer-light-skin-tone:', + '👨🏾‍🎤' => ':man-singer-medium-dark-skin-tone:', + '👨🏼‍🎤' => ':man-singer-medium-light-skin-tone:', + '👨🏽‍🎤' => ':man-singer-medium-skin-tone:', '🧍‍♂️' => ':man-standing:', + '👨🏿‍🎓' => ':man-student-dark-skin-tone:', + '👨🏻‍🎓' => ':man-student-light-skin-tone:', + '👨🏾‍🎓' => ':man-student-medium-dark-skin-tone:', + '👨🏼‍🎓' => ':man-student-medium-light-skin-tone:', + '👨🏽‍🎓' => ':man-student-medium-skin-tone:', '🏄‍♂️' => ':man-surfing:', '🏊‍♂️' => ':man-swimming:', + '👨🏿‍🏫' => ':man-teacher-dark-skin-tone:', + '👨🏻‍🏫' => ':man-teacher-light-skin-tone:', + '👨🏾‍🏫' => ':man-teacher-medium-dark-skin-tone:', + '👨🏼‍🏫' => ':man-teacher-medium-light-skin-tone:', + '👨🏽‍🏫' => ':man-teacher-medium-skin-tone:', + '👨🏿‍💻' => ':man-technologist-dark-skin-tone:', + '👨🏻‍💻' => ':man-technologist-light-skin-tone:', + '👨🏾‍💻' => ':man-technologist-medium-dark-skin-tone:', + '👨🏼‍💻' => ':man-technologist-medium-light-skin-tone:', + '👨🏽‍💻' => ':man-technologist-medium-skin-tone:', '💁‍♂️' => ':man-tipping-hand:', '🚶‍♂️' => ':man-walking:', '👳‍♂️' => ':man-wearing-turban:', - '🧔‍♂️' => ':man-with-beard:', '👰‍♂️' => ':man-with-veil:', - '🤼‍♂️' => ':man-wrestling:', + '👨🏿‍🦯' => ':man-with-white-cane-dark-skin-tone:', + '👨🏻‍🦯' => ':man-with-white-cane-light-skin-tone:', + '👨🏾‍🦯' => ':man-with-white-cane-medium-dark-skin-tone:', + '👨🏼‍🦯' => ':man-with-white-cane-medium-light-skin-tone:', + '👨🏽‍🦯' => ':man-with-white-cane-medium-skin-tone:', + '🤼‍♂️' => ':men-wrestling:', + '🧑🏿‍🔧' => ':mechanic-dark-skin-tone:', + '🧑🏻‍🔧' => ':mechanic-light-skin-tone:', + '🧑🏾‍🔧' => ':mechanic-medium-dark-skin-tone:', + '🧑🏼‍🔧' => ':mechanic-medium-light-skin-tone:', + '🧑🏽‍🔧' => ':mechanic-medium-skin-tone:', '👯‍♂️' => ':men-with-bunny-ears-partying:', '❤️‍🩹' => ':mending-heart:', '🧜‍♀️' => ':mermaid:', '🧜‍♂️' => ':merman:', + '🧑🏿‍🎄' => ':mx-claus-dark-skin-tone:', + '🧑🏻‍🎄' => ':mx-claus-light-skin-tone:', + '🧑🏾‍🎄' => ':mx-claus-medium-dark-skin-tone:', + '🧑🏼‍🎄' => ':mx-claus-medium-light-skin-tone:', + '🧑🏽‍🎄' => ':mx-claus-medium-skin-tone:', + '🧑🏿‍💼' => ':office-worker-dark-skin-tone:', + '🧑🏻‍💼' => ':office-worker-light-skin-tone:', + '🧑🏾‍💼' => ':office-worker-medium-dark-skin-tone:', + '🧑🏼‍💼' => ':office-worker-medium-light-skin-tone:', + '🧑🏽‍💼' => ':office-worker-medium-skin-tone:', + '🧑🏿‍🦲' => ':person-dark-skin-tone-bald:', + '🧑🏿‍🦱' => ':person-dark-skin-tone-curly-hair:', + '🧑🏿‍🦰' => ':person-dark-skin-tone-red-hair:', + '🧑🏿‍🦳' => ':person-dark-skin-tone-white-hair:', + '🧑🏿‍🍼' => ':person-feeding-baby-dark-skin-tone:', + '🧑🏻‍🍼' => ':person-feeding-baby-light-skin-tone:', + '🧑🏾‍🍼' => ':person-feeding-baby-medium-dark-skin-tone:', + '🧑🏼‍🍼' => ':person-feeding-baby-medium-light-skin-tone:', + '🧑🏽‍🍼' => ':person-feeding-baby-medium-skin-tone:', + '🧑🏿‍🦽' => ':person-in-manual-wheelchair-dark-skin-tone:', + '🧑🏻‍🦽' => ':person-in-manual-wheelchair-light-skin-tone:', + '🧑🏾‍🦽' => ':person-in-manual-wheelchair-medium-dark-skin-tone:', + '🧑🏼‍🦽' => ':person-in-manual-wheelchair-medium-light-skin-tone:', + '🧑🏽‍🦽' => ':person-in-manual-wheelchair-medium-skin-tone:', + '🧑🏿‍🦼' => ':person-in-motorized-wheelchair-dark-skin-tone:', + '🧑🏻‍🦼' => ':person-in-motorized-wheelchair-light-skin-tone:', + '🧑🏾‍🦼' => ':person-in-motorized-wheelchair-medium-dark-skin-tone:', + '🧑🏼‍🦼' => ':person-in-motorized-wheelchair-medium-light-skin-tone:', + '🧑🏽‍🦼' => ':person-in-motorized-wheelchair-medium-skin-tone:', '🧎‍➡️' => ':person-kneeling-facing-right:', + '🧑🏻‍🦲' => ':person-light-skin-tone-bald:', + '🧑🏻‍🦱' => ':person-light-skin-tone-curly-hair:', + '🧑🏻‍🦰' => ':person-light-skin-tone-red-hair:', + '🧑🏻‍🦳' => ':person-light-skin-tone-white-hair:', + '🧑🏾‍🦲' => ':person-medium-dark-skin-tone-bald:', + '🧑🏾‍🦱' => ':person-medium-dark-skin-tone-curly-hair:', + '🧑🏾‍🦰' => ':person-medium-dark-skin-tone-red-hair:', + '🧑🏾‍🦳' => ':person-medium-dark-skin-tone-white-hair:', + '🧑🏼‍🦲' => ':person-medium-light-skin-tone-bald:', + '🧑🏼‍🦱' => ':person-medium-light-skin-tone-curly-hair:', + '🧑🏼‍🦰' => ':person-medium-light-skin-tone-red-hair:', + '🧑🏼‍🦳' => ':person-medium-light-skin-tone-white-hair:', + '🧑🏽‍🦲' => ':person-medium-skin-tone-bald:', + '🧑🏽‍🦱' => ':person-medium-skin-tone-curly-hair:', + '🧑🏽‍🦰' => ':person-medium-skin-tone-red-hair:', + '🧑🏽‍🦳' => ':person-medium-skin-tone-white-hair:', '🏃‍➡️' => ':person-running-facing-right:', '🚶‍➡️' => ':person-walking-facing-right:', + '🧑🏿‍🦯' => ':person-with-white-cane-dark-skin-tone:', + '🧑🏻‍🦯' => ':person-with-white-cane-light-skin-tone:', + '🧑🏾‍🦯' => ':person-with-white-cane-medium-dark-skin-tone:', + '🧑🏼‍🦯' => ':person-with-white-cane-medium-light-skin-tone:', + '🧑🏽‍🦯' => ':person-with-white-cane-medium-skin-tone:', '🧑‍✈️' => ':pilot:', '🏴‍☠️' => ':pirate-flag:', '🐻‍❄️' => ':polar-bear:', - '🏳️‍🌈' => ':rainbow-flag:', + '🧑🏿‍🔬' => ':scientist-dark-skin-tone:', + '🧑🏻‍🔬' => ':scientist-light-skin-tone:', + '🧑🏾‍🔬' => ':scientist-medium-dark-skin-tone:', + '🧑🏼‍🔬' => ':scientist-medium-light-skin-tone:', + '🧑🏽‍🔬' => ':scientist-medium-skin-tone:', + '🧑🏿‍🎤' => ':singer-dark-skin-tone:', + '🧑🏻‍🎤' => ':singer-light-skin-tone:', + '🧑🏾‍🎤' => ':singer-medium-dark-skin-tone:', + '🧑🏼‍🎤' => ':singer-medium-light-skin-tone:', + '🧑🏽‍🎤' => ':singer-medium-skin-tone:', + '🧑🏿‍🎓' => ':student-dark-skin-tone:', + '🧑🏻‍🎓' => ':student-light-skin-tone:', + '🧑🏾‍🎓' => ':student-medium-dark-skin-tone:', + '🧑🏼‍🎓' => ':student-medium-light-skin-tone:', + '🧑🏽‍🎓' => ':student-medium-skin-tone:', + '🧑🏿‍🏫' => ':teacher-dark-skin-tone:', + '🧑🏻‍🏫' => ':teacher-light-skin-tone:', + '🧑🏾‍🏫' => ':teacher-medium-dark-skin-tone:', + '🧑🏼‍🏫' => ':teacher-medium-light-skin-tone:', + '🧑🏽‍🏫' => ':teacher-medium-skin-tone:', + '🧑🏿‍💻' => ':technologist-dark-skin-tone:', + '🧑🏻‍💻' => ':technologist-light-skin-tone:', + '🧑🏾‍💻' => ':technologist-medium-dark-skin-tone:', + '🧑🏼‍💻' => ':technologist-medium-light-skin-tone:', + '🧑🏽‍💻' => ':technologist-medium-skin-tone:', + '👩🏿‍🎨' => ':woman-artist-dark-skin-tone:', + '👩🏻‍🎨' => ':woman-artist-light-skin-tone:', + '👩🏾‍🎨' => ':woman-artist-medium-dark-skin-tone:', + '👩🏼‍🎨' => ':woman-artist-medium-light-skin-tone:', + '👩🏽‍🎨' => ':woman-artist-medium-skin-tone:', + '👩🏿‍🚀' => ':woman-astronaut-dark-skin-tone:', + '👩🏻‍🚀' => ':woman-astronaut-light-skin-tone:', + '👩🏾‍🚀' => ':woman-astronaut-medium-dark-skin-tone:', + '👩🏼‍🚀' => ':woman-astronaut-medium-light-skin-tone:', + '👩🏽‍🚀' => ':woman-astronaut-medium-skin-tone:', + '🧔‍♀️' => ':woman-with-beard:', '🚴‍♀️' => ':woman-biking:', '🙇‍♀️' => ':woman-bowing:', '🤸‍♀️' => ':woman-cartwheeling:', '🧗‍♀️' => ':woman-climbing:', + '👩🏿‍🍳' => ':woman-cook-dark-skin-tone:', + '👩🏻‍🍳' => ':woman-cook-light-skin-tone:', + '👩🏾‍🍳' => ':woman-cook-medium-dark-skin-tone:', + '👩🏼‍🍳' => ':woman-cook-medium-light-skin-tone:', + '👩🏽‍🍳' => ':woman-cook-medium-skin-tone:', + '👩🏿‍🦲' => ':woman-dark-skin-tone-bald:', + '👩🏿‍🦱' => ':woman-dark-skin-tone-curly-hair:', + '👩🏿‍🦰' => ':woman-dark-skin-tone-red-hair:', + '👩🏿‍🦳' => ':woman-dark-skin-tone-white-hair:', '🤦‍♀️' => ':woman-facepalming:', + '👩🏿‍🏭' => ':woman-factory-worker-dark-skin-tone:', + '👩🏻‍🏭' => ':woman-factory-worker-light-skin-tone:', + '👩🏾‍🏭' => ':woman-factory-worker-medium-dark-skin-tone:', + '👩🏼‍🏭' => ':woman-factory-worker-medium-light-skin-tone:', + '👩🏽‍🏭' => ':woman-factory-worker-medium-skin-tone:', + '👩🏿‍🌾' => ':woman-farmer-dark-skin-tone:', + '👩🏻‍🌾' => ':woman-farmer-light-skin-tone:', + '👩🏾‍🌾' => ':woman-farmer-medium-dark-skin-tone:', + '👩🏼‍🌾' => ':woman-farmer-medium-light-skin-tone:', + '👩🏽‍🌾' => ':woman-farmer-medium-skin-tone:', + '👩🏿‍🍼' => ':woman-feeding-baby-dark-skin-tone:', + '👩🏻‍🍼' => ':woman-feeding-baby-light-skin-tone:', + '👩🏾‍🍼' => ':woman-feeding-baby-medium-dark-skin-tone:', + '👩🏼‍🍼' => ':woman-feeding-baby-medium-light-skin-tone:', + '👩🏽‍🍼' => ':woman-feeding-baby-medium-skin-tone:', + '👩🏿‍🚒' => ':woman-firefighter-dark-skin-tone:', + '👩🏻‍🚒' => ':woman-firefighter-light-skin-tone:', + '👩🏾‍🚒' => ':woman-firefighter-medium-dark-skin-tone:', + '👩🏼‍🚒' => ':woman-firefighter-medium-light-skin-tone:', + '👩🏽‍🚒' => ':woman-firefighter-medium-skin-tone:', '🙍‍♀️' => ':woman-frowning:', '🙅‍♀️' => ':woman-gesturing-no:', '🙆‍♀️' => ':woman-gesturing-ok:', '💇‍♀️' => ':woman-getting-haircut:', '💆‍♀️' => ':woman-getting-massage:', '🧘‍♀️' => ':woman-in-lotus-position:', + '👩🏿‍🦽' => ':woman-in-manual-wheelchair-dark-skin-tone:', + '👩🏻‍🦽' => ':woman-in-manual-wheelchair-light-skin-tone:', + '👩🏾‍🦽' => ':woman-in-manual-wheelchair-medium-dark-skin-tone:', + '👩🏼‍🦽' => ':woman-in-manual-wheelchair-medium-light-skin-tone:', + '👩🏽‍🦽' => ':woman-in-manual-wheelchair-medium-skin-tone:', + '👩🏿‍🦼' => ':woman-in-motorized-wheelchair-dark-skin-tone:', + '👩🏻‍🦼' => ':woman-in-motorized-wheelchair-light-skin-tone:', + '👩🏾‍🦼' => ':woman-in-motorized-wheelchair-medium-dark-skin-tone:', + '👩🏼‍🦼' => ':woman-in-motorized-wheelchair-medium-light-skin-tone:', + '👩🏽‍🦼' => ':woman-in-motorized-wheelchair-medium-skin-tone:', '🧖‍♀️' => ':woman-in-steamy-room:', '🤵‍♀️' => ':woman-in-tuxedo:', '🤹‍♀️' => ':woman-juggling:', '🧎‍♀️' => ':woman-kneeling:', + '👩🏻‍🦲' => ':woman-light-skin-tone-bald:', + '👩🏻‍🦱' => ':woman-light-skin-tone-curly-hair:', + '👩🏻‍🦰' => ':woman-light-skin-tone-red-hair:', + '👩🏻‍🦳' => ':woman-light-skin-tone-white-hair:', + '👩🏿‍🔧' => ':woman-mechanic-dark-skin-tone:', + '👩🏻‍🔧' => ':woman-mechanic-light-skin-tone:', + '👩🏾‍🔧' => ':woman-mechanic-medium-dark-skin-tone:', + '👩🏼‍🔧' => ':woman-mechanic-medium-light-skin-tone:', + '👩🏽‍🔧' => ':woman-mechanic-medium-skin-tone:', + '👩🏾‍🦲' => ':woman-medium-dark-skin-tone-bald:', + '👩🏾‍🦱' => ':woman-medium-dark-skin-tone-curly-hair:', + '👩🏾‍🦰' => ':woman-medium-dark-skin-tone-red-hair:', + '👩🏾‍🦳' => ':woman-medium-dark-skin-tone-white-hair:', + '👩🏼‍🦲' => ':woman-medium-light-skin-tone-bald:', + '👩🏼‍🦱' => ':woman-medium-light-skin-tone-curly-hair:', + '👩🏼‍🦰' => ':woman-medium-light-skin-tone-red-hair:', + '👩🏼‍🦳' => ':woman-medium-light-skin-tone-white-hair:', + '👩🏽‍🦲' => ':woman-medium-skin-tone-bald:', + '👩🏽‍🦱' => ':woman-medium-skin-tone-curly-hair:', + '👩🏽‍🦰' => ':woman-medium-skin-tone-red-hair:', + '👩🏽‍🦳' => ':woman-medium-skin-tone-white-hair:', '🚵‍♀️' => ':woman-mountain-biking:', + '👩🏿‍💼' => ':woman-office-worker-dark-skin-tone:', + '👩🏻‍💼' => ':woman-office-worker-light-skin-tone:', + '👩🏾‍💼' => ':woman-office-worker-medium-dark-skin-tone:', + '👩🏼‍💼' => ':woman-office-worker-medium-light-skin-tone:', + '👩🏽‍💼' => ':woman-office-worker-medium-skin-tone:', '🤾‍♀️' => ':woman-playing-handball:', '🤽‍♀️' => ':woman-playing-water-polo:', '🙎‍♀️' => ':woman-pouting:', '🙋‍♀️' => ':woman-raising-hand:', '🚣‍♀️' => ':woman-rowing-boat:', '🏃‍♀️' => ':woman-running:', + '👩🏿‍🔬' => ':woman-scientist-dark-skin-tone:', + '👩🏻‍🔬' => ':woman-scientist-light-skin-tone:', + '👩🏾‍🔬' => ':woman-scientist-medium-dark-skin-tone:', + '👩🏼‍🔬' => ':woman-scientist-medium-light-skin-tone:', + '👩🏽‍🔬' => ':woman-scientist-medium-skin-tone:', '🤷‍♀️' => ':woman-shrugging:', + '👩🏿‍🎤' => ':woman-singer-dark-skin-tone:', + '👩🏻‍🎤' => ':woman-singer-light-skin-tone:', + '👩🏾‍🎤' => ':woman-singer-medium-dark-skin-tone:', + '👩🏼‍🎤' => ':woman-singer-medium-light-skin-tone:', + '👩🏽‍🎤' => ':woman-singer-medium-skin-tone:', '🧍‍♀️' => ':woman-standing:', + '👩🏿‍🎓' => ':woman-student-dark-skin-tone:', + '👩🏻‍🎓' => ':woman-student-light-skin-tone:', + '👩🏾‍🎓' => ':woman-student-medium-dark-skin-tone:', + '👩🏼‍🎓' => ':woman-student-medium-light-skin-tone:', + '👩🏽‍🎓' => ':woman-student-medium-skin-tone:', '🏄‍♀️' => ':woman-surfing:', '🏊‍♀️' => ':woman-swimming:', + '👩🏿‍🏫' => ':woman-teacher-dark-skin-tone:', + '👩🏻‍🏫' => ':woman-teacher-light-skin-tone:', + '👩🏾‍🏫' => ':woman-teacher-medium-dark-skin-tone:', + '👩🏼‍🏫' => ':woman-teacher-medium-light-skin-tone:', + '👩🏽‍🏫' => ':woman-teacher-medium-skin-tone:', + '👩🏿‍💻' => ':woman-technologist-dark-skin-tone:', + '👩🏻‍💻' => ':woman-technologist-light-skin-tone:', + '👩🏾‍💻' => ':woman-technologist-medium-dark-skin-tone:', + '👩🏼‍💻' => ':woman-technologist-medium-light-skin-tone:', + '👩🏽‍💻' => ':woman-technologist-medium-skin-tone:', '💁‍♀️' => ':woman-tipping-hand:', '🚶‍♀️' => ':wo 7802 man-walking:', '👳‍♀️' => ':woman-wearing-turban:', - '🧔‍♀️' => ':woman-with-beard:', '👰‍♀️' => ':woman-with-veil:', - '🤼‍♀️' => ':woman-wrestling:', + '👩🏿‍🦯' => ':woman-with-white-cane-dark-skin-tone:', + '👩🏻‍🦯' => ':woman-with-white-cane-light-skin-tone:', + '👩🏾‍🦯' => ':woman-with-white-cane-medium-dark-skin-tone:', + '👩🏼‍🦯' => ':woman-with-white-cane-medium-light-skin-tone:', + '👩🏽‍🦯' => ':woman-with-white-cane-medium-skin-tone:', + '🤼‍♀️' => ':women-wrestling:', '👯‍♀️' => ':women-with-bunny-ears-partying:', '🧑‍🎨' => ':artist:', + '*️⃣' => ':keycap-star:', '🧑‍🚀' => ':astronaut:', - '👨‍🦲' => ':bald-man:', + '👨‍🦲' => ':man-bald:', '🧑‍🦲' => ':person-bald:', - '👩‍🦲' => ':bald-woman:', + '👩‍🦲' => ':woman-bald:', '⛹‍♂' => ':bouncing-ball-man:', '⛹‍♀' => ':bouncing-ball-woman:', '🚴‍♂' => ':biking-man:', @@ -203,9 +1424,9 @@ '👷‍♂' => ':construction-worker-man:', '👷‍♀' => ':construction-worker-woman:', '🧑‍🍳' => ':cook:', - '👨‍🦱' => ':curly-haired-man:', + '👨‍🦱' => ':man-curly-hair:', '🧑‍🦱' => ':person-curly-hair:', - '👩‍🦱' => ':curly-haired-woman:', + '👩‍🦱' => ':woman-curly-hair:', '👯‍♂' => ':dancing-men:', '👯‍♀' => ':dancing-women:', '🧏‍♂' => ':deaf-man:', @@ -257,7 +1478,6 @@ '🧑‍⚕' => ':health-worker:', '❤‍🔥' => ':heart-on-fire:', '🧑‍⚖' => ':judge:', - '*️⃣' => ':keycap-star:', '🧎‍♂' => ':kneeling-man:', '🧎‍♀' => ':kneeling-woman:', '🍋‍🟩' => ':lime:', @@ -292,8 +1512,10 @@ '👨‍✈' => ':man-pilot:', '🤾‍♂' => ':man-playing-handball:', '🤽‍♂' => ':man-playing-water-polo:', + '👨‍🦰' => ':red-haired-man:', '🤷‍♂' => ':man-shrugging:', - '👨‍🦯' => ':man-with-probing-cane:', + '👨‍🦳' => ':white-haired-man:', + '👨‍🦯' => ':man-with-white-cane:', '👳‍♂' => ':man-with-turban:', '👰‍♂' => ':man-with-veil:', '💆‍♂' => ':massage-man:', @@ -318,7 +1540,7 @@ '🧑‍🦼' => ':person-in-motorized-wheelchair:', '🧑‍🦰' => ':red-haired-person:', '🧑‍🦳' => ':white-haired-person:', - '🧑‍🦯' => ':person-with-probing-cane:', + '🧑‍🦯' => ':person-with-white-cane:', '🐦‍🔥' => ':phoenix:', '🧑‍✈' => ':pilot:', '🏴‍☠' => ':pirate-flag:', @@ -330,8 +1552,7 @@ '🏳‍🌈' => ':rainbow-flag:', '🙋‍♂' => ':raising-hand-man:', '🙋‍♀' => ':raising-hand-woman:', - '👨‍🦰' => ':red-haired-man:', - '👩‍🦰' => ':red-haired-woman:', + '👩‍🦰' => ':woman-red-hair:', '🚣‍♂' => ':rowing-man:', '🚣‍♀' => ':rowing-woman:', '🏃‍♂' => ':running-man:', @@ -367,8 +1588,7 @@ '🚶‍♀' => ':walking-woman:', '🏋‍♂' => ':weight-lifting-man:', '🏋‍♀' => ':weight-lifting-woman:', - '👨‍🦳' => ':white-haired-man:', - '👩‍🦳' => ':white-haired-woman:', + '👩‍🦳' => ':woman-white-hair:', '🧔‍♀' => ':woman-beard:', '🤸‍♀' => ':woman-cartwheeling:', '🤦‍♀' => ':woman-facepalming:', @@ -383,16 +1603,17 @@ '🤾‍♀' => ':woman-playing-handball:', '🤽‍♀' => ':woman-playing-water-polo:', '🤷‍♀' => ':woman-shrugging:', - '👩‍🦯' => ':woman-with-probing-cane:', + '👩‍🦯' => ':woman-with-white-cane:', '👳‍♀' => ':woman-with-turban:', '🤼‍♀' => ':women-wrestling:', '0️⃣' => ':zero:', '🧟‍♂' => ':zombie-man:', '🧟‍♀' => ':zombie-woman:', '🅰️' => ':a:', - '🎟️' => ':admission-tickets:', + '🎟️' => ':tickets:', '🇦🇫' => ':flag-af:', '✈️' => ':airplane:', + '🛩️' => ':small-airplane:', '🇦🇽' => ':flag-ax:', '🇦🇱' => ':flag-al:', '⚗️' => ':alembic:', @@ -404,6 +1625,7 @@ '👼🏽' => ':angel-tone3:', '👼🏾' => ':angel-tone4:', '👼🏿' => ':angel-tone5:', + '🗯️' => ':right-anger-bubble:', '🇦🇴' => ':flag-ao:', '🇦🇮' => ':flag-ai:', '🇦🇶' => ':flag-aq:', @@ -444,7 +1666,8 @@ '‼️' => ':bangbang:', '🇧🇩' => ':flag-bd:', '🇧🇧' => ':flag-bb:', - '🌥️' => ':barely-sunny:', + '🌥️' => ':white-sun-cloud:', + '⛹️' => ':person-with-ball:', '⛹🏻' => ':basketball-player-tone1:', '⛹🏼' => ':basketball-player-tone2:', '⛹🏽' => ':basketball-player-tone3:', @@ -456,6 +1679,7 @@ '🛀🏾' => ':bath-tone4:', '🛀🏿' => ':bath-tone5:', '🏖️' => ':beach-with-umbrella:', + '⛱️' => ':umbrella-on-ground:', '🛏️' => ':bed:', '🇧🇾' => ':flag-by:', '🇧🇪' => ':flag-be:', @@ -470,14 +1694,14 @@ '🚴🏾' => ':bicyclist-tone4:', '🚴🏿' => ':bicyclist-tone5:', '☣️' => ':biohazard-sign:', - '⏺️' => ':black-circle-for-record:', - '⏮️' => ':black-left-pointing-double-triangle-with-vertical-bar:', + '⏺️' => ':record-button:', + '⏮️' => ':track-previous:', '◼️' => ':black-medium-square:', '✒️' => ':black-nib:', - '⏭️' => ':black-right-pointing-double-triangle-with-vertical-bar:', - '⏯️' => ':black-right-pointing-triangle-with-double-vertical-bar:', + '⏭️' => ':track-next:', + '⏯️' => ':play-pause:', '▪️' => ':black-small-square:', - '⏹️' => ':black-square-for-stop:', + '⏹️' => ':stop-button:', '🇧🇴' => ':flag-bo:', '🇧🇦' => ':flag-ba:', '🇧🇼' => ':flag-bw:', @@ -493,6 +1717,11 @@ '👦🏾' => ':boy-tone4:', '👦🏿' => ':boy-tone5:', '🇧🇷' => ':flag-br:', + '🤱🏿' => ':breast-feeding-dark-skin-tone:', + '🤱🏻' => ':breast-feeding-light-skin-tone:', + '🤱🏾' => ':breast-feeding-medium-dark-skin-tone:', + '🤱🏼' => ':breast-feeding-medium-light-skin-tone:', + '🤱🏽' => ':breast-feeding-medium-skin-tone:', '👰🏻' => ':bride-with-veil-tone1:', '👰🏼' => ':bride-with-veil-tone2:', '👰🏽' => ':bride-with-veil-tone3:', @@ -501,10 +1730,11 @@ '🇮🇴' => ':flag-io:', '🇻🇬' => ':flag-vg:', '🇧🇳' => ':flag-bn:', - '🏗️' => ':building-construction:', + '🏗️' => ':construction-site:', '🇧🇬' => ':flag-bg:', '🇧🇫' => ':flag-bf:', '🇧🇮' => ':flag-bi:', + '🗓️' => ':spiral-calendar-pad:', '🤙🏻' => ':call-me-tone1:', '🤙🏼' => ':call-me-tone2:', '🤙🏽' => ':call-me-tone3:', @@ -518,7 +1748,7 @@ '🕯️' => ':candle:', '🇨🇻' => ':flag-cv:', '🗃️' => ':card-file-box:', - '🗂️' => ':card-index-dividers:', + '🗂️' => ':dividers:', '🇧🇶' => ':flag-bq:', '🤸🏻' => ':cartwheel-tone1:', '🤸🏼' => ':cartwheel-tone2:', @@ -531,6 +1761,11 @@ '🇹🇩' => ':flag-td:', '⛓️' => ':chains:', '♟️' => ':chess-pawn:', + '🧒🏿' => ':child-dark-skin-tone:', + '🧒🏻' => ':child-light-skin-tone:', + '🧒🏾' => ':child-medium-dark-skin-tone:', + '🧒🏼' => ':child-medium-light-skin-tone:', + '🧒🏽' => ':child-medium-skin-tone:', '🇨🇱' => ':flag-cl:', '🐿️' => ':chipmunk:', '🇨🇽' => ':flag-cx:', @@ -542,7 +1777,12 @@ '👏🏿' => ':clap-tone5:', '🏛️' => ':classical-building:', '🇨🇵' => ':flag-cp:', + '🕰️' => ':mantelpiece-clock:', '☁️' => ':cloud:', + '🌩️' => ':lightning:', + '🌧️' => ':rain-cloud:', + '🌨️' => ':snow-cloud:', + '🌪️' => ':tornado:', '♣️' => ':clubs:', '🇨🇳' => ':flag-cn:', '🇨🇨' => ':flag-cc:', @@ -570,8 +1810,16 @@ '🇨🇷' => ':flag-cr:', '🇨🇮' => ':flag-ci:', '🛋️' => ':couch-and-lamp:', + '💑🏿' => ':couple-with-heart-dark-skin-tone:', + '💑🏻' => ':couple-with-heart-light-skin-tone:', + '💑🏾' => ':couple-with-heart-medium-dark-skin-tone:', + '💑🏼' => ':couple-with-heart-medium-light-skin-tone:', + '💑🏽' => ':couple-with-heart-medium-skin-tone:', + '🖍️' => ':lower-left-crayon:', '🇭🇷' => ':flag-hr:', + '✝️' => ':latin-cross:', '⚔️' => ':crossed-swords:', + '🛳️' => ':passenger-ship:', '🇨🇺' => ':flag-cu:', '🇨🇼' => ':flag-cw:', '🇨🇾' => ':flag-cy:', @@ -584,23 +1832,33 @@ '💃🏿' => ':dancer-tone5:', '🕶️' => ':dark-sunglasses:', '🇩🇪' => ':flag-de:', + '🧏🏿' => ':deaf-person-dark-skin-tone:', + '🧏🏻' => ':deaf-person-light-skin-tone:', + '🧏🏾' => ':deaf-person-medium-dark-skin-tone:', + '🧏🏼' => ':deaf-person-medium-light-skin-tone:', + '🧏🏽' => ':deaf-person-medium-skin-tone:', '🇩🇰' => ':flag-dk:', - '🏚️' => ':derelict-house-building:', + '🏚️' => ':house-abandoned:', '🏜️' => ':desert:', - '🏝️' => ':desert-island:', + '🏝️' => ':island:', '🖥️' => ':desktop-computer:', '♦️' => ':diamonds:', '🇩🇬' => ':flag-dg:', '🇩🇯' => ':flag-dj:', '🇩🇲' => ':flag-dm:', '🇩🇴' => ':flag-do:', - '⏸️' => ':double-vertical-bar:', + '⏸️' => ':pause-button:', '🕊️' => ':dove-of-peace:', '👂🏻' => ':ear-tone1:', '👂🏼' => ':ear-tone2:', '👂🏽' => ':ear-tone3:', '👂🏾' => ':ear-tone4:', '👂🏿' => ':ear-tone5:', + '🦻🏿' => ':ear-with-hearing-aid-dark-skin-tone:', + '🦻🏻' => ':ear-with-hearing-aid-light-skin-tone:', + '🦻🏾' => ':ear-with-hearing-aid-medium-dark-skin-tone:', + '🦻🏼' => ':ear-with-hearing-aid-medium-light-skin-tone:', + '🦻🏽' => ':ear-with-hearing-aid-medium-skin-tone:', '🇪🇨' => ':flag-ec:', '🇪🇬' => ':flag-eg:', '8⃣' => ':eight:', @@ -608,7 +1866,12 @@ '✳️' => ':eight-spoked-asterisk:', '⏏️' => ':eject:', '🇸🇻' => ':flag-sv:', - '✉️' => ':email:', + '🧝🏿' => ':elf-dark-skin-tone:', + '🧝🏻' => ':elf-light-skin-tone:', + '🧝🏾' => ':elf-medium-dark-skin-tone:', + '🧝🏼' => ':elf-medium-light-skin-tone:', + '🧝🏽' => ':elf-medium-skin-tone:', + '✉️' => ':envelope:', '🇬🇶' => ':flag-gq:', '🇪🇷' => ':flag-er:', '🇪🇸' => ':flag-es:', @@ -621,6 +1884,11 @@ '🤦🏽' => ':face-palm-tone3:', '🤦🏾' => ':face-palm-tone4:', '🤦🏿' => ':face-palm-tone5:', + '🧚🏿' => ':fairy-dark-skin-tone:', + '🧚🏻' => ':fairy-light-skin-tone:', + '🧚🏾' => ':fairy-medium-dark-skin-tone:', + '🧚🏼' => ':fairy-medium-light-skin-tone:', + '🧚🏽' => ':fairy-medium-skin-tone:', '🇫🇰' => ':flag-fk:', '🇫🇴' => ':flag-fo:', '♀️' => ':female-sign:', @@ -628,7 +1896,7 @@ '🇫🇯' => ':flag-fj:', '🗄️' => ':file-cabinet:', '🎞️' => ':film-frames:', - '📽️' => ':film-projector:', + '📽️' => ':projector:', '🤞🏻' => ':fingers-crossed-tone1:', '🤞🏼' => ':fingers-crossed-tone2:', '🤞🏽' => ':fingers-crossed-tone3:', @@ -808,6 +2076,7 @@ '🇻🇳' => ':vietnam:', '🇻🇺' => ':vanuatu:', '🇼🇫' => ':wallis-futuna:', + '🏳️' => ':waving-white-flag:', '🇼🇸' => ':samoa:', '🇽🇰' => ':kosovo:', '🇾🇪' => ':yemen:', @@ -817,10 +2086,16 @@ '🇿🇼' => ':zimbabwe:', '⚜️' => ':fleur-de-lis:', '🌫️' => ':fog:', + '🦶🏿' => ':foot-dark-skin-tone:', + '🦶🏻' => ':foot-light-skin-tone:', + '🦶🏾' => ':foot-medium-dark-skin-tone:', + '🦶🏼' => ':foot-medium-light-skin-tone:', + '🦶🏽' => ':foot-medium-skin-tone:', + '🍽️' => ':knife-fork-plate:', '4⃣' => ':four:', '🖼️' => ':frame-with-picture:', - '⚱️' => ':funeral-urn:', - '🏳🌈' => ':gay-pride-flag:', + '☹️' => ':white-frowning-face:', + '⚱️' => ':urn:', '⚙️' => ':gear:', '👧🏻' => ':girl-tone1:', '👧🏼' => ':girl-tone2:', @@ -838,13 +2113,19 @@ '💇🏽' => ':haircut-tone3:', '💇🏾' => ':haircut-tone4:', '💇🏿' => ':haircut-tone5:', - '⚒️' => ':hammer-and-pick:', - '🛠️' => ':hammer-and-wrench:', + '⚒️' => ':hammer-pick:', + '🛠️' => ':tools:', + '🖐️' => ':raised-hand-with-fingers-splayed:', '🖐🏻' => ':hand-splayed-tone1:', '🖐🏼' => ':hand-splayed-tone2:', '🖐🏽' => ':hand-splayed-tone3:', '🖐🏾' => ':hand-splayed-tone4:', '🖐🏿' => ':hand-splayed-tone5:', + '🫰🏿' => ':hand-with-index-finger-and-thumb-crossed-dark-skin-tone:', + '🫰🏻' => ':hand-with-index-finger-and-thumb-crossed-light-skin-tone:', + '🫰🏾' => ':hand-with-index-finger-and-thumb-crossed-medium-dark-skin-tone:', + '🫰🏼' => ':hand-with-index-finger-and-thumb-crossed-medium-light-skin-tone:', + '🫰🏽' => ':hand-with-index-finger-and-thumb-crossed-medium-skin-tone:', '🤾🏻' => ':handball-tone1:', '🤾🏼' => ':handball-tone2:', '🤾🏽' => ':handball-tone3:', @@ -857,12 +2138,18 @@ '🤝🏿' => ':handshake-tone5:', '#⃣' => ':hash:', '❤️' => ':heart:', + '❣️' => ':heavy-heart-exclamation-mark-ornament:', + '🫶🏿' => ':heart-hands-dark-skin-tone:', + '🫶🏻' => ':heart-hands-light-skin-tone:', + '🫶🏾' => ':heart-hands-medium-dark-skin-tone:', + '🫶🏼' => ':heart-hands-medium-light-skin-tone:', + '🫶🏽' => ':heart-hands-medium-skin-tone:', '♥️' => ':hearts:', '✔️' => ':heavy-check-mark:', - '❣️' => ':heavy-heart-exclamation-mark-ornament:', '✖️' => ':heavy-multiplication-x:', '⛑️' => ':helmet-with-white-cross:', '🕳️' => ':hole:', + '🏘️' => ':house-buildings:', '🏇🏻' => ':horse-racing-tone1:', '🏇🏼' => ':horse-racing-tone2:', '🏇🏽' => ':horse-racing-tone3:', @@ -870,8 +2157,12 @@ '🏇🏿' => ':horse-racing-tone5:', '🌶️' => ':hot-pepper:', '♨️' => ':hotsprings:', - '🏘️' => ':house-buildings:', '⛸️' => ':ice-skate:', + '🫵🏿' => ':index-pointing-at-the-viewer-dark-skin-tone:', + '🫵🏻' => ':index-pointing-at-the-viewer-light-skin-tone:', + '🫵🏾' => ':index-pointing-at-the-viewer-medium-dark-skin-tone:', + '🫵🏼' => ':index-pointing-at-the-viewer-medium-light-skin-tone:', + '🫵🏽' => ':index-pointing-at-the-viewer-medium-skin-tone:', '♾️' => ':infinity:', '💁🏻' => ':information-desk-person-tone1:', '💁🏼' => ':information-desk-person-tone2:', @@ -886,38 +2177,66 @@ '🤹🏽' => ':juggling-tone3:', '🤹🏾' => ':juggling-tone4:', '🤹🏿' => ':juggling-tone5:', + '🗝️' => ':old-key:', '⌨️' => ':keyboard:', - '🍽️' => ':knife-fork-plate:', + '💏🏿' => ':kiss-dark-skin-tone:', + '💏🏻' => ':kiss-light-skin-tone:', + '💏🏾' => ':kiss-medium-dark-skin-tone:', + '💏🏼' => ':kiss-medium-light-skin-tone:', + '💏🏽' => ':kiss-medium-skin-tone:', '🏷️' => ':label:', - '✝️' => ':latin-cross:', '🤛🏻' => ':left-facing-fist-tone1:', '🤛🏼' => ':left-facing-fist-tone2:', '🤛🏽' => ':left-facing-fist-tone3:', '🤛🏾' => ':left-facing-fist-tone4:', '🤛🏿' => ':left-facing-fist-tone5:', '↔️' => ':left-right-arrow:', - '🗨️' => ':left-speech-bubble:', + '🗨️' => ':speech-left:', '↩️' => ':leftwards-arrow-with-hook:', + '🫲🏿' => ':leftwards-hand-dark-skin-tone:', + '🫲🏻' => ':leftwards-hand-light-skin-tone:', + '🫲🏾' => ':leftwards-hand-medium-dark-skin-tone:', + '🫲🏼' => ':leftwards-hand-medium-light-skin-tone:', + '🫲🏽' => ':leftwards-hand-medium-skin-tone:', + '🫷🏿' => ':leftwards-pushing-hand-dark-skin-tone:', + '🫷🏻' => ':leftwards-pushing-hand-light-skin-tone:', + '🫷🏾' => ':leftwards-pushing-hand-medium-dark-skin-tone:', + '🫷🏼' => ':leftwards-pushing-hand-medium-light-skin-tone:', + '🫷🏽' => ':leftwards-pushing-hand-medium-skin-tone:', + '🦵🏿' => ':leg-dark-skin-tone:', + '🦵🏻' => ':leg-light-skin-tone:', + '🦵🏾' => ':leg-medium-dark-skin-tone:', + '🦵🏼' => ':leg-medium-light-skin-tone:', + '🦵🏽' => ':leg-medium-skin-tone:', '🎚️' => ':level-slider:', + '🕴️' => ':man-in-business-suit-levitating:', + '🏋️' => ':weight-lifter:', '🏋🏻' => ':lifter-tone1:', '🏋🏼' => ':lifter-tone2:', '🏋🏽' => ':lifter-tone3:', '🏋🏾' => ':lifter-tone4:', '🏋🏿' => ':lifter-tone5:', - '🌩️' => ':lightning:', - '🖇️' => ':linked-paperclips:', - '🖊️' => ':lower-left-ballpoint-pen:', - '🖍️' => ':lower-left-crayon:', - '🖋️' => ':lower-left-fountain-pen:', - '🖌️' => ':lower-left-paintbrush:', + '🖇️' => ':paperclips:', + '🤟🏿' => ':love-you-gesture-dark-skin-tone:', + '🤟🏻' => ':love-you-gesture-light-skin-tone:', + '🤟🏾' => ':love-you-gesture-medium-dark-skin-tone:', + '🤟🏼' => ':love-you-gesture-medium-light-skin-tone:', + '🤟🏽' => ':love-you-gesture-medium-skin-tone:', + '🖊️' => ':pen-ballpoint:', + '🖋️' => ':pen-fountain:', + '🖌️' => ':paintbrush:', 'Ⓜ️' => ':m:', + '🧙🏿' => ':mage-dark-skin-tone:', + '🧙🏻' => ':mage-light-skin-tone:', + '🧙🏾' => ':mage-medium-dark-skin-tone:', + '🧙🏼' => ':mage-medium-light-skin-tone:', + '🧙🏽' => ':mage-medium-skin-tone:', '♂️' => ':male-sign:', '🕺🏻' => ':man-dancing-tone1:', '🕺🏼' => ':man-dancing-tone2:', '🕺🏽' => ':man-dancing-tone3:', '🕺🏾' => ':man-dancing-tone4:', '🕺🏿' => ':man-dancing-tone5:', - '🕴️' => ':man-in-business-suit-levitating:', '🤵🏻' => ':man-in-tuxedo-tone1:', '🤵🏼' => ':man-in-tuxedo-tone2:', '🤵🏽' => ':man-in-tuxedo-tone3:', @@ -938,26 +2257,38 @@ '👳🏽' => ':man-with-turban-tone3:', '👳🏾' => ':man-with-turban-tone4:', '👳🏿' => ':man-with-turban-tone5:', - '🕰️' => ':mantelpiece-clock:', + '🗺️' => ':world-map:', '💆🏻' => ':massage-tone1:', '💆🏼' => ':massage-tone2:', '💆🏽' => ':massage-tone3:', '💆🏾' => ':massage-tone4:', '💆🏿' => ':massage-tone5:', - '🎖️' => ':medal:', + '🎖️' => ':military-medal:', '⚕️' => ':medical-symbol:', + '👬🏿' => ':men-holding-hands-dark-skin-tone:', + '👬🏻' => ':men-holding-hands-light-skin-tone:', + '👬🏾' => ':men-holding-hands-medium-dark-skin-tone:', + '👬🏼' => ':men-holding-hands-medium-light-skin-tone:', + '👬🏽' => ':men-holding-hands-medium-skin-tone:', + '🧜🏿' => ':merperson-dark-skin-tone:', + '🧜🏻' => ':merperson-light-skin-tone:', + '🧜🏾' => ':merperson-medium-dark-skin-tone:', + '🧜🏼' => ':merperson-medium-light-skin-tone:', + '🧜🏽' => ':merperson-medium-skin-tone:', '🤘🏻' => ':metal-tone1:', '🤘🏼' => ':metal-tone2:', '🤘🏽' => ':metal-tone3:', '🤘🏾' => ':metal-tone4:', '🤘🏿' => ':metal-tone5:', + '🎙️' => ':studio-microphone:', '🖕🏻' => ':middle-finger-tone1:', '🖕🏼' => ':middle-finger-tone2:', '🖕🏽' => ':middle-finger-tone3:', '🖕🏾' => ':middle-finger-tone4:', '🖕🏿' => ':middle-finger-tone5:', - '🌤️' => ':mostly-sunny:', - '🛥️' => ':motor-boat:', + '🌤️' => ':white-sun-small-cloud:', + '🛥️' => ':motorboat:', + '🏍️' => ':racing-motorcycle:', '🛣️' => ':motorway:', '⛰️' => ':mountain:', '🚵🏻' => ':mountain-bicyclist-tone1:', @@ -965,6 +2296,8 @@ '🚵🏽' => ':mountain-bicyclist-tone3:', '🚵🏾' => ':mountain-bicyclist-tone4:', '🚵🏿' => ':mountain-bicyclist-tone5:', + '🏔️' => ':snow-capped-mountain:', + '🖱️' => ':three-button-mouse:', '🤶🏻' => ':mrs-claus-tone1:', '🤶🏼' => ':mrs-claus-tone2:', '🤶🏽' => ':mrs-claus-tone3:', @@ -980,8 +2313,14 @@ '💅🏽' => ':nail-care-tone3:', '💅🏾' => ':nail-care-tone4:', '💅🏿' => ':nail-care-tone5:', - '🏞️' => ':national-park:', + '🏞️' => ':park:', + '🗞️' => ':rolled-up-newspaper:', '9⃣' => ':nine:', + '🥷🏿' => ':ninja-dark-skin-tone:', + '🥷🏻' => ':ninja-light-skin-tone:', + '🥷🏾' => ':ninja-medium-dark-skin-tone:', + '🥷🏼' => ':ninja-medium-light-skin-tone:', + '🥷🏽' => ':ninja-medium-skin-tone:', '🙅🏻' => ':no-good-tone1:', '🙅🏼' => ':no-good-tone2:', '🙅🏽' => ':no-good-tone3:', @@ -992,6 +2331,7 @@ '👃🏽' => ':nose-tone3:', '👃🏾' => ':nose-tone4:', '👃🏿' => ':nose-tone5:', + '🗒️' => ':spiral-note-pad:', '🅾️' => ':o2:', '🛢️' => ':oil-drum:', '👌🏻' => ':ok-hand-tone1:', @@ -1004,12 +2344,16 @@ '🙆🏽' => ':ok-woman-tone3:', '🙆🏾' => ':ok-woman-tone4:', '🙆🏿' => ':ok-woman-tone5:', - '🗝️' => ':old-key:', '👴🏻' => ':older-man-tone1:', '👴🏼' => ':older-man-tone2:', '👴🏽' => ':older-man-tone3:', '👴🏾' => ':older-man-tone4:', '👴🏿' => ':older-man-tone5:', + '🧓🏿' => ':older-person-dark-skin-tone:', + '🧓🏻' => ':older-person-light-skin-tone:', + '🧓🏾' => ':older-person-medium-dark-skin-tone:', + '🧓🏼' => ':older-person-medium-light-skin-tone:', + '🧓🏽' => ':older-person-medium-skin-tone:', '👵🏻' => ':older-woman-tone1:', '👵🏼' => ':older-woman-tone2:', '👵🏽' => ':older-woman-tone3:', @@ -1023,30 +2367,108 @@ '👐🏾' => ':open-hands-tone4:', '👐🏿' => ':open-hands-tone5:', '☦️' => ':orthodox-cross:', + '🫳🏿' => ':palm-down-hand-dark-skin-tone:', + '🫳🏻' => ':palm-down-hand-light-skin-tone:', + '🫳🏾' => ':palm-down-hand-medium-dark-skin-tone:', + '🫳🏼' => ':palm-down-hand-medium-light-skin-tone:', + '🫳🏽' => ':palm-down-hand-medium-skin-tone:', + '🫴🏿' => ':palm-up-hand-dark-skin-tone:', + '🫴🏻' => ':palm-up-hand-light-skin-tone:', + '🫴🏾' => ':palm-up-hand-medium-dark-skin-tone:', + '🫴🏼' => ':palm-up-hand-medium-light-skin-tone:', + '🫴🏽' => ':palm-up-hand-medium-skin-tone:', + '🤲🏿' => ':palms-up-together-dark-skin-tone:', + '🤲🏻' => ':palms-up-together-light-skin-tone:', + '🤲🏾' => ':palms-up-together-medium-dark-skin-tone:', + '🤲🏼' => ':palms-up-together-medium-light-skin-tone:', + '🤲🏽' => ':palms-up-together-medium-skin-tone:', '🅿️' => ':parking:', '〽️' => ':part-alternation-mark:', - '🌦️' => ':partly-sunny-rain:', - '🛳️' => ':passenger-ship:', + '🌦️' => ':white-sun-rain-cloud:', '☮️' => ':peace-symbol:', '✏️' => ':pencil2:', + '🧗🏿' => ':person-climbing-dark-skin-tone:', + '🧗🏻' => ':person-climbing-light-skin-tone:', + '🧗🏾' => ':person-climbing-medium-dark-skin-tone:', + '🧗🏼' => ':person-climbing-medium-light-skin-tone:', + '🧗🏽' => ':person-climbing-medium-skin-tone:', + '🧑🏿' => ':person-dark-skin-tone:', + '🧔🏿' => ':person-dark-skin-tone-beard:', '🙍🏻' => ':person-frowning-tone1:', '🙍🏼' => ':person-frowning-tone2:', '🙍🏽' => ':person-frowning-tone3:', '🙍🏾' => ':person-frowning-tone4:', '🙍🏿' => ':person-frowning-tone5:', - '⛹️' => ':person-with-ball:', + '🏌🏿' => ':person-golfing-dark-skin-tone:', + '🏌🏻' => ':person-golfing-light-skin-tone:', + '🏌🏾' => ':person-golfing-medium-dark-skin-tone:', + '🏌🏼' => ':person-golfing-medium-light-skin-tone:', + '🏌🏽' => ':person-golfing-medium-skin-tone:', + '🛌🏿' => ':person-in-bed-dark-skin-tone:', + '🛌🏻' => ':person-in-bed-light-skin-tone:', + '🛌🏾' => ':person-in-bed-medium-dark-skin-tone:', + '🛌🏼' => ':person-in-bed-medium-light-skin-tone:', + '🛌🏽' => ':person-in-bed-medium-skin-tone:', + '🧘🏿' => ':person-in-lotus-position-dark-skin-tone:', + '🧘🏻' => ':person-in-lotus-position-light-skin-tone:', + '🧘🏾' => ':person-in-lotus-position-medium-dark-skin-tone:', + '🧘🏼' => ':person-in-lotus-position-medium-light-skin-tone:', + '🧘🏽' => ':person-in-lotus-position-medium-skin-tone:', + '🧖🏿' => ':person-in-steamy-room-dark-skin-tone:', + '🧖🏻' => ':person-in-steamy-room-light-skin-tone:', + '🧖🏾' => ':person-in-steamy-room-medium-dark-skin-tone:', + '🧖🏼' => ':person-in-steamy-room-medium-light-skin-tone:', + '🧖🏽' => ':person-in-steamy-room-medium-skin-tone:', + '🕴🏿' => ':person-in-suit-levitating-dark-skin-tone:', + '🕴🏻' => ':person-in-suit-levitating-light-skin-tone:', + '🕴🏾' => ':person-in-suit-levitating-medium-dark-skin-tone:', + '🕴🏼' => ':person-in-suit-levitating-medium-light-skin-tone:', + '🕴🏽' => ':person-in-suit-levitating-medium-skin-tone:', + '🧎🏿' => ':person-kneeling-dark-skin-tone:', + '🧎🏻' => ':person-kneeling-light-skin-tone:', + '🧎🏾' => ':person-kneeling-medium-dark-skin-tone:', + '🧎🏼' => ':person-kneeling-medium-light-skin-tone:', + '🧎🏽' => ':person-kneeling-medium-skin-tone:', + '🧑🏻' => ':person-light-skin-tone:', + '🧔🏻' => ':person-light-skin-tone-beard:', + '🧑🏾' => ':person-medium-dark-skin-tone:', + '🧔🏾' => ':person-medium-dark-skin-tone-beard:', + '🧑🏼' => ':person-medium-light-skin-tone:', + '🧔🏼' => ':person-medium-light-skin-tone-beard:', + '🧑🏽' => ':person-medium-skin-tone:', + '🧔🏽' => ':person-medium-skin-tone-beard:', + '🧍🏿' => ':person-standing-dark-skin-tone:', + '🧍🏻' => ':person-standing-light-skin-tone:', + '🧍🏾' => ':person-standing-medium-dark-skin-tone:', + '🧍🏼' => ':person-standing-medium-light-skin-tone:', + '🧍🏽' => ':person-standing-medium-skin-tone:', '👱🏻' => ':person-with-blond-hair-tone1:', '👱🏼' => ':person-with-blond-hair-tone2:', '👱🏽' => ':person-with-blond-hair-tone3:', '👱🏾' => ':person-with-blond-hair-tone4:', '👱🏿' => ':person-with-blond-hair-tone5:', + '🫅🏿' => ':person-with-crown-dark-skin-tone:', + '🫅🏻' => ':person-with-crown-light-skin-tone:', + '🫅🏾' => ':person-with-crown-medium-dark-skin-tone:', + '🫅🏼' => ':person-with-crown-medium-light-skin-tone:', + '🫅🏽' => ':person-with-crown-medium-skin-tone:', '🙎🏻' => ':person-with-pouting-face-tone1:', '🙎🏼' => ':person-with-pouting-face-tone2:', '🙎🏽' => ':person-with-pouting-face-tone3:', '🙎🏾' => ':person-with-pouting-face-tone4:', '🙎🏿' => ':person-with-pouting-face-tone5:', - '☎️' => ':phone:', + '☎️' => ':telephone:', '⛏️' => ':pick:', + '🤌🏿' => ':pinched-fingers-dark-skin-tone:', + '🤌🏻' => ':pinched-fingers-light-skin-tone:', + '🤌🏾' => ':pinched-fingers-medium-dark-skin-tone:', + '🤌🏼' => ':pinched-fingers-medium-light-skin-tone:', + '🤌🏽' => ':pinched-fingers-medium-skin-tone:', + '🤏🏿' => ':pinching-hand-dark-skin-tone:', + '🤏🏻' => ':pinching-hand-light-skin-tone:', + '🤏🏾' => ':pinching-hand-medium-dark-skin-tone:', + '🤏🏼' => ':pinching-hand-medium-light-skin-tone:', + '🤏🏽' => ':pinching-hand-medium-skin-tone:', '👇🏻' => ':point-down-tone1:', '👇🏼' => ':point-down-tone2:', '👇🏽' => ':point-down-tone3:', @@ -1078,6 +2500,16 @@ '🙏🏽' => ':pray-tone3:', '🙏🏾' => ':pray-tone4:', '🙏🏿' => ':pray-tone5:', + '🫃🏿' => ':pregnant-man-dark-skin-tone:', + '🫃🏻' => ':pregnant-man-light-skin-tone:', + '🫃🏾' => ':pregnant-man-medium-dark-skin-tone:', + '🫃🏼' => ':pregnant-man-medium-light-skin-tone:', + '🫃🏽' => ':pregnant-man-medium-skin-tone:', + '🫄🏿' => ':pregnant-person-dark-skin-tone:', + '🫄🏻' => ':pregnant-person-light-skin-tone:', + '🫄🏾' => ':pregnant-person-medium-dark-skin-tone:', + '🫄🏼' => ':pregnant-person-medium-light-skin-tone:', + '🫄🏽' => ':pregnant-person-medium-skin-tone:', '🤰🏻' => ':pregnant-woman-tone1:', '🤰🏼' => ':pregnant-woman-tone2:', '🤰🏽' => ':pregnant-woman-tone3:', @@ -1100,10 +2532,8 @@ '👊🏾' => ':punch-tone4:', '👊🏿' => ':punch-tone5:', '🏎️' => ':racing-car:', - '🏍️' => ':racing-motorcycle:', '☢️' => ':radioactive-sign:', '🛤️' => ':railway-track:', - '🌧️' => ':rain-cloud:', '🤚🏻' => ':raised-back-of-hand-tone1:', '🤚🏼' => ':raised-back-of-hand-tone2:', '🤚🏽' => ':raised-back-of-hand-tone3:', @@ -1114,7 +2544,6 @@ '✋🏽' => ':raised-hand-tone3:', '✋🏾' => ':raised-hand-tone4:', '✋🏿' => ':raised-hand-tone5:', - '🖐️' => ':raised-hand-with-fingers-splayed:', '🙌🏻' => ':raised-hands-tone1:', '🙌🏼' => ':raised-hands-tone2:', '🙌🏽' => ':raised-hands-tone3:', @@ -1129,13 +2558,21 @@ '®️' => ':registered:', '☺️' => ':relaxed:', '🎗️' => ':reminder-ribbon:', - '🗯️' => ':right-anger-bubble:', '🤜🏻' => ':right-facing-fist-tone1:', '🤜🏼' => ':ri 93C6 ght-facing-fist-tone2:', '🤜🏽' => ':right-facing-fist-tone3:', '🤜🏾' => ':right-facing-fist-tone4:', '🤜🏿' => ':right-facing-fist-tone5:', - '🗞️' => ':rolled-up-newspaper:', + '🫱🏿' => ':rightwards-hand-dark-skin-tone:', + '🫱🏻' => ':rightwards-hand-light-skin-tone:', + '🫱🏾' => ':rightwards-hand-medium-dark-skin-tone:', + '🫱🏼' => ':rightwards-hand-medium-light-skin-tone:', + '🫱🏽' => ':rightwards-hand-medium-skin-tone:', + '🫸🏿' => ':rightwards-pushing-hand-dark-skin-tone:', + '🫸🏻' => ':rightwards-pushing-hand-light-skin-tone:', + '🫸🏾' => ':rightwards-pushing-hand-medium-dark-skin-tone:', + '🫸🏼' => ':rightwards-pushing-hand-medium-light-skin-tone:', + '🫸🏽' => ':rightwards-pushing-hand-medium-skin-tone:', '🏵️' => ':rosette:', '🚣🏻' => ':rowboat-tone1:', '🚣🏼' => ':rowboat-tone2:', @@ -1153,7 +2590,7 @@ '🎅🏽' => ':santa-tone3:', '🎅🏾' => ':santa-tone4:', '🎅🏿' => ':santa-tone5:', - '🛰️' => ':satellite:', + '🛰️' => ':satellite-orbital:', '⚖️' => ':scales:', '✂️' => ':scissors:', '㊙️' => ':secret:', @@ -1174,20 +2611,20 @@ '🤷🏿' => ':shrug-tone5:', '6⃣' => ':six:', '⛷️' => ':skier:', - '☠️' => ':skull-and-crossbones:', - '🕵️' => ':sleuth-or-spy:', - '🛩️' => ':small-airplane:', - '🏔️' => ':snow-capped-mountain:', - '🌨️' => ':snow-cloud:', + '☠️' => ':skull-crossbones:', + '🕵️' => ':spy:', + '🏂🏿' => ':snowboarder-dark-skin-tone:', + '🏂🏻' => ':snowboarder-light-skin-tone:', + '🏂🏾' => ':snowboarder-medium-dark-skin-tone:', + '🏂🏼' => ':snowboarder-medium-light-skin-tone:', + '🏂🏽' => ':snowboarder-medium-skin-tone:', '❄️' => ':snowflake:', - '☃️' => ':snowman:', + '☃️' => ':snowman2:', '♠️' => ':spades:', '❇️' => ':sparkle:', '🗣️' => ':speaking-head-in-silhouette:', '🕷️' => ':spider:', '🕸️' => ':spider-web:', - '🗓️' => ':spiral-calendar-pad:', - '🗒️' => ':spiral-note-pad:', '🕵🏻' => ':spy-tone1:', '🕵🏼' => ':spy-tone2:', '🕵🏽' => ':spy-tone3:', @@ -1197,8 +2634,17 @@ '☪️' => ':star-and-crescent:', '✡️' => ':star-of-david:', '⏱️' => ':stopwatch:', - '🎙️' => ':studio-microphone:', '☀️' => ':sunny:', + '🦸🏿' => ':superhero-dark-skin-tone:', + '🦸🏻' => ':superhero-light-skin-tone:', + '🦸🏾' => ':superhero-medium-dark-skin-tone:', + '🦸🏼' => ':superhero-medium-light-skin-tone:', + '🦸🏽' => ':superhero-medium-skin-tone:', + '🦹🏿' => ':supervillain-dark-skin-tone:', + '🦹🏻' => ':supervillain-light-skin-tone:', + '🦹🏾' => ':supervillain-medium-dark-skin-tone:', + '🦹🏼' => ':supervillain-medium-light-skin-tone:', + '🦹🏽' => ':supervillain-medium-skin-tone:', '🏄🏻' => ':surfer-tone1:', '🏄🏼' => ':surfer-tone2:', '🏄🏽' => ':surfer-tone3:', @@ -1211,7 +2657,6 @@ '🏊🏿' => ':swimmer-tone5:', '🌡️' => ':thermometer:', '3⃣' => ':three:', - '🖱️' => ':three-button-mouse:', '👎🏻' => ':thumbsdown-tone1:', '👎🏼' => ':thumbsdown-tone2:', '👎🏽' => ':thumbsdown-tone3:', @@ -1222,22 +2667,25 @@ '👍🏽' => ':thumbsup-tone3:', '👍🏾' => ':thumbsup-tone4:', '👍🏿' => ':thumbsup-tone5:', - '⛈️' => ':thunder-cloud-and-rain:', + '⛈️' => ':thunder-cloud-rain:', '⏲️' => ':timer-clock:', '™️' => ':tm:', - '🌪️' => ':tornado:', '🖲️' => ':trackball:', '⚧️' => ':transgender-symbol:', '2⃣' => ':two:', '🈷️' => ':u6708:', - '☂️' => ':umbrella:', - '⛱️' => ':umbrella-on-ground:', + '☂️' => ':umbrella2:', '✌️' => ':v:', '✌🏻' => ':v-tone1:', '✌🏼' => ':v-tone2:', '✌🏽' => ':v-tone3:', '✌🏾' => ':v-tone4:', '✌🏿' => ':v-tone5:', + '🧛🏿' => ':vampire-dark-skin-tone:', + '🧛🏻' => ':vampire-light-skin-tone:', + '🧛🏾' => ':vampire-medium-dark-skin-tone:', + '🧛🏼' => ':vampire-medium-light-skin-tone:', + '🧛🏽' => ':vampire-medium-skin-tone:', '🖖🏻' => ':vulcan-tone1:', '🖖🏼' => ':vulcan-tone2:', '🖖🏽' => ':vulcan-tone3:', @@ -1260,25 +2708,31 @@ '👋🏽' => ':wave-tone3:', '👋🏾' => ':wave-tone4:', '👋🏿' => ':wave-tone5:', - '🏳️' => ':waving-white-flag:', '〰️' => ':wavy-dash:', - '🏋️' => ':weight-lifter:', '☸️' => ':wheel-of-dharma:', - '☹️' => ':white-frowning-face:', '◻️' => ':white-medium-square:', '▫️' => ':white-small-square:', '🌬️' => ':wind-blowing-face:', + '👫🏿' => ':woman-and-man-holding-hands-dark-skin-tone:', + '👫🏻' => ':woman-and-man-holding-hands-light-skin-tone:', + '👫🏾' => ':woman-and-man-holding-hands-medium-dark-skin-tone:', + '👫🏼' => ':woman-and-man-holding-hands-medium-light-skin-tone:', + '👫🏽' => ':woman-and-man-holding-hands-medium-skin-tone:', '👩🏻' => ':woman-tone1:', '👩🏼' => ':woman-tone2:', '👩🏽' => ':woman-tone3:', '👩🏾' => ':woman-tone4:', '👩🏿' => ':woman-tone5:', - '🗺️' => ':world-map:', - '🤼🏻' => ':wrestlers-tone1:', - '🤼🏼' => ':wrestlers-tone2:', - '🤼🏽' => ':wrestlers-tone3:', - '🤼🏾' => ':wrestlers-tone4:', - '🤼🏿' => ':wrestlers-tone5:', + '🧕🏿' => ':woman-with-headscarf-dark-skin-tone:', + '🧕🏻' => ':woman-with-headscarf-light-skin-tone:', + '🧕🏾' => ':woman-with-headscarf-medium-dark-skin-tone:', + '🧕🏼' => ':woman-with-headscarf-medium-light-skin-tone:', + '🧕🏽' => ':woman-with-headscarf-medium-skin-tone:', + '👭🏿' => ':women-holding-hands-dark-skin-tone:', + '👭🏻' => ':women-holding-hands-light-skin-tone:', + '👭🏾' => ':women-holding-hands-medium-dark-skin-tone:', + '👭🏼' => ':women-holding-hands-medium-light-skin-tone:', + '👭🏽' => ':women-holding-hands-medium-skin-tone:', '✍️' => ':writing-hand:', '✍🏻' => ':writing-hand-tone1:', '✍🏼' => ':writing-hand-tone2:', @@ -1303,12 +2757,11 @@ '🉑' => ':accept:', '🪗' => ':accordion:', '🩹' => ':adhesive-bandage:', - '🧑' => ':adult:', + '🧑' => ':person:', '🚡' => ':aerial-tramway:', '✈' => ':airplane:', '🛬' => ':flight-arrival:', '🛫' => ':flight-departure:', - '🛩' => ':small-airplane:', '⏰' => ':alarm-clock:', '⚗' => ':alembic:', '👽' => ':alien:', @@ -1318,7 +2771,6 @@ '⚓' => ':anchor:', '👼' => ':angel:', '💢' => ':anger:', - '🗯' => ':right-anger-bubble:', '😠' => ':angry:', '😧' => ':anguished:', '🐜' => ':ant:', @@ -1347,7 +2799,7 @@ '🔄' => ':arrows-counterclockwise:', '🎨' => ':art:', '🚛' => ':articulated-lorry:', - '🛰' => ':satellite-orbital:', + '🛰' => ':artificial-satellite:', '😲' => ':astonished:', '👟' => ':athletic-shoe:', '🏧' => ':atm:', @@ -1367,7 +2819,8 @@ '🥯' => ':bagel:', '🛄' => ':baggage-claim:', '🥖' => ':french-bread:', - '⚖' => ':scales:', + '⚖' => ':balance-scale:', + '🦲' => ':bald:', '🩰' => ':ballet-shoes:', '🎈' => ':balloon:', '🗳' => ':ballot-box:', @@ -1382,7 +2835,6 @@ '⚾' => ':baseball:', '🧺' => ':basket:', '🏀' => ':basketball:', - '⛹' => ':bouncing-ball-person:', '🦇' => ':bat:', '🛀' => ':bath:', '🛁' => ':bathtub:', @@ -1390,7 +2842,7 @@ '🏖' => ':beach-umbrella:', '🫘' => ':beans:', '🐻' => ':bear:', - '🧔' => ':bearded-person:', + '🧔' => ':person-beard:', '🦫' => ':beaver:', '🛏' => ':bed:', '🐝' => ':honeybee:', @@ -1442,6 +2894,7 @@ '💥' => ':collision:', '🪃' => ':boomerang:', '👢' => ':boot:', + '⛹' => ':bouncing-ball-person:', '💐' => ':bouquet:', '🙇' => ':bow:', '🏹' => ':bow-and-arrow:', @@ -1467,13 +2920,13 @@ '🫧' => ':bubbles:', '🪣' => ':bucket:', '🐛' => ':bug:', - '🏗' => ':construction-site:', + '🏗' => ':building-construction:', '💡' => ':bulb:', '🚅' => ':bullettrain-front:', '🚄' => ':bullettrain-side:', '🌯' => ':burrito:', '🚌' => ':bus:', - '🕴' => ':levitate:', + '🕴' => ':business-suit-levitating:', '🚏' => ':busstop:', '👤' => ':bust-in-silhouette:', '👥' => ':busts-in-silhouette:', @@ -1482,7 +2935,6 @@ '🌵' => ':cactus:', '🍰' => ':cake:', '📆' => ':calendar:', - '🗓' => ':spiral-calendar:', '🤙' => ':call-me-hand:', '📲' => ':calling:', '🐫' => ':camel:', @@ -1499,7 +2951,7 @@ '🚗' => ':red-car:', '🗃' => ':card-file-box:', '📇' => ':card-index:', - '🗂' => ':dividers:', + '🗂' => ':card-index-dividers:', '🎠' => ':carousel-horse:', '🪚' => ':carpentry-saw:', '🥕' => ':carrot:', @@ -1534,13 +2986,12 @@ '🌇' => ':city-sunrise:', '🏙' => ':cityscape:', '🆑' => ':cl:', - '🗜' => ':compression:', + '🗜' => ':clamp:', '👏' => ':clap:', '🎬' => ':clapper:', '🏛' => ':classical-building:', '🧗' => ':person-climbing:', '📋' => ':clipboard:', - '🕰' => ':mantelpiece-clock:', '🕐' => ':clock1:', '🕑' => ':clock2:', '🕒' => ':clock3:', @@ -1570,10 +3021,9 @@ '🌂' => ':closed-umbrella:', '☁' => ':cloud:', '🌩' => ':cloud-with-lightning:', + '⛈' => ':cloud-with-lightning-and-rain:', '🌧' => ':cloud-with-rain:', '🌨' => ':cloud-with-snow:', - '🌪' => ':tornado:', - '⛈' => ':thunder-cloud-rain:', '🤡' => ':clown-face:', '♣' => ':clubs:', '🧥' => ':coat:', @@ -1588,7 +3038,7 @@ '☄' => ':comet:', '🧭' => ':compass:', '💻' => ':computer:', - '🖱' => ':mouse-three-button:', + '🖱' => ':computer-mouse:', '🎊' => ':confetti-ball:', '😖' => ':confounded:', '😕' => ':confused:', @@ -1619,12 +3069,10 @@ '🏏' => ':cricket-game:', '🐊' => ':crocodile:', '🥐' => ':croissant:', - '✝' => ':latin-cross:', '🤞' => ':fingers-crossed:', '🎌' => ':crossed-flags:', '⚔' => ':crossed-swords:', '👑' => ':crown:', - '🛳' => ':passenger-ship:', '🩼' => ':crutch:', '😢' => ':cry:', '😿' => ':crying-cat-face:', @@ -1634,6 +3082,7 @@ '🧁' => ':cupcake:', '💘' => ':cupid:', '🥌' => ':curling-stone:', + '🦱' => ':curly-hair:', '➰' => ':curly-loop:', '💱' => ':currency-exchange:', '🍛' => ':curry:', @@ -1654,11 +3103,11 @@ '🌳' => ':deciduous-tree:', '🦌' => ':deer:', '🏬' => ':department-store:', - '🏚' => ':house-abandoned:', + '🏚' => ':derelict-house:', '🏜' => ':desert:', - '🏝' => ':island:', + '🏝' => ':desert-island:', '🖥' => ':desktop-computer:', - '🕵' => ':spy:', + '🕵' => ':detective:', '💠' => ':diamond-shape-with-a-dot-inside:', '♦' => ':diamonds:', '😞' => ':disappointed:', @@ -1753,8 +3202,8 @@ '🏑' => ':field-hockey-stick-and-ball:', '🗄' => ':file-cabinet:', '📁' => ':file-folder:', + '📽' => ':film-projector:', '🎞' => ':film-strip:', - '📽' => ':projector:', '🔥' => ':fire:', '🚒' => ':fire-engine:', '🧯' => ':fire-extinguisher:', @@ -1768,7 +3217,6 @@ '✊' => ':fist-raised:', '🤛' => ':left-facing-fist:', '🤜' => ':right-facing-fist:', - '🏳' => ':white-flag:', '🎏' => ':flags:', '🦩' => ':flamingo:', '🔦' => ':flashlight:', @@ -1790,10 +3238,9 @@ '🏈' => ':football:', '👣' => ':footprints:', '🍴' => ':fork-and-knife:', - '🍽' => ':plate-with-cutlery:', '🥠' => ':fortune-cookie:', '⛲' => ':fountain:', - '🖋' => ':pen-fountain:', + '🖋' => ':fountain-pen:', '🍀' => ':four-leaf-clover:', '🦊' => ':fox-face:', '🖼' => ':framed-picture:', @@ -1802,13 +3249,13 @@ '🍟' => ':fries:', '🐸' => ':frog:', '😦' => ':frowning:', - '☹' => ':frowning2:', + '☹' => ':frowning-face:', '🙍' => ':person-frowning:', '🖕' => ':middle-finger:', '⛽' => ':fuelpump:', '🌕' => ':full-moon:', '🌝' => ':full-moon-with-face:', - '⚱' => ':urn:', + '⚱' => ':funeral-urn:', '🎲' => ':game-die:', '🧄' => ':garlic:', '⚙' => ':gear:', @@ -1852,12 +3299,11 @@ '💇' => ':haircut:', '🍔' => ':hamburger:', '🔨' => ':hammer:', - '⚒' => ':hammer-pick:', - '🛠' => ':tools:', + '⚒' => ':hammer-and-pick:', + '🛠' => ':hammer-and-wrench:', '🪬' => ':hamsa:', '🐹' => ':hamster:', '✋' => ':raised-hand:', - '🖐' => ':raised-hand-with-fingers-splayed:', '🫰' => ':hand-with-index-finger-and-thumb-crossed:', '👜' => ':handbag:', '🤾' => ':handball-person:', @@ -1870,7 +3316,6 @@ '🙉' => ':hear-no-evil:', '❤' => ':heart:', '💟' => ':heart-decoration:', - '❣' => ':heavy-heart-exclamation:', '😍' => ':heart-eyes:', '😻' => ':heart-eyes-cat:', '🫶' => ':heart-hands:', @@ -1881,12 +3326,12 @@ '➗' => ':heavy-division-sign:', '💲' => ':heavy-dollar-sign:', '🟰' => ':heavy-equals-sign:', + '❣' => ':heavy-heart-exclamation:', '➖' => ':heavy-minus-sign:', '✖' => ':heavy-multiplication-x:', '➕' => ':heavy-plus-sign:', '🦔' => ':hedgehog:', '🚁' => ':helicopter:', - '⛑' => ':rescue-worker-helmet:', '🌿' => ':herb:', '🌺' => ':hibiscus:', '🔆' => ':high-brightness:', @@ -1897,7 +3342,6 @@ '🔪' => ':knife:', '🏒' => ':ice-hockey-stick-and-puck:', '🕳' => ':hole:', - '🏘' => ':houses:', '🍯' => ':honey-pot:', '🪝' => ':hook:', '🐴' => ':horse:', @@ -1912,13 +3356,14 @@ '⏳' => ':hourglass-flowing-sand:', '🏠' => ':house:', '🏡' => ':house-with-garden:', + '🏘' => ':houses:', '🤗' => ':hugs:', '😯' => ':hushed:', '🛖' => ':hut:', '🪻' => ':hyacinth:', '🤟' => ':love-you-gesture:', - '🍨' => ':ice-cream:', '🧊' => ':ice-cube:', + '🍨' => ':ice-cream:', '⛸' => ':ice-skate:', '🍦' => ':icecream:', '🆔' => ':id:', @@ -1943,7 +3388,7 @@ '🫙' => ':jar:', '👖' => ':jeans:', '🪼' => ':jellyfish:', - '🧩' => ':jigsaw:', + '🧩' => ':puzzle-piece:', '😂' => ':joy:', '😹' => ':joy-cat:', '🕹' => ':joystick:', @@ -1951,7 +3396,6 @@ '🕋' => ':kaaba:', '🦘' => ':kangaroo:', '🔑' => ':key:', - '🗝' => ':old-key:', '⌨' => ':keyboard:', '🔟' => ':ten:', '🪯' => ':khanda:', @@ -1965,7 +3409,7 @@ '😙' => ':kissing-smiling-eyes:', '🪁' => ':kite:', '🥝' => ':kiwifruit:', - '🧎' => ':kneeling-person:', + '🧎' => ':person-kneeling:', '🪢' => ':knot:', '🐨' => ':koala:', '🈁' => ':koko:', @@ -1986,13 +3430,14 @@ '🟨' => ':yellow-square:', '🌗' => ':last-quarter-moon:', '🌜' => ':last-quarter-moon-with-face:', + '✝' => ':latin-cross:', '😆' => ':satisfied:', '🥬' => ':leafy-green:', '🍃' => ':leaves:', '📒' => ':ledger:', '🛅' => ':left-luggage:', '↔' => ':left-right-arrow:', - '🗨' => ':speech-left:', + '🗨' => ':left-speech-bubble:', '↩' => ':leftwards-arrow-with-hook:', '🫲' => ':leftwards-hand:', '🫷' => ':leftwards-pushing-hand:', @@ -2002,7 +3447,6 @@ '🐆' => ':leopard:', '🎚' => ':level-slider:', '♎' => ':libra:', - '🏋' => ':weight-lifting:', '🩵' => ':light-blue-heart:', '🚈' => ':light-rail:', '🔗' => ':link:', @@ -2044,14 +3488,13 @@ '🦣' => ':mammoth:', '👨' => ':man:', '🕺' => ':man-dancing:', - '🤵' => ':person-in-tuxedo:', '👲' => ':man-with-gua-pi-mao:', '👳' => ':person-with-turban:', '🍊' => ':tangerine:', '🥭' => ':mango:', '👞' => ':shoe:', + '🕰' => ':mantelpiece-clock:', '🦽' => ':manual-wheelchair:', - '🗺' => ':world-map:', '🍁' => ':maple-leaf:', '🪇' => ':maracas:', '🥋' => ':martial-arts-uniform:', @@ -2062,7 +3505,7 @@ '🦾' => ':mechanical-arm:', '🦿' => ':mechanical-leg:', '🏅' => ':sports-medal:', - '🎖' => ':military-medal:', + '🎖' => ':medal-military:', '⚕' => ':medical-symbol:', '📣' => ':mega:', '🍈' => ':melon:', @@ -2075,7 +3518,6 @@ '🚇' => ':metro:', '🦠' => ':microbe:', '🎤' => ':microphone:', - '🎙' => ':studio-microphone:', '🔬' => ':microscope:', '🪖' => ':military-helmet:', '🌌' => ':milky-way:', @@ -2096,7 +3538,7 @@ '🎓' => ':mortar-board:', '🕌' => ':mosque:', '🦟' => ':mosquito:', - '🛥' => ':motorboat:', + '🛥' => ':motor-boat:', '🛵' => ':motor-scooter:', '🏍' => ':motorcycle:', '🦼' => ':motorized-wheelchair:', @@ -2121,7 +3563,7 @@ '🔇' => ':mute:', '💅' => ':nail-care:', '📛' => ':name-badge:', - '🏞' => ':park:', + '🏞' => ':national-park:', '🤢' => ':nauseated-face:', '🧿' => ':nazar-amulet:', '👔' => ':necktie:', @@ -2134,8 +3576,8 @@ '🌑' => ':new-moon:', '🌚' => ':new-moon-with-face:', '📰' => ':newspaper:', - '🗞' => ':newspaper2:', - '⏭' => ':track-next:', + '🗞' => ':newspaper-roll:', + '⏭' => ':next-track-button:', '🆖' => ':ng:', '🌃' => ':night-with-stars:', '🥷' => ':ninja:', @@ -2152,7 +3594,6 @@ '👃' => ':nose:', '📓' => ':notebook:', '📔' => ':notebook-with-decorative-cover:', - '🗒' => ':spiral-notepad:', '🎶' => ':notes:', '🔩' => ':nut-and-bolt:', '⭕' => ':o:', @@ -2166,11 +3607,12 @@ '🆗' => ':ok:', '👌' => ':ok-hand:', '🙆' => ':ok-woman:', - '🧓' => ':older-adult:', + '🗝' => ':old-key:', + '🧓' => ':older-person:', '👴' => ':older-man:', '👵' => ':older-woman:', '🫒' => ':olive:', - '🕉' => ':om-symbol:', + '🕉' => ':om:', '🔛' => ':on:', '🚘' => ':oncoming-automobile:', '🚍' => ':oncoming-bus:', @@ -2181,7 +3623,7 @@ '📂' => ':open-file-folder:', '👐' => ':open-hands:', '😮' => ':open-mouth:', - '☂' => ':umbrella2:', + '☂' => ':open-umbrella:', '⛎' => ':ophiuchus:', '📙' => ':orange-book:', '🧡' => ':orange-heart:', @@ -2212,6 +3654,7 @@ '〽' => ':part-alternation-mark:', '⛅' => ':partly-sunny:', '🥳' => ':partying-face:', + '🛳' => ':passenger-ship:', '🛂' => ':passport-control:', '⏸' => ':pause-button:', '🫛' => ':pea-pod:', @@ -2220,7 +3663,7 @@ '🦚' => ':peacock:', '🥜' => ':peanuts:', '🍐' => ':pear:', - '🖊' => ':pen-ballpoint:', + '🖊' => ':pen:', '✏' => ':pencil2:', '🐧' => ':penguin:', '😔' => ':pensive:', @@ -2228,6 +3671,8 @@ '🎭' => ':performing-arts:', '😣' => ':persevere:', '🧖' => ':sauna-person:', + '🤵' => ':person-in-tuxedo:', + '🧍' => ':standing-person:', '🫅' => ':person-with-crown:', '🧕' => ':woman-with-headscarf:', '🙎' => ':pouting-face:', @@ -2250,7 +3695,8 @@ '🍕' => ':pizza:', '🪧' => ':placard:', '🛐' => ':place-of-worship:', - '⏯' => ':play-pause:', + '🍽' => ':plate-with-cutlery:', + '⏯' => ':play-or-pause-button:', '🛝' => ':playground-slide:', '🥺' => ':pleading-face:', '🪠' => ':plunger:', @@ -2280,11 +3726,11 @@ '🫄' => ':pregnant-person:', '🤰' => ':pregnant-woman:', '🥨' => ':pretzel:', - '⏮' => ':track-previous:', + '⏮' => ':previous-track-button:', '🤴' => ':prince:', '👸' => ':princess:', '🖨' => ':printer:', - '🦯' => ':probing-cane:', + '🦯' => ':white-cane:', '💜' => ':purple-heart:', '👛' => ':purse:', '📌' => ':pushpin:', @@ -2293,8 +3739,8 @@ '🐰' => ':rabbit:', '🐇' => ':rabbit2:', '🦝' => ':raccoon:', - '🏎' => ':racing-car:', '🐎' => ':racehorse:', + '🏎' => ':racing-car:', '📻' => ':radio:', '🔘' => ':radio-button:', '☢' => ':radioactive:', @@ -2302,6 +3748,7 @@ '🛤' => ':railway-track:', '🌈' => ':rainbow:', '🤚' => ':raised-back-of-hand:', + '🖐' => ':raised-hand-with-fingers-splayed:', '🙌' => ':raised-hands:', '🙋' => ':raising-hand:', '🐏' => ':ram:', @@ -2313,12 +3760,14 @@ '♻' => ':recycle:', '🔴' => ':red-circle:', '🧧' => ':red-envelope:', + '🦰' => ':red-hair:', '®' => ':registered:', '☺' => ':relaxed:', '😌' => ':relieved:', '🎗' => ':reminder-ribbon:', '🔁' => ':repeat:', '🔂' => ':repeat-one:', + '⛑' => ':rescue-worker-helmet:', '🚻' => ':restroom:', '💞' => ':revolving-hearts:', '⏪' => ':rewind:', @@ -2328,6 +3777,7 @@ '🍙' => ':rice-ball:', '🍘' => ':rice-cracker:', '🎑' => ':rice-scene:', + '🗯' => ':right-anger-bubble:', '🫱' => ':rightwards-hand:', '🫸' => ':rightwards-pushing-hand:', '💍' => ':ring:', @@ -2391,7 +3841,7 @@ '⛩' => ':shinto-shrine:', '🚢' => ':ship:', '👕' => ':tshirt:', - '🛍' => ':shopping-bags:', + '🛍' => ':shopping:', '🛒' => ':shopping-trolley:', '🩳' => ':shorts:', '🚿' => ':shower:', @@ -2409,7 +3859,7 @@ '🏾' => ':tone4:', '🏿' => ':tone5:', '💀' => ':skull:', - '☠' => ':skull-crossbones:', + '☠' => ':skull-and-crossbones:', '🦨' => ':skunk:', '🛷' => ':sled:', '😴' => ':sleeping:', @@ -2419,6 +3869,7 @@ '🙂' => ':slightly-smiling-face:', '🎰' => ':slot-machine:', '🦥' => ':sloth:', + '🛩' => ':small-airplane:', '🔹' => ':small-blue-diamond:', '🔸' => ':small-orange-diamond:', '🔺' => ':small-red-triangle:', @@ -2439,7 +3890,7 @@ '🏂' => ':snowboarder:', '❄' => ':snowflake:', '⛄' => ':snowman-without-snow:', - '☃' => ':snowman2:', + '☃' => ':snowman-with-snow:', '🧼' => ':soap:', '😭' => ':sob:', '⚽' => ':soccer:', @@ -2462,12 +3913,13 @@ '🚤' => ':speedboat:', '🕷' => ':spider:', '🕸' => ':spider-web:', + '🗓' => ':spiral-calendar:', + '🗒' => ':spiral-notepad:', '🖖' => ':vulcan-salute:', '🧽' => ':sponge:', '🥄' => ':spoon:', '🦑' => ':squid:', '🏟' => ':stadium:', - '🧍' => ':standing-person:', '⭐' => ':star:', '☪' => ':star-and-crescent:', '✡' => ':star-of-david:', @@ -2486,10 +3938,11 @@ '😛' => ':stuck-out-tongue:', '😝' => ':stuck-out-tongue-closed-eyes:', '😜' => ':stuck-out-tongue-winking-eye:', + '🎙' => ':studio-microphone:', '🥙' => ':stuffed-flatbread:', - '🌥' => ':white-sun-cloud:', - '🌦' => ':white-sun-rain-cloud:', - '🌤' => ':white-sun-small-cloud:', + '🌥' => ':sun-behind-large-cloud:', + '🌦' => ':sun-behind-rain-cloud:', + '🌤' => ':sun-behind-small-cloud:', '🌞' => ':sun-with-face:', '🌻' => ':sunflower:', '😎' => ':sunglasses:', @@ -2547,6 +4000,7 @@ '🪥' => ':toothbrush:', '🔝' => ':top:', '🎩' => ':tophat:', + '🌪' => ':tornado:', '🖲' => ':trackball:', '🚜' => ':tractor:', '🚥' => ':traffic-light:', @@ -2620,6 +4074,7 @@ '🚾' => ':wc:', '😩' => ':weary:', '💒' => ':wedding:', + '🏋' => ':weight-lifting:', '🐳' => ':whale:', '🐋' => ':whale2:', '🛞' => ':wheel:', @@ -2627,7 +4082,9 @@ '♿' => ':wheelchair:', '✅' => ':white-check-mark:', '⚪' => ':white-circle:', + '🏳' => ':white-flag:', '💮' => ':white-flower:', + '🦳' => ':white-hair:', '🤍' => ':white-heart:', '⬜' => ':white-large-square:', '◽' => ':white-medium-small-square:', @@ -2635,8 +4092,8 @@ '▫' => ':white-small-square:', '🔳' => ':white-square-button:', '🥀' => ':wilted-rose:', - '🌬' => ':wind-face:', '🎐' => ':wind-chime:', + '🌬' => ':wind-face:', '🪟' => ':window:', '🍷' => ':wine-glass:', '🪽' => ':wing:', @@ -2649,6 +4106,7 @@ '🚺' => ':womens:', '🪵' => ':wood:', '🥴' => ':woozy-face:', + '🗺' => ':world-map:', '🪱' => ':worm:', '😟' => ':worried:', '🔧' => ':wrench:', diff --git a/src/Symfony/Component/Emoji/Resources/data/gitlab-emoji.php b/src/Symfony/Component/Emoji/Resources/data/gitlab-emoji.php index 972f40abb9d13..3ef1c90e235f1 100644 --- a/src/Symfony/Component/Emoji/Resources/data/gitlab-emoji.php +++ b/src/Symfony/Component/Emoji/Resources/data/gitlab-emoji.php @@ -1,207 +1,37 @@ '👍', - ':-1:' => '👎', - ':admission_tickets:' => '🎟', - ':anguished:' => '😧', - ':archery:' => '🏹', - ':atom_symbol:' => '⚛', - ':back_of_hand:' => '🤚', - ':baguette_bread:' => '🥖', - ':ballot_box_with_ballot:' => '🗳', - ':beach_with_umbrella:' => '🏖', - ':bellhop_bell:' => '🛎', - ':biohazard_sign:' => '☣', - ':bottle_with_popping_cork:' => '🍾', - ':boxing_gloves:' => '🥊', - ':building_construction:' => '🏗', - ':call_me_hand:' => '🤙', - ':card_file_box:' => '🗃', - ':card_index_dividers:' => '🗂', - ':cheese_wedge:' => '🧀', - ':city_sunrise:' => '🌇', - ':clinking_glass:' => '🥂', - ':cloud_with_lightning:' => '🌩', - ':cloud_with_rain:' => '🌧', - ':cloud_with_snow:' => '🌨', - ':cloud_with_tornado:' => '🌪', - ':clown_face:' => '🤡', - ':couch_and_lamp:' => '🛋', - ':cricket_bat_ball:' => '🏏', - ':dagger_knife:' => '🗡', - ':derelict_house_building:' => '🏚', - ':desert_island:' => '🏝', - ':desktop_computer:' => '🖥', - ':double_vertical_bar:' => '⏸', - ':dove_of_peace:' => '🕊', - ':drool:' => '🤤', - ':drum_with_drumsticks:' => '🥁', - ':eject_symbol:' => '⏏', - ':email:' => '📧', - ':expecting_woman:' => '🤰', - ':face_with_cowboy_hat:' => '🤠', - ':face_with_head_bandage:' => '🤕', - ':face_with_rolling_eyes:' => '🙄', - ':face_with_thermometer:' => '🤒', - ':facepalm:' => '🤦', - ':fencing:' => '🤺', - ':film_projector:' => '📽', - ':first_place_medal:' => '🥇', - ':flame:' => '🔥', - ':fork_and_knife_with_plate:' => '🍽', - ':fox_face:' => '🦊', - ':frame_with_picture:' => '🖼', - ':funeral_urn:' => '⚱', - ':glass_of_milk:' => '🥛', - ':goal_net:' => '🥅', - ':grandma:' => '👵', - ':green_salad:' => '🥗', - ':hammer_and_pick:' => '⚒', - ':hammer_and_wrench:' => '🛠', - ':hand_with_index_and_middle_finger_crossed:' => '🤞', - ':hankey:' => '💩', - ':heavy_heart_exclamation_mark_ornament:' => '❣', - ':helmet_with_white_cross:' => '⛑', - ':hot_dog:' => '🌭', - ':house_buildings:' => '🏘', - ':hugging_face:' => '🤗', - ':juggler:' => '🤹', - ':karate_uniform:' => '🥋', - ':kayak:' => '🛶', - ':kiwifruit:' => '🥝', - ':latin_cross:' => '✝', - ':left_fist:' => '🤛', - ':left_speech_bubble:' => '🗨', - ':liar:' => '🤥', - ':linked_paperclips:' => '🖇', - ':lion:' => '🦁', - ':lower_left_ballpoint_pen:' => '🖊', - ':lower_left_crayon:' => '🖍', - ':lower_left_fountain_pen:' => '🖋', - ':lower_left_paintbrush:' => '🖌', - ':male_dancer:' => '🕺', - ':man_in_business_suit_levitating:' => '🕴', - ':mantlepiece_clock:' => '🕰', - ':memo:' => '📝', - ':money_mouth_face:' => '🤑', - ':mother_christmas:' => '🤶', - ':motorbike:' => '🛵', - ':national_park:' => '🏞', - ':nerd_face:' => '🤓', - ':next_track:' => '⏭', - ':oil_drum:' => '🛢', - ':old_key:' => '🗝', - ':paella:' => '🥘', - ':passenger_ship:' => '🛳', - ':peace_symbol:' => '☮', - ':person_doing_cartwheel:' => '🤸', - ':person_with_ball:' => '⛹', - ':poo:' => '💩', - ':previous_track:' => '⏮', - ':racing_car:' => '🏎', - ':racing_motorcycle:' => '🏍', - ':radioactive_sign:' => '☢', - ':railroad_track:' => '🛤', - ':raised_hand_with_fingers_splayed:' => '🖐', - ':raised_hand_with_part_between_middle_and_ring_fingers:' => '🖖', - ':reversed_hand_with_middle_finger_extended:' => '🖕', - ':rhinoceros:' => '🦏', - ':right_anger_bubble:' => '🗯', - ':right_fist:' => '🤜', - ':robot_face:' => '🤖', - ':rolled_up_newspaper:' => '🗞', - ':rolling_on_the_floor_laughing:' => '🤣', - ':satisfied:' => '😆', - ':second_place_medal:' => '🥈', - ':shaking_hands:' => '🤝', - ':shelled_peanut:' => '🥜', - ':shit:' => '💩', - ':shopping_trolley:' => '🛒', - ':sick:' => '🤢', - ':sign_of_the_horns:' => '🤘', - ':skeleton:' => '💀', - ':skull_and_crossbones:' => '☠', - ':sleuth_or_spy:' => '🕵', - ':slightly_frowning_face:' => '🙁', - ':slightly_smiling_face:' => '🙂', - ':small_airplane:' => '🛩', - ':sneeze:' => '🤧', - ':snow_capped_mountain:' => '🏔', - ':speaking_head_in_silhouette:' => '🗣', - ':spiral_calendar_pad:' => '🗓', - ':spiral_note_pad:' => '🗒', - ':sports_medal:' => '🏅', - ':stop_sign:' => '🛑', - ':studio_microphone:' => '🎙', - ':stuffed_pita:' => '🥙', - ':table_tennis:' => '🏓', - ':thinking_face:' => '🤔', - ':third_place_medal:' => '🥉', - ':three_button_mouse:' => '🖱', - ':thunder_cloud_and_rain:' => '⛈', - ':timer_clock:' => '⏲', - ':umbrella_on_ground:' => '⛱', - ':unicorn_face:' => '🦄', - ':upside_down_face:' => '🙃', - ':waving_black_flag:' => '🏴', - ':waving_white_flag:' => '🏳', - ':weight_lifter:' => '🏋', - ':whisky:' => '🥃', - ':white_frowning_face:' => '☹', - ':white_sun_behind_cloud:' => '🌥', - ':white_sun_behind_cloud_with_rain:' => '🌦', - ':white_sun_with_small_cloud:' => '🌤', - ':wilted_flower:' => '🥀', - ':world_map:' => '🗺', - ':worship_symbol:' => '🛐', - ':wrestling:' => '🤼', - ':zipper_mouth_face:' => '🤐', ':8ball:' => '🎱', ':100:' => '💯', ':1234:' => '🔢', - ':a:' => '🅰', ':ab:' => '🆎', + ':abacus:' => '🧮', ':abc:' => '🔤', ':abcd:' => '🔡', ':accept:' => '🉑', + ':accordion:' => '🪗', + ':adhesive_bandage:' => '🩹', ':aerial_tramway:' => '🚡', - ':airplane:' => '✈', ':airplane_arriving:' => '🛬', ':airplane_departure:' => '🛫', - ':airplane_small:' => '🛩', ':alarm_clock:' => '⏰', - ':alembic:' => '⚗', ':alien:' => '👽', ':ambulance:' => '🚑', ':amphora:' => '🏺', + ':anatomical_heart:' => '🫀', ':anchor:' => '⚓', ':angel:' => '👼', ':anger:' => '💢', - ':anger_right:' => '🗯', ':angry:' => '😠', + ':anguished:' => '😧', ':ant:' => '🐜', ':apple:' => '🍎', ':aquarius:' => '♒', ':aries:' => '♈', - ':arrow_backward:' => '◀', ':arrow_double_down:' => '⏬', ':arrow_double_up:' => '⏫', - ':arrow_down:' => '⬇', ':arrow_down_small:' => '🔽', - ':arrow_forward:' => '▶', - ':arrow_heading_down:' => '⤵', - ':arrow_heading_up:' => '⤴', - ':arrow_left:' => '⬅', - ':arrow_lower_left:' => '↙', - ':arrow_lower_right:' => '↘', - ':arrow_right:' => '➡', - ':arrow_right_hook:' => '↪', - ':arrow_up:' => '⬆', - ':arrow_up_down:' => '↕', ':arrow_up_small:' => '🔼', - ':arrow_upper_left:' => '↖', - ':arrow_upper_right:' => '↗', ':arrows_clockwise:' => '🔃', ':arrows_counterclockwise:' => '🔄', ':art:' => '🎨', @@ -209,85 +39,103 @@ ':astonished:' => '😲', ':athletic_shoe:' => '👟', ':atm:' => '🏧', - ':atom:' => '⚛', + ':auto_rickshaw:' => '🛺', ':avocado:' => '🥑', - ':b:' => '🅱', + ':axe:' => '🪓', ':baby:' => '👶', ':baby_bottle:' => '🍼', ':baby_chick:' => '🐤', ':baby_symbol:' => '🚼', ':back:' => '🔙', ':bacon:' => '🥓', + ':badger:' => '🦡', ':badminton:' => '🏸', + ':bagel:' => '🥯', ':baggage_claim:' => '🛄', + ':bald:' => '🦲', + ':ballet_shoes:' => '🩰', ':balloon:' => '🎈', - ':ballot_box:' => '🗳', - ':ballot_box_with_check:' => '☑', ':bamboo:' => '🎍', ':banana:' => '🍌', - ':bangbang:' => '‼', + ':banjo:' => '🪕', ':bank:' => '🏦', ':bar_chart:' => '📊', ':barber:' => '💈', ':baseball:' => '⚾', + ':basket:' => '🧺', ':basketball:' => '🏀', - ':basketball_player:' => '⛹', ':bat:' => '🦇', ':bath:' => '🛀', ':bathtub:' => '🛁', ':battery:' => '🔋', - ':beach:' => '🏖', - ':beach_umbrella:' => '⛱', + ':beans:' => '🫘', ':bear:' => '🐻', - ':bed:' => '🛏', + ':beaver:' => '🦫', ':bee:' => '🐝', ':beer:' => '🍺', ':beers:' => '🍻', ':beetle:' => '🐞', ':beginner:' => '🔰', ':bell:' => '🔔', - ':bellhop:' => '🛎', + ':bell_pepper:' => '🫑', ':bento:' => '🍱', + ':beverage_box:' => '🧃', ':bicyclist:' => '🚴', ':bike:' => '🚲', ':bikini:' => '👙', - ':biohazard:' => '☣', + ':billed_cap:' => '🧢', ':bird:' => '🐦', ':birthday:' => '🎂', + ':bison:' => '🦬', + ':biting_lip:' => '🫦', ':black_circle:' => '⚫', ':black_heart:' => '🖤', ':black_joker:' => '🃏', ':black_large_square:' => '⬛', ':black_medium_small_square:' => '◾', - ':black_medium_square:' => '◼', - ':black_nib:' => '✒', - ':black_small_square:' => '▪', ':black_square_button:' => '🔲', ':blossom:' => '🌼', ':blowfish:' => '🐡', ':blue_book:' => '📘', ':blue_car:' => '🚙', ':blue_heart:' => '💙', + ':blue_square:' => '🟦', + ':blueberries:' => '🫐', ':blush:' => '😊', ':boar:' => '🐗', ':bomb:' => '💣', + ':bone:' => '🦴', ':book:' => '📖', ':bookmark:' => '🔖', ':bookmark_tabs:' => '📑', ':books:' => '📚', ':boom:' => '💥', + ':boomerang:' => '🪃', ':boot:' => '👢', ':bouquet:' => '💐', ':bow:' => '🙇', ':bow_and_arrow:' => '🏹', + ':bowl_with_spoon:' => '🥣', ':bowling:' => '🎳', ':boxing_glove:' => '🥊', ':boy:' => '👦', + ':brain:' => '🧠', ':bread:' => '🍞', + ':breast_feeding:' => '🤱', + ':brick:' => '🧱', ':bride_with_veil:' => '👰', ':bridge_at_night:' => '🌉', ':briefcase:' => '💼', + ':briefs:' => '🩲', + ':broccoli:' => '🥦', ':broken_heart:' => '💔', + ':broom:' => '🧹', + ':brown_circle:' => '🟤', + ':brown_heart:' => '🤎', + ':brown_square:' => '🟫', + ':bubble_tea:' => '🧋', + ':bubbles:' => '🫧', + ':bucket:' => '🪣', ':bug:' => '🐛', ':bulb:' => '💡', ':bullettrain_front:' => '🚅', @@ -297,32 +145,31 @@ ':busstop:' => '🚏', ':bust_in_silhouette:' => '👤', ':busts_in_silhouette:' => '👥', + ':butter:' => '🧈', ':butterfly:' => '🦋', ':cactus:' => '🌵', ':cake:' => '🍰', ':calendar:' => '📆', - ':calendar_spiral:' => '🗓', ':call_me:' => '🤙', ':calling:' => '📲', ':camel:' => '🐫', ':camera:' => '📷', ':camera_with_flash:' => '📸', - ':camping:' => '🏕', ':cancer:' => '♋', - ':candle:' => '🕯', ':candy:' => '🍬', + ':canned_food:' => '🥫', ':canoe:' => '🛶', ':capital_abcd:' => '🔠', ':capricorn:' => '♑', - ':card_box:' => '🗃', ':card_index:' => '📇', ':carousel_horse:' => '🎠', + ':carpentry_saw:' => '🪚', ':carrot:' => '🥕', ':cartwheel:' => '🤸', ':cat:' => '🐱', ':cat2:' => '🐈', ':cd:' => '💿', - ':chains:' => '⛓', + ':chair:' => '🪑', ':champagne:' => '🍾', ':champagne_glass:' => '🥂', ':chart:' => '💹', @@ -334,22 +181,20 @@ ':cherry_blossom:' => '🌸', ':chest F438 nut:' => '🌰', ':chicken:' => '🐔', + ':child:' => '🧒', ':children_crossing:' => '🚸', - ':chipmunk:' => '🐿', ':chocolate_bar:' => '🍫', + ':chopsticks:' => '🥢', ':christmas_tree:' => '🎄', ':church:' => '⛪', ':cinema:' => '🎦', ':circus_tent:' => '🎪', ':city_dusk:' => '🌆', ':city_sunset:' => '🌇', - ':cityscape:' => '🏙', ':cl:' => '🆑', ':clap:' => '👏', ':clapper:' => '🎬', - ':classical_building:' => '🏛', ':clipboard:' => '📋', - ':clock:' => '🕰', ':clock1:' => '🕐', ':clock2:' => '🕑', ':clock3:' => '🕒', @@ -377,36 +222,29 @@ ':closed_book:' => '📕', ':closed_lock_with_key:' => '🔐', ':closed_umbrella:' => '🌂', - ':cloud:' => '☁', - ':cloud_lightning:' => '🌩', - ':cloud_rain:' => '🌧', - ':cloud_snow:' => '🌨', - ':cloud_tornado:' => '🌪', ':clown:' => '🤡', - ':clubs:' => '♣', + ':coat:' => '🧥', + ':cockroach:' => '🪳', ':cocktail:' => '🍸', + ':coconut:' => '🥥', ':coffee:' => '☕', - ':coffin:' => '⚰', + ':coin:' => '🪙', + ':cold_face:' => '🥶', ':cold_sweat:' => '😰', - ':comet:' => '☄', - ':compression:' => '🗜', + ':compass:' => '🧭', ':computer:' => '💻', ':confetti_ball:' => '🎊', ':confounded:' => '😖', ':confused:' => '😕', - ':congratulations:' => '㊗', ':construction:' => '🚧', - ':construction_site:' => '🏗', ':construction_worker:' => '👷', - ':control_knobs:' => '🎛', ':convenience_store:' => '🏪', ':cookie:' => '🍪', ':cooking:' => '🍳', ':cool:' => '🆒', ':cop:' => '👮', - ':copyright:' => '©', + ':coral:' => '🪸', ':corn:' => '🌽', - ':couch:' => '🛋', ':couple:' => '👫', ':couple_with_heart:' => '💑', ':couplekiss:' => '💏', @@ -414,110 +252,126 @@ ':cow2:' => '🐄', ':cowboy:' => '🤠', ':crab:' => '🦀', - ':crayon:' => '🖍', ':credit_card:' => '💳', ':crescent_moon:' => '🌙', ':cricket:' => '🏏', ':crocodile:' => '🐊', ':croissant:' => '🥐', - ':cross:' => '✝', ':crossed_flags:' => '🎌', - ':crossed_swords:' => '⚔', ':crown:' => '👑', - ':cruise_ship:' => '🛳', + ':crutch:' => '🩼', ':cry:' => '😢', ':crying_cat_face:' => '😿', ':crystal_ball:' => '🔮', ':cucumber:' => '🥒', + ':cup_with_straw:' => '🥤', + ':cupcake:' => '🧁', ':cupid:' => '💘', + ':curling_stone:' => '🥌', + ':curly_hair:' => '🦱', ':curly_loop:' => '➰', ':currency_exchange:' => '💱', ':curry:' => '🍛', ':custard:' => '🍮', ':customs:' => '🛃', + ':cut_of_meat:' => '🥩', ':cyclone:' => '🌀', - ':dagger:' => '🗡', ':dancer:' => '💃', ':dancers:' => '👯', ':dango:' => '🍡', - ':dark_sunglasses:' => '🕶', ':dart:' => '🎯', ':dash:' => '💨', ':date:' => '📅', + ':deaf_person:' => '🧏', ':deciduous_tree:' => '🌳', ':deer:' => '🦌', ':department_store:' => '🏬', - ':desert:' => '🏜', - ':desktop:' => '🖥', ':diamond_shape_with_a_dot_inside:' => '💠', - ':diamonds:' => '♦', ':disappointed:' => '😞', ':disappointed_relieved:' => '😥', - ':dividers:' => '🗂', + ':disguised_face:' => '🥸', + ':diving_mask:' => '🤿', + ':diya_lamp:' => '🪔', ':dizzy:' => '💫', ':dizzy_face:' => '😵', + ':dna:' => '🧬', ':do_not_litter:' => '🚯', + ':dodo:' => '🦤', ':dog:' => '🐶', ':dog2:' => '🐕', ':dollar:' => '💵', ':dolls:' => '🎎', ':dolphin:' => '🐬', + ':donkey:' => '🫏', ':door:' => '🚪', + ':dotted_line_face:' => '🫥', ':doughnut:' => '🍩', - ':dove:' => '🕊', ':dragon:' => '🐉', ':dragon_face:' => '🐲', ':dress:' => '👗', ':dromedary_camel:' => '🐪', ':drooling_face:' => '🤤', + ':drop_of_blood:' => '🩸', ':droplet:' => '💧', ':drum:' => '🥁', ':duck:' => '🦆', + ':dumpling:' => '🥟', ':dvd:' => '📀', ':e-mail:' => '📧', ':eagle:' => '🦅', ':ear:' => '👂', ':ear_of_rice:' => '🌾', + ':ear_with_hearing_aid:' => '🦻', ':earth_africa:' => '🌍', ':earth_americas:' => '🌎', ':earth_asia:' => '🌏', ':egg:' => '🥚', ':eggplant:' => '🍆', - ':eight_pointed_black_star:' => '✴', - ':eight_spoked_asterisk:' => '✳', - ':eject:' => '⏏', ':electric_plug:' => '🔌', ':elephant:' => '🐘', + ':elevator:' => '🛗', + ':elf:' => '🧝', + ':empty_nest:' => '🪹', ':end:' => '🔚', - ':envelope:' => '✉', ':envelope_with_arrow:' => '📩', ':euro:' => '💶', ':european_castle:' => '🏰', ':european_post_office:' => '🏤', ':evergreen_tree:' => '🌲', ':exclamation:' => '❗', + ':exploding_head:' => '🤯', ':expressionless:' => '😑', - ':eye:' => '👁', ':eyeglasses:' => '👓', ':eyes:' => '👀', + ':face_holding_back_tears:' => '🥹', ':face_palm:' => '🤦', + ':face_vomiting:' => '🤮', + ':face_with_diagonal_mouth:' => '🫤', + ':face_with_hand_over_mouth:' => '🤭', + ':face_with_monocle:' => '🧐', + ':face_with_open_eyes_and_hand_over_mouth:' => '🫢', + ':face_with_peeking_eye:' => '🫣', + ':face_with_raised_eyebrow:' => '🤨', + ':face_with_symbols_on_mouth:' => '🤬', ':factory:' => '🏭', + ':fairy:' => '🧚', + ':falafel:' => '🧆', ':fallen_leaf:' => '🍂', ':family:' => '👪', ':fast_forward:' => '⏩', ':fax:' => '📠', ':fearful:' => '😨', + ':feather:' => '🪶', ':feet:' => '🐾', ':fencer:' => '🤺', ':ferris_wheel:' => '🎡', - ':ferry:' => '⛴', ':field_hockey:' => '🏑', - ':file_cabinet:' => '🗄', ':file_folder:' => '📁', - ':film_frames:' => '🎞', ':fingers_crossed:' => '🤞', ':fire:' => '🔥', ':fire_engine:' => '🚒', + ':fire_extinguisher:' => '🧯', + ':firecracker:' => '🧨', ':fireworks:' => '🎆', ':first_place:' => '🥇', ':first_quarter_moon:' => '🌓', @@ -527,65 +381,80 @@ ':fishing_pole_and_fish:' => '🎣', ':fist:' => '✊', ':flag_black:' => '🏴', - ':flag_white:' => '🏳', ':flags:' => '🎏', + ':flamingo:' => '🦩', ':flashlight:' => '🔦', - ':fleur-de-lis:' => '⚜', + ':flat_shoe:' => '🥿', + ':flatbread:' => '🫓', ':floppy_disk:' => '💾', ':flower_playing_cards:' => '🎴', ':flushed:' => '😳', - ':fog:' => '🌫', + ':flute:' => '🪈', + ':fly:' => '🪰', + ':flying_disc:' => '🥏', + ':flying_saucer:' => '🛸', ':foggy:' => '🌁', + ':folding_hand_fan:' => '🪭', + ':fondue:' => '🫕', + ':foot:' => '🦶', ':football:' => '🏈', ':footprints:' => '👣', ':fork_and_knife:' => '🍴', - ':fork_knife_plate:' => '🍽', + ':fortune_cookie:' => '🥠', ':fountain:' => '⛲', ':four_leaf_clover:' => '🍀', ':fox:' => '🦊', - ':frame_photo:' => '🖼', ':free:' => '🆓', ':french_bread:' => '🥖', ':fried_shrimp:' => '🍤', ':fries:' => '🍟', ':frog:' => '🐸', ':frowning:' => '😦', - ':frowning2:' => '☹', ':fuelpump:' => '⛽', ':full_moon:' => '🌕', ':full_moon_with_face:' => '🌝', ':game_die:' => '🎲', - ':gear:' => '⚙', + ':garlic:' => '🧄', ':gem:' => '💎', ':gemini:' => '♊', + ':genie:' => '🧞', ':ghost:' => '👻', ':gift:' => '🎁', ':gift_heart:' => '💝', + ':ginger_root:' => '🫚', + ':giraffe:' => '🦒', ':girl:' => '👧', ':globe_with_meridians:' => '🌐', + ':gloves:' => '🧤', ':goal:' => '🥅', ':goat:' => '🐐', + ':goggles:' => '🥽', ':golf:' => '⛳', - ':golfer:' => '🏌', + ':goose:' => '🪿', ':gorilla:' => '🦍', ':grapes:' => '🍇', ':green_apple:' => '🍏', ':green_book:' => '📗', + ':green_circle:' => '🟢', ':green_heart:' => '💚', + ':green_square:' => '🟩', ':grey_exclamation:' => '❕', + ':grey_heart:' => '🩶', ':grey_question:' => '❔', ':grimacing:' => '😬', ':grin:' => '😁', ':grinning:' => '😀', ':guardsman:' => '💂', + ':guide_dog:' => '🦮', ':guitar:' => '🎸', ':gun:' => '🔫', + ':hair_pick:' => '🪮', ':haircut:' => '💇', ':hamburger:' => '🍔', ':hammer:' => '🔨', - ':hammer_pick:' => '⚒', + ':hamsa:' => '🪬', ':hamster:' => '🐹', - ':hand_splayed:' => '🖐', + ':hand_with_index_finger_and_thumb_crossed:' => '🫰', ':handbag:' => '👜', ':handball:' => '🤾', ':handshake:' => '🤝', @@ -593,74 +462,74 @@ ':hatching_chick:' => '🐣', ':head_bandage:' => '🤕', ':headphones:' => '🎧', + ':headstone:' => '🪦', ':hear_no_evil:' => '🙉', - ':heart:' => '❤', ':heart_decoration:' => '💟', - ':heart_exclamation:' => '❣', ':heart_eyes:' => '😍', ':heart_eyes_cat:' => '😻', + ':heart_hands:' => '🫶', ':heartbeat:' => '💓', ':heartpulse:' => '💗', - ':hearts:' => '♥', - ':heavy_check_mark:' => '✔', ':heavy_division_sign:' => '➗', ':heavy_dollar_sign:' => '💲', + ':heavy_equals_sign:' => '🟰', ':heavy_minus_sign:' => '➖', - ':heavy_multiplication_x:' => '✖', ':heavy_plus_sign:' => '➕', + ':hedgehog:' => '🦔', ':helicopter:' => '🚁', - ':helmet_with_cross:' => '⛑', ':herb:' => '🌿', ':hibiscus:' => '🌺', ':high_brightness:' => '🔆', ':high_heel:' => '👠', + ':hiking_boot:' => '🥾', + ':hindu_temple:' => '🛕', + ':hippopotamus:' => '🦛', ':hockey:' => '🏒', - ':hole:' => '🕳', - ':homes:' => '🏘', ':honey_pot:' => '🍯', + ':hook:' => '🪝', ':horse:' => '🐴', ':horse_racing:' => '🏇', ':hospital:' => '🏥', - ':hot_pepper:' => '🌶', + ':hot_face:' => '🥵', ':hotdog:' => '🌭', ':hotel:' => '🏨', - ':hotsprings:' => '♨', ':hourglass:' => '⌛', ':hourglass_flowing_sand:' => '⏳', ':house:' => '🏠', - ':house_abandoned:' => '🏚', ':house_with_garden:' => '🏡', ':hugging:' => '🤗', ':hushed:' => '😯', + ':hut:' => '🛖', + ':hyacinth:' => '🪻', + ':ice:' => '🧊', ':ice_cream:' => '🍨', - ':ice_skate:' => '⛸', ':icecream:' => '🍦', ':id:' => '🆔', + ':identification_card:' => '🪪', ':ideograph_advantage:' => '🉐', ':imp:' => '👿', ':inbox_tray:' => '📥', ':incoming_envelope:' => '📨', + ':index_pointing_at_the_viewer:' => '🫵', ':information_desk_person:' => '💁', - ':information_source:' => 'ℹ', ':innocent:' => '😇', - ':interrobang:' => '⁉', ':iphone:' => '📱', - ':island:' => '🏝', ':izakaya_lantern:' => '🏮', ':jack_o_lantern:' => '🎃', ':japan:' => '🗾', ':japanese_castle:' => '🏯', ':japanese_goblin:' => '👺', ':japanese_ogre:' => '👹', + ':jar:' => '🫙', ':jeans:' => '👖', + ':jellyfish:' => '🪼', ':joy:' => '😂', ':joy_cat:' => '😹', - ':joystick:' => '🕹', ':juggling:' => '🤹', ':kaaba:' => '🕋', + ':kangaroo:' => '🦘', ':key:' => '🔑', - ':key2:' => '🗝', - ':keyboard:' => '⌨', + ':khanda:' => '🪯', ':kimono:' => '👘', ':kiss:' => '💋', ':kissing:' => '😗', @@ -668,82 +537,106 @@ ':kissing_closed_eyes:' => '😚', ':kissing_heart:' => '😘', ':kissing_smiling_eyes:' => '😙', + ':kite:' => '🪁', ':kiwi:' => '🥝', ':knife:' => '🔪', + ':knot:' => '🪢', ':koala:' => '🐨', ':koko:' => '🈁', - ':label:' => '🏷', + ':lab_coat:' => '🥼', + ':lacrosse:' => '🥍', + ':ladder:' => '🪜', ':large_blue_circle:' => '🔵', ':large_blue_diamond:' => '🔷', ':large_orange_diamond:' => '🔶', ':last_quarter_moon:' => '🌗', ':last_quarter_moon_with_face:' => '🌜', ':laughing:' => '😆', + ':leafy_green:' => '🥬', ':leaves:' => '🍃', ':ledger:' => '📒', ':left_facing_fist:' => '🤛', ':left_luggage:' => '🛅', - ':left_right_arrow:' => '↔', - ':leftwards_arrow_with_hook:' => '↩', + ':leftwards_hand:' => '🫲', + ':leftwards_pushing_hand:' => '🫷', + ':leg:' => '🦵', ':lemon:' => '🍋', ':leo:' => '♌', ':leopard:' => '🐆', - ':level_slider:' => '🎚', - ':levitate:' => '🕴', ':libra:' => '♎', - ':lifter:' => '🏋', + ':light_blue_heart:' => '🩵', ':light_rail:' => '🚈', ':link:' => '🔗', ':lion_face:' => '🦁', ':lips:' => '👄', ':lipstick:' => '💄', ':lizard:' => '🦎', + ':llama:' => '🦙', + ':lobster:' => '🦞', ':lock:' => '🔒', ':lock_with_ink_pen:' => '🔏', ':lollipop:' => '🍭', + ':long_drum:' => '🪘', ':loop:' => '➿', + ':lotion_bottle:' => '🧴', + ':lotus:' => '🪷', ':loud_sound:' => '🔊', ':loudspeaker:' => '📢', ':love_hotel:' => '🏩', ':love_letter:' => '💌', + ':love_you_gesture:' => '🤟', + ':low_battery:' => '🪫', ':low_brightness:' => '🔅', + ':luggage:' => '🧳', + ':lungs:' => '🫁', ':lying_face:' => '🤥', - ':m:' => 'Ⓜ', ':mag:' => '🔍', ':mag_right:' => '🔎', + ':mage:' => '🧙', + ':magic_wand:' => '🪄', + ':magnet:' => '🧲', ':mahjong:' => '🀄', ':mailbox:' => '📫', ':mailbox_closed:' => '📪', ':mailbox_with_mail:' => '📬', ':mailbox_with_no_mail:' => '📭', + ':mammoth:' => '🦣', ':man:' => '👨', ':man_dancing:' => '🕺', - ':man_in_tuxedo:' => '🤵', ':man_with_gua_pi_mao:' => '👲', ':man_with_turban:' => '👳', + ':mango:' => '🥭', ':mans_shoe:' => '👞', - ':map:' => '🗺', + ':manual_wheelchair:' => '🦽', ':maple_leaf:' => '🍁', + ':maracas:' => '🪇', ':martial_arts_uniform:' => '🥋', ':mask:' => '😷', ':massage:' => '💆', + ':mate:' => '🧉', ':meat_on_bone:' => '🍖', + ':mechanical_arm:' => '🦾', + ':mechanical_leg:' => '🦿', ':medal:' => '🏅', ':mega:' => '📣', ':melon:' => '🍈', + ':melting_face:' => '🫠', ':menorah:' => '🕎', ':mens:' => '🚹', + ':merperson:' => '🧜', ':metal:' => '🤘', ':metro:' => '🚇', + ':microbe:' => '🦠', ':microphone:' => '🎤', - ':microphone2:' => '🎙', ':microscope:' => '🔬', ':middle_finger:' => '🖕', - ':military_medal:' => '🎖', + ':military_helmet:' => '🪖', ':milk:' => '🥛', ':milky_way:' => '🌌', ':minibus:' => '🚐', ':minidisc:' => '💽', + ':mirror:' => '🪞', + ':mirror_ball:' => '🪩', ':mobile_phone_off:' => '📴', ':money_mouth:' => '🤑', ':money_with_wings:' => '💸', @@ -751,21 +644,20 @@ ':monkey:' => '🐒', ':monkey_face:' => '🐵', ':monorail:' => '🚝', + ':moon_cake:' => '🥮', + ':moose:' => '🫎', ':mortar_board:' => '🎓', ':mosque:' => '🕌', + ':mosquito:' => '🦟', ':motor_scooter:' => '🛵', - ':motorboat:' => '🛥', - ':motorcycle:' => '🏍', - ':motorway:' => '🛣', + ':motorized_wheelchair:' => '🦼', ':mount_fuji:' => '🗻', - ':mountain:' => '⛰', ':mountain_bicyclist:' => '🚵', ':mountain_cableway:' => '🚠', ':mountain_railway:' => '🚞', - ':mountain_snow:' => '🏔', ':mouse:' => '🐭', ':mouse2:' => '🐁', - ':mouse_three_button:' => '🖱', + ':mouse_trap:' => '🪤', ':movie_camera:' => '🎥', ':moyai:' => '🗿', ':mrs_claus:' => '🤶', @@ -778,17 +670,20 @@ ':nail_care:' => '💅', ':name_badge:' => '📛', ':nauseated_face:' => '🤢', + ':nazar_amulet:' => '🧿', ':necktie:' => '👔', ':negative_squared_cross_mark:' => '❎', ':nerd:' => '🤓', + ':nest_with_eggs:' => '🪺', + ':nesting_dolls:' => '🪆', ':neutral_face:' => '😐', ':new:' => '🆕', ':new_moon:' => '🌑', ':new_moon_with_face:' => '🌚', ':newspaper:' => '📰', - ':newspaper2:' => '🗞', ':ng:' => '🆖', ':night_with_stars:' => '🌃', + ':ninja:' => '🥷', ':no_bell:' => '🔕', ':no_bicycles:' => '🚳', ':no_entry:' => '⛔', @@ -802,83 +697,103 @@ ':nose:' => '👃', ':notebook:' => '📓', ':notebook_with_decorative_cover:' => '📔', - ':notepad_spiral:' => '🗒', ':notes:' => '🎶', ':nut_and_bolt:' => '🔩', ':o:' => '⭕', - ':o2:' => '🅾', ':ocean:' => '🌊', ':octagonal_sign:' => '🛑', ':octopus:' => '🐙', ':oden:' => '🍢', ':office:' => '🏢', - ':oil:' => '🛢', ':ok:' => '🆗', ':ok_hand:' => '👌', ':ok_woman:' => '🙆', ':older_man:' => '👴', + ':older_person:' => '🧓', ':older_woman:' => '👵', - ':om_symbol:' => '🕉', + ':olive:' => '🫒', ':on:' => '🔛', ':oncoming_automobile:' => '🚘', ':oncoming_bus:' => '🚍', ':oncoming_police_car:' => '🚔', ':oncoming_taxi:' => '🚖', + ':one_piece_swimsuit:' => '🩱', + ':onion:' => '🧅', ':open_file_folder:' => '📂', ':open_hands:' => '👐', ':open_mouth:' => '😮', ':ophiuchus:' => '⛎', ':orange_book:' => '📙', - ':orthodox_cross:' => '☦', + ':orange_circle:' => '🟠', + ':orange_heart:' => '🧡', + ':orange_square:' => '🟧', + ':orangutan:' => '🦧', + ':otter:' => '🦦', ':outbox_tray:' => '📤', ':owl:' => '🦉', ':ox:' => '🐂', + ':oyster:' => '🦪', ':package:' => '📦', ':page_facing_up:' => '📄', ':page_with_curl:' => '📃', ':pager:' => '📟', - ':paintbrush:' => '🖌', + ':palm_down_hand:' => '🫳', ':palm_tree:' => '🌴', + ':palm_up_hand:' => '🫴', + ':palms_up_together:' => '🤲', ':pancakes:' => '🥞', ':panda_face:' => '🐼', ':paperclip:' => '📎', - ':paperclips:' => '🖇', - ':park:' => '🏞', - ':parking:' => '🅿', - ':part_alternation_mark:' => '〽', + ':parachute:' => '🪂', + ':parrot:' => '🦜', ':partly_sunny:' => '⛅', + ':partying_face:' => '🥳', ':passport_control:' => '🛂', - ':pause_button:' => '⏸', - ':peace:' => '☮', + ':pea_pod:' => '🫛', ':peach:' => '🍑', + ':peacock:' => '🦚', ':peanuts:' => '🥜', ':pear:' => '🍐', - ':pen_ballpoint:' => '🖊', - ':pen_fountain:' => '🖋', ':pencil:' => '📝', - ':pencil2:' => '✏', ':penguin:' => '🐧', ':pensive:' => '😔', + ':people_hugging:' => '🫂', ':performing_arts:' => '🎭', ':persevere:' => '😣', + ':person:' => '🧑', + ':person_beard:' => '🧔', + ':person_climbing:' => '🧗', ':person_frowning:' => '🙍', + ':person_in_lotus_position:' => '🧘', + ':person_in_steamy_room:' => '🧖', + ':person_kneeling:' => '🧎', + ':person_standing:' => '🧍', ':person_with_blond_hair:' => '👱', + ':person_with_crown:' => '🫅', ':person_with_pouting_face:' => '🙎', - ':pick:' => '⛏', + ':petri_dish:' => '🧫', + ':pickup_truck:' => '🛻', + ':pie:' => '🥧', ':pig:' => '🐷', ':pig2:' => '🐖', ':pig_nose:' => '🐽', ':pill:' => '💊', + ':pinata:' => '🪅', + ':pinched_fingers:' => '🤌', + ':pinching_hand:' => '🤏', ':pineapple:' => '🍍', ':ping_pong:' => '🏓', + ':pink_heart:' => '🩷', ':pisces:' => '♓', ':pizza:' => '🍕', + ':placard:' => '🪧', ':place_of_worship:' => '🛐', - ':play_pause:' => '⏯', + ':playground_slide:' => '🛝', + ':pleading_face:' => '🥺', + ':plunger:' => '🪠', ':point_down:' => '👇', ':point_left:' => '👈', ':point_right:' => '👉', - ':point_up:' => '☝', ':point_up_2:' => '👆', ':police_car:' => '🚓', ':poodle:' => '🐩', @@ -889,33 +804,37 @@ ':postbox:' => '📮', ':potable_water:' => '🚰', ':potato:' => '🥔', + ':potted_plant:' => '🪴', ':pouch:' => '👝', ':poultry_leg:' => '🍗', ':pound:' => '💷', + ':pouring_liquid:' => '🫗', ':pouting_cat:' => '😾', ':pray:' => '🙏', ':prayer_beads:' => '📿', + ':pregnant_man:' => '🫃', + ':pregnant_person:' => '🫄', ':pregnant_woman:' => '🤰', + ':pretzel:' => '🥨', ':prince:' => '🤴', ':princess:' => '👸', - ':printer:' => '🖨', - ':projector:' => '📽', ':punch:' => '👊', + ':purple_circle:' => '🟣', ':purple_heart:' => '💜', + ':purple_square:' => '🟪', ':purse:' => '👛', ':pushpin:' => '📌', ':put_litter_in_its_place:' => '🚮', + ':puzzle_piece:' => '🧩', ':question:' => '❓', ':rabbit:' => '🐰', ':rabbit2:' => '🐇', - ':race_car:' => '🏎', + ':raccoon:' => '🦝', ':racehorse:' => '🐎', ':radio:' => '📻', ':radio_button:' => '🔘', - ':radioactive:' => '☢', ':rage:' => '😡', ':railway_car:' => '🚃', - ':railway_track:' => '🛤', ':rainbow:' => '🌈', ':raised_back_of_hand:' => '🤚', ':raised_hand:' => '✋', @@ -924,14 +843,14 @@ ':ram:' => '🐏', ':ramen:' => '🍜', ':rat:' => '🐀', - ':record_button:' => '⏺', - ':recycle:' => '♻', + ':razor:' => '🪒', + ':receipt:' => '🧾', ':red_car:' => '🚗', ':red_circle:' => '🔴', - ':registered:' => '®', - ':relaxed:' => '☺', + ':red_envelope:' => '🧧', + ':red_hair:' => '🦰', + ':red_square:' => '🟥', ':relieved:' => '😌', - ':reminder_ribbon:' => '🎗', ':repeat:' => '🔁', ':repeat_one:' => '🔂', ':restroom:' => '🚻', @@ -944,74 +863,87 @@ ':rice_cracker:' => '🍘', ':rice_scene:' => '🎑', ':right_facing_fist:' => '🤜', + ':rightwards_hand:' => '🫱', + ':rightwards_pushing_hand:' => '🫸', ':ring:' => '💍', + ':ring_buoy:' => '🛟', + ':ringed_planet:' => '🪐', ':robot:' => '🤖', + ':rock:' => '🪨', ':rocket:' => '🚀', ':rofl:' => '🤣', + ':roll_of_paper:' => '🧻', ':roller_coaster:' => '🎢', + ':roller_skate:' => '🛼', ':rolling_eyes:' => '🙄', ':rooster:' => '🐓', ':rose:' => '🌹', - ':rosette:' => '🏵', ':rotating_light:' => '🚨', ':round_pushpin:' => '📍', ':rowboat:' => '🚣', ':rugby_football:' => '🏉', ':runner:' => '🏃', ':running_shirt_with_sash:' => '🎽', - ':sa:' => '🈂', + ':safety_pin:' => '🧷', + ':safety_vest:' => '🦺', ':sagittarius:' => '♐', ':sailboat:' => '⛵', ':sake:' => '🍶', ':salad:' => '🥗', + ':salt:' => '🧂', + ':saluting_face:' => '🫡', ':sandal:' => '👡', + ':sandwich:' => '🥪', ':santa:' => '🎅', + ':sari:' => '🥻', ':satellite:' => '📡', - ':satellite_orbital:' => '🛰', + ':sauropod:' => '🦕', ':saxophone:' => '🎷', - ':scales:' => '⚖', + ':scarf:' => '🧣', ':school:' => '🏫', ':school_satchel:' => '🎒', - ':scissors:' => '✂', ':scooter:' => '🛴', ':scorpion:' => '🦂', ':scorpius:' => '♏', ':scream:' => '😱', ':scream_cat:' => '🙀', + ':screwdriver:' => '🪛', ':scroll:' => '📜', + ':seal:' => '🦭', ':seat:' => '💺', ':second_place:' => '🥈', - ':secret:' => '㊙', ':see_no_evil:' => '🙈', ':seedling:' => '🌱', ':selfie:' => '🤳', + ':sewing_needle:' => '🪡', + ':shaking_face:' => '🫨', ':shallow_pan_of_food:' => '🥘', - ':shamrock:' => '☘', ':shark:' => '🦈', ':shaved_ice:' => '🍧', ':sheep:' => '🐑', ':shell:' => '🐚', - ':shield:' => '🛡', - ':shinto_shrine:' => '⛩', ':ship:' => '🚢', ':shirt:' => '👕', - ':shopping_bags:' => '🛍', ':shopping_cart:' => '🛒', + ':shorts:' => '🩳', ':shower:' => '🚿', ':shrimp:' => '🦐', ':shrug:' => '🤷', + ':shushing_face:' => '🤫', ':signal_strength:' => '📶', ':six_pointed_star:' => '🔯', + ':skateboard:' => '🛹', ':ski:' => '🎿', - ':skier:' => '⛷', ':skull:' => '💀', - ':skull_crossbones:' => '☠', + ':skunk:' => '🦨', + ':sled:' => '🛷', ':sleeping:' => '😴', ':sleeping_accommodation:' => '🛌', ':sleepy:' => '😪', ':slight_frown:' => '🙁', ':slight_smile:' => '🙂', ':slot_machine:' => '🎰', + ':sloth:' => '🦥', ':small_blue_diamond:' => '🔹', ':small_orange_diamond:' => '🔸', ':small_red_triangle:' => '🔺', @@ -1020,6 +952,8 @@ ':smile_cat:' => '😸', ':smiley:' => '😃', ':smiley_cat:' => '😺', + ':smiling_face_with_hearts:' => '🥰', + ':smiling_face_with_tear:' => '🥲', ':smiling_imp:' => '😈', ':smirk:' => '😏', ':smirk_cat:' => '😼', @@ -1028,44 +962,36 @@ ':snake:' => '🐍', ':sneezing_face:' => '🤧', ':snowboarder:' => '🏂', - ':snowflake:' => '❄', ':snowman:' => '⛄', - ':snowman2:' => '☃', + ':soap:' => '🧼', ':sob:' => '😭', ':soccer:' => '⚽', + ':socks:' => '🧦', + ':softball:' => '🥎', ':soon:' => '🔜', ':sos:' => '🆘', ':sound:' => '🔉', ':space_invader:' => '👾', - ':spades:' => '♠', ':spaghetti:' => '🍝', - ':sparkle:' => '❇', ':sparkler:' => '🎇', ':sparkles:' => '✨', ':sparkling_heart:' => '💖', ':speak_no_evil:' => '🙊', ':speaker:' => '🔈', - ':speaking_head:' => '🗣', ':speech_balloon:' => '💬', - ':speech_left:' => '🗨', ':speedboat:' => '🚤', - ':spider:' => '🕷', - ':spider_web:' => '🕸', + ':sponge:' => '🧽', ':spoon:' => '🥄', - ':spy:' => '🕵', ':squid:' => '🦑', - ':stadium:' => '🏟', ':star:' => '⭐', ':star2:' => '🌟', - ':star_and_crescent:' => '☪', - ':star_of_david:' => '✡', + ':star_struck:' => '🤩', ':stars:' => '🌠', ':station:' => '🚉', ':statue_of_liberty:' => '🗽', ':steam_locomotive:' => '🚂', + ':stethoscope:' => '🩺', ':stew:' => '🍲', - ':stop_button:' => '⏹', - ':stopwatch:' => '⏱', ':straight_ruler:' => '📏', ':strawberry:' => '🍓', ':stuck_out_tongue:' => '😛', @@ -1075,12 +1001,14 @@ ':sun_with_face:' => '🌞', ':sunflower:' => '🌻', ':sunglasses:' => '😎', - ':sunny:' => '☀', ':sunrise:' => '🌅', ':sunrise_over_mountains:' => '🌄', + ':superhero:' => '🦸', + ':supervillain:' => '🦹', ':surfer:' => '🏄', ':sushi:' => '🍣', ':suspension_railway:' => '🚟', + ':swan:' => '🦢', ':sweat:' => '😓', ':sweat_drops:' => '💦', ':sweat_smile:' => '😅', @@ -1089,34 +1017,36 @@ ':symbols:' => '🔣', ':synagogue:' => '🕍', ':syringe:' => '💉', + ':t_rex:' => '🦖', ':taco:' => '🌮', ':tada:' => '🎉', + ':takeout_box:' => '🥡', + ':tamale:' => '🫔', ':tanabata_tree:' => '🎋', ':tangerine:' => '🍊', ':taurus:' => '♉', ':taxi:' => '🚕', ':tea:' => '🍵', - ':telephone:' => '☎', + ':teapot:' => '🫖', + ':teddy_bear:' => '🧸', ':telephone_receiver:' => '📞', ':telescope:' => '🔭', ':ten:' => '🔟', ':tennis:' => '🎾', ':tent:' => '⛺', - ':thermometer:' => '🌡', + ':test_tube:' => '🧪', ':thermometer_face:' => '🤒', ':thinking:' => '🤔', ':third_place:' => '🥉', + ':thong_sandal:' => '🩴', ':thought_balloon:' => '💭', + ':thread:' => '🧵', ':thumbsdown:' => '👎', ':thumbsup:' => '👍', - ':thunder_cloud_rain:' => '⛈', ':ticket:' => '🎫', - ':tickets:' => '🎟', ':tiger:' => '🐯', ':tiger2:' => '🐅', - ':timer:' => '⏲', ':tired_face:' => '😫', - ':tm:' => '™', ':toilet:' => '🚽', ':tokyo_tower:' => '🗼', ':tomato:' => '🍅', @@ -1126,12 +1056,11 @@ ':tone4:' => '🏾', ':tone5:' => '🏿', ':tongue:' => '👅', - ':tools:' => '🛠', + ':toolbox:' => '🧰', + ':tooth:' => '🦷', + ':toothbrush:' => '🪥', ':top:' => '🔝', ':tophat:' => '🎩', - ':track_next:' => '⏭', - ':track_previous:' => '⏮', - ':trackball:' => '🖲', ':tractor:' => '🚜', ':traffic_light:' => '🚥', ':train:' => '🚋', @@ -1141,6 +1070,7 @@ ':triangular_ruler:' => '📐', ':trident:' => '🔱', ':triumph:' => '😤', + ':troll:' => '🧌', ':trolleybus:' => '🚎', ':trophy:' => '🏆', ':tropical_drink:' => '🍹', @@ -1162,21 +1092,18 @@ ':u5272:' => '🈹', ':u5408:' => '🈴', ':u6307:' => '🈯', - ':u6708:' => '🈷', ':u6709:' => '🈶', ':u7121:' => '🈚', ':u7533:' => '🈸', ':u7981:' => '🈲', ':umbrella:' => '☔', - ':umbrella2:' => '☂', ':unamused:' => '😒', ':underage:' => '🔞', ':unicorn:' => '🦄', ':unlock:' => '🔓', ':up:' => '🆙', ':upside_down:' => '🙃', - ':urn:' => '⚱', - ':v:' => '✌', + ':vampire:' => '🧛', ':vertical_traffic_light:' => '🚦', ':vhs:' => '📼', ':vibration_mode:' => '📳', @@ -1188,17 +1115,15 @@ ':volleyball:' => '🏐', ':vs:' => '🆚', ':vulcan:' => '🖖', + ':waffle:' => '🧇', ':walking:' => '🚶', ':waning_crescent_moon:' => '🌘', ':waning_gibbous_moon:' => '🌖', - ':warning:' => '⚠', - ':wastebasket:' => '🗑', ':watch:' => '⌚', ':water_buffalo:' => '🐃', ':water_polo:' => '🤽', ':watermelon:' => '🍉', ':wave:' => '👋', - ':wavy_dash:' => '〰', ':waxing_crescent_moon:' => '🌒', ':waxing_gibbous_moon:' => '🌔', ':wc:' => '🚾', @@ -1206,432 +1131,87 @@ ':wedding:' => '💒', ':whale:' => '🐳', ':whale2:' => '🐋', - ':wheel_of_dharma:' => '☸', + ':wheel:' => '🛞', ':wheelchair:' => '♿', + ':white_cane:' => '🦯', ':white_check_mark:' => '✅', ':white_circle:' => '⚪', ':white_flower:' => '💮', + ':white_hair:' => '🦳', + ':white_heart:' => '🤍', ':white_large_square:' => '⬜', ':white_medium_small_square:' => '◽', - ':white_medium_square:' => '◻', - ':white_small_square:' => '▫', ':white_square_button:' => '🔳', - ':white_sun_cloud:' => '🌥', - ':white_sun_rain_cloud:' => '🌦', - ':white_sun_small_cloud:' => '🌤', ':wilted_rose:' => '🥀', - ':wind_blowing_face:' => '🌬', ':wind_chime:' => '🎐', + ':window:' => '🪟', ':wine_glass:' => '🍷', + ':wing:' => '🪽', ':wink:' => '😉', + ':wireless:' => '🛜', ':wolf:' => '🐺', ':woman:' => '👩', + ':woman_with_headscarf:' => '🧕', ':womans_clothes:' => '👚', ':womans_hat:' => '👒', ':womens:' => '🚺', + ':wood:' => '🪵', + ':woozy_face:' => '🥴', + ':worm:' => '🪱', ':worried:' => '😟', ':wrench:' => '🔧', ':wrestlers:' => '🤼', - ':writing_hand:' => '✍', ':x:' => '❌', + ':x_ray:' => '🩻', + ':yarn:' => '🧶', + ':yawning_face:' => '🥱', + ':yellow_circle:' => '🟡', ':yellow_heart:' => '💛', + ':yellow_square:' => '🟨', ':yen:' => '💴', - ':yin_yang:' => '☯', + ':yo_yo:' => '🪀', ':yum:' => '😋', + ':zany_face:' => '🤪', ':zap:' => '⚡', + ':zebra:' => '🦓', ':zipper_mouth:' => '🤐', + ':zombie:' => '🧟', ':zzz:' => '💤', - ':+1_tone1:' => '👍🏻', - ':+1_tone2:' => '👍🏼', - ':+1_tone3:' => '👍🏽', - ':+1_tone4:' => '👍🏾', - ':+1_tone5:' => '👍🏿', - ':-1_tone1:' => '👎🏻', - ':-1_tone2:' => '👎🏼', - ':-1_tone3:' => '👎🏽', - ':-1_tone4:' => '👎🏾', - ':-1_tone5:' => '👎🏿', - ':ac:' => '🇦🇨', - ':ad:' => '🇦🇩', - ':ae:' => '🇦🇪', - ':af:' => '🇦🇫', - ':ag:' => '🇦🇬', - ':ai:' => '🇦🇮', - ':al:' => '🇦🇱', - ':am:' => '🇦🇲', - ':ao:' => '🇦🇴', - ':aq:' => '🇦🇶', - ':ar:' => '🇦🇷', - ':as:' => '🇦🇸', - ':at:' => '🇦🇹', - ':au:' => '🇦🇺', - ':aw:' => '🇦🇼', - ':ax:' => '🇦🇽', - ':az:' => '🇦🇿', - ':ba:' => '🇧🇦', - ':back_of_hand_tone1:' => '🤚🏻', - ':back_of_hand_tone2:' => '🤚🏼', - ':back_of_hand_tone3:' => '🤚🏽', - ':back_of_hand_tone4:' => '🤚🏾', - ':back_of_hand_tone5:' => '🤚🏿', - ':bb:' => '🇧🇧', - ':bd:' => '🇧🇩', - ':be:' => '🇧🇪', - ':bf:' => '🇧🇫', - ':bg:' => '🇧🇬', - ':bh:' => '🇧🇭', - ':bi:' => '🇧🇮', - ':bj:' => '🇧🇯', - ':bl:' => '🇧🇱', - ':bm:' => '🇧🇲', - ':bn:' => '🇧🇳', - ':bo:' => '🇧🇴', - ':bq:' => '🇧🇶', - ':br:' => '🇧🇷', - ':bs:' => '🇧🇸', - ':bt:' => '🇧🇹', - ':bv:' => '🇧🇻', - ':bw:' => '🇧🇼', - ':by:' => '🇧🇾', - ':bz:' => '🇧🇿', - ':ca:' => '🇨🇦', - ':call_me_hand_tone1:' => '🤙🏻', - ':call_me_hand_tone2:' => '🤙🏼', - ':call_me_hand_tone3:' => '🤙🏽', - ':call_me_hand_tone4:' => '🤙🏾', - ':call_me_hand_tone5:' => '🤙🏿', - ':cc:' => '🇨🇨', - ':cf:' => '🇨🇫', - ':cg:' => '🇨🇬', - ':ch:' => '🇨🇭', - ':chile:' => '🇨🇱', - ':ci:' => '🇨🇮', - ':ck:' => '🇨🇰', - ':cm:' => '🇨🇲', - ':cn:' => '🇨🇳', - ':co:' => '🇨🇴', - ':congo:' => '🇨🇩', - ':cp:' => '🇨🇵', - ':cr:' => '🇨🇷', - ':cu:' => '🇨🇺', - ':cv:' => '🇨🇻', - ':cw:' => '🇨🇼', - ':cx:' => '🇨🇽', - ':cy:' => '🇨🇾', - ':cz:' => '🇨🇿', - ':de:' => '🇩🇪', - ':dg:' => '🇩🇬', - ':dj:' => '🇩🇯', - ':dk:' => '🇩🇰', - ':dm:' => '🇩🇲', - ':do:' => '🇩🇴', - ':dz:' => '🇩🇿', - ':ea:' => '🇪🇦', - ':ec:' => '🇪🇨', - ':ee:' => '🇪🇪', - ':eg:' => '🇪🇬', - ':eh:' => '🇪🇭', - ':er:' => '🇪🇷', - ':es:' => '🇪🇸', - ':et:' => '🇪🇹', - ':eu:' => '🇪🇺', - ':expecting_woman_tone1:' => '🤰🏻', - ':expecting_woman_tone2:' => '🤰🏼', - ':expecting_woman_tone3:' => '🤰🏽', - ':expecting_woman_tone4:' => '🤰🏾', - ':expecting_woman_tone5:' => '🤰🏿', - ':facepalm_tone1:' => '🤦🏻', - ':facepalm_tone2:' => '🤦🏼', - ':facepalm_tone3:' => '🤦🏽', - ':facepalm_tone4:' => '🤦🏾', - ':facepalm_tone5:' => '🤦🏿', - ':fi:' => '🇫🇮', - ':fj:' => '🇫🇯', - ':fk:' => '🇫🇰', - ':fm:' => '🇫🇲', - ':fo:' => '🇫🇴', - ':fr:' => '🇫🇷', - ':ga:' => '🇬🇦', - ':gb:' => '🇬🇧', - ':gd:' => '🇬🇩', - ':ge:' => '🇬🇪', - ':gf:' => '🇬🇫', - ':gg:' => '🇬🇬', - ':gh:' => '🇬🇭', - ':gi:' => '🇬🇮', - ':gl:' => '🇬🇱', - ':gm:' => '🇬🇲', - ':gn:' => '🇬🇳', - ':gp:' => '🇬🇵', - ':gq:' => '🇬🇶', - ':gr:' => '🇬🇷', - ':grandma_tone1:' => '👵🏻', - ':grandma_tone2:' => '👵🏼', - ':grandma_tone3:' => '👵🏽', - ':grandma_tone4:' => '👵🏾', - ':grandma_tone5:' => '👵🏿', - ':gs:' => '🇬🇸', - ':gt:' => '🇬🇹', - ':gu:' => '🇬🇺', - ':gw:' => '🇬🇼', - ':gy:' => '🇬🇾', - ':hand_with_index_and_middle_fingers_crossed_tone1:' => '🤞🏻', - ':hand_with_index_and_middle_fingers_crossed_tone2:' => '🤞🏼', - ':hand_with_index_and_middle_fingers_crossed_tone3:' => '🤞🏽', - ':hand_with_index_and_middle_fingers_crossed_tone4:' => '🤞🏾', - ':hand_with_index_and_middle_fingers_crossed_tone5:' => '🤞🏿', - ':hk:' => '🇭🇰', - ':hm:' => '🇭🇲', - ':hn:' => '🇭🇳', - ':hr:' => '🇭🇷', - ':ht:' => '🇭🇹', - ':hu:' => '🇭🇺', - ':ic:' => '🇮🇨', - ':ie:' => '🇮🇪', - ':il:' => '🇮🇱', - ':im:' => '🇮🇲', - ':in:' => '🇮🇳', - ':indonesia:' => '🇮🇩', - ':io:' => '🇮🇴', - ':iq:' => '🇮🇶', - ':ir:' => '🇮🇷', - ':is:' => '🇮🇸', - ':it:' => '🇮🇹', - ':je:' => '🇯🇪', - ':jm:' => '🇯🇲', - ':jo:' => '🇯🇴', - ':jp:' => '🇯🇵', - ':juggler_tone1:' => '🤹🏻', - ':juggler_tone2:' => '🤹🏼', - ':juggler_tone3:' => '🤹🏽', - ':juggler_tone4:' => '🤹🏾', - ':juggler_tone5:' => '🤹🏿', - ':ke:' => '🇰🇪', - ':keycap_asterisk:' => '*⃣', - ':kg:' => '🇰🇬', - ':kh:' => '🇰🇭', - ':ki:' => '🇰🇮', - ':km:' => '🇰🇲', - ':kn:' => '🇰🇳', - ':kp:' => '🇰🇵', - ':kr:' => '🇰🇷', - ':kw:' => '🇰🇼', - ':ky:' => '🇰🇾', - ':kz:' => '🇰🇿', - ':la:' => '🇱🇦', - ':lb:' => '🇱🇧', - ':lc:' => '🇱🇨', - ':left_fist_tone1:' => '🤛🏻', - ':left_fist_tone2:' => '🤛🏼', - ':left_fist_tone3:' => '🤛🏽', - ':left_fist_tone4:' => '🤛🏾', - ':left_fist_tone5:' => '🤛🏿', - ':li:' => '🇱🇮', - ':lk:' => '🇱🇰', - ':lr:' => '🇱🇷', - ':ls:' => '🇱🇸', - ':lt:' => '🇱🇹', - ':lu:' => '🇱🇺', - ':lv:' => '🇱🇻', - ':ly:' => '🇱🇾', - ':ma:' => '🇲🇦', - ':male_dancer_tone1:' => '🕺🏻', - ':male_dancer_tone2:' => '🕺🏼', - ':male_dancer_tone3:' => '🕺🏽', - ':male_dancer_tone4:' => '🕺🏾', - ':male_dancer_tone5:' => '🕺🏿', - ':mc:' => '🇲🇨', - ':md:' => '🇲🇩', - ':me:' => '🇲🇪', - ':mf:' => '🇲🇫', - ':mg:' => '🇲🇬', - ':mh:' => '🇲🇭', - ':mk:' => '🇲🇰', - ':ml:' => '🇲🇱', - ':mm:' => '🇲🇲', - ':mn:' => '🇲🇳', - ':mo:' => '🇲🇴', - ':mother_christmas_tone1:' => '🤶🏻', - ':mother_christmas_tone2:' => '🤶🏼', - ':mother_christmas_tone3:' => '🤶🏽', - ':mother_christmas_tone4:' => '🤶🏾', - ':mother_christmas_tone5:' => '🤶🏿', - ':mp:' => '🇲🇵', - ':mq:' => '🇲🇶', - ':mr:' => '🇲🇷', - ':ms:' => '🇲🇸', - ':mt:' => '🇲🇹', - ':mu:' => '🇲🇺', - ':mv:' => '🇲🇻', - ':mw:' => '🇲🇼', - ':mx:' => '🇲🇽', - ':my:' => '🇲🇾', - ':mz:' => '🇲🇿', - ':na:' => '🇳🇦', - ':nc:' => '🇳🇨', - ':ne:' => '🇳🇪', - ':nf:' => '🇳🇫', - ':ni:' => '🇳🇮', - ':nigeria:' => '🇳🇬', - ':nl:' => '🇳🇱', - ':no:' => '🇳🇴', - ':np:' => '🇳🇵', - ':nr:' => '🇳🇷', - ':nu:' => '🇳🇺', - ':nz:' => '🇳🇿', - ':om:' => '🇴🇲', - ':pa:' => '🇵🇦', - ':pe:' => '🇵🇪', - ':person_doing_cartwheel_tone1:' => '🤸🏻', - ':person_doing_cartwheel_tone2:' => '🤸🏼', - ':person_doing_cartwheel_tone3:' => '🤸🏽', - ':person_doing_cartwheel_tone4:' => '🤸🏾', - ':person_doing_cartwheel_tone5:' => '🤸🏿', - ':person_with_ball_tone1:' => '⛹🏻', - ':person_with_ball_tone2:' => '⛹🏼', - ':person_with_ball_tone3:' => '⛹🏽', - ':person_with_ball_tone4:' => '⛹🏾', - ':person_with_ball_tone5:' => '⛹🏿', - ':pf:' => '🇵🇫', - ':pg:' => '🇵🇬', - ':ph:' => '🇵🇭', - ':pk:' => '🇵🇰', - ':pl:' => '🇵🇱', - ':pm:' => '🇵🇲', - ':pn:' => '🇵🇳', - ':pr:' => '🇵🇷', - ':ps:' => '🇵🇸', - ':pt:' => '🇵🇹', - ':pw:' => '🇵🇼', - ':py:' => '🇵🇾', - ':qa:' => '🇶🇦', - ':rainbow_flag:' => '🏳🌈', - ':raised_hand_with_fingers_splayed_tone1:' => '🖐🏻', - ':raised_hand_with_fingers_splayed_tone2:' => '🖐🏼', - ':raised_hand_with_fingers_splayed_tone3:' => '🖐🏽', - ':raised_hand_with_fingers_splayed_tone4:' => '🖐🏾', - ':raised_hand_with_fingers_splayed_tone5:' => '🖐🏿', - ':raised_hand_with_part_between_middle_and_ring_fingers_tone1:' => '🖖🏻', - ':raised_hand_with_part_between_middle_and_ring_fingers_tone2:' => '🖖🏼', - ':raised_hand_with_part_between_middle_and_ring_fingers_tone3:' => '🖖🏽', - ':raised_hand_with_part_between_middle_and_ring_fingers_tone4:' => '🖖🏾', - ':raised_hand_with_part_between_middle_and_ring_fingers_tone5:' => '🖖🏿', - ':re:' => '🇷🇪', - ':reversed_hand_with_middle_finger_extended_tone1:' => '🖕🏻', - ':reversed_hand_with_middle_finger_extended_tone2:' => '🖕🏼', - ':reversed_hand_with_middle_finger_extended_tone3:' => '🖕🏽', - ':reversed_hand_with_middle_finger_extended_tone4:' => '🖕🏾', - ':reversed_hand_with_middle_finger_extended_tone5:' => '🖕🏿', - ':right_fist_tone1:' => '🤜🏻', - ':right_fist_tone2:' => '🤜🏼', - ':right_fist_tone3:' => '🤜🏽', - ':right_fist_tone4:' => '🤜🏾', - ':right_fist_tone5:' => '🤜🏿', - ':ro:' => '🇷🇴', - ':rs:' => '🇷🇸', - ':ru:' => '🇷🇺', - ':rw:' => '🇷🇼', - ':saudi:' => '🇸🇦', - ':saudiarabia:' => '🇸🇦', - ':sb:' => '🇸🇧', - ':sc:' => '🇸🇨', - ':sd:' => '🇸🇩', - ':se:' => '🇸🇪', - ':sg:' => '🇸🇬', - ':sh:' => '🇸🇭', - ':shaking_hands_tone1:' => '🤝🏻', - ':shaking_hands_tone2:' => '🤝🏼', - ':shaking_hands_tone3:' => '🤝🏽', - ':shaking_hands_tone4:' => '🤝🏾', - ':shaking_hands_tone5:' => '🤝🏿', - ':si:' => '🇸🇮', - ':sign_of_the_horns_tone1:' => '🤘🏻', - ':sign_of_the_horns_tone2:' => '🤘🏼', - ':sign_of_the_horns_tone3:' => '🤘🏽', - ':sign_of_the_horns_tone4:' => '🤘🏾', - ':sign_of_the_horns_tone5:' => '🤘🏿', - ':sj:' => '🇸🇯', - ':sk:' => '🇸🇰', - ':sl:' => '🇸🇱', - ':sleuth_or_spy_tone1:' => '🕵🏻', - ':sleuth_or_spy_tone2:' => '🕵🏼', - ':sleuth_or_spy_tone3:' => '🕵🏽', - ':sleuth_or_spy_tone4:' => '🕵🏾', - ':sleuth_or_spy_tone5:' => '🕵🏿', - ':sm:' => '🇸🇲', - ':sn:' => '🇸🇳', - ':so:' => '🇸🇴', - ':sr:' => '🇸🇷', - ':ss:' => '🇸🇸', - ':st:' => '🇸🇹', - ':sv:' => '🇸🇻', - ':sx:' => '🇸🇽', - ':sy:' => '🇸🇾', - ':sz:' => '🇸🇿', - ':ta:' => '🇹🇦', - ':tc:' => '🇹🇨', - ':td:' => '🇹🇩', - ':tf:' => '🇹🇫', - ':tg:' => '🇹🇬', - ':th:' => '🇹🇭', - ':tj:' => '🇹🇯', - ':tk:' => '🇹🇰', - ':tl:' => '🇹🇱', - ':tn:' => '🇹🇳', - ':to:' => '🇹🇴', - ':tr:' => '🇹🇷', - ':tt:' => '🇹🇹', - ':turkmenistan:' => '🇹🇲', - ':tuvalu:' => '🇹🇻', - ':tuxedo_tone1:' => '🤵🏻', - ':tuxedo_tone2:' => '🤵🏼', - ':tuxedo_tone3:' => '🤵🏽', - ':tuxedo_tone4:' => '🤵🏾', - ':tuxedo_tone5:' => '🤵🏿', - ':tw:' => '🇹🇼', - ':tz:' => '🇹🇿', - ':ua:' => '🇺🇦', - ':ug:' => '🇺🇬', - ':um:' => '🇺🇲', - ':us:' => '🇺🇸', - ':uy:' => '🇺🇾', - ':uz:' => '🇺🇿', - ':va:' => '🇻🇦', - ':vc:' => '🇻🇨', - ':ve:' => '🇻🇪', - ':vg:' => '🇻🇬', - ':vi:' => '🇻🇮', - ':vn:' => '🇻🇳', - ':vu:' => '🇻🇺', - ':weight_lifter_tone1:' => '🏋🏻', - ':weight_lifter_tone2:' => '🏋🏼', - ':weight_lifter_tone3:' => '🏋🏽', - ':weight_lifter_tone4:' => '🏋🏾', - ':weight_lifter_tone5:' => '🏋🏿', - ':wf:' => '🇼🇫', - ':wrestling_tone1:' => '🤼🏻', - ':wrestling_tone2:' => '🤼🏼', - ':wrestling_tone3:' => '🤼🏽', - ':wrestling_tone4:' => '🤼🏾', - ':wrestling_tone5:' => '🤼🏿', - ':ws:' => '🇼🇸', - ':xk:' => '🇽🇰', - ':ye:' => '🇾🇪', - ':yt:' => '🇾🇹', - ':za:' => '🇿🇦', - ':zm:' => '🇿🇲', - ':zw:' => '🇿🇼', + ':a:' => '🅰️', + ':airplane:' => '✈️', + ':airplane_small:' => '🛩️', + ':alembic:' => '⚗️', ':angel_tone1:' => '👼🏻', ':angel_tone2:' => '👼🏼', ':angel_tone3:' => '👼🏽', ':angel_tone4:' => '👼🏾', ':angel_tone5:' => '👼🏿', - ':asterisk:' => '*⃣', + ':anger_right:' => '🗯️', + ':arrow_backward:' => '◀️', + ':arrow_down:' => '⬇️', + ':arrow_forward:' => '▶️', + ':arrow_heading_down:' => '⤵️', + ':arrow_heading_up:' => '⤴️', + ':arrow_left:' => '⬅️', + ':arrow_lower_left:' => '↙️', + ':arrow_lower_right:' => '↘️', + ':arrow_right:' => '➡️', + ':arrow_right_hook:' => '↪️', + ':arrow_up:' => '⬆️', + ':arrow_up_down:' => '↕️', + ':arrow_upper_left:' => '↖️', + ':arrow_upper_right:' => '↗️', + ':atom:' => '⚛️', + ':b:' => '🅱️', ':baby_tone1:' => '👶🏻', ':baby_tone2:' => '👶🏼', ':baby_tone3:' => '👶🏽', ':baby_tone4:' => '👶🏾', ':baby_tone5:' => '👶🏿', + ':ballot_box:' => '🗳️', + ':ballot_box_with_check:' => '☑️', + ':bangbang:' => '‼️', + ':basketball_player:' => '⛹️', ':basketball_player_tone1:' => '⛹🏻', ':basketball_player_tone2:' => '⛹🏼', ':basketball_player_tone3:' => '⛹🏽', @@ -1642,11 +1222,19 @@ ':bath_tone3:' => '🛀🏽', ':bath_tone4:' => '🛀🏾', ':bath_tone5:' => '🛀🏿', + ':beach:' => '🏖️', + ':beach_umbrella:' => '⛱️', + ':bed:' => '🛏️', + ':bellhop:' => '🛎️', ':bicyclist_tone1:' => '🚴🏻', ':bicyclist_tone2:' => '🚴🏼', ':bicyclist_tone3:' => '🚴🏽', ':bicyclist_tone4:' => '🚴🏾', ':bicyclist_tone5:' => '🚴🏿', + ':biohazard:' => '☣️', + ':black_medium_square:' => '◼️', + ':black_nib:' => '✒️', + ':black_small_square:' => '▪️', ':bow_tone1:' => '🙇🏻', ':bow_tone2:' => '🙇🏼', ':bow_tone3:' => '🙇🏽', @@ -1657,51 +1245,130 @@ ':boy_tone3:' => '👦🏽', ':boy_tone4:' => '👦🏾', ':boy_tone5:' => '👦🏿', + ':breast_feeding_dark_skin_tone:' => '🤱🏿', + ':breast_feeding_light_skin_tone:' => '🤱🏻', + ':breast_feeding_medium_dark_skin_tone:' => '🤱🏾', + ':breast_feeding_medium_light_skin_tone:' => '🤱🏼', + ':breast_feeding_medium_skin_tone:' => '🤱🏽', ':bride_with_veil_tone1:' => '👰🏻', ':bride_with_veil_tone2:' => '👰🏼', ':bride_with_veil_tone3:' => '👰🏽', ':bride_with_veil_tone4:' => '👰🏾', ':bride_with_veil_tone5:' => '👰🏿', + ':calendar_spiral:' => '🗓️', ':call_me_tone1:' => '🤙🏻', ':call_me_tone2:' => '🤙🏼', ':call_me_tone3:' => '🤙🏽', ':call_me_tone4:' => '🤙🏾', ':call_me_tone5:' => '🤙🏿', + ':camping:' => '🏕️', + ':candle:' => '🕯️', + ':card_box:' => '🗃️', ':cartwheel_tone1:' => '🤸🏻', ':cartwheel_tone2:' => '🤸🏼', ':cartwheel_tone3:' => '🤸🏽', ':cartwheel_tone4:' => '🤸🏾', ':cartwheel_tone5:' => '🤸🏿', + ':chains:' => '⛓️', + ':chess_pawn:' => '♟️', + ':child_dark_skin_tone:' => '🧒🏿', + ':child_light_skin_tone:' => '🧒🏻', + ':child_medium_dark_skin_tone:' => '🧒🏾', + ':child_medium_light_skin_tone:' => '🧒🏼', + ':child_medium_skin_tone:' => '🧒🏽', + ':chipmunk:' => '🐿️', + ':cityscape:' => '🏙️', ':clap_tone1:' => '👏🏻', ':clap_tone2:' => '👏🏼', ':clap_tone3:' => '👏🏽', ':clap_tone4:' => '👏🏾', ':clap_tone5:' => '👏🏿', + ':classical_building:' => '🏛️', + ':clock:' => '🕰️', + ':cloud:' => '☁️', + ':cloud_lightning:' => '🌩️', + ':cloud_rain:' => '🌧️', + ':cloud_snow:' => '🌨️', + ':cloud_tornado:' => '🌪️', + ':clubs:' => '♣️', + ':coffin:' => '⚰️', + ':comet:' => '☄️', + ':compression:' => '🗜️', + ':congratulations:' => '㊗️', + ':construction_site:' => '🏗️', ':construction_worker_tone1:' => '👷🏻', ':construction_worker_tone2:' => '👷🏼', ':construction_worker_tone3:' => '👷🏽', ':construction_worker_tone4:' => '👷🏾', ':construction_worker_tone5:' => '👷🏿', + ':control_knobs:' => '🎛️', ':cop_tone1:' => '👮🏻', ':cop_tone2:' => '👮🏼', ':cop_tone3:' => '👮🏽', ':cop_tone4:' => '👮🏾', ':cop_tone5:' => '👮🏿', + ':copyright:' => '©️', + ':couch:' => '🛋️', + ':couple_with_heart_dark_skin_tone:' => '💑🏿', + ':couple_with_heart_light_skin_tone:' => '💑🏻', + ':couple_with_heart_medium_dark_skin_tone:' => '💑🏾', + ':couple_with_heart_medium_light_skin_tone:' => '💑🏼', + ':couple_with_heart_medium_skin_tone:' => '💑🏽', + ':crayon:' => '🖍️', + ':cross:' => '✝️', + ':crossed_swords:' => '⚔️', + ':cruise_ship:' => '🛳️', + ':dagger:' => '🗡️', ':dancer_tone1:' => '💃🏻', ':dancer_tone2:' => '💃🏼', ':dancer_tone3:' => '💃🏽', ':dancer_tone4:' => '💃🏾', ':dancer_tone5:' => '💃🏿', + ':dark_sunglasses:' => '🕶️', + ':deaf_person_dark_skin_tone:' => '🧏🏿', + ':deaf_person_light_skin_tone:' => '🧏🏻', + ':deaf_person_medium_dark_skin_tone:' => '🧏🏾', + ':deaf_person_medium_light_skin_tone:' => '🧏🏼', + ':deaf_person_medium_skin_tone:' => '🧏🏽', + ':desert:' => '🏜️', + ':desktop:' => '🖥️', + ':diamonds:' => '♦️', + ':dividers:' => '🗂️', + ':dove:' => '🕊️', ':ear_tone1:' => '👂🏻', ':ear_tone2:' => '👂🏼', ':ear_tone3:' => '👂🏽', ':ear_tone4:' => '👂🏾', ':ear_tone5:' => '👂🏿', + ':ear_with_hearing_aid_dark_skin_tone:' => '🦻🏿', + ':ear_with_hearing_aid_light_skin_tone:' => '🦻🏻', + ':ear_with_hearing_aid_medium_dark_skin_tone:' => '🦻🏾', + ':ear_with_hearing_aid_medium_light_skin_tone:' => '🦻🏼', + ':ear_with_hearing_aid_medium_skin_tone:' => '🦻🏽', + ':eight_pointed_black_star:' => '✴️', + ':eight_spoked_asterisk:' => '✳️', + ':eject:' => '⏏️', + ':elf_dark_skin_tone:' => '🧝🏿', + ':elf_light_skin_tone:' => '🧝🏻', + ':elf_medium_dark_skin_tone:' => '🧝🏾', + ':elf_medium_light_skin_tone:' => '🧝🏼', + ':elf_medium_skin_tone:' => '🧝🏽', + ':envelope:' => '✉️', + ':eye:' => '👁️', ':face_palm_tone1:' => '🤦🏻', ':face_palm_tone2:' => '🤦🏼', ':face_palm_tone3:' => '🤦🏽', ':face_palm_tone4:' => '🤦🏾', ':face_palm_tone5:' => '🤦🏿', + ':fairy_dark_skin_tone:' => '🧚🏿', + ':fairy_light_skin_tone:' => '🧚🏻', + ':fairy_medium_dark_skin_tone:' => '🧚🏾', + ':fairy_medium_light_skin_tone:' => '🧚🏼', + ':fairy_medium_skin_tone:' => '🧚🏽', + ':female_sign:' => '♀️', + ':ferry:' => '⛴️', + ':file_cabinet:' => '🗄️', + ':film_frames:' => '🎞️', ':fingers_crossed_tone1:' => '🤞🏻', ':fingers_crossed_tone2:' => '🤞🏼', ':fingers_crossed_tone3:' => '🤞🏽', @@ -1951,6 +1618,7 @@ ':flag_ua:' => '🇺🇦', ':flag_ug:' => '🇺🇬', ':flag_um:' => '🇺🇲', + ':flag_united_nations:' => '🇺🇳', ':flag_us:' => '🇺🇸', ':flag_uy:' => '🇺🇾', ':flag_uz:' => '🇺🇿', @@ -1962,6 +1630,7 @@ ':flag_vn:' => '🇻🇳', ':flag_vu:' => '🇻🇺', ':flag_wf:' => '🇼🇫', + ':flag_white:' => '🏳️', ':flag_ws:' => '🇼🇸', ':flag_xk:' => '🇽🇰', ':flag_ye:' => '🇾🇪', @@ -1969,12 +1638,23 @@ ':flag_za:' => '🇿🇦', ':flag_zm:' => '🇿🇲', ':flag_zw:' => '🇿🇼', - ':gay_pride_flag:' => '🏳🌈', + ':fleur-de-lis:' => '⚜️', + ':fog:' => '🌫️', + ':foot_dark_skin_tone:' => '🦶🏿', + ':foot_light_skin_tone:' => '🦶🏻', + ':foot_medium_dark_skin_tone:' => '🦶🏾', + ':foot_medium_light_skin_tone:' => '🦶🏼', + ':foot_medium_skin_tone:' => '🦶🏽', + ':fork_knife_plate:' => '🍽️', + ':frame_photo:' => '🖼️', + ':frowning2:' => '☹️', + ':gear:' => '⚙️', ':girl_tone1:' => '👧🏻', ':girl_tone2:' => '👧🏼', ':girl_tone3:' => '👧🏽', ':girl_tone4:' => '👧🏾', ':girl_tone5:' => '👧🏿', + ':golfer:' => '🏌️', ':guardsman_tone1:' => '💂🏻', ':guardsman_tone2:' => '💂🏼', ':guardsman_tone3:' => '💂🏽', @@ -1985,11 +1665,18 @@ ':haircut_tone3:' => '💇🏽', ':haircut_tone4:' => '💇🏾', ':haircut_tone5:' => '💇🏿', + ':hammer_pick:' => '⚒️', + ':hand_splayed:' => '🖐️', ':hand_splayed_tone1:' => '🖐🏻', ':hand_splayed_tone2:' => '🖐🏼', ':hand_splayed_tone3:' => '🖐🏽', ':hand_splayed_tone4:' => '🖐🏾', ':hand_splayed_tone5:' => '🖐🏿', + ':hand_with_index_finger_and_thumb_crossed_dark_skin_tone:' => '🫰🏿', + ':hand_with_index_finger_and_thumb_crossed_light_skin_tone:' => '🫰🏻', + ':hand_with_index_finger_and_thumb_crossed_medium_dark_skin_tone:' => '🫰🏾', + ':hand_with_index_finger_and_thumb_crossed_medium_light_skin_tone:' => '🫰🏼', + ':hand_with_index_finger_and_thumb_crossed_medium_skin_tone:' => '🫰🏽', ':handball_tone1:' => '🤾🏻', ':handball_tone2:' => '🤾🏼', ':handball_tone3:' => '🤾🏽', @@ -2000,32 +1687,98 @@ ':handshake_tone3:' => '🤝🏽', ':handshake_tone4:' => '🤝🏾', ':handshake_tone5:' => '🤝🏿', - ':hash:' => '#⃣', + ':heart:' => '❤️', + ':heart_exclamation:' => '❣️', + ':heart_hands_dark_skin_tone:' => '🫶🏿', + ':heart_hands_light_skin_tone:' => '🫶🏻', + ':heart_hands_medium_dark_skin_tone:' => '🫶🏾', + ':heart_hands_medium_light_skin_tone:' => '🫶🏼', + ':heart_hands_medium_skin_tone:' => '🫶🏽', + ':hearts:' => '♥️', + ':heavy_check_mark:' => '✔️', + ':heavy_multiplication_x:' => '✖️', + ':helmet_with_cross:' => '⛑️', + ':hole:' => '🕳️', + ':homes:' => '🏘️', ':horse_racing_tone1:' => '🏇🏻', ':horse_racing_tone2:' => '🏇🏼', ':horse_racing_tone3:' => '🏇🏽', ':horse_racing_tone4:' => '🏇🏾', ':horse_racing_tone5:' => '🏇🏿', + ':hot_pepper:' => '🌶️', + ':hotsprings:' => '♨️', + ':house_abandoned:' => '🏚️', + ':ice_skate:' => '⛸️', + ':index_pointing_at_the_viewer_dark_skin_tone:' => '🫵🏿', + ':index_pointing_at_the_viewer_light_skin_tone:' => '🫵🏻', + ':index_pointing_at_the_viewer_medium_dark_skin_tone:' => '🫵🏾', + ':index_pointing_at_the_viewer_medium_light_skin_tone:' => '🫵🏼', + ':index_pointing_at_the_viewer_medium_skin_tone:' => '🫵🏽', + ':infinity:' => '♾️', ':information_desk_person_tone1:' => '💁🏻', ':information_desk_person_tone2:' => '💁🏼', ':information_desk_person_tone3:' => '💁🏽', ':information_desk_person_tone4:' => '💁🏾', ':information_desk_person_tone5:' => '💁🏿', + ':information_source:' => 'ℹ️', + ':interrobang:' => '⁉️', + ':island:' => '🏝️', + ':joystick:' => '🕹️', ':juggling_tone1:' => '🤹🏻', ':juggling_tone2:' => '🤹🏼', ':juggling_tone3:' => '🤹🏽', ':juggling_tone4:' => '🤹🏾', ':juggling_tone5:' => '🤹🏿', + ':key2:' => '🗝️', + ':keyboard:' => '⌨️', + ':kiss_dark_skin_tone:' => '💏🏿', + ':kiss_light_skin_tone:' => '💏🏻', + ':kiss_medium_dark_skin_tone:' => '💏🏾', + ':kiss_medium_light_skin_tone:' => '💏🏼', + ':kiss_medium_skin_tone:' => '💏🏽', + ':label:' => '🏷️', ':left_facing_fist_tone1:' => '🤛🏻', ':left_facing_fist_tone2:' => '🤛🏼', ':left_facing_fist_tone3:' => '🤛🏽', ':left_facing_fist_tone4:' => '🤛🏾', ':left_facing_fist_tone5:' => '🤛🏿', + ':left_right_arrow:' => '↔️', + ':leftwards_arrow_with_hook:' => '↩️', + ':leftwards_hand_dark_skin_tone:' => '🫲🏿', + ':leftwards_hand_light_skin_tone:' => '🫲🏻', + ':leftwards_hand_medium_dark_skin_tone:' => '🫲🏾', + ':leftwards_hand_medium_light_skin_tone:' => '🫲🏼', + ':leftwards_hand_medium_skin_tone:' => '🫲🏽', + ':leftwards_pushing_hand_dark_skin_tone:' => '🫷🏿', + ':leftwards_pushing_hand_light_skin_tone:' => '🫷🏻', + ':leftwards_pushing_hand_medium_dark_skin_tone:' => '🫷🏾', + ':leftwards_pushing_hand_medium_light_skin_tone:' => '🫷🏼', + ':leftwards_pushing_hand_medium_skin_tone:' => '🫷🏽', + ':leg_dark_skin_tone:' => '🦵🏿', + ':leg_light_skin_tone:' => '🦵🏻', + ':leg_medium_dark_skin_tone:' => '🦵🏾', + ':leg_medium_light_skin_tone:' => '🦵🏼', + ':leg_medium_skin_tone:' => '🦵🏽', + ':level_slider:' => '🎚️', + ':levitate:' => '🕴️', + ':lifter:' => '🏋️', ':lifter_tone1:' => '🏋🏻', ':lifter_tone2:' => '🏋🏼', ':lifter_tone3:' => '🏋🏽', ':lifter_tone4:' => '🏋🏾', ':lifter_tone5:' => '🏋🏿', + ':love_you_gesture_dark_skin_tone:' => '🤟🏿', + ':love_you_gesture_light_skin_tone:' => '🤟🏻', + ':love_you_gesture_medium_dark_skin_tone:' => '🤟🏾', + ':love_you_gesture_medium_light_skin_tone:' => '🤟🏼', + ':love_you_gesture_medium_skin_tone:' => '🤟🏽', + ':m:' => 'Ⓜ️', + ':mage_dark_skin_tone:' => '🧙🏿', + ':mage_light_skin_tone:' => '🧙🏻', + ':mage_medium_dark_skin_tone:' => '🧙🏾', + ':mage_medium_light_skin_tone:' => '🧙🏼', + ':mage_medium_skin_tone:' => '🧙🏽', + ':male_sign:' => '♂️', ':man_dancing_tone1:' => '🕺🏻', ':man_dancing_tone2:' => '🕺🏼', ':man_dancing_tone3:' => '🕺🏽', @@ -2051,26 +1804,46 @@ ':man_with_turban_tone3:' => '👳🏽', ':man_with_turban_tone4:' => '👳🏾', ':man_with_turban_tone5:' => '👳🏿', + ':map:' => '🗺️', ':massage_tone1:' => '💆🏻', ':massage_tone2:' => '💆🏼', ':massage_tone3:' => '💆🏽', ':massage_tone4:' => '💆🏾', ':massage_tone5:' => '💆🏿', + ':medical_symbol:' => '⚕️', + ':men_holding_hands_dark_skin_tone:' => '👬🏿', + ':men_holding_hands_light_skin_tone:' => '👬🏻', + ':men_holding_hands_medium_dark_skin_tone:' => '👬🏾', + ':men_holding_hands_medium_light_skin_tone:' => '👬🏼', + ':men_holding_hands_medium_skin_tone:' => '👬🏽', + ':merperson_dark_skin_tone:' => '🧜🏿', + ':merperson_light_skin_tone:' => '🧜🏻', + ':merperson_medium_dark_skin_tone:' => '🧜🏾', + ':merperson_medium_light_skin_tone:' => '🧜🏼', + ':merperson_medium_skin_tone:' => '🧜🏽', ':metal_tone1:' => '🤘🏻', ':metal_tone2:' => '🤘🏼', ':metal_tone3:' => '🤘🏽', ':metal_tone4:' => '🤘🏾', ':metal_tone5:' => '🤘🏿', + ':microphone2:' => '🎙️', ':middle_finger_tone1:' => '🖕🏻', ':middle_finger_tone2:' => '🖕🏼', ':middle_finger_tone3:' => '🖕🏽', ':middle_finger_tone4:' => '🖕🏾', ':middle_finger_tone5:' => '🖕🏿', + ':military_medal:' => '🎖️', + ':motorboat:' => '🛥️', + ':motorcycle:' => '🏍️', + ':motorway:' => '🛣️', + ':mountain:' => '⛰️', ':mountain_bicyclist_tone1:' => '🚵🏻', ':mountain_bicyclist_tone2:' => '🚵🏼', ':mountain_bicyclist_tone3:' => '🚵🏽', ':mountain_bicyclist_tone4:' => '🚵🏾', ':mountain_bicyclist_tone5:' => '🚵🏿', + ':mountain_snow:' => '🏔️', + ':mouse_three_button:' => '🖱️', ':mrs_claus_tone1:' => '🤶🏻', ':mrs_claus_tone2:' => '🤶🏼', ':mrs_claus_tone3:' => '🤶🏽', @@ -2086,6 +1859,12 @@ ':nail_care_tone3:' => '💅🏽', ':nail_care_tone4:' => '💅🏾', ':nail_care_tone5:' => '💅🏿', + ':newspaper2:' => '🗞️', + ':ninja_dark_skin_tone:' => '🥷🏿', + 10000 ':ninja_light_skin_tone:' => '🥷🏻', + ':ninja_medium_dark_skin_tone:' => '🥷🏾', + ':ninja_medium_light_skin_tone:' => '🥷🏼', + ':ninja_medium_skin_tone:' => '🥷🏽', ':no_good_tone1:' => '🙅🏻', ':no_good_tone2:' => '🙅🏼', ':no_good_tone3:' => '🙅🏽', @@ -2096,6 +1875,9 @@ ':nose_tone3:' => '👃🏽', ':nose_tone4:' => '👃🏾', ':nose_tone5:' => '👃🏿', + ':notepad_spiral:' => '🗒️', + ':o2:' => '🅾️', + ':oil:' => '🛢️', ':ok_hand_tone1:' => '👌🏻', ':ok_hand_tone2:' => '👌🏼', ':ok_hand_tone3:' => '👌🏽', @@ -2111,31 +1893,130 @@ ':older_man_tone3:' => '👴🏽', ':older_man_tone4:' => '👴🏾', ':older_man_tone5:' => '👴🏿', + ':older_person_dark_skin_tone:' => '🧓🏿', + ':older_person_light_skin_tone:' => '🧓🏻', + ':older_person_medium_dark_skin_tone:' => '🧓🏾', + ':older_person_medium_light_skin_tone:' => '🧓🏼', + ':older_person_medium_skin_tone:' => '🧓🏽', ':older_woman_tone1:' => '👵🏻', ':older_woman_tone2:' => '👵🏼', ':older_woman_tone3:' => '👵🏽', ':older_woman_tone4:' => '👵🏾', ':older_woman_tone5:' => '👵🏿', + ':om_symbol:' => '🕉️', ':open_hands_tone1:' => '👐🏻', ':open_hands_tone2:' => '👐🏼', ':open_hands_tone3:' => '👐🏽', ':open_hands_tone4:' => '👐🏾', ':open_hands_tone5:' => '👐🏿', + ':orthodox_cross:' => '☦️', + ':paintbrush:' => '🖌️', + ':palm_down_hand_dark_skin_tone:' => '🫳🏿', + ':palm_down_hand_light_skin_tone:' => '🫳🏻', + ':palm_down_hand_medium_dark_skin_tone:' => '🫳🏾', + ':palm_down_hand_medium_light_skin_tone:' => '🫳🏼', + ':palm_down_hand_medium_skin_tone:' => '🫳🏽', + ':palm_up_hand_dark_skin_tone:' => '🫴🏿', + ':palm_up_hand_light_skin_tone:' => '🫴🏻', + ':palm_up_hand_medium_dark_skin_tone:' => '🫴🏾', + ':palm_up_hand_medium_light_skin_tone:' => '🫴🏼', + ':palm_up_hand_medium_skin_tone:' => '🫴🏽', + ':palms_up_together_dark_skin_tone:' => '🤲🏿', + ':palms_up_together_light_skin_tone:' => '🤲🏻', + ':palms_up_together_medium_dark_skin_tone:' => '🤲🏾', + ':palms_up_together_medium_light_skin_tone:' => '🤲🏼', + ':palms_up_together_medium_skin_tone:' => '🤲🏽', + ':paperclips:' => '🖇️', + ':park:' => '🏞️', + ':parking:' => '🅿️', + ':part_alternation_mark:' => '〽️', + ':pause_button:' => '⏸️', + ':peace:' => '☮️', + ':pen_ballpoint:' => '🖊️', + ':pen_fountain:' => '🖋️', + ':pencil2:' => '✏️', + ':person_climbing_dark_skin_tone:' => '🧗🏿', + ':person_climbing_light_skin_tone:' => '🧗🏻', + ':person_climbing_medium_dark_skin_tone:' => '🧗🏾', + ':person_climbing_medium_light_skin_tone:' => '🧗🏼', + ':person_climbing_medium_skin_tone:' => '🧗🏽', + ':person_dark_skin_tone:' => '🧑🏿', + ':person_dark_skin_tone_beard:' => '🧔🏿', ':person_frowning_tone1:' => '🙍🏻', ':person_frowning_tone2:' => '🙍🏼', ':person_frowning_tone3:' => '🙍🏽', ':person_frowning_tone4:' => '🙍🏾', ':person_frowning_tone5:' => '🙍🏿', + ':person_golfing_dark_skin_tone:' => '🏌🏿', + ':person_golfing_light_skin_tone:' => '🏌🏻', + ':person_golfing_medium_dark_skin_tone:' => '🏌🏾', + ':person_golfing_medium_light_skin_tone:' => '🏌🏼', + ':person_golfing_medium_skin_tone:' => '🏌🏽', + ':person_in_bed_dark_skin_tone:' => '🛌🏿', + ':person_in_bed_light_skin_tone:' => '🛌🏻', + ':person_in_bed_medium_dark_skin_tone:' => '🛌🏾', + ':person_in_bed_medium_light_skin_tone:' => '🛌🏼', + ':person_in_bed_medium_skin_tone:' => '🛌🏽', + ':person_in_lotus_position_dark_skin_tone:' => '🧘🏿', + ':person_in_lotus_position_light_skin_tone:' => '🧘🏻', + ':person_in_lotus_position_medium_dark_skin_tone:' => '🧘🏾', + ':person_in_lotus_position_medium_light_skin_tone:' => '🧘🏼', + ':person_in_lotus_position_medium_skin_tone:' => '🧘🏽', + ':person_in_steamy_room_dark_skin_tone:' => '🧖🏿', + ':person_in_steamy_room_light_skin_tone:' => '🧖🏻', + ':person_in_steamy_room_medium_dark_skin_tone:' => '🧖🏾', + ':person_in_steamy_room_medium_light_skin_tone:' => '🧖🏼', + ':person_in_steamy_room_medium_skin_tone:' => '🧖🏽', + ':person_in_suit_levitating_dark_skin_tone:' => '🕴🏿', + ':person_in_suit_levitating_light_skin_tone:' => '🕴🏻', + ':person_in_suit_levitating_medium_dark_skin_tone:' => '🕴🏾', + ':person_in_suit_levitating_medium_light_skin_tone:' => '🕴🏼', + ':person_in_suit_levitating_medium_skin_tone:' => '🕴🏽', + ':person_kneeling_dark_skin_tone:' => '🧎🏿', + ':person_kneeling_light_skin_tone:' => '🧎🏻', + ':person_kneeling_medium_dark_skin_tone:' => '🧎🏾', + ':person_kneeling_medium_light_skin_tone:' => '🧎🏼', + ':person_kneeling_medium_skin_tone:' => '🧎🏽', + ':person_light_skin_tone:' => '🧑🏻', + ':person_light_skin_tone_beard:' => '🧔🏻', + ':person_medium_dark_skin_tone:' => '🧑🏾', + ':person_medium_dark_skin_tone_beard:' => '🧔🏾', + ':person_medium_light_skin_tone:' => '🧑🏼', + ':person_medium_light_skin_tone_beard:' => '🧔🏼', + ':person_medium_skin_tone:' => '🧑🏽', + ':person_medium_skin_tone_beard:' => '🧔🏽', + ':person_standing_dark_skin_tone:' => '🧍🏿', + ':person_standing_light_skin_tone:' => '🧍🏻', + ':person_standing_medium_dark_skin_tone:' => '🧍🏾', + ':person_standing_medium_light_skin_tone:' => '🧍🏼', + ':person_standing_medium_skin_tone:' => '🧍🏽', ':person_with_blond_hair_tone1:' => '👱🏻', ':person_with_blond_hair_tone2:' => '👱🏼', ':person_with_blond_hair_tone3:' => '👱🏽', ':person_with_blond_hair_tone4:' => '👱🏾', ':person_with_blond_hair_tone5:' => '👱🏿', + ':person_with_crown_dark_skin_tone:' => '🫅🏿', + ':person_with_crown_light_skin_tone:' => '🫅🏻', + ':person_with_crown_medium_dark_skin_tone:' => '🫅🏾', + ':person_with_crown_medium_light_skin_tone:' => '🫅🏼', + ':person_with_crown_medium_skin_tone:' => '🫅🏽', ':person_with_pouting_face_tone1:' => '🙎🏻', ':person_with_pouting_face_tone2:' => '🙎🏼', ':person_with_pouting_face_tone3:' => '🙎🏽', ':person_with_pouting_face_tone4:' => '🙎🏾', ':person_with_pouting_face_tone5:' => '🙎🏿', + ':pick:' => '⛏️', + ':pinched_fingers_dark_skin_tone:' => '🤌🏿', + ':pinched_fingers_light_skin_tone:' => '🤌🏻', + ':pinched_fingers_medium_dark_skin_tone:' => '🤌🏾', + ':pinched_fingers_medium_light_skin_tone:' => '🤌🏼', + ':pinched_fingers_medium_skin_tone:' => '🤌🏽', + ':pinching_hand_dark_skin_tone:' => '🤏🏿', + ':pinching_hand_light_skin_tone:' => '🤏🏻', + ':pinching_hand_medium_dark_skin_tone:' => '🤏🏾', + ':pinching_hand_medium_light_skin_tone:' => '🤏🏼', + ':pinching_hand_medium_skin_tone:' => '🤏🏽', + ':play_pause:' => '⏯️', ':point_down_tone1:' => '👇🏻', ':point_down_tone2:' => '👇🏼', ':point_down_tone3:' => '👇🏽', @@ -2151,6 +2032,7 @@ ':point_right_tone3:' => '👉🏽', ':point_right_tone4:' => '👉🏾', ':point_right_tone5:' => '👉🏿', + ':point_up:' => '☝️', ':point_up_2_tone1:' => '👆🏻', ':point_up_2_tone2:' => '👆🏼', ':point_up_2_tone3:' => '👆🏽', @@ -2166,6 +2048,16 @@ ':pray_tone3:' => '🙏🏽', ':pray_tone4:' => '🙏🏾', ':pray_tone5:' => '🙏🏿', + ':pregnant_man_dark_skin_tone:' => '🫃🏿', + ':pregnant_man_light_skin_tone:' => '🫃🏻', + ':pregnant_man_medium_dark_skin_tone:' => '🫃🏾', + ':pregnant_man_medium_light_skin_tone:' => '🫃🏼', + ':pregnant_man_medium_skin_tone:' => '🫃🏽', + ':pregnant_person_dark_skin_tone:' => '🫄🏿', + ':pregnant_person_light_skin_tone:' => '🫄🏻', + ':pregnant_person_medium_dark_skin_tone:' => '🫄🏾', + ':pregnant_person_medium_light_skin_tone:' => '🫄🏼', + ':pregnant_person_medium_skin_tone:' => '🫄🏽', ':pregnant_woman_tone1:' => '🤰🏻', ':pregnant_woman_tone2:' => '🤰🏼', ':pregnant_woman_tone3:' => '🤰🏽', @@ -2181,11 +2073,16 @@ ':princess_tone3:' => '👸🏽', ':princess_tone4:' => '👸🏾', ':princess_tone5:' => '👸🏿', + ':printer:' => '🖨️', + ':projector:' => '📽️', ':punch_tone1:' => '👊🏻', ':punch_tone2:' => '👊🏼', ':punch_tone3:' => '👊🏽', ':punch_tone4:' => '👊🏾', ':punch_tone5:' => '👊🏿', + ':race_car:' => '🏎️', + ':radioactive:' => '☢️', + ':railway_track:' => '🛤️', ':raised_back_of_hand_tone1:' => '🤚🏻', ':raised_back_of_hand_tone2:' => '🤚🏼', ':raised_back_of_hand_tone3:' => '🤚🏽', @@ -2206,11 +2103,27 @@ ':raising_hand_tone3:' => '🙋🏽', ':raising_hand_tone4:' => '🙋🏾', ':raising_hand_tone5:' => '🙋🏿', + ':record_button:' => '⏺️', + ':recycle:' => '♻️', + ':registered:' => '®️', + ':relaxed:' => '☺️', + ':reminder_ribbon:' => '🎗️', ':right_facing_fist_tone1:' => '🤜🏻', ':right_facing_fist_tone2:' => '🤜🏼', ':right_facing_fist_tone3:' => '🤜🏽', ':right_facing_fist_tone4:' => '🤜🏾', ':right_facing_fist_tone5:' => '🤜🏿', + ':rightwards_hand_dark_skin_tone:' => '🫱🏿', + ':rightwards_hand_light_skin_tone:' => '🫱🏻', + ':rightwards_hand_medium_dark_skin_tone:' => '🫱🏾', + ':rightwards_hand_medium_light_skin_tone:' => '🫱🏼', + ':rightwards_hand_medium_skin_tone:' => '🫱🏽', + ':rightwards_pushing_hand_dark_skin_tone:' => '🫸🏿', + ':rightwards_pushing_hand_light_skin_tone:' => '🫸🏻', + ':rightwards_pushing_hand_medium_dark_skin_tone:' => '🫸🏾', + ':rightwards_pushing_hand_medium_light_skin_tone:' => '🫸🏼', + ':rightwards_pushing_hand_medium_skin_tone:' => '🫸🏽', + ':rosette:' => '🏵️', ':rowboat_tone1:' => '🚣🏻', ':rowboat_tone2:' => '🚣🏼', ':rowboat_tone3:' => '🚣🏽', @@ -2221,26 +2134,67 @@ ':runner_tone3:' => '🏃🏽', ':runner_tone4:' => '🏃🏾', ':runner_tone5:' => '🏃🏿', + ':sa:' => '🈂️', ':santa_tone1:' => '🎅🏻', ':santa_tone2:' => '🎅🏼', ':santa_tone3:' => '🎅🏽', ':santa_tone4:' => '🎅🏾', ':santa_tone5:' => '🎅🏿', + ':satellite_orbital:' => '🛰️', + ':scales:' => '⚖️', + ':scissors:' => '✂️', + ':secret:' => '㊙️', ':selfie_tone1:' => '🤳🏻', ':selfie_tone2:' => '🤳🏼', ':selfie_tone3:' => '🤳🏽', ':selfie_tone4:' => '🤳🏾', ':selfie_tone5:' => '🤳🏿', + ':shamrock:' => '☘️', + ':shield:' => '🛡️', + ':shinto_shrine:' => '⛩️', + ':shopping_bags:' => '🛍️', ':shrug_tone1:' => '🤷🏻', ':shrug_tone2:' => '🤷🏼', ':shrug_tone3:' => '🤷🏽', ':shrug_tone4:' => '🤷🏾', ':shrug_tone5:' => '🤷🏿', + ':skier:' => '⛷️', + ':skull_crossbones:' => '☠️', + ':snowboarder_dark_skin_tone:' => '🏂🏿', + ':snowboarder_light_skin_tone:' => '🏂🏻', + ':snowboarder_medium_dark_skin_tone:' => '🏂🏾', + ':snowboarder_medium_light_skin_tone:' => '🏂🏼', + ':snowboarder_medium_skin_tone:' => '🏂🏽', + ':snowflake:' => '❄️', + ':snowman2:' => '☃️', + ':spades:' => '♠️', + ':sparkle:' => '❇️', + ':speaking_head:' => '🗣️', + ':speech_left:' => '🗨️', + ':spider:' => '🕷️', + ':spider_web:' => '🕸️', + ':spy:' => '🕵️', ':spy_tone1:' => '🕵🏻', ':spy_tone2:' => '🕵🏼', ':spy_tone3:' => '🕵🏽', ':spy_tone4:' => '🕵🏾', ':spy_tone5:' => '🕵🏿', + ':stadium:' => '🏟️', + ':star_and_crescent:' => '☪️', + ':star_of_david:' => '✡️', + ':stop_button:' => '⏹️', + ':stopwatch:' => '⏱️', + ':sunny:' => '☀️', + ':superhero_dark_skin_tone:' => '🦸🏿', + ':superhero_light_skin_tone:' => '🦸🏻', + ':superhero_medium_dark_skin_tone:' => '🦸🏾', + ':superhero_medium_light_skin_tone:' => '🦸🏼', + ':superhero_medium_skin_tone:' => '🦸🏽', + ':supervillain_dark_skin_tone:' => '🦹🏿', + ':supervillain_light_skin_tone:' => '🦹🏻', + ':supervillain_medium_dark_skin_tone:' => '🦹🏾', + ':supervillain_medium_light_skin_tone:' => '🦹🏼', + ':supervillain_medium_skin_tone:' => '🦹🏽', ':surfer_tone1:' => '🏄🏻', ':surfer_tone2:' => '🏄🏼', ':surfer_tone3:' => '🏄🏽', @@ -2251,6 +2205,8 @@ ':swimmer_tone3:' => '🏊🏽', ':swimmer_tone4:' => '🏊🏾', ':swimmer_tone5:' => '🏊🏿', + ':telephone:' => '☎️', + ':thermometer:' => '🌡️', ':thumbsdown_tone1:' => '👎🏻', ':thumbsdown_tone2:' => '👎🏼', ':thumbsdown_tone3:' => '👎🏽', @@ -2261,11 +2217,29 @@ ':thumbsup_tone3:' => '👍🏽', ':thumbsup_tone4:' => '👍🏾', ':thumbsup_tone5:' => '👍🏿', + ':thunder_cloud_rain:' => '⛈️', + ':tickets:' => '🎟️', + ':timer:' => '⏲️', + ':tm:' => '™️', + ':tools:' => '🛠️', + ':track_next:' => '⏭️', + ':track_previous:' => '⏮️', + ':trackball:' => '🖲️', + ':transgender_symbol:' => '⚧️', + ':u6708:' => '🈷️', + ':umbrella2:' => '☂️', + ':urn:' => '⚱️', + ':v:' => '✌️', ':v_tone1:' => '✌🏻', ':v_tone2:' => '✌🏼', ':v_tone3:' => '✌🏽', ':v_tone4:' => '✌🏾', ':v_tone5:' => '✌🏿', + ':vampire_dark_skin_tone:' => '🧛🏿', + ':vampire_light_skin_tone:' => '🧛🏻', + ':vampire_medium_dark_skin_tone:' => '🧛🏾', + ':vampire_medium_light_skin_tone:' => '🧛🏼', + ':vampire_medium_skin_tone:' => '🧛🏽', ':vulcan_tone1:' => '🖖🏻', ':vulcan_tone2:' => '🖖🏼', ':vulcan_tone3:' => '🖖🏽', @@ -2276,6 +2250,8 @@ ':walking_tone3:' => '🚶🏽', ':walking_tone4:' => '🚶🏾', ':walking_tone5:' => '🚶🏿', + ':warning:' => '⚠️', + ':wastebasket:' => '🗑️', ':water_polo_tone1:' => '🤽🏻', ':water_polo_tone2:' => '🤽🏼', ':water_polo_tone3:' => '🤽🏽', @@ -2286,41 +2262,1153 @@ ':wave_tone3:' => '👋🏽', ':wave_tone4:' => '👋🏾', ':wave_tone5:' => '👋🏿', + ':wavy_dash:' => '〰️', + ':wheel_of_dharma:' => '☸️', + ':white_medium_square:' => '◻️', + ':white_small_square:' => '▫️', + ':white_sun_cloud:' => '🌥️', + ':white_sun_rain_cloud:' => '🌦️', + ':white_sun_small_cloud:' => '🌤️', + ':wind_blowing_face:' => '🌬️', + ':woman_and_man_holding_hands_dark_skin_tone:' => '👫🏿', + ':woman_and_man_holding_hands_light_skin_tone:' => '👫🏻', + ':woman_and_man_holding_hands_medium_dark_skin_tone:' => '👫🏾', + ':woman_and_man_holding_hands_medium_light_skin_tone:' => '👫🏼', + ':woman_and_man_holding_hands_medium_skin_tone:' => '👫🏽', ':woman_tone1:' => '👩🏻', ':woman_tone2:' => '👩🏼', ':woman_tone3:' => '👩🏽', ':woman_tone4:' => '👩🏾', ':woman_tone5:' => '👩🏿', - ':wrestlers_tone1:' => '🤼🏻', - ':wrestlers_tone2:' => '🤼🏼', - ':wrestlers_tone3:' => '🤼🏽', - ':wrestlers_tone4:' => '🤼🏾', - ':wrestlers_tone5:' => '🤼🏿', + ':woman_with_headscarf_dark_skin_tone:' => '🧕🏿', + ':woman_with_headscarf_light_skin_tone:' => '🧕🏻', + ':woman_with_headscarf_medium_dark_skin_tone:' => '🧕🏾', + ':woman_with_headscarf_medium_light_skin_tone:' => '🧕🏼', + ':woman_with_headscarf_medium_skin_tone:' => '🧕🏽', + ':women_holding_hands_dark_skin_tone:' => '👭🏿', + ':women_holding_hands_light_skin_tone:' => '👭🏻', + ':women_holding_hands_medium_dark_skin_tone:' => '👭🏾', + ':women_holding_hands_medium_light_skin_tone:' => '👭🏼', + ':women_holding_hands_medium_skin_tone:' => '👭🏽', + ':writing_hand:' => '✍️', ':writing_hand_tone1:' => '✍🏻', ':writing_hand_tone2:' => '✍🏼', ':writing_hand_tone3:' => '✍🏽', ':writing_hand_tone4:' => '✍🏾', ':writing_hand_tone5:' => '✍🏿', + ':yin_yang:' => '☯️', + ':artist:' => '🧑‍🎨', + ':asterisk:' => '*️⃣', + ':astronaut:' => '🧑‍🚀', + ':black_bird:' => '🐦‍⬛', + ':black_cat:' => '🐈‍⬛', + ':brown_mushroom:' => '🍄‍🟫', + ':cook:' => '🧑‍🍳', ':eight:' => '8️⃣', - ':eye_in_speech_bubble:' => '👁‍🗨', + ':face_exhaling:' => '😮‍💨', + ':face_with_spiral_eyes:' => '😵‍💫', + ':factory_worker:' => '🧑‍🏭', + ':family_adult_child:' => '🧑‍🧒', + ':family_man_boy:' => '👨‍👦', + ':family_man_girl:' => '👨‍👧', + ':family_woman_boy:' => '👩‍👦', + ':family_woman_girl:' => '👩‍👧', + ':farmer:' => '🧑‍🌾', + ':firefighter:' => '🧑‍🚒', ':five:' => '5️⃣', ':four:' => '4️⃣', + ':hash:' => '#️⃣', + ':lime:' => '🍋‍🟩', + ':man_artist:' => '👨‍🎨', + ':man_astronaut:' => '👨‍🚀', + ':man_bald:' => '👨‍🦲', + ':man_cook:' => '👨‍🍳', + ':man_curly_hair:' => '👨‍🦱', + ':man_factory_worker:' => '👨‍🏭', + ':man_farmer:' => '👨‍🌾', + ':man_feeding_baby:' => '👨‍🍼', + ':man_firefighter:' => '👨‍🚒', + ':man_in_manual_wheelchair:' => '👨‍🦽', + ':man_in_motorized_wheelchair:' => '👨‍🦼', + ':man_mechanic:' => '👨‍🔧', + ':man_office_worker:' => '👨‍💼', + ':man_red_hair:' => '👨‍🦰', + ':man_scientist:' => '👨‍🔬', + ':man_singer:' => '👨‍🎤', + ':man_student:' => '👨‍🎓', + ':man_teacher:' => '👨‍🏫', + ':man_technologist:' => '👨‍💻', + ':man_white_hair:' => '👨‍🦳', + ':man_with_white_cane:' => '👨‍🦯', + ':mechanic:' => '🧑‍🔧', + ':mx_claus:' => '🧑‍🎄', ':nine:' => '9️⃣', + ':office_worker:' => '🧑‍💼', ':one:' => '1️⃣', + ':person_bald:' => '🧑‍🦲', + ':person_curly_hair:' => '🧑‍🦱', + ':person_feeding_baby:' => '🧑‍🍼', + ':person_in_manual_wheelchair:' => '🧑‍🦽', + ':person_in_motorized_wheelchair:' => '🧑‍🦼', + ':person_red_hair:' => '🧑‍🦰', + ':person_white_hair:' => '🧑‍🦳', + ':person_with_white_cane:' => '🧑‍🦯', + ':phoenix:' => '🐦‍🔥', + ':scientist:' => '🧑‍🔬', + ':service_dog:' => '🐕‍🦺', ':seven:' => '7️⃣', + ':singer:' => '🧑‍🎤', ':six:' => '6️⃣', + ':student:' => '🧑‍🎓', + ':teacher:' => '🧑‍🏫', + ':technologist:' => '🧑‍💻', ':three:' => '3️⃣', ':two:' => '2️⃣', + ':woman_artist:' => '👩‍🎨', + ':woman_astronaut:' => '👩‍🚀', + ':woman_bald:' => '👩‍🦲', + ':woman_cook:' => '👩‍🍳', + ':woman_curly_hair:' => '👩‍🦱', + ':woman_factory_worker:' => '👩‍🏭', + ':woman_farmer:' => '👩‍🌾', + ':woman_feeding_baby:' => '👩‍🍼', + ':woman_firefighter:' => '👩‍🚒', + ':woman_in_manual_wheelchair:' => '👩‍🦽', + ':woman_in_motorized_wheelchair:' => '👩‍🦼', + ':woman_mechanic:' => '👩‍🔧', + ':woman_office_worker:' => '👩‍💼', + ':woman_red_hair:' => '👩‍🦰', + ':woman_scientist:' => '👩‍🔬', + ':woman_singer:' => '👩‍🎤', + ':woman_student:' => '👩‍🎓', + ':woman_teacher:' => '👩‍🏫', + ':woman_technologist:' => '👩‍💻', + ':woman_white_hair:' => '👩‍🦳', + ':woman_with_white_cane:' => '👩‍🦯', ':zero:' => '0️⃣', + ':artist_dark_skin_tone:' => '🧑🏿‍🎨', + ':artist_light_skin_tone:' => '🧑🏻‍🎨', + ':artist_medium_dark_skin_tone:' => '🧑🏾‍🎨', + ':artist_medium_light_skin_tone:' => '🧑🏼‍🎨', + ':artist_medium_skin_tone:' => '🧑🏽‍🎨', + ':astronaut_dark_skin_tone:' => '🧑🏿‍🚀', + ':astronaut_light_skin_tone:' => '🧑🏻‍🚀', + ':astronaut_medium_dark_skin_tone:' => '🧑🏾‍🚀', + ':astronaut_medium_light_skin_tone:' => '🧑🏼‍🚀', + ':astronaut_medium_skin_tone:' => '🧑🏽‍🚀', + ':broken_chain:' => '⛓️‍💥', + ':cook_dark_skin_tone:' => '🧑🏿‍🍳', + ':cook_light_skin_tone:' => '🧑🏻‍🍳', + ':cook_medium_dark_skin_tone:' => '🧑🏾‍🍳', + ':cook_medium_light_skin_tone:' => '🧑🏼‍🍳', + ':cook_medium_skin_tone:' => '🧑🏽‍🍳', + ':deaf_man:' => '🧏‍♂️', + ':deaf_woman:' => '🧏‍♀️', + ':face_in_clouds:' => '😶‍🌫️', + ':factory_worker_dark_skin_tone:' => '🧑🏿‍🏭', + ':factory_worker_light_skin_tone:' => '🧑🏻‍🏭', + ':factory_worker_medium_dark_skin_tone:' => '🧑🏾‍🏭', + ':factory_worker_medium_light_skin_tone:' => '🧑🏼‍🏭', + ':factory_worker_medium_skin_tone:' => '🧑🏽‍🏭', + ':farmer_dark_skin_tone:' => '🧑🏿‍🌾', + ':farmer_light_skin_tone:' => '🧑🏻‍🌾', + ':farmer_medium_dark_skin_tone:' => '🧑🏾‍🌾', + ':farmer_medium_light_skin_tone:' => '🧑🏼‍🌾', + ':farmer_medium_skin_tone:' => '🧑🏽‍🌾', + ':firefighter_dark_skin_tone:' => '🧑🏿‍🚒', + ':firefighter_light_skin_tone:' => '🧑🏻‍🚒', + ':firefighter_medium_dark_skin_tone:' => '🧑🏾‍🚒', + ':firefighter_medium_light_skin_tone:' => '🧑🏼‍🚒', + ':firefighter_medium_skin_tone:' => '🧑🏽‍🚒', + ':gay_pride_flag:' => '🏳️‍🌈', + ':head_shaking_horizontally:' => '🙂‍↔️', + ':head_shaking_vertically:' => '🙂‍↕️', + ':health_worker:' => '🧑‍⚕️', + ':heart_on_fire:' => '❤️‍🔥', + ':judge:' => '🧑‍⚖️', + ':man_artist_dark_skin_tone:' => '👨🏿‍🎨', + ':man_artist_light_skin_tone:' => '👨🏻‍🎨', + ':man_artist_medium_dark_skin_tone:' => '👨🏾‍🎨', + ':man_artist_medium_light_skin_tone:' => '👨🏼‍🎨', + ':man_artist_medium_skin_tone:' => '👨🏽‍🎨', + ':man_astronaut_dark_skin_tone:' => '👨🏿‍🚀', + ':man_astronaut_light_skin_tone:' => '👨🏻‍🚀', + ':man_astronaut_medium_dark_skin_tone:' => '👨🏾‍🚀', + ':man_astronaut_medium_light_skin_tone:' => '👨🏼‍🚀', + ':man_astronaut_medium_skin_tone:' => '👨🏽‍🚀', + ':man_beard:' => '🧔‍♂️', + ':man_biking:' => '🚴‍♂️', + ':man_blond_hair:' => '👱‍♂️', + ':man_bowing:' => '🙇‍♂️', + ':man_cartwheeling:' => '🤸‍♂️', + ':man_climbing:' => '🧗‍♂️', + ':man_construction_worker:' => '👷‍♂️', + ':man_cook_dark_skin_tone:' => '👨🏿‍🍳', + ':man_cook_light_skin_tone:' => '👨🏻‍🍳', + ':man_cook_medium_dark_skin_tone:' => '👨🏾‍🍳', + ':man_cook_medium_light_skin_tone:' => '👨🏼‍🍳', + ':man_cook_medium_skin_tone:' => '👨🏽‍🍳', + ':man_dark_skin_tone_bald:' => '👨🏿‍🦲', + ':man_dark_skin_tone_curly_hair:' => '👨🏿‍🦱', + ':man_dark_skin_tone_red_hair:' => '👨🏿‍🦰', + ':man_dark_skin_tone_white_hair:' => '👨🏿‍🦳', + ':man_elf:' => '🧝‍♂️', + ':man_facepalming:' => '🤦‍♂️', + ':man_factory_worker_dark_skin_tone:' => '👨🏿‍🏭', + ':man_factory_worker_light_skin_tone:' => '👨🏻‍🏭', + ':man_factory_worker_medium_dark_skin_tone:' => '👨🏾‍🏭', + ':man_factory_worker_medium_light_skin_tone:' => '👨🏼‍🏭', + ':man_factory_worker_medium_skin_tone:' => '👨🏽‍🏭', + ':man_fairy:' => '🧚‍♂️', + ':man_farmer_dark_skin_tone:' => '👨🏿‍🌾', + ':man_farmer_light_skin_tone:' => '👨🏻‍🌾', + ':man_farmer_medium_dark_skin_tone:' => '👨🏾‍🌾', + ':man_farmer_medium_light_skin_tone:' => '👨🏼‍🌾', + ':man_farmer_medium_skin_tone:' => '👨🏽‍🌾', + ':man_feeding_baby_dark_skin_tone:' => '👨🏿‍🍼', + ':man_feeding_baby_light_skin_tone:' => '👨🏻‍🍼', + ':man_feeding_baby_medium_dark_skin_tone:' => '👨🏾‍🍼', + ':man_feeding_baby_medium_light_skin_tone:' => '👨🏼‍🍼', + ':man_feeding_baby_medium_skin_tone:' => '👨🏽‍🍼', + ':man_firefighter_dark_skin_tone:' => '👨🏿‍🚒', + ':man_firefighter_light_skin_tone:' => '👨🏻‍🚒', + ':man_firefighter_medium_dark_skin_tone:' => '👨🏾‍🚒', + ':man_firefighter_medium_light_skin_tone:' => '👨🏼‍🚒', + ':man_firefighter_medium_skin_tone:' => '👨🏽‍🚒', + ':man_frowning:' => '🙍‍♂️', + ':man_genie:' => '🧞‍♂️', + ':man_gesturing_no:' => '🙅‍♂️', + ':man_gesturing_ok:' => '🙆‍♂️', + ':man_getting_haircut:' => '💇‍♂️', + ':man_getting_massage:' => '💆‍♂️', + ':man_guard:' => '💂‍♂️', + ':man_health_worker:' => '👨‍⚕️', + ':man_in_lotus_position:' => '🧘‍♂️', + ':man_in_manual_wheelchair_dark_skin_tone:' => '👨🏿‍🦽', + ':man_in_manual_wheelchair_light_skin_tone:' => '👨🏻‍🦽', + ':man_in_manual_wheelchair_medium_dark_skin_tone:' => '👨🏾‍🦽', + ':man_in_manual_wheelchair_medium_light_skin_tone:' => '👨🏼‍🦽', + ':man_in_manual_wheelchair_medium_skin_tone:' => '👨🏽‍🦽', + ':man_in_motorized_wheelchair_dark_skin_tone:' => '👨🏿‍🦼', + ':man_in_motorized_wheelchair_light_skin_tone:' => '👨🏻‍🦼', + ':man_in_motorized_wheelchair_medium_dark_skin_tone:' => '👨🏾‍🦼', + ':man_in_motorized_wheelchair_medium_light_skin_tone:' => '👨🏼‍🦼', + ':man_in_motorized_wheelchair_medium_skin_tone:' => '👨🏽‍🦼', + ':man_in_steamy_room:' => '🧖‍♂️', + ':man_in_tuxedo:' => '🤵‍♂️', + ':man_judge:' => '👨‍⚖️', + ':man_juggling:' => '🤹‍♂️', + ':man_kneeling:' => '🧎‍♂️', + ':man_light_skin_tone_bald:' => '👨🏻‍🦲', + ':man_light_skin_tone_curly_hair:' => '👨🏻‍🦱', + ':man_light_skin_tone_red_hair:' => '👨🏻‍🦰', + ':man_light_skin_tone_white_hair:' => '👨🏻‍🦳', + ':man_mage:' => '🧙‍♂️', + ':man_mechanic_dark_skin_tone:' => '👨🏿‍🔧', + ':man_mechanic_light_skin_tone:' => '👨🏻‍🔧', + ':man_mechanic_medium_dark_skin_tone:' => '👨🏾‍🔧', + ':man_mechanic_medium_light_skin_tone:' => '👨🏼‍🔧', + ':man_mechanic_medium_skin_tone:' => '👨🏽‍🔧', + ':man_medium_dark_skin_tone_bald:' => '👨🏾‍🦲', + ':man_medium_dark_skin_tone_curly_hair:' => '👨🏾‍🦱', + ':man_medium_dark_skin_tone_red_hair:' => '👨🏾‍🦰', + ':man_medium_dark_skin_tone_white_hair:' => '👨🏾‍🦳', + ':man_medium_light_skin_tone_bald:' => '👨🏼‍🦲', + ':man_medium_light_skin_tone_curly_hair:' => '👨🏼‍🦱', + ':man_medium_light_skin_tone_red_hair:' => '👨🏼‍🦰', + ':man_medium_light_skin_tone_white_hair:' => '👨🏼‍🦳', + ':man_medium_skin_tone_bald:' => '👨🏽‍🦲', + ':man_medium_skin_tone_curly_hair:' => '👨🏽‍🦱', + ':man_medium_skin_tone_red_hair:' => '👨🏽‍🦰', + ':man_medium_skin_tone_white_hair:' => '👨🏽‍🦳', + ':man_mountain_biking:' => '🚵‍♂️', + ':man_office_worker_dark_skin_tone:' => '👨🏿‍💼', + ':man_office_worker_light_skin_tone:' => '👨🏻‍💼', + ':man_office_worker_medium_dark_skin_tone:' => '👨🏾‍💼', + ':man_office_worker_medium_light_skin_tone:' => '👨🏼‍💼', + ':man_office_worker_medium_skin_tone:' => '👨🏽‍💼', + ':man_pilot:' => '👨‍✈️', + ':man_playing_handball:' => '🤾‍♂️', + ':man_playing_water_polo:' => '🤽‍♂️', + ':man_police_officer:' => '👮‍♂️', + ':man_pouting:' => '🙎‍♂️', + ':man_raising_hand:' => '🙋‍♂️', + ':man_rowing_boat:' => '🚣‍♂️', + ':man_running:' => '🏃‍♂️', + ':man_scientist_dark_skin_tone:' => '👨🏿‍🔬', + ':man_scientist_light_skin_tone:' => '👨🏻‍🔬', + ':man_scientist_medium_dark_skin_tone:' => '👨🏾‍🔬', + ':man_scientist_medium_light_skin_tone:' => '👨🏼‍🔬', + ':man_scientist_medium_skin_tone:' => '👨🏽‍🔬', + ':man_shrugging:' => '🤷‍♂️', + ':man_singer_dark_skin_tone:' => '👨🏿‍🎤', + ':man_singer_light_skin_tone:' => '👨🏻‍🎤', + ':man_singer_medium_dark_skin_tone:' => '👨🏾‍🎤', + ':man_singer_medium_light_skin_tone:' => '👨🏼‍🎤', + ':man_singer_medium_skin_tone:' => '👨🏽‍🎤', + ':man_standing:' => '🧍‍♂️', + ':man_student_dark_skin_tone:' => '👨🏿‍🎓', + ':man_student_light_skin_tone:' => '👨🏻‍🎓', + ':man_student_medium_dark_skin_tone:' => '👨🏾‍🎓', + ':man_student_medium_light_skin_tone:' => '👨🏼‍🎓', + ':man_student_medium_skin_tone:' => '👨🏽‍🎓', + ':man_superhero:' => '🦸‍♂️', + ':man_supervillain:' => '🦹‍♂️', + ':man_surfing:' => '🏄‍♂️', + ':man_swimming:' => '🏊‍♂️', + ':man_teacher_dark_skin_tone:' => '👨🏿‍🏫', + ':man_teacher_light_skin_tone:' => '👨🏻‍🏫', + ':man_teacher_medium_dark_skin_tone:' => '👨🏾‍🏫', + ':man_teacher_medium_light_skin_tone:' => '👨🏼‍🏫', + ':man_teacher_medium_skin_tone:' => '👨🏽‍🏫', + ':man_technologist_dark_skin_tone:' => '👨🏿‍💻', + ':man_technologist_light_skin_tone:' => '👨🏻‍💻', + ':man_technologist_medium_dark_skin_tone:' => '👨🏾‍💻', + ':man_technologist_medium_light_skin_tone:' => '👨🏼‍💻', + ':man_technologist_medium_skin_tone:' => '👨🏽‍💻', + ':man_tipping_hand:' => '💁‍♂️', + ':man_vampire:' => '🧛‍♂️', + ':man_walking:' => '🚶‍♂️', + ':man_wearing_turban:' => '👳‍♂️', + ':man_with_veil:' => '👰‍♂️', + ':man_with_white_cane_dark_skin_tone:' => '👨🏿‍🦯', + ':man_with_white_cane_light_skin_tone:' => '👨🏻‍🦯', + ':man_with_white_cane_medium_dark_skin_tone:' => '👨🏾‍🦯', + ':man_with_white_cane_medium_light_skin_tone:' => '👨🏼‍🦯', + ':man_with_white_cane_medium_skin_tone:' => '👨🏽‍🦯', + ':man_zombie:' => '🧟‍♂️', + ':mechanic_dark_skin_tone:' => '🧑🏿‍🔧', + ':mechanic_light_skin_tone:' => '🧑🏻‍🔧', + ':mechanic_medium_dark_skin_tone:' => '🧑🏾‍🔧', + ':mechanic_medium_light_skin_tone:' => '🧑🏼‍🔧', + ':mechanic_medium_skin_tone:' => '🧑🏽‍🔧', + ':men_with_bunny_ears:' => '👯‍♂️', + ':men_wrestling:' => '🤼‍♂️', + ':mending_heart:' => '❤️‍🩹', + ':mermaid:' => '🧜‍♀️', + ':merman:' => '🧜‍♂️', + ':mx_claus_dark_skin_tone:' => '🧑🏿‍🎄', + ':mx_claus_light_skin_tone:' => '🧑🏻‍🎄', + ':mx_claus_medium_dark_skin_tone:' => '🧑🏾‍🎄', + ':mx_claus_medium_light_skin_tone:' => '🧑🏼‍🎄', + ':mx_claus_medium_skin_tone:' => '🧑🏽‍🎄', + ':office_worker_dark_skin_tone:' => '🧑🏿‍💼', + ':office_worker_light_skin_tone:' => '🧑🏻‍💼', + ':office_worker_medium_dark_skin_tone:' => '🧑🏾‍💼', + ':office_worker_medium_light_skin_tone:' => '🧑🏼‍💼', + ':office_worker_medium_skin_tone:' => '🧑🏽‍💼', + ':person_dark_skin_tone_bald:' => '🧑🏿‍🦲', + ':person_dark_skin_tone_curly_hair:' => '🧑🏿‍🦱', + ':person_dark_skin_tone_red_hair:' => '🧑🏿‍🦰', + ':person_dark_skin_tone_white_hair:' => '🧑🏿‍🦳', + ':person_feeding_baby_dark_skin_tone:' => '🧑🏿‍🍼', + ':person_feeding_baby_light_skin_tone:' => '🧑🏻‍🍼', + ':person_feeding_baby_medium_dark_skin_tone:' => '🧑🏾‍🍼', + ':person_feeding_baby_medium_light_skin_tone:' => '🧑🏼‍🍼', + ':person_feeding_baby_medium_skin_tone:' => '🧑🏽‍🍼', + ':person_in_manual_wheelchair_dark_skin_tone:' => '🧑🏿‍🦽', + ':person_in_manual_wheelchair_light_skin_tone:' => '🧑🏻‍🦽', + ':person_in_manual_wheelchair_medium_dark_skin_tone:' => '🧑🏾‍🦽', + ':person_in_manual_wheelchair_medium_light_skin_tone:' => '🧑🏼‍🦽', + ':person_in_manual_wheelchair_medium_skin_tone:' => '🧑🏽‍🦽', + ':person_in_motorized_wheelchair_dark_skin_tone:' => '🧑🏿‍🦼', + ':person_in_motorized_wheelchair_light_skin_tone:' => '🧑🏻‍🦼', + ':person_in_motorized_wheelchair_medium_dark_skin_tone:' => '🧑🏾‍🦼', + ':person_in_motorized_wheelchair_medium_light_skin_tone:' => '🧑🏼‍🦼', + ':person_in_motorized_wheelchair_medium_skin_tone:' => '🧑🏽‍🦼', + ':person_kneeling_facing_right:' => '🧎‍➡️', + ':person_light_skin_tone_bald:' => '🧑🏻‍🦲', + ':person_light_skin_tone_curly_hair:' => '🧑🏻‍🦱', + ':person_light_skin_tone_red_hair:' => '🧑🏻‍🦰', + ':person_light_skin_tone_white_hair:' => '🧑🏻‍🦳', + ':person_medium_dark_skin_tone_bald:' => '🧑🏾‍🦲', + ':person_medium_dark_skin_tone_curly_hair:' => '🧑🏾‍🦱', + ':person_medium_dark_skin_tone_red_hair:' => '🧑🏾‍🦰', + ':person_medium_dark_skin_tone_white_hair:' => '🧑🏾‍🦳', + ':person_medium_light_skin_tone_bald:' => '🧑🏼‍🦲', + ':person_medium_light_skin_tone_curly_hair:' => '🧑🏼‍🦱', + ':person_medium_light_skin_tone_red_hair:' => '🧑🏼‍🦰', + ':person_medium_light_skin_tone_white_hair:' => '🧑🏼‍🦳', + ':person_medium_skin_tone_bald:' => '🧑🏽‍🦲', + ':person_medium_skin_tone_curly_hair:' => '🧑🏽‍🦱', + ':person_medium_skin_tone_red_hair:' => '🧑🏽‍🦰', + ':person_medium_skin_tone_white_hair:' => '🧑🏽‍🦳', + ':person_running_facing_right:' => '🏃‍➡️', + ':person_walking_facing_right:' => '🚶‍➡️', + ':person_with_white_cane_dark_skin_tone:' => '🧑🏿‍🦯', + ':person_with_white_cane_light_skin_tone:' => '🧑🏻‍🦯', + ':person_with_white_cane_medium_dark_skin_tone:' => '🧑🏾‍🦯', + ':person_with_white_cane_medium_light_skin_tone:' => '🧑🏼‍🦯', + ':person_with_white_cane_medium_skin_tone:' => '🧑🏽‍🦯', + ':pilot:' => '🧑‍✈️', + ':pirate_flag:' => '🏴‍☠️', + ':polar_bear:' => '🐻‍❄️', + ':scientist_dark_skin_tone:' => '🧑🏿‍🔬', + ':scientist_light_skin_tone:' => '🧑🏻‍🔬', + ':scientist_medium_dark_skin_tone:' => '🧑🏾‍🔬', + ':scientist_medium_light_skin_tone:' => '🧑🏼‍🔬', + ':scientist_medium_skin_tone:' => '🧑🏽‍🔬', + ':singer_dark_skin_tone:' => '🧑🏿‍🎤', + ':singer_light_skin_tone:' => '🧑🏻‍🎤', + ':singer_medium_dark_skin_tone:' => '🧑🏾‍🎤', + ':singer_medium_light_skin_tone:' => '🧑🏼‍🎤', + ':singer_medium_skin_tone:' => '🧑🏽‍🎤', + ':student_dark_skin_tone:' => '🧑🏿‍🎓', + ':student_light_skin_tone:' => '🧑🏻‍🎓', + ':student_medium_dark_skin_tone:' => '🧑🏾‍🎓', + ':student_medium_light_skin_tone:' => '🧑🏼‍🎓', + ':student_medium_skin_tone:' => '🧑🏽‍🎓', + ':teacher_dark_skin_tone:' => '🧑🏿‍🏫', + ':teacher_light_skin_tone:' => '🧑🏻‍🏫', + ':teacher_medium_dark_skin_tone:' => '🧑🏾‍🏫', + ':teacher_medium_light_skin_tone:' => '🧑🏼‍🏫', + ':teacher_medium_skin_tone:' => '🧑🏽‍🏫', + ':technologist_dark_skin_tone:' => '🧑🏿‍💻', + ':technologist_light_skin_tone:' => '🧑🏻‍💻', + ':technologist_medium_dark_skin_tone:' => '🧑🏾‍💻', + ':technologist_medium_light_skin_tone:' => '🧑🏼‍💻', + ':technologist_medium_skin_tone:' => '🧑🏽‍💻', + ':woman_artist_dark_skin_tone:' => '👩🏿‍🎨', + ':woman_artist_light_skin_tone:' => '👩🏻‍🎨', + ':woman_artist_medium_dark_skin_tone:' => '👩🏾‍🎨', + ':woman_artist_medium_light_skin_tone:' => '👩🏼‍🎨', + ':woman_artist_medium_skin_tone:' => '👩🏽‍🎨', + ':woman_astronaut_dark_skin_tone:' => '👩🏿‍🚀', + ':woman_astronaut_light_skin_tone:' => '👩🏻‍🚀', + ':woman_astronaut_medium_dark_skin_tone:' => '👩🏾‍🚀', + ':woman_astronaut_medium_light_skin_tone:' => '👩🏼‍🚀', + ':woman_astronaut_medium_skin_tone:' => '👩🏽‍🚀', + ':woman_beard:' => '🧔‍♀️', + ':woman_biking:' => '🚴‍♀️', + ':woman_blond_hair:' => '👱‍♀️', + ':woman_bowing:' => '🙇‍♀️', + ':woman_cartwheeling:' => '🤸‍♀️', + ':woman_climbing:' => '🧗‍♀️', + ':woman_construction_worker:' => '👷‍♀️', + ':woman_cook_dark_skin_tone:' => '👩🏿‍🍳', + ':woman_cook_light_skin_tone:' => '👩🏻‍🍳', + ':woman_cook_medium_dark_skin_tone:' => '👩🏾‍🍳', + ':woman_cook_medium_light_skin_tone:' => '👩🏼‍🍳', + ':woman_cook_medium_skin_tone:' => '👩🏽‍🍳', + ':woman_dark_skin_tone_bald:' => '👩🏿‍🦲', + ':woman_dark_skin_tone_curly_hair:' => '👩🏿‍🦱', + ':woman_dark_skin_tone_red_hair:' => '👩🏿‍🦰', + ':woman_dark_skin_tone_white_hair:' => '👩🏿‍🦳', + ':woman_elf:' => '🧝‍♀️', + ':woman_facepalming:' => '🤦‍♀️', + ':woman_factory_worker_dark_skin_tone:' => '👩🏿‍🏭', + ':woman_factory_worker_light_skin_tone:' => '👩🏻‍🏭', + ':woman_factory_worker_medium_dark_skin_tone:' => '👩🏾‍🏭', + ':woman_factory_worker_medium_light_skin_tone:' => '👩🏼‍🏭', + ':woman_factory_worker_medium_skin_tone:' => '👩🏽‍🏭', + ':woman_fairy:' => '🧚‍♀️', + ':woman_farmer_dark_skin_tone:' => '👩🏿‍🌾', + ':woman_farmer_light_skin_tone:' => '👩🏻‍🌾', + ':woman_farmer_medium_dark_skin_tone:' => '👩🏾‍🌾', + ':woman_farmer_medium_light_skin_tone:' => '👩🏼‍🌾', + ':woman_farmer_medium_skin_tone:' => '👩🏽‍🌾', + ':woman_feeding_baby_dark_skin_tone:' => '👩🏿‍🍼', + ':woman_feeding_baby_light_skin_tone:' => '👩🏻‍🍼', + ':woman_feeding_baby_medium_dark_skin_tone:' => '👩🏾‍🍼', + ':woman_feeding_baby_medium_light_skin_tone:' => '👩🏼‍🍼', + ':woman_feeding_baby_medium_skin_tone:' => '👩🏽‍🍼', + ':woman_firefighter_dark_skin_tone:' => '👩🏿‍🚒', + ':woman_firefighter_light_skin_tone:' => '👩🏻‍🚒', + ':woman_firefighter_medium_dark_skin_tone:' => '👩🏾‍🚒', + ':woman_firefighter_medium_light_skin_tone:' => '👩🏼‍🚒', + ':woman_firefighter_medium_skin_tone:' => '👩🏽‍🚒', + ':woman_frowning:' => '🙍‍♀️', + ':woman_genie:' => '🧞‍♀️', + ':woman_gesturing_no:' => '🙅‍♀️', + ':woman_gesturing_ok:' => '🙆‍♀️', + ':woman_getting_haircut:' => '💇‍♀️', + ':woman_getting_massage:' => '💆‍♀️', + ':woman_guard:' => '💂‍♀️', + ':woman_health_worker:' => '👩‍⚕️', + ':woman_in_lotus_position:' => '🧘‍♀️', + ':woman_in_manual_wheelchair_dark_skin_tone:' => '👩🏿‍🦽', + ':woman_in_manual_wheelchair_light_skin_tone:' => '👩🏻‍🦽', + ':woman_in_manual_wheelchair_medium_dark_skin_tone:' => '👩🏾‍🦽', + ':woman_in_manual_wheelchair_medium_light_skin_tone:' => '👩🏼‍🦽', + ':woman_in_manual_wheelchair_medium_skin_tone:' => '👩🏽‍🦽', + ':woman_in_motorized_wheelchair_dark_skin_tone:' => '👩🏿‍🦼', + ':woman_in_motorized_wheelchair_light_skin_tone:' => '👩🏻‍🦼', + ':woman_in_motorized_wheelchair_medium_dark_skin_tone:' => '👩🏾‍🦼', + ':woman_in_motorized_wheelchair_medium_light_skin_tone:' => '👩🏼‍🦼', + ':woman_in_motorized_wheelchair_medium_skin_tone:' => '👩🏽‍🦼', + ':woman_in_steamy_room:' => '🧖‍♀️', + ':woman_in_tuxedo:' => '🤵‍♀️', + ':woman_judge:' => '👩‍⚖️', + ':woman_juggling:' => '🤹‍♀️', + ':woman_kneeling:' => '🧎‍♀️', + ':woman_light_skin_tone_bald:' => '👩🏻‍🦲', + ':woman_light_skin_tone_curly_hair:' => '👩🏻‍🦱', + ':woman_light_skin_tone_red_hair:' => '👩🏻‍🦰', + ':woman_light_skin_tone_white_hair:' => '👩🏻‍🦳', + ':woman_mage:' => '🧙‍♀️', + ':woman_mechanic_dark_skin_tone:' => '👩🏿‍🔧', + ':woman_mechanic_light_skin_tone:' => '👩🏻‍🔧', + ':woman_mechanic_medium_dark_skin_tone:' => '👩🏾‍🔧', + ':woman_mechanic_medium_light_skin_tone:' => '👩🏼‍🔧', + ':woman_mechanic_medium_skin_tone:' => '👩🏽‍🔧', + ':woman_medium_dark_skin_tone_bald:' => '👩🏾‍🦲', + ':woman_medium_dark_skin_tone_curly_hair:' => '👩🏾‍🦱', + ':woman_medium_dark_skin_tone_red_hair:' => '👩🏾‍🦰', + ':woman_medium_dark_skin_tone_white_hair:' => '👩🏾‍🦳', + ':woman_medium_light_skin_tone_bald:' => '👩🏼‍🦲', + ':woman_medium_light_skin_tone_curly_hair:' => '👩🏼‍🦱', + ':woman_medium_light_skin_tone_red_hair:' => '👩🏼‍🦰', + ':woman_medium_light_skin_tone_white_hair:' => '👩🏼‍🦳', + ':woman_medium_skin_tone_bald:' => '👩🏽‍🦲', + ':woman_medium_skin_tone_curly_hair:' => '👩🏽‍🦱', + ':woman_medium_skin_tone_red_hair:' => '👩🏽‍🦰', + ':woman_medium_skin_tone_white_hair:' => '👩🏽‍🦳', + ':woman_mountain_biking:' => '🚵‍♀️', + ':woman_office_worker_dark_skin_tone:' => '👩🏿‍💼', + ':woman_office_worker_light_skin_tone:' => '👩🏻‍💼', + ':woman_office_worker_medium_dark_skin_tone:' => '👩🏾‍💼', + ':woman_office_worker_medium_light_skin_tone:' => '👩🏼‍💼', + ':woman_office_worker_medium_skin_tone:' => '👩🏽‍💼', + ':woman_pilot:' => '👩‍✈️', + ':woman_playing_handball:' => '🤾‍♀️', + ':woman_playing_water_polo:' => '🤽‍♀️', + ':woman_police_officer:' => '👮‍♀️', + ':woman_pouting:' => '🙎‍♀️', + ':woman_raising_hand:' => '🙋‍♀️', + ':woman_rowing_boat:' => '🚣‍♀️', + ':woman_running:' => '🏃‍♀️', + ':woman_scientist_dark_skin_tone:' => '👩🏿‍🔬', + ':woman_scientist_light_skin_tone:' => '👩🏻‍🔬', + ':woman_scientist_medium_dark_skin_tone:' => '👩🏾‍🔬', + ':woman_scientist_medium_light_skin_tone:' => '👩🏼‍🔬', + ':woman_scientist_medium_skin_tone:' => '👩🏽‍🔬', + ':woman_shrugging:' => '🤷‍♀️', + ':woman_singer_dark_skin_tone:' => '👩🏿‍🎤', + ':woman_singer_light_skin_tone:' => '👩🏻‍🎤', + ':woman_singer_medium_dark_skin_tone:' => '👩🏾‍🎤', + ':woman_singer_medium_light_skin_tone:' => '👩🏼‍🎤', + ':woman_singer_medium_skin_tone:' => '👩🏽‍🎤', + ':woman_standing:' => '🧍‍♀️', + ':woman_student_dark_skin_tone:' => '👩🏿‍🎓', + ':woman_student_light_skin_tone:' => '👩🏻‍🎓', + ':woman_student_medium_dark_skin_tone:' => '👩🏾‍🎓', + ':woman_student_medium_light_skin_tone:' => '👩🏼‍🎓', + ':woman_student_medium_skin_tone:' => '👩🏽‍🎓', + ':woman_superhero:' => '🦸‍♀️', + ':woman_supervillain:' => '🦹‍♀️', + ':woman_surfing:' => '🏄‍♀️', + ':woman_swimming:' => '🏊‍♀️', + ':woman_teacher_dark_skin_tone:' => '👩🏿‍🏫', + ':woman_teacher_light_skin_tone:' => '👩🏻‍🏫', + ':woman_teacher_medium_dark_skin_tone:' => '👩🏾‍🏫', + ':woman_teacher_medium_light_skin_tone:' => '👩🏼‍🏫', + ':woman_teacher_medium_skin_tone:' => '👩🏽‍🏫', + ':woman_technologist_dark_skin_tone:' => '👩🏿‍💻', + ':woman_technologist_light_skin_tone:' => '👩🏻‍💻', + ':woman_technologist_medium_dark_skin_tone:' => '👩🏾‍💻', + ':woman_technologist_medium_light_skin_tone:' => '👩🏼‍💻', + ':woman_technologist_medium_skin_tone:' => '👩🏽‍💻', + ':woman_tipping_hand:' => '💁‍♀️', + ':woman_vampire:' => '🧛‍♀️', + ':woman_walking:' => '🚶‍♀️', + ':woman_wearing_turban:' => '👳‍♀️', + ':woman_with_veil:' => '👰‍♀️', + ':woman_with_white_cane_dark_skin_tone:' => '👩🏿‍🦯', + ':woman_with_white_cane_light_skin_tone:' => '👩🏻‍🦯', + ':woman_with_white_cane_medium_dark_skin_tone:' => '👩🏾‍🦯', + ':woman_with_white_cane_medium_light_skin_tone:' => '👩🏼‍🦯', + ':woman_with_white_cane_medium_skin_tone:' => '👩🏽‍🦯', + ':woman_zombie:' => '🧟‍♀️', + ':women_with_bunny_ears:' => '👯‍♀️', + ':women_wrestling:' => '🤼‍♀️', + ':deaf_man_dark_skin_tone:' => '🧏🏿‍♂️', + ':deaf_man_light_skin_tone:' => '🧏🏻‍♂️', + ':deaf_man_medium_dark_skin_tone:' => '🧏🏾‍♂️', + ':deaf_man_medium_light_skin_tone:' => '🧏🏼‍♂️', + ':deaf_man_medium_skin_tone:' => '🧏🏽‍♂️', + ':deaf_woman_dark_skin_tone:' => '🧏🏿‍♀️', + ':deaf_woman_light_skin_tone:' => '🧏🏻‍♀️', + ':deaf_woman_medium_dark_skin_tone:' => '🧏🏾‍♀️', + ':deaf_woman_medium_light_skin_tone:' => '🧏🏼‍♀️', + ':deaf_woman_medium_skin_tone:' => '🧏🏽‍♀️', + ':eye_in_speech_bubble:' => '👁️‍🗨️', + ':family_adult_adult_child:' => '🧑‍🧑‍🧒', + ':family_adult_child_child:' => '🧑‍🧒‍🧒', + ':family_man_boy_boy:' => '👨‍👦‍👦', + ':family_man_girl_boy:' => '👨‍👧‍👦', + ':family_man_girl_girl:' => '👨‍👧‍👧', + ':family_man_woman_boy:' => '👨‍👩‍👦', ':family_mmb:' => '👨‍👨‍👦', ':family_mmg:' => '👨‍👨‍👧', ':family_mwg:' => '👨‍👩‍👧', + ':family_woman_boy_boy:' => '👩‍👦‍👦', + ':family_woman_girl_boy:' => '👩‍👧‍👦', + ':family_woman_girl_girl:' => '👩‍👧‍👧', ':family_wwb:' => '👩‍👩‍👦', ':family_wwg:' => '👩‍👩‍👧', - ':couple_with_heart_mm:' => '👨‍❤️‍👨', - ':couple_with_heart_ww:' => '👩‍❤️‍👩', + ':handshake_dark_skin_tone_light_skin_tone:' => '🫱🏿‍🫲🏻', + ':handshake_dark_skin_tone_medium_dark_skin_tone:' => '🫱🏿‍🫲🏾', + ':handshake_dark_skin_tone_medium_light_skin_tone:' => '🫱🏿‍🫲🏼', + ':handshake_dark_skin_tone_medium_skin_tone:' => '🫱🏿‍🫲🏽', + ':handshake_light_skin_tone_dark_skin_tone:' => '🫱🏻‍🫲🏿', + ':handshake_light_skin_tone_medium_dark_skin_tone:' => '🫱🏻‍🫲🏾', + ':handshake_light_skin_tone_medium_light_skin_tone:' => '🫱🏻‍🫲🏼', + ':handshake_light_skin_tone_medium_skin_tone:' => '🫱🏻‍🫲🏽', + ':handshake_medium_dark_skin_tone_dark_skin_tone:' => '🫱🏾‍🫲🏿', + ':handshake_medium_dark_skin_tone_light_skin_tone:' => '🫱🏾‍🫲🏻', + ':handshake_medium_dark_skin_tone_medium_light_skin_tone:' => '🫱🏾‍🫲🏼', + ':handshake_medium_dark_skin_tone_medium_skin_tone:' => '🫱🏾‍🫲🏽', + ':handshake_medium_light_skin_tone_dark_skin_tone:' => '🫱🏼‍🫲🏿', + ':handshake_medium_light_skin_tone_light_skin_tone:' => '🫱🏼‍🫲🏻', + ':handshake_medium_light_skin_tone_medium_dark_skin_tone:' => '🫱🏼‍🫲🏾', + ':handshake_medium_light_skin_tone_medium_skin_tone:' => '🫱🏼‍🫲🏽', + ':handshake_medium_skin_tone_dark_skin_tone:' => '🫱🏽‍🫲🏿', + ':handshake_medium_skin_tone_light_skin_tone:' => '🫱🏽‍🫲🏻', + ':handshake_medium_skin_tone_medium_dark_skin_tone:' => '🫱🏽‍🫲🏾', + ':handshake_medium_skin_tone_medium_light_skin_tone:' => '🫱🏽‍🫲🏼', + ':health_worker_dark_skin_tone:' => '🧑🏿‍⚕️', + ':health_worker_light_skin_tone:' => '🧑🏻‍⚕️', + ':health_worker_medium_dark_skin_tone:' => '🧑🏾‍⚕️', + ':health_worker_medium_light_skin_tone:' => '🧑🏼‍⚕️', + ':health_worker_medium_skin_tone:' => '🧑🏽‍⚕️', + ':judge_dark_skin_tone:' => '🧑🏿‍⚖️', + ':judge_light_skin_tone:' => '🧑🏻‍⚖️', + ':judge_medium_dark_skin_tone:' => '🧑🏾‍⚖️', + ':judge_medium_light_skin_tone:' => '🧑🏼‍⚖️', + ':judge_medium_skin_tone:' => '🧑🏽‍⚖️', + ':man_biking_dark_skin_tone:' => '🚴🏿‍♂️', + ':man_biking_light_skin_tone:' => '🚴🏻‍♂️', + ':man_biking_medium_dark_skin_tone:' => '🚴🏾‍♂️', + ':man_biking_medium_light_skin_tone:' => '🚴🏼‍♂️', + ':man_biking_medium_skin_tone:' => '🚴🏽‍♂️', + ':man_bouncing_ball:' => '⛹️‍♂️', + ':man_bouncing_ball_dark_skin_tone:' => '⛹🏿‍♂️', + ':man_bouncing_ball_light_skin_tone:' => '⛹🏻‍♂️', + ':man_bouncing_ball_medium_dark_skin_tone:' => '⛹🏾‍♂️', + ':man_bouncing_ball_medium_light_skin_tone:' => '⛹🏼‍♂️', + ':man_bouncing_ball_medium_skin_tone:' => '⛹🏽‍♂️', + ':man_bowing_dark_skin_tone:' => '🙇🏿‍♂️', + ':man_bowing_light_skin_tone:' => '🙇🏻‍♂️', + ':man_bowing_medium_dark_skin_tone:' => '🙇🏾‍♂️', + ':man_bowing_medium_light_skin_tone:' => '🙇🏼‍♂️', + ':man_bowing_medium_skin_tone:' => '🙇🏽‍♂️', + ':man_cartwheeling_dark_skin_tone:' => '🤸🏿‍♂️', + ':man_cartwheeling_light_skin_tone:' => '🤸🏻‍♂️', + ':man_cartwheeling_medium_dark_skin_tone:' => '🤸🏾‍♂️', + ':man_cartwheeling_medium_light_skin_tone:' => '🤸🏼‍♂️', + ':man_cartwheeling_medium_skin_tone:' => '🤸🏽‍♂️', + ':man_climbing_dark_skin_tone:' => '🧗🏿‍♂️', + ':man_climbing_light_skin_tone:' => '🧗🏻‍♂️', + ':man_climbing_medium_dark_skin_tone:' => '🧗🏾‍♂️', + ':man_climbing_medium_light_skin_tone:' => '🧗🏼‍♂️', + ':man_climbing_medium_skin_tone:' => '🧗🏽‍♂️', + ':man_construction_worker_dark_skin_tone:' => '👷🏿‍♂️', + ':man_construction_worker_light_skin_tone:' => '👷🏻‍♂️', + ':man_construction_worker_medium_dark_skin_tone:' => '👷🏾‍♂️', + ':man_construction_worker_medium_light_skin_tone:' => '👷🏼‍♂️', + ':man_construction_worker_medium_skin_tone:' => '👷🏽‍♂️', + ':man_dark_skin_tone_beard:' => '🧔🏿‍♂️', + ':man_dark_skin_tone_blond_hair:' => '👱🏿‍♂️', + ':man_detective:' => '🕵️‍♂️', + ':man_detective_dark_skin_tone:' => '🕵🏿‍♂️', + ':man_detective_light_skin_tone:' => '🕵🏻‍♂️', + ':man_detective_medium_dark_skin_tone:' => '🕵🏾‍♂️', + ':man_detective_medium_light_skin_tone:' => '🕵🏼‍♂️', + ':man_detective_medium_skin_tone:' => '🕵🏽‍♂️', + ':man_elf_dark_skin_tone:' => '🧝🏿‍♂️', + ':man_elf_light_skin_tone:' => '🧝🏻‍♂️', + ':man_elf_medium_dark_skin_tone:' => '🧝🏾‍♂️', + ':man_elf_medium_light_skin_tone:' => '🧝🏼‍♂️', + ':man_elf_medium_skin_tone:' => '🧝🏽‍♂️', + ':man_facepalming_dark_skin_tone:' => '🤦🏿‍♂️', + ':man_facepalming_light_skin_tone:' => '🤦🏻‍♂️', + ':man_facepalming_medium_dark_skin_tone:' => '🤦🏾‍♂️', + ':man_facepalming_medium_light_skin_tone:' => '🤦🏼‍♂️', + ':man_facepalming_medium_skin_tone:' => '🤦🏽‍♂️', + ':man_fairy_dark_skin_tone:' => '🧚🏿‍♂️', + ':man_fairy_light_skin_tone:' => '🧚🏻‍♂️', + ':man_fairy_medium_dark_skin_tone:' => '🧚🏾‍♂️', + ':man_fairy_medium_light_skin_tone:' => '🧚🏼‍♂️', + ':man_fairy_medium_skin_tone:' => '🧚🏽‍♂️', + ':man_frowning_dark_skin_tone:' => '🙍🏿‍♂️', + ':man_frowning_light_skin_tone:' => '🙍🏻‍♂️', + ':man_frowning_medium_dark_skin_tone:' => '🙍🏾‍♂️', + ':man_frowning_medium_light_skin_tone:' => '🙍🏼‍♂️', + ':man_frowning_medium_skin_tone:' => '🙍🏽‍♂️', + ':man_gesturing_no_dark_skin_tone:' => '🙅🏿‍♂️', + ':man_gesturing_no_light_skin_tone:' => '🙅🏻‍♂️', + ':man_gesturing_no_medium_dark_skin_tone:' => '🙅🏾‍♂️', + ':man_gesturing_no_medium_light_skin_tone:' => '🙅🏼‍♂️', + ':man_gesturing_no_medium_skin_tone:' => '🙅🏽‍♂️', + ':man_gesturing_ok_dark_skin_tone:' => '🙆🏿‍♂️', + ':man_gesturing_ok_light_skin_tone:' => '🙆🏻‍♂️', + ':man_gesturing_ok_medium_dark_skin_tone:' => '🙆🏾‍♂️', + ':man_gesturing_ok_medium_light_skin_tone:' => '🙆🏼‍♂️', + ':man_gesturing_ok_medium_skin_tone:' => '🙆🏽‍♂️', + ':man_getting_haircut_dark_skin_tone:' => '💇🏿‍♂️', + ':man_getting_haircut_light_skin_tone:' => '💇🏻‍♂️', + ':man_getting_haircut_medium_dark_skin_tone:' => '💇🏾‍♂️', + ':man_getting_haircut_medium_light_skin_tone:' => '💇🏼‍♂️', + ':man_getting_haircut_medium_skin_tone:' => '💇🏽‍♂️', + ':man_getting_massage_dark_skin_tone:' => '💆🏿‍♂️', + ':man_getting_massage_light_skin_tone:' => '💆🏻‍♂️', + ':man_getting_massage_medium_dark_skin_tone:' => '💆🏾‍♂️', + ':man_getting_massage_medium_light_skin_tone:' => '💆🏼‍♂️', + ':man_getting_massage_medium_skin_tone:' => '💆🏽‍♂️', + ':man_golfing:' => '🏌️‍♂️', + ':man_golfing_dark_skin_tone:' => '🏌🏿‍♂️', + ':man_golfing_light_skin_tone:' => '🏌🏻‍♂️', + ':man_golfing_medium_dark_skin_tone:' => '🏌🏾‍♂️', + ':man_golfing_medium_light_skin_tone:' => '🏌🏼‍♂️', + ':man_golfing_medium_skin_tone:' => '🏌🏽‍♂️', + ':man_guard_dark_skin_tone:' => '💂🏿‍♂️', + ':man_guard_light_skin_tone:' => '💂🏻‍♂️', + ':man_guard_medium_dark_skin_tone:' => '💂🏾‍♂️', + ':man_guard_medium_light_skin_tone:' => '💂🏼‍♂️', + ':man_guard_medium_skin_tone:' => '💂🏽‍♂️', + ':man_health_worker_dark_skin_tone:' => '👨🏿‍⚕️', + ':man_health_worker_light_skin_tone:' => '👨🏻‍⚕️', + ':man_health_worker_medium_dark_skin_tone:' => '👨🏾‍⚕️', + ':man_health_worker_medium_light_skin_tone:' => '👨🏼‍⚕️', + ':man_health_worker_medium_skin_tone:' => '👨🏽‍⚕️', + ':man_in_lotus_position_dark_skin_tone:' => '🧘🏿‍♂️', + ':man_in_lotus_position_light_skin_tone:' => '🧘🏻‍♂️', + ':man_in_lotus_position_medium_dark_skin_tone:' => '🧘🏾‍♂️', + ':man_in_lotus_position_medium_light_skin_tone:' => '🧘🏼‍♂️', + ':man_in_lotus_position_medium_skin_tone:' => '🧘🏽‍♂️', + ':man_in_steamy_room_dark_skin_tone:' => '🧖🏿‍♂️', + ':man_in_steamy_room_light_skin_tone:' => '🧖🏻‍♂️', + ':man_in_steamy_room_medium_dark_skin_tone:' => '🧖🏾‍♂️', + ':man_in_steamy_room_medium_light_skin_tone:' => '🧖🏼‍♂️', + ':man_in_steamy_room_medium_skin_tone:' => '🧖🏽‍♂️', + ':man_in_tuxedo_dark_skin_tone:' => '🤵🏿‍♂️', + ':man_in_tuxedo_light_skin_tone:' => '🤵🏻‍♂️', + ':man_in_tuxedo_medium_dark_skin_tone:' => '🤵🏾‍♂️', + ':man_in_tuxedo_medium_light_skin_tone:' => '🤵🏼‍♂️', + ':man_in_tuxedo_medium_skin_tone:' => '🤵🏽‍♂️', + ':man_judge_dark_skin_tone:' => '👨🏿‍⚖️', + ':man_judge_light_skin_tone:' => '👨🏻‍⚖️', + ':man_judge_medium_dark_skin_tone:' => '👨🏾‍⚖️', + ':man_judge_medium_light_skin_tone:' => '👨🏼‍⚖️', + ':man_judge_medium_skin_tone:' => '👨🏽‍⚖️', + ':man_juggling_dark_skin_tone:' => '🤹🏿‍♂️', + ':man_juggling_light_skin_tone:' => '🤹🏻‍♂️', + ':man_juggling_medium_dark_skin_tone:' => '🤹🏾‍♂️', + ':man_juggling_medium_light_skin_tone:' => '🤹🏼‍♂️', + ':man_juggling_medium_skin_tone:' => '🤹🏽‍♂️', + ':man_kneeling_dark_skin_tone:' => '🧎🏿‍♂️', + ':man_kneeling_light_skin_tone:' => '🧎🏻‍♂️', + ':man_kneeling_medium_dark_skin_tone:' => '🧎🏾‍♂️', + ':man_kneeling_medium_light_skin_tone:' => '🧎🏼‍♂️', + ':man_kneeling_medium_skin_tone:' => '🧎🏽‍♂️', + ':man_lifting_weights:' => '🏋️‍♂️', + ':man_lifting_weights_dark_skin_tone:' => '🏋🏿‍♂️', + ':man_lifting_weights_light_skin_tone:' => '🏋🏻‍♂️', + ':man_lifting_weights_medium_dark_skin_tone:' => '🏋🏾‍♂️', + ':man_lifting_weights_medium_light_skin_tone:' => '🏋🏼‍♂️', + ':man_lifting_weights_medium_skin_tone:' => '🏋🏽‍♂️', + ':man_light_skin_tone_beard:' => '🧔🏻‍♂️', + ':man_light_skin_tone_blond_hair:' => '👱🏻‍♂️', + ':man_mage_dark_skin_tone:' => '🧙🏿‍♂️', + ':man_mage_light_skin_tone:' => '🧙🏻‍♂️', + ':man_mage_medium_dark_skin_tone:' => '🧙🏾‍♂️', + ':man_mage_medium_light_skin_tone:' => '🧙🏼‍♂️', + ':man_mage_medium_skin_tone:' => '🧙🏽‍♂️', + ':man_medium_dark_skin_tone_beard:' => '🧔🏾‍♂️', + ':man_medium_dark_skin_tone_blond_hair:' => '👱🏾‍♂️', + ':man_medium_light_skin_tone_beard:' => '🧔🏼‍♂️', + ':man_medium_light_skin_tone_blond_hair:' => '👱🏼‍♂️', + ':man_medium_skin_tone_beard:' => '🧔🏽‍♂️', + ':man_medium_skin_tone_blond_hair:' => '👱🏽‍♂️', + ':man_mountain_biking_dark_skin_tone:' => '🚵🏿‍♂️', + ':man_mountain_biking_light_skin_tone:' => '🚵🏻‍♂️', + ':man_mountain_biking_medium_dark_skin_tone:' => '🚵🏾‍♂️', + ':man_mountain_biking_medium_light_skin_tone:' => '🚵🏼‍♂️', + ':man_mountain_biking_medium_skin_tone:' => '🚵🏽‍♂️', + ':man_pilot_dark_skin_tone:' => '👨🏿‍✈️', + ':man_pilot_light_skin_tone:' => '👨🏻‍✈️', + ':man_pilot_medium_dark_skin_tone:' => '👨🏾‍✈️', + ':man_pilot_medium_light_skin_tone:' => '👨🏼‍✈️', + ':man_pilot_medium_skin_tone:' => '👨🏽‍✈️', + ':man_playing_handball_dark_skin_tone:' => '🤾🏿‍♂️', + ':man_playing_handball_light_skin_tone:' => '🤾🏻‍♂️', + ':man_playing_handball_medium_dark_skin_tone:' => '🤾🏾‍♂️', + ':man_playing_handball_medium_light_skin_tone:' => '🤾🏼‍♂️', + ':man_playing_handball_medium_skin_tone:' => '🤾🏽‍♂️', + ':man_playing_water_polo_dark_skin_tone:' => '🤽🏿‍♂️', + ':man_playing_water_polo_light_skin_tone:' => '🤽🏻‍♂️', + ':man_playing_water_polo_medium_dark_skin_tone:' => '🤽🏾‍♂️', + ':man_playing_water_polo_medium_light_skin_tone:' => '🤽🏼‍♂️', + ':man_playing_water_polo_medium_skin_tone:' => '🤽🏽‍♂️', + ':man_police_officer_dark_skin_tone:' => '👮🏿‍♂️', + ':man_police_officer_light_skin_tone:' => '👮🏻‍♂️', + ':man_police_officer_medium_dark_skin_tone:' => '👮🏾‍♂️', + ':man_police_officer_medium_light_skin_tone:' => '👮🏼‍♂️', + ':man_police_officer_medium_skin_tone:' => '👮🏽‍♂️', + ':man_pouting_dark_skin_tone:' => '🙎🏿‍♂️', + ':man_pouting_light_skin_tone:' => '🙎🏻‍♂️', + ':man_pouting_medium_dark_skin_tone:' => '🙎🏾‍♂️', + ':man_pouting_medium_light_skin_tone:' => '🙎🏼‍♂️', + ':man_pouting_medium_skin_tone:' => '🙎🏽‍♂️', + ':man_raising_hand_dark_skin_tone:' => '🙋🏿‍♂️', + ':man_raising_hand_light_skin_tone:' => '🙋🏻‍♂️', + ':man_raising_hand_medium_dark_skin_tone:' => '🙋🏾‍♂️', + ':man_raising_hand_medium_light_skin_tone:' => '🙋🏼‍♂️', + ':man_raising_hand_medium_skin_tone:' => '🙋🏽‍♂️', + ':man_rowing_boat_dark_skin_tone:' => '🚣🏿‍♂️', + ':man_rowing_boat_light_skin_tone:' => '🚣🏻‍♂️', + ':man_rowing_boat_medium_dark_skin_tone:' => '🚣🏾‍♂️', + ':man_rowing_boat_medium_light_skin_tone:' => '🚣🏼‍♂️', + ':man_rowing_boat_medium_skin_tone:' => '🚣🏽‍♂️', + ':man_running_dark_skin_tone:' => '🏃🏿‍♂️', + ':man_running_light_skin_tone:' => '🏃🏻‍♂️', + ':man_running_medium_dark_skin_tone:' => '🏃🏾‍♂️', + ':man_running_medium_light_skin_tone:' => '🏃🏼‍♂️', + ':man_running_medium_skin_tone:' => '🏃🏽‍♂️', + ':man_shrugging_dark_skin_tone:' => '🤷🏿‍♂️', + ':man_shrugging_light_skin_tone:' => '🤷🏻‍♂️', + ':man_shrugging_medium_dark_skin_tone:' => '🤷🏾‍♂️', + ':man_shrugging_medium_light_skin_tone:' => '🤷🏼‍♂️', + ':man_shrugging_medium_skin_tone:' => '🤷🏽‍♂️', + ':man_standing_dark_skin_tone:' => '🧍🏿‍♂️', + ':man_standing_light_skin_tone:' => '🧍🏻‍♂️', + ':man_standing_medium_dark_skin_tone:' => '🧍🏾‍♂️', + ':man_standing_medium_light_skin_tone:' => '🧍🏼‍♂️', + ':man_standing_medium_skin_tone:' => '🧍🏽‍♂️', + ':man_superhero_dark_skin_tone:' => '🦸🏿‍♂️', + ':man_superhero_light_skin_tone:' => '🦸🏻‍♂️', + ':man_superhero_medium_dark_skin_tone:' => '🦸🏾‍♂️', + ':man_superhero_medium_light_skin_tone:' => '🦸🏼‍♂️', + ':man_superhero_medium_skin_tone:' => '🦸🏽‍♂️', + ':man_supervillain_dark_skin_tone:' => '🦹🏿‍♂️', + ':man_supervillain_light_skin_tone:' => '🦹🏻‍♂️', + ':man_supervillain_medium_dark_skin_tone:' => '🦹🏾‍♂️', + ':man_supervillain_medium_light_skin_tone:' => '🦹🏼‍♂️', + ':man_supervillain_medium_skin_tone:' => '🦹🏽‍♂️', + ':man_surfing_dark_skin_tone:' => '🏄🏿‍♂️', + ':man_surfing_light_skin_tone:' => '🏄🏻‍♂️', + ':man_surfing_medium_dark_skin_tone:' => '🏄🏾‍♂️', + ':man_surfing_medium_light_skin_tone:' => '🏄🏼‍♂️', + ':man_surfing_medium_skin_tone:' => '🏄🏽‍♂️', + ':man_swimming_dark_skin_tone:' => '🏊🏿‍♂️', + ':man_swimming_light_skin_tone:' => '🏊🏻‍♂️', + ':man_swimming_medium_dark_skin_tone:' => '🏊🏾‍♂️', + ':man_swimming_medium_light_skin_tone:' => '🏊🏼‍♂️', + ':man_swimming_medium_skin_tone:' => '🏊🏽‍♂️', + ':man_tipping_hand_dark_skin_tone:' => '💁🏿‍♂️', + ':man_tipping_hand_light_skin_tone:' => '💁🏻‍♂️', + ':man_tipping_hand_medium_dark_skin_tone:' => '💁🏾‍♂️', + ':man_tipping_hand_medium_light_skin_tone:' => '💁🏼‍♂️', + ':man_tipping_hand_medium_skin_tone:' => '💁🏽‍♂️', + ':man_vampire_dark_skin_tone:' => '🧛🏿‍♂️', + ':man_vampire_light_skin_tone:' => '🧛🏻‍♂️', + ':man_vampire_medium_dark_skin_tone:' => '🧛🏾‍♂️', + ':man_vampire_medium_light_skin_tone:' => '🧛🏼‍♂️', + 10000 ':man_vampire_medium_skin_tone:' => '🧛🏽‍♂️', + ':man_walking_dark_skin_tone:' => '🚶🏿‍♂️', + ':man_walking_light_skin_tone:' => '🚶🏻‍♂️', + ':man_walking_medium_dark_skin_tone:' => '🚶🏾‍♂️', + ':man_walking_medium_light_skin_tone:' => '🚶🏼‍♂️', + ':man_walking_medium_skin_tone:' => '🚶🏽‍♂️', + ':man_wearing_turban_dark_skin_tone:' => '👳🏿‍♂️', + ':man_wearing_turban_light_skin_tone:' => '👳🏻‍♂️', + ':man_wearing_turban_medium_dark_skin_tone:' => '👳🏾‍♂️', + ':man_wearing_turban_medium_light_skin_tone:' => '👳🏼‍♂️', + ':man_wearing_turban_medium_skin_tone:' => '👳🏽‍♂️', + ':man_with_veil_dark_skin_tone:' => '👰🏿‍♂️', + ':man_with_veil_light_skin_tone:' => '👰🏻‍♂️', + ':man_with_veil_medium_dark_skin_tone:' => '👰🏾‍♂️', + ':man_with_veil_medium_light_skin_tone:' => '👰🏼‍♂️', + ':man_with_veil_medium_skin_tone:' => '👰🏽‍♂️', + ':mermaid_dark_skin_tone:' => '🧜🏿‍♀️', + ':mermaid_light_skin_tone:' => '🧜🏻‍♀️', + ':mermaid_medium_dark_skin_tone:' => '🧜🏾‍♀️', + ':mermaid_medium_light_skin_tone:' => '🧜🏼‍♀️', + ':mermaid_medium_skin_tone:' => '🧜🏽‍♀️', + ':merman_dark_skin_tone:' => '🧜🏿‍♂️', + ':merman_light_skin_tone:' => '🧜🏻‍♂️', + ':merman_medium_dark_skin_tone:' => '🧜🏾‍♂️', + ':merman_medium_light_skin_tone:' => '🧜🏼‍♂️', + ':merman_medium_skin_tone:' => '🧜🏽‍♂️', + ':people_holding_hands:' => '🧑‍🤝‍🧑', + ':person_kneeling_facing_right_dark_skin_tone:' => '🧎🏿‍➡️', + ':person_kneeling_facing_right_light_skin_tone:' => '🧎🏻‍➡️', + ':person_kneeling_facing_right_medium_dark_skin_tone:' => '🧎🏾‍➡️', + ':person_kneeling_facing_right_medium_light_skin_tone:' => '🧎🏼‍➡️', + ':person_kneeling_facing_right_medium_skin_tone:' => '🧎🏽‍➡️', + ':person_running_facing_right_dark_skin_tone:' => '🏃🏿‍➡️', + ':person_running_facing_right_light_skin_tone:' => '🏃🏻‍➡️', + ':person_running_facing_right_medium_dark_skin_tone:' => '🏃🏾‍➡️', + ':person_running_facing_right_medium_light_skin_tone:' => '🏃🏼‍➡️', + ':person_running_facing_right_medium_skin_tone:' => '🏃🏽‍➡️', + ':person_walking_facing_right_dark_skin_tone:' => '🚶🏿‍➡️', + ':person_walking_facing_right_light_skin_tone:' => '🚶🏻‍➡️', + ':person_walking_facing_right_medium_dark_skin_tone:' => '🚶🏾‍➡️', + ':person_walking_facing_right_medium_light_skin_tone:' => '🚶🏼‍➡️', + ':person_walking_facing_right_medium_skin_tone:' => '🚶🏽‍➡️', + ':pilot_dark_skin_tone:' => '🧑🏿‍✈️', + ':pilot_light_skin_tone:' => '🧑🏻‍✈️', + ':pilot_medium_dark_skin_tone:' => '🧑🏾‍✈️', + ':pilot_medium_light_skin_tone:' => '🧑🏼‍✈️', + ':pilot_medium_skin_tone:' => '🧑🏽‍✈️', + ':transgender_flag:' => '🏳️‍⚧️', + ':woman_biking_dark_skin_tone:' => '🚴🏿‍♀️', + ':woman_biking_light_skin_tone:' => '🚴🏻‍♀️', + ':woman_biking_medium_dark_skin_tone:' => '🚴🏾‍♀️', + ':woman_biking_medium_light_skin_tone:' => '🚴🏼‍♀️', + ':woman_biking_medium_skin_tone:' => '🚴🏽‍♀️', + ':woman_bouncing_ball:' => '⛹️‍♀️', + ':woman_bouncing_ball_dark_skin_tone:' => '⛹🏿‍♀️', + ':woman_bouncing_ball_light_skin_tone:' => '⛹🏻‍♀️', + ':woman_bouncing_ball_medium_dark_skin_tone:' => '⛹🏾‍♀️', + ':woman_bouncing_ball_medium_light_skin_tone:' => '⛹🏼‍♀️', + ':woman_bouncing_ball_medium_skin_tone:' => '⛹🏽‍♀️', + ':woman_bowing_dark_skin_tone:' => '🙇🏿‍♀️', + ':woman_bowing_light_skin_tone:' => '🙇🏻‍♀️', + ':woman_bowing_medium_dark_skin_tone:' => '🙇🏾‍♀️', + ':woman_bowing_medium_light_skin_tone:' => '🙇🏼‍♀️', + ':woman_bowing_medium_skin_tone:' => '🙇🏽‍♀️', + ':woman_cartwheeling_dark_skin_tone:' => '🤸🏿‍♀️', + ':woman_cartwheeling_light_skin_tone:' => '🤸🏻‍♀️', + ':woman_cartwheeling_medium_dark_skin_tone:' => '🤸🏾‍♀️', + ':woman_cartwheeling_medium_light_skin_tone:' => '🤸🏼‍♀️', + ':woman_cartwheeling_medium_skin_tone:' => '🤸🏽‍♀️', + ':woman_climbing_dark_skin_tone:' => '🧗🏿‍♀️', + ':woman_climbing_light_skin_tone:' => '🧗🏻‍♀️', + ':woman_climbing_medium_dark_skin_tone:' => '🧗🏾‍♀️', + ':woman_climbing_medium_light_skin_tone:' => '🧗🏼‍♀️', + ':woman_climbing_medium_skin_tone:' => '🧗🏽‍♀️', + ':woman_construction_worker_dark_skin_tone:' => '👷🏿‍♀️', + ':woman_construction_worker_light_skin_tone:' => '👷🏻‍♀️', + ':woman_construction_worker_medium_dark_skin_tone:' => '👷🏾‍♀️', + ':woman_construction_worker_medium_light_skin_tone:' => '👷🏼‍♀️', + ':woman_construction_worker_medium_skin_tone:' => '👷🏽‍♀️', + ':woman_dark_skin_tone_beard:' => '🧔🏿‍♀️', + ':woman_dark_skin_tone_blond_hair:' => '👱🏿‍♀️', + ':woman_detective:' => '🕵️‍♀️', + ':woman_detective_dark_skin_tone:' => '🕵🏿‍♀️', + ':woman_detective_light_skin_tone:' => '🕵🏻‍♀️', + ':woman_detective_medium_dark_skin_tone:' => '🕵🏾‍♀️', + ':woman_detective_medium_light_skin_tone:' => '🕵🏼‍♀️', + ':woman_detective_medium_skin_tone:' => '🕵🏽‍♀️', + ':woman_elf_dark_skin_tone:' => '🧝🏿‍♀️', + ':woman_elf_light_skin_tone:' => '🧝🏻‍♀️', + ':woman_elf_medium_dark_skin_tone:' => '🧝🏾‍♀️', + ':woman_elf_medium_light_skin_tone:' => '🧝🏼‍♀️', + ':woman_elf_medium_skin_tone:' => '🧝🏽‍♀️', + ':woman_facepalming_dark_skin_tone:' => '🤦🏿‍♀️', + ':woman_facepalming_light_skin_tone:' => '🤦🏻‍♀️', + ':woman_facepalming_medium_dark_skin_tone:' => '🤦🏾‍♀️', + ':woman_facepalming_medium_light_skin_tone:' => '🤦🏼‍♀️', + ':woman_facepalming_medium_skin_tone:' => '🤦🏽‍♀️', + ':woman_fairy_dark_skin_tone:' => '🧚🏿‍♀️', + ':woman_fairy_light_skin_tone:' => '🧚🏻‍♀️', + ':woman_fairy_medium_dark_skin_tone:' => '🧚🏾‍♀️', + ':woman_fairy_medium_light_skin_tone:' => '🧚🏼‍♀️', + ':woman_fairy_medium_skin_tone:' => '🧚🏽‍♀️', + ':woman_frowning_dark_skin_tone:' => '🙍🏿‍♀️', + ':woman_frowning_light_skin_tone:' => '🙍🏻‍♀️', + ':woman_frowning_medium_dark_skin_tone:' => '🙍🏾‍♀️', + ':woman_frowning_medium_light_skin_tone:' => '🙍🏼‍♀️', + ':woman_frowning_medium_skin_tone:' => '🙍🏽‍♀️', + ':woman_gesturing_no_dark_skin_tone:' => '🙅🏿‍♀️', + ':woman_gesturing_no_light_skin_tone:' => '🙅🏻‍♀️', + ':woman_gesturing_no_medium_dark_skin_tone:' => '🙅🏾‍♀️', + ':woman_gesturing_no_medium_light_skin_tone:' => '🙅🏼‍♀️', + ':woman_gesturing_no_medium_skin_tone:' => '🙅🏽‍♀️', + ':woman_gesturing_ok_dark_skin_tone:' => '🙆🏿‍♀️', + ':woman_gesturing_ok_light_skin_tone:' => '🙆🏻‍♀️', + ':woman_gesturing_ok_medium_dark_skin_tone:' => '🙆🏾‍♀️', + ':woman_gesturing_ok_medium_light_skin_tone:' => '🙆🏼‍♀️', + ':woman_gesturing_ok_medium_skin_tone:' => '🙆🏽‍♀️', + ':woman_getting_haircut_dark_skin_tone:' => '💇🏿‍♀️', + ':woman_getting_haircut_light_skin_tone:' => '💇🏻‍♀️', + ':woman_getting_haircut_medium_dark_skin_tone:' => '💇🏾‍♀️', + ':woman_getting_haircut_medium_light_skin_tone:' => '💇🏼‍♀️', + ':woman_getting_haircut_medium_skin_tone:' => '💇🏽‍♀️', + ':woman_getting_massage_dark_skin_tone:' => '💆🏿‍♀️', + ':woman_getting_massage_light_skin_tone:' => '💆🏻‍♀️', + ':woman_getting_massage_medium_dark_skin_tone:' => '💆🏾‍♀️', + ':woman_getting_massage_medium_light_skin_tone:' => '💆🏼‍♀️', + ':woman_getting_massage_medium_skin_tone:' => '💆🏽‍♀️', + ':woman_golfing:' => '🏌️‍♀️', + ':woman_golfing_dark_skin_tone:' => '🏌🏿‍♀️', + ':woman_golfing_light_skin_tone:' => '🏌🏻‍♀️', + ':woman_golfing_medium_dark_skin_tone:' => '🏌🏾‍♀️', + ':woman_golfing_medium_light_skin_tone:' => '🏌🏼‍♀️', + ':woman_golfing_medium_skin_tone:' => '🏌🏽‍♀️', + ':woman_guard_dark_skin_tone:' => '💂🏿‍♀️', + ':woman_guard_light_skin_tone:' => '💂🏻‍♀️', + ':woman_guard_medium_dark_skin_tone:' => '💂🏾‍♀️', + ':woman_guard_medium_light_skin_tone:' => '💂🏼‍♀️', + ':woman_guard_medium_skin_tone:' => '💂🏽‍♀️', + ':woman_health_worker_dark_skin_tone:' => '👩🏿‍⚕️', + ':woman_health_worker_light_skin_tone:' => '👩🏻‍⚕️', + ':woman_health_worker_medium_dark_skin_tone:' => '👩🏾‍⚕️', + ':woman_health_worker_medium_light_skin_tone:' => '👩🏼‍⚕️', + ':woman_health_worker_medium_skin_tone:' => '👩🏽‍⚕️', + ':woman_in_lotus_position_dark_skin_tone:' => '🧘🏿‍♀️', + ':woman_in_lotus_position_light_skin_tone:' => '🧘🏻‍♀️', + ':woman_in_lotus_position_medium_dark_skin_tone:' => '🧘🏾‍♀️', + ':woman_in_lotus_position_medium_light_skin_tone:' => '🧘🏼‍♀️', + ':woman_in_lotus_position_medium_skin_tone:' => '🧘🏽‍♀️', + ':woman_in_steamy_room_dark_skin_tone:' => '🧖🏿‍♀️', + ':woman_in_steamy_room_light_skin_tone:' => '🧖🏻‍♀️', + ':woman_in_steamy_room_medium_dark_skin_tone:' => '🧖🏾‍♀️', + ':woman_in_steamy_room_medium_light_skin_tone:' => '🧖🏼‍♀️', + ':woman_in_steamy_room_medium_skin_tone:' => '🧖🏽‍♀️', + ':woman_in_tuxedo_dark_skin_tone:' => '🤵🏿‍♀️', + ':woman_in_tuxedo_light_skin_tone:' => '🤵🏻‍♀️', + ':woman_in_tuxedo_medium_dark_skin_tone:' => '🤵🏾‍♀️', + ':woman_in_tuxedo_medium_light_skin_tone:' => '🤵🏼‍♀️', + ':woman_in_tuxedo_medium_skin_tone:' => '🤵🏽‍♀️', + ':woman_judge_dark_skin_tone:' => '👩🏿‍⚖️', + ':woman_judge_light_skin_tone:' => '👩🏻‍⚖️', + ':woman_judge_medium_dark_skin_tone:' => '👩🏾‍⚖️', + ':woman_judge_medium_light_skin_tone:' => '👩🏼‍⚖️', + ':woman_judge_medium_skin_tone:' => '👩🏽‍⚖️', + ':woman_juggling_dark_skin_tone:' => '🤹🏿‍♀️', + ':woman_juggling_light_skin_tone:' => '🤹🏻‍♀️', + ':woman_juggling_medium_dark_skin_tone:' => '🤹🏾‍♀️', + ':woman_juggling_medium_light_skin_tone:' => '🤹🏼‍♀️', + ':woman_juggling_medium_skin_tone:' => '🤹🏽‍♀️', + ':woman_kneeling_dark_skin_tone:' => '🧎🏿‍♀️', + ':woman_kneeling_light_skin_tone:' => '🧎🏻‍♀️', + ':woman_kneeling_medium_dark_skin_tone:' => '🧎🏾‍♀️', + ':woman_kneeling_medium_light_skin_tone:' => '🧎🏼‍♀️', + ':woman_kneeling_medium_skin_tone:' => '🧎🏽‍♀️', + ':woman_lifting_weights:' => '🏋️‍♀️', + ':woman_lifting_weights_dark_skin_tone:' => '🏋🏿‍♀️', + ':woman_lifting_weights_light_skin_tone:' => '🏋🏻‍♀️', + ':woman_lifting_weights_medium_dark_skin_tone:' => '🏋🏾‍♀️', + ':woman_lifting_weights_medium_light_skin_tone:' => '🏋🏼‍♀️', + ':woman_lifting_weights_medium_skin_tone:' => '🏋🏽‍♀️', + ':woman_light_skin_tone_beard:' => '🧔🏻‍♀️', + ':woman_light_skin_tone_blond_hair:' => '👱🏻‍♀️', + ':woman_mage_dark_skin_tone:' => '🧙🏿‍♀️', + ':woman_mage_light_skin_tone:' => '🧙🏻‍♀️', + ':woman_mage_medium_dark_skin_tone:' => '🧙🏾‍♀️', + ':woman_mage_medium_light_skin_tone:' => '🧙🏼‍♀️', + ':woman_mage_medium_skin_tone:' => '🧙🏽‍♀️', + ':woman_medium_dark_skin_tone_beard:' => '🧔🏾‍♀️', + ':woman_medium_dark_skin_tone_blond_hair:' => '👱🏾‍♀️', + ':woman_medium_light_skin_tone_beard:' => '🧔🏼‍♀️', + ':woman_medium_light_skin_tone_blond_hair:' => '👱🏼‍♀️', + ':woman_medium_skin_tone_beard:' => '🧔🏽‍♀️', + ':woman_medium_skin_tone_blond_hair:' => '👱🏽‍♀️', + ':woman_mountain_biking_dark_skin_tone:' => '🚵🏿‍♀️', + ':woman_mountain_biking_light_skin_tone:' => '🚵🏻‍♀️', + ':woman_mountain_biking_medium_dark_skin_tone:' => '🚵🏾‍♀️', + ':woman_mountain_biking_medium_light_skin_tone:' => '🚵🏼‍♀️', + ':woman_mountain_biking_medium_skin_tone:' => '🚵🏽‍♀️', + ':woman_pilot_dark_skin_tone:' => '👩🏿‍✈️', + ':woman_pilot_light_skin_tone:' => '👩🏻‍✈️', + ':woman_pilot_medium_dark_skin_tone:' => '👩🏾‍✈️', + ':woman_pilot_medium_light_skin_tone:' => '👩🏼‍✈️', + ':woman_pilot_medium_skin_tone:' => '👩🏽‍✈️', + ':woman_playing_handball_dark_skin_tone:' => '🤾🏿‍♀️', + ':woman_playing_handball_light_skin_tone:' => '🤾🏻‍♀️', + ':woman_playing_handball_medium_dark_skin_tone:' => '🤾🏾‍♀️', + ':woman_playing_handball_medium_light_skin_tone:' => '🤾🏼‍♀️', + ':woman_playing_handball_medium_skin_tone:' => '🤾🏽‍♀️', + ':woman_playing_water_polo_dark_skin_tone:' => '🤽🏿‍♀️', + ':woman_playing_water_polo_light_skin_tone:' => '🤽🏻‍♀️', + ':woman_playing_water_polo_medium_dark_skin_tone:' => '🤽🏾‍♀️', + ':woman_playing_water_polo_medium_light_skin_tone:' => '🤽🏼‍♀️', + ':woman_playing_water_polo_medium_skin_tone:' => '🤽🏽‍♀️', + ':woman_police_officer_dark_skin_tone:' => '👮🏿‍♀️', + ':woman_police_officer_light_skin_tone:' => '👮🏻‍♀️', + ':woman_police_officer_medium_dark_skin_tone:' => '👮🏾‍♀️', + ':woman_police_officer_medium_light_skin_tone:' => '👮🏼‍♀️', + ':woman_police_officer_medium_skin_tone:' => '👮🏽‍♀️', + ':woman_pouting_dark_skin_tone:' => '🙎🏿‍♀️', + ':woman_pouting_light_skin_tone:' => '🙎🏻‍♀️', + ':woman_pouting_medium_dark_skin_tone:' => '🙎🏾‍♀️', + ':woman_pouting_medium_light_skin_tone:' => '🙎🏼‍♀️', + ':woman_pouting_medium_skin_tone:' => '🙎🏽‍♀️', + ':woman_raising_hand_dark_skin_tone:' => '🙋🏿‍♀️', + ':woman_raising_hand_light_skin_tone:' => '🙋🏻‍♀️', + ':woman_raising_hand_medium_dark_skin_tone:' => '🙋🏾‍♀️', + ':woman_raising_hand_medium_light_skin_tone:' => '🙋🏼‍♀️', + ':woman_raising_hand_medium_skin_tone:' => '🙋🏽‍♀️', + ':woman_rowing_boat_dark_skin_tone:' => '🚣🏿‍♀️', + ':woman_rowing_boat_light_skin_tone:' => '🚣🏻‍♀️', + ':woman_rowing_boat_medium_dark_skin_tone:' => '🚣🏾‍♀️', + ':woman_rowing_boat_medium_light_skin_tone:' => '🚣🏼‍♀️', + ':woman_rowing_boat_medium_skin_tone:' => '🚣🏽‍♀️', + ':woman_running_dark_skin_tone:' => '🏃🏿‍♀️', + ':woman_running_light_skin_tone:' => '🏃🏻‍♀️', + ':woman_running_medium_dark_skin_tone:' => '🏃🏾‍♀️', + ':woman_running_medium_light_skin_tone:' => '🏃🏼‍♀️', + ':woman_running_medium_skin_tone:' => '🏃🏽‍♀️', + ':woman_shrugging_dark_skin_tone:' => '🤷🏿‍♀️', + ':woman_shrugging_light_skin_tone:' => '🤷🏻‍♀️', + ':woman_shrugging_medium_dark_skin_tone:' => '🤷🏾‍♀️', + ':woman_shrugging_medium_light_skin_tone:' => '🤷🏼‍♀️', + ':woman_shrugging_medium_skin_tone:' => '🤷🏽‍♀️', + ':woman_standing_dark_skin_tone:' => '🧍🏿‍♀️', + ':woman_standing_light_skin_tone:' => '🧍🏻‍♀️', + ':woman_standing_medium_dark_skin_tone:' => '🧍🏾‍♀️', + ':woman_standing_medium_light_skin_tone:' => '🧍🏼‍♀️', + ':woman_standing_medium_skin_tone:' => '🧍🏽‍♀️', + ':woman_superhero_dark_skin_tone:' => '🦸🏿‍♀️', + ':woman_superhero_light_skin_tone:' => '🦸🏻‍♀️', + ':woman_superhero_medium_dark_skin_tone:' => '🦸🏾‍♀️', + ':woman_superhero_medium_light_skin_tone:' => '🦸🏼‍♀️', + ':woman_superhero_medium_skin_tone:' => '🦸🏽‍♀️', + ':woman_supervillain_dark_skin_tone:' => '🦹🏿‍♀️', + ':woman_supervillain_light_skin_tone:' => '🦹🏻‍♀️', + ':woman_supervillain_medium_dark_skin_tone:' => '🦹🏾‍♀️', + ':woman_supervillain_medium_light_skin_tone:' => '🦹🏼‍♀️', + ':woman_supervillain_medium_skin_tone:' => '🦹🏽‍♀️', + ':woman_surfing_dark_skin_tone:' => '🏄🏿‍♀️', + ':woman_surfing_light_skin_tone:' => '🏄🏻‍♀️', + ':woman_surfing_medium_dark_skin_tone:' => '🏄🏾‍♀️', + ':woman_surfing_medium_light_skin_tone:' => '🏄🏼‍♀️', + ':woman_surfing_medium_skin_tone:' => '🏄🏽‍♀️', + ':woman_swimming_dark_skin_tone:' => '🏊🏿‍♀️', + ':woman_swimming_light_skin_tone:' => '🏊🏻‍♀️', + ':woman_swimming_medium_dark_skin_tone:' => '🏊🏾‍♀️', + ':woman_swimming_medium_light_skin_tone:' => '🏊🏼‍♀️', + ':woman_swimming_medium_skin_tone:' => '🏊🏽‍♀️', + ':woman_tipping_hand_dark_skin_tone:' => '💁🏿‍♀️', + ':woman_tipping_hand_light_skin_tone:' => '💁🏻‍♀️', + ':woman_tipping_hand_medium_dark_skin_tone:' => '💁🏾‍♀️', + ':woman_tipping_hand_medium_light_skin_tone:' => '💁🏼‍♀️', + ':woman_tipping_hand_medium_skin_tone:' => '💁🏽‍♀️', + ':woman_vampire_dark_skin_tone:' => '🧛🏿‍♀️', + ':woman_vampire_light_skin_tone:' => '🧛🏻‍♀️', + ':woman_vampire_medium_dark_skin_tone:' => '🧛🏾‍♀️', + ':woman_vampire_medium_light_skin_tone:' => '🧛🏼‍♀️', + ':woman_vampire_medium_skin_tone:' => '🧛🏽‍♀️', + ':woman_walking_dark_skin_tone:' => '🚶🏿‍♀️', + ':woman_walking_light_skin_tone:' => '🚶🏻‍♀️', + ':woman_walking_medium_dark_skin_tone:' => '🚶🏾‍♀️', + ':woman_walking_medium_light_skin_tone:' => '🚶🏼‍♀️', + ':woman_walking_medium_skin_tone:' => '🚶🏽‍♀️', + ':woman_wearing_turban_dark_skin_tone:' => '👳🏿‍♀️', + ':woman_wearing_turban_light_skin_tone:' => '👳🏻‍♀️', + ':woman_wearing_turban_medium_dark_skin_tone:' => '👳🏾‍♀️', + ':woman_wearing_turban_medium_light_skin_tone:' => '👳🏼‍♀️', + ':woman_wearing_turban_medium_skin_tone:' => '👳🏽‍♀️', + ':woman_with_veil_dark_skin_tone:' => '👰🏿‍♀️', + ':woman_with_veil_light_skin_tone:' => '👰🏻‍♀️', + ':woman_with_veil_medium_dark_skin_tone:' => '👰🏾‍♀️', + ':woman_with_veil_medium_light_skin_tone:' => '👰🏼‍♀️', + ':woman_with_veil_medium_skin_tone:' => '👰🏽‍♀️', ':couple_mm:' => '👨‍❤️‍👨', + ':couple_with_heart_woman_man:' => '👩‍❤️‍👨', ':couple_ww:' => '👩‍❤️‍👩', + ':man_in_manual_wheelchair_facing_right:' => '👨‍🦽‍➡️', + ':man_in_motorized_wheelchair_facing_right:' => '👨‍🦼‍➡️', + ':man_with_white_cane_facing_right:' => '👨‍🦯‍➡️', + ':person_in_manual_wheelchair_facing_right:' => '🧑‍🦽‍➡️', + ':person_in_motorized_wheelchair_facing_right:' => '🧑‍🦼‍➡️', + ':person_with_white_cane_facing_right:' => '🧑‍🦯‍➡️', + ':woman_in_manual_wheelchair_facing_right:' => '👩‍🦽‍➡️', + ':woman_in_motorized_wheelchair_facing_right:' => '👩‍🦼‍➡️', + ':woman_with_white_cane_facing_right:' => '👩‍🦯‍➡️', + ':family_adult_adult_child_child:' => '🧑‍🧑‍🧒‍🧒', ':family_mmbb:' => '👨‍👨‍👦‍👦', ':family_mmgb:' => '👨‍👨‍👧‍👦', ':family_mmgg:' => '👨‍👨‍👧‍👧', @@ -2330,8 +3418,366 @@ ':family_wwbb:' => '👩‍👩‍👦‍👦', ':family_wwgb:' => '👩‍👩‍👧‍👦', ':family_wwgg:' => '👩‍👩‍👧‍👧', - ':couplekiss_mm:' => '👨‍❤️‍💋‍👨', - ':couplekiss_ww:' => '👩‍❤️‍💋‍👩', + ':flag_england:' => '🏴󠁧󠁢󠁥󠁮󠁧󠁿', + ':flag_scotland:' => '🏴󠁧󠁢󠁳󠁣󠁴󠁿', + ':flag_wales:' => '🏴󠁧󠁢󠁷󠁬󠁳󠁿', + ':man_in_manual_wheelchair_facing_right_dark_skin_tone:' => '👨🏿‍🦽‍➡️', + ':man_in_manual_wheelchair_facing_right_light_skin_tone:' => '👨🏻‍🦽‍➡️', + ':man_in_manual_wheelchair_facing_right_medium_dark_skin_tone:' => '👨🏾‍🦽‍➡️', + ':man_in_manual_wheelchair_facing_right_medium_light_skin_tone:' => '👨🏼‍🦽‍➡️', + ':man_in_manual_wheelchair_facing_right_medium_skin_tone:' => '👨🏽‍🦽‍➡️', + ':man_in_motorized_wheelchair_facing_right_dark_skin_tone:' => '👨🏿‍🦼‍➡️', + ':man_in_motorized_wheelchair_facing_right_light_skin_tone:' => '👨🏻‍🦼‍➡️', + ':man_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:' => '👨🏾‍🦼‍➡️', + ':man_in_motorized_wheelchair_facing_right_medium_light_skin_tone:' => '👨🏼‍🦼‍➡️', + ':man_in_motorized_wheelchair_facing_right_medium_skin_tone:' => '👨🏽‍🦼‍➡️', + ':man_kneeling_facing_right:' => '🧎‍♂️‍➡️', + ':man_running_facing_right:' => '🏃‍♂️‍➡️', + ':man_walking_facing_right:' => '🚶‍♂️‍➡️', + ':man_with_white_cane_facing_right_dark_skin_tone:' => '👨🏿‍🦯‍➡️', + ':man_with_white_cane_facing_right_light_skin_tone:' => '👨🏻‍🦯‍➡️', + ':man_with_white_cane_facing_right_medium_dark_skin_tone:' => '👨🏾‍🦯‍➡️', + ':man_with_white_cane_facing_right_medium_light_skin_tone:' => '👨🏼‍🦯‍➡️', + ':man_with_white_cane_facing_right_medium_skin_tone:' => '👨🏽‍🦯‍➡️', + ':men_holding_hands_dark_skin_tone_light_skin_tone:' => '👨🏿‍🤝‍👨🏻', + ':men_holding_hands_dark_skin_tone_medium_dark_skin_tone:' => '👨🏿‍🤝‍👨🏾', + ':men_holding_hands_dark_skin_tone_medium_light_skin_tone:' => '👨🏿‍🤝‍👨🏼', + ':men_holding_hands_dark_skin_tone_medium_skin_tone:' => '👨🏿‍🤝‍👨🏽', + ':men_holding_hands_light_skin_tone_dark_skin_tone:' => '👨🏻‍🤝‍👨🏿', + ':men_holding_hands_light_skin_tone_medium_dark_skin_tone:' => '👨🏻‍🤝‍👨🏾', + ':men_holding_hands_light_skin_tone_medium_light_skin_tone:' => '👨🏻‍🤝‍👨🏼', + ':men_holding_hands_light_skin_tone_medium_skin_tone:' => '👨🏻‍🤝‍👨🏽', + ':men_holding_hands_medium_dark_skin_tone_dark_skin_tone:' => '👨🏾‍🤝‍👨🏿', + ':men_holding_hands_medium_dark_skin_tone_light_skin_tone:' => '👨🏾‍🤝‍👨🏻', + ':men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:' => '👨🏾‍🤝‍👨🏼', + ':men_holding_hands_medium_dark_skin_tone_medium_skin_tone:' => '👨🏾‍🤝‍👨🏽', + ':men_holding_hands_medium_light_skin_tone_dark_skin_tone:' => '👨🏼‍🤝‍👨🏿', + ':men_holding_hands_medium_light_skin_tone_light_skin_tone:' => '👨🏼‍🤝‍👨🏻', + ':men_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:' => '👨🏼‍🤝‍👨🏾', + ':men_holding_hands_medium_light_skin_tone_medium_skin_tone:' => '👨🏼‍🤝‍👨🏽', + ':men_holding_hands_medium_skin_tone_dark_skin_tone:' => '👨🏽‍🤝‍👨🏿', + ':men_holding_hands_medium_skin_tone_light_skin_tone:' => '👨🏽‍🤝‍👨🏻', + ':men_holding_hands_medium_skin_tone_medium_dark_skin_tone:' => '👨🏽‍🤝‍👨🏾', + ':men_holding_hands_medium_skin_tone_medium_light_skin_tone:' => '👨🏽‍🤝‍👨🏼', + ':people_holding_hands_dark_skin_tone:' => '🧑🏿‍🤝‍🧑🏿', + ':people_holding_hands_dark_skin_tone_light_skin_tone:' => '🧑🏿‍🤝‍🧑🏻', + ':people_holding_hands_dark_skin_tone_medium_dark_skin_tone:' => '🧑🏿‍🤝‍🧑🏾', + ':people_holding_hands_dark_skin_tone_medium_light_skin_tone:' => '🧑🏿‍🤝‍🧑🏼', + ':people_holding_hands_dark_skin_tone_medium_skin_tone:' => '🧑🏿‍🤝‍🧑🏽', + ':people_holding_hands_light_skin_tone:' => '🧑🏻‍🤝‍🧑🏻', + ':people_holding_hands_light_skin_tone_dark_skin_tone:' => '🧑🏻‍🤝‍🧑🏿', + ':people_holding_hands_light_skin_tone_medium_dark_skin_tone:' => '🧑🏻‍🤝‍🧑🏾', + ':people_holding_hands_light_skin_tone_medium_light_skin_tone:' => '🧑🏻‍🤝‍🧑🏼', + ':people_holding_hands_light_skin_tone_medium_skin_tone:' => '🧑🏻‍🤝‍🧑🏽', + ':people_holding_hands_medium_dark_skin_tone:' => '🧑🏾‍🤝‍🧑🏾', + ':people_holding_hands_medium_dark_skin_tone_dark_skin_tone:' => '🧑🏾‍🤝‍🧑🏿', + ':people_holding_hands_medium_dark_skin_tone_light_skin_tone:' => '🧑🏾‍🤝‍🧑🏻', + ':people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:' => '🧑🏾‍🤝‍🧑🏼', + ':people_holding_hands_medium_dark_skin_tone_medium_skin_tone:' => '🧑🏾‍🤝‍🧑🏽', + ':people_holding_hands_medium_light_skin_tone:' => '🧑🏼‍🤝‍🧑🏼', + ':people_holding_hands_medium_light_skin_tone_dark_skin_tone:' => '🧑🏼‍🤝‍🧑🏿', + ':people_holding_hands_medium_light_skin_tone_light_skin_tone:' => '🧑🏼‍🤝‍🧑🏻', + ':people_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:' => '🧑🏼‍🤝‍🧑🏾', + ':people_holding_hands_medium_light_skin_tone_medium_skin_tone:' => '🧑🏼‍🤝‍🧑🏽', + ':people_holding_hands_medium_skin_tone:' => '🧑🏽‍🤝‍🧑🏽', + ':people_holding_hands_medium_skin_tone_dark_skin_tone:' => '🧑🏽‍🤝‍🧑🏿', + ':people_holding_hands_medium_skin_tone_light_skin_tone:' => '🧑🏽‍🤝‍🧑🏻', + ':people_holding_hands_medium_skin_tone_medium_dark_skin_tone:' => '🧑🏽‍🤝‍🧑🏾', + ':people_holding_hands_medium_skin_tone_medium_light_skin_tone:' => '🧑🏽‍🤝‍🧑🏼', + ':person_in_manual_wheelchair_facing_right_dark_skin_tone:' => '🧑🏿‍🦽‍➡️', + ':person_in_manual_wheelchair_facing_right_light_skin_tone:' => '🧑🏻‍🦽‍➡️', + ':person_in_manual_wheelchair_facing_right_medium_dark_skin_tone:' => '🧑🏾‍🦽‍➡️', + ':person_in_manual_wheelchair_facing_right_medium_light_skin_tone:' => '🧑🏼‍🦽‍➡️', + ':person_in_manual_wheelchair_facing_right_medium_skin_tone:' => '🧑🏽‍🦽‍➡️', + ':person_in_motorized_wheelchair_facing_right_dark_skin_tone:' => '🧑🏿‍🦼‍➡️', + ':person_in_motorized_wheelchair_facing_right_light_skin_tone:' => '🧑🏻‍🦼‍➡️', + ':person_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:' => '🧑🏾‍🦼‍➡️', + ':person_in_motorized_wheelchair_facing_right_medium_light_skin_tone:' => '🧑🏼‍🦼‍➡️', + ':person_in_motorized_wheelchair_facing_right_medium_skin_tone:' => '🧑🏽‍🦼‍➡️', + ':person_with_white_cane_facing_right_dark_skin_tone:' => '🧑🏿‍🦯‍➡️', + ':person_with_white_cane_facing_right_light_skin_tone:' => '🧑🏻‍🦯‍➡️', + ':person_with_white_cane_facing_right_medium_dark_skin_tone:' => '🧑🏾‍🦯‍➡️', + ':person_with_white_cane_facing_right_medium_light_skin_tone:' => '🧑🏼‍🦯‍➡️', + ':person_with_white_cane_facing_right_medium_skin_tone:' => '🧑🏽‍🦯‍➡️', + ':woman_and_man_holding_hands_dark_skin_tone_light_skin_tone:' => '👩🏿‍🤝‍👨🏻', + ':woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍🤝‍👨🏾', + ':woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍🤝‍👨🏼', + ':woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone:' => '👩🏿‍🤝‍👨🏽', + ':woman_and_man_holding_hands_light_skin_tone_dark_skin_tone:' => '👩🏻‍🤝‍👨🏿', + ':woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍🤝‍👨🏾', + ':woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍🤝‍👨🏼', + ':woman_and_man_holding_hands_light_skin_tone_medium_skin_tone:' => '👩🏻‍🤝‍👨🏽', + ':woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍🤝‍👨🏿', + ':woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍🤝‍👨🏻', + ':woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍🤝‍👨🏼', + ':woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍🤝‍👨🏽', + ':woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍🤝‍👨🏿', + ':woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍🤝‍👨🏻', + ':woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍🤝‍👨🏾', + ':woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍🤝‍👨🏽', + ':woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone:' => '👩🏽‍🤝‍👨🏿', + ':woman_and_man_holding_hands_medium_skin_tone_light_skin_tone:' => '👩🏽‍🤝‍👨🏻', + ':woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍🤝‍👨🏾', + ':woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍🤝‍👨🏼', + ':woman_in_manual_wheelchair_facing_right_dark_skin_tone:' => '👩🏿‍🦽‍➡️', + ':woman_in_manual_wheelchair_facing_right_light_skin_tone:' => '👩🏻‍🦽‍➡️', + ':woman_in_manual_wheelchair_facing_right_medium_dark_skin_tone:' => '👩🏾‍🦽‍➡️', + ':woman_in_manual_wheelchair_facing_right_medium_light_skin_tone:' => '👩🏼‍🦽‍➡️', + ':woman_in_manual_wheelchair_facing_right_medium_skin_tone:' => '👩🏽‍🦽‍➡️', + ':woman_in_motorized_wheelchair_facing_right_dark_skin_tone:' => '👩🏿‍🦼‍➡️', + ':woman_in_motorized_wheelchair_facing_right_light_skin_tone:' => '👩🏻‍🦼‍➡️', + ':woman_in_motorized_wheelchair_facing_right_medium_dark_skin_tone:' => '👩🏾‍🦼‍➡️', + ':woman_in_motorized_wheelchair_facing_right_medium_light_skin_tone:' => '👩🏼‍🦼‍➡️', + ':woman_in_motorized_wheelchair_facing_right_medium_skin_tone:' => '👩🏽‍🦼‍➡️', + ':woman_kneeling_facing_right:' => '🧎‍♀️‍➡️', + ':woman_running_facing_right:' => '🏃‍♀️‍➡️', + ':woman_walking_facing_right:' => '🚶‍♀️‍➡️', + ':woman_with_white_cane_facing_right_dark_skin_tone:' => '👩🏿‍🦯‍➡️', + ':woman_with_white_cane_facing_right_light_skin_tone:' => '👩🏻‍🦯‍➡️', + ':woman_with_white_cane_facing_right_medium_dark_skin_tone:' => '👩🏾‍🦯‍➡️', + ':woman_with_white_cane_facing_right_medium_light_skin_tone:' => '👩🏼‍🦯‍➡️', + ':woman_with_white_cane_facing_right_medium_skin_tone:' => '👩🏽‍🦯‍➡️', + ':women_holding_hands_dark_skin_tone_light_skin_tone:' => '👩🏿‍🤝‍👩🏻', + ':women_holding_hands_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍🤝‍👩🏾', + ':women_holding_hands_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍🤝‍👩🏼', + ':women_holding_hands_dark_skin_tone_medium_skin_tone:' => '👩🏿‍🤝‍👩🏽', + ':women_holding_hands_light_skin_tone_dark_skin_tone:' => '👩🏻‍🤝‍👩🏿', + ':women_holding_hands_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍🤝‍👩🏾', + ':women_holding_hands_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍🤝‍👩🏼', + ':women_holding_hands_light_skin_tone_medium_skin_tone:' => '👩🏻‍🤝‍👩🏽', + ':women_holding_hands_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍🤝‍👩🏿', + ':women_holding_hands_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍🤝‍👩🏻', + ':women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍🤝‍👩🏼', + ':women_holding_hands_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍🤝‍👩🏽', + ':women_holding_hands_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍🤝‍👩🏿', + ':women_holding_hands_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍🤝‍👩🏻', + ':women_holding_hands_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍🤝‍👩🏾', + ':women_holding_hands_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍🤝‍👩🏽', + ':women_holding_hands_medium_skin_tone_dark_skin_tone:' => '👩🏽‍🤝‍👩🏿', + ':women_holding_hands_medium_skin_tone_light_skin_tone:' => '👩🏽‍🤝‍👩🏻', + ':women_holding_hands_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍🤝‍👩🏾', + ':women_holding_hands_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍🤝‍👩🏼', + ':couple_with_heart_man_man_dark_skin_tone:' => '👨🏿‍❤️‍👨🏿', + ':couple_with_heart_man_man_dark_skin_tone_light_skin_tone:' => '👨🏿‍❤️‍👨🏻', + ':couple_with_heart_man_man_dark_skin_tone_medium_dark_skin_tone:' => '👨🏿‍❤️‍👨🏾', + ':couple_with_heart_man_man_dark_skin_tone_medium_light_skin_tone:' => '👨🏿‍❤️‍👨🏼', + ':couple_with_heart_man_man_dark_skin_tone_medium_skin_tone:' => '👨🏿‍❤️‍👨🏽', + ':couple_with_heart_man_man_light_skin_tone:' => '👨🏻‍❤️‍👨🏻', + ':couple_with_heart_man_man_light_skin_tone_dark_skin_tone:' => '👨🏻‍❤️‍👨🏿', + ':couple_with_heart_man_man_light_skin_tone_medium_dark_skin_tone:' => '👨🏻‍❤️‍👨🏾', + ':couple_with_heart_man_man_light_skin_tone_medium_light_skin_tone:' => '👨🏻‍❤️‍👨🏼', + ':couple_with_heart_man_man_light_skin_tone_medium_skin_tone:' => '👨🏻‍❤️‍👨🏽', + ':couple_with_heart_man_man_medium_dark_skin_tone:' => '👨🏾‍❤️‍👨🏾', + ':couple_with_heart_man_man_medium_dark_skin_tone_dark_skin_tone:' => '👨🏾‍❤️‍👨🏿', + ':couple_with_heart_man_man_medium_dark_skin_tone_light_skin_tone:' => '👨🏾‍❤️‍👨🏻', + ':couple_with_heart_man_man_medium_dark_skin_tone_medium_light_skin_tone:' => '👨🏾‍❤️‍👨🏼', + ':couple_with_heart_man_man_medium_dark_skin_tone_medium_skin_tone:' => '👨🏾‍❤️‍👨🏽', + ':couple_with_heart_man_man_medium_light_skin_tone:' => '👨🏼‍❤️‍👨🏼', + ':couple_with_heart_man_man_medium_light_skin_tone_dark_skin_tone:' => '👨🏼‍❤️‍👨🏿', + ':couple_with_heart_man_man_medium_light_skin_tone_light_skin_tone:' => '👨🏼‍❤️‍👨🏻', + ':couple_with_heart_man_man_medium_light_skin_tone_medium_dark_skin_tone:' => '👨🏼‍❤️‍👨🏾', + ':couple_with_heart_man_man_medium_light_skin_tone_medium_skin_tone:' => '👨🏼‍❤️‍👨🏽', + ':couple_with_heart_man_man_medium_skin_tone:' => '👨🏽‍❤️‍👨🏽', + ':couple_with_heart_man_man_medium_skin_tone_dark_skin_tone:' => '👨🏽‍❤️‍👨🏿', + ':couple_with_heart_man_man_medium_skin_tone_light_skin_tone:' => '👨🏽‍❤️‍👨🏻', + ':couple_with_heart_man_man_medium_skin_tone_medium_dark_skin_tone:' => '👨🏽‍❤️‍👨🏾', + ':couple_with_heart_man_man_medium_skin_tone_medium_light_skin_tone:' => '👨🏽‍❤️‍👨🏼', + ':couple_with_heart_person_person_dark_skin_tone_light_skin_tone:' => '🧑🏿‍❤️‍🧑🏻', + ':couple_with_heart_person_person_dark_skin_tone_medium_dark_skin_tone:' => '🧑🏿‍❤️‍🧑🏾', + ':couple_with_heart_person_person_dark_skin_tone_medium_light_skin_tone:' => '🧑🏿‍❤️‍🧑🏼', + ':couple_with_heart_person_person_dark_skin_tone_medium_skin_tone:' => '🧑🏿‍❤️‍🧑🏽', + ':couple_with_heart_person_person_light_skin_tone_dark_skin_tone:' => '🧑🏻‍❤️‍🧑🏿', + ':couple_with_heart_person_person_light_skin_tone_medium_dark_skin_tone:' => '🧑🏻‍❤️‍🧑🏾', + ':couple_with_heart_person_person_light_skin_tone_medium_light_skin_tone:' => '🧑🏻‍❤️‍🧑🏼', + ':couple_with_heart_person_person_light_skin_tone_medium_skin_tone:' => '🧑🏻‍❤️‍🧑🏽', + ':couple_with_heart_person_person_medium_dark_skin_tone_dark_skin_tone:' => '🧑🏾‍❤️‍🧑🏿', + ':couple_with_heart_person_person_medium_dark_skin_tone_light_skin_tone:' => '🧑🏾‍❤️‍🧑🏻', + ':couple_with_heart_person_person_medium_dark_skin_tone_medium_light_skin_tone:' => '🧑🏾‍❤️‍🧑🏼', + ':couple_with_heart_person_person_medium_dark_skin_tone_medium_skin_tone:' => '🧑🏾‍❤️‍🧑🏽', + ':couple_with_heart_person_person_medium_light_skin_tone_dark_skin_tone:' => '🧑🏼‍❤️‍🧑🏿', + ':couple_with_heart_person_person_medium_light_skin_tone_light_skin_tone:' => '🧑🏼‍❤️‍🧑🏻', + ':couple_with_heart_person_person_medium_light_skin_tone_medium_dark_skin_tone:' => '🧑🏼‍❤️‍🧑🏾', + ':couple_with_heart_person_person_medium_light_skin_tone_medium_skin_tone:' => '🧑🏼‍❤️‍🧑🏽', + ':couple_with_heart_person_person_medium_skin_tone_dark_skin_tone:' => '🧑🏽‍❤️‍🧑🏿', + ':couple_with_heart_person_person_medium_skin_tone_light_skin_tone:' => '🧑🏽‍❤️‍🧑🏻', + ':couple_with_heart_person_person_medium_skin_tone_medium_dark_skin_tone:' => '🧑🏽‍❤️‍🧑🏾', + ':couple_with_heart_person_person_medium_skin_tone_medium_light_skin_tone:' => '🧑🏽‍❤️‍🧑🏼', + ':couple_with_heart_woman_man_dark_skin_tone:' => '👩🏿‍❤️‍👨🏿', + ':couple_with_heart_woman_man_dark_skin_tone_light_skin_tone:' => '👩🏿‍❤️‍👨🏻', + ':couple_with_heart_woman_man_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍❤️‍👨🏾', + ':couple_with_heart_woman_man_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍❤️‍👨🏼', + ':couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone:' => '👩🏿‍❤️‍👨🏽', + ':couple_with_heart_woman_man_light_skin_tone:' => '👩🏻‍❤️‍👨🏻', + ':couple_with_heart_woman_man_light_skin_tone_dark_skin_tone:' => '👩🏻‍❤️‍👨🏿', + ':couple_with_heart_woman_man_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍❤️‍👨🏾', + ':couple_with_heart_woman_man_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍❤️‍👨🏼', + ':couple_with_heart_woman_man_light_skin_tone_medium_skin_tone:' => '👩🏻‍❤️‍👨🏽', + ':couple_with_heart_woman_man_medium_dark_skin_tone:' => '👩🏾‍❤️‍👨🏾', + ':couple_with_heart_woman_man_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍❤️‍👨🏿', + ':couple_with_heart_woman_man_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍❤️‍👨🏻', + ':couple_with_heart_woman_man_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍❤️‍👨🏼', + ':couple_with_heart_woman_man_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍❤️‍👨🏽', + ':couple_with_heart_woman_man_medium_light_skin_tone:' => '👩🏼‍❤️‍👨🏼', + ':couple_with_heart_woman_man_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍❤️‍👨🏿', + ':couple_with_heart_woman_man_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍❤️‍👨🏻', + ':couple_with_heart_woman_man_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍❤️‍👨🏾', + ':couple_with_heart_woman_man_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍❤️‍👨🏽', + ':couple_with_heart_woman_man_medium_skin_tone:' => '👩🏽‍❤️‍👨🏽', + ':couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone:' => '👩🏽‍❤️‍👨🏿', + ':couple_with_heart_woman_man_medium_skin_tone_light_skin_tone:' => '👩🏽‍❤️‍👨🏻', + ':couple_with_heart_woman_man_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍❤️‍👨🏾', + ':couple_with_heart_woman_man_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍❤️‍👨🏼', + ':couple_with_heart_woman_woman_dark_skin_tone:' => '👩🏿‍❤️‍👩🏿', + ':couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone:' => '👩🏿‍❤️‍👩🏻', + ':couple_with_heart_woman_woman_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍❤️‍👩🏾', + ':couple_with_heart_woman_woman_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍❤️‍👩🏼', + ':couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone:' => '👩🏿‍❤️‍👩🏽', + ':couple_with_heart_woman_woman_light_skin_tone:' => '👩🏻‍❤️‍👩🏻', + ':couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone:' => '👩🏻‍❤️‍👩🏿', + ':couple_with_heart_woman_woman_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍❤️‍👩🏾', + ':couple_with_heart_woman_woman_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍❤️‍👩🏼', + ':couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone:' => '👩🏻‍❤️‍👩🏽', + ':couple_with_heart_woman_woman_medium_dark_skin_tone:' => '👩🏾‍❤️‍👩🏾', + ':couple_with_heart_woman_woman_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍❤️‍👩🏿', + ':couple_with_heart_woman_woman_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍❤️‍👩🏻', + ':couple_with_heart_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍❤️‍👩🏼', + ':couple_with_heart_woman_woman_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍❤️‍👩🏽', + ':couple_with_heart_woman_woman_medium_light_skin_tone:' => '👩🏼‍❤️‍👩🏼', + ':couple_with_heart_woman_woman_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍❤️‍👩🏿', + ':couple_with_heart_woman_woman_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍❤️‍👩🏻', + ':couple_with_heart_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍❤️‍👩🏾', + ':couple_with_heart_woman_woman_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍❤️‍👩🏽', + ':couple_with_heart_woman_woman_medium_skin_tone:' => '👩🏽‍❤️‍👩🏽', + ':couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone:' => '👩🏽‍❤️‍👩🏿', + ':couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone:' => '👩🏽‍❤️‍👩🏻', + ':couple_with_heart_woman_woman_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍❤️‍👩🏾', + ':couple_with_heart_woman_woman_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍❤️‍👩🏼', ':kiss_mm:' => '👨‍❤️‍💋‍👨', + ':kiss_woman_man:' => '👩‍❤️‍💋‍👨', ':kiss_ww:' => '👩‍❤️‍💋‍👩', + ':man_kneeling_facing_right_dark_skin_tone:' => '🧎🏿‍♂️‍➡️', + ':man_kneeling_facing_right_light_skin_tone:' => '🧎🏻‍♂️‍➡️', + ':man_kneeling_facing_right_medium_dark_skin_tone:' => '🧎🏾‍♂️‍➡️', + ':man_kneeling_facing_right_medium_light_skin_tone:' => '🧎🏼‍♂️‍➡️', + ':man_kneeling_facing_right_medium_skin_tone:' => '🧎🏽‍♂️‍➡️', + ':man_running_facing_right_dark_skin_tone:' => '🏃🏿‍♂️‍➡️', + ':man_running_facing_right_light_skin_tone:' => '🏃🏻‍♂️‍➡️', + ':man_running_facing_right_medium_dark_skin_tone:' => '🏃🏾‍♂️‍➡️', + ':man_running_facing_right_medium_light_skin_tone:' => '🏃🏼‍♂️‍➡️', + ':man_running_facing_right_medium_skin_tone:' => '🏃🏽‍♂️‍➡️', + ':man_walking_facing_right_dark_skin_tone:' => '🚶🏿‍♂️‍➡️', + ':man_walking_facing_right_light_skin_tone:' => '🚶🏻‍♂️‍➡️', + ':man_walking_facing_right_medium_dark_skin_tone:' => '🚶🏾‍♂️‍➡️', + ':man_walking_facing_right_medium_light_skin_tone:' => '🚶🏼‍♂️‍➡️', + ':man_walking_facing_right_medium_skin_tone:' => '🚶🏽‍♂️‍➡️', + ':woman_kneeling_facing_right_dark_skin_tone:' => '🧎🏿‍♀️‍➡️', + ':woman_kneeling_facing_right_light_skin_tone:' => '🧎🏻‍♀️‍➡️', + ':woman_kneeling_facing_right_medium_dark_skin_tone:' => '🧎🏾‍♀️‍➡️', + ':woman_kneeling_facing_right_medium_light_skin_tone:' => '🧎🏼‍♀️‍➡️', + ':woman_kneeling_facing_right_medium_skin_tone:' => '🧎🏽‍♀️‍➡️', + ':woman_running_facing_right_dark_skin_tone:' => '🏃🏿‍♀️‍➡️', + ':woman_running_facing_right_light_skin_tone:' => '🏃🏻‍♀️‍➡️', + ':woman_running_facing_right_medium_dark_skin_tone:' => '🏃🏾‍♀️‍➡️', + ':woman_running_facing_right_medium_light_skin_tone:' => '🏃🏼‍♀️‍➡️', + ':woman_running_facing_right_medium_skin_tone:' => '🏃🏽‍♀️‍➡️', + ':woman_walking_facing_right_dark_skin_tone:' => '🚶🏿‍♀️‍➡️', + ':woman_walking_facing_right_light_skin_tone:' => '🚶🏻‍♀️‍➡️', + ':woman_walking_facing_right_medium_dark_skin_tone:' => '🚶🏾‍♀️‍➡️', + ':woman_walking_facing_right_medium_light_skin_tone:' => '🚶🏼‍♀️‍➡️', + ':woman_walking_facing_right_medium_skin_tone:' => '🚶🏽‍♀️‍➡️', + ':kiss_man_man_dark_skin_tone:' => '👨🏿‍❤️‍💋‍👨🏿', + ':kiss_man_man_dark_skin_tone_light_skin_tone:' => '👨🏿‍❤️‍💋‍👨🏻', + ':kiss_man_man_dark_skin_tone_medium_dark_skin_tone:' => '👨🏿‍❤️‍💋‍👨🏾', + ':kiss_man_man_dark_skin_tone_medium_light_skin_tone:' => '👨🏿‍❤️‍💋‍👨🏼', + ':kiss_man_man_dark_skin_tone_medium_skin_tone:' => '👨🏿‍❤️‍💋‍👨🏽', + ':kiss_man_man_light_skin_tone:' => '👨🏻‍❤️‍💋‍👨🏻', + ':kiss_man_man_light_skin_tone_dark_skin_tone:' => '👨🏻‍❤️‍💋‍👨🏿', + ':kiss_man_man_light_skin_tone_medium_dark_skin_tone:' => '👨🏻‍❤️‍💋‍👨🏾', + ':kiss_man_man_light_skin_tone_medium_light_skin_tone:' => '👨🏻‍❤️‍💋‍👨🏼', + ':kiss_man_man_light_skin_tone_medium_skin_tone:' => '👨🏻‍❤️‍💋‍👨🏽', + ':kiss_man_man_medium_dark_skin_tone:' => '👨🏾‍❤️‍💋‍👨🏾', + ':kiss_man_man_medium_dark_skin_tone_dark_skin_tone:' => '👨🏾‍❤️‍💋‍👨🏿', + ':kiss_man_man_medium_dark_skin_tone_light_skin_tone:' => '👨🏾‍❤️‍💋‍👨🏻', + ':kiss_man_man_medium_dark_skin_tone_medium_light_skin_tone:' => '👨🏾‍❤️‍💋‍👨🏼', + ':kiss_man_man_medium_dark_skin_tone_medium_skin_tone:' => '👨🏾‍❤️‍💋‍👨🏽', + ':kiss_man_man_medium_light_skin_tone:' => '👨🏼‍❤️‍💋‍👨🏼', + ':kiss_man_man_medium_light_skin_tone_dark_skin_tone:' => '👨🏼‍❤️‍💋‍👨🏿', + ':kiss_man_man_medium_light_skin_tone_light_skin_tone:' => '👨🏼‍❤️‍💋‍👨🏻', + ':kiss_man_man_medium_light_skin_tone_medium_dark_skin_tone:' => '👨🏼‍❤️‍💋‍👨🏾', + ':kiss_man_man_medium_light_skin_tone_medium_skin_tone:' => '👨🏼‍❤️‍💋‍👨🏽', + ':kiss_man_man_medium_skin_tone:' => '👨🏽‍❤️‍💋‍👨🏽', + ':kiss_man_man_medium_skin_tone_dark_skin_tone:' => '👨🏽‍❤️‍💋‍👨🏿', + ':kiss_man_man_medium_skin_tone_light_skin_tone:' => '👨🏽‍❤️‍💋‍👨🏻', + ':kiss_man_man_medium_skin_tone_medium_dark_skin_tone:' => '👨🏽‍❤️‍💋‍👨🏾', + ':kiss_man_man_medium_skin_tone_medium_light_skin_tone:' => '👨🏽‍❤️‍💋‍👨🏼', + ':kiss_person_person_dark_skin_tone_light_skin_tone:' => '🧑🏿‍❤️‍💋‍🧑🏻', + ':kiss_person_person_dark_skin_tone_medium_dark_skin_tone:' => '🧑🏿‍❤️‍💋‍🧑🏾', + ':kiss_person_person_dark_skin_tone_medium_light_skin_tone:' => '🧑🏿‍❤️‍💋‍🧑🏼', + ':kiss_person_person_dark_skin_tone_medium_skin_tone:' => '🧑🏿‍❤️‍💋‍🧑🏽', + ':kiss_person_person_light_skin_tone_dark_skin_tone:' => '🧑🏻‍❤️‍💋‍🧑🏿', + ':kiss_person_person_light_skin_tone_medium_dark_skin_tone:' => '🧑🏻‍❤️‍💋‍🧑🏾', + ':kiss_person_person_light_skin_tone_medium_light_skin_tone:' => '🧑🏻‍❤️‍💋‍🧑🏼', + ':kiss_person_person_light_skin_tone_medium_skin_tone:' => '🧑🏻‍❤️‍💋‍🧑🏽', + ':kiss_person_person_medium_dark_skin_tone_dark_skin_tone:' => '🧑🏾‍❤️‍💋‍🧑🏿', + ':kiss_person_person_medium_dark_skin_tone_light_skin_tone:' => '🧑🏾‍❤️‍💋‍🧑🏻', + ':kiss_person_person_medium_dark_skin_tone_medium_light_skin_tone:' => '🧑🏾‍❤️‍💋‍🧑🏼', + ':kiss_person_person_medium_dark_skin_tone_medium_skin_tone:' => '🧑🏾‍❤️‍💋‍🧑🏽', + ':kiss_person_person_medium_light_skin_tone_dark_skin_tone:' => '🧑🏼‍❤️‍💋‍🧑🏿', + ':kiss_person_person_medium_light_skin_tone_light_skin_tone:' => '🧑🏼‍❤️‍💋‍🧑🏻', + ':kiss_person_person_medium_light_skin_tone_medium_dark_skin_tone:' => '🧑🏼‍❤️‍💋‍🧑🏾', + ':kiss_person_person_medium_light_skin_tone_medium_skin_tone:' => '🧑🏼‍❤️‍💋‍🧑🏽', + ':kiss_person_person_medium_skin_tone_dark_skin_tone:' => '🧑🏽‍❤️‍💋‍🧑🏿', + ':kiss_person_person_medium_skin_tone_light_skin_tone:' => '🧑🏽‍❤️‍💋‍🧑🏻', + ':kiss_person_person_medium_skin_tone_medium_dark_skin_tone:' => '🧑🏽‍❤️‍💋‍🧑🏾', + ':kiss_person_person_medium_skin_tone_medium_light_skin_tone:' => '🧑🏽‍❤️‍💋‍🧑🏼', + ':kiss_woman_man_dark_skin_tone:' => '👩🏿‍❤️‍💋‍👨🏿', + ':kiss_woman_man_dark_skin_tone_light_skin_tone:' => '👩🏿‍❤️‍💋‍👨🏻', + ':kiss_woman_man_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍❤️‍💋‍👨🏾', + ':kiss_woman_man_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍❤️‍💋‍👨🏼', + ':kiss_woman_man_dark_skin_tone_medium_skin_tone:' => '👩🏿‍❤️‍💋‍👨🏽', + ':kiss_woman_man_light_skin_tone:' => '👩🏻‍❤️‍💋‍👨🏻', + ':kiss_woman_man_light_skin_tone_dark_skin_tone:' => '👩🏻‍❤️‍💋‍👨🏿', + ':kiss_woman_man_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍❤️‍💋‍👨🏾', + ':kiss_woman_man_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍❤️‍💋‍👨🏼', + ':kiss_woman_man_light_skin_tone_medium_skin_tone:' => '👩🏻‍❤️‍💋‍👨🏽', + ':kiss_woman_man_medium_dark_skin_tone:' => '👩🏾‍❤️‍💋‍👨🏾', + ':kiss_woman_man_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍❤️‍💋‍👨🏿', + ':kiss_woman_man_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍❤️‍💋‍👨🏻', + ':kiss_woman_man_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍❤️‍💋‍👨🏼', + ':kiss_woman_man_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍❤️‍💋‍👨🏽', + ':kiss_woman_man_medium_light_skin_tone:' => '👩🏼‍❤️‍💋‍👨🏼', + ':kiss_woman_man_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍❤️‍💋‍👨🏿', + ':kiss_woman_man_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍❤️‍💋‍👨🏻', + ':kiss_woman_man_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍❤️‍💋‍👨🏾', + ':kiss_woman_man_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍❤️‍💋‍👨🏽', + ':kiss_woman_man_medium_skin_tone:' => '👩🏽‍❤️‍💋‍👨🏽', + ':kiss_woman_man_medium_skin_tone_dark_skin_tone:' => '👩🏽‍❤️‍💋‍👨🏿', + ':kiss_woman_man_medium_skin_tone_light_skin_tone:' => '👩🏽‍❤️‍💋‍👨🏻', + ':kiss_woman_man_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍❤️‍💋‍👨🏾', + ':kiss_woman_man_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍❤️‍💋‍👨🏼', + ':kiss_woman_woman_dark_skin_tone:' => '👩🏿‍❤️‍💋‍👩🏿', + ':kiss_woman_woman_dark_skin_tone_light_skin_tone:' => '👩🏿‍❤️‍💋‍👩🏻', + ':kiss_woman_woman_dark_skin_tone_medium_dark_skin_tone:' => '👩🏿‍❤️‍💋‍👩🏾', + ':kiss_woman_woman_dark_skin_tone_medium_light_skin_tone:' => '👩🏿‍❤️‍💋‍👩🏼', + ':kiss_woman_woman_dark_skin_tone_medium_skin_tone:' => '👩🏿‍❤️‍💋‍👩🏽', + ':kiss_woman_woman_light_skin_tone:' => '👩🏻‍❤️‍💋‍👩🏻', + ':kiss_woman_woman_light_skin_tone_dark_skin_tone:' => '👩🏻‍❤️‍💋‍👩🏿', + ':kiss_woman_woman_light_skin_tone_medium_dark_skin_tone:' => '👩🏻‍❤️‍💋‍👩🏾', + ':kiss_woman_woman_light_skin_tone_medium_light_skin_tone:' => '👩🏻‍❤️‍💋‍👩🏼', + ':kiss_woman_woman_light_skin_tone_medium_skin_tone:' => '👩🏻‍❤️‍💋‍👩🏽', + ':kiss_woman_woman_medium_dark_skin_tone:' => '👩🏾‍❤️‍💋‍👩🏾', + ':kiss_woman_woman_medium_dark_skin_tone_dark_skin_tone:' => '👩🏾‍❤️‍💋‍👩🏿', + ':kiss_woman_woman_medium_dark_skin_tone_light_skin_tone:' => '👩🏾‍❤️‍💋‍👩🏻', + ':kiss_woman_woman_medium_dark_skin_tone_medium_light_skin_tone:' => '👩🏾‍❤️‍💋‍👩🏼', + ':kiss_woman_woman_medium_dark_skin_tone_medium_skin_tone:' => '👩🏾‍❤️‍💋‍👩🏽', + ':kiss_woman_woman_medium_light_skin_tone:' => '👩🏼‍❤️‍💋‍👩🏼', + ':kiss_woman_woman_medium_light_skin_tone_dark_skin_tone:' => '👩🏼‍❤️‍💋‍👩🏿', + ':kiss_woman_woman_medium_light_skin_tone_light_skin_tone:' => '👩🏼‍❤️‍💋‍👩🏻', + ':kiss_woman_woman_medium_light_skin_tone_medium_dark_skin_tone:' => '👩🏼‍❤️‍💋‍👩🏾', + ':kiss_woman_woman_medium_light_skin_tone_medium_skin_tone:' => '👩🏼‍❤️‍💋‍👩🏽', + ':kiss_woman_woman_medium_skin_tone:' => '👩🏽‍❤️‍💋‍👩🏽', + ':kiss_woman_woman_medium_skin_tone_dark_skin_tone:' => '👩🏽‍❤️‍💋‍👩🏿', + ':kiss_woman_woman_medium_skin_tone_light_skin_tone:' => '👩🏽‍❤️‍💋‍👩🏻', + ':kiss_woman_woman_medium_skin_tone_medium_dark_skin_tone:' => '👩🏽‍❤️‍💋‍👩🏾', + ':kiss_woman_woman_medium_skin_tone_medium_light_skin_tone:' => '👩🏽‍❤️‍💋‍👩🏼', ]; diff --git a/src/Symfony/Component/Emoji/Resources/data/text-emoji.php b/src/Symfony/Component/Emoji/Resources/data/text-emoji.php index 0161bc4a5ff26..d41a28ea28d78 100644 --- a/src/Symfony/Component/Emoji/Resources/data/text-emoji.php +++ b/src/Symfony/Component/Emoji/Resources/data/text-emoji.php @@ -13,7 +13,6 @@ ':accept:' => '🉑', ':accordion:' => '🪗', ':adhesive-bandage:' => '🩹', - ':admission-tickets:' => '🎟️', ':adult:' => '🧑', ':aerial-tramway:' => '🚡', ':airplane-arriving:' => '🛬', @@ -31,7 +30,6 @@ ':ant:' => '🐜', ':apple:' => '🍎', ':aquarius:' => '♒', - ':archery:' => '🏹', ':aries:' => '♈', ':arrow-double-down:' => '⏬', ':arrow-double-up:' => '⏫', @@ -44,7 +42,6 @@ ':astonished:' => '😲', ':athletic-shoe:' => '👟', ':atm:' => '🏧', - ':atom-symbol:' => '⚛️', ':auto-rickshaw:' => '🛺', ':avocado:' => '🥑', ':axe:' => '🪓', @@ -53,7 +50,6 @@ ':baby-chick:' => '🐤', ':baby-symbol:' => '🚼', ':back:' => '🔙', - ':back-of-hand:' => '🤚', ':bacon:' => '🥓', ':badger:' => '🦡', ':badminton-racquet-and-shuttlecock:' => '🏸', @@ -62,7 +58,6 @@ ':baguette-bread:' => '🥖', ':ballet-shoes:' => '🩰', ':balloon:' => '🎈', - ':ballot-box-with-ballot:' => '🗳️', ':bamboo:' => '🎍', ':banana:' => '🍌', ':banjo:' => '🪕', @@ -76,7 +71,6 @@ ':bath:' => '🛀', ':bathtub:' => '🛁', ':battery:' => '🔋', - ':beach-with-umbrella:' => '🏖️', ':beans:' => '🫘', ':bear:' => '🐻', ':bearded-person:' => '🧔', @@ -88,14 +82,12 @@ ':beginner:' => '🔰', ':bell:' => '🔔', ':bell-pepper:' => '🫑', - ':bellhop-bell:' => '🛎️', ':bento:' => '🍱', ':beverage-box:' => '🧃', ':bicyclist:' => '🚴', ':bike:' => '🚲', ':bikini:' => '👙', ':billed-cap:' => '🧢', - ':biohazard-sign:' => '☣️', ':bird:' => '🐦', ':birthday:' => '🎂', ':bison:' => '🦬', @@ -124,14 +116,12 @@ ':boom:' => '💥', ':boomerang:' => '🪃', ':boot:' => '👢', - ':bottle-with-popping-cork:' => '🍾', ':bouquet:' => '💐', ':bow:' => '🙇', ':bow-and-arrow:' => '🏹', ':bowl-with-spoon:' => '🥣', ':bowling:' => '🎳', ':boxing-glove:' => '🥊', - ':boxing-gloves:' => '🥊', ':boy:' => '👦', ':brain:' => '🧠', ':bread:' => '🍞', @@ -149,7 +139,6 @@ ':bubbles:' => '🫧', ':bucket:' => '🪣', ':bug:' => '🐛', - ':building-construction:' => '🏗️', ':bulb:' => '💡', ':bullettrain-front:' => '🚅', ':bullettrain-side:' => '🚄', @@ -175,9 +164,7 @@ ':capital-abcd:' => '🔠', ':capricorn:' => '♑', ':car:' => '🚗', - ':card-file-box:' => '🗃️', ':card-index:' => '📇', - ':card-index-dividers:' => '🗂️', ':carousel-horse:' => '🎠', ':carpentry-saw:' => '🪚', ':carrot:' => '🥕', @@ -208,7 +195,6 @@ ':cl:' => '🆑', ':clap:' => '👏', ':clapper:' => '🎬', - ':clinking-glass:' => '🥂', ':clinking-glasses:' => '🥂', ':clipboard:' => '📋', ':clock1:' => '🕐', @@ -238,10 +224,6 @@ ':closed-book:' => '📕', ':closed-lock-with-key:' => '🔐', ':closed-umbrella:' => '🌂', - ':cloud-with-lightning:' => '🌩', - ':cloud-with-rain:' => '🌧', - ':cloud-with-snow:' => '🌨', - ':cloud-with-tornado:' => '🌪', ':clown-face:' => '🤡', ':coat:' => '🧥', ':cockroach:' => '🪳', @@ -266,7 +248,6 @@ ':cop:' => '👮', ':coral:' => '🪸', ':corn:' => '🌽', - ':couch-and-lamp:' => '🛋️', ':couple:' => '👫', ':couple-with-heart:' => '💑', ':couplekiss:' => '💏', @@ -277,7 +258,6 @@ ':crescent-moon:' => '🌙', ':cricket:' => '🦗', ':cricket-bat-and-ball:' => '🏏', - ':cricket-bat-ball:' => '🏏', ':crocodile:' => '🐊', ':croissant:' => '🥐', ':crossed-fingers:' => '🤞', @@ -299,7 +279,6 @@ ':customs:' => '🛃', ':cut-of-meat:' => '🥩', ':cyclone:' => '🌀', - ':dagger-knife:' => '🗡️', ':dancer:' => '💃', ':dancers:' => '👯', ':dango:' => '🍡', @@ -310,9 +289,6 @@ ':deciduous-tree:' => '🌳', ':deer:' => '🦌', ':department-store:' => '🏬', - ':derelict-house-building:' => '🏚️', - ':desert-island:' => '🏝️', - ':desktop-computer:' => '🖥️', ':diamond-shape-with-a-dot-inside:' => '💠', ':disappointed:' => '😞', ':disappointed-relieved:' => '😥', @@ -332,14 +308,11 @@ ':donkey:' => '🫏', ':door:' => '🚪', ':dotted-line-face:' => '🫥', - ':double-vertical-bar:' => '⏸️', ':doughnut:' => '🍩', - ':dove-of-peace:' => '🕊️', ':dragon:' => '🐉', ':dragon-face:' => '🐲', ':dress:' => '👗', ':dromedary-camel:' => '🐪', - ':drool:' => '🤤', ':drooling-face:' => '🤤', ':drop-of-blood:' => '🩸', ':droplet:' => '💧', @@ -357,12 +330,10 @@ ':earth-asia:' => '🌏', ':egg:' => '🥚', ':eggplant:' => '🍆', - ':eject-symbol:' => '⏏', ':electric-plug:' => '🔌', ':elephant:' => '🐘', ':elevator:' => '🛗', ':elf:' => '🧝', - ':email:' => '✉️', ':empty-nest:' => '🪹', ':end:' => '🔚', ':envelope-with-arrow:' => '📩', @@ -371,7 +342,6 @@ ':european-post-office:' => '🏤', ':evergreen-tree:' => '🌲', ':exclamation:' => '❗', - ':expecting-woman:' => '🤰', ':exploding-head:' => '🤯', ':expressionless:' => '😑', ':eyeglasses:' => '👓', @@ -393,7 +363,6 @@ ':face-with-rolling-eyes:' => '🙄', ':face-with-symbols-on-mouth:' => '🤬', ':face-with-thermometer:' => '🤒', - ':facepalm:' => '🤦', ':facepunch:' => '👊', ':factory:' => '🏭', ':fairy:' => '🧚', @@ -406,11 +375,9 @@ ':feather:' => '🪶', ':feet:' => '🐾', ':fencer:' => '🤺', - ':fencing:' => '🤺', ':ferris-wheel:' => '🎡', ':field-hockey-stick-and-ball:' => '🏑', ':file-folder:' => '📁', - ':film-projector:' => '📽️', ':fire:' => '🔥', ':fire-engine:' => '🚒', ':fire-extinguisher:' => '🧯', @@ -424,7 +391,6 @@ ':fishing-pole-and-fish:' => '🎣', ':fist:' => '✊', ':flags:' => '🎏', - ':flame:' => '🔥', ':flamingo:' => '🦩', ':flashlight:' => '🔦', ':flatbread:' => '🫓', @@ -443,12 +409,10 @@ ':football:' => '🏈', ':footprints:' => '👣', ':fork-and-knife:' => '🍴', - ':fork-and-knife-with-plate:' => '🍽', ':fortune-cookie:' => '🥠', ':fountain:' => '⛲', ':four-leaf-clover:' => '🍀', ':fox-face:' => '🦊', - ':frame-with-picture:' => '🖼️', ':free:' => '🆓', ':fried-egg:' => '🍳', ':fried-shrimp:' => '🍤', @@ -458,7 +422,6 @@ ':fuelpump:' => '⛽', ':full-moon:' => '🌕', ':full-moon-with-face:' => '🌝', - ':funeral-urn:' => '⚱️', ':game-die:' => '🎲', ':garlic:' => '🧄', ':gem:' => '💎', @@ -479,7 +442,6 @@ ':golf:' => '⛳', ':goose:' => '🪿', ':gorilla:' => '🦍', - ':grandma:' => '👵', ':grapes:' => '🍇', ':green-apple:' => '🍏', ':green-book:' => '📗', @@ -501,12 +463,9 @@ ':haircut:' => '💇', ':hamburger:' => '🍔', ':hammer:' => '🔨', - ':hammer-and-pick:' => '⚒️', - ':hammer-and-wrench:' => '🛠️', ':hamsa:' => '🪬', ':hamster:' => '🐹', ':hand:' => '✋', - ':hand-with-index-and-middle-finger-crossed:' => '🤞', ':hand-with-index-and-middle-fingers-crossed:' => '🤞', ':hand-with-index-finger-and-thumb-crossed:' => '🫰', ':handbag:' => '👜', @@ -528,12 +487,10 @@ ':heavy-dollar-sign:' => '💲', ':heavy-equals-sign:' => '🟰', ':heavy-exclamation-mark:' => '❗', - ':heavy-hea 10000 rt-exclamation-mark-ornament:' => '❣️', ':heavy-minus-sign:' => '➖', ':heavy-plus-sign:' => '➕', ':hedgehog:' => '🦔', ':helicopter:' => '🚁', - ':helmet-with-white-cross:' => '⛑️', ':herb:' => '🌿', ':hibiscus:' => '🌺', ':high-brightness:' => '🔆', @@ -548,14 +505,12 @@ ':horse:' => '🐴', ':horse-racing:' => '🏇', ':hospital:' => '🏥', - ':hot-dog:' => '🌭', ':hot-face:' => '🥵', ':hotdog:' => '🌭', ':hotel:' => '🏨', ':hourglass:' => '⌛', ':hourglass-flowing-sand:' => '⏳', ':house:' => '🏠', - ':house-buildings:' => '🏘️', ':house-with-garden:' => '🏡', ':hugging-face:' => '🤗', ':hushed:' => '😯', @@ -588,12 +543,9 @@ ':jigsaw:' => '🧩', ':joy:' => '😂', ':joy-cat:' => '😹', - ':juggler:' => '🤹', ':juggling:' => '🤹', ':kaaba:' => '🕋', ':kangaroo:' => '🦘', - ':karate-uniform:' => '🥋', - ':kayak:' => '🛶', ':key:' => '🔑', ':keycap-ten:' => '🔟', ':khanda:' => '🪯', @@ -634,28 +586,22 @@ ':large-yellow-square:' => '🟨', ':last-quarter-moon:' => '🌗', ':last-quarter-moon-with-face:' => '🌜', - ':latin-cross:' => '✝️', ':laughing:' => '😆', ':leafy-green:' => '🥬', ':leaves:' => '🍃', ':ledger:' => '📒', ':left-facing-fist:' => '🤛', - ':left-fist:' => '🤛', ':left-luggage:' => '🛅', - ':left-speech-bubble:' => '🗨️', ':leftwards-hand:' => '🫲', ':leftwards-pushing-hand:' => '🫷', ':leg:' => '🦵', ':lemon:' => '🍋', ':leo:' => '♌', ':leopard:' => '🐆', - ':liar:' => '🤥', ':libra:' => '♎', ':light-blue-heart:' => '🩵', ':light-rail:' => '🚈', ':link:' => '🔗', - ':linked-paperclips:' => '🖇️', - ':lion:' => '🦁', ':lion-face:' => '🦁', ':lips:' => '👄', ':lipstick:' => '💄', @@ -675,10 +621,6 @@ ':love-letter:' => '💌', ':low-battery:' => '🪫', ':low-brightness:' => '🔅', - ':lower-left-ballpoint-pen:' => '🖊️', - ':lower-left-crayon:' => '🖍️', - ':lower-left-fountain-pen:' => '🖋️', - ':lower-left-paintbrush:' => '🖌️', ':luggage:' => '🧳', ':lungs:' => '🫁', ':lying-face:' => '🤥', @@ -692,17 +634,14 @@ ':mailbox-closed:' => '📪', ':mailbox-with-mail:' => '📬', ':mailbox-with-no-mail:' => '📭', - ':male-dancer:' => '🕺', ':mammoth:' => '🦣', ':man:' => '👨', ':man-and-woman-holding-hands:' => '👫', ':man-dancing:' => '🕺', - ':man-in-business-suit-levitating:' => '🕴️', ':man-with-gua-pi-mao:' => '👲', ':man-with-turban:' => '👳‍♂', ':mango:' => '🥭', ':mans-shoe:' => '👞', - ':mantlepiece-clock:' => '🕰', ':manual-wheelchair:' => '🦽', ':maple-leaf:' => '🍁', ':maracas:' => '🪇', @@ -747,7 +686,6 @@ ':mosquito:' => '🦟', ':mother-christmas:' => '🤶', ':motor-scooter:' => '🛵', - ':motorbike:' => '🛵', ':motorized-wheelchair:' => '🦼', ':mount-fuji:' => '🗻', ':mountain-bicyclist:' => '🚵', @@ -767,7 +705,6 @@ ':mute:' => '🔇', ':nail-care:' => '💅', ':name-badge:' => '📛', - ':national-park:' => '🏞️', ':nauseated-face:' => '🤢', ':nazar-amulet:' => '🧿', ':necktie:' => '👔', @@ -780,7 +717,6 @@ ':new-moon:' => '🌑', ':new-moon-with-face:' => '🌚', ':newspaper:' => '📰', - ':next-track:' => '⏭', ':ng:' => '🆖', ':night-with-stars:' => '🌃', ':ninja:' => '🥷', @@ -805,11 +741,9 @@ ':octopus:' => '🐙', ':oden:' => '🍢', ':office:' => '🏢', - ':oil-drum:' => '🛢️', ':ok:' => '🆗', ':ok-hand:' => '👌', ':ok-woman:' => '🙆‍♀', - ':old-key:' => '🗝️', ':older-adult:' => '🧓', ':older-man:' => '👴', ':older-woman:' => '👵', @@ -835,7 +769,6 @@ ':ox:' => '🐂', ':oyster:' => '🦪', ':package:' => '📦', - ':paella:' => '🥘', ':page-facing-up:' => '📄', ':page-with-curl:' => '📃', ':pager:' => '📟', @@ -850,11 +783,9 @@ ':parrot:' => '🦜', ':partly-sunny:' => '⛅', ':partying-face:' => '🥳', - ':passenger-ship:' => '🛳️', ':passport-control:' => '🛂', ':paw-prints:' => '🐾', ':pea-pod:' => '🫛', - ':peace-symbol:' => '☮️', ':peach:' => '🍑', ':peacock:' => '🦚', ':peanuts:' => '🥜', @@ -871,7 +802,6 @@ ':person-in-lotus-position:' => '🧘', ':person-in-steamy-room:' => '🧖', ':person-in-tuxedo:' => '🤵', - ':person-with-ball:' => '⛹️', ':person-with-blond-hair:' => '👱', ':person-with-crown:' => '🫅', ':person-with-headscarf:' => '🧕', @@ -900,7 +830,6 @@ ':point-right:' => '👉', ':point-up-2:' => '👆', ':police-car:' => '🚓', - ':poo:' => '💩', ':poodle:' => '🐩', ':poop:' => '💩', ':popcorn:' => '🍿', @@ -921,7 +850,6 @@ ':pregnant-person:' => '🫄', ':pregnant-woman:' => '🤰', ':pretzel:' => '🥨', - ':previous-track:' => '⏮', ':prince:' => '🤴', ':princess:' => '👸', ':probing-cane:' => '🦯', @@ -935,19 +863,13 @@ ':rabbit2:' => '🐇', ':raccoon:' => '🦝', ':racehorse:' => '🐎', - ':racing-car:' => '🏎️', - ':racing-motorcycle:' => '🏍️', ':radio:' => '📻', ':radio-button:' => '🔘', - ':radioactive-sign:' => '☢️', ':rage:' => '😡', - ':railroad-track:' => '🛤', ':railway-car:' => '🚃', ':rainbow:' => '🌈', ':raised-back-of-hand:' => '🤚', ':raised-hand:' => '✋', - ':raised-hand-with-fingers-splayed:' => '🖐️', - ':raised-hand-with-part-between-middle-and-ring-fingers:' => '🖖', ':raised-hands:' => '🙌', ':raising-hand:' => '🙋', ':ram:' => '🐏', @@ -971,9 +893,7 @@ ':rice-ball:' => '🍙', ':rice-cracker:' => '🍘', ':rice-scene:' => '🎑', - ':right-anger-bubble:' => '🗯️', ':right-facing-fist:' => '🤜', - ':right-fist:' => '🤜', ':rightwards-hand:' => '🫱', ':rightwards-pushing-hand:' => '🫸', ':ring:' => '💍', @@ -983,7 +903,6 @@ ':rock:' => '🪨', ':rocket:' => '🚀', ':roll-of-paper:' => '🧻', - ':rolled-up-newspaper:' => '🗞️', ':roller-coaster:' => '🎢', ':roller-skate:' => '🛼', ':rolling-on-the-floor-laughing:' => '🤣', @@ -1030,13 +949,11 @@ ':serious-face-with-symbols-covering-mouth:' => '🤬', ':sewing-needle:' => '🪡', ':shaking-face:' => '🫨', - ':shaking-hands:' => '🤝', ':shallow-pan-of-food:' => '🥘', ':shark:' => '🦈', ':shaved-ice:' => '🍧', ':sheep:' => '🐑', ':shell:' => '🐚', - ':shelled-peanut:' => '🥜', ':ship:' => '🚢', ':shirt:' => '👕', ':shit:' => '💩', @@ -1048,12 +965,10 @@ ':shrimp:' => '🦐', ':shrug:' => '🤷', ':shushing-face:' => '🤫', - ':sick:' => '🤢', ':sign-of-the-horns:' => '🤘', ':signal-strength:' => '📶', ':six-pointed-star:' => '🔯', ':skateboard:' => '🛹', - ':skeleton:' => '💀', ':ski:' => '🎿', ':skin-tone-2:' => '🏻', ':skin-tone-3:' => '🏼', @@ -1061,18 +976,15 @@ ':skin-tone-5:' => '🏾', ':skin-tone-6:' => '🏿', ':skull:' => '💀', - ':skull-and-crossbones:' => '☠️', ':skunk:' => '🦨', ':sled:' => '🛷', ':sleeping:' => '😴', ':sleeping-accommodation:' => '🛌', ':sleepy:' => '😪', - ':sleuth-or-spy:' => '🕵️', ':slightly-frowning-face:' => '🙁', ':slightly-smiling-face:' => '🙂', ':slot-machine:' => '🎰', ':sloth:' => '🦥', - ':small-airplane:' => '🛩️', ':small-blue-diamond:' => '🔹', ':small-orange-diamond:' => '🔸', ':small-red-triangle:' => '🔺', @@ -1090,9 +1002,7 @@ ':smoking:' => '🚬', ':snail:' => '🐌', ':snake:' => '🐍', - ':sneeze:' => '🤧', ':sneezing-face:' => '🤧', - ':snow-capped-mountain:' => '🏔️', ':snowboarder:' => '🏂', ':snowman-without-snow:' => '⛄', ':soap:' => '🧼', @@ -1110,11 +1020,8 @@ ':sparkling-heart:' => '💖', ':speak-no-evil:' => '🙊', ':speaker:' => '🔈', - ':speaking-head-in-silhouette:' => '🗣️', ':speech-balloon:' => '💬', ':speedboat:' => '🚤', - ':spiral-calendar-pad:' => '🗓️', - ':spiral-note-pad:' => '🗒️', ':spock-hand:' => '🖖', ':sponge:' => '🧽', ':spoon:' => '🥄', @@ -1130,15 +1037,12 @@ ':steam-locomotive:' => '🚂', ':stethoscope:' => '🩺', ':stew:' => '🍲', - ':stop-sign:' => '🛑', ':straight-ruler:' => '📏', ':strawberry:' => '🍓', ':stuck-out-tongue:' => '😛', ':stuck-out-tongue-closed-eyes:' => '😝', ':stuck-out-tongue-winking-eye:' => '😜', - ':studio-microphone:' => '🎙️', ':stuffed-flatbread:' => '🥙', - ':stuffed-pita:' => '🥙', ':sun-with-face:' => '🌞', ':sunflower:' => '🌻', ':sunglasses:' => '😎', @@ -1159,7 +1063,6 @@ ':synagogue:' => '🕍', ':syringe:' => '💉', ':t-rex:' => '🦖', - ':table-tennis:' => '🏓', ':table-tennis-paddle-and-ball:' => '🏓', ':taco:' => '🌮', ':tada:' => '🎉', @@ -1183,14 +1086,11 @@ ':thong-sandal:' => '🩴', ':thought-balloon:' => '💭', ':thread:' => '🧵', - ':three-button-mouse:' => '🖱️', ':thumbsdown:' => '👎', ':thumbsup:' => '👍', - ':thunder-cloud-and-rain:' => '⛈️', ':ticket:' => '🎫', ':tiger:' => '🐯', ':tiger2:' => '🐅', - ':timer-clock:' => '⏲️', ':tired-face:' => '😫', ':toilet:' => '🚽', ':tokyo-tower:' => '🗼', @@ -1237,7 +1137,6 @@ ':u7121:' => '🈚', ':u7533:' => '🈸', ':u7981:' => '🈲', - ':umbrella-on-ground:' => '⛱️', ':umbrella-with-rain-drops:' => '☔', ':unamused:' => '😒', ':underage:' => '🔞', @@ -1266,29 +1165,22 @@ ':watermelon:' => '🍉', ':wave:' => '👋', ':waving-black-flag:' => '🏴', - ':waving-white-flag:' => '🏳️', ':waxing-crescent-moon:' => '🌒', ':waxing-gibbous-moon:' => '🌔', ':wc:' => '🚾', ':weary:' => '😩', ':wedding:' => '💒', - ':weight-lifter:' => '🏋️', ':whale:' => '🐳', ':whale2:' => '🐋', ':wheel:' => '🛞', ':wheelchair:' => '♿', - ':whisky:' => '🥃', ':white-check-mark:' => '✅', ':white-circle:' => '⚪', ':white-flower:' => '💮', - ':white-frowning-face:' => '☹️', ':white-heart:' => '🤍', ':white-large-square:' => '⬜', ':white-medium-small-square:' => '◽', ':white-square-button:' => '🔳', - ':white-sun-behind-cloud:' => '🌥', - ':white-sun-behind-cloud-with-rain:' => '🌦', - ':white-sun-with-small-cloud:' => '🌤', ':wilted-flower:' => '🥀', ':wind-chime:' => '🎐', ':window:' => '🪟', @@ -1306,13 +1198,10 @@ ':womens:' => '🚺', ':wood:' => '🪵', ':woozy-face:' => '🥴', - ':world-map:' => '🗺️', ':worm:' => '🪱', ':worried:' => '😟', - ':worship-symbol:' => '🛐', ':wrench:' => '🔧', ':wrestlers:' => '🤼', - ':wrestling:' => '🤼', ':x:' => '❌', ':x-ray:' => '🩻', ':yarn:' => '🧶', @@ -1332,9 +1221,7 @@ ':3rd-place-medal:' => '🥉', ':a:' => '🅰️', ':airplane:' => '✈️', - ':airplane-small:' => '🛩', ':alembic:' => '⚗️', - ':anger-right:' => '🗯', ':arrow-backward:' => '◀️', ':arrow-down:' => '⬇️', ':arrow-forward:' => '▶️', @@ -1350,19 +1237,18 @@ ':arrow-upper-left:' => '↖️', ':arrow-upper-right:' => '↗️', ':artificial-satellite:' => '🛰', - ':atom:' => '⚛', + ':atom-symbol:' => '⚛️', ':b:' => '🅱️', ':badminton:' => '🏸', ':balance-scale:' => '⚖', - ':ballot-box:' => '🗳', + ':bald:' => '🦲', + ':ballot-box:' => '🗳️', ':ballot-box-with-check:' => '☑️', ':bangbang:' => '‼️', - ':basketball-player:' => '⛹', - ':beach:' => '🏖', - ':beach-umbrella:' => '🏖', + ':beach-umbrella:' => '⛱️', ':bed:' => '🛏️', - ':bellhop:' => '🛎', - ':biohazard:' => '☣', + ':bellhop-bell:' => '🛎️', + ':biohazard:' => '☣️', ':black-flag:' => '🏴', ':black-medium-square:' => '◼️', ':black-nib:' => '✒️', @@ -1370,15 +1256,17 @@ ':blond-haired-person:' => '👱', ':blue-square:' => '🟦', ':bouncing-ball-person:' => '⛹', + ':brick:' => '🧱', ':brown-circle:' => '🟤', ':brown-square:' => '🟫', + ':building-construction:' => '🏗️', ':business-suit-levitating:' => '🕴', - ':calendar-spiral:' => '🗓', ':call-me:' => '🤙', ':camera-flash:' => '📸', ':camping:' => '🏕️', ':candle:' => '🕯️', - ':card-box:' => '🗃', + ':card-file-box:' => '🗃️', + ':card-index-dividers:' => '🗂️', ':cartwheel:' => '🤸', ':cartwheeling:' => '🤸', ':chains:' => '⛓️', @@ -1391,53 +1279,49 @@ ':clamp:' => '🗜', ':classical-building:' => '🏛️', ':climbing:' => '🧗', - ':clock:' => '🕰', ':cloud:' => '☁️', - ':cloud-lightning:' => '🌩', - ':cloud-rain:' => '🌧', - ':cloud-snow:' => '🌨', - ':cloud-tornado:' => '🌪', + ':cloud-with-lightning:' => '🌩', ':cloud-with-lightning-and-rain:' => '⛈', + ':cloud-with-rain:' => '🌧', + ':cloud-with-snow:' => '🌨', ':clown:' => '🤡', ':clubs:' => '♣️', ':coffin:' => '⚰️', ':comet:' => '☄️', - ':compression:' => '🗜️', ':computer-mouse:' => '🖱', ':congratulations:' => '㊗️', - ':construction-site:' => '🏗', ':control-knobs:' => '🎛️', ':copyright:' => '©️', - ':couch:' => '🛋', + ':couch-and-lamp:' => '🛋️', ':cowboy:' => '🤠', ':cowboy-hat-face:' => '🤠', - ':crayon:' => '🖍', + ':crayon:' => '🖍️', ':cricket-game:' => '🏏', - ':cross:' => '✝', ':crossed-swords:' => '⚔️', - ':cruise-ship:' => '🛳', + ':curly-hair:' => '🦱', ':cursing-face:' => '🤬', - ':dagger:' => '🗡', + ':dagger:' => '🗡️', ':dark-sunglasses:' => '🕶️', ':derelict-house:' => '🏚', ':desert:' => '🏜️', - ':desktop:' => '🖥', + ':desert-island:' => '🏝️', + ':desktop-computer:' => '🖥️', ':detective:' => '🕵', ':diamonds:' => '♦️', - ':dividers:' => '🗂', - ':dove:' => '🕊', + ':dove:' => '🕊️', ':drum:' => '🥁', ':eight-pointed-black-star:' => '✴️', ':eight-spoked-asterisk:' => '✳️', - ':eject:' => '⏏️', ':eject-button:' => '⏏', + ':email:' => '✉️', ':envelope:' => '✉️', ':eye:' => '👁️', + ':facepalm:' => '🤦', ':female-sign:' => '♀️', ':ferry:' => '⛴️', ':field-hockey:' => '🏑', ':file-cabinet:' => '🗄️', - ':film-frames:' => '🎞️', + ':film-projector:' => '📽️', ':film-strip:' => '🎞', ':fingers-crossed:' => '🤞', ':first-place:' => '🥇', @@ -1446,78 +1330,68 @@ ':fist-raised:' => '✊', ':fist-right:' => '🤜', ':flag-black:' => '🏴', - ':flag-white:' => '🏳', ':flat-shoe:' => '🥿', ':fleur-de-lis:' => '⚜️', ':flight-arrival:' => '🛬', ':flight-departure:' => '🛫', ':fog:' => '🌫️', - ':fork-knife-plate:' => '🍽', ':fountain-pen:' => '🖋', ':fox:' => '🦊', - ':frame-photo:' => '🖼', ':framed-picture:' => '🖼', ':french-bread:' => '🥖', ':frowning-face:' => '☹', ':frowning-person:' => '🙍', - ':frowning2:' => '☹', ':fu:' => '🖕', + ':funeral-urn:' => '⚱️', ':gear:' => '⚙️', ':giraffe:' => '🦒', ':goal:' => '🥅', - ':golfer:' => '🏌️', ':golfing:' => '🏌', ':green-circle:' => '🟢', ':green-square:' => '🟩', ':guard:' => '💂', - ':hammer-pick:' => '⚒', + ':hammer-and-pick:' => '⚒️', + ':hammer-and-wrench:' => '🛠️', ':hand-over-mouth:' => '🤭', - ':hand-splayed:' => '🖐', ':handball-person:' => '🤾', ':head-bandage:' => '🤕', ':heart:' => '❤️', - ':heart-exclamation:' => '❣', ':hearts:' => '♥️', ':heavy-check-mark:' => '✔️', ':heavy-heart-exclamation:' => '❣', ':heavy-multiplication-x:' => '✖️', - ':helmet-with-cross:' => '⛑', ':hockey:' => '🏒', ':hole:' => '🕳️', - ':homes:' => '🏘', ':hot-pepper:' => '🌶️', ':hotsprings:' => '♨️', - ':house-abandoned:' => '🏚', ':houses:' => '🏘', ':hugging:' => '🤗', ':hugs:' => '🤗', + ':ice:' => '🧊', ':ice-hockey:' => '🏒', ':ice-skate:' => '⛸️', ':infinity:' => '♾️', ':information-source:' => 'ℹ️', ':interrobang:' => '⁉️', - ':island:' => '🏝', ':joystick:' => '🕹️', ':juggling-person:' => '🤹', - ':key2:' => '🗝', ':keyboard:' => '⌨️', ':kick-scooter:' => '🛴', ':kiwi:' => '🥝', ':kiwi-fruit:' => '🥝', ':label:' => '🏷️', + ':latin-cross:' => '✝️', ':left-right-arrow:' => '↔️', + ':left-speech-bubble:' => '🗨️', ':leftwards-arrow-with-hook:' => '↩️', ':level-slider:' => '🎚️', - ':levitate:' => '🕴', - ':lifter:' => '🏋', + ':lion:' => '🦁', ':lotus-position:' => '🧘', ':love-you-gesture:' => '🤟', ':m:' => 'Ⓜ️', ':male-sign:' => '♂️', - ':man-in-tuxedo:' => '🤵‍♂️', ':mandarin:' => '🍊', ':mantelpiece-clock:' => '🕰️', - ':map:' => '🗺', ':mate:' => '🧉', ':medal:' => '🎖️', ':medal-military:' => '🎖', @@ -1525,47 +1399,45 @@ ':medical-symbol:' => '⚕️', ':menorah:' => '🕎', ':metal:' => '🤘', - ':microphone2:' => '🎙', - ':military-medal:' => '🎖', ':milk:' => '🥛', ':milk-glass:' => '🥛', ':money-mouth:' => '🤑', ':monocle-face:' => '🧐', ':motor-boat:' => '🛥️', - ':motorboat:' => '🛥', - ':motorcycle:' => '🏍', + ':motorcycle:' => '🏍️', ':motorway:' => '🛣️', ':mountain:' => '⛰️', - ':mountain-snow:' => '🏔', - ':mouse-three-button:' => '🖱', + ':mountain-snow:' => '🏔️', + ':national-park:' => '🏞️', ':nerd:' => '🤓', ':newspaper-roll:' => '🗞', - ':newspaper2:' => '🗞', ':next-track-button:' => '⏭', - ':notepad-spiral:' => '🗒', ':o2:' => '🅾️', - ':oil:' => '🛢', + ':oil-drum:' => '🛢️', ':ok-person:' => '🙆', - ':om:' => '🇴🇲', - ':om-symbol:' => '🕉️', + ':old-key:' => '🗝️', + ':older-person:' => '🧓', + ':om:' => '🕉', ':open-umbrella:' => '☂', ':orange:' => '🍊', ':orange-circle:' => '🟠', ':orange-square:' => '🟧', ':orthodox-cross:' => '☦️', - ':paintbrush:' => '🖌', - ':paperclips:' => '🖇', + ':paintbrush:' => '🖌️', + ':paperclips:' => '🖇️', ':parasol-on-ground:' => '⛱', - ':park:' => '🏞', ':parking:' => '🅿️', ':part-alternation-mark:' => '〽️', - ':pause-button:' => '⏸', - ':peace:' => '☮', + ':passenger-ship:' => '🛳️', + ':pause-button:' => '⏸️', + ':peace-symbol:' => '☮️', ':pen:' => '🖊', - ':pen-ballpoint:' => '🖊', - ':pen-fountain:' => '🖋', ':pencil2:' => '✏️', + ':person:' => '🧑', + ':person-beard:' => '🧔', ':person-fencing:' => '🤺', + ':person-kneeling:' => '🧎', + ':person-standing:' => '🧍', ':person-with-turban:' => '👳', ':person-with-veil:' => '👰', ':phone:' => '☎️', @@ -1573,28 +1445,30 @@ ':ping-pong:' => '🏓', ':plate-with-cutlery:' => '🍽', ':play-or-pause-button:' => '⏯', - ':play-pause:' => '⏯', ':point-up:' => '☝️', ':police-officer:' => '👮', ':pout:' => '😡', ':pouting-face:' => '🙎', ':previous-track-button:' => '⏮', ':printer:' => '🖨️', - ':projector:' => '📽', ':purple-circle:' => '🟣', ':purple-square:' => '🟪', - ':race-car:' => '🏎', - ':radioactive:' => '☢', + ':puzzle-piece:' => '🧩', + ':racing-car:' => '🏎️', + ':radioactive:' => '☢️', ':railway-track:' => '🛤️', ':raised-eyebrow:' => '🤨', - ':record-button:' => '⏺', + ':raised-hand-with-fingers-splayed:' => '🖐️', + ':record-button:' => '⏺️', ':recycle:' => '♻️', + ':red-hair:' => '🦰', ':red-square:' => '🟥', ':registered:' => '®️', ':relaxed:' => '☺️', ':reminder-ribbon:' => '🎗️', ':rescue-worker-helmet:' => '⛑', ':rhino:' => '🦏', + ':right-anger-bubble:' => '🗯️', ':robot:' => '🤖', ':rofl:' => '🤣', ':roll-eyes:' => '🙄', @@ -1603,9 +1477,7 @@ ':sa:' => '🈂️', ':salad:' => '🥗', ':satellite:' => '🛰️', - ':satellite-orbital:' => '🛰', ':sauna-person:' => '🧖', - ':scales:' => '⚖️', ':scissors:' => '✂️', ':second-place:' => '🥈', ':secret:' => '㊙️', @@ -1613,32 +1485,32 @@ ':shield:' => '🛡️', ':shinto-shrine:' => '⛩️', ':shopping:' => '🛍', - ':shopping-bags:' => '🛍️', ':shopping-cart:' => '🛒', ':skier:' => '⛷️', - ':skull-crossbones:' => '☠', + ':skull-and-crossbones:' => '☠️', ':sleeping-bed:' => '🛌', ':slight-frown:' => '🙁', ':slight-smile:' => '🙂', + ':small-airplane:' => '🛩️', + ':smiling-face-with-hearts:' => '🥰', ':smiling-face-with-three-hearts:' => '🥰', ':snowflake:' => '❄️', ':snowman:' => '☃️', ':snowman-with-snow:' => '☃', - ':snowman2:' => '☃', ':spades:' => '♠️', ':sparkle:' => '❇️', - ':speaking-head:' => '🗣', - ':speech-left:' => '🗨', + ':speaking-head:' => '🗣️', ':spider:' => '🕷️', ':spider-web:' => '🕸️', ':spiral-calendar:' => '🗓', ':spiral-notepad:' => '🗒', - ':spy:' => '🕵', ':stadium:' => '🏟️', ':star-and-crescent:' => '☪️', ':star-of-david:' => '✡️', - ':stop-button:' => '⏹', + ':stop-button:' => '⏹️', + ':stop-sign:' => '🛑', ':stopwatch:' => '⏱️', + ':studio-microphone:' => '🎙️', ':sun-behind-large-cloud:' => '🌥', ':sun-behind-rain-cloud:' => '🌦️', ':sun-behind-small-cloud:' => '🌤', @@ -1650,9 +1522,8 @@ ':thermometer-face:' => '🤒', ':thinking:' => '🤔', ':third-place:' => '🥉', - ':thunder-cloud-rain:' => '⛈', - ':tickets:' => '🎟', - ':timer:' => '⏲', + ':tickets:' => '🎟️', + ':timer-clock:' => '⏲️', ':tipping-hand-person:' => '💁', ':tm:' => '™️', ':tone1:' => '🏻', @@ -1660,18 +1531,13 @@ ':tone3:' => '🏽', ':tone4:' => '🏾', ':tone5:' => '🏿', - ':tools:' => '🛠', ':tornado:' => '🌪️', - ':track-next:' => '⏭', - ':track-previous:' => '⏮', ':trackball:' => '🖲️', ':transgender-symbol:' => '⚧️', ':u6708:' => '🈷️', ':umbrella:' => '☂️', - ':umbrella2:' => '☂', ':unicorn:' => '🦄', ':upside-down:' => '🙃', - ':urn:' => '⚱', ':v:' => '✌️', ':vomiting-face:' => '🤮', ':vulcan:' => '🖖', @@ -1681,136 +1547,43 @@ ':wavy-dash:' => '〰️', ':weight-lifting:' => '🏋', ':wheel-of-dharma:' => '☸️', + ':white-cane:' => '🦯', ':white-flag:' => '🏳', + ':white-hair:' => '🦳', ':white-medium-square:' => '◻️', ':white-small-square:' => '▫️', - ':white-sun-cloud:' => '🌥', - ':white-sun-rain-cloud:' => '🌦', - ':white-sun-small-cloud:' => '🌤', ':wilted-rose:' => '🥀', - ':wind-blowing-face:' => '🌬️', ':wind-face:' => '🌬', ':woman-dancing:' => '💃', ':woman-with-headscarf:' => '🧕', + ':world-map:' => '🗺️', + ':wrestling:' => '🤼', ':writing-hand:' => '✍️', ':yellow-circle:' => '🟡', ':yellow-square:' => '🟨', ':yin-yang:' => '☯️', ':zebra:' => '🦓', ':zipper-mouth:' => '🤐', - ':+1-tone1:' => '👍🏻', - ':+1-tone2:' => '👍🏼', - ':+1-tone3:' => '👍🏽', - ':+1-tone4:' => '👍🏾', - ':+1-tone5:' => '👍🏿', - ':-1-tone1:' => '👎🏻', - ':-1-tone2:' => '👎🏼', - ':-1-tone3:' => '👎🏽', - ':-1-tone4:' => '👎🏾', - ':-1-tone5:' => '👎🏿', - ':ac:' => '🇦🇨', - ':ad:' => '🇦🇩', - ':ae:' => '🇦🇪', - ':af:' => '🇦🇫', - ':ag:' => '🇦🇬', - ':ai:' => '🇦🇮', - ':al:' => '🇦🇱', - ':am:' => '🇦🇲', - ':ao:' => '🇦🇴', - ':aq:' => '🇦🇶', - ':ar:' => '🇦🇷', - ':as:' => '🇦🇸', - ':at:' => '🇦🇹', - ':au:' => '🇦🇺', - ':aw:' => '🇦🇼', - ':ax:' => '🇦🇽', - ':az:' => '🇦🇿', - ':ba:' => '🇧🇦', - ':back-of-hand-tone1:' => '🤚🏻', - ':back-of-hand-tone2:' => '🤚🏼', - ':back-of-hand-tone3:' => '🤚🏽', - ':back-of-hand-tone4:' => '🤚🏾', - ':back-of-hand-tone5:' => '🤚🏿', + ':admission-tickets:' => '🎟️', + ':ballot-box-with-ballot:' => '🗳️', ':barely-sunny:' => '🌥️', - ':bb:' => '🇧🇧', - ':bd:' => '🇧🇩', - ':be:' => '🇧🇪', - ':bf:' => '🇧🇫', - ':bg:' => '🇧🇬', - ':bh:' => '🇧🇭', - ':bi:' => '🇧🇮', - ':bj:' => '🇧🇯', - ':bl:' => '🇧🇱', + ':beach-with-umbrella:' => '🏖️', + ':biohazard-sign:' => '☣️', ':black-circle-for-record:' => '⏺️', ':black-left-pointing-double-triangle-with-vertical-bar:' => '⏮️', ':black-right-pointing-double-triangle-with-vertical-bar:' => '⏭️', ':black-right-pointing-triangle-with-double-vertical-bar:' => '⏯️', ':black-square-for-stop:' => '⏹️', - ':bm:' => '🇧🇲', - ':bn:' => '🇧🇳', - ':bo:' => '🇧🇴', - ':bq:' => '🇧🇶', - ':br:' => '🇧🇷', - ':bs:' => '🇧🇸', - ':bt:' => '🇧🇹', - ':bv:' => '🇧🇻', - ':bw:' => '🇧🇼', - ':by:' => '🇧🇾', - ':bz:' => '🇧🇿', - ':ca:' => '🇨🇦', - ':call-me-hand-tone1:' => '🤙🏻', - ':call-me-hand-tone2:' => '🤙🏼', - ':call-me-hand-tone3:' => '🤙🏽', - ':call-me-hand-tone4:' => '🤙🏾', - ':call-me-hand-tone5:' => '🤙🏿', - ':cc:' => '🇨🇨', - ':cf:' => '🇨🇫', - ':cg:' => '🇨🇬', - ':ch:' => '🇨🇭', - ':chile:' => '🇨🇱', - ':ci:' => '🇨🇮', - ':ck:' => '🇨🇰', - ':cm:' => '🇨🇲', ':cn:' => '🇨🇳', - ':co:' => '🇨🇴', - ':congo:' => '🇨🇩', - ':cp:' => '🇨🇵', - ':cr:' => '🇨🇷', - ':cu:' => '🇨🇺', - ':cv:' => '🇨🇻', - ':cw:' => '🇨🇼', - ':cx:' => '🇨🇽', - ':cy:' => '🇨🇾', - ':cz:' => '🇨🇿', + ':compression:' => '🗜️', + ':dagger-knife:' => '🗡️', ':de:' => '🇩🇪', - ':dg:' => '🇩🇬', - ':dj:' => '🇩🇯', - ':dk:' => '🇩🇰', - ':dm:' => '🇩🇲', - ':do:' => '🇩🇴', - ':dz:' => '🇩🇿', - ':ea:' => '🇪🇦', - ':ec:' => '🇪🇨', - ':ee:' => '🇪🇪', - ':eg:' => '🇪🇬', - ':eh:' => '🇪🇭', - ':er:' => '🇪🇷', + ':derelict-house-building:' => '🏚️', + ':double-vertical-bar:' => '⏸️', + ':dove-of-peace:' => '🕊️', + ':eject:' => '⏏️', ':es:' => '🇪🇸', - ':et:' => '🇪🇹', - ':eu:' => '🇪🇺', - ':expecting-woman-tone1:' => '🤰🏻', - ':expecting-woman-tone2:' => '🤰🏼', - ':expecting-woman-tone3:' => '🤰🏽', - ':expecting-woman-tone4:' => '🤰🏾', - ':expecting-woman-tone5:' => '🤰🏿', - ':facepalm-tone1:' => '🤦🏻', - ':facepalm-tone2:' => '🤦🏼', - ':facepalm-tone3:' => '🤦🏽', - ':facepalm-tone4:' => '🤦🏾', - ':facepalm-tone5:' => '🤦🏿', - ':fi:' => '🇫🇮', - ':fj:' => '🇫🇯', - ':fk:' => '🇫🇰', + ':film-frames:' => '🎞️', ':flag-ac:' => '🇦🇨', ':flag-ad:' => '🇦🇩', ':flag-ae:' => '🇦🇪', @@ -2069,291 +1842,57 @@ ':flag-za:' => '🇿🇦', ':flag-zm:' => '🇿🇲', ':flag-zw:' => '🇿🇼', - ':fm:' => '🇫🇲', - ':fo:' => '🇫🇴', ':fr:' => '🇫🇷', - ':ga:' => '🇬🇦', + ':frame-with-picture:' => '🖼️', ':gb:' => '🇬🇧', - ':gd:' => '🇬🇩', - ':ge:' => '🇬🇪', - ':gf:' => '🇬🇫', - ':gg:' => '🇬🇬', - ':gh:' => '🇬🇭', - ':gi:' => '🇬🇮', - ':gl:' => '🇬🇱', - ':gm:' => '🇬🇲', - ':gn:' => '🇬🇳', - ':gp:' => '🇬🇵', - ':gq:' => '🇬🇶', - ':gr:' => '🇬🇷', - ':grandma-tone1:' => '👵🏻', - ':grandma-tone2:' => '👵🏼', - ':grandma-tone3:' => '👵🏽', - ':grandma-tone4:' => '👵🏾', - ':grandma-tone5:' => '👵🏿', - ':gs:' => '🇬🇸', - ':gt:' => '🇬🇹', - ':gu:' => '🇬🇺', - ':gw:' => '🇬🇼', - ':gy:' => '🇬🇾', - ':hand-with-index-and-middle-fingers-crossed-tone1:' => '🤞🏻', - ':hand-with-index-and-middle-fingers-crossed-tone2:' => '🤞🏼', - ':hand-with-index-and-middle-fingers-crossed-tone3:' => '🤞🏽', - ':hand-with-index-and-middle-fingers-crossed-tone4:' => '🤞🏾', - ':hand-with-index-and-middle-fingers-crossed-tone5:' => '🤞🏿', - ':hk:' => '🇭🇰', - ':hm:' => '🇭🇲', - ':hn:' => '🇭🇳', - ':hr:' => '🇭🇷', - ':ht:' => '🇭🇹', - ':hu:' => '🇭🇺', - ':ic:' => '🇮🇨', - ':ie:' => '🇮🇪', - ':il:' => '🇮🇱', - ':im:' => '🇮🇲', - ':in:' => '🇮🇳', - ':indonesia:' => '🇮🇩', - ':io:' => '🇮🇴', - ':iq:' => '🇮🇶', - ':ir:' => '🇮🇷', - ':is:' => '🇮🇸', + ':golfer:' => '🏌️', + ':heavy-heart-exclamation-mark-ornament:' => '❣️', + ':helmet-with-white-cross:' => '⛑️', + ':house-buildings:' => '🏘️', ':it:' => '🇮🇹', - ':je:' => '🇯🇪', - ':jm:' => '🇯🇲', - ':jo:' => '🇯🇴', ':jp:' => '🇯🇵', - ':juggler-tone1:' => '🤹🏻', - ':juggler-tone2:' => '🤹🏼', - ':juggler-tone3:' => '🤹🏽', - ':juggler-tone4:' => '🤹🏾', - ':juggler-tone5:' => '🤹🏿', - ':ke:' => '🇰🇪', - ':keycap-asterisk:' => '*⃣', - ':kg:' => '🇰🇬', - ':kh:' => '🇰🇭', - ':ki:' => '🇰🇮', - ':km:' => '🇰🇲', - ':kn:' => '🇰🇳', ':knife-fork-plate:' => '🍽️', - ':kp:' => '🇰🇵', ':kr:' => '🇰🇷', - ':kw:' => '🇰🇼', - ':ky:' => '🇰🇾', - ':kz:' => '🇰🇿', - ':la:' => '🇱🇦', - ':lb:' => '🇱🇧', - ':lc:' => '🇱🇨', - ':left-fist-tone1:' => '🤛🏻', - ':left-fist-tone2:' => '🤛🏼', - ':left-fist-tone3:' => '🤛🏽', - ':left-fist-tone4:' => '🤛🏾', - ':left-fist-tone5:' => '🤛🏿', - ':li:' => '🇱🇮', ':lightning:' => '🌩️', ':lightning-cloud:' => '🌩️', - ':lk:' => '🇱🇰', - ':lr:' => '🇱🇷', - ':ls:' => '🇱🇸', - ':lt:' => '🇱🇹', - ':lu:' => '🇱🇺', - ':lv:' => '🇱🇻', - ':ly:' => '🇱🇾', - ':ma:' => '🇲🇦', - ':male-dancer-tone1:' => '🕺🏻', - ':male-dancer-tone2:' => '🕺🏼', - ':male-dancer-tone3:' => '🕺🏽', - ':male-dancer-tone4:' => '🕺🏾', - ':male-dancer-tone5:' => '🕺🏿', - ':mc:' => '🇲🇨', - ':md:' => '🇲🇩', - ':me:' => '🇲🇪', - ':mf:' => '🇲🇫', - ':mg:' => '🇲🇬', - ':mh:' => '🇲🇭', - ':mk:' => '🇲🇰', - ':ml:' => '🇲🇱', - ':mm:' => '🇲🇲', - ':mn:' => '🇲🇳', - ':mo:' => '🇲🇴', + ':linked-paperclips:' => '🖇️', + ':lower-left-ballpoint-pen:' => '🖊️', + ':lower-left-crayon:' => '🖍️', + ':lower-left-fountain-pen:' => '🖋️', + ':lower-left-paintbrush:' => '🖌️', + ':man-in-business-suit-levitating:' => '🕴️', ':mostly-sunny:' => '🌤️', - ':mother-christmas-tone1:' => '🤶🏻', - ':mother-christmas-tone2:' => '🤶🏼', - ':mother-christmas-tone3:' => '🤶🏽', - ':mother-christmas-tone4:' => '🤶🏾', - ':mother-christmas-tone5:' => '🤶🏿', - ':mp:' => '🇲🇵', - ':mq:' => '🇲🇶', - ':mr:' => '🇲🇷', - ':ms:' => '🇲🇸', - ':mt:' => '🇲🇹', - ':mu:' => '🇲🇺', - ':mv:' => '🇲🇻', - ':mw:' => '🇲🇼', - ':mx:' => '🇲🇽', - ':my:' => '🇲🇾', - ':mz:' => '🇲🇿', - ':na:' => '🇳🇦', - ':nc:' => '🇳🇨', - ':ne:' => '🇳🇪', - ':nf:' => '🇳🇫', - ':ni:' => '🇳🇮', - ':nigeria:' => '🇳🇬', - ':nl:' => '🇳🇱', - ':no:' => '🇳🇴', - ':np:' => '🇳🇵', - ':nr:' => '🇳🇷', - ':nu:' => '🇳🇺', - ':nz:' => '🇳🇿', - ':pa:' => '🇵🇦', + ':om-symbol:' => '🕉️', ':partly-sunny-rain:' => '🌦️', - ':pe:' => '🇵🇪', - ':person-doing-cartwheel-tone1:' => '🤸🏻', - ':person-doing-cartwheel-tone2:' => '🤸🏼', - ':person-doing-cartwheel-tone3:' => '🤸🏽', - ':person-doing-cartwheel-tone4:' => '🤸🏾', - ':person-doing-cartwheel-tone5:' => '🤸🏿', - ':person-with-ball-tone1:' => '⛹🏻', - ':person-with-ball-tone2:' => '⛹🏼', - ':person-with-ball-tone3:' => '⛹🏽', - ':person-with-ball-tone4:' => '⛹🏾', - ':person-with-ball-tone5:' => '⛹🏿', - ':pf:' => '🇵🇫', - ':pg:' => '🇵🇬', - ':ph:' => '🇵🇭', - ':pk:' => '🇵🇰', - ':pl:' => '🇵🇱', - ':pm:' => '🇵🇲', - ':pn:' => '🇵🇳', - ':pr:' => '🇵🇷', - ':ps:' => '🇵🇸', - ':pt:' => '🇵🇹', - ':pw:' => '🇵🇼', - ':py:' => '🇵🇾', - ':qa:' => '🇶🇦', + ':person-with-ball:' => '⛹️', + ':racing-motorcycle:' => '🏍️', + ':radioactive-sign:' => '☢️', ':rain-cloud:' => '🌧️', - ':rainbow-flag:' => '🏳️‍🌈', - ':raised-hand-with-fingers-splayed-tone1:' => '🖐🏻', - ':raised-hand-with-fingers-splayed-tone2:' => '🖐🏼', - ':raised-hand-with-fingers-splayed-tone3:' => '🖐🏽', - ':raised-hand-with-fingers-splayed-tone4:' => '🖐🏾', - ':raised-hand-with-fingers-splayed-tone5:' => '🖐🏿', - ':raised-hand-with-part-between-middle-and-ring-fingers-tone1:' => '🖖🏻', - ':raised-hand-with-part-between-middle-and-ring-fingers-tone2:' => '🖖🏼', - ':raised-hand-with-part-between-middle-and-ring-fingers-tone3:' => '🖖🏽', - ':raised-hand-with-part-between-middle-and-ring-fingers-tone4:' => '🖖🏾', - ':raised-hand-with-part-between-middle-and-ring-fingers-tone5:' => '🖖🏿', - ':re:' => '🇷🇪', - ':reversed-hand-with-middle-finger-extended-tone1:' => '🖕🏻', - ':reversed-hand-with-middle-finger-extended-tone2:' => '🖕🏼', - ':reversed-hand-with-middle-finger-extended-tone3:' => '🖕🏽', - ':reversed-hand-with-middle-finger-extended-tone4:' => '🖕🏾', - ':reversed-hand-with-middle-finger-extended-tone5:' => '🖕🏿', - ':right-fist-tone1:' => '🤜🏻', - ':right-fist-tone2:' => '🤜🏼', - ':right-fist-tone3:' => '🤜🏽', - ':right-fist-tone4:' => '🤜🏾', - ':right-fist-tone5:' => '🤜🏿', - ':ro:' => '🇷🇴', - ':rs:' => '🇷🇸', + ':rolled-up-newspaper:' => '🗞️', ':ru:' => '🇷🇺', - ':rw:' => '🇷🇼', - ':saudi:' => '🇸🇦', - ':saudiarabia:' => '🇸🇦', - ':sb:' => '🇸🇧', - ':sc:' => '🇸🇨', - ':sd:' => '🇸🇩', - ':se:' => '🇸🇪', - ':sg:' => '🇸🇬', - ':sh:' => '🇸🇭', - ':shaking-hands-tone1:' => '🤝🏻', - ':shaking-hands-tone2:' => '🤝🏼', - ':shaking-hands-tone3:' => '🤝🏽', - ':shaking-hands-tone4:' => '🤝🏾', - ':shaking-hands-tone5:' => '🤝🏿', - ':si:' => '🇸🇮', - ':sign-of-the-horns-tone1:' => '🤘🏻', - ':sign-of-the-horns-tone2:' => '🤘🏼', - ':sign-of-the-horns-tone3:' => '🤘🏽', - ':sign-of-the-horns-tone4:' => '🤘🏾', - ':sign-of-the-horns-tone5:' => '🤘🏿', - ':sj:' => '🇸🇯', - ':sk:' => '🇸🇰', - ':sl:' => '🇸🇱', - ':sleuth-or-spy-tone1:' => '🕵🏻', - ':sleuth-or-spy-tone2:' => '🕵🏼', - ':sleuth-or-spy-tone3:' => '🕵🏽', - ':sleuth-or-spy-tone4:' => '🕵🏾', - ':sleuth-or-spy-tone5:' => '🕵🏿', - ':sm:' => '🇸🇲', - ':sn:' => '🇸🇳', + ':scales:' => '⚖️', + ':shopping-bags:' => '🛍️', + ':sleuth-or-spy:' => '🕵️', + ':snow-capped-mountain:' => '🏔️', ':snow-cloud:' => '🌨️', - ':so:' => '🇸🇴', - ':sr:' => '🇸🇷', - ':ss:' => '🇸🇸', - ':st:' => '🇸🇹', + ':speaking-head-in-silhouette:' => '🗣️', + ':spiral-calendar-pad:' => '🗓️', + ':spiral-note-pad:' => '🗒️', ':staff-of-aesculapius:' => '⚕️', ':sun-behind-cloud:' => '🌥️', ':sun-small-cloud:' => '🌤️', - ':sv:' => '🇸🇻', - ':sx:' => '🇸🇽', - ':sy:' => '🇸🇾', - ':sz:' => '🇸🇿', - ':ta:' => '🇹🇦', - ':tc:' => '🇹🇨', - ':td:' => '🇹🇩', - ':tf:' => '🇹🇫', - ':tg:' => '🇹🇬', - ':th:' => '🇹🇭', - ':tj:' => '🇹🇯', - ':tk:' => '🇹🇰', - ':tl:' => '🇹🇱', - ':tn:' => '🇹🇳', - ':to:' => '🇹🇴', + ':three-button-mouse:' => '🖱️', + ':thunder-cloud-and-rain:' => '⛈️', ':tornado-cloud:' => '🌪️', - ':tr:' => '🇹🇷', - ':tt:' => '🇹🇹', - ':turkmenistan:' => '🇹🇲', - ':tuvalu:' => '🇹🇻', - ':tuxedo-tone1:' => '🤵🏻', - ':tuxedo-tone2:' => '🤵🏼', - ':tuxedo-tone3:' => '🤵🏽', - ':tuxedo-tone4:' => '🤵🏾', - ':tuxedo-tone5:' => '🤵🏿', - ':tw:' => '🇹🇼', - ':tz:' => '🇹🇿', - ':ua:' => '🇺🇦', - ':ug:' => '🇺🇬', ':uk:' => '🇬🇧', - ':um:' => '🇺🇲', + ':umbrella-on-ground:' => '⛱️', ':us:' => '🇺🇸', - ':uy:' => '🇺🇾', - ':uz:' => '🇺🇿', - ':va:' => '🇻🇦', - ':vc:' => '🇻🇨', - ':ve:' => '🇻🇪', - ':vg:' => '🇻🇬', - ':vi:' => '🇻🇮', - ':vn:' => '🇻🇳', - ':vu:' => '🇻🇺', - ':weight-lifter-tone1:' => '🏋🏻', - ':weight-lifter-tone2:' => '🏋🏼', - ':weight-lifter-tone3:' => '🏋🏽', - ':weight-lifter-tone4:' => '🏋🏾', - ':weight-lifter-tone5:' => '🏋🏿', - ':wf:' => '🇼🇫', - ':wrestling-tone1:' => '🤼🏻', - ':wrestling-tone2:' => '🤼🏼', - ':wrestling-tone3:' => '🤼🏽', - ':wrestling-tone4:' => '🤼🏾', - ':wrestling-tone5:' => '🤼🏿', - ':ws:' => '🇼🇸', - ':xk:' => '🇽🇰', - ':ye:' => '🇾🇪', - ':yt:' => '🇾🇹', - ':za:' => '🇿🇦', - ':zm:' => '🇿🇲', - ':zw:' => '🇿🇼', + ':waving-white-flag:' => '🏳️', + ':weight-lifter:' => '🏋️', + ':white-frowning-face:' => '☹️', + ':wind-blowing-face:' => '🌬️', ':afghanistan:' => '🇦🇫', + ':airplane-small:' => '🛩️', ':aland-islands:' => '🇦🇽', ':albania:' => '🇦🇱', ':algeria:' => '🇩🇿', @@ -2364,6 +1903,7 @@ ':angel-tone3:' => '👼🏽', ':angel-tone4:' => '👼🏾', ':angel-tone5:' => '👼🏿', + ':anger-right:' => '🗯️', ':angola:' => '🇦🇴', ':anguilla:' => '🇦🇮', ':antarctica:' => '🇦🇶', @@ -2372,7 +1912,8 @@ ':armenia:' => '🇦🇲', ':aruba:' => '🇦🇼', ':ascension-island:' => '🇦🇨', - ':asterisk:' => '*⃣', + ':asterisk:' => '*️⃣', + ':atom:' => '⚛️', ':australia:' => '🇦🇺', ':austria:' => '🇦🇹', ':azerbaijan:' => '🇦🇿', @@ -2385,6 +1926,7 @@ ':bahrain:' => '🇧🇭', ':bangladesh:' => '🇧🇩', ':barbados:' => '🇧🇧', + ':basketball-player:' => '⛹️', ':basketball-player-tone1:' => '⛹🏻', ':basketball-player-tone2:' => '⛹🏼', ':basketball-player-tone3:' => '⛹🏽', @@ -2395,9 +1937,11 @@ ':bath-tone3:' => '🛀🏽', ':bath-tone4:' => '🛀🏾', ':bath-tone5:' => '🛀🏿', + ':beach:' => '🏖️', ':belarus:' => '🇧🇾', ':belgium:' => '🇧🇪', ':belize:' => '🇧🇿', + ':bellhop:' => '🛎️', ':benin:' => '🇧🇯', ':bermuda:' => '🇧🇲', ':bhutan:' => '🇧🇹', @@ -2421,6 +1965,11 @@ ':boy-tone4:' => '👦🏾', ':boy-tone5:' => '👦🏿', ':brazil:' => '🇧🇷', + ':breast-feeding-dark-skin-tone:' => '🤱🏿', + ':breast-feeding-light-skin-tone:' => '🤱🏻', + ':breast-feeding-medium-dark-skin-tone:' => '🤱🏾', + ':breast-feeding-medium-light-skin-tone:' => '🤱🏼', + ':breast-feeding-medium-skin-tone:' => '🤱🏽', ':bride-with-veil-tone1:' => '👰🏻', ':bride-with-veil-tone2:' => '👰🏼', ':bride-with-veil-tone3:' => '👰🏽', @@ -2432,6 +1981,7 @@ ':bulgaria:' => '🇧🇬', ':burkina-faso:' => '🇧🇫', ':burundi:' => '🇧🇮', + ':calendar-spiral:' => '🗓️', ':call-me-tone1:' => '🤙🏻', ':call-me-tone2:' => '🤙🏼', ':call-me-tone3:' => '🤙🏽', @@ -2442,6 +1992,7 @@ ':canada:' => '🇨🇦', ':canary-islands:' => '🇮🇨', ':cape-verde:' => '🇨🇻', + ':card-box:' => '🗃️', ':caribbean-netherlands:' => '🇧🇶', ':cartwheel-tone1:' => '🤸🏻', ':cartwheel-tone2:' => '🤸🏼', @@ -2452,6 +2003,12 @@ ':central-african-republic:' => '🇨🇫', ':ceuta-melilla:' => '🇪🇦', ':chad:' => '🇹🇩', + ':child-dark-skin-tone:' => '🧒🏿', + ':child-light-skin-tone:' => '🧒🏻', + ':child-medium-dark-skin-tone:' => '🧒🏾', + ':child-medium-light-skin-tone:' => '🧒🏼', + ':child-medium-skin-tone:' => '🧒🏽', + ':chile:' => '🇨🇱', ':christmas-island:' => '🇨🇽', ':clap-tone1:' => '👏🏻', ':clap-tone2:' => '👏🏼', @@ -2459,11 +2016,17 @@ ':clap-tone4:' => '👏🏾', ':clap-tone5:' => '👏🏿', ':clipperton-island:' => '🇨🇵', + ':clock:' => '🕰️', + ':cloud-lightning:' => '🌩️', + ':cloud-rain:' => '🌧️', + ':cloud-snow:' => '🌨️', + ':cloud-tornado:' => '🌪️', ':cocos-islands:' => '🇨🇨', ':colombia:' => '🇨🇴', ':comoros:' => '🇰🇲', ':congo-brazzaville:' => '🇨🇬', ':congo-kinshasa:' => '🇨🇩', + ':construction-site:' => '🏗️', ':construction-worker-tone1:' => '👷🏻', ':construction-worker-tone2:' => '👷🏼', ':construction-worker-tone3:' => '👷🏽', @@ -2477,7 +2040,15 @@ ':cop-tone5:' => '👮🏿', ':costa-rica:' => '🇨🇷', ':cote-divoire:' => '🇨🇮', + ':couch:' => '🛋️', + ':couple-with-heart-dark-skin-tone:' => '💑🏿', + ':couple-with-heart-light-skin-tone:' => '💑🏻', + ':couple-with-heart-medium-dark-skin-tone:' => '💑🏾', + ':couple-with-heart-medium-light-skin-tone:' => '💑🏼', + ':couple-with-heart-medium-skin-tone:' => '💑🏽', ':croatia:' => '🇭🇷', + ':cross:' => '✝️', + ':cruise-ship:' => '🛳️', ':cuba:' => '🇨🇺', ':curacao:' => '🇨🇼', ':cyprus:' => '🇨🇾', @@ -2487,8 +2058,15 @@ ':dancer-tone3:' => '💃🏽', ':dancer-tone4:' => '💃🏾', ':dancer-tone5:' => '💃🏿', + ':deaf-person-dark-skin-tone:' => '🧏🏿', + ':deaf-person-light-skin-tone:' => '🧏🏻', + ':deaf-person-medium-dark-skin-tone:' => '🧏🏾', + ':deaf-person-medium-light-skin-tone:' => '🧏🏼', + ':deaf-person-medium-skin-tone:' => '🧏🏽', ':denmark:' => '🇩🇰', + ':desktop:' => '🖥️', ':diego-garcia:' => '🇩🇬', + ':dividers:' => '🗂️', ':djibouti:' => '🇩🇯', ':dominica:' => '🇩🇲', ':dominican-republic:' => '🇩🇴', @@ -2497,20 +2075,36 @@ ':ear-tone3:' => '👂🏽', ':ear-tone4:' => '👂🏾', ':ear-tone5:' => '👂🏿', + ':ear-with-hearing-aid-dark-skin-tone:' => '🦻🏿', + ':ear-with-hearing-aid-light-skin-tone:' => '🦻🏻', + ':ear-with-hearing-aid-medium-dark-skin-tone:' => '🦻🏾', + ':ear-with-hearing-aid-medium-light-skin-tone:' => '🦻🏼', + ':ear-with-hearing-aid-medium-skin-tone:' => '🦻🏽', ':ecuador:' => '🇪🇨', ':egypt:' => '🇪🇬', ':eight:' => '8️⃣', ':el-salvador:' => '🇸🇻', + ':elf-dark-skin-tone:' => '🧝🏿', + ':elf-light-skin-tone:' => '🧝🏻', + ':elf-medium-dark-skin-tone:' => '🧝🏾', + ':elf-medium-light-skin-tone:' => '🧝🏼', + ':elf-medium-skin-tone:' => '🧝🏽', ':equatorial-guinea:' => '🇬🇶', ':eritrea:' => '🇪🇷', ':estonia:' => '🇪🇪', ':ethiopia:' => '🇪🇹', + ':eu:' => '🇪🇺', ':european-union:' => '🇪🇺', ':face-palm-tone1:' => '🤦🏻', ':face-palm-tone2:' => '🤦🏼', ':face-palm-tone3:' => '🤦🏽', ':face-palm-tone4:' => '🤦🏾', ':face-palm-tone5:' => '🤦🏿', + ':fairy-dark-skin-tone:' => '🧚🏿', + ':fairy-light-skin-tone:' => '🧚🏻', + ':fairy-medium-dark-skin-tone:' => '🧚🏾', + ':fairy-medium-light-skin-tone:' => '🧚🏼', + ':fairy-medium-skin-tone:' => '🧚🏽', ':falkland-islands:' => '🇫🇰', ':faroe-islands:' => '🇫🇴', ':fiji:' => '🇫🇯', @@ -2526,13 +2120,22 @@ ':fist-tone4:' => '✊🏾', ':fist-tone5:' => '✊🏿', ':five:' => '5️⃣', + ':flag-united-nations:' => '🇺🇳', + ':flag-white:' => '🏳️', + ':foot-dark-skin-tone:' => '🦶🏿', + ':foot-light-skin-tone:' => '🦶🏻', + ':foot-medium-dark-skin-tone:' => '🦶🏾', + ':foot-medium-light-skin-tone:' => '🦶🏼', + ':foot-medium-skin-tone:' => '🦶🏽', + ':fork-knife-plate:' => '🍽️', ':four:' => '4️⃣', + ':frame-photo:' => '🖼️', ':french-guiana:' => '🇬🇫', ':french-polynesia:' => '🇵🇫', ':french-southern-territories:' => '🇹🇫', + ':frowning2:' => '☹️', ':gabon:' => '🇬🇦', ':gambia:' => '🇬🇲', - ':gay-pride-flag:' => '🏳🌈', ':georgia:' => '🇬🇪', ':ghana:' => '🇬🇭', ':gibraltar:' => '🇬🇮', @@ -2562,11 +2165,18 @@ ':haircut-tone4:' => '💇🏾', ':haircut-tone5:' => '💇🏿', ':haiti:' => '🇭🇹', + ':hammer-pick:' => '⚒️', + ':hand-splayed:' => '🖐️', ':hand-splayed-tone1:' => '🖐🏻', ':hand-splayed-tone2:' => '🖐🏼', ':hand-splayed-tone3:' => '🖐🏽', ':hand-splayed-tone4:' => '🖐🏾', ':hand-splayed-tone5:' => '🖐🏿', + ':hand-with-index-finger-and-thumb-crossed-dark-skin-tone:' => '🫰🏿', + ':hand-with-index-finger-and-thumb-crossed-light-skin-tone:' => '🫰🏻', + ':hand-with-index-finger-and-thumb-crossed-medium-dark-skin-tone:' => '🫰🏾', + ':hand-with-index-finger-and-thumb-crossed-medium-light-skin-tone:' => '🫰🏼', + ':hand-with-index-finger-and-thumb-crossed-medium-skin-tone:' => '🫰🏽', ':handball-tone1:' => '🤾🏻', ':handball-tone2:' => '🤾🏼', ':handball-tone3:' => '🤾🏽', @@ -2579,6 +2189,14 @@ ':handshake-tone5:' => '🤝🏿', ':hash:' => '#️⃣', ':heard-mcdonald-islands:' => '🇭🇲', + ':heart-exclamation:' => '❣️', + ':heart-hands-dark-skin-tone:' => '🫶🏿', + ':heart-hands-light-skin-tone:' => '🫶🏻', + ':heart-hands-medium-dark-skin-tone:' => '🫶🏾', + ':heart-hands-medium-light-skin-tone:' => '🫶🏼', + ':heart-hands-medium-skin-tone:' => '🫶🏽', + ':helmet-with-cross:' => '⛑️', + ':homes:' => '🏘️', ':honduras:' => '🇭🇳', ':hong-kong:' => '🇭🇰', ':horse-racing-tone1:' => '🏇🏻', @@ -2586,9 +2204,16 @@ ':horse-racing-tone3:' => '🏇🏽', ':horse-racing-tone4:' => '🏇🏾', ':horse-racing-tone5:' => '🏇🏿', + ':house-abandoned:' => '🏚️', ':hungary:' => '🇭🇺', ':iceland:' => '🇮🇸', + ':index-pointing-at-the-viewer-dark-skin-tone:' => '🫵🏿', + ':index-pointing-at-the-viewer-light-skin-tone:' => '🫵🏻', + ':index-pointing-at-the-viewer-medium-dark-skin-tone:' => '🫵🏾', + ':index-pointing-at-the-viewer-medium-light-skin-tone:' => '🫵🏼', + ':index-pointing-at-the-viewer-medium-skin-tone:' => '🫵🏽', ':india:' => '🇮🇳', + ':indonesia:' => '🇮🇩', ':information-desk-person-tone1:' => '💁🏻', ':information-desk-person-tone2:' => '💁🏼', ':information-desk-person-tone3:' => '💁🏽', @@ -2597,6 +2222,7 @@ ':iran:' => '🇮🇷', ':iraq:' => '🇮🇶', ':ireland:' => '🇮🇪', + ':island:' => '🏝️', ':isle-of-man:' => '🇮🇲', ':israel:' => '🇮🇱', ':jamaica:' => '🇯🇲', @@ -2609,7 +2235,13 @@ ':juggling-tone5:' => '🤹🏿', ':kazakhstan:' => '🇰🇿', ':kenya:' => '🇰🇪', + ':key2:' => '🗝️', ':kiribati:' => '🇰🇮', + ':kiss-dark-skin-tone:' => '💏🏿', + ':kiss-light-skin-tone:' => '💏🏻', + ':kiss-medium-dark-skin-tone:' => '💏🏾', + ':kiss-medium-light-skin-tone:' => '💏🏼', + ':kiss-medium-skin-tone:' => '💏🏽', ':kosovo:' => '🇽🇰', ':kuwait:' => '🇰🇼', ':kyrgyzstan:' => '🇰🇬', @@ -2621,20 +2253,47 @@ ':left-facing-fist-tone3:' => '🤛🏽', ':left-facing-fist-tone4:' => '🤛🏾', ':left-facing-fist-tone5:' => '🤛🏿', + ':leftwards-hand-dark-skin-tone:' => '🫲🏿', + ':leftwards-hand-light-skin-tone:' => '🫲🏻', + ':leftwards-hand-medium-dark-skin-tone:' => '🫲🏾', + ':leftwards-hand-medium-light-skin-tone:' => '🫲🏼', + ':leftwards-hand-medium-skin-tone:' => '🫲🏽', + ':leftwards-pushing-hand-dark-skin-tone:' => '🫷🏿', + ':leftwards-pushing-hand-light-skin-tone:' => '🫷🏻', + ':leftwards-pushing-hand-medium-dark-skin-tone:' => '🫷🏾', + ':leftwards-pushing-hand-medium-light-skin-tone:' => '🫷🏼', + ':leftwards-pushing-hand-medium-skin-tone:' => '🫷🏽', + ':leg-dark-skin-tone:' => '🦵🏿', + ':leg-light-skin-tone:' => '🦵🏻', + ':leg-medium-dark-skin-tone:' => '🦵🏾', + ':leg-medium-light-skin-tone:' => '🦵🏼', + ':leg-medium-skin-tone:' => '🦵🏽', ':lesotho:' => '🇱🇸', + ':levitate:' => '🕴️', ':liberia:' => '🇱🇷', ':libya:' => '🇱🇾', ':liechtenstein:' => '🇱🇮', + ':lifter:' => '🏋️', ':lifter-tone1:' => '🏋🏻', ':lifter-tone2:' => '🏋🏼', ':lifter-tone3:' => '🏋🏽', ':lifter-tone4:' => '🏋🏾', ':lifter-tone5:' => '🏋🏿', ':lithuania:' => '🇱🇹', + ':love-you-gesture-dark-skin-tone:' => '🤟🏿', + ':love-you-gesture-light-skin-tone:' => '🤟🏻', + ':love-you-gesture-medium-dark-skin-tone:' => '🤟🏾', + ':love-you-gesture-medium-light-skin-tone:' => '🤟🏼', + ':love-you-gesture-medium-skin-tone:' => '🤟🏽', ':luxembourg:' => '🇱🇺', ':macau:' => '🇲🇴', ':macedonia:' => '🇲🇰', ':madagascar:' => '🇲🇬', + ':mage-dark-skin-tone:' => '🧙🏿', + ':mage-light-skin-tone:' => '🧙🏻', + ':mage-medium-dark-skin-tone:' => '🧙🏾', + ':mage-medium-light-skin-tone:' => '🧙🏼', + ':mage-medium-skin-tone:' => '🧙🏽', ':malawi:' => '🇲🇼', ':malaysia:' => '🇲🇾', ':maldives:' => '🇲🇻', @@ -2665,6 +2324,7 @@ ':man-with-turban-tone3:' => '👳🏽', ':man-with-turban-tone4:' => '👳🏾', ':man-with-turban-tone5:' => '👳🏿', + ':map:' => '🗺️', ':marshall-islands:' => '🇲🇭', ':martinique:' => '🇲🇶', ':massage-tone1:' => '💆🏻', @@ -2675,6 +2335,16 @@ ':mauritania:' => '🇲🇷', ':mauritius:' => '🇲🇺', ':mayotte:' => '🇾🇹', + ':men-holding-hands-dark-skin-tone:' => '👬🏿', + ':men-holding-hands-light-skin-tone:' => '👬🏻', + ':men-holding-hands-medium-dark-skin-tone:' => '👬🏾', + ':men-holding-hands-medium-light-skin-tone:' => '👬🏼', + ':men-holding-hands-medium-skin-tone:' => '👬🏽', + ':merperson-dark-skin-tone:' => '🧜🏿', + ':merperson-light-skin-tone:' => '🧜🏻', + ':merperson-medium-dark-skin-tone:' => '🧜🏾', + ':merperson-medium-light-skin-tone:' => '🧜🏼', + ':merperson-medium-skin-tone:' => '🧜🏽', ':metal-tone1:' => '🤘🏻', ':metal-tone2:' => '🤘🏼', ':metal-tone3:' => '🤘🏽', @@ -2682,22 +2352,26 @@ ':metal-tone5:' => '🤘🏿', ':mexico:' => '🇲🇽', ':micronesia:' => '🇫🇲', + ':microphone2:' => '🎙️', ':middle-finger-tone1:' => '🖕🏻', ':middle-finger-tone2:' => '🖕🏼', ':middle-finger-tone3:' => '🖕🏽', ':middle-finger-tone4:' => '🖕🏾', ':middle-finger-tone5:' => '🖕🏿', + ':military-medal:' => '🎖️', ':moldova:' => '🇲🇩', ':monaco:' => '🇲🇨', ':mongolia:' => '🇲🇳', ':montenegro:' => '🇲🇪', ':montserrat:' => '🇲🇸', ':morocco:' => '🇲🇦', + ':motorboat:' => '🛥️', ':mountain-bicyclist-tone1:' => '🚵🏻', ':mountain-bicyclist-tone2:' => '🚵🏼', ':mountain-bicyclist-tone3:' => '🚵🏽', ':mountain-bicyclist-tone4:' => '🚵🏾', ':mountain-bicyclist-tone5:' => '🚵🏿', + ':mouse-three-button:' => '🖱️', ':mozambique:' => '🇲🇿', ':mrs-claus-tone1:' => '🤶🏻', ':mrs-claus-tone2:' => '🤶🏼', @@ -2721,9 +2395,16 @@ ':netherlands:' => '🇳🇱', ':new-caledonia:' => '🇳🇨', ':new-zealand:' => '🇳🇿', + ':newspaper2:' => '🗞️', ':nicaragua:' => '🇳🇮', ':niger:' => '🇳🇪', + ':nigeria:' => '🇳🇬', ':nine:' => '9️⃣', + ':ninja-dark-skin-tone:' => '🥷🏿', + ':ninja-light-skin-tone:' => '🥷🏻', + ':ninja-medium-dark-skin-tone:' => '🥷🏾', + ':ninja-medium-light-skin-tone:' => '🥷🏼', + ':ninja-medium-skin-tone:' => '🥷🏽', ':niue:' => '🇳🇺', ':no-good-tone1:' => '🙅🏻', ':no-good-tone2:' => '🙅🏼', @@ -2739,6 +2420,8 @@ ':nose-tone3:' => '👃🏽', ':nose-tone4:' => '👃🏾', ':nose-tone5:' => '👃🏿', + ':notepad-spiral:' => '🗒️', + ':oil:' => '🛢️', ':ok-hand-tone1:' => '👌🏻', ':ok-hand-tone2:' => '👌🏼', ':ok-hand-tone3:' => '👌🏽', @@ -2754,6 +2437,11 @@ ':older-man-tone3:' => '👴🏽', ':older-man-tone4:' => '👴🏾', ':older-man-tone5:' => '👴🏿', + ':older-person-dark-skin-tone:' => '🧓🏿', + ':older-person-light-skin-tone:' => '🧓🏻', + ':older-person-medium-dark-skin-tone:' => '🧓🏾', + ':older-person-medium-light-skin-tone:' => '🧓🏼', + ':older-person-medium-skin-tone:' => '🧓🏽', ':older-woman-tone1:' => '👵🏻', ':older-woman-tone2:' => '👵🏼', ':older-woman-tone3:' => '👵🏽', @@ -2769,19 +2457,93 @@ ':pakistan:' => '🇵🇰', ':palau:' => '🇵🇼', ':palestinian-territories:' => '🇵🇸', + ':palm-down-hand-dark-skin-tone:' => '🫳🏿', + ':palm-down-hand-light-skin-tone:' => '🫳🏻', + ':palm-down-hand-medium-dark-skin-tone:' => '🫳🏾', + ':palm-down-hand-medium-light-skin-tone:' => '🫳🏼', + ':palm-down-hand-medium-skin-tone:' => '🫳🏽', + ':palm-up-hand-dark-skin-tone:' => '🫴🏿', + ':palm-up-hand-light-skin-tone:' => '🫴🏻', + ':palm-up-hand-medium-dark-skin-tone:' => '🫴🏾', + ':palm-up-hand-medium-light-skin-tone:' => '🫴🏼', + ':palm-up-hand-medium-skin-tone:' => '🫴🏽', + ':palms-up-together-dark-skin-tone:' => '🤲🏿', + ':palms-up-together-light-skin-tone:' => '🤲🏻', + ':palms-up-together-medium-dark-skin-tone:' => '🤲🏾', + ':palms-up-together-medium-light-skin-tone:' => '🤲🏼', + ':palms-up-together-medium-skin-tone:' => '🤲🏽', ':panama:' => '🇵🇦', ':papua-new-guinea:' => '🇵🇬', ':paraguay:' => '🇵🇾', + ':park:' => '🏞️', + ':peace:' => '☮️', + ':pen-ballpoint:' => '🖊️', + ':pen-fountain:' => '🖋️', + ':person-climbing-dark-skin-tone:' => '🧗🏿', + ':person-climbing-light-skin-tone:' => '🧗🏻', + ':person-climbing-medium-dark-skin-tone:' => '🧗🏾', + ':person-climbing-medium-light-skin-tone:' => '🧗🏼', + ':person-climbing-medium-skin-tone:' => '🧗🏽', + ':person-dark-skin-tone:' => '🧑🏿', + ':person-dark-skin-tone-beard:' => '🧔🏿', ':person-frowning-tone1:' => '🙍🏻', ':person-frowning-tone2:' => '🙍🏼', ':person-frowning-tone3:' => '🙍🏽', ':person-frowning-tone4:' => '🙍🏾', ':person-frowning-tone5:' => '🙍🏿', + ':person-golfing-dark-skin-tone:' => '🏌🏿', + ':person-golfing-light-skin-tone:' => '🏌🏻', + ':person-golfing-medium-dark-skin-tone:' => '🏌🏾', + ':person-golfing-medium-light-skin-tone:' => '🏌🏼', + ':person-golfing-medium-skin-tone:' => '🏌🏽', + ':person-in-bed-dark-skin-tone:' => '🛌🏿', + ':person-in-bed-light-skin-tone:' => '🛌🏻', + ':person-in-bed-medium-dark-skin-tone:' => '🛌🏾', + ':person-in-bed-medium-light-skin-tone:' => '🛌🏼', + ':person-in-bed-medium-skin-tone:' => '🛌🏽', + ':person-in-lotus-position-dark-skin-tone:' => '🧘🏿', + ':person-in-lotus-position-light-skin-tone:' => '🧘🏻', + ':person-in-lotus-position-medium-dark-skin-tone:' => '🧘🏾', + ':person-in-lotus-position-medium-light-skin-tone:' => '🧘🏼', + ':person-in-lotus-position-medium-skin-tone:' => '🧘🏽', + ':person-in-steamy-room-dark-skin-tone:' => '🧖🏿', + ':person-in-steamy-room-light-skin-tone:' => '🧖🏻', + ':person-in-steamy-room-medium-dark-skin-tone:' => '🧖🏾', + ':person-in-steamy-room-medium-light-skin-tone:' => '🧖🏼', + ':person-in-steamy-room-medium-skin-tone:' => '🧖🏽', + ':person-in-suit-levitating-dark-skin-tone:' => '🕴🏿', + ':person-in-suit-levitating-light-skin-tone:' => '🕴🏻', + ':person-in-suit-levitating-medium-dark-skin-tone:' => '🕴🏾', + ':person-in-suit-levitating-medium-light-skin-tone:' => '🕴🏼', + ':person-in-suit-levitating-medium-skin-tone:' => '🕴🏽', + ':person-kneeling-dark-skin-tone:' => '🧎🏿', + ':person-kneeling-light-skin-tone:' => '🧎🏻', + ':person-kneeling-medium-dark-skin-tone:' => '🧎🏾', + ':person-kneeling-medium-light-skin-tone:' => '🧎🏼', + ':person-kneeling-medium-skin-tone:' => '🧎🏽', + ':person-light-skin-tone:' => '🧑🏻', + ':person-light-skin-tone-beard:' => '🧔🏻', + ':person-medium-dark-skin-tone:' => '🧑🏾', + ':person-medium-dark-skin-tone-beard:' => '🧔🏾', + ':person-medium-light-skin-tone:' => '🧑🏼', + ':person-medium-light-skin-tone-beard:' => '🧔🏼', + ':person-medium-skin-tone:' => '🧑🏽', + ':person-medium-skin-tone-beard:' => '🧔🏽', + ':person-standing-dark-skin-tone:' => '🧍🏿', + ':person-standing-light-skin-tone:' => '🧍🏻', + ':person-standing-medium-dark-skin-tone:' => '🧍🏾', + ':person-standing-medium-light-skin-tone:' => '🧍🏼', + ':person-standing-medium-skin-tone:' => '🧍🏽', ':person-with-blond-hair-tone1:' => '👱🏻', ':person-with-blond-hair-tone2:' => '👱🏼', ':person-with-blond-hair-tone3:' => '👱🏽', ':person-with-blond-hair-tone4:' => '👱🏾', ':person-with-blond-hair-tone5:' => '👱🏿', + ':person-with-crown-dark-skin-tone:' => '🫅🏿', + ':person-with-crown-light-skin-tone:' => '🫅🏻', + ':person-with-crown-medium-dark-skin-tone:' => '🫅🏾', + ':person-with-crown-medium-light-skin-tone:' => '🫅🏼', + ':person-with-crown-medium-skin-tone:' => '🫅🏽', ':person-with-pouting-face-tone1:' => '🙎🏻', ':person-with-pouting-face-tone2:' => '🙎🏼', ':person-with-pouting-face-tone3:' => '🙎🏽', @@ -2789,7 +2551,18 @@ ':person-with-pouting-face-tone5:' => '🙎🏿', ':peru:' => '🇵🇪', ':philippines:' => '🇵🇭', + ':pinched-fingers-dark-skin-tone:' => '🤌🏿', + ':pinched-fingers-light-skin-tone:' => '🤌🏻', + ':pinched-fingers-medium-dark-skin-tone:' => '🤌🏾', + ':pinched-fingers-medium-light-skin-tone:' => '🤌🏼', + ':pinched-fingers-medium-skin-tone:' => '🤌🏽', + ':pinching-hand-dark-skin-tone:' => '🤏🏿', + ':pinching-hand-light-skin-tone:' => '🤏🏻', + ':pinching-hand-medium-dark-skin-tone:' => '🤏🏾', + ':pinching-hand-medium-light-skin-tone:' => '🤏🏼', + ':pinching-hand-medium-skin-tone:' => '🤏🏽', ':pitcairn-islands:' => '🇵🇳', + ':play-pause:' => '⏯️', ':point-down-tone1:' => '👇🏻', ':point-down-tone2:' => '👇🏼', ':point-down-tone3:' => '👇🏽', @@ -2822,6 +2595,16 @@ ':pray-tone3:' => '🙏🏽', ':pray-tone4:' => '🙏🏾', ':pray-tone5:' => '🙏🏿', + ':pregnant-man-dark-skin-tone:' => '🫃🏿', + ':pregnant-man-light-skin-tone:' => '🫃🏻', + ':pregnant-man-medium-dark-skin-tone:' => '🫃🏾', + ':pregnant-man-medium-light-skin-tone:' => '🫃🏼', + ':pregnant-man-medium-skin-tone:' => '🫃🏽', + ':pregnant-person-dark-skin-tone:' => '🫄🏿', + ':pregnant-person-light-skin-tone:' => '🫄🏻', + ':pregnant-person-medium-dark-skin-tone:' => '🫄🏾', + ':pregnant-person-medium-light-skin-tone:' => '🫄🏼', + ':pregnant-person-medium-skin-tone:' => '🫄🏽', ':pregnant-woman-tone1:' => '🤰🏻', ':pregnant-woman-tone2:' => '🤰🏼', ':pregnant-woman-tone3:' => '🤰🏽', @@ -2837,6 +2620,7 @@ ':princess-tone3:' => '👸🏽', ':princess-tone4:' => '👸🏾', ':princess-tone5:' => '👸🏿', + ':projector:' => '📽️', ':puerto-rico:' => '🇵🇷', ':punch-tone1:' => '👊🏻', ':punch-tone2:' => '👊🏼', @@ -2844,6 +2628,7 @@ ':punch-tone4:' => '👊🏾', ':punch-tone5:' => '👊🏿', ':qatar:' => '🇶🇦', + ':race-car:' => '🏎️', ':raised-back-of-hand-tone1:' => '🤚🏻', ':raised-back-of-hand-tone2:' => '🤚🏼', ':raised-back-of-hand-tone3:' => '🤚🏽', @@ -2870,6 +2655,16 @@ ':right-facing-fist-tone3:' => '🤜🏽', ':right-facing-fist-tone4:' => '🤜🏾', ':right-facing-fist-tone5:' => '🤜🏿', + ':rightwards-hand-dark-skin-tone:' => '🫱🏿', + ':rightwards-hand-light-skin-tone:' => '🫱🏻', + ':rightwards-hand-medium-dark-skin-tone:' => '🫱🏾', + ':rightwards-hand-medium-light-skin-tone:' => '🫱🏼', + ':rightwards-hand-medium-skin-tone:' => '🫱🏽', + ':rightwards-pushing-hand-dark-skin-tone:' => '🫸🏿', + ':rightwards-pushing-hand-light-skin-tone:' => '🫸🏻', + ':rightwards-pushing-hand-medium-dark-skin-tone:' => '🫸🏾', + ':rightwards-pushing-hand-medium-light-skin-tone:' => '🫸 10000 ', + ':rightwards-pushing-hand-medium-skin-tone:' => '🫸🏽', ':romania:' => '🇷🇴', ':rowboat-tone1:' => '🚣🏻', ':rowboat-tone2:' => '🚣🏼', @@ -2890,6 +2685,7 @@ ':santa-tone4:' => '🎅🏾', ':santa-tone5:' => '🎅🏿', ':sao-tome-principe:' => '🇸🇹', + ':satellite-orbital:' => '🛰️', ':saudi-arabia:' => '🇸🇦', ':selfie-tone1:' => '🤳🏻', ':selfie-tone2:' => '🤳🏼', @@ -2909,13 +2705,22 @@ ':singapore:' => '🇸🇬', ':sint-maarten:' => '🇸🇽', ':six:' => '6️⃣', + ':skull-crossbones:' => '☠️', ':slovakia:' => '🇸🇰', ':slovenia:' => '🇸🇮', + ':snowboarder-dark-skin-tone:' => '🏂🏿', + ':snowboarder-light-skin-tone:' => '🏂🏻', + ':snowboarder-medium-dark-skin-tone:' => '🏂🏾', + ':snowboarder-medium-light-skin-tone:' => '🏂🏼', + ':snowboarder-medium-skin-tone:' => '🏂🏽', + ':snowman2:' => '☃️', ':solomon-islands:' => '🇸🇧', ':somalia:' => '🇸🇴', ':south-africa:' => '🇿🇦', ':south-georgia-south-sandwich-islands:' => '🇬🇸', ':south-sudan:' => '🇸🇸', + ':speech-left:' => '🗨️', + ':spy:' => '🕵️', ':spy-tone1:' => '🕵🏻', ':spy-tone2:' => '🕵🏼', ':spy-tone3:' => '🕵🏽', @@ -2930,6 +2735,16 @@ ':st-pierre-miquelon:' => '🇵🇲', ':st-vincent-grenadines:' => '🇻🇨', ':sudan:' => '🇸🇩', + ':superhero-dark-skin-tone:' => '🦸🏿', + ':superhero-light-skin-tone:' => '🦸🏻', + ':superhero-medium-dark-skin-tone:' => '🦸🏾', + ':superhero-medium-light-skin-tone:' => '🦸🏼', + ':superhero-medium-skin-tone:' => '🦸🏽', + ':supervillain-dark-skin-tone:' => '🦹🏿', + ':supervillain-light-skin-tone:' => '🦹🏻', + ':supervillain-medium-dark-skin-tone:' => '🦹🏾', + ':supervillain-medium-light-skin-tone:' => '🦹🏼', + ':supervillain-medium-skin-tone:' => '🦹🏽', ':surfer-tone1:' => '🏄🏻', ':surfer-tone2:' => '🏄🏼', ':surfer-tone3:' => '🏄🏽', @@ -2961,19 +2776,29 @@ ':thumbsup-tone3:' => '👍🏽', ':thumbsup-tone4:' => '👍🏾', ':thumbsup-tone5:' => '👍🏿', + ':thunder-cloud-rain:' => '⛈️', + ':timer:' => '⏲️', ':timor-leste:' => '🇹🇱', ':togo:' => '🇹🇬', ':tokelau:' => '🇹🇰', ':tonga:' => '🇹🇴', + ':tools:' => '🛠️', + ':tr:' => '🇹🇷', + ':track-next:' => '⏭️', + ':track-previous:' => '⏮️', ':trinidad-tobago:' => '🇹🇹', ':tristan-da-cunha:' => '🇹🇦', ':tunisia:' => '🇹🇳', + ':turkmenistan:' => '🇹🇲', ':turks-caicos-islands:' => '🇹🇨', + ':tuvalu:' => '🇹🇻', ':two:' => '2️⃣', ':uganda:' => '🇺🇬', ':ukraine:' => '🇺🇦', + ':umbrella2:' => '☂️', ':united-arab-emirates:' => '🇦🇪', ':united-nations:' => '🇺🇳', + ':urn:' => '⚱️', ':uruguay:' => '🇺🇾', ':us-outlying-islands:' => '🇺🇲', ':us-virgin-islands:' => '🇻🇮', @@ -2983,6 +2808,11 @@ ':v-tone3:' => '✌🏽', ':v-tone4:' => '✌🏾', ':v-tone5:' => '✌🏿', + ':vampire-dark-skin-tone:' => '🧛🏿', + ':vampire-light-skin-tone:' => '🧛🏻', + ':vampire-medium-dark-skin-tone:' => '🧛🏾', + ':vampire-medium-light-skin-tone:' => '🧛🏼', + ':vampire-medium-skin-tone:' => '🧛🏽', ':vanuatu:' => '🇻🇺', ':vatican-city:' => '🇻🇦', ':venezuela:' => '🇻🇪', @@ -3009,16 +2839,29 @@ ':wave-tone4:' => '👋🏾', ':wave-tone5:' => '👋🏿', ':western-sahara:' => '🇪🇭', + ':white-sun-cloud:' => '🌥️', + ':white-sun-rain-cloud:' => '🌦️', + ':white-sun-small-cloud:' => '🌤️', + ':woman-and-man-holding-hands-dark-skin-tone:' => '👫🏿', + ':woman-and-man-holding-hands-light-skin-tone:' => '👫🏻', + ':woman-and-man-holding-hands-medium-dark-skin-tone:' => '👫🏾', + ':woman-and-man-holding-hands-medium-light-skin-tone:' => '👫🏼', + ':woman-and-man-holding-hands-medium-skin-tone:' => '👫🏽', ':woman-tone1:' => '👩🏻', ':woman-tone2:' => '👩🏼', ':woman-tone3:' => '👩🏽', ':woman-tone4:' => '👩🏾', ':woman-tone5:' => '👩🏿', - ':wrestlers-tone1:' => '🤼🏻', - ':wrestlers-tone2:' => '🤼🏼', - ':wrestlers-tone3:' => '🤼🏽', - ':wrestlers-tone4:' => '🤼🏾', - ':wrestlers-tone5:' => '🤼🏿', + ':woman-with-headscarf-dark-skin-tone:' => '🧕🏿', + ':woman-with-headscarf-light-skin-tone:' => '🧕🏻', + ':woman-with-headscarf-medium-dark-skin-tone:' => '🧕🏾', + ':woman-with-headscarf-medium-light-skin-tone:' => '🧕🏼', + ':woman-with-headscarf-medium-skin-tone:' => '🧕🏽', + ':women-holding-hands-dark-skin-tone:' => '👭🏿', + ':women-holding-hands-light-skin-tone:' => '👭🏻', + ':women-holding-hands-medium-dark-skin-tone:' => '👭🏾', + ':women-holding-hands-medium-light-skin-tone:' => '👭🏼', + ':women-holding-hands-medium-skin-tone:' => '👭🏽', ':writing-hand-tone1:' => '✍🏻', ':writing-hand-tone2:' => '✍🏼', ':writing-hand-tone3:' => '✍🏽', @@ -3127,7 +2970,6 @@ ':deaf-woman:' => '🧏‍♀️', ':elf-man:' => '🧝‍♂', ':elf-woman:' => '🧝‍♀', - ':eye-in-speech-bubble:' => '👁️‍🗨️', ':eye-speech-bubble:' => '👁‍🗨', ':face-in-clouds:' => '😶‍🌫️', ':fairy-man:' => '🧚‍♂', @@ -3158,31 +3000,37 @@ ':male-detective:' => '🕵️‍♂️', ':man-artist:' => '👨‍🎨', ':man-astronaut:' => '👨‍🚀', - ':man-beard:' => '🧔‍♂', + ':man-bald:' => '👨‍🦲', + ':man-beard:' => '🧔‍♂️', ':man-cartwheeling:' => '🤸‍♂️', ':man-cook:' => '👨‍🍳', + ':man-curly-hair:' => '👨‍🦱', ':man-facepalming:' => '🤦‍♂️', ':man-factory-worker:' => '👨‍🏭', ':man-farmer:' => '👨‍🌾', ':man-firefighter:' => '👨‍🚒', - ':man-health-worker:' => '👨‍⚕', - ':man-judge:' => '👨‍⚖', + ':man-health-worker:' => '👨‍⚕️', + ':man-in-tuxedo:' => '🤵‍♂️', + ':man-judge:' => '👨‍⚖️', ':man-juggling:' => '🤹‍♂️', ':man-mechanic:' => '👨‍🔧', ':man-office-worker:' => '👨‍💼', - ':man-pilot:' => '👨‍✈', + ':man-pilot:' => '👨‍✈️', ':man-playing-handball:' => '🤾‍♂️', ':man-playing-water-polo:' => '🤽‍♂️', + ':man-red-hair:' => '👨‍🦰', ':man-scientist:' => '👨‍🔬', ':man-shrugging:' => '🤷‍♂️', ':man-singer:' => '👨‍🎤', ':man-student:' => '👨‍🎓', ':man-teacher:' => '👨‍🏫', ':man-technologist:' => '👨‍💻', + ':man-white-hair:' => '👨‍🦳', ':man-with-veil:' => '👰‍♂️', + ':man-with-white-cane:' => '👨‍🦯', ':massage-man:' => '💆‍♂', ':massage-woman:' => '💆‍♀', - ':men-wrestling:' => '🤼‍♂', + ':men-wrestling:' => '🤼‍♂️', ':mending-heart:' => '❤️‍🩹', ':mermaid:' => '🧜‍♀️', ':merman:' => '🧜‍♂️', @@ -3197,6 +3045,7 @@ ':person-curly-hair:' => '🧑‍🦱', ':person-red-hair:' => '🧑‍🦰', ':person-white-hair:' => '🧑‍🦳', + ':person-with-white-cane:' => '🧑‍🦯', ':pilot:' => '🧑‍✈️', ':pirate-flag:' => '🏴‍☠️', ':polar-bear:' => '🐻‍❄️', @@ -3204,6 +3053,7 @@ ':policewoman:' => '👮‍♀', ':pouting-man:' => '🙎‍♂', ':pouting-woman:' => '🙎‍♀', + ':rainbow-flag:' => '🏳️‍🌈', ':raising-hand-man:' => '🙋‍♂', ':raising-hand-woman:' => '🙋‍♀', ':rowing-man:' => '🚣‍♂', @@ -3235,31 +3085,36 @@ ':weight-lifting-woman:' => '🏋‍♀', ':woman-artist:' => '👩‍🎨', ':woman-astronaut:' => '👩‍🚀', - ':woman-beard:' => '🧔‍♀', + ':woman-bald:' => '👩‍🦲', + ':woman-beard:' => '🧔‍♀️', ':woman-cartwheeling:' => '🤸‍♀️', ':woman-cook:' => '👩‍🍳', + ':woman-curly-hair:' => '👩‍🦱', ':woman-facepalming:' => '🤦‍♀️', ':woman-factory-worker:' => '👩‍🏭', ':woman-farmer:' => '👩‍🌾', ':woman-firefighter:' => '👩‍🚒', - ':woman-health-worker:' => '👩‍⚕', + ':woman-health-worker:' => '👩‍⚕️', ':woman-in-tuxedo:' => '🤵‍♀️', - ':woman-judge:' => '👩‍⚖', + ':woman-judge:' => '👩‍⚖️', ':woman-juggling:' => '🤹‍♀️', ':woman-mechanic:' => '👩‍🔧', ':woman-office-worker:' => '👩‍💼', - ':woman-pilot:' => '👩‍✈', + ':woman-pilot:' => '👩‍✈️', ':woman-playing-handball:' => '🤾‍♀️', ':woman-playing-water-polo:' => '🤽‍♀️', + ':woman-red-hair:' => '👩‍🦰', ':woman-scientist:' => '👩‍🔬', ':woman-shrugging:' => '🤷‍♀️', ':woman-singer:' => '👩‍🎤', ':woman-student:' => '👩‍🎓', ':woman-teacher:' => '👩‍🏫', ':woman-technologist:' => '👩‍💻', + ':woman-white-hair:' => '👩‍🦳', ':woman-with-turban:' => '👳‍♀', ':woman-with-veil:' => '👰‍♀️', - ':women-wrestling:' => '🤼‍♀', + ':woman-with-white-cane:' => '👩‍🦯', + ':women-wrestling:' => '🤼‍♀️', ':zombie-man:' => '🧟‍♂', ':zombie-woman:' => '🧟‍♀', ':broken-chain:' => '⛓️‍💥', @@ -3348,6 +3203,354 @@ ':woman-with-bunny-ears-partying:' => '👯‍♀️', ':woman-wrestling:' => '🤼‍♀️', ':women-with-bunny-ears-partying:' => '👯‍♀️', + ':artist-dark-skin-tone:' => '🧑🏿‍🎨', + ':artist-light-skin-tone:' => '🧑🏻‍🎨', + ':artist-medium-dark-skin-tone:' => '🧑🏾‍🎨', + ':artist-medium-light-skin-tone:' => '🧑🏼‍🎨', + ':artist-medium-skin-tone:' => '🧑🏽‍🎨', + ':astronaut-dark-skin-tone:' => '🧑🏿‍🚀', + ':astronaut-light-skin-tone:' => '🧑🏻‍🚀', + ':astronaut-medium-dark-skin-tone:' => '🧑🏾‍🚀', + ':astronaut-medium-light-skin-tone:' => '🧑🏼‍🚀', + ':astronaut-medium-skin-tone:' => '🧑🏽‍🚀', + ':cook-dark-skin-tone:' => '🧑🏿‍🍳', + ':cook-light-skin-tone:' => '🧑🏻‍🍳', + ':cook-medium-dark-skin-tone:' => '🧑🏾‍🍳', + ':cook-medium-light-skin-tone:' => '🧑🏼‍🍳', + ':cook-medium-skin-tone:' => '🧑🏽‍🍳', + ':factory-worker-dark-skin-tone:' => '🧑🏿‍🏭', + ':factory-worker-light-skin-tone:' => '🧑🏻‍🏭', + ':factory-worker-medium-dark-skin-tone:' => '🧑🏾‍🏭', + ':factory-worker-medium-light-skin-tone:' => '🧑🏼‍🏭', + ':factory-worker-medium-skin-tone:' => '🧑🏽‍🏭', + ':farmer-dark-skin-tone:' => '🧑🏿‍🌾', + ':farmer-light-skin-tone:' => '🧑🏻‍🌾', + ':farmer-medium-dark-skin-tone:' => '🧑🏾‍🌾', + ':farmer-medium-light-skin-tone:' => '🧑🏼‍🌾', + ':farmer-medium-skin-tone:' => '🧑🏽‍🌾', + ':firefighter-dark-skin-tone:' => '🧑🏿‍🚒', + ':firefighter-light-skin-tone:' => '🧑🏻‍🚒', + ':firefighter-medium-dark-skin-tone:' => '🧑🏾‍🚒', + ':firefighter-medium-light-skin-tone:' => '🧑🏼‍🚒', + ':firefighter-medium-skin-tone:' => '🧑🏽‍🚒', + ':gay-pride-flag:' => '🏳️‍🌈', + ':man-artist-dark-skin-tone:' => '👨🏿‍🎨', + ':man-artist-light-skin-tone:' => '👨🏻‍🎨', + ':man-artist-medium-dark-skin-tone:' => '👨🏾‍🎨', + ':man-artist-medium-light-skin-tone:' => '👨🏼‍🎨', + ':man-artist-medium-skin-tone:' => '👨🏽‍🎨', + ':man-astronaut-dark-skin-tone:' => '👨🏿‍🚀', + ':man-astronaut-light-skin-tone:' => '👨🏻‍🚀', + ':man-astronaut-medium-dark-skin-tone:' => '👨🏾‍🚀', + ':man-astronaut-medium-light-skin-tone:' => '👨🏼‍🚀', + ':man-astronaut-medium-skin-tone:' => '👨🏽‍🚀', + ':man-blond-hair:' => '👱‍♂️', + ':man-construction-worker:' => '👷‍♂️', + ':man-cook-dark-skin-tone:' => '👨🏿‍🍳', + ':man-cook-light-skin-tone:' => '👨🏻‍🍳', + ':man-cook-medium-dark-skin-tone:' => '👨🏾‍🍳', + ':man-cook-medium-light-skin-tone:' => '👨🏼‍🍳', + ':man-cook-medium-skin-tone:' => '👨🏽‍🍳', + ':man-dark-skin-tone-bald:' => '👨🏿‍🦲', + ':man-dark-skin-tone-curly-hair:' => '👨🏿‍🦱', + ':man-dark-skin-tone-red-hair:' => '👨🏿‍🦰', + ':man-dark-skin-tone-white-hair:' => '👨🏿‍🦳', + ':man-elf:' => '🧝‍♂️', + ':man-factory-worker-dark-skin-tone:' => '👨🏿‍🏭', + ':man-factory-worker-light-skin-tone:' => '👨🏻‍🏭', + ':man-factory-worker-medium-dark-skin-tone:' => '👨🏾‍🏭', + ':man-factory-worker-medium-light-skin-tone:' => '👨🏼‍🏭', + ':man-factory-worker-medium-skin-tone:' => '👨🏽‍🏭', + ':man-fairy:' => '🧚‍♂️', + ':man-farmer-dark-skin-tone:' => '👨🏿‍🌾', + ':man-farmer-light-skin-tone:' => '👨🏻‍🌾', + ':man-farmer-medium-dark-skin-tone:' => '👨🏾‍🌾', + ':man-farmer-medium-light-skin-tone:' => '👨🏼‍🌾', + ':man-farmer-medium-skin-tone:' => '👨🏽‍🌾', + ':man-feeding-baby-dark-skin-tone:' => '👨🏿‍🍼', + ':man-feeding-baby-light-skin-tone:' => '👨🏻‍🍼', + ':man-feeding-baby-medium-dark-skin-tone:' => '👨🏾‍🍼', + ':man-feeding-baby-medium-light-skin-tone:' => '👨🏼‍🍼', + ':man-feeding-baby-medium-skin-tone:' => '👨🏽‍🍼', + ':man-firefighter-dark-skin-tone:' => '👨🏿‍🚒', + ':man-firefighter-light-skin-tone:' => '👨🏻‍🚒', + ':man-firefighter-medium-dark-skin-tone:' => '👨🏾‍🚒', + ':man-firefighter-medium-light-skin-tone:' => '👨🏼‍🚒', + ':man-firefighter-medium-skin-tone:' => '👨🏽‍🚒', + ':man-genie:' => '🧞‍♂️', + ':man-guard:' => '💂‍♂️', + ':man-in-manual-wheelchair-dark-skin-tone:' => '👨🏿‍🦽', + ':man-in-manual-wheelchair-light-skin-tone:' => '👨🏻‍🦽', + ':man-in-manual-wheelchair-medium-dark-skin-tone:' => '👨🏾‍🦽', + ':man-in-manual-wheelchair-medium-light-skin-tone:' => '👨🏼‍🦽', + ':man-in-manual-wheelchair-medium-skin-tone:' => '👨🏽‍🦽', + ':man-in-motorized-wheelchair-dark-skin-tone:' => '👨🏿‍🦼', + ':man-in-motorized-wheelchair-light-skin-tone:' => '👨🏻‍🦼', + ':man-in-motorized-wheelchair-medium-dark-skin-tone:' => '👨🏾‍🦼', + ':man-in-motorized-wheelchair-medium-light-skin-tone:' => '👨🏼‍🦼', + ':man-in-motorized-wheelchair-medium-skin-tone:' => '👨🏽‍🦼', + ':man-light-skin-tone-bald:' => '👨🏻‍🦲', + ':man-light-skin-tone-curly-hair:' => '👨🏻‍🦱', + ':man-light-skin-tone-red-hair:' => '👨🏻‍🦰', + ':man-light-skin-tone-white-hair:' => '👨🏻‍🦳', + ':man-mage:' => '🧙‍♂️', + ':man-mechanic-dark-skin-tone:' => '👨🏿‍🔧', + ':man-mechanic-light-skin-tone:' => '👨🏻‍🔧', + ':man-mechanic-medium-dark-skin-tone:' => '👨🏾‍🔧', + ':man-mechanic-medium-light-skin-tone:' => '👨🏼‍🔧', + ':man-mechanic-medium-skin-tone:' => '👨🏽‍🔧', + ':man-medium-dark-skin-tone-bald:' => '👨🏾‍🦲', + ':man-medium-dark-skin-tone-curly-hair:' => '👨🏾‍🦱', + ':man-medium-dark-skin-tone-red-hair:' => '👨🏾‍🦰', + ':man-medium-dark-skin-tone-white-hair:' => '👨🏾‍🦳', + ':man-medium-light-skin-tone-bald:' => '👨🏼‍🦲', + ':man-medium-light-skin-tone-curly-hair:' => '👨🏼‍🦱', + ':man-medium-light-skin-tone-red-hair:' => '👨🏼‍🦰', + ':man-medium-light-skin-tone-white-hair:' => '👨🏼‍🦳', + ':man-medium-skin-tone-bald:' => '👨🏽‍🦲', + ':man-medium-skin-tone-curly-hair:' => '👨🏽‍🦱', + ':man-medium-skin-tone-red-hair:' => '👨🏽‍🦰', + ':man-medium-skin-tone-white-hair:' => '👨🏽‍🦳', + ':man-office-worker-dark-skin-tone:' => '👨🏿‍💼', + ':man-office-worker-light-skin-tone:' => '👨🏻‍💼', + ':man-office-worker-medium-dark-skin-tone:' => '👨🏾‍💼', + ':man-office-worker-medium-light-skin-tone:' => '👨🏼‍💼', + ':man-office-worker-medium-skin-tone:' => '👨🏽‍💼', + ':man-police-officer:' => '👮‍♂️', + ':man-scientist-dark-skin-tone:' => '👨🏿‍🔬', + ':man-scientist-light-skin-tone:' => '👨🏻‍🔬', + ':man-scientist-medium-dark-skin-tone:' => '👨🏾‍🔬', + ':man-scientist-medium-light-skin-tone:' => '👨🏼‍🔬', + ':man-scientist-medium-skin-tone:' => '👨🏽‍🔬', + ':man-singer-dark-skin-tone:' => '👨🏿‍🎤', + ':man-singer-light-skin-tone:' => '👨🏻‍🎤', + ':man-singer-medium-dark-skin-tone:' => '👨🏾‍🎤', + ':man-singer-medium-light-skin-tone:' => '👨🏼‍🎤', + ':man-singer-medium-skin-tone:' => '👨🏽‍🎤', + ':man-student-dark-skin-tone:' => '👨🏿‍🎓', + ':man-student-light-skin-tone:' => '👨🏻‍🎓', + ':man-student-medium-dark-skin-tone:' => '👨🏾‍🎓', + ':man-student-medium-light-skin-tone:' => '👨🏼‍🎓', + ':man-student-medium-skin-tone:' => '👨🏽‍🎓', + ':man-superhero:' => '🦸‍♂️', + ':man-supervillain:' => '🦹‍♂️', + ':man-teacher-dark-skin-tone:' => '👨🏿‍🏫', + ':man-teacher-light-skin-tone:' => '👨🏻‍🏫', + ':man-teacher-medium-dark-skin-tone:' => '👨🏾‍🏫', + ':man-teacher-medium-light-skin-tone:' => '👨🏼‍🏫', + ':man-teacher-medium-skin-tone:' => '👨🏽‍🏫', + ':man-technologist-dark-skin-tone:' => '👨🏿‍💻', + ':man-technologist-light-skin-tone:' => '👨🏻‍💻', + ':man-technologist-medium-dark-skin-tone:' => '👨🏾‍💻', + ':man-technologist-medium-light-skin-tone:' => '👨🏼‍💻', + ':man-technologist-medium-skin-tone:' => '👨🏽‍💻', + ':man-vampire:' => '🧛‍♂️', + ':man-with-white-cane-dark-skin-tone:' => '👨🏿‍🦯', + ':man-with-white-cane-light-skin-tone:' => '👨🏻‍🦯', + ':man-with-white-cane-medium-dark-skin-tone:' => '👨🏾‍🦯', + ':man-with-white-cane-medium-light-skin-tone:' => '👨🏼‍🦯', + ':man-with-white-cane-medium-skin-tone:' => '👨🏽‍🦯', + ':man-zombie:' => '🧟‍♂️', + ':mechanic-dark-skin-tone:' => '🧑🏿‍🔧', + ':mechanic-light-skin-tone:' => '🧑🏻‍🔧', + ':mechanic-medium-dark-skin-tone:' => '🧑🏾‍🔧', + ':mechanic-medium-light-skin-tone:' => '🧑🏼‍🔧', + ':mechanic-medium-skin-tone:' => '🧑🏽‍🔧', + ':men-with-bunny-ears:' => '👯‍♂️', + ':mx-claus-dark-skin-tone:' => '🧑🏿‍🎄', + ':mx-claus-light-skin-tone:' => '🧑🏻‍🎄', + ':mx-claus-medium-dark-skin-tone:' => '🧑🏾‍🎄', + ':mx-claus-medium-light-skin-tone:' => '🧑🏼‍🎄', + ':mx-claus-medium-skin-tone:' => '🧑🏽‍🎄', + ':office-worker-dark-skin-tone:' => '🧑🏿‍💼', + ':office-worker-light-skin-tone:' => '🧑🏻‍💼', + ':office-worker-medium-dark-skin-tone:' => '🧑🏾‍💼', + ':office-worker-medium-light-skin-tone:' => '🧑🏼‍💼', + ':office-worker-medium-skin-tone:' => '🧑🏽‍💼', + ':person-dark-skin-tone-bald:' => '🧑🏿‍🦲', + ':person-dark-skin-tone-curly-hair:' => '🧑🏿‍🦱', + ':person-dark-skin-tone-red-hair:' => '🧑🏿‍🦰', + ':person-dark-skin-tone-white-hair:' => '🧑🏿‍🦳', + ':person-feeding-baby-dark-skin-tone:' => '🧑🏿‍🍼', + ':person-feeding-baby-light-skin-tone:' => '🧑🏻‍🍼', + ':person-feeding-baby-medium-dark-skin-tone:' => '🧑🏾‍🍼', + ':person-feeding-baby-medium-light-skin-tone:' => '🧑🏼‍🍼', + ':person-feeding-baby-medium-skin-tone:' => '🧑🏽‍🍼', + ':person-in-manual-wheelchair-dark-skin-tone:' => '🧑🏿‍🦽', + ':person-in-manual-wheelchair-light-skin-tone:' => '🧑🏻‍🦽', + ':person-in-manual-wheelchair-medium-dark-skin-tone:' => '🧑🏾‍🦽', + ':person-in-manual-wheelchair-medium-light-skin-tone:' => '🧑🏼‍🦽', + ':person-in-manual-wheelchair-medium-skin-tone:' => '🧑🏽‍🦽', + ':person-in-motorized-wheelchair-dark-skin-tone:' => '🧑🏿‍🦼', + ':person-in-motorized-wheelchair-light-skin-tone:' => '🧑🏻‍🦼', + ':person-in-motorized-wheelchair-medium-dark-skin-tone:' => '🧑🏾‍🦼', + ':person-in-motorized-wheelchair-medium-light-skin-tone:' => '🧑🏼‍🦼', + ':person-in-motorized-wheelchair-medium-skin-tone:' => '🧑🏽‍🦼', + ':person-light-skin-tone-bald:' => '🧑🏻‍🦲', + ':person-light-skin-tone-curly-hair:' => '🧑🏻‍🦱', + ':person-light-skin-tone-red-hair:' => '🧑🏻‍🦰', + ':person-light-skin-tone-white-hair:' => '🧑🏻‍🦳', + ':person-medium-dark-skin-tone-bald:' => '🧑🏾‍🦲', + ':person-medium-dark-skin-tone-curly-hair:' => '🧑🏾‍🦱', + ':person-medium-dark-skin-tone-red-hair:' => '🧑🏾‍🦰', + ':person-medium-dark-skin-tone-white-hair:' => '🧑🏾‍🦳', + ':person-medium-light-skin-tone-bald:' => '🧑🏼‍🦲', + ':person-medium-light-skin-tone-curly-hair:' => '🧑🏼‍🦱', + ':person-medium-light-skin-tone-red-hair:' => '🧑🏼‍🦰', + ':person-medium-light-skin-tone-white-hair:' => '🧑🏼‍🦳', + ':person-medium-skin-tone-bald:' => '🧑🏽‍🦲', + ':person-medium-skin-tone-curly-hair:' => '🧑🏽‍🦱', + ':person-medium-skin-tone-red-hair:' => '🧑🏽‍🦰', + ':person-medium-skin-tone-white-hair:' => '🧑🏽‍🦳', + ':person-with-white-cane-dark-skin-tone:' => '🧑🏿‍🦯', + ':person-with-white-cane-light-skin-tone:' => '🧑🏻‍🦯', + ':person-with-white-cane-medium-dark-skin-tone:' => '🧑🏾‍🦯', + ':person-with-white-cane-medium-light-skin-tone:' => '🧑🏼‍🦯', + ':person-with-white-cane-medium-skin-tone:' => '🧑🏽‍🦯', + ':scientist-dark-skin-tone:' => '🧑🏿‍🔬', + ':scientist-light-skin-tone:' => '🧑🏻‍🔬', + ':scientist-medium-dark-skin-tone:' => '🧑🏾‍🔬', + ':scientist-medium-light-skin-tone:' => '🧑🏼‍🔬', + ':scientist-medium-skin-tone:' => '🧑🏽‍🔬', + ':singer-dark-skin-tone:' => '🧑🏿‍🎤', + ':singer-light-skin-tone:' => '🧑🏻‍🎤', + ':singer-medium-dark-skin-tone:' => '🧑🏾‍🎤', + ':singer-medium-light-skin-tone:' => '🧑🏼‍🎤', + ':singer-medium-skin-tone:' => '🧑🏽‍🎤', + ':student-dark-skin-tone:' => '🧑🏿‍🎓', + ':student-light-skin-tone:' => '🧑🏻‍🎓', + ':student-medium-dark-skin-tone:' => '🧑🏾‍🎓', + ':student-medium-light-skin-tone:' => '🧑🏼‍🎓', + ':student-medium-skin-tone:' => '🧑🏽‍🎓', + ':teacher-dark-skin-tone:' => '🧑🏿‍🏫', + ':teacher-light-skin-tone:' => '🧑🏻‍🏫', + ':teacher-medium-dark-skin-tone:' => '🧑🏾‍🏫', + ':teacher-medium-light-skin-tone:' => '🧑🏼‍🏫', + ':teacher-medium-skin-tone:' => '🧑🏽‍🏫', + ':technologist-dark-skin-tone:' => '🧑🏿‍💻', + ':technologist-light-skin-tone:' => '🧑🏻‍💻', + ':technologist-medium-dark-skin-tone:' => '🧑🏾‍💻', + ':technologist-medium-light-skin-tone:' => '🧑🏼‍💻', + ':technologist-medium-skin-tone:' => '🧑🏽‍💻', + ':woman-artist-dark-skin-tone:' => '👩🏿‍🎨', + ':woman-artist-light-skin-tone:' => '👩🏻‍🎨', + ':woman-artist-medium-dark-skin-tone:' => '👩🏾‍🎨', + ':woman-artist-medium-light-skin-tone:' => '👩🏼‍🎨', + ':woman-artist-medium-skin-tone:' => '👩🏽‍🎨', + ':woman-astronaut-dark-skin-tone:' => '👩🏿‍🚀', + ':woman-astronaut-light-skin-tone:' => '👩🏻‍🚀', + ':woman-astronaut-medium-dark-skin-tone:' => '👩🏾‍🚀', + ':woman-astronaut-medium-light-skin-tone:' => '👩🏼‍🚀', + ':woman-astronaut-medium-skin-tone:' => '👩🏽‍🚀', + ':woman-blond-hair:' => '👱‍♀️', + ':woman-construction-worker:' => '👷‍♀️', + ':woman-cook-dark-skin-tone:' => '👩🏿‍🍳', + ':woman-cook-light-skin-tone:' => '👩🏻‍🍳', + ':woman-cook-medium-dark-skin-tone:' => '👩🏾‍🍳', + ':woman-cook-medium-light-skin-tone:' => '👩🏼‍🍳', + ':woman-cook-medium-skin-tone:' => '👩🏽‍🍳', + ':woman-dark-skin-tone-bald:' => '👩🏿‍🦲', + ':woman-dark-skin-tone-curly-hair:' => '👩🏿‍🦱', + ':woman-dark-skin-tone-red-hair:' => '👩🏿‍🦰', + ':woman-dark-skin-tone-white-hair:' => '👩🏿‍🦳', + ':woman-elf:' => '🧝‍♀️', + ':woman-factory-worker-dark-skin-tone:' => '👩🏿‍🏭', + ':woman-factory-worker-light-skin-tone:' => '👩🏻‍🏭', + ':woman-factory-worker-medium-dark-skin-tone:' => '👩🏾‍🏭', + ':woman-factory-worker-medium-light-skin-tone:' => '👩🏼‍🏭', + ':woman-factory-worker-medium-skin-tone:' => '👩🏽‍🏭', + ':woman-fairy:' => '🧚‍♀️', + ':woman-farmer-dark-skin-tone:' => '👩🏿‍🌾', + ':woman-farmer-light-skin-tone:' => '👩🏻‍🌾', + ':woman-farmer-medium-dark-skin-tone:' => '👩🏾‍🌾', + ':woman-farmer-medium-light-skin-tone:' => '👩🏼‍🌾', + ':woman-farmer-medium-skin-tone:' => '👩🏽‍🌾', + ':woman-feeding-baby-dark-skin-tone:' => '👩🏿‍🍼', + ':woman-feeding-baby-light-skin-tone:' => '👩🏻‍🍼', + ':woman-feeding-baby-medium-dark-skin-tone:' => '👩🏾‍🍼', + ':woman-feeding-baby-medium-light-skin-tone:' => '👩🏼‍🍼', + ':woman-feeding-baby-medium-skin-tone:' => '👩🏽‍🍼', + ':woman-firefighter-dark-skin-tone:' => '👩🏿‍🚒', + ':woman-firefighter-light-skin-tone:' => '👩🏻‍🚒', + ':woman-firefighter-medium-dark-skin-tone:' => '👩🏾‍🚒', + ':woman-firefighter-medium-light-skin-tone:' => '👩🏼‍🚒', + ':woman-firefighter-medium-skin-tone:' => '👩🏽‍🚒', + ':woman-genie:' => '🧞‍♀️', + ':woman-guard:' => '💂‍♀️', + ':woman-in-manual-wheelchair-dark-skin-tone:' => '👩🏿‍🦽', + ':woman-in-manual-wheelchair-light-skin-tone:' => '👩🏻‍🦽', + ':woman-in-manual-wheelchair-medium-dark-skin-tone:' => '👩🏾‍🦽', + ':woman-in-manual-wheelchair-medium-light-skin-tone:' => '👩🏼‍🦽', + ':woman-in-manual-wheelchair-medium-skin-tone:' => '👩🏽‍🦽', + ':woman-in-motorized-wheelchair-dark-skin-tone:' => '👩🏿‍🦼', + ':woman-in-motorized-wheelchair-light-skin-tone:' => '👩🏻‍🦼', + ':woman-in-motorized-wheelchair-medium-dark-skin-tone:' => '👩🏾‍🦼', + ':woman-in-motorized-wheelchair-medium-light-skin-tone:' => '👩🏼‍🦼', + ':woman-in-motorized-wheelchair-medium-skin-tone:' => '👩🏽‍🦼', + ':woman-light-skin-tone-bald:' => '👩🏻‍🦲', + ':woman-light-skin-tone-curly-hair:' => '👩🏻‍🦱', + ':woman-light-skin-tone-red-hair:' => '👩🏻‍🦰', + ':woman-light-skin-tone-white-hair:' => '👩🏻‍🦳', + ':woman-mage:' => '🧙‍♀️', + ':woman-mechanic-dark-skin-tone:' => '👩🏿‍🔧', + ':woman-mechanic-light-skin-tone:' => '👩🏻‍🔧', + ':woman-mechanic-medium-dark-skin-tone:' => '👩🏾‍🔧', + ':woman-mechanic-medium-light-skin-tone:' => '👩🏼‍🔧', + ':woman-mechanic-medium-skin-tone:' => '👩🏽‍🔧', + ':woman-medium-dark-skin-tone-bald:' => '👩🏾‍🦲', + ':woman-medium-dark-skin-tone-curly-hair:' => '👩🏾‍🦱', + ':woman-medium-dark-skin-tone-red-hair:' => '👩🏾‍🦰', + ':woman-medium-dark-skin-tone-white-hair:' => '👩🏾‍🦳', + ':woman-medium-light-skin-tone-bald:' => '👩🏼‍🦲', + ':woman-medium-light-skin-tone-curly-hair:' => '👩🏼‍🦱', + ':woman-medium-light-skin-tone-red-hair:' => '👩🏼‍🦰', + ':woman-medium-light-skin-tone-white-hair:' => '👩🏼‍🦳', + ':woman-medium-skin-tone-bald:' => '👩🏽‍🦲', + ':woman-medium-skin-tone-curly-hair:' => '👩🏽‍🦱', + ':woman-medium-skin-tone-red-hair:' => '👩🏽‍🦰', + ':woman-medium-skin-tone-white-hair:' => '👩🏽‍🦳', + ':woman-office-worker-dark-skin-tone:' => '👩🏿‍💼', + ':woman-office-worker-light-skin-tone:' => '👩🏻‍💼', + ':woman-office-worker-medium-dark-skin-tone:' => '👩🏾‍💼', + ':woman-office-worker-medium-light-skin-tone:' => '👩🏼‍💼', + ':woman-office-worker-medium-skin-tone:' => '👩🏽‍💼', + ':woman-police-officer:' => '👮‍♀️', + ':woman-scientist-dark-skin-tone:' => '👩🏿‍🔬', + ':woman-scientist-light-skin-tone:' => '👩🏻‍🔬', + ':woman-scientist-medium-dark-skin-tone:' => '👩🏾‍🔬', + ':woman-scientist-medium-light-skin-tone:' => '👩🏼‍🔬', + ':woman-scientist-medium-skin-tone:' => '👩🏽‍🔬', + ':woman-singer-dark-skin-tone:' => '👩🏿‍🎤', + ':woman-singer-light-skin-tone:' => '👩🏻‍🎤', + ':woman-singer-medium-dark-skin-tone:' => '👩🏾‍🎤', + ':woman-singer-medium-light-skin-tone:' => '👩🏼‍🎤', + ':woman-singer-medium-skin-tone:' => '👩🏽‍🎤', + ':woman-student-dark-skin-tone:' => '👩🏿‍🎓', + ':woman-student-light-skin-tone:' => '👩🏻‍🎓', + ':woman-student-medium-dark-skin-tone:' => '👩🏾‍🎓', + ':woman-student-medium-light-skin-tone:' => '👩🏼‍🎓', + ':woman-student-medium-skin-tone:' => '👩🏽‍🎓', + ':woman-superhero:' => '🦸‍♀️', + ':woman-supervillain:' => '🦹‍♀️', + ':woman-teacher-dark-skin-tone:' => '👩🏿‍🏫', + ':woman-teacher-light-skin-tone:' => '👩🏻‍🏫', + ':woman-teacher-medium-dark-skin-tone:' => '👩🏾‍🏫', + ':woman-teacher-medium-light-skin-tone:' => '👩🏼‍🏫', + ':woman-teacher-medium-skin-tone:' => '👩🏽‍🏫', + ':woman-technologist-dark-skin-tone:' => '👩🏿‍💻', + ':woman-technologist-light-skin-tone:' => '👩🏻‍💻', + ':woman-technologist-medium-dark-skin-tone:' => '👩🏾‍💻', + ':woman-technologist-medium-light-skin-tone:' => '👩🏼‍💻', + ':woman-technologist-medium-skin-tone:' => '👩🏽‍💻', + ':woman-vampire:' => '🧛‍♀️', + ':woman-with-white-cane-dark-skin-tone:' => '👩🏿‍🦯', + ':woman-with-white-cane-light-skin-tone:' => '👩🏻‍🦯', + ':woman-with-white-cane-medium-dark-skin-tone:' => '👩🏾‍🦯', + ':woman-with-white-cane-medium-light-skin-tone:' => '👩🏼‍🦯', + ':woman-with-white-cane-medium-skin-tone:' => '👩🏽‍🦯', + ':woman-zombie:' => '🧟‍♀️', + ':women-with-bunny-ears:' => '👯‍♀️', + ':eye-in-speech-bubble:' => '👁️‍🗨️', ':family-adult-adult-child:' => '🧑‍🧑‍🧒', ':family-adult-child-child:' => '🧑‍🧒‍🧒', ':man-bouncing-ball:' => '⛹️‍♂️', @@ -3370,8 +3573,18 @@ ':woman-woman-boy:' => '👩‍👩‍👦', ':woman-woman-girl:' => '👩‍👩‍👧', ':couple-with-heart-man-man:' => '👨‍❤‍👨', - ':couple-with-heart-woman-man:' => '👩‍❤‍👨', + ':couple-with-heart-woman-man:' => '👩‍❤️‍👨', ':couple-with-heart-woman-woman:' => '👩‍❤‍👩', + ':deaf-man-dark-skin-tone:' => '🧏🏿‍♂️', + ':deaf-man-light-skin-tone:' => '🧏🏻‍♂️', + ':deaf-man-medium-dark-skin-tone:' => '🧏🏾‍♂️', + ':deaf-man-medium-light-skin-tone:' => '🧏🏼‍♂️', + ':deaf-man-medium-skin-tone:' => '🧏🏽‍♂️', + ':deaf-woman-dark-skin-tone:' => '🧏🏿‍♀️', + ':deaf-woman-light-skin-tone:' => '🧏🏻‍♀️', + ':deaf-woman-medium-dark-skin-tone:' => '🧏🏾‍♀️', + ':deaf-woman-medium-light-skin-tone:' => '🧏🏼‍♀️', + ':deaf-woman-medium-skin-tone:' => '🧏🏽‍♀️', ':family-man-boy-boy:' => '👨‍👦‍👦', ':family-man-girl-boy:' => '👨‍👧‍👦', ':family-man-girl-girl:' => '👨‍👧‍👧', @@ -3389,8 +3602,548 @@ ':family-woman-woman-girl:' => '👩‍👩‍👧', ':family-wwb:' => '👩‍👩‍👦', ':family-wwg:' => '👩‍👩‍👧', - ':couple-with-heart-mm:' => '👨‍❤️‍👨', - ':couple-with-heart-ww:' => '👩‍❤️‍👩', + ':handshake-dark-skin-tone-light-skin-tone:' => '🫱🏿‍🫲🏻', + ':handshake-dark-skin-tone-medium-dark-skin-tone:' => '🫱🏿‍🫲🏾', + ':handshake-dark-skin-tone-medium-light-skin-tone:' => '🫱🏿‍🫲🏼', + ':handshake-dark-skin-tone-medium-skin-tone:' => '🫱🏿‍🫲🏽', + ':handshake-light-skin-tone-dark-skin-tone:' => '🫱🏻‍🫲🏿', + ':handshake-light-skin-tone-medium-dark-skin-tone:' => '🫱🏻‍🫲🏾', + ':handshake-light-skin-tone-medium-light-skin-tone:' => '🫱🏻‍🫲🏼', + ':handshake-light-skin-tone-medium-skin-tone:' => '🫱🏻‍🫲🏽', + ':handshake-medium-dark-skin-tone-dark-skin-tone:' => '🫱🏾‍🫲🏿', + ':handshake-medium-dark-skin-tone-light-skin-tone:' => '🫱🏾‍🫲🏻', + ':handshake-medium-dark-skin-tone-medium-light-skin-tone:' => '🫱🏾‍🫲🏼', + ':handshake-medium-dark-skin-tone-medium-skin-tone:' => '🫱🏾‍🫲🏽', + ':handshake-medium-light-skin-tone-dark-skin-tone:' => '🫱🏼‍🫲🏿', + ':handshake-medium-light-skin-tone-light-skin-tone:' => '🫱🏼‍🫲🏻', + ':handshake-medium-light-skin-tone-medium-dark-skin-tone:' => '🫱🏼‍🫲🏾', + ':handshake-medium-light-skin-tone-medium-skin-tone:' => '🫱🏼‍🫲🏽', + ':handshake-medium-skin-tone-dark-skin-tone:' => '🫱🏽‍🫲🏿', + ':handshake-medium-skin-tone-light-skin-tone:' => '🫱🏽‍🫲🏻', + ':handshake-medium-skin-tone-medium-dark-skin-tone:' => '🫱🏽‍🫲🏾', + ':handshake-medium-skin-tone-medium-light-skin-tone:' => '🫱🏽‍🫲🏼', + ':health-worker-dark-skin-tone:' => '🧑🏿‍⚕️', + ':health-worker-light-skin-tone:' => '🧑🏻‍⚕️', + ':health-worker-medium-dark-skin-tone:' => '🧑🏾‍⚕️', + ':health-worker-medium-light-skin-tone:' => '🧑🏼‍⚕️', + ':health-worker-medium-skin-tone:' => '🧑🏽‍⚕️', + ':judge-dark-skin-tone:' => '🧑🏿‍⚖️', + ':judge-light-skin-tone:' => '🧑🏻‍⚖️', + ':judge-medium-dark-skin-tone:' => '🧑🏾‍⚖️', + ':judge-medium-light-skin-tone:' => '🧑🏼‍⚖️', + ':judge-medium-skin-tone:' => '🧑🏽‍⚖️', + ':man-biking-dark-skin-tone:' => '🚴🏿‍♂️', + ':man-biking-light-skin-tone:' => '🚴🏻‍♂️', + ':man-biking-medium-dark-skin-tone:' => '🚴🏾‍♂️', + ':man-biking-medium-light-skin-tone:' => '🚴🏼‍♂️', + ':man-biking-medium-skin-tone:' => '🚴🏽‍♂️', + ':man-bouncing-ball-dark-skin-tone:' => '⛹🏿‍♂️', + ':man-bouncing-ball-light-skin-tone:' => '⛹🏻‍♂️', + ':man-bouncing-ball-medium-dark-skin-tone:' => '⛹🏾‍♂️', + ':man-bouncing-ball-medium-light-skin-tone:' => '⛹🏼‍♂️', + ':man-bouncing-ball-medium-skin-tone:' => '⛹🏽‍♂️', + ':man-bowing-dark-skin-tone:' => '🙇🏿‍♂️', + ':man-bowing-light-skin-tone:' => '🙇🏻‍♂️', + ':man-bowing-medium-dark-skin-tone:' => '🙇🏾‍♂️', + ':man-bowing-medium-light-skin-tone:' => '🙇🏼‍♂️', + ':man-bowing-medium-skin-tone:' => '🙇🏽‍♂️', + ':man-cartwheeling-dark-skin-tone:' => '🤸🏿‍♂️', + ':man-cartwheeling-light-skin-tone:' => '🤸🏻‍♂️', + ':man-cartwheeling-medium-dark-skin-tone:' => '🤸🏾‍♂️', + ':man-cartwheeling-medium-light-skin-tone:' => '🤸🏼‍♂️', + ':man-cartwheeling-medium-skin-tone:' => '🤸🏽‍♂️', + ':man-climbing-dark-skin-tone:' => '🧗🏿‍♂️', + ':man-climbing-light-skin-tone:' => '🧗🏻‍♂️', + ':man-climbing-medium-dark-skin-tone:' => '🧗🏾‍♂️', + ':man-climbing-medium-light-skin-tone:' => '🧗🏼‍♂️', + ':man-climbing-medium-skin-tone:' => '🧗🏽‍♂️', + ':man-construction-worker-dark-skin-tone:' => '👷🏿‍♂️', + ':man-construction-worker-light-skin-tone:' => '👷🏻‍♂️', + ':man-construction-worker-medium-dark-skin-tone:' => '👷🏾‍♂️', + ':man-construction-worker-medium-light-skin-tone:' => '👷🏼‍♂️', + ':man-construction-worker-medium-skin-tone:' => '👷🏽‍♂️', + ':man-dark-skin-tone-beard:' => '🧔🏿‍♂️', + ':man-dark-skin-tone-blond-hair:' => '👱🏿‍♂️', + ':man-detective:' => '🕵️‍♂️', + ':man-detective-dark-skin-tone:' => '🕵🏿‍♂️', + ':man-detective-light-skin-tone:' => '🕵🏻‍♂️', + ':man-detective-medium-dark-skin-tone:' => '🕵🏾‍♂️', + ':man-detective-medium-light-skin-tone:' => '🕵🏼‍♂️', + ':man-detective-medium-skin-tone:' => '🕵🏽‍♂️', + ':man-elf-dark-skin-tone:' => '🧝🏿‍♂️', + ':man-elf-light-skin-tone:' => '🧝🏻‍♂️', + ':man-elf-medium-dark-skin-tone:' => '🧝🏾‍♂️', + ':man-elf-medium-light-skin-tone:' => '🧝🏼‍♂️', + ':man-elf-medium-skin-tone:' => '🧝🏽‍♂️', + ':man-facepalming-dark-skin-tone:' => '🤦🏿‍♂️', + ':man-facepalming-light-skin-tone:' => '🤦🏻‍♂️', + ':man-facepalming-medium-dark-skin-tone:' => '🤦🏾‍♂️', + ':man-facepalming-medium-light-skin-tone:' => '🤦🏼‍♂️', + ':man-facepalming-medium-skin-tone:' => '🤦🏽‍♂️', + ':man-fairy-dark-skin-tone:' => '🧚🏿‍♂️', + ':man-fairy-light-skin-tone:' => '🧚🏻‍♂️', + ':man-fairy-medium-dark-skin-tone:' => '🧚🏾‍♂️', + ':man-fairy-medium-light-skin-tone:' => '🧚🏼‍♂️', + ':man-fairy-medium-skin-tone:' => '🧚🏽‍♂️', + ':man-frowning-dark-skin-tone:' => '🙍🏿‍♂️', + ':man-frowning-light-skin-tone:' => '🙍🏻‍♂️', + ':man-frowning-medium-dark-skin-tone:' => '🙍🏾‍♂️', + ':man-frowning-medium-light-skin-tone:' => '🙍🏼‍♂️', + ':man-frowning-medium-skin-tone:' => '🙍🏽‍♂️', + ':man-gesturing-no-dark-skin-tone:' => '🙅🏿‍♂️', + ':man-gesturing-no-light-skin-tone:' => '🙅🏻‍♂️', + ':man-gesturing-no-medium-dark-skin-tone:' => '🙅🏾‍♂️', + ':man-gesturing-no-medium-light-skin-tone:' => '🙅🏼‍♂️', + ':man-gesturing-no-medium-skin-tone:' => '🙅🏽‍♂️', + ':man-gesturing-ok-dark-skin-tone:' => '🙆🏿‍♂️', + ':man-gesturing-ok-light-skin-tone:' => '🙆🏻‍♂️', + ':man-gesturing-ok-medium-dark-skin-tone:' => '🙆🏾‍♂️', + ':man-gesturing-ok-medium-light-skin-tone:' => '🙆🏼‍♂️', + ':man-gesturing-ok-medium-skin-tone:' => '🙆🏽‍♂️', + ':man-getting-haircut-dark-skin-tone:' => '💇🏿‍♂️', + ':man-getting-haircut-light-skin-tone:' => '💇🏻‍♂️', + ':man-getting-haircut-medium-dark-skin-tone:' => '💇🏾‍♂️', + ':man-getting-haircut-medium-light-skin-tone:' => '💇🏼‍♂️', + ':man-getting-haircut-medium-skin-tone:' => '💇🏽‍♂️', + ':man-getting-massage-dark-skin-tone:' => '💆🏿‍♂️', + ':man-getting-massage-light-skin-tone:' => '💆🏻‍♂️', + ':man-getting-massage-medium-dark-skin-tone:' => '💆🏾‍♂️', + ':man-getting-massage-medium-light-skin-tone:' => '💆🏼‍♂️', + ':man-getting-massage-medium-skin-tone:' => '💆🏽‍♂️', + ':man-golfing-dark-skin-tone:' => '🏌🏿‍♂️', + ':man-golfing-light-skin-tone:' => '🏌🏻‍♂️', + ':man-golfing-medium-dark-skin-tone:' => '🏌🏾‍♂️', + ':man-golfing-medium-light-skin-tone:' => '🏌🏼‍♂️', + ':man-golfing-medium-skin-tone:' => '🏌🏽‍♂️', + ':man-guard-dark-skin-tone:' => '💂🏿‍♂️', + ':man-guard-light-skin-tone:' => '💂🏻‍♂️', + ':man-guard-medium-dark-skin-tone:' => '💂🏾‍♂️', + ':man-guard-medium-light-skin-tone:' => '💂🏼‍♂️', + ':man-guard-medium-skin-tone:' => '💂🏽‍♂️', + ':man-health-worker-dark-skin-tone:' => '👨🏿‍⚕️', + ':man-health-worker-light-skin-tone:' => '👨🏻‍⚕️', + ':man-health-worker-medium-dark-skin-tone:' => '👨🏾‍⚕️', + ':man-health-worker-medium-light-skin-tone:' => '👨🏼‍⚕️', + ':man-health-worker-medium-skin-tone:' => '👨🏽‍⚕️', + ':man-in-lotus-position-dark-skin-tone:' => '🧘🏿‍♂️', + ':man-in-lotus-position-light-skin-tone:' => '🧘🏻‍♂️', + ':man-in-lotus-position-medium-dark-skin-tone:' => '🧘🏾‍♂️', + ':man-in-lotus-position-medium-light-skin-tone:' => '🧘🏼‍♂️', + ':man-in-lotus-position-medium-skin-tone:' => '🧘🏽‍♂️', + ':man-in-steamy-room-dark-skin-tone:' => '🧖🏿‍♂️', + ':man-in-steamy-room-light-skin-tone:' => '🧖🏻‍♂️', + ':man-in-steamy-room-medium-dark-skin-tone:' => '🧖🏾‍♂️', + ':man-in-steamy-room-medium-light-skin-tone:' => '🧖🏼‍♂️', + ':man-in-steamy-room-medium-skin-tone:' => '🧖🏽‍♂️', + ':man-in-tuxedo-dark-skin-tone:' => '🤵🏿‍♂️', + ':man-in-tuxedo-light-skin-tone:' => '🤵🏻‍♂️', + ':man-in-tuxedo-medium-dark-skin-tone:' => '🤵🏾‍♂️', + ':man-in-tuxedo-medium-light-skin-tone:' => '🤵🏼‍♂️', + ':man-in-tuxedo-medium-skin-tone:' => '🤵🏽‍♂️', + ':man-judge-dark-skin-tone:' => '👨🏿‍⚖️', + ':man-judge-light-skin-tone:' => '👨🏻‍⚖️', + ':man-judge-medium-dark-skin-tone:' => '👨🏾‍⚖️', + ':man-judge-medium-light-skin-tone:' => '👨🏼‍⚖️', + ':man-judge-medium-skin-tone:' => '👨🏽‍⚖️', + ':man-juggling-dark-skin-tone:' => '🤹🏿‍♂️', + ':man-juggling-light-skin-tone:' => '🤹🏻‍♂️', + ':man-juggling-medium-dark-skin-tone:' => '🤹🏾‍♂️', + ':man-juggling-medium-light-skin-tone:' => '🤹🏼‍♂️', + ':man-juggling-medium-skin-tone:' => '🤹🏽‍♂️', + ':man-kneeling-dark-skin-tone:' => '🧎🏿‍♂️', + ':man-kneeling-light-skin-tone:' => '🧎🏻‍♂️', + ':man-kneeling-medium-dark-skin-tone:' => '🧎🏾‍♂️', + ':man-kneeling-medium-light-skin-tone:' => '🧎🏼‍♂️', + ':man-kneeling-medium-skin-tone:' => '🧎🏽‍♂️', + ':man-lifting-weights-dark-skin-tone:' => '🏋🏿‍♂️', + ':man-lifting-weights-light-skin-tone:' => '🏋🏻‍♂️', + ':man-lifting-weights-medium-dark-skin-tone:' => '🏋🏾‍♂️', + ':man-lifting-weights-medium-light-skin-tone:' => '🏋🏼‍♂️', + ':man-lifting-weights-medium-skin-tone:' => '🏋🏽‍♂️', + ':man-light-skin-tone-beard:' => '🧔🏻‍♂️', + ':man-light-skin-tone-blond-hair:' => '👱🏻‍♂️', + ':man-mage-dark-skin-tone:' => '🧙🏿‍♂️', + ':man-mage-light-skin-tone:' => '🧙🏻‍♂️', + ':man-mage-medium-dark-skin-tone:' => '🧙🏾‍♂️', + ':man-mage-medium-light-skin-tone:' => '🧙🏼‍♂️', + ':man-mage-medium-skin-tone:' => '🧙🏽‍♂️', + ':man-medium-dark-skin-tone-beard:' => '🧔🏾‍♂️', + ':man-medium-dark-skin-tone-blond-hair:' => '👱🏾‍♂️', + ':man-medium-light-skin-tone-beard:' => '🧔🏼‍♂️', + ':man-medium-light-skin-tone-blond-hair:' => '👱🏼‍♂️', + ':man-medium-skin-tone-beard:' => '🧔🏽‍♂️', + ':man-medium-skin-tone-blond-hair:' => '👱🏽‍♂️', + ':man-mountain-biking-dark-skin-tone:' => '🚵🏿‍♂️', + ':man-mountain-biking-light-skin-tone:' => '🚵🏻‍♂️', + ':man-mountain-biking-medium-dark-skin-tone:' => '🚵🏾‍♂️', + ':man-mountain-biking-medium-light-skin-tone:' => '🚵🏼‍♂️', + ':man-mountain-biking-medium-skin-tone:' => '🚵🏽‍♂️', + ':man-pilot-dark-skin-tone:' => '👨🏿‍✈️', + ':man-pilot-light-skin-tone:' => '👨🏻‍✈️', + ':man-pilot-medium-dark-skin-tone:' => '👨🏾‍✈️', + ':man-pilot-medium-light-skin-tone:' => '👨🏼‍✈️', + ':man-pilot-medium-skin-tone:' => '👨🏽‍✈️', + ':man-playing-handball-dark-skin-tone:' => '🤾🏿‍♂️', + ':man-playing-handball-light-skin-tone:' => '🤾🏻‍♂️', + ':man-playing-handball-medium-dark-skin-tone:' => '🤾🏾‍♂️', + ':man-playing-handball-medium-light-skin-tone:' => '🤾🏼‍♂️', + ':man-playing-handball-medium-skin-tone:' => '🤾🏽‍♂️', + ':man-playing-water-polo-dark-skin-tone:' => '🤽🏿‍♂️', + ':man-playing-water-polo-light-skin-tone:' => '🤽🏻‍♂️', + ':man-playing-water-polo-medium-dark-skin-tone:' => '🤽🏾‍♂️', + ':man-playing-water-polo-medium-light-skin-tone:' => '🤽🏼‍♂️', + ':man-playing-water-polo-medium-skin-tone:' => '🤽🏽‍♂️', + ':man-police-officer-dark-skin-tone:' => '👮🏿‍♂️', + ':man-police-officer-light-skin-tone:' => '👮🏻‍♂️', + ':man-police-officer-medium-dark-skin-tone:' => '👮🏾‍♂️', + ':man-police-officer-medium-light-skin-tone:' => '👮🏼‍♂️', + ':man-police-officer-medium-skin-tone:' => '👮🏽‍♂️', + ':man-pouting-dark-skin-tone:' => '🙎🏿‍♂️', + ':man-pouting-light-skin-tone:' => '🙎🏻‍♂️', + ':man-pouting-medium-dark-skin-tone:' => '🙎🏾‍♂️', + ':man-pouting-medium-light-skin-tone:' => '🙎🏼‍♂️', + ':man-pouting-medium-skin-tone:' => '🙎🏽‍♂️', + ':man-raising-hand-dark-skin-tone:' => '🙋🏿‍♂️', + ':man-raising-hand-light-skin-tone:' => '🙋🏻‍♂️', + ':man-raising-hand-medium-dark-skin-tone:' => '🙋🏾‍♂️', + ':man-raising-hand-medium-light-skin-tone:' => '🙋🏼‍♂️', + ':man-raising-hand-medium-skin-tone:' => '🙋🏽‍♂️', + ':man-rowing-boat-dark-skin-tone:' => '🚣🏿‍♂️', + ':man-rowing-boat-light-skin-tone:' => '🚣🏻‍♂️', + ':man-rowing-boat-medium-dark-skin-tone:' => '🚣🏾‍♂️', + ':man-rowing-boat-medium-light-skin-tone:' => '🚣🏼‍♂️', + ':man-rowing-boat-medium-skin-tone:' => '🚣🏽‍♂️', + ':man-running-dark-skin-tone:' => '🏃🏿‍♂️', + ':man-running-light-skin-tone:' => '🏃🏻‍♂️', + ':man-running-medium-dark-skin-tone:' => '🏃🏾‍♂️', + ':man-running-medium-light-skin-tone:' => '🏃🏼‍♂️', + ':man-running-medium-skin-tone:' => '🏃🏽‍♂️', + ':man-shrugging-dark-skin-tone:' => '🤷🏿‍♂️', + ':man-shrugging-light-skin-tone:' => '🤷🏻‍♂️', + ':man-shrugging-medium-dark-skin-tone:' => '🤷🏾‍♂️', + ':man-shrugging-medium-light-skin-tone:' => '🤷🏼‍♂️', + ':man-shrugging-medium-skin-tone:' => '🤷🏽‍♂️', + ':man-standing-dark-skin-tone:' => '🧍🏿‍♂️', + ':man-standing-light-skin-tone:' => '🧍🏻‍♂️', + ':man-standing-medium-dark-skin-tone:' => '🧍🏾‍♂️', + ':man-standing-medium-light-skin-tone:' => '🧍🏼‍♂️', + ':man-standing-medium-skin-tone:' => '🧍🏽‍♂️', + ':man-superhero-dark-skin-tone:' => '🦸🏿‍♂️', + ':man-superhero-light-skin-tone:' => '🦸🏻‍♂️', + ':man-superhero-medium-dark-skin-tone:' => '🦸🏾‍♂️', + ':man-superhero-medium-light-skin-tone:' => '🦸🏼‍♂️', + ':man-superhero-medium-skin-tone:' => '🦸🏽‍♂️', + ':man-supervillain-dark-skin-tone:' => '🦹🏿‍♂️', + ':man-supervillain-light-skin-tone:' => '🦹🏻‍♂️', + ':man-supervillain-medium-dark-skin-tone:' => '🦹🏾‍♂️', + ':man-supervillain-medium-light-skin-tone:' => '🦹🏼‍♂️', + ':man-supervillain-medium-skin-tone:' => '🦹🏽‍♂️', + ':man-surfing-dark-skin-tone:' => '🏄🏿‍♂️', + ':man-surfing-light-skin-tone:' => '🏄🏻‍♂️', + ':man-surfing-medium-dark-skin-tone:' => '🏄🏾‍♂️', + ':man-surfing-medium-light-skin-tone:' => '🏄🏼‍♂️', + ':man-surfing-medium-skin-tone:' => '🏄🏽‍♂️', + ':man-swimming-dark-skin-tone:' => '🏊🏿‍♂️', + ':man-swimming-light-skin-tone:' => '🏊🏻‍♂️', + ':man-swimming-medium-dark-skin-tone:' => '🏊🏾‍♂️', + ':man-swimming-medium-light-skin-tone:' => '🏊🏼‍♂️', + ':man-swimming-medium-skin-tone:' => '🏊🏽‍♂️', + ':man-tipping-hand-dark-skin-tone:' => '💁🏿‍♂️', + ':man-tipping-hand-light-skin-tone:' => '💁🏻‍♂️', + ':man-tipping-hand-medium-dark-skin-tone:' => '💁🏾‍♂️', + ':man-tipping-hand-medium-light-skin-tone:' => '💁🏼‍♂️', + ':man-tipping-hand-medium-skin-tone:' => '💁🏽‍♂️', + ':man-vampire-dark-skin-tone:' => '🧛🏿‍♂️', + ':man-vampire-light-skin-tone:' => '🧛🏻‍♂️', + ':man-vampire-medium-dark-skin-tone:' => '🧛🏾‍♂️', + ':man-vampire-medium-light-skin-tone:' => '🧛🏼‍♂️', + ':man-vampire-medium-skin-tone:' => '🧛🏽‍♂️', + ':man-walking-dark-skin-tone:' => '🚶🏿‍♂️', + ':man-walking-light-skin-tone:' => '🚶🏻‍♂️', + ':man-walking-medium-dark-skin-tone:' => '🚶🏾‍♂️', + ':man-walking-medium-light-skin-tone:' => '🚶🏼‍♂️', + ':man-walking-medium-skin-tone:' => '🚶🏽‍♂️', + ':man-wearing-turban-dark-skin-tone:' => '👳🏿‍♂️', + ':man-wearing-turban-light-skin-tone:' => '👳🏻‍♂️', + ':man-wearing-turban-medium-dark-skin-tone:' => '👳🏾‍♂️', + ':man-wearing-turban-medium-light-skin-tone:' => '👳🏼‍♂️', + ':man-wearing-turban-medium-skin-tone:' => '👳🏽‍♂️', + ':man-with-veil-dark-skin-tone:' => '👰🏿‍♂️', + ':man-with-veil-light-skin-tone:' => '👰🏻‍♂️', + ':man-with-veil-medium-dark-skin-tone:' => '👰🏾‍♂️', + ':man-with-veil-medium-light-skin-tone:' => '👰🏼‍♂️', + ':man-with-veil-medium-skin-tone:' => '👰🏽‍♂️', + ':mermaid-dark-skin-tone:' => '🧜🏿‍♀️', + ':mermaid-light-skin-tone:' => '🧜🏻‍♀️', + ':mermaid-medium-dark-skin-tone:' => '🧜🏾‍♀️', + ':mermaid-medium-light-skin-tone:' => '🧜🏼‍♀️', + ':mermaid-medium-skin-tone:' => '🧜🏽‍♀️', + ':merman-dark-skin-tone:' => '🧜🏿‍♂️', + ':merman-light-skin-tone:' => '🧜🏻‍♂️', + ':merman-medium-dark-skin-tone:' => '🧜🏾‍♂️', + ':merman-medium-light-skin-tone:' => '🧜🏼‍♂️', + ':merman-medium-skin-tone:' => '🧜🏽‍♂️', + ':person-kneeling-facing-right-dark-skin-tone:' => '🧎🏿‍➡️', + ':person-kneeling-facing-right-light-skin-tone:' => '🧎🏻‍➡️', + ':person-kneeling-facing-right-medium-dark-skin-tone:' => '🧎🏾‍➡️', + ':person-kneeling-facing-right-medium-light-skin-tone:' => '🧎🏼‍➡️', + ':person-kneeling-facing-right-medium-skin-tone:' => '🧎🏽‍➡️', + ':person-running-facing-right-dark-skin-tone:' => '🏃🏿‍➡️', + ':person-running-facing-right-light-skin-tone:' => '🏃🏻‍➡️', + ':person-running-facing-right-medium-dark-skin-tone:' => '🏃🏾‍➡️', + ':person-running-facing-right-medium-light-skin-tone:' => '🏃🏼‍➡️', + ':person-running-facing-right-medium-skin-tone:' => '🏃🏽‍➡️', + ':person-walking-facing-right-dark-skin-tone:' => '🚶🏿‍➡️', + ':person-walking-facing-right-light-skin-tone:' => '🚶🏻‍➡️', + ':person-walking-facing-right-medium-dark-skin-tone:' => '🚶🏾‍➡️', + ':person-walking-facing-right-medium-light-skin-tone:' => '🚶🏼‍➡️', + ':person-walking-facing-right-medium-skin-tone:' => '🚶🏽‍➡️', + ':pilot-dark-skin-tone:' => '🧑🏿‍✈️', + ':pilot-light-skin-tone:' => '🧑🏻‍✈️', + ':pilot-medium-dark-skin-tone:' => '🧑🏾‍✈️', + ':pilot-medium-light-skin-tone:' => '🧑🏼‍✈️', + ':pilot-medium-skin-tone:' => '🧑🏽‍✈️', + ':woman-biking-dark-skin-tone:' => '🚴🏿‍♀️', + ':woman-biking-light-skin-tone:' => '🚴🏻‍♀️', + ':woman-biking-medium-dark-skin-tone:' => '🚴🏾‍♀️', + ':woman-biking-medium-light-skin-tone:' => '🚴🏼‍♀️', + ':woman-biking-medium-skin-tone:' => '🚴🏽‍♀️', + ':woman-bouncing-ball-dark-skin-tone:' => '⛹🏿‍♀️', + ':woman-bouncing-ball-light-skin-tone:' => '⛹🏻‍♀️', + ':woman-bouncing-ball-medium-dark-skin-tone:' => '⛹🏾‍♀️', + ':woman-bouncing-ball-medium-light-skin-tone:' => '⛹🏼‍♀️', + ':woman-bouncing-ball-medium-skin-tone:' => '⛹🏽‍♀️', + ':woman-bowing-dark-skin-tone:' => '🙇🏿‍♀️', + ':woman-bowing-light-skin-tone:' => '🙇🏻‍♀️', + ':woman-bowing-medium-dark-skin-tone:' => '🙇🏾‍♀️', + ':woman-bowing-medium-light-skin-tone:' => '🙇🏼‍♀️', + ':woman-bowing-medium-skin-tone:' => '🙇🏽‍♀️', + ':woman-cartwheeling-dark-skin-tone:' => '🤸🏿‍♀️', + ':woman-cartwheeling-light-skin-tone:' => '🤸🏻‍♀️', + ':woman-cartwheeling-medium-dark-skin-tone:' => '🤸🏾‍♀️', + ':woman-cartwheeling-medium-light-skin-tone:' => '🤸🏼‍♀️', + ':woman-cartwheeling-medium-skin-tone:' => '🤸🏽‍♀️', + ':woman-climbing-dark-skin-tone:' => '🧗🏿‍♀️', + ':woman-climbing-light-skin-tone:' => '🧗🏻‍♀️', + ':woman-climbing-medium-dark-skin-tone:' => '🧗🏾‍♀️', + ':woman-climbing-medium-light-skin-tone:' => '🧗🏼‍♀️', + ':woman-climbing-medium-skin-tone:' => '🧗🏽‍♀️', + ':woman-construction-worker-dark-skin-tone:' => '👷🏿‍♀️', + ':woman-construction-worker-light-skin-tone:' => '👷🏻‍♀️', + ':woman-construction-worker-medium-dark-skin-tone:' => '👷🏾‍♀️', + ':woman-construction-worker-medium-light-skin-tone:' => '👷🏼‍♀️', + ':woman-construction-worker-medium-skin-tone:' => '👷🏽‍♀️', + ':woman-dark-skin-tone-beard:' => '🧔🏿‍♀️', + ':woman-dark-skin-tone-blond-hair:' => '👱🏿‍♀️', + ':woman-detective:' => '🕵️‍♀️', + ':woman-detective-dark-skin-tone:' => '🕵🏿‍♀️', + ':woman-detective-light-skin-tone:' => '🕵🏻‍♀️', + ':woman-detective-medium-dark-skin-tone:' => '🕵🏾‍♀️', + ':woman-detective-medium-light-skin-tone:' => '🕵🏼‍♀️', + ':woman-detective-medium-skin-tone:' => '🕵🏽‍♀️', + ':woman-elf-dark-skin-tone:' => '🧝🏿‍♀️', + ':woman-elf-light-skin-tone:' => '🧝🏻‍♀️', + ':woman-elf-medium-dark-skin-tone:' => '🧝🏾‍♀️', + ':woman-elf-medium-light-skin-tone:' => '🧝🏼‍♀️', + ':woman-elf-medium-skin-tone:' => '🧝🏽‍♀️', + ':woman-facepalming-dark-skin-tone:' => '🤦🏿‍♀️', + ':woman-facepalming-light-skin-tone:' => '🤦🏻‍♀️', + ':woman-facepalming-medium-dark-skin-tone:' => '🤦🏾‍♀️', + ':woman-facepalming-medium-light-skin-tone:' => '🤦🏼‍♀️', + ':woman-facepalming-medium-skin-tone:' => '🤦🏽‍♀️', + ':woman-fairy-dark-skin-tone:' => '🧚🏿‍♀️', + ':woman-fairy-light-skin-tone:' => '🧚🏻‍♀️', + ':woman-fairy-medium-dark-skin-tone:' => '🧚🏾‍♀️', + ':woman-fairy-medium-light-skin-tone:' => '🧚🏼‍♀️', + ':woman-fairy-medium-skin-tone:' => '🧚🏽‍♀️', + ':woman-frowning-dark-skin-tone:' => '🙍🏿‍♀️', + ':woman-frowning-light-skin-tone:' => '🙍🏻‍♀️', + ':woman-frowning-medium-dark-skin-tone:' => '🙍🏾‍♀️', + ':woman-frowning-medium-light-skin-tone:' => '🙍🏼‍♀️', + ':woman-frowning-medium-skin-tone:' => '🙍🏽‍♀️', + ':woman-gesturing-no-dark-skin-tone:' => '🙅🏿‍♀️', + ':woman-gesturing-no-light-skin-tone:' => '🙅🏻‍♀️', + ':woman-gesturing-no-medium-dark-skin-tone:' => '🙅🏾‍♀️', + ':woman-gesturing-no-medium-light-skin-tone:' => '🙅🏼‍♀️', + ':woman-gesturing-no-medium-skin-tone:' => '🙅🏽‍♀️', + ':woman-gesturing-ok-dark-skin-tone:' => '🙆🏿‍♀️', + ':woman-gesturing-ok-light-skin-tone:' => '🙆🏻‍♀️', + ':woman-gesturing-ok-medium-dark-skin-tone:' => '🙆🏾‍♀️', + ':woman-gesturing-ok-medium-light-skin-tone:' => '🙆🏼‍♀️', + ':woman-gesturing-ok-medium-skin-tone:' => '🙆🏽‍♀️', + ':woman-getting-haircut-dark-skin-tone:' => '💇🏿‍♀️', + ':woman-getting-haircut-light-skin-tone:' => '💇🏻‍♀️', + ':woman-getting-haircut-medium-dark-skin-tone:' => '💇🏾‍♀️', + ':woman-getting-haircut-medium-light-skin-tone:' => '💇🏼‍♀️', + ':woman-getting-haircut-medium-skin-tone:' => '💇🏽‍♀️', + ':woman-getting-massage-dark-skin-tone:' => '💆🏿‍♀️', + ':woman-getting-massage-light-skin-tone:' => '💆🏻‍♀️', + ':woman-getting-massage-medium-dark-skin-tone:' => '💆🏾‍♀️', + ':woman-getting-massage-medium-light-skin-tone:' => '💆🏼‍♀️', + ':woman-getting-massage-medium-skin-tone:' => '💆🏽‍♀️', + ':woman-golfing-dark-skin-tone:' => '🏌🏿‍♀️', + ':woman-golfing-light-skin-tone:' => '🏌🏻‍♀️', + ':woman-golfing-medium-dark-skin-tone:' => '🏌🏾‍♀️', + ':woman-golfing-medium-light-skin-tone:' => '🏌🏼‍♀️', + ':woman-golfing-medium-skin-tone:' => '🏌🏽‍♀️', + ':woman-guard-dark-skin-tone:' => '💂🏿‍♀️', + ':woman-guard-light-skin-tone:' => '💂🏻‍♀️', + ':woman-guard-medium-dark-skin-tone:' => '💂🏾‍♀️', + ':woman-guard-medium-light-skin-tone:' => '💂🏼‍♀️', + ':woman-guard-medium-skin-tone:' => '💂🏽‍♀️', + ':woman-health-worker-dark-skin-tone:' => '👩🏿‍⚕️', + ':woman-health-worker-light-skin-tone:' => '👩🏻‍⚕️', + ':woman-health-worker-medium-dark-skin-tone:' => '👩🏾‍⚕️', + ':woman-health-worker-medium-light-skin-tone:' => '👩🏼‍⚕️', + ':woman-health-worker-medium-skin-tone:' => '👩🏽‍⚕️', + ':woman-in-lotus-position-dark-skin-tone:' => '🧘🏿‍♀️', + ':woman-in-lotus-position-light-skin-tone:' => '🧘🏻‍♀️', + ':woman-in-lotus-position-medium-dark-skin-tone:' => '🧘🏾‍♀️', + ':woman-in-lotus-position-medium-light-skin-tone:' => '🧘🏼‍♀️', + ':woman-in-lotus-position-medium-skin-tone:' => '🧘🏽‍♀️', + ':woman-in-steamy-room-dark-skin-tone:' => '🧖🏿‍♀️', + ':woman-in-steamy-room-light-skin-tone:' => '🧖🏻‍♀️', + ':woman-in-steamy-room-medium-dark-skin-tone:' => '🧖🏾‍♀️', + ':woman-in-steamy-room-medium-light-skin-tone:' => '🧖🏼‍♀️', + ':woman-in-steamy-room-medium-skin-tone:' => '🧖🏽‍♀️', + ':woman-in-tuxedo-dark-skin-tone:' => '🤵🏿‍♀️', + ':woman-in-tuxedo-light-skin-tone:' => '🤵🏻‍♀️', + ':woman-in-tuxedo-medium-dark-skin-tone:' => '🤵🏾‍♀️', + ':woman-in-tuxedo-medium-light-skin-tone:' => '🤵🏼‍♀️', + ':woman-in-tuxedo-medium-skin-tone:' => '🤵🏽‍♀️', + ':woman-judge-dark-skin-tone:' => '👩🏿‍⚖️', + ':woman-judge-light-skin-tone:' => '👩🏻‍⚖️', + ':woman-judge-medium-dark-skin-tone:' => '👩🏾‍⚖️', + ':woman-judge-medium-light-skin-tone:' => '👩🏼‍⚖️', + ':woman-judge-medium-skin-tone:' => '👩🏽‍⚖️', + ':woman-juggling-dark-skin-tone:' => '🤹🏿‍♀️', + ':woman-juggling-light-skin-tone:' => '🤹🏻‍♀️', + ':woman-juggling-medium-dark-skin-tone:' => '🤹🏾‍♀️', + ':woman-juggling-medium-light-skin-tone:' => '🤹🏼‍♀️', + ':woman-juggling-medium-skin-tone:' => '🤹🏽‍♀️', + ':woman-kneeling-dark-skin-tone:' => '🧎🏿‍♀️', + ':woman-kneeling-light-skin-tone:' => '🧎🏻‍♀️', + ':woman-kneeling-medium-dark-skin-tone:' => '🧎🏾‍♀️', + ':woman-kneeling-medium-light-skin-tone:' => '🧎🏼‍♀️', + ':woman-kneeling-medium-skin-tone:' => '🧎🏽‍♀️', + ':woman-lifting-weights-dark-skin-tone:' => '🏋🏿‍♀️', + ':woman-lifting-weights-light-skin-tone:' => '🏋🏻‍♀️', + ':woman-lifting-weights-medium-dark-skin-tone:' => '🏋🏾‍♀️', + ':woman-lifting-weights-medium-light-skin-tone:' => '🏋🏼‍♀️', + ':woman-lifting-weights-medium-skin-tone:' => '🏋🏽‍♀️', + ':woman-light-skin-tone-beard:' => '🧔🏻‍♀️', + ':woman-light-skin-tone-blond-hair:' => '👱🏻‍♀️', + ':woman-mage-dark-skin-tone:' => '🧙🏿‍♀️', + ':woman-mage-light-skin-tone:' => '🧙🏻‍♀️', + ':woman-mage-medium-dark-skin-tone:' => '🧙🏾‍♀️', + ':woman-mage-medium-light-skin-tone:' => '🧙🏼‍♀️', + ':woman-mage-medium-skin-tone:' => '🧙🏽‍♀️', + ':woman-medium-dark-skin-tone-beard:' => '🧔🏾‍♀️', + ':woman-medium-dark-skin-tone-blond-hair:' => '👱🏾‍♀️', + ':woman-medium-light-skin-tone-beard:' => '🧔🏼‍♀️', + ':woman-medium-light-skin-tone-blond-hair:' => '👱🏼‍♀️', + ':woman-medium-skin-tone-beard:' => '🧔🏽‍♀️', + ':woman-medium-skin-tone-blond-hair:' => '👱🏽‍♀️', + ':woman-mountain-biking-dark-skin-tone:' => '🚵🏿‍♀️', + ':woman-mountain-biking-light-skin-tone:' => '🚵🏻‍♀️', + ':woman-mountain-biking-medium-dark-skin-tone:' => '🚵🏾‍♀️', + ':woman-mountain-biking-medium-light-skin-tone:' => '🚵🏼‍♀️', + ':woman-mountain-biking-medium-skin-tone:' => '🚵🏽‍♀️', + ':woman-pilot-dark-skin-tone:' => '👩🏿‍✈️', + ':woman-pilot-light-skin-tone:' => '👩🏻‍✈️', + ':woman-pilot-medium-dark-skin-tone:' => '👩🏾‍✈️', + ':woman-pilot-medium-light-skin-tone:' => '👩🏼‍✈️', + ':woman-pilot-medium-skin-tone:' => '👩🏽‍✈️', + ':woman-playing-handball-dark-skin-tone:' => '🤾🏿‍♀️', + ':woman-playing-handball-light-skin-tone:' => '🤾🏻‍♀️', + ':woman-playing-handball-medium-dark-skin-tone:' => '🤾🏾‍♀️', + ':woman-playing-handball-medium-light-skin-tone:' => '🤾🏼‍♀️', + ':woman-playing-handball-medium-skin-tone:' => '🤾🏽‍♀️', + ':woman-playing-water-polo-dark-skin-tone:' => '🤽🏿‍♀️', + ':woman-playing-water-polo-light-skin-tone:' => '🤽🏻‍♀️', + ':woman-playing-water-polo-medium-dark-skin-tone:' => '🤽🏾‍♀️', + ':woman-playing-water-polo-medium-light-skin-tone:' => '🤽🏼‍♀️', + ':woman-playing-water-polo-medium-skin-tone:' => '🤽🏽‍♀️', + ':woman-police-officer-dark-skin-tone:' => '👮🏿‍♀️', + ':woman-police-officer-light-skin-tone:' => '👮🏻‍♀️', + ':woman-police-officer-medium-dark-skin-tone:' => '👮🏾‍♀️', + ':woman-police-officer-medium-light-skin-tone:' => '👮🏼‍♀️', + ':woman-police-officer-medium-skin-tone:' => '👮🏽‍♀️', + ':woman-pouti 17AE ng-dark-skin-tone:' => '🙎🏿‍♀️', + ':woman-pouting-light-skin-tone:' => '🙎🏻‍♀️', + ':woman-pouting-medium-dark-skin-tone:' => '🙎🏾‍♀️', + ':woman-pouting-medium-light-skin-tone:' => '🙎🏼‍♀️', + ':woman-pouting-medium-skin-tone:' => '🙎🏽‍♀️', + ':woman-raising-hand-dark-skin-tone:' => '🙋🏿‍♀️', + ':woman-raising-hand-light-skin-tone:' => '🙋🏻‍♀️', + ':woman-raising-hand-medium-dark-skin-tone:' => '🙋🏾‍♀️', + ':woman-raising-hand-medium-light-skin-tone:' => '🙋🏼‍♀️', + ':woman-raising-hand-medium-skin-tone:' => '🙋🏽‍♀️', + ':woman-rowing-boat-dark-skin-tone:' => '🚣🏿‍♀️', + ':woman-rowing-boat-light-skin-tone:' => '🚣🏻‍♀️', + ':woman-rowing-boat-medium-dark-skin-tone:' => '🚣🏾‍♀️', + ':woman-rowing-boat-medium-light-skin-tone:' => '🚣🏼‍♀️', + ':woman-rowing-boat-medium-skin-tone:' => '🚣🏽‍♀️', + ':woman-running-dark-skin-tone:' => '🏃🏿‍♀️', + ':woman-running-light-skin-tone:' => '🏃🏻‍♀️', + ':woman-running-medium-dark-skin-tone:' => '🏃🏾‍♀️', + ':woman-running-medium-light-skin-tone:' => '🏃🏼‍♀️', + ':woman-running-medium-skin-tone:' => '🏃🏽‍♀️', + ':woman-shrugging-dark-skin-tone:' => '🤷🏿‍♀️', + ':woman-shrugging-light-skin-tone:' => '🤷🏻‍♀️', + ':woman-shrugging-medium-dark-skin-tone:' => '🤷🏾‍♀️', + ':woman-shrugging-medium-light-skin-tone:' => '🤷🏼‍♀️', + ':woman-shrugging-medium-skin-tone:' => '🤷🏽‍♀️', + ':woman-standing-dark-skin-tone:' => '🧍🏿‍♀️', + ':woman-standing-light-skin-tone:' => '🧍🏻‍♀️', + ':woman-standing-medium-dark-skin-tone:' => '🧍🏾‍♀️', + ':woman-standing-medium-light-skin-tone:' => '🧍🏼‍♀️', + ':woman-standing-medium-skin-tone:' => '🧍🏽‍♀️', + ':woman-superhero-dark-skin-tone:' => '🦸🏿‍♀️', + ':woman-superhero-light-skin-tone:' => '🦸🏻‍♀️', + ':woman-superhero-medium-dark-skin-tone:' => '🦸🏾‍♀️', + ':woman-superhero-medium-light-skin-tone:' => '🦸🏼‍♀️', + ':woman-superhero-medium-skin-tone:' => '🦸🏽‍♀️', + ':woman-supervillain-dark-skin-tone:' => '🦹🏿‍♀️', + ':woman-supervillain-light-skin-tone:' => '🦹🏻‍♀️', + ':woman-supervillain-medium-dark-skin-tone:' => '🦹🏾‍♀️', + ':woman-supervillain-medium-light-skin-tone:' => '🦹🏼‍♀️', + ':woman-supervillain-medium-skin-tone:' => '🦹🏽‍♀️', + ':woman-surfing-dark-skin-tone:' => '🏄🏿‍♀️', + ':woman-surfing-light-skin-tone:' => '🏄🏻‍♀️', + ':woman-surfing-medium-dark-skin-tone:' => '🏄🏾‍♀️', + ':woman-surfing-medium-light-skin-tone:' => '🏄🏼‍♀️', + ':woman-surfing-medium-skin-tone:' => '🏄🏽‍♀️', + ':woman-swimming-dark-skin-tone:' => '🏊🏿‍♀️', + ':woman-swimming-light-skin-tone:' => '🏊🏻‍♀️', + ':woman-swimming-medium-dark-skin-tone:' => '🏊🏾‍♀️', + ':woman-swimming-medium-light-skin-tone:' => '🏊🏼‍♀️', + ':woman-swimming-medium-skin-tone:' => '🏊🏽‍♀️', + ':woman-tipping-hand-dark-skin-tone:' => '💁🏿‍♀️', + ':woman-tipping-hand-light-skin-tone:' => '💁🏻‍♀️', + ':woman-tipping-hand-medium-dark-skin-tone:' => '💁🏾‍♀️', + ':woman-tipping-hand-medium-light-skin-tone:' => '💁🏼‍♀️', + ':woman-tipping-hand-medium-skin-tone:' => '💁🏽‍♀️', + ':woman-vampire-dark-skin-tone:' => '🧛🏿‍♀️', + ':woman-vampire-light-skin-tone:' => '🧛🏻‍♀️', + ':woman-vampire-medium-dark-skin-tone:' => '🧛🏾‍♀️', + ':woman-vampire-medium-light-skin-tone:' => '🧛🏼‍♀️', + ':woman-vampire-medium-skin-tone:' => '🧛🏽‍♀️', + ':woman-walking-dark-skin-tone:' => '🚶🏿‍♀️', + ':woman-walking-light-skin-tone:' => '🚶🏻‍♀️', + ':woman-walking-medium-dark-skin-tone:' => '🚶🏾‍♀️', + ':woman-walking-medium-light-skin-tone:' => '🚶🏼‍♀️', + ':woman-walking-medium-skin-tone:' => '🚶🏽‍♀️', + ':woman-wearing-turban-dark-skin-tone:' => '👳🏿‍♀️', + ':woman-wearing-turban-light-skin-tone:' => '👳🏻‍♀️', + ':woman-wearing-turban-medium-dark-skin-tone:' => '👳🏾‍♀️', + ':woman-wearing-turban-medium-light-skin-tone:' => '👳🏼‍♀️', + ':woman-wearing-turban-medium-skin-tone:' => '👳🏽‍♀️', + ':woman-with-veil-dark-skin-tone:' => '👰🏿‍♀️', + ':woman-with-veil-light-skin-tone:' => '👰🏻‍♀️', + ':woman-with-veil-medium-dark-skin-tone:' => '👰🏾‍♀️', + ':woman-with-veil-medium-light-skin-tone:' => '👰🏼‍♀️', + ':woman-with-veil-medium-skin-tone:' => '👰🏽‍♀️', ':man-heart-man:' => '👨‍❤️‍👨', ':man-in-manual-wheelchair-facing-right:' => '👨‍🦽‍➡️', ':man-in-motorized-wheelchair-facing-right:' => '👨‍🦼‍➡️', @@ -3446,13 +4199,362 @@ ':family-wwbb:' => '👩‍👩‍👦‍👦', ':family-wwgb:' => '👩‍👩‍👧‍👦', ':family-wwgg:' => '👩‍👩‍👧‍👧', + ':man-in-manual-wheelchair-facing-right-dark-skin-tone:' => '👨🏿‍🦽‍➡️', + ':man-in-manual-wheelchair-facing-right-light-skin-tone:' => '👨🏻‍🦽‍➡️', + ':man-in-manual-wheelchair-facing-right-medium-dark-skin-tone:' => '👨🏾‍🦽‍➡️', + ':man-in-manual-wheelchair-facing-right-medium-light-skin-tone:' => '👨🏼‍🦽‍➡️', + ':man-in-manual-wheelchair-facing-right-medium-skin-tone:' => '👨🏽‍🦽‍➡️', + ':man-in-motorized-wheelchair-facing-right-dark-skin-tone:' => '👨🏿‍🦼‍➡️', + ':man-in-motorized-wh F41A eelchair-facing-right-light-skin-tone:' => '👨🏻‍🦼‍➡️', + ':man-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:' => '👨🏾‍🦼‍➡️', + ':man-in-motorized-wheelchair-facing-right-medium-light-skin-tone:' => '👨🏼‍🦼‍➡️', + ':man-in-motorized-wheelchair-facing-right-medium-skin-tone:' => '👨🏽‍🦼‍➡️', + ':man-with-white-cane-facing-right-dark-skin-tone:' => '👨🏿‍🦯‍➡️', + ':man-with-white-cane-facing-right-light-skin-tone:' => '👨🏻‍🦯‍➡️', + ':man-with-white-cane-facing-right-medium-dark-skin-tone:' => '👨🏾‍🦯‍➡️', + ':man-with-white-cane-facing-right-medium-light-skin-tone:' => '👨🏼‍🦯‍➡️', + ':man-with-white-cane-facing-right-medium-skin-tone:' => '👨🏽‍🦯‍➡️', + ':men-holding-hands-dark-skin-tone-light-skin-tone:' => '👨🏿‍🤝‍👨🏻', + ':men-holding-hands-dark-skin-tone-medium-dark-skin-tone:' => '👨🏿‍🤝‍👨🏾', + ':men-holding-hands-dark-skin-tone-medium-light-skin-tone:' => '👨🏿‍🤝‍👨🏼', + ':men-holding-hands-dark-skin-tone-medium-skin-tone:' => '👨🏿‍🤝‍👨🏽', + ':men-holding-hands-light-skin-tone-dark-skin-tone:' => '👨🏻‍🤝‍👨🏿', + ':men-holding-hands-light-skin-tone-medium-dark-skin-tone:' => '👨🏻‍🤝‍👨🏾', + ':men-holding-hands-light-skin-tone-medium-light-skin-tone:' => '👨🏻‍🤝‍👨🏼', + ':men-holding-hands-light-skin-tone-medium-skin-tone:' => '👨🏻‍🤝‍👨🏽', + ':men-holding-hands-medium-dark-skin-tone-dark-skin-tone:' => '👨🏾‍🤝‍👨🏿', + ':men-holding-hands-medium-dark-skin-tone-light-skin-tone:' => '👨🏾‍🤝‍👨🏻', + ':men-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:' => '👨🏾‍🤝‍👨🏼', + ':men-holding-hands-medium-dark-skin-tone-medium-skin-tone:' => '👨🏾‍🤝‍👨🏽', + ':men-holding-hands-medium-light-skin-tone-dark-skin-tone:' => '👨🏼‍🤝‍👨🏿', + ':men-holding-hands-medium-light-skin-tone-light-skin-tone:' => '👨🏼‍🤝‍👨🏻', + ':men-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:' => '👨🏼‍🤝‍👨🏾', + ':men-holding-hands-medium-light-skin-tone-medium-skin-tone:' => '👨🏼‍🤝‍👨🏽', + ':men-holding-hands-medium-skin-tone-dark-skin-tone:' => '👨🏽‍🤝‍👨🏿', + ':men-holding-hands-medium-skin-tone-light-skin-tone:' => '👨🏽‍🤝‍👨🏻', + ':men-holding-hands-medium-skin-tone-medium-dark-skin-tone:' => '👨🏽‍🤝‍👨🏾', + ':men-holding-hands-medium-skin-tone-medium-light-skin-tone:' => '👨🏽‍🤝‍👨🏼', + ':people-holding-hands-dark-skin-tone:' => '🧑🏿‍🤝‍🧑🏿', + ':people-holding-hands-dark-skin-tone-light-skin-tone:' => '🧑🏿‍🤝‍🧑🏻', + ':people-holding-hands-dark-skin-tone-medium-dark-skin-tone:' => '🧑🏿‍🤝‍🧑🏾', + ':people-holding-hands-dark-skin-tone-medium-light-skin-tone:' => '🧑🏿‍🤝‍🧑🏼', + ':people-holding-hands-dark-skin-tone-medium-skin-tone:' => '🧑🏿‍🤝‍🧑🏽', + ':people-holding-hands-light-skin-tone:' => '🧑🏻‍🤝‍🧑🏻', + ':people-holding-hands-light-skin-tone-dark-skin-tone:' => '🧑🏻‍🤝‍🧑🏿', + ':people-holding-hands-light-skin-tone-medium-dark-skin-tone:' => '🧑🏻‍🤝‍🧑🏾', + ':people-holding-hands-light-skin-tone-medium-light-skin-tone:' => '🧑🏻‍🤝‍🧑🏼', + ':people-holding-hands-light-skin-tone-medium-skin-tone:' => '🧑🏻‍🤝‍🧑🏽', + ':people-holding-hands-medium-dark-skin-tone:' => '🧑🏾‍🤝‍🧑🏾', + ':people-holding-hands-medium-dark-skin-tone-dark-skin-tone:' => '🧑🏾‍🤝‍🧑🏿', + ':people-holding-hands-medium-dark-skin-tone-light-skin-tone:' => '🧑🏾‍🤝‍🧑🏻', + ':people-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:' => '🧑🏾‍🤝‍🧑🏼', + ':people-holding-hands-medium-dark-skin-tone-medium-skin-tone:' => '🧑🏾‍🤝‍🧑🏽', + ':people-holding-hands-medium-light-skin-tone:' => '🧑🏼‍🤝‍🧑🏼', + ':people-holding-hands-medium-light-skin-tone-dark-skin-tone:' => '🧑🏼‍🤝‍🧑🏿', + ':people-holding-hands-medium-light-skin-tone-light-skin-tone:' => '🧑🏼‍🤝‍🧑🏻', + ':people-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:' => '🧑🏼‍🤝‍🧑🏾', + ':people-holding-hands-medium-light-skin-tone-medium-skin-tone:' => '🧑🏼‍🤝‍🧑🏽', + ':people-holding-hands-medium-skin-tone:' => '🧑🏽‍🤝‍🧑🏽', + ':people-holding-hands-medium-skin-tone-dark-skin-tone:' => '🧑🏽‍🤝‍🧑🏿', + ':people-holding-hands-medium-skin-tone-light-skin-tone:' => '🧑🏽‍🤝‍🧑🏻', + ':people-holding-hands-medium-skin-tone-medium-dark-skin-tone:' => '🧑🏽‍🤝‍🧑🏾', + ':people-holding-hands-medium-skin-tone-medium-light-skin-tone:' => '🧑🏽‍🤝‍🧑🏼', + ':person-in-manual-wheelchair-facing-right-dark-skin-tone:' => '🧑🏿‍🦽‍➡️', + ':person-in-manual-wheelchair-facing-right-light-skin-tone:' => '🧑🏻‍🦽‍➡️', + ':person-in-manual-wheelchair-facing-right-medium-dark-skin-tone:' => '🧑🏾‍🦽‍➡️', + ':person-in-manual-wheelchair-facing-right-medium-light-skin-tone:' => '🧑🏼‍🦽‍➡️', + ':person-in-manual-wheelchair-facing-right-medium-skin-tone:' => '🧑🏽‍🦽‍➡️', + ':person-in-motorized-wheelchair-facing-right-dark-skin-tone:' => '🧑🏿‍🦼‍➡️', + ':person-in-motorized-wheelchair-facing-right-light-skin-tone:' => '🧑🏻‍🦼‍➡️', + ':person-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:' => '🧑🏾‍🦼‍➡️', + ':person-in-motorized-wheelchair-facing-right-medium-light-skin-tone:' => '🧑🏼‍🦼‍➡️', + ':person-in-motorized-wheelchair-facing-right-medium-skin-tone:' => '🧑🏽‍🦼‍➡️', + ':person-with-white-cane-facing-right-dark-skin-tone:' => '🧑🏿‍🦯‍➡️', + ':person-with-white-cane-facing-right-light-skin-tone:' => '🧑🏻‍🦯‍➡️', + ':person-with-white-cane-facing-right-medium-dark-skin-tone:' => '🧑🏾‍🦯‍➡️', + ':person-with-white-cane-facing-right-medium-light-skin-tone:' => '🧑🏼‍🦯‍➡️', + ':person-with-white-cane-facing-right-medium-skin-tone:' => '🧑🏽‍🦯‍➡️', ':scotland:' => '🏴󠁧󠁢󠁳󠁣󠁴󠁿', ':wales:' => '🏴󠁧󠁢󠁷󠁬󠁳󠁿', - ':couplekiss-mm:' => '👨‍❤️‍💋‍👨', - ':couplekiss-ww:' => '👩‍❤️‍💋‍👩', + ':woman-and-man-holding-hands-dark-skin-tone-light-skin-tone:' => '👩🏿‍🤝‍👨🏻', + ':woman-and-man-holding-hands-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍🤝‍👨🏾', + ':woman-and-man-holding-hands-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍🤝‍👨🏼', + ':woman-and-man-holding-hands-dark-skin-tone-medium-skin-tone:' => '👩🏿‍🤝‍👨🏽', + ':woman-and-man-holding-hands-light-skin-tone-dark-skin-tone:' => '👩🏻‍🤝‍👨🏿', + ':woman-and-man-holding-hands-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍🤝‍👨🏾', + ':woman-and-man-holding-hands-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍🤝‍👨🏼', + ':woman-and-man-holding-hands-light-skin-tone-medium-skin-tone:' => '👩🏻‍🤝‍👨🏽', + ':woman-and-man-holding-hands-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍🤝‍👨🏿', + ':woman-and-man-holding-hands-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍🤝‍👨🏻', + ':woman-and-man-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍🤝‍👨🏼', + ':woman-and-man-holding-hands-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍🤝‍👨🏽', + ':woman-and-man-holding-hands-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍🤝‍👨🏿', + ':woman-and-man-holding-hands-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍🤝‍👨🏻', + ':woman-and-man-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍🤝‍👨🏾', + ':woman-and-man-holding-hands-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍🤝‍👨🏽', + ':woman-and-man-holding-hands-medium-skin-tone-dark-skin-tone:' => '👩🏽‍🤝‍👨🏿', + ':woman-and-man-holding-hands-medium-skin-tone-light-skin-tone:' => '👩🏽‍🤝‍👨🏻', + ':woman-and-man-holding-hands-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍🤝‍👨🏾', + ':woman-and-man-holding-hands-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍🤝‍👨🏼', + ':woman-in-manual-wheelchair-facing-right-dark-skin-tone:' => '👩🏿‍🦽‍➡️', + ':woman-in-manual-wheelchair-facing-right-light-skin-tone:' => '👩🏻‍🦽‍➡️', + ':woman-in-manual-wheelchair-facing-right-medium-dark-skin-tone:' => '👩🏾‍🦽‍➡️', + ':woman-in-manual-wheelchair-facing-right-medium-light-skin-tone:' => '👩🏼‍🦽‍➡️', + ':woman-in-manual-wheelchair-facing-right-medium-skin-tone:' => '👩🏽‍🦽‍➡️', + ':woman-in-motorized-wheelchair-facing-right-dark-skin-tone:' => '👩🏿‍🦼‍➡️', + ':woman-in-motorized-wheelchair-facing-right-light-skin-tone:' => '👩🏻‍🦼‍➡️', + ':woman-in-motorized-wheelchair-facing-right-medium-dark-skin-tone:' => '👩🏾‍🦼‍➡️', + ':woman-in-motorized-wheelchair-facing-right-medium-light-skin-tone:' => '👩🏼‍🦼‍➡️', + ':woman-in-motorized-wheelchair-facing-right-medium-skin-tone:' => '👩🏽‍🦼‍➡️', + ':woman-with-white-cane-facing-right-dark-skin-tone:' => '👩🏿‍🦯‍➡️', + ':woman-with-white-cane-facing-right-light-skin-tone:' => '👩🏻‍🦯‍➡️', + ':woman-with-white-cane-facing-right-medium-dark-skin-tone:' => '👩🏾‍🦯‍➡️', + ':woman-with-white-cane-facing-right-medium-light-skin-tone:' => '👩🏼‍🦯‍➡️', + ':woman-with-white-cane-facing-right-medium-skin-tone:' => '👩🏽‍🦯‍➡️', + ':women-holding-hands-dark-skin-tone-light-skin-tone:' => '👩🏿‍🤝‍👩🏻', + ':women-holding-hands-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍🤝‍👩🏾', + ':women-holding-hands-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍🤝‍👩🏼', + ':women-holding-hands-dark-skin-tone-medium-skin-tone:' => '👩🏿‍🤝‍👩🏽', + ':women-holding-hands-light-skin-tone-dark-skin-tone:' => '👩🏻‍🤝‍👩🏿', + ':women-holding-hands-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍🤝‍👩🏾', + ':women-holding-hands-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍🤝‍👩🏼', + ':women-holding-hands-light-skin-tone-medium-skin-tone:' => '👩🏻‍🤝‍👩🏽', + ':women-holding-hands-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍🤝‍👩🏿', + ':women-holding-hands-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍🤝‍👩🏻', + ':women-holding-hands-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍🤝‍👩🏼', + ':women-holding-hands-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍🤝‍👩🏽', + ':women-holding-hands-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍🤝‍👩🏿', + ':women-holding-hands-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍🤝‍👩🏻', + ':women-holding-hands-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍🤝‍👩🏾', + ':women-holding-hands-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍🤝‍👩🏽', + ':women-holding-hands-medium-skin-tone-dark-skin-tone:' => '👩🏽‍🤝‍👩🏿', + ':women-holding-hands-medium-skin-tone-light-skin-tone:' => '👩🏽‍🤝‍👩🏻', + ':women-holding-hands-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍🤝‍👩🏾', + ':women-holding-hands-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍🤝‍👩🏼', ':man-kiss-man:' => '👨‍❤️‍💋‍👨', ':woman-kiss-man:' => '👩‍❤️‍💋‍👨', ':woman-kiss-woman:' => '👩‍❤️‍💋‍👩', + ':couple-with-heart-man-man-dark-skin-tone:' => '👨🏿‍❤️‍👨🏿', + ':couple-with-heart-man-man-dark-skin-tone-light-skin-tone:' => '👨🏿‍❤️‍👨🏻', + ':couple-with-heart-man-man-dark-skin-tone-medium-dark-skin-tone:' => '👨🏿‍❤️‍👨🏾', + ':couple-with-heart-man-man-dark-skin-tone-medium-light-skin-tone:' => '👨🏿‍❤️‍👨🏼', + ':couple-with-heart-man-man-dark-skin-tone-medium-skin-tone:' => '👨🏿‍❤️‍👨🏽', + ':couple-with-heart-man-man-light-skin-tone:' => '👨🏻‍❤️‍👨🏻', + ':couple-with-heart-man-man-light-skin-tone-dark-skin-tone:' => '👨🏻‍❤️‍👨🏿', + ':couple-with-heart-man-man-light-skin-tone-medium-dark-skin-tone:' => '👨🏻‍❤️‍👨🏾', + ':couple-with-heart-man-man-light-skin-tone-medium-light-skin-tone:' => '👨🏻‍❤️‍👨🏼', + ':couple-with-heart-man-man-light-skin-tone-medium-skin-tone:' => '👨🏻‍❤️‍👨🏽', + ':couple-with-heart-man-man-medium-dark-skin-tone:' => '👨🏾‍❤️‍👨🏾', + ':couple-with-heart-man-man-medium-dark-skin-tone-dark-skin-tone:' => '👨🏾‍❤️‍👨🏿', + ':couple-with-heart-man-man-medium-dark-skin-tone-light-skin-tone:' => '👨🏾‍❤️‍👨🏻', + ':couple-with-heart-man-man-medium-dark-skin-tone-medium-light-skin-tone:' => '👨🏾‍❤️‍👨🏼', + ':couple-with-heart-man-man-medium-dark-skin-tone-medium-skin-tone:' => '👨🏾‍❤️‍👨🏽', + ':couple-with-heart-man-man-medium-light-skin-tone:' => '👨🏼‍❤️‍👨🏼', + ':couple-with-heart-man-man-medium-light-skin-tone-dark-skin-tone:' => '👨🏼‍❤️‍👨🏿', + ':couple-with-heart-man-man-medium-light-skin-tone-light-skin-tone:' => '👨🏼‍❤️‍👨🏻', + ':couple-with-heart-man-man-medium-light-skin-tone-medium-dark-skin-tone:' => '👨🏼‍❤️‍👨🏾', + ':couple-with-heart-man-man-medium-light-skin-tone-medium-skin-tone:' => '👨🏼‍❤️‍👨🏽', + ':couple-with-heart-man-man-medium-skin-tone:' => '👨🏽‍❤️‍👨🏽', + ':couple-with-heart-man-man-medium-skin-tone-dark-skin-tone:' => '👨🏽‍❤️‍👨🏿', + ':couple-with-heart-man-man-medium-skin-tone-light-skin-tone:' => '👨🏽‍❤️‍👨🏻', + ':couple-with-heart-man-man-medium-skin-tone-medium-dark-skin-tone:' => '👨🏽‍❤️‍👨🏾', + ':couple-with-heart-man-man-medium-skin-tone-medium-light-skin-tone:' => '👨🏽‍❤️‍👨🏼', + ':couple-with-heart-person-person-dark-skin-tone-light-skin-tone:' => '🧑🏿‍❤️‍🧑🏻', + ':couple-with-heart-person-person-dark-skin-tone-medium-dark-skin-tone:' => '🧑🏿‍❤️‍🧑🏾', + ':couple-with-heart-person-person-dark-skin-tone-medium-light-skin-tone:' => '🧑🏿‍❤️‍🧑🏼', + ':couple-with-heart-person-person-dark-skin-tone-medium-skin-tone:' => '🧑🏿‍❤️‍🧑🏽', + ':couple-with-heart-person-person-light-skin-tone-dark-skin-tone:' => '🧑🏻‍❤️‍🧑🏿', + ':couple-with-heart-person-person-light-skin-tone-medium-dark-skin-tone:' => '🧑🏻‍❤️‍🧑🏾', + ':couple-with-heart-person-person-light-skin-tone-medium-light-skin-tone:' => '🧑🏻‍❤️‍🧑🏼', + ':couple-with-heart-person-person-light-skin-tone-medium-skin-tone:' => '🧑🏻‍❤️‍🧑🏽', + ':couple-with-heart-person-person-medium-dark-skin-tone-dark-skin-tone:' => '🧑🏾‍❤️‍🧑🏿', + ':couple-with-heart-person-person-medium-dark-skin-tone-light-skin-tone:' => '🧑🏾‍❤️‍🧑🏻', + ':couple-with-heart-person-person-medium-dark-skin-tone-medium-light-skin-tone:' => '🧑🏾‍❤️‍🧑🏼', + ':couple-with-heart-person-person-medium-dark-skin-tone-medium-skin-tone:' => '🧑🏾‍❤️‍🧑🏽', + ':couple-with-heart-person-person-medium-light-skin-tone-dark-skin-tone:' => '🧑🏼‍❤️‍🧑🏿', + ':couple-with-heart-person-person-medium-light-skin-tone-light-skin-tone:' => '🧑🏼‍❤️‍🧑🏻', + ':couple-with-heart-person-person-medium-light-skin-tone-medium-dark-skin-tone:' => '🧑🏼‍❤️‍🧑🏾', + ':couple-with-heart-person-person-medium-light-skin-tone-medium-skin-tone:' => '🧑🏼‍❤️‍🧑🏽', + ':couple-with-heart-person-person-medium-skin-tone-dark-skin-tone:' => '🧑🏽‍❤️‍🧑🏿', + ':couple-with-heart-person-person-medium-skin-tone-light-skin-tone:' => '🧑🏽‍❤️‍🧑🏻', + ':couple-with-heart-person-person-medium-skin-tone-medium-dark-skin-tone:' => '🧑🏽‍❤️‍🧑🏾', + ':couple-with-heart-person-person-medium-skin-tone-medium-light-skin-tone:' => '🧑🏽‍❤️‍🧑🏼', + ':couple-with-heart-woman-man-dark-skin-tone:' => '👩🏿‍❤️‍👨🏿', + ':couple-with-heart-woman-man-dark-skin-tone-light-skin-tone:' => '👩🏿‍❤️‍👨🏻', + ':couple-with-heart-woman-man-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍❤️‍👨🏾', + ':couple-with-heart-woman-man-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍❤️‍👨🏼', + ':couple-with-heart-woman-man-dark-skin-tone-medium-skin-tone:' => '👩🏿‍❤️‍👨🏽', + ':couple-with-heart-woman-man-light-skin-tone:' => '👩🏻‍❤️‍👨🏻', + ':couple-with-heart-woman-man-light-skin-tone-dark-skin-tone:' => '👩🏻‍❤️‍👨🏿', + ':couple-with-heart-woman-man-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍❤️‍👨🏾', + ':couple-with-heart-woman-man-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍❤️‍👨🏼', + ':couple-with-heart-woman-man-light-skin-tone-medium-skin-tone:' => '👩🏻‍❤️‍👨🏽', + ':couple-with-heart-woman-man-medium-dark-skin-tone:' => '👩🏾‍❤️‍👨🏾', + ':couple-with-heart-woman-man-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍❤️‍👨🏿', + ':couple-with-heart-woman-man-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍❤️‍👨🏻', + ':couple-with-heart-woman-man-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍❤️‍👨🏼', + ':couple-with-heart-woman-man-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍❤️‍👨🏽', + ':couple-with-heart-woman-man-medium-light-skin-tone:' => '👩🏼‍❤️‍👨🏼', + ':couple-with-heart-woman-man-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍❤️‍👨🏿', + ':couple-with-heart-woman-man-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍❤️‍👨🏻', + ':couple-with-heart-woman-man-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍❤️‍👨🏾', + ':couple-with-heart-woman-man-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍❤️‍👨🏽', + ':couple-with-heart-woman-man-medium-skin-tone:' => '👩🏽‍❤️‍👨🏽', + ':couple-with-heart-woman-man-medium-skin-tone-dark-skin-tone:' => '👩🏽‍❤️‍👨🏿', + ':couple-with-heart-woman-man-medium-skin-tone-light-skin-tone:' => '👩🏽‍❤️‍👨🏻', + ':couple-with-heart-woman-man-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍❤️‍👨🏾', + ':couple-with-heart-woman-man-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍❤️‍👨🏼', + ':couple-with-heart-woman-woman-dark-skin-tone:' => '👩🏿‍❤️‍👩🏿', + ':couple-with-heart-woman-woman-dark-skin-tone-light-skin-tone:' => '👩🏿‍❤️‍👩🏻', + ':couple-with-heart-woman-woman-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍❤️‍👩🏾', + ':couple-with-heart-woman-woman-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍❤️‍👩🏼', + ':couple-with-heart-woman-woman-dark-skin-tone-medium-skin-tone:' => '👩🏿‍❤️‍👩🏽', + ':couple-with-heart-woman-woman-light-skin-tone:' => '👩🏻‍❤️‍👩🏻', + ':couple-with-heart-woman-woman-light-skin-tone-dark-skin-tone:' => '👩🏻‍❤️‍👩🏿', + ':couple-with-heart-woman-woman-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍❤️‍👩🏾', + ':couple-with-heart-woman-woman-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍❤️‍👩🏼', + ':couple-with-heart-woman-woman-light-skin-tone-medium-skin-tone:' => '👩🏻‍❤️‍👩🏽', + ':couple-with-heart-woman-woman-medium-dark-skin-tone:' => '👩🏾‍❤️‍👩🏾', + ':couple-with-heart-woman-woman-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍❤️‍👩🏿', + ':couple-with-heart-woman-woman-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍❤️‍👩🏻', + ':couple-with-heart-woman-woman-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍❤️‍👩🏼', + ':couple-with-heart-woman-woman-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍❤️‍👩🏽', + ':couple-with-heart-woman-woman-medium-light-skin-tone:' => '👩🏼‍❤️‍👩🏼', + ':couple-with-heart-woman-woman-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍❤️‍👩🏿', + ':couple-with-heart-woman-woman-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍❤️‍👩🏻', + ':couple-with-heart-woman-woman-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍❤️‍👩🏾', + ':couple-with-heart-woman-woman-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍❤️‍👩🏽', + ':couple-with-heart-woman-woman-medium-skin-tone:' => '👩🏽‍❤️‍👩🏽', + ':couple-with-heart-woman-woman-medium-skin-tone-dark-skin-tone:' => '👩🏽‍❤️‍👩🏿', + ':couple-with-heart-woman-woman-medium-skin-tone-light-skin-tone:' => '👩🏽‍❤️‍👩🏻', + ':couple-with-heart-woman-woman-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍❤️‍👩🏾', + ':couple-with-heart-woman-woman-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍❤️‍👩🏼', ':kiss-mm:' => '👨‍❤️‍💋‍👨', + ':kiss-woman-man:' => '👩‍❤️‍💋‍👨', ':kiss-ww:' => '👩‍❤️‍💋‍👩', + ':man-kneeling-facing-right-dark-skin-tone:' => '🧎🏿‍♂️‍➡️', + ':man-kneeling-facing-right-light-skin-tone:' => '🧎🏻‍♂️‍➡️', + ':man-kneeling-facing-right-medium-dark-skin-tone:' => '🧎🏾‍♂️‍➡️', + ':man-kneeling-facing-right-medium-light-skin-tone:' => '🧎🏼‍♂️‍➡️', + ':man-kneeling-facing-right-medium-skin-tone:' => '🧎🏽‍♂️‍➡️', + ':man-running-facing-right-dark-skin-tone:' => '🏃🏿‍♂️‍➡️', + ':man-running-facing-right-light-skin-tone:' => '🏃🏻‍♂️‍➡️', + ':man-running-facing-right-medium-dark-skin-tone:' => '🏃🏾‍♂️‍➡️', + ':man-running-facing-right-medium-light-skin-tone:' => '🏃🏼‍♂️‍➡️', + ':man-running-facing-right-medium-skin-tone:' => '🏃🏽‍♂️‍➡️', + ':man-walking-facing-right-dark-skin-tone:' => '🚶🏿‍♂️‍➡️', + ':man-walking-facing-right-light-skin-tone:' => '🚶🏻‍♂️‍➡️', + ':man-walking-facing-right-medium-dark-skin-tone:' => '🚶🏾‍♂️‍➡️', + ':man-walking-facing-right-medium-light-skin-tone:' => '🚶🏼‍♂️‍➡️', + ':man-walking-facing-right-medium-skin-tone:' => '🚶🏽‍♂️‍➡️', + ':woman-kneeling-facing-right-dark-skin-tone:' => '🧎🏿‍♀️‍➡️', + ':woman-kneeling-facing-right-light-skin-tone:' => '🧎🏻‍♀️‍➡️', + ':woman-kneeling-facing-right-medium-dark-skin-tone:' => '🧎🏾‍♀️‍➡️', + ':woman-kneeling-facing-right-medium-light-skin-tone:' => '🧎🏼‍♀️‍➡️', + ':woman-kneeling-facing-right-medium-skin-tone:' => '🧎🏽‍♀️‍➡️', + ':woman-running-facing-right-dark-skin-tone:' => '🏃🏿‍♀️‍➡️', + ':woman-running-facing-right-light-skin-tone:' => '🏃🏻‍♀️‍➡️', + ':woman-running-facing-right-medium-dark-skin-tone:' => '🏃🏾‍♀️‍➡️', + ':woman-running-facing-right-medium-light-skin-tone:' => '🏃🏼‍♀️‍➡️', + ':woman-running-facing-right-medium-skin-tone:' => '🏃🏽‍♀️‍➡️', + ':woman-walking-facing-right-dark-skin-tone:' => '🚶🏿‍♀️‍➡️', + ':woman-walking-facing-right-light-skin-tone:' => '🚶🏻‍♀️‍➡️', + ':woman-walking-facing-right-medium-dark-skin-tone:' => '🚶🏾‍♀️‍➡️', + ':woman-walking-facing-right-medium-light-skin-tone:' => '🚶🏼‍♀️‍➡️', + ':woman-walking-facing-right-medium-skin-tone:' => '🚶🏽‍♀️‍➡️', + ':kiss-man-man-dark-skin-tone:' => '👨🏿‍❤️‍💋‍👨🏿', + ':kiss-man-man-dark-skin-tone-light-skin-tone:' => '👨🏿‍❤️‍💋‍👨🏻', + ':kiss-man-man-dark-skin-tone-medium-dark-skin-tone:' => '👨🏿‍❤️‍💋‍👨🏾', + ':kiss-man-man-dark-skin-tone-medium-light-skin-tone:' => '👨🏿‍❤️‍💋‍👨🏼', + ':kiss-man-man-dark-skin-tone-medium-skin-tone:' => '👨🏿‍❤️‍💋‍👨🏽', + ':kiss-man-man-light-skin-tone:' => '👨🏻‍❤️‍💋‍👨🏻', + ':kiss-man-man-light-skin-tone-dark-skin-tone:' => '👨🏻‍❤️‍💋‍👨🏿', + ':kiss-man-man-light-skin-tone-medium-dark-skin-tone:' => '👨🏻‍❤️‍💋‍👨🏾', + ':kiss-man-man-light-skin-tone-medium-light-skin-tone:' => '👨🏻‍❤️‍💋‍👨🏼', + ':kiss-man-man-light-skin-tone-medium-skin-tone:' => '👨🏻‍❤️‍💋‍👨🏽', + ':kiss-man-man-medium-dark-skin-tone:' => '👨🏾‍❤️‍💋‍👨🏾', + ':kiss-man-man-medium-dark-skin-tone-dark-skin-tone:' => '👨🏾‍❤️‍💋‍👨🏿', + ':kiss-man-man-medium-dark-skin-tone-light-skin-tone:' => '👨🏾‍❤️‍💋‍👨🏻', + ':kiss-man-man-medium-dark-skin-tone-medium-light-skin-tone:' => '👨🏾‍❤️‍💋‍👨🏼', + ':kiss-man-man-medium-dark-skin-tone-medium-skin-tone:' => '👨🏾‍❤️‍💋‍👨🏽', + ':kiss-man-man-medium-light-skin-tone:' => '👨🏼‍❤️‍💋‍👨🏼', + ':kiss-man-man-medium-light-skin-tone-dark-skin-tone:' => '👨🏼‍❤️‍💋‍👨🏿', + ':kiss-man-man-medium-light-skin-tone-light-skin-tone:' => '👨🏼‍❤️‍💋‍👨🏻', + ':kiss-man-man-medium-light-skin-tone-medium-dark-skin-tone:' => '👨🏼‍❤️‍💋‍👨🏾', + ':kiss-man-man-medium-light-skin-tone-medium-skin-tone:' => '👨🏼‍❤️‍💋‍👨🏽', + ':kiss-man-man-medium-skin-tone:' => '👨🏽‍❤️‍💋‍👨🏽', + ':kiss-man-man-medium-skin-tone-dark-skin-tone:' => '👨🏽‍❤️‍💋‍👨🏿', + ':kiss-man-man-medium-skin-tone-light-skin-tone:' => '👨🏽‍❤️‍💋‍👨🏻', + ':kiss-man-man-medium-skin-tone-medium-dark-skin-tone:' => '👨🏽‍❤️‍💋‍👨🏾', + ':kiss-man-man-medium-skin-tone-medium-light-skin-tone:' => '👨🏽‍❤️‍💋‍👨🏼', + ':kiss-person-person-dark-skin-tone-light-skin-tone:' => '🧑🏿‍❤️‍💋‍🧑🏻', + ':kiss-person-person-dark-skin-tone-medium-dark-skin-tone:' => '🧑🏿‍❤️‍💋‍🧑🏾', + ':kiss-person-person-dark-skin-tone-medium-light-skin-tone:' => '🧑🏿‍❤️‍💋‍🧑🏼', + ':kiss-person-person-dark-skin-tone-medium-skin-tone:' => '🧑🏿‍❤️‍💋‍🧑🏽', + ':kiss-person-person-light-skin-tone-dark-skin-tone:' => '🧑🏻‍❤️‍💋‍🧑🏿', + ':kiss-person-person-light-skin-tone-medium-dark-skin-tone:' => '🧑🏻‍❤️‍💋‍🧑🏾', + ':kiss-person-person-light-skin-tone-medium-light-skin-tone:' => '🧑🏻‍❤️‍💋‍🧑🏼', + ':kiss-person-person-light-skin-tone-medium-skin-tone:' => '🧑🏻‍❤️‍💋‍🧑🏽', + ':kiss-person-person-medium-dark-skin-tone-dark-skin-tone:' => '🧑🏾‍❤️‍💋‍🧑🏿', + ':kiss-person-person-medium-dark-skin-tone-light-skin-tone:' => '🧑🏾‍❤️‍💋‍🧑🏻', + ':kiss-person-person-medium-dark-skin-tone-medium-light-skin-tone:' => '🧑🏾‍❤️‍💋‍🧑🏼', + ':kiss-person-person-medium-dark-skin-tone-medium-skin-tone:' => '🧑🏾‍❤️‍💋‍🧑🏽', + ':kiss-person-person-medium-light-skin-tone-dark-skin-tone:' => '🧑🏼‍❤️‍💋‍🧑🏿', + ':kiss-person-person-medium-light-skin-tone-light-skin-tone:' => '🧑🏼‍❤️‍💋‍🧑🏻', + ':kiss-person-person-medium-light-skin-tone-medium-dark-skin-tone:' => '🧑🏼‍❤️‍💋‍🧑🏾', + ':kiss-person-person-medium-light-skin-tone-medium-skin-tone:' => '🧑🏼‍❤️‍💋‍🧑🏽', + ':kiss-person-person-medium-skin-tone-dark-skin-tone:' => '🧑🏽‍❤️‍💋‍🧑🏿', + ':kiss-person-person-medium-skin-tone-light-skin-tone:' => '🧑🏽‍❤️‍💋‍🧑🏻', + ':kiss-person-person-medium-skin-tone-medium-dark-skin-tone:' => '🧑🏽‍❤️‍💋‍🧑🏾', + ':kiss-person-person-medium-skin-tone-medium-light-skin-tone:' => '🧑🏽‍❤️‍💋‍🧑🏼', + ':kiss-woman-man-dark-skin-tone:' => '👩🏿‍❤️‍💋‍👨🏿', + ':kiss-woman-man-dark-skin-tone-light-skin-tone:' => '👩🏿‍❤️‍💋‍👨🏻', + ':kiss-woman-man-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍❤️‍💋‍👨🏾', + ':kiss-woman-man-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍❤️‍💋‍👨🏼', + ':kiss-woman-man-dark-skin-tone-medium-skin-tone:' => '👩🏿‍❤️‍💋‍👨🏽', + ':kiss-woman-man-light-skin-tone:' => '👩🏻‍❤️‍💋‍👨🏻', + ':kiss-woman-man-light-skin-tone-dark-skin-tone:' => '👩🏻‍❤️‍💋‍👨🏿', + ':kiss-woman-man-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍❤️‍💋‍👨🏾', + ':kiss-woman-man-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍❤️‍💋‍👨🏼', + ':kiss-woman-man-light-skin-tone-medium-skin-tone:' => '👩🏻‍❤️‍💋‍👨🏽', + ':kiss-woman-man-medium-dark-skin-tone:' => '👩🏾‍❤️‍💋‍👨🏾', + ':kiss-woman-man-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍❤️‍💋‍👨🏿', + ':kiss-woman-man-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍❤️‍💋‍👨🏻', + ':kiss-woman-man-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍❤️‍💋‍👨🏼', + ':kiss-woman-man-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍❤️‍💋‍👨🏽', + ':kiss-woman-man-medium-light-skin-tone:' => '👩🏼‍❤️‍💋‍👨🏼', + ':kiss-woman-man-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍❤️‍💋‍👨🏿', + ':kiss-woman-man-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍❤️‍💋‍👨🏻', + ':kiss-woman-man-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍❤️‍💋‍👨🏾', + ':kiss-woman-man-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍❤️‍💋‍👨🏽', + ':kiss-woman-man-medium-skin-tone:' => '👩🏽‍❤️‍💋‍👨🏽', + ':kiss-woman-man-medium-skin-tone-dark-skin-tone:' => '👩🏽‍❤️‍💋‍👨🏿', + ':kiss-woman-man-medium-skin-tone-light-skin-tone:' => '👩🏽‍❤️‍💋‍👨🏻', + ':kiss-woman-man-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍❤️‍💋‍👨🏾', + ':kiss-woman-man-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍❤️‍💋‍👨🏼', + ':kiss-woman-woman-dark-skin-tone:' => '👩🏿‍❤️‍💋‍👩🏿', + ':kiss-woman-woman-dark-skin-tone-light-skin-tone:' => '👩🏿‍❤️‍💋‍👩🏻', + ':kiss-woman-woman-dark-skin-tone-medium-dark-skin-tone:' => '👩🏿‍❤️‍💋‍👩🏾', + ':kiss-woman-woman-dark-skin-tone-medium-light-skin-tone:' => '👩🏿‍❤️‍💋‍👩🏼', + ':kiss-woman-woman-dark-skin-tone-medium-skin-tone:' => '👩🏿‍❤️‍💋‍👩🏽', + ':kiss-woman-woman-light-skin-tone:' => '👩🏻‍❤️‍💋‍👩🏻', + ':kiss-woman-woman-light-skin-tone-dark-skin-tone:' => '👩🏻‍❤️‍💋‍👩🏿', + ':kiss-woman-woman-light-skin-tone-medium-dark-skin-tone:' => '👩🏻‍❤️‍💋‍👩🏾', + ':kiss-woman-woman-light-skin-tone-medium-light-skin-tone:' => '👩🏻‍❤️‍💋‍👩🏼', + ':kiss-woman-woman-light-skin-tone-medium-skin-tone:' => '👩🏻‍❤️‍💋‍👩🏽', + ':kiss-woman-woman-medium-dark-skin-tone:' => '👩🏾‍❤️‍💋‍👩🏾', + ':kiss-woman-woman-medium-dark-skin-tone-dark-skin-tone:' => '👩🏾‍❤️‍💋‍👩🏿', + ':kiss-woman-woman-medium-dark-skin-tone-light-skin-tone:' => '👩🏾‍❤️‍💋‍👩🏻', + ':kiss-woman-woman-medium-dark-skin-tone-medium-light-skin-tone:' => '👩🏾‍❤️‍💋‍👩🏼', + ':kiss-woman-woman-medium-dark-skin-tone-medium-skin-tone:' => '👩🏾‍❤️‍💋‍👩🏽', + ':kiss-woman-woman-medium-light-skin-tone:' => '👩🏼‍❤️‍💋‍👩🏼', + ':kiss-woman-woman-medium-light-skin-tone-dark-skin-tone:' => '👩🏼‍❤️‍💋‍👩🏿', + ':kiss-woman-woman-medium-light-skin-tone-light-skin-tone:' => '👩🏼‍❤️‍💋‍👩🏻', + ':kiss-woman-woman-medium-light-skin-tone-medium-dark-skin-tone:' => '👩🏼‍❤️‍💋‍👩🏾', + ':kiss-woman-woman-medium-light-skin-tone-medium-skin-tone:' => '👩🏼‍❤️‍💋‍👩🏽', + ':kiss-woman-woman-medium-skin-tone:' => '👩🏽‍❤️‍💋‍👩🏽', + ':kiss-woman-woman-medium-skin-tone-dark-skin-tone:' => '👩🏽‍❤️‍💋‍👩🏿', + ':kiss-woman-woman-medium-skin-tone-light-skin-tone:' => '👩🏽‍❤️‍💋‍👩🏻', + ':kiss-woman-woman-medium-skin-tone-medium-dark-skin-tone:' => '👩🏽‍❤️‍💋‍👩🏾', + ':kiss-woman-woman-medium-skin-tone-medium-light-skin-tone:' => '👩🏽‍❤️‍💋‍👩🏼', ]; diff --git a/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php b/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php index 0bdbf51ed36d5..1dacfe9917742 100644 --- a/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php +++ b/src/Symfony/Component/Emoji/Tests/EmojiTransliteratorTest.php @@ -206,6 +206,6 @@ public function testGetErrorMessageWithUninitializedTransliterator() { $transliterator = EmojiTransliterator::create('emoji-en'); - $this->assertFalse($transliterator->getErrorMessage()); + $this->assertSame('', $transliterator->getErrorMessage()); } } diff --git a/src/Symfony/Component/ErrorHandler/DebugClassLoader.php b/src/Symfony/Component/ErrorHandler/DebugClassLoader.php index b4709ad47f068..3a2ef4fb7d525 100644 --- a/src/Symfony/Component/ErrorHandler/DebugClassLoader.php +++ b/src/Symfony/Component/ErrorHandler/DebugClassLoader.php @@ -18,8 +18,10 @@ use Phake\IMock; use PHPUnit\Framework\MockObject\Matcher\StatelessInvocation; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Stub; use Prophecy\Prophecy\ProphecySubjectInterface; use ProxyManager\Proxy\ProxyInterface; +use Symfony\Component\DependencyInjection\Argument\LazyClosure; use Symfony\Component\ErrorHandler\Internal\TentativeTypes; use Symfony\Component\VarExporter\LazyObjectInterface; @@ -256,6 +258,7 @@ public static function checkClasses(): bool for (; $i < \count($symbols); ++$i) { if (!is_subclass_of($symbols[$i], MockObject::class) + && !is_subclass_of($symbols[$i], Stub::class) && !is_subclass_of($symbols[$i], ProphecySubjectInterface::class) && !is_subclass_of($symbols[$i], Proxy::class) && !is_subclass_of($symbols[$i], ProxyInterface::class) @@ -263,6 +266,7 @@ public static function checkClasses(): bool && !is_subclass_of($symbols[$i], LegacyProxy::class) && !is_subclass_of($symbols[$i], MockInterface::class) && !is_subclass_of($symbols[$i], IMock::class) + && !(is_subclass_of($symbols[$i], LazyClosure::class) && str_contains($symbols[$i], "@anonymous\0")) ) { $loader->checkClass($symbols[$i]); } diff --git a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php index d0d1246a1ddbd..7bd9a083e53a4 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php +++ b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php @@ -233,6 +233,10 @@ private function formatFile(string $file, int $line, ?string $text = null): stri $text .= ' at line '.$line; } + if (!file_exists($file)) { + return $text; + } + $link = $this->fileLinkFormat->format($file, $line); return \sprintf('%s', $this->escape($link), $text); diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css index b40c58db7c87f..6fbe7c0267152 100644 --- a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css +++ b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css @@ -57,7 +57,7 @@ --page-background: #36393e; --color-text: #e0e0e0; --color-muted: #777; - --color-error: #d43934; + --color-error: #f76864; --tab-background: #404040; --tab-border-color: #737373; --tab-active-border-color: #171717; @@ -80,7 +80,7 @@ --metric-unit-color: #999; --metric-label-background: #777; --metric-label-color: #e0e0e0; - --trace-selected-background: #71663acc; + --trace-selected-background: #5d5227cc; --table-border: #444; --table-background: #333; --table-header: #555; @@ -92,7 +92,7 @@ --background-error: #b0413e; --highlight-comment: #dedede; --highlight-default: var(--base-6); - --highlight-keyword: #ff413c; + --highlight-keyword: #de8986; --highlight-string: #70a6fd; --base-0: #2e3136; --base-1: #444; diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js index 22ce675dfb7d2..89c0083348afb 100644 --- a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js +++ b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js @@ -145,19 +145,17 @@ } addEventListener(toggles[i], 'click', function(e) { - e.preventDefault(); + var toggle = e.currentTarget; - if ('' !== window.getSelection().toString()) { - /* Don't do anything on text selection */ + if (e.target.closest('a, span[data-clipboard-text], .sf-toggle') !== toggle) { return; } - var toggle = e.target || e.srcElement; + e.preventDefault(); - /* needed because when the toggle contains HTML contents, user can click */ - /* on any of those elements instead of their parent '.sf-toggle' element */ - while (!hasClass(toggle, 'sf-toggle')) { - toggle = toggle.parentNode; + if ('' !== window.getSelection().toString()) { + /* Don't do anything on text selection */ + return; } var element = document.querySelector(toggle.getAttribute('data-toggle-selector')); @@ -182,22 +180,6 @@ toggle.innerHTML = currentContent !== altContent ? altContent : originalContent; }); - /* Prevents from disallowing clicks on links inside toggles */ - var toggleLinks = toggles[i].querySelectorAll('a'); - for (var j = 0; j < toggleLinks.length; j++) { - addEventListener(toggleLinks[j], 'click', function(e) { - e.stopPropagation(); - }); - } - - /* Prevents from disallowing clicks on "copy to clipboard" elements inside toggles */ - var copyToClipboardElements = toggles[i].querySelectorAll('span[data-clipboard-text]'); - for (var k = 0; k < copyToClipboardElements.length; k++) { - addEventListener(copyToClipboardElements[k], 'click', function(e) { - e.stopPropagation(); - }); - } - toggles[i].setAttribute('data-processed', 'true'); } })(); diff --git a/src/Symfony/Component/ErrorHandler/Tests/phpt/fatal_with_nested_handlers.phpt b/src/Symfony/Component/ErrorHandler/Tests/phpt/fatal_with_nested_handlers.phpt index cfb10d03dafdd..80a7645770a62 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/phpt/fatal_with_nested_handlers.phpt +++ b/src/Symfony/Component/ErrorHandler/Tests/phpt/fatal_with_nested_handlers.phpt @@ -24,7 +24,7 @@ var_dump([ $eHandler[0]->setExceptionHandler('print_r'); if (true) { - class Broken implements \JsonSerializable + class Broken implements \Iterator { } } @@ -37,17 +37,17 @@ array(1) { } object(Symfony\Component\ErrorHandler\Error\FatalError)#%d (%d) { ["message":protected]=> - string(186) "Error: Class Symfony\Component\ErrorHandler\Broken contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (JsonSerializable::jsonSerialize)" + string(209) "Error: Class Symfony\Component\ErrorHandler\Broken contains 5 abstract methods and must therefore be declared abstract or implement the remaining methods (Iterator::current, Iterator::next, Iterator::key, ...)" %a ["error":"Symfony\Component\ErrorHandler\Error\FatalError":private]=> - array(4) { + array(%d) { ["type"]=> int(1) ["message"]=> - string(179) "Class Symfony\Component\ErrorHandler\Broken contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (JsonSerializable::jsonSerialize)" + string(202) "Class Symfony\Component\ErrorHandler\Broken contains 5 abstract methods and must therefore be declared abstract or implement the remaining methods (Iterator::current, Iterator::next, Iterator::key, ...)" ["file"]=> string(%d) "%s" ["line"]=> - int(%d) + int(%d)%A } } diff --git a/src/Symfony/Component/Finder/Comparator/DateComparator.php b/src/Symfony/Component/Finder/Comparator/DateComparator.php index f3538aaea9566..bcf93cfb6a523 100644 --- a/src/Symfony/Component/Finder/Comparator/DateComparator.php +++ b/src/Symfony/Component/Finder/Comparator/DateComparator.php @@ -36,7 +36,7 @@ public function __construct(string $test) throw new \InvalidArgumentException(\sprintf('"%s" is not a valid date.', $matches[2])); } - $operator = $matches[1] ?? '=='; + $operator = $matches[1] ?: '=='; if ('since' === $operator || 'after' === $operator) { $operator = '>'; } diff --git a/src/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php b/src/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php index 47bcc4838bd26..e50b713062638 100644 --- a/src/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php +++ b/src/Symfony/Component/Finder/Tests/Comparator/DateComparatorTest.php @@ -59,6 +59,7 @@ public static function getTestData() ['after 2005-10-10', [strtotime('2005-10-15')], [strtotime('2005-10-09')]], ['since 2005-10-10', [strtotime('2005-10-15')], [strtotime('2005-10-09')]], ['!= 2005-10-10', [strtotime('2005-10-11')], [strtotime('2005-10-10')]], + ['2005-10-10', [strtotime('2005-10-10')], [strtotime('2005-10-11')]], ]; } } diff --git a/src/Symfony/Component/Form/DependencyInjection/FormPass.php b/src/Symfony/Component/Form/DependencyInjection/FormPass.php index 1d2b2a87e5c42..bec1782d40995 100644 --- a/src/Symfony/Component/Form/DependencyInjection/FormPass.php +++ b/src/Symfony/Component/Form/DependencyInjection/FormPass.php @@ -47,6 +47,7 @@ private function processFormTypes(ContainerBuilder $container): Reference // Get service locator argument $servicesMap = []; $namespaces = ['Symfony\Component\Form\Extension\Core\Type' => true]; + $csrfTokenIds = []; // Builds an array with fully-qualified type class names as keys and service IDs as values foreach ($container->findTaggedServiceIds('form.type', true) as $serviceId => $tag) { @@ -54,6 +55,10 @@ private function processFormTypes(ContainerBuilder $container): Reference $serviceDefinition = $container->getDefinition($serviceId); $servicesMap[$formType = $serviceDefinition->getClass()] = new Reference($serviceId); $namespaces[substr($formType, 0, strrpos($formType, '\\'))] = true; + + if (isset($tag[0]['csrf_token_id'])) { + $csrfTokenIds[$formType] = $tag[0]['csrf_token_id']; + } } if ($container->hasDefinition('console.command.form_debug')) { @@ -62,6 +67,14 @@ private function processFormTypes(ContainerBuilder $container): Reference $commandDefinition->setArgument(2, array_keys($servicesMap)); } + if ($csrfTokenIds && $container->hasDefinition('form.type_extension.csrf')) { + $csrfExtension = $container->getDefinition('form.type_extension.csrf'); + + if (8 <= \count($csrfExtension->getArguments())) { + $csrfExtension->replaceArgument(7, $csrfTokenIds); + } + } + return ServiceLocatorTagPass::register($container, $servicesMap); } diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php index b03f8da4444fe..496c48bc12c9a 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformer.php @@ -39,14 +39,14 @@ public function __construct( /** * Transforms a normalized format into a localized money string. * - * @param int|float|null $value Normalized number + * @param int|float|string|null $value Normalized number * * @throws TransformationFailedException if the given value is not numeric or * if the value cannot be transformed */ public function transform(mixed $value): string { - if (null !== $value && 1 !== $this->divisor) { + if (null !== $value && '' !== $value && 1 !== $this->divisor) { if (!is_numeric($value)) { throw new TransformationFailedException('Expected a numeric.'); } diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php index 3020dd1483c28..ffcbc1feee6d7 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/NumberToLocalizedStringTransformer.php @@ -41,14 +41,14 @@ public function __construct( /** * Transforms a number type into localized number. * - * @param int|float|null $value Number value + * @param int|float|string|null $value Number value * * @throws TransformationFailedException if the given value is not numeric * or if the value cannot be transformed */ public function transform(mixed $value): string { - if (null === $value) { + if (null === $value || '' === $value) { return ''; } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php index 35a3175924ed4..fc083ee40d516 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php @@ -275,6 +275,8 @@ public function buildView(FormView $view, FormInterface $form, array $options): public function finishView(FormView $view, FormInterface $form, array $options): void { + $view->vars['duplicate_preferred_choices'] = $options['duplicate_preferred_choices']; + if ($options['expanded']) { // Radio buttons should have the same name as the parent $childName = $view->vars['full_name']; diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index e4aee6e8dee8e..36b430e144b58 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -313,7 +313,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setAllowedTypes('months', 'array'); $resolver->setAllowedTypes('days', 'array'); $resolver->setAllowedTypes('input_format', 'string'); - $resolver->setAllowedTypes('calendar', ['null', \IntlCalendar::class]); + $resolver->setAllowedTypes('calendar', ['null', 'int', \IntlCalendar::class]); $resolver->setInfo('calendar', 'The calendar to use for formatting and parsing the date. The value should be an instance of \IntlCalendar. By default, the Gregorian calendar with the default locale is used.'); diff --git a/src/Symfony/Component/Form/Extension/Core/Type/WeekType.php b/src/Symfony/Component/Form/Extension/Core/Type/WeekType.php index aea4a6c564889..c4827604e5f0c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/WeekType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/WeekType.php @@ -39,7 +39,6 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } else { $yearOptions = $weekOptions = [ 'error_bubbling' => true, - 'empty_data' => '', ]; // when the form is compound the entries of the array are ignored in favor of children data // so we need to handle the cascade setting here diff --git a/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php b/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php index 10367ae5ffe65..a12b9a41ee292 100644 --- a/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php +++ b/src/Symfony/Component/Form/Extension/Csrf/Type/FormTypeCsrfExtension.php @@ -37,7 +37,7 @@ public function __construct( private ?string $translationDomain = null, private ?ServerParams $serverParams = null, private array $fieldAttr = [], - private ?string $defaultTokenId = null, + private string|array|null $defaultTokenId = null, ) { } @@ -50,11 +50,17 @@ public function buildForm(FormBuilderInterface $builder, array $options): void return; } + $csrfTokenId = $options['csrf_token_id'] + ?: $this->defaultTokenId[$builder->getType()->getInnerType()::class] + ?? $builder->getName() + ?: $builder->getType()->getInnerType()::class; + $builder->setAttribute('csrf_token_id', $csrfTokenId); + $builder ->addEventSubscriber(new CsrfValidationListener( $options['csrf_field_name'], $options['csrf_token_manager'], - $options['csrf_token_id'] ?: ($builder->getName() ?: $builder->getType()->getInnerType()::class), + $csrfTokenId, $options['csrf_message'], $this->translator, $this->translationDomain, @@ -70,13 +76,13 @@ public function finishView(FormView $view, FormInterface $form, array $options): { if ($options['csrf_protection'] && !$view->parent && $options['compound']) { $factory = $form->getConfig()->getFormFactory(); - $tokenId = $options['csrf_token_id'] ?: ($form->getName() ?: $form->getConfig()->getType()->getInnerType()::class); + $tokenId = $form->getConfig()->getAttribute('csrf_token_id'); $data = (string) $options['csrf_token_manager']->getToken($tokenId); $csrfForm = $factory->createNamed($options['csrf_field_name'], HiddenType::class, $data, [ 'block_prefix' => 'csrf_token', 'mapped' => false, - 'attr' => $this->fieldAttr + ['autocomplete' => 'off'], + 'attr' => $this->fieldAttr, ]); $view->children[$options['csrf_field_name']] = $csrfForm->createView($view); @@ -85,9 +91,11 @@ public function finishView(FormView $view, FormInterface $form, array $options): public function configureOptions(OptionsResolver $resolver): void { - if ($defaultTokenId = $this->defaultTokenId) { + if (\is_string($defaultTokenId = $this->defaultTokenId) && $defaultTokenId) { $defaultTokenManager = $this->defaultTokenManager; $defaultTokenId = static fn (Options $options) => $options['csrf_token_manager'] === $defaultTokenManager ? $defaultTokenId : null; + } else { + $defaultTokenId = null; } $resolver->setDefaults([ diff --git a/src/Symfony/Component/Form/Resources/translations/validators.es.xlf b/src/Symfony/Component/Form/Resources/translations/validators.es.xlf index 301e2b33f7ed3..a9989737c33eb 100644 --- a/src/Symfony/Component/Form/Resources/translations/validators.es.xlf +++ b/src/Symfony/Component/Form/Resources/translations/validators.es.xlf @@ -52,7 +52,7 @@ Please enter a valid date. - Por favor, ingrese una fecha valida. + Por favor, ingrese una fecha válida. Please select a valid file. diff --git a/src/Symfony/Component/Form/Resources/translations/validators.pt.xlf b/src/Symfony/Component/Form/Resources/translations/validators.pt.xlf index 755108f357f5a..673e79f420223 100644 --- a/src/Symfony/Component/Form/Resources/translations/validators.pt.xlf +++ b/src/Symfony/Component/Form/Resources/translations/validators.pt.xlf @@ -24,7 +24,7 @@ The selected choice is invalid. - A escolha seleccionada é inválida. + A escolha selecionada é inválida. The collection is invalid. diff --git a/src/Symfony/Component/Form/Tests/DependencyInjection/FormPassTest.php b/src/Symfony/Component/Form/Tests/DependencyInjection/FormPassTest.php index e9a7b50346032..f0ccd3f095fb0 100644 --- a/src/Symfony/Component/Form/Tests/DependencyInjection/FormPassTest.php +++ b/src/Symfony/Component/Form/Tests/DependencyInjection/FormPassTest.php @@ -21,6 +21,7 @@ use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\Command\DebugCommand; use Symfony\Component\Form\DependencyInjection\FormPass; +use Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension; use Symfony\Component\Form\FormRegistry; /** @@ -95,6 +96,25 @@ public function testAddTaggedTypesToDebugCommand() ); } + public function testAddTaggedTypesToCsrfTypeExtension() + { + $container = $this->createContainerBuilder(); + + $container->register('form.registry', FormRegistry::class); + $container->register('form.type_extension.csrf', FormTypeCsrfExtension::class) + ->setArguments([null, true, '_token', null, 'validator.translation_domain', null, [], null]) + ->setPublic(true); + + $container->setDefinition('form.extension', $this->createExtensionDefinition()); + $container->register('my.type1', __CLASS__.'_Type1')->addTag('form.type', ['csrf_token_id' => 'the_token_id']); + $container->register('my.type2', __CLASS__.'_Type2')->addTag('form.type'); + + $container->compile(); + + $csrfDefinition = $container->getDefinition('form.type_extension.csrf'); + $this->assertSame([__CLASS__.'_Type1' => 'the_token_id'], $csrfDefinition->getArgument(7)); + } + /** * @dataProvider addTaggedTypeExtensionsDataProvider */ diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php index 2be154bc814dd..b9906c236ab3c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php @@ -16,6 +16,7 @@ use Symfony\Component\Form\Extension\Core\DataTransformer\BaseDateTimeTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer; use Symfony\Component\Form\Tests\Extension\Core\DataTransformer\Traits\DateTimeEqualsTrait; +use Symfony\Component\Intl\Intl; use Symfony\Component\Intl\Util\IntlTestHelper; class DateTimeToLocalizedStringTransformerTest extends BaseDateTimeTransformerTestCase @@ -235,6 +236,10 @@ public function testReverseTransformFullTime() public function testReverseTransformFromDifferentLocale() { + if (version_compare(Intl::getIcuVersion(), '71.1', '>')) { + $this->markTestSkipped('ICU version 71.1 or lower is required.'); + } + \Locale::setDefault('en_US'); $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC'); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php index e5733ad96abb5..689c6f0d4da32 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/MoneyToLocalizedStringTransformerTest.php @@ -54,6 +54,13 @@ public function testTransformExpectsNumeric() $transformer->transform('abcd'); } + public function testTransformEmptyString() + { + $transformer = new MoneyToLocalizedStringTransformer(null, null, null, 100); + + $this->assertSame('', $transformer->transform('')); + } + public function testTransformEmpty() { $transformer = new MoneyToLocalizedStringTransformer(); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php index 37448db51030a..c0344b9f232ea 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/NumberToLocalizedStringTransformerTest.php @@ -49,6 +49,7 @@ public static function provideTransformations() { return [ [null, '', 'de_AT'], + ['', '', 'de_AT'], [1, '1', 'de_AT'], [1.5, '1,5', 'de_AT'], [1234.5, '1234,5', 'de_AT'], diff --git a/src/Symfony/Component/Form/Tests/Fixtures/TestExtension.php b/src/Symfony/Component/Form/Tests/Fixtures/TestExtension.php index 44725a69c71a5..2704ee5303ad2 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/TestExtension.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/TestExtension.php @@ -34,7 +34,7 @@ public function addType(FormTypeInterface $type) public function getType($name): FormTypeInterface { - return $this->types[$name] ?? null; + return $this->types[$name]; } public function hasType($name): bool diff --git a/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-attribute-allow-list.json b/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-attribute-allow-list.json new file mode 100644 index 0000000000000..1b7bee611fe4a --- /dev/null +++ b/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-attribute-allow-list.json @@ -0,0 +1,213 @@ +[ + "abbr", + "accept", + "accept-charset", + "accesskey", + "action", + "align", + "alink", + "allow", + "allowfu F438 llscreen", + "allowpaymentrequest", + "alt", + "anchor", + "archive", + "as", + "async", + "autocapitalize", + "autocomplete", + "autocorrect", + "autofocus", + "autopictureinpicture", + "autoplay", + "axis", + "background", + "behavior", + "bgcolor", + "border", + "bordercolor", + "capture", + "cellpadding", + "cellspacing", + "challenge", + "char", + "charoff", + "charset", + "checked", + "cite", + "class", + "classid", + "clear", + "code", + "codebase", + "codetype", + "color", + "cols", + "colspan", + "compact", + "content", + "contenteditable", + "controls", + "controlslist", + "conversiondestination", + "coords", + "crossorigin", + "csp", + "data", + "datetime", + "declare", + "decoding", + "default", + "defer", + "dir", + "direction", + "dirname", + "disabled", + "disablepictureinpicture", + "disableremoteplayback", + "disallowdocumentaccess", + "download", + "draggable", + "elementtiming", + "enctype", + "end", + "enterkeyhint", + "event", + "exportparts", + "face", + "for", + "form", + "formaction", + "formenctype", + "formmethod", + "formnovalidate", + "formtarget", + "frame", + "frameborder", + "headers", + "height", + "hidden", + "high", + "href", + "hreflang", + "hreftranslate", + "hspace", + "http-equiv", + "id", + "imagesizes", + "imagesrcset", + "importance", + "impressiondata", + "impressionexpiry", + "incremental", + "inert", + "inputmode", + "integrity", + "invisible", + "is", + "ismap", + "keytype", + "kind", + "label", + "lang", + "language", + "latencyhint", + "leftmargin", + "link", + "list", + "loading", + "longdesc", + "loop", + "low", + "lowsrc", + "manifest", + "marginheight", + "marginwidth", + "max", + "maxlength", + "mayscript", + "media", + "method", + "min", + "minlength", + "multiple", + "muted", + "name", + "nohref", + "nomodule", + "nonce", + "noresize", + "noshade", + "novalidate", + "nowrap", + "object", + "open", + "optimum", + "part", + "pattern", + "ping", + "placeholder", + "playsinline", + "policy", + "poster", + "preload", + "pseudo", + "readonly", + "referrerpolicy", + "rel", + "reportingorigin", + "required", + "resources", + "rev", + "reversed", + "role", + "rows", + "rowspan", + "rules", + "sandbox", + "scheme", + "scope", + "scopes", + "scrollamount", + "scrolldelay", + "scrolling", + "select", + "selected", + "shadowroot", + "shadowrootdelegatesfocus", + "shape", + "size", + "sizes", + "slot", + "span", + "spellcheck", + "src", + "srcdoc", + "srclang", + "srcset", + "standby", + "start", + "step", + "style", + "summary", + "tabindex", + "target", + "text", + "title", + "topmargin", + "translate", + "truespeed", + "trusttoken", + "type", + "usemap", + "valign", + "value", + "valuetype", + "version", + "virtualkeyboardpolicy", + "vlink", + "vspace", + "webkitdirectory", + "width", + "wrap" +] diff --git a/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-element-allow-list.json b/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-element-allow-list.json new file mode 100644 index 0000000000000..cf470cd3f8507 --- /dev/null +++ b/src/Symfony/Component/HtmlSanitizer/Tests/Fixtures/baseline-element-allow-list.json @@ -0,0 +1,130 @@ +[ + "a", + "abbr", + "acronym", + "address", + "area", + "article", + "aside", + "audio", + "b", + "basefont", + "bdi", + "bdo", + "bgsound", + "big", + "blockquote", + "body", + "br", + "button", + "canvas", + "caption", + "center", + "cite", + "code", + "col", + "colgroup", + "command", + "data", + "datalist", + "dd", + "del", + "details", + "dfn", + "dialog", + "dir", + "div", + "dl", + "dt", + "em", + "fieldset", + "figcaption", + "figure", + "font", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "head", + "header", + "hgroup", + "hr", + "html", + "i", + "image", + "img", + "input", + "ins", + "kbd", + "keygen", + "label", + "layer", + "legend", + "li", + "link", + "listing", + "main", + "map", + "mark", + "marquee", + "menu", + "meta", + "meter", + "nav", + "nobr", + "ol", + "optgroup", + "option", + "output", + "p", + "picture", + "plaintext", + "popup", + "portal", + "pre", + "progress", + "q", + "rb", + "rp", + "rt", + "rtc", + "ruby", + "s", + "samp", + "section", + "select", + "selectmenu", + "slot", + "small", + "source", + "span", + "strike", + "strong", + "style", + "sub", + "summary", + "sup", + "table", + "tbody", + "td", + "template", + "textarea", + "tfoot", + "th", + "thead", + "time", + "title", + "tr", + "track", + "tt", + "u", + "ul", + "var", + "video", + "wbr", + "xmp" +] diff --git a/src/Symfony/Component/HtmlSanitizer/Tests/Reference/W3CReferenceTest.php b/src/Symfony/Component/HtmlSanitizer/Tests/Reference/W3CReferenceTest.php index 6cb67c2b0849b..51a4a7d9a21c0 100644 --- a/src/Symfony/Component/HtmlSanitizer/Tests/Reference/W3CReferenceTest.php +++ b/src/Symfony/Component/HtmlSanitizer/Tests/Reference/W3CReferenceTest.php @@ -16,39 +16,24 @@ /** * Check that the W3CReference class is up to date with the standard resources. - * - * @see https://github.com/WICG/sanitizer-api/blob/main/resources */ class W3CReferenceTest extends TestCase { - private const STANDARD_RESOURCES = [ - 'elements' => 'https://raw.githubusercontent.com/WICG/sanitizer-api/main/resources/baseline-element-allow-list.json', - 'attributes' => 'https://raw.githubusercontent.com/WICG/sanitizer-api/main/resources/baseline-attribute-allow-list.json', - ]; - public function testElements() { - if (!\in_array('https', stream_get_wrappers(), true)) { - $this->markTestSkipped('"https" stream wrapper is not enabled.'); - } - $referenceElements = array_values(array_merge(array_keys(W3CReference::HEAD_ELEMENTS), array_keys(W3CReference::BODY_ELEMENTS))); sort($referenceElements); $this->assertSame( - $this->getResourceData(self::STANDARD_RESOURCES['elements']), + $this->getResourceData(__DIR__.'/../Fixtures/baseline-element-allow-list.json'), $referenceElements ); } public function testAttributes() { - if (!\in_array('https', stream_get_wrappers(), true)) { - $this->markTestSkipped('"https" stream wrapper is not enabled.'); - } - $this->assertSame( - $this->getResourceData(self::STANDARD_RESOURCES['attributes']), + $this->getResourceData(__DIR__.'/../Fixtures/baseline-attribute-allow-list.json'), array_keys(W3CReference::ATTRIBUTES) ); } @@ -56,7 +41,7 @@ public function testAttributes() private function getResourceData(string $resource): array { return json_decode( - file_get_contents($resource, false, stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]])), + file_get_contents($resource), true, 512, \JSON_THROW_ON_ERROR diff --git a/src/Symfony/Component/HtmlSanitizer/Tests/TextSanitizer/UrlSanitizerTest.php b/src/Symfony/Component/HtmlSanitizer/Tests/TextSanitizer/UrlSanitizerTest.php index fe0e0d39cd9d9..391895024e456 100644 --- a/src/Symfony/Component/HtmlSanitizer/Tests/TextSanitizer/UrlSanitizerTest.php +++ b/src/Symfony/Component/HtmlSanitizer/Tests/TextSanitizer/UrlSanitizerTest.php @@ -274,6 +274,15 @@ public static function provideSanitize(): iterable 'expected' => null, ]; + yield [ + 'input' => 'https://trusted.com/link.php', + 'allowedSchemes' => ['http', 'https'], + 'allowedHosts' => ['subdomain.trusted.com', 'trusted.com'], + 'forceHttps' => false, + 'allowRelative' => false, + 'expected' => 'https://trusted.com/link.php', + ]; + // Allow relative yield [ 'input' => '/link.php', @@ -358,10 +367,10 @@ public static function provideParse(): iterable 'non-special://:@untrusted.com/x' => ['scheme' => 'non-special', 'host' => 'untrusted.com'], 'http:foo.com' => ['scheme' => 'http', 'host' => null], " :foo.com \n" => null, - ' foo.com ' => ['scheme' => null, 'host' => null], + ' foo.com ' => null, 'a: foo.com' => null, - 'http://f:21/ b ? d # e ' => ['scheme' => 'http', 'host' => 'f'], - 'lolscheme:x x#x x' => ['scheme' => 'lolscheme', 'host' => null], + 'http://f:21/ b ? d # e ' => null, + 'lolscheme:x x#x x' => null, 'http://f:/c' => ['scheme' => 'http', 'host' => 'f'], 'http://f:0/c' => ['scheme' => 'http', 'host' => 'f'], 'http://f:00000000000000/c' => ['scheme' => 'http', 'host' => 'f'], @@ -434,7 +443,7 @@ public static function provideParse(): iterable 'javascript:example.com/' => ['scheme' => 'javascript', 'host' => null], 'mailto:example.com/' => ['scheme' => 'mailto', 'host' => null], '/a/b/c' => ['scheme' => null, 'host' => null], - '/a/ /c' => ['scheme' => null, 'host' => null], + '/a/ /c' => null, '/a%2fc' => ['scheme' => null, 'host' => null], '/a/%2f/c' => ['scheme' => null, 'host' => null], '#β' => ['scheme' => null, 'host' => null], @@ -495,10 +504,10 @@ public static function provideParse(): iterable 'http://example.com/你好你好' => ['scheme' => 'http', 'host' => 'example.com'], 'http://example.com/‥/foo' => ['scheme' => 'http', 'host' => 'example.com'], "http://example.com/\u{feff}/foo" => ['scheme' => 'http', 'host' => 'example.com'], - "http://example.com\u{002f}\u{202e}\u{002f}\u{0066}\u{006f}\u{006f}\u{002f}\u{202d}\u{002f}\u{0062}\u{0061}\u{0072}\u{0027}\u{0020}" => ['scheme' => 'http', 'host' => 'example.com'], + "http://example.com\u{002f}\u{202e}\u{002f}\u{0066}\u{006f}\u{006f}\u{002f}\u{202d}\u{002f}\u{0062}\u{0061}\u{0072}\u{0027}\u{0020}" => null, 'http://www.google.com/foo?bar=baz#' => ['scheme' => 'http', 'host' => 'www.google.com'], - 'http://www.google.com/foo?bar=baz# »' => ['scheme' => 'http', 'host' => 'www.google.com'], - 'data:test# »' => ['scheme' => 'data', 'host' => null], + 'http://www.google.com/foo?bar=baz# »' => null, + 'data:test# »' => null, 'http://www.google.com' => ['scheme' => 'http', 'host' => 'www.google.com'], 'http://192.0x00A80001' => ['scheme' => 'http', 'host' => '192.0x00A80001'], 'http://www/foo%2Ehtml' => ['scheme' => 'http', 'host' => 'www'], @@ -559,8 +568,8 @@ public static function provideParse(): iterable 'http://你好你好' => ['scheme' => 'http', 'host' => '你好你好'], 'https://faß.ExAmPlE/' => ['scheme' => 'https', 'host' => 'faß.ExAmPlE'], 'sc://faß.ExAmPlE/' => ['scheme' => 'sc', 'host' => 'faß.ExAmPlE'], - 'http://%30%78%63%30%2e%30%32%35%30.01' => ['scheme' => 'http', 'host' => '%30%78%63%30%2e%30%32%35%30.01'], - 'http://%30%78%63%30%2e%30%32%35%30.01%2e' => ['scheme' => 'http', 'host' => '%30%78%63%30%2e%30%32%35%30.01%2e'], + 'http://%30%78%63%30%2e%30%32%35%30.01' => null, + 'http://%30%78%63%30%2e%30%32%35%30.01%2e' => null, 'http://0Xc0.0250.01' => ['scheme' => 'http', 'host' => '0Xc0.0250.01'], 'http://./' => ['scheme' => 'http', 'host' => '.'], 'http://../' => ['scheme' => 'http', 'host' => '..'], @@ -680,7 +689,7 @@ public static function provideParse(): iterable 'urn:ietf:rfc:2648' => ['scheme' => 'urn', 'host' => null], 'tag:joe@example.org,2001:foo/bar' => ['scheme' => 'tag', 'host' => null], 'non-special://%E2%80%A0/' => ['scheme' => 'non-special', 'host' => '%E2%80%A0'], - 'non-special://H%4fSt/path' => ['scheme' => 'non-special', 'host' => 'H%4fSt'], + 'non-special://H%4fSt/path' => null, 'non-special://[1:2:0:0:5:0:0:0]/' => ['scheme' => 'non-special', 'host' => '[1:2:0:0:5:0:0:0]'], 'non-special://[1:2:0:0:0:0:0:3]/' => ['scheme' => 'non-special', 'host' => '[1:2:0:0:0:0:0:3]'], 'non-special://[1:2::3]:80/' => ['scheme' => 'non-special', 'host' => '[1:2::3]'], @@ -706,11 +715,11 @@ public static function provideParse(): iterable 'test-a-colon-slash-slash-b.html' => ['scheme' => null, 'host' => null], 'http://example.org/test?a#bc' => ['scheme' => 'http', 'host' => 'example.org'], 'http:\\/\\/f:b\\/c' => ['scheme' => 'http', 'host' => null], - 'http:\\/\\/f: \\/c' => ['scheme' => 'http', 'host' => null], + 'http:\\/\\/f: \\/c' => null, 'http:\\/\\/f:fifty-two\\/c' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/f:999999\\/c' => ['scheme' => 'http', 'host' => null], 'non-special:\\/\\/f:999999\\/c' => ['scheme' => 'non-special', 'host' => null], - 'http:\\/\\/f: 21 \\/ b ? d # e ' => ['scheme' => 'http', 'host' => null], + 'http:\\/\\/f: 21 \\/ b ? d # e ' => null, 'http:\\/\\/[1::2]:3:4' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/2001::1' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/2001::1]' => ['scheme' => 'http', 'host' => null], @@ -734,8 +743,8 @@ public static function provideParse(): iterable 'http:@:www.example.com' => ['scheme' => 'http', 'host' => null], 'http:\\/@:www.example.com' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/@:www.example.com' => ['scheme' => 'http', 'host' => null], - 'http:\\/\\/example example.com' => ['scheme' => 'http', 'host' => null], - 'http:\\/\\/Goo%20 goo%7C|.com' => ['scheme' => 'http', 'host' => null], + 'http:\\/\\/example example.com' => null, + 'http:\\/\\/Goo%20 goo%7C|.com' => null, 'http:\\/\\/[]' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/[:]' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/GOO\\u00a0\\u3000goo.com' => ['scheme' => 'http', 'host' => null], @@ -752,8 +761,8 @@ public static function provideParse(): iterable 'http:\\/\\/hello%00' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/192.168.0.257' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/%3g%78%63%30%2e%30%32%35%30%2E.01' => ['scheme' => 'http', 'host' => null], - 'http:\\/\\/192.168.0.1 hello' => ['scheme' => 'http', 'host' => null], - 'https:\\/\\/x x:12' => ['scheme' => 'https', 'host' => null], + 'http:\\/\\/192.168.0.1 hello' => null, + 'https:\\/\\/x x:12' => null, 'http:\\/\\/[www.google.com]\\/' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/[google.com]' => ['scheme' => 'http', 'host' => null], 'http:\\/\\/[::1.2.3.4x]' => ['scheme' => 'http', 'host' => null], @@ -763,7 +772,7 @@ public static function provideParse(): iterable '..\\/i' => ['scheme' => null, 'host' => null], '\\/i' => ['scheme' => null, 'host' => null], 'sc:\\/\\/\\u0000\\/' => ['scheme' => 'sc', 'host' => null], - 'sc:\\/\\/ \\/' => ['scheme' => 'sc', 'host' => null], + 'sc:\\/\\/ \\/' => null, 'sc:\\/\\/@\\/' => ['scheme' => 'sc', 'host' => null], 'sc:\\/\\/te@s:t@\\/' => ['scheme' => 'sc', 'host' => null], 'sc:\\/\\/:\\/' => ['scheme' => 'sc', 'host' => null], diff --git a/src/Symfony/Component/HtmlSanitizer/TextSanitizer/UrlSanitizer.php b/src/Symfony/Component/HtmlSanitizer/TextSanitizer/UrlSanitizer.php index a806981de770f..9920ecd88da4a 100644 --- a/src/Symfony/Component/HtmlSanitizer/TextSanitizer/UrlSanitizer.php +++ b/src/Symfony/Component/HtmlSanitizer/TextSanitizer/UrlSanitizer.php @@ -94,7 +94,17 @@ public static function parse(string $url): ?array } try { - return UriString::parse($url); + $parsedUrl = UriString::parse($url); + + if (preg_match('/\s/', $url)) { + return null; + } + + if (isset($parsedUrl['host']) && self::decodeUnreservedCharacters($parsedUrl['host']) !== $parsedUrl['host']) { + return null; + } + + return $parsedUrl; } catch (SyntaxError) { return null; } @@ -126,11 +136,23 @@ private static function matchAllowedHostParts(array $uriParts, array $trustedPar { // Check each chunk of the domain is valid foreach ($trustedParts as $key => $trustedPart) { - if ($uriParts[$key] !== $trustedPart) { + if (!array_key_exists($key, $uriParts) || $uriParts[$key] !== $trustedPart) { return false; } } return true; } + + /** + * Implementation borrowed from League\Uri\Encoder::decodeUnreservedCharacters(). + */ + private static function decodeUnreservedCharacters(string $host): string + { + return preg_replace_callback( + ',%(2[1-9A-Fa-f]|[3-7][0-9A-Fa-f]|61|62|64|65|66|7[AB]|5F),', + static fn (array $matches): string => rawurldecode($matches[0]), + $host + ); + } } diff --git a/src/Symfony/Component/HttpClient/CurlHttpClient.php b/src/Symfony/Component/HttpClient/CurlHttpClient.php index 88feb64caef81..244d8803541fa 100644 --- a/src/Symfony/Component/HttpClient/CurlHttpClient.php +++ b/src/Symfony/Component/HttpClient/CurlHttpClient.php @@ -197,13 +197,12 @@ public function request(string $method, string $url, array $options = []): Respo $curlopts[\CURLOPT_RESOLVE] = $resolve; } + $curlopts[\CURLOPT_CUSTOMREQUEST] = $method; if ('POST' === $method) { // Use CURLOPT_POST to have browser-like POST-to-GET redirects for 301, 302 and 303 $curlopts[\CURLOPT_POST] = true; } elseif ('HEAD' === $method) { $curlopts[\CURLOPT_NOBODY] = true; - } else { - $curlopts[\CURLOPT_CUSTOMREQUEST] = $method; } if ('\\' !== \DIRECTORY_SEPARATOR && $options['timeout'] < 1) { @@ -237,8 +236,12 @@ public function request(string $method, string $url, array $options = []): Respo } if (!\is_string($body)) { + if (isset($options['auth_ntlm'])) { + $curlopts[\CURLOPT_FORBID_REUSE] = true; // Reusing NTLM connections requires seeking capability, which only string bodies support + } + if (\is_resource($body)) { - $curlopts[\CURLOPT_INFILE] = $body; + $curlopts[\CURLOPT_READDATA] = $body; } else { $curlopts[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) { static $eof = false; @@ -317,6 +320,9 @@ public function request(string $method, string $url, array $options = []): Respo } foreach ($curlopts as $opt => $value) { + if (\PHP_INT_SIZE === 8 && \defined('CURLOPT_INFILESIZE_LARGE') && \CURLOPT_INFILESIZE === $opt && $value >= 1 << 31) { + $opt = \CURLOPT_INFILESIZE_LARGE; + } if (null !== $value && !curl_setopt($ch, $opt, $value) && \CURLOPT_CERTINFO !== $opt && (!\defined('CURLOPT_HEADEROPT') || \CURLOPT_HEADEROPT !== $opt)) { $constantName = $this->findConstantName($opt); throw new TransportException(\sprintf('Curl option "%s" is not supported.', $constantName ?? $opt)); @@ -473,7 +479,7 @@ private function validateExtraCurlOptions(array $options): void \CURLOPT_RESOLVE => 'resolve', \CURLOPT_NOSIGNAL => 'timeout', \CURLOPT_HTTPHEADER => 'headers', - \CURLOPT_INFILE => 'body', + \CURLOPT_READDATA => 'body', \CURLOPT_READFUNCTION => 'body', \CURLOPT_INFILESIZE => 'body', \CURLOPT_POSTFIELDS => 'body', diff --git a/src/Symfony/Component/HttpClient/HttpClientTrait.php b/src/Symfony/Component/HttpClient/HttpClientTrait.php index 9709e0c68858e..07f257a7edb94 100644 --- a/src/Symfony/Component/HttpClient/HttpClientTrait.php +++ b/src/Symfony/Component/HttpClient/HttpClientTrait.php @@ -355,9 +355,11 @@ private static function normalizeBody($body, array &$normalizedHeaders = []) } }); - $body = http_build_query($body, '', '&'); + if ('' === $body = http_build_query($body, '', '&')) { + return ''; + } - if ('' === $body || !$streams && !str_contains($normalizedHeaders['content-type'][0] ?? '', 'multipart/form-data')) { + if (!$streams && !str_contains($normalizedHeaders['content-type'][0] ?? '', 'multipart/form-data')) { if (!str_contains($normalizedHeaders['content-type'][0] ?? '', 'application/x-www-form-urlencoded')) { $normalizedHeaders['content-type'] = ['Content-Type: application/x-www-form-urlencoded']; } diff --git a/src/Symfony/Component/HttpClient/HttplugClient.php b/src/Symfony/Component/HttpClient/HttplugClient.php index 3048b10bd0331..dad01dcc89c8e 100644 --- a/src/Symfony/Component/HttpClient/HttplugClient.php +++ b/src/Symfony/Component/HttpClient/HttplugClient.php @@ -224,19 +224,44 @@ private function sendPsr7Request(RequestInterface $request, ?bool $buffer = null { try { $body = $request->getBody(); + $headers = $request->getHeaders(); - if ($body->isSeekable()) { - $body->seek(0); + $size = $request->getHeader('content-length')[0] ?? -1; + if (0 > $size && 0 < $size = $body->getSize() ?? -1) { + $headers['Content-Length'] = [$size]; } - $headers = $request->getHeaders(); - if (!$request->hasHeader('content-length') && 0 <= $size = $body->getSize() ?? -1) { - $headers['Content-Length'] = [$size]; + if (0 === $size) { + $body = ''; + } elseif (0 < $size && $size < 1 << 21) { + if ($body->isSeekable()) { + try { + $body->seek(0); + } catch (\RuntimeException) { + // ignore + } + } + + $body = $body->getContents(); + } else { + $body = static function (int $size) use ($body) { + if ($body->isSeekable()) { + try { + $body->seek(0); + } catch (\RuntimeException) { + // ignore + } + } + + while (!$body->eof()) { + yield $body->read($size); + } + }; } $options = [ 'headers' => $headers, - 'body' => static fn (int $size) => $body->read($size), + 'body' => $body, 'buffer' => $buffer, ]; diff --git a/src/Symfony/Component/HttpClient/Internal/AmpClientStateV5.php b/src/Symfony/Component/HttpClient/Internal/AmpClientStateV5.php index 76b0c660681c9..f1ee284a456cb 100644 --- a/src/Symfony/Component/HttpClient/Internal/AmpClientStateV5.php +++ b/src/Symfony/Component/HttpClient/Internal/AmpClientStateV5.php @@ -28,6 +28,7 @@ use Amp\Socket\ClientTlsContext; use Amp\Socket\ConnectContext; use Amp\Socket\DnsSocketConnector; +use Amp\Socket\InternetAddress; use Amp\Socket\Socket; use Amp\Socket\SocketAddress; use Amp\Socket\SocketConnector; @@ -160,7 +161,7 @@ public function connect(SocketAddress|string $uri, ?ConnectContext $context = nu if ($options['proxy']) { $proxyUrl = parse_url($options['proxy']['url']); - $proxySocket = new SocketAddress($proxyUrl['host'], $proxyUrl['port']); + $proxySocket = new InternetAddress($proxyUrl['host'], $proxyUrl['port']); $proxyHeaders = $options['proxy']['auth'] ? ['Proxy-Authorization' => $options['proxy']['auth']] : []; if ('ssl' === $proxyUrl['scheme']) { diff --git a/src/Symfony/Component/HttpClient/Internal/AmpListenerV5.php b/src/Symfony/Component/HttpClient/Internal/AmpListenerV5.php index fe5d36e492747..92dcba836fa25 100644 --- a/src/Symfony/Component/HttpClient/Internal/AmpListenerV5.php +++ b/src/Symfony/Component/HttpClient/Internal/AmpListenerV5.php @@ -18,6 +18,7 @@ use Amp\Http\Client\NetworkInterceptor; use Amp\Http\Client\Request; use Amp\Http\Client\Response; +use Amp\Socket\InternetAddress; use Symfony\Component\HttpClient\Exception\TransportException; /** @@ -67,13 +68,17 @@ public function connectionAcquired(Request $request, Connection $connection, int public function requestHeaderStart(Request $request, Stream $stream): void { $host = $stream->getRemoteAddress()->toString(); + if ($stream->getRemoteAddress() instanceof InternetAddress) { + $host = $stream->getRemoteAddress()->getAddress(); + $this->info['primary_port'] = $stream->getRemoteAddress()->getPort(); + } + $this->info['primary_ip'] = $host; if (str_contains($host, ':')) { $host = '['.$host.']'; } - $this->info['primary_port'] = $stream->getRemoteAddress()->getPort(); $this->info['pretransfer_time'] = microtime(true) - $this->info['start_time']; $this->info['debug'] .= \sprintf("* Connected to %s (%s) port %d\n", $request->getUri()->getHost(), $host, $this->info['primary_port']); diff --git a/src/Symfony/Component/HttpClient/Internal/HttplugWaitLoop.php b/src/Symfony/Component/HttpClient/Internal/HttplugWaitLoop.php index aa172b89b160d..36c4efca660e0 100644 --- a/src/Symfony/Component/HttpClient/Internal/HttplugWaitLoop.php +++ b/src/Symfony/Component/HttpClient/Internal/HttplugWaitLoop.php @@ -140,7 +140,11 @@ public static function createPsr7Response(ResponseFactoryInterface $responseFact } if ($body->isSeekable()) { - $body->seek(0); + try { + $body->seek(0); + } catch (\RuntimeException) { + // ignore + } } return $psrResponse->withBody($body); diff --git a/src/Symfony/Component/HttpClient/NativeHttpClient.php b/src/Symfony/Component/HttpClient/NativeHttpClient.php index 1c37a7bec4a41..da01191d4a016 100644 --- a/src/Symfony/Component/HttpClient/NativeHttpClient.php +++ b/src/Symfony/Component/HttpClient/NativeHttpClient.php @@ -140,22 +140,13 @@ public function request(string $method, string $url, array $options = []): Respo if ($onProgress = $options['on_progress']) { $maxDuration = 0 < $options['max_duration'] ? $options['max_duration'] : \INF; - $multi = $this->multi; - $resolve = static function (string $host, ?string $ip = null) use ($multi): ?string { - if (null !== $ip) { - $multi->dnsCache[$host] = $ip; - } - - return $multi->dnsCache[$host] ?? null; - }; - $onProgress = static function (...$progress) use ($onProgress, &$info, $maxDuration, $resolve) { + $onProgress = static function (...$progress) use ($onProgress, &$info, $maxDuration) { if ($info['total_time'] >= $maxDuration) { throw new TransportException(\sprintf('Max duration was reached for "%s".', implode('', $info['url']))); } $progressInfo = $info; $progressInfo['url'] = implode('', $info['url']); - $progressInfo['resolve'] = $resolve; unset($progressInfo['size_body']); // Memoize the last progress to ease calling the callback periodically when no network transfer happens diff --git a/src/Symfony/Component/HttpClient/NoPrivateNetworkHttpClient.php b/src/Symfony/Component/HttpClient/NoPrivateNetworkHttpClient.php index 9209378b39cff..4fe93645b1b4c 100644 --- a/src/Symfony/Component/HttpClient/NoPrivateNetworkHttpClient.php +++ b/src/Symfony/Component/HttpClient/NoPrivateNetworkHttpClient.php @@ -13,85 +13,150 @@ use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; -use Symfony\Component\HttpClient\Exception\InvalidArgumentException; use Symfony\Component\HttpClient\Exception\TransportException; +use Symfony\Component\HttpClient\Response\AsyncContext; +use Symfony\Component\HttpClient\Response\AsyncResponse; use Symfony\Component\HttpFoundation\IpUtils; +use Symfony\Contracts\HttpClient\ChunkInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; -use Symfony\Contracts\HttpClient\ResponseStreamInterface; use Symfony\Contracts\Service\ResetInterface; /** * Decorator that blocks requests to private networks by default. * * @author Hallison Boaventura + * @author Nicolas Grekas */ final class NoPrivateNetworkHttpClient implements HttpClientInterface, LoggerAwareInterface, ResetInterface { use HttpClientTrait; + use AsyncDecoratorTrait; + + private array $defaultOptions = self::OPTIONS_DEFAULTS; + private HttpClientInterface $client; + private array|null $subnets; + private int $ipFlags; + private \ArrayObject $dnsCache; /** - * @param string|array|null $subnets String or array of subnets using CIDR notation that will be used by IpUtils. + * @param string|array|null $subnets String or array of subnets using CIDR notation that should be considered private. * If null is passed, the standard private subnets will be used. */ - public function __construct( - private HttpClientInterface $client, - private string|array|null $subnets = null, - ) { + public function __construct(HttpClientInterface $client, string|array|null $subnets = null) + { if (!class_exists(IpUtils::class)) { throw new \LogicException(\sprintf('You cannot use "%s" if the HttpFoundation component is not installed. Try running "composer require symfony/http-foundation".', __CLASS__)); } + + if (null === $subnets) { + $ipFlags = \FILTER_FLAG_IPV4 | \FILTER_FLAG_IPV6; + } else { + $ipFlags = 0; + foreach ((array) $subnets as $subnet) { + $ipFlags |= str_contains($subnet, ':') ? \FILTER_FLAG_IPV6 : \FILTER_FLAG_IPV4; + } + } + + if (!\defined('STREAM_PF_INET6')) { + $ipFlags &= ~\FILTER_FLAG_IPV6; + } + + $this->client = $client; + $this->subnets = null !== $subnets ? (array) $subnets : null; + $this->ipFlags = $ipFlags; + $this->dnsCache = new \ArrayObject(); } public function request(string $method, string $url, array $options = []): ResponseInterface { - $onProgress = $options['on_progress'] ?? null; - if (null !== $onProgress && !\is_callable($onProgress)) { - throw new InvalidArgumentException(\sprintf('Option "on_progress" must be callable, "%s" given.', get_debug_type($onProgress))); - } + [$url, $options] = self::prepareRequest($method, $url, $options, $this->defaultOptions, true); + + $redirectHeaders = parse_url($url['authority']); + $host = $redirectHeaders['host']; + $url = implode('', $url); + $dnsCache = $this->dnsCache; + + $ip = self::dnsResolve($dnsCache, $host, $this->ipFlags, $options); + self::ipCheck($ip, $this->subnets, $this->ipFlags, $host, $url); + $onProgress = $options['on_progress'] ?? null; $subnets = $this->subnets; + $ipFlags = $this->ipFlags; - $options['on_progress'] = static function (int $dlNow, int $dlSize, array $info) use ($onProgress, $subnets): void { - static $lastUrl = ''; + $options['on_progress'] = static function (int $dlNow, int $dlSize, array $info) use ($onProgress, $subnets, $ipFlags): void { static $lastPrimaryIp = ''; - if ($info['url'] !== $lastUrl) { - $host = parse_url($info['url'], PHP_URL_HOST) ?: ''; - $resolve = $info['resolve'] ?? static function () { return null; }; + if (!\in_array($info['primary_ip'] ?? '', ['', $lastPrimaryIp], true)) { + self::ipCheck($info['primary_ip'], $subnets, $ipFlags, null, $info['url']); + $lastPrimaryIp = $info['primary_ip']; + } - if (($ip = trim($host, '[]')) - && !filter_var($ip, \FILTER_VALIDATE_IP) - && !($ip = $resolve($host)) - && $ip = @(gethostbynamel($host)[0] ?? dns_get_record($host, \DNS_AAAA)[0]['ipv6'] ?? null) - ) { - $resolve($host, $ip); - } + null !== $onProgress && $onProgress($dlNow, $dlSize, $info); + }; - if ($ip && IpUtils::checkIp($ip, $subnets ?? IpUtils::PRIVATE_SUBNETS)) { - throw new TransportException(sprintf('Host "%s" is blocked for "%s".', $host, $info['url'])); - } + if (0 >= $maxRedirects = $options['max_redirects']) { + return new AsyncResponse($this->client, $method, $url, $options); + } + + $options['max_redirects'] = 0; + $redirectHeaders['with_auth'] = $redirectHeaders['no_auth'] = $options['headers']; + + if (isset($options['normalized_headers']['host']) || isset($options['normalized_headers']['authorization']) || isset($options['normalized_headers']['cookie'])) { + $redirectHeaders['no_auth'] = array_filter($redirectHeaders['no_auth'], static function ($h) { + return 0 !== stripos($h, 'Host:') && 0 !== stripos($h, 'Authorization:') && 0 !== stripos($h, 'Cookie:'); + }); + } + + return new AsyncResponse($this->client, $method, $url, $options, static function (ChunkInterface $chunk, AsyncContext $context) use (&$method, &$options, $maxRedirects, &$redirectHeaders, $subnets, $ipFlags, $dnsCache): \Generator { + if (null !== $chunk->getError() || $chunk->isTimeout() || !$chunk->isFirst()) { + yield $chunk; - $lastUrl = $info['url']; + return; } - if ($info['primary_ip'] !== $lastPrimaryIp) { - if ($info['primary_ip'] && IpUtils::checkIp($info['primary_ip'], $subnets ?? IpUtils::PRIVATE_SUBNETS)) { - throw new TransportException(\sprintf('IP "%s" is blocked for "%s".', $info['primary_ip'], $info['url'])); - } + $statusCode = $context->getStatusCode(); - $lastPrimaryIp = $info['primary_ip']; + if ($statusCode < 300 || 400 <= $statusCode || null === $url = $context->getInfo('redirect_url')) { + $context->passthru(); + + yield $chunk; + + return; } - null !== $onProgress && $onProgress($dlNow, $dlSize, $info); - }; + $host = parse_url($url, \PHP_URL_HOST); + $ip = self::dnsResolve($dnsCache, $host, $ipFlags, $options); + self::ipCheck($ip, $subnets, $ipFlags, $host, $url); + + // Do like curl and browsers: turn POST to GET on 301, 302 and 303 + if (303 === $statusCode || 'POST' === $method && \in_array($statusCode, [301, 302], true)) { + $method = 'HEAD' === $method ? 'HEAD' : 'GET'; + unset($options['body'], $options['json']); + + if (isset($options['normalized_headers']['content-length']) || isset($options['normalized_headers']['content-type']) || isset($options['normalized_headers']['transfer-encoding'])) { + $filterContentHeaders = static function ($h) { + return 0 !== stripos($h, 'Content-Length:') && 0 !== stripos($h, 'Content-Type:') && 0 !== stripos($h, 'Transfer-Encoding:'); + }; + $options['headers'] = array_filter($options['headers'], $filterContentHeaders); + $redirectHeaders['no_auth'] = array_filter($redirectHeaders['no_auth'], $filterContentHeaders); + $redirectHeaders['with_auth'] = array_filter($redirectHeaders['with_auth'], $filterContentHeaders); + } + } - return $this->client->request($method, $url, $options); - } + // Authorization and Cookie headers MUST NOT follow except for the initial host name + $port = parse_url($url, \PHP_URL_PORT); + $options['headers'] = $redirectHeaders['host'] === $host && ($redirectHeaders['port'] ?? null) === $port ? $redirectHeaders['with_auth'] : $redirectHeaders['no_auth']; - public function stream(ResponseInterface|iterable $responses, ?float $timeout = null): ResponseStreamInterface - { - return $this->client->stream($responses, $timeout); + static $redirectCount = 0; + $context->setInfo('redirect_count', ++$redirectCount); + + $context->replaceRequest($method, $url, $options); + + if ($redirectCount >= $maxRedirects) { + $context->passthru(); + } + }); } /** @@ -110,14 +175,73 @@ public function withOptions(array $options): static { $clone = clone $this; $clone->client = $this->client->withOptions($options); + $clone->defaultOptions = self::mergeDefaultOptions($options, $this->defaultOptions); return $clone; } public function reset(): void { + $this->dnsCache->exchangeArray([]); + if ($this->client instanceof ResetInterface) { $this->client->reset(); } } + + private static function dnsResolve(\ArrayObject $dnsCache, string $host, int $ipFlags, array &$options): string + { + if ($ip = filter_var(trim($host, '[]'), \FILTER_VALIDATE_IP) ?: $options['resolve'][$host] ?? false) { + return $ip; + } + + if ($dnsCache->offsetExists($host)) { + return $dnsCache[$host]; + } + + if ((\FILTER_FLAG_IPV4 & $ipFlags) && $ip = gethostbynamel($host)) { + return $options['resolve'][$host] = $dnsCache[$host] = $ip[0]; + } + + if (!(\FILTER_FLAG_IPV6 & $ipFlags)) { + return $host; + } + + if ($ip = dns_get_record($host, \DNS_AAAA)) { + $ip = $ip[0]['ipv6']; + } elseif (extension_loaded('sockets')) { + if (!$info = socket_addrinfo_lookup($host, 0, ['ai_socktype' => \SOCK_STREAM, 'ai_family' => \AF_INET6])) { + return $host; + } + + $ip = socket_addrinfo_explain($info[0])['ai_addr']['sin6_addr']; + } elseif ('localhost' === $host || 'localhost.' === $host) { + $ip = '::1'; + } else { + return $host; + } + + return $options['resolve'][$host] = $dnsCache[$host] = $ip; + } + + private static function ipCheck(string $ip, ?array $subnets, int $ipFlags, ?string $host, string $url): void + { + if (null === $subnets) { + // Quick check, but not reliable enough, see https://github.com/php/php-src/issues/16944 + $ipFlags |= \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE; + } + + if (false !== filter_var($ip, \FILTER_VALIDATE_IP, $ipFlags) && !IpUtils::checkIp($ip, $subnets ?? IpUtils::PRIVATE_SUBNETS)) { + return; + } + + if (null !== $host) { + $type = 'Host'; + } else { + $host = $ip; + $type = 'IP'; + } + + throw new TransportException($type.\sprintf(' "%s" is blocked for "%s".', $host, $url)); + } } diff --git a/src/Symfony/Component/HttpClient/Psr18Client.php b/src/Symfony/Component/HttpClient/Psr18Client.php index 0c6d365a9564d..5ab4a8d3ce41d 100644 --- a/src/Symfony/Component/HttpClient/Psr18Client.php +++ b/src/Symfony/Component/HttpClient/Psr18Client.php @@ -88,19 +88,44 @@ public function sendRequest(RequestInterface $request): ResponseInterface { try { $body = $request->getBody(); + $headers = $request->getHeaders(); - if ($body->isSeekable()) { - $body->seek(0); + $size = $request->getHeader('content-length')[0] ?? -1; + if (0 > $size && 0 < $size = $body->getSize() ?? -1) { + $headers['Content-Length'] = [$size]; } - $headers = $request->getHeaders(); - if (!$request->hasHeader('content-length') && 0 <= $size = $body->getSize() ?? -1) { - $headers['Content-Length'] = [$size]; + if (0 === $size) { + $body = ''; + } elseif (0 < $size && $size < 1 << 21) { + if ($body->isSeekable()) { + try { + $body->seek(0); + } catch (\RuntimeException) { + // ignore + } + } + + $body = $body->getContents(); + } else { + $body = static function (int $size) use ($body) { + if ($body->isSeekable()) { + try { + $body->seek(0); + } catch (\RuntimeException) { + // ignore + } + } + + while (!$body->eof()) { + yield $body->read($size); + } + }; } $options = [ 'headers' => $headers, - 'body' => static fn (int $size) => $body->read($size), + 'body' => $body, ]; if ('1.0' === $request->getProtocolVersion()) { @@ -141,7 +166,11 @@ public function createStream(string $content = ''): StreamInterface $stream = $this->streamFactory->createStream($content); if ($stream->isSeekable()) { - $stream->seek(0); + try { + $stream->seek(0); + } catch (\RuntimeException) { + // ignore + } } return $stream; diff --git a/src/Symfony/Component/HttpClient/Response/AmpResponseV4.php b/src/Symfony/Component/HttpClient/Response/AmpResponseV4.php index e689bfb239fa5..31ea22d0a63bf 100644 --- a/src/Symfony/Component/HttpClient/Response/AmpResponseV4.php +++ b/src/Symfony/Component/HttpClient/Response/AmpResponseV4.php @@ -90,17 +90,9 @@ public function __construct( $info['max_duration'] = $options['max_duration']; $info['debug'] = ''; - $resolve = static function (string $host, ?string $ip = null) use ($multi): ?string { - if (null !== $ip) { - $multi->dnsCache[$host] = $ip; - } - - return $multi->dnsCache[$host] ?? null; - }; $onProgress = $options['on_progress'] ?? static function () {}; - $onProgress = $this->onProgress = static function () use (&$info, $onProgress, $resolve) { + $onProgress = $this->onProgress = static function () use (&$info, $onProgress) { $info['total_time'] = microtime(true) - $info['start_time']; - $info['resolve'] = $resolve; $onProgress((int) $info['size_download'], ((int) (1 + $info['download_content_length']) ?: 1) - 1, (array) $info); }; @@ -189,19 +181,17 @@ private static function schedule(self $response, array &$runningResponses): void /** * @param AmpClientStateV4 $multi */ - private static function perform(ClientState $multi, ?array &$responses = null): void + private static function perform(ClientState $multi, ?array $responses = null): void { - if ($responses) { - foreach ($responses as $response) { - try { - if ($response->info['start_time']) { - $response->info['total_time'] = microtime(true) - $response->info['start_time']; - ($response->onProgress)(); - } - } catch (\Throwable $e) { - $multi->handlesActivity[$response->id][] = null; - $multi->handlesActivity[$response->id][] = $e; + foreach ($responses ?? [] as $response) { + try { + if ($response->info['start_time']) { + $response->info['total_time'] = microtime(true) - $response->info['start_time']; + ($response->onProgress)(); } + } catch (\Throwable $e) { + $multi->handlesActivity[$response->id][] = null; + $multi->handlesActivity[$response->id][] = $e; } } } diff --git a/src/Symfony/Component/HttpClient/Response/AmpResponseV5.php b/src/Symfony/Component/HttpClient/Response/AmpResponseV5.php index 5a2377a4980c4..8f56c76a41033 100644 --- a/src/Symfony/Component/HttpClient/Response/AmpResponseV5.php +++ b/src/Symfony/Component/HttpClient/Response/AmpResponseV5.php @@ -89,17 +89,9 @@ public function __construct( $info['max_duration'] = $options['max_duration']; $info['debug'] = ''; - $resolve = static function (string $host, ?string $ip = null) use ($multi): ?string { - if (null !== $ip) { - $multi->dnsCache[$host] = $ip; - } - - return $multi->dnsCache[$host] ?? null; - }; $onProgress = $options['on_progress'] ?? static function () {}; - $onProgress = $this->onProgress = static function () use (&$info, $onProgress, $resolve) { + $onProgress = $this->onProgress = static function () use (&$info, $onProgress) { $info['total_time'] = microtime(true) - $info['start_time']; - $info['resolve'] = $resolve; $onProgress((int) $info['size_download'], ((int) (1 + $info['download_content_length']) ?: 1) - 1, (array) $info); }; @@ -170,7 +162,7 @@ private static function schedule(self $response, array &$runningResponses): void /** * @param AmpClientStateV5 $multi */ - private static function perform(ClientState $multi, ?array &$responses = null): void + private static function perform(ClientState $multi, ?array $responses = null): void { if ($responses) { foreach ($responses as $response) { diff --git a/src/Symfony/Component/HttpClient/Response/AsyncResponse.php b/src/Symfony/Component/HttpClient/Response/AsyncResponse.php index faf96a7ae49b7..30083369d5935 100644 --- a/src/Symfony/Component/HttpClient/Response/AsyncResponse.php +++ b/src/Symfony/Component/HttpClient/Response/AsyncResponse.php @@ -12,7 +12,6 @@ namespace Symfony\Component\HttpClient\Response; use Symfony\Component\HttpClient\Chunk\ErrorChunk; -use Symfony\Component\HttpClient\Chunk\FirstChunk; use Symfony\Component\HttpClient\Chunk\LastChunk; use Symfony\Component\HttpClient\Exception\TransportException; use Symfony\Contracts\HttpClient\ChunkInterface; @@ -245,7 +244,7 @@ public static function stream(iterable $responses, ?float $timeout = null, ?stri $wrappedResponses[] = $r->response; if ($r->stream) { - yield from self::passthruStream($response = $r->response, $r, new FirstChunk(), $asyncMap); + yield from self::passthruStream($response = $r->response, $r, $asyncMap, new LastChunk()); if (!isset($asyncMap[$response])) { array_pop($wrappedResponses); @@ -276,15 +275,9 @@ public static function stream(iterable $responses, ?float $timeout = null, ?stri } if (!$r->passthru) { - if (null !== $chunk->getError() || $chunk->isLast()) { - unset($asyncMap[$response]); - } elseif (null !== $r->content && '' !== ($content = $chunk->getContent()) && \strlen($content) !== fwrite($r->content, $content)) { - $chunk = new ErrorChunk($r->offset, new TransportException(\sprintf('Failed writing %d bytes to the response buffer.', \strlen($content)))); - $r->info['error'] = $chunk->getError(); - $r->response->cancel(); - } + $r->stream = (static fn () => yield $chunk)(); + yield from self::passthruStream($response, $r, $asyncMap); - yield $r => $chunk; continue; } @@ -347,13 +340,13 @@ private static function passthru(HttpClientInterface $client, self $r, ChunkInte } $r->stream = $stream; - yield from self::passthruStream($response, $r, null, $asyncMap); + yield from self::passthruStream($response, $r, $asyncMap); } /** * @param \SplObjectStorage|null $asyncMap */ - private static function passthruStream(ResponseInterface $response, self $r, ?ChunkInterface $chunk, ?\SplObjectStorage $asyncMap): \Generator + private static function passthruStream(ResponseInterface $response, self $r, ?\SplObjectStorage $asyncMap, ?ChunkInterface $chunk = null): \Generator { while (true) { try { diff --git a/src/Symfony/Component/HttpClient/Response/CurlResponse.php b/src/Symfony/Component/HttpClient/Response/CurlResponse.php index 8005df79b53cd..e35132d41cccc 100644 --- a/src/Symfony/Component/HttpClient/Response/CurlResponse.php +++ b/src/Symfony/Component/HttpClient/Response/CurlResponse.php @@ -122,20 +122,13 @@ public function __construct( curl_pause($ch, \CURLPAUSE_CONT); if ($onProgress = $options['on_progress']) { - $resolve = static function (string $host, ?string $ip = null) use ($multi): ?string { - if (null !== $ip) { - $multi->dnsCache->hostnames[$host] = $ip; - } - - return $multi->dnsCache->hostnames[$host] ?? null; - }; $url = isset($info['url']) ? ['url' => $info['url']] : []; curl_setopt($ch, \CURLOPT_NOPROGRESS, false); - curl_setopt($ch, \CURLOPT_PROGRESSFUNCTION, static function ($ch, $dlSize, $dlNow) use ($onProgress, &$info, $url, $multi, $debugBuffer, $resolve) { + curl_setopt($ch, \CURLOPT_PROGRESSFUNCTION, static function ($ch, $dlSize, $dlNow) use ($onProgress, &$info, $url, $multi, $debugBuffer) { try { rewind($debugBuffer); $debug = ['debug' => stream_get_contents($debugBuffer)]; - $onProgress($dlNow, $dlSize, $url + curl_getinfo($ch) + $info + $debug + ['resolve' => $resolve]); + $onProgress($dlNow, $dlSize, $url + curl_getinfo($ch) + $info + $debug); } catch (\Throwable $e) { $multi->handlesActivity[(int) $ch][] = null; $multi->handlesActivity[(int) $ch][] = $e; @@ -276,11 +269,11 @@ private static function schedule(self $response, array &$runningResponses): void /** * @param CurlClientState $multi */ - private static function perform(ClientState $multi, ?array &$responses = null): void + private static function perform(ClientState $multi, ?array $responses = null): void { if ($multi->performing) { if ($responses) { - $response = current($responses); + $response = $responses[array_key_first($responses)]; $multi->handlesActivity[(int) $response->handle][] = null; $multi->handlesActivity[(int) $response->handle][] = new TransportException(\sprintf('Userland callback cannot use the client nor the response while processing "%s".', curl_getinfo($response->handle, \CURLINFO_EFFECTIVE_URL))); } @@ -323,7 +316,16 @@ private static function perform(ClientState $multi, ?array &$responses = null): } $multi->handlesActivity[$id][] = null; - $multi->handlesActivity[$id][] = \in_array($result, [\CURLE_OK, \CURLE_TOO_MANY_REDIRECTS], true) || '_0' === $waitFor || curl_getinfo($ch, \CURLINFO_SIZE_DOWNLOAD) === curl_getinfo($ch, \CURLINFO_CONTENT_LENGTH_DOWNLOAD) ? null : new TransportException(ucfirst(curl_error($ch) ?: curl_strerror($result)).\sprintf(' for "%s".', curl_getinfo($ch, \CURLINFO_EFFECTIVE_URL))); + $multi->handlesActivity[$id][] = \in_array($result, [\CURLE_OK, \CURLE_TOO_MANY_REDIRECTS], true) + || '_0' === $waitFor + || curl_getinfo($ch, \CURLINFO_SIZE_DOWNLOAD) === curl_getinfo($ch, \CURLINFO_CONTENT_LENGTH_DOWNLOAD) + || ('C' === $waitFor[0] + && 'OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0' === curl_error($ch) + && -1.0 === curl_getinfo($ch, \CURLINFO_CONTENT_LENGTH_DOWNLOAD) + && \in_array('close', array_map('strtolower', $responses[$id]->headers['connection'] ?? []), true) + ) + ? null + : new TransportException(ucfirst(curl_error($ch) ?: curl_strerror($result)).\sprintf(' for "%s".', curl_getinfo($ch, \CURLINFO_EFFECTIVE_URL))); } } finally { $multi->performing = false; diff --git a/src/Symfony/Component/HttpClient/Response/MockResponse.php b/src/Symfony/Component/HttpClient/Response/MockResponse.php index 6c681962283a3..15988330b44cf 100644 --- a/src/Symfony/Component/HttpClient/Response/MockResponse.php +++ b/src/Symfony/Component/HttpClient/Response/MockResponse.php @@ -176,7 +176,7 @@ protected static function schedule(self $response, array &$runningResponses): vo $runningResponses[0][1][$response->id] = $response; } - protected static function perform(ClientState $multi, array &$responses): void + protected static function perform(ClientState $multi, array $responses): void { foreach ($responses as $response) { $id = $response->id; diff --git a/src/Symfony/Component/HttpClient/Response/NativeResponse.php b/src/Symfony/Component/HttpClient/Response/NativeResponse.php index 0a7654d9628ba..6d63085c832be 100644 --- a/src/Symfony/Component/HttpClient/Response/NativeResponse.php +++ b/src/Symfony/Component/HttpClient/Response/NativeResponse.php @@ -80,7 +80,7 @@ public function __construct( }; $this->canary = new Canary(static function () use ($multi, $id) { - if (null !== ($host = $multi->openHandles[$id][6] ?? null) && 0 >= --$multi->hosts[$host]) { + if (null !== ($host = $multi->openHandles[$id][6] ?? null) && isset($multi->hosts[$host]) && 0 >= --$multi->hosts[$host]) { unset($multi->hosts[$host]); } unset($multi->openHandles[$id], $multi->handlesActivity[$id]); @@ -229,7 +229,7 @@ private static function schedule(self $response, array &$runningResponses): void /** * @param NativeClientState $multi */ - private static function perform(ClientState $multi, ?array &$responses = null): void + private static function perform(ClientState $multi, ?array $responses = null): void { foreach ($multi->openHandles as $i => [$pauseExpiry, $h, $buffer, $onProgress]) { if ($pauseExpiry) { @@ -303,7 +303,7 @@ private static function perform(ClientState $multi, ?array &$responses = null): $multi->handlesActivity[$i][] = null; $multi->handlesActivity[$i][] = $e; - if (null !== ($host = $multi->openHandles[$i][6] ?? null) && 0 >= --$multi->hosts[$host]) { + if (null !== ($host = $multi->openHandles[$i][6] ?? null) && isset($multi->hosts[$host]) && 0 >= --$multi->hosts[$host]) { unset($multi->hosts[$host]); } unset($multi->openHandles[$i]); diff --git a/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php b/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php index 314b391776816..1d6f941c5b9b3 100644 --- a/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php +++ b/src/Symfony/Component/HttpClient/Response/TransportResponseTrait.php @@ -92,7 +92,7 @@ abstract protected static function schedule(self $response, array &$runningRespo /** * Performs all pending non-blocking operations. */ - abstract protected static function perform(ClientState $multi, array &$responses): void; + abstract protected static function perform(ClientState $multi, array $responses): void; /** * Waits for network activity. @@ -150,10 +150,15 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen $lastActivity = hrtime(true) / 1E9; $elapsedTimeout = 0; - if ($fromLastTimeout = 0.0 === $timeout && '-0' === (string) $timeout) { - $timeout = null; - } elseif ($fromLastTimeout = 0 > $timeout) { - $timeout = -$timeout; + if ((0.0 === $timeout && '-0' === (string) $timeout) || 0 > $timeout) { + $timeout = $timeout ? -$timeout : null; + + /** @var ClientState $multi */ + foreach ($runningResponses as [$multi]) { + if (null !== $multi->lastTimeout) { + $elapsedTimeout = max($elapsedTimeout, $lastActivity - $multi->lastTimeout); + } + } } while (true) { @@ -162,8 +167,7 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen $timeoutMin = $timeout ?? \INF; /** @var ClientState $multi */ - foreach ($runningResponses as $i => [$multi]) { - $responses = &$runningResponses[$i][1]; + foreach ($runningResponses as $i => [$multi, &$responses]) { self::perform($multi, $responses); foreach ($responses as $j => $response) { @@ -171,26 +175,25 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen $timeoutMin = min($timeoutMin, $response->timeout, 1); $chunk = false; - if ($fromLastTimeout && null !== $multi->lastTimeout) { - $elapsedTimeout = hrtime(true) / 1E9 - $multi->lastTimeout; - } - if (isset($multi->handlesActivity[$j])) { $multi->lastTimeout = null; + $elapsedTimeout = 0; } elseif (!isset($multi->openHandles[$j])) { + $hasActivity = true; unset($responses[$j]); continue; } elseif ($elapsedTimeout >= $timeoutMax) { $multi->handlesActivity[$j] = [new ErrorChunk($response->offset, \sprintf('Idle timeout reached for "%s".', $response->getInfo('url')))]; $multi->lastTimeout ??= $lastActivity; + $elapsedTimeout = $timeoutMax; } else { continue; } - while ($multi->handlesActivity[$j] ?? false) { - $hasActivity = true; - $elapsedTimeout = 0; + $lastActivity = null; + $hasActivity = true; + while ($multi->handlesActivity[$j] ?? false) { if (\is_string($chunk = array_shift($multi->handlesActivity[$j]))) { if (null !== $response->inflate && false === $chunk = @inflate_add($response->inflate, $chunk)) { $multi->handlesActivity[$j] = [null, new TransportException(\sprintf('Error while processing content unencoding for "%s".', $response->getInfo('url')))]; @@ -227,7 +230,6 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen } } elseif ($chunk instanceof ErrorChunk) { unset($responses[$j]); - $elapsedTimeout = $timeoutMax; } elseif ($chunk instanceof FirstChunk) { if ($response->logger) { $info = $response->getInfo(); @@ -278,10 +280,12 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen if ($chunk instanceof ErrorChunk && !$chunk->didThrow()) { // Ensure transport exceptions are always thrown $chunk->getContent(); + throw new \LogicException('A transport exception should have been thrown.'); } } if (!$responses) { + $hasActivity = true; unset($runningResponses[$i]); } @@ -295,7 +299,7 @@ public static function stream(iterable $responses, ?float $timeout = null): \Gen } if ($hasActivity) { - $lastActivity = hrtime(true) / 1E9; + $lastActivity ??= hrtime(true) / 1E9; continue; } diff --git a/src/Symfon 10000 y/Component/HttpClient/Tests/AmpHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/AmpHttpClientTest.php index e17b45a0ce185..d03693694a746 100644 --- a/src/Symfony/Component/HttpClient/Tests/AmpHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/AmpHttpClientTest.php @@ -14,6 +14,9 @@ use Symfony\Component\HttpClient\AmpHttpClient; use Symfony\Contracts\HttpClient\HttpClientInterface; +/** + * @group dns-sensitive + */ class AmpHttpClientTest extends HttpClientTestCase { protected function getHttpClient(string $testCase): HttpClientInterface diff --git a/src/Symfony/Component/HttpClient/Tests/AsyncDecoratorTraitTest.php b/src/Symfony/Component/HttpClient/Tests/AsyncDecoratorTraitTest.php index 1096a9ec1ca61..b3cb83bf371c3 100644 --- a/src/Symfony/Component/HttpClient/Tests/AsyncDecoratorTraitTest.php +++ b/src/Symfony/Component/HttpClient/Tests/AsyncDecoratorTraitTest.php @@ -231,6 +231,20 @@ public function testBufferPurePassthru() $this->assertStringContainsString('SERVER_PROTOCOL', $response->getContent()); $this->assertStringContainsString('HTTP_HOST', $response->getContent()); + + $client = new class(parent::getHttpClient(__FUNCTION__)) implements HttpClientInterface { + use AsyncDecoratorTrait; + + public function request(string $method, string $url, array $options = []): ResponseInterface + { + return new AsyncResponse($this->client, $method, $url, $options); + } + }; + + $response = $client->request('GET', 'http://localhost:8057/'); + + $this->assertStringContainsString('SERVER_PROTOCOL', $response->getContent()); + $this->assertStringContainsString('HTTP_HOST', $response->getContent()); } public function testRetryTimeout() diff --git a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php index 765cdcd2ab39e..a18b253203092 100644 --- a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php @@ -17,6 +17,8 @@ /** * @requires extension curl + * + * @group dns-sensitive */ class CurlHttpClientTest extends HttpClientTestCase { diff --git a/src/Symfony/Component/HttpClient/Tests/DataCollector/HttpClientDataCollectorTest.php b/src/Symfony/Component/HttpClient/Tests/DataCollector/HttpClientDataCollectorTest.php index ae915e788a487..b57ea826849a9 100644 --- a/src/Symfony/Component/HttpClient/Tests/DataCollector/HttpClientDataCollectorTest.php +++ b/src/Symfony/Component/HttpClient/Tests/DataCollector/HttpClientDataCollectorTest.php @@ -24,11 +24,6 @@ public static function setUpBeforeClass(): void TestHttpServer::start(); } - public static function tearDownAfterClass(): void - { - TestHttpServer::stop(); - } - public function testItCollectsRequestCount() { $httpClient1 = $this->httpClientThatHasTracedRequests([ diff --git a/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php b/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php index db80869579973..d733a098f3347 100644 --- a/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php +++ b/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php @@ -11,6 +11,7 @@ namespace Symfony\Component\HttpClient\Tests; +use Symfony\Bridge\PhpUnit\DnsMock; use Symfony\Component\HttpClient\Exception\ClientException; use Symfony\Component\HttpClient\Exception\InvalidArgumentException; use Symfony\Component\HttpClient\Exception\TransportException; @@ -490,6 +491,105 @@ public function testNoPrivateNetworkWithResolve() $client->request('GET', 'http://symfony.com', ['resolve' => ['symfony.com' => '127.0.0.1']]); } + public function testNoPrivateNetworkWithResolveAndRedirect() + { + DnsMock::withMockedHosts([ + 'localhost' => [ + [ + 'host' => 'localhost', + 'class' => 'IN', + 'ttl' => 15, + 'type' => 'A', + 'ip' => '127.0.0.1', + ], + ], + 'symfony.com' => [ + [ + 'host' => 'symfony.com', + 'class' => 'IN', + 'ttl' => 15, + 'type' => 'A', + 'ip' => '10.0.0.1', + ], + ], + ]); + + $client = $this->getHttpClient(__FUNCTION__); + $client = new NoPrivateNetworkHttpClient($client, '10.0.0.1/32'); + + $this->expectException(TransportException::class); + $this->expectExceptionMessage('Host "symfony.com" is blocked'); + + $client->request('GET', 'http://localhost:8057/302?location=https://symfony.com/'); + } + + public function testNoPrivateNetwork304() + { + $client = $this->getHttpClient(__FUNCTION__); + $client = new NoPrivateNetworkHttpClient($client, '104.26.14.6/32'); + $response = $client->request('GET', 'http://localhost:8057/304', [ + 'headers' => ['If-Match' => '"abc"'], + 'buffer' => false, + ]); + + $this->assertSame(304, $response->getStatusCode()); + $this->assertSame('', $response->getContent(false)); + } + + public function testNoPrivateNetwork302() + { + $client = $this->getHttpClient(__FUNCTION__); + $client = new NoPrivateNetworkHttpClient($client, '104.26.14.6/32'); + $response = $client->request('GET', 'http://localhost:8057/302/relative'); + + $body = $response->toArray(); + + $this->assertSame('/', $body['REQUEST_URI']); + $this->assertNull($response->getInfo('redirect_url')); + + $response = $client->request('GET', 'http://localhost:8057/302/relative', [ + 'max_redirects' => 0, + ]); + + $this->assertSame(302, $response->getStatusCode()); + $this->assertSame('http://localhost:8057/', $response->getInfo('redirect_url')); + } + + public function testNoPrivateNetworkStream() + { + $client = $this->getHttpClient(__FUNCTION__); + + $response = $client->request('GET', 'http://localhost:8057'); + $client = new NoPrivateNetworkHttpClient($client, '104.26.14.6/32'); + + $response = $client->request('GET', 'http://localhost:8057'); + $chunks = $client->stream($response); + $result = []; + + foreach ($chunks as $r => $chunk) { + if ($chunk->isTimeout()) { + $result[] = 't'; + } elseif ($chunk->isLast()) { + $result[] = 'l'; + } elseif ($chunk->isFirst()) { + $result[] = 'f'; + } + } + + $this->assertSame($response, $r); + $this->assertSame(['f', 'l'], $result); + + $chunk = null; + $i = 0; + + foreach ($client->stream($response) as $chunk) { + ++$i; + } + + $this->assertSame(1, $i); + $this->assertTrue($chunk->isLast()); + } + public function testNoRedirectWithInvalidLocation() { $client = $this->getHttpClient(__FUNCTION__); @@ -556,4 +656,81 @@ public function testDefaultContentType() $this->assertSame(['abc' => 'def', 'content-type' => 'application/json', 'REQUEST_METHOD' => 'POST'], $response->toArray()); } + + public function testHeadRequestWithClosureBody() + { + $p = TestHttpServer::start(8067); + + try { + $client = $this->getHttpClient(__FUNCTION__); + + $response = $client->request('HEAD', 'http://localhost:8057/head', [ + 'body' => fn () => '', + ]); + $headers = $response->getHeaders(); + } finally { + $p->stop(); + } + + $this->assertArrayHasKey('x-request-vars', $headers); + + $vars = json_decode($headers['x-request-vars'][0], true); + $this->assertIsArray($vars); + $this->assertSame('HEAD', $vars['REQUEST_METHOD']); + } + + /** + * @testWith [301] + * [302] + * [303] + */ + public function testPostToGetRedirect(int $status) + { + $p = TestHttpServer::start(8067); + + try { + $client = $this->getHttpClient(__FUNCTION__); + + $response = $client->request('POST', 'http://localhost:8057/custom?status=' . $status . '&headers[]=Location%3A%20%2F'); + $body = $response->toArray(); + } finally { + $p->stop(); + } + + $this->assertSame('GET', $body['REQUEST_METHOD']); + $this->assertSame('/', $body['REQUEST_URI']); + } + + public function testResponseCanBeProcessedAfterClientReset() + { + $client = $this->getHttpClient(__FUNCTION__); + $response = $client->request('GET', 'http://127.0.0.1:8057/timeout-body'); + $stream = $client->stream($response); + + $response->getStatusCode(); + $client->reset(); + $stream->current(); + + $this->addToAssertionCount(1); + } + + public function testUnixSocket() + { + if (!file_exists('/var/run/docker.sock')) { + $this->markTestSkipped('Docker socket not found.'); + } + + $client = $this->getHttpClient(__FUNCTION__) + ->withOptions([ + 'base_uri' => 'http://docker', + 'bindto' => '/run/docker.sock', + ]); + + $response = $client->request('GET', '/info'); + + $this->assertSame(200, $response->getStatusCode()); + + $info = $response->getInfo(); + $this->assertSame('/run/docker.sock', $info['primary_ip']); + } } diff --git a/src/Symfony/Component/HttpClient/Tests/HttplugClientTest.php b/src/Symfony/Component/HttpClient/Tests/HttplugClientTest.php index f5f6d8ddcf9be..b500c9548ebb0 100644 --- a/src/Symfony/Component/HttpClient/Tests/HttplugClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/HttplugClientTest.php @@ -32,11 +32,6 @@ public static function setUpBeforeClass(): void TestHttpServer::start(); } - public static function tearDownAfterClass(): void - { - TestHttpServer::stop(); - } - /** * @requires function ob_gzhandler */ diff --git a/src/Symfony/Component/HttpClient/Tests/MockHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/MockHttpClientTest.php index 1e6351476a04e..76969a3238c39 100644 --- a/src/Symfony/Component/HttpClient/Tests/MockHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/MockHttpClientTest.php @@ -505,6 +505,11 @@ public function testHttp2PushVulcainWithUnusedResponse() $this->markTestSkipped('MockHttpClient doesn\'t support HTTP/2 PUSH.'); } + public function testUnixSocket() + { + $this->markTestSkipped('MockHttpClient doesn\'t support binding to unix sockets.'); + } + public function testChangeResponseFactory() { /* @var MockHttpClient $client */ diff --git a/src/Symfony/Component/HttpClient/Tests/NativeHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/NativeHttpClientTest.php index 3250b5013763b..435b92129f4e4 100644 --- a/src/Symfony/Component/HttpClient/Tests/NativeHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/NativeHttpClientTest.php @@ -14,6 +14,9 @@ use Symfony\Component\HttpClient\NativeHttpClient; use Symfony\Contracts\HttpClient\HttpClientInterface; +/** + * @group dns-sensitive + */ class NativeHttpClientTest extends HttpClientTestCase { protected function getHttpClient(string $testCase): HttpClientInterface @@ -45,4 +48,9 @@ public function testHttp2PushVulcainWithUnusedResponse() { $this->markTestSkipped('NativeHttpClient doesn\'t support HTTP/2.'); } + + public function testUnixSocket() + { + $this->markTestSkipped('NativeHttpClient doesn\'t support binding to unix sockets.'); + } } diff --git a/src/Symfony/Component/HttpClient/Tests/NoPrivateNetworkHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/NoPrivateNetworkHttpClientTest.php index 290ffec5e9176..ddd83c4960cb0 100644 --- a/src/Symfony/Component/HttpClient/Tests/NoPrivateNetworkHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/NoPrivateNetworkHttpClientTest.php @@ -12,17 +12,16 @@ namespace Symfony\Component\HttpClient\Tests; use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\DnsMock; use Symfony\Component\HttpClient\Exception\InvalidArgumentException; use Symfony\Component\HttpClient\Exception\TransportException; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\NoPrivateNetworkHttpClient; use Symfony\Component\HttpClient\Response\MockResponse; -use Symfony\Contracts\HttpClient\HttpClientInterface; -use Symfony\Contracts\HttpClient\ResponseInterface; class NoPrivateNetworkHttpClientTest extends TestCase { - public static function getExcludeData(): array + public static function getExcludeIpData(): array { return [ // private @@ -51,24 +50,44 @@ public static function getExcludeData(): array ['104.26.14.6', '104.26.14.0/24', true], ['2606:4700:20::681a:e06', null, false], ['2606:4700:20::681a:e06', '2606:4700:20::/43', true], + ]; + } - // no ipv4/ipv6 at all - ['2606:4700:20::681a:e06', '::/0', true], - ['104.26.14.6', '0.0.0.0/0', true], + public static function getExcludeHostData(): iterable + { + yield from self::getExcludeIpData(); - // weird scenarios (e.g.: when trying to match ipv4 address on ipv6 subnet) - ['10.0.0.1', 'fc00::/7', false], - ['fc00::1', '10.0.0.0/8', false], - ]; + // no ipv4/ipv6 at all + yield ['2606:4700:20::681a:e06', '::/0', true]; + yield ['104.26.14.6', '0.0.0.0/0', true]; + + // weird scenarios (e.g.: when trying to match ipv4 address on ipv6 subnet) + yield ['10.0.0.1', 'fc00::/7', true]; + yield ['fc00::1', '10.0.0.0/8', true]; } /** - * @dataProvider getExcludeData + * @dataProvider getExcludeIpData + * + * @group dns-sensitive */ public function testExcludeByIp(string $ipAddr, $subnets, bool $mustThrow) { + $host = strtr($ipAddr, '.:', '--'); + DnsMock::withMockedHosts([ + $host => [ + str_contains($ipAddr, ':') ? [ + 'type' => 'AAAA', + 'ipv6' => '3706:5700:20::ac43:4826', + ] : [ + 'type' => 'A', + 'ip' => '105.26.14.6', + ], + ], + ]); + $content = 'foo'; - $url = \sprintf('http://%s/', strtr($ipAddr, '.:', '--')); + $url = \sprintf('http://%s/', $host); if ($mustThrow) { $this->expectException(TransportException::class); @@ -86,12 +105,26 @@ public function testExcludeByIp(string $ipAddr, $subnets, bool $mustThrow) } /** - * @dataProvider getExcludeData + * @dataProvider getExcludeHostData + * + * @group dns-sensitive */ public function testExcludeByHost(string $ipAddr, $subnets, bool $mustThrow) { + $host = strtr($ipAddr, '.:', '--'); + DnsMock::withMockedHosts([ + $host => [ + str_contains($ipAddr, ':') ? [ + 'type' => 'AAAA', + 'ipv6' => $ipAddr, + ] : [ + 'type' => 'A', + 'ip' => $ipAddr, + ], + ], + ]); + $content = 'foo'; - $host = str_contains($ipAddr, ':') ? \sprintf('[%s]', $ipAddr) : $ipAddr; $url = \sprintf('http://%s/', $host); if ($mustThrow) { @@ -142,6 +175,27 @@ public function testNonCallableOnProgressCallback() $client->request('GET', $url, ['on_progress' => $customCallback]); } + public function testHeadersArePassedOnRedirect() + { + $ipAddr = '104.26.14.6'; + $url = sprintf('http://%s/', $ipAddr); + $content = 'foo'; + + $callback = function ($method, $url, $options) use ($content): MockResponse { + $this->assertArrayHasKey('headers', $options); + $this->assertNotContains('content-type: application/json', $options['headers']); + $this->assertContains('foo: bar', $options['headers']); + return new MockResponse($content); + }; + $responses = [ + new MockResponse('', ['http_code' => 302, 'redirect_url' => 'http://104.26.14.7']), + $callback, + ]; + $client = new NoPrivateNetworkHttpClient(new MockHttpClient($responses)); + $response = $client->request('POST', $url, ['headers' => ['foo' => 'bar', 'content-type' => 'application/json']]); + $this->assertEquals($content, $response->getContent()); + } + private function getMockHttpClient(string $ipAddr, string $content) { return new MockHttpClient(new MockResponse($content, ['primary_ip' => $ipAddr])); diff --git a/src/Symfony/Component/HttpClient/Tests/Psr18ClientTest.php b/src/Symfony/Component/HttpClient/Tests/Psr18ClientTest.php index 65b7f5b3f6794..bf49535ae3e66 100644 --- a/src/Symfony/Component/HttpClient/Tests/Psr18ClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/Psr18ClientTest.php @@ -28,11 +28,6 @@ public static function setUpBeforeClass(): void TestHttpServer::start(); } - public static function tearDownAfterClass(): void - { - TestHttpServer::stop(); - } - /** * @requires function ob_gzhandler */ diff --git a/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php index 1a79ef522c4c8..6d61e93eff0d8 100644 --- a/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/RetryableHttpClientTest.php @@ -27,11 +27,6 @@ class RetryableHttpClientTest extends TestCase { - public static function tearDownAfterClass(): void - { - TestHttpServer::stop(); - } - public function testRetryOnError() { $client = new RetryableHttpClient( diff --git a/src/Symfony/Component/HttpClient/Tests/TraceableHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/TraceableHttpClientTest.php index b6a2c03c8f7a3..cf437a653bd76 100644 --- a/src/Symfony/Component/HttpClient/Tests/TraceableHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/TraceableHttpClientTest.php @@ -29,11 +29,6 @@ public static function setUpBeforeClass(): void TestHttpServer::start(); } - public static function tearDownAfterClass(): void - { - TestHttpServer::stop(); - } - public function testItTracesRequest() { $httpClient = $this->createMock(HttpClientInterface::class); diff --git a/src/Symfony/Component/HttpClient/composer.json b/src/Symfony/Component/HttpClient/composer.json index f294e7a577902..7ca008fd01f13 100644 --- a/src/Symfony/Component/HttpClient/composer.json +++ b/src/Symfony/Component/HttpClient/composer.json @@ -25,7 +25,7 @@ "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-client-contracts": "~3.4.3|^3.5.1", + "symfony/http-client-contracts": "~3.4.4|^3.5.2", "symfony/service-contracts": "^2.5|^3" }, "require-dev": { diff --git a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php index 6eddd6c287c85..a7358183bd461 100644 --- a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php +++ b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php @@ -189,7 +189,12 @@ public function prepare(Request $request): static } if (!$this->headers->has('Content-Type')) { - $this->headers->set('Content-Type', $this->file->getMimeType() ?: 'application/octet-stream'); + $mimeType = null; + if (!$this->tempFileObject) { + $mimeType = $this->file->getMimeType(); + } + + $this->headers->set('Content-Type', $mimeType ?: 'application/octet-stream'); } parent::prepare($request); @@ -232,7 +237,7 @@ public function prepare(Request $request): static $path = $location.substr($path, \strlen($pathPrefix)); // Only set X-Accel-Redirect header if a valid URI can be produced // as nginx does not serve arbitrary file paths. - $this->headers->set($type, $path); + $this->headers->set($type, rawurlencode($path)); $this->maxlen = 0; break; } diff --git a/src/Symfony/Component/HttpFoundation/IpUtils.php b/src/Symfony/Component/HttpFoundation/IpUtils.php index 5e1e29c9585f0..11a43238b4601 100644 --- a/src/Symfony/Component/HttpFoundation/IpUtils.php +++ b/src/Symfony/Component/HttpFoundation/IpUtils.php @@ -196,6 +196,16 @@ public static function anonymize(string $ip/* , int $v4Bytes = 1, int $v6Bytes = throw new \InvalidArgumentException('Cannot anonymize more than 4 bytes for IPv4 and 16 bytes for IPv6.'); } + /** + * If the IP contains a % symbol, then it is a local-link address with scoping according to RFC 4007 + * In that case, we only care about the part before the % symbol, as the following functions, can only work with + * the IP address itself. As the scope can leak information (containing interface name), we do not want to + * include it in our anonymized IP data. + */ + if (str_contains($ip, '%')) { + $ip = substr($ip, 0, strpos($ip, '%')); + } + $wrappedIPv6 = false; if (str_starts_with($ip, '[') && str_ends_with($ip, ']')) { $wrappedIPv6 = true; diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index db78105cc83cf..5ee07ecbde3bd 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1384,7 +1384,7 @@ public function isMethodCacheable(): bool public function getProtocolVersion(): ?string { if ($this->isFromTrustedProxy()) { - preg_match('~^(HTTP/)?([1-9]\.[0-9]) ~', $this->headers->get('Via') ?? '', $matches); + preg_match('~^(HTTP/)?([1-9]\.[0-9])\b~', $this->headers->get('Via') ?? '', $matches); if ($matches) { return 'HTTP/'.$matches[2]; diff --git a/src/Symfony/Component/HttpFoundation/RequestStack.php b/src/Symfony/Component/HttpFoundation/RequestStack.php index c358ea68c3a60..153bd9ad797fb 100644 --- a/src/Symfony/Component/HttpFoundation/RequestStack.php +++ b/src/Symfony/Component/HttpFoundation/RequestStack.php @@ -114,4 +114,11 @@ public function getSession(): SessionInterface throw new SessionNotFoundException(); } + + public function resetRequestFormats(): void + { + static $resetRequestFormats; + $resetRequestFormats ??= \Closure::bind(static fn () => self::$formats = null, null, Request::class); + $resetRequestFormats(); + } } diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php index f08471e9b9130..e2fb4f129a124 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php @@ -11,6 +11,9 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Types\Types; @@ -224,7 +227,13 @@ public function configureSchema(Schema $schema, ?\Closure $isSameDatabase = null default: throw new \DomainException(\sprintf('Creating the session table is currently not implemented for PDO driver "%s".', $this->driver)); } - $table->setPrimaryKey([$this->idCol]); + + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted($this->idCol))], true)); + } else { + $table->setPrimaryKey([$this->idCol]); + } + $table->addIndex([$this->lifetimeCol], $this->lifetimeCol.'_idx'); } diff --git a/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php b/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php index 2951cdb514471..7627cd5ec492a 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/BinaryFileResponseTest.php @@ -314,7 +314,15 @@ public function testXAccelMapping($realpath, $mapping, $virtual) $property->setValue($response, $file); $response->prepare($request); - $this->assertEquals($virtual, $response->headers->get('X-Accel-Redirect')); + $header = $response->headers->get('X-Accel-Redirect'); + + if ($virtual) { + // Making sure the path doesn't contain characters unsupported by nginx + $this->assertMatchesRegularExpression('/^([^?%]|%[0-9A-F]{2})*$/', $header); + $header = rawurldecode($header); + } + + $this->assertEquals($virtual, $header); } public function testDeleteFileAfterSend() @@ -361,6 +369,7 @@ public static function getSampleXAccelMappings() ['/home/Foo/bar.txt', '/var/www/=/files/,/home/Foo/=/baz/', '/baz/bar.txt'], ['/home/Foo/bar.txt', '"/var/www/"="/files/", "/home/Foo/"="/baz/"', '/baz/bar.txt'], ['/tmp/bar.txt', '"/var/www/"="/files/", "/home/Foo/"="/baz/"', null], + ['/var/www/var/www/files/foo%.txt', '/var/www/=/files/', '/files/var/www/files/foo%.txt'], ]; } @@ -468,4 +477,15 @@ public function testSetChunkSizeTooSmall() $response->setChunkSize(0); } + + public function testCreateFromTemporaryFileWithoutMimeType() + { + $file = new \SplTempFileObject(); + $file->fwrite('foo,bar'); + + $response = new BinaryFileResponse($file); + $response->prepare(new Request()); + + $this->assertSame('application/octet-stream', $response->headers->get('Content-Type')); + } } diff --git a/src/Symfony/Component/HttpFoundation/Tests/InputBagTest.php b/src/Symfony/Component/HttpFoundation/Tests/InputBagTest.php index 36eb9ead54313..d23f17f712450 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/InputBagTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/InputBagTest.php @@ -71,7 +71,7 @@ public function __toString(): string $this->assertSame('foo', $bag->getString('unknown', 'foo'), '->getString() returns the default if a parameter is not defined'); $this->assertSame('1', $bag->getString('bool_true'), '->getString() returns "1" if a parameter is true'); $this->assertSame('', $bag->getString('bool_false', 'foo'), '->getString() returns an empty empty string if a parameter is false'); - $this->assertSame('strval', $bag->getString('stringable'), '->getString() gets a value of a stringable paramater as string'); + $this->assertSame('strval', $bag->getString('stringable'), '->getString() gets a value of a stringable parameter as string'); } public function testGetStringExceptionWithArray() diff --git a/src/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php b/src/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php index 95044106ba0e6..5ed3e7b22bcf4 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/IpUtilsTest.php @@ -147,6 +147,7 @@ public static function anonymizedIpData() ['[2a01:198::3]', '[2a01:198::]'], ['::ffff:123.234.235.236', '::ffff:123.234.235.0'], // IPv4-mapped IPv6 addresses ['::123.234.235.236', '::123.234.235.0'], // deprecated IPv4-compatible IPv6 address + ['fe80::1fc4:15d8:78db:2319%enp4s0', 'fe80::'], // IPv6 link-local with RFC4007 scoping ]; } diff --git a/src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php b/src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php index ac2b4da5a428e..018e1820d2ea6 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/ParameterBagTest.php @@ -219,7 +219,7 @@ public function __toString(): string $this->assertSame('foo', $bag->getString('unknown', 'foo'), '->getString() returns the default if a parameter is not defined'); $this->assertSame('1', $bag->getString('bool_true'), '->getString() returns "1" if a parameter is true'); $this->assertSame('', $bag->getString('bool_false', 'foo'), '->getString() returns an empty empty string if a parameter is false'); - $this->assertSame('strval', $bag->getString('stringable'), '->getString() gets a value of a stringable paramater as string'); + $this->assertSame('strval', $bag->getString('stringable'), '->getString() gets a value of a stringable parameter as string'); } public function testGetStringExceptionWithArray() diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php index 6fba27589c2b0..f97efe4804abe 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php @@ -74,4 +74,18 @@ public function testGetParentRequest() $requestStack->push($secondSubRequest); $this->assertSame($firstSubRequest, $requestStack->getParentRequest()); } + + public function testResetRequestFormats() + { + $requestStack = new RequestStack(); + + $request = Request::create('/foo'); + $request->setFormat('foo', ['application/foo']); + + $this->assertSame(['application/foo'], $request->getMimeTypes('foo')); + + $requestStack->resetRequestFormats(); + + $this->assertSame([], $request->getMimeTypes('foo')); + } } diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index d5a41390e1b5d..220702a1d2990 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php @@ -589,7 +589,6 @@ public function testGetUri() $server['REDIRECT_QUERY_STRING'] = 'query=string'; $server['REDIRECT_URL'] = '/path/info'; - $server['SCRIPT_NAME'] = '/index.php'; $server['QUERY_STRING'] = 'query=string'; $server['REQUEST_URI'] = '/path/info?toto=test&1=1'; $server['SCRIPT_NAME'] = '/index.php'; @@ -716,7 +715,6 @@ public function testGetUriForPath() $server['REDIRECT_QUERY_STRING'] = 'query=string'; $server['REDIRECT_URL'] = '/path/info'; - $server['SCRIPT_NAME'] = '/index.php'; $server['QUERY_STRING'] = 'query=string'; $server['REQUEST_URI'] = '/path/info?toto=test&1=1'; $server['SCRIPT_NAME'] = '/index.php'; @@ -2419,6 +2417,8 @@ public static function protocolVersionProvider() 'trusted with via and protocol name' => ['HTTP/2.0', true, 'HTTP/1.0 fred, HTTP/1.1 nowhere.com (Apache/1.1)', 'HTTP/1.0'], 'trusted with broken via' => ['HTTP/2.0', true, 'HTTP/1^0 foo', 'HTTP/2.0'], 'trusted with partially-broken via' => ['HTTP/2.0', true, '1.0 fred, foo', 'HTTP/1.0'], + 'trusted with simple via' => ['HTTP/2.0', true, 'HTTP/1.0', 'HTTP/1.0'], + 'trusted with only version via' => ['HTTP/2.0', true, '1.0', 'HTTP/1.0'], ]; } diff --git a/src/Symfony/Component/HttpKernel/Attribute/MapQueryParameter.php b/src/Symfony/Component/HttpKernel/Attribute/MapQueryParameter.php index 5b147b8143700..ec9bf57726075 100644 --- a/src/Symfony/Component/HttpKernel/Attribute/MapQueryParameter.php +++ b/src/Symfony/Component/HttpKernel/Attribute/MapQueryParameter.php @@ -25,7 +25,7 @@ final class MapQueryParameter extends ValueResolver { /** - * @see https://php.net/filter.filters.validate for filter, flags and options + * @see https://php.net/manual/filter.constants for filter, flags and options * * @param string|null $name The name of the query parameter; if null, the name of the argument in the controller will be used * @param (FILTER_VALIDATE_*)|(FILTER_SANITIZE_*)|null $filter The filter to pass to "filter_var()" diff --git a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php index 1f0ff7cc0f053..a196250e8b23b 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestPayloadValueResolver.php @@ -46,11 +46,9 @@ class RequestPayloadValueResolver implements ValueResolverInterface, EventSubscriberInterface { /** - * @see \Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT * @see DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS */ private const CONTEXT_DENORMALIZE = [ - 'disable_type_enforcement' => true, 'collect_denormalization_errors' => true, ]; @@ -190,7 +188,7 @@ private function mapQueryString(Request $request, ArgumentMetadata $argument, Ma return null; } - return $this->serializer->denormalize($data, $argument->getType(), null, $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ['filter_bool' => true]); + return $this->serializer->denormalize($data, $argument->getType(), 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ['filter_bool' => true]); } private function mapRequestPayload(Request $request, ArgumentMetadata $argument, MapRequestPayload $attribute): object|array|null @@ -210,7 +208,7 @@ private function mapRequestPayload(Request $request, ArgumentMetadata $argument, } if ($data = $request->request->all()) { - return $this->serializer->denormalize($data, $type, null, $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : [])); + return $this->serializer->denormalize($data, $type, 'csv', $attribute->serializationContext + self::CONTEXT_DENORMALIZE + ('form' === $format ? ['filter_bool' => true] : [])); } if ('' === ($data = $request->getContent()) && ($argument->isNullable() || $argument->hasDefaultValue())) { diff --git a/src/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php b/src/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php index 747a495036d17..8713dcf1e55d9 100644 --- a/src/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php +++ b/src/Symfony/Component/HttpKernel/DataCollector/ConfigDataCollector.php @@ -57,7 +57,7 @@ public function collect(Request $request, Response $response, ?\Throwable $excep 'php_intl_locale' => class_exists(\Locale::class, false) && \Locale::getDefault() ? \Locale::getDefault() : 'n/a', 'php_timezone' => date_default_timezone_get(), 'xdebug_enabled' => \extension_loaded('xdebug'), - 'xdebug_status' => \extension_loaded('xdebug') ? ($xdebugMode && $xdebugMode !== 'off' ? 'Enabled (' . $xdebugMode . ')' : 'Not enabled') : 'Not installed', + 'xdebug_status' => \extension_loaded('xdebug') ? ($xdebugMode && 'off' !== $xdebugMode ? 'Enabled (' . $xdebugMode . ')' : 'Not enabled') : 'Not installed', 'apcu_enabled' => \extension_loaded('apcu') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOL), 'apcu_status' => \extension_loaded('apcu') ? (filter_var(\ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? 'Enabled' : 'Not enabled') : 'Not installed', 'zend_opcache_enabled' => \extension_loaded('Zend OPcache') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOL), diff --git a/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php b/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php index 9c4f4981a5bba..beca6bfb149a1 100644 --- a/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php +++ b/src/Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher.php @@ -66,7 +66,11 @@ protected function afterDispatch(string $eventName, object $event): void if (null === $sectionId) { break; } - $this->stopwatch->stopSection($sectionId); + try { + $this->stopwatch->stopSection($sectionId); + } catch (\LogicException) { + // The stop watch service might have been reset in the meantime + } break; case KernelEvents::TERMINATE: // In the special case described in the `preDispatch` method above, the `$token` section diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/LoggerPass.php b/src/Symfony/Component/HttpKernel/DependencyInjection/LoggerPass.php index 2cc75950fd6d5..7566d7358cf34 100644 --- a/src/Symfony/Component/HttpKernel/DependencyInjection/LoggerPass.php +++ b/src/Symfony/Component/HttpKernel/DependencyInjection/LoggerPass.php @@ -27,7 +27,9 @@ class LoggerPass implements CompilerPassInterface { public function process(ContainerBuilder $container): void { - $container->setAlias(LoggerInterface::class, 'logger'); + if (!$container->has(LoggerInterface::class)) { + $container->setAlias(LoggerInterface::class, 'logger'); + } if ($container->has('logger')) { return; diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index d473a2e6b04a7..6e9e3fd4ac8ee 100644 --- a/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/src/Symfony/Component/HttpKernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -157,7 +157,7 @@ public function process(ContainerBuilder $container): void continue; } elseif (!$autowire || (!($autowireAttributes ??= $p->getAttributes(Autowire::class, \ReflectionAttribute::IS_INSTANCEOF)) && (!$type || '\\' !== $target[0]))) { continue; - } elseif (is_subclass_of($type, \UnitEnum::class)) { + } elseif (!$autowireAttributes && is_subclass_of($type, \UnitEnum::class)) { // do not attempt to register enum typed arguments if not already present in bindings continue; } elseif (!$p->allowsNull()) { diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 7e8b002079c10..8948fc7533e96 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -73,11 +73,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static array $freshCache = []; - public const VERSION = '7.2.0-DEV'; - public const VERSION_ID = 70200; + public const VERSION = '7.2.8-DEV'; + public const VERSION_ID = 70208; public const MAJOR_VERSION = 7; public const MINOR_VERSION = 2; - public const RELEASE_VERSION = 0; + public const RELEASE_VERSION = 8; public const EXTRA_VERSION = 'DEV'; public const END_OF_MAINTENANCE = '07/2025'; @@ -399,7 +399,8 @@ protected function initializeContainer(): void $cachePath = $cache->getPath(); // Silence E_WARNING to ignore "include" failures - don't use "@" to prevent silencing fatal errors - $errorLevel = error_reporting(\E_ALL ^ \E_WARNING); + $errorLevel = error_reporting(); + error_reporting($errorLevel & ~\E_WARNING); try { if (is_file($cachePath) && \is_object($this->container = include $cachePath) diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php index 8b26767f9ea94..8ed4adfe00567 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/RequestPayloadValueResolverTest.php @@ -22,6 +22,7 @@ use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\Exception\NearMissValueResolverException; use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Encoder\XmlEncoder; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; @@ -395,6 +396,38 @@ public function testQueryStringValidationPassed() $this->assertEquals([$payload], $event->getArguments()); } + public function testQueryStringParameterTypeMismatch() + { + $query = ['price' => 'not a float']; + + $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); + $serializer = new Serializer([$normalizer], ['json' => new JsonEncoder()]); + + $validator = $this->createMock(ValidatorInterface::class); + $validator->expects($this->never())->method('validate'); + + $resolver = new RequestPayloadValueResolver($serializer, $validator); + + $argument = new ArgumentMetadata('invalid', RequestPayload::class, false, false, null, false, [ + MapQueryString::class => new MapQueryString(), + ]); + + $request = Request::create('/', 'GET', $query); + + $kernel = $this->createMock(HttpKernelInterface::class); + $arguments = $resolver->resolve($request, $argument); + $event = new ControllerArgumentsEvent($kernel, function () {}, $arguments, $request, HttpKernelInterface::MAIN_REQUEST); + + try { + $resolver->onKernelControllerArguments($event); + $this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class)); + } catch (HttpException $e) { + $validationFailedException = $e->getPrevious(); + $this->assertInstanceOf(ValidationFailedException::class, $validationFailedException); + $this->assertSame('This value should be of type float.', $validationFailedException->getViolations()[0]->getMessage()); + } + } + public function testRequestInputValidationPassed() { $input = ['price' => '50']; @@ -457,6 +490,38 @@ public function testRequestArrayDenormalization() $this->assertEquals([$payload], $event->getArguments()); } + public function testRequestInputTypeMismatch() + { + $input = ['price' => 'not a float']; + + $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); + $serializer = new Serializer([$normalizer], ['json' => new JsonEncoder()]); + + $validator = $this->createMock(ValidatorInterface::class); + $validator->expects($this->never())->method('validate'); + + $resolver = new RequestPayloadValueResolver($serializer, $validator); + + $argument = new ArgumentMetadata('invalid', RequestPayload::class, false, false, null, false, [ + MapRequestPayload::class => new MapRequestPayload(), + ]); + + $request = Request::create('/', 'POST', $input); + + $kernel = $this->createMock(HttpKernelInterface::class); + $arguments = $resolver->resolve($request, $argument); + $event = new ControllerArgumentsEvent($kernel, function () {}, $arguments, $request, HttpKernelInterface::MAIN_REQUEST); + + try { + $resolver->onKernelControllerArguments($event); + $this->fail(sprintf('Expected "%s" to be thrown.', HttpException::class)); + } catch (HttpException $e) { + $validationFailedException = $e->getPrevious(); + $this->assertInstanceOf(ValidationFailedException::class, $validationFailedException); + $this->assertSame('This value should be of type float.', $validationFailedException->getViolations()[0]->getMessage()); + } + } + public function testItThrowsOnMissingAttributeType() { $serializer = new Serializer(); diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LoggerPassTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LoggerPassTest.php index cb504877cdc44..33227e49cbc7f 100644 --- a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LoggerPassTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LoggerPassTest.php @@ -53,4 +53,15 @@ public function testRegisterLogger() $this->assertSame(Logger::class, $definition->getClass()); $this->assertFalse($definition->isPublic()); } + + public function testAutowiringAliasIsPreserved() + { + $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setAlias(LoggerInterface::class, 'my_logger'); + + (new LoggerPass())->process($container); + + $this->assertSame('my_logger', (string) $container->getAlias(LoggerInterface::class)); + } } diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php index 02b5df6512c5b..af6d49d29c10e 100644 --- a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterControllerArgumentLocatorsPassTest.php @@ -503,13 +503,14 @@ public function testAutowireAttribute() $locator = $container->get($locatorId)->get('foo::fooAction'); - $this->assertCount(9, $locator->getProvidedServices()); + $this->assertCount(10, $locator->getProvidedServices()); $this->assertInstanceOf(\stdClass::class, $locator->get('service1')); $this->assertSame('foo/bar', $locator->get('value')); $this->assertSame('foo', $locator->get('expression')); $this->assertInstanceOf(\stdClass::class, $locator->get('serviceAsValue')); $this->assertInstanceOf(\stdClass::class, $locator->get('expressionAsValue')); $this->assertSame('bar', $locator->get('rawValue')); + $this->stringContains('Symfony_Component_HttpKernel_Tests_Fixtures_Suit_APP_SUIT', $locator->get('suit')); $this->assertSame('@bar', $locator->get('escapedRawValue')); $this->assertSame('foo', $locator->get('customAutowire')); $this->assertInstanceOf(FooInterface::class, $autowireCallable = $locator->get('autowireCallable')); @@ -752,6 +753,8 @@ public function fooAction( \stdClass $expressionAsValue, #[Autowire('bar')] string $rawValue, + #[Autowire(env: 'enum:\Symfony\Component\HttpKernel\Tests\Fixtures\Suit:APP_SUIT')] + Suit $suit, #[Autowire('@@bar')] string $escapedRawValue, #[CustomAutowire('some.parameter')] diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php index fa9885d2753cd..43c740ee12b98 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php @@ -60,8 +60,8 @@ public function testRenderControllerReference() $reference = new ControllerReference('main_controller', [], []); $altReference = new ControllerReference('alt_controller', [], []); - $this->assertEquals( - '', + $this->assertMatchesRegularExpression( + '#^$#', $strategy->render($reference, $request, ['alt' => $altReference])->getContent() ); } @@ -78,8 +78,8 @@ public function testRenderControllerReferenceWithAbsoluteUri() $reference = new ControllerReference('main_controller', [], []); $altReference = new ControllerReference('alt_controller', [], []); - $this->assertSame( - '', + $this->assertMatchesRegularExpression( + '#^$#', $strategy->render($reference, $request, ['alt' => $altReference, 'absolute_uri' => true])->getContent() ); } diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php index f74887ade36f4..8e4b59e5feeb9 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php @@ -32,7 +32,7 @@ public function testRenderWithControllerAndSigner() { $strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo')); - $this->assertEquals('', $strategy->render(new ControllerReference('main_controller', [], []), Request::create('/'))->getContent()); + $this->assertMatchesRegularExpression('#^$#', $strategy->render(new ControllerReference('main_controller', [], []), Request::create('/'))->getContent()); } public function testRenderWithUri() diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php index 4af00f9f75137..7fd04c5a5b0b7 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php @@ -51,8 +51,8 @@ public function testRenderControllerReference() $reference = new ControllerReference('main_controller', [], []); $altReference = new ControllerReference('alt_controller', [], []); - $this->assertEquals( - '', + $this->assertMatchesRegularExpression( + '{^$}', $strategy->render($reference, $request, ['alt' => $altReference])->getContent() ); } @@ -69,8 +69,8 @@ public function testRenderControllerReferenceWithAbsoluteUri() $reference = new ControllerReference('main_controller', [], []); $altReference = new ControllerReference('alt_controller', [], []); - $this->assertSame( - '', + $this->assertMatchesRegularExpression( + '{^$}', $strategy->render($reference, $request, ['alt' => $altReference, 'absolute_uri' => true])->getContent() ); } diff --git a/src/Symfony/Component/Intl/Data/Generator/RegionDataGenerator.php b/src/Symfony/Component/Intl/Data/Generator/RegionDataGenerator.php index 745e074157974..5d484edacc1b7 100644 --- a/src/Symfony/Component/Intl/Data/Generator/RegionDataGenerator.php +++ b/src/Symfony/Component/Intl/Data/Generator/RegionDataGenerator.php @@ -160,7 +160,7 @@ protected function generateDataForMeta(BundleEntryReaderInterface $reader, strin $alpha3ToAlpha2 = array_flip($alpha2ToAlpha3); asort($alpha3ToAlpha2); - $alpha2ToNumeric = $this->generateAlpha2ToNumericMapping($metadataBundle); + $alpha2ToNumeric = $this->generateAlpha2ToNumericMapping(array_flip($this->regionCodes), $metadataBundle); $numericToAlpha2 = []; foreach ($alpha2ToNumeric as $alpha2 => $numeric) { // Add underscore prefix to force keys with leading zeros to remain as string keys. @@ -231,7 +231,7 @@ private function generateAlpha2ToAlpha3Mapping(array $countries, ArrayAccessible return $alpha2ToAlpha3; } - private function generateAlpha2ToNumericMapping(ArrayAccessibleResourceBundle $metadataBundle): array + private function generateAlpha2ToNumericMapping(array $countries, ArrayAccessibleResourceBundle $metadataBundle): array { $aliases = iterator_to_array($metadataBundle['alias']['territory']); @@ -250,6 +250,10 @@ private function generateAlpha2ToNumericMapping(ArrayAccessibleResourceBundle $m continue; } + if (!isset($countries[$data['replacement']])) { + continue; + } + if ('deprecated' === $data['reason']) { continue; } diff --git a/src/Symfony/Component/Intl/Resources/data/currencies/en_NO.php b/src/Symfony/Component/Intl/Resources/data/currencies/en_NO.php new file mode 100644 index 0000000000000..dc28340678e53 --- /dev/null +++ b/src/Symfony/Component/Intl/Resources/data/currencies/en_NO.php @@ -0,0 +1,10 @@ + [ + 'NOK' => [ + 'kr', + 'Norwegian Krone', + ], + ], +]; diff --git a/src/Symfony/Component/Intl/Resources/data/git-info.txt b/src/Symfony/Component/Intl/Resources/data/git-info.txt index 544ed3b9bd16c..79792d95115f2 100644 --- a/src/Symfony/Component/Intl/Resources/data/git-info.txt +++ b/src/Symfony/Component/Intl/Resources/data/git-info.txt @@ -2,6 +2,6 @@ Git information =============== URL: https://github.com/unicode-org/icu.git -Revision: 8eca245c7484ac6cc179e3e5f7c1ea7680810f39 -Author: Rahul Pandey -Date: 2024-10-21T16:21:38+05:30 +Revision: 457157a92aa053e632cc7fcfd0e12f8a943b2d11 +Author: Mihai Nita +Date: 2025-03-10T19:11:46+00:00 diff --git a/src/Symfony/Component/Intl/Resources/data/languages/en.php b/src/Symfony/Component/Intl/Resources/data/languages/en.php index 007037355de05..51cccde39b1f2 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/en.php +++ b/src/Symfony/Component/Intl/Resources/data/languages/en.php @@ -127,7 +127,6 @@ 'csw' => 'Swampy Cree', 'cu' => 'Church Slavic', 'cv' => 'Chuvash', - 'cwd' => 'Woods Cree', 'cy' => 'Welsh', 'da' => 'Danish', 'dak' => 'Dakota', @@ -217,7 +216,6 @@ 'hak' => 'Hakka Chinese', 'haw' => 'Hawaiian', 'hax' => 'Southern Haida', - 'hdn' => 'Northern Haida', 'he' => 'Hebrew', 'hi' => 'Hindi', 'hif' => 'Fiji Hindi', @@ -243,7 +241,6 @@ 'ig' => 'Igbo', 'ii' => 'Sichuan Yi', 'ik' => 'Inupiaq', - 'ike' => 'Eastern Canadian Inuktitut', 'ikt' => 'Western Canadian Inuktitut', 'ilo' => 'Iloko', 'inh' => 'Ingush', @@ -426,7 +423,6 @@ 'oj' => 'Ojibwa', 'ojb' => 'Northwestern Ojibwa', 'ojc' => 'Central Ojibwa', - 'ojg' => 'Eastern Ojibwa', 'ojs' => 'Oji-Cree', 'ojw' => 'Western Ojibwa', 'oka' => 'Okanagan', diff --git a/src/Symfony/Component/Intl/Resources/data/languages/fi.php b/src/Symfony/Component/Intl/Resources/data/languages/fi.php index 2def41ef102d6..5a8726d1eeb3b 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/fi.php +++ b/src/Symfony/Component/Intl/Resources/data/languages/fi.php @@ -14,7 +14,6 @@ 'afh' => 'afrihili', 'agq' => 'aghem', 'ain' => 'ainu', - 'ajp' => 'urduni', 'ak' => 'akan', 'akk' => 'akkadi', 'akz' => 'alabama', @@ -26,6 +25,7 @@ 'ang' => 'muinaisenglanti', 'ann' => 'obolo', 'anp' => 'angika', + 'apc' => 'urduni', 'ar' => 'arabia', 'arc' => 'valtakunnanaramea', 'arn' => 'mapudungun', diff --git a/src/Symfony/Component/Intl/Resources/data/languages/meta.php b/src/Symfony/Component/Intl/Resources/data/languages/meta.php index 7874969d3f968..764905aa1dcd3 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/meta.php +++ b/src/Symfony/Component/Intl/Resources/data/languages/meta.php @@ -14,7 +14,6 @@ 'afh', 'agq', 'ain', - 'ajp', 'ak', 'akk', 'akz', @@ -129,7 +128,6 @@ 'csw', 'cu', 'cv', - 'cwd', 'cy', 'da', 'dak', @@ -219,7 +217,6 @@ 'hak', 'haw', 'hax', - 'hdn', 'he', 'hi', 'hif', @@ -245,7 +242,6 @@ 'ig', 'ii', 'ik', - 'ike', 'ikt', 'ilo', 'inh', @@ -430,7 +426,6 @@ 'oj', 'ojb', 'ojc', - 'ojg', 'ojs', 'ojw', 'oka', @@ -657,7 +652,6 @@ 'afr', 'agq', 'ain', - 'ajp', 'aka', 'akk', 'akz', @@ -775,7 +769,6 @@ 'crs', 'csb', 'csw', - 'cwd', 'cym', 'dak', 'dan', @@ -866,7 +859,6 @@ 'haw', 'hax', 'hbs', - 'hdn', 'heb', 'her', 'hif', @@ -888,7 +880,6 @@ 'ibo', 'ido', 'iii', - 'ike', 'ikt', 'iku', 'ile', @@ -1076,7 +1067,6 @@ 'oci', 'ojb', 'ojc', - 'ojg', 'oji', 'ojs', 'ojw', diff --git a/src/Symfony/Component/Intl/Resources/data/languages/nl.php b/src/Symfony/Component/Intl/Resources/data/languages/nl.php index 9f9e5de5ad8a1..5d2d48d4a65cd 100644 --- a/src/Symfony/Component/Intl/Resources/data/languages/nl.php +++ b/src/Symfony/Component/Intl/Resources/data/languages/nl.php @@ -14,7 +14,6 @@ 'afh' => 'Afrihili', 'agq' => 'Aghem', 'ain' => 'Aino', - 'ajp' => 'Zuid-Levantijns-Arabisch', 'ak' => 'Akan', 'akk' => 'Akkadisch', 'akz' => 'Alabama', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/af.php b/src/Symfony/Component/Intl/Resources/data/locales/af.php index af7e5f0433167..953b57d43622d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/af.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/af.php @@ -121,29 +121,35 @@ 'en_CM' => 'Engels (Kameroen)', 'en_CX' => 'Engels (Kerseiland)', 'en_CY' => 'Engels (Siprus)', + 'en_CZ' => 'Engels (Tsjeggië)', 'en_DE' => 'Engels (Duitsland)', 'en_DK' => 'Engels (Denemarke)', 'en_DM' => 'Engels (Dominica)', 'en_ER' => 'Engels (Eritrea)', + 'en_ES' => 'Engels (Spanje)', 'en_FI' => 'Engels (Finland)', 'en_FJ' => 'Engels (Fidji)', 'en_FK' => 'Engels (Falklandeilande)', 'en_FM' => 'Engels (Mikronesië)', + 'en_FR' => 'Engels (Frankryk)', 'en_GB' => 'Engels (Verenigde Koninkryk)', 'en_GD' => 'Engels (Grenada)', 'en_GG' => 'Engels (Guernsey)', 'en_GH' => 'Engels (Ghana)', 'en_GI' => 'Engels (Gibraltar)', 'en_GM' => 'Engels (Gambië)', + 'en_GS' => 'Engels (Suid-Georgië en die Suidelike Sandwicheilande)', 'en_GU' => 'Engels (Guam)', 'en_GY' => 'Engels (Guyana)', 'en_HK' => 'Engels (Hongkong SAS China)', + 'en_HU' => 'Engels (Hongarye)', 'en_ID' => 'Engels (Indonesië)', 'en_IE' => 'Engels (Ierland)', 'en_IL' => 'Engels (Israel)', 'en_IM' => 'Engels (Eiland Man)', 'en_IN' => 'Engels (Indië)', 'en_IO' => 'Engels (Brits-Indiese Oseaangebied)', + 'en_IT' => 'Engels (Italië)', 'en_JE' => 'Engels (Jersey)', 'en_JM' => 'Engels (Jamaika)', 'en_KE' => 'Engels (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Engels (Norfolkeiland)', 'en_NG' => 'Engels (Nigerië)', 'en_NL' => 'Engels (Nederland)', + 'en_NO' => 'Engels (Noorweë)', 'en_NR' => 'Engels (Nauru)', 'en_NU' => 'Engels (Niue)', 'en_NZ' => 'Engels (Nieu-Seeland)', 'en_PG' => 'Engels (Papoea-Nieu-Guinee)', 'en_PH' => 'Engels (Filippyne)', 'en_PK' => 'Engels (Pakistan)', + 'en_PL' => 'Engels (Pole)', 'en_PN' => 'Engels (Pitcairneilande)', 'en_PR' => 'Engels (Puerto Rico)', + 'en_PT' => 'Engels (Portugal)', 'en_PW' => 'Engels (Palau)', + 'en_RO' => 'Engels (Roemenië)', 'en_RW' => 'Engels (Rwanda)', 'en_SB' => 'Engels (Salomonseilande)', 'en_SC' => 'Engels (Seychelle)', @@ -184,6 +194,7 @@ 'en_SG' => 'Engels (Singapoer)', 'en_SH' => 'Engels (Sint Helena)', 'en_SI' => 'Engels (Slowenië)', + 'en_SK' => 'Engels (Slowakye)', 'en_SL' => 'Engels (Sierra Leone)', 'en_SS' => 'Engels (Suid-Soedan)', 'en_SX' => 'Engels (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ak.php b/src/Symfony/Component/Intl/Resources/data/locales/ak.php index 5818fcbaf5fe7..de90104f6d07d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ak.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ak.php @@ -109,29 +109,35 @@ 'en_CM' => 'Borɔfo (Kamɛrun)', 'en_CX' => 'Borɔfo (Buronya Supɔ)', 'en_CY' => 'Borɔfo (Saeprɔso)', + 'en_CZ' => 'Borɔfo (Kyɛk)', 'en_DE' => 'Borɔfo (Gyaaman)', 'en_DK' => 'Borɔfo (Dɛnmak)', 'en_DM' => 'Borɔfo (Dɔmeneka)', 'en_ER' => 'Borɔfo (Ɛritrea)', + 'en_ES' => 'Borɔfo (Spain)', 'en_FI' => 'Borɔfo (Finland)', 'en_FJ' => 'Borɔfo (Figyi)', 'en_FK' => 'Borɔfo (Fɔkman Aeland)', 'en_FM' => 'Borɔfo (Maekronehyia)', + 'en_FR' => 'Borɔfo (Franse)', 'en_GB' => 'Borɔfo (UK)', 'en_GD' => 'Borɔfo (Grenada)', 'en_GG' => 'Borɔfo (Guɛnse)', 'en_GH' => 'Borɔfo (Gaana)', 'en_GI' => 'Borɔfo (Gyebralta)', 'en_GM' => 'Borɔfo (Gambia)', + 'en_GS' => 'Borɔfo (Gyɔɔgyia Anaafoɔ ne Sandwich Aeland Anaafoɔ)', 'en_GU' => 'Borɔfo (Guam)', 'en_GY' => 'Borɔfo (Gayana)', 'en_HK' => 'Borɔfo (Hɔnkɔn Kyaena)', + 'en_HU' => 'Borɔfo (Hangari)', 'en_ID' => 'Borɔfo (Indɔnehyia)', 'en_IE' => 'Borɔfo (Aereland)', 'en_IL' => 'Borɔfo (Israe)', 'en_IM' => 'Borɔfo (Isle of Man)', 'en_IN' => 'Borɔfo (India)', 'en_IO' => 'Borɔfo (Britenfo Man Wɔ India Po No Mu)', + 'en_IT' => 'Borɔfo (Itali)', 'en_JE' => 'Borɔfo (Gyɛsi)', 'en_JM' => 'Borɔfo (Gyameka)', 'en_KE' => 'Borɔfo (Kenya)', @@ -155,15 +161,19 @@ 'en_NF' => 'Borɔfo (Norfold Supɔ)', 'en_NG' => 'Borɔfo (Naegyeria)', 'en_NL' => 'Borɔfo (Nɛdɛland)', + 'en_NO' => 'Borɔfo (Nɔɔwe)', 'en_NR' => 'Borɔfo (Naworu)', 'en_NU' => 'Borɔfo (Niyu)', 'en_NZ' => 'Borɔfo (Ziland Foforo)', 'en_PG' => 'Borɔfo (Papua Gini Foforɔ)', 'en_PH' => 'Borɔfo (Filipin)', 'en_PK' => 'Borɔfo (Pakistan)', + 'en_PL' => 'Borɔfo (Pɔland)', 'en_PN' => 'Borɔfo (Pitkaan Nsupɔ)', 'en_PR' => 'Borɔ 10000 fo (Puɛto Riko)', + 'en_PT' => 'Borɔfo (Pɔtugal)', 'en_PW' => 'Borɔfo (Palau)', + 'en_RO' => 'Borɔfo (Romenia)', 'en_RW' => 'Borɔfo (Rewanda)', 'en_SB' => 'Borɔfo (Solomɔn Aeland)', 'en_SC' => 'Borɔfo (Seyhyɛl)', @@ -172,6 +182,7 @@ 'en_SG' => 'Borɔfo (Singapɔ)', 'en_SH' => 'Borɔfo (Saint Helena)', 'en_SI' => 'Borɔfo (Slovinia)', + 'en_SK' => 'Borɔfo (Slovakia)', 'en_SL' => 'Borɔfo (Sɛra Liɔn)', 'en_SS' => 'Borɔfo (Sudan Anaafoɔ)', 'en_SX' => 'Borɔfo (Sint Maaten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/am.php b/src/Symfony/Component/Intl/Resources/data/locales/am.php index 1ad535f46e81e..beb9399a7465a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/am.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/am.php @@ -121,29 +121,35 @@ 'en_CM' => 'እንግሊዝኛ (ካሜሩን)', 'en_CX' => 'እንግሊዝኛ (ክሪስማስ ደሴት)', 'en_CY' => 'እንግሊዝኛ (ሳይፕረስ)', + 'en_CZ' => 'እንግሊዝኛ (ቼቺያ)', 'en_DE' => 'እንግሊዝኛ (ጀርመን)', 'en_DK' => 'እንግሊዝኛ (ዴንማርክ)', 'en_DM' => 'እንግሊዝኛ (ዶሚኒካ)', 'en_ER' => 'እንግሊዝኛ (ኤርትራ)', + 'en_ES' => 'እንግሊዝኛ (ስፔን)', 'en_FI' => 'እንግሊዝኛ (ፊንላንድ)', 'en_FJ' => 'እንግሊዝኛ (ፊጂ)', 'en_FK' => 'እንግሊዝኛ (የፎክላንድ ደሴቶች)', 'en_FM' => 'እንግሊዝኛ (ማይክሮኔዢያ)', + 'en_FR' => 'እንግሊዝኛ (ፈረንሳይ)', 'en_GB' => 'እንግሊዝኛ (ዩናይትድ ኪንግደም)', 'en_GD' => 'እንግሊዝኛ (ግሬናዳ)', 'en_GG' => 'እንግሊዝኛ (ጉርነሲ)', 'en_GH' => 'እንግሊዝኛ (ጋና)', 'en_GI' => 'እንግሊዝኛ (ጂብራልተር)', 'en_GM' => 'እንግሊዝኛ (ጋምቢያ)', + 'en_GS' => 'እንግሊዝኛ (ደቡብ ጆርጂያ እና የደቡብ ሳንድዊች ደሴቶች)', 'en_GU' => 'እንግሊዝኛ (ጉዋም)', 'en_GY' => 'እንግሊዝኛ (ጉያና)', 'en_HK' => 'እንግሊዝኛ (ሆንግ ኮንግ ልዩ የአስተዳደር ክልል ቻይና)', + 'en_HU' => 'እንግሊዝኛ (ሀንጋሪ)', 'en_ID' => 'እንግሊዝኛ (ኢንዶኔዢያ)', 'en_IE' => 'እንግሊዝኛ (አየርላንድ)', 'en_IL' => 'እንግሊዝኛ (እስራኤል)', 'en_IM' => 'እንግሊዝኛ (አይል ኦፍ ማን)', 'en_IN' => 'እንግሊዝኛ (ህንድ)', 'en_IO' => 'እንግሊዝኛ (የብሪታኒያ ህንድ ውቂያኖስ ግዛት)', + 'en_IT' => 'እንግሊዝኛ (ጣሊያን)', 'en_JE' => 'እንግሊዝኛ (ጀርዚ)', 'en_JM' => 'እንግሊዝኛ (ጃማይካ)', 'en_KE' => 'እንግሊዝኛ (ኬንያ)', @@ -167,15 +173,19 @@ 'en_NF' => 'እንግሊዝኛ (ኖርፎልክ ደሴት)', 'en_NG' => 'እንግሊዝኛ (ናይጄሪያ)', 'en_NL' => 'እንግሊዝኛ (ኔዘርላንድ)', + 'en_NO' => 'እንግሊዝኛ (ኖርዌይ)', 'en_NR' => 'እንግሊዝኛ (ናኡሩ)', 'en_NU' => 'እንግሊዝኛ (ኒዌ)', 'en_NZ' => 'እንግሊዝኛ (ኒው ዚላንድ)', 'en_PG' => 'እንግሊዝኛ (ፓፑዋ ኒው ጊኒ)', 'en_PH' => 'እንግሊዝኛ (ፊሊፒንስ)', 'en_PK' => 'እንግሊዝኛ (ፓኪስታን)', + 'en_PL' => 'እንግሊዝኛ (ፖላንድ)', 'en_PN' => 'እንግሊዝኛ (ፒትካኢርን ደሴቶች)', 'en_PR' => 'እንግሊዝኛ (ፑዌርቶ ሪኮ)', + 'en_PT' => 'እንግሊዝኛ (ፖርቱጋል)', 'en_PW' => 'እንግሊዝኛ (ፓላው)', + 'en_RO' => 'እንግሊዝኛ (ሮሜኒያ)', 'en_RW' => 'እንግሊዝኛ (ሩዋንዳ)', 'en_SB' => 'እንግሊዝኛ (ሰለሞን ደሴቶች)', 'en_SC' => 'እንግሊዝኛ (ሲሼልስ)', @@ -184,6 +194,7 @@ 'en_SG' => 'እንግሊዝኛ (ሲንጋፖር)', 'en_SH' => 'እንግሊዝኛ (ሴንት ሄለና)', 'en_SI' => 'እንግሊዝኛ (ስሎቬኒያ)', + 'en_SK' => 'እንግሊዝኛ (ስሎቫኪያ)', 'en_SL' => 'እንግሊዝኛ (ሴራሊዮን)', 'en_SS' => 'እንግሊዝኛ (ደቡብ ሱዳን)', 'en_SX' => 'እንግሊዝኛ (ሲንት ማርተን)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ar.php b/src/Symfony/Component/Intl/Resources/data/locales/ar.php index 8d51b9638bdfc..fe5b49cc01747 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ar.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ar.php @@ -121,29 +121,35 @@ 'en_CM' => 'الإنجليزية (الكاميرون)', 'en_CX' => 'الإنجليزية (جزيرة كريسماس)', 'en_CY' => 'الإنجليزية (قبرص)', + 'en_CZ' => 'الإنجليزية (التشيك)', 'en_DE' => 'الإنجليزية (ألمانيا)', 'en_DK' => 'الإنجليزية (الدانمرك)', 'en_DM' => 'الإنجليزية (دومينيكا)', 'en_ER' => 'الإنجليزية (إريتريا)', + 'en_ES' => 'الإنجليزية (إسبانيا)', 'en_FI' => 'الإنجليزية (فنلندا)', 'en_FJ' => 'الإنجليزية (فيجي)', 'en_FK' => 'الإنجليزية (جزر فوكلاند)', 'en_FM' => 'الإنجليزية (ميكرونيزيا)', + 'en_FR' => 'الإنجليزية (فرنسا)', 'en_GB' => 'الإنجليزية (المملكة المتحدة)', 'en_GD' => 'الإنجليزية (غرينادا)', 'en_GG' => 'الإنجليزية (غيرنزي)', 'en_GH' => 'الإنجليزية (غانا)', 'en_GI' => 'الإنجليزية (جبل طارق)', 'en_GM' => 'الإنجليزية (غامبيا)', + 'en_GS' => 'الإنجليزية (جورجيا الجنوبية وجزر ساندويتش الجنوبية)', 'en_GU' => 'الإنجليزية (غوام)', 'en_GY' => 'الإنجليزية (غيانا)', 'en_HK' => 'الإنجليزية (هونغ كونغ الصينية [منطقة إدارية خاصة])', + 'en_HU' => 'الإنجليزية (هنغاريا)', 'en_ID' => 'الإنجليزية (إندونيسيا)', 'en_IE' => 'الإنجليزية (أيرلندا)', 'en_IL' => 'الإنجليزية (إسرائيل)', 'en_IM' => 'الإنجليزية (جزيرة مان)', 'en_IN' => 'الإنجليزية (الهند)', 'en_IO' => 'الإنجليزية (الإقليم البريطاني في المحيط الهندي)', + 'en_IT' => 'الإنجليزية (إيطاليا)', 'en_JE' => 'الإنجليزية (جيرسي)', 'en_JM' => 'الإنجليزية (جامايكا)', 'en_KE' => 'الإنجليزية (كينيا)', @@ -167,15 +173,19 @@ 'en_NF' => 'الإنجليزية (جزيرة نورفولك)', 'en_NG' => 'الإنجليزية (نيجيريا)', 'en_NL' => 'الإنجليزية (هولندا)', + 'en_NO' => 'الإنجليزية (النرويج)', 'en_NR' => 'الإنجليزية (ناورو)', 'en_NU' => 'الإنجليزية (نيوي)', 'en_NZ' => 'الإنجليزية (نيوزيلندا)', 'en_PG' => 'الإنجليزية (بابوا غينيا الجديدة)', 'en_PH' => 'الإنجليزية (الفلبين)', 'en_PK' => 'الإنجليزية (باكستان)', + 'en_PL' => 'الإنجليزية (بولندا)', 'en_PN' => 'الإنجليزية (جزر بيتكيرن)', 'en_PR' => 'الإنجليزية (بورتوريكو)', + 'en_PT' => 'الإنجليزية (البرتغال)', 'en_PW' => 'الإنجليزية (بالاو)', + 'en_RO' => 'الإنجليزية (رومانيا)', 'en_RW' => 'الإنجليزية (رواندا)', 'en_SB' => 'الإنجليزية (جزر سليمان)', 'en_SC' => 'الإنجليزية (سيشل)', @@ -184,6 +194,7 @@ 'en_SG' => 'الإنجليزية (سنغافورة)', 'en_SH' => 'الإنجليزية (سانت هيلينا)', 'en_SI' => 'الإنجليزية (سلوفينيا)', + 'en_SK' => 'الإنجليزية (سلوفاكيا)', 'en_SL' => 'الإنجليزية (سيراليون)', 'en_SS' => 'الإنجليزية (جنوب السودان)', 'en_SX' => 'الإنجليزية (سانت مارتن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/as.php b/src/Symfony/Component/Intl/Resources/data/locales/as.php index 1480243c08c6e..800506d9a78d6 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/as.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/as.php @@ -121,29 +121,35 @@ 'en_CM' => 'ইংৰাজী (কেমেৰুণ)', 'en_CX' => 'ইংৰাজী (খ্ৰীষ্টমাছ দ্বীপ)', 'en_CY' => 'ইংৰাজী (চাইপ্ৰাছ)', + 'en_CZ' => 'ইংৰাজী (চিজেচিয়া)', 'en_DE' => 'ইংৰাজী (জাৰ্মানী)', 'en_DK' => 'ইংৰাজী (ডেনমাৰ্ক)', 'en_DM' => 'ইংৰাজী (ড’মিনিকা)', 'en_ER' => 'ইংৰাজী (এৰিত্ৰিয়া)', + 'en_ES' => 'ইংৰাজী (স্পেইন)', 'en_FI' => 'ইংৰাজী (ফিনলেণ্ড)', 'en_FJ' => 'ইংৰাজী (ফিজি)', 'en_FK' => 'ইংৰাজী (ফকলেণ্ড দ্বীপপুঞ্জ)', 'en_FM' => 'ইংৰাজী (মাইক্ৰোনেচিয়া)', + 'en_FR' => 'ইংৰাজী (ফ্ৰান্স)', 'en_GB' => 'ইংৰাজী (সংযুক্ত ৰাজ্য)', 'en_GD' => 'ইংৰাজী (গ্ৰেনাডা)', 'en_GG' => 'ইংৰাজী (গোৰেনচি)', 'en_GH' => 'ইংৰাজী (ঘানা)', 'en_GI' => 'ইংৰাজী (জিব্ৰাল্টৰ)', 'en_GM' => 'ইংৰাজী (গাম্বিয়া)', + 'en_GS' => 'ইংৰাজী (দক্ষিণ জৰ্জিয়া আৰু দক্ষিণ চেণ্ডৱিচ দ্বীপপুঞ্জ)', 'en_GU' => 'ইংৰাজী (গুৱাম)', 'en_GY' => 'ইংৰাজী (গায়ানা)', 'en_HK' => 'ইংৰাজী (হং কং এছ. এ. আৰ. চীন)', + 'en_HU' => 'ইংৰাজী (হাংগেৰী)', 'en_ID' => 'ইংৰাজী (ইণ্ডোনেচিয়া)', 'en_IE' => 'ইংৰাজী (আয়াৰলেণ্ড)', 'en_IL' => 'ইংৰাজী (ইজৰাইল)', 'en_IM' => 'ইংৰাজী (আইল অফ মেন)', 'en_IN' => 'ইংৰাজী (ভাৰত)', 'en_IO' => 'ইংৰাজী (ব্ৰিটিছ ইণ্ডিয়ান অ’চন টেৰিট’ৰি)', + 'en_IT' => 'ইংৰাজী (ইটালি)', 'en_JE' => 'ইংৰাজী (জাৰ্চি)', 'en_JM' => 'ইংৰাজী (জামাইকা)', 'en_KE' => 'ইংৰাজী (কেনিয়া)', @@ -167,15 +173,19 @@ 'en_NF' => 'ইংৰাজী (ন’ৰফ’ক দ্বীপ)', 'en_NG' => 'ইংৰাজী (নাইজেৰিয়া)', 'en_NL' => 'ইংৰাজী (নেডাৰলেণ্ড)', + 'en_NO' => 'ইংৰাজী (নৰৱে)', 'en_NR' => 'ইংৰাজী (নাউৰু)', 'en_NU' => 'ইংৰাজী (নিউ)', 'en_NZ' => 'ইংৰাজী (নিউজিলেণ্ড)', 'en_PG' => 'ইংৰাজী (পাপুৱা নিউ গিনি)', 'en_PH' => 'ইংৰাজী (ফিলিপাইনছ)', 'en_PK' => 'ইংৰাজী (পাকিস্তান)', + 'en_PL' => 'ইংৰাজী (পোলেণ্ড)', 'en_PN' => 'ইংৰাজী (পিটকেইৰ্ণ দ্বীপপুঞ্জ)', 'en_PR' => 'ইংৰাজী (পুৱেৰ্টো ৰিকো)', + 'en_PT' => 'ইংৰাজী (পৰ্তুগাল)', 'en_PW' => 'ইংৰাজী (পালাউ)', + 'en_RO' => 'ইংৰাজী (ৰোমানিয়া)', 'en_RW' => 'ইংৰাজী (ৰোৱাণ্ডা)', 'en_SB' => 'ইংৰাজী (চোলোমোন দ্বীপপুঞ্জ)', 'en_SC' => 'ইংৰাজী (ছিচিলিছ)', @@ -184,6 +194,7 @@ 'en_SG' => 'ইংৰাজী (ছিংগাপুৰ)', 'en_SH' => 'ইংৰাজী (ছেইণ্ট হেলেনা)', 'en_SI' => 'ইংৰাজী (শ্লোভেনিয়া)', + 'en_SK' => 'ইংৰাজী (শ্লোভাকিয়া)', 'en_SL' => 'ইংৰাজী (চিয়েৰা লিঅ’ন)', 'en_SS' => 'ইংৰাজী (দক্ষিণ চুডান)', 'en_SX' => 'ইংৰাজী (চিণ্ট মাৰ্টেন)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/az.php b/src/Symfony/Component/Intl/Resources/data/locales/az.php index 869262233ffbb..6e7d9e635edf1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/az.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/az.php @@ -121,29 +121,35 @@ 'en_CM' => 'ingilis (Kamerun)', 'en_CX' => 'ingilis (Milad adası)', 'en_CY' => 'ingilis (Kipr)', + 'en_CZ' => 'ingilis (Çexiya)', 'en_DE' => 'ingilis (Almaniya)', 'en_DK' => 'ingilis (Danimarka)', 'en_DM' => 'ingilis (Dominika)', 'en_ER' => 'ingilis (Eritreya)', + 'en_ES' => 'ingilis (İspaniya)', 'en_FI' => 'ingilis (Finlandiya)', 'en_FJ' => 'ingilis (Fici)', 'en_FK' => 'ingilis (Folklend adaları)', 'en_FM' => 'ingilis (Mikroneziya)', + 'en_FR' => 'ingilis (Fransa)', 'en_GB' => 'ingilis (Birləşmiş Krallıq)', 'en_GD' => 'ingilis (Qrenada)', 'en_GG' => 'ingilis (Gernsi)', 'en_GH' => 'ingilis (Qana)', 'en_GI' => 'ingilis (Cəbəllütariq)', 'en_GM' => 'ingilis (Qambiya)', + 'en_GS' => 'ingilis (Cənubi Corciya və Cənubi Sendviç adaları)', 'en_GU' => 'ingilis (Quam)', 'en_GY' => 'ingilis (Qayana)', 'en_HK' => 'ingilis (Honq Konq Xüsusi İnzibati Rayonu Çin)', + 'en_HU' => 'ingilis (Macarıstan)', 'en_ID' => 'ingilis (İndoneziya)', 'en_IE' => 'ingilis (İrlandiya)', 'en_IL' => 'ingilis (İsrail)', 'en_IM' => 'ingilis (Men adası)', 'en_IN' => 'ingilis (Hindistan)', 'en_IO' => 'ingilis (Britaniyanın Hind Okeanı Ərazisi)', + 'en_IT' => 'ingilis (İtaliya)', 'en_JE' => 'ingilis (Cersi)', 'en_JM' => 'ingilis (Yamayka)', 'en_KE' => 'ingilis (Keniya)', @@ -167,15 +173,19 @@ 'en_NF' => 'ingilis (Norfolk adası)', 'en_NG' => 'ingilis (Nigeriya)', 'en_NL' => 'ingilis (Niderland)', + 'en_NO' => 'ingilis (Norveç)', 'en_NR' => 'ingilis (Nauru)', 'en_NU' => 'ingilis (Niue)', 'en_NZ' => 'ingilis (Yeni Zelandiya)', 'en_PG' => 'ingilis (Papua-Yeni Qvineya)', 'en_PH' => 'ingilis (Filippin)', 'en_PK' => 'ingilis (Pakistan)', + 'en_PL' => 'ingilis (Polşa)', 'en_PN' => 'ingilis (Pitkern adaları)', 'en_PR' => 'ingilis (Puerto Riko)', + 'en_PT' => 'ingilis (Portuqaliya)', 'en_PW' => 'ingilis (Palau)', + 'en_RO' => 'ingilis (Rumıniya)', 'en_RW' => 'ingilis (Ruanda)', 'en_SB' => 'ingilis (Solomon adaları)', 'en_SC' => 'ingilis (Seyşel adaları)', @@ -184,6 +194,7 @@ 'en_SG' => 'ingilis (Sinqapur)', 'en_SH' => 'ingilis (Müqəddəs Yelena)', 'en_SI' => 'ingilis (Sloveniya)', + 'en_SK' => 'ingilis (Slovakiya)', 'en_SL' => 'ingilis (Syerra-Leone)', 'en_SS' => 'ingilis (Cənubi Sudan)', 'en_SX' => 'ingilis (Sint-Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/az_Cyrl.php b/src/Symfony/Component/Intl/Resources/data/locales/az_Cyrl.php index f134cf28121b3..c9a118160f581 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/az_Cyrl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/az_Cyrl.php @@ -121,29 +121,35 @@ 'en_CM' => 'инҝилис (Камерун)', 'en_CX' => 'инҝилис (Милад адасы)', 'en_CY' => 'инҝилис (Кипр)', + 'en_CZ' => 'инҝилис (Чехија)', 'en_DE' => 'инҝилис (Алманија)', 'en_DK' => 'инҝилис (Данимарка)', 'en_DM' => 'инҝилис (Доминика)', 'en_ER' => 'инҝилис (Еритреја)', + 'en_ES' => 'инҝилис (Испанија)', 'en_FI' => 'инҝилис (Финландија)', 'en_FJ' => 'инҝилис (Фиҹи)', 'en_FK' => 'инҝилис (Фолкленд адалары)', 'en_FM' => 'инҝилис (Микронезија)', + 'en_FR' => 'инҝилис (Франса)', 'en_GB' => 'инҝилис (Бирләшмиш Краллыг)', 'en_GD' => 'инҝилис (Гренада)', 'en_GG' => 'инҝилис (Ҝернси)', 'en_GH' => 'инҝилис (Гана)', 'en_GI' => 'инҝилис (Ҹәбәллүтариг)', 'en_GM' => 'инҝилис (Гамбија)', + 'en_GS' => 'инҝилис (Ҹәнуби Ҹорҹија вә Ҹәнуби Сендвич адалары)', 'en_GU' => 'инҝилис (Гуам)', 'en_GY' => 'инҝилис (Гајана)', 'en_HK' => 'инҝилис (Һонк Конг Хүсуси Инзибати Әрази Чин)', + 'en_HU' => 'инҝилис (Маҹарыстан)', 'en_ID' => 'инҝилис (Индонезија)', 'en_IE' => 'инҝилис (Ирландија)', 'en_IL' => 'инҝилис (Исраил)', 'en_IM' => 'инҝилис (Мен адасы)', 'en_IN' => 'инҝилис (Һиндистан)', 'en_IO' => 'инҝилис (Britaniyanın Hind Okeanı Ərazisi)', + 'en_IT' => 'инҝилис (Италија)', 'en_JE' => 'инҝилис (Ҹерси)', 'en_JM' => 'инҝилис (Јамајка)', 'en_KE' => 'инҝилис (Кенија)', @@ -167,15 +173,19 @@ 'en_NF' => 'инҝилис (Норфолк адасы)', 'en_NG' => 'инҝилис (Ниҝерија)', 'en_NL' => 'инҝилис (Нидерланд)', + 'en_NO' => 'инҝилис (Норвеч)', 'en_NR' => 'инҝилис (Науру)', 'en_NU' => 'инҝилис (Ниуе)', 'en_NZ' => 'инҝилис (Јени Зеландија)', 'en_PG' => 'инҝилис (Папуа-Јени Гвинеја)', 'en_PH' => 'инҝилис (Филиппин)', 'en_PK' => 'инҝилис (Пакистан)', + 'en_PL' => 'инҝилис (Полша)', 'en_PN' => 'инҝилис (Питкерн адалары)', 'en_PR' => 'инҝилис (Пуерто Рико)', + 'en_PT' => 'инҝилис (Португалија)', 'en_PW' => 'инҝилис (Палау)', + 'en_RO' => 'инҝилис (Румынија)', 'en_RW' => 'инҝилис (Руанда)', 'en_SB' => 'инҝилис (Соломон адалары)', 'en_SC' => 'инҝилис (Сејшел адалары)', @@ -184,6 +194,7 @@ 'en_SG' => 'инҝилис (Сингапур)', 'en_SH' => 'инҝилис (Мүгәддәс Јелена)', 'en_SI' => 'инҝилис (Словенија)', + 'en_SK' => 'инҝилис (Словакија)', 'en_SL' => 'инҝилис (Сјерра-Леоне)', 'en_SS' => 'инҝилис (Ҹәнуби Судан)', 'en_SX' => 'инҝилис (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/be.php b/src/Symfony/Component/Intl/Resources/data/locales/be.php index 3cfa30b6305e5..66d07aa118847 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/be.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/be.php @@ -121,29 +121,35 @@ 'en_CM' => 'англійская (Камерун)', 'en_CX' => 'англійская (Востраў Каляд)', 'en_CY' => 'англійская (Кіпр)', + 'en_CZ' => 'англійская (Чэхія)', 'en_DE' => 'англійская (Германія)', 'en_DK' => 'англійская (Данія)', 'en_DM' => 'англійская (Дамініка)', 'en_ER' => 'англійская (Эрытрэя)', + 'en_ES' => 'англійская (Іспанія)', 'en_FI' => 'англійская (Фінляндыя)', 'en_FJ' => 'англійская (Фіджы)', 'en_FK' => 'англійская (Фалклендскія астравы)', 'en_FM' => 'англійская (Мікранезія)', + 'en_FR' => 'англійская (Францыя)', 'en_GB' => 'англійская (Вялікабрытанія)', 'en_GD' => 'англійская (Грэнада)', 'en_GG' => 'англійская (Гернсі)', 'en_GH' => 'англійская (Гана)', 'en_GI' => 'англійская (Гібралтар)', 'en_GM' => 'англійская (Гамбія)', + 'en_GS' => 'англійская (Паўднёвая Георгія і Паўднёвыя Сандвічавы астравы)', 'en_GU' => 'англійская (Гуам)', 'en_GY' => 'англійская (Гаяна)', 'en_HK' => 'англійская (Ганконг, САР [Кітай])', + 'en_HU' => 'англійская (Венгрыя)', 'en_ID' => 'англійская (Інданезія)', 'en_IE' => 'англійская (Ірландыя)', 'en_IL' => 'англійская (Ізраіль)', 'en_IM' => 'англійская (Востраў Мэн)', 'en_IN' => 'англійская (Індыя)', 'en_IO' => 'англійская (Брытанская тэрыторыя ў Індыйскім акіяне)', + 'en_IT' => 'англійская (Італія)', 'en_JE' => 'англійская (Джэрсі)', 'en_JM' => 'англійская (Ямайка)', 'en_KE' => 'англійская (Кенія)', @@ -167,15 +173,19 @@ 'en_NF' => 'англійская (Востраў Норфалк)', 'en_NG' => 'англійская (Нігерыя)', 'en_NL' => 'англійская (Нідэрланды)', + 'en_NO' => 'англійская (Нарвегія)', 'en_NR' => 'англійская (Науру)', 'en_NU' => 'англійская (Ніуэ)', 'en_NZ' => 'англійская (Новая Зеландыя)', 'en_PG' => 'англійская (Папуа-Новая Гвінея)', 'en_PH' => 'англійская (Філіпіны)', 'en_PK' => 'англійская (Пакістан)', + 'en_PL' => 'англійская (Польшча)', 'en_PN' => 'англійская (Астравы Піткэрн)', 'en_PR' => 'англійская (Пуэрта-Рыка)', + 'en_PT' => 'англійская (Партугалія)', 'en_PW' => 'англійская (Палау)', + 'en_RO' => 'англійская (Румынія)', 'en_RW' => 'англійская (Руанда)', 'en_SB' => 'англійская (Саламонавы астравы)', 'en_SC' => 'англійская (Сейшэльскія астравы)', @@ -184,6 +194,7 @@ 'en_SG' => 'англійская (Сінгапур)', 'en_SH' => 'англійская (Востраў Святой Алены)', 'en_SI' => 'англійская (Славенія)', + 'en_SK' => 'англійская (Славакія)', 'en_SL' => 'англійская (Сьера-Леонэ)', 'en_SS' => 'англійская (Паўднёвы Судан)', 'en_SX' => 'англійская (Сінт-Мартэн)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bg.php b/src/Symfony/Component/Intl/Resources/data/locales/bg.php index bf6ad279de4b0..fe56f842b8bdd 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bg.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bg.php @@ -121,29 +121,35 @@ 'en_CM' => 'английски (Камерун)', 'en_CX' => 'английски (остров Рождество)', 'en_CY' => 'английски (Кипър)', + 'en_CZ' => 'английски (Чехия)', 'en_DE' => 'английски (Германия)', 'en_DK' => 'английски (Дания)', 'en_DM' => 'английски (Доминика)', 'en_ER' => 'английски (Еритрея)', + 'en_ES' => 'английски (Испания)', 'en_FI' => 'английски (Финландия)', 'en_FJ' => 'английски (Фиджи)', 'en_FK' => 'английски (Фолкландски острови)', 'en_FM' => 'английски (Микронезия)', + 'en_FR' => 'английски (Франция)', 'en_GB' => 'английски (Обединеното кралство)', 'en_GD' => 'английски (Гренада)', 'en_GG' => 'английски (Гърнзи)', 'en_GH' => 'английски (Гана)', 'en_GI' => 'английски (Гибралтар)', 'en_GM' => 'английски (Гамбия)', + 'en_GS' => 'английски (Южна Джорджия и Южни Сандвичеви острови)', 'en_GU' => 'английски (Гуам)', 'en_GY' => 'английски (Гаяна)', 'en_HK' => 'английски (Хонконг, САР на Китай)', + 'en_HU' => 'английски (Унгария)', 'en_ID' => 'английски (Индонезия)', 'en_IE' => 'английски (Ирландия)', 'en_IL' => 'английски (Израел)', 'en_IM' => 'английски (остров Ман)', 'en_IN' => 'английски (Индия)', 'en_IO' => 'английски (Британска територия в Индийския океан)', + 'en_IT' => 'английски (Италия)', 'en_JE' => 'английски (Джърси)', 'en_JM' => 'английски (Ямайка)', 'en_KE' => 'английски (Кения)', @@ -167,15 +173,19 @@ 'en_NF' => 'английски (остров Норфолк)', 'en_NG' => 'английски (Нигерия)', 'en_NL' => 'английски (Нидерландия)', + 'en_NO' => 'английски (Норвегия)', 'en_NR' => 'английски (Науру)', 'en_NU' => 'английски (Ниуе)', 'en_NZ' => 'английски (Нова Зеландия)', 'en_PG' => 'английски (Папуа-Нова Гвинея)', 'en_PH' => 'английски (Филипини)', 'en_PK' => 'английски (Пакистан)', + 'en_PL' => 'английски (Полша)', 'en_PN' => 'английски (Острови Питкерн)', 'en_PR' => 'английски (Пуерто Рико)', + 'en_PT' => 'английски (Португалия)', 'en_PW' => 'английски (Палау)', + 'en_RO' => 'английски (Румъния)', 'en_RW' => 'английски (Руанда)', 'en_SB' => 'английски (Соломонови острови)', 'en_SC' => 'английски (Сейшели)', @@ -184,6 +194,7 @@ 'en_SG' => 'английски (Сингапур)', 'en_SH' => 'английски (Света Елена)', 'en_SI' => 'английски (Словения)', + 'en_SK' => 'английски (Словакия)', 'en_SL' => 'английски (Сиера Леоне)', 'en_SS' => 'английски (Южен Судан)', 'en_SX' => 'английски (Синт Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bm.php b/src/Symfony/Component/Intl/Resources/data/locales/bm.php index a3152b9f657f4..2757567cbfabd 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bm.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bm.php @@ -73,14 +73,17 @@ 'en_CK' => 'angilɛkan (Kuki Gun)', 'en_CM' => 'angilɛkan (Kameruni)', 'en_CY' => 'angilɛkan (Cipri)', + 'en_CZ' => 'angilɛkan (Ceki republiki)', 'en_DE' => 'angilɛkan (Alimaɲi)', 'en_DK' => 'angilɛkan (Danemarki)', 'en_DM' => 'angilɛkan (Dɔminiki)', 'en_ER' => 'angilɛkan (Eritere)', + 'en_ES' => 'angilɛkan (Esipaɲi)', 'en_FI' => 'angilɛkan (Finilandi)', 'en_FJ' => 'angilɛkan (Fiji)', 'en_FK' => 'angilɛkan (Maluwini Gun)', 'en_FM' => 'angilɛkan (Mikironesi)', + 'en_FR' => 'angilɛkan (Faransi)', 'en_GB' => 'angilɛkan (Angilɛtɛri)', 'en_GD' => 'angilɛkan (Granadi)', 'en_GH' => 'angilɛkan (Gana)', @@ -88,10 +91,12 @@ 'en_GM' => 'angilɛkan (Ganbi)', 'en_GU' => 'angilɛkan (Gwam)', 'en_GY' => 'angilɛkan (Gwiyana)', + 'en_HU' => 'angilɛkan (Hɔngri)', 'en_ID' => 'angilɛkan (Ɛndonezi)', 'en_IE' => 'angilɛkan (Irilandi)', 'en_IL' => 'angilɛkan (Isirayeli)', 'en_IN' => 'angilɛkan (Ɛndujamana)', + 'en_IT' => 'angilɛkan (Itali)', 'en_JM' => 'angilɛkan (Zamayiki)', 'en_KE' => 'angilɛkan (Keniya)', 'en_KI' => 'angilɛkan (Kiribati)', @@ -113,15 +118,19 @@ 'en_NF' => 'angilɛkan (Nɔrofoliki Gun)', 'en_NG' => 'angilɛkan (Nizeriya)', 'en_NL' => 'angilɛkan (Peyiba)', + 'en_NO' => 'angilɛkan (Nɔriwɛzi)', 'en_NR' => 'angilɛkan (Nawuru)', 'en_NU' => 'angilɛkan (Nyuwe)', 'en_NZ' => 'angilɛkan (Zelandi Koura)', 'en_PG' => 'angilɛkan (Papuwasi-Gine-Koura)', 'en_PH' => 'angilɛkan (Filipini)', 'en_PK' => 'angilɛkan (Pakisitaŋ)', + 'en_PL' => 'angilɛkan (Poloɲi)', 'en_PN' => 'angilɛkan (Pitikarini)', 'en_PR' => 'angilɛkan (Pɔrotoriko)', + 'en_PT' => 'angilɛkan (Pɔritigali)', 'en_PW' => 'angilɛkan (Palawu)', + 'en_RO' => 'angilɛkan (Rumani)', 'en_RW' => 'angilɛkan (Ruwanda)', 'en_SB' => 'angilɛkan (Salomo Gun)', 'en_SC' => 'angilɛkan (Sesɛli)', @@ -130,6 +139,7 @@ 'en_SG' => 'angilɛkan (Sɛngapuri)', 'en_SH' => 'angilɛkan (Ɛlɛni Senu)', 'en_SI' => 'angilɛkan (Sloveni)', + 'en_SK' => 'angilɛkan (Slowaki)', 'en_SL' => 'angilɛkan (Siyera Lewɔni)', 'en_SZ' => 'angilɛkan (Swazilandi)', 'en_TC' => 'angilɛkan (Turiki Gun ni Kayiki)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bn.php b/src/Symfony/Component/Intl/Resources/data/locales/bn.php index 643dab3898ae7..a7e77f5e3a154 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bn.php @@ -121,29 +121,35 @@ 'en_CM' => 'ইংরেজি (ক্যামেরুন)', 'en_CX' => 'ইংরেজি (ক্রিসমাস দ্বীপ)', 'en_CY' => 'ইংরেজি (সাইপ্রাস)', + 'en_CZ' => 'ইংরেজি (চেকিয়া)', 'en_DE' => 'ইংরেজি (জার্মানি)', 'en_DK' => 'ইংরেজি (ডেনমার্ক)', 'en_DM' => 'ইংরেজি (ডোমিনিকা)', 'en_ER' => 'ইংরেজি (ইরিত্রিয়া)', + 'en_ES' => 'ইংরেজি (স্পেন)', 'en_FI' => 'ইংরেজি (ফিনল্যান্ড)', 'en_FJ' => 'ইংরেজি (ফিজি)', 'en_FK' => 'ইংরেজি (ফকল্যান্ড দ্বীপপুঞ্জ)', 'en_FM' => 'ইংরেজি (মাইক্রোনেশিয়া)', + 'en_FR' => 'ইংরেজি (ফ্রান্স)', 'en_GB' => 'ইংরেজি (যুক্তরাজ্য)', 'en_GD' => 'ইংরেজি (গ্রেনাডা)', 'en_GG' => 'ইংরেজি (গার্নসি)', 'en_GH' => 'ইংরেজি (ঘানা)', 'en_GI' => 'ইংরেজি (জিব্রাল্টার)', 'en_GM' => 'ইংরেজি (গাম্বিয়া)', + 'en_GS' => 'ইংরেজি (দক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ্জ)', 'en_GU' => 'ইংরেজি (গুয়াম)', 'en_GY' => 'ইংরেজি (গিয়ানা)', 'en_HK' => 'ইংরেজি (হংকং এসএআর চীনা)', + 'en_HU' => 'ইংরেজি (হাঙ্গেরি)', 'en_ID' => 'ইংরেজি (ইন্দোনেশিয়া)', 'en_IE' => 'ইংরেজি (আয়ারল্যান্ড)', 'en_IL' => 'ইংরেজি (ইজরায়েল)', 'en_IM' => 'ইংরেজি (আইল অফ ম্যান)', 'en_IN' => 'ইংরেজি (ভারত)', 'en_IO' => 'ইংরেজি (ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল)', + 'en_IT' => 'ইংরেজি (ইতালি)', 'en_JE' => 'ইংরেজি (জার্সি)', 'en_JM' => 'ইংরেজি (জামাইকা)', 'en_KE' => 'ইংরেজি (কেনিয়া)', @@ -167,15 +173,19 @@ 'en_NF' => 'ইংরেজি (নরফোক দ্বীপ)', 'en_NG' => 'ইংরেজি (নাইজেরিয়া)', 'en_NL' => 'ইংরেজি (নেদারল্যান্ডস)', + 'en_NO' => 'ইংরেজি (নরওয়ে)', 'en_NR' => 'ইংরেজি (নাউরু)', 'en_NU' => 'ইংরেজি (নিউয়ে)', 'en_NZ' => 'ইংরেজি (নিউজিল্যান্ড)', 'en_PG' => 'ইংরেজি (পাপুয়া নিউ গিনি)', 'en_PH' => 'ইংরেজি (ফিলিপাইন)', 'en_PK' => 'ইংরেজি (পাকিস্তান)', + 'en_PL' => 'ইংরেজি (পোল্যান্ড)', 'en_PN' => 'ইংরেজি (পিটকেয়ার্ন দ্বীপপুঞ্জ)', 'en_PR' => 'ইংরেজি (পুয়ের্তো রিকো)', + 'en_PT' => 'ইংরেজি (পর্তুগাল)', 'en_PW' => 'ইংরেজি (পালাউ)', + 'en_RO' => 'ইংরেজি (রোমানিয়া)', 'en_RW' => 'ইংরেজি (রুয়ান্ডা)', 'en_SB' => 'ইংরেজি (সলোমন দ্বীপপুঞ্জ)', 'en_SC' => 'ইংরেজি (সিসিলি)', @@ -184,6 +194,7 @@ 'en_SG' => 'ইংরেজি (সিঙ্গাপুর)', 'en_SH' => 'ইংরেজি (সেন্ট হেলেনা)', 'en_SI' => 'ইংরেজি (স্লোভানিয়া)', + 'en_SK' => 'ইংরেজি (স্লোভাকিয়া)', 'en_SL' => 'ইংরেজি (সিয়েরা লিওন)', 'en_SS' => 'ইংরেজি (দক্ষিণ সুদান)', 'en_SX' => 'ইংরেজি (সিন্ট মার্টেন)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bo.php b/src/Symfony/Component/Intl/Resources/data/locales/bo.php index fbb237f85ebd7..b49025d46068d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bo.php @@ -11,6 +11,7 @@ 'en_DE' => 'དབྱིན་ཇིའི་སྐད། (འཇར་མན་)', 'en_GB' => 'དབྱིན་ཇིའི་སྐད། (དབྱིན་ཇི་)', 'en_IN' => 'དབྱིན་ཇིའི་སྐད། (རྒྱ་གར་)', + 'en_IT' => 'དབྱིན་ཇིའི་སྐད། (ཨི་ཀྲར་ལི་)', 'en_US' => 'དབྱིན་ཇིའི་སྐད། (ཨ་མེ་རི་ཀ།)', 'hi' => 'ཧིན་དི', 'hi_IN' => 'ཧིན་དི (རྒྱ་གར་)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/br.php b/src/Symfony/Component/Intl/Resources/data/locales/br.php index 622c379235e6d..d1946f05fb7c3 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/br.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/br.php @@ -121,28 +121,34 @@ 'en_CM' => 'saozneg (Kameroun)', 'en_CX' => 'saozneg (Enez Christmas)', 'en_CY' => 'saozneg (Kiprenez)', + 'en_CZ' => 'saozneg (Tchekia)', 'en_DE' => 'saozneg (Alamagn)', 'en_DK' => 'saozneg (Danmark)', 'en_DM' => 'saozneg (Dominica)', 'en_ER' => 'saozneg (Eritrea)', + 'en_ES' => 'saozneg (Spagn)', 'en_FI' => 'saozneg (Finland)', 'en_FJ' => 'saozneg (Fidji)', 'en_FK' => 'saozneg (Inizi Falkland)', 'en_FM' => 'saozneg (Mikronezia)', + 'en_FR' => 'saozneg (Frañs)', 'en_GB' => 'saozneg (Rouantelezh-Unanet)', 'en_GD' => 'saozneg (Grenada)', 'en_GG' => 'saozneg (Gwernenez)', 'en_GH' => 'saozneg (Ghana)', 'en_GI' => 'saozneg (Jibraltar)', 'en_GM' => 'saozneg (Gambia)', + 'en_GS' => 'saozneg (Inizi Georgia ar Su hag Inizi Sandwich ar Su)', 'en_GU' => 'saozneg (Guam)', 'en_GY' => 'saozneg (Guyana)', 'en_HK' => 'saozneg (Hong Kong RMD Sina)', + 'en_HU' => 'saozneg (Hungaria)', 'en_ID' => 'saozneg (Indonezia)', 'en_IE' => 'saozneg (Iwerzhon)', 'en_IL' => 'saozneg (Israel)', 'en_IM' => 'saozneg (Enez Vanav)', 'en_IN' => 'saozneg (India)', + 'en_IT' => 'saozneg (Italia)', 'en_JE' => 'saozneg (Jerzenez)', 'en_JM' => 'saozneg (Jamaika)', 'en_KE' => 'saozneg (Kenya)', @@ -166,15 +172,19 @@ 'en_NF' => 'saozneg (Enez Norfolk)', 'en_NG' => 'saozneg (Nigeria)', 'en_NL' => 'saozneg (Izelvroioù)', + 'en_NO' => 'saozneg (Norvegia)', 'en_NR' => 'saozneg (Nauru)', 'en_NU' => 'saozneg (Niue)', 'en_NZ' => 'saozneg (Zeland-Nevez)', 'en_PG' => 'saozneg (Papoua Ginea-Nevez)', 'en_PH' => 'saozneg (Filipinez)', 'en_PK' => 'saozneg (Pakistan)', + 'en_PL' => 'saozneg (Polonia)', 'en_PN' => 'saozneg (Enez Pitcairn)', 'en_PR' => 'saozneg (Puerto Rico)', + 'en_PT' => 'saozneg (Portugal)', 'en_PW' => 'saozneg (Palau)', + 'en_RO' => 'saozneg (Roumania)', 'en_RW' => 'saozneg (Rwanda)', 'en_SB' => 'saozneg (Inizi Salomon)', 'en_SC' => 'saozneg (Sechelez)', @@ -183,6 +193,7 @@ 'en_SG' => 'saozneg (Singapour)', 'en_SH' => 'saozneg (Saint-Helena)', 'en_SI' => 'saozneg (Slovenia)', + 'en_SK' => 'saozneg (Slovakia)', 'en_SL' => 'saozneg (Sierra Leone)', 'en_SS' => 'saozneg (Susoudan)', 'en_SX' => 'saozneg (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bs.php b/src/Symfony/Component/Intl/Resources/data/locales/bs.php index 8f692af3df42d..fca844d600263 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bs.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bs.php @@ -121,29 +121,35 @@ 'en_CM' => 'engleski (Kamerun)', 'en_CX' => 'engleski (Božićno ostrvo)', 'en_CY' => 'engleski (Kipar)', + 'en_CZ' => 'engleski (Češka)', 'en_DE' => 'engleski (Njemačka)', 'en_DK' => 'engleski (Danska)', 'en_DM' => 'engleski (Dominika)', 'en_ER' => 'engleski (Eritreja)', + 'en_ES' => 'engleski (Španija)', 'en_FI' => 'engleski (Finska)', 'en_FJ' => 'engleski (Fidži)', 'en_FK' => 'engleski (Folklandska ostrva)', 'en_FM' => 'engleski (Mikronezija)', + 'en_FR' => 'engleski (Francuska)', 'en_GB' => 'engleski (Ujedinjeno Kraljevstvo)', 'en_GD' => 'engleski (Grenada)', 'en_GG' => 'engleski (Guernsey)', 'en_GH' => 'engleski (Gana)', 'en_GI' => 'engleski (Gibraltar)', 'en_GM' => 'engleski (Gambija)', + 'en_GS' => 'engleski (Južna Džordžija i Južna Sendvič ostrva)', 'en_GU' => 'engleski (Guam)', 'en_GY' => 'engleski (Gvajana)', 'en_HK' => 'engleski (Hong Kong [SAR Kina])', + 'en_HU' => 'engleski (Mađarska)', 'en_ID' => 'engleski (Indonezija)', 'en_IE' => 'engleski (Irska)', 'en_IL' => 'engleski (Izrael)', 'en_IM' => 'engleski (Ostrvo Man)', 'en_IN' => 'engleski (Indija)', 'en_IO' => 'engleski (Britanska Teritorija u Indijskom Okeanu)', + 'en_IT' => 'engleski (Italija)', 'en_JE' => 'engleski (Jersey)', 'en_JM' => 'engleski (Jamajka)', 'en_KE' => 'engleski (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'engleski (Ostrvo Norfolk)', 'en_NG' => 'engleski (Nigerija)', 'en_NL' => 'engleski (Nizozemska)', + 'en_NO' => 'engleski (Norveška)', 'en_NR' => 'engleski (Nauru)', 'en_NU' => 'engleski (Niue)', 'en_NZ' => 'engleski (Novi Zeland)', 'en_PG' => 'engleski (Papua Nova Gvineja)', 'en_PH' => 'engleski (Filipini)', 'en_PK' => 'engleski (Pakistan)', + 'en_PL' => 'engleski (Poljska)', 'en_PN' => 'engleski (Pitkernska Ostrva)', 'en_PR' => 'engleski (Porto Riko)', + 'en_PT' => 'engleski (Portugal)', 'en_PW' => 'engleski (Palau)', + 'en_RO' => 'engleski (Rumunija)', 'en_RW' => 'engleski (Ruanda)', 'en_SB' => 'engleski (Solomonska Ostrva)', 'en_SC' => 'engleski (Sejšeli)', @@ -184,6 +194,7 @@ 'en_SG' => 'engleski (Singapur)', 'en_SH' => 'engleski (Sveta Helena)', 'en_SI' => 'engleski (Slovenija)', + 'en_SK' => 'engleski (Slovačka)', 'en_SL' => 'engleski (Sijera Leone)', 'en_SS' => 'engleski (Južni Sudan)', 'en_SX' => 'engleski (Sint Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/bs_Cyrl.php b/src/Symfony/Component/Intl/Resources/data/locales/bs_Cyrl.php index 7b08a3a5e0b95..d71c3ac1fd361 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/bs_Cyrl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/bs_Cyrl.php @@ -121,29 +121,35 @@ 'en_CM' => 'енглески (Камерун)', 'en_CX' => 'енглески (Божићно острво)', 'en_CY' => 'енглески (Кипар)', + 'en_CZ' => 'енглески (Чешка)', 'en_DE' => 'енглески (Њемачка)', 'en_DK' => 'енглески (Данска)', 'en_DM' => 'енглески (Доминика)', 'en_ER' => 'енглески (Еритреја)', + 'en_ES' => 'енглески (Шпанија)', 'en_FI' => 'енглески (Финска)', 'en_FJ' => 'енглески (Фиџи)', 'en_FK' => 'енглески (Фокландска Острва)', 'en_FM' => 'енглески (Микронезија)', + 'en_FR' => 'енглески (Француска)', 'en_GB' => 'енглески (Уједињено Краљевство)', 'en_GD' => 'енглески (Гренада)', 'en_GG' => 'енглески (Гернзи)', 'en_GH' => 'енглески (Гана)', 'en_GI' => 'енглески (Гибралтар)', 'en_GM' => 'енглески (Гамбија)', + 'en_GS' => 'енглески (Јужна Џорџија и Јужна Сендвичка Острва)', 'en_GU' => 'енглески (Гуам)', 'en_GY' => 'енглески (Гвајана)', 'en_HK' => 'енглески (Хонг Конг С. А. Р.)', + 'en_HU' => 'енглески (Мађарска)', 'en_ID' => 'енглески (Индонезија)', 'en_IE' => 'енглески (Ирска)', 'en_IL' => 'енглески (Израел)', 'en_IM' => 'енглески (Острво Мен)', 'en_IN' => 'енглески (Индија)', 'en_IO' => 'енглески (Британска територија у Индијском океану)', + 'en_IT' => 'енглески (Италија)', 'en_JE' => 'енглески (Џерзи)', 'en_JM' => 'енглески (Јамајка)', 'en_KE' => 'енглески (Кенија)', @@ -167,15 +173,19 @@ 'en_NF' => 'енглески (Острво Норфолк)', 'en_NG' => 'енглески (Нигерија)', 'en_NL' => 'енглески (Холандија)', + 'en_NO' => 'енглески (Норвешка)', 'en_NR' => 'енглески (Науру)', 'en_NU' => 'енглески (Ниуе)', 'en_NZ' => 'енглески (Нови Зеланд)', 'en_PG' => 'енглески (Папуа Нова Гвинеја)', 'en_PH' => 'енглески (Филипини)', 'en_PK' => 'енглески (Пакистан)', + 'en_PL' => 'енглески (Пољска)', 'en_PN' => 'енглески (Питкерн)', 'en_PR' => 'енглески (Порторико)', + 'en_PT' => 'енглески (Португал)', 'en_PW' => 'енглески (Палау)', + 'en_RO' => 'енглески (Румунија)', 'en_RW' => 'енглески (Руанда)', 'en_SB' => 'енглески (Соломонска Острва)', 'en_SC' => 'енглески (Сејшели)', @@ -184,6 +194,7 @@ 'en_SG' => 'енглески (Сингапур)', 'en_SH' => 'енглески (Света Хелена)', 'en_SI' => 'енглески (Словенија)', + 'en_SK' => 'енглески (Словачка)', 'en_SL' => 'енглески (Сијера Леоне)', 'en_SS' => 'енглески (Јужни Судан)', 'en_SX' => 'енглески (Свети Мартин [Холандија])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ca.php b/src/Symfony/Component/Intl/Resources/data/locales/ca.php index 2642eabe5c318..a97fa374d1d54 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ca.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ca.php @@ -121,29 +121,35 @@ 'en_CM' => 'anglès (Camerun)', 'en_CX' => 'anglès (Illa Christmas)', 'en_CY' => 'anglès (Xipre)', + 'en_CZ' => 'anglès (Txèquia)', 'en_DE' => 'anglès (Alemanya)', 'en_DK' => 'anglès (Dinamarca)', 'en_DM' => 'anglès (Dominica)', 'en_ER' => 'anglès (Eritrea)', + 'en_ES' => 'anglès (Espanya)', 'en_FI' => 'anglès (Finlàndia)', 'en_FJ' => 'anglès (Fiji)', 'en_FK' => 'anglès (Illes Falkland)', 'en_FM' => 'anglès (Micronèsia)', + 'en_FR' => 'anglès (França)', 'en_GB' => 'anglès (Regne Unit)', 'en_GD' => 'anglès (Grenada)', 'en_GG' => 'anglès (Guernsey)', 'en_GH' => 'anglès (Ghana)', 'en_GI' => 'anglès (Gibraltar)', 'en_GM' => 'anglès (Gàmbia)', + 'en_GS' => 'anglès (Illes Geòrgia del Sud i Sandwich del Sud)', 'en_GU' => 'anglès (Guam)', 'en_GY' => 'anglès (Guyana)', 'en_HK' => 'anglès (Hong Kong [RAE Xina])', + 'en_HU' => 'anglès (Hongria)', 'en_ID' => 'anglès (Indonèsia)', 'en_IE' => 'anglès (Irlanda)', 'en_IL' => 'anglès (Israel)', 'en_IM' => 'anglès (Illa de Man)', 'en_IN' => 'anglès (Índia)', 'en_IO' => 'anglès (Territori Britànic de l’Oceà Índic)', + 'en_IT' => 'anglès (Itàlia)', 'en_JE' => 'anglès (Jersey)', 'en_JM' => 'anglès (Jamaica)', 'en_KE' => 'anglès (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'anglès (Illa Norfolk)', 'en_NG' => 'anglès (Nigèria)', 'en_NL' => 'anglès (Països Baixos)', + 'en_NO' => 'anglès (Noruega)', 'en_NR' => 'anglès (Nauru)', 'en_NU' => 'anglès (Niue)', 'en_NZ' => 'anglès (Nova Zelanda)', 'en_PG' => 'anglès (Papua Nova Guinea)', 'en_PH' => 'anglès (Filipines)', 'en_PK' => 'anglès (Pakistan)', + 'en_PL' => 'anglès (Polònia)', 'en_PN' => 'anglès (Illes Pitcairn)', 'en_PR' => 'anglès (Puerto Rico)', + 'en_PT' => 'anglès (Portugal)', 'en_PW' => 'anglès (Palau)', + 'en_RO' => 'anglès (Romania)', 'en_RW' => 'anglès (Ruanda)', 'en_SB' => 'anglès (Illes Salomó)', 'en_SC' => 'anglès (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'anglès (Singapur)', 'en_SH' => 'anglès (Santa Helena)', 'en_SI' => 'anglès (Eslovènia)', + 'en_SK' => 'anglès (Eslovàquia)', 'en_SL' => 'anglès (Sierra Leone)', 'en_SS' => 'anglès (Sudan del Sud)', 'en_SX' => 'anglès (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ce.php b/src/Symfony/Component/Intl/Resources/data/locales/ce.php index 10bd3b6a2b58a..85e234c29a7d6 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ce.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ce.php @@ -121,28 +121,34 @@ 'en_CM' => 'ингалсан (Камерун)', 'en_CX' => 'ингалсан (ГӀайре ӏиса пайхӏамар вина де)', 'en_CY' => 'ингалсан (Кипр)', + 'en_CZ' => 'ингалсан (Чехи)', 'en_DE' => 'ингалсан (Германи)', 'en_DK' => 'ингалсан (Дани)', 'en_DM' => 'ингалсан (Доминика)', 'en_ER' => 'ингалсан (Эритрей)', + 'en_ES' => 'ингалсан (Испани)', 'en_FI' => 'ингалсан (Финлянди)', 'en_FJ' => 'ингалсан (Фиджи)', 'en_FK' => 'ингалсан (Фолклендан гӀайренаш)', 'en_FM' => 'ингалсан (Микронезин Федеративни штаташ)', + 'en_FR' => 'ингалсан (Франци)', 'en_GB' => 'ингалсан (Йоккха Британи)', 'en_GD' => 'ингалсан (Гренада)', 'en_GG' => 'ингалсан (Гернси)', 'en_GH' => 'ингалсан (Гана)', 'en_GI' => 'ингалсан (Гибралтар)', 'en_GM' => 'ингалсан (Гамби)', + 'en_GS' => 'ингалсан (Къилба Джорджи а, Къилба Гавайн гӀайренаш а)', 'en_GU' => 'ингалсан (Гуам)', 'en_GY' => 'ингалсан (Гайана)', 'en_HK' => 'ингалсан (Гонконг [ша-къаьстина кӀошт])', + 'en_HU' => 'ингалсан (Венгри)', 'en_ID' => 'ингалсан (Индонези)', 'en_IE' => 'ингалсан (Ирланди)', 'en_IL' => 'ингалсан (Израиль)', 'en_IM' => 'ингалсан (Мэн гӀайре)', 'en_IN' => 'ингалсан (ХӀинди)', + 'en_IT' => 'ингалсан (Итали)', 'en_JE' => 'ингалсан (Джерси)', 'en_JM' => 'ингалсан (Ямайка)', 'en_KE' => 'ингалсан (Кени)', @@ -166,15 +172,19 @@ 'en_NF' => 'ингалсан (Норфолк гӀайре)', 'en_NG' => 'ингалсан (Нигери)', 'en_NL' => 'ингалсан (Нидерландаш)', + 'en_NO' => 'ингалсан (Норвеги)', 'en_NR' => 'ингалсан (Науру)', 'en_NU' => 'ингалсан (Ниуэ)', 'en_NZ' => 'ингалсан (Керла Зеланди)', 'en_PG' => 'ингалсан (Папуа — Керла Гвиней)', 'en_PH' => 'ингалсан (Филиппинаш)', 'en_PK' => 'ингалсан (Пакистан)', + 'en_PL' => 'ингалсан (Польша)', 'en_PN' => 'ингалсан (Питкэрн гӀайренаш)', 'en_PR' => 'ингалсан (Пуэрто-Рико)', + 'en_PT' => 'ингалсан (Португали)', 'en_PW' => 'ингалсан (Палау)', + 'en_RO' => 'ингалсан (Румыни)', 'en_RW' => 'ингалсан (Руанда)', 'en_SB' => 'ингалсан (Соломонан гӀайренаш)', 'en_SC' => 'ингалсан (Сейшелан гӀайренаш)', @@ -183,6 +193,7 @@ 'en_SG' => 'ингалсан (Сингапур)', 'en_SH' => 'ингалсан (Сийлахьчу Еленин гӀайре)', 'en_SI' => 'ингалсан (Словени)', + 'en_SK' => 'ингалсан (Словаки)', 'en_SL' => 'ингалсан (Сьерра- Леоне)', 'en_SS' => 'ингалсан (Къилба Судан)', 'en_SX' => 'ингалсан (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/cs.php b/src/Symfony/Component/Intl/Resources/data/locales/cs.php index 9f54d93893508..d775712243a39 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/cs.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/cs.php @@ -121,29 +121,35 @@ 'en_CM' => 'angličtina (Kamerun)', 'en_CX' => 'angličtina (Vánoční ostrov)', 'en_CY' => 'angličtina (Kypr)', + 'en_CZ' => 'angličtina (Česko)', 'en_DE' => 'angličtina (Německo)', 'en_DK' => 'angličtina (Dánsko)', 'en_DM' => 'angličtina (Dominika)', 'en_ER' => 'angličtina (Eritrea)', + 'en_ES' => 'angličtina (Španělsko)', 'en_FI' => 'angličtina (Finsko)', 'en_FJ' => 'angličtina (Fidži)', 'en_FK' => 'angličtina (Falklandské ostrovy)', 'en_FM' => 'angličtina (Mikronésie)', + 'en_FR' => 'angličtina (Francie)', 'en_GB' => 'angličtina (Spojené království)', 'en_GD' => 'angličtina (Grenada)', 'en_GG' => 'angličtina (Guernsey)', 'en_GH' => 'angličtina (Ghana)', 'en_GI' => 'angličtina (Gibraltar)', 'en_GM' => 'angličtina (Gambie)', + 'en_GS' => 'angličtina (Jižní Georgie a Jižní Sandwichovy ostrovy)', 'en_GU' => 'angličtina (Guam)', 'en_GY' => 'angličtina (Guyana)', 'en_HK' => 'angličtina (Hongkong – ZAO Číny)', + 'en_HU' => 'angličtina (Maďarsko)', 'en_ID' => 'angličtina (Indonésie)', 'en_IE' => 'angličtina (Irsko)', 'en_IL' => 'angličtina (Izrael)', 'en_IM' => 'angličtina (Ostrov Man)', 'en_IN' => 'angličtina (Indie)', 'en_IO' => 'angličtina (Britské indickooceánské území)', + 'en_IT' => 'angličtina (Itálie)', 'en_JE' => 'angličtina (Jersey)', 'en_JM' => 'angličtina (Jamajka)', 'en_KE' => 'angličtina (Keňa)', @@ -167,15 +173,19 @@ 'en_NF' => 'angličtina (Norfolk)', 'en_NG' => 'angličtina (Nigérie)', 'en_NL' => 'angličtina (Nizozemsko)', + 'en_NO' => 'angličtina (Norsko)', 'en_NR' => 'angličtina (Nauru)', 'en_NU' => 'angličtina (Niue)', 'en_NZ' => 'angličtina (Nový Zéland)', 'en_PG' => 'angličtina (Papua-Nová Guinea)', 'en_PH' => 'angličtina (Filipíny)', 'en_PK' => 'angličtina (Pákistán)', + 'en_PL' => 'angličtina (Polsko)', 'en_PN' => 'angličtina (Pitcairnovy ostrovy)', 'en_PR' => 'angličtina (Portoriko)', + 'en_PT' => 'angličtina (Portugalsko)', 'en_PW' => 'angličtina (Palau)', + 'en_RO' => 'angličtina (Rumunsko)', 'en_RW' => 'angličtina (Rwanda)', 'en_SB' => 'angličtina (Šalamounovy ostrovy)', 'en_SC' => 'angličtina (Seychely)', @@ -184,6 +194,7 @@ 'en_SG' => 'angličtina (Singapur)', 'en_SH' => 'angličtina (Svatá Helena)', 'en_SI' => 'angličtina (Slovinsko)', + 'en_SK' => 'angličtina (Slovensko)', 'en_SL' => 'angličtina (Sierra Leone)', 'en_SS' => 'angličtina (Jižní Súdán)', 'en_SX' => 'angličtina (Svatý Martin [Nizozemsko])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/cv.php b/src/Symfony/Component/Intl/Resources/data/locales/cv.php index cbf34ec6b4eee..94717b2b22b93 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/cv.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/cv.php @@ -67,28 +67,34 @@ 'en_CM' => 'акӑлчан (Камерун)', 'en_CX' => 'акӑлчан (Раштав утравӗ)', 'en_CY' => 'акӑлчан (Кипр)', + 'en_CZ' => 'акӑлчан (Чехи)', 'en_DE' => 'акӑлчан (Германи)', 'en_DK' => 'акӑлчан (Дани)', 'en_DM' => 'акӑлчан (Доминика)', 'en_ER' => 'акӑлчан (Эритрей)', + 'en_ES' => 'акӑлчан (Испани)', 'en_FI' => 'акӑлчан (Финлянди)', 'en_FJ' => 'акӑлчан (Фиджи)', 'en_FK' => 'акӑлчан (Фолкленд утравӗсем)', 'en_FM' => 'акӑлчан (Микронези)', + 'en_FR' => 'акӑлчан (Франци)', 'en_GB' => 'акӑлчан (Аслӑ Британи)', 'en_GD' => 'акӑлчан (Гренада)', 'en_GG' => 'акӑлчан (Гернси)', 'en_GH' => 'акӑлчан (Гана)', 'en_GI' => 'акӑлчан (Гибралтар)', 'en_GM' => 'акӑлчан (Гамби)', + 'en_GS' => 'акӑлчан (Кӑнтӑр Георги тата Сандвичев утравӗсем)', 'en_GU' => 'акӑлчан (Гуам)', 'en_GY' => 'акӑлчан (Гайана)', 'en_HK' => 'акӑлчан (Гонконг [САР])', + 'en_HU' => 'акӑлчан (Венгри)', 'en_ID' => 'акӑлчан (Индонези)', 'en_IE' => 'акӑлчан (Ирланди)', 'en_IL' => 'акӑлчан (Израиль)', 'en_IM' => 'акӑлчан (Мэн утравӗ)', 'en_IN' => 'акӑлчан (Инди)', + 'en_IT' => 'акӑлчан (Итали)', 'en_JE' => 'акӑлчан (Джерси)', 'en_JM' => 'акӑлчан (Ямайка)', 'en_KE' => 'акӑлчан (Кени)', @@ -112,15 +118,19 @@ 'en_NF' => 'акӑлчан (Норфолк утравӗ)', 'en_NG' => 'акӑлчан (Нигери)', 'en_NL' => 'акӑлчан (Нидерланд)', + 'en_NO' => 'акӑлчан (Норвеги)', 'en_NR' => 'акӑлчан (Науру)', 'en_NU' => 'акӑлчан (Ниуэ)', 'en_NZ' => 'акӑлчан (Ҫӗнӗ Зеланди)', 'en_PG' => 'акӑлчан (Папуа — Ҫӗнӗ Гвиней)', 'en_PH' => 'акӑлчан (Филиппинсем)', 'en_PK' => 'акӑлчан (Пакистан)', + 'en_PL' => 'акӑлчан (Польша)', 'en_PN' => 'акӑлчан (Питкэрн утравӗсем)', 'en_PR' => 'акӑлчан (Пуэрто-Рико)', + 'en_PT' => 'акӑлчан (Португали)', 'en_PW' => 'акӑлчан (Палау)', + 'en_RO' => 'акӑлчан (Румыни)', 'en_RW' => 'акӑлчан (Руанда)', 'en_SB' => 'акӑлчан (Соломон утравӗсем)', 'en_SC' => 'акӑлчан (Сейшел утравӗсем)', @@ -129,6 +139,7 @@ 'en_SG' => 'акӑлчан (Сингапур)', 'en_SH' => 'акӑлчан (Сӑваплӑ Елена утравӗ)', 'en_SI' => 'акӑлчан (Словени)', + 'en_SK' => 'акӑлчан (Словаки)', 'en_SL' => 'акӑлчан (Сьерра-Леоне)', 'en_SS' => 'акӑлчан (Кӑнтӑр Судан)', 'en_SX' => 'акӑлчан (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/cy.php b/src/Symfony/Component/Intl/Resources/data/locales/cy.php index 565b768f39f86..7122d9a45f1af 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/cy.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/cy.php @@ -121,29 +121,35 @@ 'en_CM' => 'Saesneg (Camerŵn)', 'en_CX' => 'Saesneg (Ynys y Nadolig)', 'en_CY' => 'Saesneg (Cyprus)', + 'en_CZ' => 'Saesneg (Tsiecia)', 'en_DE' => 'Saesneg (Yr Almaen)', 'en_DK' => 'Saesneg (Denmarc)', 'en_DM' => 'Saesneg (Dominica)', 'en_ER' => 'Saesneg (Eritrea)', + 'en_ES' => 'Saesneg (Sbaen)', 'en_FI' => 'Saesneg (Y Ffindir)', 'en_FJ' => 'Saesneg (Fiji)', 'en_FK' => 'Saesneg (Ynysoedd y Falkland/Malvinas)', 'en_FM' => 'Saesneg (Micronesia)', + 'en_FR' => 'Saesneg (Ffrainc)', 'en_GB' => 'Saesneg (Y Deyrnas Unedig)', 'en_GD' => 'Saesneg (Grenada)', 'en_GG' => 'Saesneg (Ynys y Garn)', 'en_GH' => 'Saesneg (Ghana)', 'en_GI' => 'Saesneg (Gibraltar)', 'en_GM' => 'Saesneg (Gambia)', + 'en_GS' => 'Saesneg (De Georgia ac Ynysoedd Sandwich y De)', 'en_GU' => 'Saesneg (Guam)', 'en_GY' => 'Saesneg (Guyana)', 'en_HK' => 'Saesneg (Hong Kong SAR Tsieina)', + 'en_HU' => 'Saesneg (Hwngari)', 'en_ID' => 'Saesneg (Indonesia)', 'en_IE' => 'Saesneg (Iwerddon)', 'en_IL' => 'Saesneg (Israel)', 'en_IM' => 'Saesneg (Ynys Manaw)', 'en_IN' => 'Saesneg (India)', 'en_IO' => 'Saesneg (Tiriogaeth Brydeinig Cefnfor India)', + 'en_IT' => 'Saesneg (Yr Eidal)', 'en_JE' => 'Saesneg (Jersey)', 'en_JM' => 'Saesneg (Jamaica)', 'en_KE' => 'Saesneg (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Saesneg (Ynys Norfolk)', 'en_NG' => 'Saesneg (Nigeria)', 'en_NL' => 'Saesneg (Yr Iseldiroedd)', + 'en_NO' => 'Saesneg (Norwy)', 'en_NR' => 'Saesneg (Nauru)', 'en_NU' => 'Saesneg (Niue)', 'en_NZ' => 'Saesneg (Seland Newydd)', 'en_PG' => 'Saesneg (Papua Guinea Newydd)', 'en_PH' => 'Saesneg (Y Philipinau)', 10000 'en_PK' => 'Saesneg (Pakistan)', + 'en_PL' => 'Saesneg (Gwlad Pwyl)', 'en_PN' => 'Saesneg (Ynysoedd Pitcairn)', 'en_PR' => 'Saesneg (Puerto Rico)', + 'en_PT' => 'Saesneg (Portiwgal)', 'en_PW' => 'Saesneg (Palau)', + 'en_RO' => 'Saesneg (Rwmania)', 'en_RW' => 'Saesneg (Rwanda)', 'en_SB' => 'Saesneg (Ynysoedd Solomon)', 'en_SC' => 'Saesneg (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Saesneg (Singapore)', 'en_SH' => 'Saesneg (Saint Helena)', 'en_SI' => 'Saesneg (Slofenia)', + 'en_SK' => 'Saesneg (Slofacia)', 'en_SL' => 'Saesneg (Sierra Leone)', 'en_SS' => 'Saesneg (De Swdan)', 'en_SX' => 'Saesneg (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/da.php b/src/Symfony/Component/Intl/Resources/data/locales/da.php index 43883daeddcf0..4840d59622c77 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/da.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/da.php @@ -121,29 +121,35 @@ 'en_CM' => 'engelsk (Cameroun)', 'en_CX' => 'engelsk (Juleøen)', 'en_CY' => 'engelsk (Cypern)', + 'en_CZ' => 'engelsk (Tjekkiet)', 'en_DE' => 'engelsk (Tyskland)', 'en_DK' => 'engelsk (Danmark)', 'en_DM' => 'engelsk (Dominica)', 'en_ER' => 'engelsk (Eritrea)', + 'en_ES' => 'engelsk (Spanien)', 'en_FI' => 'engelsk (Finland)', 'en_FJ' => 'engelsk (Fiji)', 'en_FK' => 'engelsk (Falklandsøerne)', 'en_FM' => 'engelsk (Mikronesien)', + 'en_FR' => 'engelsk (Frankrig)', 'en_GB' => 'engelsk (Storbritannien)', 'en_GD' => 'engelsk (Grenada)', 'en_GG' => 'engelsk (Guernsey)', 'en_GH' => 'engelsk (Ghana)', 'en_GI' => 'engelsk (Gibraltar)', 'en_GM' => 'engelsk (Gambia)', + 'en_GS' => 'engelsk (South Georgia og De Sydlige Sandwichøer)', 'en_GU' => 'engelsk (Guam)', 'en_GY' => 'engelsk (Guyana)', 'en_HK' => 'engelsk (SAR Hongkong)', + 'en_HU' => 'engelsk (Ungarn)', 'en_ID' => 'engelsk (Indonesien)', 'en_IE' => 'engelsk (Irland)', 'en_IL' => 'engelsk (Israel)', 'en_IM' => 'engelsk (Isle of Man)', 'en_IN' => 'engelsk (Indien)', 'en_IO' => 'engelsk (Det Britiske Territorium i Det Indiske Ocean)', + 'en_IT' => 'engelsk (Italien)', 'en_JE' => 'engelsk (Jersey)', 'en_JM' => 'engelsk (Jamaica)', 'en_KE' => 'engelsk (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'engelsk (Norfolk Island)', 'en_NG' => 'engelsk (Nigeria)', 'en_NL' => 'engelsk (Nederlandene)', + 'en_NO' => 'engelsk (Norge)', 'en_NR' => 'engelsk (Nauru)', 'en_NU' => 'engelsk (Niue)', 'en_NZ' => 'engelsk (New Zealand)', 'en_PG' => 'engelsk (Papua Ny Guinea)', 'en_PH' => 'engelsk (Filippinerne)', 'en_PK' => 'engelsk (Pakistan)', + 'en_PL' => 'engelsk (Polen)', 'en_PN' => 'engelsk (Pitcairn)', 'en_PR' => 'engelsk (Puerto Rico)', + 'en_PT' => 'engelsk (Portugal)', 'en_PW' => 'engelsk (Palau)', + 'en_RO' => 'engelsk (Rumænien)', 'en_RW' => 'engelsk (Rwanda)', 'en_SB' => 'engelsk (Salomonøerne)', 'en_SC' => 'engelsk (Seychellerne)', @@ -184,6 +194,7 @@ 'en_SG' => 'engelsk (Singapore)', 'en_SH' => 'engelsk (St. Helena)', 'en_SI' => 'engelsk (Slovenien)', + 'en_SK' => 'engelsk (Slovakiet)', 'en_SL' => 'engelsk (Sierra Leone)', 'en_SS' => 'engelsk (Sydsudan)', 'en_SX' => 'engelsk (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/de.php b/src/Symfony/Component/Intl/Resources/data/locales/de.php index 2b92bd6d0454c..538fc989c977c 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/de.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/de.php @@ -121,29 +121,35 @@ 'en_CM' => 'Englisch (Kamerun)', 'en_CX' => 'Englisch (Weihnachtsinsel)', 'en_CY' => 'Englisch (Zypern)', + 'en_CZ' => 'Englisch (Tschechien)', 'en_DE' => 'Englisch (Deutschland)', 'en_DK' => 'Englisch (Dänemark)', 'en_DM' => 'Englisch (Dominica)', 'en_ER' => 'Englisch (Eritrea)', + 'en_ES' => 'Englisch (Spanien)', 'en_FI' => 'Englisch (Finnland)', 'en_FJ' => 'Englisch (Fidschi)', 'en_FK' => 'Englisch (Falklandinseln)', 'en_FM' => 'Englisch (Mikronesien)', + 'en_FR' => 'Englisch (Frankreich)', 'en_GB' => 'Englisch (Vereinigtes Königreich)', 'en_GD' => 'Englisch (Grenada)', 'en_GG' => 'Englisch (Guernsey)', 'en_GH' => 'Englisch (Ghana)', 'en_GI' => 'Englisch (Gibraltar)', 'en_GM' => 'Englisch (Gambia)', + 'en_GS' => 'Englisch (Südgeorgien und die Südlichen Sandwichinseln)', 'en_GU' => 'Englisch (Guam)', 'en_GY' => 'Englisch (Guyana)', 'en_HK' => 'Englisch (Sonderverwaltungsregion Hongkong)', + 'en_HU' => 'Englisch (Ungarn)', 'en_ID' => 'Englisch (Indonesien)', 'en_IE' => 'Englisch (Irland)', 'en_IL' => 'Englisch (Israel)', 'en_IM' => 'Englisch (Isle of Man)', 'en_IN' => 'Englisch (Indien)', 'en_IO' => 'Englisch (Britisches Territorium im Indischen Ozean)', + 'en_IT' => 'Englisch (Italien)', 'en_JE' => 'Englisch (Jersey)', 'en_JM' => 'Englisch (Jamaika)', 'en_KE' => 'Englisch (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Englisch (Norfolkinsel)', 'en_NG' => 'Englisch (Nigeria)', 'en_NL' => 'Englisch (Niederlande)', + 'en_NO' => 'Englisch (Norwegen)', 'en_NR' => 'Englisch (Nauru)', 'en_NU' => 'Englisch (Niue)', 'en_NZ' => 'Englisch (Neuseeland)', 'en_PG' => 'Englisch (Papua-Neuguinea)', 'en_PH' => 'Englisch (Philippinen)', 'en_PK' => 'Englisch (Pakistan)', + 'en_PL' => 'Englisch (Polen)', 'en_PN' => 'Englisch (Pitcairninseln)', 'en_PR' => 'Englisch (Puerto Rico)', + 'en_PT' => 'Englisch (Portugal)', 'en_PW' => 'Englisch (Palau)', + 'en_RO' => 'Englisch (Rumänien)', 'en_RW' => 'Englisch (Ruanda)', 'en_SB' => 'Englisch (Salomonen)', 'en_SC' => 'Englisch (Seychellen)', @@ -184,6 +194,7 @@ 'en_SG' => 'Englisch (Singapur)', 'en_SH' => 'Englisch (St. Helena)', 'en_SI' => 'Englisch (Slowenien)', + 'en_SK' => 'Englisch (Slowakei)', 'en_SL' => 'Englisch (Sierra Leone)', 'en_SS' => 'Englisch (Südsudan)', 'en_SX' => 'Englisch (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/dz.php b/src/Symfony/Component/Intl/Resources/data/locales/dz.php index 1d72a3a0d48bc..6d14bbb965595 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/dz.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/dz.php @@ -108,28 +108,34 @@ 'en_CM' => 'ཨིང་ལིཤ་ཁ། (ཀེ་མ་རུན།)', 'en_CX' => 'ཨིང་ལིཤ་ཁ། (ཁི་རིསྟ་མེས་མཚོ་གླིང།)', 'en_CY' => 'ཨིང་ལིཤ་ཁ། (སཱའི་པྲས།)', + 'en_CZ' => 'ཨིང་ལིཤ་ཁ། (ཅེཀ་ རི་པབ་ལིཀ།)', 'en_DE' => 'ཨིང་ལིཤ་ཁ། (ཇཱར་མ་ནི།)', 'en_DK' => 'ཨིང་ལིཤ་ཁ། (ཌེན་མཱཀ།)', 'en_DM' => 'ཨིང་ལིཤ་ཁ། (ཌོ་མི་ནི་ཀ།)', 'en_ER' => 'ཨིང་ལིཤ་ཁ། (ཨེ་རི་ཊྲེ་ཡ།)', + 'en_ES' => 'ཨིང་ལིཤ་ཁ། (ཨིས་པེན།)', 'en_FI' => 'ཨིང་ལིཤ་ཁ། (ཕིན་ལེནཌ།)', 'en_FJ' => 'ཨིང་ལིཤ་ཁ། (ཕི་ཇི།)', 'en_FK' => 'ཨིང་ལིཤ་ཁ། (ཕལྐ་ལནྜ་གླིང་ཚོམ།)', 'en_FM' => 'ཨིང་ལིཤ་ཁ། (མའི་ཀྲོ་ནི་ཤི་ཡ།)', + 'en_FR' => 'ཨིང་ལིཤ་ཁ། (ཕྲཱནས།)', 'en_GB' => 'ཨིང་ལིཤ་ཁ། (ཡུ་ནཱའི་ཊེཌ་ ཀིང་ཌམ།)', 'en_GD' => 'ཨིང་ལིཤ་ཁ། (གྲྀ་ན་ཌ།)', 'en_GG' => 'ཨིང་ལིཤ་ཁ། (གུ་ཨེརྣ་སི།)', 'en_GH' => 'ཨིང་ལིཤ་ཁ། (གྷ་ན།)', 'en_GI' => 'ཨིང་ལིཤ་ཁ། (ཇིབ་རཱལ་ཊར།)', 'en_GM' => 'ཨིང་ལིཤ་ཁ། (གྷེམ་བི་ཡ།)', + 'en_GS' => 'ཨིང་ལིཤ་ཁ། (སཱའུཐ་ཇཽར་ཇཱ་ དང་ སཱའུཐ་སེནཌ྄་ཝིཅ་གླིང་ཚོམ།)', 'en_GU' => 'ཨིང་ལིཤ་ཁ། (གུ་འམ་ མཚོ་གླིང།)', 'en_GY' => 'ཨིང་ལིཤ་ཁ། (གྷ་ཡ་ན།)', 'en_HK' => 'ཨིང་ལིཤ་ཁ། (ཧོང་ཀོང་ཅཱའི་ན།)', + 'en_HU' => 'ཨིང་ལིཤ་ཁ། (ཧཱང་གྷ་རི།)', 'en_ID' => 'ཨིང་ལིཤ་ཁ། (ཨིན་ཌོ་ནེ་ཤི་ཡ།)', 'en_IE' => 'ཨིང་ལིཤ་ཁ། (ཨཱ་ཡ་ལེནཌ།)', 'en_IL' => 'ཨིང་ལིཤ་ཁ། (ཨིས་ར་ཡེལ།)', 'en_IM' => 'ཨིང་ལིཤ་ཁ། (ཨ་ཡུལ་ ཨོཕ་ མཱན།)', 'en_IN' => 'ཨིང་ལིཤ་ཁ། (རྒྱ་གར།)', + 'en_IT' => 'ཨིང་ལིཤ་ཁ། (ཨི་ཊ་ལི།)', 'en_JE' => 'ཨིང་ལིཤ་ཁ། (ཇེར་སི།)', 'en_JM' => 'ཨིང་ལིཤ་ཁ། (ཇཱ་མཻ་ཀ།)', 'en_KE' => 'ཨིང་ལིཤ་ཁ། (ཀེན་ཡ།)', @@ -153,15 +159,19 @@ 'en_NF' => 'ཨིང་ལིཤ་ཁ། (ནོར་ཕོལཀ་མཚོ་གླིང༌།)', 'en_NG' => 'ཨིང་ལིཤ་ཁ། (ནཱའི་ཇི་རི་ཡ།)', 'en_NL' => 'ཨིང་ལིཤ་ཁ། (ནེ་དར་ལནཌས྄།)', + 'en_NO' => 'ཨིང་ལིཤ་ཁ། (ནོར་ཝེ།)', 'en_NR' => 'ཨིང་ལིཤ་ཁ། (ནའུ་རུ་།)', 'en_NU' => 'ཨིང་ལིཤ་ཁ། (ནི་ཨུ་ཨཻ།)', 'en_NZ' => 'ཨིང་ལིཤ་ཁ། (ནིའུ་ཛི་ལེནཌ།)', 'en_PG' => 'ཨིང་ལིཤ་ཁ། (པ་པུ་ ནིའུ་གི་ནི།)', 'en_PH' => 'ཨིང་ལིཤ་ཁ། (ཕི་ལི་པིནས།)', 'en_PK' => 'ཨིང་ལིཤ་ཁ། (པ་ཀི་སཏཱན།)', + 'en_PL' => 'ཨིང་ལིཤ་ཁ། (པོ་ལེནཌ།)', 'en_PN' => 'ཨིང་ལིཤ་ཁ། (པིཊ་ཀེ་ཡེརན་གླིང་ཚོམ།)', 'en_PR' => 'ཨིང་ལིཤ་ཁ། (པུ་འེར་ཊོ་རི་ཁོ།)', + 'en_PT' => 'ཨིང་ལིཤ་ཁ། (པོར་ཅུ་གཱལ།)', 'en_PW' => 'ཨིང་ལིཤ་ཁ། (པ་ལའུ།)', + 'en_RO' => 'ཨིང་ལིཤ་ཁ། (རོ་མེ་ནི་ཡ།)', 'en_RW' => 'ཨིང་ལིཤ་ཁ། (རུ་ཝན་ཌ།)', 'en_SB' => 'ཨིང་ལིཤ་ཁ། (སོ་ལོ་མོན་ གླིང་ཚོམ།)', 'en_SC' => 'ཨིང་ལིཤ་ཁ། (སེ་ཤཱལས།)', @@ -170,6 +180,7 @@ 'en_SG' => 'ཨིང་ལིཤ་ཁ། (སིང་ག་པོར།)', 'en_SH' => 'ཨིང་ལིཤ་ཁ། (སེནཊ་ ཧེ་ལི་ན།)', 'en_SI' => 'ཨིང་ལིཤ་ཁ། (སུ་ལོ་བི་ནི་ཡ།)', + 'en_SK' => 'ཨིང་ལིཤ་ཁ། (སུ་ལོ་བཱ་ཀི་ཡ།)', 'en_SL' => 'ཨིང་ལིཤ་ཁ། (སི་ར་ ལི་འོན།)', 'en_SS' => 'ཨིང་ལིཤ་ཁ། (སཱའུཐ་ སུ་ཌཱན།)', 'en_SX' => 'ཨིང་ལིཤ་ཁ། (སིནཊ་ མཱར་ཊེན།)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ee.php b/src/Symfony/Component/Intl/Resources/data/locales/ee.php index 06bfd269580e6..11f8d3a8665ef 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ee.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ee.php @@ -116,28 +116,34 @@ 'en_CM' => 'iŋlisigbe (Kamerun nutome)', 'en_CX' => 'iŋlisigbe (Kristmas ƒudomekpo nutome)', 'en_CY' => 'iŋlisigbe (Saiprus nutome)', + 'en_CZ' => 'iŋlisigbe (Tsɛk repɔblik nutome)', 'en_DE' => 'iŋlisigbe (Germania nutome)', 'en_DK' => 'iŋlisigbe (Denmark nutome)', 'en_DM' => 'iŋlisigbe (Dominika nutome)', 'en_ER' => 'iŋlisigbe (Eritrea nutome)', + 'en_ES' => 'iŋlisigbe (Spain nutome)', 'en_FI' => 'iŋlisigbe (Finland nutome)', 'en_FJ' => 'iŋlisigbe (Fidzi nutome)', 'en_FK' => 'iŋlisigbe (Falkland ƒudomekpowo nutome)', 'en_FM' => 'iŋlisigbe (Mikronesia nutome)', + 'en_FR' => 'iŋlisigbe (France nutome)', 'en_GB' => 'iŋlisigbe (United Kingdom nutome)', 'en_GD' => 'iŋlisigbe (Grenada nutome)', 'en_GG' => 'iŋlisigbe (Guernse nutome)', 'en_GH' => 'iŋlisigbe (Ghana nutome)', 'en_GI' => 'iŋlisigbe (Gibraltar nutome)', 'en_GM' => 'iŋlisigbe (Gambia nutome)', + 'en_GS' => 'iŋlisigbe (Anyiehe Georgia kple Anyiehe Sandwich ƒudomekpowo nutome)', 'en_GU' => 'iŋlisigbe (Guam nutome)', 'en_GY' => 'iŋlisigbe (Guyanadu)', 'en_HK' => 'iŋlisigbe (Hɔng Kɔng SAR Tsaina nutome)', + 'en_HU' => 'iŋlisigbe (Hungari nutome)', 'en_ID' => 'iŋlisigbe (Indonesia nutome)', 'en_IE' => 'iŋlisigbe (Ireland nutome)', 'en_IL' => 'iŋlisigbe (Israel nutome)', 'en_IM' => 'iŋlisigbe (Aisle of Man nutome)', 'en_IN' => 'iŋlisigbe (India nutome)', + 'en_IT' => 'iŋlisigbe (Italia nutome)', 'en_JE' => 'iŋlisigbe (Dzɛse nutome)', 'en_JM' => 'iŋlisigbe (Dzamaika nutome)', 'en_KE' => 'iŋlisigbe (Kenya nutome)', @@ -161,15 +167,19 @@ 'en_NF' => 'iŋlisigbe (Norfolk ƒudomekpo nutome)', 'en_NG' => 'iŋlisigbe (Nigeria nutome)', 'en_NL' => 'iŋlisigbe (Netherlands nutome)', + 'en_NO' => 'iŋlisigbe (Norway nutome)', 'en_NR' => 'iŋlisigbe (Nauru nutome)', 'en_NU' => 'iŋlisigbe (Niue nutome)', 'en_NZ' => 'iŋlisigbe (New Zealand nutome)', 'en_PG' => 'iŋlisigbe (Papua New Gini nutome)', 'en_PH' => 'iŋlisigbe (Filipini nutome)', 'en_PK' => 'iŋlisigbe (Pakistan nutome)', + 'en_PL' => 'iŋlisigbe (Poland nutome)', 'en_PN' => 'iŋlisigbe (Pitkairn ƒudomekpo nutome)', 'en_PR' => 'iŋlisigbe (Puerto Riko nutome)', + 'en_PT' => 'iŋlisigbe (Portugal nutome)', 'en_PW' => 'iŋlisigbe (Palau nutome)', + 'en_RO' => 'iŋlisigbe (Romania nutome)', 'en_RW' => 'iŋlisigbe (Rwanda nutome)', 'en_SB' => 'iŋlisigbe (Solomon ƒudomekpowo nutome)', 'en_SC' => 'iŋlisigbe (Seshɛls nutome)', @@ -178,6 +188,7 @@ 'en_SG' => 'iŋlisigbe (Singapɔr nutome)', 'en_SH' => 'iŋlisigbe (Saint Helena nutome)', 'en_SI' => 'iŋlisigbe (Slovenia nutome)', + 'en_SK' => 'iŋlisigbe (Slovakia nutome)', 'en_SL' => 'iŋlisigbe (Sierra Leone nutome)', 'en_SZ' => 'iŋlisigbe (Swaziland nutome)', 'en_TC' => 'iŋlisigbe (Tɛks kple Kaikos ƒudomekpowo nutome)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/el.php b/src/Symfony/Component/Intl/Resources/data/locales/el.php index f7321ff73213d..5fc8cd47235ae 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/el.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/el.php @@ -121,29 +121,35 @@ 'en_CM' => 'Αγγλικά (Καμερούν)', 'en_CX' => 'Αγγλικά (Νήσος των Χριστουγέννων)', 'en_CY' => 'Αγγλικά (Κύπρος)', + 'en_CZ' => 'Αγγλικά (Τσεχία)', 'en_DE' => 'Αγγλικά (Γερμανία)', 'en_DK' => 'Αγγλικά (Δανία)', 'en_DM' => 'Αγγλικά (Ντομίνικα)', 'en_ER' => 'Αγγλικά (Ερυθραία)', + 'en_ES' => 'Αγγλικά (Ισπανία)', 'en_FI' => 'Αγγλικά (Φινλανδία)', 'en_FJ' => 'Αγγλικά (Φίτζι)', 'en_FK' => 'Αγγλικά (Νήσοι Φόκλαντ)', 'en_FM' => 'Αγγλικά (Μικρονησία)', + 'en_FR' => 'Αγγλικά (Γαλλία)', 'en_GB' => 'Αγγλικά (Ηνωμένο Βασίλειο)', 'en_GD' => 'Αγγλικά (Γρενάδα)', 'en_GG' => 'Αγγλικά (Γκέρνζι)', 'en_GH' => 'Αγγλικά (Γκάνα)', 'en_GI' => 'Αγγλικά (Γιβραλτάρ)', 'en_GM' => 'Αγγλικά (Γκάμπια)', + 'en_GS' => 'Αγγλικά (Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς)', 'en_GU' => 'Αγγλικά (Γκουάμ)', 'en_GY' => 'Αγγλικά (Γουιάνα)', 'en_HK' => 'Αγγλικά (Χονγκ Κονγκ ΕΔΠ Κίνας)', + 'en_HU' => 'Αγγλικά (Ουγγαρία)', 'en_ID' => 'Αγγλικά (Ινδονησία)', 'en_IE' => 'Αγγλικά (Ιρλανδία)', 'en_IL' => 'Αγγλικά (Ισραήλ)', 'en_IM' => 'Αγγλικά (Νήσος του Μαν)', 'en_IN' => 'Αγγλικά (Ινδία)', 'en_IO' => 'Αγγλικά (Βρετανικά Εδάφη Ινδικού Ωκεανού)', + 'en_IT' => 'Αγγλικά (Ιταλία)', 'en_JE' => 'Αγγλικά (Τζέρζι)', 'en_JM' => 'Αγγλικά (Τζαμάικα)', 'en_KE' => 'Αγγλικά (Κένυα)', @@ -167,15 +173,19 @@ 'en_NF' => 'Αγγλικά (Νήσος Νόρφολκ)', 'en_NG' => 'Αγγλικά (Νιγηρία)', 'en_NL' => 'Αγγλικά (Κάτω Χώρες)', + 'en_NO' => 'Αγγλικά (Νορβηγία)', 'en_NR' => 'Αγγλικά (Ναουρού)', 'en_NU' => 'Αγγλικά (Νιούε)', 'en_NZ' => 'Αγγλικά (Νέα Ζηλανδία)', 'en_PG' => 'Αγγλικά (Παπούα Νέα Γουινέα)', 'en_PH' => 'Αγγλικά (Φιλιππίνες)', 'en_PK' => 'Αγγλικά (Πακιστάν)', + 'en_PL' => 'Αγγλικά (Πολωνία)', 'en_PN' => 'Αγγλικά (Νήσοι Πίτκερν)', 'en_PR' => 'Αγγλικά (Πουέρτο Ρίκο)', + 'en_PT' => 'Αγγλικά (Πορτογαλία)', 'en_PW' => 'Αγγλικά (Παλάου)', + 'en_RO' => 'Αγγλικά (Ρουμανία)', 'en_RW' => 'Αγγλικά (Ρουάντα)', 'en_SB' => 'Αγγλικά (Νήσοι Σολομώντος)', 'en_SC' => 'Αγγλικά (Σεϋχέλλες)', @@ -184,6 +194,7 @@ 'en_SG' => 'Αγγλικά (Σιγκαπούρη)', 'en_SH' => 'Αγγλικά (Αγία Ελένη)', 'en_SI' => 'Αγγλικά (Σλοβενία)', + 'en_SK' => 'Αγγλικά (Σλοβακία)', 'en_SL' => 'Αγγλικά (Σιέρα Λεόνε)', 'en_SS' => 'Αγγλικά (Νότιο Σουδάν)', 'en_SX' => 'Αγγλικά (Άγιος Μαρτίνος [Ολλανδικό τμήμα])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/en.php b/src/Symfony/Component/Intl/Resources/data/locales/en.php index 3814a240bdba7..1959ed8ab2948 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/en.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/en.php @@ -121,29 +121,35 @@ 'en_CM' => 'English (Cameroon)', 'en_CX' => 'English (Christmas Island)', 'en_CY' => 'English (Cyprus)', + 'en_CZ' => 'English (Czechia)', 'en_DE' => 'English (Germany)', 'en_DK' => 'English (Denmark)', 'en_DM' => 'English (Dominica)', 'en_ER' => 'English (Eritrea)', + 'en_ES' => 'English (Spain)', 'en_FI' => 'English (Finland)', 'en_FJ' => 'English (Fiji)', 'en_FK' => 'English (Falkland Islands)', 'en_FM' => 'English (Micronesia)', + 'en_FR' => 'English (France)', 'en_GB' => 'English (United Kingdom)', 'en_GD' => 'English (Grenada)', 'en_GG' => 'English (Guernsey)', 'en_GH' => 'English (Ghana)', 'en_GI' => 'English (Gibraltar)', 'en_GM' => 'English (Gambia)', + 'en_GS' => 'English (South Georgia & South Sandwich Islands)', 'en_GU' => 'English (Guam)', 'en_GY' => 'English (Guyana)', 'en_HK' => 'English (Hong Kong SAR China)', + 'en_HU' => 'English (Hungary)', 'en_ID' => 'English (Indonesia)', 'en_IE' => 'English (Ireland)', 'en_IL' => 'English (Israel)', 'en_IM' => 'English (Isle of Man)', 'en_IN' => 'English (India)', 'en_IO' => 'English (British Indian Ocean Territory)', + 'en_IT' => 'English (Italy)', 'en_JE' => 'English (Jersey)', 'en_JM' => 'English (Jamaica)', 'en_KE' => 'English (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'English (Norfolk Island)', 'en_NG' => 'English (Nigeria)', 'en_NL' => 'English (Netherlands)', + 'en_NO' => 'English (Norway)', 'en_NR' => 'English (Nauru)', 'en_NU' => 'English (Niue)', 'en_NZ' => 'English (New Zealand)', 'en_PG' => 'English (Papua New Guinea)', 'en_PH' => 'English (Philippines)', 'en_PK' => 'English (Pakistan)', + 'en_PL' => 'English (Poland)', 'en_PN' => 'English (Pitcairn Islands)', 'en_PR' => 'English (Puerto Rico)', + 'en_PT' => 'English (Portugal)', 'en_PW' => 'English (Palau)', + 'en_RO' => 'English (Romania)', 'en_RW' => 'English (Rwanda)', 'en_SB' => 'English (Solomon Islands)', 'en_SC' => 'English (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'English (Singapore)', 'en_SH' => 'English (St. Helena)', 'en_SI' => 'English (Slovenia)', + 'en_SK' => 'English (Slovakia)', 'en_SL' => 'English (Sierra Leone)', 'en_SS' => 'English (South Sudan)', 'en_SX' => 'English (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/en_CA.php b/src/Symfony/Component/Intl/Resources/data/locales/en_CA.php index e09f86450c562..500888fb75e93 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/en_CA.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/en_CA.php @@ -10,6 +10,7 @@ 'bs_Cyrl_BA' => 'Bosnian (Cyrillic, Bosnia and Herzegovina)', 'bs_Latn_BA' => 'Bosnian (Latin, Bosnia and Herzegovina)', 'en_AG' => 'English (Antigua and Barbuda)', + 'en_GS' => 'English (South Georgia and South Sandwich Islands)', 'en_KN' => 'English (Saint Kitts and Nevis)', 'en_LC' => 'English (Saint Lucia)', 'en_SH' => 'English (Saint Helena)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/eo.php b/src/Symfony/Component/Intl/Resources/data/locales/eo.php index 6ecc2fbd1dec6..0f6bbfbc66337 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/eo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/eo.php @@ -100,24 +100,30 @@ 'en_CK' => 'angla (Kukinsuloj)', 'en_CM' => 'angla (Kameruno)', 'en_CY' => 'angla (Kipro)', + 'en_CZ' => 'angla (Ĉeĥujo)', 'en_DE' => 'angla (Germanujo)', 'en_DK' => 'angla (Danujo)', 'en_DM' => 'angla (Dominiko)', 'en_ER' => 'angla (Eritreo)', + 'en_ES' => 'angla (Hispanujo)', 'en_FI' => 'angla (Finnlando)', 'en_FJ' => 'angla (Fiĝoj)', 'en_FM' => 'angla (Mikronezio)', + 'en_FR' => 'angla (Francujo)', 'en_GB' => 'angla (Unuiĝinta Reĝlando)', 'en_GD' => 'angla (Grenado)', 'en_GH' => 'angla (Ganao)', 'en_GI' => 'angla (Ĝibraltaro)', 'en_GM' => 'angla (Gambio)', + 'en_GS' => 'angla (Sud-Georgio kaj Sud-Sandviĉinsuloj)', 'en_GU' => 'angla (Gvamo)', 'en_GY' => 'angla (Gujano)', + 'en_HU' => 'angla (Hungarujo)', 'en_ID' => 'angla (Indonezio)', 'en_IE' => 'angla (Irlando)', 'en_IL' => 'angla (Israelo)', 'en_IN' => 'angla (Hindujo)', + 'en_IT' => 'angla (Italujo)', 'en_JM' => 'angla (Jamajko)', 'en_KE' => 'angla (Kenjo)', 'en_KI' => 'angla (Kiribato)', @@ -138,15 +144,19 @@ 'en_NF' => 'angla (Norfolkinsulo)', 'en_NG' => 'angla (Niĝerio)', 'en_NL' => 'angla (Nederlando)', + 'en_NO' => 'angla (Norvegujo)', 'en_NR' => 'angla (Nauro)', 'en_NU' => 'angla (Niuo)', 'en_NZ' => 'angla (Nov-Zelando)', 'en_PG' => 'angla (Papuo-Nov-Gvineo)', 'en_PH' => 'angla (Filipinoj)', 'en_PK' => 'angla (Pakistano)', + 'en_PL' => 'angla (Pollando)', 'en_PN' => 'angla (Pitkarna Insulo)', 'en_PR' => 'angla (Puertoriko)', + 'en_PT' => 'angla (Portugalujo)', 'en_PW' => 'angla (Palaŭo)', + 'en_RO' => 'angla (Rumanujo)', 'en_RW' => 'angla (Ruando)', 'en_SB' => 'angla (Salomonoj)', 'en_SC' => 'angla (Sejŝeloj)', @@ -155,6 +165,7 @@ 'en_SG' => 'angla (Singapuro)', 'en_SH' => 'angla (Sankta Heleno)', 'en_SI' => 'angla (Slovenujo)', + 'en_SK' => 'angla (Slovakujo)', 'en_SL' => 'angla (Sieraleono)', 'en_SZ' => 'angla (Svazilando)', 'en_TO' => 'angla (Tongo)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/es.php b/src/Symfony/Component/Intl/Resources/data/locales/es.php index 82c3ab0b165e8..0cf4c47dbb392 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/es.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/es.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglés (Camerún)', 'en_CX' => 'inglés (Isla de Navidad)', 'en_CY' => 'inglés (Chipre)', + 'en_CZ' => 'inglés (Chequia)', 'en_DE' => 'inglés (Alemania)', 'en_DK' => 'inglés (Dinamarca)', 'en_DM' => 'inglés (Dominica)', 'en_ER' => 'inglés (Eritrea)', + 'en_ES' => 'inglés (España)', 'en_FI' => 'inglés (Finlandia)', 'en_FJ' => 'inglés (Fiyi)', 'en_FK' => 'inglés (Islas Malvinas)', 'en_FM' => 'inglés (Micronesia)', + 'en_FR' => 'inglés (Francia)', 'en_GB' => 'inglés (Reino Unido)', 'en_GD' => 'inglés (Granada)', 'en_GG' => 'inglés (Guernesey)', 'en_GH' => 'inglés (Ghana)', 'en_GI' => 'inglés (Gibraltar)', 'en_GM' => 'inglés (Gambia)', + 'en_GS' => 'inglés (Islas Georgia del Sur y Sandwich del Sur)', 'en_GU' => 'inglés (Guam)', 'en_GY' => 'inglés (Guyana)', 'en_HK' => 'inglés (RAE de Hong Kong [China])', + 'en_HU' => 'inglés (Hungría)', 'en_ID' => 'inglés (Indonesia)', 'en_IE' => 'inglés (Irlanda)', 'en_IL' => 'inglés (Israel)', 'en_IM' => 'inglés (Isla de Man)', 'en_IN' => 'inglés (India)', 'en_IO' => 'inglés (Territorio Británico del Océano Índico)', + 'en_IT' => 'inglés (Italia)', 'en_JE' => 'inglés (Jersey)', 'en_JM' => 'inglés (Jamaica)', 'en_KE' => 'inglés (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglés (Isla Norfolk)', 'en_NG' => 'inglés (Nigeria)', 'en_NL' => 'inglés (Países Bajos)', + 'en_NO' => 'inglés (Noruega)', 'en_NR' => 'inglés (Nauru)', 'en_NU' => 'inglés (Niue)', 'en_NZ' => 'inglés (Nueva Zelanda)', 'en_PG' => 'inglés (Papúa Nueva Guinea)', 'en_PH' => 'inglés (Filipinas)', 'en_PK' => 'inglés (Pakistán)', + 'en_PL' => 'inglés (Polonia)', 'en_PN' => 'inglés (Islas Pitcairn)', 'en_PR' => 'inglés (Puerto Rico)', + 'en_PT' => 'inglés (Portugal)', 'en_PW' => 'inglés (Palaos)', + 'en_RO' => 'inglés (Rumanía)', 'en_RW' => 'inglés (Ruanda)', 'en_SB' => 'inglés (Islas Salomón)', 'en_SC' => 'inglés (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglés (Singapur)', 'en_SH' => 'inglés (Santa Elena)', 'en_SI' => 'inglés (Eslovenia)', + 'en_SK' => 'inglés (Eslovaquia)', 'en_SL' => 'inglés (Sierra Leona)', 'en_SS' => 'inglés (Sudán del Sur)', 'en_SX' => 'inglés (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/es_419.php b/src/Symfony/Component/Intl/Resources/data/locales/es_419.php index f8448321f193e..b1d8f6d91e8ee 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/es_419.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/es_419.php @@ -11,6 +11,8 @@ 'bs_Latn' => 'bosnio (latín)', 'bs_Latn_BA' => 'bosnio (latín, Bosnia-Herzegovina)', 'en_001' => 'inglés (mundo)', + 'en_GS' => 'inglés (Islas Georgia del Sur y Sándwich del Sur)', + 'en_RO' => 'inglés (Rumania)', 'en_UM' => 'inglés (Islas Ultramarinas de EE.UU.)', 'eo_001' => 'esperanto (mundo)', 'eu' => 'vasco', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/et.php b/src/Symfony/Component/Intl/Resources/data/locales/et.php index e3454e02679dc..6753a81917486 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/et.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/et.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglise (Kamerun)', 'en_CX' => 'inglise (Jõulusaar)', 'en_CY' => 'inglise (Küpros)', + 'en_CZ' => 'inglise (Tšehhi)', 'en_DE' => 'inglise (Saksamaa)', 'en_DK' => 'inglise (Taani)', 'en_DM' => 'inglise (Dominica)', 'en_ER' => 'inglise (Eritrea)', + 'en_ES' => 'inglise (Hispaania)', 'en_FI' => 'inglise (Soome)', 'en_FJ' => 'inglise (Fidži)', 'en_FK' => 'inglise (Falklandi saared)', 'en_FM' => 'inglise (Mikroneesia)', + 'en_FR' => 'inglise (Prantsusmaa)', 'en_GB' => 'inglise (Ühendkuningriik)', 'en_GD' => 'inglise (Grenada)', 'en_GG' => 'inglise (Guernsey)', 'en_GH' => 'inglise (Ghana)', 'en_GI' => 'inglise (Gibraltar)', 'en_GM' => 'inglise (Gambia)', + 'en_GS' => 'inglise (Lõuna-Georgia ja Lõuna-Sandwichi saared)', 'en_GU' => 'inglise (Guam)', 'en_GY' => 'inglise (Guyana)', 'en_HK' => 'inglise (Hongkongi erihalduspiirkond)', + 'en_HU' => 'inglise (Ungari)', 'en_ID' => 'inglise (Indoneesia)', 'en_IE' => 'inglise (Iirimaa)', 'en_IL' => 'inglise (Iisrael)', 'en_IM' => 'inglise (Mani saar)', 'en_IN' => 'inglise (India)', 'en_IO' => 'inglise (Briti India ookeani ala)', + 'en_IT' => 'inglise (Itaalia)', 'en_JE' => 'inglise (Jersey)', 'en_JM' => 'inglise (Jamaica)', 'en_KE' => 'inglise (Keenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglise (Norfolk)', 'en_NG' => 'inglise (Nigeeria)', 'en_NL' => 'inglise (Holland)', + 'en_NO' => 'inglise (Norra)', 'en_NR' => 'inglise (Nauru)', 'en_NU' => 'inglise (Niue)', 'en_NZ' => 'inglise (Uus-Meremaa)', 'en_PG' => 'inglise (Paapua Uus-Guinea)', 'en_PH' => 'inglise (Filipiinid)', 'en_PK' => 'inglise (Pakistan)', + 'en_PL' => 'inglise (Poola)', 'en_PN' => 'inglise (Pitcairni saared)', 'en_PR' => 'inglise (Puerto Rico)', + 'en_PT' => 'inglise (Portugal)', 'en_PW' => 'inglise (Belau)', + 'en_RO' => 'inglise (Rumeenia)', 'en_RW' => 'inglise (Rwanda)', 'en_SB' => 'inglise (Saalomoni Saared)', 'en_SC' => 'inglise (Seišellid)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglise (Singapur)', 'en_SH' => 'inglise (Saint Helena)', 'en_SI' => 'inglise (Sloveenia)', + 'en_SK' => 'inglise (Slovakkia)', 'en_SL' => 'inglise (Sierra Leone)', 'en_SS' => 'inglise (Lõuna-Sudaan)', 'en_SX' => 'inglise (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/eu.php b/src/Symfony/Component/Intl/Resources/data/locales/eu.php index 9f97dec3c1ba0..a41ea496d6849 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/eu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/eu.php @@ -121,29 +121,35 @@ 'en_CM' => 'ingelesa (Kamerun)', 'en_CX' => 'ingelesa (Christmas uhartea)', 'en_CY' => 'ingelesa (Zipre)', + 'en_CZ' => 'ingelesa (Txekia)', 'en_DE' => 'ingelesa (Alemania)', 'en_DK' => 'ingelesa (Danimarka)', 'en_DM' => 'ingelesa (Dominika)', 'en_ER' => 'ingelesa (Eritrea)', + 'en_ES' => 'ingelesa (Espainia)', 'en_FI' => 'ingelesa (Finlandia)', 'en_FJ' => 'ingelesa (Fiji)', 'en_FK' => 'ingelesa (Falklandak)', 'en_FM' => 'ingelesa (Mikronesia)', + 'en_FR' => 'ingelesa (Frantzia)', 'en_GB' => 'ingelesa (Erresuma Batua)', 'en_GD' => 'ingelesa (Grenada)', 'en_GG' => 'ingelesa (Guernesey)', 'en_GH' => 'ingelesa (Ghana)', 'en_GI' => 'ingelesa (Gibraltar)', 'en_GM' => 'ingelesa (Gambia)', + 'en_GS' => 'ingelesa (Hegoaldeko Georgia eta Hegoaldeko Sandwich uharteak)', 'en_GU' => 'ingelesa (Guam)', 'en_GY' => 'ingelesa (Guyana)', 'en_HK' => 'ingelesa (Hong Kong Txinako AEB)', + 'en_HU' => 'ingelesa (Hungaria)', 'en_ID' => 'ingelesa (Indonesia)', 'en_IE' => 'ingelesa (Irlanda)', 'en_IL' => 'ingelesa (Israel)', 'en_IM' => 'ingelesa (Man uhartea)', 'en_IN' => 'ingelesa (India)', 'en_IO' => 'ingelesa (Indiako Ozeanoko lurralde britainiarra)', + 'en_IT' => 'ingelesa (Italia)', 'en_JE' => 'ingelesa (Jersey)', 'en_JM' => 'ingelesa (Jamaika)', 'en_KE' => 'ingelesa (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'ingelesa (Norfolk uhartea)', 'en_NG' => 'ingelesa (Nigeria)', 'en_NL' => 'ingelesa (Herbehereak)', + 'en_NO' => 'ingelesa (Norvegia)', 'en_NR' => 'ingelesa (Nauru)', 'en_NU' => 'ingelesa (Niue)', 'en_NZ' => 'ingelesa (Zeelanda Berria)', 'en_PG' => 'ingelesa (Papua Ginea Berria)', 'en_PH' => 'ingelesa (Filipinak)', 'en_PK' => 'ingelesa (Pakistan)', + 'en_PL' => 'ingelesa (Polonia)', 'en_PN' => 'ingelesa (Pitcairn uharteak)', 'en_PR' => 'ingelesa (Puerto Rico)', + 'en_PT' => 'ingelesa (Portugal)', 'en_PW' => 'ingelesa (Palau)', + 'en_RO' => 'ingelesa (Errumania)', 'en_RW' => 'ingelesa (Ruanda)', 'en_SB' => 'ingelesa (Salomon Uharteak)', 'en_SC' => 'ingelesa (Seychelleak)', @@ -184,6 +194,7 @@ 'en_SG' => 'ingelesa (Singapur)', 'en_SH' => 'ingelesa (Santa Helena)', 'en_SI' => 'ingelesa (Eslovenia)', + 'en_SK' => 'ingelesa (Eslovakia)', 'en_SL' => 'ingelesa (Sierra Leona)', 'en_SS' => 'ingelesa (Hego Sudan)', 'en_SX' => 'ingelesa (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fa.php b/src/Symfony/Component/Intl/Resources/data/locales/fa.php index 339f3e6d51b09..339e0aef9143b 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fa.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fa.php @@ -121,29 +121,35 @@ 'en_CM' => 'انگلیسی (کامرون)', 'en_CX' => 'انگلیسی (جزیرهٔ کریسمس)', 'en_CY' => 'انگلیسی (قبرس)', + 'en_CZ' => 'انگلیسی (چک)', 'en_DE' => 'انگلیسی (آلمان)', 'en_DK' => 'انگلیسی (دانمارک)', 'en_DM' => 'انگلیسی (دومینیکا)', 'en_ER' => 'انگلیسی (اریتره)', + 'en_ES' => 'انگلیسی (اسپانیا)', 'en_FI' => 'انگلیسی (فنلاند)', 'en_FJ' => 'انگلیسی (فیجی)', 'en_FK' => 'انگلیسی (جزایر فالکلند)', 'en_FM' => 'انگلیسی (میکرونزی)', + 'en_FR' => 'انگلیسی (فرانسه)', 'en_GB' => 'انگلیسی (بریتانیا)', 'en_GD' => 'انگلیسی (گرنادا)', 'en_GG' => 'انگلیسی (گرنزی)', 'en_GH' => 'انگلیسی (غنا)', 'en_GI' => 'انگلیسی (جبل‌الطارق)', 'en_GM' => 'انگلیسی (گامبیا)', + 'en_GS' => 'انگلیسی (جورجیای جنوبی و جزایر ساندویچ جنوبی)', 'en_GU' => 'انگلیسی (گوام)', 'en_GY' => 'انگلیسی (گویان)', 'en_HK' => 'انگلیسی (هنگ‌کنگ، منطقهٔ ویژهٔ اداری چین)', + 'en_HU' => 'انگلیسی (مجارستان)', 'en_ID' => 'انگلیسی (اندونزی)', 'en_IE' => 'انگلیسی (ایرلند)', 'en_IL' => 'انگلیسی (اسرائیل)', 'en_IM' => 'انگلیسی (جزیرهٔ من)', 'en_IN' => 'انگلیسی (هند)', 'en_IO' => 'انگلیسی (قلمرو بریتانیا در اقیانوس هند)', + 'en_IT' => 'انگلیسی (ایتالیا)', 'en_JE' => 'انگلیسی (جرزی)', 'en_JM' => 'انگلیسی (جامائیکا)', 'en_KE' => 'انگلیسی (کنیا)', @@ -167,15 +173,19 @@ 'en_NF' => 'انگلیسی (جزیرهٔ نورفولک)', 'en_NG' => 'انگلیسی (نیجریه)', 'en_NL' => 'انگلیسی (هلند)', + 'en_NO' => 'انگلیسی (نروژ)', 'en_NR' => 'انگلیسی (نائورو)', 'en_NU' => 'انگلیسی (نیوئه)', 'en_NZ' => 'انگلیسی (نیوزیلند)', 'en_PG' => 'انگلیسی (پاپوا گینهٔ نو)', 'en_PH' => 'انگلیسی (فیلیپین)', 'en_PK' => 'انگلیسی (پاکستان)', + 'en_PL' => 'انگلیسی (لهستان)', 'en_PN' => 'انگلیسی (جزایر پیت‌کرن)', 'en_PR' => 'انگلیسی (پورتوریکو)', + 'en_PT' => 'انگلیسی (پرتغال)', 'en_PW' => 'انگلیسی (پالائو)', + 'en_RO' => 'انگلیسی (رومانی)', 'en_RW' => 'انگلیسی (رواندا)', 'en_SB' => 'انگلیسی (جزایر سلیمان)', 'en_SC' => 'انگلیسی (سیشل)', @@ -184,6 +194,7 @@ 'en_SG' => 'انگلیسی (سنگاپور)', 'en_SH' => 'انگلیسی (سنت هلن)', 'en_SI' => 'انگلیسی (اسلوونی)', + 'en_SK' => 'انگلیسی (اسلواکی)', 'en_SL' => 'انگلیسی (سیرالئون)', 'en_SS' => 'انگلیسی (سودان جنوبی)', 'en_SX' => 'انگلیسی (سنت مارتن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fa_AF.php b/src/Symfony/Component/Intl/Resources/data/locales/fa_AF.php index e36883e079732..b3f0d5329b103 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fa_AF.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fa_AF.php @@ -33,6 +33,7 @@ 'en_CH' => 'انگلیسی (سویس)', 'en_DK' => 'انگلیسی (دنمارک)', 'en_ER' => 'انگلیسی (اریتریا)', + 'en_ES' => 'انگلیسی (هسپانیه)', 'en_FI' => 'انگلیسی (فنلند)', 'en_FM' => 'انگلیسی (میکرونزیا)', 'en_GD' => 'انگلیسی (گرینادا)', @@ -48,11 +49,16 @@ 'en_MY' => 'انگلیسی (مالیزیا)', 'en_NG' => 'انگلیسی (نیجریا)', 'en_NL' => 'انگلیسی (هالند)', + 'en_NO' => 'انگلیسی (ناروی)', 'en_NZ' => 'انگلیسی (زیلاند جدید)', 'en_PG' => 'انگلیسی (پاپوا نیو گینیا)', + 'en_PL' => 'انگلیسی (پولند)', + 'en_PT' => 'انگلیسی (پرتگال)', + 'en_RO' => 'انگلیسی (رومانیا)', 'en_SE' => 'انگلیسی (سویدن)', 'en_SG' => 'انگلیسی (سینگاپور)', 'en_SI' => 'انگلیسی (سلونیا)', + 'en_SK' => 'انگلیسی (سلواکیا)', 'en_SL' => 'انگلیسی (سیرالیون)', 'en_UG' => 'انگلیسی (یوگاندا)', 'en_VC' => 'انگلیسی (سنت وینسنت و گرنادین‌ها)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ff.php b/src/Symfony/Component/Intl/Resources/data/locales/ff.php index e293b629555ba..bc2daf64702c3 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ff.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ff.php @@ -71,14 +71,17 @@ 'en_CK' => 'Engeleere (Duuɗe Kuuk)', 'en_CM' => 'Engeleere (Kameruun)', 'en_CY' => 'Engeleere (Siipar)', + 'en_CZ' => 'Engeleere (Ndenndaandi Cek)', 'en_DE' => 'Engeleere (Almaañ)', 'en_DK' => 'Engeleere (Danmark)', 'en_DM' => 'Engeleere (Dominika)', 'en_ER' => 'Engeleere (Eriteree)', + 'en_ES' => 'Engeleere (Espaañ)', 'en_FI' => 'Engeleere (Fenland)', 'en_FJ' => 'Engeleere (Fijji)', 'en_FK' => 'Engeleere (Duuɗe Falkland)', 'en_FM' => 'Engeleere (Mikoronesii)', + 'en_FR' => 'Engeleere (Farayse)', 'en_GB' => 'Engeleere (Laamateeri Rentundi)', 'en_GD' => 'Engeleere (Garnaad)', 'en_GH' => 'Engeleere (Ganaa)', @@ -86,10 +89,12 @@ 'en_GM' => 'Engeleere (Gammbi)', 'en_GU' => 'Engeleere (Guwam)', 'en_GY' => 'Engeleere (Giyaan)', + 'en_HU' => 'Engeleere (Onngiri)', 'en_ID' => 'Engeleere (Enndonesii)', 'en_IE' => 'Engeleere (Irlannda)', 'en_IL' => 'Engeleere (Israa’iila)', 'en_IN' => 'Engeleere (Enndo)', + 'en_IT' => 'Engeleere (Itali)', 'en_JM' => 'Engeleere (Jamayka)', 'en_KE' => 'Engeleere (Keñaa)', 'en_KI' => 'Engeleere (Kiribari)', @@ -111,15 +116,19 @@ 'en_NF' => 'Engeleere (Duuɗe Norfolk)', 'en_NG' => 'Engeleere (Nijeriyaa)', 'en_NL' => 'Engeleere (Nederlannda)', + 'en_NO' => 'Engeleere (Norwees)', 'en_NR' => 'Engeleere (Nawuru)', 'en_NU' => 'Engeleere (Niuwe)', 'en_NZ' => 'Engeleere (Nuwel Selannda)', 'en_PG' => 'Engeleere (Papuwaa Nuwel Gine)', 'en_PH' => 'Engeleere (Filipiin)', 'en_PK' => 'Engeleere (Pakistaan)', + 'en_PL' => 'Engeleere (Poloñ)', 'en_PN' => 'Engeleere (Pitkern)', 'en_PR' => 'Engeleere (Porto Rikoo)', + 'en_PT' => 'Engeleere (Purtugaal)', 'en_PW' => 'Engeleere (Palawu)', + 'en_RO' => 'Engeleere (Rumanii)', 'en_RW' => 'Engeleere (Ruwanndaa)', 'en_SB' => 'Engeleere (Duuɗe Solomon)', 'en_SC' => 'Engeleere (Seysel)', @@ -128,6 +137,7 @@ 'en_SG' => 'Engeleere (Sinngapuur)', 'en_SH' => 'Engeleere (Sent Helen)', 'en_SI' => 'Engeleere (Slowenii)', + 'en_SK' => 'Engeleere (Slowakii)', 'en_SL' => 'Engeleere (Seraa liyon)', 'en_SZ' => 'Engeleere (Swaasilannda)', 'en_TC' => 'Engeleere (Duuɗe Turke e Keikoos)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ff_Adlm.php b/src/Symfony/Component/Intl/Resources/data/locales/ff_Adlm.php index df93ce158e14f..f781ba89e03f4 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ff_Adlm.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ff_Adlm.php @@ -121,28 +121,34 @@ 'en_CM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤑𞤢𞤥𞤢𞤪𞤵𞥅𞤲)', 'en_CX' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤪𞤭𞥅𞤪𞤫 𞤑𞤭𞤪𞤧𞤭𞤥𞤢𞥄𞤧)', 'en_CY' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤑𞤵𞤦𞤪𞤵𞥅𞤧)', + 'en_CZ' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤕𞤫𞥅𞤳𞤭𞤴𞤢𞥄)', 'en_DE' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤔𞤫𞤪𞤥𞤢𞤲𞤭𞥅)', 'en_DK' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤁𞤢𞤲𞤵𞤥𞤢𞤪𞤳)', 'en_DM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤁𞤮𞤥𞤭𞤲𞤭𞤳𞤢𞥄)', 'en_ER' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤉𞤪𞤭𞥅𞤼𞤫𞤪𞤫)', + 'en_ES' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤉𞤧𞤨𞤢𞤻𞤢𞥄)', 'en_FI' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤊𞤭𞤲𞤤𞤢𞤲𞤣)', 'en_FJ' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤊𞤭𞤶𞤭𞥅)', 'en_FK' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤕𞤵𞤪𞤭𞥅𞤶𞤫 𞤊𞤢𞤤𞤳𞤵𞤤𞤢𞤲𞤣)', 'en_FM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤃𞤭𞤳𞤪𞤮𞤲𞤫𞥅𞤧𞤭𞤴𞤢)', + 'en_FR' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤊𞤢𞤪𞤢𞤲𞤧𞤭)', 'en_GB' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤁𞤫𞤲𞤼𞤢𞤤 𞤐𞤺𞤫𞤯𞤵𞥅𞤪𞤭)', 'en_GD' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤢𞤪𞤲𞤢𞤣𞤢𞥄)', 'en_GG' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤢𞤪𞤲𞤫𞤧𞤭𞥅)', 'en_GH' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤢𞤲𞤢)', 'en_GI' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤔𞤭𞤦𞤪𞤢𞤤𞤼𞤢𞥄)', 'en_GM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤢𞤥𞤦𞤭𞤴𞤢)', + 'en_GS' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤢𞤲𞥆𞤢𞥄𞤲𞤺𞤫 𞤔𞤮𞤪𞤶𞤭𞤴𞤢 & 𞤕𞤵𞤪𞤭𞥅𞤶𞤫 𞤐𞤢𞤲𞥆𞤢𞥄𞤲𞤺𞤫 𞤅𞤢𞤲𞤣𞤵𞤱𞤭𞥅𞤷)', 'en_GU' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤵𞤱𞤢𞥄𞤥)', 'en_GY' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤘𞤢𞤴𞤢𞤲𞤢𞥄)', 'en_HK' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤖𞤂𞤀 𞤕𞤢𞤴𞤲𞤢 𞤫 𞤖𞤮𞤲𞤺 𞤑𞤮𞤲𞤺)', + 'en_HU' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤖𞤢𞤲𞤺𞤢𞤪𞤭𞤴𞤢𞥄)', 'en_ID' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤋𞤲𞤣𞤮𞤲𞤭𞥅𞤧𞤴𞤢)', 'en_IE' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤋𞤪𞤤𞤢𞤲𞤣)', 'en_IL' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤋𞤧𞤪𞤢𞥄𞤴𞤭𞥅𞤤)', 'en_IM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤪𞤭𞥅𞤪𞤫 𞤃𞤫𞥅𞤲)', 'en_IN' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤋𞤲𞤣𞤭𞤴𞤢)', + 'en_IT' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤋𞤼𞤢𞤤𞤭𞥅)', 'en_JE' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤔𞤫𞤪𞤧𞤭𞥅)', 'en_JM' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤔𞤢𞤥𞤢𞤴𞤳𞤢𞥄)', 'en_KE' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤑𞤫𞤲𞤭𞤴𞤢𞥄)', @@ -166,15 +172,19 @@ 'en_NF' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤪𞤭𞥅𞤪𞤫 𞤐𞤮𞤪𞤬𞤮𞤤𞤳𞤵)', 'en_NG' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤢𞤶𞤫𞤪𞤭𞤴𞤢𞥄)', 'en_NL' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤖𞤮𞤤𞤢𞤲𞤣𞤭𞤴𞤢𞥄)', + 'en_NO' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤮𞤪𞤺𞤫𞤴𞤢𞥄)', 'en_NR' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤢𞤱𞤪𞤵)', 'en_NU' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤵𞥅𞤱𞤭)', 'en_NZ' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤐𞤫𞤱 𞤟𞤫𞤤𞤢𞤲𞤣)', 'en_PG' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤢𞤨𞤵𞤱𞤢 𞤘𞤭𞤲𞤫 𞤖𞤫𞤧𞤮)', 'en_PH' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤊𞤭𞤤𞤭𞤨𞤭𞥅𞤲)', 'en_PK' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤢𞤳𞤭𞤧𞤼𞤢𞥄𞤲)', + 'en_PL' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤮𞤤𞤢𞤲𞤣)', 'en_PN' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤕𞤵𞤪𞤭𞥅𞤶𞤫 𞤆𞤭𞤼𞤳𞤭𞥅𞤪𞤲𞤵)', 'en_PR' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤮𞤪𞤼𞤮 𞤈𞤭𞤳𞤮𞥅)', + 'en_PT' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤮𞥅𞤪𞤼𞤵𞤺𞤢𞥄𞤤)', 'en_PW' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤆𞤢𞤤𞤢𞤱)', + 'en_RO' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤈𞤵𞤥𞤢𞥄𞤲𞤭𞤴𞤢)', 'en_RW' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤈𞤵𞤱𞤢𞤲𞤣𞤢𞥄)', 'en_SB' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤕𞤵𞤪𞤭𞥅𞤶𞤫 𞤅𞤵𞤤𞤢𞤴𞤥𞤢𞥄𞤲)', 'en_SC' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤫𞤴𞤭𞤧𞤫𞤤)', @@ -183,6 +193,7 @@ 'en_SG' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤭𞤲𞤺𞤢𞤨𞤵𞥅𞤪)', 'en_SH' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤫𞤲-𞤖𞤫𞤤𞤫𞤲𞤢𞥄)', 'en_SI' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤤𞤮𞤾𞤫𞤲𞤭𞤴𞤢𞥄)', + 'en_SK' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤤𞤮𞤾𞤢𞥄𞤳𞤭𞤴𞤢)', 'en_SL' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤢𞤪𞤢𞤤𞤮𞤲)', 'en_SS' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤵𞤣𞤢𞥄𞤲 𞤂𞤫𞤧𞤤𞤫𞤴𞤪𞤭)', 'en_SX' => '𞤉𞤲𞤺𞤭𞤤𞤫𞥅𞤪𞤫 (𞤅𞤫𞤲𞤼𞤵 𞤃𞤢𞥄𞤪𞤼𞤫𞤲)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fi.php b/src/Symfony/Component/Intl/Resources/data/locales/fi.php index 335dea38d3d16..87edf319575c4 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fi.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fi.php @@ -121,29 +121,35 @@ 'en_CM' => 'englanti (Kamerun)', 'en_CX' => 'englanti (Joulusaari)', 'en_CY' => 'englanti (Kypros)', + 'en_CZ' => 'englanti (Tšekki)', 'en_DE' => 'englanti (Saksa)', 'en_DK' => 'englanti (Tanska)', 'en_DM' => 'englanti (Dominica)', 'en_ER' => 'englanti (Eritrea)', + 'en_ES' => 'englanti (Espanja)', 'en_FI' => 'englanti (Suomi)', 'en_FJ' => 'englanti (Fidži)', 'en_FK' => 'englanti (Falklandinsaaret)', 'en_FM' => 'englanti (Mikronesia)', + 'en_FR' => 'englanti (Ranska)', 'en_GB' => 'englanti (Iso-Britannia)', 'en_GD' => 'englanti (Grenada)', 'en_GG' => 'englanti (Guernsey)', 'en_GH' => 'englanti (Ghana)', 'en_GI' => 'englanti (Gibraltar)', 'en_GM' => 'englanti (Gambia)', + 'en_GS' => 'englanti (Etelä-Georgia ja Eteläiset Sandwichinsaaret)', 'en_GU' => 'englanti (Guam)', 'en_GY' => 'englanti (Guyana)', 'en_HK' => 'englanti (Hongkong – Kiinan erityishallintoalue)', + 'en_HU' => 'englanti (Unkari)', 'en_ID' => 'englanti (Indonesia)', 'en_IE' => 'englanti (Irlanti)', 'en_IL' => 'englanti (Israel)', 'en_IM' => 'englanti (Mansaari)', 'en_IN' => 'englanti (Intia)', 'en_IO' => 'englanti (Brittiläinen Intian valtameren alue)', + 'en_IT' => 'englanti (Italia)', 'en_JE' => 'englanti (Jersey)', 'en_JM' => 'englanti (Jamaika)', 'en_KE' => 'englanti (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'englanti (Norfolkinsaari)', 'en_NG' => 'englanti (Nigeria)', 'en_NL' => 'englanti (Alankomaat)', + 'en_NO' => 'englanti (Norja)', 'en_NR' => 'englanti (Nauru)', 'en_NU' => 'englanti (Niue)', 'en_NZ' => 'englanti (Uusi-Seelanti)', 'en_PG' => 'englanti (Papua-Uusi-Guinea)', 'en_PH' => 'englanti (Filippiinit)', 'en_PK' => 'englanti (Pakistan)', + 'en_PL' => 'englanti (Puola)', 'en_PN' => 'englanti (Pitcairn)', 'en_PR' => 'englanti (Puerto Rico)', + 'en_PT' => 'englanti (Portugali)', 'en_PW' => 'englanti (Palau)', + 'en_RO' => 'englanti (Romania)', 'en_RW' => 'englanti (Ruanda)', 'en_SB' => 'englanti (Salomonsaaret)', 'en_SC' => 'englanti (Seychellit)', @@ -184,6 +194,7 @@ 'en_SG' => 'englanti (Singapore)', 'en_SH' => 'englanti (Saint Helena)', 'en_SI' => 'englanti (Slovenia)', + 'en_SK' => 'englanti (Slovakia)', 'en_SL' => 'englanti (Sierra Leone)', 'en_SS' => 'englanti (Etelä-Sudan)', 'en_SX' => 'englanti (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fo.php b/src/Symfony/Component/Intl/Resources/data/locales/fo.php index 03274cf697a83..46296ee0138b5 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fo.php @@ -121,29 +121,35 @@ 'en_CM' => 'enskt (Kamerun)', 'en_CX' => 'enskt (Jólaoyggjin)', 'en_CY' => 'enskt (Kýpros)', + 'en_CZ' => 'enskt (Kekkia)', 'en_DE' => 'enskt (Týskland)', 'en_DK' => 'enskt (Danmark)', 'en_DM' => 'enskt (Dominika)', 'en_ER' => 'enskt (Eritrea)', + 'en_ES' => 'enskt (Spania)', 'en_FI' => 'enskt (Finnland)', 'en_FJ' => 'enskt (Fiji)', 'en_FK' => 'enskt (Falklandsoyggjar)', 'en_FM' => 'enskt (Mikronesiasamveldið)', + 'en_FR' => 'enskt (Frakland)', 'en_GB' => 'enskt (Stórabretland)', 'en_GD' => 'enskt (Grenada)', 'en_GG' => 'enskt (Guernsey)', 'en_GH' => 'enskt (Gana)', 'en_GI' => 'enskt (Gibraltar)', 'en_GM' => 'enskt (Gambia)', + 'en_GS' => 'enskt (Suðurgeorgia og Suðursandwichoyggjar)', 'en_GU' => 'enskt (Guam)', 'en_GY' => 'enskt (Gujana)', 'en_HK' => 'enskt (Hong Kong SAR Kina)', + 'en_HU' => 'enskt (Ungarn)', 'en_ID' => 'enskt (Indonesia)', 'en_IE' => 'enskt (Írland)', 'en_IL' => 'enskt (Ísrael)', 'en_IM' => 'enskt (Isle of Man)', 'en_IN' => 'enskt (India)', 'en_IO' => 'enskt (Stóra Bretlands Indiahavoyggjar)', + 'en_IT' => 'enskt (Italia)', 'en_JE' => 'enskt (Jersey)', 'en_JM' => 'enskt (Jamaika)', 'en_KE' => 'enskt (Kenja)', @@ -167,15 +173,19 @@ 'en_NF' => 'enskt (Norfolksoyggj)', 'en_NG' => 'enskt (Nigeria)', 'en_NL' => 'enskt (Niðurlond)', + 'en_NO' => 'enskt (Noreg)', 'en_NR' => 'enskt (Nauru)', 'en_NU' => 'enskt (Niue)', 'en_NZ' => 'enskt (Nýsæland)', 'en_PG' => 'enskt (Papua Nýguinea)', 'en_PH' => 'enskt (Filipsoyggjar)', 'en_PK' => 'enskt (Pakistan)', + 'en_PL' => 'enskt (Pólland)', 'en_PN' => 'enskt (Pitcairnoyggjar)', 'en_PR' => 'enskt (Puerto Riko)', + 'en_PT' => 'enskt (Portugal)', 'en_PW' => 'enskt (Palau)', + 'en_RO' => 'enskt (Rumenia)', 'en_RW' => 'enskt (Ruanda)', 'en_SB' => 'enskt (Salomonoyggjar)', 'en_SC' => 'enskt (Seyskelloyggjar)', @@ -184,6 +194,7 @@ 'en_SG' => 'enskt (Singapor)', 'en_SH' => 'enskt (St. Helena)', 'en_SI' => 'enskt (Slovenia)', + 'en_SK' => 'enskt (Slovakia)', 'en_SL' => 'enskt (Sierra Leona)', 'en_SS' => 'enskt (Suðursudan)', 'en_SX' => 'enskt (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fr.php b/src/Symfony/Component/Intl/Resources/data/locales/fr.php index 4442ae3ed0843..3fcf77327defc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fr.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fr.php @@ -121,29 +121,35 @@ 'en_CM' => 'anglais (Cameroun)', 'en_CX' => 'anglais (Île Christmas)', 'en_CY' => 'anglais (Chypre)', + 'en_CZ' => 'anglais (Tchéquie)', 'en_DE' => 'anglais (Allemagne)', 'en_DK' => 'anglais (Danemark)', 'en_DM' => 'anglais (Dominique)', 'en_ER' => 'anglais (Érythrée)', + 'en_ES' => 'anglais (Espagne)', 'en_FI' => 'anglais (Finlande)', 'en_FJ' => 'anglais (Fidji)', 'en_FK' => 'anglais (Îles Malouines)', 'en_FM' => 'anglais (Micronésie)', + 'en_FR' => 'anglais (France)', 'en_GB' => 'anglais (Royaume-Uni)', 'en_GD' => 'anglais (Grenade)', 'en_GG' => 'anglais (Guernesey)', 'en_GH' => 'anglais (Ghana)', 'en_GI' => 'anglais (Gibraltar)', 'en_GM' => 'anglais (Gambie)', + 'en_GS' => 'anglais (Géorgie du Sud-et-les Îles Sandwich du Sud)', 'en_GU' => 'anglais (Guam)', 'en_GY' => 'anglais (Guyana)', 'en_HK' => 'anglais (R.A.S. chinoise de Hong Kong)', + 'en_HU' => 'anglais (Hongrie)', 'en_ID' => 'anglais (Indonésie)', 'en_IE' => 'anglais (Irlande)', 'en_IL' => 'anglais (Israël)', 'en_IM' => 'anglais (Île de Man)', 'en_IN' => 'anglais (Inde)', 'en_IO' => 'anglais (Territoire britannique de l’océan Indien)', + 'en_IT' => 'anglais (Italie)', 'en_JE' => 'anglais (Jersey)', 'en_JM' => 'anglais (Jamaïque)', 'en_KE' => 'anglais (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'anglais (Île Norfolk)', 'en_NG' => 'anglais (Nigeria)', 'en_NL' => 'anglais (Pays-Bas)', + 'en_NO' => 'anglais (Norvège)', 'en_NR' => 'anglais (Nauru)', 'en_NU' => 'anglais (Niue)', 'en_NZ' => 'anglais (Nouvelle-Zélande)', 'en_PG' => 'anglais (Papouasie-Nouvelle-Guinée)', 'en_PH' => 'anglais (Philippines)', 'en_PK' => 'anglais (Pakistan)', + 'en_PL' => 'anglais (Pologne)', 'en_PN' => 'anglais (Îles Pitcairn)', 'en_PR' => 'anglais (Porto Rico)', + 'en_PT' => 'anglais (Portugal)', 'en_PW' => 'anglais (Palaos)', + 'en_RO' => 'anglais (Roumanie)', 'en_RW' => 'anglais (Rwanda)', 'en_SB' => 'anglais (Îles Salomon)', 'en_SC' => 'anglais (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'anglais (Singapour)', 'en_SH' => 'anglais (Sainte-Hélène)', 'en_SI' => 'anglais (Slovénie)', + 'en_SK' => 'anglais (Slovaquie)', 'en_SL' => 'anglais (Sierra Leone)', 'en_SS' => 'anglais (Soudan du Sud)', 'en_SX' => 'anglais (Saint-Martin [partie néerlandaise])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fr_BE.php b/src/Symfony/Component/Intl/Resources/data/locales/fr_BE.php index 3908ce29760c2..089c0ef10a00f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fr_BE.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fr_BE.php @@ -2,6 +2,7 @@ return [ 'Names' => [ + 'en_GS' => 'anglais (Îles Géorgie du Sud et Sandwich du Sud)', 'gu' => 'gujarati', 'gu_IN' => 'gujarati (Inde)', ], diff --git a/src/Symfony/Component/Intl/Resources/data/locales/fy.php b/src/Symfony/Component/Intl/Resources/data/locales/fy.php index e6e7cb12ce076..51c66b10e6c2b 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/fy.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/fy.php @@ -121,28 +121,34 @@ 'en_CM' => 'Ingelsk (Kameroen)', 'en_CX' => 'Ingelsk (Krysteilan)', 'en_CY' => 'Ingelsk (Syprus)', + 'en_CZ' => 'Ingelsk (Tsjechje)', 'en_DE' => 'Ingelsk (Dútslân)', 'en_DK' => 'Ingelsk (Denemarken)', 'en_DM' => 'Ingelsk (Dominika)', 'en_ER' => 'Ingelsk (Eritrea)', + 'en_ES' => 'Ingelsk (Spanje)', 'en_FI' => 'Ingelsk (Finlân)', 'en_FJ' => 'Ingelsk (Fiji)', 'en_FK' => 'Ingelsk (Falklâneilannen)', 'en_FM' => 'Ingelsk (Micronesië)', + 'en_FR' => 'Ingelsk (Frankrijk)', 'en_GB' => 'Ingelsk (Verenigd Koninkrijk)', 'en_GD' => 'Ingelsk (Grenada)', 'en_GG' => 'Ingelsk (Guernsey)', 'en_GH' => 'Ingelsk (Ghana)', 'en_GI' => 'Ingelsk (Gibraltar)', 'en_GM' => 'Ingelsk (Gambia)', + 'en_GS' => 'Ingelsk (Sûd-Georgia en Sûdlike Sandwicheilannen)', 'en_GU' => 'Ingelsk (Guam)', 'en_GY' => 'Ingelsk (Guyana)', 'en_HK' => 'Ingelsk (Hongkong SAR van Sina)', + 'en_HU' => 'Ingelsk (Hongarije)', 'en_ID' => 'Ingelsk (Yndonesië)', 'en_IE' => 'Ingelsk (Ierlân)', 'en_IL' => 'Ingelsk (Israël)', 'en_IM' => 'Ingelsk (Isle of Man)', 'en_IN' => 'Ingelsk (India)', + 'en_IT' => 'Ingelsk (Italië)', 'en_JE' => 'Ingelsk (Jersey)', 'en_JM' => 'Ingelsk (Jamaica)', 'en_KE' => 'Ingelsk (Kenia)', @@ -166,15 +172,19 @@ 'en_NF' => 'Ingelsk (Norfolkeilân)', 'en_NG' => 'Ingelsk (Nigeria)', 'en_NL' => 'Ingelsk (Nederlân)', + 'en_NO' => 'Ingelsk (Noarwegen)', 'en_NR' => 'Ingelsk (Nauru)', 'en_NU' => 'Ingelsk (Niue)', 'en_NZ' => 'Ingelsk (Nij-Seelân)', 'en_PG' => 'Ingelsk (Papoea-Nij-Guinea)', 'en_PH' => 'Ingelsk (Filipijnen)', 'en_PK' => 'Ingelsk (Pakistan)', + 'en_PL' => 'Ingelsk (Polen)', 'en_PN' => 'Ingelsk (Pitcairneilannen)', 'en_PR' => 'Ingelsk (Puerto Rico)', + 'en_PT' => 'Ingelsk (Portugal)', 'en_PW' => 'Ingelsk (Palau)', + 'en_RO' => 'Ingelsk (Roemenië)', 'en_RW' => 'Ingelsk (Rwanda)', 'en_SB' => 'Ingelsk (Salomonseilannen)', 'en_SC' => 'Ingelsk (Seychellen)', @@ -183,6 +193,7 @@ 'en_SG' => 'Ingelsk (Singapore)', 'en_SH' => 'Ingelsk (Sint-Helena)', 'en_SI' => 'Ingelsk (Slovenië)', + 'en_SK' => 'Ingelsk (Slowakije)', 'en_SL' => 'Ingelsk (Sierra Leone)', 'en_SS' => 'Ingelsk (Sûd-Soedan)', 'en_SX' => 'Ingelsk (Sint-Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ga.php b/src/Symfony/Component/Intl/Resources/data/locales/ga.php index c5420242efbea..bbf1b4ea482cf 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ga.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ga.php @@ -121,29 +121,35 @@ 'en_CM' => 'Béarla (Camarún)', 'en_CX' => 'Béarla (Oileán na Nollag)', 'en_CY' => 'Béarla (an Chipir)', + 'en_CZ' => 'Béarla (an tSeicia)', 'en_DE' => 'Béarla (an Ghearmáin)', 'en_DK' => 'Béarla (an Danmhairg)', 'en_DM' => 'Béarla (Doiminice)', 'en_ER' => 'Béarla (an Eiritré)', + 'en_ES' => 'Béarla (an Spáinn)', 'en_FI' => 'Béarla (an Fhionlainn)', 'en_FJ' => 'Béarla (Fidsí)', 'en_FK' => 'Béarla (Oileáin Fháclainne)', 'en_FM' => 'Béarla (an Mhicrinéis)', + 'en_FR' => 'Béarla (an Fhrainc)', 'en_GB' => 'Béarla (an Ríocht Aontaithe)', 'en_GD' => 'Béarla (Greanáda)', 'en_GG' => 'Béarla (Geansaí)', 'en_GH' => 'Béarla (Gána)', 'en_GI' => 'Béarla (Giobráltar)', 'en_GM' => 'Béarla (An Ghaimbia)', + 'en_GS' => 'Béarla (An tSeoirsia Theas agus Oileáin Sandwich Theas)', 'en_GU' => 'Béarla (Guam)', 10000 'en_GY' => 'Béarla (An Ghuáin)', 'en_HK' => 'Béarla (Sainréigiún Riaracháin Hong Cong, Daonphoblacht na Síne)', + 'en_HU' => 'Béarla (an Ungáir)', 'en_ID' => 'Béarla (an Indinéis)', 'en_IE' => 'Béarla (Éire)', 'en_IL' => 'Béarla (Iosrael)', 'en_IM' => 'Béarla (Oileán Mhanann)', 'en_IN' => 'Béarla (an India)', 'en_IO' => 'Béarla (Críoch Aigéan Indiach na Breataine)', + 'en_IT' => 'Béarla (an Iodáil)', 'en_JE' => 'Béarla (Geirsí)', 'en_JM' => 'Béarla (Iamáice)', 'en_KE' => 'Béarla (an Chéinia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Béarla (Oileán Norfolk)', 'en_NG' => 'Béarla (An Nigéir)', 'en_NL' => 'Béarla (an Ísiltír)', + 'en_NO' => 'Béarla (an Iorua)', 'en_NR' => 'Béarla (Nárú)', 'en_NU' => 'Béarla (Niue)', 'en_NZ' => 'Béarla (an Nua-Shéalainn)', 'en_PG' => 'Béarla (Nua-Ghuine Phapua)', 'en_PH' => 'Béarla (Na hOileáin Fhilipíneacha)', 'en_PK' => 'Béarla (an Phacastáin)', + 'en_PL' => 'Béarla (an Pholainn)', 'en_PN' => 'Béarla (Oileáin Pitcairn)', 'en_PR' => 'Béarla (Pórtó Ríce)', + 'en_PT' => 'Béarla (an Phortaingéil)', 'en_PW' => 'Béarla (Oileáin Palau)', + 'en_RO' => 'Béarla (an Rómáin)', 'en_RW' => 'Béarla (Ruanda)', 'en_SB' => 'Béarla (Oileáin Sholaimh)', 'en_SC' => 'Béarla (na Séiséil)', @@ -184,6 +194,7 @@ 'en_SG' => 'Béarla (Singeapór)', 'en_SH' => 'Béarla (San Héilin)', 'en_SI' => 'Béarla (an tSlóivéin)', + 'en_SK' => 'Béarla (an tSlóvaic)', 'en_SL' => 'Béarla (Siarra Leon)', 'en_SS' => 'Béarla (an tSúdáin Theas)', 'en_SX' => 'Béarla (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/gd.php b/src/Symfony/Component/Intl/Resources/data/locales/gd.php index 5e463796c2b93..af5ddafb21e41 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/gd.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/gd.php @@ -121,29 +121,35 @@ 'en_CM' => 'Beurla (Camarun)', 'en_CX' => 'Beurla (Eilean na Nollaig)', 'en_CY' => 'Beurla (Cìopras)', + 'en_CZ' => 'Beurla (An t-Seic)', 'en_DE' => 'Beurla (A’ Ghearmailt)', 'en_DK' => 'Beurla (An Danmhairg)', 'en_DM' => 'Beurla (Doiminicea)', 'en_ER' => 'Beurla (Eartra)', + 'en_ES' => 'Beurla (An Spàinnt)', 'en_FI' => 'Beurla (An Fhionnlann)', 'en_FJ' => 'Beurla (Fìdi)', 'en_FK' => 'Beurla (Na h-Eileanan Fàclannach)', 'en_FM' => 'Beurla (Na Meanbh-eileanan)', + 'en_FR' => 'Beurla (An Fhraing)', 'en_GB' => 'Beurla (An Rìoghachd Aonaichte)', 'en_GD' => 'Beurla (Greanàda)', 'en_GG' => 'Beurla (Geàrnsaidh)', 'en_GH' => 'Beurla (Gàna)', 'en_GI' => 'Beurla (Diobraltar)', 'en_GM' => 'Beurla (A’ Ghaimbia)', + 'en_GS' => 'Beurla (Seòirsea a Deas is na h-Eileanan Sandwich a Deas)', 'en_GU' => 'Beurla (Guam)', 'en_GY' => 'Beurla (Guidheàna)', 'en_HK' => 'Beurla (Hong Kong SAR na Sìne)', + 'en_HU' => 'Beurla (An Ungair)', 'en_ID' => 'Beurla (Na h-Innd-innse)', 'en_IE' => 'Beurla (Èirinn)', 'en_IL' => 'Beurla (Iosrael)', 'en_IM' => 'Beurla (Eilean Mhanainn)', 'en_IN' => 'Beurla (Na h-Innseachan)', 'en_IO' => 'Beurla (Ranntair Breatannach Cuan nan Innseachan)', + 'en_IT' => 'Beurla (An Eadailt)', 'en_JE' => 'Beurla (Deàrsaidh)', 'en_JM' => 'Beurla (Diameuga)', 'en_KE' => 'Beurla (Ceinia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Beurla (Eilean Norfolk)', 'en_NG' => 'Beurla (Nigèiria)', 'en_NL' => 'Beurla (Na Tìrean Ìsle)', + 'en_NO' => 'Beurla (Nirribhidh)', 'en_NR' => 'Beurla (Nabhru)', 'en_NU' => 'Beurla (Niue)', 'en_NZ' => 'Beurla (Sealainn Nuadh)', 'en_PG' => 'Beurla (Gini Nuadh Phaputhach)', 'en_PH' => 'Beurla (Na h-Eileanan Filipineach)', 'en_PK' => 'Beurla (Pagastàn)', + 'en_PL' => 'Beurla (A’ Phòlainn)', 'en_PN' => 'Beurla (Eileanan Pheit a’ Chàirn)', 'en_PR' => 'Beurla (Porto Rìceo)', + 'en_PT' => 'Beurla (A’ Phortagail)', 'en_PW' => 'Beurla (Palabh)', + 'en_RO' => 'Beurla (Romàinia)', 'en_RW' => 'Beurla (Rubhanda)', 'en_SB' => 'Beurla (Eileanan Sholaimh)', 'en_SC' => 'Beurla (Na h-Eileanan Sheiseall)', @@ -184,6 +194,7 @@ 'en_SG' => 'Beurla (Singeapòr)', 'en_SH' => 'Beurla (Eilean Naomh Eilidh)', 'en_SI' => 'Beurla (An t-Slòbhain)', + 'en_SK' => 'Beurla (An t-Slòbhac)', 'en_SL' => 'Beurla (Siarra Leòmhann)', 'en_SS' => 'Beurla (Sudàn a Deas)', 'en_SX' => 'Beurla (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/gl.php b/src/Symfony/Component/Intl/Resources/data/locales/gl.php index aa010298e4359..456dc622e3fa2 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/gl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/gl.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglés (Camerún)', 'en_CX' => 'inglés (Illa Christmas)', 'en_CY' => 'inglés (Chipre)', + 'en_CZ' => 'inglés (Chequia)', 'en_DE' => 'inglés (Alemaña)', 'en_DK' => 'inglés (Dinamarca)', 'en_DM' => 'inglés (Dominica)', 'en_ER' => 'inglés (Eritrea)', + 'en_ES' => 'inglés (España)', 'en_FI' => 'inglés (Finlandia)', 'en_FJ' => 'inglés (Fixi)', 'en_FK' => 'inglés (Illas Malvinas)', 'en_FM' => 'inglés (Micronesia)', + 'en_FR' => 'inglés (Francia)', 'en_GB' => 'inglés (Reino Unido)', 'en_GD' => 'inglés (Granada)', 'en_GG' => 'inglés (Guernsey)', 'en_GH' => 'inglés (Ghana)', 'en_GI' => 'inglés (Xibraltar)', 'en_GM' => 'inglés (Gambia)', + 'en_GS' => 'inglés (Illas Xeorxia do Sur e Sandwich do Sur)', 'en_GU' => 'inglés (Guam)', 'en_GY' => 'inglés (Güiana)', 'en_HK' => 'inglés (Hong Kong RAE da China)', + 'en_HU' => 'inglés (Hungría)', 'en_ID' => 'inglés (Indonesia)', 'en_IE' => 'inglés (Irlanda)', 'en_IL' => 'inglés (Israel)', 'en_IM' => 'inglés (Illa de Man)', 'en_IN' => 'inglés (India)', 'en_IO' => 'inglés (Territorio Británico do Océano Índico)', + 'en_IT' => 'inglés (Italia)', 'en_JE' => 'inglés (Jersey)', 'en_JM' => 'inglés (Xamaica)', 'en_KE' => 'inglés (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglés (Illa Norfolk)', 'en_NG' => 'inglés (Nixeria)', 'en_NL' => 'inglés (Países Baixos)', + 'en_NO' => 'inglés (Noruega)', 'en_NR' => 'inglés (Nauru)', 'en_NU' => 'inglés (Niue)', 'en_NZ' => 'inglés (Nova Zelandia)', 'en_PG' => 'inglés (Papúa-Nova Guinea)', 'en_PH' => 'inglés (Filipinas)', 'en_PK' => 'inglés (Paquistán)', + 'en_PL' => 'inglés (Polonia)', 'en_PN' => 'inglés (Illas Pitcairn)', 'en_PR' => 'inglés (Porto Rico)', + 'en_PT' => 'inglés (Portugal)', 'en_PW' => 'inglés (Palau)', + 'en_RO' => 'inglés (Romanía)', 'en_RW' => 'inglés (Ruanda)', 'en_SB' => 'inglés (Illas Salomón)', 'en_SC' => 'inglés (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglés (Singapur)', 'en_SH' => 'inglés (Santa Helena)', 'en_SI' => 'inglés (Eslovenia)', + 'en_SK' => 'inglés (Eslovaquia)', 'en_SL' => 'inglés (Serra Leoa)', 'en_SS' => 'inglés (Sudán do Sur)', 'en_SX' => 'inglés (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/gu.php b/src/Symfony/Component/Intl/Resources/data/locales/gu.php index 2735a315fe2a7..31f440762a957 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/gu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/gu.php @@ -121,29 +121,35 @@ 'en_CM' => 'અંગ્રેજી (કૅમરૂન)', 'en_CX' => 'અંગ્રેજી (ક્રિસમસ આઇલેન્ડ)', 'en_CY' => 'અંગ્રેજી (સાયપ્રસ)', + 'en_CZ' => 'અંગ્રેજી (ચેકીયા)', 'en_DE' => 'અંગ્રેજી (જર્મની)', 'en_DK' => 'અંગ્રેજી (ડેનમાર્ક)', 'en_DM' => 'અંગ્રેજી (ડોમિનિકા)', 'en_ER' => 'અંગ્રેજી (એરિટ્રિયા)', + 'en_ES' => 'અંગ્રેજી (સ્પેન)', 'en_FI' => 'અંગ્રેજી (ફિનલેન્ડ)', 'en_FJ' => 'અંગ્રેજી (ફીજી)', 'en_FK' => 'અંગ્રેજી (ફૉકલેન્ડ આઇલેન્ડ્સ)', 'en_FM' => 'અંગ્રેજી (માઇક્રોનેશિયા)', + 'en_FR' => 'અંગ્રેજી (ફ્રાંસ)', 'en_GB' => 'અંગ્રેજી (યુનાઇટેડ કિંગડમ)', 'en_GD' => 'અંગ્રેજી (ગ્રેનેડા)', 'en_GG' => 'અંગ્રેજી (ગ્વેર્નસે)', 'en_GH' => 'અંગ્રેજી (ઘાના)', 'en_GI' => 'અંગ્રેજી (જીબ્રાલ્ટર)', 'en_GM' => 'અંગ્રેજી (ગેમ્બિયા)', + 'en_GS' => 'અંગ્રેજી (દક્ષિણ જ્યોર્જિયા અને દક્ષિણ સેન્ડવિચ આઇલેન્ડ્સ)', 'en_GU' => 'અંગ્રેજી (ગ્વામ)', 'en_GY' => 'અંગ્રેજી (ગયાના)', 'en_HK' => 'અંગ્રેજી (હોંગકોંગ SAR ચીન)', + 'en_HU' => 'અંગ્રેજી (હંગેરી)', 'en_ID' => 'અંગ્રેજી (ઇન્ડોનેશિયા)', 'en_IE' => 'અંગ્રેજી (આયર્લેન્ડ)', 'en_IL' => 'અંગ્રેજી (ઇઝરાઇલ)', 'en_IM' => 'અંગ્રેજી (આઇલ ઑફ મેન)', 'en_IN' => 'અંગ્રેજી (ભારત)', 'en_IO' => 'અંગ્રેજી (બ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરી)', + 'en_IT' => 'અંગ્રેજી (ઇટાલી)', 'en_JE' => 'અંગ્રેજી (જર્સી)', 'en_JM' => 'અંગ્રેજી (જમૈકા)', 'en_KE' => 'અંગ્રેજી (કેન્યા)', @@ -167,15 +173,19 @@ 'en_NF' => 'અંગ્રેજી (નોરફોક આઇલેન્ડ્સ)', 'en_NG' => 'અંગ્રેજી (નાઇજેરિયા)', 'en_NL' => 'અંગ્રેજી (નેધરલેન્ડ્સ)', + 'en_NO' => 'અંગ્રેજી (નૉર્વે)', 'en_NR' => 'અંગ્રેજી (નૌરુ)', 'en_NU' => 'અંગ્રેજી (નીયુ)', 'en_NZ' => 'અંગ્રેજી (ન્યુઝીલેન્ડ)', 'en_PG' => 'અંગ્રેજી (પાપુઆ ન્યૂ ગિની)', 'en_PH' => 'અંગ્રેજી (ફિલિપિન્સ)', 'en_PK' => 'અંગ્રેજી (પાકિસ્તાન)', + 'en_PL' => 'અંગ્રેજી (પોલેંડ)', 'en_PN' => 'અંગ્રેજી (પીટકૈર્ન આઇલેન્ડ્સ)', 'en_PR' => 'અંગ્રેજી (પ્યુઅર્ટો રિકો)', + 'en_PT' => 'અંગ્રેજી (પોર્ટુગલ)', 'en_PW' => 'અંગ્રેજી (પલાઉ)', + 'en_RO' => 'અંગ્રેજી (રોમાનિયા)', 'en_RW' => 'અંગ્રેજી (રવાંડા)', 'en_SB' => 'અંગ્રેજી (સોલોમન આઇલેન્ડ્સ)', 'en_SC' => 'અંગ્રેજી (સેશેલ્સ)', @@ -184,6 +194,7 @@ 'en_SG' => 'અંગ્રેજી (સિંગાપુર)', 'en_SH' => 'અંગ્રેજી (સેંટ હેલેના)', 'en_SI' => 'અંગ્રેજી (સ્લોવેનિયા)', + 'en_SK' => 'અંગ્રેજી (સ્લોવેકિયા)', 'en_SL' => 'અંગ્રેજી (સીએરા લેઓન)', 'en_SS' => 'અંગ્રેજી (દક્ષિણ સુદાન)', 'en_SX' => 'અંગ્રેજી (સિંટ માર્ટેન)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ha.php b/src/Symfony/Component/Intl/Resources/data/locales/ha.php index f0d2c38044de0..6ace7106d9888 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ha.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ha.php @@ -121,29 +121,35 @@ 'en_CM' => 'Turanci (Kamaru)', 'en_CX' => 'Turanci (Tsibirin Kirsmati)', 'en_CY' => 'Turanci (Saifurus)', + 'en_CZ' => 'Turanci (Czechia)', 'en_DE' => 'Turanci (Jamus)', 'en_DK' => 'Turanci (Danmark)', 'en_DM' => 'Turanci (Dominika)', 'en_ER' => 'Turanci (Eritireya)', + 'en_ES' => 'Turanci (Sipen)', 'en_FI' => 'Turanci (Finlan)', 'en_FJ' => 'Turanci (Fiji)', 'en_FK' => 'Turanci (Tsibiran Falkilan)', 'en_FM' => 'Turanci (Mikuronesiya)', + 'en_FR' => 'Turanci (Faransa)', 'en_GB' => 'Turanci (Biritaniya)', 'en_GD' => 'Turanci (Girnada)', 'en_GG' => 'Turanci (Yankin Guernsey)', 'en_GH' => 'Turanci (Gana)', 'en_GI' => 'Turanci (Jibaraltar)', 'en_GM' => 'Turanci (Gambiya)', + 'en_GS' => 'Turanci (Kudancin Geogia da Kudancin Tsibirin Sandiwic)', 'en_GU' => 'Turanci (Guam)', 'en_GY' => 'Turanci (Guyana)', 'en_HK' => 'Turanci (Babban Yankin Mulkin Hong Kong na Ƙasar Sin)', + 'en_HU' => 'Turanci (Hungari)', 'en_ID' => 'Turanci (Indunusiya)', 'en_IE' => 'Turanci (Ayalan)', 'en_IL' => 'Turanci (Israʼila)', 'en_IM' => 'Turanci (Isle of Man)', 'en_IN' => 'Turanci (Indiya)', 'en_IO' => 'Turanci (Yankin Birtaniya Na Tekun Indiya)', + 'en_IT' => 'Turanci (Italiya)', 'en_JE' => 'Turanci (Kasar Jersey)', 'en_JM' => 'Turanci (Jamaika)', 'en_KE' => 'Turanci (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Turanci (Tsibirin Narfalk)', 'en_NG' => 'Turanci (Nijeriya)', 'en_NL' => 'Turanci (Holan)', + 'en_NO' => 'Turanci (Norwe)', 'en_NR' => 'Turanci (Nauru)', 'en_NU' => 'Turanci (Niue)', 'en_NZ' => 'Turanci (Nuzilan)', 'en_PG' => 'Turanci (Papuwa Nugini)', 'en_PH' => 'Turanci (Filipin)', 'en_PK' => 'Turanci (Pakistan)', + 'en_PL' => 'Turanci (Polan)', 'en_PN' => 'Turanci (Tsibiran Pitcairn)', 'en_PR' => 'Turanci (Porto Riko)', + 'en_PT' => 'Turanci (Portugal)', 'en_PW' => 'Turanci (Palau)', + 'en_RO' => 'Turanci (Romaniya)', 'en_RW' => 'Turanci (Ruwanda)', 'en_SB' => 'Turanci (Tsibiran Salaman)', 'en_SC' => 'Turanci (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Turanci (Singapur)', 'en_SH' => 'Turanci (San Helena)', 'en_SI' => 'Turanci (Sulobeniya)', + 'en_SK' => 'Turanci (Sulobakiya)', 'en_SL' => 'Turanci (Salewo)', 'en_SS' => 'Turanci (Sudan ta Kudu)', 'en_SX' => 'Turanci (San Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/he.php b/src/Symfony/Component/Intl/Resources/data/locales/he.php index 5af7e8c39974b..e774608809c02 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/he.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/he.php @@ -121,29 +121,35 @@ 'en_CM' => 'אנגלית (קמרון)', 'en_CX' => 'אנגלית (אי חג המולד)', 'en_CY' => 'אנגלית (קפריסין)', + 'en_CZ' => 'אנגלית (צ׳כיה)', 'en_DE' => 'אנגלית (גרמניה)', 'en_DK' => 'אנגלית (דנמרק)', 'en_DM' => 'אנגלית (דומיניקה)', 'en_ER' => 'אנגלית (אריתריאה)', + 'en_ES' => 'אנגלית (ספרד)', 'en_FI' => 'אנגלית (פינלנד)', 'en_FJ' => 'אנגלית (פיג׳י)', 'en_FK' => 'אנגלית (איי פוקלנד)', 'en_FM' => 'אנגלית (מיקרונזיה)', + 'en_FR' => 'אנגלית (צרפת)', 'en_GB' => 'אנגלית (בריטניה)', 'en_GD' => 'אנגלית (גרנדה)', 'en_GG' => 'אנגלית (גרנזי)', 'en_GH' => 'אנגלית (גאנה)', 'en_GI' => 'אנגלית (גיברלטר)', 'en_GM' => 'אנגלית (גמביה)', + 'en_GS' => 'אנגלית (ג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומיים)', 'en_GU' => 'אנגלית (גואם)', 'en_GY' => 'אנגלית (גיאנה)', 'en_HK' => 'אנגלית (הונג קונג [אזור מנהלי מיוחד של סין])', + 'en_HU' => 'אנגלית (הונגריה)', 'en_ID' => 'אנגלית (אינדונזיה)', 'en_IE' => 'אנגלית (אירלנד)', 'en_IL' => 'אנגלית (ישראל)', 'en_IM' => 'אנגלית (האי מאן)', 'en_IN' => 'אנגלית (הודו)', 'en_IO' => 'אנגלית (הטריטוריה הבריטית באוקיינוס ההודי)', + 'en_IT' => 'אנגלית (איטליה)', 'en_JE' => 'אנגלית (ג׳רזי)', 'en_JM' => 'אנגלית (ג׳מייקה)', 'en_KE' => 'אנגלית (קניה)', @@ -167,15 +173,19 @@ 'en_NF' => 'אנגלית (האי נורפוק)', 'en_NG' => 'אנגלית (ניגריה)', 'en_NL' => 'אנגלית (הולנד)', + 'en_NO' => 'אנגלית (נורווגיה)', 'en_NR' => 'אנגלית (נאורו)', 'en_NU' => 'אנגלית (ניווה)', 'en_NZ' => 'אנגלית (ניו זילנד)', 'en_PG' => 'אנגלית (פפואה גינאה החדשה)', 'en_PH' => 'אנגלית (הפיליפינים)', 'en_PK' => 'אנגלית (פקיסטן)', + 'en_PL' => 'אנגלית (פולין)', 'en_PN' => 'אנגלית (איי פיטקרן)', 'en_PR' => 'אנגלית (פוארטו ריקו)', + 'en_PT' => 'אנגלית (פורטוגל)', 'en_PW' => 'אנגלית (פלאו)', + 'en_RO' => 'אנגלית (רומניה)', 'en_RW' => 'אנגלית (רואנדה)', 'en_SB' => 'אנגלית (איי שלמה)', 'en_SC' => 'אנגלית (איי סיישל)', @@ -184,6 +194,7 @@ 'en_SG' => 'אנגלית (סינגפור)', 'en_SH' => 'אנגלית (סנט הלנה)', 'en_SI' => 'אנגלית (סלובניה)', + 'en_SK' => 'אנגלית (סלובקיה)', 'en_SL' => 'אנגלית (סיירה לאון)', 'en_SS' => 'אנגלית (דרום סודן)', 'en_SX' => 'אנגלית (סנט מארטן)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/hi.php b/src/Symfony/Component/Intl/Resources/data/locales/hi.php index cffc6ff5a9b83..0042f75f958dc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/hi.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/hi.php @@ -121,29 +121,35 @@ 'en_CM' => 'अंग्रेज़ी (कैमरून)', 'en_CX' => 'अंग्रेज़ी (क्रिसमस द्वीप)', 'en_CY' => 'अंग्रेज़ी (साइप्रस)', + 'en_CZ' => 'अंग्रेज़ी (चेकिया)', 'en_DE' => 'अंग्रेज़ी (जर्मनी)', 'en_DK' => 'अंग्रेज़ी (डेनमार्क)', 'en_DM' => 'अंग्रेज़ी (डोमिनिका)', 'en_ER' => 'अंग्रेज़ी (इरिट्रिया)', + 'en_ES' => 'अंग्रेज़ी (स्पेन)', 'en_FI' => 'अंग्रेज़ी (फ़िनलैंड)', 'en_FJ' => 'अंग्रेज़ी (फ़िजी)', 'en_FK' => 'अंग्रेज़ी (फ़ॉकलैंड द्वीपसमूह)', 'en_FM' => 'अंग्रेज़ी (माइक्रोनेशिया)', + 'en_FR' => 'अंग्रेज़ी (फ़्रांस)', 'en_GB' => 'अंग्रेज़ी (यूनाइटेड किंगडम)', 'en_GD' => 'अंग्रेज़ी (ग्रेनाडा)', 'en_GG' => 'अंग्रेज़ी (गर्नसी)', 'en_GH' => 'अंग्रेज़ी (घाना)', 'en_GI' => 'अंग्रेज़ी (जिब्राल्टर)', 'en_GM' => 'अंग्रेज़ी (गाम्बिया)', + 'en_GS' => 'अंग्रेज़ी (दक्षिण जॉर्जिया और दक्षिण सैंडविच द्वीपसमूह)', 'en_GU' => 'अंग्रेज़ी (गुआम)', 'en_GY' => 'अंग्रेज़ी (गुयाना)', 'en_HK' => 'अंग्रेज़ी (हाँग काँग [चीन विशेष प्रशासनिक क्षेत्र])', + 'en_HU' => 'अंग्रेज़ी (हंगरी)', 'en_ID' => 'अंग्रेज़ी (इंडोनेशिया)', 'en_IE' => 'अंग्रेज़ी (आयरलैंड)', 'en_IL' => 'अंग्रेज़ी (इज़राइल)', 'en_IM' => 'अंग्रेज़ी (आइल ऑफ़ मैन)', 'en_IN' => 'अंग्रेज़ी (भारत)', 'en_IO' => 'अंग्रेज़ी (ब्रिटिश हिंद महासागरीय क्षेत्र)', + 'en_IT' => 'अंग्रेज़ी (इटली)', 'en_JE' => 'अंग्रेज़ी (जर्सी)', 'en_JM' => 'अंग्रेज़ी (जमैका)', 'en_KE' => 'अंग्रेज़ी (केन्या)', @@ -167,15 +173,19 @@ 'en_NF' => 'अंग्रेज़ी (नॉरफ़ॉक द्वीप)', 'en_NG' => 'अंग्रेज़ी (नाइजीरिया)', 'en_NL' => 'अंग्रेज़ी (नीदरलैंड)', + 'en_NO' => 'अंग्रेज़ी (नॉर्वे)', 'en_NR' => 'अंग्रेज़ी (नाउरु)', 'en_NU' => 'अंग्रेज़ी (नीयू)', 'en_NZ' => 'अंग्रेज़ी (न्यूज़ीलैंड)', 'en_PG' => 'अंग्रेज़ी (पापुआ न्यू गिनी)', 'en_PH' => 'अंग्रेज़ी (फ़िलिपींस)', 'en_PK' => 'अंग्रेज़ी (पाकिस्तान)', + 'en_PL' => 'अंग्रेज़ी (पोलैंड)', 'en_PN' => 'अंग्रेज़ी (पिटकैर्न द्वीपसमूह)', 'en_PR' => 'अंग्रेज़ी (पोर्टो रिको)', + 'en_PT' => 'अंग्रेज़ी (पुर्तगाल)', 'en_PW' => 'अंग्रेज़ी (पलाऊ)', + 'en_RO' => 'अंग्रेज़ी (रोमानिया)', 'en_RW' => 'अंग्रेज़ी (रवांडा)', 'en_SB' => 'अंग्रेज़ी (सोलोमन द्वीपसमूह)', 'en_SC' => 'अंग्रेज़ी (सेशेल्स)', @@ -184,6 +194,7 @@ 'en_SG' => 'अंग्रेज़ी (सिंगापुर)', 'en_SH' => 'अंग्रेज़ी (सेंट हेलेना)', 'en_SI' => 'अंग्रेज़ी (स्लोवेनिया)', + 'en_SK' => 'अंग्रेज़ी (स्लोवाकिया)', 'en_SL' => 'अंग्रेज़ी (सिएरा लियोन)', 'en_SS' => 'अंग्रेज़ी (दक्षिण सूडान)', 'en_SX' => 'अंग्रेज़ी (सिंट मार्टिन)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/hr.php b/src/Symfony/Component/Intl/Resources/data/locales/hr.php index ffb9afa8999ed..c0f4336d3ba61 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/hr.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/hr.php @@ -121,29 +121,35 @@ 'en_CM' => 'engleski (Kamerun)', 'en_CX' => 'engleski (Božićni Otok)', 'en_CY' => 'engleski (Cipar)', + 'en_CZ' => 'engleski (Češka)', 'en_DE' => 'engleski (Njemačka)', 'en_DK' => 'engleski (Danska)', 'en_DM' => 'engleski (Dominika)', 'en_ER' => 'engleski (Eritreja)', + 'en_ES' => 'engleski (Španjolska)', 'en_FI' => 'engleski (Finska)', 'en_FJ' => 'engleski (Fidži)', 'en_FK' => 'engleski (Falklandski Otoci)', 'en_FM' => 'engleski (Mikronezija)', + 'en_FR' => 'engleski (Francuska)', 'en_GB' => 'engleski (Ujedinjeno Kraljevstvo)', 'en_GD' => 'engleski (Grenada)', 'en_GG' => 'engleski (Guernsey)', 'en_GH' => 'engleski (Gana)', 'en_GI' => 'engleski (Gibraltar)', 'en_GM' => 'engleski (Gambija)', + 'en_GS' => 'engleski (Južna Georgia i Otoci Južni Sandwich)', 'en_GU' => 'engleski (Guam)', 'en_GY' => 'engleski (Gvajana)', 'en_HK' => 'engleski (PUP Hong Kong Kina)', + 'en_HU' => 'engleski (Mađarska)', 'en_ID' => 'engleski (Indonezija)', 'en_IE' => 'engleski (Irska)', 'en_IL' => 'engleski (Izrael)', 'en_IM' => 'engleski (Otok Man)', 'en_IN' => 'engleski (Indija)', 'en_IO' => 'engleski (Britanski Indijskooceanski Teritorij)', + 'en_IT' => 'engleski (Italija)', 'en_JE' => 'engleski (Jersey)', 'en_JM' => 'engleski (Jamajka)', 'en_KE' => 'engleski (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'engleski (Otok Norfolk)', 'en_NG' => 'engleski (Nigerija)', 'en_NL' => 'engleski (Nizozemska)', + 'en_NO' => 'engleski (Norveška)', 'en_NR' => 'engleski (Nauru)', 'en_NU' => 'engleski (Niue)', 'en_NZ' => 'engleski (Novi Zeland)', 'en_PG' => 'engleski (Papua Nova Gvineja)', 'en_PH' => 'engleski (Filipini)', 'en_PK' => 'engleski (Pakistan)', + 'en_PL' => 'engleski (Poljska)', 'en_PN' => 'engleski (Pitcairnovi Otoci)', 'en_PR' => 'engleski (Portoriko)', + 'en_PT' => 'engleski (Portugal)', 'en_PW' => 'engleski (Palau)', + 'en_RO' => 'engleski (Rumunjska)', 'en_RW' => 'engleski (Ruanda)', 'en_SB' => 'engleski (Salomonovi Otoci)', 'en_SC' => 'engleski (Sejšeli)', @@ -184,6 +194,7 @@ 'en_SG' => 'engleski (Singapur)', 'en_SH' => 'engleski (Sveta Helena)', 'en_SI' => 'engleski (Slovenija)', + 'en_SK' => 'engleski (Slovačka)', 'en_SL' => 'engleski (Sijera Leone)', 'en_SS' => 'engleski (Južni Sudan)', 'en_SX' => 'engleski (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/hu.php b/src/Symfony/Component/Intl/Resources/data/locales/hu.php index 9bc13c1846338..ca8baa80789b9 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/hu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/hu.php @@ -121,29 +121,35 @@ 'en_CM' => 'angol (Kamerun)', 'en_CX' => 'angol (Karácsony-sziget)', 'en_CY' => 'angol (Ciprus)', + 'en_CZ' => 'angol (Csehország)', 'en_DE' => 'angol (Németország)', 'en_DK' => 'angol (Dánia)', 'en_DM' => 'angol (Dominika)', 'en_ER' => 'angol (Eritrea)', + 'en_ES' => 'angol (Spanyolország)', 'en_FI' => 'angol (Finnország)', 'en_FJ' => 'angol (Fidzsi)', 'en_FK' => 'angol (Falkland-szigetek)', 'en_FM' => 'angol (Mikronézia)', + 'en_FR' => 'angol (Franciaország)', 'en_GB' => 'angol (Egyesült Királyság)', 'en_GD' => 'angol (Grenada)', 'en_GG' => 'angol (Guernsey)', 'en_GH' => 'angol (Ghána)', 'en_GI' => 'angol (Gibraltár)', 'en_GM' => 'angol (Gambia)', + 'en_GS' => 'angol (Déli-Georgia és Déli-Sandwich-szigetek)', 'en_GU' => 'angol (Guam)', 'en_GY' => 'angol (Guyana)', 'en_HK' => 'angol (Hongkong KKT)', + 'en_HU' => 'angol (Magyarország)', 'en_ID' => 'angol (Indonézia)', 'en_IE' => 'angol (Írország)', 'en_IL' => 'angol (Izrael)', 'en_IM' => 'angol (Man-sziget)', 'en_IN' => 'angol (India)', 'en_IO' => 'angol (Brit Indiai-óceáni Terület)', + 'en_IT' => 'angol (Olaszország)', 'en_JE' => 'angol (Jersey)', 'en_JM' => 'angol (Jamaica)', 'en_KE' => 'angol (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'angol (Norfolk-sziget)', 'en_NG' => 'angol (Nigéria)', 'en_NL' => 'angol (Hollandia)', + 'en_NO' => 'angol (Norvégia)', 'en_NR' => 'angol (Nauru)', 'en_NU' => 'angol (Niue)', 'en_NZ' => 'angol (Új-Zéland)', 'en_PG' => 'angol (Pápua Új-Guinea)', 'en_PH' => 'angol (Fülöp-szigetek)', 'en_PK' => 'angol (Pakisztán)', + 'en_PL' => 'angol (Lengyelország)', 'en_PN' => 'angol (Pitcairn-szigetek)', 'en_PR' => 'angol (Puerto Rico)', + 'en_PT' => 'angol (Portugália)', 'en_PW' => 'angol (Palau)', + 'en_RO' => 'angol (Románia)', 'en_RW' => 'angol (Ruanda)', 'en_SB' => 'angol (Salamon-szigetek)', 'en_SC' => 'angol (Seychelle-szigetek)', @@ -184,6 +194,7 @@ 'en_SG' => 'angol (Szingapúr)', 'en_SH' => 'angol (Szent Ilona)', 'en_SI' => 'angol (Szlovénia)', + 'en_SK' => 'angol (Szlovákia)', 'en_SL' => 'angol (Sierra Leone)', 'en_SS' => 'angol (Dél-Szudán)', 'en_SX' => 'angol (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/hy.php b/src/Symfony/Component/Intl/Resources/data/locales/hy.php index 705cfa1efc7e8..a4222a7cc0332 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/hy.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/hy.php @@ -121,29 +121,35 @@ 'en_CM' => 'անգլերեն (Կամերուն)', 'en_CX' => 'անգլերեն (Սուրբ Ծննդյան կղզի)', 'en_CY' => 'անգլերեն (Կիպրոս)', + 'en_CZ' => 'անգլերեն (Չեխիա)', 'en_DE' => 'անգլերեն (Գերմանիա)', 'en_DK' => 'անգլերեն (Դանիա)', 'en_DM' => 'անգլերեն (Դոմինիկա)', 'en_ER' => 'անգլերեն (Էրիթրեա)', + 'en_ES' => 'անգլերեն (Իսպանիա)', 'en_FI' => 'անգլերեն (Ֆինլանդիա)', 'en_FJ' => 'անգլերեն (Ֆիջի)', 'en_FK' => 'անգլերեն (Ֆոլքլենդյան կղզիներ)', 'en_FM' => 'անգլերեն (Միկրոնեզիա)', + 'en_FR' => 'անգլերեն (Ֆրանսիա)', 'en_GB' => 'անգլերեն (Միացյալ Թագավորություն)', 'en_GD' => 'անգլերեն (Գրենադա)', 'en_GG' => 'անգլերեն (Գերնսի)', 'en_GH' => 'անգլերեն (Գանա)', 'en_GI' => 'անգլերեն (Ջիբրալթար)', 'en_GM' => 'անգլերեն (Գամբիա)', + 'en_GS' => 'անգլերեն (Հարավային Ջորջիա և Հարավային Սենդվիչյան կղզիներ)', 'en_GU' => 'անգլերեն (Գուամ)', 'en_GY' => 'անգլերեն (Գայանա)', 'en_HK' => 'անգլերեն (Հոնկոնգի ՀՎՇ)', + 'en_HU' => 'անգլերեն (Հունգարիա)', 'en_ID' => 'անգլերեն (Ինդոնեզիա)', 'en_IE' => 'անգլերեն (Իռլանդիա)', 'en_IL' => 'անգլերեն (Իսրայել)', 'en_IM' => 'անգլերեն (Մեն կղզի)', 'en_IN' => 'անգլերեն (Հնդկաստան)', 'en_IO' => 'անգլերեն (Բրիտանական տարածք Հնդկական Օվկիանոսում)', + 'en_IT' => 'անգլերեն (Իտալիա)', 'en_JE' => 'անգլերեն (Ջերսի)', 'en_JM' => 'անգլերեն (Ճամայկա)', 'en_KE' => 'անգլերեն (Քենիա)', @@ -167,15 +173,19 @@ 'en_NF' => 'անգլերեն (Նորֆոլկ կղզի)', 'en_NG' => 'անգլերեն (Նիգերիա)', 'en_NL' => 'անգլերեն (Նիդեռլանդներ)', + 'en_NO' => 'անգլերեն (Նորվեգիա)', 'en_NR' => 'անգլերեն (Նաուրու)', 'en_NU' => 'անգլերեն (Նիուե)', 'en_NZ' => 'անգլերեն (Նոր Զելանդիա)', 'en_PG' => 'անգլերեն (Պապուա Նոր Գվինեա)', 'en_PH' => 'անգլերեն (Ֆիլիպիններ)', 'en_PK' => 'անգլերեն (Պակիստան)', + 'en_PL' => 'անգլերեն (Լեհաստան)', 'en_PN' => 'անգլերեն (Պիտկեռն կղզիներ)', 'en_PR' => 'անգլերեն (Պուերտո Ռիկո)', + 'en_PT' => 'անգլերեն (Պորտուգալիա)', 'en_PW' => 'անգլերեն (Պալաու)', + 'en_RO' => 'անգլերեն (Ռումինիա)', 'en_RW' => 'անգլերեն (Ռուանդա)', 'en_SB' => 'անգլերեն (Սողոմոնյան կղզիներ)', 'en_SC' => 'անգլերեն (Սեյշելներ)', @@ -184,6 +194,7 @@ 'en_SG' => 'անգլերեն (Սինգապուր)', 'en_SH' => 'անգլերեն (Սուրբ Հեղինեի կղզի)', 'en_SI' => 'անգլերեն (Սլովենիա)', + 'en_SK' => 'անգլերեն (Սլովակիա)', 'en_SL' => 'անգլերեն (Սիեռա Լեոնե)', 'en_SS' => 'անգլերեն (Հարավային Սուդան)', 'en_SX' => 'անգլերեն (Սինտ Մարտեն)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ia.php b/src/Symfony/Component/Intl/Resources/data/locales/ia.php index fc6da9e2c8168..6f5e27b0e26fc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ia.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ia.php @@ -121,29 +121,35 @@ 'en_CM' => 'anglese (Camerun)', 'en_CX' => 'anglese (Insula de Natal)', 'en_CY' => 'anglese (Cypro)', + 'en_CZ' => 'anglese (Chechia)', 'en_DE' => 'anglese (Germania)', 'en_DK' => 'anglese (Danmark)', 'en_DM' => 'anglese (Dominica)', 'en_ER' => 'anglese (Eritrea)', + 'en_ES' => 'anglese (Espania)', 'en_FI' => 'anglese (Finlandia)', 'en_FJ' => 'anglese (Fiji)', 'en_FK' => 'anglese (Insulas Falkland)', 'en_FM' => 'anglese (Micronesia)', + 'en_FR' => 'anglese (Francia)', 'en_GB' => 'anglese (Regno Unite)', 'en_GD' => 'anglese (Grenada)', 'en_GG' => 'anglese (Guernsey)', 'en_GH' => 'anglese (Ghana)', 'en_GI' => 'anglese (Gibraltar)', 'en_GM' => 'anglese (Gambia)', + 'en_GS' => 'anglese (Georgia del Sud e Insulas Sandwich Austral)', 'en_GU' => 'anglese (Guam)', 'en_GY' => 'anglese (Guyana)', 'en_HK' => 'anglese (Hongkong, R.A.S. de China)', + 'en_HU' => 'anglese (Hungaria)', 'en_ID' => 'anglese (Indonesia)', 'en_IE' => 'anglese (Irlanda)', 'en_IL' => 'anglese (Israel)', 'en_IM' => 'anglese (Insula de Man)', 'en_IN' => 'anglese (India)', 'en_IO' => 'anglese (Territorio oceanic britanno-indian)', + 'en_IT' => 'anglese (Italia)', 'en_JE' => 'anglese (Jersey)', 'en_JM' => 'anglese (Jamaica)', 'en_KE' => 'anglese (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'anglese (Insula Norfolk)', 'en_NG' => 'anglese (Nigeria)', 'en_NL' => 'anglese (Nederlandia)', + 'en_NO' => 'anglese (Norvegia)', 'en_NR' => 'anglese (Nauru)', 'en_NU' => 'anglese (Niue)', 'en_NZ' => 'anglese (Nove Zelanda)', 'en_PG' => 'anglese (Papua Nove Guinea)', 'en_PH' => 'anglese (Philippinas)', 'en_PK' => 'anglese (Pakistan)', + 'en_PL' => 'anglese (Polonia)', 'en_PN' => 'anglese (Insulas Pitcairn)', 'en_PR' => 'anglese (Porto Rico)', + 'en_PT' => 'anglese (Portugal)', 'en_PW' => 'anglese (Palau)', + 'en_RO' => 'anglese (Romania)', 'en_RW' => 'anglese (Ruanda)', 'en_SB' => 'anglese (Insulas Solomon)', 'en_SC' => 'anglese (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'anglese (Singapur)', 'en_SH' => 'anglese (Sancte Helena)', 'en_SI' => 'anglese (Slovenia)', + 'en_SK' => 'anglese (Slovachia)', 'en_SL' => 'anglese (Sierra Leone)', 'en_SS' => 'anglese (Sudan del Sud)', 'en_SX' => 'anglese (Sancte Martino nederlandese)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/id.php b/src/Symfony/Component/Intl/Resources/data/locales/id.php index a509bbb1368fd..62f6f12c6185f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/id.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/id.php @@ -121,29 +121,35 @@ 'en_CM' => 'Inggris (Kamerun)', 'en_CX' => 'Inggris (Pulau Natal)', 'en_CY' => 'Inggris (Siprus)', + 'en_CZ' => 'Inggris (Ceko)', 'en_DE' => 'Inggris (Jerman)', 'en_DK' => 'Inggris (Denmark)', 'en_DM' => 'Inggris (Dominika)', 'en_ER' => 'Inggris (Eritrea)', + 'en_ES' => 'Inggris (Spanyol)', 'en_FI' => 'Inggris (Finlandia)', 'en_FJ' => 'Inggris (Fiji)', 'en_FK' => 'Inggris (Kepulauan Falkland)', 'en_FM' => 'Inggris (Mikronesia)', + 'en_FR' => 'Inggris (Prancis)', 'en_GB' => 'Inggris (Inggris Raya)', 'en_GD' => 'Inggris (Grenada)', 'en_GG' => 'Inggris (Guernsey)', 'en_GH' => 'Inggris (Ghana)', 'en_GI' => 'Inggris (Gibraltar)', 'en_GM' => 'Inggris (Gambia)', + 'en_GS' => 'Inggris (Georgia Selatan & Kep. Sandwich Selatan)', 'en_GU' => 'Inggris (Guam)', 'en_GY' => 'Inggris (Guyana)', 'en_HK' => 'Inggris (Hong Kong DAK Tiongkok)', + 'en_HU' => 'Inggris (Hungaria)', 'en_ID' => 'Inggris (Indonesia)', 'en_IE' => 'Inggris (Irlandia)', 'en_IL' => 'Inggris (Israel)', 'en_IM' => 'Inggris (Pulau Man)', 'en_IN' => 'Inggris (India)', 'en_IO' => 'Inggris (Wilayah Inggris di Samudra Hindia)', + 'en_IT' => 'Inggris (Italia)', 'en_JE' => 'Inggris (Jersey)', 'en_JM' => 'Inggris (Jamaika)', 'en_KE' => 'Inggris (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Inggris (Kepulauan Norfolk)', 'en_NG' => 'Inggris (Nigeria)', 'en_NL' => 'Inggris (Belanda)', + 'en_NO' => 'Inggris (Norwegia)', 'en_NR' => 'Inggris (Nauru)', 'en_NU' => 'Inggris (Niue)', 'en_NZ' => 'Inggris (Selandia Baru)', 'en_PG' => 'Inggris (Papua Nugini)', 'en_PH' => 'Inggris (Filipina)', 'en_PK' => 'Inggris (Pakistan)', + 'en_PL' => 'Inggris (Polandia)', 'en_PN' => 'Inggris (Kepulauan Pitcairn)', 'en_PR' => 'Inggris (Puerto Riko)', + 'en_PT' => 'Inggris (Portugal)', 'en_PW' => 'Inggris (Palau)', + 'en_RO' => 'Inggris (Rumania)', 'en_RW' => 'Inggris (Rwanda)', 'en_SB' => 'Inggris (Kepulauan Solomon)', 'en_SC' => 'Inggris (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Inggris (Singapura)', 'en_SH' => 'Inggris (Saint Helena)', 'en_SI' => 'Inggris (Slovenia)', + 'en_SK' => 'Inggris (Slovakia)', 'en_SL' => 'Inggris (Sierra Leone)', 'en_SS' => 'Inggris (Sudan Selatan)', 'en_SX' => 'Inggris (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ie.php b/src/Symfony/Component/Intl/Resources/data/locales/ie.php index 7d811cb7ab8b4..4de8737b5db75 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ie.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ie.php @@ -25,16 +25,21 @@ 'en_AT' => 'anglesi (Austria)', 'en_BE' => 'anglesi (Belgia)', 'en_CH' => 'anglesi (Svissia)', + 'en_CZ' => 'anglesi (Tchekia)', 'en_DE' => 'anglesi (Germania)', 'en_DK' => 'anglesi (Dania)', 'en_ER' => 'anglesi (Eritrea)', + 'en_ES' => 'anglesi (Hispania)', 'en_FI' => 'anglesi (Finland)', 'en_FJ' => 'anglesi (Fidji)', + 'en_FR' => 'anglesi (Francia)', 'en_GB' => 'anglesi (Unit Reyia)', 'en_GY' => 'anglesi (Guyana)', + 'en_HU' => 'anglesi (Hungaria)', 'en_ID' => 'anglesi (Indonesia)', 'en_IE' => 'anglesi (Irland)', 'en_IN' => 'anglesi (India)', + 'en_IT' => 'anglesi (Italia)', 'en_MT' => 'anglesi (Malta)', 'en_MU' => 'anglesi (Mauricio)', 'en_MV' => 'anglesi (Maldivas)', @@ -43,10 +48,14 @@ 'en_NZ' => 'anglesi (Nov-Zeland)', 'en_PH' => 'anglesi (Filipines)', 'en_PK' => 'anglesi (Pakistan)', + 'en_PL' => 'anglesi (Polonia)', 'en_PR' => 'anglesi (Porto-Rico)', + 'en_PT' => 'anglesi (Portugal)', 'en_PW' => 'anglesi (Palau)', + 'en_RO' => 'anglesi (Rumania)', 'en_SE' => 'anglesi (Svedia)', 'en_SI' => 'anglesi (Slovenia)', + 'en_SK' => 'anglesi (Slovakia)', 'en_SX' => 'anglesi (Sint-Maarten)', 'en_TC' => 'anglesi (Turks e Caicos)', 'en_TK' => 'anglesi (Tokelau)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ig.php b/src/Symfony/Component/Intl/Resources/data/locales/ig.php index f6c65dee76aed..efda0303784e6 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ig.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ig.php @@ -121,29 +121,35 @@ 'en_CM' => 'Bekee (Cameroon)', 'en_CX' => 'Bekee (Agwaetiti Christmas)', 'en_CY' => 'Bekee (Cyprus)', + 'en_CZ' => 'Bekee (Czechia)', 'en_DE' => 'Bekee (Germany)', 'en_DK' => 'Bekee (Denmark)', 'en_DM' => 'Bekee (Dominica)', 'en_ER' => 'Bekee (Eritrea)', + 'en_ES' => 'Bekee (Spain)', 'en_FI' => 'Bekee (Finland)', 'en_FJ' => 'Bekee (Fiji)', 'en_FK' => 'Bekee (Falkland Islands)', 'en_FM' => 'Bekee (Micronesia)', + 'en_FR' => 'Bekee (France)', 'en_GB' => 'Bekee (United Kingdom)', 'en_GD' => 'Bekee (Grenada)', 'en_GG' => 'Bekee (Guernsey)', 'en_GH' => 'Bekee (Ghana)', 'en_GI' => 'Bekee (Gibraltar)', 'en_GM' => 'Bekee (Gambia)', + 'en_GS' => 'Bekee (South Georgia & South Sandwich Islands)', 'en_GU' => 'Bekee (Guam)', 'en_GY' => 'Bekee (Guyana)', 'en_HK' => 'Bekee (Hong Kong SAR China)', + 'en_HU' => 'Bekee (Hungary)', 'en_ID' => 'Bekee (Indonesia)', 'en_IE' => 'Bekee (Ireland)', 'en_IL' => 'Bekee (Israel)', 'en_IM' => 'Bekee (Isle of Man)', 'en_IN' => 'Bekee (India)', 'en_IO' => 'Bekee (British Indian Ocean Territory)', + 'en_IT' => 'Bekee (Italy)', 'en_JE' => 'Bekee (Jersey)', 'en_JM' => 'Bekee (Jamaika)', 'en_KE' => 'Bekee (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Bekee (Agwaetiti Norfolk)', 'en_NG' => 'Bekee (Naịjịrịa)', 'en_NL' => 'Bekee (Netherlands)', + 'en_NO' => 'Bekee (Norway)', 'en_NR' => 'Bekee (Nauru)', 'en_NU' => 'Bekee (Niue)', 'en_NZ' => 'Bekee (New Zealand)', 'en_PG' => 'Bekee (Papua New Guinea)', 'en_PH' => 'Bekee (Philippines)', 'en_PK' => 'Bekee (Pakistan)', + 'en_PL' => 'Bekee (Poland)', 'en_PN' => 'Bekee (Agwaetiti Pitcairn)', 'en_PR' => 'Bekee (Puerto Rico)', + 'en_PT' => 'Bekee (Portugal)', 'en_PW' => 'Bekee (Palau)', + 'en_RO' => 'Bekee (Romania)', 'en_RW' => 'Bekee (Rwanda)', 'en_SB' => 'Bekee (Agwaetiti Solomon)', 'en_SC' => 'Bekee (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Bekee (Singapore)', 'en_SH' => 'Bekee (St. Helena)', 'en_SI' => 'Bekee (Slovenia)', + 'en_SK' => 'Bekee (Slovakia)', 'en_SL' => 'Bekee (Sierra Leone)', 'en_SS' => 'Bekee (South Sudan)', 'en_SX' => 'Bekee (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ii.php b/src/Symfony/Component/Intl/Resources/data/locales/ii.php index a49bd4c510ba3..f45d0edbda106 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ii.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ii.php @@ -13,8 +13,10 @@ 'en_150' => 'ꑱꇩꉙ(ꉩꍏ)', 'en_BE' => 'ꑱꇩꉙ(ꀘꆹꏃ)', 'en_DE' => 'ꑱꇩꉙ(ꄓꇩ)', + 'en_FR' => 'ꑱꇩꉙ(ꃔꇩ)', 'en_GB' => 'ꑱꇩꉙ(ꑱꇩ)', 'en_IN' => 'ꑱꇩꉙ(ꑴꄗ)', + 'en_IT' => 'ꑱꇩꉙ(ꑴꄊꆺ)', 'en_US' => 'ꑱꇩꉙ(ꂰꇩ)', 'es' => 'ꑭꀠꑸꉙ', 'es_BR' => 'ꑭꀠꑸꉙ(ꀠꑭ)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/is.php b/src/Symfony/Component/Intl/Resources/data/locales/is.php index f4193a794155b..a9c87c308cd66 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/is.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/is.php @@ -121,29 +121,35 @@ 'en_CM' => 'enska (Kamerún)', 'en_CX' => 'enska (Jólaey)', 'en_CY' => 'enska (Kýpur)', + 'en_CZ' => 'enska (Tékkland)', 'en_DE' => 'enska (Þýskaland)', 'en_DK' => 'enska (Danmörk)', 'en_DM' => 'enska (Dóminíka)', 'en_ER' => 'enska (Erítrea)', + 'en_ES' => 'enska (Spánn)', 'en_FI' => 'enska (Finnland)', 'en_FJ' => 'enska (Fídjíeyjar)', 'en_FK' => 'enska (Falklandseyjar)', 'en_FM' => 'enska (Míkrónesía)', + 'en_FR' => 'enska (Frakkland)', 'en_GB' => 'enska (Bretland)', 'en_GD' => 'enska (Grenada)', 'en_GG' => 'enska (Guernsey)', 'en_GH' => 'enska (Gana)', 'en_GI' => 'enska (Gíbraltar)', 'en_GM' => 'enska (Gambía)', + 'en_GS' => 'enska (Suður-Georgía og Suður-Sandvíkureyjar)', 'en_GU' => 'enska (Gvam)', 'en_GY' => 'enska (Gvæjana)', 'en_HK' => 'enska (sérstjórnarsvæðið Hong Kong)', + 'en_HU' => 'enska (Ungverjaland)', 'en_ID' => 'enska (Indónesía)', 'en_IE' => 'enska (Írland)', 'en_IL' => 'enska (Ísrael)', 'en_IM' => 'enska (Mön)', 'en_IN' => 'enska (Indland)', 'en_IO' => 'enska (Bresku Indlandshafseyjar)', + 'en_IT' => 'enska (Ítalía)', 'en_JE' => 'enska (Jersey)', 'en_JM' => 'enska (Jamaíka)', 'en_KE' => 'enska (Kenía)', @@ -167,15 +173,19 @@ 'en_NF' => 'enska (Norfolkeyja)', 'en_NG' => 'enska (Nígería)', 'en_NL' => 'enska (Holland)', + 'en_NO' => 'enska (Noregur)', 'en_NR' => 'enska (Nárú)', 'en_NU' => 'enska (Niue)', 'en_NZ' => 'enska (Nýja-Sjáland)', 'en_PG' => 'enska (Papúa Nýja-Gínea)', 'en_PH' => 'enska (Filippseyjar)', 'en_PK' => 'enska (Pakistan)', + 'en_PL' => 'enska (Pólland)', 'en_PN' => 'enska (Pitcairn-eyjar)', 'en_PR' => 'enska (Púertó Ríkó)', + 'en_PT' => 'enska (Portúgal)', 'en_PW' => 'enska (Palá)', + 'en_RO' => 'enska (Rúmenía)', 'en_RW' => 'enska (Rúanda)', 'en_SB' => 'enska (Salómonseyjar)', 'en_SC' => 'enska (Seychelles-eyjar)', @@ -184,6 +194,7 @@ 'en_SG' => 'enska (Singapúr)', 'en_SH' => 'enska (Sankti Helena)', 'en_SI' => 'enska (Slóvenía)', + 'en_SK' => 'enska (Slóvakía)', 'en_SL' => 'enska (Síerra Leóne)', 'en_SS' => 'enska (Suður-Súdan)', 'en_SX' => 'enska (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/it.php b/src/Symfony/Component/Intl/Resources/data/locales/it.php index 5c8b0eb394e84..1d647898ebd39 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/it.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/it.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglese (Camerun)', 'en_CX' => 'inglese (Isola Christmas)', 'en_CY' => 'inglese (Cipro)', + 'en_CZ' => 'inglese (Cechia)', 'en_DE' => 'inglese (Germania)', 'en_DK' => 'inglese (Danimarca)', 'en_DM' => 'inglese (Dominica)', 'en_ER' => 'inglese (Eritrea)', + 'en_ES' => 'inglese (Spagna)', 'en_FI' => 'inglese (Finlandia)', 'en_FJ' => 'inglese (Figi)', 'en_FK' => 'inglese (Isole Falkland)', 'en_FM' => 'inglese (Micronesia)', + 'en_FR' => 'inglese (Francia)', 'en_GB' => 'inglese (Regno Unito)', 'en_GD' => 'inglese (Grenada)', 'en_GG' => 'inglese (Guernsey)', 'en_GH' => 'inglese (Ghana)', 'en_GI' => 'inglese (Gibilterra)', 'en_GM' => 'inglese (Gambia)', + 'en_GS' => 'inglese (Georgia del Sud e Sandwich Australi)', 'en_GU' => 'inglese (Guam)', 'en_GY' => 'inglese (Guyana)', 'en_HK' => 'inglese (RAS di Hong Kong)', + 'en_HU' => 'inglese (Ungheria)', 'en_ID' => 'inglese (Indonesia)', 'en_IE' => 'inglese (Irlanda)', 'en_IL' => 'inglese (Israele)', 'en_IM' => 'inglese (Isola di Man)', 'en_IN' => 'inglese (India)', 'en_IO' => 'inglese (Territorio Britannico dell’Oceano Indiano)', + 'en_IT' => 'inglese (Italia)', 'en_JE' => 'inglese (Jersey)', 'en_JM' => 'inglese (Giamaica)', 'en_KE' => 'inglese (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglese (Isola Norfolk)', 'en_NG' => 'inglese (Nigeria)', 'en_NL' => 'inglese (Paesi Bassi)', + 'en_NO' => 'inglese (Norvegia)', 'en_NR' => 'inglese (Nauru)', 'en_NU' => 'inglese (Niue)', 'en_NZ' => 'inglese (Nuova Zelanda)', 'en_PG' => 'inglese (Papua Nuova Guinea)', 'en_PH' => 'inglese (Filippine)', 'en_PK' => 'inglese (Pakistan)', + 'en_PL' => 'inglese (Polonia)', 'en_PN' => 'inglese (Isole Pitcairn)', 'en_PR' => 'inglese (Portorico)', + 'en_PT' => 'inglese (Portogallo)', 'en_PW' => 'inglese (Palau)', + 'en_RO' => 'inglese (Romania)', 'en_RW' => 'inglese (Ruanda)', 'en_SB' => 'inglese (Isole Salomone)', 'en_SC' => 'inglese (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglese (Singapore)', 'en_SH' => 'inglese (Sant’Elena)', 'en_SI' => 'inglese (Slovenia)', + 'en_SK' => 'inglese (Slovacchia)', 'en_SL' => 'inglese (Sierra Leone)', 'en_SS' => 'inglese (Sud Sudan)', 'en_SX' => 'inglese (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ja.php b/src/Symfony/Component/Intl/Resources/data/locales/ja.php index e313b62074c65..16ad4dcdc6ca3 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ja.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ja.php @@ -121,29 +121,35 @@ 'en_CM' => '英語 (カメルーン)', 'en_CX' => '英語 (クリスマス島)', 'en_CY' => '英語 (キプロス)', + 'en_CZ' => '英語 (チェコ)', 'en_DE' => '英語 (ドイツ)', 'en_DK' => '英語 (デンマーク)', 'en_DM' => '英語 (ドミニカ国)', 'en_ER' => '英語 (エリトリア)', + 'en_ES' => '英語 (スペイン)', 'en_FI' => '英語 (フィンランド)', 'en_FJ' => '英語 (フィジー)', 'en_FK' => '英語 (フォークランド諸島)', 'en_FM' => '英語 (ミクロネシア連邦)', + 'en_FR' => '英語 (フランス)', 'en_GB' => '英語 (イギリス)', 'en_GD' => '英語 (グレナダ)', 'en_GG' => '英語 (ガーンジー)', 'en_GH' => '英語 (ガーナ)', 'en_GI' => '英語 (ジブラルタル)', 'en_GM' => '英語 (ガンビア)', + 'en_GS' => '英語 (サウスジョージア・サウスサンドウィッチ諸島)', 'en_GU' => '英語 (グアム)', 'en_GY' => '英語 (ガイアナ)', 'en_HK' => '英語 (中華人民共和国香港特別行政区)', + 'en_HU' => '英語 (ハンガリー)', 'en_ID' => '英語 (インドネシア)', 'en_IE' => '英語 (アイルランド)', 'en_IL' => '英語 (イスラエル)', 'en_IM' => '英語 (マン島)', 'en_IN' => '英語 (インド)', 'en_IO' => '英語 (英領インド洋地域)', + 'en_IT' => '英語 (イタリア)', 'en_JE' => '英語 (ジャージー)', 'en_JM' => '英語 (ジャマイカ)', 'en_KE' => '英語 (ケニア)', @@ -167,15 +173,19 @@ 'en_NF' => '英語 (ノーフォーク島)', 'en_NG' => '英語 (ナイジェリア)', 'en_NL' => '英語 (オランダ)', + 'en_NO' => '英語 (ノルウェー)', 'en_NR' => '英語 (ナウル)', 'en_NU' => '英語 (ニウエ)', 'en_NZ' => '英語 (ニュージーランド)', 'en_PG' => '英語 (パプアニューギニア)', 'en_PH' => '英語 (フィリピン)', 'en_PK' => '英語 (パキスタン)', + 'en_PL' => '英語 (ポーランド)', 'en_PN' => '英語 (ピトケアン諸島)', 'en_PR' => '英語 (プエルトリコ)', + 'en_PT' => '英語 (ポルトガル)', 'en_PW' => '英語 (パラオ)', + 'en_RO' => '英語 (ルーマニア)', 'en_RW' => '英語 (ルワンダ)', 'en_SB' => '英語 (ソロモン諸島)', 'en_SC' => '英語 (セーシェル)', @@ -184,6 +194,7 @@ 'en_SG' => '英語 (シンガポール)', 'en_SH' => '英語 (セントヘレナ)', 'en_SI' => '英語 (スロベニア)', + 'en_SK' => '英語 (スロバキア)', 'en_SL' => '英語 (シエラレオネ)', 'en_SS' => '英語 (南スーダン)', 'en_SX' => '英語 (シント・マールテン)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/jv.php b/src/Symfony/Component/Intl/Resources/data/locales/jv.php index 7aceed6372635..6b701cb205b26 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/jv.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/jv.php @@ -121,29 +121,35 @@ 'en_CM' => 'Inggris (Kamerun)', 'en_CX' => 'Inggris (Pulo Natal)', 'en_CY' => 'Inggris (Siprus)', + 'en_CZ' => 'Inggris (Céko)', 'en_DE' => 'Inggris (Jérman)', 'en_DK' => 'Inggris (Dhènemarken)', 'en_DM' => 'Inggris (Dominika)', 'en_ER' => 'Inggris (Éritréa)', + 'en_ES' => 'Inggris (Sepanyol)', 'en_FI' => 'Inggris (Finlan)', 'en_FJ' => 'Inggris (Fiji)', 'en_FK' => 'Inggris (Kapuloan Falkland)', 'en_FM' => 'Inggris (Féderasi Mikronésia)', + 'en_FR' => 'Inggris (Prancis)', 'en_GB' => 'Inggris (Karajan Manunggal)', 'en_GD' => 'Inggris (Grénada)', 'en_GG' => 'Inggris (Guernsei)', 'en_GH' => 'Inggris (Ghana)', 'en_GI' => 'Inggris (Gibraltar)', 'en_GM' => 'Inggris (Gambia)', + 'en_GS' => 'Inggris (Georgia Kidul lan Kapuloan Sandwich Kidul)', 'en_GU' => 'Inggris (Guam)', 'en_GY' => 'Inggris (Guyana)', 'en_HK' => 'Inggris (Laladan Administratif Astamiwa Hong Kong)', + 'en_HU' => 'Inggris (Honggari)', 'en_ID' => 'Inggris (Indonésia)', 'en_IE' => 'Inggris (Républik Irlan)', 'en_IL' => 'Inggris (Israèl)', 'en_IM' => 'Inggris (Pulo Man)', 'en_IN' => 'Inggris (Indhia)', 'en_IO' => 'Inggris (Wilayah Inggris ing Segara Hindia)', + 'en_IT' => 'Inggris (Itali)', 'en_JE' => 'Inggris (Jersey)', 'en_JM' => 'Inggris (Jamaika)', 'en_KE' => 'Inggris (Kénya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Inggris (Pulo Norfolk)', 'en_NG' => 'Inggris (Nigéria)', 'en_NL' => 'Inggris (Walanda)', + 'en_NO' => 'Inggris (Nurwègen)', 'en_NR' => 'Inggris (Nauru)', 'en_NU' => 'Inggris (Niue)', 'en_NZ' => 'Inggris (Selandia Anyar)', 'en_PG' => 'Inggris (Papua Nugini)', 'en_PH' => 'Inggris (Pilipina)', 'en_PK' => 'Inggris (Pakistan)', + 'en_PL' => 'Inggris (Polen)', 'en_PN' => 'Inggris (Kapuloan Pitcairn)', 'en_PR' => 'Inggris (Puèrto Riko)', + 'en_PT' => 'Inggris (Portugal)', 'en_PW' => 'Inggris (Palau)', + 'en_RO' => 'Inggris (Ruméni)', 'en_RW' => 'Inggris (Rwanda)', 'en_SB' => 'Inggris (Kapuloan Suleman)', 'en_SC' => 'Inggris (Sésèl)', @@ -184,6 +194,7 @@ 'en_SG' => 'Inggris (Singapura)', 'en_SH' => 'Inggris (Saint Héléna)', 'en_SI' => 'Inggris (Slovénia)', + 'en_SK' => 'Inggris (Slowak)', 'en_SL' => 'Inggris (Siéra Léoné)', 'en_SS' => 'Inggris (Sudan Kidul)', 'en_SX' => 'Inggris (Sint Martén)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ka.php b/src/Symfony/Component/Intl/Resources/data/locales/ka.php index f6e517535438e..fff440168ac29 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ka.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ka.php @@ -121,29 +121,35 @@ 'en_CM' => 'ინგლისური (კამერუნი)', 'en_CX' => 'ინგლისური (შობის კუნძული)', 'en_CY' => 'ინგლისური (კვიპროსი)', + 'en_CZ' => 'ინგლისური (ჩეხეთი)', 'en_DE' => 'ინგლისური (გერმანია)', 'en_DK' => 'ინგლისური (დანია)', 'en_DM' => 'ინგლისური (დომინიკა)', 'en_ER' => 'ინგლისური (ერიტრეა)', + 'en_ES' => 'ინგლისური (ესპანეთი)', 'en_FI' => 'ინგლისური (ფინეთი)', 'en_FJ' => 'ინგლისური (ფიჯი)', 'en_FK' => 'ინგლისური (ფოლკლენდის კუნძულები)', 'en_FM' => 'ინგლისური (მიკრონეზია)', + 'en_FR' => 'ინგლისური (საფრანგეთი)', 'en_GB' => 'ინგლისური (გაერთიანებული სამეფო)', 'en_GD' => 'ინგლისური (გრენადა)', 'en_GG' => 'ინგლისური (გერნსი)', 'en_GH' => 'ინგლისური (განა)', 'en_GI' => 'ინგლისური (გიბრალტარი)', 'en_GM' => 'ინგლისური (გამბია)', + 'en_GS' => 'ინგლისური (სამხრეთ ჯორჯია და სამხრეთ სენდვიჩის კუნძულები)', 'en_GU' => 'ინგლისური (გუამი)', 'en_GY' => 'ინგლისური (გაიანა)', 'en_HK' => 'ინგლისური (ჰონკონგის სპეციალური ადმინისტრაციული რეგიონი, ჩინეთი)', + 'en_HU' => 'ინგლისური (უნგრეთი)', 'en_ID' => 'ინგლისური (ინდონეზია)', 'en_IE' => 'ინგლისური (ირლანდია)', 'en_IL' => 'ინგლისური (ისრაელი)', 'en_IM' => 'ინგლისური (მენის კუნძული)', 'en_IN' => 'ინგლისური (ინდოეთი)', 'en_IO' => 'ინგლისური (ბრიტანეთის ტერიტორია ინდოეთის ოკეანეში)', + 'en_IT' => 'ინგლისური (იტალია)', 'en_JE' => 'ინგლისური (ჯერსი)', 'en_JM' => 'ინგლისური (იამაიკა)', 'en_KE' => 'ინგლისური (კენია)', @@ -167,15 +173,19 @@ 'en_NF' => 'ინგლისური (ნორფოლკის კუნძული)', 'en_NG' => 'ინგლისური (ნიგერია)', 'en_NL' => 'ინგლისური (ნიდერლანდები)', + 'en_NO' => 'ინგლისური (ნორვეგია)', 'en_NR' => 'ინგლისური (ნაურუ)', 'en_NU' => 'ინგლისური (ნიუე)', 'en_NZ' => 'ინგლისური (ახალი ზელანდია)', 'en_PG' => 'ინგლისური (პაპუა-ახალი გვინეა)', 'en_PH' => 'ინგლისური (ფილიპინები)', 'en_PK' => 'ინგლისური (პაკისტანი)', + 'en_PL' => 'ინგლისური (პოლონეთი)', 'en_PN' => 'ინგლისური (პიტკერნის კუნძულები)', 'en_PR' => 'ინგლისური (პუერტო-რიკო)', + 'en_PT' => 'ინგლისური (პორტუგალია)', 'en_PW' => 'ინგლისური (პალაუ)', + 'en_RO' => 'ინგლისური (რუმინეთი)', 'en_RW' => 'ინგლისური (რუანდა)', 'en_SB' => 'ინგლისური (სოლომონის კუნძულები)', 'en_SC' => 'ინგლისური (სეიშელის კუნძულები)', @@ -184,6 +194,7 @@ 'en_SG' => 'ინგლისური (სინგაპური)', 'en_SH' => 'ინგლისური (წმინდა ელენეს კუნძული)', 'en_SI' => 'ინგლისური (სლოვენია)', + 'en_SK' => 'ინგლისური (სლოვაკეთი)', 'en_SL' => 'ინგლისური (სიერა-ლეონე)', 'en_SS' => 'ინგლისური (სამხრეთ სუდანი)', 'en_SX' => 'ინგლისური (სინტ-მარტენი)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ki.php b/src/Symfony/Component/Intl/Resources/data/locales/ki.php index 0b2614bd249 10000 7e..80df7f3526ae4 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ki.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ki.php @@ -71,14 +71,17 @@ 'en_CK' => 'Gĩthungũ (Visiwa vya Cook)', 'en_CM' => 'Gĩthungũ (Kameruni)', 'en_CY' => 'Gĩthungũ (Kuprosi)', + 'en_CZ' => 'Gĩthungũ (Jamhuri ya Cheki)', 'en_DE' => 'Gĩthungũ (Njeremani)', 'en_DK' => 'Gĩthungũ (Denmaki)', 'en_DM' => 'Gĩthungũ (Dominika)', 'en_ER' => 'Gĩthungũ (Eritrea)', + 'en_ES' => 'Gĩthungũ (Hispania)', 'en_FI' => 'Gĩthungũ (Ufini)', 'en_FJ' => 'Gĩthungũ (Fiji)', 'en_FK' => 'Gĩthungũ (Visiwa vya Falkland)', 'en_FM' => 'Gĩthungũ (Mikronesia)', + 'en_FR' => 'Gĩthungũ (Ubaranja)', 'en_GB' => 'Gĩthungũ (Ngeretha)', 'en_GD' => 'Gĩthungũ (Grenada)', 'en_GH' => 'Gĩthungũ (Ngana)', @@ -86,10 +89,12 @@ 'en_GM' => 'Gĩthungũ (Gambia)', 'en_GU' => 'Gĩthungũ (Gwam)', 'en_GY' => 'Gĩthungũ (Guyana)', + 'en_HU' => 'Gĩthungũ (Hungaria)', 'en_ID' => 'Gĩthungũ (Indonesia)', 'en_IE' => 'Gĩthungũ (Ayalandi)', 'en_IL' => 'Gĩthungũ (Israeli)', 'en_IN' => 'Gĩthungũ (India)', + 'en_IT' => 'Gĩthungũ (Italia)', 'en_JM' => 'Gĩthungũ (Jamaika)', 'en_KE' => 'Gĩthungũ (Kenya)', 'en_KI' => 'Gĩthungũ (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Gĩthungũ (Kisiwa cha Norfok)', 'en_NG' => 'Gĩthungũ (Nainjeria)', 'en_NL' => 'Gĩthungũ (Uholanzi)', + 'en_NO' => 'Gĩthungũ (Norwe)', 'en_NR' => 'Gĩthungũ (Nauru)', 'en_NU' => 'Gĩthungũ (Niue)', 'en_NZ' => 'Gĩthungũ (Nyuzilandi)', 'en_PG' => 'Gĩthungũ (Papua)', 'en_PH' => 'Gĩthungũ (Filipino)', 'en_PK' => 'Gĩthungũ (Pakistani)', + 'en_PL' => 'Gĩthungũ (Polandi)', 'en_PN' => 'Gĩthungũ (Pitkairni)', 'en_PR' => 'Gĩthungũ (Pwetoriko)', + 'en_PT' => 'Gĩthungũ (Ureno)', 'en_PW' => 'Gĩthungũ (Palau)', + 'en_RO' => 'Gĩthungũ (Romania)', 'en_RW' => 'Gĩthungũ (Rwanda)', 'en_SB' => 'Gĩthungũ (Visiwa vya Solomon)', 'en_SC' => 'Gĩthungũ (Shelisheli)', @@ -128,6 +137,7 @@ 'en_SG' => 'Gĩthungũ (Singapoo)', 'en_SH' => 'Gĩthungũ (Santahelena)', 'en_SI' => 'Gĩthungũ (Slovenia)', + 'en_SK' => 'Gĩthungũ (Slovakia)', 'en_SL' => 'Gĩthungũ (Siera Leoni)', 'en_SZ' => 'Gĩthungũ (Uswazi)', 'en_TC' => 'Gĩthungũ (Visiwa vya Turki na Kaiko)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/kk.php b/src/Symfony/Component/Intl/Resources/data/locales/kk.php index 09318b9b3b05d..d49751103b1a8 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/kk.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/kk.php @@ -121,29 +121,35 @@ 'en_CM' => 'ағылшын тілі (Камерун)', 'en_CX' => 'ағылшын тілі (Рождество аралы)', 'en_CY' => 'ағылшын тілі (Кипр)', + 'en_CZ' => 'ағылшын тілі (Чехия)', 'en_DE' => 'ағылшын тілі (Германия)', 'en_DK' => 'ағылшын тілі (Дания)', 'en_DM' => 'ағылшын тілі (Доминика)', 'en_ER' => 'ағылшын тілі (Эритрея)', + 'en_ES' => 'ағылшын тілі (Испания)', 'en_FI' => 'ағылшын тілі (Финляндия)', 'en_FJ' => 'ағылшын тілі (Фиджи)', 'en_FK' => 'ағылшын тілі (Фолкленд аралдары)', 'en_FM' => 'ағылшын тілі (Микронезия)', + 'en_FR' => 'ағылшын тілі (Франция)', 'en_GB' => 'ағылшын тілі (Ұлыбритания)', 'en_GD' => 'ағылшын тілі (Гренада)', 'en_GG' => 'ағылшын тілі (Гернси)', 'en_GH' => 'ағылшын тілі (Гана)', 'en_GI' => 'ағылшын тілі (Гибралтар)', 'en_GM' => 'ағылшын тілі (Гамбия)', + 'en_GS' => 'ағылшын тілі (Оңтүстік Георгия және Оңтүстік Сандвич аралдары)', 'en_GU' => 'ағылшын тілі (Гуам)', 'en_GY' => 'ағылшын тілі (Гайана)', 'en_HK' => 'ағылшын тілі (Сянган АӘА)', + 'en_HU' => 'ағылшын тілі (Венгрия)', 'en_ID' => 'ағылшын тілі (Индонезия)', 'en_IE' => 'ағылшын тілі (Ирландия)', 'en_IL' => 'ағылшын тілі (Израиль)', 'en_IM' => 'ағылшын тілі (Мэн аралы)', 'en_IN' => 'ағылшын тілі (Үндістан)', 'en_IO' => 'ағылшын тілі (Үнді мұхитындағы Британ аймағы)', + 'en_IT' => 'ағылшын тілі (Италия)', 'en_JE' => 'ағылшын тілі (Джерси)', 'en_JM' => 'ағылшын тілі (Ямайка)', 'en_KE' => 'ағылшын тілі (Кения)', @@ -167,15 +173,19 @@ 'en_NF' => 'ағылшын тілі (Норфолк аралы)', 'en_NG' => 'ағылшын тілі (Нигерия)', 'en_NL' => 'ағылшын тілі (Нидерланд)', + 'en_NO' => 'ағылшын тілі (Норвегия)', 'en_NR' => 'ағылшын тілі (Науру)', 'en_NU' => 'ағылшын тілі (Ниуэ)', 'en_NZ' => 'ағылшын тілі (Жаңа Зеландия)', 'en_PG' => 'ағылшын тілі (Папуа — Жаңа Гвинея)', 'en_PH' => 'ағылшын тілі (Филиппин аралдары)', 'en_PK' => 'ағылшын тілі (Пәкістан)', + 'en_PL' => 'ағылшын тілі (Польша)', 'en_PN' => 'ағылшын тілі (Питкэрн аралдары)', 'en_PR' => 'ағылшын тілі (Пуэрто-Рико)', + 'en_PT' => 'ағылшын тілі (Португалия)', 'en_PW' => 'ағылшын тілі (Палау)', + 'en_RO' => 'ағылшын тілі (Румыния)', 'en_RW' => 'ағылшын тілі (Руанда)', 'en_SB' => 'ағылшын тілі (Соломон аралдары)', 'en_SC' => 'ағылшын тілі (Сейшель аралдары)', @@ -184,6 +194,7 @@ 'en_SG' => 'ағылшын тілі (Сингапур)', 'en_SH' => 'ағылшын тілі (Әулие Елена аралы)', 'en_SI' => 'ағылшын тілі (Словения)', + 'en_SK' => 'ағылшын тілі (Словакия)', 'en_SL' => 'ағылшын тілі (Сьерра-Леоне)', 'en_SS' => 'ағылшын тілі (Оңтүстік Судан)', 'en_SX' => 'ағылшын тілі (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/km.php b/src/Symfony/Component/Intl/Resources/data/locales/km.php index 1119a21464c1b..fa2eb27f0c4a5 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/km.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/km.php @@ -121,29 +121,35 @@ 'en_CM' => 'អង់គ្លេស (កាមេរូន)', 'en_CX' => 'អង់គ្លេស (កោះ​គ្រីស្មាស)', 'en_CY' => 'អង់គ្លេស (ស៊ីប)', + 'en_CZ' => 'អង់គ្លេស (ឆែក)', 'en_DE' => 'អង់គ្លេស (អាល្លឺម៉ង់)', 'en_DK' => 'អង់គ្លេស (ដាណឺម៉ាក)', 'en_DM' => 'អង់គ្លេស (ដូមីនីក)', 'en_ER' => 'អង់គ្លេស (អេរីត្រេ)', + 'en_ES' => 'អង់គ្លេស (អេស្ប៉ាញ)', 'en_FI' => 'អង់គ្លេស (ហ្វាំងឡង់)', 'en_FJ' => 'អង់គ្លេស (ហ្វីជី)', 'en_FK' => 'អង់គ្លេស (កោះ​ហ្វក់ឡែន)', 'en_FM' => 'អង់គ្លេស (មីក្រូណេស៊ី)', + 'en_FR' => 'អង់គ្លេស (បារាំង)', 'en_GB' => 'អង់គ្លេស (ចក្រភព​អង់គ្លេស)', 'en_GD' => 'អង់គ្លេស (ហ្គ្រើណាដ)', 'en_GG' => 'អង់គ្លេស (ហ្គេនស៊ី)', 'en_GH' => 'អង់គ្លេស (ហ្គាណា)', 'en_GI' => 'អង់គ្លេស (ហ្ស៊ីប្រាល់តា)', 'en_GM' => 'អង់គ្លេស (ហ្គំប៊ី)', + 'en_GS' => 'អង់គ្លេស (កោះ​ហ្សកហ្ស៊ី​ខាងត្បូង និង សង់វិច​ខាងត្បូង)', 'en_GU' => 'អង់គ្លេស (ហ្គាំ)', 'en_GY' => 'អង់គ្លេស (ហ្គីយ៉ាន)', 'en_HK' => 'អង់គ្លេស (ហុងកុង តំបន់រដ្ឋបាលពិសេសចិន)', + 'en_HU' => 'អង់គ្លេស (ហុងគ្រី)', 'en_ID' => 'អង់គ្លេស (ឥណ្ឌូណេស៊ី)', 'en_IE' => 'អង់គ្លេស (អៀរឡង់)', 'en_IL' => 'អង់គ្លេស (អ៊ីស្រាអែល)', 'en_IM' => 'អង់គ្លេស (អែលអុហ្វមែន)', 'en_IN' => 'អង់គ្លេស (ឥណ្ឌា)', 'en_IO' => 'អង់គ្លេស (ដែនដី​អង់គ្លេស​នៅ​មហា​សមុទ្រ​ឥណ្ឌា)', + 'en_IT' => 'អង់គ្លេស (អ៊ីតាលី)', 'en_JE' => 'អង់គ្លេស (ជើស៊ី)', 'en_JM' => 'អង់គ្លេស (ហ្សាម៉ាអ៊ីក)', 'en_KE' => 'អង់គ្លេស (កេនយ៉ា)', @@ -167,15 +173,19 @@ 'en_NF' => 'អង់គ្លេស (កោះ​ណ័រហ្វក់)', 'en_NG' => 'អង់គ្លេស (នីហ្សេរីយ៉ា)', 'en_NL' => 'អង់គ្លេស (ហូឡង់)', + 'en_NO' => 'អង់គ្លេស (ន័រវែស)', 'en_NR' => 'អង់គ្លេស (ណូរូ)', 'en_NU' => 'អង់គ្លេស (ណៀ)', 'en_NZ' => 'អង់គ្លេស (នូវែល​សេឡង់)', 'en_PG' => 'អង់គ្លេស (ប៉ាពូអាស៊ី​នូវែលហ្គីណេ)', 'en_PH' => 'អង់គ្លេស (ហ្វ៊ីលីពីន)', 'en_PK' => 'អង់គ្លេស (ប៉ាគីស្ថាន)', + 'en_PL' => 'អង់គ្លេស (ប៉ូឡូញ)', 'en_PN' => 'អង់គ្លេស (កោះ​ភីតកាន)', 'en_PR' => 'អង់គ្លេស (ព័រតូរីកូ)', + 'en_PT' => 'អង់គ្លេស (ព័រទុយហ្កាល់)', 'en_PW' => 'អង់គ្លេស (ផៅឡូ)', + 'en_RO' => 'អង់គ្លេស (រូម៉ានី)', 'en_RW' => 'អង់គ្លេស (រវ៉ាន់ដា)', 'en_SB' => 'អង់គ្លេស (កោះ​សូឡូម៉ុង)', 'en_SC' => 'អង់គ្លេស (សីស្ហែល)', @@ -184,6 +194,7 @@ 'en_SG' => 'អង់គ្លេស (សិង្ហបុរី)', 'en_SH' => 'អង់គ្លេស (សង់​ហេឡេណា)', 'en_SI' => 'អង់គ្លេស (ស្លូវេនី)', + 'en_SK' => 'អង់គ្លេស (ស្លូវ៉ាគី)', 'en_SL' => 'អង់គ្លេស (សៀរ៉ាឡេអូន)', 'en_SS' => 'អង់គ្លេស (ស៊ូដង់​ខាង​ត្បូង)', 'en_SX' => 'អង់គ្លេស (សីង​ម៉ាធីន)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/kn.php b/src/Symfony/Component/Intl/Resources/data/locales/kn.php index 1e06458baee66..ae81ca3499017 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/kn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/kn.php @@ -121,29 +121,35 @@ 'en_CM' => 'ಇಂಗ್ಲಿಷ್ (ಕ್ಯಾಮರೂನ್)', 'en_CX' => 'ಇಂಗ್ಲಿಷ್ (ಕ್ರಿಸ್ಮಸ್ ದ್ವೀಪ)', 'en_CY' => 'ಇಂಗ್ಲಿಷ್ (ಸೈಪ್ರಸ್)', + 'en_CZ' => 'ಇಂಗ್ಲಿಷ್ (ಝೆಕಿಯಾ)', 'en_DE' => 'ಇಂಗ್ಲಿಷ್ (ಜರ್ಮನಿ)', 'en_DK' => 'ಇಂಗ್ಲಿಷ್ (ಡೆನ್ಮಾರ್ಕ್)', 'en_DM' => 'ಇಂಗ್ಲಿಷ್ (ಡೊಮಿನಿಕಾ)', 'en_ER' => 'ಇಂಗ್ಲಿಷ್ (ಎರಿಟ್ರಿಯಾ)', + 'en_ES' => 'ಇಂಗ್ಲಿಷ್ (ಸ್ಪೇನ್)', 'en_FI' => 'ಇಂಗ್ಲಿಷ್ (ಫಿನ್‌ಲ್ಯಾಂಡ್)', 'en_FJ' => 'ಇಂಗ್ಲಿಷ್ (ಫಿಜಿ)', 'en_FK' => 'ಇಂಗ್ಲಿಷ್ (ಫಾಕ್‌ಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು)', 'en_FM' => 'ಇಂಗ್ಲಿಷ್ (ಮೈಕ್ರೋನೇಶಿಯಾ)', + 'en_FR' => 'ಇಂಗ್ಲಿಷ್ (ಫ್ರಾನ್ಸ್)', 'en_GB' => 'ಇಂಗ್ಲಿಷ್ (ಯುನೈಟೆಡ್ ಕಿಂಗ್‌ಡಮ್)', 'en_GD' => 'ಇಂಗ್ಲಿಷ್ (ಗ್ರೆನೆಡಾ)', 'en_GG' => 'ಇಂಗ್ಲಿಷ್ (ಗುರ್ನ್‌ಸೆ)', 'en_GH' => 'ಇಂಗ್ಲಿಷ್ (ಘಾನಾ)', 'en_GI' => 'ಇಂಗ್ಲಿಷ್ (ಗಿಬ್ರಾಲ್ಟರ್)', 'en_GM' => 'ಇಂಗ್ಲಿಷ್ (ಗ್ಯಾಂಬಿಯಾ)', + 'en_GS' => 'ಇಂಗ್ಲಿಷ್ (ದಕ್ಷಿಣ ಜಾರ್ಜಿಯಾ ಮತ್ತು ದಕ್ಷಿಣ ಸ್ಯಾಂಡ್‍ವಿಚ್ ದ್ವೀಪಗಳು)', 'en_GU' => 'ಇಂಗ್ಲಿಷ್ (ಗುವಾಮ್)', 'en_GY' => 'ಇಂಗ್ಲಿಷ್ (ಗಯಾನಾ)', 'en_HK' => 'ಇಂಗ್ಲಿಷ್ (ಹಾಂಗ್ ಕಾಂಗ್ ಎಸ್ಎಆರ್ ಚೈನಾ)', + 'en_HU' => 'ಇಂಗ್ಲಿಷ್ (ಹಂಗೇರಿ)', 'en_ID' => 'ಇಂಗ್ಲಿಷ್ (ಇಂಡೋನೇಶಿಯಾ)', 'en_IE' => 'ಇಂಗ್ಲಿಷ್ (ಐರ್ಲೆಂಡ್)', 'en_IL' => 'ಇಂಗ್ಲಿಷ್ (ಇಸ್ರೇಲ್)', 'en_IM' => 'ಇಂಗ್ಲಿಷ್ (ಐಲ್ ಆಫ್ ಮ್ಯಾನ್)', 'en_IN' => 'ಇಂಗ್ಲಿಷ್ (ಭಾರತ)', 'en_IO' => 'ಇಂಗ್ಲಿಷ್ (ಬ್ರಿಟೀಷ್ ಹಿಂದೂ ಮಹಾಸಾಗರದ ಪ್ರದೇಶ)', + 'en_IT' => 'ಇಂಗ್ಲಿಷ್ (ಇಟಲಿ)', 'en_JE' => 'ಇಂಗ್ಲಿಷ್ (ಜೆರ್ಸಿ)', 'en_JM' => 'ಇಂಗ್ಲಿಷ್ (ಜಮೈಕಾ)', 'en_KE' => 'ಇಂಗ್ಲಿಷ್ (ಕೀನ್ಯಾ)', @@ -167,15 +173,19 @@ 'en_NF' => 'ಇಂಗ್ಲಿಷ್ (ನಾರ್ಫೋಕ್ ದ್ವೀಪ)', 'en_NG' => 'ಇಂಗ್ಲಿಷ್ (ನೈಜೀರಿಯಾ)', 'en_NL' => 'ಇಂಗ್ಲಿಷ್ (ನೆದರ್‌ಲ್ಯಾಂಡ್ಸ್)', + 'en_NO' => 'ಇಂಗ್ಲಿಷ್ (ನಾರ್ವೆ)', 'en_NR' => 'ಇಂಗ್ಲಿಷ್ (ನೌರು)', 'en_NU' => 'ಇಂಗ್ಲಿಷ್ (ನಿಯು)', 'en_NZ' => 'ಇಂಗ್ಲಿಷ್ (ನ್ಯೂಜಿಲೆಂಡ್)', 'en_PG' => 'ಇಂಗ್ಲಿಷ್ (ಪಪುವಾ ನ್ಯೂಗಿನಿಯಾ)', 'en_PH' => 'ಇಂಗ್ಲಿಷ್ (ಫಿಲಿಫೈನ್ಸ್)', 'en_PK' => 'ಇಂಗ್ಲಿಷ್ (ಪಾಕಿಸ್ತಾನ)', + 'en_PL' => 'ಇಂಗ್ಲಿಷ್ (ಪೋಲ್ಯಾಂಡ್)', 'en_PN' => 'ಇಂಗ್ಲಿಷ್ (ಪಿಟ್‌ಕೈರ್ನ್ ದ್ವೀಪಗಳು)', 'en_PR' => 'ಇಂಗ್ಲಿಷ್ (ಪ್ಯೂರ್ಟೋ ರಿಕೊ)', + 'en_PT' => 'ಇಂಗ್ಲಿಷ್ (ಪೋರ್ಚುಗಲ್)', 'en_PW' => 'ಇಂಗ್ಲಿಷ್ (ಪಲಾವು)', + 'en_RO' => 'ಇಂಗ್ಲಿಷ್ (ರೊಮೇನಿಯಾ)', 'en_RW' => 'ಇಂಗ್ಲಿಷ್ (ರುವಾಂಡಾ)', 'en_SB' => 'ಇಂಗ್ಲಿಷ್ (ಸಾಲೊಮನ್ ದ್ವೀಪಗಳು)', 'en_SC' => 'ಇಂಗ್ಲಿಷ್ (ಸೀಶೆಲ್ಲೆಸ್)', @@ -184,6 +194,7 @@ 'en_SG' => 'ಇಂಗ್ಲಿಷ್ (ಸಿಂಗಪುರ್)', 'en_SH' => 'ಇಂಗ್ಲಿಷ್ (ಸೇಂಟ್ ಹೆಲೆನಾ)', 'en_SI' => 'ಇಂಗ್ಲಿಷ್ (ಸ್ಲೋವೇನಿಯಾ)', + 'en_SK' => 'ಇಂಗ್ಲಿಷ್ (ಸ್ಲೊವಾಕಿಯಾ)', 'en_SL' => 'ಇಂಗ್ಲಿಷ್ (ಸಿಯೆರ್ರಾ ಲಿಯೋನ್)', 'en_SS' => 'ಇಂಗ್ಲಿಷ್ (ದಕ್ಷಿಣ ಸುಡಾನ್)', 'en_SX' => 'ಇಂಗ್ಲಿಷ್ (ಸಿಂಟ್ ಮಾರ್ಟೆನ್)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ko.php b/src/Symfony/Component/Intl/Resources/data/locales/ko.php index 6310a1dc7e9fb..361cac880efd4 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ko.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ko.php @@ -121,29 +121,35 @@ 'en_CM' => '영어(카메룬)', 'en_CX' => '영어(크리스마스섬)', 'en_CY' => '영어(키프로스)', + 'en_CZ' => '영어(체코)', 'en_DE' => '영어(독일)', 'en_DK' => '영어(덴마크)', 'en_DM' => '영어(도미니카)', 'en_ER' => '영어(에리트리아)', + 'en_ES' => '영어(스페인)', 'en_FI' => '영어(핀란드)', 'en_FJ' => '영어(피지)', 'en_FK' => '영어(포클랜드 제도)', 'en_FM' => '영어(미크로네시아)', + 'en_FR' => '영어(프랑스)', 'en_GB' => '영어(영국)', 'en_GD' => '영어(그레나다)', 'en_GG' => '영어(건지)', 'en_GH' => '영어(가나)', 'en_GI' => '영어(지브롤터)', 'en_GM' => '영어(감비아)', + 'en_GS' => '영어(사우스조지아 사우스샌드위치 제도)', 'en_GU' => '영어(괌)', 'en_GY' => '영어(가이아나)', 'en_HK' => '영어(홍콩[중국 특별행정구])', + 'en_HU' => '영어(헝가리)', 'en_ID' => '영어(인도네시아)', 'en_IE' => '영어(아일랜드)', 'en_IL' => '영어(이스라엘)', 'en_IM' => '영어(맨섬)', 'en_IN' => '영어(인도)', 'en_IO' => '영어(영국령 인도양 지역)', + 'en_IT' => '영어(이탈리아)', 'en_JE' => '영어(저지)', 'en_JM' => '영어(자메이카)', 'en_KE' => '영어(케냐)', @@ -167,15 +173,19 @@ 'en_NF' => '영어(노퍽섬)', 'en_NG' => '영어(나이지리아)', 'en_NL' => '영어(네덜란드)', + 'en_NO' => '영어(노르웨이)', 'en_NR' => '영어(나우루)', 'en_NU' => '영어(니우에)', 'en_NZ' => '영어(뉴질랜드)', 'en_PG' => '영어(파푸아뉴기니)', 'en_PH' => '영어(필리핀)', 'en_PK' => '영어(파키스탄)', + 'en_PL' => '영어(폴란드)', 'en_PN' => '영어(핏케언 제도)', 'en_PR' => '영어(푸에르토리코)', + 'en_PT' => '영어(포르투갈)', 'en_PW' => '영어(팔라우)', + 'en_RO' => '영어(루마니아)', 'en_RW' => '영어(르완다)', 'en_SB' => '영어(솔로몬 제도)', 'en_SC' => '영어(세이셸)', @@ -184,6 +194,7 @@ 'en_SG' => '영어(싱가포르)', 'en_SH' => '영어(세인트헬레나)', 'en_SI' => '영어(슬로베니아)', + 'en_SK' => '영어(슬로바키아)', 'en_SL' => '영어(시에라리온)', 'en_SS' => '영어(남수단)', 'en_SX' => '영어(신트마르턴)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ks.php b/src/Symfony/Component/Intl/Resources/data/locales/ks.php index de1a105d9ab83..3319ba86cb728 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ks.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ks.php @@ -121,28 +121,34 @@ 'en_CM' => 'اَنگیٖزؠ (کیمِروٗن)', 'en_CX' => 'اَنگیٖزؠ (کرِسمَس جٔزیٖرٕ)', 'en_CY' => 'اَنگیٖزؠ (سائپرس)', + 'en_CZ' => 'اَنگیٖزؠ (چیکیا)', 'en_DE' => 'اَنگیٖزؠ (جرمٔنی)', 'en_DK' => 'اَنگیٖزؠ (ڈینمارٕک)', 'en_DM' => 'اَنگیٖزؠ (ڈومِنِکا)', 'en_ER' => 'اَنگیٖزؠ (اِرٕٹِیا)', + 'en_ES' => 'اَنگیٖزؠ (سٕپین)', 'en_FI' => 'اَنگیٖزؠ (فِن لینڈ)', 'en_FJ' => 'اَنگیٖزؠ (فِجی)', 'en_FK' => 'اَنگیٖزؠ (فٕلاکلینڑ جٔزیٖرٕ)', 'en_FM' => 'اَنگیٖزؠ (مائیکرونیشیا)', + 'en_FR' => 'اَنگیٖزؠ (فرانس)', 'en_GB' => 'اَنگیٖزؠ (متحدہ مملِکت)', 'en_GD' => 'اَنگیٖزؠ (گرینیڈا)', 'en_GG' => 'اَنگیٖزؠ (گورنسے)', 'en_GH' => 'اَنگیٖزؠ (گانا)', 'en_GI' => 'اَنگیٖزؠ (جِبرالٹَر)', 'en_GM' => 'اَنگیٖزؠ (گَمبِیا)', + 'en_GS' => 'اَنگیٖزؠ (جنوٗبی جارجِیا تہٕ جنوٗبی سینڑوٕچ جٔزیٖرٕ)', 'en_GU' => 'اَنگیٖزؠ (گُوام)', 'en_GY' => 'اَنگیٖزؠ (گُیانا)', 'en_HK' => 'اَنگیٖزؠ (ہانگ کانگ ایس اے آر چیٖن)', + 'en_HU' => 'اَنگیٖزؠ (ہَنگری)', 'en_ID' => 'اَنگیٖزؠ (انڈونیشیا)', 'en_IE' => 'اَنگیٖزؠ (اَیَرلینڑ)', 'en_IL' => 'اَنگیٖزؠ (اسرا ییل)', 'en_IM' => 'اَنگیٖزؠ (آیِل آف مین)', 'en_IN' => 'اَنگیٖزؠ (ہِندوستان)', + 'en_IT' => 'اَنگیٖزؠ (اِٹلی)', 'en_JE' => 'اَنگیٖزؠ (جٔرسی)', 'en_JM' => 'اَنگیٖزؠ (جَمایکا)', 'en_KE' => 'اَنگیٖزؠ (کِنیا)', @@ -166,15 +172,19 @@ 'en_NF' => 'اَنگیٖزؠ (نارفاک جٔزیٖرٕ)', 'en_NG' => 'اَنگیٖزؠ (نایجیرِیا)', 'en_NL' => 'اَنگیٖزؠ (نیٖدَرلینڑ)', + 'en_NO' => 'اَنگیٖزؠ (ناروے)', 'en_NR' => 'اَنگیٖزؠ (نارووٗ)', 'en_NU' => 'اَنگیٖزؠ (نیوٗ)', 'en_NZ' => 'اَنگیٖزؠ (نیوزی لینڈ)', 'en_PG' => 'اَنگیٖزؠ (پاپُوا نیوٗ گیٖنی)', 'en_PH' => 'اَنگیٖزؠ (فلپائن)', 'en_PK' => 'اَنگیٖزؠ (پاکِستان)', + 'en_PL' => 'اَنگیٖزؠ (پولینڈ)', 'en_PN' => 'اَنگیٖزؠ (پِٹکیرٕنؠ جٔزیٖرٕ)', 'en_PR' => 'اَنگیٖزؠ (پٔرٹو رِکو)', + 'en_PT' => 'اَنگیٖزؠ (پُرتِگال)', 'en_PW' => 'اَنگیٖزؠ (پَلاو)', + 'en_RO' => 'اَنگیٖزؠ (رومانِیا)', 'en_RW' => 'اَنگیٖزؠ (روٗوانڈا)', 'en_SB' => 'اَنگیٖزؠ (سولامان جٔزیٖرٕ)', 'en_SC' => 'اَنگیٖزؠ (سیشَلِس)', @@ -183,6 +193,7 @@ 'en_SG' => 'اَنگیٖزؠ (سِنگاپوٗر)', 'en_SH' => 'اَنگیٖزؠ (سینٹ ہؠلِنا)', 'en_SI' => 'اَنگیٖزؠ (سَلووینِیا)', + 'en_SK' => 'اَنگیٖزؠ (سَلوواکِیا)', 'en_SL' => 'اَنگیٖزؠ (سیرا لیون)', 'en_SS' => 'اَنگیٖزؠ (جنوبی سوڈان)', 'en_SX' => 'اَنگیٖزؠ (سِنٹ مارٹِن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ks_Deva.php b/src/Symfony/Component/Intl/Resources/data/locales/ks_Deva.php index 86a9b7907d63c..11590da23ea57 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ks_Deva.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ks_Deva.php @@ -51,28 +51,34 @@ 'en_CM' => 'अंगरिज़ी (کیمِروٗن)', 'en_CX' => 'अंगरिज़ी (کرِسمَس جٔزیٖرٕ)', 'en_CY' => 'अंगरिज़ी (سائپرس)', + 'en_CZ' => 'अंगरिज़ी (چیکیا)', 'en_DE' => 'अंगरिज़ी (जर्मन)', 'en_DK' => 'अंगरिज़ी (ڈینمارٕک)', 'en_DM' => 'अंगरिज़ी (ڈومِنِکا)', 'en_ER' => 'अंगरिज़ी (اِرٕٹِیا)', + 'en_ES' => 'अंगरिज़ी (سٕپین)', 'en_FI' => 'अंगरिज़ी (فِن لینڈ)', 'en_FJ' => 'अंगरिज़ी (فِجی)', 'en_FK' => 'अंगरिज़ी (فٕلاکلینڑ جٔزیٖرٕ)', 'en_FM' => 'अंगरिज़ी (مائیکرونیشیا)', + 'en_FR' => 'अंगरिज़ी (फ्रांस)', 'en_GB' => 'अंगरिज़ी (मुतहीद बादशाहत)', 'en_GD' => 'अंगरिज़ी (گرینیڈا)', 'en_GG' => 'अंगरिज़ी (گورنسے)', 'en_GH' => 'अंगरिज़ी (گانا)', 'en_GI' => 'अंगरिज़ी (جِبرالٹَر)', 'en_GM' => 'अंगरिज़ी (گَمبِیا)', + 'en_GS' => 'अंगरिज़ी (جنوٗبی جارجِیا تہٕ جنوٗبی سینڑوٕچ جٔزیٖرٕ)', 'en_GU' => 'अंगरिज़ी (گُوام)', 'en_GY' => 'अंगरिज़ी (گُیانا)', 'en_HK' => 'अंगरिज़ी (ہانگ کانگ ایس اے آر چیٖن)', + 'en_HU' => 'अंगरिज़ी (ہَنگری)', 'en_ID' => 'अंगरिज़ी (انڈونیشیا)', 'en_IE' => 'अंगरिज़ी (اَیَرلینڑ)', 'en_IL' => 'अंगरिज़ी (اسرا ییل)', 'en_IM' => 'अंगरिज़ी (آیِل آف مین)', 'en_IN' => 'अंगरिज़ी (हिंदोस्तान)', + 'en_IT' => 'अंगरिज़ी (इटली)', 'en_JE' => 'अंगरिज़ी (جٔرسی)', 'en_JM' => 'अंगरिज़ी (جَمایکا)', 'en_KE' => 'अंगरिज़ी (کِنیا)', @@ -96,15 +102,19 @@ 'en_NF' => 'अंगरिज़ी (نارفاک جٔزیٖرٕ)', 'en_NG' => 'अंगरिज़ी (نایجیرِیا)', 'en_NL' => 'अंगरिज़ी (نیٖدَرلینڑ)', + 'en_NO' => 'अंगरिज़ी (ناروے)', 'en_NR' => 'अंगरिज़ी (نارووٗ)', 'en_NU' => 'अंगरिज़ी (نیوٗ)', 'en_NZ' => 'अंगरिज़ी (نیوزی لینڈ)', 'en_PG' => 'अंगरिज़ी (پاپُوا نیوٗ گیٖنی)', 'en_PH' => 'अंगरिज़ी (فلپائن)', 'en_PK' => 'अंगरिज़ी (پاکِستان)', + 'en_PL' => 'अंगरिज़ी (پولینڈ)', 'en_PN' => 'अंगरिज़ी (پِٹکیرٕنؠ جٔزیٖرٕ)', 'en_PR' => 'अंगरिज़ी (پٔرٹو رِکو)', + 'en_PT' => 'अंगरिज़ी (پُرتِگال)', 'en_PW' => 'अंगरिज़ी (پَلاو)', + 'en_RO' => 'अंगरिज़ी (رومانِیا)', 'en_RW' => 'अंगरिज़ी (روٗوانڈا)', 'en_SB' => 'अंगरिज़ी (سولامان جٔزیٖرٕ)', 'en_SC' => 'अंगरिज़ी (سیشَلِس)', @@ -113,6 +123,7 @@ 'en_SG' => 'अंगरिज़ी (سِنگاپوٗر)', 'en_SH' => 'अंगरिज़ी (سینٹ ہؠلِنا)', 'en_SI' => 'अंगरिज़ी (سَلووینِیا)', + 'en_SK' => 'अंगरिज़ी (سَلوواکِیا)', 'en_SL' => 'अंगरिज़ी (سیرا لیون)', 'en_SS' => 'अंगरिज़ी (جنوبی سوڈان)', 'en_SX' => 'अंगरिज़ी (سِنٹ مارٹِن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ku.php b/src/Symfony/Component/Intl/Resources/data/locales/ku.php index dabeac60c074d..498ece74e15fc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ku.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ku.php @@ -121,29 +121,35 @@ 'en_CM' => 'îngilîzî (Kamerûn)', 'en_CX' => 'îngilîzî (Girava Christmasê)', 'en_CY' => 'îngilîzî (Qibris)', + 'en_CZ' => 'îngilîzî (Çekya)', 'en_DE' => 'îngilîzî (Almanya)', 'en_DK' => 'îngilîzî (Danîmarka)', 'en_DM' => 'îngilîzî (Domînîka)', 'en_ER' => 'îngilîzî (Erître)', + 'en_ES' => 'îngilîzî (Spanya)', 'en_FI' => 'îngilîzî (Fînlenda)', 'en_FJ' => 'îngilîzî (Fîjî)', 'en_FK' => 'îngilîzî (Giravên Falklandê)', 'en_FM' => 'îngilîzî (Mîkronezya)', + 'en_FR' => 'îngilîzî (Fransa)', 'en_GB' => 'îngilîzî (Qiralîyeta Yekbûyî)', 'en_GD' => 'îngilîzî (Grenada)', 'en_GG' => 'îngilîzî (Guernsey)', 'en_GH' => 'îngilîzî (Gana)', 'en_GI' => 'îngilîzî (Cebelîtariq)', 'en_GM' => 'îngilîzî (Gambîya)', + 'en_GS' => 'îngilîzî (Giravên Georgîyaya Başûr û Sandwicha Başûr)', 'en_GU' => 'îngilîzî (Guam)', 'en_GY' => 'îngilîzî (Guyana)', 'en_HK' => 'îngilîzî (Hong Konga HîT ya Çînê)', + 'en_HU' => 'îngilîzî (Macaristan)', 'en_ID' => 'îngilîzî (Endonezya)', 'en_IE' => 'îngilîzî (Îrlanda)', 'en_IL' => 'îngilîzî (Îsraîl)', 'en_IM' => 'îngilîzî (Girava Manê)', 'en_IN' => 'îngilîzî (Hindistan)', 'en_IO' => 'îngilîzî (Herêma Okyanûsa Hindî ya Brîtanyayê)', + 'en_IT' => 'îngilîzî (Îtalya)', 'en_JE' => 'îngilîzî (Jersey)', 'en_JM' => 'îngilîzî (Jamaîka)', 'en_KE' => 'îngilîzî (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'îngilîzî (Girava Norfolkê)', 'en_NG' => 'îngilîzî (Nîjerya)', 'en_NL' => 'îngilîzî (Holanda)', + 'en_NO' => 'îngilîzî (Norwêc)', 'en_NR' => 'îngilîzî (Naûrû)', 'en_NU' => 'îngilîzî (Niûe)', 'en_NZ' => 'îngilîzî (Zelandaya Nû)', 'en_PG' => 'îngilîzî (Papua Gîneya Nû)', 'en_PH' => 'îngilîzî (Fîlîpîn)', 'en_PK' => 'îngilîzî (Pakistan)', + 'en_PL' => 'îngilîzî (Polonya)', 'en_PN' => 'îngilîzî (Giravên Pitcairnê)', 'en_PR' => 'îngilîzî (Porto Rîko)', + 'en_PT' => 'îngilîzî (Portûgal)', 'en_PW' => 'îngilîzî (Palau)', + 'en_RO' => 'îngilîzî (Romanya)', 'en_RW' => 'îngilîzî (Rwanda)', 'en_SB' => 'îngilîzî (Giravên Solomonê)', 'en_SC' => 'îngilîzî (Seyşel)', @@ -184,6 +194,7 @@ 'en_SG' => 'îngilîzî (Sîngapûr)', 'en_SH' => 'îngilîzî (Saint Helena)', 'en_SI' => 'îngilîzî (Slovenya)', + 'en_SK' => 'îngilîzî (Slovakya)', 'en_SL' => 'îngilîzî (Sierra Leone)', 'en_SS' => 'îngilîzî (Sûdana Başûr)', 'en_SX' => 'îngilîzî (Sint Marteen)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ky.php b/src/Symfony/Component/Intl/Resources/data/locales/ky.php index 8b1d6bfdf919d..a823800edaf92 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ky.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ky.php @@ -121,29 +121,35 @@ 'en_CM' => 'англисче (Камерун)', 'en_CX' => 'англисче (Рождество аралы)', 'en_CY' => 'англисче (Кипр)', + 'en_CZ' => 'англисче (Чехия)', 'en_DE' => 'англисче (Германия)', 'en_DK' => 'англисче (Дания)', 'en_DM' => 'англисче (Доминика)', 'en_ER' => 'англисче (Эритрея)', + 'en_ES' => 'англисче (Испания)', 'en_FI' => 'англисче (Финляндия)', 'en_FJ' => 'англисче (Фиджи)', 'en_FK' => 'англисче (Фолкленд аралдары)', 'en_FM' => 'англисче (Микронезия)', + 'en_FR' => 'англисче (Франция)', 'en_GB' => 'англисче (Улуу Британия)', 'en_GD' => 'англисче (Гренада)', 'en_GG' => 'англисче (Гернси)', 'en_GH' => 'англисче (Гана)', 'en_GI' => 'англисче (Гибралтар)', 'en_GM' => 'англисче (Гамбия)', + 'en_GS' => 'англисче (Түштүк Жоржия жана Түштүк Сэндвич аралдары)', 'en_GU' => 'англисче (Гуам)', 'en_GY' => 'англисче (Гайана)', 'en_HK' => 'англисче (Гонконг Кытай ААА)', + 'en_HU' => 'англисче (Венгрия)', 'en_ID' => 'англисче (Индонезия)', 'en_IE' => 'англисче (Ирландия)', 'en_IL' => 'англисче (Израиль)', 'en_IM' => 'англисче (Мэн аралы)', 'en_IN' => 'англисче (Индия)', 'en_IO' => 'англисче (Инди океанындагы Британ территориясы)', + 'en_IT' => 'англисче (Италия)', 'en_JE' => 'англисче (Жерси)', 'en_JM' => 'англисче (Ямайка)', 'en_KE' => 'англисче (Кения)', @@ -167,15 +173,19 @@ 'en_NF' => 'англисче (Норфолк аралы)', 'en_NG' => 'англисче (Нигерия)', 'en_NL' => 'англисче (Нидерланд)', + 'en_NO' => 'англисче (Норвегия)', 'en_NR' => 'англисче (Науру)', 'en_NU' => 'англисче (Ниуэ)', 'en_NZ' => 'англисче (Жаңы Зеландия)', 'en_PG' => 'англисче (Папуа-Жаңы Гвинея)', 'en_PH' => 'англисче (Филиппин)', 'en_PK' => 'англисче (Пакистан)', + 'en_PL' => 'англисче (Польша)', 'en_PN' => 'англисче (Питкэрн аралдары)', 'en_PR' => 'англисче (Пуэрто-Рико)', + 'en_PT' => 'англисче (Португалия)', 'en_PW' => 'англисче (Палау)', + 'en_RO' => 'англисче (Румыния)', 'en_RW' => 'англисче (Руанда)', 'en_SB' => 'англисче (Соломон аралдары)', 'en_SC' => 'англисче (Сейшел аралдары)', @@ -184,6 +194,7 @@ 'en_SG' => 'англисче (Сингапур)', 'en_SH' => 'англисче (Ыйык Елена)', 'en_SI' => 'англисче (Словения)', + 'en_SK' => 'англисче (Словакия)', 'en_SL' => 'англисче (Сьерра-Леоне)', 'en_SS' => 'англисче (Түштүк Судан)', 'en_SX' => 'англисче (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lb.php b/src/Symfony/Component/Intl/Resources/data/locales/lb.php index 9192eb856f9c1..5d6e9b5f19c3f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lb.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lb.php @@ -121,28 +121,34 @@ 'en_CM' => 'Englesch (Kamerun)', 'en_CX' => 'Englesch (Chrëschtdagsinsel)', 'en_CY' => 'Englesch (Zypern)', + 'en_CZ' => 'Englesch (Tschechien)', 'en_DE' => 'Englesch (Däitschland)', 'en_DK' => 'Englesch (Dänemark)', 'en_DM' => 'Englesch (Dominica)', 'en_ER' => 'Englesch (Eritrea)', + 'en_ES' => 'Englesch (Spanien)', 'en_FI' => 'Englesch (Finnland)', 'en_FJ' => 'Englesch (Fidschi)', 'en_FK' => 'Englesch (Falklandinselen)', 'en_FM' => 'Englesch (Mikronesien)', + 'en_FR' => 'Englesch (Frankräich)', 'en_GB' => 'Englesch (Groussbritannien)', 'en_GD' => 'Englesch (Grenada)', 'en_GG' => 'Englesch (Guernsey)', 'en_GH' => 'Englesch (Ghana)', 'en_GI' => 'Englesch (Gibraltar)', 'en_GM' => 'Englesch (Gambia)', + 'en_GS' => 'Englesch (Südgeorgien an déi Südlech Sandwichinselen)', 'en_GU' => 'Englesch (Guam)', 'en_GY' => 'Englesch (Guyana)', 'en_HK' => 'Englesch (Spezialverwaltungszon Hong Kong)', + 'en_HU' => 'Englesch (Ungarn)', 'en_ID' => 'Englesch (Indonesien)', 'en_IE' => 'Englesch (Irland)', 'en_IL' => 'Englesch (Israel)', 'en_IM' => 'Englesch (Isle of Man)', 'en_IN' => 'Englesch (Indien)', + 'en_IT' => 'Englesch (Italien)', 'en_JE' => 'Englesch (Jersey)', 'en_JM' => 'Englesch (Jamaika)', 'en_KE' => 'Englesch (Kenia)', @@ -166,15 +172,19 @@ 'en_NF' => 'Englesch (Norfolkinsel)', 'en_NG' => 'Englesch (Nigeria)', 'en_NL' => 'Englesch (Holland)', + 'en_NO' => 'Englesch (Norwegen)', 'en_NR' => 'Englesch (Nauru)', 'en_NU' => 'Englesch (Niue)', 'en_NZ' => 'Englesch (Neiséiland)', 'en_PG' => 'Englesch (Papua-Neiguinea)', 'en_PH' => 'Englesch (Philippinnen)', 'en_PK' => 'Englesch (Pakistan)', + 'en_PL' => 'Englesch (Polen)', 'en_PN' => 'Englesch (Pitcairninselen)', 'en_PR' => 'Englesch (Puerto Rico)', + 'en_PT' => 'Englesch (Portugal)', 'en_PW' => 'Englesch (Palau)', + 'en_RO' => 'Englesch (Rumänien)', 'en_RW' => 'Englesch (Ruanda)', 'en_SB' => 'Englesch (Salomonen)', 'en_SC' => 'Englesch (Seychellen)', @@ -183,6 +193,7 @@ 'en_SG' => 'Englesch (Singapur)', 'en_SH' => 'Englesch (St. Helena)', 'en_SI' => 'Englesch (Slowenien)', + 'en_SK' => 'Englesch (Slowakei)', 'en_SL' => 'Englesch (Sierra Leone)', 'en_SS' => 'Englesch (Südsudan)', 'en_SX' => 'Englesch (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lg.php b/src/Symfony/Component/Intl/Resources/data/locales/lg.php index 4199d4b607f85..0da7e0faff1d7 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lg.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lg.php @@ -71,14 +71,17 @@ 'en_CK' => 'Lungereza (Bizinga bya Kkuki)', 'en_CM' => 'Lungereza (Kameruuni)', 'en_CY' => 'Lungereza (Sipuriya)', + 'en_CZ' => 'Lungereza (Lipubulika ya Ceeka)', 'en_DE' => 'Lungereza (Budaaki)', 'en_DK' => 'Lungereza (Denimaaka)', 'en_DM' => 'Lungereza (Dominika)', 'en_ER' => 'Lungereza (Eritureya)', + 'en_ES' => 'Lungereza (Sipeyini)', 'en_FI' => 'Lungereza (Finilandi)', 'en_FJ' => 'Lungereza (Fiji)', 'en_FK' => 'Lungereza (Bizinga by’eFalikalandi)', 'en_FM' => 'Lungereza (Mikuronezya)', + 'en_FR' => 'Lungereza (Bufalansa)', 'en_GB' => 'Lungereza (Bungereza)', 'en_GD' => 'Lungereza (Gurenada)', 'en_GH' => 'Lungereza (Gana)', @@ -86,10 +89,12 @@ 'en_GM' => 'Lungereza (Gambya)', 'en_GU' => 'Lungereza (Gwamu)', 'en_GY' => 'Lungereza (Gayana)', + 'en_HU' => 'Lungereza (Hangare)', 'en_ID' => 'Lungereza (Yindonezya)', 'en_IE' => 'Lungereza (Ayalandi)', 'en_IL' => 'Lungereza (Yisirayeri)', 'en_IN' => 'Lungereza (Buyindi)', + 'en_IT' => 'Lungereza (Yitale)', 'en_JM' => 'Lungereza (Jamayika)', 'en_KE' => 'Lungereza (Kenya)', 'en_KI' => 'Lungereza (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Lungereza (Kizinga ky’eNorofoko)', 'en_NG' => 'Lungereza (Nayijerya)', 'en_NL' => 'Lungereza (Holandi)', + 'en_NO' => 'Lungereza (Nowe)', 'en_NR' => 'Lungereza (Nawuru)', 'en_NU' => 'Lungereza (Niyuwe)', 'en_NZ' => 'Lungereza (Niyuziirandi)', 'en_PG' => 'Lungereza (Papwa Nyugini)', 'en_PH' => 'Lungereza (Bizinga bya Firipino)', 'en_PK' => 'Lungereza (Pakisitaani)', + 'en_PL' => 'Lungereza (Polandi)', 'en_PN' => 'Lungereza (Pitikeeni)', 'en_PR' => 'Lungereza (Potoriko)', + 'en_PT' => 'Lungereza (Potugaali)', 'en_PW' => 'Lungereza (Palawu)', + 'en_RO' => 'Lungereza (Lomaniya)', 'en_RW' => 'Lungereza (Rwanda)', 'en_SB' => 'Lungereza (Bizanga by’eSolomooni)', 'en_SC' => 'Lungereza (Sesere)', @@ -128,6 +137,7 @@ 'en_SG' => 'Lungereza (Singapowa)', 'en_SH' => 'Lungereza (Senti Herena)', 'en_SI' => 'Lungereza (Sirovenya)', + 'en_SK' => 'Lungereza (Sirovakya)', 'en_SL' => 'Lungereza (Siyeralewone)', 'en_SZ' => 'Lungereza (Swazirandi)', 'en_TC' => 'Lungereza (Bizinga by’eTaaka ne Kayikosi)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ln.php b/src/Symfony/Component/Intl/Resources/data/locales/ln.php index 6b5a85573208b..0b9f2353c4db0 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ln.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ln.php @@ -71,26 +71,32 @@ 'en_CK' => 'lingɛlɛ́sa (Bisanga bya Kookɛ)', 'en_CM' => 'lingɛlɛ́sa (Kamɛrune)', 'en_CY' => 'lingɛlɛ́sa (Sípɛlɛ)', + 'en_CZ' => 'lingɛlɛ́sa (Shekia)', 'en_DE' => 'lingɛlɛ́sa (Alemani)', 'en_DK' => 'lingɛlɛ́sa (Danɛmarike)', 'en_DM' => 'lingɛlɛ́sa (Domínike)', 'en_ER' => 'lingɛlɛ́sa (Elitelɛ)', + 'en_ES' => 'lingɛlɛ́sa (Esipanye)', 'en_FI' => 'lingɛlɛ́sa (Filandɛ)', 'en_FJ' => 'lingɛlɛ́sa (Fidzi)', 'en_FK' => 'lingɛlɛ́sa (Bisanga bya Maluni)', 'en_FM' => 'lingɛlɛ́sa (Mikronezi)', + 'en_FR' => 'lingɛlɛ́sa (Falánsɛ)', 'en_GB' => 'lingɛlɛ́sa (Angɛlɛtɛ́lɛ)', 'en_GD' => 'lingɛlɛ́sa (Gelenadɛ)', 'en_GG' => 'lingɛlɛ́sa (Guernesey)', 'en_GH' => 'lingɛlɛ́sa (Gana)', 'en_GI' => 'lingɛlɛ́sa (Zibatalɛ)', 'en_GM' => 'lingɛlɛ́sa (Gambi)', + 'en_GS' => 'lingɛlɛ́sa (Îles de Géorgie du Sud et Sandwich du Sud)', 'en_GU' => 'lingɛlɛ́sa (Gwamɛ)', 'en_GY' => 'lingɛlɛ́sa (Giyane)', + 'en_HU' => 'lingɛlɛ́sa (Ongili)', 'en_ID' => 'lingɛlɛ́sa (Indonezi)', 'en_IE' => 'lingɛlɛ́sa (Irelandɛ)', 'en_IL' => 'lingɛlɛ́sa (Isirayelɛ)', 'en_IN' => 'lingɛlɛ́sa (Índɛ)', + 'en_IT' => 'lingɛlɛ́sa (Itali)', 'en_JM' => 'lingɛlɛ́sa (Zamaiki)', 'en_KE' => 'lingɛlɛ́sa (Kenya)', 'en_KI' => 'lingɛlɛ́sa (Kiribati)', @@ -112,15 +118,19 @@ 'en_NF' => 'lingɛlɛ́sa (Esanga Norfokɛ)', 'en_NG' => 'lingɛlɛ́sa (Nizerya)', 'en_NL' => 'lingɛlɛ́sa (Olandɛ)', + 'en_NO' => 'lingɛlɛ́sa (Norivezɛ)', 'en_NR' => 'lingɛlɛ́sa (Nauru)', 'en_NU' => 'lingɛlɛ́sa (Nyué)', 'en_NZ' => 'lingɛlɛ́sa (Zelandɛ ya sika)', 'en_PG' => 'lingɛlɛ́sa (Papwazi Ginɛ ya sika)', 'en_PH' => 'lingɛlɛ́sa (Filipinɛ)', 'en_PK' => 'lingɛlɛ́sa (Pakisitá)', + 'en_PL' => 'lingɛlɛ́sa (Poloni)', 'en_PN' => 'lingɛlɛ́sa (Pikairni)', 'en_PR' => 'lingɛlɛ́sa (Pɔtoriko)', + 'en_PT' => 'lingɛlɛ́sa (Putúlugɛsi)', 'en_PW' => 'lingɛlɛ́sa (Palau)', + 'en_RO' => 'lingɛlɛ́sa (Romani)', 'en_RW' => 'lingɛlɛ́sa (Rwanda)', 'en_SB' => 'lingɛlɛ́sa (Bisanga Solomɔ)', 'en_SC' => 'lingɛlɛ́sa (Sɛshɛlɛ)', @@ -129,6 +139,7 @@ 'en_SG' => 'lingɛlɛ́sa (Singapurɛ)', 'en_SH' => 'lingɛlɛ́sa (Sántu eleni)', 'en_SI' => 'lingɛlɛ́sa (Siloveni)', + 'en_SK' => 'lingɛlɛ́sa (Silovaki)', 'en_SL' => 'lingɛlɛ́sa (Siera Leonɛ)', 'en_SZ' => 'lingɛlɛ́sa (Swazilandi)', 'en_TC' => 'lingɛlɛ́sa (Bisanga bya Turki mpé Kaiko)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lo.php b/src/Symfony/Component/Intl/Resources/data/locales/lo.php index 7931dfaf9a37b..2f551a2141492 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lo.php @@ -121,29 +121,35 @@ 'en_CM' => 'ອັງກິດ (ຄາເມຣູນ)', 'en_CX' => 'ອັງກິດ (ເກາະຄຣິສມາດ)', 'en_CY' => 'ອັງກິດ (ໄຊປຣັສ)', + 'en_CZ' => 'ອັງກິດ (ເຊັກເຊຍ)', 'en_DE' => 'ອັງກິດ (ເຢຍລະມັນ)', 'en_DK' => 'ອັງກິດ (ເດນມາກ)', 'en_DM' => 'ອັງກິດ (ໂດມີນິຄາ)', 'en_ER' => 'ອັງກິດ (ເອຣິເທຣຍ)', + 'en_ES' => 'ອັງກິດ (ສະເປນ)', 'en_FI' => 'ອັງກິດ (ຟິນແລນ)', 'en_FJ' => 'ອັງກິດ (ຟິຈິ)', 'en_FK' => 'ອັງກິດ (ຫມູ່ເກາະຟອກແລນ)', 'en_FM' => 'ອັງກິດ (ໄມໂຄຣນີເຊຍ)', + 'en_FR' => 'ອັງກິດ (ຝຣັ່ງ)', 'en_GB' => 'ອັງກິດ (ສະຫະລາດຊະອະນາຈັກ)', 'en_GD' => 'ອັງກິດ (ເກຣເນດາ)', 'en_GG' => 'ອັງກິດ (ເກີນຊີ)', 'en_GH' => 'ອັງກິດ (ການາ)', 'en_GI' => 'ອັງກິດ (ຈິບບຣອນທາ)', 'en_GM' => 'ອັງກິດ (ສາທາລະນະລັດແກມເບຍ)', + 'en_GS' => 'ອັງກິດ (ໝູ່ເກາະ ຈໍເຈຍຕອນໃຕ້ ແລະ ແຊນວິດຕອນໃຕ້)', 'en_GU' => 'ອັງກິດ (ກວາມ)', 'en_GY' => 'ອັງກິດ (ກາຍຢານາ)', 'en_HK' => 'ອັງກິດ (ຮົງກົງ ເຂດປົກຄອງພິເສດ ຈີນ)', + 'en_HU' => 'ອັງກິດ (ຮັງກາຣີ)', 'en_ID' => 'ອັງກິດ (ອິນໂດເນເຊຍ)', 'en_IE' => 'ອັງກິດ (ໄອແລນ)', 'en_IL' => 'ອັງກິດ (ອິສຣາເອວ)', 'en_IM' => 'ອັງກິດ (ເອວ ອອບ ແມນ)', 'en_IN' => 'ອັງກິດ (ອິນເດຍ)', 'en_IO' => 'ອັງກິດ (ເຂດແດນອັງກິດໃນມະຫາສະໝຸດອິນເດຍ)', + 'en_IT' => 'ອັງກິດ (ອິຕາລີ)', 'en_JE' => 'ອັງກິດ (ເຈີຊີ)', 'en_JM' => 'ອັງກິດ (ຈາໄມຄາ)', 'en_KE' => 'ອັງກິດ (ເຄນຢາ)', @@ -167,15 +173,19 @@ 'en_NF' => 'ອັງກິດ (ເກາະນໍໂຟກ)', 'en_NG' => 'ອັງກິດ (ໄນຈີເຣຍ)', 'en_NL' => 'ອັງກິດ (ເນເທີແລນ)', + 'en_NO' => 'ອັງກິດ (ນໍເວ)', 'en_NR' => 'ອັງກິດ (ນາອູຣູ)', 'en_NU' => 'ອັງກິດ (ນີອູເອ)', 'en_NZ' => 'ອັງກິດ (ນິວຊີແລນ)', 'en_PG' => 'ອັງກິດ (ປາປົວນິວກີນີ)', 'en_PH' => 'ອັງກິດ (ຟິລິບປິນ)', 'en_PK' => 'ອັງກິດ (ປາກິດສະຖານ)', + 'en_PL' => 'ອັງກິດ (ໂປແລນ)', 'en_PN' => 'ອັງກິດ (ໝູ່ເກາະພິດແຄນ)', 'en_PR' => 'ອັງກິດ (ເພືອໂຕ ຣິໂກ)', + 'en_PT' => 'ອັງກິດ (ພອລທູໂກ)', 'en_PW' => 'ອັງກິດ (ປາລາວ)', + 'en_RO' => 'ອັງກິດ (ໂຣແມເນຍ)', 'en_RW' => 'ອັງກິດ (ຣວັນດາ)', 'en_SB' => 'ອັງກິດ (ຫມູ່ເກາະໂຊໂລມອນ)', 'en_SC' => 'ອັງກິດ (ເຊເຊວເລສ)', @@ -184,6 +194,7 @@ 'en_SG' => 'ອັງກິດ (ສິງກະໂປ)', 'en_SH' => 'ອັງກິດ (ເຊນ ເຮເລນາ)', 'en_SI' => 'ອັງກິດ (ສະໂລເວເນຍ)', + 'en_SK' => 'ອັງກິດ (ສະໂລວາເກຍ)', 'en_SL' => 'ອັງກິດ (ເຊຍຣາ ລີໂອນ)', 'en_SS' => 'ອັງກິດ (ຊູດານໃຕ້)', 'en_SX' => 'ອັງກິດ (ຊິນ ມາເທັນ)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lt.php b/src/Symfony/Component/Intl/Resources/data/locales/lt.php index fbd7d3c7b5b09..f0630aef3ec71 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lt.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lt.php @@ -121,29 +121,35 @@ 'en_CM' => 'anglų (Kamerūnas)', 'en_CX' => 'anglų (Kalėdų Sala)', 'en_CY' => 'anglų (Kipras)', + 'en_CZ' => 'anglų (Čekija)', 'en_DE' => 'anglų (Vokietija)', 'en_DK' => 'anglų (Danija)', 'en_DM' => 'anglų (Dominika)', 'en_ER' => 'anglų (Eritrėja)', + 'en_ES' => 'anglų (Ispanija)', 'en_FI' => 'anglų (Suomija)', 'en_FJ' => 'anglų (Fidžis)', 'en_FK' => 'anglų (Folklando Salos)', 'en_FM' => 'anglų (Mikronezija)', + 'en_FR' => 'anglų (Prancūzija)', 'en_GB' => 'anglų (Jungtinė Karalystė)', 'en_GD' => 'anglų (Grenada)', 'en_GG' => 'anglų (Gernsis)', 'en_GH' => 'anglų (Gana)', 'en_GI' => 'anglų (Gibraltaras)', 'en_GM' => 'anglų (Gambija)', + 'en_GS' => 'anglų (Pietų Džordžija ir Pietų Sandvičo salos)', 'en_GU' => 'anglų (Guamas)', 'en_GY' => 'anglų (Gajana)', 'en_HK' => 'anglų (Ypatingasis Administracinis Kinijos Regionas Honkongas)', + 'en_HU' => 'anglų (Vengrija)', 'en_ID' => 'anglų (Indonezija)', 'en_IE' => 'anglų (Airija)', 'en_IL' => 'anglų (Izraelis)', 'en_IM' => 'anglų (Meno Sala)', 'en_IN' => 'anglų (Indija)', 'en_IO' => 'anglų (Indijos Vandenyno Britų Sritis)', + 'en_IT' => 'anglų (Italija)', 'en_JE' => 'anglų (Džersis)', 'en_JM' => 'anglų (Jamaika)', 'en_KE' => 'anglų (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'anglų (Norfolko sala)', 'en_NG' => 'anglų (Nigerija)', 'en_NL' => 'anglų (Nyderlandai)', + 'en_NO' => 'anglų (Norvegija)', 'en_NR' => 'anglų (Nauru)', 'en_NU' => 'anglų (Niujė)', 'en_NZ' => 'anglų (Naujoji Zelandija)', 'en_PG' => 'anglų (Papua Naujoji Gvinėja)', 'en_PH' => 'anglų (Filipinai)', 'en_PK' => 'anglų (Pakistanas)', + 'en_PL' => 'anglų (Lenkija)', 'en_PN' => 'anglų (Pitkerno salos)', 'en_PR' => 'anglų (Puerto Rikas)', + 'en_PT' => 'anglų (Portugalija)', 'en_PW' => 'anglų (Palau)', + 'en_RO' => 'anglų (Rumunija)', 'en_RW' => 'anglų (Ruanda)', 'en_SB' => 'anglų (Saliamono Salos)', 'en_SC' => 'anglų (Seišeliai)', @@ -184,6 +194,7 @@ 'en_SG' => 'anglų (Singapūras)', 'en_SH' => 'anglų (Šv. Elenos Sala)', 'en_SI' => 'anglų (Slovėnija)', + 'en_SK' => 'anglų (Slovakija)', 'en_SL' => 'anglų (Siera Leonė)', 'en_SS' => 'anglų (Pietų Sudanas)', 'en_SX' => 'anglų (Sint Martenas)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lu.php b/src/Symfony/Component/Intl/Resources/data/locales/lu.php index 6b8784e213aaf..eda41010e580c 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lu.php @@ -71,14 +71,17 @@ 'en_CK' => 'Lingelesa (Lutanda lua Kookɛ)', 'en_CM' => 'Lingelesa (Kamerune)', 'en_CY' => 'Lingelesa (Shipele)', + 'en_CZ' => 'Lingelesa (Ditunga dya Tsheka)', 'en_DE' => 'Lingelesa (Alemanu)', 'en_DK' => 'Lingelesa (Danemalaku)', 'en_DM' => 'Lingelesa (Duminiku)', 'en_ER' => 'Lingelesa (Elitele)', + 'en_ES' => 'Lingelesa (Nsipani)', 'en_FI' => 'Lingelesa (Filande)', 'en_FJ' => 'Lingelesa (Fuji)', 'en_FK' => 'Lingelesa (Lutanda lua Maluni)', 'en_FM' => 'Lingelesa (Mikronezi)', + 'en_FR' => 'Lingelesa (Nfalanse)', 'en_GB' => 'Lingelesa (Angeletele)', 'en_GD' => 'Lingelesa (Ngelenade)', 'en_GH' => 'Lingelesa (Ngana)', @@ -86,10 +89,12 @@ 'en_GM' => 'Lingelesa (Gambi)', 'en_GU' => 'Lingelesa (Ngwame)', 'en_GY' => 'Lingelesa (Ngiyane)', + 'en_HU' => 'Lingelesa (Ongili)', 'en_ID' => 'Lingelesa (Indonezi)', 'en_IE' => 'Lingelesa (Irelande)', 'en_IL' => 'Lingelesa (Isirayele)', 'en_IN' => 'Lingelesa (Inde)', + 'en_IT' => 'Lingelesa (Itali)', 'en_JM' => 'Lingelesa (Jamaiki)', 'en_KE' => 'Lingelesa (Kenya)', 'en_KI' => 'Lingelesa (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Lingelesa (Lutanda lua Norfok)', 'en_NG' => 'Lingelesa (Nijerya)', 'en_NL' => 'Lingelesa (Olandɛ)', + 'en_NO' => 'Lingelesa (Noriveje)', 'en_NR' => 'Lingelesa (Nauru)', 'en_NU' => 'Lingelesa (Nyue)', 'en_NZ' => 'Lingelesa (Zelanda wa mumu)', 'en_PG' => 'Lingelesa (Papwazi wa Nginɛ wa mumu)', 'en_PH' => 'Lingelesa (Nfilipi)', 'en_PK' => 'Lingelesa (Pakisita)', + 'en_PL' => 'Lingelesa (Mpoloni)', 'en_PN' => 'Lingelesa (Pikairni)', 'en_PR' => 'Lingelesa (Mpotoriku)', + 'en_PT' => 'Lingelesa (Mputulugeshi)', 'en_PW' => 'Lingelesa (Palau)', + 'en_RO' => 'Lingelesa (Romani)', 'en_RW' => 'Lingelesa (Rwanda)', 'en_SB' => 'Lingelesa (Lutanda lua Solomu)', 'en_SC' => 'Lingelesa (Seshele)', @@ -128,6 +137,7 @@ 'en_SG' => 'Lingelesa (Singapure)', 'en_SH' => 'Lingelesa (Santu eleni)', 'en_SI' => 'Lingelesa (Siloveni)', + 'en_SK' => 'Lingelesa (Silovaki)', 'en_SL' => 'Lingelesa (Siera Leone)', 'en_SZ' => 'Lingelesa (Swazilandi)', 'en_TC' => 'Lingelesa (Lutanda lua Tuluki ne Kaiko)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/lv.php b/src/Symfony/Component/Intl/Resources/data/locales/lv.php index 4e3e4cf1abb86..c66ef57e206e7 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/lv.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/lv.php @@ -121,29 +121,35 @@ 'en_CM' => 'angļu (Kamerūna)', 'en_CX' => 'angļu (Ziemsvētku sala)', 'en_CY' => 'angļu (Kipra)', + 'en_CZ' => 'angļu (Čehija)', 'en_DE' => 'angļu (Vācija)', 'en_DK' => 'angļu (Dānija)', 'en_DM' => 'angļu (Dominika)', 'en_ER' => 'angļu (Eritreja)', + 'en_ES' => 'angļu (Spānija)', 'en_FI' => 'angļu (Somija)', 'en_FJ' => 'angļu (Fidži)', 'en_FK' => 'angļu (Folklenda salas)', 'en_FM' => 'angļu (Mikronēzija)', + 'en_FR' => 'angļu (Francija)', 'en_GB' => 'angļu (Apvienotā Karaliste)', 'en_GD' => 'angļu (Grenāda)', 'en_GG' => 'angļu (Gērnsija)', 'en_GH' => 'angļu (Gana)', 'en_GI' => 'angļu (Gibraltārs)', 'en_GM' => 'angļu (Gambija)', + 'en_GS' => 'angļu (Dienviddžordžija un Dienvidsendviču salas)', 'en_GU' => 'angļu (Guama)', 'en_GY' => 'angļu (Gajāna)', 'en_HK' => 'angļu (Ķīnas īpašās pārvaldes apgabals Honkonga)', + 'en_HU' => 'angļu (Ungārija)', 'en_ID' => 'angļu (Indonēzija)', 'en_IE' => 'angļu (Īrija)', 'en_IL' => 'angļu (Izraēla)', 'en_IM' => 'angļu (Menas sala)', 'en_IN' => 'angļu (Indija)', 'en_IO' => 'angļu (Indijas okeāna Britu teritorija)', + 'en_IT' => 'angļu (Itālija)', 'en_JE' => 'angļu (Džērsija)', 'en_JM' => 'angļu (Jamaika)', 'en_KE' => 'angļu (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'angļu (Norfolkas sala)', 'en_NG' => 'angļu (Nigērija)', 'en_NL' => 'angļu (Nīderlande)', + 'en_NO' => 'angļu (Norvēģija)', 'en_NR' => 'angļu (Nauru)', 'en_NU' => 'angļu (Niue)', 'en_NZ' => 'angļu (Jaunzēlande)', 'en_PG' => 'angļu (Papua-Jaungvineja)', 'en_PH' => 'angļu (Filipīnas)', 'en_PK' => 'angļu (Pakistāna)', + 'en_PL' => 'angļu (Polija)', 'en_PN' => 'angļu (Pitkērnas salas)', 'en_PR' => 'angļu (Puertoriko)', + 'en_PT' => 'angļu (Portugāle)', 'en_PW' => 'angļu (Palau)', + 'en_RO' => 'angļu (Rumānija)', 'en_RW' => 'angļu (Ruanda)', 'en_SB' => 'angļu (Zālamana salas)', 'en_SC' => 'angļu (Seišelu salas)', @@ -184,6 +194,7 @@ 'en_SG' => 'angļu (Singapūra)', 'en_SH' => 'angļu (Sv.Helēnas sala)', 'en_SI' => 'angļu (Slovēnija)', + 'en_SK' => 'angļu (Slovākija)', 'en_SL' => 'angļu (Sjerraleone)', 'en_SS' => 'angļu (Dienvidsudāna)', 'en_SX' => 'angļu (Sintmārtena)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/meta.php b/src/Symfony/Component/Intl/Resources/data/locales/meta.php index 77c80539869ea..0b81e1802feca 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/meta.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/meta.php @@ -121,30 +121,36 @@ 'en_CM', 'en_CX', 'en_CY', + 'en_CZ', 'en_DE', 'en_DG', 'en_DK', 'en_DM', 'en_ER', + 'en_ES', 'en_FI', 'en_FJ', 'en_FK', 'en_FM', + 'en_FR', 'en_GB', 'en_GD', 'en_GG', 'en_GH', 'en_GI', 'en_GM', + 'en_GS', 'en_GU', 'en_GY', 'en_HK', + 'en_HU', 'en_ID', 'en_IE', 'en_IL', 'en_IM', 'en_IN', 'en_IO', + 'en_IT', 'en_JE', 'en_JM', 'en_KE', @@ -169,16 +175,20 @@ 'en_NG', 'en_NH', 'en_NL', + 'en_NO', 'en_NR', 'en_NU', 'en_NZ', 'en_PG', 'en_PH', 'en_PK', + 'en_PL', 'en_PN', 'en_PR', + 'en_PT', 'en_PW', 'en_RH', + 'en_RO', 'en_RW', 'en_SB', 'en_SC', @@ -187,6 +197,7 @@ 'en_SG', 'en_SH', 'en_SI', + 'en_SK', 'en_SL', 'en_SS', 'en_SX', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mg.php b/src/Symfony/Component/Intl/Resources/data/locales/mg.php index ac2d976cf8f01..a8ae1299da03d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mg.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mg.php @@ -71,14 +71,17 @@ 'en_CK' => 'Anglisy (Nosy Kook)', 'en_CM' => 'Anglisy (Kamerona)', 'en_CY' => 'Anglisy (Sypra)', + 'en_CZ' => 'Anglisy (Repoblikan’i Tseky)', 'en_DE' => 'Anglisy (Alemaina)', 'en_DK' => 'Anglisy (Danmarka)', 'en_DM' => 'Anglisy (Dominika)', 'en_ER' => 'Anglisy (Eritrea)', + 'en_ES' => 'Anglisy (Espaina)', 'en_FI' => 'Anglisy (Finlandy)', 'en_FJ' => 'Anglisy (Fidji)', 'en_FK' => 'Anglisy (Nosy Falkand)', 'en_FM' => 'Anglisy (Mikrônezia)', + 'en_FR' => 'Anglisy (Frantsa)', 'en_GB' => 'Anglisy (Angletera)', 'en_GD' => 'Anglisy (Grenady)', 'en_GH' => 'Anglisy (Ghana)', @@ -86,10 +89,12 @@ 'en_GM' => 'Anglisy (Gambia)', 'en_GU' => 'Anglisy (Guam)', 'en_GY' => 'Anglisy (Guyana)', + 'en_HU' => 'Anglisy (Hongria)', 'en_ID' => 'Anglisy (Indonezia)', 'en_IE' => 'Anglisy (Irlandy)', 'en_IL' => 'Anglisy (Israely)', 'en_IN' => 'Anglisy (Indy)', + 'en_IT' => 'Anglisy (Italia)', 'en_JM' => 'Anglisy (Jamaïka)', 'en_KE' => 'Anglisy (Kenya)', 'en_KI' => 'Anglisy (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Anglisy (Nosy Norfolk)', 'en_NG' => 'Anglisy (Nizeria)', 'en_NL' => 'Anglisy (Holanda)', + 'en_NO' => 'Anglisy (Nôrvezy)', 'en_NR' => 'Anglisy (Naorò)', 'en_NU' => 'Anglisy (Nioé)', 'en_NZ' => 'Anglisy (Nouvelle-Zélande)', 'en_PG' => 'Anglisy (Papouasie-Nouvelle-Guinée)', 'en_PH' => 'Anglisy (Filipina)', 'en_PK' => 'Anglisy (Pakistan)', + 'en_PL' => 'Anglisy (Pôlôna)', 'en_PN' => 'Anglisy (Pitkairn)', 'en_PR' => 'Anglisy (Pôrtô Rikô)', + 'en_PT' => 'Anglisy (Pôrtiogala)', 'en_PW' => 'Anglisy (Palao)', + 'en_RO' => 'Anglisy (Romania)', 'en_RW' => 'Anglisy (Roanda)', 'en_SB' => 'Anglisy (Nosy Salomona)', 'en_SC' => 'Anglisy (Seyshela)', @@ -128,6 +137,7 @@ 'en_SG' => 'Anglisy (Singaporo)', 'en_SH' => 'Anglisy (Sainte-Hélène)', 'en_SI' => 'Anglisy (Slovenia)', + 'en_SK' => 'Anglisy (Slovakia)', 'en_SL' => 'Anglisy (Sierra Leone)', 'en_SZ' => 'Anglisy (Soazilandy)', 'en_TC' => 'Anglisy (Nosy Turks sy Caïques)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mi.php b/src/Symfony/Component/Intl/Resources/data/locales/mi.php index 4581c7c9bb4e9..7c279cabc9907 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mi.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mi.php @@ -121,29 +121,35 @@ 'en_CM' => 'Ingarihi (Kamarūna)', 'en_CX' => 'Ingarihi (Te Moutere Kirihimete)', 'en_CY' => 'Ingarihi (Haipara)', + 'en_CZ' => 'Ingarihi (Tiekia)', 'en_DE' => 'Ingarihi (Tiamana)', 'en_DK' => 'Ingarihi (Tenemāka)', 'en_DM' => 'Ingarihi (Tominika)', 'en_ER' => 'Ingarihi (Eritēria)', + 'en_ES' => 'Ingarihi (Peina)', 'en_FI' => 'Ingarihi (Whinarana)', 'en_FJ' => 'Ingarihi (Whītī)', 'en_FK' => 'Ingarihi (Motu Whākarangi)', 'en_FM' => 'Ingarihi (Mekanēhia)', + 'en_FR' => 'Ingarihi (Wīwī)', 'en_GB' => 'Ingarihi (Te Hononga o Piritene)', 'en_GD' => 'Ingarihi (Kerenāta)', 'en_GG' => 'Ingarihi (Kōnihi)', 'en_GH' => 'Ingarihi (Kāna)', 'en_GI' => 'Ingarihi (Kāmaka)', 'en_GM' => 'Ingarihi (Kamopia)', + 'en_GS' => 'Ingarihi (Hōria ki te Tonga me ngā Motu Hanawiti ki te Tonga)', 'en_GU' => 'In D7AE garihi (Kuama)', 'en_GY' => 'Ingarihi (Kaiana)', 'en_HK' => 'Ingarihi (Hongipua Haina)', + 'en_HU' => 'Ingarihi (Hanekari)', 'en_ID' => 'Ingarihi (Initonīhia)', 'en_IE' => 'Ingarihi (Airani)', 'en_IL' => 'Ingarihi (Iharaira)', 'en_IM' => 'Ingarihi (Te Moutere Mana)', 'en_IN' => 'Ingarihi (Inia)', 'en_IO' => 'Ingarihi (Te Rohe o te Moana Īniana Piritihi)', + 'en_IT' => 'Ingarihi (Itāria)', 'en_JE' => 'Ingarihi (Tōrehe)', 'en_JM' => 'Ingarihi (Hemeika)', 'en_KE' => 'Ingarihi (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Ingarihi (Te Moutere Nōpoke)', 'en_NG' => 'Ingarihi (Ngāitiria)', 'en_NL' => 'Ingarihi (Hōrana)', + 'en_NO' => 'Ingarihi (Nōwei)', 'en_NR' => 'Ingarihi (Nauru)', 'en_NU' => 'Ingarihi (Niue)', 'en_NZ' => 'Ingarihi (Aotearoa)', 'en_PG' => 'Ingarihi (Papua Nūkini)', 'en_PH' => 'Ingarihi (Piripīni)', 'en_PK' => 'Ingarihi (Pakitāne)', + 'en_PL' => 'Ingarihi (Pōrana)', 'en_PN' => 'Ingarihi (Pitikeina)', 'en_PR' => 'Ingarihi (Peta Riko)', + 'en_PT' => 'Ingarihi (Potukara)', 'en_PW' => 'Ingarihi (Pārau)', + 'en_RO' => 'Ingarihi (Romeinia)', 'en_RW' => 'Ingarihi (Rāwana)', 'en_SB' => 'Ingarihi (Ngā Motu Horomona)', 'en_SC' => 'Ingarihi (Heikere)', @@ -184,6 +194,7 @@ 'en_SG' => 'Ingarihi (Hingapoa)', 'en_SH' => 'Ingarihi (Hato Hērena)', 'en_SI' => 'Ingarihi (Horowinia)', + 'en_SK' => 'Ingarihi (Horowākia)', 'en_SL' => 'Ingarihi (Te Araone)', 'en_SS' => 'Ingarihi (Hūtāne ki te Tonga)', 'en_SX' => 'Ingarihi (Hiti Mātene)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mk.php b/src/Symfony/Component/Intl/Resources/data/locales/mk.php index 0ba83fe04122f..aa4dc6c54db89 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mk.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mk.php @@ -121,29 +121,35 @@ 'en_CM' => 'англиски (Камерун)', 'en_CX' => 'англиски (Божиќен Остров)', 'en_CY' => 'англиски (Кипар)', + 'en_CZ' => 'англиски (Чешка)', 'en_DE' => 'англиски (Германија)', 'en_DK' => 'англиски (Данска)', 'en_DM' => 'англиски (Доминика)', 'en_ER' => 'англиски (Еритреја)', + 'en_ES' => 'англиски (Шпанија)', 'en_FI' => 'англиски (Финска)', 'en_FJ' => 'англиски (Фиџи)', 'en_FK' => 'англиски (Фолкландски Острови)', 'en_FM' => 'англиски (Микронезија)', + 'en_FR' => 'англиски (Франција)', 'en_GB' => 'англиски (Обединето Кралство)', 'en_GD' => 'англиски (Гренада)', 'en_GG' => 'англиски (Гернзи)', 'en_GH' => 'англиски (Гана)', 'en_GI' => 'англиски (Гибралтар)', 'en_GM' => 'англиски (Гамбија)', + 'en_GS' => 'англиски (Јужна Џорџија и Јужни Сендвички Острови)', 'en_GU' => 'англиски (Гуам)', 'en_GY' => 'англиски (Гвајана)', 'en_HK' => 'англиски (Хонгконг САР Кина)', + 'en_HU' => 'англиски (Унгарија)', 'en_ID' => 'англиски (Индонезија)', 'en_IE' => 'англиски (Ирска)', 'en_IL' => 'англиски (Израел)', 'en_IM' => 'англиски (Остров Ман)', 'en_IN' => 'англиски (Индија)', 'en_IO' => 'англиски (Британска Индоокеанска Територија)', + 'en_IT' => 'англиски (Италија)', 'en_JE' => 'англиски (Џерси)', 'en_JM' => 'англиски (Јамајка)', 'en_KE' => 'англиски (Кенија)', @@ -167,15 +173,19 @@ 'en_NF' => 'англиски (Норфолшки Остров)', 'en_NG' => 'англиски (Нигерија)', 'en_NL' => 'англиски (Холандија)', + 'en_NO' => 'англиски (Норвешка)', 'en_NR' => 'англиски (Науру)', 'en_NU' => 'англиски (Ниује)', 'en_NZ' => 'англиски (Нов Зеланд)', 'en_PG' => 'англиски (Папуа Нова Гвинеја)', 'en_PH' => 'англиски (Филипини)', 'en_PK' => 'англиски (Пакистан)', + 'en_PL' => 'англиски (Полска)', 'en_PN' => 'англиски (Питкернски Острови)', 'en_PR' => 'англиски (Порторико)', + 'en_PT' => 'англиски (Португалија)', 'en_PW' => 'англиски (Палау)', + 'en_RO' => 'англиски (Романија)', 'en_RW' => 'англиски (Руанда)', 'en_SB' => 'англиски (Соломонски Острови)', 'en_SC' => 'англиски (Сејшели)', @@ -184,6 +194,7 @@ 'en_SG' => 'англиски (Сингапур)', 'en_SH' => 'англиски (Света Елена)', 'en_SI' => 'англиски (Словенија)', + 'en_SK' => 'англиски (Словачка)', 'en_SL' => 'англиски (Сиера Леоне)', 'en_SS' => 'англиски (Јужен Судан)', 'en_SX' => 'англиски (Свети Мартин)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ml.php b/src/Symfony/Component/Intl/Resources/data/locales/ml.php index c2d098d96fee4..3ebe1e26b2769 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ml.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ml.php @@ -121,29 +121,35 @@ 'en_CM' => 'ഇംഗ്ലീഷ് (കാമറൂൺ)', 'en_CX' => 'ഇംഗ്ലീഷ് (ക്രിസ്മസ് ദ്വീപ്)', 'en_CY' => 'ഇംഗ്ലീഷ് (സൈപ്രസ്)', + 'en_CZ' => 'ഇംഗ്ലീഷ് (ചെക്കിയ)', 'en_DE' => 'ഇംഗ്ലീഷ് (ജർമ്മനി)', 'en_DK' => 'ഇംഗ്ലീഷ് (ഡെൻമാർക്ക്)', 'en_DM' => 'ഇംഗ്ലീഷ് (ഡൊമിനിക്ക)', 'en_ER' => 'ഇംഗ്ലീഷ് (എറിത്രിയ)', + 'en_ES' => 'ഇംഗ്ലീഷ് (സ്‌പെയിൻ)', 'en_FI' => 'ഇംഗ്ലീഷ് (ഫിൻലാൻഡ്)', 'en_FJ' => 'ഇംഗ്ലീഷ് (ഫിജി)', 'en_FK' => 'ഇംഗ്ലീഷ് (ഫാക്ക്‌ലാന്റ് ദ്വീപുകൾ)', 'en_FM' => 'ഇംഗ്ലീഷ് (മൈക്രോനേഷ്യ)', + 'en_FR' => 'ഇംഗ്ലീഷ് (ഫ്രാൻസ്)', 'en_GB' => 'ഇംഗ്ലീഷ് (യുണൈറ്റഡ് കിംഗ്ഡം)', 'en_GD' => 'ഇംഗ്ലീഷ് (ഗ്രനേഡ)', 'en_GG' => 'ഇംഗ്ലീഷ് (ഗേൺസി)', 'en_GH' => 'ഇംഗ്ലീഷ് (ഘാന)', 'en_GI' => 'ഇംഗ്ലീഷ് (ജിബ്രാൾട്ടർ)', 'en_GM' => 'ഇംഗ്ലീഷ് (ഗാംബിയ)', + 'en_GS' => 'ഇംഗ്ലീഷ് (ദക്ഷിണ ജോർജ്ജിയയും ദക്ഷിണ സാൻഡ്‌വിച്ച് ദ്വീപുകളും)', 'en_GU' => 'ഇംഗ്ലീഷ് (ഗ്വാം)', 'en_GY' => 'ഇംഗ്ലീഷ് (ഗയാന)', 'en_HK' => 'ഇംഗ്ലീഷ് (ഹോങ്കോങ് [SAR] ചൈന)', + 'en_HU' => 'ഇംഗ്ലീഷ് (ഹംഗറി)', 'en_ID' => 'ഇംഗ്ലീഷ് (ഇന്തോനേഷ്യ)', 'en_IE' => 'ഇംഗ്ലീഷ് (അയർലൻഡ്)', 'en_IL' => 'ഇംഗ്ലീഷ് (ഇസ്രായേൽ)', 'en_IM' => 'ഇംഗ്ലീഷ് (ഐൽ ഓഫ് മാൻ)', 'en_IN' => 'ഇംഗ്ലീഷ് (ഇന്ത്യ)', 'en_IO' => 'ഇംഗ്ലീഷ് (ബ്രിട്ടീഷ് ഇന്ത്യൻ ഓഷ്യൻ ടെറിട്ടറി)', + 'en_IT' => 'ഇംഗ്ലീഷ് (ഇറ്റലി)', 'en_JE' => 'ഇംഗ്ലീഷ് (ജേഴ്സി)', 'en_JM' => 'ഇംഗ്ലീഷ് (ജമൈക്ക)', 'en_KE' => 'ഇംഗ്ലീഷ് (കെനിയ)', @@ -167,15 +173,19 @@ 'en_NF' => 'ഇംഗ്ലീഷ് (നോർഫോക് ദ്വീപ്)', 'en_NG' => 'ഇംഗ്ലീഷ് (നൈജീരിയ)', 'en_NL' => 'ഇംഗ്ലീഷ് (നെതർലാൻഡ്‌സ്)', + 'en_NO' => 'ഇംഗ്ലീഷ് (നോർവെ)', 'en_NR' => 'ഇംഗ്ലീഷ് (നൗറു)', 'en_NU' => 'ഇംഗ്ലീഷ് (ന്യൂയി)', 'en_NZ' => 'ഇംഗ്ലീഷ് (ന്യൂസിലൻഡ്)', 'en_PG' => 'ഇംഗ്ലീഷ് (പാപ്പുവ ന്യൂ ഗിനിയ)', 'en_PH' => 'ഇംഗ്ലീഷ് (ഫിലിപ്പീൻസ്)', 'en_PK' => 'ഇംഗ്ലീഷ് (പാക്കിസ്ഥാൻ)', + 'en_PL' => 'ഇംഗ്ലീഷ് (പോളണ്ട്)', 'en_PN' => 'ഇംഗ്ലീഷ് (പിറ്റ്‌കെയ്‌ൻ ദ്വീപുകൾ)', 'en_PR' => 'ഇംഗ്ലീഷ് (പോർട്ടോ റിക്കോ)', + 'en_PT' => 'ഇംഗ്ലീഷ് (പോർച്ചുഗൽ)', 'en_PW' => 'ഇംഗ്ലീഷ് (പലാവു)', + 'en_RO' => 'ഇംഗ്ലീഷ് (റൊമാനിയ)', 'en_RW' => 'ഇംഗ്ലീഷ് (റുവാണ്ട)', 'en_SB' => 'ഇംഗ്ലീഷ് (സോളമൻ ദ്വീപുകൾ)', 'en_SC' => 'ഇംഗ്ലീഷ് (സീഷെൽസ്)', @@ -184,6 +194,7 @@ 'en_SG' => 'ഇംഗ്ലീഷ് (സിംഗപ്പൂർ)', 'en_SH' => 'ഇംഗ്ലീഷ് (സെന്റ് ഹെലീന)', 'en_SI' => 'ഇംഗ്ലീഷ് (സ്ലോവേനിയ)', + 'en_SK' => 'ഇംഗ്ലീഷ് (സ്ലോവാക്യ)', 'en_SL' => 'ഇംഗ്ലീഷ് (സിയെറ ലിയോൺ)', 'en_SS' => 'ഇംഗ്ലീഷ് (ദക്ഷിണ സുഡാൻ)', 'en_SX' => 'ഇംഗ്ലീഷ് (സിന്റ് മാർട്ടെൻ)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mn.php b/src/Symfony/Component/Intl/Resources/data/locales/mn.php index f28c36d9cfeb4..f90b8d4de0c3a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mn.php @@ -121,29 +121,35 @@ 'en_CM' => 'англи (Камерун)', 'en_CX' => 'англи (Зул сарын арал)', 'en_CY' => 'англи (Кипр)', + 'en_CZ' => 'англи (Чех)', 'en_DE' => 'англи (Герман)', 'en_DK' => 'англи (Дани)', 'en_DM' => 'англи (Доминика)', 'en_ER' => 'англи (Эритрей)', + 'en_ES' => 'англи (Испани)', 'en_FI' => 'англи (Финланд)', 'en_FJ' => 'англи (Фижи)', 'en_FK' => 'англи (Фолклендийн арлууд)', 'en_FM' => 'англи (Микронези)', + 'en_FR' => 'англи (Франц)', 'en_GB' => 'англи (Их Британи)', 'en_GD' => 'англи (Гренада)', 'en_GG' => 'англи (Гернси)', 'en_GH' => 'англи (Гана)', 'en_GI' => 'англи (Гибралтар)', 'en_GM' => 'англи (Гамби)', + 'en_GS' => 'англи (Өмнөд Жоржиа ба Өмнөд Сэндвичийн арлууд)', 'en_GU' => 'англи (Гуам)', 'en_GY' => 'англи (Гайана)', 'en_HK' => 'англи (БНХАУ-ын Тусгай захиргааны бүс Хонг-Конг)', + 'en_HU' => 'англи (Унгар)', 'en_ID' => 'англи (Индонез)', 'en_IE' => 'англи (Ирланд)', 'en_IL' => 'англи (Израил)', 'en_IM' => 'англи (Мэн Арал)', 'en_IN' => 'англи (Энэтхэг)', 'en_IO' => 'англи (Британийн харьяа Энэтхэгийн далай дахь нутаг дэвсгэр)', + 'en_IT' => 'англи (Итали)', 'en_JE' => 'англи (Жерси)', 'en_JM' => 'англи (Ямайка)', 'en_KE' => 'англи (Кени)', @@ -167,15 +173,19 @@ 'en_NF' => 'англи (Норфолк арал)', 'en_NG' => 'англи (Нигери)', 'en_NL' => 'англи (Нидерланд)', + 'en_NO' => 'англи (Норвег)', 'en_NR' => 'англи (Науру)', 'en_NU' => 'англи (Ниуэ)', 'en_NZ' => 'англи (Шинэ Зеланд)', 'en_PG' => 'англи (Папуа Шинэ Гвиней)', 'en_PH' => 'англи (Филиппин)', 'en_PK' => 'англи (Пакистан)', + 'en_PL' => 'англи (Польш)', 'en_PN' => 'англи (Питкэрн арлууд)', 'en_PR' => 'англи (Пуэрто-Рико)', + 'en_PT' => 'англи (Португал)', 'en_PW' => 'англи (Палау)', + 'en_RO' => 'англи (Румын)', 'en_RW' => 'англи (Руанда)', 'en_SB' => 'англи (Соломоны арлууд)', 'en_SC' => 'англи (Сейшелийн арлууд)', @@ -184,6 +194,7 @@ 'en_SG' => 'англи (Сингапур)', 'en_SH' => 'англи (Сент Хелена)', 'en_SI' => 'англи (Словени)', + 'en_SK' => 'англи (Словак)', 'en_SL' => 'англи (Сьерра-Леоне)', 'en_SS' => 'англи (Өмнөд Судан)', 'en_SX' => 'англи (Синт Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mr.php b/src/Symfony/Component/Intl/Resources/data/locales/mr.php index 3c379fcd54349..6cab10fd67b3a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mr.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mr.php @@ -121,29 +121,35 @@ 'en_CM' => 'इंग्रजी (कॅमेरून)', 'en_CX' => 'इंग्रजी (ख्रिसमस बेट)', 'en_CY' => 'इंग्रजी (सायप्रस)', + 'en_CZ' => 'इंग्रजी (झेकिया)', 'en_DE' => 'इंग्रजी (जर्मनी)', 'en_DK' => 'इंग्रजी (डेन्मार्क)', 'en_DM' => 'इंग्रजी (डोमिनिका)', 'en_ER' => 'इंग्रजी (एरिट्रिया)', + 'en_ES' => 'इंग्रजी (स्पेन)', 'en_FI' => 'इंग्रजी (फिनलंड)', 'en_FJ' => 'इंग्रजी (फिजी)', 'en_FK' => 'इंग्रजी (फॉकलंड बेटे)', 'en_FM' => 'इंग्रजी (मायक्रोनेशिया)', + 'en_FR' => 'इंग्रजी (फ्रान्स)', 'en_GB' => 'इंग्रजी (युनायटेड किंगडम)', 'en_GD' => 'इंग्रजी (ग्रेनेडा)', 'en_GG' => 'इंग्रजी (ग्वेर्नसे)', 'en_GH' => 'इंग्रजी (घाना)', 'en_GI' => 'इंग्रजी (जिब्राल्टर)', 'en_GM' => 'इंग्रजी (गाम्बिया)', + 'en_GS' => 'इंग्रजी (दक्षिण जॉर्जिया आणि दक्षिण सँडविच बेटे)', 'en_GU' => 'इंग्रजी (गुआम)', 'en_GY' => 'इंग्रजी (गयाना)', 'en_HK' => 'इंग्रजी (हाँगकाँग एसएआर चीन)', + 'en_HU' => 'इंग्रजी (हंगेरी)', 'en_ID' => 'इंग्रजी (इंडोनेशिया)', 'en_IE' => 'इंग्रजी (आयर्लंड)', 'en_IL' => 'इंग्रजी (इस्त्राइल)', 'en_IM' => 'इंग्रजी (आयल ऑफ मॅन)', 'en_IN' => 'इंग्रजी (भारत)', 'en_IO' => 'इंग्रजी (ब्रिटिश हिंद महासागर प्रदेश)', + 'en_IT' => 'इंग्रजी (इटली)', 'en_JE' => 'इंग्रजी (जर्सी)', 'en_JM' => 'इंग्रजी (जमैका)', 'en_KE' => 'इंग्रजी (केनिया)', @@ -167,15 +173,19 @@ 'en_NF' => 'इंग्रजी (नॉरफॉक बेट)', 'en_NG' => 'इंग्रजी (नायजेरिया)', 'en_NL' => 'इंग्रजी (नेदरलँड)', + 'en_NO' => 'इंग्रजी (नॉर्वे)', 'en_NR' => 'इंग्रजी (नाउरू)', 'en_NU' => 'इंग्रजी (नीयू)', 'en_NZ' => 'इंग्रजी (न्यूझीलंड)', 'en_PG' => 'इंग्रजी (पापुआ न्यू गिनी)', 'en_PH' => 'इंग्रजी (फिलिपिन्स)', 'en_PK' => 'इंग्रजी (पाकिस्तान)', + 'en_PL' => 'इंग्रजी (पोलंड)', 'en_PN' => 'इंग्रजी (पिटकैर्न बेटे)', 'en_PR' => 'इंग्रजी (प्युएर्तो रिको)', + 'en_PT' => 'इंग्रजी (पोर्तुगाल)', 'en_PW' => 'इंग्रजी (पलाऊ)', + 'en_RO' => 'इंग्रजी (रोमानिया)', 'en_RW' => 'इंग्रजी (रवांडा)', 'en_SB' => 'इंग्रजी (सोलोमन बेटे)', 'en_SC' => 'इंग्रजी (सेशेल्स)', @@ -184,6 +194,7 @@ 'en_SG' => 'इंग्रजी (सिंगापूर)', 'en_SH' => 'इंग्रजी (सेंट हेलेना)', 'en_SI' => 'इंग्रजी (स्लोव्हेनिया)', + 'en_SK' => 'इंग्रजी (स्लोव्हाकिया)', 'en_SL' => 'इंग्रजी (सिएरा लिओन)', 'en_SS' => 'इंग्रजी (दक्षिण सुदान)', 'en_SX' => 'इंग्रजी (सिंट मार्टेन)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ms.php b/src/Symfony/Component/Intl/Resources/data/locales/ms.php index 4397cd3274aff..e28c38d4a06a1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ms.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ms.php @@ -121,29 +121,35 @@ 'en_CM' => 'Inggeris (Cameroon)', 'en_CX' => 'Inggeris (Pulau Krismas)', 'en_CY' => 'Inggeris (Cyprus)', + 'en_CZ' => 'Inggeris (Czechia)', 'en_DE' => 'Inggeris (Jerman)', 'en_DK' => 'Inggeris (Denmark)', 'en_DM' => 'Inggeris (Dominica)', 'en_ER' => 'Inggeris (Eritrea)', + 'en_ES' => 'Inggeris (Sepanyol)', 'en_FI' => 'Inggeris (Finland)', 'en_FJ' => 'Inggeris (Fiji)', 'en_FK' => 'Inggeris (Kepulauan Falkland)', 'en_FM' => 'Inggeris (Micronesia)', + 'en_FR' => 'Inggeris (Perancis)', 'en_GB' => 'Inggeris (United Kingdom)', 'en_GD' => 'Inggeris (Grenada)', 'en_GG' => 'Inggeris (Guernsey)', 'en_GH' => 'Inggeris (Ghana)', 'en_GI' => 'Inggeris (Gibraltar)', 'en_GM' => 'Inggeris (Gambia)', + 'en_GS' => 'Inggeris (Kepulauan Georgia Selatan & Sandwich Selatan)', 'en_GU' => 'Inggeris (Guam)', 'en_GY' => 'Inggeris (Guyana)', 'en_HK' => 'Inggeris (Hong Kong SAR China)', + 'en_HU' => 'Inggeris (Hungary)', 'en_ID' => 'Inggeris (Indonesia)', 'en_IE' => 'Inggeris (Ireland)', 'en_IL' => 'Inggeris (Israel)', 'en_IM' => 'Inggeris (Isle of Man)', 'en_IN' => 'Inggeris (India)', 'en_IO' => 'Inggeris (Wilayah Lautan Hindi British)', + 'en_IT' => 'Inggeris (Itali)', 'en_JE' => 'Inggeris (Jersey)', 'en_JM' => 'Inggeris (Jamaica)', 'en_KE' => 'Inggeris (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Inggeris (Pulau Norfolk)', 'en_NG' => 'Inggeris (Nigeria)', 'en_NL' => 'Inggeris (Belanda)', + 'en_NO' => 'Inggeris (Norway)', 'en_NR' => 'Inggeris (Nauru)', 'en_NU' => 'Inggeris (Niue)', 'en_NZ' => 'Inggeris (New Zealand)', 'en_PG' => 'Inggeris (Papua New Guinea)', 'en_PH' => 'Inggeris (Filipina)', 'en_PK' => 'Inggeris (Pakistan)', + 'en_PL' => 'Inggeris (Poland)', 'en_PN' => 'Inggeris (Kepulauan Pitcairn)', 'en_PR' => 'Inggeris (Puerto Rico)', + 'en_PT' => 'Inggeris (Portugal)', 'en_PW' => 'Inggeris (Palau)', + 'en_RO' => 'Inggeris (Romania)', 'en_RW' => 'Inggeris (Rwanda)', 'en_SB' => 'Inggeris (Kepulauan Solomon)', 'en_SC' => 'Inggeris (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Inggeris (Singapura)', 'en_SH' => 'Inggeris (Saint Helena)', 'en_SI' => 'Inggeris (Slovenia)', + 'en_SK' => 'Inggeris (Slovakia)', 'en_SL' => 'Inggeris (Sierra Leone)', 'en_SS' => 'Inggeris (Sudan Selatan)', 'en_SX' => 'Inggeris (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/mt.php b/src/Symfony/Component/Intl/Resources/data/locales/mt.php index e1245dc691bb7..77aab459f0285 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/mt.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/mt.php @@ -121,28 +121,34 @@ 'en_CM' => 'Ingliż (il-Kamerun)', 'en_CX' => 'Ingliż (il-Gżira Christmas)', 'en_CY' => 'Ingliż (Ċipru)', + 'en_CZ' => 'Ingliż (ir-Repubblika Ċeka)', 'en_DE' => 'Ingliż (il-Ġermanja)', 'en_DK' => 'Ingliż (id-Danimarka)', 'en_DM' => 'Ingliż (Dominica)', 'en_ER' => 'Ingliż (l-Eritrea)', + 'en_ES' => 'Ingliż (Spanja)', 'en_FI' => 'Ingliż (il-Finlandja)', 'en_FJ' => 'Ingliż (Fiġi)', 'en_FK' => 'Ingliż (il-Gżejjer Falkland)', 'en_FM' => 'Ingliż (il-Mikroneżja)', + 'en_FR' => 'Ingliż (Franza)', 'en_GB' => 'Ingliż (ir-Renju Unit)', 'en_GD' => 'Ingliż (Grenada)', 'en_GG' => 'Ingliż (Guernsey)', 'en_GH' => 'Ingliż (il-Ghana)', 'en_GI' => 'Ingliż (Ġibiltà)', 'en_GM' => 'Ingliż (il-Gambja)', + 'en_GS' => 'Ingliż (il-Georgia tan-Nofsinhar u l-Gżejjer Sandwich tan-Nofsinhar)', 'en_GU' => 'Ingliż (Guam)', 'en_GY' => 'Ingliż (il-Guyana)', 'en_HK' => 'Ingliż (ir-Reġjun Amministrattiv Speċjali ta’ Hong Kong tar-Repubblika tal-Poplu taċ-Ċina)', + 'en_HU' => 'Ingliż (l-Ungerija)', 'en_ID' => 'Ingliż (l-Indoneżja)', 'en_IE' => 'Ingliż (l-Irlanda)', 'en_IL' => 'Ingliż (Iżrael)', 'en_IM' => 'Ingliż (Isle of Man)', 'en_IN' => 'Ingliż (l-Indja)', + 'en_IT' => 'Ingliż (l-Italja)', 'en_JE' => 'Ingliż (Jersey)', 'en_JM' => 'Ingliż (il-Ġamajka)', 'en_KE' => 'Ingliż (il-Kenja)', @@ -166,15 +172,19 @@ 'en_NF' => 'Ingliż (Gżira Norfolk)', 'en_NG' => 'Ingliż (in-Niġerja)', 'en_NL' => 'Ingliż (in-Netherlands)', + 'en_NO' => 'Ingliż (in-Norveġja)', 'en_NR' => 'Ingliż (Nauru)', 'en_NU' => 'Ingliż (Niue)', 'en_NZ' => 'Ingliż (New Zealand)', 'en_PG' => 'Ingliż (Papua New Guinea)', 'en_PH' => 'Ingliż (il-Filippini)', 'en_PK' => 'Ingliż (il-Pakistan)', + 'en_PL' => 'Ingliż (il-Polonja)', 'en_PN' => 'Ingliż (Gżejjer Pitcairn)', 'en_PR' => 'Ingliż (Puerto Rico)', + 'en_PT' => 'Ingliż (il-Portugall)', 'en_PW' => 'Ingliż (Palau)', + 'en_RO' => 'Ingliż (ir-Rumanija)', 'en_RW' => 'Ingliż (ir-Rwanda)', 'en_SB' => 'Ingliż (il-Gżejjer Solomon)', 'en_SC' => 'Ingliż (is-Seychelles)', @@ -183,6 +193,7 @@ 'en_SG' => 'Ingliż (Singapore)', 'en_SH' => 'Ingliż (Saint Helena)', 'en_SI' => 'Ingliż (is-Slovenja)', + 'en_SK' => 'Ingliż (is-Slovakkja)', 'en_SL' => 'Ingliż (Sierra Leone)', 'en_SS' => 'Ingliż (is-Sudan t’Isfel)', 'en_SX' => 'Ingliż (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/my.php b/src/Symfony/Component/Intl/Resources/data/locales/my.php index 8680b337419a2..18bb264d1161e 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/my.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/my.php @@ -121,29 +121,35 @@ 'en_CM' => 'အင်္ဂလိပ် (ကင်မရွန်း)', 'en_CX' => 'အင်္ဂလိပ် (ခရစ်စမတ် ကျွန်း)', 'en_CY' => 'အင်္ဂလိပ် (ဆိုက်ပရပ်စ်)', + 'en_CZ' => 'အင်္ဂလိပ် (ချက်ကီယား)', 'en_DE' => 'အင်္ဂလိပ် (ဂျာမနီ)', 'en_DK' => 'အင်္ဂလိပ် (ဒိန်းမတ်)', 'en_DM' => 'အင်္ဂလိပ် (ဒိုမီနီကာ)', 'en_ER' => 'အင်္ဂလိပ် (အီရီထရီးယား)', + 'en_ES' => 'အင်္ဂလိပ် (စပိန်)', 'en_FI' => 'အင်္ဂလိပ် (ဖင်လန်)', 'en_FJ' => 'အင်္ဂလိပ် (ဖီဂျီ)', 'en_FK' => 'အင်္ဂလိပ် (ဖော့ကလန် ကျွန်းစု)', 'en_FM' => 'အင်္ဂလိပ် (မိုင်ခရိုနီရှား)', + 'en_FR' => 'အင်္ဂလိပ် (ပြင်သစ်)', 'en_GB' => 'အင်္ဂလိပ် (ယူနိုက်တက်ကင်းဒမ်း)', 'en_GD' => 'အင်္ဂလိပ် (ဂရီနေဒါ)', 'en_GG' => 'အင်္ဂလိပ် (ဂွန်းဇီ)', 'en_GH' => 'အင်္ဂလိပ် (ဂါနာ)', 'en_GI' => 'အင်္ဂလိပ် (ဂျီဘရော်လ်တာ)', 'en_GM' => 'အင်္ဂလိပ် (ဂမ်ဘီရာ)', + 'en_GS' => 'အင်္ဂလိပ် (တောင် ဂျော်ဂျီယာ နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများ)', 'en_GU' => 'အင်္ဂလိပ် (ဂူအမ်)', 'en_GY' => 'အင်္ဂလိပ် (ဂိုင်ယာနာ)', 'en_HK' => 'အင်္ဂလိပ် (ဟောင်ကောင် [တရုတ်ပြည်])', + 'en_HU' => 'အင်္ဂလိပ် (ဟန်ဂေရီ)', 'en_ID' => 'အင်္ဂလိပ် (အင်ဒိုနီးရှား)', 'en_IE' => 'အင်္ဂလိပ် (အိုင်ယာလန်)', 'en_IL' => 'အင်္ဂလိပ် (အစ္စရေး)', 'en_IM' => 'အင်္ဂလိပ် (မန်ကျွန်း)', 'en_IN' => 'အင်္ဂလိပ် (အိန္ဒိယ)', 'en_IO' => 'အင်္ဂလိပ် (ဗြိတိသျှပိုင် အိန္ဒိယသမုဒ္ဒရာကျွန်းများ)', + 'en_IT' => 'အင်္ဂလိပ် (အီတလီ)', 'en_JE' => 'အင်္ဂလိပ် (ဂျာစီ)', 'en_JM' => 'အင်္ဂလိပ် (ဂျမေကာ)', 'en_KE' => 'အင်္ဂလိပ် (ကင်ညာ)', @@ -167,15 +173,19 @@ 'en_NF' => 'အင်္ဂလိပ် (နောဖုတ်ကျွန်း)', 'en_NG' => 'အင်္ဂလိပ် (နိုင်ဂျီးရီးယား)', 'en_NL' => 'အင်္ဂလိပ် (နယ်သာလန်)', + 'en_NO' => 'အင်္ဂလိပ် (နော်ဝေ)', 'en_NR' => 'အင်္ဂလိပ် (နော်ရူး)', 'en_NU' => 'အင်္ဂလိပ် (နီဥူအေ)', 'en_NZ' => 'အင်္ဂလိပ် (နယူးဇီလန်)', 'en_PG' => 'အင်္ဂလိပ် (ပါပူအာ နယူးဂီနီ)', 'en_PH' => 'အင်္ဂလိပ် (ဖိလစ်ပိုင်)', 'en_PK' => 'အင်္ဂလိပ် (ပါကစ္စတန်)', + 'en_PL' => 'အင်္ဂလိပ် (ပိုလန်)', 'en_PN' => 'အင်္ဂလိပ် (ပစ်တ်ကိန်းကျွန်းစု)', 'en_PR' => 'အင်္ဂလိပ် (ပေါ်တိုရီကို)', + 'en_PT' => 'အင်္ဂလိပ် (ပေါ်တူဂီ)', 'en_PW' => 'အင်္ဂလိပ် (ပလာအို)', + 'en_RO' => 'အင်္ဂလိပ် (ရိုမေးနီးယား)', 'en_RW' => 'အင်္ဂလိပ် (ရဝန်ဒါ)', 'en_SB' => 'အင်္ဂလိပ် (ဆော်လမွန်ကျွန်းစု)', 'en_SC' => 'အင်္ဂလိပ် (ဆေးရှဲ)', @@ -184,6 +194,7 @@ 'en_SG' => 'အင်္ဂလိပ် (စင်္ကာပူ)', 'en_SH' => 'အင်္ဂလိပ် (စိန့်ဟယ်လယ်နာ)', 'en_SI' => 'အင်္ဂလိပ် (ဆလိုဗေးနီးယား)', + 'en_SK' => 'အင်္ဂလိပ် (ဆလိုဗက်ကီးယား)', 'en_SL' => 'အင်္ဂလိပ် (ဆီယာရာ လီယွန်း)', 'en_SS' => 'အင်္ဂလိပ် (တောင် ဆူဒန်)', 'en_SX' => 'အင်္ဂလိပ် (စင့်မာတင်)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/nd.php b/src/Symfony/Component/Intl/Resources/data/locales/nd.php index babc43f113826..b2f3f46bfc7e8 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/nd.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/nd.php @@ -71,14 +71,17 @@ 'en_CK' => 'isi-Ngisi (Cook Islands)', 'en_CM' => 'isi-Ngisi (Khameruni)', 'en_CY' => 'isi-Ngisi (Cyprus)', + 'en_CZ' => 'isi-Ngisi (Czech Republic)', 'en_DE' => 'isi-Ngisi (Germany)', 'en_DK' => 'isi-Ngisi (Denmakhi)', 'en_DM' => 'isi-Ngisi (Dominikha)', 'en_ER' => 'isi-Ngisi (Eritrea)', + 'en_ES' => 'isi-Ngisi (Spain)', 'en_FI' => 'isi-Ngisi (Finland)', 'en_FJ' => 'isi-Ngisi (Fiji)', 'en_FK' => 'isi-Ngisi (Falkland Islands)', 'en_FM' => 'isi-Ngisi (Micronesia)', + 'en_FR' => 'isi-Ngisi (Furansi)', 'en_GB' => 'isi-Ngisi (United Kingdom)', 'en_GD' => 'isi-Ngisi (Grenada)', 'en_GH' => 'isi-Ngisi (Ghana)', @@ -86,10 +89,12 @@ 'en_GM' => 'isi-Ngisi (Gambiya)', 'en_GU' => 'isi-Ngisi (Guam)', 'en_GY' => 'isi-Ngisi (Guyana)', + 'en_HU' => 'isi-Ngisi (Hungary)', 'en_ID' => 'isi-Ngisi (Indonesiya)', 'en_IE' => 'isi-Ngisi (Ireland)', 'en_IL' => 'isi-Ngisi (Isuraeli)', 'en_IN' => 'isi-Ngisi (Indiya)', + 'en_IT' => 'isi-Ngisi (Itali)', 'en_JM' => 'isi-Ngisi (Jamaica)', 'en_KE' => 'isi-Ngisi (Khenya)', 'en_KI' => 'isi-Ngisi (Khiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'isi-Ngisi (Norfolk Island)', 'en_NG' => 'isi-Ngisi (Nigeriya)', 'en_NL' => 'isi-Ngisi (Netherlands)', + 'en_NO' => 'isi-Ngisi (Noweyi)', 'en_NR' => 'isi-Ngisi (Nauru)', 'en_NU' => 'isi-Ngisi (Niue)', 'en_NZ' => 'isi-Ngisi (New Zealand)', 'en_PG' => 'isi-Ngisi (Papua New Guinea)', 'en_PH' => 'isi-Ngisi (Philippines)', 'en_PK' => 'isi-Ngisi (Phakistani)', + 'en_PL' => 'isi-Ngisi (Pholandi)', 'en_PN' => 'isi-Ngisi (Pitcairn)', 'en_PR' => 'isi-Ngisi (Puerto Rico)', + 'en_PT' => 'isi-Ngisi (Portugal)', 'en_PW' => 'isi-Ngisi (Palau)', + 'en_RO' => 'isi-Ngisi (Romania)', 'en_RW' => 'isi-Ngisi (Ruwanda)', 'en_SB' => 'isi-Ngisi (Solomon Islands)', 'en_SC' => 'isi-Ngisi (Seychelles)', @@ -128,6 +137,7 @@ 'en_SG' => 'isi-Ngisi (Singapore)', 'en_SH' => 'isi-Ngisi (Saint Helena)', 'en_SI' => 'isi-Ngisi (Slovenia)', + 'en_SK' => 'isi-Ngisi (Slovakia)', 'en_SL' => 'isi-Ngisi (Sierra Leone)', 'en_SZ' => 'isi-Ngisi (Swaziland)', 'en_TC' => 'isi-Ngisi (Turks and Caicos Islands)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ne.php b/src/Symfony/Component/Intl/Resources/data/locales/ne.php index 895510042967f..6a4ee01690f35 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ne.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ne.php @@ -121,29 +121,35 @@ 'en_CM' => 'अङ्ग्रेजी (क्यामरून)', 'en_CX' => 'अङ्ग्रेजी (क्रिष्टमस टापु)', 'en_CY' => 'अङ्ग्रेजी (साइप्रस)', + 'en_CZ' => 'अङ्ग्रेजी (चेकिया)', 'en_DE' => 'अङ्ग्रेजी (जर्मनी)', 'en_DK' => 'अङ्ग्रेजी (डेनमार्क)', 'en_DM' => 'अङ्ग्रेजी (डोमिनिका)', 'en_ER' => 'अङ्ग्रेजी (एरिट्रीया)', + 'en_ES' => 'अङ्ग्रेजी (स्पेन)', 'en_FI' => 'अङ्ग्रेजी (फिनल्याण्ड)', 'en_FJ' => 'अङ्ग्रेजी (फिजी)', 'en_FK' => 'अङ्ग्रेजी (फकल्याण्ड टापुहरु)', 'en_FM' => 'अङ्ग्रेजी (माइक्रोनेसिया)', + 'en_FR' => 'अङ्ग्रेजी (फ्रान्स)', 'en_GB' => 'अङ्ग्रेजी (संयुक्त अधिराज्य)', 'en_GD' => 'अङ्ग्रेजी (ग्रेनाडा)', 'en_GG' => 'अङ्ग्रेजी (ग्यूर्न्सी)', 'en_GH' => 'अङ्ग्रेजी (घाना)', 'en_GI' => 'अङ्ग्रेजी (जिब्राल्टार)', 'en_GM' => 'अङ्ग्रेजी (गाम्विया)', + 'en_GS' => 'अङ्ग्रेजी (दक्षिण जर्जिया र दक्षिण स्यान्डवीच टापुहरू)', 'en_GU' => 'अङ्ग्रेजी (गुवाम)', 'en_GY' => 'अङ्ग्रेजी (गुयाना)', 'en_HK' => 'अङ्ग्रेजी (हङकङ चिनियाँ विशेष प्रशासनिक क्षेत्र)', + 'en_HU' => 'अङ्ग्रेजी (हङ्गेरी)', 'en_ID' => 'अङ्ग्रेजी (इन्डोनेशिया)', 'en_IE' => 'अङ्ग्रेजी (आयरल्याण्ड)', 'en_IL' => 'अङ्ग्रेजी (इजरायल)', 'en_IM' => 'अङ्ग्रेजी (आइल अफ म्यान)', 'en_IN' => 'अङ्ग्रेजी (भारत)', 'en_IO' => 'अङ्ग्रेजी (बेलायती हिन्द महासागर क्षेत्र)', + 'en_IT' => 'अङ्ग्रेजी (इटली)', 'en_JE' => 'अङ्ग्रेजी (जर्सी)', 'en_JM' => 'अङ्ग्रेजी (जमैका)', 'en_KE' => 'अङ्ग्रेजी (केन्या)', @@ -167,15 +173,19 @@ 'en_NF' => 'अङ्ग्रेजी (नोरफोल्क टापु)', 'en_NG' => 'अङ्ग्रेजी (नाइजेरिया)', 'en_NL' => 'अङ्ग्रेजी (नेदरल्याण्ड)', + 'en_NO' => 'अङ्ग्रेजी (नर्वे)', 'en_NR' => 'अङ्ग्रेजी (नाउरू)', 'en_NU' => 'अङ्ग्रेजी (नियुइ)', 'en_NZ' => 'अङ्ग्रेजी (न्युजिल्याण्ड)', 'en_PG' => 'अङ्ग्रेजी (पपुआ न्यू गाइनिया)', 'en_PH' => 'अङ्ग्रेजी (फिलिपिन्स)', 'en_PK' => 'अङ्ग्रेजी (पाकिस्तान)', + 'en_PL' => 'अङ्ग्रेजी (पोल्याण्ड)', 'en_PN' => 'अङ्ग्रेजी (पिटकाइर्न टापुहरु)', 'en_PR' => 'अङ्ग्रेजी (पुएर्टो रिको)', + 'en_PT' => 'अङ्ग्रेजी (पोर्चुगल)', 'en_PW' => 'अङ्ग्रेजी (पलाउ)', + 'en_RO' => 'अङ्ग्रेजी (रोमेनिया)', 'en_RW' => 'अङ्ग्रेजी (रवाण्डा)', 'en_SB' => 'अङ्ग्रेजी (सोलोमन टापुहरू)', 'en_SC' => 'अङ्ग्रेजी (सेचेलेस)', @@ -184,6 +194,7 @@ 'en_SG' => 'अङ्ग्रेजी (सिङ्गापुर)', 'en_SH' => 'अङ्ग्रेजी (सेन्ट हेलेना)', 'en_SI' => 'अङ्ग्रेजी (स्लोभेनिया)', + 'en_SK' => 'अङ्ग्रेजी (स्लोभाकिया)', 'en_SL' => 'अङ्ग्रेजी (सिएर्रा लिओन)', 'en_SS' => 'अङ्ग्रेजी (दक्षिण सुडान)', 'en_SX' => 'अङ्ग्रेजी (सिन्ट मार्टेन)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/nl.php b/src/Symfony/Component/Intl/Resources/data/locales/nl.php index 320475ca2e7bb..f413174f56f33 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/nl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/nl.php @@ -121,29 +121,35 @@ 'en_CM' => 'Engels (Kameroen)', 'en_CX' => 'Engels (Christmaseiland)', 'en_CY' => 'Engels (Cyprus)', + 'en_CZ' => 'Engels (Tsjechië)', 'en_DE' => 'Engels (Duitsland)', 'en_DK' => 'Engels (Denemarken)', 'en_DM' => 'Engels (Dominica)', 'en_ER' => 'Engels (Eritrea)', + 'en_ES' => 'Engels (Spanje)', 'en_FI' => 'Engels (Finland)', 'en_FJ' => 'Engels (Fiji)', 'en_FK' => 'Engels (Falklandeilanden)', 'en_FM' => 'Engels (Micronesia)', + 'en_FR' => 'Engels (Frankrijk)', 'en_GB' => 'Engels (Verenigd Koninkrijk)', 'en_GD' => 'Engels (Grenada)', 'en_GG' => 'Engels (Guernsey)', 'en_GH' => 'Engels (Ghana)', 'en_GI' => 'Engels (Gibraltar)', 'en_GM' => 'Engels (Gambia)', + 'en_GS' => 'Engels (Zuid-Georgia en Zuidelijke Sandwicheilanden)', 'en_GU' => 'Engels (Guam)', 'en_GY' => 'Engels (Guyana)', 'en_HK' => 'Engels (Hongkong SAR van China)', + 'en_HU' => 'Engels (Hongarije)', 'en_ID' => 'Engels (Indonesië)', 'en_IE' => 'Engels (Ierland)', 'en_IL' => 'Engels (Israël)', 'en_IM' => 'Engels (Isle of Man)', 'en_IN' => 'Engels (India)', 'en_IO' => 'Engels (Brits Indische Oceaanterritorium)', + 'en_IT' => 'Engels (Italië)', 'en_JE' => 'Engels (Jersey)', 'en_JM' => 'Engels (Jamaica)', 'en_KE' => 'Engels (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Engels (Norfolk)', 'en_NG' => 'Engels (Nigeria)', 'en_NL' => 'Engels (Nederland)', + 'en_NO' => 'Engels (Noorwegen)', 'en_NR' => 'Engels (Nauru)', 'en_NU' => 'Engels (Niue)', 'en_NZ' => 'Engels (Nieuw-Zeeland)', 'en_PG' => 'Engels (Papoea-Nieuw-Guinea)', 'en_PH' => 'Engels (Filipijnen)', 'en_PK' => 'Engels (Pakistan)', + 'en_PL' => 'Engels (Polen)', 'en_PN' => 'Engels (Pitcairneilanden)', 'en_PR' => 'Engels (Puerto Rico)', + 'en_PT' => 'Engels (Portugal)', 'en_PW' => 'Engels (Palau)', + 'en_RO' => 'Engels (Roemenië)', 'en_RW' => 'Engels (Rwanda)', 'en_SB' => 'Engels (Salomonseilanden)', 'en_SC' => 'Engels (Seychellen)', @@ -184,6 +194,7 @@ 'en_SG' => 'Engels (Singapore)', 'en_SH' => 'Engels (Sint-Helena)', 'en_SI' => 'Engels (Slovenië)', + 'en_SK' => 'Engels (Slowakije)', 'en_SL' => 'Engels (Sierra Leone)', 'en_SS' => 'Engels (Zuid-Soedan)', 'en_SX' => 'Engels (Sint-Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/no.php b/src/Symfony/Component/Intl/Resources/data/locales/no.php index a412e2466789a..3e91509fbe707 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/no.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/no.php @@ -121,29 +121,35 @@ 'en_CM' => 'engelsk (Kamerun)', 'en_CX' => 'engelsk (Christmasøya)', 'en_CY' => 'engelsk (Kypros)', + 'en_CZ' => 'engelsk (Tsjekkia)', 'en_DE' => 'engelsk (Tyskland)', 'en_DK' => 'engelsk (Danmark)', 'en_DM' => 'engelsk (Dominica)', 'en_ER' => 'engelsk (Eritrea)', + 'en_ES' => 'engelsk (Spania)', 'en_FI' => 'engelsk (Finland)', 'en_FJ' => 'engelsk (Fiji)', 'en_FK' => 'engelsk (Falklandsøyene)', 'en_FM' => 'engelsk (Mikronesiaføderasjonen)', + 'en_FR' => 'engelsk (Frankrike)', 'en_GB' => 'engelsk (Storbritannia)', 'en_GD' => 'engelsk (Grenada)', 'en_GG' => 'engelsk (Guernsey)', 'en_GH' => 'engelsk (Ghana)', 'en_GI' => 'engelsk (Gibraltar)', 'en_GM' => 'engelsk (Gambia)', + 'en_GS' => 'engelsk (Sør-Georgia og Sør-Sandwichøyene)', 'en_GU' => 'engelsk (Guam)', 'en_GY' => 'engelsk (Guyana)', 'en_HK' => 'engelsk (Hongkong SAR Kina)', + 'en_HU' => 'engelsk (Ungarn)', 'en_ID' => 'engelsk (Indonesia)', 'en_IE' => 'engelsk (Irland)', 'en_IL' => 'engelsk (Israel)', 'en_IM' => 'engelsk (Man)', 'en_IN' => 'engelsk (India)', 'en_IO' => 'engelsk (Det britiske territoriet i Indiahavet)', + 'en_IT' => 'engelsk (Italia)', 'en_JE' => 'engelsk (Jersey)', 'en_JM' => 'engelsk (Jamaica)', 'en_KE' => 'engelsk (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'engelsk (Norfolkøya)', 'en_NG' => 'engelsk (Nigeria)', 'en_NL' => 'engelsk (Nederland)', + 'en_NO' => 'engelsk (Norge)', 'en_NR' => 'engelsk (Nauru)', 'en_NU' => 'engelsk (Niue)', 'en_NZ' => 'engelsk (New Zealand)', 'en_PG' => 'engelsk (Papua Ny-Guinea)', 'en_PH' => 'engelsk (Filippinene)', 'en_PK' => 'engelsk (Pakistan)', + 'en_PL' => 'engelsk (Polen)', 'en_PN' => 'engelsk (Pitcairnøyene)', 'en_PR' => 'engelsk (Puerto Rico)', + 'en_PT' => 'engelsk (Portugal)', 'en_PW' => 'engelsk (Palau)', + 'en_RO' => 'engelsk (Romania)', 'en_RW' => 'engelsk (Rwanda)', 'en_SB' => 'engelsk (Salomonøyene)', 'en_SC' => 'engelsk (Seychellene)', @@ -184,6 +194,7 @@ 'en_SG' => 'engelsk (Singapore)', 'en_SH' => 'engelsk (St. Helena)', 'en_SI' => 'engelsk (Slovenia)', + 'en_SK' => 'engelsk (Slovakia)', 'en_SL' => 'engelsk (Sierra Leone)', 'en_SS' => 'engelsk (Sør-Sudan)', 'en_SX' => 'engelsk (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/oc.php b/src/Symfony/Component/Intl/Resources/data/locales/oc.php index b4c67453236c8..2dec31f577782 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/oc.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/oc.php @@ -3,6 +3,8 @@ return [ 'Names' => [ 'en' => 'anglés', + 'en_ES' => 'anglés (Espanha)', + 'en_FR' => 'anglés (França)', 'en_HK' => 'anglés (Hong Kong)', 'oc' => 'occitan', 'oc_ES' => 'occitan (Espanha)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/om.php b/src/Symfony/Component/Intl/Resources/data/locales/om.php index 36bf5aa0d342d..97f737869d549 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/om.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/om.php @@ -107,29 +107,35 @@ 'en_CM' => 'Afaan Ingilizii (Kaameruun)', 'en_CX' => 'Afaan Ingilizii (Odola Kirismaas)', 'en_CY' => 'Afaan Ingilizii (Qoophiroos)', + 'en_CZ' => 'Afaan Ingilizii (Cheechiya)', 'en_DE' => 'Afaan Ingilizii (Jarmanii)', 'en_DK' => 'Afaan Ingilizii (Deenmaark)', 'en_DM' => 'Afaan Ingilizii (Dominiikaa)', 'en_ER' => 'Afaan Ingilizii (Eertiraa)', + 'en_ES' => 'Afaan Ingilizii (Ispeen)', 'en_FI' => 'Afaan Ingilizii (Fiinlaand)', 'en_FJ' => 'Afaan Ingilizii (Fiijii)', 'en_FK' => 'Afaan Ingilizii (Odoloota Faalklaand)', 'en_FM' => 'Afaan Ingilizii (Maayikirooneeshiyaa)', + 'en_FR' => 'Afaan Ingilizii (Faransaay)', 'en_GB' => 'Afaan Ingilizii (United Kingdom)', 'en_GD' => 'Afaan Ingilizii (Girinaada)', 'en_GG' => 'Afaan Ingilizii (Guwernisey)', 'en_GH' => 'Afaan Ingilizii (Gaanaa)', 'en_GI' => 'Afaan Ingilizii (Gibraaltar)', 'en_GM' => 'Afaan Ingilizii (Gaambiyaa)', + 'en_GS' => 'Afaan Ingilizii (Joorjikaa Kibba fi Odoloota Saanduwiich Kibbaa)', 'en_GU' => 'Afaan Ingilizii (Guwama)', 'en_GY' => 'Afaan Ingilizii (Guyaanaa)', 'en_HK' => 'Afaan Ingilizii (Hoong Koong SAR Chaayinaa)', + 'en_HU' => 'Afaan Ingilizii (Hangaarii)', 'en_ID' => 'Afaan Ingilizii (Indooneeshiyaa)', 'en_IE' => 'Afaan Ingilizii (Ayeerlaand)', 'en_IL' => 'Afaan Ingilizii (Israa’eel)', 'en_IM' => 'Afaan Ingilizii (Islee oof Maan)', 'en_IN' => 'Afaan Ingilizii (Hindii)', 'en_IO' => 'Afaan Ingilizii (Daangaa Galaana Hindii Biritish)', + 'en_IT' => 'Afaan Ingilizii (Xaaliyaan)', 'en_JE' => 'Afaan Ingilizii (Jeersii)', 'en_JM' => 'Afaan Ingilizii (Jamaayikaa)', 'en_KE' => 'Afaan Ingilizii (Keeniyaa)', @@ -153,15 +159,19 @@ 'en_NF' => 'Afaan Ingilizii (Odola Noorfoolk)', 'en_NG' => 'Afaan Ingilizii (Naayijeeriyaa)', 'en_NL' => 'Afaan Ingilizii (Neezerlaand)', + 'en_NO' => 'Afaan Ingilizii (Noorwey)', 'en_NR' => 'Afaan Ingilizii (Naawuruu)', 'en_NU' => 'Afaan Ingilizii (Niwu’e)', 'en_NZ' => 'Afaan Ingilizii (Neewu Zilaand)', 'en_PG' => 'Afaan Ingilizii (Papuwa Neawu Giinii)', 'en_PH' => 'Afaan Ingilizii (Filippiins)', 'en_PK' => 'Afaan Ingilizii (Paakistaan)', + 'en_PL' => 'Afaan Ingilizii (Poolaand)', 'en_PN' => 'Afaan Ingilizii (Odoloota Pitikaayirin)', 'en_PR' => 'Afaan Ingilizii (Poortaar Riikoo)', + 'en_PT' => 'Afaan Ingilizii (Poorchugaal)', 'en_PW' => 'Afaan Ingilizii (Palaawu)', + 'en_RO' => 'Afaan Ingilizii (Roomaaniyaa)', 'en_RW' => 'Afaan Ingilizii (Ruwwandaa)', 'en_SB' => 'Afaan Ingilizii (Odoloota Solomoon)', 'en_SC' => 'Afaan Ingilizii (Siisheels)', @@ -170,6 +180,7 @@ 'en_SG' => 'Afaan Ingilizii (Singaapoor)', 'en_SH' => 'Afaan Ingilizii (St. Helenaa)', 'en_SI' => 'Afaan Ingilizii (Islooveeniyaa)', + 'en_SK' => 'Afaan Ingilizii (Isloovaakiyaa)', 'en_SL' => 'Afaan Ingilizii (Seeraaliyoon)', 'en_SS' => 'Afaan Ingilizii (Sudaan Kibbaa)', 'en_SX' => 'Afaan Ingilizii (Siint Maarteen)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/or.php b/src/Symfony/Component/Intl/Resources/data/locales/or.php index d457500beb978..4d7eaed9eb4bc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/or.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/or.php @@ -121,29 +121,35 @@ 'en_CM' => 'ଇଂରାଜୀ (କାମେରୁନ୍)', 'en_CX' => 'ଇଂରାଜୀ (ଖ୍ରୀଷ୍ଟମାସ ଦ୍ୱୀପ)', 'en_CY' => 'ଇଂରାଜୀ (ସାଇପ୍ରସ୍)', + 'en_CZ' => 'ଇଂରାଜୀ (ଚେଚିଆ)', 'en_DE' => 'ଇଂରାଜୀ (ଜର୍ମାନୀ)', 'en_DK' => 'ଇଂରାଜୀ (ଡେନମାର୍କ)', 'en_DM' => 'ଇଂରାଜୀ (ଡୋମିନିକା)', 'en_ER' => 'ଇଂରାଜୀ (ଇରିଟ୍ରିୟା)', + 'en_ES' => 'ଇଂରାଜୀ (ସ୍ପେନ୍)', 'en_FI' => 'ଇଂରାଜୀ (ଫିନଲ୍ୟାଣ୍ଡ)', 'en_FJ' => 'ଇଂରାଜୀ (ଫିଜି)', 'en_FK' => 'ଇଂରାଜୀ (ଫକ୍‌ଲ୍ୟାଣ୍ଡ ଦ୍ଵୀପପୁଞ୍ଜ)', 'en_FM' => 'ଇଂରାଜୀ (ମାଇକ୍ରୋନେସିଆ)', + 'en_FR' => 'ଇଂରାଜୀ (ଫ୍ରାନ୍ସ)', 'en_GB' => 'ଇଂରାଜୀ (ଯୁକ୍ତରାଜ୍ୟ)', 'en_GD' => 'ଇଂରାଜୀ (ଗ୍ରେନାଡା)', 'en_GG' => 'ଇଂରାଜୀ (ଗୁଏରନେସି)', 'en_GH' => 'ଇଂରାଜୀ (ଘାନା)', 'en_GI' => 'ଇଂରାଜୀ (ଜିବ୍ରାଲ୍ଟର୍)', 'en_GM' => 'ଇଂରାଜୀ (ଗାମ୍ବିଆ)', + 'en_GS' => 'ଇଂରାଜୀ (ଦକ୍ଷିଣ ଜର୍ଜିଆ ଏବଂ ଦକ୍ଷିଣ ସାଣ୍ଡୱିଚ୍ ଦ୍ୱୀପପୁଞ୍ଜ)', 'en_GU' => 'ଇଂରାଜୀ (ଗୁଆମ୍)', 'en_GY' => 'ଇଂରାଜୀ (ଗୁଇନା)', 'en_HK' => 'ଇଂରାଜୀ (ହଂ କଂ ଏସଏଆର୍‌ ଚାଇନା)', + 'en_HU' => 'ଇଂରାଜୀ (ହଙ୍ଗେରୀ)', 'en_ID' => 'ଇଂରାଜୀ (ଇଣ୍ଡୋନେସିଆ)', 'en_IE' => 'ଇଂରାଜୀ (ଆୟରଲ୍ୟାଣ୍ଡ)', 'en_IL' => 'ଇଂରାଜୀ (ଇସ୍ରାଏଲ୍)', 'en_IM' => 'ଇଂରାଜୀ (ଆଇଲ୍‌ ଅଫ୍‌ ମ୍ୟାନ୍‌)', 'en_IN' => 'ଇଂରାଜୀ (ଭାରତ)', 'en_IO' => 'ଇଂରାଜୀ (ବ୍ରିଟିଶ୍‌ ଭାରତୀୟ ମହାସାଗର କ୍ଷେତ୍ର)', + 'en_IT' => 'ଇଂରାଜୀ (ଇଟାଲୀ)', 'en_JE' => 'ଇଂରାଜୀ (ଜର୍ସି)', 'en_JM' => 'ଇଂରାଜୀ (ଜାମାଇକା)', 'en_KE' => 'ଇଂରାଜୀ (କେନିୟା)', @@ -167,15 +173,19 @@ 'en_NF' => 'ଇଂରାଜୀ (ନର୍ଫକ୍ ଦ୍ଵୀପ)', 'en_NG' => 'ଇଂରାଜୀ (ନାଇଜେରିଆ)', 'en_NL' => 'ଇଂରାଜୀ (ନେଦରଲ୍ୟାଣ୍ଡ)', + 'en_NO' => 'ଇଂରାଜୀ (ନରୱେ)', 'en_NR' => 'ଇଂରାଜୀ (ନାଉରୁ)', 'en_NU' => 'ଇଂରାଜୀ (ନିଉ)', 'en_NZ' => 'ଇଂରାଜୀ (ନ୍ୟୁଜିଲାଣ୍ଡ)', 'en_PG' => 'ଇଂରାଜୀ (ପପୁଆ ନ୍ୟୁ ଗିନି)', 'en_PH' => 'ଇଂରାଜୀ (ଫିଲିପାଇନସ୍)', 'en_PK' => 'ଇଂରାଜୀ (ପାକିସ୍ତାନ)', + 'en_PL' => 'ଇଂରାଜୀ (ପୋଲାଣ୍ଡ)', 'en_PN' => 'ଇଂରାଜୀ (ପିଟକାଇରିନ୍‌ ଦ୍ୱୀପପୁଞ୍ଜ)', 'en_PR' => 'ଇଂରାଜୀ (ପୁଏର୍ତ୍ତୋ ରିକୋ)', + 'en_PT' => 'ଇଂରାଜୀ (ପର୍ତ୍ତୁଗାଲ୍)', 'en_PW' => 'ଇଂରାଜୀ (ପାଲାଉ)', + 'en_RO' => 'ଇଂରାଜୀ (ରୋମାନିଆ)', 'en_RW' => 'ଇଂରାଜୀ (ରାୱାଣ୍ଡା)', 'en_SB' => 'ଇଂରାଜୀ (ସୋଲୋମନ୍‌ ଦ୍ୱୀପପୁଞ୍ଜ)', 'en_SC' => 'ଇଂରାଜୀ (ସେଚେଲସ୍)', @@ -184,6 +194,7 @@ 'en_SG' => 'ଇଂରାଜୀ (ସିଙ୍ଗାପୁର୍)', 'en_SH' => 'ଇଂରାଜୀ (ସେଣ୍ଟ ହେଲେନା)', 'en_SI' => 'ଇଂରାଜୀ (ସ୍ଲୋଭେନିଆ)', + 'en_SK' => 'ଇଂରାଜୀ (ସ୍ଲୋଭାକିଆ)', 'en_SL' => 'ଇଂରାଜୀ (ସିଏରା ଲିଓନ)', 'en_SS' => 'ଇଂରାଜୀ (ଦକ୍ଷିଣ ସୁଦାନ)', 'en_SX' => 'ଇଂରାଜୀ (ସିଣ୍ଟ ମାର୍ଟୀନ୍‌)', diff -- 341A git a/src/Symfony/Component/Intl/Resources/data/locales/os.php b/src/Symfony/Component/Intl/Resources/data/locales/os.php index d962bad705a4f..38a4a0308e270 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/os.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/os.php @@ -29,8 +29,10 @@ 'en_001' => 'англисаг (Дуне)', 'en_150' => 'англисаг (Европӕ)', 'en_DE' => 'англисаг (Герман)', + 'en_FR' => 'англисаг (Франц)', 'en_GB' => 'англисаг (Стыр Британи)', 'en_IN' => 'англисаг (Инди)', + 'en_IT' => 'англисаг (Итали)', 'en_US' => 'англисаг (АИШ)', 'eo' => 'есперанто', 'eo_001' => 'есперанто (Дуне)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/pa.php b/src/Symfony/Component/Intl/Resources/data/locales/pa.php index daac5273bff69..abbc580b657b3 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/pa.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/pa.php @@ -121,29 +121,35 @@ 'en_CM' => 'ਅੰਗਰੇਜ਼ੀ (ਕੈਮਰੂਨ)', 'en_CX' => 'ਅੰਗਰੇਜ਼ੀ (ਕ੍ਰਿਸਮਿਸ ਟਾਪੂ)', 'en_CY' => 'ਅੰਗਰੇਜ਼ੀ (ਸਾਇਪ੍ਰਸ)', + 'en_CZ' => 'ਅੰਗਰੇਜ਼ੀ (ਚੈਕੀਆ)', 'en_DE' => 'ਅੰਗਰੇਜ਼ੀ (ਜਰਮਨੀ)', 'en_DK' => 'ਅੰਗਰੇਜ਼ੀ (ਡੈਨਮਾਰਕ)', 'en_DM' => 'ਅੰਗਰੇਜ਼ੀ (ਡੋਮੀਨਿਕਾ)', 'en_ER' => 'ਅੰਗਰੇਜ਼ੀ (ਇਰੀਟ੍ਰਿਆ)', + 'en_ES' => 'ਅੰਗਰੇਜ਼ੀ (ਸਪੇਨ)', 'en_FI' => 'ਅੰਗਰੇਜ਼ੀ (ਫਿਨਲੈਂਡ)', 'en_FJ' => 'ਅੰਗਰੇਜ਼ੀ (ਫ਼ਿਜੀ)', 'en_FK' => 'ਅੰਗਰੇਜ਼ੀ (ਫ਼ਾਕਲੈਂਡ ਟਾਪੂ)', 'en_FM' => 'ਅੰਗਰੇਜ਼ੀ (ਮਾਇਕ੍ਰੋਨੇਸ਼ੀਆ)', + 'en_FR' => 'ਅੰਗਰੇਜ਼ੀ (ਫ਼ਰਾਂਸ)', 'en_GB' => 'ਅੰਗਰੇਜ਼ੀ (ਯੂਨਾਈਟਡ ਕਿੰਗਡਮ)', 'en_GD' => 'ਅੰਗਰੇਜ਼ੀ (ਗ੍ਰੇਨਾਡਾ)', 'en_GG' => 'ਅੰਗਰੇਜ਼ੀ (ਗਰਨਜੀ)', 'en_GH' => 'ਅੰਗਰੇਜ਼ੀ (ਘਾਨਾ)', 'en_GI' => 'ਅੰਗਰੇਜ਼ੀ (ਜਿਬਰਾਲਟਰ)', 'en_GM' => 'ਅੰਗਰੇਜ਼ੀ (ਗੈਂਬੀਆ)', + 'en_GS' => 'ਅੰਗਰੇਜ਼ੀ (ਦੱਖਣੀ ਜਾਰਜੀਆ ਅਤੇ ਦੱਖਣੀ ਸੈਂਡਵਿਚ ਟਾਪੂ)', 'en_GU' => 'ਅੰਗਰੇਜ਼ੀ (ਗੁਆਮ)', 'en_GY' => 'ਅੰਗਰੇਜ਼ੀ (ਗੁਯਾਨਾ)', 'en_HK' => 'ਅੰਗਰੇਜ਼ੀ (ਹਾਂਗ ਕਾਂਗ ਐਸਏਆਰ ਚੀਨ)', + 'en_HU' => 'ਅੰਗਰੇਜ਼ੀ (ਹੰਗਰੀ)', 'en_ID' => 'ਅੰਗਰੇਜ਼ੀ (ਇੰਡੋਨੇਸ਼ੀਆ)', 'en_IE' => 'ਅੰਗਰੇਜ਼ੀ (ਆਇਰਲੈਂਡ)', 'en_IL' => 'ਅੰਗਰੇਜ਼ੀ (ਇਜ਼ਰਾਈਲ)', 'en_IM' => 'ਅੰਗਰੇਜ਼ੀ (ਆਇਲ ਆਫ ਮੈਨ)', 'en_IN' => 'ਅੰਗਰੇਜ਼ੀ (ਭਾਰਤ)', 'en_IO' => 'ਅੰਗਰੇਜ਼ੀ (ਬਰਤਾਨਵੀ ਹਿੰਦ ਮਹਾਂਸਾਗਰ ਖਿੱਤਾ)', + 'en_IT' => 'ਅੰਗਰੇਜ਼ੀ (ਇਟਲੀ)', 'en_JE' => 'ਅੰਗਰੇਜ਼ੀ (ਜਰਸੀ)', 'en_JM' => 'ਅੰਗਰੇਜ਼ੀ (ਜਮਾਇਕਾ)', 'en_KE' => 'ਅੰਗਰੇਜ਼ੀ (ਕੀਨੀਆ)', @@ -167,15 +173,19 @@ 'en_NF' => 'ਅੰਗਰੇਜ਼ੀ (ਨੋਰਫੌਕ ਟਾਪੂ)', 'en_NG' => 'ਅੰਗਰੇਜ਼ੀ (ਨਾਈਜੀਰੀਆ)', 'en_NL' => 'ਅੰਗਰੇਜ਼ੀ (ਨੀਦਰਲੈਂਡ)', + 'en_NO' => 'ਅੰਗਰੇਜ਼ੀ (ਨਾਰਵੇ)', 'en_NR' => 'ਅੰਗਰੇਜ਼ੀ (ਨਾਉਰੂ)', 'en_NU' => 'ਅੰਗਰੇਜ਼ੀ (ਨਿਯੂ)', 'en_NZ' => 'ਅੰਗਰੇਜ਼ੀ (ਨਿਊਜ਼ੀਲੈਂਡ)', 'en_PG' => 'ਅੰਗਰੇਜ਼ੀ (ਪਾਪੂਆ ਨਿਊ ਗਿਨੀ)', 'en_PH' => 'ਅੰਗਰੇਜ਼ੀ (ਫਿਲੀਪੀਨਜ)', 'en_PK' => 'ਅੰਗਰੇਜ਼ੀ (ਪਾਕਿਸਤਾਨ)', + 'en_PL' => 'ਅੰਗਰੇਜ਼ੀ (ਪੋਲੈਂਡ)', 'en_PN' => 'ਅੰਗਰੇਜ਼ੀ (ਪਿਟਕੇਰਨ ਟਾਪੂ)', 'en_PR' => 'ਅੰਗਰੇਜ਼ੀ (ਪਿਊਰਟੋ ਰਿਕੋ)', + 'en_PT' => 'ਅੰਗਰੇਜ਼ੀ (ਪੁਰਤਗਾਲ)', 'en_PW' => 'ਅੰਗਰੇਜ਼ੀ (ਪਲਾਉ)', + 'en_RO' => 'ਅੰਗਰੇਜ਼ੀ (ਰੋਮਾਨੀਆ)', 'en_RW' => 'ਅੰਗਰੇਜ਼ੀ (ਰਵਾਂਡਾ)', 'en_SB' => 'ਅੰਗਰੇਜ਼ੀ (ਸੋਲੋਮਨ ਟਾਪੂ)', 'en_SC' => 'ਅੰਗਰੇਜ਼ੀ (ਸੇਸ਼ਲਸ)', @@ -184,6 +194,7 @@ 'en_SG' => 'ਅੰਗਰੇਜ਼ੀ (ਸਿੰਗਾਪੁਰ)', 'en_SH' => 'ਅੰਗਰੇਜ਼ੀ (ਸੇਂਟ ਹੇਲੇਨਾ)', 'en_SI' => 'ਅੰਗਰੇਜ਼ੀ (ਸਲੋਵੇਨੀਆ)', + 'en_SK' => 'ਅੰਗਰੇਜ਼ੀ (ਸਲੋਵਾਕੀਆ)', 'en_SL' => 'ਅੰਗਰੇਜ਼ੀ (ਸਿਏਰਾ ਲਿਓਨ)', 'en_SS' => 'ਅੰਗਰੇਜ਼ੀ (ਦੱਖਣ ਸੁਡਾਨ)', 'en_SX' => 'ਅੰਗਰੇਜ਼ੀ (ਸਿੰਟ ਮਾਰਟੀਨ)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/pl.php b/src/Symfony/Component/Intl/Resources/data/locales/pl.php index 3132d6551eb16..dac92226329d7 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/pl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/pl.php @@ -121,29 +121,35 @@ 'en_CM' => 'angielski (Kamerun)', 'en_CX' => 'angielski (Wyspa Bożego Narodzenia)', 'en_CY' => 'angielski (Cypr)', + 'en_CZ' => 'angielski (Czechy)', 'en_DE' => 'angielski (Niemcy)', 'en_DK' => 'angielski (Dania)', 'en_DM' => 'angielski (Dominika)', 'en_ER' => 'angielski (Erytrea)', + 'en_ES' => 'angielski (Hiszpania)', 'en_FI' => 'angielski (Finlandia)', 'en_FJ' => 'angielski (Fidżi)', 'en_FK' => 'angielski (Falklandy)', 'en_FM' => 'angielski (Mikronezja)', + 'en_FR' => 'angielski (Francja)', 'en_GB' => 'angielski (Wielka Brytania)', 'en_GD' => 'angielski (Grenada)', 'en_GG' => 'angielski (Guernsey)', 'en_GH' => 'angielski (Ghana)', 'en_GI' => 'angielski (Gibraltar)', 'en_GM' => 'angielski (Gambia)', + 'en_GS' => 'angielski (Georgia Południowa i Sandwich Południowy)', 'en_GU' => 'angielski (Guam)', 'en_GY' => 'angielski (Gujana)', 'en_HK' => 'angielski (SRA Hongkong [Chiny])', + 'en_HU' => 'angielski (Węgry)', 'en_ID' => 'angielski (Indonezja)', 'en_IE' => 'angielski (Irlandia)', 'en_IL' => 'angielski (Izrael)', 'en_IM' => 'angielski (Wyspa Man)', 'en_IN' => 'angielski (Indie)', 'en_IO' => 'angielski (Brytyjskie Terytorium Oceanu Indyjskiego)', + 'en_IT' => 'angielski (Włochy)', 'en_JE' => 'angielski (Jersey)', 'en_JM' => 'angielski (Jamajka)', 'en_KE' => 'angielski (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'angielski (Norfolk)', 'en_NG' => 'angielski (Nigeria)', 'en_NL' => 'angielski (Holandia)', + 'en_NO' => 'angielski (Norwegia)', 'en_NR' => 'angielski (Nauru)', 'en_NU' => 'angielski (Niue)', 'en_NZ' => 'angielski (Nowa Zelandia)', 'en_PG' => 'angielski (Papua-Nowa Gwinea)', 'en_PH' => 'angielski (Filipiny)', 'en_PK' => 'angielski (Pakistan)', + 'en_PL' => 'angielski (Polska)', 'en_PN' => 'angielski (Pitcairn)', 'en_PR' => 'angielski (Portoryko)', + 'en_PT' => 'angielski (Portugalia)', 'en_PW' => 'angielski (Palau)', + 'en_RO' => 'angielski (Rumunia)', 'en_RW' => 'angielski (Rwanda)', 'en_SB' => 'angielski (Wyspy Salomona)', 'en_SC' => 'angielski (Seszele)', @@ -184,6 +194,7 @@ 'en_SG' => 'angielski (Singapur)', 'en_SH' => 'angielski (Wyspa Świętej Heleny)', 'en_SI' => 'angielski (Słowenia)', + 'en_SK' => 'angielski (Słowacja)', 'en_SL' => 'angielski (Sierra Leone)', 'en_SS' => 'angielski (Sudan Południowy)', 'en_SX' => 'angielski (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ps.php b/src/Symfony/Component/Intl/Resources/data/locales/ps.php index 551137b4fc35d..3a1d38c8521f6 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ps.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ps.php @@ -121,29 +121,35 @@ 'en_CM' => 'انګليسي (کامرون)', 'en_CX' => 'انګليسي (د کريسمس ټاپو)', 'en_CY' => 'انګليسي (قبرس)', + 'en_CZ' => 'انګليسي (چکیا)', 'en_DE' => 'انګليسي (المان)', 'en_DK' => 'انګليسي (ډنمارک)', 'en_DM' => 'انګليسي (دومینیکا)', 'en_ER' => 'انګليسي (اریتره)', + 'en_ES' => 'انګليسي (هسپانیه)', 'en_FI' => 'انګليسي (فنلینډ)', 'en_FJ' => 'انګليسي (فجي)', 'en_FK' => 'انګليسي (فاکلينډ ټاپوګان)', 'en_FM' => 'انګليسي (میکرونیزیا)', + 'en_FR' => 'انګليسي (فرانسه)', 'en_GB' => 'انګليسي (برتانیه)', 'en_GD' => 'انګليسي (ګرنادا)', 'en_GG' => 'انګليسي (ګرنسي)', 'en_GH' => 'انګليسي (ګانا)', 'en_GI' => 'انګليسي (جبل الطارق)', 'en_GM' => 'انګليسي (ګامبیا)', + 'en_GS' => 'انګليسي (سويلي جارجيا او سويلي سېنډوچ ټاپوګان)', 'en_GU' => 'انګليسي (ګوام)', 'en_GY' => 'انګليسي (ګیانا)', 'en_HK' => 'انګليسي (هانګ کانګ SAR چین)', + 'en_HU' => 'انګليسي (مجارستان)', 'en_ID' => 'انګليسي (اندونیزیا)', 'en_IE' => 'انګليسي (آيرلېنډ)', 'en_IL' => 'انګليسي (اسراييل)', 'en_IM' => 'انګليسي (د آئل آف مین)', 'en_IN' => 'انګليسي (هند)', 'en_IO' => 'انګليسي (د برتانوي هند سمندري سيمه)', + 'en_IT' => 'انګليسي (ایټالیه)', 'en_JE' => 'انګليسي (جرسی)', 'en_JM' => 'انګليسي (جمیکا)', 'en_KE' => 'انګليسي (کینیا)', @@ -167,15 +173,19 @@ 'en_NF' => 'انګليسي (نارفولک ټاپوګان)', 'en_NG' => 'انګليسي (نایجیریا)', 'en_NL' => 'انګليسي (هالېنډ)', + 'en_NO' => 'انګليسي (ناروۍ)', 'en_NR' => 'انګليسي (نایرو)', 'en_NU' => 'انګليسي (نیوو)', 'en_NZ' => 'انګليسي (نیوزیلنډ)', 'en_PG' => 'انګليسي (پاپوا نيو ګيني)', 'en_PH' => 'انګليسي (فلپين)', 'en_PK' => 'انګليسي (پاکستان)', + 'en_PL' => 'انګليسي (پولنډ)', 'en_PN' => 'انګليسي (پيټکيرن ټاپوګان)', 'en_PR' => 'انګليسي (پورتو ریکو)', + 'en_PT' => 'انګليسي (پورتګال)', 'en_PW' => 'انګليسي (پلاؤ)', + 'en_RO' => 'انګليسي (رومانیا)', 'en_RW' => 'انګليسي (روندا)', 'en_SB' => 'انګليسي (سليمان ټاپوګان)', 'en_SC' => 'انګليسي (سیچیلیس)', @@ -184,6 +194,7 @@ 'en_SG' => 'انګليسي (سينگاپور)', 'en_SH' => 'انګليسي (سینټ هیلینا)', 'en_SI' => 'انګليسي (سلوانیا)', + 'en_SK' => 'انګليسي (سلواکیا)', 'en_SL' => 'انګليسي (سییرا لیون)', 'en_SS' => 'انګليسي (سويلي سوډان)', 'en_SX' => 'انګليسي (سینټ مارټین)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/pt.php b/src/Symfony/Component/Intl/Resources/data/locales/pt.php index b3cc7780d6b06..57c90a64e67d2 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/pt.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/pt.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglês (Camarões)', 'en_CX' => 'inglês (Ilha Christmas)', 'en_CY' => 'inglês (Chipre)', + 'en_CZ' => 'inglês (Tchéquia)', 'en_DE' => 'inglês F438 (Alemanha)', 'en_DK' => 'inglês (Dinamarca)', 'en_DM' => 'inglês (Dominica)', 'en_ER' => 'inglês (Eritreia)', + 'en_ES' => 'inglês (Espanha)', 'en_FI' => 'inglês (Finlândia)', 'en_FJ' => 'inglês (Fiji)', 'en_FK' => 'inglês (Ilhas Malvinas)', 'en_FM' => 'inglês (Micronésia)', + 'en_FR' => 'inglês (França)', 'en_GB' => 'inglês (Reino Unido)', 'en_GD' => 'inglês (Granada)', 'en_GG' => 'inglês (Guernsey)', 'en_GH' => 'inglês (Gana)', 'en_GI' => 'inglês (Gibraltar)', 'en_GM' => 'inglês (Gâmbia)', + 'en_GS' => 'inglês (Ilhas Geórgia do Sul e Sandwich do Sul)', 'en_GU' => 'inglês (Guam)', 'en_GY' => 'inglês (Guiana)', 'en_HK' => 'inglês (Hong Kong, RAE da China)', + 'en_HU' => 'inglês (Hungria)', 'en_ID' => 'inglês (Indonésia)', 'en_IE' => 'inglês (Irlanda)', 'en_IL' => 'inglês (Israel)', 'en_IM' => 'inglês (Ilha de Man)', 'en_IN' => 'inglês (Índia)', 'en_IO' => 'inglês (Território Britânico do Oceano Índico)', + 'en_IT' => 'inglês (Itália)', 'en_JE' => 'inglês (Jersey)', 'en_JM' => 'inglês (Jamaica)', 'en_KE' => 'inglês (Quênia)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglês (Ilha Norfolk)', 'en_NG' => 'inglês (Nigéria)', 'en_NL' => 'inglês (Países Baixos)', + 'en_NO' => 'inglês (Noruega)', 'en_NR' => 'inglês (Nauru)', 'en_NU' => 'inglês (Niue)', 'en_NZ' => 'inglês (Nova Zelândia)', 'en_PG' => 'inglês (Papua-Nova Guiné)', 'en_PH' => 'inglês (Filipinas)', 'en_PK' => 'inglês (Paquistão)', + 'en_PL' => 'inglês (Polônia)', 'en_PN' => 'inglês (Ilhas Pitcairn)', 'en_PR' => 'inglês (Porto Rico)', + 'en_PT' => 'inglês (Portugal)', 'en_PW' => 'inglês (Palau)', + 'en_RO' => 'inglês (Romênia)', 'en_RW' => 'inglês (Ruanda)', 'en_SB' => 'inglês (Ilhas Salomão)', 'en_SC' => 'inglês (Seicheles)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglês (Singapura)', 'en_SH' => 'inglês (Santa Helena)', 'en_SI' => 'inglês (Eslovênia)', + 'en_SK' => 'inglês (Eslováquia)', 'en_SL' => 'inglês (Serra Leoa)', 'en_SS' => 'inglês (Sudão do Sul)', 'en_SX' => 'inglês (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/pt_PT.php b/src/Symfony/Component/Intl/Resources/data/locales/pt_PT.php index ed071e8d72da9..0595568cd88dd 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/pt_PT.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/pt_PT.php @@ -23,6 +23,7 @@ 'en_BS' => 'inglês (Baamas)', 'en_CC' => 'inglês (Ilhas dos Cocos [Keeling])', 'en_CX' => 'inglês (Ilha do Natal)', + 'en_CZ' => 'inglês (Chéquia)', 'en_DM' => 'inglês (Domínica)', 'en_FK' => 'inglês (Ilhas Falkland)', 'en_GG' => 'inglês (Guernesey)', @@ -36,6 +37,8 @@ 'en_MU' => 'inglês (Maurícia)', 'en_MW' => 'inglês (Maláui)', 'en_NU' => 'inglês (Niuê)', + 'en_PL' => 'inglês (Polónia)', + 'en_RO' => 'inglês (Roménia)', 'en_SI' => 'inglês (Eslovénia)', 'en_SX' => 'inglês (São Martinho [Sint Maarten])', 'en_TK' => 'inglês (Toquelau)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/qu.php b/src/Symfony/Component/Intl/Resources/data/locales/qu.php index 58fa36e7f2360..17a9d47eacc14 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/qu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/qu.php @@ -121,29 +121,35 @@ 'en_CM' => 'Ingles Simi (Camerún)', 'en_CX' => 'Ingles Simi (Isla Christmas)', 'en_CY' => 'Ingles Simi (Chipre)', + 'en_CZ' => 'Ingles Simi (Chequia)', 'en_DE' => 'Ingles Simi (Alemania)', 'en_DK' => 'Ingles Simi (Dinamarca)', 'en_DM' => 'Ingles Simi (Dominica)', 'en_ER' => 'Ingles Simi (Eritrea)', + 'en_ES' => 'Ingles Simi (España)', 'en_FI' => 'Ingles Simi (Finlandia)', 'en_FJ' => 'Ingles Simi (Fiyi)', 'en_FK' => 'Ingles Simi (Islas Malvinas)', 'en_FM' => 'Ingles Simi (Micronesia)', + 'en_FR' => 'Ingles Simi (Francia)', 'en_GB' => 'Ingles Simi (Reino Unido)', 'en_GD' => 'Ingles Simi (Granada)', 'en_GG' => 'Ingles Simi (Guernesey)', 'en_GH' => 'Ingles Simi (Ghana)', 'en_GI' => 'Ingles Simi (Gibraltar)', 'en_GM' => 'Ingles Simi (Gambia)', + 'en_GS' => 'Ingles Simi (Georgia del Sur e Islas Sandwich del Sur)', 'en_GU' => 'Ingles Simi (Guam)', 'en_GY' => 'Ingles Simi (Guyana)', 'en_HK' => 'Ingles Simi (Hong Kong RAE China)', + 'en_HU' => 'Ingles Simi (Hungría)', 'en_ID' => 'Ingles Simi (Indonesia)', 'en_IE' => 'Ingles Simi (Irlanda)', 'en_IL' => 'Ingles Simi (Israel)', 'en_IM' => 'Ingles Simi (Isla de Man)', 'en_IN' => 'Ingles Simi (India)', 'en_IO' => 'Ingles Simi (Territorio Británico del Océano Índico)', + 'en_IT' => 'Ingles Simi (Italia)', 'en_JE' => 'Ingles Simi (Jersey)', 'en_JM' => 'Ingles Simi (Jamaica)', 'en_KE' => 'Ingles Simi (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'Ingles Simi (Isla Norfolk)', 'en_NG' => 'Ingles Simi (Nigeria)', 'en_NL' => 'Ingles Simi (Países Bajos)', + 'en_NO' => 'Ingles Simi (Noruega)', 'en_NR' => 'Ingles Simi (Nauru)', 'en_NU' => 'Ingles Simi (Niue)', 'en_NZ' => 'Ingles Simi (Nueva Zelanda)', 'en_PG' => 'Ingles Simi (Papúa Nueva Guinea)', 'en_PH' => 'Ingles Simi (Filipinas)', 'en_PK' => 'Ingles Simi (Pakistán)', + 'en_PL' => 'Ingles Simi (Polonia)', 'en_PN' => 'Ingles Simi (Islas Pitcairn)', 'en_PR' => 'Ingles Simi (Puerto Rico)', + 'en_PT' => 'Ingles Simi (Portugal)', 'en_PW' => 'Ingles Simi (Palaos)', + 'en_RO' => 'Ingles Simi (Rumania)', 'en_RW' => 'Ingles Simi (Ruanda)', 'en_SB' => 'Ingles Simi (Islas Salomón)', 'en_SC' => 'Ingles Simi (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Ingles Simi (Singapur)', 'en_SH' => 'Ingles Simi (Santa Elena)', 'en_SI' => 'Ingles Simi (Eslovenia)', + 'en_SK' => 'Ingles Simi (Eslovaquia)', 'en_SL' => 'Ingles Simi (Sierra Leona)', 'en_SS' => 'Ingles Simi (Sudán del Sur)', 'en_SX' => 'Ingles Simi (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/rm.php b/src/Symfony/Component/Intl/Resources/data/locales/rm.php index 1c9b71b60f1d2..9508df1b2e32a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/rm.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/rm.php @@ -121,28 +121,34 @@ 'en_CM' => 'englais (Camerun)', 'en_CX' => 'englais (Insla da Nadal)', 'en_CY' => 'englais (Cipra)', + 'en_CZ' => 'englais (Tschechia)', 'en_DE' => 'englais (Germania)', 'en_DK' => 'englais (Danemarc)', 'en_DM' => 'englais (Dominica)', 'en_ER' => 'englais (Eritrea)', + 'en_ES' => 'englais (Spagna)', 'en_FI' => 'englais (Finlanda)', 'en_FJ' => 'englais (Fidschi)', 'en_FK' => 'englais (Inslas dal Falkland)', 'en_FM' => 'englais (Micronesia)', + 'en_FR' => 'englais (Frantscha)', 'en_GB' => 'englais (Reginavel Unì)', 'en_GD' => 'englais (Grenada)', 'en_GG' => 'englais (Guernsey)', 'en_GH' => 'englais (Ghana)', 'en_GI' => 'englais (Gibraltar)', 'en_GM' => 'englais (Gambia)', + 'en_GS' => 'englais (Georgia dal Sid e las Inslas Sandwich dal Sid)', 'en_GU' => 'englais (Guam)', 'en_GY' => 'englais (Guyana)', 'en_HK' => 'englais (Regiun d’administraziun speziala da Hongkong, China)', + 'en_HU' => 'englais (Ungaria)', 'en_ID' => 'englais (Indonesia)', 'en_IE' => 'englais (Irlanda)', 'en_IL' => 'englais (Israel)', 'en_IM' => 'englais (Insla da Man)', 'en_IN' => 'englais (India)', + 'en_IT' => 'englais (Italia)', 'en_JE' => 'englais (Jersey)', 'en_JM' => 'englais (Giamaica)', 'en_KE' => 'englais (Kenia)', @@ -166,15 +172,19 @@ 'en_NF' => 'englais (Insla Norfolk)', 'en_NG' => 'englais (Nigeria)', 'en_NL' => 'englais (Pajais Bass)', + 'en_NO' => 'englais (Norvegia)', 'en_NR' => 'englais (Nauru)', 'en_NU' => 'englais (Niue)', 'en_NZ' => 'englais (Nova Zelanda)', 'en_PG' => 'englais (Papua Nova Guinea)', 'en_PH' => 'englais (Filippinas)', 'en_PK' => 'englais (Pakistan)', + 'en_PL' => 'englais (Pologna)', 'en_PN' => 'englais (Pitcairn)', 'en_PR' => 'englais (Puerto Rico)', + 'en_PT' => 'englais (Portugal)', 'en_PW' => 'englais (Palau)', + 'en_RO' => 'englais (Rumenia)', 'en_RW' => 'englais (Ruanda)', 'en_SB' => 'englais (Inslas Salomonas)', 'en_SC' => 'englais (Seychellas)', @@ -183,6 +193,7 @@ 'en_SG' => 'englais (Singapur)', 'en_SH' => 'englais (Sontg’Elena)', 'en_SI' => 'englais (Slovenia)', + 'en_SK' => 'englais (Slovachia)', 'en_SL' => 'englais (Sierra Leone)', 'en_SS' => 'englais (Sudan dal Sid)', 'en_SX' => 'englais (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/rn.php b/src/Symfony/Component/Intl/Resources/data/locales/rn.php index 26c3aa3610bc1..979345630fc6b 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/rn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/rn.php @@ -71,14 +71,17 @@ 'en_CK' => 'Icongereza (Izinga rya Kuku)', 'en_CM' => 'Icongereza (Kameruni)', 'en_CY' => 'Icongereza (Izinga rya Shipure)', + 'en_CZ' => 'Icongereza (Repubulika ya Ceke)', 'en_DE' => 'Icongereza (Ubudage)', 'en_DK' => 'Icongereza (Danimariki)', 'en_DM' => 'Icongereza (Dominika)', 'en_ER' => 'Icongereza (Elitereya)', + 'en_ES' => 'Icongereza (Hisipaniya)', 'en_FI' => 'Icongereza (Finilandi)', 'en_FJ' => 'Icongereza (Fiji)', 'en_FK' => 'Icongereza (Izinga rya Filikilandi)', 'en_FM' => 'Icongereza (Mikoroniziya)', + 'en_FR' => 'Icongereza (Ubufaransa)', 'en_GB' => 'Icongereza (Ubwongereza)', 'en_GD' => 'Icongereza (Gerenada)', 'en_GH' => 'Icongereza (Gana)', @@ -86,10 +89,12 @@ 'en_GM' => 'Icongereza (Gambiya)', 'en_GU' => 'Icongereza (Gwamu)', 'en_GY' => 'Icongereza (Guyane)', + 'en_HU' => 'Icongereza (Hungariya)', 'en_ID' => 'Icongereza (Indoneziya)', 'en_IE' => 'Icongereza (Irilandi)', 'en_IL' => 'Icongereza (Isiraheli)', 'en_IN' => 'Icongereza (Ubuhindi)', + 'en_IT' => 'Icongereza (Ubutaliyani)', 'en_JM' => 'Icongereza (Jamayika)', 'en_KE' => 'Icongereza (Kenya)', 'en_KI' => 'Icongereza (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Icongereza (izinga rya Norufoluke)', 'en_NG' => 'Icongereza (Nijeriya)', 'en_NL' => 'Icongereza (Ubuholandi)', + 'en_NO' => 'Icongereza (Noruveji)', 'en_NR' => 'Icongereza (Nawuru)', 'en_NU' => 'Icongereza (Niyuwe)', 'en_NZ' => 'Icongereza (Nuvelizelandi)', 'en_PG' => 'Icongereza (Papuwa Niyugineya)', 'en_PH' => 'Icongereza (Amazinga ya Filipine)', 'en_PK' => 'Icongereza (Pakisitani)', + 'en_PL' => 'Icongereza (Polonye)', 'en_PN' => 'Icongereza (Pitikeyirini)', 'en_PR' => 'Icongereza (Puwetoriko)', + 'en_PT' => 'Icongereza (Porutugali)', 'en_PW' => 'Icongereza (Palawu)', + 'en_RO' => 'Icongereza (Rumaniya)', 'en_RW' => 'Icongereza (u Rwanda)', 'en_SB' => 'Icongereza (Amazinga ya Salumoni)', 'en_SC' => 'Icongereza (Amazinga ya Seyisheli)', @@ -128,6 +137,7 @@ 'en_SG' => 'Icongereza (Singapuru)', 'en_SH' => 'Icongereza (Sehelene)', 'en_SI' => 'Icongereza (Siloveniya)', + 'en_SK' => 'Icongereza (Silovakiya)', 'en_SL' => 'Icongereza (Siyeralewone)', 'en_SZ' => 'Icongereza (Suwazilandi)', 'en_TC' => 'Icongereza (Amazinga ya Turkisi na Cayikosi)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ro.php b/src/Symfony/Component/Intl/Resources/data/locales/ro.php index a75fa6e172a9a..0b54745b81736 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ro.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ro.php @@ -121,29 +121,35 @@ 'en_CM' => 'engleză (Camerun)', 'en_CX' => 'engleză (Insula Christmas)', 'en_CY' => 'engleză (Cipru)', + 'en_CZ' => 'engleză (Cehia)', 'en_DE' => 'engleză (Germania)', 'en_DK' => 'engleză (Danemarca)', 'en_DM' => 'engleză (Dominica)', 'en_ER' => 'engleză (Eritreea)', + 'en_ES' => 'engleză (Spania)', 'en_FI' => 'engleză (Finlanda)', 'en_FJ' => 'engleză (Fiji)', 'en_FK' => 'engleză (Insulele Falkland)', 'en_FM' => 'engleză (Micronezia)', + 'en_FR' => 'engleză (Franța)', 'en_GB' => 'engleză (Regatul Unit)', 'en_GD' => 'engleză (Grenada)', 'en_GG' => 'engleză (Guernsey)', 'en_GH' => 'engleză (Ghana)', 'en_GI' => 'engleză (Gibraltar)', 'en_GM' => 'engleză (Gambia)', + 'en_GS' => 'engleză (Georgia de Sud și Insulele Sandwich de Sud)', 'en_GU' => 'engleză (Guam)', 'en_GY' => 'engleză (Guyana)', 'en_HK' => 'engleză (R.A.S. Hong Kong, China)', + 'en_HU' => 'engleză (Ungaria)', 'en_ID' => 'engleză (Indonezia)', 'en_IE' => 'engleză (Irlanda)', 'en_IL' => 'engleză (Israel)', 'en_IM' => 'engleză (Insula Man)', 'en_IN' => 'engleză (India)', 'en_IO' => 'engleză (Teritoriul Britanic din Oceanul Indian)', + 'en_IT' => 'engleză (Italia)', 'en_JE' => 'engleză (Jersey)', 'en_JM' => 'engleză (Jamaica)', 'en_KE' => 'engleză (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'engleză (Insula Norfolk)', 'en_NG' => 'engleză (Nigeria)', 'en_NL' => 'engleză (Țările de Jos)', + 'en_NO' => 'engleză (Norvegia)', 'en_NR' => 'engleză (Nauru)', 'en_NU' => 'engleză (Niue)', 'en_NZ' => 'engleză (Noua Zeelandă)', 'en_PG' => 'engleză (Papua-Noua Guinee)', 'en_PH' => 'engleză (Filipine)', 'en_PK' => 'engleză (Pakistan)', + 'en_PL' => 'engleză (Polonia)', 'en_PN' => 'engleză (Insulele Pitcairn)', 'en_PR' => 'engleză (Puerto Rico)', + 'en_PT' => 'engleză (Portugalia)', 'en_PW' => 'engleză (Palau)', + 'en_RO' => 'engleză (România)', 'en_RW' => 'engleză (Rwanda)', 'en_SB' => 'engleză (Insulele Solomon)', 'en_SC' => 'engleză (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'engleză (Singapore)', 'en_SH' => 'engleză (Sfânta Elena)', 'en_SI' => 'engleză (Slovenia)', + 'en_SK' => 'engleză (Slovacia)', 'en_SL' => 'engleză (Sierra Leone)', 'en_SS' => 'engleză (Sudanul de Sud)', 'en_SX' => 'engleză (Sint-Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ru.php b/src/Symfony/Component/Intl/Resources/data/locales/ru.php index 5dc363dece908..82f661951cb8c 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ru.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ru.php @@ -121,29 +121,35 @@ 'en_CM' => 'английский (Камерун)', 'en_CX' => 'английский (о-в Рождества)', 'en_CY' => 'английский (Кипр)', + 'en_CZ' => 'английский (Чехия)', 'en_DE' => 'английский (Германия)', 'en_DK' => 'английский (Дания)', 'en_DM' => 'английский (Доминика)', 'en_ER' => 'английский (Эритрея)', + 'en_ES' => 'английский (Испания)', 'en_FI' => 'английский (Финляндия)', 'en_FJ' => 'английский (Фиджи)', 'en_FK' => 'английский (Фолклендские о-ва)', 'en_FM' => 'английский (Федеративные Штаты Микронезии)', + 'en_FR' => 'английский (Франция)', 'en_GB' => 'английский (Великобритания)', 'en_GD' => 'английский (Гренада)', 'en_GG' => 'английский (Гернси)', 'en_GH' => 'английский (Гана)', 'en_GI' => 'английский (Гибралтар)', 'en_GM' => 'английский (Гамбия)', + 'en_GS' => 'английский (Южная Георгия и Южные Сандвичевы о-ва)', 'en_GU' => 'английский (Гуам)', 'en_GY' => 'английский (Гайана)', 'en_HK' => 'английский (Гонконг [САР])', + 'en_HU' => 'английский (Венгрия)', 'en_ID' => 'английский (Индонезия)', 'en_IE' => 'английский (Ирландия)', 'en_IL' => 'английский (Израиль)', 'en_IM' => 'английский (о-в Мэн)', 'en_IN' => 'английский (Индия)', 'en_IO' => 'английский (Британская территория в Индийском океане)', + 'en_IT' => 'английский (Италия)', 'en_JE' => 'английский (Джерси)', 'en_JM' => 'английский (Ямайка)', 'en_KE' => 'английский (Кения)', @@ -167,15 +173,19 @@ 'en_NF' => 'английский (о-в Норфолк)', 'en_NG' => 'английский (Нигерия)', 'en_NL' => 'английский (Нидерланды)', + 'en_NO' => 'английский (Норвегия)', 'en_NR' => 'английский (Науру)', 'en_NU' => 'английский (Ниуэ)', 'en_NZ' => 'английский (Новая Зеландия)', 'en_PG' => 'английский (Папуа — Новая Гвинея)', 'en_PH' => 'английский (Филиппины)', 'en_PK' => 'английский (Пакистан)', + 'en_PL' => 'английский (Польша)', 'en_PN' => 'английский (о-ва Питкэрн)', 'en_PR' => 'английский (Пуэрто-Рико)', + 'en_PT' => 'английский (Португалия)', 'en_PW' => 'английский (Палау)', + 'en_RO' => 'английский (Румыния)', 'en_RW' => 'английский (Руанда)', 'en_SB' => 'английский (Соломоновы о-ва)', 'en_SC' => 'английский (Сейшельские о-ва)', @@ -184,6 +194,7 @@ 'en_SG' => 'английский (Сингапур)', 'en_SH' => 'английский (о-в Св. Елены)', 'en_SI' => 'английский (Словения)', + 'en_SK' => 'английский (Словакия)', 'en_SL' => 'английский (Сьерра-Леоне)', 'en_SS' => 'английский (Южный Судан)', 'en_SX' => 'английский (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sa.php b/src/Symfony/Component/Intl/Resources/data/locales/sa.php index ed01f879c2556..f605eea7e0d90 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sa.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sa.php @@ -7,8 +7,10 @@ 'de_IT' => 'जर्मनभाषा: (इटली:)', 'en' => 'आङ्ग्लभाषा', 'en_DE' => 'आङ्ग्लभाषा (जर्मनीदेश:)', + 'en_FR' => 'आङ्ग्लभाषा (फ़्रांस:)', 'en_GB' => 'आङ्ग्लभाषा (संयुक्त राष्ट्र:)', 'en_IN' => 'आङ्ग्लभाषा (भारतः)', + 'en_IT' => 'आङ्ग्लभाषा (इटली:)', 'en_US' => 'आङ्ग्लभाषा (संयुक्त राज्य:)', 'es' => 'स्पेनीय भाषा:', 'es_BR' => 'स्पेनीय भाषा: (ब्राजील)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sc.php b/src/Symfony/Component/Intl/Resources/data/locales/sc.php index 798c7b6420b4d..8aa2570069300 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sc.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sc.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglesu (Camerùn)', 'en_CX' => 'inglesu (Ìsula de sa Natividade)', 'en_CY' => 'inglesu (Tzipru)', + 'en_CZ' => 'inglesu (Tzèchia)', 'en_DE' => 'inglesu (Germània)', 'en_DK' => 'inglesu (Danimarca)', 'en_DM' => 'inglesu (Dominica)', 'en_ER' => 'inglesu (Eritrea)', + 'en_ES' => 'inglesu (Ispagna)', 'en_FI' => 'inglesu (Finlàndia)', 'en_FJ' => 'inglesu (Fiji)', 'en_FK' => 'inglesu (Ìsulas Falkland)', 'en_FM' => 'inglesu (Micronèsia)', + 'en_FR' => 'inglesu (Frantza)', 'en_GB' => 'inglesu (Regnu Unidu)', 'en_GD' => 'inglesu (Grenada)', 'en_GG' => 'inglesu (Guernsey)', 'en_GH' => 'inglesu (Ghana)', 'en_GI' => 'inglesu (Gibilterra)', 'en_GM' => 'inglesu (Gàmbia)', + 'en_GS' => 'inglesu (Geòrgia de su Sud e Ìsulas Sandwich Australes)', 'en_GU' => 'inglesu (Guàm)', 'en_GY' => 'inglesu (Guyana)', 'en_HK' => 'inglesu (RAS tzinesa de Hong Kong)', + 'en_HU' => 'inglesu (Ungheria)', 'en_ID' => 'inglesu (Indonèsia)', 'en_IE' => 'inglesu (Irlanda)', 'en_IL' => 'inglesu (Israele)', 'en_IM' => 'inglesu (Ìsula de Man)', 'en_IN' => 'inglesu (Ìndia)', 'en_IO' => 'inglesu (Territòriu Britànnicu de s’Otzèanu Indianu)', + 'en_IT' => 'inglesu (Itàlia)', 'en_JE' => 'inglesu (Jersey)', 'en_JM' => 'inglesu (Giamàica)', 'en_KE' => 'inglesu (Kènya)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglesu (Ìsula Norfolk)', 'en_NG' => 'inglesu (Nigèria)', 'en_NL' => 'inglesu (Paisos Bassos)', + 'en_NO' => 'inglesu (Norvègia)', 'en_NR' => 'inglesu (Nauru)', 'en_NU' => 'inglesu (Niue)', 'en_NZ' => 'inglesu (Zelanda Noa)', 'en_PG' => 'inglesu (Pàpua Guinea Noa)', 'en_PH' => 'inglesu (Filipinas)', 'en_PK' => 'inglesu (Pàkistan)', + 'en_PL' => 'inglesu (Polònia)', 'en_PN' => 'inglesu (Ìsulas Pìtcairn)', 'en_PR' => 'inglesu (Puerto Rico)', + 'en_PT' => 'inglesu (Portogallu)', 'en_PW' => 'inglesu (Palau)', + 'en_RO' => 'inglesu (Romania)', 'en_RW' => 'inglesu (Ruanda)', 'en_SB' => 'inglesu (Ìsulas Salomone)', 'en_SC' => 'inglesu (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglesu (Singapore)', 'en_SH' => 'inglesu (Santa Elene)', 'en_SI' => 'inglesu (Islovènia)', + 'en_SK' => 'inglesu (Islovàchia)', 'en_SL' => 'inglesu (Sierra Leone)', 'en_SS' => 'inglesu (Sudan de su Sud)', 'en_SX' => 'inglesu (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sd.php b/src/Symfony/Component/Intl/Resources/data/locales/sd.php index 56e38bc5eb5c9..61244adac0296 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sd.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sd.php @@ -121,29 +121,35 @@ 'en_CM' => 'انگريزي (ڪيمرون)', 'en_CX' => 'انگريزي (ڪرسمس ٻيٽ)', 'en_CY' => 'انگريزي (سائپرس)', + 'en_CZ' => 'انگريزي (چيڪيا)', 'en_DE' => 'انگريزي (جرمني)', 'en_DK' => 'انگريزي (ڊينمارڪ)', 'en_DM' => 'انگريزي (ڊومينيڪا)', 'en_ER' => 'انگريزي (ايريٽيريا)', + 'en_ES' => 'انگريزي (اسپين)', 'en_FI' => 'انگريزي (فن لينڊ)', 'en_FJ' => 'انگريزي (فجي)', 'en_FK' => 'انگريزي (فاڪ لينڊ ٻيٽ)', 'en_FM' => 'انگريزي (مائڪرونيشيا)', + 'en_FR' => 'انگريزي (فرانس)', 'en_GB' => 'انگريزي (برطانيہ)', 'en_GD' => 'انگريزي (گريناڊا)', 'en_GG' => 'انگريزي (گورنسي)', 'en_GH' => 'انگريزي (گهانا)', 'en_GI' => 'انگريزي (جبرالٽر)', 'en_GM' => 'انگريزي (گيمبيا)', + 'en_GS' => 'انگريزي (ڏکڻ جارجيا ۽ ڏکڻ سينڊوچ ٻيٽ)', 'en_GU' => 'انگريزي (گوام)', 'en_GY' => 'انگريزي (گيانا)', 'en_HK' => 'انگريزي (هانگ ڪانگ SAR)', + 'en_HU' => 'انگريزي (هنگري)', 'en_ID' => 'انگريزي (انڊونيشيا)', 'en_IE' => 'انگريزي (آئرلينڊ)', 'en_IL' => 'انگريزي (اسرائيل)', 'en_IM' => 'انگريزي (انسانن جو ٻيٽ)', 'en_IN' => 'انگريزي (ڀارت)', 'en_IO' => 'انگريزي (برطانوي هندي سمنڊ خطو)', + 'en_IT' => 'انگريزي (اٽلي)', 'en_JE' => 'انگريزي (جرسي)', 'en_JM' => 'انگريزي (جميڪا)', 'en_KE' => 'انگريزي (ڪينيا)', @@ -167,15 +173,19 @@ 'en_NF' => 'انگريزي (نورفوڪ ٻيٽ)', 'en_NG' => 'انگريزي (نائيجيريا)', 'en_NL' => 'انگريزي (نيدرلينڊ)', + 'en_NO' => 'انگريزي (ناروي)', 'en_NR' => 'انگريزي (نائورو)', 'en_NU' => 'انگريزي (نووي)', 'en_NZ' => 'انگريزي (نيو زيلينڊ)', 'en_PG' => 'انگريزي (پاپوا نیو گني)', 'en_PH' => 'انگريزي (فلپائن)', 'en_PK' => 'انگريزي (پاڪستان)', + 'en_PL' => 'انگريزي (پولينڊ)', 'en_PN' => 'انگريزي (پٽڪئرن ٻيٽ)', 'en_PR' => 'انگريزي (پيوئرٽو ريڪو)', + 'en_PT' => 'انگريزي (پرتگال)', 'en_PW' => 'انگريزي (پلائو)', + 'en_RO' => 'انگريزي (رومانيا)', 'en_RW' => 'انگريزي (روانڊا)', 'en_SB' => 'انگريزي (سولومون ٻيٽَ)', 'en_SC' => 'انگريزي (شي شلز)', @@ -184,6 +194,7 @@ 'en_SG' => 'انگريزي (سنگاپور)', 'en_SH' => 'انگريزي (سينٽ ھيلينا)', 'en_SI' => 'انگريزي (سلوینیا)', + 'en_SK' => 'انگريزي (سلوواڪيا)', 'en_SL' => 'انگريزي (سيرا ليون)', 'en_SS' => 'انگريزي (ڏکڻ سوڊان)', 'en_SX' => 'انگريزي (سنٽ مارٽن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sd_Deva.php b/src/Symfony/Component/Intl/Resources/data/locales/sd_Deva.php index 2c2deaf3538ca..e1135e55c5efc 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sd_Deva.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sd_Deva.php @@ -51,29 +51,35 @@ 'en_CM' => 'अंगरेज़ी (ڪيمرون)', 'en_CX' => 'अंगरेज़ी (ڪرسمس ٻيٽ)', 'en_CY' => 'अंगरेज़ी (سائپرس)', + 'en_CZ' => 'अंगरेज़ी (چيڪيا)', 'en_DE' => 'अंगरेज़ी (जर्मनी)', 'en_DK' => 'अंगरेज़ी (ڊينمارڪ)', 'en_DM' => 'अंगरेज़ी (ڊومينيڪا)', 'en_ER' => 'अंगरेज़ी (ايريٽيريا)', + 'en_ES' => 'अंगरेज़ी (اسپين)', 'en_FI' => 'अंगरेज़ी (فن لينڊ)', 'en_FJ' => 'अंगरेज़ी (فجي)', 'en_FK' => 'अंगरेज़ी (فاڪ لينڊ ٻيٽ)', 'en_FM' => 'अंगरेज़ी (مائڪرونيشيا)', + 'en_FR' => 'अंगरेज़ी (फ़्रांस)', 'en_GB' => 'अंगरेज़ी (बरतानी)', 'en_GD' => 'अंगरेज़ी (گريناڊا)', 'en_GG' => 'अंगरेज़ी (گورنسي)', 'en_GH' => 'अंगरेज़ी (گهانا)', 'en_GI' => 'अंगरेज़ी (جبرالٽر)', 'en_GM' => 'अंगरेज़ी (گيمبيا)', + 'en_GS' => 'अंगरेज़ी (ڏکڻ جارجيا ۽ ڏکڻ سينڊوچ ٻيٽ)', 'en_GU' => 'अंगरेज़ी (گوام)', 'en_GY' => 'अंगरेज़ी (گيانا)', 'en_HK' => 'अंगरेज़ी (هانگ ڪانگ SAR)', + 'en_HU' => 'अंगरेज़ी (هنگري)', 'en_ID' => 'अंगरेज़ी (انڊونيشيا)', 'en_IE' => 'अंगरेज़ी (آئرلينڊ)', 'en_IL' => 'अंगरेज़ी (اسرائيل)', 'en_IM' => 'अंगरेज़ी (انسانن جو ٻيٽ)', 'en_IN' => 'अंगरेज़ी (भारत)', 'en_IO' => 'अंगरेज़ी (برطانوي هندي سمنڊ خطو)', + 'en_IT' => 'अंगरेज़ी (इटली)', 'en_JE' => 'अंगरेज़ी (جرسي)', 'en_JM' => 'अंगरेज़ी (جميڪا)', 'en_KE' => 'अंगरेज़ी (ڪينيا)', @@ -97,15 +103,19 @@ 'en_NF' => 'अंगरेज़ी (نورفوڪ ٻيٽ)', 'en_NG' => 'अंगरेज़ी (نائيجيريا)', 'en_NL' => 'अंगरेज़ी (نيدرلينڊ)', + 'en_NO' => 'अंगरेज़ी (ناروي)', 'en_NR' => 'अंगरेज़ी (نائورو)', 'en_NU' => 'अंगरेज़ी (نووي)', 'en_NZ' => 'अंगरेज़ी (نيو زيلينڊ)', 'en_PG' => 'अंगरेज़ी (پاپوا نیو گني)', 'en_PH' => 'अंगरेज़ी (فلپائن)', 'en_PK' => 'अंगरेज़ी (पाकिस्तान)', + 'en_PL' => 'अंगरेज़ी (پولينڊ)', 'en_PN' => 'अंगरेज़ी (پٽڪئرن ٻيٽ)', 'en_PR' => 'अंगरेज़ी (پيوئرٽو ريڪو)', + 'en_PT' => 'अंगरेज़ी (پرتگال)', 'en_PW' => 'अंगरेज़ी (پلائو)', + 'en_RO' => 'अंगरेज़ी (رومانيا)', 'en_RW' => 'अंगरेज़ी (روانڊا)', 'en_SB' => 'अंगरेज़ी (سولومون ٻيٽَ)', 'en_SC' => 'अंगरेज़ी (شي شلز)', @@ -114,6 +124,7 @@ 'en_SG' => 'अंगरेज़ी (سنگاپور)', 'en_SH' => 'अंगरेज़ी (سينٽ ھيلينا)', 'en_SI' => 'अंगरेज़ी (سلوینیا)', + 'en_SK' => 'अंगरेज़ी (سلوواڪيا)', 'en_SL' => 'अंगरेज़ी (سيرا ليون)', 'en_SS' => 'अंगरेज़ी (ڏکڻ سوڊان)', 'en_SX' => 'अंगरेज़ी (سنٽ مارٽن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/se.php b/src/Symfony/Component/Intl/Resources/data/locales/se.php index 559e781dbdc5d..18863765e7aaa 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/se.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/se.php @@ -100,28 +100,34 @@ 'en_CM' => 'eaŋgalsgiella (Kamerun)', 'en_CX' => 'eaŋgalsgiella (Juovllat-sullot)', 'en_CY' => 'eaŋgalsgiella (Kypros)', + 'en_CZ' => 'eaŋgalsgiella (Čeahkka)', 'en_DE' => 'eaŋgalsgiella (Duiska)', 'en_DK' => 'eaŋgalsgiella (Dánmárku)', 'en_DM' => 'eaŋgalsgiella (Dominica)', 'en_ER' => 'eaŋgalsgiella (Eritrea)', + 'en_ES' => 'eaŋgalsgiella (Spánia)', 'en_FI' => 'eaŋgalsgiella (Suopma)', 'en_FJ' => 'eaŋgalsgiella (Fijisullot)', 'en_FK' => 'eaŋgalsgiella (Falklandsullot)', 'en_FM' => 'eaŋgalsgiella (Mikronesia)', + 'en_FR' => 'eaŋgalsgiella (Frankriika)', 'en_GB' => 'eaŋgalsgiella (Stuorra-Británnia)', 'en_GD' => 'eaŋgalsgiella (Grenada)', 'en_GG' => 'eaŋgalsgiella (Guernsey)', 'en_GH' => 'eaŋgalsgiella (Ghana)', 'en_GI' => 'eaŋgalsgiella (Gibraltar)', 'en_GM' => 'eaŋgalsgiella (Gámbia)', + 'en_GS' => 'eaŋgalsgiella (Lulli Georgia ja Lulli Sandwich-sullot)', 'en_GU' => 'eaŋgalsgiella (Guam)', 'en_GY' => 'eaŋgalsgiella (Guyana)', 'en_HK' => 'eaŋgalsgiella (Hongkong)', + 'en_HU' => 'eaŋgalsgiella (Ungár)', 'en_ID' => 'eaŋgalsgiella (Indonesia)', 'en_IE' => 'eaŋgalsgiella (Irlánda)', 'en_IL' => 'eaŋgalsgiella (Israel)', 'en_IM' => 'eaŋgalsgiella (Mann-sullot)', 'en_IN' => 'eaŋgalsgiella (India)', + 'en_IT' => 'eaŋgalsgiella (Itália)', 'en_JE' => 'eaŋgalsgiella (Jersey)', 'en_JM' => 'eaŋgalsgiella (Jamaica)', 'en_KE' => 'eaŋgalsgiella (Kenia)', @@ -145,15 +151,19 @@ 'en_NF' => 'eaŋgalsgiella (Norfolksullot)', 'en_NG' => 'eaŋgalsgiella (Nigeria)', 'en_NL' => 'eaŋgalsgiella (Vuolleeatnamat)', + 'en_NO' => 'eaŋgalsgiella (Norga)', 'en_NR' => 'eaŋgalsgiella (Nauru)', 'en_NU' => 'eaŋgalsgiella (Niue)', 'en_NZ' => 'eaŋgalsgiella (Ođđa-Selánda)', 'en_PG' => 'eaŋgalsgiella (Papua-Ođđa-Guinea)', 'en_PH' => 'eaŋgalsgiella (Filippiinnat)', 'en_PK' => 'eaŋgalsgiella (Pakistan)', + 'en_PL' => 'eaŋgalsgiella (Polen)', 'en_PN' => 'eaŋgalsgiella (Pitcairn)', 'en_PR' => 'eaŋgalsgiella (Puerto Rico)', + 'en_PT' => 'eaŋgalsgiella (Portugála)', 'en_PW' => 'eaŋgalsgiella (Palau)', + 'en_RO' => 'eaŋgalsgiella (Románia)', 'en_RW' => 'eaŋgalsgiella (Rwanda)', 'en_SB' => 'eaŋgalsgiella (Salomon-sullot)', 'en_SC' => 'eaŋgalsgiella (Seychellsullot)', @@ -162,6 +172,7 @@ 'en_SG' => 'eaŋgalsgiella (Singapore)', 'en_SH' => 'eaŋgalsgiella (Saint Helena)', 'en_SI' => 'eaŋgalsgiella (Slovenia)', + 'en_SK' => 'eaŋgalsgiella (Slovákia)', 'en_SL' => 'eaŋgalsgiella (Sierra Leone)', 'en_SS' => 'eaŋgalsgiella (Máttasudan)', 'en_SX' => 'eaŋgalsgiella (Vuolleeatnamat Saint Martin)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sg.php b/src/Symfony/Component/Intl/Resources/data/locales/sg.php index 1f173b9d4abfc..89dfbd398d19e 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sg.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sg.php @@ -71,14 +71,17 @@ 'en_CK' => 'Anglëe (âzûâ Kûku)', 'en_CM' => 'Anglëe (Kamerûne)', 'en_CY' => 'Anglëe (Sîpri)', + 'en_CZ' => 'Anglëe (Ködörösêse tî Tyêki)', 'en_DE' => 'Anglëe (Zâmani)', 'en_DK' => 'Anglëe (Danemêrke)', 'en_DM' => 'Anglëe (Dömïnîka)', 'en_ER' => 'Anglëe (Eritrëe)', + 'en_ES' => 'Anglëe (Espânye)', 'en_FI' => 'Anglëe (Fëlânde)', 'en_FJ' => 'Anglëe (Fidyïi)', 'en_FK' => 'Anglëe (Âzûâ tî Mälüîni)', 'en_FM' => 'Anglëe (Mikronezïi)', + 'en_FR' => 'Anglëe (Farânzi)', 'en_GB' => 'Anglëe (Ködörögbïä--Ôko)', 'en_GD' => 'Anglëe (Grenâda)', 'en_GH' => 'Anglëe (Ganäa)', @@ -86,10 +89,12 @@ 'en_GM' => 'Anglëe (Gambïi)', 'en_GU' => 'Anglëe (Guâm)', 'en_GY' => 'Anglëe (Gayâna)', + 'en_HU' => 'Anglëe (Hongirùii)', 'en_ID' => 'Anglëe (Ênndonezïi)', 'en_IE' => 'Anglëe (Irlânde)', 'en_IL' => 'Anglëe (Israëli)', 'en_IN' => 'Anglëe (Ênnde)', + 'en_IT' => 'Anglëe (Italùii)', 'en_JM' => 'Anglëe (Zamaîka)', 'en_KE' => 'Anglëe (Kenyäa)', 'en_KI' => 'Anglëe (Kiribati)', @@ -111,15 +116,19 @@ 'en_NF' => 'Anglëe (Zûâ Nôrfôlko)', 'en_NG' => 'Anglëe (Nizerïa)', 'en_NL' => 'Anglëe (Holände)', + 'en_NO' => 'Anglëe (Nörvêzi)', 'en_NR' => 'Anglëe (Nauru)', 'en_NU' => 'Anglëe (Niue)', 'en_NZ' => 'Anglëe (Finî Zelânde)', 'en_PG' => 'Anglëe (Papû Finî Ginëe, Papuazïi)', 'en_PH' => 'Anglëe (Filipîni)', 'en_PK' => 'Anglëe (Pakistäan)', + 'en_PL' => 'Anglëe (Pölôni)', 'en_PN' => 'Anglëe (Pitikêrni)', 'en_PR' => 'Anglëe (Porto Rîko)', + 'en_PT' => 'Anglëe (Pörtugäle, Ködörö Pûra)', 'en_PW' => 'Anglëe (Palau)', + 'en_RO' => 'Anglëe (Rumanïi)', 'en_RW' => 'Anglëe (Ruandäa)', 'en_SB' => 'Anglëe (Zûâ Salomöon)', 'en_SC' => 'Anglëe (Sëyshêle)', @@ -128,6 +137,7 @@ 'en_SG' => 'Anglëe (Sïngäpûru)', 'en_SH' => 'Anglëe (Sênt-Helêna)', 'en_SI' => 'Anglëe (Solovenïi)', + 'en_SK' => 'Anglëe (Solovakïi)', 'en_SL' => 'Anglëe (Sierä-Leône)', 'en_SZ' => 'Anglëe (Swäzïlânde)', 'en_TC' => 'Anglëe (Âzûâ Turku na Kaîki)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/si.php b/src/Symfony/Component/Intl/Resources/data/locales/si.php index 7358353002dc2..46632611fc9ac 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/si.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/si.php @@ -121,29 +121,35 @@ 'en_CM' => 'ඉංග්‍රීසි (කැමරූන්)', 'en_CX' => 'ඉංග්‍රීසි (ක්‍රිස්මස් දූපත)', 'en_CY' => 'ඉංග්‍රීසි (සයිප්‍රසය)', + 'en_CZ' => 'ඉංග්‍රීසි (චෙචියාව)', 'en_DE' => 'ඉංග්‍රීසි (ජර්මනිය)', 'en_DK' => 'ඉංග්‍රීසි (ඩෙන්මාර්කය)', 'en_DM' => 'ඉංග්‍රීසි (ඩොමිනිකාව)', 'en_ER' => 'ඉංග්‍රීසි (එරිත්‍රියාව)', + 'en_ES' => 'ඉංග්‍රීසි (ස්පාඤ්ඤය)', 'en_FI' => 'ඉංග්‍රීසි (ෆින්ලන්තය)', 'en_FJ' => 'ඉංග්‍රීසි (ෆීජී)', 'en_FK' => 'ඉංග්‍රීසි (ෆෝක්ලන්ත දූපත්)', 'en_FM' => 'ඉංග්‍රීසි (මයික්‍රොනීසියාව)', + 'en_FR' => 'ඉංග්‍රීසි (ප්‍රංශය)', 'en_GB' => 'ඉංග්‍රීසි (එක්සත් රාජධානිය)', 'en_GD' => 'ඉංග්‍රීසි (ග්‍රැනඩාව)', 'en_GG' => 'ඉංග්‍රීසි (ගර්න්සිය)', 'en_GH' => 'ඉංග්‍රීසි (ඝානාව)', 'en_GI' => 'ඉංග්‍රීසි (ජිබ්‍රෝල්ටාව)', 'en_GM' => 'ඉංග්‍රීසි (ගැම්බියාව)', + 'en_GS' => 'ඉංග්‍රීසි (දකුණු ජෝර්ජියාව සහ දකුණු සැන්ඩ්විච් දූපත්)', 'en_GU' => 'ඉංග්‍රීසි (ගුවාම්)', 'en_GY' => 'ඉංග්‍රීසි (ගයනාව)', 'en_HK' => 'ඉංග්‍රීසි (හොංකොං විශේෂ පරිපාලන කලාපය චීනය)', + 'en_HU' => 'ඉංග්‍රීසි (හන්ගේරියාව)', 'en_ID' => 'ඉංග්‍රීසි (ඉන්දුනීසියාව)', 'en_IE' => 'ඉංග්‍රීසි (අයර්ලන්තය)', 'en_IL' => 'ඉංග්‍රීසි (ඊශ්‍රායලය)', 'en_IM' => 'ඉංග්‍රීසි (අයිල් ඔෆ් මෑන්)', 'en_IN' => 'ඉංග්‍රීසි (ඉන්දියාව)', 'en_IO' => 'ඉංග්‍රීසි (බ්‍රිතාන්‍ය ඉන්දීය සාගර බල ප්‍රදේශය)', + 'en_IT' => 'ඉංග්‍රීසි (ඉතාලිය)', 'en_JE' => 'ඉංග්‍රීසි (ජර්සි)', 'en_JM' => 'ඉංග්‍රීසි (ජැමෙයිකාව)', 'en_KE' => 'ඉංග්‍රීසි (කෙන්යාව)', @@ -167,15 +173,19 @@ 'en_NF' => 'ඉංග්‍රීසි (නෝෆෝක් දූපත)', 'en_NG' => 'ඉංග්‍රීසි (නයිජීරියාව)', 'en_NL' => 'ඉංග්‍රීසි (නෙදර්ලන්තය)', + 'en_NO' => 'ඉංග්‍රීසි (නෝර්වේ)', 'en_NR' => 'ඉංග්‍රීසි (නාවුරු)', 'en_NU' => 'ඉංග්‍රීසි (නියූ)', 'en_NZ' => 'ඉංග්‍රීසි (නවසීලන්තය)', 'en_PG' => 'ඉංග්‍රීසි (පැපුවා නිව් ගිනියාව)', 'en_PH' => 'ඉංග්‍රීසි (පිලිපීනය)', 'en_PK' => 'ඉංග්‍රීසි (පාකිස්තානය)', + 'en_PL' => 'ඉංග්‍රීසි (පෝලන්තය)', 'en_PN' => 'ඉංග්‍රීසි (පිට්කෙය්න් දූපත්)', 'en_PR' => 'ඉංග්‍රීසි (පුවර්ටෝ රිකෝ)', + 'en_PT' => 'ඉංග්‍රීසි (පෘතුගාලය)', 'en_PW' => 'ඉංග්‍රීසි (පලාවු)', + 'en_RO' => 'ඉංග්‍රීසි (රුමේනියාව)', 'en_RW' => 'ඉංග්‍රීසි (රුවන්ඩාව)', 'en_SB' => 'ඉංග්‍රීසි (සොලමන් දූපත්)', 'en_SC' => 'ඉංග්‍රීසි (සීශෙල්ස්)', @@ -184,6 +194,7 @@ 'en_SG' => 'ඉංග්‍රීසි (සිංගප්පූරුව)', 'en_SH' => 'ඉංග්‍රීසි (ශාන්ත හෙලේනා)', 'en_SI' => 'ඉංග්‍රීසි (ස්ලෝවේනියාව)', + 'en_SK' => 'ඉංග්‍රීසි (ස්ලෝවැකියාව)', 'en_SL' => 'ඉංග්‍රීසි (සියරාලියෝන්)', 'en_SS' => 'ඉංග්‍රීසි (දකුණු සුඩානය)', 'en_SX' => 'ඉංග්‍රීසි (ශාන්ත මාර්ටෙන්)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sk.php b/src/Symfony/Component/Intl/Resources/data/locales/sk.php index 58a4060269623..0520f01432057 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sk.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sk.php @@ -121,29 +121,35 @@ 'en_CM' => 'angličtina (Kamerun)', 'en_CX' => 'angličtina (Vianočný ostrov)', 'en_CY' => 'angličtina (Cyprus)', + 'en_CZ' => 'angličtina (Česko)', 'en_DE' => 'angličtina (Nemecko)', 'en_DK' => 'angličtina (Dánsko)', 'en_DM' => 'angličtina (Dominika)', 'en_ER' => 'angličtina (Eritrea)', + 'en_ES' => 'angličtina (Španielsko)', 'en_FI' => 'angličtina (Fínsko)', 'en_FJ' => 'angličtina (Fidži)', 'en_FK' => 'angličtina (Falklandy)', 'en_FM' => 'angličtina (Mikronézia)', + 'en_FR' => 'angličtina (Francúzsko)', 'en_GB' => 'angličtina (Spojené kráľovstvo)', 'en_GD' => 'angličtina (Grenada)', 'en_GG' => 'angličtina (Guernsey)', 'en_GH' => 'angličtina (Ghana)', 'en_GI' => 'angličtina (Gibraltár)', 'en_GM' => 'angličtina (Gambia)', + 'en_GS' => 'angličtina (Južná Georgia a Južné Sandwichove ostrovy)', 'en_GU' => 'angličtina (Guam)', 'en_GY' => 'angličtina (Guyana)', 'en_HK' => 'angličtina (Hongkong – OAO Číny)', + 'en_HU' => 'angličtina (Maďarsko)', 'en_ID' => 'angličtina (Indonézia)', 'en_IE' => 'angličtina (Írsko)', 'en_IL' => 'angličtina (Izrael)', 'en_IM' => 'angličtina (Ostrov Man)', 'en_IN' => 'angličtina (India)', 'en_IO' => 'angličtina (Britské indickooceánske územie)', + 'en_IT' => 'angličtina (Taliansko)', 'en_JE' => 'angličtina (Jersey)', 'en_JM' => 'angličtina (Jamajka)', 'en_KE' => 'angličtina (Keňa)', @@ -167,15 +173,19 @@ 'en_NF' => 'angličtina (Norfolk)', 'en_NG' => 'angličtina (Nigéria)', 'en_NL' => 'angličtina (Holandsko)', + 'en_NO' => 'angličtina (Nórsko)', 'en_NR' => 'angličtina (Nauru)', 'en_NU' => 'angličtina (Niue)', 'en_NZ' => 'angličtina (Nový Zéland)', 'en_PG' => 'angličtina (Papua-Nová Guinea)', 'en_PH' => 'angličtina (Filipíny)', 'en_PK' => 'angličtina (Pakistan)', + 'en_PL' => 'angličtina (Poľsko)', 'en_PN' => 'angličtina (Pitcairnove ostrovy)', 'en_PR' => 'angličtina (Portoriko)', + 'en_PT' => 'angličtina (Portugalsko)', 'en_PW' => 'angličtina (Palau)', + 'en_RO' => 'angličtina (Rumunsko)', 'en_RW' => 'angličtina (Rwanda)', 'en_SB' => 'angličtina (Šalamúnove ostrovy)', 'en_SC' => 'angličtina (Seychely)', @@ -184,6 +194,7 @@ 'en_SG' => 'angličtina (Singapur)', 'en_SH' => 'angličtina (Svätá Helena)', 'en_SI' => 'angličtina (Slovinsko)', + 'en_SK' => 'angličtina (Slovensko)', 'en_SL' => 'angličtina (Sierra Leone)', 'en_SS' => 'angličtina (Južný Sudán)', 'en_SX' => 'angličtina (Svätý Martin [hol.])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sl.php b/src/Symfony/Component/Intl/Resources/data/locales/sl.php index 9d8f490c62298..9484195652baa 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sl.php @@ -121,29 +121,35 @@ 'en_CM' => 'angleščina (Kamerun)', 'en_CX' => 'angleščina (Božični otok)', 'en_CY' => 'angleščina (Ciper)', + 'en_CZ' => 'angleščina (Češka)', 'en_DE' => 'angleščina (Nemčija)', 'en_DK' => 'angleščina (Danska)', 'en_DM' => 'angleščina (Dominika)', 'en_ER' => 'angleščina (Eritreja)', + 'en_ES' => 'angleščina (Španija)', 'en_FI' => 'angleščina (Finska)', 'en_FJ' => 'angleščina (Fidži)', 'en_FK' => 'angleščina (Falklandski otoki)', 'en_FM' => 'angleščina (Mikronezija)', + 'en_FR' => 'angleščina (Francija)', 'en_GB' => 'angleščina (Združeno kraljestvo)', 'en_GD' => 'angleščina (Grenada)', 'en_GG' => 'angleščina (Guernsey)', 'en_GH' => 'angleščina (Gana)', 'en_GI' => 'angleščina (Gibraltar)', 'en_GM' => 'angleščina (Gambija)', + 'en_GS' => 'angleščina (Južna Georgia in Južni Sandwichevi otoki)', 'en_GU' => 'angleščina (Guam)', 'en_GY' => 'angleščina (Gvajana)', 'en_HK' => 'angleščina (Posebno upravno območje Ljudske republike Kitajske Hongkong)', + 'en_HU' => 'angleščina (Madžarska)', 'en_ID' => 'angleščina (Indonezija)', 'en_IE' => 'angleščina (Irska)', 'en_IL' => 'angleščina (Izrael)', 'en_IM' => 'angleščina (Otok Man)', 'en_IN' => 'angleščina (Indija)', 'en_IO' => 'angleščina (Britansko ozemlje v Indijskem oceanu)', + 'en_IT' => 'angleščina (Italija)', 'en_JE' => 'angleščina (Jersey)', 'en_JM' => 'angleščina (Jamajka)', 'en_KE' => 'angleščina (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'angleščina (Norfolški otok)', 'en_NG' => 'angleščina (Nigerija)', 'en_NL' => 'angleščina (Nizozemska)', + 'en_NO' => 'angleščina (Norveška)', 'en_NR' => 'angleščina (Nauru)', 'en_NU' => 'angleščina (Niue)', 'en_NZ' => 'angleščina (Nova Zelandija)', 'en_PG' => 'angleščina (Papua Nova Gvineja)', 'en_PH' => 'angleščina (Filipini)', 'en_PK' => 'angleščina (Pakistan)', + 'en_PL' => 'angleščina (Poljska)', 'en_PN' => 'angleščina (Pitcairn)', 'en_PR' => 'angleščina (Portoriko)', + 'en_PT' => 'angleščina (Portugalska)', 'en_PW' => 'angleščina (Palau)', + 'en_RO' => 'angleščina (Romunija)', 'en_RW' => 'angleščina (Ruanda)', 'en_SB' => 'angleščina (Salomonovi otoki)', 'en_SC' => 'angleščina (Sejšeli)', @@ -184,6 +194,7 @@ 'en_SG' => 'angleščina (Singapur)', 'en_SH' => 'angleščina (Sveta Helena)', 'en_SI' => 'angleščina (Slovenija)', + 'en_SK' => 'angleščina (Slovaška)', 'en_SL' => 'angleščina (Sierra Leone)', 'en_SS' => 'angleščina (Južni Sudan)', 'en_SX' => 'angleščina (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sn.php b/src/Symfony/Component/Intl/Resources/data/locales/sn.php index e5d11f20b494b..bc6208199655c 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sn.php @@ -70,14 +70,17 @@ 'en_CK' => 'Chirungu (Zvitsuwa zveCook)', 'en_CM' => 'Chirungu (Kameruni)', 'en_CY' => 'Chirungu (Cyprus)', + 'en_CZ' => 'Chirungu (Czech Republic)', 'en_DE' => 'Chirungu (Germany)', 'en_DK' => 'Chirungu (Denmark)', 'en_DM' => 'Chirungu (Dominica)', 'en_ER' => 'Chirungu (Eritrea)', + 'en_ES' => 'Chirungu (Spain)', 'en_FI' => 'Chirungu (Finland)', 'en_FJ' => 'Chirungu (Fiji)', 'en_FK' => 'Chirungu (Zvitsuwa zveFalklands)', 'en_FM' => 'Chirungu (Micronesia)', + 'en_FR' => 'Chirungu (France)', 'en_GB' => 'Chirungu (United Kingdom)', 'en_GD' => 'Chirungu (Grenada)', 'en_GH' => 'Chirungu (Ghana)', @@ -85,10 +88,12 @@ 'en_GM' => 'Chirungu (Gambia)', 'en_GU' => 'Chirungu (Guam)', 'en_GY' => 'Chirungu (Guyana)', + 'en_HU' => 'Chirungu (Hungary)', 'en_ID' => 'Chirungu (Indonesia)', 'en_IE' => 'Chirungu (Ireland)', 'en_IL' => 'Chirungu (Izuraeri)', 'en_IN' => 'Chirungu (India)', + 'en_IT' => 'Chirungu (Italy)', 'en_JM' => 'Chirungu (Jamaica)', 'en_KE' => 'Chirungu (Kenya)', 'en_KI' => 'Chirungu (Kiribati)', @@ -110,15 +115,19 @@ 'en_NF' => 'Chirungu (Chitsuwa cheNorfolk)', 'en_NG' => 'Chirungu (Nigeria)', 'en_NL' => 'Chirungu (Netherlands)', + 'en_NO' => 'Chirungu (Norway)', 'en_NR' => 'Chirungu (Nauru)', 'en_NU' => 'Chirungu (Niue)', 'en_NZ' => 'Chirungu (New Zealand)', 'en_PG' => 'Chirungu (Papua New Guinea)', 'en_PH' => 'Chirungu (Philippines)', 'en_PK' => 'Chirungu (Pakistan)', + 'en_PL' => 'Chirungu (Poland)', 'en_PN' => 'Chirungu (Pitcairn)', 'en_PR' => 'Chirungu (Puerto Rico)', + 'en_PT' => 'Chirungu (Portugal)', 'en_PW' => 'Chirungu (Palau)', + 'en_RO' => 'Chirungu (Romania)', 'en_RW' => 'Chirungu (Rwanda)', 'en_SB' => 'Chirungu (Zvitsuwa zvaSolomon)', 'en_SC' => 'Chirungu (Seychelles)', @@ -127,6 +136,7 @@ 'en_SG' => 'Chirungu (Singapore)', 'en_SH' => 'Chirungu (Saint Helena)', 'en_SI' => 'Chirungu (Slovenia)', + 'en_SK' => 'Chirungu (Slovakia)', 'en_SL' => 'Chirungu (Sierra Leone)', 'en_SZ' => 'Chirungu (Swaziland)', 'en_TC' => 'Chirungu (Zvitsuwa zveTurk neCaico)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/so.php b/src/Symfony/Component/Intl/Resources/data/locales/so.php index c9b6c20d3d12a..34bd1b0cb546f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/so.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/so.php @@ -121,29 +121,35 @@ 'en_CM' => 'Ingiriisi (Kaameruun)', 'en_CX' => 'Ingiriisi (Jasiiradda Kirismas)', 'en_CY' => 'Ingiriisi (Qubrus)', + 'en_CZ' => 'Ingiriisi (Jekiya)', 'en_DE' => 'Ingiriisi (Jarmal)', 'en_DK' => 'Ingiriisi (Denmark)', 'en_DM' => 'Ingiriisi (Dominika)', 'en_ER' => 'Ingiriisi (Eritreeya)', + 'en_ES' => 'Ingiriisi (Isbeyn)', 'en_FI' => 'Ingiriisi (Finland)', 'en_FJ' => 'Ingiriisi (Fiji)', 'en_FK' => 'Ingiriisi (Jaziiradaha Fooklaan)', 'en_FM' => 'Ingiriisi (Mikroneesiya)', + 'en_FR' => 'Ingiriisi (Faransiis)', 'en_GB' => 'Ingiriisi (Boqortooyada Midowday)', 'en_GD' => 'Ingiriisi (Giriinaada)', 'en_GG' => 'Ingiriisi (Guurnsey)', 'en_GH' => 'Ingiriisi (Gaana)', 'en_GI' => 'Ingiriisi (Gibraltar)', 'en_GM' => 'Ingiriisi (Gambiya)', + 'en_GS' => 'Ingiriisi (Jasiiradda Joorjiyada Koonfureed & Sandwij)', 'en_GU' => 'Ingiriisi (Guaam)', 'en_GY' => 'Ingiriisi (Guyana)', 'en_HK' => 'Ingiriisi (Hong Kong)', + 'en_HU' => 'Ingiriisi (Hangari)', 'en_ID' => 'Ingiriisi (Indoneesiya)', 'en_IE' => 'Ingiriisi (Ayrlaand)', 'en_IL' => 'Ingiriisi (Israaʼiil)', 'en_IM' => 'Ingiriisi (Jasiiradda Isle of Man)', 'en_IN' => 'Ingiriisi (Hindiya)', 'en_IO' => 'Ingiriisi (Dhul xadeedka Badweynta Hindiya ee Ingiriiska)', + 'en_IT' => 'Ingiriisi (Talyaani)', 'en_JE' => 'Ingiriisi (Jaarsey)', 'en_JM' => 'Ingiriisi (Jamaaika)', 'en_KE' => 'Ingiriisi (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Ingiriisi (Jasiiradda Noorfolk)', 'en_NG' => 'Ingiriisi (Nayjeeriya)', 'en_NL' => 'Ingiriisi (Nederlaands)', + 'en_NO' => 'Ingiriisi (Noorweey)', 'en_NR' => 'Ingiriisi (Nauru)', 'en_NU' => 'Ingiriisi (Niue)', 'en_NZ' => 'Ingiriisi (Niyuusiilaand)', 'en_PG' => 'Ingiriisi (Babwa Niyuu Gini)', 'en_PH' => 'Ingiriisi (Filibiin)', 'en_PK' => 'Ingiriisi (Bakistaan)', + 'en_PL' => 'Ingiriisi (Booland)', 'en_PN' => 'Ingiriisi (Bitkairn)', 'en_PR' => 'Ingiriisi (Bueerto Riiko)', + 'en_PT' => 'Ingiriisi (Bortugaal)', 'en_PW' => 'Ingiriisi (Balaaw)', + 'en_RO' => 'Ingiriisi (Rumaaniya)', 'en_RW' => 'Ingiriisi (Ruwanda)', 'en_SB' => 'Ingiriisi (Jasiiradda Solomon)', 'en_SC' => 'Ingiriisi (Sishelis)', @@ -184,6 +194,7 @@ 'en_SG' => 'Ingiriisi (Singaboor)', 'en_SH' => 'Ingiriisi (Saynt Helena)', 'en_SI' => 'Ingiriisi (Islofeeniya)', + 'en_SK' => 'Ingiriisi (Islofaakiya)', 'en_SL' => 'Ingiriisi (Siraaliyoon)', 'en_SS' => 'Ingiriisi (Koonfur Suudaan)', 'en_SX' => 'Ingiriisi (Siint Maarteen)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sq.php b/src/Symfony/Component/Intl/Resources/data/locales/sq.php index 25bb9c0bf2793..7b110ea42e6fd 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sq.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sq.php @@ -121,29 +121,35 @@ 'en_CM' => 'anglisht (Kamerun)', 'en_CX' => 'anglisht (Ishulli i Krishtlindjes)', 'en_CY' => 'anglisht (Qipro)', + 'en_CZ' => 'anglisht (Çeki)', 'en_DE' => 'anglisht (Gjermani)', 'en_DK' => 'anglisht (Danimarkë)', 'en_DM' => 'anglisht (Dominikë)', 'en_ER' => 'anglisht (Eritre)', + 'en_ES' => 'anglisht (Spanjë)', 'en_FI' => 'anglisht (Finlandë)', 'en_FJ' => 'anglisht (Fixhi)', 'en_FK' => 'anglisht (Ishujt Falkland)', 'en_FM' => 'anglisht (Mikronezi)', + 'en_FR' => 'anglisht (Francë)', 'en_GB' => 'anglisht (Mbretëria e Bashkuar)', 'en_GD' => 'anglisht (Granadë)', 'en_GG' => 'anglisht (Gernsej)', 'en_GH' => 'anglisht (Ganë)', 'en_GI' => 'anglisht (Gjibraltar)', 'en_GM' => 'anglisht (Gambi)', + 'en_GS' => 'anglisht (Xhorxha Jugore dhe Ishujt Senduiçë të Jugut)', 'en_GU' => 'anglisht (Guam)', 'en_GY' => 'anglisht (Guajanë)', 'en_HK' => 'anglisht (RPA i Hong-Kongut)', + 'en_HU' => 'anglisht (Hungari)', 'en_ID' => 'anglisht (Indonezi)', 'en_IE' => 'anglisht (Irlandë)', 'en_IL' => 'anglisht (Izrael)', 'en_IM' => 'anglisht (Ishulli i Manit)', 'en_IN' => 'anglisht (Indi)', 'en_IO' => 'anglisht (Territori Britanik i Oqeanit Indian)', + 'en_IT' => 'anglisht (Itali)', 'en_JE' => 'anglisht (Xhersej)', 'en_JM' => 'anglisht (Xhamajkë)', 'en_KE' => 'anglisht (Kenia)', @@ -167,15 +173,19 @@ 'en_NF' => 'anglisht (Ishulli Norfolk)', 'en_NG' => 'anglisht (Nigeri)', 'en_NL' => 'anglisht (Holandë)', + 'en_NO' => 'anglisht (Norvegji)', 'en_NR' => 'anglisht (Nauru)', 'en_NU' => 'anglisht (Niue)', 'en_NZ' => 'anglisht (Zelandë e Re)', 'en_PG' => 'anglisht (Guineja e Re-Papua)', 'en_PH' => 'anglisht (Filipine)', 'en_PK' => 'anglisht (Pakistan)', + 'en_PL' => 'anglisht (Poloni)', 'en_PN' => 'anglisht (Ishujt Pitkern)', 'en_PR' => 'anglisht (Porto-Riko)', + 'en_PT' => 'anglisht (Portugali)', 'en_PW' => 'anglisht (Palau)', + 'en_RO' => 'anglisht (Rumani)', 'en_RW' => 'anglisht (Ruandë)', 'en_SB' => 'anglisht (Ishujt Solomon)', 'en_SC' => 'anglisht (Sejshelle)', @@ -184,6 +194,7 @@ 'en_SG' => 'anglisht (Singapor)', 'en_SH' => 'anglisht (Shën-Elenë)', 'en_SI' => 'anglisht (Slloveni)', + 'en_SK' => 'anglisht (Sllovaki)', 'en_SL' => 'anglisht (Sierra-Leone)', 'en_SS' => 'anglisht (Sudani i Jugut)', 'en_SX' => 'anglisht (Sint-Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr.php b/src/Symfony/Component/Intl/Resources/data/locales/sr.php index 2e07e2d9bec5a..0d8154371463d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr.php @@ -121,29 +121,35 @@ 'en_CM' => 'енглески (Камерун)', 'en_CX' => 'енглески (Божићно Острво)', 'en_CY' => 'енглески (Кипар)', + 'en_CZ' => 'енглески (Чешка)', 'en_DE' => 'енглески (Немачка)', 'en_DK' => 'енглески (Данска)', 'en_DM' => 'енглески (Доминика)', 'en_ER' => 'енглески (Еритреја)', + 'en_ES' => 'енглески (Шпанија)', 'en_FI' => 'енглески (Финска)', 'en_FJ' => 'енглески (Фиџи)', 'en_FK' => 'енглески (Фокландска Острва)', 'en_FM' => 'енглески (Микронезија)', + 'en_FR' => 'енглески (Француска)', 'en_GB' => 'енглески (Уједињено Краљевство)', 'en_GD' => 'енглески (Гренада)', 'en_GG' => 'енглески (Гернзи)', 'en_GH' => 'енглески (Гана)', 'en_GI' => 'енглески (Гибралтар)', 'en_GM' => 'енглески (Гамбија)', + 'en_GS' => 'енглески (Јужна Џорџија и Јужна Сендвичка Острва)', 'en_GU' => 'енглески (Гуам)', 'en_GY' => 'енглески (Гвајана)', 'en_HK' => 'енглески (САР Хонгконг [Кина])', + 'en_HU' => 'енглески (Мађарска)', 'en_ID' => 'енглески (Индонезија)', 'en_IE' => 'енглески (Ирска)', 'en_IL' => 'енглески (Израел)', 'en_IM' => 'енглески (Острво Ман)', 'en_IN' => 'енглески (Индија)', 10000 'en_IO' => 'енглески (Британска територија Индијског океана)', + 'en_IT' => 'енглески (Италија)', 'en_JE' => 'енглески (Џерзи)', 'en_JM' => 'енглески (Јамајка)', 'en_KE' => 'енглески (Кенија)', @@ -167,15 +173,19 @@ 'en_NF' => 'енглески (Острво Норфок)', 'en_NG' => 'енглески (Нигерија)', 'en_NL' => 'енглески (Холандија)', + 'en_NO' => 'енглески (Норвешка)', 'en_NR' => 'енглески (Науру)', 'en_NU' => 'енглески (Ниуе)', 'en_NZ' => 'енглески (Нови Зеланд)', 'en_PG' => 'енглески (Папуа Нова Гвинеја)', 'en_PH' => 'енглески (Филипини)', 'en_PK' => 'енглески (Пакистан)', + 'en_PL' => 'енглески (Пољска)', 'en_PN' => 'енглески (Питкерн)', 'en_PR' => 'енглески (Порторико)', + 'en_PT' => 'енглески (Португалија)', 'en_PW' => 'енглески (Палау)', + 'en_RO' => 'енглески (Румунија)', 'en_RW' => 'енглески (Руанда)', 'en_SB' => 'енглески (Соломонска Острва)', 'en_SC' => 'енглески (Сејшели)', @@ -184,6 +194,7 @@ 'en_SG' => 'енглески (Сингапур)', 'en_SH' => 'енглески (Света Јелена)', 'en_SI' => 'енглески (Словенија)', + 'en_SK' => 'енглески (Словачка)', 'en_SL' => 'енглески (Сијера Леоне)', 'en_SS' => 'енглески (Јужни Судан)', 'en_SX' => 'енглески (Свети Мартин [Холандија])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_BA.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_BA.php index e02359359b4b5..4b262bc1cb2f7 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_BA.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_BA.php @@ -23,8 +23,10 @@ 'de_LU' => 'њемачки (Луксембург)', 'en_001' => 'енглески (свијет)', 'en_CC' => 'енглески (Кокосова [Килинг] острва)', + 'en_CZ' => 'енглески (Чешка Република)', 'en_DE' => 'енглески (Њемачка)', 'en_FK' => 'енглески (Фокландска острва)', + 'en_GS' => 'енглески (Јужна Џорџија и Јужна Сендвичка острва)', 'en_GU' => 'енглески (Гвам)', 'en_HK' => 'енглески (Хонгконг [САО Кине])', 'en_MP' => 'енглески (Сјеверна Маријанска острва)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_ME.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_ME.php index 60af9bd9b6c45..aa6e212ca998b 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_ME.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_ME.php @@ -11,6 +11,7 @@ 'bn_IN' => 'бангла (Индија)', 'cs_CZ' => 'чешки (Чешка Република)', 'de_DE' => 'немачки (Њемачка)', + 'en_CZ' => 'енглески (Чешка Република)', 'en_DE' => 'енглески (Њемачка)', 'en_KN' => 'енглески (Свети Китс и Невис)', 'en_UM' => 'енглески (Мања удаљена острва САД)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_XK.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_XK.php index 4c4e79ed0f373..a781c25d14b79 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_XK.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Cyrl_XK.php @@ -8,6 +8,7 @@ 'bn_BD' => 'бангла (Бангладеш)', 'bn_IN' => 'бангла (Индија)', 'cs_CZ' => 'чешки (Чешка Република)', + 'en_CZ' => 'енглески (Чешка Република)', 'en_HK' => 'енглески (САР Хонгконг)', 'en_KN' => 'енглески (Свети Китс и Невис)', 'en_MO' => 'енглески (САР Макао)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn.php index a464de387d264..807b79b00e12a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn.php @@ -121,29 +121,35 @@ 'en_CM' => 'engleski (Kamerun)', 'en_CX' => 'engleski (Božićno Ostrvo)', 'en_CY' => 'engleski (Kipar)', + 'en_CZ' => 'engleski (Češka)', 'en_DE' => 'engleski (Nemačka)', 'en_DK' => 'engleski (Danska)', 'en_DM' => 'engleski (Dominika)', 'en_ER' => 'engleski (Eritreja)', + 'en_ES' => 'engleski (Španija)', 'en_FI' => 'engleski (Finska)', 'en_FJ' => 'engleski (Fidži)', 'en_FK' => 'engleski (Foklandska Ostrva)', 'en_FM' => 'engleski (Mikronezija)', + 'en_FR' => 'engleski (Francuska)', 'en_GB' => 'engleski (Ujedinjeno Kraljevstvo)', 'en_GD' => 'engleski (Grenada)', 'en_GG' => 'engleski (Gernzi)', 'en_GH' => 'engleski (Gana)', 'en_GI' => 'engleski (Gibraltar)', 'en_GM' => 'engleski (Gambija)', + 'en_GS' => 'engleski (Južna Džordžija i Južna Sendvička Ostrva)', 'en_GU' => 'engleski (Guam)', 'en_GY' => 'engleski (Gvajana)', 'en_HK' => 'engleski (SAR Hongkong [Kina])', + 'en_HU' => 'engleski (Mađarska)', 'en_ID' => 'engleski (Indonezija)', 'en_IE' => 'engleski (Irska)', 'en_IL' => 'engleski (Izrael)', 'en_IM' => 'engleski (Ostrvo Man)', 'en_IN' => 'engleski (Indija)', 'en_IO' => 'engleski (Britanska teritorija Indijskog okeana)', + 'en_IT' => 'engleski (Italija)', 'en_JE' => 'engleski (Džerzi)', 'en_JM' => 'engleski (Jamajka)', 'en_KE' => 'engleski (Kenija)', @@ -167,15 +173,19 @@ 'en_NF' => 'engleski (Ostrvo Norfok)', 'en_NG' => 'engleski (Nigerija)', 'en_NL' => 'engleski (Holandija)', + 'en_NO' => 'engleski (Norveška)', 'en_NR' => 'engleski (Nauru)', 'en_NU' => 'engleski (Niue)', 'en_NZ' => 'engleski (Novi Zeland)', 'en_PG' => 'engleski (Papua Nova Gvineja)', 'en_PH' => 'engleski (Filipini)', 'en_PK' => 'engleski (Pakistan)', + 'en_PL' => 'engleski (Poljska)', 'en_PN' => 'engleski (Pitkern)', 'en_PR' => 'engleski (Portoriko)', + 'en_PT' => 'engleski (Portugalija)', 'en_PW' => 'engleski (Palau)', + 'en_RO' => 'engleski (Rumunija)', 'en_RW' => 'engleski (Ruanda)', 'en_SB' => 'engleski (Solomonska Ostrva)', 'en_SC' => 'engleski (Sejšeli)', @@ -184,6 +194,7 @@ 'en_SG' => 'engleski (Singapur)', 'en_SH' => 'engleski (Sveta Jelena)', 'en_SI' => 'engleski (Slovenija)', + 'en_SK' => 'engleski (Slovačka)', 'en_SL' => 'engleski (Sijera Leone)', 'en_SS' => 'engleski (Južni Sudan)', 'en_SX' => 'engleski (Sveti Martin [Holandija])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_BA.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_BA.php index b345938efe9d0..40894322a8894 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_BA.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_BA.php @@ -23,8 +23,10 @@ 'de_LU' => 'njemački (Luksemburg)', 'en_001' => 'engleski (svijet)', 'en_CC' => 'engleski (Kokosova [Kiling] ostrva)', + 'en_CZ' => 'engleski (Češka Republika)', 'en_DE' => 'engleski (Njemačka)', 'en_FK' => 'engleski (Foklandska ostrva)', + 'en_GS' => 'engleski (Južna Džordžija i Južna Sendvička ostrva)', 'en_GU' => 'engleski (Gvam)', 'en_HK' => 'engleski (Hongkong [SAO Kine])', 'en_MP' => 'engleski (Sjeverna Marijanska ostrva)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_ME.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_ME.php index ab3dbb6866672..e3b9dddd260d5 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_ME.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_ME.php @@ -11,6 +11,7 @@ 'bn_IN' => 'bangla (Indija)', 'cs_CZ' => 'češki (Češka Republika)', 'de_DE' => 'nemački (Njemačka)', + 'en_CZ' => 'engleski (Češka Republika)', 'en_DE' => 'engleski (Njemačka)', 'en_KN' => 'engleski (Sveti Kits i Nevis)', 'en_UM' => 'engleski (Manja udaljena ostrva SAD)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_XK.php b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_XK.php index 765cba47a5d26..64af19a718e96 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_XK.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sr_Latn_XK.php @@ -8,6 +8,7 @@ 'bn_BD' => 'bangla (Bangladeš)', 'bn_IN' => 'bangla (Indija)', 'cs_CZ' => 'češki (Češka Republika)', + 'en_CZ' => 'engleski (Češka Republika)', 'en_HK' => 'engleski (SAR Hongkong)', 'en_KN' => 'engleski (Sveti Kits i Nevis)', 'en_MO' => 'engleski (SAR Makao)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/su.php b/src/Symfony/Component/Intl/Resources/data/locales/su.php index 617194ab8d990..f866b1c88f241 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/su.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/su.php @@ -7,9 +7,11 @@ 'de_IT' => 'Jérman (Italia)', 'en' => 'Inggris', 'en_DE' => 'Inggris (Jérman)', + 'en_FR' => 'Inggris (Prancis)', 'en_GB' => 'Inggris (Britania Raya)', 'en_ID' => 'Inggris (Indonesia)', 'en_IN' => 'Inggris (India)', + 'en_IT' => 'Inggris (Italia)', 'en_US' => 'Inggris (Amérika Sarikat)', 'es' => 'Spanyol', 'es_BR' => 'Spanyol (Brasil)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sv.php b/src/Symfony/Component/Intl/Resources/data/locales/sv.php index b64930929b74e..6abfebc2ebd03 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sv.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sv.php @@ -121,29 +121,35 @@ 'en_CM' => 'engelska (Kamerun)', 'en_CX' => 'engelska (Julön)', 'en_CY' => 'engelska (Cypern)', + 'en_CZ' => 'engelska (Tjeckien)', 'en_DE' => 'engelska (Tyskland)', 'en_DK' => 'engelska (Danmark)', 'en_DM' => 'engelska (Dominica)', 'en_ER' => 'engelska (Eritrea)', + 'en_ES' => 'engelska (Spanien)', 'en_FI' => 'engelska (Finland)', 'en_FJ' => 'engelska (Fiji)', 'en_FK' => 'engelska (Falklandsöarna)', 'en_FM' => 'engelska (Mikronesien)', + 'en_FR' => 'engelska (Frankrike)', 'en_GB' => 'engelska (Storbritannien)', 'en_GD' => 'engelska (Grenada)', 'en_GG' => 'engelska (Guernsey)', 'en_GH' => 'engelska (Ghana)', 'en_GI' => 'engelska (Gibraltar)', 'en_GM' => 'engelska (Gambia)', + 'en_GS' => 'engelska (Sydgeorgien och Sydsandwichöarna)', 'en_GU' => 'engelska (Guam)', 'en_GY' => 'engelska (Guyana)', 'en_HK' => 'engelska (Hongkong SAR)', + 'en_HU' => 'engelska (Ungern)', 'en_ID' => 'engelska (Indonesien)', 'en_IE' => 'engelska (Irland)', 'en_IL' => 'engelska (Israel)', 'en_IM' => 'engelska (Isle of Man)', 'en_IN' => 'engelska (Indien)', 'en_IO' => 'engelska (Brittiska territoriet i Indiska oceanen)', + 'en_IT' => 'engelska (Italien)', 'en_JE' => 'engelska (Jersey)', 'en_JM' => 'engelska (Jamaica)', 'en_KE' => 'engelska (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'engelska (Norfolkön)', 'en_NG' => 'engelska (Nigeria)', 'en_NL' => 'engelska (Nederländerna)', + 'en_NO' => 'engelska (Norge)', 'en_NR' => 'engelska (Nauru)', 'en_NU' => 'engelska (Niue)', 'en_NZ' => 'engelska (Nya Zeeland)', 'en_PG' => 'engelska (Papua Nya Guinea)', 'en_PH' => 'engelska (Filippinerna)', 'en_PK' => 'engelska (Pakistan)', + 'en_PL' => 'engelska (Polen)', 'en_PN' => 'engelska (Pitcairnöarna)', 'en_PR' => 'engelska (Puerto Rico)', + 'en_PT' => 'engelska (Portugal)', 'en_PW' => 'engelska (Palau)', + 'en_RO' => 'engelska (Rumänien)', 'en_RW' => 'engelska (Rwanda)', 'en_SB' => 'engelska (Salomonöarna)', 'en_SC' => 'engelska (Seychellerna)', @@ -184,6 +194,7 @@ 'en_SG' => 'engelska (Singapore)', 'en_SH' => 'engelska (S:t Helena)', 'en_SI' => 'engelska (Slovenien)', + 'en_SK' => 'engelska (Slovakien)', 'en_SL' => 'engelska (Sierra Leone)', 'en_SS' => 'engelska (Sydsudan)', 'en_SX' => 'engelska (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sw.php b/src/Symfony/Component/Intl/Resources/data/locales/sw.php index 84aa1461b290f..57674bd2c50e1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sw.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sw.php @@ -121,29 +121,35 @@ 'en_CM' => 'Kiingereza (Kameruni)', 'en_CX' => 'Kiingereza (Kisiwa cha Krismasi)', 'en_CY' => 'Kiingereza (Saiprasi)', + 'en_CZ' => 'Kiingereza (Chechia)', 'en_DE' => 'Kiingereza (Ujerumani)', 'en_DK' => 'Kiingereza (Denmaki)', 'en_DM' => 'Kiingereza (Dominika)', 'en_ER' => 'Kiingereza (Eritrea)', + 'en_ES' => 'Kiingereza (Uhispania)', 'en_FI' => 'Kiingereza (Ufini)', 'en_FJ' => 'Kiingereza (Fiji)', 'en_FK' => 'Kiingereza (Visiwa vya Falkland)', 'en_FM' => 'Kiingereza (Mikronesia)', + 'en_FR' => 'Kiingereza (Ufaransa)', 'en_GB' => 'Kiingereza (Ufalme wa Muungano)', 'en_GD' => 'Kiingereza (Grenada)', 'en_GG' => 'Kiingereza (Guernsey)', 'en_GH' => 'Kiingereza (Ghana)', 'en_GI' => 'Kiingereza (Gibraltar)', 'en_GM' => 'Kiingereza (Gambia)', + 'en_GS' => 'Kiingereza (Visiwa vya Georgia Kusini na Sandwich Kusini)', 'en_GU' => 'Kiingereza (Guam)', 'en_GY' => 'Kiingereza (Guyana)', 'en_HK' => 'Kiingereza (Hong Kong SAR China)', + 'en_HU' => 'Kiingereza (Hungaria)', 'en_ID' => 'Kiingereza (Indonesia)', 'en_IE' => 'Kiingereza (Ayalandi)', 'en_IL' => 'Kiingereza (Israeli)', 'en_IM' => 'Kiingereza (Kisiwa cha Man)', 'en_IN' => 'Kiingereza (India)', 'en_IO' => 'Kiingereza (Eneo la Uingereza katika Bahari Hindi)', + 'en_IT' => 'Kiingereza (Italia)', 'en_JE' => 'Kiingereza (Jersey)', 'en_JM' => 'Kiingereza (Jamaika)', 'en_KE' => 'Kiingereza (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Kiingereza (Kisiwa cha Norfolk)', 'en_NG' => 'Kiingereza (Nigeria)', 'en_NL' => 'Kiingereza (Uholanzi)', + 'en_NO' => 'Kiingereza (Norway)', 'en_NR' => 'Kiingereza (Nauru)', 'en_NU' => 'Kiingereza (Niue)', 'en_NZ' => 'Kiingereza (Nyuzilandi)', 'en_PG' => 'Kiingereza (Papua New Guinea)', 'en_PH' => 'Kiingereza (Ufilipino)', 'en_PK' => 'Kiingereza (Pakistani)', + 'en_PL' => 'Kiingereza (Poland)', 'en_PN' => 'Kiingereza (Visiwa vya Pitcairn)', 'en_PR' => 'Kiingereza (Puerto Rico)', + 'en_PT' => 'Kiingereza (Ureno)', 'en_PW' => 'Kiingereza (Palau)', + 'en_RO' => 'Kiingereza (Romania)', 'en_RW' => 'Kiingereza (Rwanda)', 'en_SB' => 'Kiingereza (Visiwa vya Solomon)', 'en_SC' => 'Kiingereza (Ushelisheli)', @@ -184,6 +194,7 @@ 'en_SG' => 'Kiingereza (Singapore)', 'en_SH' => 'Kiingereza (St. Helena)', 'en_SI' => 'Kiingereza (Slovenia)', + 'en_SK' => 'Kiingereza (Slovakia)', 'en_SL' => 'Kiingereza (Siera Leoni)', 'en_SS' => 'Kiingereza (Sudan Kusini)', 'en_SX' => 'Kiingereza (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sw_CD.php b/src/Symfony/Component/Intl/Resources/data/locales/sw_CD.php index 4942ed99d3ea0..e09df33cffb47 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sw_CD.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sw_CD.php @@ -21,6 +21,7 @@ 'de_LU' => 'Kijerumani (Lasembagi)', 'en_CX' => 'Kiingereza (Kisiwa cha Christmas)', 'en_NG' => 'Kiingereza (Nijeria)', + 'en_NO' => 'Kiingereza (Norwe)', 'en_PR' => 'Kiingereza (Puetoriko)', 'en_SD' => 'Kiingereza (Sudani)', 'es_PR' => 'Kihispania (Puetoriko)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/sw_KE.php b/src/Symfony/Component/Intl/Resources/data/locales/sw_KE.php index 3c08492b0b982..8ab1b56d1d1f7 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/sw_KE.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/sw_KE.php @@ -36,10 +36,13 @@ 'en_BB' => 'Kiingereza (Babados)', 'en_BS' => 'Kiingereza (Bahamas)', 'en_CC' => 'Kiingereza (Visiwa vya Kokos [Keeling])', + 'en_GS' => 'Kiingereza (Visiwa vya Jojia Kusini na Sandwich Kusini)', 'en_GU' => 'Kiingereza (Guami)', 'en_LS' => 'Kiingereza (Lesotho)', 'en_MS' => 'Kiingereza (Montserati)', + 'en_NO' => 'Kiingereza (Norwe)', 'en_PG' => 'Kiingereza (Papua Guinea Mpya)', + 'en_PL' => 'Kiingereza (Polandi)', 'en_PR' => 'Kiingereza (Pwetoriko)', 'en_SG' => 'Kiingereza (Singapuri)', 'en_VG' => 'Kiingereza (Visiwa vya Virgin vya Uingereza)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ta.php b/src/Symfony/Component/Intl/Resources/data/locales/ta.php index 99c8ac78943ee..e04fd352b7f38 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ta.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ta.php @@ -121,29 +121,35 @@ 'en_CM' => 'ஆங்கிலம் (கேமரூன்)', 'en_CX' => 'ஆங்கிலம் (கிறிஸ்துமஸ் தீவு)', 'en_CY' => 'ஆங்கிலம் (சைப்ரஸ்)', + 'en_CZ' => 'ஆங்கிலம் (செசியா)', 'en_DE' => 'ஆங்கிலம் (ஜெர்மனி)', 'en_DK' => 'ஆங்கிலம் (டென்மார்க்)', 'en_DM' => 'ஆங்கிலம் (டொமினிகா)', 'en_ER' => 'ஆங்கிலம் (எரிட்ரியா)', + 'en_ES' => 'ஆங்கிலம் (ஸ்பெயின்)', 'en_FI' => 'ஆங்கிலம் (பின்லாந்து)', 'en_FJ' => 'ஆங்கிலம் (ஃபிஜி)', 'en_FK' => 'ஆங்கிலம் (ஃபாக்லாந்து தீவுகள்)', 'en_FM' => 'ஆங்கிலம் (மைக்ரோனேஷியா)', + 'en_FR' => 'ஆங்கிலம் (பிரான்ஸ்)', 'en_GB' => 'ஆங்கிலம் (யுனைடெட் கிங்டம்)', 'en_GD' => 'ஆங்கிலம் (கிரனெடா)', 'en_GG' => 'ஆங்கிலம் (கெர்ன்சி)', 'en_GH' => 'ஆங்கிலம் (கானா)', 'en_GI' => 'ஆங்கிலம் (ஜிப்ரால்டர்)', 'en_GM' => 'ஆங்கிலம் (காம்பியா)', + 'en_GS' => 'ஆங்கிலம் (தெற்கு ஜார்ஜியா மற்றும் தெற்கு சாண்ட்விச் தீவுகள்)', 'en_GU' => 'ஆங்கிலம் (குவாம்)', 'en_GY' => 'ஆங்கிலம் (கயானா)', 'en_HK' => 'ஆங்கிலம் (ஹாங்காங் எஸ்ஏஆர் சீனா)', + 'en_HU' => 'ஆங்கிலம் (ஹங்கேரி)', 'en_ID' => 'ஆங்கிலம் (இந்தோனேசியா)', 'en_IE' => 'ஆங்கிலம் (அயர்லாந்து)', 'en_IL' => 'ஆங்கிலம் (இஸ்ரேல்)', 'en_IM' => 'ஆங்கிலம் (ஐல் ஆஃப் மேன்)', 'en_IN' => 'ஆங்கிலம் (இந்தியா)', 'en_IO' => 'ஆங்கிலம் (பிரிட்டிஷ் இந்தியப் பெருங்கடல் பிரதேசம்)', + 'en_IT' => 'ஆங்கிலம் (இத்தாலி)', 'en_JE' => 'ஆங்கிலம் (ஜெர்சி)', 'en_JM' => 'ஆங்கிலம் (ஜமைகா)', 'en_KE' => 'ஆங்கிலம் (கென்யா)', @@ -167,15 +173,19 @@ 'en_NF' => 'ஆங்கிலம் (நார்ஃபோக் தீவு)', 'en_NG' => 'ஆங்கிலம் (நைஜீரியா)', 'en_NL' => 'ஆங்கிலம் (நெதர்லாந்து)', + 'en_NO' => 'ஆங்கிலம் (நார்வே)', 'en_NR' => 'ஆங்கிலம் (நௌரு)', 'en_NU' => 'ஆங்கிலம் (நியுவே)', 'en_NZ' => 'ஆங்கிலம் (நியூசிலாந்து)', 'en_PG' => 'ஆங்கிலம் (பப்புவா நியூ கினியா)', 'en_PH' => 'ஆங்கிலம் (பிலிப்பைன்ஸ்)', 'en_PK' => 'ஆங்கிலம் (பாகிஸ்தான்)', + 'en_PL' => 'ஆங்கிலம் (போலந்து)', 'en_PN' => 'ஆங்கிலம் (பிட்கெய்ர்ன் தீவுகள்)', 'en_PR' => 'ஆங்கிலம் (பியூர்டோ ரிகோ)', + 'en_PT' => 'ஆங்கிலம் (போர்ச்சுக்கல்)', 'en_PW' => 'ஆங்கிலம் (பாலோ)', + 'en_RO' => 'ஆங்கிலம் (ருமேனியா)', 'en_RW' => 'ஆங்கிலம் (ருவாண்டா)', 'en_SB' => 'ஆங்கிலம் (சாலமன் தீவுகள்)', 'en_SC' => 'ஆங்கிலம் (சீஷெல்ஸ்)', @@ -184,6 +194,7 @@ 'en_SG' => 'ஆங்கிலம் (சிங்கப்பூர்)', 'en_SH' => 'ஆங்கிலம் (செயின்ட் ஹெலெனா)', 'en_SI' => 'ஆங்கிலம் (ஸ்லோவேனியா)', + 'en_SK' => 'ஆங்கிலம் (ஸ்லோவாகியா)', 'en_SL' => 'ஆங்கிலம் (சியாரா லியோன்)', 'en_SS' => 'ஆங்கிலம் (தெற்கு சூடான்)', 'en_SX' => 'ஆங்கிலம் (சின்ட் மார்டென்)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/te.php b/src/Symfony/Component/Intl/Resources/data/locales/te.php index 2d81f1f167076..1098bb74cd73e 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/te.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/te.php @@ -121,29 +121,35 @@ 'en_CM' => 'ఇంగ్లీష్ (కామెరూన్)', 'en_CX' => 'ఇంగ్లీష్ (క్రిస్మస్ దీవి)', 'en_CY' => 'ఇంగ్లీష్ (సైప్రస్)', + 'en_CZ' => 'ఇంగ్లీష్ (చెకియా)', 'en_DE' => 'ఇంగ్లీష్ (జర్మనీ)', 'en_DK' => 'ఇంగ్లీష్ (డెన్మార్క్)', 'en_DM' => 'ఇంగ్లీష్ (డొమినికా)', 'en_ER' => 'ఇంగ్లీష్ (ఎరిట్రియా)', + 'en_ES' => 'ఇంగ్లీష్ (స్పెయిన్)', 'en_FI' => 'ఇంగ్లీష్ (ఫిన్లాండ్)', 'en_FJ' => 'ఇంగ్లీష్ (ఫిజీ)', 'en_FK' => 'ఇంగ్లీష్ (ఫాక్‌ల్యాండ్ దీవులు)', 'en_FM' => 'ఇంగ్లీష్ (మైక్రోనేషియా)', + 'en_FR' => 'ఇంగ్లీష్ (ఫ్రాన్స్‌)', 'en_GB' => 'ఇంగ్లీష్ (యునైటెడ్ కింగ్‌డమ్)', 'en_GD' => 'ఇంగ్లీష్ (గ్రెనడా)', 'en_GG' => 'ఇంగ్లీష్ (గర్న్‌సీ)', 'en_GH' => 'ఇంగ్లీష్ (ఘనా)', 'en_GI' => 'ఇంగ్లీష్ (జిబ్రాల్టర్)', 'en_GM' => 'ఇంగ్లీష్ (గాంబియా)', + 'en_GS' => 'ఇంగ్లీష్ (దక్షిణ జార్జియా మరియు దక్షిణ శాండ్విచ్ దీవులు)', 'en_GU' => 'ఇంగ్లీష్ (గ్వామ్)', 'en_GY' => 'ఇంగ్లీష్ (గయానా)', 'en_HK' => 'ఇంగ్లీష్ (హాంకాంగ్ ఎస్ఏఆర్ చైనా)', + 'en_HU' => 'ఇంగ్లీష్ (హంగేరీ)', 'en_ID' => 'ఇంగ్లీష్ (ఇండోనేషియా)', 'en_IE' => 'ఇంగ్లీష్ (ఐర్లాండ్)', 'en_IL' => 'ఇంగ్లీష్ (ఇజ్రాయెల్)', 'en_IM' => 'ఇంగ్లీష్ (ఐల్ ఆఫ్ మాన్)', 'en_IN' => 'ఇంగ్లీష్ (భారతదేశం)', 'en_IO' => 'ఇంగ్లీష్ (బ్రిటిష్ హిందూ మహాసముద్ర ప్రాంతం)', + 'en_IT' => 'ఇంగ్లీష్ (ఇటలీ)', 'en_JE' => 'ఇంగ్లీష్ (జెర్సీ)', 'en_JM' => 'ఇంగ్లీష్ (జమైకా)', 'en_KE' => 'ఇంగ్లీష్ (కెన్యా)', @@ -167,15 +173,19 @@ 'en_NF' => 'ఇంగ్లీష్ (నార్ఫోక్ దీవి)', 'en_NG' => 'ఇంగ్లీష్ (నైజీరియా)', 'en_NL' => 'ఇంగ్లీష్ (నెదర్లాండ్స్)', + 'en_NO' => 'ఇంగ్లీష్ (నార్వే)', 'en_NR' => 'ఇంగ్లీష్ (నౌరు)', 'en_NU' => 'ఇంగ్లీష్ (నియూ)', 'en_NZ' => 'ఇంగ్లీష్ (న్యూజిలాండ్)', 'en_PG' => 'ఇంగ్లీష్ (పాపువా న్యూ గినియా)', 'en_PH' => 'ఇంగ్లీష్ (ఫిలిప్పైన్స్)', 'en_PK' => 'ఇంగ్లీష్ (పాకిస్తాన్)', + 'en_PL' => 'ఇంగ్లీష్ (పోలాండ్)', 'en_PN' => 'ఇంగ్లీష్ (పిట్‌కెయిర్న్ దీవులు)', 'en_PR' => 'ఇంగ్లీష్ (ప్యూర్టో రికో)', + 'en_PT' => 'ఇంగ్లీష్ (పోర్చుగల్)', 'en_PW' => 'ఇంగ్లీష్ (పాలావ్)', + 'en_RO' => 'ఇంగ్లీష్ (రోమేనియా)', 'en_RW' => 'ఇంగ్లీష్ (రువాండా)', 'en_SB' => 'ఇంగ్లీష్ (సోలమన్ దీవులు)', 'en_SC' => 'ఇంగ్లీష్ (సీషెల్స్)', @@ -184,6 +194,7 @@ 'en_SG' => 'ఇంగ్లీష్ (సింగపూర్)', 'en_SH' => 'ఇంగ్లీష్ (సెయింట్ హెలెనా)', 'en_SI' => 'ఇంగ్లీష్ (స్లోవేనియా)', + 'en_SK' => 'ఇంగ్లీష్ (స్లొవేకియా)', 'en_SL' => 'ఇంగ్లీష్ (సియెర్రా లియాన్)', 'en_SS' => 'ఇంగ్లీష్ (దక్షిణ సూడాన్)', 'en_SX' => 'ఇంగ్లీష్ (సింట్ మార్టెన్)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/tg.php b/src/Symfony/Component/Intl/Resources/data/locales/tg.php index 0589d7da8a623..1375923e8d868 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/tg.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/tg.php @@ -110,29 +110,35 @@ 'en_CM' => 'англисӣ (Камерун)', 'en_CX' => 'англисӣ (Ҷазираи Крисмас)', 'en_CY' => 'англисӣ (Кипр)', + 'en_CZ' => 'англисӣ (Ҷумҳурии Чех)', 'en_DE' => 'англисӣ (Германия)', 'en_DK' => 'англисӣ (Дания)', 'en_DM' => 'англисӣ (Доминика)', 'en_ER' => 'англисӣ (Эритрея)', + 'en_ES' => 'англисӣ (Испания)', 'en_FI' => 'англисӣ (Финляндия)', 'en_FJ' => 'англисӣ (Фиҷи)', 'en_FK' => 'англисӣ (Ҷазираҳои Фолкленд)', 'en_FM' => 'англисӣ (Штатҳои Федеративии Микронезия)', + 'en_FR' => 'англисӣ (Фаронса)', 'en_GB' => 'англисӣ (Шоҳигарии Муттаҳида)', 'en_GD' => 'англисӣ (Гренада)', 'en_GG' => 'англисӣ (Гернси)', 'en_GH' => 'англисӣ (Гана)', 'en_GI' => 'англисӣ (Гибралтар)', 'en_GM' => 'англисӣ (Гамбия)', + 'en_GS' => 'англисӣ (Ҷорҷияи Ҷанубӣ ва Ҷазираҳои Сандвич)', 'en_GU' => 'англисӣ (Гуам)', 'en_GY' => 'англисӣ (Гайана)', 'en_HK' => 'англисӣ (Ҳонконг [МММ])', + 'en_HU' => 'англисӣ (Маҷористон)', 'en_ID' => 'англисӣ (Индонезия)', 'en_IE' => 'англисӣ (Ирландия)', 'en_IL' => 'англисӣ (Исроил)', 'en_IM' => 'англисӣ (Ҷазираи Мэн)', 'en_IN' => 'англисӣ (Ҳиндустон)', 'en_IO' => 'англисӣ (Қаламрави Британия дар уқёнуси Ҳинд)', + 'en_IT' => 'англисӣ (Италия)', 'en_JE' => 'англисӣ (Ҷерси)', 'en_JM' => 'англисӣ (Ямайка)', 'en_KE' => 'англисӣ (Кения)', @@ -156,15 +162,19 @@ 'en_NF' => 'англисӣ (Ҷазираи Норфолк)', 'en_NG' => 'англисӣ (Нигерия)', 'en_NL' => 'англисӣ (Нидерландия)', + 'en_NO' => 'англисӣ (Норвегия)', 'en_NR' => 'англисӣ (Науру)', 'en_NU' => 'англисӣ (Ниуэ)', 'en_NZ' => 'англисӣ (Зеландияи Нав)', 'en_PG' => 'англисӣ (Папуа Гвинеяи Нав)', 'en_PH' => 'англисӣ (Филиппин)', 'en_PK' => 'англисӣ (Покистон)', + 'en_PL' => 'англисӣ (Лаҳистон)', 'en_PN' => 'англисӣ (Ҷазираҳои Питкейрн)', 'en_PR' => 'англисӣ (Пуэрто-Рико)', + 'en_PT' => 'англисӣ (Португалия)', 'en_PW' => 'англисӣ (Палау)', + 'en_RO' => 'англисӣ (Руминия)', 'en_RW' => 'англисӣ (Руанда)', 'en_SB' => 'англисӣ (Ҷазираҳои Соломон)', 'en_SC' => 'англисӣ (Сейшел)', @@ -173,6 +183,7 @@ 'en_SG' => 'англисӣ (Сингапур)', 'en_SH' => 'англисӣ (Сент Елена)', 'en_SI' => 'англисӣ (Словения)', + 'en_SK' => 'англисӣ (Словакия)', 'en_SL' => 'англисӣ (Сиерра-Леоне)', 'en_SS' => 'англисӣ (Судони Ҷанубӣ)', 'en_SX' => 'англисӣ (Синт-Маартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/th.php b/src/Symfony/Component/Intl/Resources/data/locales/th.php index 35ba32f87328f..38885b9443e36 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/th.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/th.php @@ -121,29 +121,35 @@ 'en_CM' => 'อังกฤษ (แคเมอรูน)', 'en_CX' => 'อังกฤษ (เกาะคริสต์มาส)', 'en_CY' => 'อังกฤษ (ไซปรัส)', + 'en_CZ' => 'อังกฤษ (เช็ก)', 'en_DE' => 'อังกฤษ (เยอรมนี)', 'en_DK' => 'อังกฤษ (เดนมาร์ก)', 'en_DM' => 'อังกฤษ (โดมินิกา)', 'en_ER' => 'อังกฤษ (เอริเทรีย)', + 'en_ES' => 'อังกฤษ (สเปน)', 'en_FI' => 'อังกฤษ (ฟินแลนด์)', 'en_FJ' => 'อังกฤษ (ฟิจิ)', 'en_FK' => 'อังกฤษ (หมู่เกาะฟอล์กแลนด์)', 'en_FM' => 'อังกฤษ (ไมโครนีเซีย)', + 'en_FR' => 'อังกฤษ (ฝรั่งเศส)', 'en_GB' => 'อังกฤษ (สหราชอาณาจักร)', 'en_GD' => 'อังกฤษ (เกรเนดา)', 'en_GG' => 'อังกฤษ (เกิร์นซีย์)', 'en_GH' => 'อังกฤษ (กานา)', 'en_GI' => 'อังกฤษ (ยิบรอลตาร์)', 'en_GM' => 'อังกฤษ (แกมเบีย)', + 'en_GS' => 'อังกฤษ (เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช)', 'en_GU' => 'อังกฤษ (กวม)', 'en_GY' => 'อังกฤษ (กายอานา)', 'en_HK' => 'อังกฤษ (เขตปกครองพิเศษฮ่องกงแห่งสาธารณรัฐประชาชนจีน)', + 'en_HU' => 'อังกฤษ (ฮังการี)', 'en_ID' => 'อังกฤษ (อินโดนีเซีย)', 'en_IE' => 'อังกฤษ (ไอร์แลนด์)', 'en_IL' => 'อังกฤษ (อิสราเอล)', 'en_IM' => 'อังกฤษ (เกาะแมน)', 'en_IN' => 'อังกฤษ (อินเดีย)', 'en_IO' => 'อังกฤษ (บริติชอินเดียนโอเชียนเทร์ริทอรี)', + 'en_IT' => 'อังกฤษ (อิตาลี)', 'en_JE' => 'อังกฤษ (เจอร์ซีย์)', 'en_JM' => 'อังกฤษ (จาเมกา)', 'en_KE' => 'อังกฤษ (เคนยา)', @@ -167,15 +173,19 @@ 'en_NF' => 'อังกฤษ (เกาะนอร์ฟอล์ก)', 'en_NG' => 'อังกฤษ (ไนจีเรีย)', 'en_NL' => 'อังกฤษ (เนเธอร์แลนด์)', + 'en_NO' => 'อังกฤษ (นอร์เวย์)', 'en_NR' => 'อังกฤษ (นาอูรู)', 'en_NU' => 'อังกฤษ (นีอูเอ)', 'en_NZ' => 'อังกฤษ (นิวซีแลนด์)', 'en_PG' => 'อังกฤษ (ปาปัวนิวกินี)', 'en_PH' => 'อังกฤษ (ฟิลิปปินส์)', 'en_PK' => 'อังกฤษ (ปากีสถาน)', + 'en_PL' => 'อังกฤษ (โปแลนด์)', 'en_PN' => 'อังกฤษ (หมู่เกาะพิตแคร์น)', 'en_PR' => 'อังกฤษ (เปอร์โตริโก)', + 'en_PT' => 'อังกฤษ (โปรตุเกส)', 'en_PW' => 'อังกฤษ (ปาเลา)', + 'en_RO' => 'อังกฤษ (โรมาเนีย)', 'en_RW' => 'อังกฤษ (รวันดา)', 'en_SB' => 'อังกฤษ (หมู่เกาะโซโลมอน)', 'en_SC' => 'อังกฤษ (เซเชลส์)', @@ -184,6 +194,7 @@ 'en_SG' => 'อังกฤษ (สิงคโปร์)', 'en_SH' => 'อังกฤษ (เซนต์เฮเลนา)', 'en_SI' => 'อังกฤษ (สโลวีเนีย)', + 'en_SK' => 'อังกฤษ (สโลวะเกีย)', 'en_SL' => 'อังกฤษ (เซียร์ราลีโอน)', 'en_SS' => 'อังกฤษ (ซูดานใต้)', 'en_SX' => 'อังกฤษ (ซินต์มาร์เทน)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ti.php b/src/Symfony/Component/Intl/Resources/data/locales/ti.php index 79c0e33163e45..f822726833dc2 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ti.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ti.php @@ -121,29 +121,35 @@ 'en_CM' => 'እንግሊዝኛ (ካሜሩን)', 'en_CX' => 'እንግሊዝኛ (ደሴት ክሪስማስ)', 'en_CY' => 'እንግሊዝኛ (ቆጵሮስ)', + 'en_CZ' => 'እንግሊዝኛ (ቸክያ)', 'en_DE' => 'እንግሊዝኛ (ጀርመን)', 'en_DK' => 'እንግሊዝኛ (ደንማርክ)', 'en_DM' => 'እንግሊዝኛ (ዶሚኒካ)', 'en_ER' => 'እንግሊዝኛ (ኤርትራ)', + 'en_ES' => 'እንግሊዝኛ (ስጳኛ)', 'en_FI' => 'እንግሊዝኛ (ፊንላንድ)', 'en_FJ' => 'እንግሊዝኛ (ፊጂ)', 'en_FK' => 'እንግሊዝኛ (ደሴታት ፎክላንድ)', 'en_FM' => 'እንግሊዝኛ (ማይክሮነዥያ)', + 'en_FR' => 'እንግሊዝኛ (ፈረንሳ)', 'en_GB' => 'እንግሊዝኛ (ብሪጣንያ)', 'en_GD' => 'እንግሊዝኛ (ግረናዳ)', 'en_GG' => 'እንግሊዝኛ (ገርንዚ)', 'en_GH' => 'እንግሊዝኛ (ጋና)', 'en_GI' => 'እንግሊዝኛ (ጂብራልታር)', 'en_GM' => 'እንግሊዝኛ (ጋምብያ)', + 'en_GS' => 'እንግሊዝኛ (ደሴታት ደቡብ ጆርጅያን ደቡብ ሳንድዊችን)', 'en_GU' => 'እንግሊዝኛ (ጓም)', 'en_GY' => 'እንግሊዝኛ (ጉያና)', 'en_HK' => 'እንግሊዝኛ (ፍሉይ ምምሕዳራዊ ዞባ ሆንግ ኮንግ [ቻይና])', + 'en_HU' => 'እንግሊዝኛ (ሃንጋሪ)', 'en_ID' => 'እንግሊዝኛ (ኢንዶነዥያ)', 'en_IE' => 'እንግሊዝኛ (ኣየርላንድ)', 'en_IL' => 'እንግሊዝኛ (እስራኤል)', 'en_IM' => 'እንግሊዝኛ (ኣይል ኦፍ ማን)', 'en_IN' => 'እንግሊዝኛ (ህንዲ)', 'en_IO' => 'እንግሊዝኛ (ብሪጣንያዊ ህንዳዊ ውቅያኖስ ግዝኣት)', + 'en_IT' => 'እንግሊዝኛ (ኢጣልያ)', 'en_JE' => 'እንግሊዝኛ (ጀርዚ)', 'en_JM' => 'እንግሊዝኛ (ጃማይካ)', 'en_KE' => 'እንግሊዝኛ (ኬንያ)', @@ -167,15 +173,19 @@ 'en_NF' => 'እንግሊዝኛ (ደሴት ኖርፎልክ)', 'en_NG' => 'እንግሊዝኛ (ናይጀርያ)', 'en_NL' => 'እንግሊዝኛ (ኔዘርላንድ)', + 'en_NO' => 'እንግሊዝኛ (ኖርወይ)', 'en_NR' => 'እንግሊዝኛ (ናውሩ)', 'en_NU' => 'እንግሊዝኛ (ኒዩ)', 'en_NZ' => 'እንግሊዝኛ (ኒው ዚላንድ)', 'en_PG' => 'እንግሊዝኛ (ፓፕዋ ኒው ጊኒ)', 'en_PH' => 'እንግሊዝኛ (ፊሊፒንስ)', 'en_PK' => 'እንግሊዝኛ (ፓኪስታን)', + 'en_PL' => 'እንግሊዝኛ (ፖላንድ)', 'en_PN' => 'እንግሊዝኛ (ደሴታት ፒትካርን)', 'en_PR' => 'እንግሊዝኛ (ፖርቶ ሪኮ)', + 'en_PT' => 'እንግሊዝኛ (ፖርቱጋል)', 'en_PW' => 'እንግሊዝኛ (ፓላው)', + 'en_RO' => 'እንግሊዝኛ (ሩማንያ)', 'en_RW' => 'እንግሊዝኛ (ርዋንዳ)', 'en_SB' => 'እንግሊዝኛ (ደሴታት ሰሎሞን)', 'en_SC' => 'እንግሊዝኛ (ሲሸልስ)', @@ -184,6 +194,7 @@ 'en_SG' => 'እንግሊዝኛ (ሲንጋፖር)', 'en_SH' => 'እንግሊዝኛ (ቅድስቲ ሄለና)', 'en_SI' => 'እንግሊዝኛ (ስሎቬንያ)', + 'en_SK' => 'እንግሊዝኛ (ስሎቫክያ)', 'en_SL' => 'እንግሊዝኛ (ሴራ ልዮን)', 'en_SS' => 'እንግሊዝኛ (ደቡብ ሱዳን)', 'en_SX' => 'እንግሊዝኛ (ሲንት ማርተን)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/tk.php b/src/Symfony/Component/Intl/Resources/data/locales/tk.php index 48561a3a4fc7d..fb367f551a64e 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/tk.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/tk.php @@ -121,29 +121,35 @@ 'en_CM' => 'iňlis dili (Kamerun)', 'en_CX' => 'iňlis dili (Roždestwo adasy)', 'en_CY' => 'iňlis dili (Kipr)', + 'en_CZ' => 'iňlis dili (Çehiýa)', 'en_DE' => 'iňlis dili (Germaniýa)', 'en_DK' => 'iňlis dili (Daniýa)', 'en_DM' => 'iňlis dili (Dominika)', 'en_ER' => 'iňlis dili (Eritreýa)', + 'en_ES' => 'iňlis dili (Ispaniýa)', 'en_FI' => 'iňlis dili (Finlýandiýa)', 'en_FJ' => 'iňlis dili (Fiji)', 'en_FK' => 'iňlis dili (Folklend adalary)', 'en_FM' => 'iňlis dili (Mikroneziýa)', + 'en_FR' => 'iňlis dili (Fransiýa)', 'en_GB' => 'iňlis dili (Birleşen Patyşalyk)', 'en_GD' => 'iňlis dili (Grenada)', 'en_GG' => 'iňlis dili (Gernsi)', 'en_GH' => 'iňlis dili (Gana)', 'en_GI' => 'iňlis dili (Gibraltar)', 'en_GM' => 'iňlis dili (Gambiýa)', + 'en_GS' => 'iňlis dili (Günorta Georgiýa we Günorta Sendwiç adasy)', 'en_GU' => 'iňlis dili (Guam)', 'en_GY' => 'iňlis dili (Gaýana)', 'en_HK' => 'iňlis dili (Gonkong AAS Hytaý)', + 'en_HU' => 'iňlis dili (Wengriýa)', 'en_ID' => 'iňlis dili (Indoneziýa)', 'en_IE' => 'iňlis dili (Irlandiýa)', 'en_IL' => 'iňlis dili (Ysraýyl)', 'en_IM' => 'iňlis dili (Men adasy)', 'en_IN' => 'iňlis dili (Hindistan)', 'en_IO' => 'iňlis dili (Britaniýanyň Hindi okeanyndaky territoriýalary)', + 'en_IT' => 'iňlis dili (Italiýa)', 'en_JE' => 'iňlis dili (Jersi)', 'en_JM' => 'iňlis dili (Ýamaýka)', 'en_KE' => 'iňlis dili (Keniýa)', @@ -167,15 +173,19 @@ 'en_NF' => 'iňlis dili (Norfolk adasy)', 'en_NG' => 'iňlis dili (Nigeriýa)', 'en_NL' => 'iňlis dili (Niderlandlar)', + 'en_NO' => 'iňlis dili (Norwegiýa)', 'en_NR' => 'iňlis dili (Nauru)', 'en_NU' => 'iňlis dili (Niue)', 'en_NZ' => 'iňlis dili (Täze Zelandiýa)', 'en_PG' => 'iňlis dili (Papua - Täze Gwineýa)', 'en_PH' => 'iňlis dili (Filippinler)', 'en_PK' => 'iňlis dili (Pakistan)', + 'en_PL' => 'iňlis dili (Polşa)', 'en_PN' => 'iňlis dili (Pitkern adalary)', 'en_PR' => 'iňlis dili (Puerto-Riko)', + 'en_PT' => 'iňlis dili (Portugaliýa)', 'en_PW' => 'iňlis dili (Palau)', + 'en_RO' => 'iňlis dili (Rumyniýa)', 'en_RW' => 'iňlis dili (Ruanda)', 'en_SB' => 'iňlis dili (Solomon adalary)', 'en_SC' => 'iňlis dili (Seýşel adalary)', @@ -184,6 +194,7 @@ 'en_SG' => 'iňlis dili (Singapur)', 'en_SH' => 'iňlis dili (Keramatly Ýelena adasy)', 'en_SI' => 'iňlis dili (Sloweniýa)', + 'en_SK' => 'iňlis dili (Slowakiýa)', 'en_SL' => 'iňlis dili (Sýerra-Leone)', 'en_SS' => 'iňlis dili (Günorta Sudan)', 'en_SX' => 'iňlis dili (Sint-Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/to.php b/src/Symfony/Component/Intl/Resources/data/locales/to.php index 109d269cb4746..b68a7aeda3c6f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/to.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/to.php @@ -121,29 +121,35 @@ 'en_CM' => 'lea fakapālangi (Kameluni)', 'en_CX' => 'lea fakapālangi (Motu Kilisimasi)', 'en_CY' => 'lea fakapālangi (Saipalesi)', + 'en_CZ' => 'lea fakapālangi (Sēkia)', 'en_DE' => 'lea fakapālangi (Siamane)', 'en_DK' => 'lea fakapālangi (Tenimaʻake)', 'en_DM' => 'lea fakapālangi (Tominika)', 'en_ER' => 'lea fakapālangi (ʻElitulia)', + 'en_ES' => 'lea fakapālangi (Sipeini)', 'en_FI' => 'lea fakapālangi (Finilani)', 'en_FJ' => 'lea fakapālangi (Fisi)', 'en_FK' => 'lea fakapālangi (ʻOtumotu Fokulani)', 'en_FM' => 'lea fakapālangi (Mikolonīsia)', + 'en_FR' => 'lea fakapālangi (Falanisē)', 'en_GB' => 'lea fakapālangi (Pilitānia)', 'en_GD' => 'lea fakapālangi (Kelenatā)', 'en_GG' => 'lea fakapālangi (Kuenisī)', 'en_GH' => 'lea fakapālangi (Kana)', 'en_GI' => 'lea fakapālangi (Sipalālitā)', 'en_GM' => 'lea fakapālangi (Kamipia)', + 'en_GS' => 'lea fakapālangi (ʻOtumotu Seōsia-tonga mo Saniuisi-tonga)', 'en_GU' => 'lea fakapālangi (Kuamu)', 'en_GY' => 'lea fakapālangi (Kuiana)', 'en_HK' => 'lea fakapālangi (Hongi Kongi SAR Siaina)', + 'en_HU' => 'lea fakapālangi (Hungakalia)', 'en_ID' => 'lea fakapālangi (ʻInitonēsia)', 'en_IE' => 'lea fakapālangi (ʻAealani)', 'en_IL' => 'lea fakapālangi (ʻIsileli)', 'en_IM' => 'lea fakapālangi (Motu Mani)', 'en_IN' => 'lea fakapālangi (ʻInitia)', 'en_IO' => 'lea fakapālangi (Potu fonua moana ʻInitia fakapilitānia)', + 'en_IT' => 'lea fakapālangi (ʻĪtali)', 'en_JE' => 'lea fakapālangi (Selusī)', 'en_JM' => 'lea fakapālangi (Samaika)', 'en_KE' => 'lea fakapālangi (Keniā)', @@ -167,15 +173,19 @@ 'en_NF' => 'lea fakapālangi (Motu Nōfoliki)', 'en_NG' => 'lea fakapālangi (Naisilia)', 'en_NL' => 'lea fakapālangi (Hōlani)', + 'en_NO' => 'lea fakapālangi (Noauē)', 'en_NR' => 'lea fakapālangi (Naulu)', 'en_NU' => 'lea fakapālangi (Niuē)', 'en_NZ' => 'lea fakapālangi (Nuʻusila)', 'en_PG' => 'lea fakapālangi (Papuaniukini)', 'en_PH' => 'lea fakapālangi (Filipaini)', 'en_PK' => 'lea fakapālangi (Pākisitani)', + 'en_PL' => 'lea fakapālangi (Polani)', 'en_PN' => 'lea fakapālangi (ʻOtumotu Pitikeni)', 'en_PR' => 'lea fakapālangi (Puēto Liko)', + 'en_PT' => 'lea fakapālangi (Potukali)', 'en_PW' => 'lea fakapālangi (Palau)', + 'en_RO' => 'lea fakapālangi (Lomēnia)', 'en_RW' => 'lea fakapālangi (Luanitā)', 'en_SB' => 'lea fakapālangi (ʻOtumotu Solomone)', 'en_SC' => 'lea fakapālangi (ʻOtumotu Seiseli)', @@ -184,6 +194,7 @@ 'en_SG' => 'lea fakapālangi (Singapoa)', 'en_SH' => 'lea fakapālangi (Sā Helena)', 'en_SI' => 'lea fakapālangi (Silōvenia)', + 'en_SK' => 'lea fakapālangi (Silōvakia)', 'en_SL' => 'lea fakapālangi (Siela Leone)', 'en_SS' => 'lea fakapālangi (Sūtani fakatonga)', 'en_SX' => 'lea fakapālangi (Sā Mātini [fakahōlani])', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/tr.php b/src/Symfony/Component/Intl/Resources/data/locales/tr.php index a1b5f1a6f13d0..ba3c3527fd7d9 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/tr.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/tr.php @@ -121,29 +121,35 @@ 'en_CM' => 'İngilizce (Kamerun)', 'en_CX' => 'İngilizce (Christmas Adası)', 'en_CY' => 'İngilizce (Kıbrıs)', + 'en_CZ' => 'İngilizce (Çekya)', 'en_DE' => 'İngilizce (Almanya)', 'en_DK' => 'İngilizce (Danimarka)', 'en_DM' => 'İngilizce (Dominika)', 'en_ER' => 'İngilizce (Eritre)', + 'en_ES' => 'İngilizce (İspanya)', 'en_FI' => 'İngilizce (Finlandiya)', 'en_FJ' => 'İngilizce (Fiji)', 'en_FK' => 'İngilizce (Falkland Adaları)', 'en_FM' => 'İngilizce (Mikronezya)', + 'en_FR' => 'İngilizce (Fransa)', 'en_GB' => 'İngilizce (Birleşik Krallık)', 'en_GD' => 'İngilizce (Grenada)', 'en_GG' => 'İngilizce (Guernsey)', 'en_GH' => 'İngilizce (Gana)', 'en_GI' => 'İngilizce (Cebelitarık)', 'en_GM' => 'İngilizce (Gambiya)', + 'en_GS' => 'İngilizce (Güney Georgia ve Güney Sandwich Adaları)', 'en_GU' => 'İngilizce (Guam)', 'en_GY' => 'İngilizce (Guyana)', 'en_HK' => 'İngilizce (Çin Hong Kong ÖİB)', + 'en_HU' => 'İngilizce (Macaristan)', 'en_ID' => 'İngilizce (Endonezya)', 'en_IE' => 'İngilizce (İrlanda)', 'en_IL' => 'İngilizce (İsrail)', 'en_IM' => 'İngilizce (Man Adası)', 'en_IN' => 'İngilizce (Hindistan)', 'en_IO' => 'İngilizce (Britanya Hint Okyanusu Toprakları)', + 'en_IT' => 'İngilizce (İtalya)', 'en_JE' => 'İngilizce (Jersey)', 'en_JM' => 'İngilizce (Jamaika)', 'en_KE' => 'İngilizce (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'İngilizce (Norfolk Adası)', 'en_NG' => 'İngilizce (Nijerya)', 'en_NL' => 'İngilizce (Hollanda)', + 'en_NO' => 'İngilizce (Norveç)', 'en_NR' => 'İngilizce (Nauru)', 'en_NU' => 'İngilizce (Niue)', 'en_NZ' => 'İngilizce (Yeni Zelanda)', 'en_PG' => 'İngilizce (Papua Yeni Gine)', 'en_PH' => 'İngilizce (Filipinler)', 'en_PK' => 'İngilizce (Pakistan)', + 'en_PL' => 'İngilizce (Polonya)', 'en_PN' => 'İngilizce (Pitcairn Adaları)', 'en_PR' => 'İngilizce (Porto Riko)', + 'en_PT' => 'İngilizce (Portekiz)', 'en_PW' => 'İngilizce (Palau)', + 'en_RO' => 'İngilizce (Romanya)', 'en_RW' => 'İngilizce (Ruanda)', 'en_SB' => 'İngilizce (Solomon Adaları)', 'en_SC' => 'İngilizce (Seyşeller)', @@ -184,6 +194,7 @@ 'en_SG' => 'İngilizce (Singapur)', 'en_SH' => 'İngilizce (Saint Helena)', 'en_SI' => 'İngilizce (Slovenya)', + 'en_SK' => 'İngilizce (Slovakya)', 'en_SL' => 'İngilizce (Sierra Leone)', 'en_SS' => 'İngilizce (Güney Sudan)', 'en_SX' => 'İngilizce (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/tt.php b/src/Symfony/Component/Intl/Resources/data/locales/tt.php index 0b2a4529009f6..7f8b5bffce1b1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/tt.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/tt.php @@ -110,29 +110,35 @@ 'en_CM' => 'инглиз (Камерун)', 'en_CX' => 'инглиз (Раштуа утравы)', 'en_CY' => 'инглиз (Кипр)', + 'en_CZ' => 'инглиз (Чехия Республикасы)', 'en_DE' => 'инглиз (Германия)', 'en_DK' => 'инглиз (Дания)', 'en_DM' => 'инглиз (Доминика)', 'en_ER' => 'инглиз (Эритрея)', + 'en_ES' => 'инглиз (Испания)', 'en_FI' => 'инглиз (Финляндия)', 'en_FJ' => 'инглиз (Фиджи)', 'en_FK' => 'инглиз (Фолкленд утраулары)', 'en_FM' => 'инглиз (Микронезия)', + 'en_FR' => 'инглиз (Франция)', 'en_GB' => 'инглиз (Берләшкән Корольлек)', 'en_GD' => 'инглиз (Гренада)', 'en_GG' => 'инглиз (Гернси)', 'en_GH' => 'инглиз (Гана)', 'en_GI' => 'инглиз (Гибралтар)', 'en_GM' => 'инглиз (Гамбия)', + 'en_GS' => 'инглиз (Көньяк Георгия һәм Көньяк Сандвич утраулары)', 'en_GU' => 'инглиз (Гуам)', 'en_GY' => 'инглиз (Гайана)', 'en_HK' => 'инглиз (Гонконг Махсус Идарәле Төбәге)', + 'en_HU' => 'инглиз (Венгрия)', 'en_ID' => 'инглиз (Индонезия)', 'en_IE' => 'инглиз (Ирландия)', 'en_IL' => 'инглиз (Израиль)', 'en_IM' => 'инглиз (Мэн утравы)', 'en_IN' => 'инглиз (Индия)', 'en_IO' => 'инглиз (Британиянең Һинд Океанындагы Территориясе)', + 'en_IT' => 'инглиз (Италия)', 'en_JE' => 'инглиз (Джерси)', 'en_JM' => 'инглиз (Ямайка)', 'en_KE' => 'инглиз (Кения)', @@ -156,15 +162,19 @@ 'en_NF' => 'инглиз (Норфолк утравы)', 'en_NG' => 'инглиз (Нигерия)', 'en_NL' => 'инглиз (Нидерланд)', + 'en_NO' => 'инглиз (Норвегия)', 'en_NR' => 'инглиз (Науру)', 'en_NU' => 'инглиз (Ниуэ)', 'en_NZ' => 'инглиз (Яңа Зеландия)', 'en_PG' => 'инглиз (Папуа - Яңа Гвинея)', 'en_PH' => 'инглиз (Филиппин)', 'en_PK' => 'инглиз (Пакистан)', + 'en_PL' => 'инглиз (Польша)', 'en_PN' => 'инглиз (Питкэрн утраулары)', 'en_PR' => 'инглиз (Пуэрто-Рико)', + 'en_PT' => 'инглиз (Португалия)', 'en_PW' => 'инглиз (Палау)', + 'en_RO' => 'инглиз (Румыния)', 'en_RW' => 'инглиз (Руанда)', 'en_SB' => 'инглиз (Сөләйман утраулары)', 'en_SC' => 'инглиз (Сейшел утраулары)', @@ -173,6 +183,7 @@ 'en_SG' => 'инглиз (Сингапур)', 'en_SH' => 'инглиз (Изге Елена утравы)', 'en_SI' => 'инглиз (Словения)', + 'en_SK' => 'инглиз (Словакия)', 'en_SL' => 'инглиз (Сьерра-Леоне)', 'en_SS' => 'инглиз (Көньяк Судан)', 'en_SX' => 'инглиз (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ug.php b/src/Symfony/Component/Intl/Resources/data/locales/ug.php index bcacc5bd1b6d9..172520efb367f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ug.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ug.php @@ -121,28 +121,34 @@ 'en_CM' => 'ئىنگلىزچە (كامېرون)', 'en_CX' => 'ئىنگلىزچە (مىلاد ئارىلى)', 'en_CY' => 'ئىنگلىزچە (سىپرۇس)', + 'en_CZ' => 'ئىنگلىزچە (چېخ جۇمھۇرىيىتى)', 'en_DE' => 'ئىنگلىزچە (گېرمانىيە)', 'en_DK' => 'ئىنگلىزچە (دانىيە)', 'en_DM' => 'ئىنگلىزچە (دومىنىكا)', 'en_ER' => 'ئىنگلىزچە (ئېرىترىيە)', + 'en_ES' => 'ئىنگلىزچە (ئىسپانىيە)', 'en_FI' => 'ئىنگلىزچە (فىنلاندىيە)', 'en_FJ' => 'ئىنگلىزچە (فىجى)', 'en_FK' => 'ئىنگلىزچە (فالكلاند ئاراللىرى)', 'en_FM' => 'ئىنگلىزچە (مىكرونېزىيە)', + 'en_FR' => 'ئىنگلىزچە (فىرانسىيە)', 'en_GB' => 'ئىنگلىزچە (بىرلەشمە پادىشاھلىق)', 'en_GD' => 'ئىنگلىزچە (گىرېنادا)', 'en_GG' => 'ئىنگلىزچە (گۇرنسېي)', 'en_GH' => 'ئىنگلىزچە (گانا)', 'en_GI' => 'ئىنگلىزچە (جەبىلتارىق)', 'en_GM' => 'ئىنگلىزچە (گامبىيە)', + 'en_GS' => 'ئىنگلىزچە (جەنۇبىي جورجىيە ۋە جەنۇبىي ساندۋىچ ئاراللىرى)', 'en_GU' => 'ئىنگلىزچە (گۇئام)', 'en_GY' => 'ئىنگلىزچە (گىۋىيانا)', 'en_HK' => 'ئىنگلىزچە (شياڭگاڭ ئالاھىدە مەمۇرىي رايونى [جۇڭگو])', + 'en_HU' => 'ئىنگلىزچە (ۋېنگىرىيە)', 'en_ID' => 'ئىنگلىزچە (ھىندونېزىيە)', 'en_IE' => 'ئىنگلىزچە (ئىرېلاندىيە)', 'en_IL' => 'ئىنگلىزچە (ئىسرائىلىيە)', 'en_IM' => 'ئىنگلىزچە (مان ئارىلى)', 'en_IN' => 'ئىنگلىزچە (ھىندىستان)', + 'en_IT' => 'ئىنگلىزچە (ئىتالىيە)', 'en_JE' => 'ئىنگلىزچە (جېرسېي)', 'en_JM' => 'ئىنگلىزچە (يامايكا)', 'en_KE' => 'ئىنگلىزچە (كېنىيە)', @@ -166,15 +172,19 @@ 'en_NF' => 'ئىنگلىزچە (نورفولك ئارىلى)', 'en_NG' => 'ئىنگلىزچە (نىگېرىيە)', 'en_NL' => 'ئىنگلىزچە (گوللاندىيە)', + 'en_NO' => 'ئىنگلىزچە (نورۋېگىيە)', 'en_NR' => 'ئىنگلىزچە (ناۋرۇ)', 'en_NU' => 'ئىنگلىزچە (نيۇئې)', 'en_NZ' => 'ئىنگلىزچە (يېڭى زېلاندىيە)', 'en_PG' => 'ئىنگلىزچە (پاپۇئا يېڭى گىۋىنىيەسى)', 'en_PH' => 'ئىنگلىزچە (فىلىپپىن)', 'en_PK' => 'ئىنگلىزچە (پاكىستان)', + 'en_PL' => 'ئىنگلىزچە (پولشا)', 'en_PN' => 'ئىنگلىزچە (پىتكايرن ئاراللىرى)', 'en_PR' => 'ئىنگلىزچە (پۇئېرتو رىكو)', + 'en_PT' => 'ئىنگلىزچە (پورتۇگالىيە)', 'en_PW' => 'ئىنگلىزچە (پالائۇ)', + 'en_RO' => 'ئىنگلىزچە (رومىنىيە)', 'en_RW' => 'ئىنگلىزچە (رىۋاندا)', 'en_SB' => 'ئىنگلىزچە (سولومون ئاراللىرى)', 'en_SC' => 'ئىنگلىزچە (سېيشېل)', @@ -183,6 +193,7 @@ 'en_SG' => 'ئىنگلىزچە (سىنگاپور)', 'en_SH' => 'ئىنگلىزچە (ساينىت ھېلېنا)', 'en_SI' => 'ئىنگلىزچە (سىلوۋېنىيە)', + 'en_SK' => 'ئىنگلىزچە (سىلوۋاكىيە)', 'en_SL' => 'ئىنگلىزچە (سېررالېئون)', 'en_SS' => 'ئىنگلىزچە (جەنۇبىي سۇدان)', 'en_SX' => 'ئىنگلىزچە (سىنت مارتېن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/uk.php b/src/Symfony/Component/Intl/Resources/data/locales/uk.php index 5dadd306d7297..ff6438470ae7e 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/uk.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/uk.php @@ -121,29 +121,35 @@ 'en_CM' => 'англійська (Камерун)', 'en_CX' => 'англійська (Острів Різдва)', 'en_CY' => 'англійська (Кіпр)', + 'en_CZ' => 'англійська (Чехія)', 'en_DE' => 'англійська (Німеччина)', 'en_DK' => 'англійська (Данія)', 'en_DM' => 'англійська (Домініка)', 'en_ER' => 'англійська (Еритрея)', + 'en_ES' => 'англійська (Іспанія)', 'en_FI' => 'англійська (Фінляндія)', 'en_FJ' => 'англійська (Фіджі)', 'en_FK' => 'англійська (Фолклендські Острови)', 'en_FM' => 'англійська (Мікронезія)', + 'en_FR' => 'англійська (Франція)', 'en_GB' => 'англійська (Велика Британія)', 'en_GD' => 'англійська (Гренада)', 'en_GG' => 'англійська (Гернсі)', 'en_GH' => 'англійська (Гана)', 'en_GI' => 'англійська (Гібралтар)', 'en_GM' => 'англійська (Гамбія)', + 'en_GS' => 'англійська (Південна Джорджія та Південні Сандвічеві Острови)', 'en_GU' => 'англійська (Гуам)', 'en_GY' => 'англійська (Гаяна)', 'en_HK' => 'англійська (Гонконг, ОАР Китаю)', + 'en_HU' => 'англійська (Угорщина)', 'en_ID' => 'англійська (Індонезія)', 'en_IE' => 'англійська (Ірландія)', 'en_IL' => 'англійська (Ізраїль)', 'en_IM' => 'англійська (Острів Мен)', 'en_IN' => 'англійська (Індія)', 'en_IO' => 'англійська (Британська територія в Індійському океані)', + 'en_IT' => 'англійська (Італія)', 'en_JE' => 'англійська (Джерсі)', 'en_JM' => 'англійська (Ямайка)', 'en_KE' => 'англійська (Кенія)', @@ -167,15 +173,19 @@ 'en_NF' => 'англійська (Острів Норфолк)', 'en_NG' => 'англійська (Нігерія)', 'en_NL' => 'англійська (Нідерланди)', + 'en_NO' => 'англійська (Норвегія)', 'en_NR' => 'англійська (Науру)', 'en_NU' => 'англійська (Ніуе)', 'en_NZ' => 'англійська (Нова Зеландія)', 'en_PG' => 'англійська (Папуа-Нова Гвінея)', 'en_PH' => 'англійська (Філіппіни)', 'en_PK' => 'англійська (Пакистан)', + 'en_PL' => 'англійська (Польща)', 'en_PN' => 'англійська (Острови Піткерн)', 'en_PR' => 'англійська (Пуерто-Рико)', + 'en_PT' => 'англійська (Португалія)', 'en_PW' => 'англійська (Палау)', + 'en_RO' => 'англійська (Румунія)', 'en_RW' => 'англійська (Руанда)', 'en_SB' => 'англійська (Соломонові Острови)', 'en_SC' => 'англійська (Сейшельські Острови)', @@ -184,6 +194,7 @@ 'en_SG' => 'англійська (Сінгапур)', 'en_SH' => 'англійська (Острів Святої Єлени)', 'en_SI' => 'англійська (Словенія)', + 'en_SK' => 'англійська (Словаччина)', 'en_SL' => 'англійська (Сьєрра-Леоне)', 'en_SS' => 'англійсь 10000 ка (Південний Судан)', 'en_SX' => 'англійська (Сінт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/ur.php b/src/Symfony/Component/Intl/Resources/data/locales/ur.php index d7ac179c447c4..2f497ec8d340f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/ur.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/ur.php @@ -121,29 +121,35 @@ 'en_CM' => 'انگریزی (کیمرون)', 'en_CX' => 'انگریزی (جزیرہ کرسمس)', 'en_CY' => 'انگریزی (قبرص)', + 'en_CZ' => 'انگریزی (چیکیا)', 'en_DE' => 'انگریزی (جرمنی)', 'en_DK' => 'انگریزی (ڈنمارک)', 'en_DM' => 'انگریزی (ڈومنیکا)', 'en_ER' => 'انگریزی (اریٹیریا)', + 'en_ES' => 'انگریزی (ہسپانیہ)', 'en_FI' => 'انگریزی (فن لینڈ)', 'en_FJ' => 'انگریزی (فجی)', 'en_FK' => 'انگریزی (فاکلینڈ جزائر)', 'en_FM' => 'انگریزی (مائکرونیشیا)', + 'en_FR' => 'انگریزی (فرانس)', 'en_GB' => 'انگریزی (سلطنت متحدہ)', 'en_GD' => 'انگریزی (گریناڈا)', 'en_GG' => 'انگریزی (گوئرنسی)', 'en_GH' => 'انگریزی (گھانا)', 'en_GI' => 'انگریزی (جبل الطارق)', 'en_GM' => 'انگریزی (گیمبیا)', + 'en_GS' => 'انگریزی (جنوبی جارجیا اور جنوبی سینڈوچ جزائر)', 'en_GU' => 'انگریزی (گوام)', 'en_GY' => 'انگریزی (گیانا)', 'en_HK' => 'انگریزی (ہانگ کانگ SAR چین)', + 'en_HU' => 'انگریزی (ہنگری)', 'en_ID' => 'انگریزی (انڈونیشیا)', 'en_IE' => 'انگریزی (آئرلینڈ)', 'en_IL' => 'انگریزی (اسرائیل)', 'en_IM' => 'انگریزی (آئل آف مین)', 'en_IN' => 'انگریزی (بھارت)', 'en_IO' => 'انگریزی (برطانوی بحر ہند کا علاقہ)', + 'en_IT' => 'انگریزی (اٹلی)', 'en_JE' => 'انگریزی (جرسی)', 'en_JM' => 'انگریزی (جمائیکا)', 'en_KE' => 'انگریزی (کینیا)', @@ -167,15 +173,19 @@ 'en_NF' => 'انگریزی (نارفوک آئلینڈ)', 'en_NG' => 'انگریزی (نائجیریا)', 'en_NL' => 'انگریزی (نیدر لینڈز)', + 'en_NO' => 'انگریزی (ناروے)', 'en_NR' => 'انگریزی (نؤرو)', 'en_NU' => 'انگریزی (نیئو)', 'en_NZ' => 'انگریزی (نیوزی لینڈ)', 'en_PG' => 'انگریزی (پاپوآ نیو گنی)', 'en_PH' => 'انگریزی (فلپائن)', 'en_PK' => 'انگریزی (پاکستان)', + 'en_PL' => 'انگریزی (پولینڈ)', 'en_PN' => 'انگریزی (پٹکائرن جزائر)', 'en_PR' => 'انگریزی (پیورٹو ریکو)', + 'en_PT' => 'انگریزی (پرتگال)', 'en_PW' => 'انگریزی (پلاؤ)', + 'en_RO' => 'انگریزی (رومانیہ)', 'en_RW' => 'انگریزی (روانڈا)', 'en_SB' => 'انگریزی (سولومن آئلینڈز)', 'en_SC' => 'انگریزی (سشلیز)', @@ -184,6 +194,7 @@ 'en_SG' => 'انگریزی (سنگاپور)', 'en_SH' => 'انگریزی (سینٹ ہیلینا)', 'en_SI' => 'انگریزی (سلووینیا)', + 'en_SK' => 'انگریزی (سلوواکیہ)', 'en_SL' => 'انگریزی (سیرالیون)', 'en_SS' => 'انگریزی (جنوبی سوڈان)', 'en_SX' => 'انگریزی (سنٹ مارٹن)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/uz.php b/src/Symfony/Component/Intl/Resources/data/locales/uz.php index 6448491444f86..ed9a8c05baff6 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/uz.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/uz.php @@ -121,29 +121,35 @@ 'en_CM' => 'inglizcha (Kamerun)', 'en_CX' => 'inglizcha (Rojdestvo oroli)', 'en_CY' => 'inglizcha (Kipr)', + 'en_CZ' => 'inglizcha (Chexiya)', 'en_DE' => 'inglizcha (Germaniya)', 'en_DK' => 'inglizcha (Daniya)', 'en_DM' => 'inglizcha (Dominika)', 'en_ER' => 'inglizcha (Eritreya)', + 'en_ES' => 'inglizcha (Ispaniya)', 'en_FI' => 'inglizcha (Finlandiya)', 'en_FJ' => 'inglizcha (Fiji)', 'en_FK' => 'inglizcha (Folklend orollari)', 'en_FM' => 'inglizcha (Mikroneziya)', + 'en_FR' => 'inglizcha (Fransiya)', 'en_GB' => 'inglizcha (Buyuk Britaniya)', 'en_GD' => 'inglizcha (Grenada)', 'en_GG' => 'inglizcha (Gernsi)', 'en_GH' => 'inglizcha (Gana)', 'en_GI' => 'inglizcha (Gibraltar)', 'en_GM' => 'inglizcha (Gambiya)', + 'en_GS' => 'inglizcha (Janubiy Georgiya va Janubiy Sendvich orollari)', 'en_GU' => 'inglizcha (Guam)', 'en_GY' => 'inglizcha (Gayana)', 'en_HK' => 'inglizcha (Gonkong [Xitoy MMH])', + 'en_HU' => 'inglizcha (Vengriya)', 'en_ID' => 'inglizcha (Indoneziya)', 'en_IE' => 'inglizcha (Irlandiya)', 'en_IL' => 'inglizcha (Isroil)', 'en_IM' => 'inglizcha (Men oroli)', 'en_IN' => 'inglizcha (Hindiston)', 'en_IO' => 'inglizcha (Britaniyaning Hind okeanidagi hududi)', + 'en_IT' => 'inglizcha (Italiya)', 'en_JE' => 'inglizcha (Jersi)', 'en_JM' => 'inglizcha (Yamayka)', 'en_KE' => 'inglizcha (Keniya)', @@ -167,15 +173,19 @@ 'en_NF' => 'inglizcha (Norfolk oroli)', 'en_NG' => 'inglizcha (Nigeriya)', 'en_NL' => 'inglizcha (Niderlandiya)', + 'en_NO' => 'inglizcha (Norvegiya)', 'en_NR' => 'inglizcha (Nauru)', 'en_NU' => 'inglizcha (Niue)', 'en_NZ' => 'inglizcha (Yangi Zelandiya)', 'en_PG' => 'inglizcha (Papua – Yangi Gvineya)', 'en_PH' => 'inglizcha (Filippin)', 'en_PK' => 'inglizcha (Pokiston)', + 'en_PL' => 'inglizcha (Polsha)', 'en_PN' => 'inglizcha (Pitkern orollari)', 'en_PR' => 'inglizcha (Puerto-Riko)', + 'en_PT' => 'inglizcha (Portugaliya)', 'en_PW' => 'inglizcha (Palau)', + 'en_RO' => 'inglizcha (Ruminiya)', 'en_RW' => 'inglizcha (Ruanda)', 'en_SB' => 'inglizcha (Solomon orollari)', 'en_SC' => 'inglizcha (Seyshel orollari)', @@ -184,6 +194,7 @@ 'en_SG' => 'inglizcha (Singapur)', 'en_SH' => 'inglizcha (Muqaddas Yelena oroli)', 'en_SI' => 'inglizcha (Sloveniya)', + 'en_SK' => 'inglizcha (Slovakiya)', 'en_SL' => 'inglizcha (Syerra-Leone)', 'en_SS' => 'inglizcha (Janubiy Sudan)', 'en_SX' => 'inglizcha (Sint-Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/uz_Cyrl.php b/src/Symfony/Component/Intl/Resources/data/locales/uz_Cyrl.php index c914c6278d563..96e39d0e0e49d 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/uz_Cyrl.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/uz_Cyrl.php @@ -121,29 +121,35 @@ 'en_CM' => 'инглизча (Камерун)', 'en_CX' => 'инглизча (Рождество ороли)', 'en_CY' => 'инглизча (Кипр)', + 'en_CZ' => 'инглизча (Чехия)', 'en_DE' => 'инглизча (Германия)', 'en_DK' => 'инглизча (Дания)', 'en_DM' => 'инглизча (Доминика)', 'en_ER' => 'инглизча (Эритрея)', + 'en_ES' => 'инглизча (Испания)', 'en_FI' => 'инглизча (Финляндия)', 'en_FJ' => 'инглизча (Фижи)', 'en_FK' => 'инглизча (Фолкленд ороллари)', 'en_FM' => 'инглизча (Микронезия)', + 'en_FR' => 'инглизча (Франция)', 'en_GB' => 'инглизча (Буюк Британия)', 'en_GD' => 'инглизча (Гренада)', 'en_GG' => 'инглизча (Гернси)', 'en_GH' => 'инглизча (Гана)', 'en_GI' => 'инглизча (Гибралтар)', 'en_GM' => 'инглизча (Гамбия)', + 'en_GS' => 'инглизча (Жанубий Георгия ва Жанубий Сендвич ороллари)', 'en_GU' => 'инглизча (Гуам)', 'en_GY' => 'инглизча (Гаяна)', 'en_HK' => 'инглизча (Гонконг [Хитой ММҲ])', + 'en_HU' => 'инглизча (Венгрия)', 'en_ID' => 'инглизча (Индонезия)', 'en_IE' => 'инглизча (Ирландия)', 'en_IL' => 'инглизча (Исроил)', 'en_IM' => 'инглизча (Мэн ороли)', 'en_IN' => 'инглизча (Ҳиндистон)', 'en_IO' => 'инглизча (Britaniyaning Hind okeanidagi hududi)', + 'en_IT' => 'инглизча (Италия)', 'en_JE' => 'инглизча (Жерси)', 'en_JM' => 'инглизча (Ямайка)', 'en_KE' => 'инглизча (Кения)', @@ -167,15 +173,19 @@ 'en_NF' => 'инглизча (Норфолк ороллари)', 'en_NG' => 'инглизча (Нигерия)', 'en_NL' => 'инглизча (Нидерландия)', + 'en_NO' => 'инглизча (Норвегия)', 'en_NR' => 'инглизча (Науру)', 'en_NU' => 'инглизча (Ниуэ)', 'en_NZ' => 'инглизча (Янги Зеландия)', 'en_PG' => 'инглизча (Папуа - Янги Гвинея)', 'en_PH' => 'инглизча (Филиппин)', 'en_PK' => 'инглизча (Покистон)', + 'en_PL' => 'инглизча (Польша)', 'en_PN' => 'инглизча (Питкэрн ороллари)', 'en_PR' => 'инглизча (Пуэрто-Рико)', + 'en_PT' => 'инглизча (Португалия)', 'en_PW' => 'инглизча (Палау)', + 'en_RO' => 'инглизча (Руминия)', 'en_RW' => 'инглизча (Руанда)', 'en_SB' => 'инглизча (Соломон ороллари)', 'en_SC' => 'инглизча (Сейшел ороллари)', @@ -184,6 +194,7 @@ 'en_SG' => 'инглизча (Сингапур)', 'en_SH' => 'инглизча (Муқаддас Елена ороли)', 'en_SI' => 'инглизча (Словения)', + 'en_SK' => 'инглизча (Словакия)', 'en_SL' => 'инглизча (Сьерра-Леоне)', 'en_SS' => 'инглизча (Жанубий Судан)', 'en_SX' => 'инглизча (Синт-Мартен)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/vi.php b/src/Symfony/Component/Intl/Resources/data/locales/vi.php index b73a0b4c8ea36..6cd2b079873a1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/vi.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/vi.php @@ -121,29 +121,35 @@ 'en_CM' => 'Tiếng Anh (Cameroon)', 'en_CX' => 'Tiếng Anh (Đảo Giáng Sinh)', 'en_CY' => 'Tiếng Anh (Síp)', + 'en_CZ' => 'Tiếng Anh (Séc)', 'en_DE' => 'Tiếng Anh (Đức)', 'en_DK' => 'Tiếng Anh (Đan Mạch)', 'en_DM' => 'Tiếng Anh (Dominica)', 'en_ER' => 'Tiếng Anh (Eritrea)', + 'en_ES' => 'Tiếng Anh (Tây Ban Nha)', 'en_FI' => 'Tiếng Anh (Phần Lan)', 'en_FJ' => 'Tiếng Anh (Fiji)', 'en_FK' => 'Tiếng Anh (Quần đảo Falkland)', 'en_FM' => 'Tiếng Anh (Micronesia)', + 'en_FR' => 'Tiếng Anh (Pháp)', 'en_GB' => 'Tiếng Anh (Vương quốc Anh)', 'en_GD' => 'Tiếng Anh (Grenada)', 'en_GG' => 'Tiếng Anh (Guernsey)', 'en_GH' => 'Tiếng Anh (Ghana)', 'en_GI' => 'Tiếng Anh (Gibraltar)', 'en_GM' => 'Tiếng Anh (Gambia)', + 'en_GS' => 'Tiếng Anh (Nam Georgia & Quần đảo Nam Sandwich)', 'en_GU' => 'Tiếng Anh (Guam)', 'en_GY' => 'Tiếng Anh (Guyana)', 'en_HK' => 'Tiếng Anh (Đặc khu Hành chính Hồng Kông, Trung Quốc)', + 'en_HU' => 'Tiếng Anh (Hungary)', 'en_ID' => 'Tiếng Anh (Indonesia)', 'en_IE' => 'Tiếng Anh (Ireland)', 'en_IL' => 'Tiếng Anh (Israel)', 'en_IM' => 'Tiếng Anh (Đảo Man)', 'en_IN' => 'Tiếng Anh (Ấn Độ)', 'en_IO' => 'Tiếng Anh (Lãnh thổ Ấn Độ Dương thuộc Anh)', + 'en_IT' => 'Tiếng Anh (Italy)', 'en_JE' => 'Tiếng Anh (Jersey)', 'en_JM' => 'Tiếng Anh (Jamaica)', 'en_KE' => 'Tiếng Anh (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Tiếng Anh (Đảo Norfolk)', 'en_NG' => 'Tiếng Anh (Nigeria)', 'en_NL' => 'Tiếng Anh (Hà Lan)', + 'en_NO' => 'Tiếng Anh (Na Uy)', 'en_NR' => 'Tiếng Anh (Nauru)', 'en_NU' => 'Tiếng Anh (Niue)', 'en_NZ' => 'Tiếng Anh (New Zealand)', 'en_PG' => 'Tiếng Anh (Papua New Guinea)', 'en_PH' => 'Tiếng Anh (Philippines)', 'en_PK' => 'Tiếng Anh (Pakistan)', + 'en_PL' => 'Tiếng Anh (Ba Lan)', 'en_PN' => 'Tiếng Anh (Quần đảo Pitcairn)', 'en_PR' => 'Tiếng Anh (Puerto Rico)', + 'en_PT' => 'Tiếng Anh (Bồ Đào Nha)', 'en_PW' => 'Tiếng Anh (Palau)', + 'en_RO' => 'Tiếng Anh (Romania)', 'en_RW' => 'Tiếng Anh (Rwanda)', 'en_SB' => 'Tiếng Anh (Quần đảo Solomon)', 'en_SC' => 'Tiếng Anh (Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'Tiếng Anh (Singapore)', 'en_SH' => 'Tiếng Anh (St. Helena)', 'en_SI' => 'Tiếng Anh (Slovenia)', + 'en_SK' => 'Tiếng Anh (Slovakia)', 'en_SL' => 'Tiếng Anh (Sierra Leone)', 'en_SS' => 'Tiếng Anh (Nam Sudan)', 'en_SX' => 'Tiếng Anh (Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/wo.php b/src/Symfony/Component/Intl/Resources/data/locales/wo.php index d2cfe09c2eb3b..b6b651d9e27b0 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/wo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/wo.php @@ -110,29 +110,35 @@ 'en_CM' => 'Àngale (Kamerun)', 'en_CX' => 'Àngale (Dunu Kirismas)', 'en_CY' => 'Àngale (Siipar)', + 'en_CZ' => 'Àngale (Réewum Cek)', 'en_DE' => 'Àngale (Almaañ)', 'en_DK' => 'Àngale (Danmàrk)', 'en_DM' => 'Àngale (Dominik)', 'en_ER' => 'Àngale (Eritere)', + 'en_ES' => 'Àngale (Españ)', 'en_FI' => 'Àngale (Finlànd)', 'en_FJ' => 'Àngale (Fijji)', 'en_FK' => 'Àngale (Duni Falkland)', 'en_FM' => 'Àngale (Mikoronesi)', + 'en_FR' => 'Àngale (Faraans)', 'en_GB' => 'Àngale (Ruwaayom Ini)', 'en_GD' => 'Àngale (Garanad)', 'en_GG' => 'Àngale (Gernase)', 'en_GH' => 'Àngale (Gana)', 'en_GI' => 'Àngale (Sibraltaar)', 'en_GM' => 'Àngale (Gàmbi)', + 'en_GS' => 'Àngale (Seworsi di Sid ak Duni Sàndwiis di Sid)', 'en_GU' => 'Àngale (Guwam)', 'en_GY' => 'Àngale (Giyaan)', 'en_HK' => 'Àngale (Ooŋ Koŋ)', + 'en_HU' => 'Àngale (Ongari)', 'en_ID' => 'Àngale (Indonesi)', 'en_IE' => 'Àngale (Irlànd)', 'en_IL' => 'Àngale (Israyel)', 'en_IM' => 'Àngale (Dunu Maan)', 'en_IN' => 'Àngale (End)', 'en_IO' => 'Àngale (Terituwaaru Brëtaañ ci Oseyaa Enjeŋ)', + 'en_IT' => 'Àngale (Itali)', 'en_JE' => 'Àngale (Serse)', 'en_JM' => 'Àngale (Samayig)', 'en_KE' => 'Àngale (Keeña)', @@ -156,15 +162,19 @@ 'en_NF' => 'Àngale (Dunu Norfolk)', 'en_NG' => 'Àngale (Niseriya)', 'en_NL' => 'Àngale (Peyi Baa)', + 'en_NO' => 'Àngale (Norwees)', 'en_NR' => 'Àngale (Nawru)', 'en_NU' => 'Àngale (Niw)', 'en_NZ' => 'Àngale (Nuwel Selànd)', 'en_PG' => 'Àngale (Papuwasi Gine Gu Bees)', 'en_PH' => 'Àngale (Filipin)', 'en_PK' => 'Àngale (Pakistaŋ)', + 'en_PL' => 'Àngale (Poloñ)', 'en_PN' => 'Àngale (Duni Pitkayirn)', 'en_PR' => 'Àngale (Porto Riko)', + 'en_PT' => 'Àngale (Portigaal)', 'en_PW' => 'Àngale (Palaw)', + 'en_RO' => 'Àngale (Rumani)', 'en_RW' => 'Àngale (Ruwànda)', 'en_SB' => 'Àngale (Duni Salmoon)', 'en_SC' => 'Àngale (Seysel)', @@ -173,6 +183,7 @@ 'en_SG' => 'Àngale (Singapuur)', 'en_SH' => 'Àngale (Saŋ Eleen)', 'en_SI' => 'Àngale (Esloweni)', + 'en_SK' => 'Àngale (Eslowaki)', 'en_SL' => 'Àngale (Siyera Lewon)', 'en_SS' => 'Àngale (Sudaŋ di Sid)', 'en_SX' => 'Àngale (Sin Marten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/xh.php b/src/Symfony/Component/Intl/Resources/data/locales/xh.php index 545dae2d2f02c..a5fd201835683 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/xh.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/xh.php @@ -70,29 +70,35 @@ 'en_CM' => 'IsiNgesi (ECameroon)', 'en_CX' => 'IsiNgesi (EChristmas Island)', 'en_CY' => 'IsiNgesi (ECyprus)', + 'en_CZ' => 'IsiNgesi (ECzechia)', 'en_DE' => 'IsiNgesi (EJamani)', 'en_DK' => 'IsiNgesi (EDenmark)', 'en_DM' => 'IsiNgesi (EDominica)', 'en_ER' => 'IsiNgesi (E-Eritrea)', + 'en_ES' => 'IsiNgesi (ESpain)', 'en_FI' => 'IsiNgesi (EFinland)', 'en_FJ' => 'IsiNgesi (EFiji)', 'en_FK' => 'IsiNgesi (EFalkland Islands)', 'en_FM' => 'IsiNgesi (EMicronesia)', + 'en_FR' => 'IsiNgesi (EFrance)', 'en_GB' => 'IsiNgesi (E-United Kingdom)', 'en_GD' => 'IsiNgesi (EGrenada)', 'en_GG' => 'IsiNgesi (EGuernsey)', 'en_GH' => 'IsiNgesi (EGhana)', 'en_GI' => 'IsiNgesi (EGibraltar)', 'en_GM' => 'IsiNgesi (EGambia)', + 'en_GS' => 'IsiNgesi (ESouth Georgia & South Sandwich Islands)', 'en_GU' => 'IsiNgesi (EGuam)', 'en_GY' => 'IsiNgesi (EGuyana)', 'en_HK' => 'IsiNgesi (EHong Kong SAR China)', + 'en_HU' => 'IsiNgesi (EHungary)', 'en_ID' => 'IsiNgesi (E-Indonesia)', 'en_IE' => 'IsiNgesi (E-Ireland)', 'en_IL' => 'IsiNgesi (E-Israel)', 'en_IM' => 'IsiNgesi (E-Isle of Man)', 'en_IN' => 'IsiNgesi (E-Indiya)', 'en_IO' => 'IsiNgesi (EBritish Indian Ocean Territory)', + 'en_IT' => 'IsiNgesi (E-Italy)', 'en_JE' => 'IsiNgesi (EJersey)', 'en_JM' => 'IsiNgesi (EJamaica)', 'en_KE' => 'IsiNgesi (EKenya)', @@ -116,15 +122,19 @@ 'en_NF' => 'IsiNgesi (ENorfolk Island)', 'en_NG' => 'IsiNgesi (ENigeria)', 'en_NL' => 'IsiNgesi (ENetherlands)', + 'en_NO' => 'IsiNgesi (ENorway)', 'en_NR' => 'IsiNgesi (ENauru)', 'en_NU' => 'IsiNgesi (ENiue)', 'en_NZ' => 'IsiNgesi (ENew Zealand)', 'en_PG' => 'IsiNgesi (EPapua New Guinea)', 'en_PH' => 'IsiNgesi (EPhilippines)', 'en_PK' => 'IsiNgesi (EPakistan)', + 'en_PL' => 'IsiNgesi (EPoland)', 'en_PN' => 'IsiNgesi (EPitcairn Islands)', 'en_PR' => 'IsiNgesi (EPuerto Rico)', + 'en_PT' => 'IsiNgesi (EPortugal)', 'en_PW' => 'IsiNgesi (EPalau)', + 'en_RO' => 'IsiNgesi (ERomania)', 'en_RW' => 'IsiNgesi (ERwanda)', 'en_SB' => 'IsiNgesi (ESolomon Islands)', 'en_SC' => 'IsiNgesi (ESeychelles)', @@ -133,6 +143,7 @@ 'en_SG' => 'IsiNgesi (ESingapore)', 'en_SH' => 'IsiNgesi (ESt. Helena)', 'en_SI' => 'IsiNgesi (ESlovenia)', + 'en_SK' => 'IsiNgesi (ESlovakia)', 'en_SL' => 'IsiNgesi (ESierra Leone)', 'en_SS' => 'IsiNgesi (ESouth Sudan)', 'en_SX' => 'IsiNgesi (ESint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/yi.php b/src/Symfony/Component/Intl/Resources/data/locales/yi.php index 637965efcd024..a4329df990afd 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/yi.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/yi.php @@ -88,14 +88,17 @@ 'en_CH' => 'ענגליש (שווייץ)', 'en_CK' => 'ענגליש (קוק אינזלען)', 'en_CM' => 'ענגליש (קאַמערון)', + 'en_CZ' => 'ענגליש (טשעכיי)', 'en_DE' => 'ענגליש (דייטשלאַנד)', 'en_DK' => 'ענגליש (דענמאַרק)', 'en_DM' => 'ענגליש (דאמיניקע)', 'en_ER' => 'ענגליש (עריטרעע)', + 'en_ES' => 'ענגליש (שפּאַניע)', 'en_FI' => 'ענגליש (פֿינלאַנד)', 'en_FJ' => 'ענגליש (פֿידזשי)', 'en_FK' => 'ענגליש (פֿאַלקלאַנד אינזלען)', 'en_FM' => 'ענגליש (מיקראנעזיע)', + 'en_FR' => 'ענגליש (פֿראַנקרייך)', 'en_GB' => 'ענגליש (פֿאַראייניגטע קעניגרייך)', 'en_GD' => 'ענגליש (גרענאַדאַ)', 'en_GG' => 'ענגליש (גערנזי)', @@ -104,10 +107,12 @@ 'en_GM' => 'ענגליש (גאַמביע)', 'en_GU' => 'ענגליש (גוואַם)', 'en_GY' => 'ענגליש (גויאַנע)', + 'en_HU' => 'ענגליש (אונגערן)', 'en_ID' => 'ענגליש (אינדאנעזיע)', 'en_IE' => 'ענגליש (אירלאַנד)', 'en_IL' => 'ענגליש (ישראל)', 'en_IN' => 'ענגליש (אינדיע)', + 'en_IT' => 'ענגליש (איטאַליע)', 'en_JE' => 'ענגליש (דזשערזי)', 'en_JM' => 'ענגליש (דזשאַמייקע)', 'en_KE' => 'ענגליש (קעניע)', @@ -127,12 +132,16 @@ 'en_NF' => 'ענגליש (נארפֿאלק אינזל)', 'en_NG' => 'ענגליש (ניגעריע)', 'en_NL' => 'ענגליש (האלאַנד)', + 'en_NO' => 'ענגליש (נארוועגיע)', 'en_NZ' => 'ענגליש (ניו זילאַנד)', 'en_PG' => 'ענגליש (פּאַפּואַ נײַ גינע)', 'en_PH' => 'ענגליש (פֿיליפּינען)', 'en_PK' => 'ענגליש (פּאַקיסטאַן)', + 'en_PL' => 'ענגליש (פּוילן)', 'en_PN' => 'ענגליש (פּיטקערן אינזלען)', 'en_PR' => 'ענגליש (פּארטא־ריקא)', + 'en_PT' => 'ענגליש (פּארטוגאַל)', + 'en_RO' => 'ענגליש (רומעניע)', 'en_RW' => 'ענגליש (רוואַנדע)', 'en_SB' => 'ענגליש (סאלאמאן אינזלען)', 'en_SC' => 'ענגליש (סיישעל)', @@ -141,6 +150,7 @@ 'en_SG' => 'ענגליש (סינגאַפּור)', 'en_SH' => 'ענגליש (סט העלענע)', 'en_SI' => 'ענגליש (סלאוועניע)', + 'en_SK' => 'ענגליש (סלאוואַקיי)', 'en_SL' => 'ענגליש (סיערע לעאנע)', 'en_SS' => 'ענגליש (דרום־סודאַן)', 'en_SZ' => 'ענגליש (סוואַזילאַנד)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/yo.php b/src/Symfony/Component/Intl/Resources/data/locales/yo.php index ae6b18624fabb..e06835970cbf1 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/yo.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/yo.php @@ -121,29 +121,35 @@ 'en_CM' => 'Èdè Gẹ̀ẹ́sì (Kamerúúnì)', 'en_CX' => 'Èdè Gẹ̀ẹ́sì (Erékùsù Christmas)', 'en_CY' => 'Èdè Gẹ̀ẹ́sì (Kúrúsì)', + 'en_CZ' => 'Èdè Gẹ̀ẹ́sì (Ṣẹ́ẹ́kì)', 'en_DE' => 'Èdè Gẹ̀ẹ́sì (Jámánì)', 'en_DK' => 'Èdè Gẹ̀ẹ́sì (Dẹ́mákì)', 'en_DM' => 'Èdè Gẹ̀ẹ́sì (Dòmíníkà)', 'en_ER' => 'Èdè Gẹ̀ẹ́sì (Eritira)', + 'en_ES' => 'Èdè Gẹ̀ẹ́sì (Sípéìnì)', 'en_FI' => 'Èdè Gẹ̀ẹ́sì (Filandi)', 'en_FJ' => 'Èdè Gẹ̀ẹ́sì (Fíjì)', 'en_FK' => 'Èdè Gẹ̀ẹ́sì (Etikun Fakalandi)', 'en_FM' => 'Èdè Gẹ̀ẹ́sì (Makoronesia)', + 'en_FR' => 'Èdè Gẹ̀ẹ́sì (Faranse)', 'en_GB' => 'Èdè Gẹ̀ẹ́sì (Gẹ̀ẹ́sì)', 'en_GD' => 'Èdè Gẹ̀ẹ́sì (Genada)', 'en_GG' => 'Èdè Gẹ̀ẹ́sì (Guernsey)', 'en_GH' => 'Èdè Gẹ̀ẹ́sì (Gana)', 'en_GI' => 'Èdè Gẹ̀ẹ́sì (Gibaratara)', 'en_GM' => 'Èdè Gẹ̀ẹ́sì (Gambia)', + 'en_GS' => 'Èdè Gẹ̀ẹ́sì (Gúúsù Georgia àti Gúúsù Àwọn Erékùsù Sandwich)', 'en_GU' => 'Èdè Gẹ̀ẹ́sì (Guamu)', 'en_GY' => 'Èdè Gẹ̀ẹ́sì (Guyana)', 'en_HK' => 'Èdè Gẹ̀ẹ́sì (Agbègbè Ìṣàkóso Ìṣúná Hong Kong Tí Ṣánà Ń Darí)', + 'en_HU' => 'Èdè Gẹ̀ẹ́sì (Hungari)', 'en_ID' => 'Èdè Gẹ̀ẹ́sì (Indonéṣíà)', 'en_IE' => 'Èdè Gẹ̀ẹ́sì (Ailandi)', 'en_IL' => 'Èdè Gẹ̀ẹ́sì (Iserẹli)', 'en_IM' => 'Èdè Gẹ̀ẹ́sì (Erékùṣù ilẹ̀ Man)', 'en_IN' => 'Èdè Gẹ̀ẹ́sì (Íńdíà)', 'en_IO' => 'Èdè Gẹ̀ẹ́sì (Etíkun Índíánì ti Ìlú Bírítísì)', + 'en_IT' => 'Èdè Gẹ̀ẹ́sì (Itáli)', 'en_JE' => 'Èdè Gẹ̀ẹ́sì (Jẹsì)', 'en_JM' => 'Èdè Gẹ̀ẹ́sì (Jamaika)', 'en_KE' => 'Èdè Gẹ̀ẹ́sì (Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'Èdè Gẹ̀ẹ́sì (Erékùsù Nọ́úfókì)', 'en_NG' => 'Èdè Gẹ̀ẹ́sì (Nàìjíríà)', 'en_NL' => 'Èdè Gẹ̀ẹ́sì (Nedalandi)', + 'en_NO' => 'Èdè Gẹ̀ẹ́sì (Nọọwii)', 'en_NR' => 'Èdè Gẹ̀ẹ́sì (Nauru)', 'en_NU' => 'Èdè Gẹ̀ẹ́sì (Niue)', 'en_NZ' => 'Èdè Gẹ̀ẹ́sì (Ṣilandi Titun)', 'en_PG' => 'Èdè Gẹ̀ẹ́sì (Paapu ti Giini)', 'en_PH' => 'Èdè Gẹ̀ẹ́sì (Filipini)', 'en_PK' => 'Èdè Gẹ̀ẹ́sì (Pakisitan)', + 'en_PL' => 'Èdè Gẹ̀ẹ́sì (Polandi)', 'en_PN' => 'Èdè Gẹ̀ẹ́sì (Pikarini)', 'en_PR' => 'Èdè Gẹ̀ẹ́sì (Pọto Riko)', + 'en_PT' => 'Èdè Gẹ̀ẹ́sì (Pọ́túgà)', 'en_PW' => 'Èdè Gẹ̀ẹ́sì (Paalu)', + 'en_RO' => 'Èdè Gẹ̀ẹ́sì (Romaniya)', 'en_RW' => 'Èdè Gẹ̀ẹ́sì (Ruwanda)', 'en_SB' => 'Èdè Gẹ̀ẹ́sì (Etikun Solomoni)', 'en_SC' => 'Èdè Gẹ̀ẹ́sì (Ṣeṣẹlẹsi)', @@ -184,6 +194,7 @@ 'en_SG' => 'Èdè Gẹ̀ẹ́sì (Singapo)', 'en_SH' => 'Èdè Gẹ̀ẹ́sì (Hẹlena)', 'en_SI' => 'Èdè Gẹ̀ẹ́sì (Silofania)', + 'en_SK' => 'Èdè Gẹ̀ẹ́sì (Silofakia)', 'en_SL' => 'Èdè Gẹ̀ẹ́sì (Siria looni)', 'en_SS' => 'Èdè Gẹ̀ẹ́sì (Gúúsù Sudan)', 'en_SX' => 'Èdè Gẹ̀ẹ́sì (Síntì Mátẹ́ẹ̀nì)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/yo_BJ.php b/src/Symfony/Component/Intl/Resources/data/locales/yo_BJ.php index e5dee9ccca219..c3133a658606f 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/yo_BJ.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/yo_BJ.php @@ -53,29 +53,35 @@ 'en_CM' => 'Èdè Gɛ̀ɛ́sì (Kamerúúnì)', 'en_CX' => 'Èdè Gɛ̀ɛ́sì (Erékùsù Christmas)', 'en_CY' => 'Èdè Gɛ̀ɛ́sì (Kúrúsì)', + 'en_CZ' => 'Èdè Gɛ̀ɛ́sì (Shɛ́ɛ́kì)', 'en_DE' => 'Èdè Gɛ̀ɛ́sì (Jámánì)', 'en_DK' => 'Èdè Gɛ̀ɛ́sì (Dɛ́mákì)', 'en_DM' => 'Èdè Gɛ̀ɛ́sì (Dòmíníkà)', 'en_ER' => 'Èdè Gɛ̀ɛ́sì (Eritira)', + 'en_ES' => 'Èdè Gɛ̀ɛ́sì (Sípéìnì)', 'en_FI' => 'Èdè Gɛ̀ɛ́sì (Filandi)', 'en_FJ' => 'Èdè Gɛ̀ɛ́sì (Fíjì)', 'en_FK' => 'Èdè Gɛ̀ɛ́sì (Etikun Fakalandi)', 'en_FM' => 'Èdè Gɛ̀ɛ́sì (Makoronesia)', + 'en_FR' => 'Èdè Gɛ̀ɛ́sì (Faranse)', 'en_GB' => 'Èdè Gɛ̀ɛ́sì (Gɛ̀ɛ́sì)', 'en_GD' => 'Èdè Gɛ̀ɛ́sì (Genada)', 'en_GG' => 'Èdè Gɛ̀ɛ́sì (Guernsey)', 'en_GH' => 'Èdè Gɛ̀ɛ́sì (Gana)', 'en_GI' => 'Èdè Gɛ̀ɛ́sì (Gibaratara)', 'en_GM' => 'Èdè Gɛ̀ɛ́sì (Gambia)', + 'en_GS' => 'Èdè Gɛ̀ɛ́sì (Gúúsù Georgia àti Gúúsù Àwɔn Erékùsù Sandwich)', 'en_GU' => 'Èdè Gɛ̀ɛ́sì (Guamu)', 'en_GY' => 'Èdè Gɛ̀ɛ́sì (Guyana)', 'en_HK' => 'Èdè Gɛ̀ɛ́sì (Agbègbè Ìshàkóso Ìshúná Hong Kong Tí Shánà Ń Darí)', + 'en_HU' => 'Èdè Gɛ̀ɛ́sì (Hungari)', 'en_ID' => 'Èdè Gɛ̀ɛ́sì (Indonéshíà)', 'en_IE' => 'Èdè Gɛ̀ɛ́sì (Ailandi)', 'en_IL' => 'Èdè Gɛ̀ɛ́sì (Iserɛli)', 'en_IM' => 'Èdè Gɛ̀ɛ́sì (Erékùshù ilɛ̀ Man)', 'en_IN' => 'Èdè Gɛ̀ɛ́sì (Íńdíà)', 'en_IO' => 'Èdè Gɛ̀ɛ́sì (Etíkun Índíánì ti Ìlú Bírítísì)', + 'en_IT' => 'Èdè Gɛ̀ɛ́sì (Itáli)', 'en_JE' => 'Èdè Gɛ̀ɛ́sì (Jɛsì)', 'en_JM' => 'Èdè Gɛ̀ɛ́sì (Jamaika)', 'en_KE' => 'Èdè Gɛ̀ɛ́sì (Kenya)', @@ -99,15 +105,19 @@ 'en_NF' => 'Èdè Gɛ̀ɛ́sì (Erékùsù Nɔ́úfókì)', 'en_NG' => 'Èdè Gɛ̀ɛ́sì (Nàìjíríà)', 'en_NL' => 'Èdè Gɛ̀ɛ́sì (Nedalandi)', + 'en_NO' => 'Èdè Gɛ̀ɛ́sì (Nɔɔwii)', 'en_NR' => 'Èdè Gɛ̀ɛ́sì (Nauru)', 'en_NU' => 'Èdè Gɛ̀ɛ́sì (Niue)', 'en_NZ' => 'Èdè Gɛ̀ɛ́sì (Shilandi Titun)', 'en_PG' => 'Èdè Gɛ̀ɛ́sì (Paapu ti Giini)', 'en_PH' => 'Èdè Gɛ̀ɛ́sì (Filipini)', 'en_PK' => 'Èdè Gɛ̀ɛ́sì (Pakisitan)', + 'en_PL' => 'Èdè Gɛ̀ɛ́sì (Polandi)', 'en_PN' => 'Èdè Gɛ̀ɛ́sì (Pikarini)', 'en_PR' => 'Èdè Gɛ̀ɛ́sì (Pɔto Riko)', + 'en_PT' => 'Èdè Gɛ̀ɛ́sì (Pɔ́túgà)', 'en_PW' => 'Èdè Gɛ̀ɛ́sì (Paalu)', + 'en_RO' => 'Èdè Gɛ̀ɛ́sì (Romaniya)', 'en_RW' => 'Èdè Gɛ̀ɛ́sì (Ruwanda)', 'en_SB' => 'Èdè Gɛ̀ɛ́sì (Etikun Solomoni)', 'en_SC' => 'Èdè Gɛ̀ɛ́sì (Sheshɛlɛsi)', @@ -116,6 +126,7 @@ 'en_SG' => 'Èdè Gɛ̀ɛ́sì (Singapo)', 'en_SH' => 'Èdè Gɛ̀ɛ́sì (Hɛlena)', 'en_SI' => 'Èdè Gɛ̀ɛ́sì (Silofania)', + 'en_SK' => 'Èdè Gɛ̀ɛ́sì (Silofakia)', 'en_SL' => 'Èdè Gɛ̀ɛ́sì (Siria looni)', 'en_SS' => 'Èdè Gɛ̀ɛ́sì (Gúúsù Sudan)', 'en_SX' => 'Èdè Gɛ̀ɛ́sì (Síntì Mátɛ́ɛ̀nì)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/zh.php b/src/Symfony/Component/Intl/Resources/data/locales/zh.php index 3a7b27c3127bc..fecdd7be6bf63 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/zh.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/zh.php @@ -121,29 +121,35 @@ 'en_CM' => '英语(喀麦隆)', 'en_CX' => '英语(圣诞岛)', 'en_CY' => '英语(塞浦路斯)', + 'en_CZ' => '英语(捷克)', 'en_DE' => '英语(德国)', 'en_DK' => '英语(丹麦)', 'en_DM' => '英语(多米尼克)', 'en_ER' => '英语(厄立特里亚)', + 'en_ES' => '英语(西班牙)', 'en_FI' => '英语(芬兰)', 'en_FJ' => '英语(斐济)', 'en_FK' => '英语(福克兰群岛)', 'en_FM' => '英语(密克罗尼西亚)', + 'en_FR' => '英语(法国)', 'en_GB' => '英语(英国)', 'en_GD' => '英语(格林纳达)', 'en_GG' => '英语(根西岛)', 'en_GH' => '英语(加纳)', 'en_GI' => '英语(直布罗陀)', 'en_GM' => '英语(冈比亚)', + 'en_GS' => '英语(南乔治亚和南桑威奇群岛)', 'en_GU' => '英语(关岛)', 'en_GY' => '英语(圭亚那)', 'en_HK' => '英语(中国香港特别行政区)', + 'en_HU' => '英语(匈牙利)', 'en_ID' => '英语(印度尼西亚)', 'en_IE' => '英语(爱尔兰)', 'en_IL' => '英语(以色列)', 'en_IM' => '英语(马恩岛)', 'en_IN' => '英语(印度)', 'en_IO' => '英语(英属印度洋领地)', + 'en_IT' => '英语(意大利)', 'en_JE' => '英语(泽西岛)', 'en_JM' => '英语(牙买加)', 'en_KE' => '英语(肯尼亚)', @@ -167,15 +173,19 @@ 'en_NF' => '英语(诺福克岛)', 'en_NG' => '英语(尼日利亚)', 'en_NL' => '英语(荷兰)', + 'en_NO' => '英语(挪威)', 'en_NR' => '英语(瑙鲁)', 'en_NU' => '英语(纽埃)', 'en_NZ' => '英语(新西兰)', 'en_PG' => '英语(巴布亚新几内亚)', 'en_PH' => '英语(菲律宾)', 'en_PK' => '英语(巴基斯坦)', + 'en_PL' => '英语(波兰)', 'en_PN' => '英语(皮特凯恩群岛)', 'en_PR' => '英语(波多黎各)', + 'en_PT' => '英语(葡萄牙)', 'en_PW' => '英语(帕劳)', + 'en_RO' => '英语(罗马尼亚)', 'en_RW' => '英语(卢旺达)', 'en_SB' => '英语(所罗门群岛)', 'en_SC' => '英语(塞舌尔)', @@ -184,6 +194,7 @@ 'en_SG' => '英语(新加坡)', 'en_SH' => '英语(圣赫勒拿)', 'en_SI' => '英语(斯洛文尼亚)', + 'en_SK' => '英语(斯洛伐克)', 'en_SL' => '英语(塞拉利昂)', 'en_SS' => '英语(南苏丹)', 'en_SX' => '英语(荷属圣马丁)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant.php b/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant.php index d58286ccd5369..5cd6867b2c56a 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant.php @@ -121,29 +121,35 @@ 'en_CM' => '英文(喀麥隆)', 'en_CX' => '英文(聖誕島)', 'en_CY' => '英文(賽普勒斯)', + 'en_CZ' => '英文(捷克)', 'en_DE' => '英文(德國)', 'en_DK' => '英文(丹麥)', 'en_DM' => '英文(多米尼克)', 'en_ER' => '英文(厄利垂亞)', + 'en_ES' => '英文(西班牙)', 'en_FI' => '英文(芬蘭)', 'en_FJ' => '英文(斐濟)', 'en_FK' => '英文(福克蘭群島)', 'en_FM' => '英文(密克羅尼西亞)', + 'en_FR' => '英文(法國)', 'en_GB' => '英文(英國)', 'en_GD' => '英文(格瑞那達)', 'en_GG' => '英文(根息)', 'en_GH' => '英文(迦納)', 'en_GI' => '英文(直布羅陀)', 'en_GM' => '英文(甘比亞)', + 'en_GS' => '英文(南喬治亞與南三明治群島)', 'en_GU' => '英文(關島)', 'en_GY' => '英文(蓋亞那)', 'en_HK' => '英文(中國香港特別行政區)', + 'en_HU' => '英文(匈牙利)', 'en_ID' => '英文(印尼)', 'en_IE' => '英文(愛爾蘭)', 'en_IL' => '英文(以色列)', 'en_IM' => '英文(曼島)', 'en_IN' => '英文(印度)', 'en_IO' => '英文(英屬印度洋領地)', + 'en_IT' => '英文(義大利)', 'en_JE' => '英文(澤西島)', 'en_JM' => '英文(牙買加)', 'en_KE' => '英文(肯亞)', @@ -167,15 +173,19 @@ 'en_NF' => '英文(諾福克島)', 'en_NG' => '英文(奈及利亞)', 'en_NL' => '英文(荷蘭)', + 'en_NO' => '英文(挪威)', 'en_NR' => '英文(諾魯)', 'en_NU' => '英文(紐埃島)', 'en_NZ' => '英文(紐西蘭)', 'en_PG' => '英文(巴布亞紐幾內亞)', 'en_PH' => '英文(菲律賓)', 'en_PK' => '英文(巴基斯坦)', + 'en_PL' => '英文(波蘭)', 'en_PN' => '英文(皮特肯群島)', 'en_PR' => '英文(波多黎各)', + 'en_PT' => '英文(葡萄牙)', 'en_PW' => '英文(帛琉)', + 'en_RO' => '英文(羅馬尼亞)', 'en_RW' => '英文(盧安達)', 'en_SB' => '英文(索羅門群島)', 'en_SC' => '英文(塞席爾)', @@ -184,6 +194,7 @@ 'en_SG' => '英文(新加坡)', 'en_SH' => '英文(聖赫勒拿島)', 'en_SI' => '英文(斯洛維尼亞)', + 'en_SK' => '英文(斯洛伐克)', 'en_SL' => '英文(獅子山)', 'en_SS' => '英文(南蘇丹)', 'en_SX' => '英文(荷屬聖馬丁)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant_HK.php b/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant_HK.php index e3e519fc059c7..b9ad2bc68fecb 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant_HK.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/zh_Hant_HK.php @@ -52,8 +52,10 @@ 'en_GD' => '英文(格林納達)', 'en_GH' => '英文(加納)', 'en_GM' => '英文(岡比亞)', + 'en_GS' => '英文(南佐治亞島與南桑威奇群島)', 'en_GY' => '英文(圭亞那)', 'en_IM' => '英文(馬恩島)', + 'en_IT' => '英文(意大利)', 'en_KE' => '英文(肯尼亞)', 'en_KN' => '英文(聖基茨和尼維斯)', 'en_LC' => '英文(聖盧西亞)', diff --git a/src/Symfony/Component/Intl/Resources/data/locales/zu.php b/src/Symfony/Component/Intl/Resources/data/locales/zu.php index 5f7a1748c2df8..38f51b7c133ce 100644 --- a/src/Symfony/Component/Intl/Resources/data/locales/zu.php +++ b/src/Symfony/Component/Intl/Resources/data/locales/zu.php @@ -121,29 +121,35 @@ 'en_CM' => 'i-English (i-Cameroon)', 'en_CX' => 'i-English (i-Christmas Island)', 'en_CY' => 'i-English (i-Cyprus)', + 'en_CZ' => 'i-English (i-Czechia)', 'en_DE' => 'i-English (i-Germany)', 'en_DK' => 'i-English (i-Denmark)', 'en_DM' => 'i-English (i-Dominica)', 'en_ER' => 'i-English (i-Eritrea)', + 'en_ES' => 'i-English (i-Spain)', 'en_FI' => 'i-English (i-Finland)', 'en_FJ' => 'i-English (i-Fiji)', 'en_FK' => 'i-English (i-Falkland Islands)', 'en_FM' => 'i-English (i-Micronesia)', + 'en_FR' => 'i-English (i-France)', 'en_GB' => 'i-English (i-United Kingdom)', 'en_GD' => 'i-English (i-Grenada)', 'en_GG' => 'i-English (i-Guernsey)', 'en_GH' => 'i-English (i-Ghana)', 'en_GI' => 'i-English (i-Gibraltar)', 'en_GM' => 'i-English (i-Gambia)', + 'en_GS' => 'i-English (i-South Georgia ne-South Sandwich Islands)', 'en_GU' => 'i-English (i-Guam)', 'en_GY' => 'i-English (i-Guyana)', 'en_HK' => 'i-English (i-Hong Kong SAR China)', + 'en_HU' => 'i-English (i-Hungary)', 'en_ID' => 'i-English (i-Indonesia)', 'en_IE' => 'i-English (i-Ireland)', 'en_IL' => 'i-English (kwa-Israel)', 'en_IM' => 'i-English (i-Isle of Man)', 'en_IN' => 'i-English (i-India)', 'en_IO' => 'i-English (i-British Indian Ocean Territory)', + 'en_IT' => 'i-English (i-Italy)', 'en_JE' => 'i-English (i-Jersey)', 'en_JM' => 'i-English (i-Jamaica)', 'en_KE' => 'i-English (i-Kenya)', @@ -167,15 +173,19 @@ 'en_NF' => 'i-English (i-Norfolk Island)', 'en_NG' => 'i-English (i-Nigeria)', 'en_NL' => 'i-English (i-Netherlands)', + 'en_NO' => 'i-English (i-Norway)', 'en_NR' => 'i-English (i-Nauru)', 'en_NU' => 'i-English (i-Niue)', 'en_NZ' => 'i-English (i-New Zealand)', 'en_PG' => 'i-English (i-Papua New Guinea)', 'en_PH' => 'i-English (i-Philippines)', 'en_PK' => 'i-English (i-Pakistan)', + 'en_PL' => 'i-English (i-Poland)', 'en_PN' => 'i-English (i-Pitcairn Islands)', 'en_PR' => 'i-English (i-Puerto Rico)', + 'en_PT' => 'i-English (i-Portugal)', 'en_PW' => 'i-English (i-Palau)', + 'en_RO' => 'i-English (i-Romania)', 'en_RW' => 'i-English (i-Rwanda)', 'en_SB' => 'i-English (i-Solomon Islands)', 'en_SC' => 'i-English (i-Seychelles)', @@ -184,6 +194,7 @@ 'en_SG' => 'i-English (i-Singapore)', 'en_SH' => 'i-English (i-St. Helena)', 'en_SI' => 'i-English (i-Slovenia)', + 'en_SK' => 'i-English (i-Slovakia)', 'en_SL' => 'i-English (i-Sierra Leone)', 'en_SS' => 'i-English (i-South Sudan)', 'en_SX' => 'i-English (i-Sint Maarten)', diff --git a/src/Symfony/Component/Intl/Resources/data/regions/meta.php b/src/Symfony/Component/Intl/Resources/data/regions/meta.php index 8548a28f123a2..e0a99ccb7f5a8 100644 --- a/src/Symfony/Component/Intl/Resources/data/regions/meta.php +++ b/src/Symfony/Component/Intl/Resources/data/regions/meta.php @@ -1,14 +1,5 @@ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - return [ 'Regions' => [ 'AD', @@ -764,7 +755,6 @@ 'ZWE' => 'ZW', ], 'Alpha2ToNumeric' => [ - 'AA' => '958', 'AD' => '020', 'AE' => '784', 'AF' => '004', @@ -952,18 +942,6 @@ 'PW' => '585', 'PY' => '600', 'QA' => '634', - 'QM' => '959', - 'QN' => '960', - 'QP' => '962', - 'QQ' => '963', - 'QR' => '964', - 'QS' => '965', - 'QT' => '966', - 'QV' => '968', - 'QW' => '969', - 'QX' => '970', - 'QY' => '971', - 'QZ' => '972', 'RE' => '638', 'RO' => '642', 'RS' => '688', @@ -1021,29 +999,6 @@ 'VU' => '548', 'WF' => '876', 'WS' => '882', - 'XC' => '975', - 'XD' => '976', - 'XE' => '977', - 'XF' => '978', - 'XG' => '979', - 'XH' => '980', - 'XI' => '981', - 'XJ' => '982', - 'XL' => '984', - 'XM' => '985', - 'XN' => '986', - 'XO' => '987', - 'XP' => '988', - 'XQ' => '989', - 'XR' => '990', - 'XS' => '991', - 'XT' => '992', - 'XU' => '993', - 'XV' => '994', - 'XW' => '995', - 'XX' => '996', - 'XY' => '997', - 'XZ' => '998', 'YE' => '887', 'YT' => '175', 'ZA' => '710', @@ -1051,7 +1006,6 @@ 'ZW' => '716', ], 'NumericToAlpha2' => [ - '_958' => 'AA', '_020' => 'AD', '_784' => 'AE', '_004' => 'AF', @@ -1239,18 +1193,6 @@ '_585' => 'PW', '_600' => 'PY', '_634' => 'QA', - '_959' => 'QM', - '_960' => 'QN', - '_962' => 'QP', - '_963' => 'QQ', - '_964' => 'QR', - '_965' => 'QS', - '_966' => 'QT', - '_968' => 'QV', - '_969' => 'QW', - '_970' => 'QX', - '_971' => 'QY', - '_972' => 'QZ', '_638' => 'RE', '_642' => 'RO', '_688' => 'RS', @@ -1308,29 +1250,6 @@ '_548' => 'VU', '_876' => 'WF', '_882' => 'WS', - '_975' => 'XC', - '_976' => 'XD', - '_977' => 'XE', - '_978' => 'XF', - '_979' => 'XG', - '_980' => 'XH', - '_981' => 'XI', - '_982' => 'XJ', - '_984' => 'XL', - '_985' => 'XM', - '_986' => 'XN', - '_987' => 'XO', - '_988' => 'XP', - '_989' => 'XQ', - '_990' => 'XR', - '_991' => 'XS', - '_992' => 'XT', - '_993' => 'XU', - '_994' => 'XV', - '_995' => 'XW', - '_996' => 'XX', - '_997' => 'XY', - '_998' => 'XZ', '_887' => 'YE', '_175' => 'YT', '_710' => 'ZA', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/bs.php b/src/Symfony/Component/Intl/Resources/data/timezones/bs.php index 98230260811e7..e1b2d09fa0a74 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/bs.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/bs.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Sjevernoameričko istočno vrijeme (Nassau)', 'America/New_York' => 'Sjevernoameričko istočno vrijeme (New York)', 'America/Nome' => 'Aljaskansko vrijeme (Nome)', - 'America/Noronha' => 'Vrijeme na ostrvu Fernando di Noronja (Noronha)', + 'America/Noronha' => 'Vrijeme na ostrvu Fernando di Noronja (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Sjevernoameričko centralno vrijeme (Beulah, Sjeverna Dakota)', 'America/North_Dakota/Center' => 'Sjevernoameričko centralno vrijeme (Center, Sjeverna Dakota)', 'America/North_Dakota/New_Salem' => 'Sjevernoameričko centralno vrijeme (New Salem, Sjeverna Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/cs.php b/src/Symfony/Component/Intl/Resources/data/timezones/cs.php index 42e7cdacb1b13..7968b4e96125c 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/cs.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/cs.php @@ -199,7 +199,7 @@ 'America/Yakutat' => 'aljašský čas (Yakutat)', 'Antarctica/Casey' => 'západoaustralský čas (Casey)', 'Antarctica/Davis' => 'čas Davisovy stanice', - 'Antarctica/DumontDUrville' => 'čas stanice Dumonta d’Urvilla (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'čas stanice Dumonta d’Urvilla (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'východoaustralský čas (Macquarie)', 'Antarctica/Mawson' => 'čas Mawsonovy stanice', 'Antarctica/McMurdo' => 'novozélandský čas (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/dz.php b/src/Symfony/Component/Intl/Resources/data/timezones/dz.php index b5b341308b64d..58ff2f6405d79 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/dz.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/dz.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'བྱང་ཨ་མི་རི་ཀ་ཤར་ཕྱོགས་ཆུ་ཚོད། (Nassau་)', 'America/New_York' => 'བྱང་ཨ་མི་རི་ཀ་ཤར་ཕྱོགས་ཆུ་ཚོད། (New York་)', 'America/Nome' => 'ཨ་ལསི་ཀ་ཆུ་ཚོད། (Nome་)', - 'America/Noronha' => 'ཕར་ནེན་ཌོ་ ཌི་ ནོ་རཱོན་ཧ་ཆུ་ཚོད། (Noronha་)', + 'America/Noronha' => 'ཕར་ནེན་ཌོ་ ཌི་ ནོ་རཱོན་ཧ་ཆུ་ཚོད། (Fernando de Noronha་)', 'America/North_Dakota/Beulah' => 'བྱང་ཨ་མི་རི་ཀ་དབུས་ཕྱོགས་ཆུ་ཚོད། (Beulah, North Dakota་)', 'America/North_Dakota/Center' => 'བྱང་ཨ་མི་རི་ཀ་དབུས་ཕྱོགས་ཆུ་ཚོད། (Center, North Dakota་)', 'America/North_Dakota/New_Salem' => 'བྱང་ཨ་མི་རི་ཀ་དབུས་ཕྱོགས་ཆུ་ཚོད། (New Salem, North Dakota་)', @@ -199,7 +199,7 @@ 'America/Yakutat' => 'ཨ་ལསི་ཀ་ཆུ་ཚོད། (ཡ་ཀུ་ཏཏ་)', 'Antarctica/Casey' => 'ནུབ་ཕྱོགས་ཨཱོས་ཊྲེལ་ལི་ཡ་ཆུ་ཚོད། (Casey་)', 'Antarctica/Davis' => 'འཛམ་གླིང་ལྷོ་མཐའི་ཁྱགས་གླིང་ཆུ་ཚོད།། (ཌེ་ཝིས།་)', - 'Antarctica/DumontDUrville' => 'འཛམ་གླིང་ལྷོ་མཐའི་ཁྱགས་གླིང་ཆུ་ཚོད།། (Dumont d’Urville་)', + 'Antarctica/DumontDUrville' => 'འཛམ་གླིང་ལྷོ་མཐའི་ཁྱགས་གླིང་ཆུ་ཚོད།། (Dumont-d’Urville་)', 'Antarctica/Macquarie' => 'ཤར་ཕྱོགས་ཕྱོགས་ཨཱོས་ཊྲེལ་ལི་ཡ་ཆུ་ཚོད། (Macquarie་)', 'Antarctica/Mawson' => 'འཛམ་གླིང་ལྷོ་མཐའི་ཁྱགས་གླིང་ཆུ་ཚོད།། (མའུ་སཱོན་)', 'Antarctica/McMurdo' => 'ནིའུ་ཛི་ལེནཌ་ཆུ་ཚོད། (McMurdo་)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/en.php b/src/Symfony/Component/Intl/Resources/data/timezones/en.php index 06b0de9923d50..ac0c1da56977f 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/en.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/en.php @@ -197,10 +197,10 @@ 'America/Whitehorse' => 'Yukon Time (Whitehorse)', 'America/Winnipeg' => 'Central Time (Winnipeg)', 'America/Yakutat' => 'Alaska Time (Yakutat)', - 'Antarctica/Casey' => 'Western Australia Time (Casey)', + 'Antarctica/Casey' => 'Australian Western Time (Casey)', 'Antarctica/Davis' => 'Davis Time', - 'Antarctica/DumontDUrville' => 'Dumont-d’Urville Time', - 'Antarctica/Macquarie' => 'Eastern Australia Time (Macquarie)', + 'Antarctica/DumontDUrville' => 'Dumont d’Urville Time', + 'Antarctica/Macquarie' => 'Australian Eastern Time (Macquarie Island)', 'Antarctica/Mawson' => 'Mawson Time', 'Antarctica/McMurdo' => 'New Zealand Time (McMurdo)', 'Antarctica/Palmer' => 'Chile Time (Palmer)', @@ -224,13 +224,13 @@ 'Asia/Barnaul' => 'Russia Time (Barnaul)', 'Asia/Beirut' => 'Eastern European Time (Beirut)', 'Asia/Bishkek' => 'Kyrgyzstan Time (Bishkek)', - 'Asia/Brunei' => 'Brunei Darussalam Time', + 'Asia/Brunei' => 'Brunei Time', 'Asia/Calcutta' => 'India Standard Time (Kolkata)', 'Asia/Chita' => 'Yakutsk Time (Chita)', 'Asia/Colombo' => 'India Standard Time (Colombo)', 'Asia/Damascus' => 'Eastern European Time (Damascus)', 'Asia/Dhaka' => 'Bangladesh Time (Dhaka)', - 'Asia/Dili' => 'East Timor Time (Dili)', + 'Asia/Dili' => 'Timor-Leste Time (Dili)', 'Asia/Dubai' => 'Gulf Standard Time (Dubai)', 'Asia/Dushanbe' => 'Tajikistan Time (Dushanbe)', 'Asia/Famagusta' => 'Eastern European Time (Famagusta)', @@ -243,7 +243,7 @@ 'Asia/Jayapura' => 'Eastern Indonesia Time (Jayapura)', 'Asia/Jerusalem' => 'Israel Time (Jerusalem)', 'Asia/Kabul' => 'Afghanistan Time (Kabul)', - 'Asia/Kamchatka' => 'Petropavlovsk-Kamchatski Time (Kamchatka)', + 'Asia/Kamchatka' => 'Kamchatka Time', 'Asia/Karachi' => 'Pakistan Time (Karachi)', 'Asia/Katmandu' => 'Nepal Time (Kathmandu)', 'Asia/Khandyga' => 'Yakutsk Time (Khandyga)', @@ -276,7 +276,7 @@ 'Asia/Shanghai' => 'China Time (Shanghai)', 'Asia/Singapore' => 'Singapore Standard Time', 'Asia/Srednekolymsk' => 'Magadan Time (Srednekolymsk)', - 'Asia/Taipei' => 'Taipei Time', + 'Asia/Taipei' => 'Taiwan Time (Taipei)', 'Asia/Tashkent' => 'Uzbekistan Time (Tashkent)', 'Asia/Tbilisi' => 'Georgia Time (Tbilisi)', 'Asia/Tehran' => 'Iran Time (Tehran)', @@ -301,17 +301,17 @@ 'Atlantic/South_Georgia' => 'South Georgia Time', 'Atlantic/St_Helena' => 'Greenwich Mean Time (St. Helena)', 'Atlantic/Stanley' => 'Falkland Islands Time (Stanley)', - 'Australia/Adelaide' => 'Central Australia Time (Adelaide)', - 'Australia/Brisbane' => 'Eastern Australia Time (Brisbane)', - 'Australia/Broken_Hill' => 'Central Australia Time (Broken Hill)', - 'Australia/Darwin' => 'Central Australia Time (Darwin)', + 'Australia/Adelaide' => 'Australian Central Time (Adelaide)', + 'Australia/Brisbane' => 'Australian Eastern Time (Brisbane)', + 'Australia/Broken_Hill' => 'Australian Central Time (Broken Hill)', + 'Australia/Darwin' => 'Australian Central Time (Darwin)', 'Australia/Eucla' => 'Australian Central Western Time (Eucla)', - 'Australia/Hobart' => 'Eastern Australia Time (Hobart)', - 'Australia/Lindeman' => 'Eastern Australia Time (Lindeman)', - 'Australia/Lord_Howe' => 'Lord Howe Time', - 'Australia/Melbourne' => 'Eastern Australia Time (Melbourne)', - 'Australia/Perth' => 'Western Australia Time (Perth)', - 'Australia/Sydney' => 'Eastern Australia Time (Sydney)', + 'Australia/Hobart' => 'Australian Eastern Time (Hobart)', + 'Australia/Lindeman' => 'Australian Eastern Time (Lindeman)', + 'Australia/Lord_Howe' => 'Lord Howe Time (Lord Howe Island)', + 'Australia/Melbourne' => 'Australian Eastern Time (Melbourne)', + 'Australia/Perth' => 'Australian Western Time (Perth)', + 'Australia/Sydney' => 'Australian Eastern Time (Sydney)', 'Etc/GMT' => 'Greenwich Mean Time', 'Etc/UTC' => 'Coordinated Universal Time', 'Europe/Amsterdam' => 'Central European Time (Amsterdam)', @@ -383,7 +383,7 @@ 'Indian/Mauritius' => 'Mauritius Time', 'Indian/Mayotte' => 'East Africa Time (Mayotte)', 'Indian/Reunion' => 'Réunion Time', - 'Pacific/Apia' => 'Apia Time', + 'Pacific/Apia' => 'Samoa Time (Apia)', 'Pacific/Auckland' => 'New Zealand Time (Auckland)', 'Pacific/Bougainville' => 'Papua New Guinea Time (Bougainville)', 'Pacific/Chatham' => 'Chatham Time', @@ -403,15 +403,15 @@ 'Pacific/Kwajalein' => 'Marshall Islands Time (Kwajalein)', 'Pacific/Majuro' => 'Marshall Islands Time (Majuro)', 'Pacific/Marquesas' => 'Marquesas Time', - 'Pacific/Midway' => 'Samoa Time (Midway)', + 'Pacific/Midway' => 'American Samoa Time (Midway)', 'Pacific/Nauru' => 'Nauru Time', 'Pacific/Niue' => 'Niue Time', 'Pacific/Norfolk' => 'Norfolk Island Time', 'Pacific/Noumea' => 'New Caledonia Time (Noumea)', - 'Pacific/Pago_Pago' => 'Samoa Time (Pago Pago)', + 'Pacific/Pago_Pago' => 'American Samoa Time (Pago Pago)', 'Pacific/Palau' => 'Palau Time', 'Pacific/Pitcairn' => 'Pitcairn Time', - 'Pacific/Ponape' => 'Ponape Time (Pohnpei)', + 'Pacific/Ponape' => 'Pohnpei Time', 'Pacific/Port_Moresby' => 'Papua New Guinea Time (Port Moresby)', 'Pacific/Rarotonga' => 'Cook Islands Time (Rarotonga)', 'Pacific/Saipan' => 'Chamorro Standard Time (Saipan)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/en_AU.php b/src/Symfony/Component/Intl/Resources/data/timezones/en_AU.php deleted file mode 100644 index 0e7100bbc9736..0000000000000 --- a/src/Symfony/Component/Intl/Resources/data/timezones/en_AU.php +++ /dev/null @@ -1,37 +0,0 @@ - [ - 'Africa/Addis_Ababa' => 'Eastern Africa Time (Addis Ababa)', - 'Africa/Asmera' => 'Eastern Africa Time (Asmara)', - 'Africa/Dar_es_Salaam' => 'Eastern Africa Time (Dar es Salaam)', - 'Africa/Djibouti' => 'Eastern Africa Time (Djibouti)', - 'Africa/Kampala' => 'Eastern Africa Time (Kampala)', - 'Africa/Mogadishu' => 'Eastern Africa Time (Mogadishu)', - 'Africa/Nairobi' => 'Eastern Africa Time (Nairobi)', - 'Antarctica/Casey' => 'Australian Western Time (Casey)', - 'Antarctica/Macquarie' => 'Australian Eastern Time (Macquarie)', - 'Asia/Aden' => 'Arabia Time (Aden)', - 'Asia/Baghdad' => 'Arabia Time (Baghdad)', - 'Asia/Bahrain' => 'Arabia Time (Bahrain)', - 'Asia/Kuwait' => 'Arabia Time (Kuwait)', - 'Asia/Pyongyang' => 'Korea Time (Pyongyang)', - 'Asia/Qatar' => 'Arabia Time (Qatar)', - 'Asia/Riyadh' => 'Arabia Time (Riyadh)', - 'Asia/Seoul' => 'Korea Time (Seoul)', - 'Australia/Adelaide' => 'Australian Central Time (Adelaide)', - 'Australia/Brisbane' => 'Australian Eastern Time (Brisbane)', - 'Australia/Broken_Hill' => 'Australian Central Time (Broken Hill)', - 'Australia/Darwin' => 'Australian Central Time (Darwin)', - 'Australia/Hobart' => 'Australian Eastern Time (Hobart)', - 'Australia/Lindeman' => 'Australian Eastern Time (Lindeman)', - 'Australia/Melbourne' => 'Australian Eastern Time (Melbourne)', - 'Australia/Perth' => 'Australian Western Time (Perth)', - 'Australia/Sydney' => 'Australian Eastern Time (Sydney)', - 'Indian/Antananarivo' => 'Eastern Africa Time (Antananarivo)', - 'Indian/Comoro' => 'Eastern Africa Time (Comoro)', - 'Indian/Mayotte' => 'Eastern Africa Time (Mayotte)', - 'Pacific/Rarotonga' => 'Cook Island Time (Rarotonga)', - ], - 'Meta' => [], -]; diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/eo.php b/src/Symfony/Component/Intl/Resources/data/timezones/eo.php index dddbcb1144b92..785dfb2c5b82a 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/eo.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/eo.php @@ -148,7 +148,7 @@ 'America/Nassau' => 'tempo de Bahamoj (Nassau)', 'America/New_York' => 'tempo de Usono (New York)', 'America/Nome' => 'tempo de Usono (Nome)', - 'America/Noronha' => 'tempo de Brazilo (Noronha)', + 'America/Noronha' => 'tempo de Brazilo (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'tempo de Usono (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'tempo de Usono (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'tempo de Usono (New Salem, North Dakota)', @@ -189,7 +189,7 @@ 'America/Yakutat' => 'tempo de Usono (Yakutat)', 'Antarctica/Casey' => 'tempo de Antarkto (Casey)', 'Antarctica/Davis' => 'tempo de Antarkto (Davis)', - 'Antarctica/DumontDUrville' => 'tempo de Antarkto (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'tempo de Antarkto (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'tempo de Aŭstralio (Macquarie)', 'Antarctica/Mawson' => 'tempo de Antarkto (Mawson)', 'Antarctica/McMurdo' => 'tempo de Antarkto (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/ie.php b/src/Symfony/Component/Intl/Resources/data/timezones/ie.php index a9d5fc9c63b56..997deca0a3e54 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/ie.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/ie.php @@ -29,7 +29,7 @@ 'America/Puerto_Rico' => 'témpor de Porto-Rico (Puerto Rico)', 'Antarctica/Casey' => 'témpor de Antarctica (Casey)', 'Antarctica/Davis' => 'témpor de Antarctica (Davis)', - 'Antarctica/DumontDUrville' => 'témpor de Antarctica (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'témpor de Antarctica (Dumont-d’Urville)', 'Antarctica/Mawson' => 'témpor de Antarctica (Mawson)', 'Antarctica/McMurdo' => 'témpor de Antarctica (McMurdo)', 'Antarctica/Palmer' => 'témpor de Antarctica (Palmer)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/ii.php b/src/Symfony/Component/Intl/Resources/data/timezones/ii.php index 9ee3121c8b470..f5775723ad907 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/ii.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/ii.php @@ -58,7 +58,7 @@ 'America/Monterrey' => 'ꃀꑭꇬꄮꈉ(Monterrey)', 'America/New_York' => 'ꂰꇩꄮꈉ(New York)', 'America/Nome' => 'ꂰꇩꄮꈉ(Nome)', - 'America/Noronha' => 'ꀠꑭꄮꈉ(Noronha)', + 'America/Noronha' => 'ꀠꑭꄮꈉ(Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'ꂰꇩꄮꈉ(Beulah, North Dakota)', 'America/North_Dakota/Center' => 'ꂰꇩꄮꈉ(Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'ꂰꇩꄮꈉ(New Salem, North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/ln.php b/src/Symfony/Component/Intl/Resources/data/timezones/ln.php index 704e2057242f9..4c551a2c37741 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/ln.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/ln.php @@ -151,7 +151,7 @@ 'America/Nassau' => 'Ngonga ya Bahamasɛ (Nassau)', 'America/New_York' => 'Ngonga ya Ameriki (New York)', 'America/Nome' => 'Ngonga ya Ameriki (Nome)', - 'America/Noronha' => 'Ngonga ya Brezílɛ (Noronha)', + 'America/Noronha' => 'Ngonga ya Brezílɛ (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Ngonga ya Ameriki (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'Ngonga ya Ameriki (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'Ngonga ya Ameriki (New Salem, North Dakota)', @@ -192,7 +192,7 @@ 'America/Yakutat' => 'Ngonga ya Ameriki (Yakutat)', 'Antarctica/Casey' => 'Ngonga ya Antarctique (Casey)', 'Antarctica/Davis' => 'Ngonga ya Antarctique (Davis)', - 'Antarctica/DumontDUrville' => 'Ngonga ya Antarctique (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'Ngonga ya Antarctique (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'Ngonga ya Ositáli (Macquarie)', 'Antarctica/Mawson' => 'Ngonga ya Antarctique (Mawson)', 'Antarctica/McMurdo' => 'Ngonga ya Antarctique (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/mt.php b/src/Symfony/Component/Intl/Resources/data/timezones/mt.php index ed4c78b1cbc72..e5723e6a3457f 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/mt.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/mt.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Ħin ta’ il-Bahamas (Nassau)', 'America/New_York' => 'Ħin ta’ l-Istati Uniti (New York)', 'America/Nome' => 'Ħin ta’ l-Istati Uniti (Nome)', - 'America/Noronha' => 'Ħin ta’ Il-Brażil (Noronha)', + 'America/Noronha' => 'Ħin ta’ Il-Brażil (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Ħin ta’ l-Istati Uniti (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'Ħin ta’ l-Istati Uniti (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'Ħin ta’ l-Istati Uniti (New Salem, North Dakota)', @@ -199,7 +199,7 @@ 'America/Yakutat' => 'Ħin ta’ l-Istati Uniti (Yakutat)', 'Antarctica/Casey' => 'Ħin ta’ l-Antartika (Casey)', 'Antarctica/Davis' => 'Ħin ta’ l-Antartika (Davis)', - 'Antarctica/DumontDUrville' => 'Ħin ta’ l-Antartika (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'Ħin ta’ l-Antartika (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'Ħin ta’ l-Awstralja (Macquarie)', 'Antarctica/Mawson' => 'Ħin ta’ l-Antartika (Mawson)', 'Antarctica/McMurdo' => 'Ħin ta’ l-Antartika (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/os.php b/src/Symfony/Component/Intl/Resources/data/timezones/os.php index 8efcb75b8efa8..b386b8ae54f57 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/os.php +++ b/src/Symfony/Component/Intl/Resources/data/t 10000 imezones/os.php @@ -55,7 +55,7 @@ 'America/Metlakatla' => 'АИШ рӕстӕг (Metlakatla)', 'America/New_York' => 'АИШ рӕстӕг (New York)', 'America/Nome' => 'АИШ рӕстӕг (Nome)', - 'America/Noronha' => 'Бразили рӕстӕг (Noronha)', + 'America/Noronha' => 'Бразили рӕстӕг (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'АИШ рӕстӕг (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'АИШ рӕстӕг (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'АИШ рӕстӕг (New Salem, North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/rm.php b/src/Symfony/Component/Intl/Resources/data/timezones/rm.php index 014b1a5ed9253..02e4c9e321282 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/rm.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/rm.php @@ -199,7 +199,7 @@ 'America/Yakutat' => 'temp: Stadis Unids da l’America (Yakutat)', 'Antarctica/Casey' => 'temp: Antarctica (Casey)', 'Antarctica/Davis' => 'temp: Antarctica (Davis)', - 'Antarctica/DumontDUrville' => 'temp: Antarctica (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'temp: Antarctica (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'temp: Australia (Macquarie)', 'Antarctica/Mawson' => 'temp: Antarctica (Mawson)', 'Antarctica/McMurdo' => 'temp: Antarctica (Mac Murdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/sa.php b/src/Symfony/Component/Intl/Resources/data/timezones/sa.php index edc6ffd16ce51..e0c6d8e9d2b13 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/sa.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/sa.php @@ -98,7 +98,7 @@ 'America/Nassau' => 'उत्तर अमेरिका: पौर्व समयः (Nassau)', 'America/New_York' => 'उत्तर अमेरिका: पौर्व समयः (New York)', 'America/Nome' => 'संयुक्त राज्य: समय: (Nome)', - 'America/Noronha' => 'ब्राजील समय: (Noronha)', + 'America/Noronha' => 'ब्राजील समय: (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'उत्तर अमेरिका: मध्य समयः (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'उत्तर अमेरिका: मध्य समयः (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'उत्तर अमेरिका: मध्य समयः (New Salem, North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/se.php b/src/Symfony/Component/Intl/Resources/data/timezones/se.php index 4befb16a6bcf6..e3d01049ea25d 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/se.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/se.php @@ -156,7 +156,7 @@ 'America/Nassau' => 'Nassau (Bahamas áigi)', 'America/New_York' => 'New York (Amerihká ovttastuvvan stáhtat áigi)', 'America/Nome' => 'Nome (Amerihká ovttastuvvan stáhtat áigi)', - 'America/Noronha' => 'Noronha (Brasil áigi)', + 'America/Noronha' => 'Fernando de Noronha (Brasil áigi)', 'America/North_Dakota/Beulah' => 'Beulah, North Dakota (Amerihká ovttastuvvan stáhtat áigi)', 'America/North_Dakota/Center' => 'Center, North Dakota (Amerihká ovttastuvvan stáhtat áigi)', 'America/North_Dakota/New_Salem' => 'New Salem, North Dakota (Amerihká ovttastuvvan stáhtat áigi)', @@ -198,7 +198,7 @@ 'America/Yakutat' => 'Yakutat (Amerihká ovttastuvvan stáhtat áigi)', 'Antarctica/Casey' => 'Casey (Antárktis áigi)', 'Antarctica/Davis' => 'Davis (Antárktis áigi)', - 'Antarctica/DumontDUrville' => 'Dumont d’Urville (Antárktis áigi)', + 'Antarctica/DumontDUrville' => 'Dumont-d’Urville (Antárktis áigi)', 'Antarctica/Macquarie' => 'Macquarie (Austrália áigi)', 'Antarctica/Mawson' => 'Mawson (Antárktis áigi)', 'Antarctica/McMurdo' => 'McMurdo (Antárktis áigi)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/sk.php b/src/Symfony/Component/Intl/Resources/data/timezones/sk.php index 425959956c8bc..283d5df96951f 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/sk.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/sk.php @@ -199,7 +199,7 @@ 'America/Yakutat' => 'aljašský čas (Yakutat)', 'Antarctica/Casey' => 'západoaustrálsky čas (Casey)', 'Antarctica/Davis' => 'čas Davisovej stanice', - 'Antarctica/DumontDUrville' => 'čas stanice Dumonta d’Urvillea (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'čas stanice Dumonta d’Urvillea (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'východoaustrálsky čas (Macquarie)', 'Antarctica/Mawson' => 'čas Mawsonovej stanice', 'Antarctica/McMurdo' => 'novozélandský čas (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/sl.php b/src/Symfony/Component/Intl/Resources/data/timezones/sl.php index cf34c78aaa283..573adbfa6eb43 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/sl.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/sl.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Vzhodni čas (Nassau)', 'America/New_York' => 'Vzhodni čas (New York)', 'America/Nome' => 'Aljaški čas (Nome)', - 'America/Noronha' => 'Fernando de Noronški čas (Noronha)', + 'America/Noronha' => 'Fernando de Noronški čas (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Centralni čas (Beulah, Severna Dakota)', 'America/North_Dakota/Center' => 'Centralni čas (Center, Severna Dakota)', 'America/North_Dakota/New_Salem' => 'Centralni čas (New Salem, Severna Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/so.php b/src/Symfony/Component/Intl/Resources/data/timezones/so.php index 7808aa8f5dc50..87fe73b3c1e86 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/so.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/so.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Waqtiga Bariga ee Waqooyiga Ameerika (Nasaaw)', 'America/New_York' => 'Waqtiga Bariga ee Waqooyiga Ameerika (Niyuu Yook)', 'America/Nome' => 'Waqtiga Alaska (Noom)', - 'America/Noronha' => 'Waqtiga Farnaando de Noronha', + 'America/Noronha' => 'Waqtiga Farnaando de Noronha (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Waqtiga Bartamaha Waqooyiga Ameerika (Biyuulah, Waqooyiga Dakoota)', 'America/North_Dakota/Center' => 'Waqtiga Bartamaha Waqooyiga Ameerika (Bartamaha, Waqooyiga Dakoota)', 'America/North_Dakota/New_Salem' => 'Waqtiga Bartamaha Waqooyiga Ameerika (Niyuu Saalem, Waqooyiga Dakoota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/su.php b/src/Symfony/Component/Intl/Resources/data/timezones/su.php index 23346ff65080c..18e47ad78398b 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/su.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/su.php @@ -99,7 +99,7 @@ 'America/Nassau' => 'Waktu Wétan (Nassau)', 'America/New_York' => 'Waktu Wétan (New York)', 'America/Nome' => 'Amérika Sarikat (Nome)', - 'America/Noronha' => 'Brasil (Noronha)', + 'America/Noronha' => 'Brasil (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Waktu Tengah (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'Waktu Tengah (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'Waktu Tengah (New Salem, North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/tk.php b/src/Symfony/Component/Intl/Resources/data/timezones/tk.php index 45aaab71a7313..8996a15e9666b 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/tk.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/tk.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Demirgazyk Amerika gündogar wagty (Nassau)', 'America/New_York' => 'Demirgazyk Amerika gündogar wagty (Nýu-Ýork)', 'America/Nome' => 'Alýaska wagty (Nom)', - 'America/Noronha' => 'Fernandu-di-Noronýa wagty (Noronha)', + 'America/Noronha' => 'Fernandu-di-Noronýa wagty (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'Merkezi Amerika (Boýla, Demirgazyk Dakota)', 'America/North_Dakota/Center' => 'Merkezi Amerika (Sentr, Demirgazyk Dakota)', 'America/North_Dakota/New_Salem' => 'Merkezi Amerika (Nýu-Salem, Demirgazyk Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/to.php b/src/Symfony/Component/Intl/Resources/data/timezones/to.php index 85eb55b63dd2c..6668f0a3cc1b1 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/to.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/to.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'houa fakaʻamelika-tokelau hahake (Nassau)', 'America/New_York' => 'houa fakaʻamelika-tokelau hahake (Niu ʻIoke)', 'America/Nome' => 'houa fakaʻalasika (Nome)', - 'America/Noronha' => 'houa fakafēnanito-te-nolōnia (Noronha)', + 'America/Noronha' => 'houa fakafēnanito-te-nolōnia (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'houa fakaʻamelika-tokelau loto (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'houa fakaʻamelika-tokelau loto (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'houa fakaʻamelika-tokelau loto (New Salem, North Dakota)', @@ -199,7 +199,7 @@ 'America/Yakutat' => 'houa fakaʻalasika (Yakutat)', 'Antarctica/Casey' => 'houa fakaʻaositelēlia-hihifo (Casey)', 'Antarctica/Davis' => 'houa fakatavisi (Davis)', - 'Antarctica/DumontDUrville' => 'houa fakatūmoni-tūvile (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'houa fakatūmoni-tūvile (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'houa fakaʻaositelēlia-hahake (Macquarie)', 'Antarctica/Mawson' => 'houa fakamausoni (Mawson)', 'Antarctica/McMurdo' => 'houa fakanuʻusila (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/ug.php b/src/Symfony/Component/Intl/Resources/data/timezones/ug.php index dcd0ef31b8a96..385cc4218f809 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/ug.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/ug.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'شەرقىي قىسىم ۋاقتى (Nassau)', 'America/New_York' => 'شەرقىي قىسىم ۋاقتى (New York)', 'America/Nome' => 'ئالياسكا ۋاقتى (Nome)', - 'America/Noronha' => 'فېرناندو-نورونخا ۋاقتى (Noronha)', + 'America/Noronha' => 'فېرناندو-نورونخا ۋاقتى (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'ئوتتۇرا قىسىم ۋاقتى (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'ئوتتۇرا قىسىم ۋاقتى (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'ئوتتۇرا قىسىم ۋاقتى (New Salem, North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/yi.php b/src/Symfony/Component/Intl/Resources/data/timezones/yi.php index 2fc72448df90f..fba6712d58eaa 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/yi.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/yi.php @@ -148,7 +148,7 @@ 'America/Nassau' => 'באַהאַמאַס (Nassau)', 'America/New_York' => 'פֿאַראייניגטע שטאַטן (New York)', 'America/Nome' => 'פֿאַראייניגטע שטאַטן (Nome)', - 'America/Noronha' => 'בראַזיל (Noronha)', + 'America/Noronha' => 'בראַזיל (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'פֿאַראייניגטע שטאַטן (Beulah, North Dakota)', 'America/North_Dakota/Center' => 'פֿאַראייניגטע שטאַטן (Center, North Dakota)', 'America/North_Dakota/New_Salem' => 'פֿאַראייניגטע שטאַטן (New Salem, North Dakota)', @@ -184,7 +184,7 @@ 'America/Yakutat' => 'פֿאַראייניגטע שטאַטן (Yakutat)', 'Antarctica/Casey' => 'אַנטאַרקטיקע (Casey)', 'Antarctica/Davis' => 'אַנטאַרקטיקע (Davis)', - 'Antarctica/DumontDUrville' => 'אַנטאַרקטיקע (Dumont d’Urville)', + 'Antarctica/DumontDUrville' => 'אַנטאַרקטיקע (Dumont-d’Urville)', 'Antarctica/Macquarie' => 'אויסטראַליע (Macquarie)', 'Antarctica/Mawson' => 'אַנטאַרקטיקע (Mawson)', 'Antarctica/McMurdo' => 'אַנטאַרקטיקע (McMurdo)', diff --git a/src/Symfony/Component/Intl/Resources/data/timezones/yo.php b/src/Symfony/Component/Intl/Resources/data/timezones/yo.php index 2af1dedd0c379..84ff6f3d609b0 100644 --- a/src/Symfony/Component/Intl/Resources/data/timezones/yo.php +++ b/src/Symfony/Component/Intl/Resources/data/timezones/yo.php @@ -157,7 +157,7 @@ 'America/Nassau' => 'Àkókò ìhà ìlà oòrùn (ìlú Nasaò)', 'America/New_York' => 'Àkókò ìhà ìlà oòrùn (ìlú New York)', 'America/Nome' => 'Àkókò Alásíkà (ìlú Nomi)', - 'America/Noronha' => 'Aago Fenando de Norona (Noronha)', + 'America/Noronha' => 'Aago Fenando de Norona (Fernando de Noronha)', 'America/North_Dakota/Beulah' => 'àkókò àárín gbùngbùn (ìlú Beulà ní North Dakota)', 'America/North_Dakota/Center' => 'àkókò àárín gbùngbùn (ìlú Senta North Dakota)', 'America/North_Dakota/New_Salem' => 'àkókò àárín gbùngbùn (ìlú New Salem ni North Dakota)', diff --git a/src/Symfony/Component/Intl/Resources/data/version.txt b/src/Symfony/Component/Intl/Resources/data/version.txt index 9747bc6ec3066..1ed6f92dc764c 100644 --- a/src/Symfony/Component/Intl/Resources/data/version.txt +++ b/src/Symfony/Component/Intl/Resources/data/version.txt @@ -1 +1 @@ -76.1 +77.1 diff --git a/src/Symfony/Component/Intl/Tests/CountriesTest.php b/src/Symfony/Component/Intl/Tests/CountriesTest.php index 7b921036b2a00..01f0f76f2e40a 100644 --- a/src/Symfony/Component/Intl/Tests/CountriesTest.php +++ b/src/Symfony/Component/Intl/Tests/CountriesTest.php @@ -527,7 +527,6 @@ class CountriesTest extends ResourceBundleTestCase ]; private const ALPHA2_TO_NUMERIC = [ - 'AA' => '958', 'AD' => '020', 'AE' => '784', 'AF' => '004', @@ -715,18 +714,6 @@ class CountriesTest extends ResourceBundleTestCase 'PW' => '585', 'PY' => '600', 'QA' => '634', - 'QM' => '959', - 'QN' => '960', - 'QP' => '962', - 'QQ' => '963', - 'QR' => '964', - 'QS' => '965', - 'QT' => '966', - 'QV' => '968', - 'QW' => '969', - 'QX' => '970', - 'QY' => '971', - 'QZ' => '972', 'RE' => '638', 'RO' => '642', 'RS' => '688', @@ -784,29 +771,6 @@ class CountriesTest extends ResourceBundleTestCase 'VU' => '548', 'WF' => '876', 'WS' => '882', - 'XC' => '975', - 'XD' => '976', - 'XE' => '977', - 'XF' => '978', - 'XG' => '979', - 'XH' => '980', - 'XI' => '981', - 'XJ' => '982', - 'XL' => '984', - 'XM' => '985', - 'XN' => '986', - 'XO' => '987', - 'XP' => '988', - 'XQ' => '989', - 'XR' => '990', - 'XS' => '991', - 'XT' => '992', - 'XU' => '993', - 'XV' => '994', - 'XW' => '995', - 'XX' => '996', - 'XY' => '997', - 'XZ' => '998', 'YE' => '887', 'YT' => '175', 'ZA' => '710', @@ -814,6 +778,19 @@ class CountriesTest extends ResourceBundleTestCase 'ZW' => '716', ]; + public function testAllGettersGenerateTheSameDataSetCount() + { + $alpha2Count = count(Countries::getCountryCodes()); + $alpha3Count = count(Countries::getAlpha3Codes()); + $numericCodesCount = count(Countries::getNumericCodes()); + $namesCount = count(Countries::getNames()); + + // we base all on Name count since it is the first to be generated + $this->assertEquals($namesCount, $alpha2Count, 'Alpha 2 count does not match'); + $this->assertEquals($namesCount, $alpha3Count, 'Alpha 3 count does not match'); + $this->assertEquals($namesCount, $numericCodesCount, 'Numeric codes count does not match'); + } + public function testGetCountryCodes() { $this->assertSame(self::COUNTRIES, Countries::getCountryCodes()); @@ -992,7 +969,7 @@ public function testGetNumericCode() public function testNumericCodeExists() { $this->assertTrue(Countries::numericCodeExists('250')); - $this->assertTrue(Countries::numericCodeExists('982')); + $this->assertTrue(Countries::numericCodeExists('008')); $this->assertTrue(Countries::numericCodeExists('716')); $this->assertTrue(Countries::numericCodeExists('036')); $this->assertFalse(Countries::numericCodeExists('667')); diff --git a/src/Symfony/Component/Intl/Tests/LanguagesTest.php b/src/Symfony/Component/Intl/Tests/LanguagesTest.php index bcd8100490f14..6934a04ab6e3b 100644 --- a/src/Symfony/Component/Intl/Tests/LanguagesTest.php +++ b/src/Symfony/Component/Intl/Tests/LanguagesTest.php @@ -35,7 +35,6 @@ class LanguagesTest extends ResourceBundleTestCase 'afh', 'agq', 'ain', - 'ajp', 'ak', 'akk', 'akz', @@ -150,7 +149,6 @@ class LanguagesTest extends ResourceBundleTestCase 'csw', 'cu', 'cv', - 'cwd', 'cy', 'da', 'dak', @@ -240,7 +238,6 @@ class LanguagesTest extends ResourceBundleTestCase 'hak', 'haw', 'hax', - 'hdn', 'he', 'hi', 'hif', @@ -266,7 +263,6 @@ class LanguagesTest extends ResourceBundleTestCase 'ig', 'ii', 'ik', - 'ike', 'ikt', 'ilo', 'inh', @@ -451,7 +447,6 @@ class LanguagesTest extends ResourceBundleTestCase 'oj', 'ojb', 'ojc', - 'ojg', 'ojs', 'ojw', 'oka', @@ -679,7 +674,6 @@ class LanguagesTest extends ResourceBundleTestCase 'afr', 'agq', 'ain', - 'ajp', 'aka', 'akk', 'akz', @@ -797,7 +791,6 @@ class LanguagesTest extends ResourceBundleTestCase 'crs', 'csb', 'csw', - 'cwd', 'cym', 'dak', 'dan', @@ -888,7 +881,6 @@ class LanguagesTest extends ResourceBundleTestCase 'haw', 'hax', 'hbs', - 'hdn', 'heb', 'her', 'hif', @@ -910,7 +902,6 @@ class LanguagesTest extends ResourceBundleTestCase 'ibo', 'ido', 'iii', - 'ike', 'ikt', 'iku', 'ile', @@ -1098,7 +1089,6 @@ class LanguagesTest extends ResourceBundleTestCase 'oci', 'ojb', 'ojc', - 'ojg', 'oji', 'ojs', 'ojw', diff --git a/src/Symfony/Component/Intl/Tests/ResourceBundleTestCase.php b/src/Symfony/Component/Intl/Tests/ResourceBundleTestCase.php index 9fab9c2c221f5..9e2301a8cf966 100644 --- a/src/Symfony/Component/Intl/Tests/ResourceBundleTestCase.php +++ b/src/Symfony/Component/Intl/Tests/ResourceBundleTestCase.php @@ -141,30 +141,36 @@ abstract class ResourceBundleTestCase extends TestCase 'en_CM', 'en_CX', 'en_CY', + 'en_CZ', 'en_DE', 'en_DG', 'en_DK', 'en_DM', 'en_ER', + 'en_ES', 'en_FI', 'en_FJ', 'en_FK', 'en_FM', + 'en_FR', 'en_GB', 'en_GD', 'en_GG', 'en_GH', 'en_GI', 'en_GM', + 'en_GS', 'en_GU', 'en_GY', 'en_HK', + 'en_HU', 'en_ID', 'en_IE', 'en_IL', 'en_IM', 'en_IN', 'en_IO', + 'en_IT', 'en_JE', 'en_JM', 'en_KE', @@ -189,16 +195,20 @@ abstract class ResourceBundleTestCase extends TestCase 'en_NG', 'en_NH', 'en_NL', + 'en_NO', 'en_NR', 'en_NU', 'en_NZ', 'en_PG', 'en_PH', 'en_PK', + 'en_PL', 'en_PN', 'en_PR', + 'en_PT', 'en_PW', 'en_RH', + 'en_RO', 'en_RW', 'en_SB', 'en_SC', @@ -207,6 +217,7 @@ abstract class ResourceBundleTestCase extends TestCase 'en_SG', 'en_SH', 'en_SI', + 'en_SK', 'en_SL', 'en_SS', 'en_SX', diff --git a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php index dc2d5ee39bd06..f042620b71a6b 100644 --- a/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php +++ b/src/Symfony/Component/Lock/Store/DoctrineDbalStore.php @@ -18,6 +18,9 @@ use Doctrine\DBAL\Exception\TableNotFoundException; use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Tools\DsnParser; use Symfony\Component\Lock\Exception\InvalidArgumentException; @@ -214,7 +217,12 @@ public function configureSchema(Schema $schema, \Closure $isSameDatabase): void $table->addColumn($this->idCol, 'string', ['length' => 64]); $table->addColumn($this->tokenCol, 'string', ['length' => 44]); $table->addColumn($this->expirationCol, 'integer', ['unsigned' => true]); - $table->setPrimaryKey([$this->idCol]); + + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted($this->idCol))], true)); + } else { + $table->setPrimaryKey([$this->idCol]); + } } /** diff --git a/src/Symfony/Component/Lock/Store/RedisStore.php b/src/Symfony/Component/Lock/Store/RedisStore.php index a7bf7fec29de6..3ff1de6fa5171 100644 --- a/src/Symfony/Component/Lock/Store/RedisStore.php +++ b/src/Symfony/Component/Lock/Store/RedisStore.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Lock\Store; +use Predis\Response\Error; use Predis\Response\ServerException; use Relay\Relay; use Symfony\Component\Lock\Exception\InvalidTtlException; @@ -29,7 +30,7 @@ class RedisStore implements SharedLockStoreInterface { use ExpiringStoreTrait; - private const NO_SCRIPT_ERROR_MESSAGE = 'NOSCRIPT No matching script. Please use EVAL.'; + private const NO_SCRIPT_ERROR_MESSAGE_PREFIX = 'NOSCRIPT'; private bool $supportTime; @@ -234,7 +235,7 @@ private function evaluate(string $script, string $resource, array $args): mixed $this->redis->clearLastError(); $result = $this->redis->evalSha($scriptSha, array_merge([$resource], $args), 1); - if (self::NO_SCRIPT_ERROR_MESSAGE === $err = $this->redis->getLastError()) { + if (null !== ($err = $this->redis->getLastError()) && str_starts_with($err, self::NO_SCRIPT_ERROR_MESSAGE_PREFIX)) { $this->redis->clearLastError(); if ($this->redis instanceof \RedisCluster) { @@ -250,10 +251,10 @@ private function evaluate(string $script, string $resource, array $args): mixed } $result = $this->redis->evalSha($scriptSha, array_merge([$resource], $args), 1); + } - if (null !== $err = $this->redis->getLastError()) { - throw new LockStorageException($err); - } + if (null !== $err = $this->redis->getLastError()) { + throw new LockStorageException($err); } return $result; @@ -263,7 +264,7 @@ private function evaluate(string $script, string $resource, array $args): mixed $client = $this->redis->_instance($this->redis->_target($resource)); $client->clearLastError(); $result = $client->evalSha($scriptSha, array_merge([$resource], $args), 1); - if (self::NO_SCRIPT_ERROR_MESSAGE === $err = $client->getLastError()) { + if (null !== ($err = $client->getLastError()) && str_starts_with($err, self::NO_SCRIPT_ERROR_MESSAGE_PREFIX)) { $client->clearLastError(); $client->script('LOAD', $script); @@ -273,10 +274,10 @@ private function evaluate(string $script, string $resource, array $args): mixed } $result = $client->evalSha($scriptSha, array_merge([$resource], $args), 1); + } - if (null !== $err = $client->getLastError()) { - throw new LockStorageException($err); - } + if (null !== $err = $client->getLastError()) { + throw new LockStorageException($err); } return $result; @@ -285,25 +286,17 @@ private function evaluate(string $script, string $resource, array $args): mixed \assert($this->redis instanceof \Predis\ClientInterface); try { - return $this->redis->evalSha($scriptSha, 1, $resource, ...$args); - } catch (ServerException $e) { + return $this->handlePredisError(fn () => $this->redis->evalSha($scriptSha, 1, $resource, ...$args)); + } catch (LockStorageException $e) { // Fallthrough only if we need to load the script - if (self::NO_SCRIPT_ERROR_MESSAGE !== $e->getMessage()) { - throw new LockStorageException($e->getMessage(), $e->getCode(), $e); + if (!str_starts_with($e->getMessage(), self::NO_SCRIPT_ERROR_MESSAGE_PREFIX)) { + throw $e; } } - try { - $this->redis->script('LOAD', $script); - } catch (ServerException $e) { - throw new LockStorageException($e->getMessage(), $e->getCode(), $e); - } + $this->handlePredisError(fn () => $this->redis->script('LOAD', $script)); - try { - return $this->redis->evalSha($scriptSha, 1, $resource, ...$args); - } catch (ServerException $e) { - throw new LockStorageException($e->getMessage(), $e->getCode(), $e); - } + return $this->handlePredisError(fn () => $this->redis->evalSha($scriptSha, 1, $resource, ...$args)); } private function getUniqueToken(Key $key): string @@ -352,4 +345,26 @@ private function getNowCode(): string now = math.floor(now * 1000) '; } + + /** + * @template T + * + * @param callable(): T $callback + * + * @return T + */ + private function handlePredisError(callable $callback): mixed + { + try { + $result = $callback(); + } catch (ServerException $e) { + throw new LockStorageException($e->getMessage(), $e->getCode(), $e); + } + + if ($result instanceof Error) { + throw new LockStorageException($result->getMessage()); + } + + return $result; + } } diff --git a/src/Symfony/Component/Lock/Tests/Store/CombinedStoreTest.php b/src/Symfony/Component/Lock/Tests/Store/CombinedStoreTest.php index b7cdd7a954a94..6a19805f3cb3e 100644 --- a/src/Symfony/Component/Lock/Tests/Store/CombinedStoreTest.php +++ b/src/Symfony/Component/Lock/Tests/Store/CombinedStoreTest.php @@ -39,7 +39,10 @@ protected function getClockDelay(): int public function getStore(): PersistingStoreInterface { - $redis = new \Predis\Client(array_combine(['host', 'port'], explode(':', getenv('REDIS_HOST')) + [1 => 6379])); + $redis = new \Predis\Client( + array_combine(['host', 'port'], explode(':', getenv('REDIS_HOST')) + [1 => 6379]), + ['exceptions' => false], + ); try { $redis->connect(); diff --git a/src/Symfony/Component/Lock/Tests/Store/PredisStoreTest.php b/src/Symfony/Component/Lock/Tests/Store/PredisStoreWithExceptionsTest.php similarity index 88% rename from src/Symfony/Component/Lock/Tests/Store/PredisStoreTest.php rename to src/Symfony/Component/Lock/Tests/Store/PredisStoreWithExceptionsTest.php index 3569e3d1f75e2..6b24711b89a8e 100644 --- a/src/Symfony/Component/Lock/Tests/Store/PredisStoreTest.php +++ b/src/Symfony/Component/Lock/Tests/Store/PredisStoreWithExceptionsTest.php @@ -12,11 +12,9 @@ namespace Symfony\Component\Lock\Tests\Store; /** - * @author Jérémy Derussé - * * @group integration */ -class PredisStoreTest extends AbstractRedisStoreTestCase +class PredisStoreWithExceptionsTest extends AbstractRedisStoreTestCase { public static function setUpBeforeClass(): void { diff --git a/src/Symfony/Component/Lock/Tests/Store/PredisStoreWithoutExceptionsTest.php b/src/Symfony/Component/Lock/Tests/Store/PredisStoreWithoutExceptionsTest.php new file mode 100644 index 0000000000000..bb135a4676406 --- /dev/null +++ b/src/Symfony/Component/Lock/Tests/Store/PredisStoreWithoutExceptionsTest.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Lock\Tests\Store; + +/** + * @author Jérémy Derussé + * + * @group integration + */ +class PredisStoreWithoutExceptionsTest extends AbstractRedisStoreTestCase +{ + public static function setUpBeforeClass(): void + { + $redis = new \Predis\Client( + array_combine(['host', 'port'], explode(':', getenv('REDIS_HOST')) + [1 => null]), + ['exceptions' => false], + ); + try { + $redis->connect(); + } catch (\Exception $e) { + self::markTestSkipped($e->getMessage()); + } + } + + protected function getRedisConnection(): \Predis\Client + { + $redis = new \Predis\Client( + array_combine(['host', 'port'], explode(':', getenv('REDIS_HOST')) + [1 => null]), + ['exceptions' => false], + ); + $redis->connect(); + + return $redis; + } +} diff --git a/src/Symfony/Component/Mailer/Bridge/Azure/README.md b/src/Symfony/Component/Mailer/Bridge/Azure/README.md index acd9cc25abb53..36b81fccfa385 100644 --- a/src/Symfony/Component/Mailer/Bridge/Azure/README.md +++ b/src/Symfony/Component/Mailer/Bridge/Azure/README.md @@ -21,8 +21,8 @@ where: Resources --------- - * [Microsoft Azure (ACS) Email API Docs](https://learn.microsoft.com/en-us/rest/api/communication/dataplane/email/send) + * [Microsoft Azure (ACS) Email API Docs](https://learn.microsoft.com/en-us/rest/api/communication/email/email/send) * [Contributing](https://symfony.com/doc/current/contributing/index.html) * [Report issues](https://github.com/symfony/symfony/issues) and [send Pull Requests](https://github.com/symfony/symfony/pulls) - in the [main Symfony repository](https://github.com/symfony/symfony) \ No newline at end of file + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/src/Symfony/Component/Mailer/Bridge/MailerSend/Transport/MailerSendSmtpTransport.php b/src/Symfony/Component/Mailer/Bridge/MailerSend/Transport/MailerSendSmtpTransport.php index 84e2553a627cc..e5bfb4daddc2e 100644 --- a/src/Symfony/Component/Mailer/Bridge/MailerSend/Transport/MailerSendSmtpTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/MailerSend/Transport/MailerSendSmtpTransport.php @@ -22,7 +22,7 @@ final class MailerSendSmtpTransport extends EsmtpTransport { public function __construct(string $username, #[\SensitiveParameter] string $password, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null) { - parent::__construct('smtp.mailersend.net', 587, true, $dispatcher, $logger); + parent::__construct('smtp.mailersend.net', 587, false, $dispatcher, $logger); $this->setUsername($username); $this->setPassword($password); diff --git a/src/Symfony/Component/Mailer/Bridge/Postmark/Tests/Transport/PostmarkApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Postmark/Tests/Transport/PostmarkApiTransportTest.php index 32bb32d744506..e692357aef3cf 100644 --- a/src/Symfony/Component/Mailer/Bridge/Postmark/Tests/Transport/PostmarkApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Postmark/Tests/Transport/PostmarkApiTransportTest.php @@ -71,6 +71,18 @@ public function testCustomHeader() $this->assertEquals(['Name' => 'foo', 'Value' => 'bar'], $payload['Headers'][0]); } + public function testBypassHeaders() + { + $email = (new Email())->date(new \DateTimeImmutable()); + $envelope = new Envelope(new Address('alice@system.com'), [new Address('bob@system.com')]); + + $transport = new PostmarkApiTransport('ACCESS_KEY'); + $method = new \ReflectionMethod(PostmarkApiTransport::class, 'getPayload'); + $payload = $method->invoke($transport, $email, $envelope); + + $this->assertArrayNotHasKey('Headers', $payload); + } + public function testSend() { $client = new MockHttpClient(function (string $method, string $url, array $options): ResponseInterface { diff --git a/src/Symfony/Component/Mailer/Bridge/Postmark/Transport/PostmarkApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Postmark/Transport/PostmarkApiTransport.php index a883c92404991..a5e433293d6bc 100644 --- a/src/Symfony/Component/Mailer/Bridge/Postmark/Transport/PostmarkApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Postmark/Transport/PostmarkApiTransport.php @@ -110,7 +110,7 @@ private function getPayload(Email $email, Envelope $envelope): array 'Attachments' => $this->getAttachments($email), ]; - $headersToBypass = ['from', 'to', 'cc', 'bcc', 'subject', 'content-type', 'sender', 'reply-to']; + $headersToBypass = ['from', 'to', 'cc', 'bcc', 'subject', 'content-type', 'sender', 'reply-to', 'date']; foreach ($email->getHeaders()->all() as $name => $header) { if (\in_array($name, $headersToBypass, true)) { continue; @@ -166,7 +166,7 @@ private function getAttachments(Email $email): array ]; if ('inline' === $disposition) { - $att['ContentID'] = 'cid:'.$filename; + $att['ContentID'] = 'cid:'.($attachment->hasContentId() ? $attachment->getContentId() : $filename); } $attachments[] = $att; diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php index 1ca37551c41ba..cae2dd85bcf86 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/RemoteEvent/SendgridPayloadConverter.php @@ -31,7 +31,7 @@ public function convert(array $payload): AbstractMailerEvent 'deferred' => MailerDeliveryEvent::DEFERRED, 'bounce' => MailerDeliveryEvent::BOUNCE, }; - $event = new MailerDeliveryEvent($name, $payload['sg_message_id'], $payload); + $event = new MailerDeliveryEvent($name, $payload['sg_message_id'] ?? $payload['sg_event_id'], $payload); $event->setReason($payload['reason'] ?? ''); } else { $name = match ($payload['event']) { @@ -41,7 +41,7 @@ public function convert(array $payload): AbstractMailerEvent 'spamreport' => MailerEngagementEvent::SPAM, default => throw new ParseException(\sprintf('Unsupported event "%s".', $payload['event'])), }; - $event = new MailerEngagementEvent($name, $payload['sg_message_id'], $payload); + $event = new MailerEngagementEvent($name, $payload['sg_message_id'] ?? $payload['sg_event_id'], $payload); } if (!$date = \DateTimeImmutable::createFromFormat('U', $payload['timestamp'])) { @@ -51,7 +51,7 @@ public function convert(array $payload): AbstractMailerEvent $event->setDate($date); $event->setRecipientEmail($payload['email']); $event->setMetadata([]); - $event->setTags($payload['category'] ?? []); + $event->setTags((array) ($payload['category'] ?? [])); return $event; } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php index 1d02b5c8a42bc..02811744468e3 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/RemoteEvent/SendgridPayloadConverterTest.php @@ -97,4 +97,35 @@ public function testInvalidDate() 'email' => 'test@example.com', ]); } + + public function testAsynchronousBounce() + { + $converter = new SendgridPayloadConverter(); + + $event = $converter->convert([ + 'event' => 'bounce', + 'sg_event_id' => '123456', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + ]); + + $this->assertInstanceOf(MailerDeliveryEvent::class, $event); + $this->assertSame('123456', $event->getId()); + } + + public function testWithStringCategory() + { + $converter = new SendgridPayloadConverter(); + + $event = $converter->convert([ + 'event' => 'processed', + 'sg_message_id' => '123456', + 'timestamp' => '123456789', + 'email' => 'test@example.com', + 'category' => 'cat facts', + ]); + + $this->assertInstanceOf(MailerDeliveryEvent::class, $event); + $this->assertSame(['cat facts'], $event->getTags()); + } } diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridSmtpTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridSmtpTransportTest.php new file mode 100644 index 0000000000000..77e5135c55cc4 --- /dev/null +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Tests/Transport/SendgridSmtpTransportTest.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Mailer\Bridge\Sendgrid\Tests\Transport; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Mailer\Bridge\Sendgrid\Transport\SendgridSmtpTransport; + +class SendgridSmtpTransportTest extends TestCase +{ + /** + * @dataProvider getTransportData + */ + public function testToString(SendgridSmtpTransport $transport, string $expected) + { + $this->assertSame($expected, (string) $transport); + } + + public static function getTransportData() + { + return [ + [ + new SendgridSmtpTransport('KEY'), + 'smtps://smtp.sendgrid.net', + ], + [ + new SendgridSmtpTransport('KEY', null, null, 'eu'), + 'smtps://smtp.eu.sendgrid.net', + ], + ]; + } +} diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php index d939359ff8bc0..c7b67685dab9f 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Transport/SendgridSmtpTransport.php @@ -22,7 +22,7 @@ class SendgridSmtpTransport extends EsmtpTransport { public function __construct(#[\SensitiveParameter] string $key, ?EventDispatcherInterface $dispatcher = null, ?LoggerInterface $logger = null, private ?string $region = null) { - parent::__construct('null' !== $region ? \sprintf('smtp.%s.sendgrid.net', $region) : 'smtp.sendgrid.net', 465, true, $dispatcher, $logger); + parent::__construct(null !== $region ? \sprintf('smtp.%s.sendgrid.net', $region) : 'smtp.sendgrid.net', 465, true, $dispatcher, $logger); $this->setUsername('apikey'); $this->setPassword($key); diff --git a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php index 26bea852dc81d..aaf4dc8776691 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php +++ b/src/Symfony/Component/Mailer/Bridge/Sendgrid/Webhook/SendgridRequestParser.php @@ -51,7 +51,7 @@ protected function doParse(Request $request, string $secret): array !isset($content[0]['email']) || !isset($content[0]['timestamp']) || !isset($content[0]['event']) - || !isset($content[0]['sg_message_id']) + || !isset($content[0]['sg_event_id']) ) { throw new RejectWebhookException(406, 'Payload is malformed.'); } diff --git a/src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Transport/SweegoApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Transport/SweegoApiTransportTest.php index 4a39ebdb71ea7..3f943ed3467f2 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Transport/SweegoApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Sweego/Tests/Transport/SweegoApiTransportTest.php @@ -110,6 +110,9 @@ public function testSend() $this->assertSame('https://api.sweego.io:8984/send', $url); $this->assertStringContainsString('Accept: */*', $options['headers'][2] ?? $options['request_headers'][1]); + $payload = json_decode($options['body'], true); + $this->assertSame('email', $payload['channel']); + return new JsonMockResponse(['transaction_id' => 'foobar'], [ 'http_code' => 200, ]); diff --git a/src/Symfony/Component/Mailer/Bridge/Sweego/Transport/SweegoApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Sweego/Transport/SweegoApiTransport.php index b25b7e5b725a6..8430fb4fca29f 100644 --- a/src/Symfony/Component/Mailer/Bridge/Sweego/Transport/SweegoApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Sweego/Transport/SweegoApiTransport.php @@ -90,6 +90,7 @@ private function getPayload(Email $email, Envelope $envelope): array 'from' => $this->formatAddress($envelope->getSender()), 'subject' => $email->getSubject(), 'campaign-type' => 'transac', + 'channel' => 'email', ]; if ($email->getTextBody()) { diff --git a/src/Symfony/Component/Mailer/Transport/SendmailTransport.php b/src/Symfony/Component/Mailer/Transport/SendmailTransport.php index fa1bc912f1daf..45cf503e162b2 100644 --- a/src/Symfony/Component/Mailer/Transport/SendmailTransport.php +++ b/src/Symfony/Component/Mailer/Transport/SendmailTransport.php @@ -114,7 +114,7 @@ protected function doSend(SentMessage $message): void $this->stream->setCommand($command); $this->stream->initialize(); foreach ($chunks as $chunk) { - $this->stream->write($chunk); + $this->stream->write($chunk, false); } $this->stream->flush(); $this->stream->terminate(); diff --git a/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php b/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php index 9d99c061660a8..ec9689f9239a8 100644 --- a/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php +++ b/src/Symfony/Component/Mailer/Transport/Smtp/SmtpTransport.php @@ -206,11 +206,11 @@ protected function doSend(SentMessage $message): void $this->ping(); } - if (!$this->started) { - $this->start(); - } - try { + if (!$this->started) { + $this->start(); + } + $envelope = $message->getEnvelope(); $this->doMailFromCommand($envelope->getSender()->getEncodedAddress(), $envelope->anyAddressHasUnicodeLocalpart()); foreach ($envelope->getRecipients() as $recipient) { diff --git a/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php b/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php index ef80010a20dc4..9cd8463a28b78 100644 --- a/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php +++ b/src/Symfony/Component/Mailer/Transport/Smtp/Stream/AbstractStream.php @@ -81,15 +81,14 @@ public function readLine(): string $line = @fgets($this->out); if ('' === $line || false === $line) { - $metas = stream_get_meta_data($this->out); - if ($metas['timed_out']) { + if (stream_get_meta_data($this->out)['timed_out']) { throw new TransportException(\sprintf('Connection to "%s" timed out.', $this->getReadConnectionDescription())); } - if ($metas['eof']) { + if (feof($this->out)) { // don't use "eof" metadata, it's not accurate on Windows throw new TransportException(\sprintf('Connection to "%s" has been closed unexpectedly.', $this->getReadConnectionDescription())); } if (false === $line) { - throw new TransportException(\sprintf('Unable to read from connection to "%s": ', $this->getReadConnectionDescription()).error_get_last()['message']); + throw new TransportException(\sprintf('Unable to read from connection to "%s": ', $this->getReadConnectionDescription().error_get_last()['message'] ?? '')); } } diff --git a/src/Symfony/Component/Messenger/Attribute/AsMessage.php b/src/Symfony/Component/Messenger/Attribute/AsMessage.php index bc60ec032bff9..ee46bd5491fe1 100644 --- a/src/Symfony/Component/Messenger/Attribute/AsMessage.php +++ b/src/Symfony/Component/Messenger/Attribute/AsMessage.php @@ -23,7 +23,7 @@ public function __construct( /** * Name of the transports to which the message should be routed. */ - public null|string|array $transport = null, + public string|array|null $transport = null, ) { } } diff --git a/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpReceiver.php b/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpReceiver.php index 3c855e9ee46ce..48706b6432755 100644 --- a/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/AmqpReceiver.php @@ -92,10 +92,16 @@ public function ack(Envelope $envelope): void try { $stamp = $this->findAmqpStamp($envelope); - $this->connection->ack( - $stamp->getAmqpEnvelope(), - $stamp->getQueueName() - ); + $this->connection->ack($stamp->getAmqpEnvelope(), $stamp->getQueueName()); + } catch (\AMQPConnectionException) { + try { + $stamp = $this->findAmqpStamp($envelope); + + $this->connection->queue($stamp->getQueueName())->getConnection()->reconnect(); + $this->connection->ack($stamp->getAmqpEnvelope(), $stamp->getQueueName()); + } catch (\AMQPException $exception) { + throw new TransportException($exception->getMessage(), 0, $exception); + } } catch (\AMQPException $exception) { throw new TransportException($exception->getMessage(), 0, $exception); } @@ -124,6 +130,13 @@ private function rejectAmqpEnvelope(\AMQPEnvelope $amqpEnvelope, string $queueNa { try { $this->connection->nack($amqpEnvelope, $queueName, \AMQP_NOPARAM); + } catch (\AMQPConnectionException) { + try { + $this->connection->queue($queueName)->getConnection()->reconnect(); + $this->connection->nack($amqpEnvelope, $queueName, \AMQP_NOPARAM); + } catch (\AMQPException $exception) { + throw new TransportException($exception->getMessage(), 0, $exception); + } } catch (\AMQPException $exception) { throw new TransportException($exception->getMessage(), 0, $exception); } diff --git a/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php index 65650cedd72e2..0a6197810d4a2 100644 --- a/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Amqp/Transport/Connection.php @@ -31,6 +31,7 @@ class Connection 'x-max-length-bytes', 'x-max-priority', 'x-message-ttl', + 'x-delivery-limit', ]; /** diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php index 7b402746815fb..beba416297b9f 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\Connection; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\Serializer; use Symfony\Component\Serializer as SerializerComponent; @@ -40,14 +41,21 @@ public function testItReturnsTheDecodedMessageToTheHandler() $receiver = new BeanstalkdReceiver($connection, $serializer); $actualEnvelopes = $receiver->get(); $this->assertCount(1, $actualEnvelopes); - $this->assertEquals(new DummyMessage('Hi'), $actualEnvelopes[0]->getMessage()); + /** @var Envelope $actualEnvelope */ + $actualEnvelope = $actualEnvelopes[0]; + $this->assertEquals(new DummyMessage('Hi'), $actualEnvelope->getMessage()); /** @var BeanstalkdReceivedStamp $receivedStamp */ - $receivedStamp = $actualEnvelopes[0]->last(BeanstalkdReceivedStamp::class); + $receivedStamp = $actualEnvelope->last(BeanstalkdReceivedStamp::class); $this->assertInstanceOf(BeanstalkdReceivedStamp::class, $receivedStamp); $this->assertSame('1', $receivedStamp->getId()); $this->assertSame($tube, $receivedStamp->getTube()); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame('1', $transportMessageIdStamp->getId()); } public function testItReturnsEmptyArrayIfThereAreNoMessages() diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php index 89ac3449f3a4b..a198765d7ed70 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php @@ -17,6 +17,7 @@ use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\Connection; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\DelayStamp; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; final class BeanstalkdSenderTest extends TestCase @@ -27,13 +28,21 @@ public function testSend() $encoded = ['body' => '...', 'headers' => ['type' => DummyMessage::class]]; $connection = $this->createMock(Connection::class); - $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 0); + $connection->expects($this->once())->method('send') + ->with($encoded['body'], $encoded['headers'], 0) + ->willReturn('1') + ; $serializer = $this->createMock(SerializerInterface::class); $serializer->method('encode')->with($envelope)->willReturn($encoded); $sender = new BeanstalkdSender($connection, $serializer); - $sender->send($envelope); + $actualEnvelope = $sender->send($envelope); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame('1', $transportMessageIdStamp->getId()); } public function testSendWithDelay() diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php index eaacfa4b60b99..c4b7e904a544e 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php @@ -363,4 +363,25 @@ public function testKeepaliveWhenABeanstalkdExceptionOccurs() $this->expectExceptionObject(new TransportException($exception->getMessage(), 0, $exception)); $connection->keepalive((string) $id); } + + public function testSendWithRoundedDelay() + { + $tube = 'xyz'; + $body = 'foo'; + $headers = ['test' => 'bar']; + $delay = 920; + $expectedDelay = 0; + + $client = $this->createMock(PheanstalkInterface::class); + $client->expects($this->once())->method('useTube')->with($tube)->willReturn($client); + $client->expects($this->once())->method('put')->with( + $this->anything(), + $this->anything(), + $expectedDelay, + $this->anything(), + ); + + $connection = new Connection(['tube_name' => $tube], $client); + $connection->send($body, $headers, $delay); + } } diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php index 7dd19e8c90a8b..bd716a7d5efe7 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php @@ -14,6 +14,7 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Receiver\KeepaliveReceiverInterface; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; @@ -52,7 +53,12 @@ public function get(): iterable throw $exception; } - return [$envelope->with(new BeanstalkdReceivedStamp($beanstalkdEnvelope['id'], $this->connection->getTube()))]; + return [$envelope + ->withoutAll(TransportMessageIdStamp::class) + ->with( + new BeanstalkdReceivedStamp($beanstalkdEnvelope['id'], $this->connection->getTube()), + new TransportMessageIdStamp($beanstalkdEnvelope['id']), + )]; } public function ack(Envelope $envelope): void diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php index 8e7607f54267e..f6ba0b2a54fc6 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php @@ -13,6 +13,7 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\DelayStamp; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Sender\SenderInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; @@ -39,8 +40,8 @@ public function send(Envelope $envelope): Envelope $delayStamp = $envelope->last(DelayStamp::class); $delayInMs = null !== $delayStamp ? $delayStamp->getDelay() : 0; - $this->connection->send($encodedMessage['body'], $encodedMessage['headers'] ?? [], $delayInMs); + $id = $this->connection->send($encodedMessage['body'], $encodedMessage['headers'] ?? [], $delayInMs); - return $envelope; + return $envelope->with(new TransportMessageIdStamp($id)); } } diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php index c2c5cd7ee49f8..0f2c2c555a4fb 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php @@ -124,7 +124,7 @@ public function send(string $body, array $headers, int $delay = 0): string $job = $this->client->useTube($this->tube)->put( $message, PheanstalkInterface::DEFAULT_PRIORITY, - $delay / 1000, + (int) ($delay / 1000), $this->ttr ); } catch (Exception $exception) { diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php index f1f5fbeef8d62..49ebf00dbdd5d 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/ConnectionTest.php @@ -15,7 +15,6 @@ use Doctrine\DBAL\Connection as DBALConnection; use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Platforms\AbstractPlatform; -use Doctrine\DBAL\Platforms\MariaDb1060Platform; use Doctrine\DBAL\Platforms\MariaDBPlatform; use Doctrine\DBAL\Platforms\MySQL57Platform; use Doctrine\DBAL\Platforms\MySQL80Platform; @@ -591,9 +590,16 @@ class_exists(MySQLPlatform::class) ? new MySQLPlatform() : new MySQL57Platform() 'SELECT m.* FROM messenger_messages m WHERE (m.queue_name = ?) AND (m.delivered_at is null OR m.delivered_at < ?) AND (m.available_at <= ?) ORDER BY available_at ASC LIMIT 1 FOR UPDATE', ]; - if (class_exists(MariaDb1060Platform::class)) { + if (interface_exists(DBALException::class)) { + // DBAL 4+ + $mariaDbPlatformClass = 'Doctrine\DBAL\Platforms\MariaDB1060Platform'; + } else { + $mariaDbPlatformClass = 'Doctrine\DBAL\Platforms\MariaDb1060Platform'; + } + + if (class_exists($mariaDbPlatformClass)) { yield 'MariaDB106' => [ - new MariaDb1060Platform(), + new $mariaDbPlatformClass(), 'SELECT m.* FROM messenger_messages m WHERE (m.queue_name = ?) AND (m.delivered_at is null OR m.delivered_at < ?) AND (m.available_at <= ?) ORDER BY available_at ASC LIMIT 1 FOR UPDATE SKIP LOCKED', ]; } diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php index 744c76ce897c6..d81e7cd5d0e34 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php @@ -26,6 +26,8 @@ use Symfony\Component\Messenger\Transport\Serialization\Serializer; use Symfony\Component\Serializer as SerializerComponent; use Symfony\Component\Serializer\Encoder\JsonEncoder; +use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; +use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; class DoctrineReceiverTest extends TestCase @@ -43,7 +45,7 @@ public function testItReturnsTheDecodedMessageToTheHandler() $this->assertCount(1, $actualEnvelopes); /** @var Envelope $actualEnvelope */ $actualEnvelope = $actualEnvelopes[0]; - $this->assertEquals(new DummyMessage('Hi'), $actualEnvelopes[0]->getMessage()); + $this->assertEquals(new DummyMessage('Hi'), $actualEnvelope->getMessage()); /** @var DoctrineReceivedStamp $doctrineReceivedStamp */ $doctrineReceivedStamp = $actualEnvelope->last(DoctrineReceivedStamp::class); @@ -91,6 +93,23 @@ public function testOccursRetryableExceptionFromConnection() $receiver->get(); } + public function testGetReplacesExistingTransportMessageIdStamps() + { + $serializer = $this->createSerializer(); + + $doctrineEnvelope = $this->createRetriedDoctrineEnvelope(); + $connection = $this->createMock(Connection::class); + $connection->method('get')->willReturn($doctrineEnvelope); + + $receiver = new DoctrineReceiver($connection, $serializer); + $actualEnvelopes = $receiver->get(); + /** @var Envelope $actualEnvelope */ + $actualEnvelope = $actualEnvelopes[0]; + $messageIdStamps = $actualEnvelope->all(TransportMessageIdStamp::class); + + $this->assertCount(1, $messageIdStamps); + } + public function testAll() { $serializer = $this->createSerializer(); @@ -106,6 +125,24 @@ public function testAll() $this->assertEquals(new DummyMessage('Hi'), $actualEnvelopes[0]->getMessage()); } + public function testAllReplacesExistingTransportMessageIdStamps() + { + $serializer = $this->createSerializer(); + + $doctrineEnvelope1 = $this->createRetriedDoctrineEnvelope(); + $doctrineEnvelope2 = $this->createRetriedDoctrineEnvelope(); + $connection = $this->createMock(Connection::class); + $connection->method('findAll')->willReturn([$doctrineEnvelope1, $doctrineEnvelope2]); + + $receiver = new DoctrineReceiver($connection, $serializer); + $actualEnvelopes = $receiver->all(); + foreach ($actualEnvelopes as $actualEnvelope) { + $messageIdStamps = $actualEnvelope->all(TransportMessageIdStamp::class); + + $this->assertCount(1, $messageIdStamps); + } + } + public function testFind() { $serializer = $this->createSerializer(); @@ -119,6 +156,21 @@ public function testFind() $this->assertEquals(new DummyMessage('Hi'), $actualEnvelope->getMessage()); } + public function testFindReplacesExistingTransportMessageIdStamps() + { + $serializer = $this->createSerializer(); + + $doctrineEnvelope = $this->createRetriedDoctrineEnvelope(); + $connection = $this->createMock(Connection::class); + $connection->method('find')->with(3)->willReturn($doctrineEnvelope); + + $receiver = new DoctrineReceiver($connection, $serializer); + $actualEnvelope = $receiver->find(3); + $messageIdStamps = $actualEnvelope->all(TransportMessageIdStamp::class); + + $this->assertCount(1, $messageIdStamps); + } + public function testAck() { $serializer = $this->createSerializer(); @@ -186,7 +238,7 @@ public function testAckThrowsRetryableExceptionAndRetriesFail() ->with('1') ->willThrowException($deadlockException); - self::expectException(TransportException::class); + $this->expectException(TransportException::class); $receiver->ack($envelope); } @@ -206,7 +258,7 @@ public function testAckThro 10000 wsException() ->with('1') ->willThrowException($exception); - self::expectException($exception::class); + $this->expectException($exception::class); $receiver->ack($envelope); } @@ -277,7 +329,7 @@ public function testRejectThrowsRetryableExceptionAndRetriesFail() ->with('1') ->willThrowException($deadlockException); - self::expectException(TransportException::class); + $this->expectException(TransportException::class); $receiver->reject($envelope); } @@ -297,7 +349,7 @@ public function testRejectThrowsException() ->with('1') ->willThrowException($exception); - self::expectException($exception::class); + $this->expectException($exception::class); $receiver->reject($envelope); } @@ -312,10 +364,27 @@ private function createDoctrineEnvelope(): array ]; } + private function createRetriedDoctrineEnvelope(): array + { + return [ + 'id' => 3, + 'body' => '{"message": "Hi"}', + 'headers' => [ + 'type' => DummyMessage::class, + 'X-Message-Stamp-Symfony\Component\Messenger\Stamp\BusNameStamp' => '[{"busName":"messenger.bus.default"}]', + 'X-Message-Stamp-Symfony\Component\Messenger\Stamp\TransportMessageIdStamp' => '[{"id":1},{"id":2}]', + 'X-Message-Stamp-Symfony\Component\Messenger\Stamp\ErrorDetailsStamp' => '[{"exceptionClass":"Symfony\\\\Component\\\\Messenger\\\\Exception\\\\RecoverableMessageHandlingException","exceptionCode":0,"exceptionMessage":"","flattenException":null}]', + 'X-Message-Stamp-Symfony\Component\Messenger\Stamp\DelayStamp' => '[{"delay":1000},{"delay":1000}]', + 'X-Message-Stamp-Symfony\Component\Messenger\Stamp\RedeliveryStamp' => '[{"retryCount":1,"redeliveredAt":"2025-01-05T13:58:25+00:00"},{"retryCount":2,"redeliveredAt":"2025-01-05T13:59:26+00:00"}]', + 'Content-Type' => 'application/json', + ], + ]; + } + private function createSerializer(): Serializer { return new Serializer( - new SerializerComponent\Serializer([new ObjectNormalizer()], ['json' => new JsonEncoder()]) + new SerializerComponent\Serializer([new DateTimeNormalizer(), new ArrayDenormalizer(), new ObjectNormalizer()], ['json' => new JsonEncoder()]) ); } } diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php index e0b06cfd7ef8c..4901824a85c1b 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php @@ -23,6 +23,9 @@ use Doctrine\DBAL\Query\QueryBuilder; use Doctrine\DBAL\Result; use Doctrine\DBAL\Schema\AbstractAsset; +use Doctrine\DBAL\Schema\Name\Identifier; +use Doctrine\DBAL\Schema\Name\UnqualifiedName; +use Doctrine\DBAL\Schema\PrimaryKeyConstraint; use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Types\Types; @@ -519,7 +522,11 @@ private function addTableToSchema(Schema $schema): void ->setNotnull(true); $table->addColumn('delivered_at', Types::DATETIME_IMMUTABLE) ->setNotnull(false); - $table->setPrimaryKey(['id']); + if (class_exists(PrimaryKeyConstraint::class)) { + $table->addPrimaryKeyConstraint(new PrimaryKeyConstraint(null, [new UnqualifiedName(Identifier::unquoted('id'))], true)); + } else { + $table->setPrimaryKey(['id']); + } $table->addIndex(['queue_name']); $table->addIndex(['available_at']); $table->addIndex(['delivered_at']); diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineReceiver.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineReceiver.php index e999a57b1701e..19cb065d7620b 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/DoctrineReceiver.php @@ -141,10 +141,12 @@ private function createEnvelopeFromData(array $data): Envelope throw $exception; } - return $envelope->with( - new DoctrineReceivedStamp($data['id']), - new TransportMessageIdStamp($data['id']) - ); + return $envelope + ->withoutAll(TransportMessageIdStamp::class) + ->with( + new DoctrineReceivedStamp($data['id']), + new TransportMessageIdStamp($data['id']) + ); } private function withRetryableExceptionRetry(callable $callable): void diff --git a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php index 469623a9419c3..faf63baa011e9 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisExtIntegrationTest.php @@ -459,7 +459,7 @@ private function getConnectionStream(Connection $connection): string private function skipIfRedisClusterUnavailable() { try { - new \RedisCluster(null, explode(' ', getenv('REDIS_CLUSTER_HOSTS'))); + new \RedisCluster(null, getenv('REDIS_CLUSTER_HOST') ? explode(' ', getenv('REDIS_CLUSTER_HOST')) : []); } catch (\Exception $e) { self::markTestSkipped($e->getMessage()); } diff --git a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php index 903428ab3772c..831b6817ee9c8 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php @@ -17,7 +17,9 @@ use Symfony\Component\Messenger\Bridge\Redis\Tests\Fixtures\ExternalMessageSerializer; use Symfony\Component\Messenger\Bridge\Redis\Transport\Connection; use Symfony\Component\Messenger\Bridge\Redis\Transport\RedisReceiver; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\Serializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; @@ -38,7 +40,14 @@ public function testItReturnsTheDecodedMessageToTheHandler(array $redisEnvelope, $receiver = new RedisReceiver($connection, $serializer); $actualEnvelopes = $receiver->get(); $this->assertCount(1, $actualEnvelopes); - $this->assertEquals($expectedMessage, $actualEnvelopes[0]->getMessage()); + /** @var Envelope $actualEnvelope */ + $actualEnvelope = $actualEnvelopes[0]; + $this->assertEquals($expectedMessage, $actualEnvelope->getMessage()); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame($redisEnvelope['id'], $transportMessageIdStamp->getId()); } /** diff --git a/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php b/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php index 45e7963dfde3f..2d328b3c96222 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php @@ -15,6 +15,7 @@ use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; use Symfony\Component\Messenger\Exception\TransportException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; @@ -76,7 +77,12 @@ public function get(): iterable throw $exception; } - return [$envelope->with(new RedisReceivedStamp($message['id']))]; + return [$envelope + ->withoutAll(TransportMessageIdStamp::class) + ->with( + new RedisReceivedStamp($message['id']), + new TransportMessageIdStamp($message['id']) + )]; } public function ack(Envelope $envelope): void diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index 9345a71b97a10..1a84381008318 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -143,6 +143,12 @@ protected function interact(InputInterface $input, OutputInterface $output): voi } if ($this->receiverNames && !$input->getArgument('receivers')) { + if (1 === \count($this->receiverNames)) { + $input->setArgument('receivers', $this->receiverNames); + + return; + } + $io->block('Which transports/receivers do you want to consume?', null, 'fg=white;bg=blue', ' ', true); $io->writeln('Choose which receivers you want to consume messages from in order of priority.'); @@ -284,7 +290,7 @@ public function handleSignal(int $signal, int|false $previousExitCode = 0): int| } if (\SIGALRM === $signal) { - $this->logger?->info('Sending keepalive request.', ['transport_names' => $this->worker->getMetadata()->getTransportNames()]); + $this->logger?->debug('Sending keepalive request.', ['transport_names' => $this->worker->getMetadata()->getTransportNames()]); $this->worker->keepalive($this->getApplication()->getAlarmInterval()); diff --git a/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php b/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php index 47bcd1463a915..15dbe84a37da3 100644 --- a/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php +++ b/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php @@ -224,8 +224,8 @@ private function runWorker(string $failureTransportName, ReceiverInterface $rece $this->forceExit = true; try { - $choice = $io->choice('Please select an action', ['retry', 'delete', 'skip'], 'retry'); - $shouldHandle = $shouldForce || 'retry' === $choice; + $choice = $shouldForce ? 'retry' : $io->choice('Please select an action', ['retry', 'delete', 'skip'], 'retry'); + $shouldHandle = 'retry' === $choice; } finally { $this->forceExit = false; } diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index 9bb32d661ac72..989c9dc5fcd5d 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -254,6 +254,7 @@ private function registerReceivers(ContainerBuilder $container, array $busIds): } } + $consumableReceiverNames = []; foreach ($container->findTaggedServiceIds('messenger.receiver') as $id => $tags) { $receiverClass = $this->getServiceClass($container, $id); if (!is_subclass_of($receiverClass, ReceiverInterface::class)) { @@ -269,6 +270,9 @@ private function registerReceivers(ContainerBuilder $container, array $busIds): $failureTransportsMap[$tag['alias']] = $receiverMapping[$id]; } } + if (!isset($tag['is_consumable']) || $tag['is_consumable'] !== false) { + $consumableReceiverNames[] = $tag['alias'] ?? $id; + } } } @@ -294,7 +298,7 @@ private function registerReceivers(ContainerBuilder $container, array $busIds): $consumeCommandDefinition->replaceArgument(0, new Reference('messenger.routable_message_bus')); } - $consumeCommandDefinition->replaceArgument(4, array_values($receiverNames)); + $consumeCommandDefinition->replaceArgument(4, $consumableReceiverNames); try { $consumeCommandDefinition->replaceArgument(6, $busIds); } catch (OutOfBoundsException) { diff --git a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php index f6334173972af..5f3ee445920cd 100644 --- a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php +++ b/src/Symfony/Component/Messenger/EventListener/SendFailedMessageForRetryListener.php @@ -63,12 +63,7 @@ public function onMessageFailed(WorkerMessageFailedEvent $event): void ++$retryCount; - $delay = null; - if ($throwable instanceof RecoverableExceptionInterface && method_exists($throwable, 'getRetryDelay')) { - $delay = $throwable->getRetryDelay(); - } - - $delay ??= $retryStrategy->getWaitingTime($envelope, $throwable); + $delay = $this->getWaitingTime($envelope, $throwable, $retryStrategy); $this->logger?->warning('Error thrown while handling message {class}. Sending for retry #{retryCount} using {delay} ms delay. Error: "{error}"', $context + ['retryCount' => $retryCount, 'delay' => $delay, 'error' => $throwable->getMessage(), 'exception' => $throwable]); @@ -148,6 +143,30 @@ private function shouldRetry(\Throwable $e, Envelope $envelope, RetryStrategyInt return $retryStrategy->isRetryable($envelope, $e); } + private function getWaitingTime(Envelope $envelope, \Throwable $throwable, RetryStrategyInterface $retryStrategy): int + { + $delay = null; + if ($throwable instanceof RecoverableExceptionInterface && method_exists($throwable, 'getRetryDelay')) { + $delay = $throwable->getRetryDelay(); + } + + if ($throwable instanceof HandlerFailedException) { + foreach ($throwable->getWrappedExceptions() as $nestedException) { + if (!$nestedException instanceof RecoverableExceptionInterface + || !method_exists($nestedException, 'getRetryDelay') + || 0 > $retryDelay = $nestedException->getRetryDelay() ?? -1 + ) { + continue; + } + if ($retryDelay < ($delay ?? \PHP_INT_MAX)) { + $delay = $retryDelay; + } + } + } + + return $delay ?? $retryStrategy->getWaitingTime($envelope, $throwable); + } + private function getRetryStrategyForTransport(string $alias): ?RetryStrategyInterface { if ($this->retryStrategyLocator->has($alias)) { diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index f830489634a11..4de01a129e546 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Tests\DependencyInjection; use PHPUnit\Framework\TestCase; +use Symfony\Component\Console\Command\Command; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Compiler\AttributeAutoconfigurationPass; use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass; @@ -471,6 +472,34 @@ public function testItSetsTheReceiverNamesOnTheSetupTransportsCommand() $this->assertSame(['amqp', 'dummy'], $container->getDefinition('console.command.messenger_setup_transports')->getArgument(1)); } + public function testOnlyConsumableTransportsAreAddedToConsumeCommand() + { + $container = new ContainerBuilder(); + + $container->register('messenger.transport.async', DummyReceiver::class) + ->addTag('messenger.receiver', ['alias' => 'async']); + $container->register('messenger.transport.sync', DummyReceiver::class) + ->addTag('messenger.receiver', ['alias' => 'sync', 'is_consumable' => false]); + $container->register('messenger.receiver_locator', ServiceLocator::class) + ->setArguments([[]]); + + $container->register('console.command.messenger_consume_messages', Command::class) + ->setArguments([ + null, + null, + null, + null, + [], + ]); + + (new MessengerPass())->process($container); + + $this->assertSame( + ['async'], + $container->getDefinition('console.command.messenger_consume_messages')->getArgument(4) + ); + } + public function testItRegistersHandlersOnDifferentBuses() { $container = $this->getContainerBuilder($eventsBusId = 'event_bus'); diff --git a/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php b/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php index cf3c86d7f4ffb..793da81451aa5 100644 --- a/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php +++ b/src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageForRetryListenerTest.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageRetriedEvent; use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener; +use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException; use Symfony\Component\Messenger\Retry\RetryStrategyInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; @@ -108,6 +109,62 @@ public function testRecoverableExceptionRetryDelayOverridesStrategy() $listener->onMessageFailed($event); } + /** + * @dataProvider provideRetryDelays + */ + public function testWrappedRecoverableExceptionRetryDelayOverridesStrategy(array $retries, int $expectedDelay) + { + $sender = $this->createMock(SenderInterface::class); + $sender->expects($this->once())->method('send')->willReturnCallback(function (Envelope $envelope) use ($expectedDelay) { + $delayStamp = $envelope->last(DelayStamp::class); + $redeliveryStamp = $envelope->last(RedeliveryStamp::class); + + $this->assertInstanceOf(DelayStamp::class, $delayStamp); + $this->assertSame($expectedDelay, $delayStamp->getDelay()); + + $this->assertInstanceOf(RedeliveryStamp::class, $redeliveryStamp); + $this->assertSame(1, $redeliveryStamp->getRetryCount()); + + return $envelope; + }); + $senderLocator = new Container(); + $senderLocator->set('my_receiver', $sender); + $retryStrategy = $this->createMock(RetryStrategyInterface::class); + $retryStrategy->expects($this->never())->method('isRetryable'); + $retryStrategy->expects($this->never())->method('getWaitingTime'); + $retryStrategyLocator = new Container(); + $retryStrategyLocator->set('my_receiver', $retryStrategy); + + $listener = new SendFailedMessageForRetryListener($senderLocator, $retryStrategyLocator); + + $envelope = new Envelope(new \stdClass()); + $exception = new HandlerFailedException( + $envelope, + array_map(fn (int $retry) => new RecoverableMessageHandlingException('retry', retryDelay: $retry), $retries) + ); + $event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception); + + $listener->onMessageFailed($event); + } + + public static function provideRetryDelays(): iterable + { + yield 'one_exception' => [ + [1235], + 1235, + ]; + + yield 'multiple_exceptions' => [ + [1235, 2000, 1000], + 1000, + ]; + + yield 'zero_delay' => [ + [0, 2000, 1000], + 0, + ]; + } + public function testEnvelopeIsSentToTransportOnRetry() { $exception = new \Exception('no!'); diff --git a/src/Symfony/Component/Messenger/Tests/WorkerTest.php b/src/Symfony/Component/Messenger/Tests/WorkerTest.php index 553368a193c09..9dbb44b203b41 100644 --- a/src/Symfony/Component/Messenger/Tests/WorkerTest.php +++ b/src/Symfony/Component/Messenger/Tests/WorkerTest.php @@ -586,25 +586,6 @@ public function testFlushBatchOnStop() $this->assertSame($expectedMessages, $handler->processedMessages); } - public function testGcCollectCyclesIsCalledOnMessageHandle() - { - $apiMessage = new DummyMessage('API'); - - $receiver = new DummyReceiver([[new Envelope($apiMessage)]]); - - $bus = $this->createMock(MessageBusInterface::class); - - $dispatcher = new EventDispatcher(); - $dispatcher->addSubscriber(new StopWorkerOnMessageLimitListener(1)); - - $worker = new Worker(['transport' => $receiver], $bus, $dispatcher); - $worker->run(); - - $gcStatus = gc_status(); - - $this->assertGreaterThan(0, $gcStatus['runs']); - } - /** * @requires extension pcntl */ diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index 14b30ba5645bf..f2500e3e779e8 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -128,8 +128,6 @@ public function run(array $options = []): void // this should prevent multiple lower priority receivers from // blocking too long before the higher priority are checked if ($envelopeHandled) { - gc_collect_cycles(); - break; } } diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php index 2de52e68da161..e238ce39d1313 100644 --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php @@ -401,7 +401,7 @@ public function ensureValidity(): void private function ensureBodyValid(): void { - if (null === $this->text && null === $this->html && !$this->attachments) { + if (null === $this->text && null === $this->html && !$this->attachments && null === parent::getBody()) { throw new LogicException('A message must have a text or an HTML part or attachments.'); } } diff --git a/src/Symfony/Component/Mime/Header/PathHeader.php b/src/Symfony/Component/Mime/Header/PathHeader.php index 63eb30af01bf8..4b0b7d3955673 100644 --- a/src/Symfony/Component/Mime/Header/PathHeader.php +++ b/src/Symfony/Component/Mime/Header/PathHeader.php @@ -57,6 +57,6 @@ public function getAddress(): Address public function getBodyAsString(): string { - return '<'.$this->address->toString().'>'; + return '<'.$this->address->getEncodedAddress().'>'; } } diff --git a/src/Symfony/Component/Mime/Part/Multipart/FormDataPart.php b/src/Symfony/Component/Mime/Part/Multipart/FormDataPart.php index f2d6e27066356..ca4080198d4c2 100644 --- a/src/Symfony/Component/Mime/Part/Multipart/FormDataPart.php +++ b/src/Symfony/Component/Mime/Part/Multipart/FormDataPart.php @@ -13,7 +13,6 @@ use Symfony\Component\Mime\Exception\InvalidArgumentException; use Symfony\Component\Mime\Part\AbstractMultipartPart; -use Symfony\Component\Mime\Part\DataPart; use Symfony\Component\Mime\Part\TextPart; /** @@ -24,7 +23,7 @@ final class FormDataPart extends AbstractMultipartPart { /** - * @param array $fields + * @param array $fields */ public function __construct( private array $fields = [], diff --git a/src/Symfony/Component/Mime/Tests/EmailTest.php b/src/Symfony/Component/Mime/Tests/EmailTest.php index ae61f26f605b4..3aa86c5f94623 100644 --- a/src/Symfony/Component/Mime/Tests/EmailTest.php +++ b/src/Symfony/Component/Mime/Tests/EmailTest.php @@ -695,4 +695,60 @@ public function testEmailsWithAttachmentsWhichAreAFileInstanceCanBeUnserialized( $this->assertCount(1, $attachments); $this->assertStringContainsString('foo_bar_xyz_123', $attachments[0]->getBody()); } + + public function testInvalidBodyWithEmptyEmail() + { + $this->expectException(\LogicException::class); + $this->expectExceptionMessage('A message must have a text or an HTML part or attachments.'); + + (new Email())->ensureValidity(); + } + + public function testBodyWithTextIsValid() + { + $email = new Email(); + $email->to('test@example.com') + ->from('test@example.com') + ->text('foo'); + + $email->ensureValidity(); + + $this->expectNotToPerformAssertions(); + } + + public function testBodyWithHtmlIsValid() + { + $email = new Email(); + $email->to('test@example.com') + ->from('test@example.com') + ->html('foo'); + + $email->ensureValidity(); + + $this->expectNotToPerformAssertions(); + } + + public function testEmptyBodyWithAttachmentsIsValid() + { + $email = new Email(); + $email->to('test@example.com') + ->from('test@example.com') + ->addPart(new DataPart('foo')); + + $email->ensureValidity(); + + $this->expectNotToPerformAssertions(); + } + + public function testSetBodyIsValid() + { + $email = new Email(); + $email->to('test@example.com') + ->from('test@example.com') + ->setBody(new TextPart('foo')); + + $email->ensureValidity(); + + $this->expectNotToPerformAssertions(); + } } diff --git a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php index b1892978c1a0b..b0a28fdbf992e 100644 --- a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php +++ b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php @@ -346,4 +346,12 @@ public function testSetHeaderParameterNotParameterized() $this->expectException(\LogicException::class); $headers->setHeaderParameter('Content-Disposition', 'name', 'foo'); } + + public function testPathHeaderHasNoName() + { + $headers = new Headers(); + + $headers->addPathHeader('Return-Path', new Address('some@path', 'any ignored name')); + $this->assertSame('', $headers->get('Return-Path')->getBodyAsString()); + } } diff --git a/src/Symfony/Component/Notifier/Bridge/AmazonSns/Tests/AmazonSnsTransportFactoryTest.php b/src/Symfony/Component/Notifier/Bridge/AmazonSns/Tests/AmazonSnsTransportFactoryTest.php index 05f57e68b6b6f..0d284a3af3641 100644 --- a/src/Symfony/Component/Notifier/Bridge/AmazonSns/Tests/AmazonSnsTransportFactoryTest.php +++ b/src/Symfony/Component/Notifier/Bridge/AmazonSns/Tests/AmazonSnsTransportFactoryTest.php @@ -18,6 +18,12 @@ class AmazonSnsTransportFactoryTest extends AbstractTransportFactoryTestCase { public function createFactory(): AmazonSnsTransportFactory { + // Tests will fail if a ~/.aws/config file exists with a default.region value, + // or if AWS_REGION env variable is set. + // Setting a profile & region names will bypass default options retrieved by \AsyncAws\Core::get + $_ENV['AWS_PROFILE'] = 'not-existing'; + $_ENV['AWS_REGION'] = 'us-east-1'; + return new AmazonSnsTransportFactory(); } diff --git a/src/Symfony/Component/Notifier/Bridge/Bluesky/BlueskyTransport.php b/src/Symfony/Component/Notifier/Bridge/Bluesky/BlueskyTransport.php index 3233159a28a0a..db8eff9e70f50 100644 --- a/src/Symfony/Component/Notifier/Bridge/Bluesky/BlueskyTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/Bluesky/BlueskyTransport.php @@ -105,7 +105,7 @@ protected function doSend(MessageInterface $message): SentMessage if (200 === $statusCode) { $content = $response->toArray(); $sentMessage = new SentMessage($message, (string) $this); - $sentMessage->setMessageId($content['cid']); + $sentMessage->setMessageId($content['uri']); return $sentMessage; } diff --git a/src/Symfony/Component/Notifier/Bridge/Bluesky/CHANGELOG.md b/src/Symfony/Component/Notifier/Bridge/Bluesky/CHANGELOG.md index d337db00df015..b4b57416c470c 100644 --- a/src/Symfony/Component/Notifier/Bridge/Bluesky/CHANGELOG.md +++ b/src/Symfony/Component/Notifier/Bridge/Bluesky/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add option to attach a media + * [BC Break] Change the returned message ID from record's 'cid' to 'uri' 7.1 --- diff --git a/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php index 1cfa099e04537..09323174d8ce3 100644 --- a/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Bluesky/Tests/BlueskyTransportTest.php @@ -276,7 +276,11 @@ public function testParseFacetsUrlWithTrickyRegex() public function testWithMedia() { - $transport = $this->createTransport(new MockHttpClient((function () { + // realistic sample values taken from https://docs.bsky.app/docs/advanced-guides/posts#post-record-structure + $recordUri = 'at://did:plc:u5cwb2mwiv2bfq53cjufe6yn/app.bsky.feed.post/3k4duaz5vfs2b'; + $recordCid = 'bafyreibjifzpqj6o6wcq3hejh7y4z4z2vmiklkvykc57tw3pcbx3kxifpm'; + + $transport = $this->createTransport(new MockHttpClient((function () use ($recordUri, $recordCid) { yield function (string $method, string $url, array $options) { $this->assertSame('POST', $method); $this->assertSame('https://bsky.social/xrpc/com.atproto.server.createSession', $url); @@ -299,13 +303,13 @@ public function testWithMedia() ]]); }; - yield function (string $method, string $url, array $options) { + yield function (string $method, string $url, array $options) use ($recordUri, $recordCid) { $this->assertSame('POST', $method); $this->assertSame('https://bsky.social/xrpc/com.atproto.repo.createRecord', $url); $this->assertArrayHasKey('authorization', $options['normalized_headers']); $this->assertSame('{"repo":null,"collection":"app.bsky.feed.post","record":{"$type":"app.bsky.feed.post","text":"Hello World!","createdAt":"2024-04-28T08:40:17.000000Z","embed":{"$type":"app.bsky.embed.images","images":[{"alt":"A fixture","image":{"$type":"blob","ref":{"$link":"bafkreibabalobzn6cd366ukcsjycp4yymjymgfxcv6xczmlgpemzkz3cfa"},"mimeType":"image\/png","size":760898}}]}}}', $options['body']); - return new JsonMockResponse(['cid' => '103254962155278888']); + return new JsonMockResponse(['uri' => $recordUri, 'cid' => $recordCid]); }; })())); @@ -313,7 +317,26 @@ public function testWithMedia() ->attachMedia(new File(__DIR__.'/fixtures.gif'), 'A fixture'); $result = $transport->send(new ChatMessage('Hello World!', $options)); - $this->assertSame('103254962155278888', $result->getMessageId()); + $this->assertSame($recordUri, $result->getMessageId()); + } + + public function testReturnedMessageId() + { + // realistic sample values taken from https://docs.bsky.app/docs/advanced-guides/posts#post-record-structure + $recordUri = 'at://did:plc:u5cwb2mwiv2bfq53cjufe6yn/app.bsky.feed.post/3k4duaz5vfs2b'; + $recordCid = 'bafyreibjifzpqj6o6wcq3hejh7y4z4z2vmiklkvykc57tw3pcbx3kxifpm'; + + $client = new MockHttpClient(function () use ($recordUri, $recordCid) { + return new JsonMockResponse([ + 'uri' => $recordUri, + 'cid' => $recordCid, + ]); + }); + + $transport = self::createTransport($client); + $message = $transport->send(new ChatMessage('Hello!')); + + $this->assertSame($recordUri, $message->getMessageId()); } /** diff --git a/src/Symfony/Component/Notifier/Bridge/ClickSend/ClickSendTransport.php b/src/Symfony/Component/Notifier/Bridge/ClickSend/ClickSendTransport.php index 8d8987e4f7c7a..65f48bcd7ac19 100644 --- a/src/Symfony/Component/Notifier/Bridge/ClickSend/ClickSendTransport.php +++ b/src/Symfony/Component/Notifier/Bridge/ClickSend/ClickSendTransport.php @@ -75,19 +75,19 @@ protected function doSend(MessageInterface $message): SentMessage $options['from'] = $message->getFrom() ?: $this->from; $options['source'] ??= $this->source; $options['list_id'] ??= $this->listId; - $options['from_email'] ?? $this->fromEmail; + $options['from_email'] ??= $this->fromEmail; if (isset($options['from']) && !preg_match('/^[a-zA-Z0-9\s]{3,11}$/', $options['from']) && !preg_match('/^\+[1-9]\d{1,14}$/', $options['from'])) { throw new InvalidArgumentException(\sprintf('The "From" number "%s" is not a valid phone number, shortcode, or alphanumeric sender ID.', $options['from'])); } - if ($options['list_id'] ?? false) { + if (!$options['list_id']) { $options['to'] = $message->getPhone(); } $response = $this->client->request('POST', $endpoint, [ 'auth_basic' => [$this->apiUsername, $this->apiKey], - 'json' => array_filter($options), + 'json' => ['messages' => [array_filter($options)]], ]); try { diff --git a/src/Symfony/Component/Notifier/Bridge/ClickSend/Tests/ClickSendTransportTest.php b/src/Symfony/Component/Notifier/Bridge/ClickSend/Tests/ClickSendTransportTest.php index 6afae4409fa57..532c5aceba3aa 100644 --- a/src/Symfony/Component/Notifier/Bridge/ClickSend/Tests/ClickSendTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/ClickSend/Tests/ClickSendTransportTest.php @@ -24,7 +24,7 @@ final class ClickSendTransportTest extends TransportTestCase { - public static function createTransport(?HttpClientInterface $client = null, string $from = 'test_from', string $source = 'test_source', int $listId = 99, string $fromEmail = 'foo@bar.com'): ClickSendTransport + public static function createTransport(?HttpClientInterface $client = null, ?string $from = 'test_from', ?string $source = 'test_source', ?int $listId = 99, ?string $fromEmail = 'foo@bar.com'): ClickSendTransport { return new ClickSendTransport('test_username', 'test_key', $from, $source, $listId, $fromEmail, $client ?? new MockHttpClient()); } @@ -63,16 +63,47 @@ public function testNoInvalidArgumentExceptionIsThrownIfFromIsValid(string $from $response = $this->createMock(ResponseInterface::class); $response->expects(self::exactly(2))->method('getStatusCode')->willReturn(200); $response->expects(self::once())->method('getContent')->willReturn(''); - $client = new MockHttpClient(function (string $method, string $url) use ($response): ResponseInterface { + $client = new MockHttpClient(function (string $method, string $url, array $options) use ($response): ResponseInterface { self::assertSame('POST', $method); self::assertSame('https://rest.clicksend.com/v3/sms/send', $url); + $body = json_decode($options['body'], true); + self::assertIsArray($body); + self::assertArrayHasKey('messages', $body); + $message = reset($body['messages']); + self::assertArrayHasKey('from_email', $message); + self::assertArrayHasKey('list_id', $message); + self::assertArrayNotHasKey('to', $message); + return $response; }); $transport = $this->createTransport($client, $from); $transport->send($message); } + public function testNoInvalidArgumentExceptionIsThrownIfFromIsValidWithoutOptionalParameters() + { + $message = new SmsMessage('+33612345678', 'Hello!'); + $response = $this->createMock(ResponseInterface::class); + $response->expects(self::exactly(2))->method('getStatusCode')->willReturn(200); + $response->expects(self::once())->method('getContent')->willReturn(''); + $client = new MockHttpClient(function (string $method, string $url, array $options) use ($response): ResponseInterface { + self::assertSame('POST', $method); + self::assertSame('https://rest.clicksend.com/v3/sms/send', $url); + + $body = json_decode($options['body'], true); + self::assertIsArray($body); + self::assertArrayHasKey('messages', $body); + $message = reset($body['messages']); + self::assertArrayNotHasKey('list_id', $message); + self::assertArrayHasKey('to', $message); + + return $response; + }); + $transport = $this->createTransport($client, null, null, null, null); + $transport->send($message); + } + public static function toStringProvider(): iterable { yield ['clicksend://rest.clicksend.com?from=test_from&source=test_source&list_id=99&from_email=foo%40bar.com', self::createTransport()]; diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordAuthorEmbedObject.php b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordAuthorEmbedObject.php index a69b8846df48c..4a8356baceec5 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordAuthorEmbedObject.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordAuthorEmbedObject.php @@ -25,7 +25,7 @@ final class DiscordAuthorEmbedObject extends AbstractDiscordEmbedObject */ public function name(string $name): static { - if (\strlen($name) > self::NAME_LIMIT) { + if (mb_strlen($name, 'UTF-8') > self::NAME_LIMIT) { throw new LengthException(\sprintf('Maximum length for the name is %d characters.', self::NAME_LIMIT)); } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordEmbed.php b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordEmbed.php index 262877f7907dc..29f6750ebd3fb 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordEmbed.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordEmbed.php @@ -27,7 +27,7 @@ final class DiscordEmbed extends AbstractDiscordEmbed */ public function title(string $title): static { - if (\strlen($title) > self::TITLE_LIMIT) { + if (mb_strlen($title, 'UTF-8') > self::TITLE_LIMIT) { throw new LengthException(\sprintf('Maximum length for the title is %d characters.', self::TITLE_LIMIT)); } @@ -41,7 +41,7 @@ public function title(string $title): static */ public function description(string $description): static { - if (\strlen($description) > self::DESCRIPTION_LIMIT) { + if (mb_strlen($description, 'UTF-8') > self::DESCRIPTION_LIMIT) { throw new LengthException(\sprintf('Maximum length for the description is %d characters.', self::DESCRIPTION_LIMIT)); } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFieldEmbedObject.php b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFieldEmbedObject.php index 5ff44c3cf6c88..b529f55d602ee 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFieldEmbedObject.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFieldEmbedObject.php @@ -26,7 +26,7 @@ final class DiscordFieldEmbedObject extends AbstractDiscordEmbedObject */ public function name(string $name): static { - if (\strlen($name) > self::NAME_LIMIT) { + if (mb_strlen($name, 'UTF-8') > self::NAME_LIMIT) { throw new LengthException(\sprintf('Maximum length for the name is %d characters.', self::NAME_LIMIT)); } @@ -40,7 +40,7 @@ public function name(string $name): static */ public function value(string $value): static { - if (\strlen($value) > self::VALUE_LIMIT) { + if (mb_strlen($value, 'UTF-8') > self::VALUE_LIMIT) { throw new LengthException(\sprintf('Maximum length for the value is %d characters.', self::VALUE_LIMIT)); } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFooterEmbedObject.php b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFooterEmbedObject.php index d768da6d5b641..8d606ee6c4e68 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFooterEmbedObject.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Embeds/DiscordFooterEmbedObject.php @@ -25,7 +25,7 @@ final class DiscordFooterEmbedObject extends AbstractDiscordEmbedObject */ public function text(string $text): static { - if (\strlen($text) > self::TEXT_LIMIT) { + if (mb_strlen($text, 'UTF-8') > self::TEXT_LIMIT) { throw new LengthException(\sprintf('Maximum length for the text is %d characters.', self::TEXT_LIMIT)); } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordAuthorEmbedObjectTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordAuthorEmbedObjectTest.php index 1fa525505d909..dcc6d2198b527 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordAuthorEmbedObjectTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordAuthorEmbedObjectTest.php @@ -38,6 +38,6 @@ public function testThrowsWhenNameExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the name is 256 characters.'); - (new DiscordAuthorEmbedObject())->name(str_repeat('h', 257)); + (new DiscordAuthorEmbedObject())->name(str_repeat('š', 257)); } } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordEmbedTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordEmbedTest.php index 02fdd40b5d64a..f79786f6ae7e2 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordEmbedTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordEmbedTest.php @@ -45,7 +45,7 @@ public function testThrowsWhenTitleExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the title is 256 characters.'); - (new DiscordEmbed())->title(str_repeat('h', 257)); + (new DiscordEmbed())->title(str_repeat('š', 257)); } public function testThrowsWhenDescriptionExceedsCharacterLimit() @@ -53,7 +53,7 @@ public function testThrowsWhenDescriptionExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the description is 4096 characters.'); - (new DiscordEmbed())->description(str_repeat('h', 4097)); + (new DiscordEmbed())->description(str_repeat('š', 4097)); } public function testThrowsWhenFieldsLimitReached() diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFieldEmbedObjectTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFieldEmbedObjectTest.php index c432aab995385..77594c458793e 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFieldEmbedObjectTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFieldEmbedObjectTest.php @@ -36,7 +36,7 @@ public function testThrowsWhenNameExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the name is 256 characters.'); - (new DiscordFieldEmbedObject())->name(str_repeat('h', 257)); + (new DiscordFieldEmbedObject())->name(str_repeat('š', 257)); } public function testThrowsWhenValueExceedsCharacterLimit() @@ -44,6 +44,6 @@ public function testThrowsWhenValueExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the value is 1024 characters.'); - (new DiscordFieldEmbedObject())->value(str_repeat('h', 1025)); + (new DiscordFieldEmbedObject())->value(str_repeat('š', 1025)); } } diff --git a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFooterEmbedObjectTest.php b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFooterEmbedObjectTest.php index c9d50a46b89d2..b1c60d6f74d91 100644 --- a/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFooterEmbedObjectTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Discord/Tests/Embeds/DiscordFooterEmbedObjectTest.php @@ -36,6 +36,6 @@ public function testThrowsWhenTextExceedsCharacterLimit() $this->expectException(LengthException::class); $this->expectExceptionMessage('Maximum length for the text is 2048 characters.'); - (new DiscordFooterEmbedObject())->text(str_repeat('h', 2049)); + (new DiscordFooterEmbedObject())->text(str_repeat('š', 2049)); } } diff --git a/src/Symfony/Component/Notifier/Bridge/Ntfy/composer.json b/src/Symfony/Component/Notifier/Bridge/Ntfy/composer.json index fc0259f0a3fb2..d77d151215db3 100644 --- a/src/Symfony/Component/Notifier/Bridge/Ntfy/composer.json +++ b/src/Symfony/Component/Notifier/Bridge/Ntfy/composer.json @@ -1,7 +1,7 @@ { "name": "symfony/ntfy-notifier", "type": "symfony-notifier-bridge", - "description": "Symfony Ntyf Notifier Bridge", + "description": "Symfony Ntfy Notifier Bridge", "keywords": ["ntfy", "notifier"], "homepage": "https://symfony.com", "license": "MIT", diff --git a/src/Symfony/Component/Notifier/Bridge/Sweego/Tests/SweegoTransportTest.php b/src/Symfony/Component/Notifier/Bridge/Sweego/Tests/SweegoTransportTest.php index bed8c22fb36ca..35d86d7793707 100644 --- a/src/Symfony/Component/Notifier/Bridge/Sweego/Tests/SweegoTransportTest.php +++ b/src/Symfony/Component/Notifier/Bridge/Sweego/Tests/SweegoTransportTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Notifier\Bridge\Sweego\Tests; use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\HttpClient\Response\JsonMockResponse; use Symfony\Component\Notifier\Bridge\Sweego\SweegoTransport; use Symfony\Component\Notifier\Exception\UnsupportedMessageTypeException; use Symfony\Component\Notifier\Message\ChatMessage; @@ -68,4 +69,22 @@ public function testSendWithInvalidMessageType() $message = $this->createMock(MessageInterface::class); $transport->send($message); } + + public function testSendSmsMessage() + { + $client = new MockHttpClient(function ($method, $url, $options) { + $this->assertSame('POST', $method); + $this->assertSame('https://api.sweego.io/send', $url); + + $body = json_decode($options['body'], true); + $this->assertSame('sms', $body['channel']); + + return new JsonMockResponse(['swg_uids' => ['123']]); + }); + + $transport = self::createTransport($client); + $sentMessage = $transport->send(new SmsMessage('0611223344', 'Hello!')); + + $this->assertSame('123', $sentMessage->getMessageId()); + } } diff --git a/src/Symfony/Component/Notifier/Tests/Channel/AbstractChannelTest.php b/src/Symfony/Component/Notifier/Tests/Channel/AbstractChannelTest.php index ae93ba2732d85..2f360d83c1685 100644 --- a/src/Symfony/Component/Notifier/Tests/Channel/AbstractChannelTest.php +++ b/src/Symfony/Component/Notifier/Tests/Channel/AbstractChannelTest.php @@ -34,7 +34,6 @@ class DummyChannel extends AbstractChannel { public function notify(Notification $notification, RecipientInterface $recipient, ?string $transportName = null): void { - return; } public function supports(Notification $notification, RecipientInterface $recipient): bool diff --git a/src/Symfony/Component/Process/Pipes/UnixPipes.php b/src/Symfony/Component/Process/Pipes/UnixPipes.php index 8e95afaafb877..6f95a3328ffd1 100644 --- a/src/Symfony/Component/Process/Pipes/UnixPipes.php +++ b/src/Symfony/Component/Process/Pipes/UnixPipes.php @@ -70,7 +70,7 @@ public function getDescriptors(): array return [ ['pty'], ['pty'], - ['pty'], + ['pipe', 'w'], // stderr needs to be in a pipe to correctly split error and output, since PHP will use the same stream for both ]; } diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php index 03ce70e5993e6..6fe1086ea5bb9 100644 --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php @@ -82,7 +82,6 @@ class Process implements \IteratorAggregate private WindowsPipes|UnixPipes $processPipes; private ?int $latestSignal = null; - private ?int $cachedExitCode = null; private static ?bool $sigchild = null; private static array $executables = []; @@ -1324,21 +1323,10 @@ protected function updateStatus(bool $blocking): void return; } - $this->processInformation = proc_get_status($this->process); - $running = $this->processInformation['running']; - - // In PHP < 8.3, "proc_get_status" only returns the correct exit status on the first call. - // Subsequent calls return -1 as the process is discarded. This workaround caches the first - // retrieved exit status for consistent results in later calls, mimicking PHP 8.3 behavior. - if (\PHP_VERSION_ID < 80300) { - if (!isset($this->cachedExitCode) && !$running && -1 !== $this->processInformation['exitcode']) { - $this->cachedExitCode = $this->processInformation['exitcode']; - } - - if (isset($this->cachedExitCode) && !$running && -1 === $this->processInformation['exitcode']) { - $this->processInformation['exitcode'] = $this->cachedExitCode; - } + if ($this->processInformation['running'] ?? true) { + $this->processInformation = proc_get_status($this->process); } + $running = $this->processInformation['running']; $this->readPipes($running && $blocking, '\\' !== \DIRECTORY_SEPARATOR || !$running); diff --git a/src/Symfony/Component/Process/Tests/ProcessTest.php b/src/Symfony/Component/Process/Tests/ProcessTest.php index 61a0269251c86..00d06208eb6a8 100644 --- a/src/Symfony/Component/Process/Tests/ProcessTest.php +++ b/src/Symfony/Component/Process/Tests/ProcessTest.php @@ -559,6 +559,20 @@ public function testExitCodeTextIsNullWhenExitCodeIsNull() $this->assertNull($process->getExitCodeText()); } + public function testStderrNotMixedWithStdout() + { + if (!Process::isPtySupported()) { + $this->markTestSkipped('PTY is not supported on this operating system.'); + } + + $process = $this->getProcess('echo "foo" && echo "bar" >&2'); + $process->setPty(true); + $process->run(); + + $this->assertSame("foo\r\n", $process->getOutput()); + $this->assertSame("bar\n", $process->getErrorOutput()); + } + public function testPTYCommand() { if (!Process::isPtySupported()) { @@ -732,6 +746,9 @@ public function testProcessIsSignaledIfStopped() if ('\\' === \DIRECTORY_SEPARATOR) { $this->markTestSkipped('Windows does not support POSIX signals'); } + if (\PHP_VERSION_ID < 80300 && isset($_SERVER['GITHUB_ACTIONS'])) { + $this->markTestSkipped('Transient on GHA with PHP < 8.3'); + } $process = $this->getProcessForCode('sleep(32);'); $process->start(); @@ -1683,6 +1700,9 @@ public function testNotIgnoringSignal() if (!\function_exists('pcntl_signal')) { $this->markTestSkipped('pnctl extension is required.'); } + if (\PHP_VERSION_ID < 80300 && isset($_SERVER['GITHUB_ACTIONS'])) { + $this->markTestSkipped('Transient on GHA with PHP < 8.3'); + } $process = $this->getProcess(['sleep', '10']); diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php index b8c9d678edabc..8685407861ed1 100644 --- a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php +++ b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php @@ -72,11 +72,11 @@ class PropertyAccessor implements PropertyAccessorInterface * Should not be used by application code. Use * {@link PropertyAccess::createPropertyAccessor()} instead. * - * @param int $magicMethods A bitwise combination of the MAGIC_* constants - * to specify the allowed magic methods (__get, __set, __call) - * or self::DISALLOW_MAGIC_METHODS for none - * @param int $throw A bitwise combination of the THROW_* constants - * to specify when exceptions should be thrown + * @param int $magicMethodsFlags A bitwise combination of the MAGIC_* constants + * to specify the allowed magic methods (__get, __set, __call) + * or self::DISALLOW_MAGIC_METHODS for none + * @param int $throw A bitwise combination of the THROW_* constants + * to specify when exceptions should be thrown */ public function __construct( private int $magicMethodsFlags = self::MAGIC_GET | self::MAGIC_SET, @@ -109,6 +109,11 @@ public function getValue(object|array $objectOrArray, string|PropertyPathInterfa return $propertyValues[\count($propertyValues) - 1][self::VALUE]; } + /** + * @template T of object|array + * @param T $objectOrArray + * @param-out ($objectOrArray is array ? array : T) $objectOrArray + */ public function setValue(object|array &$objectOrArray, string|PropertyPathInterface $propertyPath, mixed $value): void { if (\is_object($objectOrArray) && (false === strpbrk((string) $propertyPath, '.[') || $objectOrArray instanceof \stdClass && property_exists($objectOrArray, $propertyPath))) { @@ -629,15 +634,22 @@ private function getWriteInfo(string $class, string $property, mixed $value): Pr */ private function isPropertyWritable(object $object, string $property): bool { + if ($object instanceof \stdClass && property_exists($object, $property)) { + return true; + } + $mutatorForArray = $this->getWriteInfo($object::class, $property, []); + if (PropertyWriteInfo::TYPE_PROPERTY === $mutatorForArray->getType()) { + return $mutatorForArray->getVisibility() === 'public'; + } - if (PropertyWriteInfo::TYPE_NONE !== $mutatorForArray->getType() || ($object instanceof \stdClass && property_exists($object, $property))) { + if (PropertyWriteInfo::TYPE_NONE !== $mutatorForArray->getType()) { return true; } $mutator = $this->getWriteInfo($object::class, $property, ''); - return PropertyWriteInfo::TYPE_NONE !== $mutator->getType() || ($object instanceof \stdClass && property_exists($object, $property)); + return PropertyWriteInfo::TYPE_NONE !== $mutator->getType(); } /** diff --git a/src/Symfony/Component/PropertyAccess/Tests/Fixtures/AsymmetricVisibility.php b/src/Symfony/Component/PropertyAccess/Tests/Fixtures/AsymmetricVisibility.php new file mode 100644 index 0000000000000..5a74350b17a26 --- /dev/null +++ b/src/Symfony/Component/PropertyAccess/Tests/Fixtures/AsymmetricVisibility.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyAccess\Tests\Fixtures; + +class AsymmetricVisibility +{ + public public(set) mixed $publicPublic = null; + public protected(set) mixed $publicProtected = null; + public private(set) mixed $publicPrivate = null; + private private(set) mixed $privatePrivate = null; + public bool $virtualNoSetHook { get => true; } +} diff --git a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php index 37082466c95b1..4603f89d76582 100644 --- a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php +++ b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php @@ -20,6 +20,7 @@ use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessor; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; +use Symfony\Component\PropertyAccess\Tests\Fixtures\AsymmetricVisibility; use Symfony\Component\PropertyAccess\Tests\Fixtures\ExtendedUninitializedProperty; use Symfony\Component\PropertyAccess\Tests\Fixtures\ReturnTyped; use Symfony\Component\PropertyAccess\Tests\Fixtures\TestAdderRemoverInvalidArgumentLength; @@ -1046,4 +1047,62 @@ private function createUninitializedObjectPropertyGhost(): UninitializedObjectPr return $class::createLazyGhost(initializer: function ($instance) { }); } + + /** + * @requires PHP 8.4 + */ + public function testIsWritableWithAsymmetricVisibility() + { + $object = new AsymmetricVisibility(); + + $this->assertTrue($this->propertyAccessor->isWritable($object, 'publicPublic')); + $this->assertFalse($this->propertyAccessor->isWritable($object, 'publicProtected')); + $this->assertFalse($this->propertyAccessor->isWritable($object, 'publicPrivate')); + $this->assertFalse($this->propertyAccessor->isWritable($object, 'privatePrivate')); + $this->assertFalse($this->propertyAccessor->isWritable($object, 'virtualNoSetHook')); + } + + /** + * @requires PHP 8.4 + */ + public function testIsReadableWithAsymmetricVisibility() + { + $object = new AsymmetricVisibility(); + + $this->assertTrue($this->propertyAccessor->isReadable($object, 'publicPublic')); + $this->assertTrue($this->propertyAccessor->isReadable($object, 'publicProtected')); + $this->assertTrue($this->propertyAccessor->isReadable($object, 'publicPrivate')); + $this->assertFalse($this->propertyAccessor->isReadable($object, 'privatePrivate')); + $this->assertTrue($this->propertyAccessor->isReadable($object, 'virtualNoSetHook')); + } + + /** + * @requires PHP 8.4 + * + * @dataProvider setValueWithAsymmetricVisibilityDataProvider + */ + public function testSetValueWithAsymmetricVisibility(string $propertyPath, ?string $expectedException) + { + $object = new AsymmetricVisibility(); + + if ($expectedException) { + $this->expectException($expectedException); + } else { + $this->expectNotToPerformAssertions(); + } + + $this->propertyAccessor->setValue($object, $propertyPath, true); + } + + /** + * @return iterable + */ + public static function setValueWithAsymmetricVisibilityDataProvider(): iterable + { + yield ['publicPublic', null]; + yield ['publicProtected', \Error::class]; + yield ['publicPrivate', \Error::class]; + yield ['privatePrivate', NoSuchPropertyException::class]; + yield ['virtualNoSetHook', \Error::class]; + } } diff --git a/src/Symfony/Component/PropertyInfo/Extractor/PhpStanExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/PhpStanExtractor.php index cbf634933511a..f5f83d968f7ba 100644 --- a/src/Symfony/Component/PropertyInfo/Extractor/PhpStanExtractor.php +++ b/src/Symfony/Component/PropertyInfo/Extractor/PhpStanExtractor.php @@ -16,6 +16,8 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\PhpDocParser\Parser\ConstExprParser; use PHPStan\PhpDocParser\Parser\PhpDocParser; @@ -206,7 +208,7 @@ public function getType(string $class, string $property, array $context = []): ? $types = []; foreach ($docNode->getTagsByName($tag) as $tagDocNode) { - if ($tagDocNode->value instanceof InvalidTagValueNode) { + if (!$tagDocNode->value instanceof ParamTagValueNode && !$tagDocNode->value instanceof ReturnTagValueNode && !$tagDocNode->value instanceof VarTagValueNode) { continue; } diff --git a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php index f20196d99f591..340d3684dd3e4 100644 --- a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php +++ b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php @@ -709,12 +709,22 @@ private function isAllowedProperty(string $class, string $property, bool $writeA try { $reflectionProperty = new \ReflectionProperty($class, $property); - if ($writeAccessRequired && $reflectionProperty->isReadOnly()) { - return false; - } + if ($writeAccessRequired) { + if ($reflectionProperty->isReadOnly()) { + return false; + } + + if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isProtectedSet()) { + return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PROTECTED); + } - if (\PHP_VERSION_ID >= 80400 && $writeAccessRequired && ($reflectionProperty->isProtectedSet() || $reflectionProperty->isPrivateSet())) { - return false; + if (\PHP_VERSION_ID >= 80400 && $reflectionProperty->isPrivateSet()) { + return (bool) ($this->propertyReflectionFlags & \ReflectionProperty::IS_PRIVATE); + } + + if (\PHP_VERSION_ID >= 80400 &&$reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) { + return false; + } } return (bool) ($reflectionProperty->getModifiers() & $this->propertyReflectionFlags); @@ -955,6 +965,20 @@ private function getReadVisiblityForMethod(\ReflectionMethod $reflectionMethod): private function getWriteVisiblityForProperty(\ReflectionProperty $reflectionProperty): string { + if (\PHP_VERSION_ID >= 80400) { + if ($reflectionProperty->isVirtual() && !$reflectionProperty->hasHook(\PropertyHookType::Set)) { + return PropertyWriteInfo::VISIBILITY_PRIVATE; + } + + if ($reflectionProperty->isPrivateSet()) { + return PropertyWriteInfo::VISIBILITY_PRIVATE; + } + + if ($reflectionProperty->isProtectedSet()) { + return PropertyWriteInfo::VISIBILITY_PROTECTED; + } + } + if ($reflectionProperty->isPrivate()) { return PropertyWriteInfo::VISIBILITY_PRIVATE; } diff --git a/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php index f2c80a11d0f34..1f7a742e01f3d 100644 --- a/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php +++ b/src/Symfony/Component/PropertyInfo/Extractor/SerializerExtractor.php @@ -34,7 +34,7 @@ public function getProperties(string $class, array $context = []): ?array return null; } - if (!$this->classMetadataFactory->getMetadataFor($class)) 10000 { + if (!$this->classMetadataFactory->hasMetadataFor($class)) { return null; } diff --git a/src/Symfony/Component/PropertyInfo/PropertyInfoCacheExtractor.php b/src/Symfony/Component/PropertyInfo/PropertyInfoCacheExtractor.php index 2ea447deed41c..911e9f6350af3 100644 --- a/src/Symfony/Component/PropertyInfo/PropertyInfoCacheExtractor.php +++ b/src/Symfony/Component/PropertyInfo/PropertyInfoCacheExtractor.php @@ -12,6 +12,7 @@ namespace Symfony\Component\PropertyInfo; use Psr\Cache\CacheItemPoolInterface; +use Symfony\Component\PropertyInfo\Util\LegacyTypeConverter; use Symfony\Component\TypeInfo\Type; /** @@ -58,7 +59,40 @@ public function getProperties(string $class, array $context = []): ?array public function getType(string $class, string $property, array $context = []): ?Type { - return $this->extract('getType', [$class, $property, $context]); + try { + $serializedArguments = serialize([$class, $property, $context]); + } catch (\Exception) { + // If arguments are not serializable, skip the cache + if (method_exists($this->propertyInfoExtractor, 'getType')) { + return $this->propertyInfoExtractor->getType($class, $property, $context); + } + + return LegacyTypeConverter::toTypeInfoType($this->propertyInfoExtractor->getTypes($class, $property, $context)); + } + + // Calling rawurlencode escapes special characters not allowed in PSR-6's keys + $key = rawurlencode('getType.'.$serializedArguments); + + if (\array_key_exists($key, $this->arrayCache)) { + return $this->arrayCache[$key]; + } + + $item = $this->cacheItemPool->getItem($key); + + if ($item->isHit()) { + return $this->arrayCache[$key] = $item->get(); + } + + if (method_exists($this->propertyInfoExtractor, 'getType')) { + $value = $this->propertyInfoExtractor->getType($class, $property, $context); + } else { + $value = LegacyTypeConverter::toTypeInfoType($this->propertyInfoExtractor->getTypes($class, $property, $context)); + } + + $item->set($value); + $this->cacheItemPool->save($item); + + return $this->arrayCache[$key] = $value; } public function getTypes(string $class, string $property, array $context = []): ?array diff --git a/src/Symfony/Component/PropertyInfo/PropertyInfoExtractor.php b/src/Symfony/Component/PropertyInfo/PropertyInfoExtractor.php index 5e1c6a2a71e63..edbc6ef6140b8 100644 --- a/src/Symfony/Component/PropertyInfo/PropertyInfoExtractor.php +++ b/src/Symfony/Component/PropertyInfo/PropertyInfoExtractor.php @@ -11,6 +11,7 @@ namespace Symfony\Component\PropertyInfo; +use Symfony\Component\PropertyInfo\Util\LegacyTypeConverter; use Symfony\Component\TypeInfo\Type; /** @@ -55,7 +56,23 @@ public function getLongDescription(string $class, string $property, array $conte public function getType(string $class, string $property, array $context = []): ?Type { - return $this->extract($this->typeExtractors, 'getType', [$class, $property, $context]); + foreach ($this->typeExtractors as $extractor) { + if (!method_exists($extractor, 'getType')) { + $legacyTypes = $extractor->getTypes($class, $property, $context); + + if (null !== $legacyTypes) { + return LegacyTypeConverter::toTypeInfoType($legacyTypes); + } + + continue; + } + + if (null !== $value = $extractor->getType($class, $property, $context)) { + return $value; + } + } + + return null; } public function getTypes(string $class, string $property, array $context = []): ?array diff --git a/src/Symfony/Component/PropertyInfo/PropertyReadInfo.php b/src/Symfony/Component/PropertyInfo/PropertyReadInfo.php index 8de070dc046c9..d006e32483896 100644 --- a/src/Symfony/Component/PropertyInfo/PropertyReadInfo.php +++ b/src/Symfony/Component/PropertyInfo/PropertyReadInfo.php @@ -15,8 +15,6 @@ * The property read info tells how a property can be read. * * @author Joel Wurtz - * - * @internal */ final class PropertyReadInfo { diff --git a/src/Symfony/Component/PropertyInfo/PropertyWriteInfo.php b/src/Symfony/Component/PropertyInfo/PropertyWriteInfo.php index 6bc7abcdf849e..81ce7eda6d5b0 100644 --- a/src/Symfony/Component/PropertyInfo/PropertyWriteInfo.php +++ b/src/Symfony/Component/PropertyInfo/PropertyWriteInfo.php @@ -15,8 +15,6 @@ * The write mutator defines how a property can be written. * * @author Joel Wurtz - * - * @internal */ final class PropertyWriteInfo { diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php index 6248e4966dc15..d7aaac1b226a7 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpStanExtractorTest.php @@ -14,15 +14,18 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor; +use Symfony\Component\PropertyInfo\Tests\Fixtures\Clazz; use Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\ConstructorDummyWithoutDocBlock; use Symfony\Component\PropertyInfo\Tests\Fixtures\DefaultValue; use Symfony\Component\PropertyInfo\Tests\Fixtures\DockBlockFallback; use Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyCollection; +use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyGeneric; use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyNamespace; use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyPropertyAndGetterWithDifferentTypes; use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyUnionType; +use Symfony\Component\PropertyInfo\Tests\Fixtures\IFace; use Symfony\Component\PropertyInfo\Tests\Fixtures\IntRangeDummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\InvalidDummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy; @@ -552,6 +555,77 @@ public static function allowPrivateAccessLegacyProvider(): array ]; } + /** + * @param list $expectedTypes + * + * @dataProvider legacyGenericsProvider + */ + public function testGenericsLegacy(string $property, array $expectedTypes) + { + $this->assertEquals($expectedTypes, $this->extractor->getTypes(DummyGeneric::class, $property)); + } + + /** + * @return iterable}> + */ + public static function legacyGenericsProvider(): iterable + { + yield [ + 'basicClass', + [ + new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Clazz::class, + collectionValueType: new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Dummy::class, + ) + ), + ], + ]; + yield [ + 'nullableClass', + [ + new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Clazz::class, + nullable: true, + collectionValueType: new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Dummy::class, + ) + ), + ], + ]; + yield [ + 'basicInterface', + [ + new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: IFace::class, + collectionValueType: new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Dummy::class, + ) + ), + ], + ]; + yield [ + 'nullableInterface', + [ + new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: IFace::class, + nullable: true, + collectionValueType: new LegacyType( + builtinType: LegacyType::BUILTIN_TYPE_OBJECT, + class: Dummy::class, + ) + ), + ], + ]; + } + /** * @dataProvider typesProvider */ @@ -620,6 +694,7 @@ public static function invalidTypesProvider(): iterable yield 'stat' => ['stat']; yield 'foo' => ['foo']; yield 'bar' => ['bar']; + yield 'baz' => ['baz']; } /** @@ -968,7 +1043,41 @@ public static function allowPrivateAccessProvider(): array public function testGenericInterface() { - $this->assertNull($this->extractor->getTypes(Dummy::class, 'genericInterface')); + $this->assertEquals( + Type::generic(Type::enum(\BackedEnum::class), Type::string()), + $this->extractor->getType(Dummy::class, 'genericInterface'), + ); + } + + /** + * @dataProvider genericsProvider + */ + public function testGenerics(string $property, Type $expectedType) + { + $this->assertEquals($expectedType, $this->extractor->getType(DummyGeneric::class, $property)); + } + + /** + * @return iterable + */ + public static function genericsProvider(): iterable + { + yield [ + 'basicClass', + Type::generic(Type::object(Clazz::class), Type::object(Dummy::class)), + ]; + yield [ + 'nullableClass', + Type::nullable(Type::generic(Type::object(Clazz::class), Type::object(Dummy::class))), + ]; + yield [ + 'basicInterface', + Type::generic(Type::object(IFace::class), Type::object(Dummy::class)), + ]; + yield [ + 'nullableInterface', + Type::nullable(Type::generic(Type::object(IFace::class), Type::object(Dummy::class))), + ]; } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index 8d4d472fae1ab..aea4476ddd0f2 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -32,6 +32,7 @@ use Symfony\Component\PropertyInfo\Tests\Fixtures\Php81Dummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\Php82Dummy; use Symfony\Component\PropertyInfo\Tests\Fixtures\SnakeCaseDummy; +use Symfony\Component\PropertyInfo\Tests\Fixtures\VirtualProperties; use Symfony\Component\PropertyInfo\Type as LegacyType; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\Type\NullableType; @@ -659,6 +660,17 @@ public static function writeMutatorProvider(): array ]; } + public function testDisabledAdderAndRemoverReturnsError() + { + $writeMutator = $this->extractor->getWriteInfo(Php71Dummy::class, 'baz', [ + 'enable_adder_remover_extraction' => false, + ]); + + self::assertNotNull($writeMutator); + self::assertSame(PropertyWriteInfo::TYPE_NONE, $writeMutator->getType()); + self::assertSame([\sprintf('The property "baz" in class "%s" can be defined with the methods "addBaz()", "removeBaz()" but the new value must be an array or an instance of \Traversable', Php71Dummy::class)], $writeMutator->getErrors()); + } + public function testGetWriteInfoReadonlyProperties() { $writeMutatorConstructor = $this->extractor->getWriteInfo(Php81Dummy::class, 'foo', ['enable_constructor_extraction' => true]); @@ -702,6 +714,116 @@ public function testAsymmetricVisibility() $this->assertFalse($this->extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate')); } + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibilityAllowPublicOnly() + { + $extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC); + + $this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate')); + } + + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibilityAllowProtectedOnly() + { + $extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PROTECTED); + + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertTrue($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate')); + } + + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibilityAllowPrivateOnly() + { + $extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PRIVATE); + + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertFalse($extractor->isReadable(AsymmetricVisibility::class, 'protectedPrivate')); + $this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'publicPrivate')); + $this->assertFalse($extractor->isWritable(AsymmetricVisibility::class, 'publicProtected')); + $this->assertTrue($extractor->isWritable(AsymmetricVisibility::class, 'protectedPrivate')); + } + + /** + * @requires PHP 8.4 + */ + public function testVirtualProperties() + { + $this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualNoSetHook')); + $this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualSetHookOnly')); + $this->assertTrue($this->extractor->isReadable(VirtualProperties::class, 'virtualHook')); + $this->assertFalse($this->extractor->isWritable(VirtualProperties::class, 'virtualNoSetHook')); + $this->assertTrue($this->extractor->isWritable(VirtualProperties::class, 'virtualSetHookOnly')); + $this->assertTrue($this->extractor->isWritable(VirtualProperties::class, 'virtualHook')); + } + + /** + * @dataProvider provideAsymmetricVisibilityMutator + * + * @requires PHP 8.4 + */ + public function testAsymmetricVisibilityMutator(string $property, string $readVisibility, string $writeVisibility) + { + $extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC | ReflectionExtractor::ALLOW_PROTECTED | ReflectionExtractor::ALLOW_PRIVATE); + $readMutator = $extractor->getReadInfo(AsymmetricVisibility::class, $property); + $writeMutator = $extractor->getWriteInfo(AsymmetricVisibility::class, $property, [ + 'enable_getter_setter_extraction' => true, + ]); + + $this->assertSame(PropertyReadInfo::TYPE_PROPERTY, $readMutator->getType()); + $this->assertSame(PropertyWriteInfo::TYPE_PROPERTY, $writeMutator->getType()); + $this->assertSame($readVisibility, $readMutator->getVisibility()); + $this->assertSame($writeVisibility, $writeMutator->getVisibility()); + } + + public static function provideAsymmetricVisibilityMutator(): iterable + { + yield ['publicPrivate', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PRIVATE]; + yield ['publicProtected', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PROTECTED]; + yield ['protectedPrivate', PropertyReadInfo::VISIBILITY_PROTECTED, PropertyWriteInfo::VISIBILITY_PRIVATE]; + } + + /** + * @dataProvider provideVirtualPropertiesMutator + * + * @requires PHP 8.4 + */ + public function testVirtualPropertiesMutator(string $property, string $readVisibility, string $writeVisibility) + { + $extractor = new ReflectionExtractor(null, null, null, true, ReflectionExtractor::ALLOW_PUBLIC | ReflectionExtractor::ALLOW_PROTECTED | ReflectionExtractor::ALLOW_PRIVATE); + $readMutator = $extractor->getReadInfo(VirtualProperties::class, $property); + $writeMutator = $extractor->getWriteInfo(VirtualProperties::class, $property, [ + 'enable_getter_setter_extraction' => true, + ]); + + $this->assertSame(PropertyReadInfo::TYPE_PROPERTY, $readMutator->getType()); + $this->assertSame(PropertyWriteInfo::TYPE_PROPERTY, $writeMutator->getType()); + $this->assertSame($readVisibility, $readMutator->getVisibility()); + $this->assertSame($writeVisibility, $writeMutator->getVisibility()); + } + + public static function provideVirtualPropertiesMutator(): iterable + { + yield ['virtualNoSetHook', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PRIVATE]; + yield ['virtualSetHookOnly', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PUBLIC]; + yield ['virtualHook', PropertyReadInfo::VISIBILITY_PUBLIC, PropertyWriteInfo::VISIBILITY_PUBLIC]; + } + /** * @dataProvider typesProvider */ diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/SerializerExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/SerializerExtractorTest.php index ec3f949bbeb69..739f58ce6e6d1 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/SerializerExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/SerializerExtractorTest.php @@ -49,4 +49,9 @@ public function testGetPropertiesWithAnyGroup() { $this->assertSame(['analyses', 'feet'], $this->extractor->getProperties(AdderRemoverDummy::class, ['serializer_groups' => null])); } + + public function testGetPropertiesWithNonExistentClassReturnsNull() + { + $this->assertSame(null, $this->extractor->getProperties('NonExistent')); + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyGeneric.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyGeneric.php new file mode 100644 index 0000000000000..5863fbfc95450 --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/DummyGeneric.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +interface IFace {} + +class Clazz {} + +class DummyGeneric +{ + + /** + * @var Clazz + */ + public $basicClass; + + /** + * @var ?Clazz + */ + public $nullableClass; + + /** + * @var IFace + */ + public $basicInterface; + + /** + * @var ?IFace + */ + public $nullableInterface; + +} diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/InvalidDummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/InvalidDummy.php index 0a4cc81f36be8..0940c287b072d 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/InvalidDummy.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/InvalidDummy.php @@ -47,4 +47,11 @@ public function getBar() { return 'bar'; } + + /** + * @param $baz + */ + public function setBaz($baz) + { + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/VirtualProperties.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/VirtualProperties.php new file mode 100644 index 0000000000000..38c6d17082ffe --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/VirtualProperties.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +class VirtualProperties +{ + public bool $virtualNoSetHook { get => true; } + public bool $virtualSetHookOnly { set => $value; } + public bool $virtualHook { get => true; set => $value; } +} diff --git a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php index f9b1a8fc3358e..a594de56a5e42 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoCacheExtractorTest.php @@ -12,7 +12,13 @@ namespace Symfony\Component\PropertyInfo\Tests; use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\PropertyInfoCacheExtractor; +use Symfony\Component\PropertyInfo\PropertyInfoExtractorInterface; +use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; +use Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy; +use Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy; +use Symfony\Component\TypeInfo\Type; /** * @author Kévin Dunglas @@ -76,4 +82,90 @@ public function testIsInitializable() parent::testIsInitializable(); parent::testIsInitializable(); } + + /** + * @group legacy + * + * @dataProvider provideNestedExtractorWithoutGetTypeImplementationData + */ + public function testNestedExtractorWithoutGetTypeImplementation(string $property, ?Type $expectedType) + { + $propertyInfoCacheExtractor = new PropertyInfoCacheExtractor(new class() implements PropertyInfoExtractorInterface { + private PropertyTypeExtractorInterface $propertyTypeExtractor; + + public function __construct() + { + $this->propertyTypeExtractor = new PhpDocExtractor(); + } + + public function getTypes(string $class, string $property, array $context = []): ?array + { + return $this->propertyTypeExtractor->getTypes($class, $property, $context); + } + + public function isReadable(string $class, string $property, array $context = []): ?bool + { + return null; + } + + public function isWritable(string $class, string $property, array $context = []): ?bool + { + return null; + } + + public function getShortDescription(string $class, string $property, array $context = []): ?string + { + return null; + } + + public function getLongDescription(string $class, string $property, array $context = []): ?string + { + return null; + } + + public function getProperties(string $class, array $context = []): ?array + { + return null; + } + }, new ArrayAdapter()); + + if (null === $expectedType) { + $this->assertNull($propertyInfoCacheExtractor->getType(Dummy::class, $property)); + } else { + $this->assertEquals($expectedType, $propertyInfoCacheExtractor->getType(Dummy::class, $property)); + } + } + + public function provideNestedExtractorWithoutGetTypeImplementationData() + { + yield ['bar', Type::string()]; + yield ['baz', Type::int()]; + yield ['bal', Type::object(\DateTimeImmutable::class)]; + yield ['parent', Type::object(ParentDummy::class)]; + yield ['collection', Type::array(Type::object(\DateTimeImmutable::class), Type::int())]; + yield ['nestedCollection', Type::array(Type::array(Type::string(), Type::int()), Type::int())]; + yield ['mixedCollection', Type::array()]; + yield ['B', Type::object(ParentDummy::class)]; + yield ['Id', Type::int()]; + yield ['Guid', Type::string()]; + yield ['g', Type::nullable(Type::array())]; + yield ['h', Type::nullable(Type::string())]; + yield ['i', Type::nullable(Type::union(Type::string(), Type::int()))]; + yield ['j', Type::nullable(Type::object(\DateTimeImmutable::class))]; + yield ['nullableCollectionOfNonNullableElements', Type::nullable(Type::array(Type::int(), Type::int()))]; + yield ['nonNullableCollectionOfNullableElements', Type::array(Type::nullable(Type::int()), Type::int())]; + yield ['nullableCollectionOfMultipleNonNullableElementTypes', Type::nullable(Type::array(Type::union(Type::int(), Type::string()), Type::int()))]; + yield ['xTotals', Type::array()]; + yield ['YT', Type::string()]; + yield ['emptyVar', null]; + yield ['iteratorCollection', Type::collection(Type::object(\Iterator::class), Type::string(), Type::union(Type::string(), Type::int()))]; + yield ['iteratorCollectionWithKey', Type::collection(Type::object(\Iterator::class), Type::string(), Type::int())]; + yield ['nestedIterators', Type::collection(Type::object(\Iterator::class), Type::collection(Type::object(\Iterator::class), Type::string(), Type::int()), Type::int())]; + yield ['arrayWithKeys', Type::array(Type::string(), Type::string())]; + yield ['arrayWithKeysAndComplexValue', Type::array(Type::nullable(Type::array(Type::nullable(Type::string()), Type::int())), Type::string())]; + yield ['arrayOfMixed', Type::array(Type::mixed(), Type::string())]; + yield ['noDocBlock', null]; + yield ['listOfStrings', Type::array(Type::string(), Type::int())]; + yield ['parentAnnotation', Type::object(ParentDummy::class)]; + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoExtractorTest.php index 53c1b1d8a5c22..ed76df5695b08 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/PropertyInfoExtractorTest.php @@ -11,9 +11,76 @@ namespace Symfony\Component\PropertyInfo\Tests; +use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; +use Symfony\Component\PropertyInfo\PropertyInfoExtractor; +use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; +use Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy; +use Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy; +use Symfony\Component\TypeInfo\Type; + /** * @author Kévin Dunglas */ class PropertyInfoExtractorTest extends AbstractPropertyInfoExtractorTest { + /** + * @group legacy + * + * @dataProvider provideNestedExtractorWithoutGetTypeImplementationData + */ + public function testNestedExtractorWithoutGetTypeImplementation(string $property, ?Type $expectedType) + { + $propertyInfoExtractor = new PropertyInfoExtractor([], [new class() implements PropertyTypeExtractorInterface { + private PropertyTypeExtractorInterface $propertyTypeExtractor; + + public function __construct() + { + $this->propertyTypeExtractor = new PhpDocExtractor(); + } + + public function getTypes(string $class, string $property, array $context = []): ?array + { + return $this->propertyTypeExtractor->getTypes($class, $property, $context); + } + }]); + + if (null === $expectedType) { + $this->assertNull($propertyInfoExtractor->getType(Dummy::class, $property)); + } else { + $this->assertEquals($expectedType, $propertyInfoExtractor->getType(Dummy::class, $property)); + } + } + + public function provideNestedExtractorWithoutGetTypeImplementationData() + { + yield ['bar', Type::string()]; + yield ['baz', Type::int()]; + yield ['bal', Type::object(\DateTimeImmutable::class)]; + yield ['parent', Type::object(ParentDummy::class)]; + yield ['collection', Type::array(Type::object(\DateTimeImmutable::class), Type::int())]; + yield ['nestedCollection', Type::array(Type::array(Type::string(), Type::int()), Type::int())]; + yield ['mixedCollection', Type::array()]; + yield ['B', Type::object(ParentDummy::class)]; + yield ['Id', Type::int()]; + yield ['Guid', Type::string()]; + yield ['g', Type::nullable(Type::array())]; + yield ['h', Type::nullable(Type::string())]; + yield ['i', Type::nullable(Type::union(Type::string(), Type::int()))]; + yield ['j', Type::nullable(Type::object(\DateTimeImmutable::class))]; + yield ['nullableCollectionOfNonNullableElements', Type::nullable(Type::array(Type::int(), Type::int()))]; + yield ['nonNullableCollectionOfNullableElements', Type::array(Type::nullable(Type::int()), Type::int())]; + yield ['nullableCollectionOfMultipleNonNullableElementTypes', Type::nullable(Type::array(Type::union(Type::int(), Type::string()), Type::int()))]; + yield ['xTotals', Type::array()]; + yield ['YT', Type::string()]; + yield ['emptyVar', null]; + yield ['iteratorCollection', Type::collection(Type::object(\Iterator::class), Type::string(), Type::union(Type::string(), Type::int()))]; + yield ['iteratorCollectionWithKey', Type::collection(Type::object(\Iterator::class), Type::string(), Type::int())]; + yield ['nestedIterators', Type::collection(Type::object(\Iterator::class), Type::collection(Type::object(\Iterator::class), Type::string(), Type::int()), Type::int())]; + yield ['arrayWithKeys', Type::array(Type::string(), Type::string())]; + yield ['arrayWithKeysAndComplexValue', Type::array(Type::nullable(Type::array(Type::nullable(Type::string()), Type::int())), Type::string())]; + yield ['arrayOfMixed', Type::array(Type::mixed(), Type::string())]; + yield ['noDocBlock', null]; + yield ['listOfStrings', Type::array(Type::string(), Type::int())]; + yield ['parentAnnotation', Type::object(ParentDummy::class)]; + } } diff --git a/src/Symfony/Component/PropertyInfo/Tests/TypeTest.php b/src/Symfony/Component/PropertyInfo/Tests/TypeTest.php index 6fa4ed9a4b163..afe4bb55f06ae 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/TypeTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/TypeTest.php @@ -77,7 +77,7 @@ public function testArrayCollection() $this->assertTrue($firstValueType->isCollection()); $this->assertEquals(Type::BUILTIN_TYPE_ARRAY, $secondValueType->getBuiltinType()); $this->assertFalse($secondValueType->isNullable()); - $this->assertTrue($firstValueType->isCollection()); + $this->assertTrue($secondValueType->isCollection()); } public function testInvalidCollectionValueArgument() diff --git a/src/Symfony/Component/PropertyInfo/Util/LegacyTypeConverter.php b/src/Symfony/Component/PropertyInfo/Util/LegacyTypeConverter.php new file mode 100644 index 0000000000000..24cae602aac5b --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Util/LegacyTypeConverter.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Util; + +use Symfony\Component\PropertyInfo\Type as LegacyType; +use Symfony\Component\TypeInfo\Type; + +/** + * @internal + */ +class LegacyTypeConverter +{ + /** + * @param LegacyType[]|null $legacyTypes + */ + public static function toTypeInfoType(?array $legacyTypes): ?Type + { + if (null === $legacyTypes || [] === $legacyTypes) { + return null; + } + + $nullable = false; + $types = []; + + foreach ($legacyTypes as $legacyType) { + switch ($legacyType->getBuiltinType()) { + case LegacyType::BUILTIN_TYPE_ARRAY: + $typeInfoType = Type::array(self::toTypeInfoType($legacyType->getCollectionValueTypes()), self::toTypeInfoType($legacyType->getCollectionKeyTypes())); + break; + case LegacyType::BUILTIN_TYPE_BOOL: + $typeInfoType = Type::bool(); + break; + case LegacyType::BUILTIN_TYPE_CALLABLE: + $typeInfoType = Type::callable(); + break; + case LegacyType::BUILTIN_TYPE_FALSE: + $typeInfoType = Type::false(); + break; + case LegacyType::BUILTIN_TYPE_FLOAT: + $typeInfoType = Type::float(); + break; + case LegacyType::BUILTIN_TYPE_INT: + $typeInfoType = Type::int(); + break; + case LegacyType::BUILTIN_TYPE_ITERABLE: + $typeInfoType = Type::iterable(self::toTypeInfoType($legacyType->getCollectionValueTypes()), self::toTypeInfoType($legacyType->getCollectionKeyTypes())); + break; + case LegacyType::BUILTIN_TYPE_OBJECT: + if ($legacyType->isCollection()) { + $typeInfoType = Type::collection(Type::object($legacyType->getClassName()), self::toTypeInfoType($legacyType->getCollectionValueTypes()), self::toTypeInfoType($legacyType->getCollectionKeyTypes())); + } else { + $typeInfoType = Type::object($legacyType->getClassName()); + } + + break; + case LegacyType::BUILTIN_TYPE_RESOURCE: + $typeInfoType = Type::resource(); + break; + case LegacyType::BUILTIN_TYPE_STRING: + $typeInfoType = Type::string(); + break; + case LegacyType::BUILTIN_TYPE_TRUE: + $typeInfoType = Type::true(); + break; + default: + $typeInfoType = null; + break; + } + + if (LegacyType::BUILTIN_TYPE_NULL === $legacyType->getBuiltinType() || $legacyType->isNullable()) { + $nullable = true; + } + + if (null !== $typeInfoType) { + $types[] = $typeInfoType; + } + } + + if (1 === \count($types)) { + return $nullable ? Type::nullable($types[0]) : $types[0]; + } + + return $nullable ? Type::nullable(Type::union(...$types)) : Type::union(...$types); + } +} diff --git a/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php b/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php index 6d06d8b8a9f16..924d74e3aec1a 100644 --- a/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php +++ b/src/Symfony/Component/PropertyInfo/Util/PhpStanTypeHelper.php @@ -128,7 +128,7 @@ private function extractTypes(TypeNode $node, NameScope $nameScope): array $collection = $mainType->isCollection() || \is_a($mainType->getClassName(), \Traversable::class, true) || \is_a($mainType->getClassName(), \ArrayAccess::class, true); // it's safer to fall back to other extractors if the generic type is too abstract - if (!$collection && !class_exists($mainType->getClassName())) { + if (!$collection && !class_exists($mainType->getClassName()) && !interface_exists($mainType->getClassName(), false)) { return []; } diff --git a/src/Symfony/Component/PropertyInfo/composer.json b/src/Symfony/Component/PropertyInfo/composer.json index 0de87c02c6a51..65f2782ed909c 100644 --- a/src/Symfony/Component/PropertyInfo/composer.json +++ b/src/Symfony/Component/PropertyInfo/composer.json @@ -25,7 +25,7 @@ "require": { "php": ">=8.2", "symfony/string": "^6.4|^7.0", - "symfony/type-info": "^7.1" + "symfony/type-info": "~7.1.9|^7.2.2" }, "require-dev": { "symfony/serializer": "^6.4|^7.0", @@ -38,6 +38,7 @@ "phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/type-resolver": "<1.5.1", "symfony/dependency-injection": "<6.4", + "symfony/cache": "<6.4", "symfony/serializer": "<6.4" }, "autoload": { diff --git a/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php b/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php index f242ad886e3eb..148eeba1d7b16 100644 --- a/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php +++ b/src/Symfony/Component/Routing/Loader/Configurator/RouteConfigurator.php @@ -44,7 +44,14 @@ public function __construct( */ final public function host(string|array $host): static { + $previousRoutes = clone $this->route; $this->addHost($this->route, $host); + foreach ($previousRoutes as $name => $route) { + if (!$this->route->get($name)) { + $this->collection->remove($name); + } + } + $this->collection->addCollection($this->route); return $this; } diff --git a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php index a957012928310..c7275962621eb 100644 --- a/src/Symfony/Component/Routing/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/XmlFileLoader.php @@ -131,7 +131,7 @@ protected function parseRoute(RouteCollection $collection, \DOMElement $node, st throw new \InvalidArgumentException(\sprintf('The element in file "%s" must not have both a "path" attribute and child nodes.', $path)); } - $routes = $this->createLocalizedRoute($collection, $id, $paths ?: $node->getAttribute('path')); + $routes = $this->createLocalizedRoute(new RouteCollection(), $id, $paths ?: $node->getAttribute('path')); $routes->addDefaults($defaults); $routes->addRequirements($requirements); $routes->addOptions($options); @@ -142,6 +142,8 @@ protected function parseRoute(RouteCollection $collection, \DOMElement $node, st if (null !== $hosts) { $this->addHost($routes, $hosts); } + + $collection->addCollection($routes); } /** diff --git a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php index cd945c5599b26..3e40e8bbeb5f4 100644 --- a/src/Symfony/Component/Routing/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/Routing/Loader/YamlFileLoader.php @@ -155,7 +155,7 @@ protected function parseRoute(RouteCollection $collection, string $name, array $ $defaults['_stateless'] = $config['stateless']; } - $routes = $this->createLocalizedRoute($collection, $name, $config['path']); + $routes = $this->createLocalizedRoute(new RouteCollection(), $name, $config['path']); $routes->addDefaults($defaults); $routes->addRequirements($requirements); $routes->addOptions($options); @@ -166,6 +166,8 @@ protected function parseRoute(RouteCollection $collection, string $name, array $ if (isset($config['host'])) { $this->addHost($routes, $config['host']); } + + $collection->addCollection($routes); } /** diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php new file mode 100644 index 0000000000000..afff1f0bcdcfe --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts-expected-collection.php @@ -0,0 +1,23 @@ +add('static.en', $route = new Route('/example')); + $route->setHost('www.example.com'); + $route->setRequirement('_locale', 'en'); + $route->setDefault('_locale', 'en'); + $route->setDefault('_canonical_route', 'static'); + $expectedRoutes->add('static.nl', $route = new Route('/example')); + $route->setHost('www.example.nl'); + $route->setRequirement('_locale', 'nl'); + $route->setDefault('_locale', 'nl'); + $route->setDefault('_canonical_route', 'static'); + + $expectedRoutes->addResource(new FileResource(__DIR__."/route-with-hosts.$format")); + + return $expectedRoutes; +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php new file mode 100644 index 0000000000000..44472d77ae171 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.php @@ -0,0 +1,10 @@ +add('static', '/example')->host([ + 'nl' => 'www.example.nl', + 'en' => 'www.example.com', + ]); +}; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml new file mode 100644 index 0000000000000..f4b16e4d80700 --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.xml @@ -0,0 +1,10 @@ + + + + www.example.nl + www.example.com + + diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml new file mode 100644 index 0000000000000..c340f71ff016d --- /dev/null +++ b/src/Symfony/Component/Routing/Tests/Fixtures/locale_and_host/route-with-hosts.yml @@ -0,0 +1,6 @@ +--- +static: + path: /example + host: + nl: www.example.nl + en: www.example.com diff --git a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php index e7aad10bbff12..16071e5b345c4 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/PhpFileLoaderTest.php @@ -317,6 +317,16 @@ public function testImportingRoutesWithSingleHostInImporter() $this->assertEquals($expectedRoutes('php'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.php'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('php'), $routes); + } + public function testImportingAliases() { $loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/alias'])); diff --git a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php index 3bbc8ac689ced..7afc3d2ea233e 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php @@ -587,6 +587,16 @@ public function testImportingRoutesWithSingleHostsInImporter() $this->assertEquals($expectedRoutes('xml'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.xml'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('xml'), $routes); + } + public function testWhenEnv() { $loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures']), 'some-env'); diff --git a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php index 5c82e9b5e1640..c8bc44e61e33b 100644 --- a/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php @@ -450,6 +450,16 @@ public function testImportingRoutesWithSingleHostInImporter() $this->assertEquals($expectedRoutes('yml'), $routes); } + public function testAddingRouteWithHosts() + { + $loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures/locale_and_host'])); + $routes = $loader->load('route-with-hosts.yml'); + + $expectedRoutes = require __DIR__.'/../Fixtures/locale_and_host/route-with-hosts-expected-collection.php'; + + $this->assertEquals($expectedRoutes('yml'), $routes); + } + public function testWhenEnv() { $loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures']), 'some-env'); diff --git a/src/Symfony/Component/Runtime/SymfonyRuntime.php b/src/Symfony/Component/Runtime/SymfonyRuntime.php index d26fac000a3d9..c66035f9abaf0 100644 --- a/src/Symfony/Component/Runtime/SymfonyRuntime.php +++ b/src/Symfony/Component/Runtime/SymfonyRuntime.php @@ -160,10 +160,6 @@ public function getRunner(?object $application): RunnerInterface } if ($application instanceof Application) { - if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { - echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.\PHP_SAPI.' SAPI'.\PHP_EOL; - } - set_time_limit(0); $defaultEnv = !isset($this->options['env']) ? ($_SERVER[$this->options['env_var_name']] ?? 'dev') : null; $output = $this->output ??= new ConsoleOutput(); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/application.php b/src/Symfony/Component/Runtime/Tests/phpt/application.php index 1e1014e9f3e5a..ca2de555edfb7 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/application.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/application.php @@ -18,8 +18,10 @@ return function (array $context) { $command = new Command('go'); - $command->setCode(function (InputInterface $input, OutputInterface $output) use ($context) { + $command->setCode(function (InputInterface $input, OutputInterface $output) use ($context): int { $output->write('OK Application '.$context['SOME_VAR']); + + return 0; }); $app = new Application(); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/command.php b/src/Symfony/Component/Runtime/Tests/phpt/command.php index 3a5fa11e00000..e307d195b113e 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/command.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/command.php @@ -19,7 +19,9 @@ return function (Command $command, InputInterface $input, OutputInterface $output, array $context) { $command->addOption('hello', 'e', InputOption::VALUE_REQUIRED, 'How should I greet?', 'OK'); - return $command->setCode(function () use ($input, $output, $context) { + return $command->setCode(function () use ($input, $output, $context): int { $output->write($input->getOption('hello').' Command '.$context['SOME_VAR']); + + return 0; }); }; diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_0_to_1.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_0_to_1.php index af6409dda62bc..2968e37ea02f4 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_0_to_1.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_0_to_1.php @@ -20,6 +20,8 @@ require __DIR__.'/autoload.php'; -return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): void { +return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): int { $output->writeln($context['DEBUG_ENABLED']); + + return 0; }); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_1_to_0.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_1_to_0.php index 78a0bf29448b8..1f2fa3590e16f 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_1_to_0.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_debug_exists_1_to_0.php @@ -20,6 +20,8 @@ require __DIR__.'/autoload.php'; -return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): void { +return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): int { $output->writeln($context['DEBUG_MODE']); + + return 0; }); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_env_exists.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_env_exists.php index 3e72372e5af06..8587f20f2382b 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_env_exists.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_env_exists.php @@ -20,6 +20,8 @@ require __DIR__.'/autoload.php'; -return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): void { +return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): int { $output->writeln($context['ENV_MODE']); + + return 0; }); diff --git a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_no_debug.php b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_no_debug.php index 3fe4f44d7967b..4ab7694298f95 100644 --- a/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_no_debug.php +++ b/src/Symfony/Component/Runtime/Tests/phpt/dotenv_overload_command_no_debug.php @@ -19,6 +19,8 @@ require __DIR__.'/autoload.php'; -return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): void { +return static fn (Command $command, OutputInterface $output, array $context): Command => $command->setCode(static function () use ($output, $context): int { $output->writeln($context['DEBUG_ENABLED']); + + return 0; }); diff --git a/src/Symfony/Component/Scheduler/Tests/RecurringMessageTest.php b/src/Symfony/Component/Scheduler/Tests/RecurringMessageTest.php index d668b7d03b02b..1954d4f470402 100644 --- a/src/Symfony/Component/Scheduler/Tests/RecurringMessageTest.php +++ b/src/Symfony/Component/Scheduler/Tests/RecurringMessageTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Scheduler\Tests; use PHPUnit\Framework\TestCase; -use Random\Randomizer; use Symfony\Component\Scheduler\Exception\InvalidArgumentException; use Symfony\Component\Scheduler\RecurringMessage; @@ -22,13 +21,8 @@ public function testCanCreateHashedCronMessage() { $object = new DummyStringableMessage(); - if (class_exists(Randomizer::class)) { - $this->assertSame('30 0 * * *', (string) RecurringMessage::cron('#midnight', $object)->getTrigger()); - $this->assertSame('30 0 * * 3', (string) RecurringMessage::cron('#weekly', $object)->getTrigger()); - } else { - $this->assertSame('36 0 * * *', (string) RecurringMessage::cron('#midnight', $object)->getTrigger()); - $this->assertSame('36 0 * * 6', (string) RecurringMessage::cron('#weekly', $object)->getTrigger()); - } + $this->assertSame('30 0 * * *', (string) RecurringMessage::cron('#midnight', $object)->getTrigger()); + $this->assertSame('30 0 * * 3', (string) RecurringMessage::cron('#weekly', $object)->getTrigger()); } public function testHashedCronContextIsRequiredIfMessageIsNotStringable() diff --git a/src/Symfony/Component/Scheduler/Tests/Trigger/CronExpressionTriggerTest.php b/src/Symfony/Component/Scheduler/Tests/Trigger/CronExpressionTriggerTest.php index cf12a7ceccf52..a700372d4765c 100644 --- a/src/Symfony/Component/Scheduler/Tests/Trigger/CronExpressionTriggerTest.php +++ b/src/Symfony/Component/Scheduler/Tests/Trigger/CronExpressionTriggerTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\Scheduler\Tests\Trigger; use PHPUnit\Framework\TestCase; -use Random\Randomizer; use Symfony\Component\Scheduler\Trigger\CronExpressionTrigger; class CronExpressionTriggerTest extends TestCase @@ -33,54 +32,28 @@ public function testHashedExpressionParsing(string $input, string $expected) public static function hashedExpressionProvider(): array { - if (class_exists(Randomizer::class)) { - return [ - ['# * * * *', '30 * * * *'], - ['# # * * *', '30 0 * * *'], - ['# # # * *', '30 0 25 * *'], - ['# # # # *', '30 0 25 10 *'], - ['# # # # #', '30 0 25 10 5'], - ['# # 1,15 1-11 *', '30 0 1,15 1-11 *'], - ['# # 1,15 * *', '30 0 1,15 * *'], - ['#hourly', '30 * * * *'], - ['#daily', '30 0 * * *'], - ['#weekly', '30 0 * * 3'], - ['#weekly@midnight', '30 0 * * 3'], - ['#monthly', '30 0 25 * *'], - ['#monthly@midnight', '30 0 25 * *'], - ['#yearly', '30 0 25 10 *'], - ['#yearly@midnight', '30 0 25 10 *'], - ['#annually', '30 0 25 10 *'], - ['#annually@midnight', '30 0 25 10 *'], - ['#midnight', '30 0 * * *'], - ['#(1-15) * * * *', '1 * * * *'], - ['#(1-15) * * * #(3-5)', '1 * * * 3'], - ['#(1-15) * # * #(3-5)', '1 * 17 * 5'], - ]; - } - return [ - ['# * * * *', '36 * * * *'], - ['# # * * *', '36 0 * * *'], - ['# # # * *', '36 0 14 * *'], - ['# # # # *', '36 0 14 3 *'], - ['# # # # #', '36 0 14 3 5'], - ['# # 1,15 1-11 *', '36 0 1,15 1-11 *'], - ['# # 1,15 * *', '36 0 1,15 * *'], - ['#hourly', '36 * * * *'], - ['#daily', '36 0 * * *'], - ['#weekly', '36 0 * * 6'], - ['#weekly@midnight', '36 0 * * 6'], - ['#monthly', '36 0 14 * *'], - ['#monthly@midnight', '36 0 14 * *'], - ['#yearly', '36 0 14 3 *'], - ['#yearly@midnight', '36 0 14 3 *'], - ['#annually', '36 0 14 3 *'], - ['#annually@midnight', '36 0 14 3 *'], - ['#midnight', '36 0 * * *'], - ['#(1-15) * * * *', '7 * * * *'], - ['#(1-15) * * * #(3-5)', '7 * * * 3'], - ['#(1-15) * # * #(3-5)', '7 * 1 * 5'], + ['# * * * *', '30 * * * *'], + ['# # * * *', '30 0 * * *'], + ['# # # * *', '30 0 25 * *'], + ['# # # # *', '30 0 25 10 *'], + ['# # # # #', '30 0 25 10 5'], + ['# # 1,15 1-11 *', '30 0 1,15 1-11 *'], + ['# # 1,15 * *', '30 0 1,15 * *'], + ['#hourly', '30 * * * *'], + ['#daily', '30 0 * * *'], + ['#weekly', '30 0 * * 3'], + ['#weekly@midnight', '30 0 * * 3'], + ['#monthly', '30 0 25 * *'], + ['#monthly@midnight', '30 0 25 * *'], + ['#yearly', '30 0 25 10 *'], + ['#yearly@midnight', '30 0 25 10 *'], + ['#annually', '30 0 25 10 *'], + ['#annually@midnight', '30 0 25 10 *'], + ['#midnight', '30 0 * * *'], + ['#(1-15) * * * *', '1 * * * *'], + ['#(1-15) * * * #(3-5)', '1 * * * 3'], + ['#(1-15) * # * #(3-5)', '1 * 17 * 5'], ]; } diff --git a/src/Symfony/Component/Scheduler/Tests/Trigger/PeriodicalTriggerTest.php b/src/Symfony/Component/Scheduler/Tests/Trigger/PeriodicalTriggerTest.php index dc10d30307484..f8724e59247c1 100644 --- a/src/Symfony/Component/Scheduler/Tests/Trigger/PeriodicalTriggerTest.php +++ b/src/Symfony/Component/Scheduler/Tests/Trigger/PeriodicalTriggerTest.php @@ -105,9 +105,9 @@ public static function provideForToString() /** * @dataProvider providerGetNextRunDates */ - public function testGetNextRunDates(\DateTimeImmutable $from, TriggerInterface $trigger, array $expected, int $count = 0) + public function testGetNextRunDates(\DateTimeImmutable $from, TriggerInterface $trigger, array $expected, int $count) { - $this->assertEquals($expected, $this->getNextRunDates($from, $trigger, $count ?? \count($expected))); + $this->assertEquals($expected, $this->getNextRunDates($from, $trigger, $count)); } public static function providerGetNextRunDates(): iterable diff --git a/src/Symfony/Component/Scheduler/Trigger/ExcludeTimeTrigger.php b/src/Symfony/Component/Scheduler/Trigger/ExcludeTimeTrigger.php index 1a37b47798291..22bf88b626f93 100644 --- a/src/Symfony/Component/Scheduler/Trigger/ExcludeTimeTrigger.php +++ b/src/Symfony/Component/Scheduler/Trigger/ExcludeTimeTrigger.php @@ -23,7 +23,7 @@ public function __construct( public function __toString(): string { - return \sprintf('%s, from: %s, until: %s', $this->inner, $this->from->format(\DateTimeInterface::ATOM), $this->until->format(\DateTimeInterface::ATOM)); + return \sprintf('%s, excluding from %s until %s', $this->inner, $this->from->format(\DateTimeInterface::ATOM), $this->until->format(\DateTimeInterface::ATOM)); } public function getNextRunDate(\DateTimeImmutable $run): ?\DateTimeImmutable diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.be.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.be.xlf index 194392935fcc1..6478e2a15caf7 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.be.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.be.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Занадта шмат няўдалых спробаў уваходу, калі ласка, паспрабуйце зноў праз %minutes% хвіліну.|Занадта шмат няўдалых спробаў уваходу, калі ласка, паспрабуйце зноў праз %minutes% хвіліны.|Занадта шмат няўдалых спробаў уваходу, калі ласка, паспрабуйце зноў праз %minutes% хвілін. + Занадта вялікая колькасць няўдалых спробаў уваходу. Калі ласка, паспрабуйце зноў праз %minutes% хвіліну.|Занадта вялікая колькасць няўдалых спробаў уваходу. Калі ласка, паспрабуйце зноў праз %minutes% хвіліны.|Занадта вялікая колькасць няўдалых спробаў уваходу. Калі ласка, паспрабуйце зноў праз %minutes% хвілін. diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.he.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.he.xlf index b1d6afd434e8a..1cf02a4ee75e6 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.he.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.he.xlf @@ -4,15 +4,15 @@ An authentication exception occurred. - שגיאה באימות + התרחשה שגיאה באימות. Authentication credentials could not be found. - פרטי זיהוי לא נמצאו. + פרטי הזיהוי לא נמצאו. Authentication request could not be processed due to a system problem. - לא ניתן היה לעבד את בקשת אימות בגלל בעיית מערכת. + לא ניתן היה לעבד את בקשת האימות בגלל בעיית מערכת. Invalid credentials. @@ -20,7 +20,7 @@ Cookie has already been used by someone else. - עוגיה כבר שומשה. + עוגיה כבר שומשה על ידי מישהו אחר. Not privileged to request the resource. @@ -32,15 +32,15 @@ No authentication provider found to support the authentication token. - לא נמצא ספק אימות המתאימה לבקשה. + לא נמצא ספק אימות המתאים לבקשה. No session available, it either timed out or cookies are not enabled. - אין סיישן זמין, או שתם הזמן הקצוב או העוגיות אינן מופעלות. + אין מפגש זמין, תם הזמן הקצוב או שהעוגיות אינן מופעלות. No token could be found. - הטוקן לא נמצא. + אסימון לא נמצא. Username could not be found. @@ -72,11 +72,11 @@ Too many failed login attempts, please try again in %minutes% minute. - יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב בוד %minutes% דקה. + יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב בעוד %minutes% דקה. Too many failed login attempts, please try again in %minutes% minutes. - יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב בעוד %minutes% דקות. + יותר מדי ניסיונות כניסה כושלים, אנא נסה שוב בעוד %minutes% דקות. diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.sk.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.sk.xlf index b08757de0086f..3820bdccc7482 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.sk.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.sk.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minútu.|Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minúty.|Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minút. + Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minútu.|Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minúty.|Príliš veľa neúspešných pokusov o prihlásenie, skúste to prosím znova o %minutes% minút. diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.sl.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.sl.xlf index 7d0514005116d..2b7a592b799c2 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.sl.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.sl.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minuto.|Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minut. + Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minuto.|Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minuti.|Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minute.|Preveč neuspešnih poskusov prijave, poskusite znova čez %minutes% minut. diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.tl.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.tl.xlf index c02222dedb204..aa47f179cd9f4 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.tl.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.tl.xlf @@ -72,11 +72,11 @@ Too many failed login attempts, please try again in %minutes% minute. - Napakaraming nabigong mga pagtatangka sa pag-login, pakisubukan ulit sa% minuto% minuto. + Napakaraming nabigong mga pagtatangka sa pag-login, pakisubukan ulit matapos ang %minutes% minuto. Too many failed login attempts, please try again in %minutes% minutes. - Napakaraming nabigong pagtatangka ng pag-login, mangyaring subukang muli sa loob ng %minutes% minuto.|Napakaraming nabigong pagtatangka ng pag-login, mangyaring subukang muli sa loob ng %minutes% minuto. + Napakaraming nabigong mga pagtatangka sa pag-login, pakisubukan ulit matapos ang %minutes% minuto. diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.zh_CN.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.zh_CN.xlf index 9954d866a89e2..01fe700953835 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.zh_CN.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.zh_CN.xlf @@ -76,7 +76,7 @@ Too many failed login attempts, please try again in %minutes% minutes. - 登录尝试失败次数过多,请在 %minutes% 分钟后再试。|登录尝试失败次数过多,请在 %minutes% 分钟后再试。 + 登录尝试失败次数过多,请在 %minutes% 分钟后重试。 diff --git a/src/Symfony/Component/Security/Core/User/UserInterface.php b/src/Symfony/Component/Security/Core/User/UserInterface.php index e6078399d685b..904b933d557af 100644 --- a/src/Symfony/Component/Security/Core/User/UserInterface.php +++ b/src/Symfony/Component/Security/Core/User/UserInterface.php @@ -15,9 +15,7 @@ * Represents the interface that all user classes must implement. * * This interface is useful because the authentication layer can deal with - * the object through its lifecycle, using the object to get the hashed - * password (for checking against a submitted password), assigning roles - * and so on. + * the object through its lifecycle, assigning roles and so on. * * Regardless of how your users are loaded or where they come from (a database, * configuration, web service, etc.), you will have a class that implements diff --git a/src/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php b/src/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php index 6c9bdef909702..04c7e1ff9df20 100644 --- a/src/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php +++ b/src/Symfony/Component/Security/Core/Validator/Constraints/UserPasswordValidator.php @@ -49,7 +49,7 @@ public function validate(mixed $password, Constraint $constraint): void $user = $this->tokenStorage->getToken()->getUser(); if (!$user instanceof PasswordAuthenticatedUserInterface) { - throw new ConstraintDefinitionException(\sprintf('The "%s" class must implement the "%s" interface.', PasswordAuthenticatedUserInterface::class, get_debug_type($user))); + throw new ConstraintDefinitionException(\sprintf('The "%s" class must implement the "%s" interface.', get_debug_type($user), PasswordAuthenticatedUserInterface::class)); } $hasher = $this->hasherFactory->getPasswordHasher($user); diff --git a/src/Symfony/Component/Security/Csrf/SameOriginCsrfTokenManager.php b/src/Symfony/Component/Security/Csrf/SameOriginCsrfTokenManager.php index 9ef61964bfe1e..b1e0730643f83 100644 --- a/src/Symfony/Component/Security/Csrf/SameOriginCsrfTokenManager.php +++ b/src/Symfony/Component/Security/Csrf/SameOriginCsrfTokenManager.php @@ -207,9 +207,17 @@ public function clearCookies(Request $request, Response $response): void public function persistStrategy(Request $request): void { - if ($request->hasSession(true) && $request->attributes->has($this->cookieName)) { - $request->getSession()->set($this->cookieName, $request->attributes->get($this->cookieName)); + if (!$request->attributes->has($this->cookieName) + || !$request->hasSession(true) + || !($session = $request->getSession())->isStarted() + ) { + return; } + + $usageIndexValue = $session instanceof Session ? $usageIndexReference = &$session->getUsageIndex() : 0; + $usageIndexReference = \PHP_INT_MIN; + $session->set($this->cookieName, $request->attributes->get($this->cookieName)); + $usageIndexReference = $usageIndexValue; } public function onKernelResponse(ResponseEvent $event): void @@ -227,9 +235,21 @@ public function onKernelResponse(ResponseEvent $event): void */ private function isValidOrigin(Request $request): ?bool { - $source = $request->headers->get('Origin') ?? $request->headers->get('Referer') ?? 'null'; + $target = $request->getSchemeAndHttpHost().'/'; + $source = 'null'; + + foreach (['Origin', 'Referer'] as $header) { + if (!$request->headers->has($header)) { + continue; + } + $source = $request->headers->get($header); + + if (str_starts_with($source.'/', $target)) { + return true; + } + } - return 'null' === $source ? null : str_starts_with($source.'/', $request->getSchemeAndHttpHost().'/'); + return 'null' === $source ? null : false; } /** diff --git a/src/Symfony/Component/Security/Csrf/Tests/SameOriginCsrfTokenManagerTest.php b/src/Symfony/Component/Security/Csrf/Tests/SameOriginCsrfTokenManagerTest.php index 1ad17b80e0549..0a215d239af30 100644 --- a/src/Symfony/Component/Security/Csrf/Tests/SameOriginCsrfTokenManagerTest.php +++ b/src/Symfony/Component/Security/Csrf/Tests/SameOriginCsrfTokenManagerTest.php @@ -100,6 +100,20 @@ public function testValidOrigin() $this->assertSame(1 << 8, $request->attributes->get('csrf-token')); } + public function testValidRefererInvalidOrigin() + { + $request = new Request(); + $request->headers->set('Origin', 'http://localhost:1234'); + $request->headers->set('Referer', $request->getSchemeAndHttpHost()); + $this->requestStack->push($request); + + $token = new CsrfToken('test_token', str_repeat('a', 24)); + + $this->logger->expects($this->once())->method('debug')->with('CSRF validation accepted using origin info.'); + $this->assertTrue($this->csrfTokenManager->isTokenValid($token)); + $this->assertSame(1 << 8, $request->attributes->get('csrf-token')); + } + public function testValidOriginAfterDoubleSubmit() { $session = $this->createMock(Session::class); @@ -207,9 +221,11 @@ public function testClearCookies() $this->assertTrue($response->headers->has('Set-Cookie')); } - public function testPersistStrategyWithSession() + public function testPersistStrategyWithStartedSession() { $session = $this->createMock(Session::class); + $session->method('isStarted')->willReturn(true); + $request = new Request(); $request->setSession($session); $request->attributes->set('csrf-token', 2 << 8); @@ -219,6 +235,19 @@ public function testPersistStrategyWithSession() $this->csrfTokenManager->persistStrategy($request); } + public function testPersistStrategyWithSessionNotStarted() + { + $session = $this->createMock(Session::class); + + $request = new Request(); + $request->setSession($session); + $request->attributes->set('csrf-token', 2 << 8); + + $session->expects($this->never())->method('set'); + + $this->csrfTokenManager->persistStrategy($request); + } + public function testOnKernelResponse() { $request = new Request([], [], ['csrf-token' => 2], ['csrf-token_test' => 'csrf-token']); diff --git a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php index 69e739d2fef40..ae0cc0aec22b2 100644 --- a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php +++ b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcTokenHandler.php @@ -101,7 +101,11 @@ public function getUserBadgeFrom(string $accessToken): UserBadge } // UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate - return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn () => $this->createUser($claims)), $claims); + return new UserBadge($claims[$this->claim], new FallbackUserLoader(function () use ($claims) { + $claims['user_identifier'] = $claims[$this->claim]; + + return $this->createUser($claims); + }), $claims); } catch (\Exception $e) { $this->logger?->error('An error occurred while decoding and validating the token.', [ 'error' => $e->getMessage(), diff --git a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php index 855d29557c2a6..69c9d128861b2 100644 --- a/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php +++ b/src/Symfony/Component/Security/Http/AccessToken/Oidc/OidcUserInfoTokenHandler.php @@ -47,7 +47,11 @@ public function getUserBadgeFrom(string $accessToken): UserBadge } // UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate - return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn () => $this->createUser($claims)), $claims); + return new UserBadge($claims[$this->claim], new FallbackUserLoader(function () use ($claims) { + $claims['user_identifier'] = $claims[$this->claim]; + + return $this->createUser($claims); + }), $claims); } catch (\Exception $e) { $this->logger?->error('An error occurred on OIDC server.', [ 'error' => $e->getMessage(), diff --git a/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php b/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php index d71b417788724..c695be084861b 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php +++ b/src/Symfony/Component/Security/Http/Authenticator/RememberMeAuthenticator.php @@ -60,7 +60,7 @@ public function __construct( LoggerInterface|string|null $logger = null, ) { if (\is_string($tokenStorage)) { - trigger_deprecation('symfony/security-core', '7.2', 'The "$secret" argument of "%s()" is deprecated.', __METHOD__); + trigger_deprecation('symfony/security-http', '7.2', 'The "$secret" argument of "%s()" is deprecated.', __METHOD__); $this->secret = $tokenStorage; $tokenStorage = $cookieName; diff --git a/src/Symfony/Component/Security/Http/Authenticator/RemoteUserAuthenticator.php b/src/Symfony/Component/Security/Http/Authenticator/RemoteUserAuthenticator.php index 4561a94e10fce..824f2c379192e 100644 --- a/src/Symfony/Component/Security/Http/Authenticator/RemoteUserAuthenticator.php +++ b/src/Symfony/Component/Security/Http/Authenticator/RemoteUserAuthenticator.php @@ -44,6 +44,6 @@ protected function extractUsername(Request $request): ?string throw new BadCredentialsException(\sprintf('User key was not found: "%s".', $this->userKey)); } - return $request->server->get($this->userKey); + return $request->server->get($this->userKey) ?: null; } } diff --git a/src/Symfony/Component/Security/Http/CHANGELOG.md b/src/Symfony/Component/Security/Http/CHANGELOG.md index 9cb40fc926f4a..e9985ad13192b 100644 --- a/src/Symfony/Component/Security/Http/CHANGELOG.md +++ b/src/Symfony/Component/Security/Http/CHANGELOG.md @@ -14,7 +14,7 @@ CHANGELOG * Add `#[IsCsrfTokenValid]` attribute * Add CAS 2.0 access token handler - * Make empty username or empty password on form login attempts return Bad Request (400) + * Make empty username or empty password on form login attempts throw `BadCredentialsException` 7.0 --- diff --git a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php index a9ea59d2c889a..d008363dd9e15 100644 --- a/src/Symfony/Component/Security/Http/Firewall/ContextListener.php +++ b/src/Symfony/Component/Security/Http/Firewall/ContextListener.php @@ -121,6 +121,10 @@ public function authenticate(RequestEvent $event): void ]); if ($token instanceof TokenInterface) { + if (!$token->getUser()) { + throw new \UnexpectedValueException(\sprintf('Cannot authenticate a "%s" token because it doesn\'t store a user.', $token::class)); + } + $originalToken = $token; $token = $this->refreshUser($token); @@ -162,6 +166,7 @@ public function onKernelResponse(ResponseEvent $event): void $session = $request->getSession(); $sessionId = $session->getId(); $usageIndexValue = $session instanceof Session ? $usageIndexReference = &$session->getUsageIndex() : null; + $usageIndexReference = \PHP_INT_MIN; $token = $this->tokenStorage->getToken(); if (!$this->trustResolver->isAuthenticated($token)) { @@ -176,6 +181,8 @@ public function onKernelResponse(ResponseEvent $event): void if ($this->sessionTrackerEnabler && $session->getId() === $sessionId) { $usageIndexReference = $usageIndexValue; + } else { + $usageIndexReference = $usageIndexReference - \PHP_INT_MIN + $usageIndexValue; } } diff --git a/src/Symfony/Component/Security/Http/LoginLink/LoginLinkHandler.php b/src/Symfony/Component/Security/Http/LoginLink/LoginLinkHandler.php index 014b7977145b4..671a3850bccd9 100644 --- a/src/Symfony/Component/Security/Http/LoginLink/LoginLinkHandler.php +++ b/src/Symfony/Component/Security/Http/LoginLink/LoginLinkHandler.php @@ -84,9 +84,16 @@ public function consumeLoginLink(Request $request): UserInterface if (!$hash = $request->get('hash')) { throw new InvalidLoginLinkException('Missing "hash" parameter.'); } + if (!is_string($hash)) { + throw new InvalidLoginLinkException('Invalid "hash" parameter.'); + } + if (!$expires = $request->get('expires')) { throw new InvalidLoginLinkException('Missing "expires" parameter.'); } + if (preg_match('/^\d+$/', $expires) !== 1) { + throw new InvalidLoginLinkException('Invalid "expires" parameter.'); + } try { $this->signatureHasher->acceptSignatureHash($userIdentifier, $expires, $hash); diff --git a/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php b/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php index 9e92f3cf50507..37ee6803eb55b 100644 --- a/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php +++ b/src/Symfony/Component/Security/Http/RememberMe/PersistentRememberMeHandler.php @@ -124,7 +124,12 @@ public function clearRememberMeCookie(): void return; } - $rememberMeDetails = RememberMeDetails::fromRawCookie($cookie); + try { + $rememberMeDetails = RememberMeDetails::fromRawCookie($cookie); + } catch (AuthenticationException) { + // malformed cookie should not fail the response and can be simply ignored + return; + } [$series] = explode(':', $rememberMeDetails->getValue()); $this->tokenProvider->deleteTokenBySeries($series); } diff --git a/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcTokenHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcTokenHandlerTest.php index 396a591f66c00..303fa5616a381 100644 --- a/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcTokenHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcTokenHandlerTest.php @@ -48,7 +48,7 @@ public function testGetsUserIdentifierFromSignedToken(string $claim, string $exp 'email' => 'foo@example.com', ]; $token = $this->buildJWS(json_encode($claims)); - $expectedUser = new OidcUser(...$claims); + $expectedUser = new OidcUser(...$claims, userIdentifier: $claims[$claim]); $loggerMock = $this->createMock(LoggerInterface::class); $loggerMock->expects($this->never())->method('error'); @@ -67,7 +67,7 @@ public function testGetsUserIdentifierFromSignedToken(string $claim, string $exp $this->assertInstanceOf(OidcUser::class, $actualUser); $this->assertEquals($expectedUser, $actualUser); $this->assertEquals($claims, $userBadge->getAttributes()); - $this->assertEquals($claims['sub'], $actualUser->getUserIdentifier()); + $this->assertEquals($claims[$claim], $actualUser->getUserIdentifier()); } public static function getClaims(): iterable diff --git a/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php index 40eb5ce81d616..b141368f8b375 100644 --- a/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php @@ -33,7 +33,7 @@ public function testGetsUserIdentifierFromOidcServerResponse(string $claim, stri 'sub' => 'e21bf182-1538-406e-8ccb-e25a17aba39f', 'email' => 'foo@example.com', ]; - $expectedUser = new OidcUser(...$claims); + $expectedUser = new OidcUser(...$claims, userIdentifier: $claims[$claim]); $responseMock = $this->createMock(ResponseInterface::class); $responseMock->expects($this->once()) @@ -52,7 +52,7 @@ public function testGetsUserIdentifierFromOidcServerResponse(string $claim, stri $this->assertInstanceOf(OidcUser::class, $actualUser); $this->assertEquals($expectedUser, $actualUser); $this->assertEquals($claims, $userBadge->getAttributes()); - $this->assertEquals($claims['sub'], $actualUser->getUserIdentifier()); + $this->assertEquals($claims[$claim], $actualUser->getUserIdentifier()); } public static function getClaims(): iterable diff --git a/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php b/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php index 5119f8ce09e74..b94f90884e2e0 100644 --- a/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Authenticator/RemoteUserAuthenticatorTest.php @@ -36,6 +36,7 @@ public function testSupportNoUser() $authenticator = new RemoteUserAuthenticator(new InMemoryUserProvider(), new TokenStorage(), 'main'); $this->assertFalse($authenticator->supports($this->createRequest([]))); + $this->assertFalse($authenticator->supports($this->createRequest(['REMOTE_USER' => '']))); } public function testSupportTokenStorageWithToken() diff --git a/src/Symfony/Component/Security/Http/Tests/EventListener/CsrfProtectionListenerTest.php b/src/Symfony/Component/Security/Http/Tests/EventListener/CsrfProtectionListenerTest.php index b591c5ef3c0b5..cdb24892ea66d 100644 --- a/src/Symfony/Component/Security/Http/Tests/EventListener/CsrfProtectionListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/EventListener/CsrfProtectionListenerTest.php @@ -50,10 +50,11 @@ public function testValidCsrfToken() ->with(new CsrfToken('authenticator_token_id', 'abc123')) ->willReturn(true); - $event = $this->createEvent($this->createPassport(new CsrfTokenBadge('authenticator_token_id', 'abc123'))); + $badge = new CsrfTokenBadge('authenticator_token_id', 'abc123'); + $event = $this->createEvent($this->createPassport($badge)); $this->listener->checkPassport($event); - $this->expectNotToPerformAssertions(); + $this->assertTrue($badge->isResolved()); } public function testInvalidCsrfToken() diff --git a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php index 427b009d464d0..b86d8260f801f 100644 --- a/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/Firewall/ContextListenerTest.php @@ -36,6 +36,7 @@ use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Http\Firewall\ContextListener; +use Symfony\Component\Security\Http\Tests\Fixtures\NullUserToken; use Symfony\Contracts\Service\ServiceLocatorTrait; class ContextListenerTest extends TestCase @@ -58,6 +59,30 @@ public function testUserProvidersNeedToImplementAnInterface() $this->handleEventWithPreviousSession([new \stdClass()]); } + public function testTokenReturnsNullUser() + { + $tokenStorage = new TokenStorage(); + $tokenStorage->setToken(new NullUserToken()); + + $session = new Session(new MockArraySessionStorage()); + $session->set('_security_context_key', serialize($tokenStorage->getToken())); + + $request = new Request(); + $request->setSession($session); + $request->cookies->set('MOCKSESSID', true); + + $listener = new ContextListener($tokenStorage, [], 'context_key'); + + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('Cannot authenticate a "Symfony\Component\Security\Http\Tests\Fixtures\NullUserToken" token because it doesn\'t store a user.'); + + $listener->authenticate(new RequestEvent( + $this->createMock(HttpKernelInterface::class), + $request, + HttpKernelInterface::MAIN_REQUEST, + )); + } + public function testOnKernelResponseWillAddSession() { $session = $this->runSessionOnKernelResponse( @@ -323,6 +348,8 @@ public function testSessionIsNotReported() $listener = new ContextListener($tokenStorage, [], 'context_key', null, null, null, $tokenStorage->getToken(...)); $listener(new RequestEvent($this->createMock(HttpKernelInterface::class), $request, HttpKernelInterface::MAIN_REQUEST)); + + $listener->onKernelResponse(new ResponseEvent($this->createMock(HttpKernelInterface::class), $request, HttpKernelInterface::MAIN_REQUEST, new Response())); } public function testOnKernelResponseRemoveListener() diff --git a/src/Symfony/Component/Security/Http/Tests/Fixtures/NullUserToken.php b/src/Symfony/Component/Security/Http/Tests/Fixtures/NullUserToken.php new file mode 100644 index 0000000000000..95048e464a3f9 --- /dev/null +++ b/src/Symfony/Component/Security/Http/Tests/Fixtures/NullUserToken.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Security\Http\Tests\Fixtures; + +use Symfony\Component\Security\Core\Authentication\Token\AbstractToken; +use Symfony\Component\Security\Core\User\UserInterface; + +class NullUserToken extends AbstractToken +{ + public function getUser(): ?UserInterface + { + return null; + } +} diff --git a/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php index 52ee5fab68a07..878679e77a300 100644 --- a/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/LoginLink/LoginLinkHandlerTest.php @@ -240,6 +240,30 @@ public function testConsumeLoginLinkWithMissingExpiration() $linker->consumeLoginLink($request); } + public function testConsumeLoginLinkWithInvalidExpiration() + { + $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); + $this->userProvider->createUser($user); + + $this->expectException(InvalidLoginLinkException::class); + $request = Request::create('/login/verify?user=weaverryan&hash=thehash&expires=%E2%80%AA1000000000%E2%80%AC'); + + $linker = $this->createLinker(); + $linker->consumeLoginLink($request); + } + + public function testConsumeLoginLinkWithInvalidHash() + { + $user = new TestLoginLinkHandlerUser('weaverryan', 'ryan@symfonycasts.com', 'pwhash'); + $this->userProvider->createUser($user); + + $this->expectException(InvalidLoginLinkException::class); + $request = Request::create('/login/verify?user=weaverryan&hash[]=an&hash[]=array&expires=1000000000'); + + $linker = $this->createLinker(); + $linker->consumeLoginLink($request); + } + private function createSignatureHash(string $username, int $expires, array $extraFields = ['emailProperty' => 'ryan@symfonycasts.com', 'passwordProperty' => 'pwhash']): string { $hasher = new SignatureHasher($this->propertyAccessor, array_keys($extraFields), 's3cret'); diff --git a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php index 14cc8f684cda9..a4bbe4d0ca427 100644 --- a/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php +++ b/src/Symfony/Component/Security/Http/Tests/RememberMe/PersistentRememberMeHandlerTest.php @@ -74,6 +74,22 @@ public function testClearRememberMeCookie() $this->assertNull($cookie->getValue()); } + public function testClearRememberMeCookieMalformedCookie() + { + $this->tokenProvider->expects($this->exactly(0)) + ->method('deleteTokenBySeries'); + + $this->request->cookies->set('REMEMBERME', 'malformed'); + + $this->handler->clearRememberMeCookie(); + + $this->assertTrue($this->request->attributes->has(ResponseListener::COOKIE_ATTR_NAME)); + + /** @var Cookie $cookie */ + $cookie = $this->request->attributes->get(ResponseListener::COOKIE_ATTR_NAME); + $this->assertNull($cookie->getValue()); + } + public function testConsumeRememberMeCookieValid() { $this->tokenProvider->expects($this->any()) diff --git a/src/Symfony/Component/Semaphore/Store/StoreFactory.php b/src/Symfony/Component/Semaphore/Store/StoreFactory.php index 345b1269b63c2..348e116891b7e 100644 --- a/src/Symfony/Component/Semaphore/Store/StoreFactory.php +++ b/src/Symfony/Component/Semaphore/Store/StoreFactory.php @@ -35,8 +35,8 @@ public static function createStore(#[\SensitiveParameter] object|string $connect case !\is_string($connection): throw new InvalidArgumentException(\sprintf('Unsupported Connection: "%s".', $connection::class)); - case str_starts_with($connection, 'redis://'): - case str_starts_with($connection, 'rediss://'): + case str_starts_with($connection, 'redis:'): + case str_starts_with($connection, 'rediss:'): if (!class_exists(AbstractAdapter::class)) { throw new InvalidArgumentException('Unsupported Redis DSN. Try running "composer require symfony/cache".'); } diff --git a/src/Symfony/Component/Semaphore/Tests/Store/RelayStoreTest.php b/src/Symfony/Component/Semaphore/Tests/Store/RelayStoreTest.php index a7db8f8f10cf1..aeaf8c3d451ce 100644 --- a/src/Symfony/Component/Semaphore/Tests/Store/RelayStoreTest.php +++ b/src/Symfony/Component/Semaphore/Tests/Store/RelayStoreTest.php @@ -25,6 +25,10 @@ protected function setUp(): void public static function setUpBeforeClass(): void { + if (\PHP_VERSION_ID <= 80500 && isset($_SERVER['GITHUB_ACTIONS'])) { + self::markTestSkipped('Test segfaults on PHP 8.5'); + } + try { new Relay(...explode(':', getenv('REDIS_HOST'))); } catch (\Relay\Exception $e) { diff --git a/src/Symfony/Component/Semaphore/Tests/Store/StoreFactoryTest.php b/src/Symfony/Component/Semaphore/Tests/Store/StoreFactoryTest.php index 23d01346a8b0b..f69e7161e4677 100644 --- a/src/Symfony/Component/Semaphore/Tests/Store/StoreFactoryTest.php +++ b/src/Symfony/Component/Semaphore/Tests/Store/StoreFactoryTest.php @@ -12,54 +12,37 @@ namespace Symfony\Component\Semaphore\Tests\Store; use PHPUnit\Framework\TestCase; -use Symfony\Component\Cache\Traits\RedisProxy; use Symfony\Component\Semaphore\Store\RedisStore; use Symfony\Component\Semaphore\Store\StoreFactory; /** * @author Jérémy Derussé - * - * @requires extension redis */ class StoreFactoryTest extends TestCase { - public function testCreateRedisStore() + /** + * @dataProvider validConnections + */ + public function testCreateStore($connection, string $expectedStoreClass) { - $store = StoreFactory::createStore($this->createMock(\Redis::class)); + $store = StoreFactory::createStore($connection); - $this->assertInstanceOf(RedisStore::class, $store); + $this->assertInstanceOf($expectedStoreClass, $store); } - public function testCreateRedisProxyStore() + public static function validConnections(): \Generator { - if (!class_exists(RedisProxy::class)) { - $this->markTestSkipped(); - } + yield [new \Predis\Client(), RedisStore::class]; - $store = StoreFactory::createStore($this->createMock(RedisProxy::class)); - - $this->assertInstanceOf(RedisStore::class, $store); - } - - public function testCreateRedisAsDsnStore() - { - if (!class_exists(RedisProxy::class)) { - $this->markTestSkipped(); + if (class_exists(\Redis::class)) { + yield [new \Redis(), RedisStore::class]; } - - $store = StoreFactory::createStore('redis://localhost'); - - $this->assertInstanceOf(RedisStore::class, $store); - } - - public function testCreatePredisStore() - { - if (!class_exists(\Predis\Client::class)) { - $this->markTestSkipped(); + if (class_exists(\Redis::class) && class_exists(AbstractAdapter::class)) { + yield ['redis://localhost', RedisStore::class]; + yield ['redis://localhost?lazy=1', RedisStore::class]; + yield ['redis://localhost?redis_cluster=1', RedisStore::class]; + yield ['redis://localhost?redis_cluster=1&lazy=1', RedisStore::class]; + yield ['redis:?host[localhost]&host[localhost:6379]&redis_cluster=1', RedisStore::class]; } - - $store = StoreFactory::createStore(new \Predis\Client()); - - $this->assertInstanceOf(RedisStore::class, $store); } } diff --git a/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php b/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php index bc1c6e10e3727..179b7a3d92e9d 100644 --- a/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php +++ b/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php @@ -19,6 +19,7 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\Serializer\Debug\TraceableEncoder; use Symfony\Component\Serializer\Debug\TraceableNormalizer; +use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\SerializerInterface; /** @@ -54,16 +55,27 @@ public function process(ContainerBuilder $container): void throw new RuntimeException('You must tag at least one service as "serializer.encoder" to use the "serializer" service.'); } + $defaultContext = []; if ($container->hasParameter('serializer.default_context')) { $defaultContext = $container->getParameter('serializer.default_context'); - $this->bindDefaultContext($container, array_merge($normalizers, $encoders), $defaultContext); $container->getParameterBag()->remove('serializer.default_context'); + $container->getDefinition('serializer')->setArgument('$defaultContext', $defaultContext); } + /** @var ?string $circularReferenceHandler */ + $circularReferenceHandler = $container->hasParameter('.serializer.circular_reference_handler') + ? $container->getParameter('.serializer.circular_reference_handler') : null; + + /** @var ?string $maxDepthHandler */ + $maxDepthHandler = $container->hasParameter('.serializer.max_depth_handler') + ? $container->getParameter('.serializer.max_depth_handler') : null; + + $this->bindDefaultContext($container, array_merge($normalizers, $encoders), $defaultContext, $circularReferenceHandler, $maxDepthHandler); + $this->configureSerializer($container, 'serializer', $normalizers, $encoders, 'default'); if ($namedSerializers) { - $this->configureNamedSerializers($container); + $this->configureNamedSerializers($container, $circularReferenceHandler, $maxDepthHandler); } } @@ -97,11 +109,22 @@ private function createNamedSerializerTags(ContainerBuilder $container, string $ } } - private function bindDefaultContext(ContainerBuilder $container, array $services, array $defaultContext): void + private function bindDefaultContext(ContainerBuilder $container, array $services, array $defaultContext, ?string $circularReferenceHandler, ?string $maxDepthHandler): void { foreach ($services as $id) { $definition = $container->getDefinition((string) $id); - $definition->setBindings(['array $defaultContext' => new BoundArgument($defaultContext, false)] + $definition->getBindings()); + + $context = $defaultContext; + if (is_a($definition->getClass(), ObjectNormalizer::class, true)) { + if (null !== $circularReferenceHandler) { + $context += ['circular_reference_handler' => new Reference($circularReferenceHandler)]; + } + if (null !== $maxDepthHandler) { + $context += ['max_depth_handler' => new Reference($maxDepthHandler)]; + } + } + + $definition->setBindings(['array $defaultContext' => new BoundArgument($context, false)] + $definition->getBindings()); } } @@ -124,7 +147,7 @@ private function configureSerializer(ContainerBuilder $container, string $id, ar $serializerDefinition->replaceArgument(1, $encoders); } - private function configureNamedSerializers(ContainerBuilder $container): void + private function configureNamedSerializers(ContainerBuilder $container, ?string $circularReferenceHandler, ?string $maxDepthHandler): void { $defaultSerializerNameConverter = $container->hasParameter('.serializer.name_converter') ? $container->getParameter('.serializer.name_converter') : null; @@ -148,9 +171,9 @@ private function configureNamedSerializers(ContainerBuilder $container): void $normalizers = $this->buildChildDefinitions($container, $serializerName, $normalizers, $config); $encoders = $this->buildChildDefinitions($container, $serializerName, $encoders, $config); - $this->bindDefaultContext($container, array_merge($normalizers, $encoders), $config['default_context']); + $this->bindDefaultContext($container, array_merge($normalizers, $encoders), $config['default_context'], $circularReferenceHandler, $maxDepthHandler); - $container->registerChild($serializerId, 'serializer'); + $container->registerChild($serializerId, 'serializer')->setArgument('$defaultContext', $config['default_context']); $container->registerAliasForArgument($serializerId, SerializerInterface::class, $serializerName.'.serializer'); $this->configureSerializer($container, $serializerId, $normalizers, $encoders, $serializerName); @@ -183,7 +206,9 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri foreach ($services as &$id) { $childId = $id.'.'.$serializerName; - $definition = $container->registerChild($childId, (string) $id); + $definition = $container->registerChild($childId, (string) $id) + ->setClass($container->getDefinition((string) $id)->getClass()) + ; if (null !== $nameConverterIndex = $this->findNameConverterIndex($container, (string) $id)) { $definition->replaceArgument($nameConverterIndex, new Reference($config['name_converter'])); diff --git a/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php b/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php index 3902b56134eb5..e267730819571 100644 --- a/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/CsvEncoder.php @@ -72,6 +72,10 @@ public function encode(mixed $data, string $format, array $context = []): string } elseif (!$data) { $data = [[]]; } else { + if ($data instanceof \Traversable) { + // Generators can only be iterated once — convert to array to allow multiple traversals + $data = iterator_to_array($data); + } // Sequential arrays of arrays are considered as collections $i = 0; foreach ($data as $key => $value) { diff --git a/src/Symfony/Component/Serializer/Encoder/YamlEncoder.php b/src/Symfony/Component/Serializer/Encoder/YamlEncoder.php index 223cd79333f6a..1013129db8dfd 100644 --- a/src/Symfony/Component/Serializer/Encoder/YamlEncoder.php +++ b/src/Symfony/Component/Serializer/Encoder/YamlEncoder.php @@ -11,8 +11,10 @@ namespace Symfony\Component\Serializer\Encoder; +use Symfony\Component\Serializer\Exception\NotEncodableValueException; use Symfony\Component\Serializer\Exception\RuntimeException; use Symfony\Component\Yaml\Dumper; +use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Parser; use Symfony\Component\Yaml\Yaml; @@ -85,7 +87,11 @@ public function decode(string $data, string $format, array $context = []): mixed { $context = array_merge($this->defaultContext, $context); - return $this->parser->parse($data, $context[self::YAML_FLAGS]); + try { + return $this->parser->parse($data, $context[self::YAML_FLAGS]); + } catch (ParseException $e) { + throw new NotEncodableValueException($e->getMessage(), $e->getCode(), $e); + } } public function supportsDecoding(string $format): bool diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index fb45a924bee70..00d2e3b00ef83 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -569,7 +569,7 @@ private function validateAndDenormalizeLegacy(array $types, string $currentClass return (float) $data; } - if (LegacyType::BUILTIN_TYPE_BOOL === $builtinType && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) { + if (LegacyType::BUILTIN_TYPE_BOOL === $builtinType && (\is_string($data) || \is_int($data)) && ($context[self::FILTER_BOOL] ?? false)) { return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE); } @@ -848,7 +848,7 @@ private function validateAndDenormalize(Type $type, string $currentClass, string return (float) $data; } - if (TypeIdentifier::BOOL === $typeIdentifier && \is_string($data) && ($context[self::FILTER_BOOL] ?? false)) { + if (TypeIdentifier::BOOL === $typeIdentifier && (\is_string($data) || \is_int($data)) && ($context[self::FILTER_BOOL] ?? false)) { return filter_var($data, \FILTER_VALIDATE_BOOL, \FILTER_NULL_ON_FAILURE); } diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php index f07adc2f28a21..4d2d7829a49ab 100644 --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php @@ -100,6 +100,7 @@ private function isSetMethod(\ReflectionMethod $method): bool return !$method->isStatic() && !$method->getAttributes(Ignore::class) && 0 < $method->getNumberOfParameters() + && 3 < \strlen($method->name) && str_starts_with($method->name, 'set') && !ctype_lower($method->name[3]) ; diff --git a/src/Symfony/Component/Serializer/Serializer.php b/src/Symfony/Component/Serializer/Serializer.php index b907a51860f05..f95f2d72e0b46 100644 --- a/src/Symfony/Component/Serializer/Serializer.php +++ b/src/Symfony/Component/Serializer/Serializer.php @@ -75,10 +75,12 @@ class Serializer implements SerializerInterface, NormalizerInterface, Denormaliz /** * @param array $normalizers * @param array $encoders + * @param array $defaultContext */ public function __construct( private array $normalizers = [], array $encoders = [], + private array $defaultContext = [], ) { foreach ($normalizers as $normalizer) { if ($normalizer instanceof SerializerAwareInterface) { @@ -154,12 +156,12 @@ public function normalize(mixed $data, ?string $format = null, array $context = return $data; } - if (\is_array($data) && !$data && ($context[self::EMPTY_ARRAY_AS_OBJECT] ?? false)) { + if (\is_array($data) && !$data && ($context[self::EMPTY_ARRAY_AS_OBJECT] ?? $this->defaultContext[self::EMPTY_ARRAY_AS_OBJECT] ?? false)) { return new \ArrayObject(); } if (is_iterable($data)) { - if ($data instanceof \Countable && ($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) && !\count($data)) { + if ($data instanceof \Countable && ($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? $this->defaultContext[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) && !\count($data)) { return new \ArrayObject(); } @@ -211,7 +213,7 @@ public function denormalize(mixed $data, string $type, ?string $format = null, a throw new NotNormalizableValueException(\sprintf('Could not denormalize object of type "%s", no supporting normalizer found.', $type)); } - if (isset($context[DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS])) { + if (isset($context[DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS]) || isset($this->defaultContext[DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS])) { unset($context[DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS]); $context['not_normalizable_value_exceptions'] = []; $errors = &$context['not_normalizable_value_exceptions']; diff --git a/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php b/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php index b721b1ba48298..88ec02b87c57d 100644 --- a/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php +++ b/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php @@ -19,6 +19,7 @@ use Symfony\Component\Serializer\Debug\TraceableNormalizer; use Symfony\Component\Serializer\Debug\TraceableSerializer; use Symfony\Component\Serializer\DependencyInjection\SerializerPass; +use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; use Symfony\Component\Serializer\SerializerInterface; /** @@ -83,9 +84,11 @@ public function testServicesAreOrderedAccordingToPriority() public function testBindSerializerDefaultContext() { + $context = ['enable_max_depth' => true]; + $container = new ContainerBuilder(); $container->setParameter('kernel.debug', false); - $container->register('serializer')->setArguments([null, null]); + $container->register('serializer')->setArguments([null, null, []]); $container->setParameter('serializer.default_context', ['enable_max_depth' => true]); $definition = $container->register('n1')->addTag('serializer.normalizer')->addTag('serializer.encoder'); @@ -93,7 +96,34 @@ public function testBindSerializerDefaultContext() $serializerPass->process($container); $bindings = $definition->getBindings(); - $this->assertEquals($bindings['array $defaultContext'], new BoundArgument(['enable_max_depth' => true], false)); + $this->assertEquals($bindings['array $defaultContext'], new BoundArgument($context, false)); + $this->assertEquals($context, $container->getDefinition('serializer')->getArgument('$defaultContext')); + } + + /** + * @testWith [{}, {}] + * [{"serializer.default_context": {"enable_max_depth": true}}, {"enable_max_depth": true}] + * [{".serializer.circular_reference_handler": "foo"}, {"circular_reference_handler": "foo"}] + * [{".serializer.max_depth_handler": "bar"}, {"max_depth_handler": "bar"}] + * [{"serializer.default_context": {"enable_max_depth": true}, ".serializer.circular_reference_handler": "foo", ".serializer.max_depth_handler": "bar"}, {"enable_max_depth": true, "circular_reference_handler": "foo", "max_depth_handler": "bar"}] + */ + public function testBindObjectNormalizerDefaultContext(array $parameters, array $context) + { + $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->register('serializer')->setArguments([null, null, []]); + $container->getParameterBag()->add($parameters); + $definition = $container->register('serializer.normalizer.object') + ->setClass(ObjectNormalizer::class) + ->addTag('serializer.normalizer') + ->addTag('serializer.encoder') + ; + + $serializerPass = new SerializerPass(); + $serializerPass->process($container); + + $bindings = $definition->getBindings(); + $this->assertEquals($bindings['array $defaultContext'], new BoundArgument($context, false)); } public function testNormalizersAndEncodersAreDecoratedAndOrderedWhenCollectingData() @@ -553,7 +583,7 @@ public function testBindSerializerDefaultContextToNamedSerializers() 'api' => ['default_context' => $defaultContext = ['enable_max_depth' => true]], ]); - $container->register('serializer')->setArguments([null, null]); + $container->register('serializer')->setArguments([null, null, []]); $definition = $container->register('n1') ->addTag('serializer.normalizer', ['serializer' => '*']) ->addTag('serializer.encoder', ['serializer' => '*']) @@ -562,11 +592,46 @@ public function testBindSerializerDefaultContextToNamedSerializers() $serializerPass = new SerializerPass(); $serializerPass->process($container); - $this->assertEmpty($definition->getBindings()); + $bindings = $definition->getBindings(); + $this->assertArrayHasKey('array $defaultContext', $bindings); + $this->assertEquals($bindings['array $defaultContext'], new BoundArgument([], false)); $bindings = $container->getDefinition('n1.api')->getBindings(); $this->assertArrayHasKey('array $defaultContext', $bindings); $this->assertEquals($bindings['array $defaultContext'], new BoundArgument($defaultContext, false)); + $this->assertArrayNotHasKey('$defaultContext', $container->getDefinition('serializer')->getArguments()); + $this->assertEquals($defaultContext, $container->getDefinition('serializer.api')->getArgument('$defaultContext')); + } + + /** + * @testWith [{}, {}, {}] + * [{"enable_max_depth": true}, {}, {"enable_max_depth": true}] + * [{}, {".serializer.circular_reference_handler": "foo"}, {"circular_reference_handler": "foo"}] + * [{}, {".serializer.max_depth_handler": "bar"}, {"max_depth_handler": "bar"}] + * [{"enable_max_depth": true}, {".serializer.circular_reference_handler": "foo", ".serializer.max_depth_handler": "bar"}, {"enable_max_depth": true, "circular_reference_handler": "foo", "max_depth_handler": "bar"}] + */ + public function testBindNamedSerializerObjectNormalizerDefaultContext(array $defaultContext, array $parameters, array $context) + { + $container = new ContainerBuilder(); + $container->setParameter('kernel.debug', false); + $container->setParameter('.serializer.named_serializers', [ + 'api' => ['default_context' => $defaultContext], + ]); + + $container->register('serializer')->setArguments([null, null, []]); + $container->getParameterBag()->add($parameters); + $container->register('serializer.normalizer.object') + ->setClass(ObjectNormalizer::class) + ->addTag('serializer.normalizer', ['serializer' => '*']) + ->addTag('serializer.encoder', ['serializer' => '*']) + ; + + $serializerPass = new SerializerPass(); + $serializerPass->process($container); + + $bindings = $container->getDefinition('serializer.normalizer.object.api')->getBindings(); + $this->assertArrayHasKey('array $defaultContext', $bindings); + $this->assertEquals($bindings['array $defaultContext'], new BoundArgument($context, false)); } public function testNamedSerializersAreRegistered() diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php index 048d790b04f69..34cc940a7d0b3 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/CsvEncoderTest.php @@ -708,6 +708,30 @@ public function testEndOfLinePassedInConstructor() $this->assertSame("foo,bar\r\nhello,test\r\n", $encoder->encode($value, 'csv')); } + /** @dataProvider provideIterable */ + public function testIterable(mixed $data) + { + $this->assertEquals(<<<'CSV' + foo,bar + hello,"hey ho" + hi,"let's go" + + CSV, $this->encoder->encode($data, 'csv')); + } + + public static function provideIterable() + { + $data = [ + ['foo' => 'hello', 'bar' => 'hey ho'], + ['foo' => 'hi', 'bar' => 'let\'s go'], + ]; + + yield 'array' => [$data]; + yield 'array iterator' => [new \ArrayIterator($data)]; + yield 'iterator aggregate' => [new \IteratorIterator(new \ArrayIterator($data))]; + yield 'generator' => [(fn (): \Generator => yield from $data)()]; + } + /** * @group legacy */ diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/YamlEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/YamlEncoderTest.php index 33ee49f5d6b45..f647fe4233c78 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/YamlEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/YamlEncoderTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Serializer\Encoder\YamlEncoder; +use Symfony\Component\Serializer\Exception\NotEncodableValueException; use Symfony\Component\Yaml\Yaml; /** @@ -81,4 +82,12 @@ public function testContext() $this->assertEquals(['foo' => $obj], $encoder->decode("foo: !php/object 'O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}'", 'yaml')); $this->assertEquals(['foo' => null], $encoder->decode("foo: !php/object 'O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}'", 'yaml', [YamlEncoder::YAML_FLAGS => 0])); } + + public function testInvalidYaml() + { + $encoder = new YamlEncoder(); + + $this->expectException(NotEncodableValueException::class); + $encoder->decode("\t", 'yaml'); + } } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php index 499fa8bff20cf..270b65f33ef66 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php @@ -1216,15 +1216,34 @@ public static function provideDenormalizeWithFilterBoolData(): array { return [ [['foo' => 'true'], true], + [['foo' => 'True'], true], + [['foo' => 'TRUE'], true], [['foo' => '1'], true], + [['foo' => 1], true], [['foo' => 'yes'], true], + [['foo' => 'Yes'], true], + [['foo' => 'YES'], true], + [['foo' => 'on'], true], + [['foo' => 'On'], true], + [['foo' => 'ON'], true], [['foo' => 'false'], false], + [['foo' => 'False'], false], + [['foo' => 'FALSE'], false], [['foo' => '0'], false], + [['foo' => 0], false], [['foo' => 'no'], false], + [['foo' => 'No'], false], + [['foo' => 'NO'], false], + [['foo' => 'off'], false], + [['foo' => 'Off'], false], + [['foo' => 'OFF'], false], [['foo' => ''], false], [['foo' => null], null], [['foo' => 'null'], null], [['foo' => 'something'], null], + [['foo' => 'foo'], null], + [['foo' => 1234567890], null], + [['foo' => -1234567890], null], ]; } @@ -1253,10 +1272,7 @@ protected function isAllowedAttribute($classOrObject, string $attribute, ?string public function testTemplateTypeWhenAnObjectIsPassedToDenormalize() { - $normalizer = new class ( - classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), - propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()]) - ) extends AbstractObjectNormalizerDummy { + $normalizer = new class(classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])) extends AbstractObjectNormalizerDummy { protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool { return true; @@ -1279,10 +1295,7 @@ public function testDenormalizeTemplateType() $this->markTestSkipped('The PropertyInfo component before Symfony 7.1 does not support template types.'); } - $normalizer = new class ( - classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), - propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()]) - ) extends AbstractObjectNormalizerDummy { + $normalizer = new class(classMetadataFactory: new ClassMetadataFactory(new AttributeLoader()), propertyTypeExtractor: new PropertyInfoExtractor(typeExtractors: [new PhpStanExtractor(), new ReflectionExtractor()])) extends AbstractObjectNormalizerDummy { protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool { return true; @@ -1587,7 +1600,7 @@ class TruePropertyDummy class BoolPropertyDummy { - /** @var null|bool */ + /** @var bool|null */ public $foo; } diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index 50891e7e02384..8fd0ff8850f63 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -65,7 +65,6 @@ use Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumProperty; use Symfony\Component\Serializer\Tests\Fixtures\DummyWithObjectOrNull; use Symfony\Component\Serializer\Tests\Fixtures\DummyWithVariadicParameter; -use Symfony\Component\Serializer\Tests\Fixtures\DummyWithVariadicProperty; use Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy; use Symfony\Component\Serializer\Tests\Fixtures\FooImplementationDummy; use Symfony\Component\Serializer\Tests\Fixtures\FooInterfaceDummyDenormalizer; @@ -1675,6 +1674,32 @@ public function testPartialDenormalizationWithInvalidVariadicParameter() DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true, ]); } + + public function testEmptyArrayAsObjectDefaultContext() + { + $serializer = new Serializer( + defaultContext: [Serializer::EMPTY_ARRAY_AS_OBJECT => true], + ); + $this->assertEquals(new \ArrayObject(), $serializer->normalize([])); + } + + public function testPreserveEmptyObjectsAsDefaultContext() + { + $serializer = new Serializer( + defaultContext: [AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => true], + ); + $this->assertEquals(new \ArrayObject(), $serializer->normalize(new \ArrayIterator())); + } + + public function testCollectDenormalizationErrorsDefaultContext() + { + $data = ['variadic' => ['a random string']]; + $serializer = new Serializer([new UidNormalizer(), new ObjectNormalizer()], [], [DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true]); + + $this->expectException(PartialDenormalizationException::class); + + $serializer->denormalize($data, DummyWithVariadicParameter::class); + } } class Model diff --git a/src/Symfony/Component/Stopwatch/Stopwatch.php b/src/Symfony/Component/Stopwatch/Stopwatch.php index 50ac6574fd436..8961507fa07db 100644 --- a/src/Symfony/Component/Stopwatch/Stopwatch.php +++ b/src/Symfony/Component/Stopwatch/Stopwatch.php @@ -140,7 +140,7 @@ public function getEvent(string $name): StopwatchEvent */ public function getSectionEvents(string $id): array { - return $this->sections[$id]->getEvents() ?? []; + return isset($this->sections[$id]) ? $this->sections[$id]->getEvents() : []; } /** diff --git a/src/Symfony/Component/Stopwatch/StopwatchEvent.php b/src/Symfony/Component/Stopwatch/StopwatchEvent.php index cabe642c1e9f8..805a7359d52b7 100644 --- a/src/Symfony/Component/Stopwatch/StopwatchEvent.php +++ b/src/Symfony/Component/Stopwatch/StopwatchEvent.php @@ -38,8 +38,6 @@ class StopwatchEvent * @param string|null $category The event category or null to use the default * @param bool $morePrecision If true, time is stored as float to keep the original microsecond precision * @param string|null $name The event name or null to define the name as default - * - * @throws \InvalidArgumentException When the raw time is not valid */ public function __construct( float $origin, @@ -219,8 +217,6 @@ protected function getNow(): float /** * Formats a time. - * - * @throws \InvalidArgumentException When the raw time is not valid */ private function formatTime(float $time): float { diff --git a/src/Symfony/Component/Stopwatch/Tests/StopwatchTest.php b/src/Symfony/Component/Stopwatch/Tests/StopwatchTest.php index f1e2270018447..f9b532efe1fe4 100644 --- a/src/Symfony/Component/Stopwatch/Tests/StopwatchTest.php +++ b/src/Symfony/Component/Stopwatch/Tests/StopwatchTest.php @@ -187,4 +187,9 @@ public function testReset() $this->assertEquals(new Stopwatch(), $stopwatch); } + + public function testShouldReturnEmptyArrayWhenSectionMissing() + { + $this->assertSame([], (new Stopwatch())->getSectionEvents('missing')); + } } diff --git a/src/Symfony/Component/String/AbstractUnicodeString.php b/src/Symfony/Component/String/AbstractUnicodeString.php index 979fcea895d68..cf280cdbac3c2 100644 --- a/src/Symfony/Com 10000 ponent/String/AbstractUnicodeString.php +++ b/src/Symfony/Component/String/AbstractUnicodeString.php @@ -135,15 +135,21 @@ public function ascii(array $rules = []): self } elseif (!\function_exists('iconv')) { $s = preg_replace('/[^\x00-\x7F]/u', '?', $s); } else { - $s = @preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) { - $c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]); - - if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) { - throw new \LogicException(\sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class)); - } + $previousLocale = setlocale(\LC_CTYPE, 0); + try { + setlocale(\LC_CTYPE, 'C'); + $s = @preg_replace_callback('/[^\x00-\x7F]/u', static function ($c) { + $c = (string) iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]); + + if ('' === $c && '' === iconv('UTF-8', 'ASCII//TRANSLIT', '²')) { + throw new \LogicException(\sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class)); + } - return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?'); - }, $s); + return 1 < \strlen($c) ? ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?'); + }, $s); + } finally { + setlocale(\LC_CTYPE, $previousLocale); + } } } diff --git a/src/Symfony/Component/String/Inflector/EnglishInflector.php b/src/Symfony/Component/String/Inflector/EnglishInflector.php index a5be28d66a31c..73db80c6fb37b 100644 --- a/src/Symfony/Component/String/Inflector/EnglishInflector.php +++ b/src/Symfony/Component/String/Inflector/EnglishInflector.php @@ -333,6 +333,9 @@ final class EnglishInflector implements InflectorInterface // conspectuses (conspectus), prospectuses (prospectus) ['sutcep', 6, true, true, 'pectuses'], + // nexuses (nexus) + ['suxen', 5, false, false, 'nexuses'], + // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) ['su', 2, true, true, 'i'], diff --git a/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php b/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php index c21a3ddf250a6..7604f3bcde645 100644 --- a/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php +++ b/src/Symfony/Component/String/Tests/Slugger/AsciiSluggerTest.php @@ -106,4 +106,19 @@ public static function provideSlugEmojiTests(): iterable 'undefined_locale', // Behaves the same as if emoji support is disabled ]; } + + /** + * @requires extension intl + */ + public function testSlugEmojiWithSetLocale() + { + if (!setlocale(LC_ALL, 'C.UTF-8')) { + $this->markTestSkipped('Unable to switch to the "C.UTF-8" locale.'); + } + + $slugger = new AsciiSlugger(); + $slugger = $slugger->withEmoji(true); + + $this->assertSame('a-and-a-go-to', (string) $slugger->slug('a 😺, 🐈‍⬛, and a 🦁 go to 🏞️... 😍 🎉 💛', '-')); + } } diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php b/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php index ad8bef86dea89..ec349d0725b29 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/LokaliseProvider.php @@ -113,6 +113,10 @@ public function delete(TranslatorBagInterface $translatorBag): void $keysIds += $this->getKeysIds($keysToDelete, $domain); } + if (!$keysIds) { + return; + } + $response = $this->client->request('DELETE', 'keys', [ 'json' => ['keys' => array_values($keysIds)], ]); @@ -245,6 +249,10 @@ private function updateTranslations(array $keysByDomain, TranslatorBagInterface } } + if (!$keysToUpdate) { + return; + } + $response = $this->client->request('PUT', 'keys', [ 'json' => ['keys' => $keysToUpdate], ]); diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php index bb03df7519c95..4966695b29c32 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderTest.php @@ -251,6 +251,56 @@ public function testCompleteWriteProcess() $this->assertTrue($updateProcessed, 'Translations update was not called.'); } + public function testUpdateProcessWhenLocalTranslationsMatchLokaliseTranslations() + { + $getLanguagesResponse = function (string $method, string $url): ResponseInterface { + $this->assertSame('GET', $method); + $this->assertSame('https://api.lokalise.com/api2/projects/PROJECT_ID/languages', $url); + + return new MockResponse(json_encode([ + 'languages' => [ + ['lang_iso' => 'en'], + ['lang_iso' => 'fr'], + ], + ])); + }; + + $failOnPutRequest = function (string $method, string $url, array $options = []): void { + $this->assertSame('PUT', $method); + $this->assertSame('https://api.lokalise.com/api2/projects/PROJECT_ID/keys', $url); + $this->assertSame(json_encode(['keys' => []]), $options['body']); + + $this->fail('PUT request is invalid: an empty `keys` array was provided, resulting in a Lokalise API error'); + }; + + $mockHttpClient = (new MockHttpClient([ + $getLanguagesResponse, + $failOnPutRequest, + ]))->withOptions([ + 'base_uri' => 'https://api.lokalise.com/api2/projects/PROJECT_ID/', + 'headers' => ['X-Api-Token' => 'API_KEY'], + ]); + + $provider = self::createProvider( + $mockHttpClient, + $this->getLoader(), + $this->getLogger(), + $this->getDefaultLocale(), + 'api.lokalise.com' + ); + + // TranslatorBag with catalogues that do not store any message to mimic the behaviour of + // Symfony\Component\Translation\Command\TranslationPushCommand when local translations and Lokalise + // translations match without any changes in both translation sets + $translatorBag = new TranslatorBag(); + $translatorBag->addCatalogue(new MessageCatalogue('en', [])); + $translatorBag->addCatalogue(new MessageCatalogue('fr', [])); + + $provider->write($translatorBag); + + $this->assertSame(1, $mockHttpClient->getRequestsCount()); + } + public function testWriteGetLanguageServerError() { $getLanguagesResponse = function (string $method, string $url, array $options = []): ResponseInterface { @@ -723,6 +773,38 @@ public function testDeleteProcess() $provider->delete($translatorBag); } + public function testDeleteProcessWhenLocalTranslationsMatchLokaliseTranslations() + { + $failOnDeleteRequest = function (string $method, string $url, array $options = []): void { + $this->assertSame('DELETE', $method); + $this->assertSame('https://api.lokalise.com/api2/projects/PROJECT_ID/keys', $url); + $this->assertSame(json_encode(['keys' => []]), $options['body']); + + $this->fail('DELETE request is invalid: an empty `keys` array was provided, resulting in a Lokalise API error'); + }; + + // TranslatorBag with catalogues that do not store any message to mimic the behaviour of + // Symfony\Component\Translation\Command\TranslationPushCommand when local translations and Lokalise + // translations match without any changes in both translation sets + $translatorBag = new TranslatorBag(); + $translatorBag->addCatalogue(new MessageCatalogue('en', [])); + $translatorBag->addCatalogue(new MessageCatalogue('fr', [])); + + $mockHttpClient = new MockHttpClient([$failOnDeleteRequest], 'https://api.lokalise.com/api2/projects/PROJECT_ID/'); + + $provider = self::createProvider( + $mockHttpClient, + $this->getLoader(), + $this->getLogger(), + $this->getDefaultLocale(), + 'api.lokalise.com' + ); + + $provider->delete($translatorBag); + + $this->assertSame(0, $mockHttpClient->getRequestsCount()); + } + public static function getResponsesForOneLocaleAndOneDomain(): \Generator { $arrayLoader = new ArrayLoader(); diff --git a/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php b/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php index b41394c193789..98444bcae04ad 100644 --- a/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php +++ b/src/Symfony/Component/Translation/Dumper/XliffFileDumper.php @@ -176,7 +176,7 @@ private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ? $metadata = $messages->getMetadata($source, $domain); // Add notes section - if ($this->hasMetadataArrayInfo('notes', $metadata)) { + if ($this->hasMetadataArrayInfo('notes', $metadata) && $metadata['notes']) { $notesElement = $dom->createElement('notes'); foreach ($metadata['notes'] as $note) { $n = $dom->createElement('note'); diff --git a/src/Symfony/Component/Translation/MessageCatalogue.php b/src/Symfony/Component/Translation/MessageCatalogue.php index 2d229f2dd1839..eac50bb1f9b9e 100644 --- a/src/Symfony/Component/Translation/MessageCatalogue.php +++ b/src/Symfony/Component/Translation/MessageCatalogue.php @@ -217,6 +217,16 @@ public function getMetadata(string $key = '', string $domain = 'messages'): mixe return $this->metadata; } + if (isset($this->metadata[$domain.self::INTL_DOMAIN_SUFFIX])) { + if ('' === $key) { + return $this->metadata[$domain.self::INTL_DOMAIN_SUFFIX]; + } + + if (isset($this->metadata[$domain.self::INTL_DOMAIN_SUFFIX][$key])) { + return $this->metadata[$domain.self::INTL_DOMAIN_SUFFIX][$key]; + } + } + if (isset($this->metadata[$domain])) { if ('' == $key) { return $this->metadata[$domain]; diff --git a/src/Symfony/Component/Translation/PseudoLocalizationTranslator.php b/src/Symfony/Component/Translation/PseudoLocalizationTranslator.php index 5d56d2cc11bd6..fe5b0adc25216 100644 --- a/src/Symfony/Component/Translation/PseudoLocalizationTranslator.php +++ b/src/Symfony/Component/Translation/PseudoLocalizationTranslator.php @@ -11,12 +11,13 @@ namespace Symfony\Component\Translation; +use Symfony\Component\Translation\Exception\LogicException; use Symfony\Contracts\Translation\TranslatorInterface; /** * This translator should only be used in a development environment. */ -final class PseudoLocalizationTranslator implements TranslatorInterface +final class PseudoLocalizationTranslator implements TranslatorInterface, TranslatorBagInterface { private const EXPANSION_CHARACTER = '~'; @@ -115,6 +116,24 @@ public function getLocale(): string return $this->translator->getLocale(); } + public function getCatalogue(?string $locale = null): MessageCatalogueInterface + { + if (!$this->translator instanceof TranslatorBagInterface) { + throw new LogicException(\sprintf('The "%s()" method cannot be called as the wrapped translator class "%s" does not implement the "%s".', __METHOD__, $this->translator::class, TranslatorBagInterface::class)); + } + + return $this->translator->getCatalogue($locale); + } + + public function getCatalogues(): array + { + if (!$this->translator instanceof TranslatorBagInterface) { + throw new LogicException(\sprintf('The "%s()" method cannot be called as the wrapped translator class "%s" does not implement the "%s".', __METHOD__, $this->translator::class, TranslatorBagInterface::class)); + } + + return $this->translator->getCatalogues(); + } + private function getParts(string $originalTrans): array { if (!$this->parseHTML) { diff --git a/src/Symfony/Component/Translation/Resources/data/parents.json b/src/Symfony/Component/Translation/Resources/data/parents.json index 24d4d119e9d29..c9e52fd983b0c 100644 --- a/src/Symfony/Component/Translation/Resources/data/parents.json +++ b/src/Symfony/Component/Translation/Resources/data/parents.json @@ -18,29 +18,35 @@ "en_CM": "en_001", "en_CX": "en_001", "en_CY": "en_001", + "en_CZ": "en_150", "en_DE": "en_150", "en_DG": "en_001", "en_DK": "en_150", "en_DM": "en_001", "en_ER": "en_001", + "en_ES": "en_150", "en_FI": "en_150", "en_FJ": "en_001", "en_FK": "en_001", "en_FM": "en_001", + "en_FR": "en_150", "en_GB": "en_001", "en_GD": "en_001", "en_GG": "en_001", "en_GH": "en_001", "en_GI": "en_001", "en_GM": "en_001", + "en_GS": "en_001", "en_GY": "en_001", "en_HK": "en_001", + "en_HU": "en_150", "en_ID": "en_001", "en_IE": "en_001", "en_IL": "en_001", "en_IM": "en_001", "en_IN": "en_001", "en_IO": "en_001", + "en_IT": "en_150", "en_JE": "en_001", "en_JM": "en_001", "en_KE": "en_001", @@ -62,13 +68,17 @@ "en_NF": "en_001", "en_NG": "en_001", "en_NL": "en_150", + "en_NO": "en_150", "en_NR": "en_001", "en_NU": "en_001", "en_NZ": "en_001", "en_PG": "en_001", "en_PK": "en_001", + "en_PL": "en_150", "en_PN": "en_001", + "en_PT": "en_150", "en_PW": "en_001", + "en_RO": "en_150", "en_RW": "en_001", "en_SB": "en_001", "en_SC": "en_001", @@ -77,6 +87,7 @@ "en_SG": "en_001", "en_SH": "en_001", "en_SI": "en_150", + "en_SK": "en_150", "en_SL": "en_001", "en_SS": "en_001", "en_SX": "en_001", diff --git a/src/Symfony/Component/Translation/Tests/Catalogue/MessageCatalogueTest.php b/src/Symfony/Component/Translation/Tests/Catalogue/MessageCatalogueTest.php new file mode 100644 index 0000000000000..1ac61673999b2 --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/Catalogue/MessageCatalogueTest.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Tests\Catalogue; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Translation\MessageCatalogue; + +class MessageCatalogueTest extends TestCase +{ + public function testIcuMetadataKept() + { + $mc = new MessageCatalogue('en', ['messages' => ['a' => 'new_a']]); + $metadata = ['metadata' => 'value']; + $mc->setMetadata('a', $metadata, 'messages+intl-icu'); + $this->assertEquals($metadata, $mc->getMetadata('a', 'messages')); + $this->assertEquals($metadata, $mc->getMetadata('a', 'messages+intl-icu')); + } +} diff --git a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php index 73e6681716def..fff7e94a0d4ec 100644 --- a/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php +++ b/src/Symfony/Component/Translation/Tests/Dumper/XliffFileDumperTest.php @@ -148,6 +148,24 @@ public function testDumpCatalogueWithXliffExtension() ); } + public function testEmptyMetadataNotes() + { + $catalogue = new MessageCatalogue('en_US'); + $catalogue->add([ + 'empty' => 'notes', + 'full' => 'notes', + ]); + $catalogue->setMetadata('empty', ['notes' => []]); + $catalogue->setMetadata('full', ['notes' => [['category' => 'file-source', 'priority' => 1, 'content' => 'test/path/to/translation/Example.1.html.twig:27']]]); + + $dumper = new XliffFileDumper(); + + $this->assertStringEqualsFile( + __DIR__.'/../Fixtures/resources-2.0-empty-notes.xlf', + $dumper->formatCatalogue($catalogue, 'messages', ['default_locale' => 'fr_FR', 'xliff_version' => '2.0']) + ); + } + public function testFormatCatalogueXliff2WithSegmentAttributes() { $catalogue = new MessageCatalogue('en_US'); diff --git a/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-empty-notes.xlf b/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-empty-notes.xlf new file mode 100644 index 0000000000000..7cba2cc09b41e --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/Fixtures/resources-2.0-empty-notes.xlf @@ -0,0 +1,20 @@ + + + + + + empty + notes + + + + + test/path/to/translation/Example.1.html.twig:27 + + + full + notes + + + + diff --git a/src/Symfony/Component/TypeInfo/README.md b/src/Symfony/Component/TypeInfo/README.md index b654e271a1c6b..d9b3a2e5bbf2f 100644 --- a/src/Symfony/Component/TypeInfo/README.md +++ b/src/Symfony/Component/TypeInfo/README.md @@ -15,6 +15,7 @@ composer require phpstan/phpdoc-parser # to support raw string resolving resolve('bool'); // returns a "bool" Type instance // Types can be instantiated thanks to static factories $type = Type::list(Type::nullable(Type::bool())); -// Type instances have several helper methods -$type->getBaseType(); // returns an "array" Type instance -$type->getCollectionKeyType(); // returns an "int" Type instance -$type->getCollectionValueType()->isNullable(); // returns true +// Type classes have their specific methods +Type::object(FooClass::class)->getClassName(); +Type::enum(FooEnum::class, Type::int())->getBackingType(); +Type::list(Type::int())->isList(); + +// Every type can be cast to string +(string) Type::generic(Type::object(Collection::class), Type::int()) // returns "Collection" + +// You can check that a type (or one of its wrapped/composed parts) is identified by one of some identifiers. +$type->isIdentifiedBy(Foo::class, Bar::class); +$type->isIdentifiedBy(TypeIdentifier::OBJECT); +$type->isIdentifiedBy('float'); + +// You can also check that a type satifies specific conditions +$type->isSatisfiedBy(fn (Type $type): bool => !$type->isNullable() && $type->isIdentifiedBy(TypeIdentifier::INT)); ``` Resources diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithPhpDoc.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithPhpDoc.php index 479ccfa2afc01..035457d12a95f 100644 --- a/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithPhpDoc.php +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/DummyWithPhpDoc.php @@ -9,6 +9,23 @@ final class DummyWithPhpDoc */ public mixed $arrayOfDummies = []; + /** + * @param bool $promoted + * @param bool $promotedVarAndParam + */ + public function __construct( + public mixed $promoted, + /** + * @var string + */ + public mixed $promotedVar, + /** + * @var string + */ + public mixed $promotedVarAndParam, + ) { + } + /** * @param Dummy $dummy * diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php new file mode 100644 index 0000000000000..77fb0b02966b7 --- /dev/null +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\TypeInfo\Tests\Fixtures; + +class ReflectionExtractableDummyUsingTrait +{ + use ReflectionExtractableTrait; +} diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php new file mode 100644 index 0000000000000..5bc33e0bbd315 --- /dev/null +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\TypeInfo\Tests\Fixtures; + +trait ReflectionExtractableTrait +{ + public self $self; + + public function getSelf(): self + { + return $this; + } + + public function setSelf(self $self): void + { + $this->self = $self; + } +} diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeFactoryTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeFactoryTest.php index 9e8796d09b3c4..50a6f5a2e6449 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeFactoryTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeFactoryTest.php @@ -195,6 +195,7 @@ public function testCreateNullable() { $this->assertEquals(new NullableType(new BuiltinType(TypeIdentifier::INT)), Type::nullable(Type::int())); $this->assertEquals(new NullableType(new BuiltinType(TypeIdentifier::INT)), Type::nullable(Type::nullable(Type::int()))); + $this->assertEquals(new BuiltinType(TypeIdentifier::MIXED), Type::nullable(Type::mixed())); $this->assertEquals( new NullableType(new UnionType(new BuiltinType(TypeIdentifier::INT), new BuiltinType(TypeIdentifier::STRING))), @@ -204,5 +205,9 @@ public function testCreateNullable() new NullableType(new UnionType(new BuiltinType(TypeIdentifier::INT), new BuiltinType(TypeIdentifier::STRING))), Type::nullable(Type::union(Type::int(), Type::string(), Type::null())), ); + $this->assertEquals( + new NullableType(new UnionType(new BuiltinType(TypeIdentifier::INT), new BuiltinType(TypeIdentifier::STRING))), + Type::union(Type::nullable(Type::int()), Type::string()), + ); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/PhpDocAwareReflectionTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/PhpDocAwareReflectionTypeResolverTest.php index 261fd19f18e96..996b04ff11238 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/PhpDocAwareReflectionTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/PhpDocAwareReflectionTypeResolverTest.php @@ -28,6 +28,9 @@ public function testReadPhpDoc() $reflection = new \ReflectionClass(DummyWithPhpDoc::class); $this->assertEquals(Type::array(Type::object(Dummy::class)), $resolver->resolve($reflection->getProperty('arrayOfDummies'))); + $this->assertEquals(Type::bool(), $resolver->resolve($reflection->getProperty('promoted'))); + $this->assertEquals(Type::string(), $resolver->resolve($reflection->getProperty('promotedVar'))); + $this->assertEquals(Type::string(), $resolver->resolve($reflection->getProperty('promotedVarAndParam'))); $this->assertEquals(Type::object(Dummy::class), $resolver->resolve($reflection->getMethod('getNextDummy'))); $this->assertEquals(Type::object(Dummy::class), $resolver->resolve($reflection->getMethod('getNextDummy')->getParameters()[0])); } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php index 41a46a899751e..e70106088db48 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionParameterTypeResolver; @@ -71,15 +73,29 @@ public function testResolveOptionalParameter() $this->assertEquals(Type::nullable(Type::int()), $this->resolver->resolve($reflectionParameter)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionParameter)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionParameter)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionParameter, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionParameter, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php index 6935f818b6f17..1c756884e697f 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionPropertyTypeResolver; @@ -52,15 +54,29 @@ public function testResolve() $this->assertEquals(Type::int(), $this->resolver->resolve($reflectionProperty)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionProperty = $reflectionClass->getProperty('self'); $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionProperty)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionProperty = $reflectionClass->getProperty('self'); + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionProperty)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionProperty = $reflectionClass->getProperty('self'); - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionProperty, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionProperty, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php index 691a7d710af8c..13bfa2561fc37 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionReturnTypeResolver; @@ -62,15 +64,29 @@ public function testResolve() $this->assertEquals(Type::int(), $this->resolver->resolve($reflectionFunction)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionFunction = $reflectionClass->getMethod('getSelf'); $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionFunction)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionFunction = $reflectionClass->getMethod('getSelf'); + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionFunction)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionFunction = $reflectionClass->getMethod('getSelf'); - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionFunction, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionFunction, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php index 4cadd5943e102..75116d97c2c3d 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php @@ -77,24 +77,35 @@ public function testCannotResolveNonProperReflectionType() $this->resolver->resolve(new \ReflectionClass(self::class)); } - /** - * @dataProvider classKeywordsTypesDataProvider - */ - public function testCannotResolveClassKeywordsWithoutTypeContext(\ReflectionType $reflection) + public function testCannotResolveStaticKeywordWithoutTypeContext() { + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getMethod('getStatic')->getReturnType(); + $this->expectException(InvalidArgumentException::class); - $this->resolver->resolve($reflection); + $this->resolver->resolve($subject); } - /** - * @return iterable - */ - public static function classKeywordsTypesDataProvider(): iterable + public function testResolveSelfKeywordWithoutTypeContext() { - $reflection = new \ReflectionClass(ReflectionExtractableDummy::class); + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getProperty('self')->getType(); + + if (\PHP_VERSION_ID >= 80500) { + $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($subject)); + } else { + $this->expectException(InvalidArgumentException::class); + $this->resolver->resolve($subject); + } + } + + public function testResolveParentKeywordsWithoutTypeContext() + { + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getProperty('parent')->getType(); - yield [$reflection->getProperty('self')->getType()]; - yield [$reflection->getMethod('getStatic')->getReturnType()]; - yield [$reflection->getProperty('parent')->getType()]; + if (\PHP_VERSION_ID >= 80500) { + $this->assertEquals(Type::object(AbstractDummy::class), $this->resolver->resolve($subject)); + } else { + $this->expectException(InvalidArgumentException::class); + $this->resolver->resolve($subject); + } } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php index b0ad600085e14..1ea0390339004 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php @@ -16,7 +16,9 @@ use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy; use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\DummyBackedEnum; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyCollection; +use Symfony\Component\TypeInfo\Tests\Fixtures\DummyEnum; use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithTemplates; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContext; @@ -138,6 +140,8 @@ public static function resolveDataProvider(): iterable yield [Type::object(Dummy::class), 'static', $typeContextFactory->createFromClassName(Dummy::class, AbstractDummy::class)]; yield [Type::object(AbstractDummy::class), 'parent', $typeContextFactory->createFromClassName(Dummy::class)]; yield [Type::object(Dummy::class), 'Dummy', $typeContextFactory->createFromClassName(Dummy::class)]; + yield [Type::enum(DummyEnum::class), 'DummyEnum', $typeContextFactory->createFromClassName(DummyEnum::class)]; + yield [Type::enum(DummyBackedEnum::class), 'DummyBackedEnum', $typeContextFactory->createFromClassName(DummyBackedEnum::class)]; yield [Type::template('T', Type::union(Type::int(), Type::string())), 'T', $typeContextFactory->createFromClassName(DummyWithTemplates::class)]; yield [Type::template('V'), 'V', $typeContextFactory->createFromReflection(new \ReflectionMethod(DummyWithTemplates::class, 'getPrice'))]; @@ -148,9 +152,14 @@ public static function resolveDataProvider(): iterable yield [Type::generic(Type::object(\DateTime::class), Type::string(), Type::bool()), \DateTime::class.'']; yield [Type::generic(Type::object(\DateTime::class), Type::generic(Type::object(\Stringable::class), Type::bool())), \sprintf('%s<%s>', \DateTime::class, \Stringable::class)]; yield [Type::int(), 'int<0, 100>']; + yield [Type::string(), \sprintf('value-of<%s>', DummyBackedEnum::class)]; + yield [Type::int(), 'key-of>']; + yield [Type::bool(), 'value-of>']; // union yield [Type::union(Type::int(), Type::string()), 'int|string']; + yield [Type::mixed(), 'int|mixed']; + yield [Type::mixed(), 'mixed|int']; // intersection yield [Type::intersection(Type::object(\DateTime::class), Type::object(\Stringable::class)), \DateTime::class.'&'.\Stringable::class]; @@ -201,9 +210,21 @@ public function testCannotResolveParentWithoutTypeContext() $this->resolver->resolve('parent'); } - public function testCannotUnknownIdentifier() + public function testCannotResolveUnknownIdentifier() { $this->expectException(UnsupportedException::class); $this->resolver->resolve('unknown'); } + + public function testCannotResolveKeyOfInvalidType() + { + $this->expectException(UnsupportedException::class); + $this->resolver->resolve('key-of'); + } + + public function testCannotResolveValueOfInvalidType() + { + $this->expectException(UnsupportedException::class); + $this->resolver->resolve('value-of'); + } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeTest.php index 6d60b5dc21eca..8b2bc4d900c48 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeTest.php @@ -13,6 +13,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Type; +use Symfony\Component\TypeInfo\Type\CollectionType; +use Symfony\Component\TypeInfo\Type\UnionType; use Symfony\Component\TypeInfo\TypeIdentifier; class TypeTest extends TestCase @@ -34,4 +36,12 @@ public function testIsNullable() $this->assertFalse(Type::int()->isNullable()); } + + public function testIsSatisfiedBy() + { + $this->assertTrue(Type::union(Type::int(), Type::string())->isSatisfiedBy(fn (Type $t): bool => 'int' === (string) $t)); + $this->assertTrue(Type::union(Type::int(), Type::string())->isSatisfiedBy(fn (Type $t): bool => $t instanceof UnionType)); + $this->assertTrue(Type::list(Type::int())->isSatisfiedBy(fn (Type $t): bool => $t instanceof CollectionType && 'int' === (string) $t->getCollectionValueType())); + $this->assertFalse(Type::list(Type::int())->isSatisfiedBy(fn (Type $t): bool => 'int' === (string) $t)); + } } diff --git a/src/Symfony/Component/TypeInfo/Type.php b/src/Symfony/Component/TypeInfo/Type.php index 2a39f14e7b5bf..c14b86263a784 100644 --- a/src/Symfony/Component/TypeInfo/Type.php +++ b/src/Symfony/Component/TypeInfo/Type.php @@ -29,6 +29,14 @@ abstract class Type implements \Stringable */ public function isSatisfiedBy(callable $specification): bool { + if ($this instanceof WrappingTypeInterface && $this->wrappedTypeIsSatisfiedBy($specification)) { + return true; + } + + if ($this instanceof CompositeTypeInterface && $this->composedTypesAreSatisfiedBy($specification)) { + return true; + } + return $specification($this); } @@ -37,19 +45,17 @@ public function isSatisfiedBy(callable $specification): bool */ public function isIdentifiedBy(TypeIdentifier|string ...$identifiers): bool { - $specification = static function (Type $type) use (&$specification, $identifiers): bool { - if ($type instanceof WrappingTypeInterface) { - return $type->wrappedTypeIsSatisfiedBy($specification); - } + $specification = static fn (Type $type): bool => $type->isIdentifiedBy(...$identifiers); - if ($type instanceof CompositeTypeInterface) { - return $type->composedTypesAreSatisfiedBy($specification); - } + if ($this instanceof WrappingTypeInterface && $this->wrappedTypeIsSatisfiedBy($specification)) { + return true; + } - return $type->isIdentifiedBy(...$identifiers); - }; + if ($this instanceof CompositeTypeInterface && $this->composedTypesAreSatisfiedBy($specification)) { + return true; + } - return $this->isSatisfiedBy($specification); + return false; } public function isNullable(): bool diff --git a/src/Symfony/Component/TypeInfo/Type/UnionType.php b/src/Symfony/Component/TypeInfo/Type/UnionType.php index fd11214fc306f..91597e2089e3b 100644 --- a/src/Symfony/Component/TypeInfo/Type/UnionType.php +++ b/src/Symfony/Component/TypeInfo/Type/UnionType.php @@ -45,7 +45,7 @@ public function __construct(Type ...$types) } if ($type instanceof BuiltinType) { - if ($type->getTypeIdentifier() === TypeIdentifier::NULL && !is_a(static::class, NullableType::class, allow_string: true)) { + if (TypeIdentifier::NULL === $type->getTypeIdentifier() && !is_a(static::class, NullableType::class, allow_string: true)) { throw new InvalidArgumentException(\sprintf('Cannot create union with "null", please use "%s" instead.', NullableType::class)); } diff --git a/src/Symfony/Component/TypeInfo/TypeFactoryTrait.php b/src/Symfony/Component/TypeInfo/TypeFactoryTrait.php index a1d7f8c43b461..b8e15f209fa00 100644 --- a/src/Symfony/Component/TypeInfo/TypeFactoryTrait.php +++ b/src/Symfony/Component/TypeInfo/TypeFactoryTrait.php @@ -266,6 +266,13 @@ public static function union(Type ...$types): UnionType $isNullable = fn (Type $type): bool => $type instanceof BuiltinType && TypeIdentifier::NULL === $type->getTypeIdentifier(); foreach ($types as $type) { + if ($type instanceof NullableType) { + $nullableUnion = true; + $unionTypes[] = $type->getWrappedType(); + + continue; + } + if ($type instanceof UnionType) { foreach ($type->getTypes() as $unionType) { if ($isNullable($type)) { @@ -330,11 +337,11 @@ public static function intersection(Type ...$types): IntersectionType * * @param T $type * - * @return ($type is NullableType ? T : NullableType) + * @return T|NullableType */ - public static function nullable(Type $type): NullableType + public static function nullable(Type $type): Type { - if ($type instanceof NullableType) { + if ($type->isNullable()) { return $type; } diff --git a/src/Symfony/Component/TypeInfo/TypeResolver/PhpDocAwareReflectionTypeResolver.php b/src/Symfony/Component/TypeInfo/TypeResolver/PhpDocAwareReflectionTypeResolver.php index 1037b4828f144..24aa20c7d7d72 100644 --- a/src/Symfony/Component/TypeInfo/TypeResolver/PhpDocAwareReflectionTypeResolver.php +++ b/src/Symfony/Component/TypeInfo/TypeResolver/PhpDocAwareReflectionTypeResolver.php @@ -64,36 +64,38 @@ public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type throw new UnsupportedException(\sprintf('Expected subject to be a "ReflectionProperty", a "ReflectionParameter" or a "ReflectionFunctionAbstract", "%s" given.', get_debug_type($subject)), $subject); } - $docComment = match (true) { - $subject instanceof \ReflectionProperty => $subject->getDocComment(), - $subject instanceof \ReflectionParameter => $subject->getDeclaringFunction()->getDocComment(), - $subject instanceof \ReflectionFunctionAbstract => $subject->getDocComment(), + $typeContext ??= $this->typeContextFactory->createFromReflection($subject); + + $docComments = match (true) { + $subject instanceof \ReflectionProperty => $subject->isPromoted() + ? ['@var' => $subject->getDocComment(), '@param' => $subject->getDeclaringClass()?->getConstructor()?->getDocComment()] + : ['@var' => $subject->getDocComment()], + $subject instanceof \ReflectionParameter => ['@param' => $subject->getDeclaringFunction()->getDocComment()], + $subject instanceof \ReflectionFunctionAbstract => ['@return' => $subject->getDocComment()], }; - if (!$docComment) { - return $this->reflectionTypeResolver->resolve($subject); - } + foreach ($docComments as $tagName => $docComment) { + if (!$docComment) { + continue; + } - $typeContext ??= $this->typeContextFactory->createFromReflection($subject); + $tokens = new TokenIterator($this->lexer->tokenize($docComment)); + $docNode = $this->phpDocParser->parse($tokens); - $tagName = match (true) { - $subject instanceof \ReflectionProperty => '@var', - $subject instanceof \ReflectionParameter => '@param', - $subject instanceof \ReflectionFunctionAbstract => '@return', - }; + foreach ($docNode->getTagsByName($tagName) as $tag) { + $tagValue = $tag->value; - $tokens = new TokenIterator($this->lexer->tokenize($docComment)); - $docNode = $this->phpDocParser->parse($tokens); + if ('@var' === $tagName && $tagValue instanceof VarTagValueNode) { + return $this->stringTypeResolver->resolve((string) $tagValue, $typeContext); + } - foreach ($docNode->getTagsByName($tagName) as $tag) { - $tagValue = $tag->value; + if ('@param' === $tagName && $tagValue instanceof ParamTagValueNode && '$'.$subject->getName() === $tagValue->parameterName) { + return $this->stringTypeResolver->resolve((string) $tagValue, $typeContext); + } - if ( - $tagValue instanceof VarTagValueNode - || $tagValue instanceof ParamTagValueNode && $tagName && '$'.$subject->getName() === $tagValue->parameterName - || $tagValue instanceof ReturnTagValueNode - ) { - return $this->stringTypeResolver->resolve((string) $tagValue, $typeContext); + if ('@return' === $tagName && $tagValue instanceof ReturnTagValueNode) { + return $this->stringTypeResolver->resolve((string) $tagValue, $typeContext); + } } } diff --git a/src/Symfony/Component/TypeInfo/TypeResolver/ReflectionTypeResolver.php b/src/Symfony/Component/TypeInfo/TypeResolver/ReflectionTypeResolver.php index 01b32b66f5777..23e6b3a2860a5 100644 --- a/src/Symfony/Component/TypeInfo/TypeResolver/ReflectionTypeResolver.php +++ b/src/Symfony/Component/TypeInfo/TypeResolver/ReflectionTypeResolver.php @@ -25,11 +25,6 @@ */ final class ReflectionTypeResolver implements TypeResolverInterface { - /** - * @var array - */ - private static array $reflectionEnumCache = []; - public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type { if ($subject instanceof \ReflectionUnionType) { @@ -81,11 +76,7 @@ public function resolve(mixed $subject, ?TypeContext $typeContext = null): Type default => $identifier, }; - if (is_subclass_of($className, \BackedEnum::class)) { - $reflectionEnum = (self::$reflectionEnumCache[$className] ??= new \ReflectionEnum($className)); - $backingType = $this->resolve($reflectionEnum->getBackingType(), $typeContext); - $type = Type::enum($className, $backingType); - } elseif (is_subclass_of($className, \UnitEnum::class)) { + if (is_subclass_of($className, \UnitEnum::class)) { $type = Type::enum($className); } else { $type = Type::object($className); diff --git a/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php b/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php index 1a8cdfac570a4..f219824dee1cf 100644 --- a/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php +++ b/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php @@ -38,6 +38,7 @@ use Symfony\Component\TypeInfo\Exception\InvalidArgumentException; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Type; +use Symfony\Component\TypeInfo\Type\BackedEnumType; use Symfony\Component\TypeInfo\Type\BuiltinType; use Symfony\Component\TypeInfo\Type\CollectionType; use Symfony\Component\TypeInfo\Type\GenericType; @@ -182,6 +183,28 @@ private function getTypeFromNode(TypeNode $node, ?TypeContext $typeContext): Typ } if ($node instanceof GenericTypeNode) { + if ($node->type instanceof IdentifierTypeNode && 'value-of' === $node->type->name) { + $type = $this->getTypeFromNode($node->genericTypes[0], $typeContext); + if ($type instanceof BackedEnumType) { + return $type->getBackingType(); + } + + if ($type instanceof CollectionType) { + return $type->getCollectionValueType(); + } + + throw new \DomainException(\sprintf('"%s" is not a valid type for "value-of".', $node->genericTypes[0])); + } + + if ($node->type instanceof IdentifierTypeNode && 'key-of' === $node->type->name) { + $type = $this->getTypeFromNode($node->genericTypes[0], $typeContext); + if ($type instanceof CollectionType) { + return $type->getCollectionKeyType(); + } + + throw new \DomainException(\sprintf('"%s" is not a valid type for "key-of".', $node->genericTypes[0])); + } + $type = $this->getTypeFromNode($node->type, $typeContext); // handle integer ranges as simple integers @@ -215,7 +238,7 @@ private function getTypeFromNode(TypeNode $node, ?TypeContext $typeContext): Typ }; } - if ($type instanceof BuiltinType && $type->getTypeIdentifier() !== TypeIdentifier::ARRAY && $type->getTypeIdentifier() !== TypeIdentifier::ITERABLE) { + if ($type instanceof BuiltinType && TypeIdentifier::ARRAY !== $type->getTypeIdentifier() && TypeIdentifier::ITERABLE !== $type->getTypeIdentifier()) { return $type; } @@ -223,7 +246,19 @@ private function getTypeFromNode(TypeNode $node, ?TypeContext $typeContext): Typ } if ($node instanceof UnionTypeNode) { - return Type::union(...array_map(fn (TypeNode $t): Type => $this->getTypeFromNode($t, $typeContext), $node->types)); + $types = []; + + foreach ($node->types as $nodeType) { + $type = $this->getTypeFromNode($nodeType, $typeContext); + + if ($type instanceof BuiltinType && TypeIdentifier::MIXED === $type->getTypeIdentifier()) { + return Type::mixed(); + } + + $types[] = $type; + } + + return Type::union(...$types); } if ($node instanceof IntersectionTypeNode) { @@ -246,14 +281,16 @@ private function resolveCustomIdentifier(string $identifier, ?TypeContext $typeC try { new \ReflectionClass($className); self::$classExistCache[$className] = true; - - return Type::object($className); } catch (\Throwable) { } } } if (self::$classExistCache[$className]) { + if (is_subclass_of($className, \UnitEnum::class)) { + return Type::enum($className); + } + return Type::object($className); } diff --git a/src/Symfony/Component/TypeInfo/composer.json b/src/Symfony/Component/TypeInfo/composer.json index a10b6d8785d0e..a246dd94f45fd 100644 --- a/src/Symfony/Component/TypeInfo/composer.json +++ b/src/Symfony/Component/TypeInfo/composer.json @@ -29,12 +29,7 @@ "psr/container": "^1.1|^2.0" }, "require-dev": { - "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/dependency-injection": "^6.4|^7.0" - }, - "conflict": { - "phpstan/phpdoc-parser": "<1.0", - "symfony/dependency-injection": "<6.4" + "phpstan/phpdoc-parser": "^1.0|^2.0" }, "autoload": { "psr-4": { "Symfony\\Component\\TypeInfo\\": "" }, diff --git a/src/Symfony/Component/Validator/Constraints/All.php b/src/Symfony/Component/Validator/Constraints/All.php index 1da939dd5559f..1284545849ac0 100644 --- a/src/Symfony/Component/Validator/Constraints/All.php +++ b/src/Symfony/Component/Validator/Constraints/All.php @@ -25,8 +25,8 @@ class All extends Composite public array|Constraint $constraints = []; /** - * @param array|array|null $constraints - * @param string[]|null $groups + * @param array|array|Constraint|null $constraints + * @param string[]|null $groups */ public function __construct(mixed $constraints = null, ?array $groups = null, mixed $payload = null) { diff --git a/src/Symfony/Component/Validator/Constraints/Count.php b/src/Symfony/Component/Validator/Constraints/Count.php index 175e07ebb8fdd..38ea8d6e74e71 100644 --- a/src/Symfony/Component/Validator/Constraints/Count.php +++ b/src/Symfony/Component/Validator/Constraints/Count.php @@ -45,7 +45,7 @@ class Count extends Constraint /** * @param int<0, max>|array|null $exactly The exact expected number of elements * @param int<0, max>|null $min Minimum expected number of elements - * @param positive-int|null $max Maximum expected number of elements + * @param int<0, max>|null $max Maximum expected number of elements * @param positive-int|null $divisibleBy The number the collection count should be divisible by * @param string[]|null $groups * @param array $options diff --git a/src/Symfony/Component/Validator/Constraints/IbanValidator.php b/src/Symfony/Component/Validator/Constraints/IbanValidator.php index e10b05e125a9b..866dcec1f3bba 100644 --- a/src/Symfony/Component/Validator/Constraints/IbanValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IbanValidator.php @@ -69,7 +69,7 @@ class IbanValidator extends ConstraintValidator 'DK' => 'DK\d{2}\d{4}\d{9}\d{1}', // Denmark 'DO' => 'DO\d{2}[\dA-Z]{4}\d{20}', // Dominican Republic 'DZ' => 'DZ\d{2}\d{22}', // Algeria - 'EE' => 'EE\d{2}\d{2}\d{2}\d{11}\d{1}', // Estonia + 'EE' => 'EE\d{2}\d{2}\d{14}', // Estonia 'EG' => 'EG\d{2}\d{4}\d{4}\d{17}', // Egypt 'ES' => 'ES\d{2}\d{4}\d{4}\d{1}\d{1}\d{10}', // Spain 'FI' => 'FI\d{2}\d{3}\d{11}', // Finland @@ -126,7 +126,7 @@ class IbanValidator extends ConstraintValidator 'MZ' => 'MZ\d{2}\d{21}', // Mozambique 'NC' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France 'NE' => 'NE\d{2}[A-Z]{2}\d{22}', // Niger - 'NI' => 'NI\d{2}[A-Z]{4}\d{24}', // Nicaragua + 'NI' => 'NI\d{2}[A-Z]{4}\d{20}', // Nicaragua 'NL' => 'NL\d{2}[A-Z]{4}\d{10}', // Netherlands (The) 'NO' => 'NO\d{2}\d{4}\d{6}\d{1}', // Norway 'OM' => 'OM\d{2}\d{3}[\dA-Z]{16}', // Oman @@ -150,7 +150,7 @@ class IbanValidator extends ConstraintValidator 'SM' => 'SM\d{2}[A-Z]{1}\d{5}\d{5}[\dA-Z]{12}', // San Marino 'SN' => 'SN\d{2}[A-Z]{2}\d{22}', // Senegal 'SO' => 'SO\d{2}\d{4}\d{3}\d{12}', // Somalia - 'ST' => 'ST\d{2}\d{4}\d{4}\d{11}\d{2}', // Sao Tome and Principe + 'ST' => 'ST\d{2}\d{8}\d{11}\d{2}', // Sao Tome and Principe 'SV' => 'SV\d{2}[A-Z]{4}\d{20}', // El Salvador 'TD' => 'TD\d{2}\d{23}', // Chad 'TF' => 'FR\d{2}\d{5}\d{5}[\dA-Z]{11}\d{2}', // France diff --git a/src/Symfony/Component/Validator/Constraints/Image.php b/src/Symfony/Component/Validator/Constraints/Image.php index 0e86cc4bf7b28..5812b9a4989a4 100644 --- a/src/Symfony/Component/Validator/Constraints/Image.php +++ b/src/Symfony/Component/Validator/Constraints/Image.php @@ -58,7 +58,7 @@ class Image extends File self::CORRUPTED_IMAGE_ERROR => 'CORRUPTED_IMAGE_ERROR', ]; - public array|string $mimeTypes = 'image/*'; + public array|string $mimeTypes = []; public ?int $minWidth = null; public ?int $maxWidth = null; public ?int $maxHeight = null; @@ -107,7 +107,7 @@ class Image extends File * @param positive-int|null $maxHeight Maximum image height * @param int<0, int>|null $minHeight Minimum image weight * @param positive-int|float|null $maxRatio Maximum image ratio - * @param int<0, max>|float|null $minRatio Minimum image ration + * @param int<0, max>|float|null $minRatio Minimum image ratio * @param int<0, max>|float|null $minPixels Minimum amount of pixels * @param positive-int|float|null $maxPixels Maximum amount of pixels * @param bool|null $allowSquare Whether to allow a square image (defaults to true) @@ -165,6 +165,8 @@ public function __construct( ?string $corruptedMessage = null, ?array $groups = null, mixed $payload = null, + array|string|null $extensions = null, + ?string $extensionsMessage = null, ) { parent::__construct( $options, @@ -187,7 +189,9 @@ public function __construct( $uploadExtensionErrorMessage, $uploadErrorMessage, $groups, - $payload + $payload, + $extensions, + $extensionsMessage, ); $this->minWidth = $minWidth ?? $this->minWidth; @@ -216,6 +220,10 @@ public function __construct( $this->allowPortraitMessage = $allowPortraitMessage ?? $this->allowPortraitMessage; $this->corruptedMessage = $corruptedMessage ?? $this->corruptedMessage; + if ([] === $this->mimeTypes && [] === $this->extensions) { + $this->mimeTypes = 'image/*'; + } + if (!\in_array('image/*', (array) $this->mimeTypes, true) && !\array_key_exists('mimeTypesMessage', $options ?? []) && null === $mimeTypesMessage) { $this->mimeTypesMessage = 'The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.'; } diff --git a/src/Symfony/Component/Validator/Constraints/Regex.php b/src/Symfony/Component/Validator/Constraints/Regex.php index 4a2a90610cf44..d10cb5fa8a1d2 100644 --- a/src/Symfony/Component/Validator/Constraints/Regex.php +++ b/src/Symfony/Component/Validator/Constraints/Regex.php @@ -38,7 +38,7 @@ class Regex extends Constraint /** * @param string|array|null $pattern The regular expression to match * @param string|null $htmlPattern The pattern to use in the HTML5 pattern attribute - * @param bool|null $match Whether to validate the value matches the configured pattern or not (defaults to false) + * @param bool|null $match Whether to validate the value matches the configured pattern or not (defaults to true) * @param string[]|null $groups * @param array $options */ diff --git a/src/Symfony/Component/Validator/Constraints/Type.php b/src/Symfony/Component/Validator/Constraints/Type.php index 0482ff253d423..eb410bb8ad955 100644 --- a/src/Symfony/Component/Validator/Constraints/Type.php +++ b/src/Symfony/Component/Validator/Constraints/Type.php @@ -31,9 +31,9 @@ class Type extends Constraint public string|array|null $type = null; /** - * @param string|string[]|array|null $type The type(s) to enforce on the value - * @param string[]|null $groups - * @param array $options + * @param string|list|array|null $type The type(s) to enforce on the value + * @param string[]|null $groups + * @param array $options */ public function __construct(string|array|null $type, ?string $message = null, ?array $groups = null, mixed $payload = null, array $options = []) { diff --git a/src/Symfony/Component/Validator/Constraints/UniqueValidator.php b/src/Symfony/Component/Validator/Constraints/UniqueValidator.php index 408088c7ef709..8977fd2210809 100644 --- a/src/Symfony/Component/Validator/Constraints/UniqueValidator.php +++ b/src/Symfony/Component/Validator/Constraints/UniqueValidator.php @@ -47,11 +47,15 @@ public function validate(mixed $value, Constraint $constraint): void } if (\in_array($element, $collectionElements, true)) { - $this->context->buildViolation($constraint->message) - ->atPath("[$index]".(null !== $constraint->errorPath ? ".{$constraint->errorPath}" : '')) + $violationBuilder = $this->context->buildViolation($constraint->message) ->setParameter('{{ value }}', $this->formatValue($element)) - ->setCode(Unique::IS_NOT_UNIQUE) - ->addViolation(); + ->setCode(Unique::IS_NOT_UNIQUE); + + if (null !== $constraint->errorPath) { + $violationBuilder->atPath("[$index].{$constraint->errorPath}"); + } + + $violationBuilder->addViolation(); return; } diff --git a/src/Symfony/Component/Validator/Constraints/UrlValidator.php b/src/Symfony/Component/Validator/Constraints/UrlValidator.php index 14a0981beef69..0716b11733111 100644 --- a/src/Symfony/Component/Validator/Constraints/UrlValidator.php +++ b/src/Symfony/Component/Validator/Constraints/UrlValidator.php @@ -26,9 +26,14 @@ class UrlValidator extends ConstraintValidator (((?:[\_\.\pL\pN-]|%%[0-9A-Fa-f]{2})+:)?((?:[\_\.\pL\pN-]|%%[0-9A-Fa-f]{2})+)@)? # basic auth ( (?: - (?:xn--[a-z0-9-]++\.)*+xn--[a-z0-9-]++ # a domain name using punycode - | - (?:[\pL\pN\pS\pM\-\_]++\.)+[\pL\pN\pM]++ # a multi-level domain name + (?: + (?:[\pL\pN\pS\pM\-\_]++\.)+ + (?: + (?:xn--[a-z0-9-]++) # punycode in tld + | + (?:[\pL\pN\pM]++) # no punycode in tld + ) + ) # a multi-level domain name | [a-z0-9\-\_]++ # a single-level domain name )\.? diff --git a/src/Symfony/Component/Validator/Constraints/WordCountValidator.php b/src/Symfony/Component/Validator/Constraints/WordCountValidator.php index ee090de2648de..0fe6e885adb7d 100644 --- a/src/Symfony/Component/Validator/Constraints/WordCountValidator.php +++ b/src/Symfony 10000 /Component/Validator/Constraints/WordCountValidator.php @@ -44,7 +44,7 @@ public function validate(mixed $value, Constraint $constraint): void $words = iterator_to_array($iterator->getPartsIterator()); // erase "blank words" and don't count them as words - $wordsCount = \count(array_filter(array_map(trim(...), $words))); + $wordsCount = \count(array_filter(array_map(trim(...), $words), fn ($word) => '' !== $word)); if (null !== $constraint->min && $wordsCount < $constraint->min) { $this->context->buildViolation($constraint->minMessage) diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf index 706f0ca49716b..9f53b1afe35c3 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.af.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Hierdie waarde is te kort. Dit moet ten minste een woord bevat.|Hierdie waarde is te kort. Dit moet ten minste {{ min }} woorde bevat. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Hierdie waarde is te lank. Dit moet een woord bevat.,Hierdie waarde is te lank. Dit moet {{ max }} woorde of minder bevat. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Hierdie waarde stel nie 'n geldige week in die ISO 8601-formaat voor nie. This value is not a valid week. - This value is not a valid week. + Hierdie waarde is nie 'n geldige week nie. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Hierdie waarde mag nie voor week "{{ min }}" wees nie. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Hierdie waarde mag nie na week "{{ max }}" kom nie. + + + This value is not a valid Twig template. + Hierdie waarde is nie 'n geldige Twig-sjabloon nie. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf index 6c684d98df31b..827eed1bcc86e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ar.xlf @@ -8,7 +8,7 @@ This value should be true. - هذه القيمة يجب أن تكون حقيقية. + هذه القيمة يجب أن تكون صحيحة. This value should be of type {{ type }}. @@ -20,7 +20,7 @@ The value you selected is not a valid choice. - القيمة المختارة ليست خيارا صحيحا. + القيمة المختارة ليست خيار صحيح. You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices. @@ -36,23 +36,23 @@ This field was not expected. - لم يكن من المتوقع هذا المجال. + لم يكن من المتوقع هذا الحقل. This field is missing. - هذا المجال مفقود. + هذا الحقل مفقود. This value is not a valid date. - هذه القيمة ليست تاريخا صالحا. + هذه القيمة ليست تاريخ صالح. This value is not a valid datetime. - هذه القيمة ليست تاريخا و وقتا صالحا. + هذه القيمة ليست تاريخ و وقت صالح. This value is not a valid email address. - هذه القيمة ليست عنوان بريد إلكتروني صحيح. + هذه القيمة ليست لها عنوان بريد إلكتروني صحيح. The file could not be found. @@ -88,11 +88,11 @@ This value should not be blank. - هذه القيمة يجب الا تكون فارغة. + هذه القيمة يجب لا تكون فارغة. This value should not be null. - هذه القيمة يجب الا تكون فارغة. + هذه القيمة يجب لا تكون فارغة. This value should be null. @@ -124,7 +124,7 @@ The file could not be uploaded. - لم استطع استقبال الملف. + تعذر تحميل الملف. This value should be a valid number. @@ -132,7 +132,7 @@ This file is not a valid image. - هذا الملف ليس صورة صحيحة. + هذا الملف غير صالح للصورة. This value is not a valid IP address. @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + هذه القيمة قصيرة جدًا. يجب أن تحتوي على كلمة واحدة على الأقل.|هذه القيمة قصيرة جدًا. يجب أن تحتوي على {{ min }} كلمة على الأقل. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + هذه القيمة طويلة جدًا. يجب أن تحتوي على كلمة واحدة فقط.|هذه القيمة طويلة جدًا. يجب أن تحتوي على {{ max }} كلمة أو أقل. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + هذه القيمة لا تمثل أسبوعًا صالحًا وفق تنسيق ISO 8601. This value is not a valid week. - This value is not a valid week. + هذه القيمة ليست أسبوعًا صالحًا. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + يجب ألا تكون هذه القيمة قبل الأسبوع "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + يجب ألا تكون هذه القيمة بعد الأسبوع "{{ max }}". + + + This value is not a valid Twig template. + هذه القيمة ليست نموذج Twig صالح. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf index 0b149024ca2dd..9332c9ec2fd93 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.az.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Bu dəyər çox qısadır. Heç olmasa bir söz daxil etməlisiniz.|Bu dəyər çox qısadır. Heç olmasa {{ min }} söz daxil etməlisiniz. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Bu dəyər çox uzundur. Yalnız bir söz daxil etməlisiniz.|Bu dəyər çox uzundur. {{ max }} və ya daha az söz daxil etməlisiniz. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Bu dəyər ISO 8601 formatında etibarlı bir həftəni təmsil etmir. This value is not a valid week. - This value is not a valid week. + Bu dəyər etibarlı bir həftə deyil. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Bu dəyər "{{ min }}" həftəsindən əvvəl olmamalıdır. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Bu dəyər "{{ max }}" həftəsindən sonra olmamalıdır. + + + This value is not a valid Twig template. + Bu dəyər etibarlı Twig şablonu deyil. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.be.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.be.xlf index 3db0ddc20f3d5..7b24df5e5c189 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.be.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.be.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - Гэта значэнне не з'яўляецца сапраўдным IP-адрасам. + Гэта значэнне не з'яўляецца сапраўдным IP-адрасам. This value is not a valid language. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Гэта значэнне не з'яўляецца сапраўдным міжнародным нумарам банкаўскага рахунку (IBAN). + Гэта значэнне не з'яўляецца сапраўдным міжнародным нумарам банкаўскага рахунку (IBAN). This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Гэта значэнне не з'яўляецца сапраўдным кодам ідэнтыфікацыі бізнесу (BIC). + Гэта значэнне не з'яўляецца сапраўдным кодам ідэнтыфікацыі банка (BIC). Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Гэта значэнне не з'яўляецца сапраўдным UUID. + Гэта значэнне не з'яўляецца сапраўдным UUID. This value should be a multiple of {{ compared_value }}. @@ -428,43 +428,47 @@ The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}. - Пашырэнне файла няслушнае ({{ extension }}). Дазволеныя пашырэнні: {{ extensions }}. + Пашырэнне файла недапушчальнае ({{ extension }}). Дазволеныя пашырэнні: {{ extensions }}. The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - Выяўленая кадыроўка знакаў няслушная ({{ detected }}). Дазволеныя кадыроўкі: {{ encodings }}. + Выяўленая кадзіроўка недапушчальная ({{ detected }}). Дазволеныя кадзіроўкі: {{ encodings }}. This value is not a valid MAC address. - Гэта значэнне не з'яўляецца сапраўдным MAC-адрасам. + Гэта значэнне не з'яўляецца сапраўдным MAC-адрасам. This URL is missing a top-level domain. - Гэтаму URL бракуе дамен верхняга ўзроўню. + Гэтаму URL бракуе дамен верхняга ўзроўню. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б адно слова.|Гэта значэнне занадта кароткае. Яно павінна ўтрымліваць хаця б {{ min }} слоў. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Гэта значэнне занадта доўгае. Яно павінна ўтрымліваць адно слова.|Гэта значэнне занадта доўгае. Яно павінна ўтрымліваць {{ max }} слоў або менш. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Гэта значэнне не адпавядае сапраўднаму тыдню ў фармаце ISO 8601. This value is not a valid week. - This value is not a valid week. + Гэта значэнне не з'яўляецца сапраўдным тыднем. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Гэта значэнне не павінна быць раней за тыдзень "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Гэта значэнне не павінна быць пасля тыдня "{{ max }}". + + + This value is not a valid Twig template. + Гэта значэнне не з'яўляецца сапраўдным шаблонам Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf index e0792e209561f..afd7590f51cb9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Тази стойност е твърде кратка. Трябва да съдържа поне една дума.|Тази стойност е твърде кратка. Трябва да съдържа поне {{ min }} думи. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Тази стойност е твърде дълга. Трябва да съдържа само една дума.|Тази стойност е твърде дълга. Трябва да съдържа {{ max }} думи или по-малко. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Тази стойност не представлява валидна седмица във формат ISO 8601. This value is not a valid week. - This value is not a valid week. + Тази стойност не е валидна седмица. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Тази стойност не трябва да бъде преди седмица "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Тази стойност не трябва да бъде след седмица "{{ max }}". + + + This value is not a valid Twig template. + Тази стойност не е валиден Twig шаблон. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf index 150025d03a6ac..d6b7de5768ee5 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.bs.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Ova vrijednost je prekratka. Trebala bi sadržavati barem jednu riječ.|Ova vrijednost je prekratka. Trebala bi sadržavati barem {{ min }} riječi. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Ova vrijednost je predugačka. Trebala bi sadržavati samo jednu riječ.|Ova vrijednost je predugačka. Trebala bi sadržavati {{ max }} riječi ili manje. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ova vrijednost ne predstavlja valjani tjedan u ISO 8601 formatu. This value is not a valid week. - This value is not a valid week. + Ova vrijednost nije važeća sedmica. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ova vrijednost ne smije biti prije tjedna "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ova vrijednost ne bi trebala biti nakon sedmice "{{ max }}". + + + This value is not a valid Twig template. + Ova vrijednost nije važeći Twig šablon. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf index cc3aa08d91bf0..d656ef540f825 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ca.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Aquest valor no ha de ser posterior a la setmana "{{ max }}". + + This value is not a valid Twig template. + Aquest valor no és una plantilla Twig vàlida. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf index 641ce854117d2..d5f48f0ae7ff2 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Tato hodnota by neměla být týden za "{{ max }}". + + This value is not a valid Twig template. + Tato hodnota není platná Twig šablona. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf index 667f4a6d453d0..08a76667d5f4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.cy.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys o leiaf un gair.|Mae'r gwerth hwn yn rhy fyr. Dylai gynnwys o leiaf {{ min }} gair. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Mae'r gwerth hwn yn rhy hir. Dylai gynnwys un gair yn unig.|Mae'r gwerth hwn yn rhy hir. Dylai gynnwys {{ max }} gair neu lai. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Nid yw'r gwerth hwn yn cynrychioli wythnos dilys yn fformat ISO 8601. This value is not a valid week. - This value is not a valid week. + Nid yw'r gwerth hwn yn wythnos ddilys. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ni ddylai'r gwerth hwn fod cyn wythnos "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ni ddylai'r gwerth hwn fod ar ôl yr wythnos "{{ max }}". + + + This value is not a valid Twig template. + Nid yw'r gwerth hwn yn dempled Twig dilys. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf index 5d08a01df77b1..bb05bba2e641c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.da.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Denne værdi er for kort. Den skal indeholde mindst ét ord.|Denne værdi er for kort. Den skal indeholde mindst {{ min }} ord. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Denne værdi er for lang. Den skal indeholde ét ord.|Denne værdi er for lang. Den skal indeholde {{ max }} ord eller færre. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Denne værdi repræsenterer ikke en gyldig uge i ISO 8601-formatet. This value is not a valid week. - This value is not a valid week. + Denne værdi er ikke en gyldig uge. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Denne værdi bør ikke være før uge "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Denne værdi bør ikke være efter uge "{{ max }}". + + + This value is not a valid Twig template. + Denne værdi er ikke en gyldig Twig-skabelon. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf index 301ee496e68e6..f02c56c6c5ca9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.de.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Dieser Wert darf nicht nach der Woche "{{ max }}" sein. + + This value is not a valid Twig template. + Dieser Wert ist kein valides Twig-Template. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf index e58dd3d77e7fe..9aec12ff82ce7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.el.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Αυτή η τιμή είναι πολύ σύντομη. Πρέπει να περιέχει τουλάχιστον μία λέξη.|Αυτή η τιμή είναι πολύ σύντομη. Πρέπει να περιέχει τουλάχιστον {{ min }} λέξεις. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Αυτή η τιμή είναι πολύ μεγάλη. Πρέπει να περιέχει μόνο μία λέξη.|Αυτή η τιμή είναι πολύ μεγάλη. Πρέπει να περιέχει {{ max }} λέξεις ή λιγότερες. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Αυτή η τιμή δεν αντιπροσωπεύει έγκυρη εβδομάδα στη μορφή ISO 8601. This value is not a valid week. - This value is not a valid week. + Αυτή η τιμή δεν είναι έγκυρη εβδομάδα. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Αυτή η τιμή δεν πρέπει να είναι πριν από την εβδομάδα "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Αυτή η τιμή δεν πρέπει να είναι μετά την εβδομάδα "{{ max }}". + + + This value is not a valid Twig template. + Αυτή η τιμή δεν είναι έγκυρο πρότυπο Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf index faf549e483512..f8c664f18c423 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.en.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". This value should not be after week "{{ max }}". + + This value is not a valid Twig template. + This value is not a valid Twig template. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf index 4e1ec3a5ce801..a9ad8a76b11e9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.es.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Este valor no debe ser posterior a la semana "{{ max }}". + + This value is not a valid Twig template. + Este valor no es una plantilla Twig válida. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf index 774445dd02c62..2375aa4ade30c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.et.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + See väärtus on liiga lühike. See peaks sisaldama vähemalt ühte sõna.|See väärtus on liiga lühike. See peaks sisaldama vähemalt {{ min }} sõna. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + See väärtus on liiga pikk. See peaks sisaldama ainult ühte sõna.|See väärtus on liiga pikk. See peaks sisaldama {{ max }} sõna või vähem. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + See väärtus ei esinda kehtivat nädalat ISO 8601 formaadis. This value is not a valid week. - This value is not a valid week. + See väärtus ei ole kehtiv nädal. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + See väärtus ei tohiks olla enne nädalat "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + See väärtus ei tohiks olla pärast nädalat "{{ max }}". + + + This value is not a valid Twig template. + See väärtus ei ole kehtiv Twig'i mall. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf index 3e1a544c89053..830f8673dff94 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.eu.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Balio hau oso laburra da. Gutxienez hitz bat izan behar du.|Balio hau oso laburra da. Gutxienez {{ min }} hitz izan behar ditu. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Balio hau oso luzea da. Hitz bat bakarrik izan behar du.|Balio hau oso luzea da. {{ max }} hitz edo gutxiago izan behar ditu. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Balio honek ez du ISO 8601 formatuan aste baliozko bat adierazten. This value is not a valid week. - This value is not a valid week. + Balio hau ez da aste balioduna. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Balio hau ez luke aste "{{ min }}" baino lehenagokoa izan behar. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Balio hau ez luke astearen "{{ max }}" ondoren egon behar. + + + This value is not a valid Twig template. + Balio hau ez da Twig txantiloi baliozko bat. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf index 3977f37433060..f47633fd4a624 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fa.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + این مقدار بسیار کوتاه است. باید حداقل یک کلمه داشته باشد.|این مقدار بسیار کوتاه است. باید حداقل {{ min }} کلمه داشته باشد. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + این مقدار بیش از حد طولانی است. باید فقط یک کلمه باشد.|این مقدار بیش از حد طولانی است. باید حداکثر {{ max }} کلمه داشته باشد. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + این مقدار یک هفته معتبر در قالب ISO 8601 را نشان نمی‌دهد. This value is not a valid week. - This value is not a valid week. + این مقدار یک هفته معتبر نیست. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + این مقدار نباید قبل از هفته "{{ min }}" باشد. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + این مقدار نباید بعد از هفته "{{ max }}" باشد. + + + This value is not a valid Twig template. + این مقدار یک قالب معتبر Twig نیست. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf index 2dac5b5b8af24..c046963f7ec66 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fi.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Tämä arvo on liian lyhyt. Sen pitäisi sisältää vähintään yksi sana.|Tämä arvo on liian lyhyt. Sen pitäisi sisältää vähintään {{ min }} sanaa. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Tämä arvo on liian pitkä. Sen pitäisi sisältää vain yksi sana.|Tämä arvo on liian pitkä. Sen pitäisi sisältää {{ max }} sanaa tai vähemmän. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Tämä arvo ei esitä kelvollista viikkoa ISO 8601 -muodossa. This value is not a valid week. - This value is not a valid week. + Tämä arvo ei ole kelvollinen viikko. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Tämän arvon ei pitäisi olla ennen viikkoa "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Tämän arvon ei pitäisi olla viikon "{{ max }}" jälkeen. + + + This value is not a valid Twig template. + Tämä arvo ei ole kelvollinen Twig-malli. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf index 2fb4eeac18725..13033c01973c8 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.fr.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Cette valeur ne doit pas être postérieure à la semaine "{{ max }}". + + This value is not a valid Twig template. + Cette valeur n'est pas un modèle Twig valide. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf index 1a48093dca758..391d741e96564 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.gl.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Este valor é demasiado curto. Debe conter polo menos unha palabra.|Este valor é demasiado curto. Debe conter polo menos {{ min }} palabras. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Este valor é demasiado longo. Debe conter só unha palabra.|Este valor é demasiado longo. Debe conter {{ max }} palabras ou menos. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Este valor non representa unha semana válida no formato ISO 8601. This value is not a valid week. - This value is not a valid week. + Este valor non é unha semana válida. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Este valor non debe ser anterior á semana "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Este valor non debe estar despois da semana "{{ max }}". + + + This value is not a valid Twig template. + Este valor non é un modelo Twig válido. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf index 73ccca53f2acd..671a98881536e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.he.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - ערך זה אינו כתובת IP תקפה. + ערך זה אינו כתובת IP תקפה. This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - לא הוגדרה תיקייה זמנית ב-php.ini, או שהתיקייה המוגדרת אינה קיימת. + לא הוגדרה תיקייה זמנית ב-php.ini, או שהתיקייה המוגדרת אינה קיימת. Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - ערך זה אינו מספר חשבון בנק בי 10000 נלאומי (IBAN) תקף. + ערך זה אינו מספר זה"ב (IBAN) תקף. This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - ערך זה אינו קוד מזהה עסקי (BIC) תקף. + ערך זה אינו קוד מזהה עסקי (BIC) תקף. Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - ערך זה אינו UUID תקף. + ערך זה אינו UUID תקף. This value should be a multiple of {{ compared_value }}. @@ -404,39 +404,39 @@ The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less. - שם הקובץ ארוך מדי. עליו להכיל {{ filename_max_length }} תווים או פחות. + שם הקובץ ארוך מדי. עליו להכיל {{ filename_max_length }} תווים או פחות. The password strength is too low. Please use a stronger password. - חוזק הסיסמה נמוך מדי. אנא השתמש בסיסמה חזקה יותר. + חוזק הסיסמה נמוך מדי. אנא השתמש בסיסמה חזקה יותר. This value contains characters that are not allowed by the current restriction-level. - הערך כולל תווים שאינם מותרים על פי רמת ההגבלה הנוכחית. + הערך כולל תווים שאינם מותרים על פי רמת ההגבלה הנוכחית. Using invisible characters is not allowed. - אסור להשתמש בתווים בלתי נראים. + אסור להשתמש בתווים בלתי נראים. Mixing numbers from different scripts is not allowed. - אסור לערבב מספרים מתסריטים שונים. + אסור לערבב מספרים מסקריפטים שונים. Using hidden overlay characters is not allowed. - אסור להשתמש בתווים מוסתרים של חפיפה. + אסור להשתמש בתווים חופפים נסתרים. The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}. - סיומת הקובץ אינה תקינה ({{ extension }}). הסיומות המותרות הן {{ extensions }}. + סיומת הקובץ אינה תקינה ({{ extension }}). הסיומות המותרות הן {{ extensions }}. The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - קידוד התווים שזוהה אינו חוקי ({{ detected }}). הקידודים המותרים הם {{ encodings }}. + קידוד התווים שזוהה אינו חוקי ({{ detected }}). הקידודים המותרים הם {{ encodings }}. This value is not a valid MAC address. - ערך זה אינו כתובת MAC תקפה. + ערך זה אינו כתובת MAC תקפה. This URL is missing a top-level domain. @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + ערך זה קצר מדי. הוא צריך להכיל לפחות מילה אחת.|ערך זה קצר מדי. הוא צריך להכיל לפחות {{ min }} מילים. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + ערך זה ארוך מדי. הוא צריך להכיל רק מילה אחת.|ערך זה ארוך מדי. הוא צריך להכיל {{ max }} מילים או פחות. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + ערך זה אינו מייצג שבוע תקף בפורמט ISO 8601. This value is not a valid week. - This value is not a valid week. + ערך זה אינו שבוע חוקי. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + ערך זה לא אמור להיות לפני שבוע "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + ערך זה לא אמור להיות לאחר שבוע "{{ max }}". + + + This value is not a valid Twig template. + ערך זה אינו תבנית Twig חוקית. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf index 147f4313c8a5e..0951d41926514 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hr.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Ova vrijednost je prekratka. Trebala bi sadržavati barem jednu riječ.|Ova vrijednost je prekratka. Trebala bi sadržavati barem {{ min }} riječi. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Ova vrijednost je predugačka. Trebala bi sadržavati samo jednu riječ.|Ova vrijednost je predugačka. Trebala bi sadržavati {{ max }} riječi ili manje. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ova vrijednost ne predstavlja valjani tjedan u ISO 8601 formatu. This value is not a valid week. - This value is not a valid week. + Ova vrijednost nije valjani tjedan. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ova vrijednost ne bi trebala biti prije tjedna "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ova vrijednost ne bi trebala biti nakon tjedna "{{ max }}". + + + This value is not a valid Twig template. + Ova vrijednost nije valjani Twig predložak. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf index 185ebf02b57ee..dffab0ccbf700 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hu.xlf @@ -408,7 +408,7 @@ The password strength is too low. Please use a stronger password. - A jelszó túl egyszerű. Kérjük, használjon egy bonyolultabb jelszót. + A jelszó túl egyszerű. Kérjük, használjon egy erősebb jelszót. This value contains characters that are not allowed by the current restriction-level. @@ -416,7 +416,7 @@ Using invisible characters is not allowed. - Láthatatlan karaktert használata nem megengedett. + Láthatatlan karakterek használata nem megengedett. Mixing numbers from different scripts is not allowed. @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Ez az érték túl rövid. Tartalmaznia kell legalább egy szót.|Ez az érték túl rövid. Tartalmaznia kell legalább {{ min }} szót. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Ez az érték túl hosszú. Csak egy szót tartalmazhat.|Ez az érték túl hosszú. Legfeljebb {{ max }} szót vagy kevesebbet tartalmazhat. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ez a érték érvénytelen hetet jelent az ISO 8601 formátumban. This value is not a valid week. - This value is not a valid week. + Ez az érték érvénytelen hét. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ez az érték nem lehet a "{{ min }}". hétnél korábbi. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ez az érték nem lehet a "{{ max }}". hétnél későbbi. + + + This value is not a valid Twig template. + Ez az érték nem érvényes Twig sablon. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf index 24423b0822e68..856babbd5fe4e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.hy.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե մեկ բառ.|Այս արժեքը շատ կարճ է: պետք է պարունակի գոնե {{ min }} բառեր: This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Այս արժեքը շատ երկար է: պետք է պարունակի միայն մեկ բառ.|Այս արժեքը շատ երկար է: պետք է պարունակի {{ max }} բառ կամ ավելի քիչ: This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Այս արժեքը չի ներկայացնում ISO 8601 ձևաչափով գործող շաբաթ։ This value is not a valid week. - This value is not a valid week. + Այս արժեքը վավեր շաբաթ չէ: This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Այս արժեքը չպետք է լինի «{{ min }}» շաբաթից առաջ։ This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Այս արժեքը չպետք է լինի «{{ max }}» շաբաթից հետո։ + + + This value is not a valid Twig template. + Այս արժեքը վավեր Twig ձևանմուշ չէ: diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf index 3bffae84d63c7..b9796f888f924 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.id.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Nilai ini terlalu pendek. Seharusnya berisi setidaknya satu kata.|Nilai ini terlalu pendek. Seharusnya berisi setidaknya {{ min }} kata. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Nilai ini terlalu panjang. Seharusnya hanya berisi satu kata.|Nilai ini terlalu panjang. Seharusnya berisi {{ max }} kata atau kurang. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Nilai ini tidak mewakili minggu yang valid dalam format ISO 8601. This value is not a valid week. - This value is not a valid week. + Nilai ini bukan minggu yang valid. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Nilai ini tidak boleh sebelum minggu "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Nilai ini tidak boleh setelah minggu "{{ max }}". + + + This value is not a valid Twig template. + Nilai ini bukan templat Twig yang valid. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf index cf36f64f72e0c..34ef61ed5f8a7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.it.xlf @@ -20,7 +20,7 @@ The value you selected is not a valid choice. - Questo valore dovrebbe essere una delle opzioni disponibili. + Il valore selezionato non è una scelta valida. You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices. @@ -308,7 +308,7 @@ This value does not match the expected {{ charset }} charset. - Questo valore non corrisponde al charset {{ charset }}. + Questo valore non corrisponde al charset {{ charset }} previsto. This value is not a valid Business Identifier Code (BIC). @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Questo valore non dovrebbe essere dopo la settimana "{{ max }}". + + This value is not a valid Twig template. + Questo valore non è un template Twig valido. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf index 26cb6e5933f04..e83aced818553 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ja.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + この値は短すぎます。{{ min }}単語以上にする必要があります。 This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + この値は長すぎます。{{ max }}単語以下にする必要があります。 This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + この値は ISO 8601 形式の有効な週を表していません。 This value is not a valid week. - This value is not a valid week. + この値は有効な週ではありません。 This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + この値は週 "{{ min }}" より前であってはいけません。 This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + この値は週 "{{ max }}" 以降であってはいけません。 + + + This value is not a valid Twig template. + この値は有効な Twig テンプレートではありません。 diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf index 8b0b6a244dcff..d1b5cef57bd0e 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lb.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Dëse Wäert ass ze kuerz. Et sollt op d'mannst ee Wuert enthalen.|Dëse Wäert ass ze kuerz. Et sollt op d'mannst {{ min }} Wierder enthalen. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Dëse Wäert ass ze laang. Et sollt nëmmen ee Wuert enthalen.|Dëse Wäert ass ze laang. Et sollt {{ max }} Wierder oder manner enthalen. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Dëse Wäert stellt keng valabel Woch am ISO 8601-Format duer. This value is not a valid week. - This value is not a valid week. + Dëse Wäert ass keng valabel Woch. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Dëse Wäert sollt net virun der Woch "{{ min }}" sinn. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Dëse Wäert sollt net no Woch "{{ max }}" sinn. + + + This value is not a valid Twig template. + Dëse Wäert ass kee valabelen Twig-Template. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf index e30f8a6ae3e40..46abd95036044 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lt.xlf @@ -452,19 +452,23 @@ This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ši reikšmė neatitinka galiojančios savaitės ISO 8601 formatu. This value is not a valid week. - This value is not a valid week. + Ši reikšmė nėra galiojanti savaitė. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ši reikšmė neturėtų būti prieš savaitę "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ši reikšmė neturėtų būti po savaitės "{{ max }}". + + + This value is not a valid Twig template. + Ši reikšmė nėra tinkamas „Twig“ šablonas. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf index e7b027587c0cc..3e2d51a30dec1 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.lv.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Šai vērtībai nevajadzētu būt pēc "{{ max }}" nedēļas. + + This value is not a valid Twig template. + Šī vērtība nav derīgs Twig šablons. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf index 722c9a7893844..99b1a191b6c0d 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.mk.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Оваа вредност е премногу кратка. Треба да содржи барем една збор.|Оваа вредност е премногу кратка. Треба да содржи барем {{ min }} зборови. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Оваа вредност е премногу долга. Треба да содржи само еден збор.|Оваа вредност е премногу долга. Треба да содржи {{ max }} зборови или помалку. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ова вредност не претставува валидна недела во ISO 8601 формат. This value is not a valid week. - This value is not a valid week. + Оваа вредност не е валидна недела. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ова вредност не треба да биде пред неделата "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ова вредност не треба да биде по недела "{{ max }}". + + + This value is not a valid Twig template. + Оваа вредност не е валиден Twig шаблон. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf index 0c9f8c84d0d3c..3344675d9ae6a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.mn.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Энэ утга нь хэтэрхий богино байна. Энэ нь дор хаяж нэг үг агуулсан байх ёстой.|Энэ утга нь хэтэрхий богино байна. Энэ нь дор хаяж {{ min }} үг агуулсан байх ёстой. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Энэ утга нь хэтэрхий урт байна. Энэ нь зөвхөн нэг үг агуулсан байх ёстой.|Энэ утга нь хэтэрхий урт байна. Энэ нь {{ max }} үг эсвэл түүнээс бага байх ёстой. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Энэ утга нь ISO 8601 форматад хүчинтэй долоо хоногийг илэрхийлэхгүй байна. This value is not a valid week. - This value is not a valid week. + Энэ утга хүчинтэй долоо хоног биш байна. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Энэ утга нь "{{ min }}" долоо хоногоос өмнө байх ёсгүй. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Энэ утга нь долоо хоног "{{ max }}" -аас хойш байх ёсгүй. + + + This value is not a valid Twig template. + Энэ утга нь Twig-ийн хүчинтэй загвар биш юм. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf index 89bb0906ec187..04c955f754509 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.my.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + ဤတန်ဖိုးသည် အလွန်တိုတောင်းသည်။ အနည်းဆုံး စကားလုံးတစ်လုံး ပါဝင်သင့်သည်။|ဤတန်ဖိုးသည် အလွန်တိုတောင်းသည်။ အနည်းဆုံး စကားလုံး {{ min }} လုံး ပါဝင်သင့်သည်။ This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + ဤတန်ဖိုးသည် အလွန်ရှည်လျားသည်။ စကားလုံးတစ်လုံးသာ ပါဝင်သင့်သည်။|ဤတန်ဖိုးသည် အလွန်ရှည်လျားသည်။ စကားလုံး {{ max }} လုံး သို့မဟုတ် ထိုထက်နည်းသည် ပါဝင်သင့်သည်။ This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + ဤတန်ဖိုးသည် ISO 8601 ပုံစံအတိုင်း မသက်ဆိုင်သော သီတင်းပတ်ကို ကိုယ်စားမပြုပါ။ This value is not a valid week. - This value is not a valid week. + ဤတန်ဖိုးသည်မှန်ကန်သည့်အပတ်မဟုတ်ပါ။ This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + ဤတန်ဖိုးသည် သီတင်းပတ် "{{ min }}" မတိုင်မီ ဖြစ်သင့်သည်မဟုတ်ပါ။ This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + ဤတန်ဖိုးသည် သီတင်းပတ် "{{ max }}" ပြီးနောက် ဖြစ်သင့်သည်မဟုတ်ပါ။ + + + This value is not a valid Twig template. + ဤတန်ဖိုးသည် မှန်ကန်သော Twig တင်းပလိတ်မဟုတ်ပါ။ diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf index d0a0e6509df15..58696f671ca4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nb.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Denne verdien er for kort. Den bør inneholde minst ett ord.|Denne verdien er for kort. Den bør inneholde minst {{ min }} ord. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Denne verdien er for lang. Den bør inneholde kun ett ord.|Denne verdien er for lang. Den bør inneholde {{ max }} ord eller færre. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Denne verdien representerer ikke en gyldig uke i ISO 8601-formatet. This value is not a valid week. - This value is not a valid week. + Denne verdien er ikke en gyldig uke. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Denne verdien bør ikke være før uke "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Denne verdien bør ikke være etter uke "{{ max }}". + + + This value is not a valid Twig template. + Denne verdien er ikke en gyldig Twig-mal. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf index f5f3d2ee196d4..1781b1f29ec64 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nl.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Deze waarde mag niet na week "{{ max }}" liggen. + + This value is not a valid Twig template. + Deze waarde is geen geldige Twig-template. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf index 8ff78c5a08132..74d332c06efb2 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.nn.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Denne verdien er for kort. Han bør innehalde minst eitt ord.|Denne verdien er for kort. Han bør innehalde minst {{ min }} ord. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Denne verdien er for lang. Han bør innehalde berre eitt ord.|Denne verdien er for lang. Han bør innehalde {{ max }} ord eller færre. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Denne verdien representerer ikkje ein gyldig veke i ISO 8601-formatet. This value is not a valid week. - This value is not a valid week. + Denne verdien er ikkje ei gyldig veke. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Denne verdien bør ikkje vere før veke "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Denne verdien bør ikkje vere etter veke "{{ max }}". + + + This value is not a valid Twig template. + Denne verdien er ikkje ein gyldig Twig-mal. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf index d0a0e6509df15..58696f671ca4a 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.no.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Denne verdien er for kort. Den bør inneholde minst ett ord.|Denne verdien er for kort. Den bør inneholde minst {{ min }} ord. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Denne verdien er for lang. Den bør inneholde kun ett ord.|Denne verdien er for lang. Den bør inneholde {{ max }} ord eller færre. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Denne verdien representerer ikke en gyldig uke i ISO 8601-formatet. This value is not a valid week. - This value is not a valid week. + Denne verdien er ikke en gyldig uke. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Denne verdien bør ikke være før uke "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Denne verdien bør ikke være etter uke "{{ max }}". + + + This value is not a valid Twig template. + Denne verdien er ikke en gyldig Twig-mal. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf index 541a35d73a83a..7c243a6b0ca02 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pl.xlf @@ -440,31 +440,35 @@ This URL is missing a top-level domain. - Podany URL nie zawiera domeny najwyższego poziomu. + Ten URL nie zawiera domeny najwyższego poziomu. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - Podana wartość jest zbyt krótka. Powinna zawierać co najmniej jedno słowo.|Podana wartość jest zbyt krótka. Powinna zawierać co najmniej {{ min }} słów. + Ta wartość jest zbyt krótka. Powinna zawierać co najmniej jedno słowo.|Ta wartość jest zbyt krótka. Powinna zawierać co najmniej {{ min }} słów. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - Podana wartość jest zbyt długa. Powinna zawierać jedno słowo.|Podana wartość jest zbyt długa. Powinna zawierać {{ max }} słów lub mniej. + Ta wartość jest zbyt długa. Powinna zawierać jedno słowo.|Ta wartość jest zbyt długa. Powinna zawierać {{ max }} słów lub mniej. This value does not represent a valid week in the ISO 8601 format. - Podana wartość nie jest poprawnym oznaczeniem tygodnia w formacie ISO 8601. + Ta wartość nie jest poprawnym oznaczeniem tygodnia w formacie ISO 8601. This value is not a valid week. - Podana wartość nie jest poprawnym oznaczeniem tygodnia. + Ta wartość nie jest poprawnym oznaczeniem tygodnia. This value should not be before week "{{ min }}". - Podana wartość nie powinna być przed tygodniem "{{ min }}". + Ta wartość nie powinna być przed tygodniem "{{ min }}". This value should not be after week "{{ max }}". - Podana wartość nie powinna być po tygodniu "{{ max }}". + Ta wartość nie powinna być po tygodniu "{{ max }}". + + + This value is not a valid Twig template. + Ta wartość nie jest prawidłowym szablonem Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf index bb3208cfa5190..b6562dbfe712f 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pt.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Este valor é muito curto. Deve conter pelo menos uma palavra.|Este valor é muito curto. Deve conter pelo menos {{ min }} palavras. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Este valor é muito longo. Deve conter apenas uma palavra.|Este valor é muito longo. Deve conter {{ max }} palavras ou menos. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Este valor não representa uma semana válida no formato ISO 8601. This value is not a valid week. - This value is not a valid week. + Este valor não é uma semana válida. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Este valor não deve ser anterior à semana "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Este valor não deve estar após a semana "{{ max }}". + + + This value is not a valid Twig template. + Este valor não é um modelo Twig válido. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf index c427f95d3e670..0acf6dbf23a6c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.pt_BR.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Este valor é muito curto. Deve conter pelo menos uma palavra.|Este valor é muito curto. Deve conter pelo menos {{ min }} palavras. This 97AE value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Este valor é muito longo. Deve conter apenas uma palavra.|Este valor é muito longo. Deve conter {{ max }} palavras ou menos. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Este valor não representa uma semana válida no formato ISO 8601. This value is not a valid week. - This value is not a valid week. + Este valor não é uma semana válida. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Este valor não deve ser anterior à semana "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Este valor não deve estar após a semana "{{ max }}". + + + This value is not a valid Twig template. + Este valor não é um modelo Twig válido. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf index 7413619650d94..d6c3b4fb82984 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ro.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Această valoare este prea scurtă. Trebuie să conțină cel puțin un cuvânt.|Această valoare este prea scurtă. Trebuie să conțină cel puțin {{ min }} cuvinte. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Această valoare este prea lungă. Trebuie să conțină un singur cuvânt.|Această valoare este prea lungă. Trebuie să conțină cel mult {{ max }} cuvinte. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Această valoare nu reprezintă o săptămână validă în formatul ISO 8601. This value is not a valid week. - This value is not a valid week. + Această valoare nu este o săptămână validă. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Această valoare nu trebuie să fie înainte de săptămâna "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Această valoare nu trebuie să fie după săptămâna "{{ max }}". + + + This value is not a valid Twig template. + Această valoare nu este un șablon Twig valid. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf index e8dd0311640ff..727ae0aefdf86 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ru.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Это значение слишком короткое. Оно должно содержать как минимум одно слово.|Это значение слишком короткое. Оно должно содержать как минимум {{ min }} слова.|Это значение слишком короткое. Оно должно содержать как минимум {{ min }} слов. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Это значение слишком длинное. Оно должно содержать только одно слово.|Это значение слишком длинное. Оно должно содержать {{ max }} слова или меньше.|Это значение слишком длинное. Оно должно содержать {{ max }} слов или меньше. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Это значение не представляет допустимую неделю в формате ISO 8601. This value is not a valid week. - This value is not a valid week. + Это значение не является допустимой неделей. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Это значение не должно быть раньше недели "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Это значение не должно быть после недели "{{ max }}". + + + This value is not a valid Twig template. + Это значение не является корректным шаблоном Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf index aeda9c94b6b4c..bba3c291a7fed 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sk.xlf @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - V php.ini nie je nastavený žiadny dočasný adresár, alebo nastavený adresár neexistuje. + V php.ini nie je nastavený žiadny dočasný adresár, alebo nastavený adresár neexistuje. Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Táto hodnota nie je platným Medzinárodným bankovým číslom účtu (IBAN). + Táto hodnota nie je platným Medzinárodným bankovým číslom účtu (IBAN). This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Táto hodnota nie je platným Obchodným identifikačným kódom (BIC). + Táto hodnota nie je platným Obchodným identifikačným kódom (BIC). Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Táto hodnota nie je platným UUID. + Táto hodnota nie je platné UUID. This value should be a multiple of {{ compared_value }}. @@ -336,7 +336,7 @@ This collection should contain only unique elements. - Táto kolekcia by mala obsahovať len unikátne prkvy. + Táto kolekcia by mala obsahovať len unikátne prvky. This value should be positive. @@ -436,35 +436,39 @@ This value is not a valid MAC address. - Táto hodnota nie je platnou MAC adresou. + Táto hodnota nie je platnou MAC adresou. This URL is missing a top-level domain. - Tomuto URL chýba doména najvyššej úrovne. + Tejto URL chýba doména najvyššej úrovne. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Táto hodnota je príliš krátka. Mala by obsahovať aspoň jedno slovo.|Táto hodnota je príliš krátka. Mala by obsahovať aspoň {{ min }} slov. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Táto hodnota je príliš dlhá. Mala by obsahovať len jedno slovo.|Táto hodnota je príliš dlhá. Mala by obsahovať {{ max }} slov alebo menej. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Táto hodnota nepredstavuje platný týždeň vo formáte ISO 8601. This value is not a valid week. - This value is not a valid week. + Táto hodnota nie je platný týždeň. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Táto hodnota by nemala byť pred týždňom "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Táto hodnota by nemala byť po týždni "{{ max }}". + + + This value is not a valid Twig template. + Táto hodnota nie je platná šablóna Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf index 1a8cb8d57bbaa..28c370e096887 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sl.xlf @@ -440,31 +440,35 @@ This URL is missing a top-level domain. - Temu URL manjka domena najvišje ravni. + URL-ju manjka vrhnja domena. This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Ta vrednost je prekratka. Vsebovati mora vsaj eno besedo.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besedi.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besede.|Ta vrednost je prekratka. Vsebovati mora vsaj {{ min }} besed. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Ta vrednost je predolga. Vsebovati mora največ eno besedo.|Ta vrednost je predolga. Vsebovati mora največ {{ max }}.|Ta vrednost je predolga. Vsebovati mora največ {{ max }} besede.|Ta vrednost je predolga. Vsebovati mora največ {{ max }} besed. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ta vrednost ne predstavlja veljavnega tedna v ISO 8601 formatu. This value is not a valid week. - This value is not a valid week. + Ta vrednost ni veljaven teden. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ta vrednost ne sme biti pred tednom "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ta vrednost ne sme biti po tednu "{{ max }}". + + + This value is not a valid Twig template. + Ta vrednost ni veljavna predloga Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf index c8e96842294f9..ba7178f672ef7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sq.xlf @@ -475,6 +475,10 @@ This value should not be after week "{{ max }}". Kjo vlerë nuk duhet të jetë pas javës "{{ max }}". + + This value is not a valid Twig template. + Kjo vlerë nuk është një shabllon Twig i vlefshëm. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf index 07e3ae94aa9a0..61040270ac884 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sr_Cyrl.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Ова вредност не треба да буде после недеље "{{ max }}". + + This value is not a valid Twig template. + Ова вредност није важећи Twig шаблон. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf index 8f1909c72f724..be7ede71376d7 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sr_Latn.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Ova vrednost ne treba da bude posle nedelje "{{ max }}". + + This value is not a valid Twig template. + Ova vrednost nije važeći Twig šablon. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf index ac08eff2a931e..692ac7f52d243 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.sv.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Det här värdet är för kort. Det ska innehålla minst ett ord.|Det här värdet är för kort. Det ska innehålla minst {{ min }} ord. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Det här värdet är för långt. Det ska innehålla endast ett ord.|Det här värdet är för långt. Det ska innehålla {{ max }} ord eller färre. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Det här värdet representerar inte en giltig vecka i ISO 8601-formatet. This value is not a valid week. - This value is not a valid week. + Det här värdet är inte en giltig vecka. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Det här värdet bör inte vara före vecka "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Det här värdet bör inte vara efter vecka "{{ max }}". + + + This value is not a valid Twig template. + Det här värdet är inte en giltig Twig-mall. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf index ded3a00868551..75398a0b84206 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.th.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + ค่านี้สั้นเกินไป ควรมีอย่างน้อยหนึ่งคำ|ค่านี้สั้นเกินไป ควรมีอย่างน้อย {{ min }} คำ This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + ค่านี้ยาวเกินไป ควรมีเพียงคำเดียว|ค่านี้ยาวเกินไป ควรมี {{ max }} คำ หรือต่ำกว่า This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + ค่านี้ไม่แสดงถึงสัปดาห์ที่ถูกต้องตามรูปแบบ ISO 8601 This value is not a valid week. - This value is not a valid week. + ค่านี้ไม่ใช่สัปดาห์ที่ถูกต้อง This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + ค่านี้ไม่ควรจะก่อนสัปดาห์ "{{ min }}" This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + ค่านี้ไม่ควรจะอยู่หลังสัปดาห์ "{{ max }}" + + + This value is not a valid Twig template. + ค่านี้ไม่ใช่เทมเพลต Twig ที่ถูกต้อง diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf index 4ac6bb45699ff..729ebc9da9185 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.tl.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - Ang halagang ito ay hindi isang wastong IP address. + Ang halagang ito ay hindi isang wastong IP address. This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - Walang pansamantalang folder na na-configure sa php.ini, o ang naka-configure na folder ay hindi umiiral. + Walang pansamantalang folder na na-configure sa php.ini, o ang naka-configure na folder ay hindi naroroon. Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - Ang halagang ito ay hindi isang wastong International Bank Account Number (IBAN). + Ang halagang ito ay hindi isang wastong International Bank Account Number (IBAN). This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - Ang halagang ito ay hindi isang wastong Business Identifier Code (BIC). + Ang halagang ito ay hindi isang wastong Business Identifier Code (BIC). Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - Ang halagang ito ay hindi isang wastong UUID. + Ang halagang ito ay hindi isang wastong UUID. This value should be a multiple of {{ compared_value }}. @@ -396,75 +396,79 @@ This value is not a valid CIDR notation. - Ang halagang ito ay hindi wastong notasyong CIDR. + Ang halagang ito ay hindi wastong notasyon ng CIDR. The value of the netmask should be between {{ min }} and {{ max }}. - Ang halaga ng netmask ay dapat nasa pagitan ng {{ min }} at {{ max }}. + Ang halaga ng netmask ay dapat nasa pagitan ng {{ min }} at {{ max }}. The filename is too long. It should have {{ filename_max_length }} character or less.|The filename is too long. It should have {{ filename_max_length }} characters or less. - Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} karakter o mas kaunti.|Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} mga karakter o mas kaunti. + Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} karakter o mas kaunti.|Ang pangalan ng file ay masyadong mahaba. Dapat itong magkaroon ng {{ filename_max_length }} mga karakter o mas kaunti. The password strength is too low. Please use a stronger password. - Ang lakas ng password ay masyadong mababa. Mangyaring gumamit ng mas malakas na password. + Ang lakas ng password ay masyadong mababa. Mangyaring gumamit ng mas malakas na password. This value contains characters that are not allowed by the current restriction-level. - Ang halagang ito ay naglalaman ng mga karakter na hindi pinapayagan ng kasalukuyang antas ng paghihigpit. + Ang halagang ito ay naglalaman ng mga karakter na hindi pinapayagan ng kasalukuyang antas ng paghihigpit. Using invisible characters is not allowed. - Hindi pinapayagan ang paggamit ng mga hindi nakikitang karakter. + Hindi pinapayagan ang paggamit ng mga hindi nakikitang karakter. Mixing numbers from different scripts is not allowed. - Hindi pinapayagan ang paghahalo ng mga numero mula sa iba't ibang script. + Hindi pinapayagan ang paghahalo ng mga numero mula sa iba't ibang script. Using hidden overlay characters is not allowed. - Hindi pinapayagan ang paggamit ng mga nakatagong overlay na karakter. + Hindi pinapayagan ang paggamit ng mga nakatagong overlay na karakter. The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}. - Ang extension ng file ay hindi wasto ({{ extension }}). Ang mga pinapayagang extension ay {{ extensions }}. + Ang extension ng file ay hindi wasto ({{ extension }}). Ang mga pinapayagang extension ay {{ extensions }}. The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - Ang nakitang encoding ng karakter ay hindi wasto ({{ detected }}). Ang mga pinapayagang encoding ay {{ encodings }}. + Ang nakitang encoding ng karakter ay hindi wasto ({{ detected }}). Ang mga pinapayagang encoding ay {{ encodings }}. This value is not a valid MAC address. - Ang halagang ito ay hindi isang wastong MAC address. + Ang halagang ito ay hindi isang wastong MAC address. This URL is missing a top-level domain. - Kulang ang URL na ito sa top-level domain. + Ang URL na ito ay kulang ng top-level domain. This value is too short. It should contain at least one word.|This value is too short. It should contain 741A at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Masyadong maikli ang halagang ito. Dapat itong maglaman ng hindi bababa sa isang salita.|Masyadong maikli ang halagang ito. Dapat itong maglaman ng hindi bababa sa {{ min }} salita. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Masyadong mahaba ang halagang ito. Dapat itong maglaman lamang ng isang salita.|Masyadong mahaba ang halagang ito. Dapat itong maglaman ng {{ max }} salita o mas kaunti. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Ang halagang ito ay hindi kumakatawan sa isang wastong linggo sa format ng ISO 8601. This value is not a valid week. - This value is not a valid week. + Ang halagang ito ay hindi isang wastong linggo. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Ang halagang ito ay hindi dapat bago sa linggo "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Ang halagang ito ay hindi dapat pagkatapos ng linggo "{{ max }}". + + + This value is not a valid Twig template. + Ang halagang ito ay hindi isang balidong Twig template. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf index 93848e9442742..42c4bbd91ebab 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.tr.xlf @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - php.ini'de geçici bir klasör yapılandırılmadı, veya yapılandırılan klasör mevcut değildir. + php.ini'de geçici bir klasör yapılandırılmadı veya yapılandırılan klasör mevcut değildir. Cannot write temporary file to disk. @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". Bu değer “{{ max }}” haftasından sonra olmamalıdır + + This value is not a valid Twig template. + Bu değer geçerli bir Twig şablonu olarak kabul edilmiyor. + diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf index 4775d04f44957..5f132bc77a6ec 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.uk.xlf @@ -180,7 +180,7 @@ This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters. - Значення повиино бути рівним {{ limit }} символу.|Значення повиино бути рівним {{ limit }} символам.|Значення повиино бути рівним {{ limit }} символам. + Значення повинно бути рівним {{ limit }} символу.|Значення повинно бути рівним {{ limit }} символам.|Значення повинно бути рівним {{ limit }} символам. The file was only partially uploaded. @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Це значення занадто коротке. Воно має містити принаймні одне слово.|Це значення занадто коротке. Мінімальна кількість слів — {{ min }}. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Це значення занадто довге. Воно має містити лише одне слово.|Це значення занадто довге. Максимальна кількість слів — {{ max }}. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Це значення не представляє дійсний тиждень у форматі ISO 8601. This value is not a valid week. - This value is not a valid week. + Це значення не є дійсним тижнем. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Це значення не повинно бути раніше тижня "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Це значення не повинно бути після тижня "{{ max }}". + + + This value is not a valid Twig template. + Це значення не є дійсним шаблоном Twig. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf index a1669de019a0a..f13aafb43264b 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.ur.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + یہ قدر بہت مختصر ہے۔ اس میں کم از کم ایک لفظ ہونا چاہیے۔|یہ قدر بہت مختصر ہے۔ اس میں کم از کم {{ min }} الفاظ ہونے چاہئیں۔ This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + یہ قدر بہت طویل ہے۔ اس میں صرف ایک لفظ ہونا چاہیے۔|یہ قدر بہت طویل ہے۔ اس میں {{ max }} الفاظ یا اس سے کم ہونے چاہئیں۔ This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + یہ قدر آئی ایس او 8601 فارمیٹ میں ایک درست ہفتے کی نمائندگی نہیں کرتی ہے۔ This value is not a valid week. - This value is not a valid week. + یہ قدر ایک درست ہفتہ نہیں ہے۔ This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + یہ قدر ہفتہ "{{ min }}" سے پہلے نہیں ہونا چاہیے۔ This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + یہ قدر ہفتہ "{{ max }}" کے بعد نہیں ہونا چاہیے۔ + + + This value is not a valid Twig template. + یہ قدر ایک درست Twig سانچہ نہیں ہے۔ diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf index d3012c64ef967..fe0b49f715b12 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.uz.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Bu qiymat juda qisqa. U kamida bitta so'z bo'lishi kerak.|Bu qiymat juda qisqa. U kamida {{ min }} so'z bo'lishi kerak. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Bu qiymat juda uzun. U faqat bitta so'z bo'lishi kerak.|Bu qiymat juda uzun. U {{ max }} so'z yoki undan kam bo'lishi kerak. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Bu qiymat ISO 8601 formatida haqiqiy haftaga mos kelmaydi. This value is not a valid week. - This value is not a valid week. + Bu qiymat haqiqiy hafta emas. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Bu qiymat "{{ min }}" haftadan oldin bo'lmasligi kerak. This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Bu qiymat "{{ max }}" haftadan keyin bo'lmasligi kerak. + + + This value is not a valid Twig template. + Bu qiymat yaroqli Twig shabloni emas. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf index 70a7eedcf24e5..9daa4fe8a29d5 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.vi.xlf @@ -444,27 +444,31 @@ This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + Giá trị này quá ngắn. Nó phải chứa ít nhất một từ.|Giá trị này quá ngắn. Nó phải chứa ít nhất {{ min }} từ. This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + Giá trị này quá dài. Nó chỉ nên chứa một từ.|Giá trị này quá dài. Nó chỉ nên chứa {{ max }} từ hoặc ít hơn. This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + Giá trị này không đại diện cho một tuần hợp lệ theo định dạng ISO 8601. This value is not a valid week. - This value is not a valid week. + Giá trị này không phải là một tuần hợp lệ. This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + Giá trị này không nên trước tuần "{{ min }}". This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + Giá trị này không nên sau tuần "{{ max }}". + + + This value is not a valid Twig template. + Giá trị này không phải là một mẫu Twig hợp lệ. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf index 3c078d3f5816c..c570d936ff17c 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.zh_CN.xlf @@ -136,7 +136,7 @@ This value is not a valid IP address. - 该值不是有效的IP地址。 + 该值不是有效的IP地址。 This value is not a valid language. @@ -192,7 +192,7 @@ No temporary folder was configured in php.ini, or the configured folder does not exist. - php.ini 中没有配置临时文件夹,或配置的文件夹不存在。 + php.ini 中未配置临时文件夹,或配置的文件夹不存在。 Cannot write temporary file to disk. @@ -224,7 +224,7 @@ This value is not a valid International Bank Account Number (IBAN). - 该值不是有效的国际银行账号(IBAN)。 + 该值不是有效的国际银行账号(IBAN)。 This value is not a valid ISBN-10. @@ -312,7 +312,7 @@ This value is not a valid Business Identifier Code (BIC). - 该值不是有效的业务标识符代码(BIC)。 + 该值不是有效的银行识别代码(BIC)。 Error @@ -320,7 +320,7 @@ This value is not a valid UUID. - 该值不是有效的UUID。 + 该值不是有效的UUID。 This value should be a multiple of {{ compared_value }}. @@ -428,43 +428,47 @@ The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}. - 文件的扩展名无效 ({{ extension }})。允许的扩展名为 {{ extensions }}。 + 文件的扩展名无效 ({{ extension }})。允许的扩展名为 {{ extensions }}。 The detected character encoding is invalid ({{ detected }}). Allowed encodings are {{ encodings }}. - 检测到的字符编码无效 ({{ detected }})。允许的编码为 {{ encodings }}。 + 检测到的字符编码无效 ({{ detected }})。允许的编码为 {{ encodings }}。 This value is not a valid MAC address. - 该值不是有效的MAC地址。 + 该值不是有效的MAC地址。 This URL is missing a top-level domain. - 此URL缺少顶级域名。 + 此URL缺少顶级域名。 This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. - This value is too short. It should contain at least one word.|This value is too short. It should contain at least {{ min }} words. + 该值太短,应该至少包含一个词。|该值太短,应该至少包含 {{ min }} 个词。 This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. - This value is too long. It should contain one word.|This value is too long. It should contain {{ max }} words or less. + 该值太长,应该只包含一个词。|该值太长,应该只包含 {{ max }} 个或更少个词。 This value does not represent a valid week in the ISO 8601 format. - This value does not represent a valid week in the ISO 8601 format. + 该值不代表 ISO 8601 格式中的有效周。 This value is not a valid week. - This value is not a valid week. + 该值不是一个有效周。 This value should not be before week "{{ min }}". - This value should not be before week "{{ min }}". + 该值不应位于 "{{ min }}" 周之前。 This value should not be after week "{{ max }}". - This value should not be after week "{{ max }}". + 该值不应位于 "{{ max }}"周之后。 + + + This value is not a valid Twig template. + 此值不是有效的 Twig 模板。 diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf index d94100634d7c2..a60283b280898 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.zh_TW.xlf @@ -466,6 +466,10 @@ This value should not be after week "{{ max }}". 這個數值不應晚於第「{{ max }}」週。 + + This value is not a valid Twig template. + 這個數值不是有效的 Twig 模板。 + diff --git a/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php index 908517081d8a3..892f346b9ac55 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/ImageValidatorTest.php @@ -11,6 +11,8 @@ namespace Symfony\Component\Validator\Tests\Constraints; +use Symfony\Component\HttpFoundation\File\File; +use Symfony\Component\Mime\MimeTypes; use Symfony\Component\Validator\Constraints\Image; use Symfony\Component\Validator\Constraints\ImageValidator; use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; @@ -498,4 +500,75 @@ public static function provideInvalidMimeTypeWithNarrowedSet() ]), ]; } + + /** + * @dataProvider providerValidExtension + */ + public function testExtensionValid(string $name) + { + if (!class_exists(MimeTypes::class)) { + $this->markTestSkipped('Guessing the mime type is not possible'); + } + + $constraint = new Image(mimeTypes: [], extensions: ['gif'], extensionsMessage: 'myMessage'); + + $this->validator->validate(new File(__DIR__.'/Fixtures/'.$name), $constraint); + + $this->assertNoViolation(); + } + + public static function providerValidExtension(): iterable + { + yield ['test.gif']; + yield ['test.png.gif']; + } + + /** + * @dataProvider provideInvalidExtension + */ + public function testExtensionInvalid(string $name, string $extension) + { + $path = __DIR__.'/Fixtures/'.$name; + $constraint = new Image(extensions: ['png', 'svg'], extensionsMessage: 'myMessage'); + + $this->validator->validate(new File($path), $constraint); + + $this->buildViolation('myMessage') + ->setParameters([ + '{{ file }}' => '"'.$path.'"', + '{{ extension }}' => '"'.$extension.'"', + '{{ extensions }}' => '"png", "svg"', + '{{ name }}' => '"'.$name.'"', + ]) + F438 ->setCode(Image::INVALID_EXTENSION_ERROR) + ->assertRaised(); + } + + public static function provideInvalidExtension(): iterable + { + yield ['test.gif', 'gif']; + yield ['test.png.gif', 'gif']; + } + + public function testExtensionAutodetectMimeTypesInvalid() + { + if (!class_exists(MimeTypes::class)) { + $this->markTestSkipped('Guessing the mime type is not possible'); + } + + $path = __DIR__.'/Fixtures/invalid-content.gif'; + $constraint = new Image(mimeTypesMessage: 'myMessage', extensions: ['gif']); + + $this->validator->validate(new File($path), $constraint); + + $this->buildViolation('myMessage') + ->setParameters([ + '{{ file }}' => '"'.$path.'"', + '{{ name }}' => '"invalid-content.gif"', + '{{ type }}' => '"text/plain"', + '{{ types }}' => '"image/gif"', + ]) + ->setCode(Image::INVALID_MIME_TYPE_ERROR) + ->assertRaised(); + } } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/MacAddressValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/MacAddressValidatorTest.php index d755df486e140..5abb7487ba328 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/MacAddressValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/MacAddressValidatorTest.php @@ -63,6 +63,19 @@ public function testValidMac($mac) $this->assertNoViolation(); } + /** + * @dataProvider getNotValidMacs + */ + public function testNotValidMac($mac) + { + $this->validator->validate($mac, new MacAddress()); + + $this->buildViolation('This value is not a valid MAC address.') + ->setParameter('{{ value }}', '"'.$mac.'"') + ->setCode(MacAddress::INVALID_MAC_ERROR) + ->assertRaised(); + } + public static function getValidMacs(): array { return [ @@ -76,6 +89,17 @@ public static function getValidMacs(): array ]; } + public static function getNotValidMacs(): array + { + return [ + ['00:00:00:00:00'], + ['00:00:00:00:00:0G'], + ['GG:GG:GG:GG:GG:GG'], + ['GG-GG-GG-GG-GG-GG'], + ['GGGG.GGGG.GGGG'], + ]; + } + public static function getValidLocalUnicastMacs(): array { return [ diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UniqueValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UniqueValidatorTest.php index 76862e73fd278..f81621d652c8f 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UniqueValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UniqueValidatorTest.php @@ -61,7 +61,7 @@ public static function getValidValues() /** * @dataProvider getInvalidValues */ - public function testInvalidValues($value, $expectedMessageParam, string $expectedErrorPath) + public function testInvalidValues($value, $expectedMessageParam) { $constraint = new Unique([ 'message' => 'myMessage', @@ -71,7 +71,6 @@ public function testInvalidValues($value, $expectedMessageParam, string $expecte $this->buildViolation('myMessage') ->setParameter('{{ value }}', $expectedMessageParam) ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath($expectedErrorPath) ->assertRaised(); } @@ -80,12 +79,12 @@ public static function getInvalidValues() $object = new \stdClass(); return [ - yield 'not unique booleans' => [[true, true], 'true', 'property.path[1]'], - yield 'not unique integers' => [[1, 2, 3, 3], 3, 'property.path[3]'], - yield 'not unique floats' => [[0.1, 0.2, 0.1], 0.1, 'property.path[2]'], - yield 'not unique string' => [['a', 'b', 'a'], '"a"', 'property.path[2]'], - yield 'not unique arrays' => [[[1, 1], [2, 3], [1, 1]], 'array', 'property.path[2]'], - yield 'not unique objects' => [[$object, $object], 'object', 'property.path[1]'], + yield 'not unique booleans' => [[true, true], 'true'], + yield 'not unique integers' => [[1, 2, 3, 3], 3], + yield 'not unique floats' => [[0.1, 0.2, 0.1], 0.1], + yield 'not unique string' => [['a', 'b', 'a'], '"a"'], + yield 'not unique arrays' => [[[1, 1], [2, 3], [1, 1]], 'array'], + yield 'not unique objects' => [[$object, $object], 'object'], ]; } @@ -97,7 +96,6 @@ public function testInvalidValueNamed() $this->buildViolation('myMessage') ->setParameter('{{ value }}', '3') ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath('property.path[3]') ->assertRaised(); } @@ -154,7 +152,6 @@ public function testExpectsNonUniqueObjects($callback) $this->buildViolation('myMessage') ->setParameter('{{ value }}', 'array') ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath('property.path[2]') ->assertRaised(); } @@ -179,7 +176,6 @@ public function testExpectsInvalidNonStrictComparison() $this->buildViolation('myMessage') ->setParameter('{{ value }}', '1') ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath('property.path[1]') ->assertRaised(); } @@ -206,7 +202,6 @@ public function testExpectsInvalidCaseInsensitiveComparison() $this->buildViolation('myMessage') ->setParameter('{{ value }}', '"hello"') ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath('property.path[1]') ->assertRaised(); } @@ -251,7 +246,7 @@ public static function getInvalidFieldNames(): array /** * @dataProvider getInvalidCollectionValues */ - public function testInvalidCollectionValues(array $value, array $fields, string $expectedMessageParam, string $expectedErrorPath) + public function testInvalidCollectionValues(array $value, array $fields, string $expectedMessageParam) { $this->validator->validate($value, new Unique([ 'message' => 'myMessage', @@ -260,7 +255,6 @@ public function testInvalidCollectionValues(array $value, array $fields, string $this->buildViolation('myMessage') ->setParameter('{{ value }}', $expectedMessageParam) ->setCode(Unique::IS_NOT_UNIQUE) - ->atPath($expectedErrorPath) ->assertRaised(); } @@ -270,27 +264,25 @@ public static function getInvalidCollectionValues(): array 'unique string' => [[ ['lang' => 'eng', 'translation' => 'hi'], ['lang' => 'eng', 'translation' => 'hello'], - ], ['lang'], 'array', 'property.path[1]'], + ], ['lang'], 'array'], 'unique floats' => [[ ['latitude' => 51.509865, 'longitude' => -0.118092, 'poi' => 'capital'], ['latitude' => 52.520008, 'longitude' => 13.404954], ['latitude' => 51.509865, 'longitude' => -0.118092], - ], ['latitude', 'longitude'], 'array', 'property.path[2]'], + ], ['latitude', 'longitude'], 'array'], 'unique int' => [[ ['id' => 1, 'email' => 'bar@email.com'], ['id' => 1, 'email' => 'foo@email.com'], - ], ['id'], 'array', 'property.path[1]'], + ], ['id'], 'array'], 'unique null' => [ [null, null], [], 'null', - 'property.path[1]', ], 'unique field null' => [ [['nullField' => null], ['nullField' => null]], ['nullField'], 'array', - 'property.path[1]', ], ]; } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlTest.php index 1d641aa925077..59e626eda2c3c 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UrlTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UrlTest.php @@ -68,9 +68,9 @@ public function testAttributes() self::assertFalse($cConstraint->requireTld); [$dConstraint] = $metadata->properties['d']->getConstraints(); - self::assertSame(['http', 'https'], $aConstraint->protocols); - self::assertFalse($aConstraint->relativeProtocol); - self::assertNull($aConstraint->normalizer); + self::assertSame(['http', 'https'], $dConstraint->protocols); + self::assertFalse($dConstraint->relativeProtocol); + self::assertNull($dConstraint->normalizer); self::assertTrue($dConstraint->requireTld); } diff --git a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php index 5fdbb28b6b8e7..df4406881afec 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/UrlValidatorTest.php @@ -188,6 +188,8 @@ public static function getValidUrls() ['http://xn--e1afmkfd.xn--80akhbyknj4f.xn--e1afmkfd/'], ['http://xn--espaa-rta.xn--ca-ol-fsay5a/'], ['http://xn--d1abbgf6aiiy.xn--p1ai/'], + ['http://example.xn--p1ai/'], + ['http://xn--d1abbgf6aiiy.example.xn--p1ai/'], ['http://☎.com/'], ['http://username:password@symfony.com'], ['http://user.name:password@symfony.com'], diff --git a/src/Symfony/Component/Validator/Tests/Constraints/WhenTest.php b/src/Symfony/Component/Validator/Tests/Constraints/WhenTest.php index 7cfe13f2f2e78..44cea97c5518f 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/WhenTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/WhenTest.php @@ -73,7 +73,7 @@ public function testAttributes() [$barConstraint] = $metadata->properties['bar']->getConstraints(); - self::assertInstanceOf(When::class, $fooConstraint); + self::assertInstanceOf(When::class, $barConstraint); self::assertSame('false', $barConstraint->expression); self::assertEquals([ new NotNull([ diff --git a/src/Symfony/Component/Validator/Tests/Constraints/WordCountValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/WordCountValidatorTest.php index 3e3b760c473e7..ce1256f92c4f5 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/WordCountValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/WordCountValidatorTest.php @@ -83,6 +83,7 @@ public static function provideValidValues() yield [new StringableValue('my ûtf 8'), 3]; yield [null, 1]; // null should always pass and eventually be handled by NotNullValidator yield ['', 1]; // empty string should always pass and eventually be handled by NotBlankValidator + yield ['My String 0', 3]; } public static function provideInvalidTypes() diff --git a/src/Symfony/Component/VarDumper/Caster/CutStub.php b/src/Symfony/Component/VarDumper/Caster/CutStub.php index 772399ef69f03..6870a9cd28dda 100644 --- a/src/Symfony/Component/VarDumper/Caster/CutStub.php +++ b/src/Symfony/Component/VarDumper/Caster/CutStub.php @@ -27,7 +27,7 @@ public function __construct(mixed $value) switch (\gettype($value)) { case 'object': $this->type = self::TYPE_OBJECT; - $this->class = $value::class; + $this->class = get_debug_type($value); if ($value instanceof \Closure) { ReflectionCaster::castClosure($value, [], $this, true, Caster::EXCLUDE_VERBOSE); diff --git a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php index d8422e0558048..f514ddb87cf16 100644 --- a/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php +++ b/src/Symfony/Component/VarDumper/Caster/SymfonyCaster.php @@ -78,12 +78,14 @@ public static function castLazyObjectState($state, array $a, Stub $stub, bool $i $instance = $a['realInstance'] ?? null; - $a = ['status' => new ConstStub(match ($a['status']) { - LazyObjectState::STATUS_INITIALIZED_FULL => 'INITIALIZED_FULL', - LazyObjectState::STATUS_INITIALIZED_PARTIAL => 'INITIALIZED_PARTIAL', - LazyObjectState::STATUS_UNINITIALIZED_FULL => 'UNINITIALIZED_FULL', - LazyObjectState::STATUS_UNINITIALIZED_PARTIAL => 'UNINITIALIZED_PARTIAL', - }, $a['status'])]; + if (isset($a['status'])) { // forward-compat with Symfony 8 + $a = ['status' => new ConstStub(match ($a['status']) { + LazyObjectState::STATUS_INITIALIZED_FULL => 'INITIALIZED_FULL', + LazyObjectState::STATUS_INITIALIZED_PARTIAL => 'INITIALIZED_PARTIAL', + LazyObjectState::STATUS_UNINITIALIZED_FULL => 'UNINITIALIZED_FULL', + LazyObjectState::STATUS_UNINITIALIZED_PARTIAL => 'UNINITIALIZED_PARTIAL', + }, $a['status'])]; + } if ($instance) { $a['realInstance'] = $instance; diff --git a/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php b/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php index 478954ae4a77b..1f24852c55bcd 100644 --- a/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php +++ b/src/Symfony/Component/VarDumper/Dumper/HtmlDumper.php @@ -649,7 +649,7 @@ function showCurrent(state) height: 0; clear: both; } -pre.sf-dump span { +pre.sf-dump .sf-dump-ellipsization { display: inline-flex; } pre.sf-dump a { @@ -667,16 +667,12 @@ function showCurrent(state) background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #D3D3D3; } pre.sf-dump .sf-dump-ellipsis { - display: inline-block; - overflow: visible; text-overflow: ellipsis; - max-width: 5em; white-space: nowrap; overflow: hidden; - vertical-align: top; } -pre.sf-dump .sf-dump-ellipsis+.sf-dump-ellipsis { - max-width: none; +pre.sf-dump .sf-dump-ellipsis-tail { + flex-shrink: 0; } pre.sf-dump code { display:inline; @@ -840,66 +836,75 @@ protected function style(string $style, string $value, array $attr = []): string return \sprintf('%s', $this->dumpId, $r, 1 + $attr['count'], $v); } + $dumpClasses = ['sf-dump-'.$style]; + $dumpTitle = ''; + if ('const' === $style && isset($attr['value'])) { - $style .= \sprintf(' title="%s"', esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value']))); + $dumpTitle = esc(\is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value'])); } elseif ('public' === $style) { - $style .= \sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'); + $dumpTitle = empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'; } elseif ('str' === $style && 1 < $attr['length']) { - $style .= \sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); + $dumpTitle = \sprintf('%d%s characters', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); } elseif ('note' === $style && 0 < ($attr['depth'] ?? 0) && false !== $c = strrpos($value, '\\')) { - $style .= ' title=""'; $attr += [ 'ellipsis' => \strlen($value) - $c, 'ellipsis-type' => 'note', 'ellipsis-tail' => 1, ]; } elseif ('protected' === $style) { - $style .= ' title="Protected property"'; + $dumpTitle = 'Protected property'; } elseif ('meta' === $style && isset($attr['title'])) { - $style .= \sprintf(' title="%s"', esc($this->utf8Encode($attr['title']))); + $dumpTitle = esc($this->utf8Encode($attr['title'])); } elseif ('private' === $style) { - $style .= \sprintf(' title="Private property defined in class: `%s`"', esc($this->utf8Encode($attr['class']))); + $dumpTitle = \sprintf('Private property defined in class: `%s`', esc($this->utf8Encode($attr['class']))); } if (isset($attr['ellipsis'])) { - $class = 'sf-dump-ellipsis'; + $dumpClasses[] = 'sf-dump-ellipsization'; + $ellipsisClass = 'sf-dump-ellipsis'; if (isset($attr['ellipsis-type'])) { - $class = \sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']); + $ellipsisClass .= ' sf-dump-ellipsis-'.$attr['ellipsis-type']; } $label = esc(substr($value, -$attr['ellipsis'])); - $style = str_replace(' title="', " title=\"$v\n", $style); - $v = \sprintf('%s', $class, substr($v, 0, -\strlen($label))); + $dumpTitle = $v."\n".$dumpTitle; + $v = sprintf('%s', $ellipsisClass, substr($v, 0, -\strlen($label))); if (!empty($attr['ellipsis-tail'])) { $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']))); - $v .= \sprintf('%s%s', $class, substr($label, 0, $tail), substr($label, $tail)); + $v .= sprintf('%s%s', $ellipsisClass, substr($label, 0, $tail), substr($label, $tail)); } else { - $v .= $label; + $v .= sprintf('%s', $label); } } $map = static::$controlCharsMap; - $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { - $s = $b = '%s', + 1 === count($dumpClasses) ? '' : '"', + implode(' ', $dumpClasses), + $dumpTitle ? ' title="'.$dumpTitle.'"' : '', + preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { + $s = $b = ''; - }, $v).''; + return $s.''; + }, $v) + ); if (!($attr['binary'] ?? false)) { $v = preg_replace_callback(static::$unicodeCharsRx, function ($c) { diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php index 95f2aa1edcc5f..4978efbec866f 100644 --- a/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Caster/ExceptionCasterTest.php @@ -259,12 +259,12 @@ public function testHtmlDump() Exception { #message: "1" #code: 0 - #file: "%s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php" + #file: "%s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php" #line: %d trace: { - %s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php:%d + %s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php:%d …%d } } diff --git a/src/Symfony/Component/VarDumper/Tests/Caster/RdKafkaCasterTest.php b/src/Symfony/Component/VarDumper/Tests/Caster/RdKafkaCasterTest.php index 78b78ddc63cfa..592c3d64ea993 100644 --- a/src/Symfony/Component/VarDumper/Tests/Caster/RdKafkaCasterTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Caster/RdKafkaCasterTest.php @@ -61,6 +61,7 @@ public function testDumpConf() client.id: "rdkafka" %A dr_msg_cb: "0x%x" +%A } EODUMP; @@ -114,7 +115,7 @@ public function testDumpTopicConf() $expectedDump = <<array:1 [ - 0 => "Symfony\Component\VarDumper\Tests\Caster\NotExisting" + 0 => "Symfony\Component\VarDumper\Tests\Caster\NotExisting" ] EODUMP; diff --git a/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php index aaaf1cfed2eb9..c5a2e4e3fbb66 100644 --- a/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Dumper/HtmlDumperTest.php @@ -80,18 +80,18 @@ public function testGet() seekable: true %A options: [] } - "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d + "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d +foo: "foo" +"bar": "bar" } "closure" => Closure(\$a, ?PDO &\$b = null) {#%d - class: "Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest" - this: Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest {#%d &%s;} - file: "%s%eVarDumper%eTests%eFixtures%edumb-var.php" + class: "Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest" + this: Symfony\Component\VarDumper\Tests\Dumper\HtmlDumperTest {#%d &%s;} + file: "%s%eVarDumper%eTests%eFixtures%edumb-var.php" line: "{$var['line']} to {$var['line']}" } "line" => {$var['line']} @@ -102,8 +102,8 @@ public function testGet() 0 => &4 array:1 [&4] ] 8 => &1 null - "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d} + "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d} "snobj" => &3 {#%d} "snobj2" => {#%d} "file" => "{$var['file']}" diff --git a/src/Symfony/Component/VarDumper/Tests/Dumper/ServerDumperTest.php b/src/Symfony/Component/VarDumper/Tests/Dumper/ServerDumperTest.php index 5ff99387b99a2..0a7d68b0ec554 100644 --- a/src/Symfony/Component/VarDumper/Tests/Dumper/ServerDumperTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Dumper/ServerDumperTest.php @@ -39,8 +39,8 @@ public function testDumpForwardsToWrappedDumperWhenServerIsUnavailable() public function testDump() { - if ('True' === getenv('APPVEYOR')) { - $this->markTestSkipped('Skip transient test on AppVeyor'); + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Skip transient test on Windows'); } $wrappedDumper = $this->createMock(DataDumperInterface::class); diff --git a/src/Symfony/Component/VarDumper/Tests/Server/ConnectionTest.php b/src/Symfony/Component/VarDumper/Tests/Server/ConnectionTest.php index 64563832803ac..56553e6df79fc 100644 --- a/src/Symfony/Component/VarDumper/Tests/Server/ConnectionTest.php +++ b/src/Symfony/Component/VarDumper/Tests/Server/ConnectionTest.php @@ -24,8 +24,8 @@ class ConnectionTest extends TestCase public function testDump() { - if ('True' === getenv('APPVEYOR')) { - $this->markTestSkipped('Skip transient test on AppVeyor'); + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Skip transient test on Windows'); } $cloner = new VarCloner(); diff --git a/src/Symfony/Component/VarExporter/Hydrator.php b/src/Symfony/Component/VarExporter/Hydrator.php index 5f456fb3cf7e7..b718921d9f892 100644 --- a/src/Symfony/Component/VarExporter/Hydrator.php +++ b/src/Symfony/Component/VarExporter/Hydrator.php @@ -61,8 +61,8 @@ public static function hydrate(object $instance, array $properties = [], array $ $propertyScopes = InternalHydrator::$propertyScopes[$class] ??= InternalHydrator::getPropertyScopes($class); foreach ($properties as $name => &$value) { - [$scope, $name, $readonlyScope] = $propertyScopes[$name] ?? [$class, $name, $class]; - $scopedProperties[$readonlyScope ?? $scope][$name] = &$value; + [$scope, $name, $writeScope] = $propertyScopes[$name] ?? [$class, $name, $class]; + $scopedProperties[$writeScope ?? $scope][$name] = &$value; } unset($value); } diff --git a/src/Symfony/Component/VarExporter/Internal/Exporter.php b/src/Symfony/Component/VarExporter/Internal/Exporter.php index 6544ae244837a..75954dbf3e759 100644 --- a/src/Symfony/Component/VarExporter/Internal/Exporter.php +++ b/src/Symfony/Component/VarExporter/Internal/Exporter.php @@ -90,7 +90,8 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount $properties = $serializeProperties; } else { foreach ($serializeProperties as $n => $v) { - $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; + $p = $reflector->hasProperty($n) ? $reflector->getProperty($n) : null; + $c = $p && (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly()) ? $p->class : 'stdClass'; $properties[$c][$n] = $v; } } @@ -143,7 +144,8 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount $i = 0; $n = (string) $name; if ('' === $n || "\0" !== $n[0]) { - $c = $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; + $p = $reflector->hasProperty($n) ? $reflector->getProperty($n) : null; + $c = $p && (\PHP_VERSION_ID >= 80400 ? $p->isProtectedSet() || $p->isPrivateSet() : $p->isReadOnly()) ? $p->class : 'stdClass'; } elseif ('*' === $n[1]) { $n = substr($n, 3); $c = $reflector->getProperty($n)->class; diff --git a/src/Symfony/Component/VarExporter/Internal/Hydrator.php b/src/Symfony/Component/VarExporter/Internal/Hydrator.php index 40923634ce4ff..450935e5bdaa3 100644 --- a/src/Symfony/Component/VarExporter/Internal/Hydrator.php +++ b/src/Symfony/Component/VarExporter/Internal/Hydrator.php @@ -20,6 +20,9 @@ */ class Hydrator { + public const PROPERTY_HAS_HOOKS = 1; + public const PROPERTY_NOT_BY_REF = 2; + public static array $hydrators = []; public static array $simpleHydrators = []; public static array $propertyScopes = []; @@ -150,13 +153,16 @@ public static function getHydrator($class) public static function getSimpleHydrator($class) { $baseHydrator = self::$simpleHydrators['stdClass'] ??= (function ($properties, $object) { - $readonly = (array) $this; + $notByRef = (array) $this; foreach ($properties as $name => &$value) { - $object->$name = $value; - - if (!($readonly[$name] ?? false)) { + if (!$noRef = $notByRef[$name] ?? false) { + $object->$name = $value; $object->$name = &$value; + } elseif (true !== $noRef) { + $noRef($object, $value); + } else { + $object->$name = $value; } } })->bindTo(new \stdClass()); @@ -211,14 +217,19 @@ public static function getSimpleHydrator($class) } if (!$classReflector->isInternal()) { - $readonly = new \stdClass(); - foreach ($classReflector->getProperties(\ReflectionProperty::IS_READONLY) as $propertyReflector) { - if ($class === $propertyReflector->class) { - $readonly->{$propertyReflector->name} = true; + $notByRef = new \stdClass(); + foreach ($classReflector->getProperties() as $propertyReflector) { + if ($propertyReflector->isStatic()) { + continue; + } + if (\PHP_VERSION_ID >= 80400 && !$propertyReflector->isAbstract() && $propertyReflector->getHooks()) { + $notByRef->{$propertyReflector->name} = $propertyReflector->setRawValue(...); + } elseif ($propertyReflector->isReadOnly()) { + $notByRef->{$propertyReflector->name} = true; } } - return $baseHydrator->bindTo($readonly, $class); + return $baseHydrator->bindTo($notByRef, $class); } if ($classReflector->name !== $class) { @@ -260,20 +271,23 @@ public static function getPropertyScopes($class): array continue; } $name = $property->name; - $readonlyScope = null; + $access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0); + + if (\PHP_VERSION_ID >= 80400 && !$property->isAbstract() && $h = $property->getHooks()) { + $access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0); + } if (\ReflectionProperty::IS_PRIVATE & $flags) { - if ($flags & \ReflectionProperty::IS_READONLY) { - $readonlyScope = $class; - } - $propertyScopes["\0$class\0$name"] = $propertyScopes[$name] = [$class, $name, $readonlyScope, $property]; + $propertyScopes["\0$class\0$name"] = $propertyScopes[$name] = [$class, $name, null, $access, $property]; continue; } - if ($flags & \ReflectionProperty::IS_READONLY) { - $readonlyScope = $property->class; + + $propertyScopes[$name] = [$class, $name, null, $access, $property]; + + if ($flags & (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY)) { + $propertyScopes[$name][2] = $property->class; } - $propertyScopes[$name] = [$class, $name, $readonlyScope, $property]; if (\ReflectionProperty::IS_PROTECTED & $flags) { $propertyScopes["\0*\0$name"] = $propertyScopes[$name]; @@ -284,12 +298,20 @@ public static function getPropertyScopes($class): array $class = $r->name; foreach ($r->getProperties(\ReflectionProperty::IS_PRIVATE) as $property) { - if (!$property->isStatic()) { - $name = $property->name; - $readonlyScope = $property->isReadOnly() ? $class : null; - $propertyScopes["\0$class\0$name"] = [$class, $name, $readonlyScope, $property]; - $propertyScopes[$name] ??= [$class, $name, $readonlyScope, $property]; + $flags = $property->getModifiers(); + + if (\ReflectionProperty::IS_STATIC & $flags) { + continue; + } + $name = $property->name; + $access = ($flags << 2) | ($flags & \ReflectionProperty::IS_READONLY ? self::PROPERTY_NOT_BY_REF : 0); + + if (\PHP_VERSION_ID >= 80400 && $h = $property->getHooks()) { + $access |= self::PROPERTY_HAS_HOOKS | (isset($h['get']) && !$h['get']->returnsReference() ? self::PROPERTY_NOT_BY_REF : 0); } + + $propertyScopes["\0$class\0$name"] = [$class, $name, null, $access, $property]; + $propertyScopes[$name] ??= $propertyScopes["\0$class\0$name"]; } } diff --git a/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php b/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php index f6450ce7f0e7a..a2034258f0c8c 100644 --- a/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php +++ b/src/Symfony/Component/VarExporter/Internal/LazyObjectRegistry.php @@ -50,6 +50,7 @@ class LazyObjectRegistry public static function getClassResetters($class) { $classProperties = []; + $hookedProperties = []; if ((self::$classReflectors[$class] ??= new \ReflectionClass($class))->isInternal()) { $propertyScopes = []; @@ -57,11 +58,17 @@ public static function getClassResetters($class) $propertyScopes = Hydrator::$propertyScopes[$class] ??= Hydrator::getPropertyScopes($class); } - foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { + foreach ($propertyScopes as $key => [$scope, $name, $writeScope, $access]) { $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; - if ($k === $key && "\0$class\0lazyObjectState" !== $k) { - $classProperties[$readonlyScope ?? $scope][$name] = $key; + if ($k !== $key || "\0$class\0lazyObjectState" === $k) { + continue; + } + + if ($access & Hydrator::PROPERTY_HAS_HOOKS) { + $hookedProperties[$k] = true; + } else { + $classProperties[$writeScope ?? $scope][$name] = $key; } } @@ -82,8 +89,8 @@ public static function getClassResetters($class) public static function getClassAccessors($class) { return \Closure::bind(static fn () => [ - 'get' => static function &($instance, $name, $readonly) { - if (!$readonly) { + 'get' => static function &($instance, $name, $notByRef) { + if (!$notByRef) { return $instance->$name; } $value = $instance->$name; @@ -119,9 +126,26 @@ public static function getParentMethods($class) return $methods; } - public static function getScope($propertyScopes, $class, $property, $readonlyScope = null) + public static function getScopeForRead($propertyScopes, $class, $property) + { + if (!isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) { + return null; + } + $frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; + + if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) { + $scope = $frame['object']->class; + } + if ('*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { + return null; + } + + return $scope; + } + + public static function getScopeForWrite($propertyScopes, $class, $property, $flags) { - if (null === $readonlyScope && !isset($propertyScopes[$k = "\0$class\0$property"]) && !isset($propertyScopes[$k = "\0*\0$property"])) { + if (!($flags & (\ReflectionProperty::IS_PRIVATE | \ReflectionProperty::IS_PROTECTED | \ReflectionProperty::IS_READONLY | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET | \ReflectionProperty::IS_PROTECTED_SET : 0)))) { return null; } $frame = debug_backtrace(\DEBUG_BACKTRACE_PROVIDE_OBJECT | \DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]; @@ -129,7 +153,10 @@ public static function getScope($propertyScopes, $class, $property, $readonlySco if (\ReflectionProperty::class === $scope = $frame['class'] ?? \Closure::class) { $scope = $frame['object']->class; } - if (null === $readonlyScope && '*' === $k[1] && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { + if ($flags & (\ReflectionProperty::IS_PRIVATE | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PRIVATE_SET : \ReflectionProperty::IS_READONLY))) { + return $scope; + } + if ($flags & (\ReflectionProperty::IS_PROTECTED | (\PHP_VERSION_ID >= 80400 ? \ReflectionProperty::IS_PROTECTED_SET : 0)) && ($class === $scope || (is_subclass_of($class, $scope) && !isset($propertyScopes["\0$scope\0$property"])))) { return null; } diff --git a/src/Symfony/Component/VarExporter/Internal/LazyObjectState.php b/src/Symfony/Component/VarExporter/Internal/LazyObjectState.php index 30fbff18028ca..ac16d13b82acb 100644 --- a/src/Symfony/Component/VarExporter/Internal/LazyObjectState.php +++ b/src/Symfony/Component/VarExporter/Internal/LazyObjectState.php @@ -43,7 +43,7 @@ public function __construct( ) { } - public function initialize($instance, $propertyName, $propertyScope) + public function initialize($instance, $propertyName, $writeScope) { if (self::STATUS_UNINITIALIZED_FULL !== $this->status) { return $this->status; @@ -74,10 +74,10 @@ public function reset($instance): void $skippedProperties = $this->skippedProperties; $properties = (array) $instance; - foreach ($propertyScopes as $key => [$scope, $name, $readonlyScope]) { + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; - if ($k === $key && (null !== $readonlyScope || !\array_key_exists($k, $properties))) { + if ($k === $key && ($access & Hydrator::PROPERTY_HAS_HOOKS || ($access >> 2) & \ReflectionProperty::IS_READONLY || !\array_key_exists($k, $properties))) { $skippedProperties[$k] = true; } } diff --git a/src/Symfony/Component/VarExporter/LazyGhostTrait.php b/src/Symfony/Component/VarExporter/LazyGhostTrait.php index 72a96d42449ae..2d90ca33c3e81 100644 --- a/src/Symfony/Component/VarExporter/LazyGhostTrait.php +++ b/src/Symfony/Component/VarExporter/LazyGhostTrait.php @@ -122,22 +122,28 @@ public function &__get($name): mixed { $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; + $notByRef = 0; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); $state = $this->lazyObjectState ?? null; if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"]))) { + $notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF; + if (LazyObjectState::STATUS_INITIALIZED_FULL === $state->status) { // Work around php/php-src#12695 $property = null === $scope ? $name : "\0$scope\0$name"; - $property = $propertyScopes[$property][3] - ?? Hydrator::$propertyScopes[$this::class][$property][3] = new \ReflectionProperty($scope ?? $class, $name); + $property = $propertyScopes[$property][4] + ?? Hydrator::$propertyScopes[$this::class][$property][4] = new \ReflectionProperty($scope ?? $class, $name); } else { $property = null; } + if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) { + $scope ??= $writeScope; + } - if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope)) { + if ($property?->isInitialized($this) ?? LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope)) { goto get_in_scope; } } @@ -161,7 +167,7 @@ public function &__get($name): mixed try { if (null === $scope) { - if (null === $readonlyScope) { + if (!$notByRef) { return $this->$name; } $value = $this->$name; @@ -170,7 +176,7 @@ public function &__get($name): mixed } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['get']($this, $name, null !== $readonlyScope); + return $accessor['get']($this, $name, $notByRef); } catch (\Error $e) { if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { throw $e; @@ -185,7 +191,7 @@ public function &__get($name): mixed $accessor['set']($this, $name, []); - return $accessor['get']($this, $name, null !== $readonlyScope); + return $accessor['get']($this, $name, $notByRef); } catch (\Error) { if (preg_match('/^Cannot access uninitialized non-nullable property ([^ ]++) by reference$/', $e->getMessage(), $matches)) { throw new \Error('Typed property '.$matches[1].' must not be accessed before initialization', $e->getCode(), $e->getPrevious()); @@ -201,15 +207,15 @@ public function __set($name, $value): void $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); $state = $this->lazyObjectState ?? null; - if ($state && ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) + if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status ) { if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { - $state->initialize($this, $name, $readonlyScope ?? $scope); + $state->initialize($this, $name, $writeScope ?? $scope); } goto set_in_scope; } @@ -236,13 +242,13 @@ public function __isset($name): bool $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); + if ([$class, , $writeScope] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); $state = $this->lazyObjectState ?? null; if ($state && (null === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status - && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $readonlyScope ?? $scope) + && LazyObjectState::STATUS_UNINITIALIZED_PARTIAL !== $state->initialize($this, $name, $writeScope ?? $scope) ) { goto isset_in_scope; } @@ -267,15 +273,15 @@ public function __unset($name): void $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); $state = $this->lazyObjectState ?? null; - if ($state && ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) + if ($state && ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) && LazyObjectState::STATUS_INITIALIZED_FULL !== $state->status ) { if (LazyObjectState::STATUS_UNINITIALIZED_FULL === $state->status) { - $state->initialize($this, $name, $readonlyScope ?? $scope); + $state->initialize($this, $name, $writeScope ?? $scope); } goto unset_in_scope; } diff --git a/src/Symfony/Component/VarExporter/LazyProxyTrait.php b/src/Symfony/Component/VarExporter/LazyProxyTrait.php index 795e4d77d530d..3c59b73fdba8b 100644 --- a/src/Symfony/Component/VarExporter/LazyProxyTrait.php +++ b/src/Symfony/Component/VarExporter/LazyProxyTrait.php @@ -105,14 +105,19 @@ public function &__get($name): mixed $propertyScopes = Hydrator::$propertyScopes[$this::class] ??= Hydrator::getPropertyScopes($this::class); $scope = null; $instance = $this; + $notByRef = 0; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $notByRef = $access & Hydrator::PROPERTY_NOT_BY_REF; + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } + if (\PHP_VERSION_ID >= 80400 && !$notByRef && ($access >> 2) & \ReflectionProperty::IS_PRIVATE_SET) { + $scope ??= $writeScope; + } $parent = 2; goto get_in_scope; } @@ -136,10 +141,11 @@ public function &__get($name): mixed } get_in_scope: + $notByRef = $notByRef || 1 === $parent; try { if (null === $scope) { - if (null === $readonlyScope && 1 !== $parent) { + if (!$notByRef) { return $instance->$name; } $value = $instance->$name; @@ -148,7 +154,7 @@ public function &__get($name): mixed } $accessor = Registry::$classAccessors[$scope] ??= Registry::getClassAccessors($scope); - return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); + return $accessor['get']($instance, $name, $notByRef); } catch (\Error $e) { if (\Error::class !== $e::class || !str_starts_with($e->getMessage(), 'Cannot access uninitialized non-nullable property')) { throw $e; @@ -163,7 +169,7 @@ public function &__get($name): mixed $accessor['set']($instance, $name, []); - return $accessor['get']($instance, $name, null !== $readonlyScope || 1 === $parent); + return $accessor['get']($instance, $name, $notByRef); } catch (\Error) { throw $e; } @@ -176,10 +182,10 @@ public function __set($name, $value): void $scope = null; $instance = $this; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); - if ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } @@ -212,7 +218,7 @@ public function __isset($name): bool $instance = $this; if ([$class] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name); + $scope = Registry::getScopeForRead($propertyScopes, $class, $name); if (null === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { @@ -244,10 +250,10 @@ public function __unset($name): void $scope = null; $instance = $this; - if ([$class, , $readonlyScope] = $propertyScopes[$name] ?? null) { - $scope = Registry::getScope($propertyScopes, $class, $name, $readonlyScope); + if ([$class, , $writeScope, $access] = $propertyScopes[$name] ?? null) { + $scope = Registry::getScopeForWrite($propertyScopes, $class, $name, $access >> 2); - if ($readonlyScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { + if ($writeScope === $scope || isset($propertyScopes["\0$scope\0$name"])) { if ($state = $this->lazyObjectState ?? null) { $instance = $state->realInstance ??= ($state->initializer)(); } diff --git a/src/Symfony/Component/VarExporter/ProxyHelper.php b/src/Symfony/Component/VarExporter/ProxyHelper.php index e0cc84f7e279a..c0534eae8fdaa 100644 --- a/src/Symfony/Component/VarExporter/ProxyHelper.php +++ b/src/Symfony/Component/VarExporter/ProxyHelper.php @@ -33,7 +33,7 @@ public static function generateLazyGhost(\ReflectionClass $class): string if ($class->isFinal()) { throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" is final.', $class->name)); } - if ($class->isInterface() || $class->isAbstract()) { + if ($class->isInterface() || $class->isAbstract() || $class->isTrait()) { throw new LogicException(\sprintf('Cannot generate lazy ghost: "%s" is not a concrete class.', $class->name)); } if (\stdClass::class !== $class->name && $class->isInternal()) { @@ -58,7 +58,48 @@ public static function generateLazyGhost(\ReflectionClass $class): string throw new LogicException(\sprintf('Cannot generate lazy ghost: class "%s" extends "%s" which is internal.', $class->name, $parent->name)); } } - $propertyScopes = self::exportPropertyScopes($class->name); + + $hooks = ''; + $propertyScopes = Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name); + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + $flags = $access >> 2; + + if ($k !== $key || !($access & Hydrator::PROPERTY_HAS_HOOKS) || $flags & \ReflectionProperty::IS_VIRTUAL) { + continue; + } + + if ($flags & (\ReflectionProperty::IS_FINAL | \ReflectionProperty::IS_PRIVATE)) { + throw new LogicException(sprintf('Cannot generate lazy ghost: property "%s::$%s" is final or private(set).', $class->name, $name)); + } + + $p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name}" + .($p->hasDefaultValue() ? ' = '.VarExporter::export($p->getDefaultValue()) : '') + ." {\n"; + + foreach ($p->getHooks() as $hook => $method) { + if ('get' === $hook) { + $ref = ($method->returnsReference() ? '&' : ''); + $hooks .= " {$ref}get { \$this->initializeLazyObject(); return parent::\${$name}::get(); }\n"; + } elseif ('set' === $hook) { + $parameters = self::exportParameters($method, true); + $arg = '$'.$method->getParameters()[0]->name; + $hooks .= " set({$parameters}) { \$this->initializeLazyObject(); parent::\${$name}::set({$arg}); }\n"; + } else { + throw new LogicException(sprintf('Cannot generate lazy ghost: hook "%s::%s()" is not supported.', $class->name, $method->name)); + } + } + + $hooks .= " }\n"; + } + + $propertyScopes = self::exportPropertyScopes($class->name, $propertyScopes); return <<name} implements \Symfony\Component\VarExporter\LazyObjectInterface @@ -66,7 +107,7 @@ public static function generateLazyGhost(\ReflectionClass $class): string use \Symfony\Component\VarExporter\LazyGhostTrait; private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes}; - } + {$hooks}} // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); @@ -95,14 +136,104 @@ public static function generateLazyProxy(?\ReflectionClass $class, array $interf throw new LogicException(\sprintf('Cannot generate lazy proxy with PHP < 8.3: class "%s" is readonly.', $class->name)) BBE3 ; } + $propertyScopes = $class ? Hydrator::$propertyScopes[$class->name] ??= Hydrator::getPropertyScopes($class->name) : []; + $abstractProperties = []; + $hookedProperties = []; + if (\PHP_VERSION_ID >= 80400 && $class) { + foreach ($propertyScopes as $key => [$scope, $name, , $access]) { + $propertyScopes[$k = "\0$scope\0$name"] ?? $propertyScopes[$k = "\0*\0$name"] ?? $k = $name; + $flags = $access >> 2; + + if ($k !== $key) { + continue; + } + + if ($flags & \ReflectionProperty::IS_ABSTRACT) { + $abstractProperties[$name] = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + continue; + } + $abstractProperties[$name] = false; + + if (!($access & Hydrator::PROPERTY_HAS_HOOKS) || $flags & \ReflectionProperty::IS_VIRTUAL) { + continue; + } + + if ($flags & (\ReflectionProperty::IS_FINAL | \ReflectionProperty::IS_PRIVATE)) { + throw new LogicException(sprintf('Cannot generate lazy proxy: property "%s::$%s" is final or private(set).', $class->name, $name)); + } + + $p = $propertyScopes[$k][4] ?? Hydrator::$propertyScopes[$class->name][$k][4] = new \ReflectionProperty($scope, $name); + $hookedProperties[$name] = [$p, $p->getHooks()]; + } + } + $methodReflectors = [$class?->getMethods(\ReflectionMethod::IS_PUBLIC | \ReflectionMethod::IS_PROTECTED) ?? []]; foreach ($interfaces as $interface) { if (!$interface->isInterface()) { throw new LogicException(\sprintf('Cannot generate lazy proxy: "%s" is not an interface.', $interface->name)); } $methodReflectors[] = $interface->getMethods(); + + if (\PHP_VERSION_ID >= 80400) { + foreach ($interface->getProperties() as $p) { + $abstractProperties[$p->name] ??= $p; + $hookedProperties[$p->name] ??= [$p, []]; + $hookedProperties[$p->name][1] += $p->getHooks(); + } + } + } + + $hooks = ''; + + foreach (array_filter($abstractProperties) as $name => $p) { + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name};\n"; + } + + foreach ($hookedProperties as $name => [$p, $methods]) { + $type = self::exportType($p); + $hooks .= "\n " + .($p->isProtected() ? 'protected' : 'public') + .($p->isProtectedSet() ? ' protected(set)' : '') + ." {$type} \${$name} {\n"; + + foreach ($methods as $hook => $method) { + if ('get' === $hook) { + $ref = ($method->returnsReference() ? '&' : ''); + $hooks .= <<lazyObjectState)) { + return (\$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)())->{$p->name}; + } + + return parent::\${$p->name}::get(); + } + + EOPHP; + } elseif ('set' === $hook) { + $parameters = self::exportParameters($method, true); + $arg = '$'.$method->getParameters()[0]->name; + $hooks .= <<lazyObjectState)) { + \$this->lazyObjectState->realInstance ??= (\$this->lazyObjectState->initializer)(); + \$this->lazyObjectState->realInstance->{$p->name} = {$arg}; + } + + parent::\${$p->name}::set({$arg}); + } + + EOPHP; + } else { + throw new LogicException(sprintf('Cannot generate lazy proxy: hook "%s::%s()" is not supported.', $class->name, $method->name)); + } + } + + $hooks .= " }\n"; } - $methodReflectors = array_merge(...$methodReflectors); $extendsInternalClass = false; if ($parent = $class) { @@ -112,6 +243,7 @@ public static function generateLazyProxy(?\ReflectionClass $class, array $interf } $methodsHaveToBeProxied = $extendsInternalClass; $methods = []; + $methodReflectors = array_merge(...$methodReflectors); foreach ($methodReflectors as $method) { if ('__get' !== strtolower($method->name) || 'mixed' === ($type = self::exportType($method) ?? 'mixed')) { @@ -195,7 +327,7 @@ public static function generateLazyProxy(?\ReflectionClass $class, array $interf $methods = ['initializeLazyObject' => implode('', $body).' }'] + $methods; } $body = $methods ? "\n".implode("\n\n", $methods)."\n" : ''; - $propertyScopes = $class ? self::exportPropertyScopes($class->name) : '[]'; + $propertyScopes = $class ? self::exportPropertyScopes($class->name, $propertyScopes) : '[]'; if ( $class?->hasMethod('__unserialize') @@ -228,7 +360,7 @@ public function __unserialize(\$data): void {$lazyProxyTraitStatement} private const LAZY_OBJECT_PROPERTY_SCOPES = {$propertyScopes}; - {$body}} + {$hooks}{$body}} // Help opcache.preload discover always-needed symbols class_exists(\Symfony\Component\VarExporter\Internal\Hydrator::class); @@ -238,7 +370,7 @@ class_exists(\Symfony\Component\VarExporter\Internal\LazyObjectState::class); EOPHP; } - public static function exportSignature(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string + public static function exportParameters(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string { $byRefIndex = 0; $args = ''; @@ -268,8 +400,15 @@ public static function exportSignature(\ReflectionFunctionAbstract $function, bo $args = implode(', ', $args); } + return implode(', ', $parameters); + } + + public static function exportSignature(\ReflectionFunctionAbstract $function, bool $withParameterTypes = true, ?string &$args = null): string + { + $parameters = self::exportParameters($function, $withParameterTypes, $args); + $signature = 'function '.($function->returnsReference() ? '&' : '') - .($function->isClosure() ? '' : $function->name).'('.implode(', ', $parameters).')'; + .($function->isClosure() ? '' : $function->name).'('.$parameters.')'; if ($function instanceof \ReflectionMethod) { $signature = ($function->isPublic() ? 'public ' : ($function->isProtected() ? 'protected ' : 'private ')) @@ -345,12 +484,11 @@ public static function exportType(\ReflectionFunctionAbstract|\ReflectionPropert return implode($glue, $types); } - private static function exportPropertyScopes(string $parent): string + private static function exportPropertyScopes(string $parent, array $propertyScopes): string { - $propertyScopes = Hydrator::$propertyScopes[$parent] ??= Hydrator::getPropertyScopes($parent); uksort($propertyScopes, 'strnatcmp'); foreach ($propertyScopes as $k => $v) { - unset($propertyScopes[$k][3]); + unset($propertyScopes[$k][4]); } $propertyScopes = VarExporter::export($propertyScopes); $propertyScopes = str_replace(VarExporter::export($parent), 'parent::class', $propertyScopes); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/BackedProperty.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/BackedProperty.php new file mode 100644 index 0000000000000..5c5d7688f97ca --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/BackedProperty.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Tests\Fixtures; + +class BackedProperty +{ + public private(set) string $name { + get => $this->name; + set => $value; + } + public function __construct(string $name) + { + $this->name = $name; + } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyGhost/ChildMagicClass.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyGhost/ChildMagicClass.php index ca6b235eba66d..6cac9ffc03d01 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyGhost/ChildMagicClass.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyGhost/ChildMagicClass.php @@ -18,14 +18,5 @@ class ChildMagicClass extends MagicClass implements LazyObjectInterface { use LazyGhostTrait; - private const LAZY_OBJECT_PROPERTY_SCOPES = [ - "\0".self::class."\0".'data' => [self::class, 'data', null], - "\0".self::class."\0".'lazyObjectState' => [self::class, 'lazyObjectState', null], - "\0".parent::class."\0".'data' => [parent::class, 'data', null], - 'cloneCounter' => [self::class, 'cloneCounter', null], - 'data' => [self::class, 'data', null], - 'lazyObjectState' => [self::class, 'lazyObjectState', null], - ]; - private int $data = 123; } diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AbstractHooked.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AbstractHooked.php new file mode 100644 index 0000000000000..3d9cde20c7b15 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AbstractHooked.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy; + +abstract class AbstractHooked implements HookedInterface +{ + abstract public string $bar { get; } + + public int $backed { + get { return $this->backed ??= 234; } + set { $this->backed = $value; } + } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AsymmetricVisibility.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AsymmetricVisibility.php new file mode 100644 index 0000000000000..a912ca403ca26 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/AsymmetricVisibility.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy; + +class AsymmetricVisibility +{ + public function __construct( + public private(set) int $foo, + private readonly int $bar, + ) { + } + + public function getBar(): int + { + return $this->bar; + } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/Hooked.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/Hooked.php new file mode 100644 index 0000000000000..62174f92d5847 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/Hooked.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy; + +class Hooked +{ + public int $notBacked { + get { return 123; } + set { throw \LogicException('Cannot set value.'); } + } + + public int $backed { + get { return $this->backed ??= 234; } + set { $this->backed = $value; } + } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedInterface.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedInterface.php new file mode 100644 index 0000000000000..9cdafd9c1fdfa --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedInterface.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy; + +interface HookedInterface +{ + public string $foo { get; } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedWithDefaultValue.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedWithDefaultValue.php new file mode 100644 index 0000000000000..7d49049ac449a --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/LazyProxy/HookedWithDefaultValue.php @@ -0,0 +1,21 @@ + $this->backedIntWithDefault; + set => $this->backedIntWithDefault = $value; + } + + public string $backedStringWithDefault = '321' { + get => $this->backedStringWithDefault; + set => $this->backedStringWithDefault = $value; + } + + public bool $backedBoolWithDefault = false { + get => $this->backedBoolWithDefault; + set => $this->backedBoolWithDefault = $value; + } +} diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/backed-property.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/backed-property.php new file mode 100644 index 0000000000000..bcbc5729e9e5b --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/backed-property.php @@ -0,0 +1,17 @@ + [ + 'name' => [ + 'name', + ], + ], + ], + $o[0], + [] +); diff --git a/src/Symfony/Component/VarExporter/Tests/LazyGhostTraitTest.php b/src/Symfony/Component/VarExporter/Tests/LazyGhostTraitTest.php index 3c892cd7d98bb..2b148a6daa3bf 100644 --- a/src/Symfony/Component/VarExporter/Tests/LazyGhostTraitTest.php +++ b/src/Symfony/Component/VarExporter/Tests/LazyGhostTraitTest.php @@ -24,6 +24,9 @@ use Symfony\Component\VarExporter\Tests\Fixtures\LazyGhost\MagicClass; use Symfony\Component\VarExporter\Tests\Fixtures\LazyGhost\ReadOnlyClass; use Symfony\Component\VarExporter\Tests\Fixtures\LazyGhost\TestClass; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\AsymmetricVisibility; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Hooked; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\HookedWithDefaultValue; use Symfony\Component\VarExporter\Tests\Fixtures\SimpleObject; class LazyGhostTraitTest extends TestCase @@ -291,6 +294,79 @@ public function testReinitLazyGhost() $this->assertSame(3, $object->public); } + /** + * @requires PHP 8.4 + */ + public function testPropertyHooks() + { + $initialized = false; + $object = $this->createLazyGhost(Hooked::class, function ($instance) use (&$initialized) { + $initialized = true; + }); + + $this->assertSame(123, $object->notBacked); + $this->assertFalse($initialized); + $this->assertSame(234, $object->backed); + $this->assertTrue($initialized); + + $initialized = false; + $object = $this->createLazyGhost(Hooked::class, function ($instance) use (&$initialized) { + $initialized = true; + }); + + $object->backed = 345; + $this->assertTrue($initialized); + $this->assertSame(345, $object->backed); + } + + /** + * @requires PHP 8.4 + */ + public function testPropertyHooksWithDefaultValue() + { + $initialized = false; + $object = $this->createLazyGhost(HookedWithDefaultValue::class, function ($instance) use (&$initialized) { + $initialized = true; + }); + + $this->assertSame(321, $object->backedIntWithDefault); + $this->assertSame('321', $object->backedStringWithDefault); + $this->assertSame(false, $object->backedBoolWithDefault); + $this->assertTrue($initialized); + + $initialized = false; + $object = $this->createLazyGhost(HookedWithDefaultValue::class, function ($instance) use (&$initialized) { + $initialized = true; + }); + $object->backedIntWithDefault = 654; + $object->backedStringWithDefault = '654'; + $object->backedBoolWithDefault = true; + $this->assertTrue($initialized); + $this->assertSame(654, $object->backedIntWithDefault); + $this->assertSame('654', $object->backedStringWithDefault); + $this->assertSame(true, $object->backedBoolWithDefault); + } + + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibility() + { + $object = $this->createLazyGhost(AsymmetricVisibility::class, function ($instance) { + $instance->__construct(123, 234); + }); + + $this->assertSame(123, $object->foo); + $this->assertSame(234, $object->getBar()); + + $object = $this->createLazyGhost(AsymmetricVisibility::class, function ($instance) { + $instance->__construct(123, 234); + }); + + $this->assertSame(234, $object->getBar()); + $this->assertSame(123, $object->foo); + } + /** * @template T * diff --git a/src/Symfony/Component/VarExporter/Tests/LazyProxyTraitTest.php b/src/Symfony/Component/VarExporter/Tests/LazyProxyTraitTest.php index 5e719e0343f5d..43213a7d39ff5 100644 --- a/src/Symfony/Component/VarExporter/Tests/LazyProxyTraitTest.php +++ b/src/Symfony/Component/VarExporter/Tests/LazyProxyTraitTest.php @@ -19,7 +19,10 @@ use Symfony\Component\VarExporter\LazyProxyTrait; use Symfony\Component\VarExporter\ProxyHelper; use Symfony\Component\VarExporter\Tests\Fixtures\LazyGhost\RegularClass; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\AbstractHooked; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\AsymmetricVisibility; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\FinalPublicClass; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Hooked; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\ReadOnlyClass; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\StringMagicGetClass; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\TestClass; @@ -321,6 +324,89 @@ public function testReinitReadonlyLazyProxy() $this->assertSame(234, $object->foo); } + /** + * @requires PHP 8.4 + */ + public function testConcretePropertyHooks() + { + $initialized = false; + $object = $this->createLazyProxy(Hooked::class, function () use (&$initialized) { + $initialized = true; + + return new Hooked(); + }); + + $this->assertSame(123, $object->notBacked); + $this->assertFalse($initialized); + $this->assertSame(234, $object->backed); + $this->assertTrue($initialized); + + $initialized = false; + $object = $this->createLazyProxy(Hooked::class, function () use (&$initialized) { + $initialized = true; + + return new Hooked(); + }); + + $object->backed = 345; + $this->assertTrue($initialized); + $this->assertSame(345, $object->backed); + } + + /** + * @requires PHP 8.4 + */ + public function testAbstractPropertyHooks() + { + $initialized = false; + $object = $this->createLazyProxy(AbstractHooked::class, function () use (&$initialized) { + $initialized = true; + + return new class extends AbstractHooked { + public string $foo = 'Foo'; + public string $bar = 'Bar'; + }; + }); + + $this->assertSame('Foo', $object->foo); + $this->assertSame('Bar', $object->bar); + $this->assertTrue($initialized); + + $initialized = false; + $object = $this->createLazyProxy(AbstractHooked::class, function () use (&$initialized) { + $initialized = true; + + return new class extends AbstractHooked { + public string $foo = 'Foo'; + public string $bar = 'Bar'; + }; + }); + + $this->assertSame('Bar', $object->bar); + $this->assertSame('Foo', $object->foo); + $this->assertTrue($initialized); + } + + /** + * @requires PHP 8.4 + */ + public function testAsymmetricVisibility() + { + $object = $this->createLazyProxy(AsymmetricVisibility::class, function () { + return new AsymmetricVisibility(123, 234); + }); + + $this->assertSame(123, $object->foo); + $this->assertSame(234, $object->getBar()); + + $object = $this->createLazyProxy(AsymmetricVisibility::class, function () { + return new AsymmetricVisibility(123, 234); + }); + + $this->assertSame(234, $object->getBar()); + $this->assertSame(123, $object->foo); + } + /** * @template T * diff --git a/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php b/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php index f6c6e1099cdac..b9c67adf17437 100644 --- a/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php +++ b/src/Symfony/Component/VarExporter/Tests/ProxyHelperTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\VarExporter\Exception\LogicException; use Symfony\Component\VarExporter\ProxyHelper; +use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Hooked; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\Php82NullStandaloneReturnType; use Symfony\Component\VarExporter\Tests\Fixtures\LazyProxy\StringMagicGetClass; @@ -246,6 +247,16 @@ public function testNullStandaloneReturnType() ProxyHelper::generateLazyProxy(new \ReflectionClass(Php82NullStandaloneReturnType::class)) ); } + + /** + * @requires PHP 8.4 + */ + public function testPropertyHooks() + { + $proxyCode = ProxyHelper::generateLazyProxy(new \ReflectionClass(Hooked::class)); + self::assertStringContainsString("'backed' => [parent::class, 'backed', null, 7],", $proxyCode); + self::assertStringContainsString("'notBacked' => [parent::class, 'notBacked', null, 2055],", $proxyCode); + } } abstract class TestForProxyHelper diff --git a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php index 10942a56caaca..6ca98b91487aa 100644 --- a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php +++ b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php @@ -16,6 +16,7 @@ use Symfony\Component\VarExporter\Exception\ClassNotFoundException; use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; use Symfony\Component\VarExporter\Internal\Registry; +use Symfony\Component\VarExporter\Tests\Fixtures\BackedProperty; use Symfony\Component\VarExporter\Tests\Fixtures\FooReadonly; use Symfony\Component\VarExporter\Tests\Fixtures\FooSerializable; use Symfony\Component\VarExporter\Tests\Fixtures\FooUnitEnum; @@ -235,6 +236,12 @@ public static function provideExport() yield ['unit-enum', [FooUnitEnum::Bar], true]; yield ['readonly', new FooReadonly('k', 'v')]; + + if (\PHP_VERSION_ID < 80400) { + return; + } + + yield ['backed-property', new BackedProperty('name')]; } public function testUnicodeDirectionality() diff --git a/src/Symfony/Component/WebLink/Link.php b/src/Symfony/Component/WebLink/Link.php index f8bf6e4f52e01..1f5fbbdf9c6b5 100644 --- a/src/Symfony/Component/WebLink/Link.php +++ b/src/Symfony/Component/WebLink/Link.php @@ -98,6 +98,12 @@ class Link implements EvolvableLinkInterface public const REL_PREDECESSOR_VERSION = 'predecessor-version'; public const REL_PREFETCH = 'prefetch'; public const REL_PRELOAD = 'preload'; + + /** + * This feature is deprecated and superseded by the Speculation Rules API. + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/prerender + */ public const REL_PRERENDER = 'prerender'; public const REL_PREV = 'prev'; public const REL_PREVIEW = 'preview'; diff --git a/src/Symfony/Component/Workflow/Tests/Validator/WorkflowValidatorTest.php b/src/Symfony/Component/Workflow/Tests/Validator/WorkflowValidatorTest.php index 34eeda6f82721..50c3abd98b541 100644 --- a/src/Symfony/Component/Workflow/Tests/Validator/WorkflowValidatorTest.php +++ b/src/Symfony/Component/Workflow/Tests/Validator/WorkflowValidatorTest.php @@ -55,4 +55,32 @@ public function testSameTransitionNameButNotSamePlace() // the test ensures that the validation does not fail (i.e. it does not throw any exceptions) $this->addToAssertionCount(1); } + + public function testWithTooManyOutput() + { + $places = ['a', 'b', 'c']; + $transitions = [ + new Transition('t1', 'a', ['b', 'c']), + ]; + $definition = new Definition($places, $transitions); + + $this->expectException(InvalidDefinitionException::class); + $this->expectExceptionMessage('The marking store of workflow "foo" cannot store many places. But the transition "t1" has too many output (2). Only one is accepted.'); + + (new WorkflowValidator(true))->validate($definition, 'foo'); + } + + public function testWithTooManyInitialPlaces() + { + $places = ['a', 'b', 'c']; + $transitions = [ + new Transition('t1', 'a', 'b'), + ]; + $definition = new Definition($places, $transitions, ['a', 'b']); + + $this->expectException(InvalidDefinitionException::class); + $this->expectExceptionMessage('The marking store of workflow "foo" cannot store many places. But the definition has 2 initial places. Only one is supported.'); + + (new WorkflowValidator(true))->validate($definition, 'foo'); + } } diff --git a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php index e78530af79020..a2236e0236e90 100644 --- a/src/Symfony/Component/Workflow/Tests/WorkflowTest.php +++ b/src/Symfony/Component/Workflow/Tests/WorkflowTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Workflow\Definition; +use Symfony\Component\Workflow\Event\EnteredEvent; use Symfony\Component\Workflow\Event\Event; use Symfony\Component\Workflow\Event\GuardEvent; use Symfony\Component\Workflow\Event\TransitionEvent; @@ -689,6 +690,44 @@ public function testEventDefaultInitialContext() $workflow->apply($subject, 't1'); } + public function testEventWhenAlreadyInThisPlace() + { + // ┌──────┐ ┌──────────────────────┐ ┌───┐ ┌─────────────┐ ┌───┐ + // │ init │ ──▶ │ from_init_to_a_and_b │ ──▶ │ B │ ──▶ │ from_b_to_c │ ──▶ │ C │ + // └──────┘ └──────────────────────┘ └───┘ └─────────────┘ └───┘ + // │ + // │ + // ▼ + // ┌───────────────────────────────┐ + // │ A │ + // └───────────────────────────────┘ + $definition = new Definition( + ['init', 'A', 'B', 'C'], + [ + new Transition('from_init_to_a_and_b', 'init', ['A', 'B']), + new Transition('from_b_to_c', 'B', 'C'), + ], + ); + + $subject = new Subject(); + $dispatcher = new EventDispatcher(); + $name = 'workflow_name'; + $workflow = new Workflow($definition, new MethodMarkingStore(), $dispatcher, $name); + + $calls = []; + $listener = function (Event $event) use (&$calls) { + $calls[] = $event; + }; + $dispatcher->addListener("workflow.$name.entered.A", $listener); + + $workflow->apply($subject, 'from_init_to_a_and_b'); + $workflow->apply($subject, 'from_b_to_c'); + + $this->assertCount(1, $calls); + $this->assertInstanceOf(EnteredEvent::class, $calls[0]); + $this->assertSame('from_init_to_a_and_b', $calls[0]->getTransition()->getName()); + } + public function testMarkingStateOnApplyWithEventDispatcher() { $definition = new Definition(range('a', 'f'), [new Transition('t', range('a', 'c'), range('d', 'f'))]); diff --git a/src/Symfony/Component/Workflow/Workflow.php b/src/Symfony/Component/Workflow/Workflow.php index 04b0084dd5fbd..9165ebb2b24a5 100644 --- a/src/Symfony/Component/Workflow/Workflow.php +++ b/src/Symfony/Component/Workflow/Workflow.php @@ -385,7 +385,13 @@ private function entered(object $subject, ?Transition $transition, Marking $mark $this->dispatcher->dispatch($event, WorkflowEvents::ENTERED); $this->dispatcher->dispatch($event, \sprintf('workflow.%s.entered', $this->name)); - foreach ($marking->getPlaces() as $placeName => $nbToken) { + $placeNames = []; + if ($transition) { + $placeNames = $transition->getTos(); + } elseif ($this->definition->getInitialPlaces()) { + $placeNames = $this->definition->getInitialPlaces(); + } + foreach ($placeNames as $placeName) { $this->dispatcher->dispatch($event, \sprintf('workflow.%s.entered.%s', $this->name, $placeName)); } } diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 34ef66e654c5b..ff663f91fccf8 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -744,7 +744,7 @@ private static function evaluateScalar(string $scalar, int $flags, array &$refer if (false !== $scalar = $time->getTimestamp()) { return $scalar; } - } catch (\ValueError) { + } catch (\DateRangeError|\ValueError) { // no-op } diff --git a/src/Symfony/Component/Yaml/Parser.php b/src/Symfony/Component/Yaml/Parser.php index f82f2b5708bac..f759a64c1b2fb 100644 --- a/src/Symfony/Component/Yaml/Parser.php +++ b/src/Symfony/Component/Yaml/Parser.php @@ -1165,7 +1165,18 @@ private function lexInlineQuotedString(int &$cursor = 0): string private function lexUnquotedString(int &$cursor): string { $offset = $cursor; - $cursor += strcspn($this->currentLine, '[]{},: ', $cursor); + + while ($cursor < strlen($this->currentLine)) { + if (in_array($this->currentLine[$cursor], ['[', ']', '{', '}', ',', ':'], true)) { + break; + } + + if (\in_array($this->currentLine[$cursor], [' ', "\t"], true) && '#' === ($this->currentLine[$cursor + 1] ?? '')) { + break; + } + + ++$cursor; + } if ($cursor === $offset) { throw new ParseException('Malformed unquoted YAML string.'); @@ -1174,17 +1185,17 @@ private function lexUnquotedString(int &$cursor): string return substr($this->currentLine, $offset, $cursor - $offset); } - private function lexInlineMapping(int &$cursor = 0): string + private function lexInlineMapping(int &$cursor = 0, bool $consumeUntilEol = true): string { - return $this->lexInlineStructure($cursor, '}'); + return $this->lexInlineStructure($cursor, '}', $consumeUntilEol); } - private function lexInlineSequence(int &$cursor = 0): string + private function lexInlineSequence(int &$cursor = 0, bool $consumeUntilEol = true): string { - return $this->lexInlineStructure($cursor, ']'); + return $this->lexInlineStructure($cursor, ']', $consumeUntilEol); } - private function lexInlineStructure(int &$cursor, string $closingTag): string + private function lexInlineStructure(int &$cursor, string $closingTag, bool $consumeUntilEol = true): string { $value = $this->currentLine[$cursor]; ++$cursor; @@ -1204,15 +1215,19 @@ private function lexInlineStructure(int &$cursor, string $closingTag): string ++$cursor; break; case '{': - $value .= $this->lexInlineMapping($cursor); + $value .= $this->lexInlineMapping($cursor, false); break; case '[': - $value .= $this->lexInlineSequence($cursor); + $value .= $this->lexInlineSequence($cursor, false); break; case $closingTag: $value .= $this->currentLine[$cursor]; ++$cursor; + if ($consumeUntilEol && isset($this->currentLine[$cursor]) && ($whitespaces = strspn($this->currentLine, ' ', $cursor) + $cursor) < strlen($this->currentLine) && '#' !== $this->currentLine[$whitespaces]) { + throw new ParseException(sprintf('Unexpected token "%s".', trim(substr($this->currentLine, $cursor)))); + } + return $value; case '#': break 2; @@ -1238,7 +1253,7 @@ private function consumeWhitespaces(int &$cursor): bool $whitespacesConsumed = 0; do { - $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor); + $whitespaceOnlyTokenLength = strspn($this->currentLine, " \t", $cursor); $whitespacesConsumed += $whitespaceOnlyTokenLength; $cursor += $whitespaceOnlyTokenLength; diff --git a/src/Symfony/Component/Yaml/Tests/ParserTest.php b/src/Symfony/Component/Yaml/Tests/ParserTest.php index fad946946b503..5b3395b0ba7f0 100644 --- a/src/Symfony/Component/Yaml/Tests/ParserTest.php +++ b/src/Symfony/Component/Yaml/Tests/ParserTest.php @@ -1728,6 +1728,34 @@ public function testBackslashInQuotedMultiLineString() $this->assertSame($expected, $this->parser->parse($yaml)); } + /** + * @dataProvider wrappedUnquotedStringsProvider + */ + public function testWrappedUnquotedStringWithMultipleSpacesInValue(string $yaml, array $expected) + { + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + public static function wrappedUnquotedStringsProvider() + { + return [ + 'mapping' => [ + '{ foo: bar bar, fiz: cat cat }', + [ + 'foo' => 'bar bar', + 'fiz' => 'cat cat', + ] + ], + 'sequence' => [ + '[ bar bar, cat cat ]', + [ + 'bar bar', + 'cat cat', + ] + ], + ]; + } + public function testParseMultiLineUnquotedString() { $yaml = <<assertSame(['foo' => 'bar baz foobar foo', 'bar' => 'baz'], $this->parser->parse($yaml)); } + /** + * @dataProvider unquotedStringWithTrailingComment + */ + public function testParseMultiLineUnquotedStringWithTrailingComment(string $yaml, array $expected) + { + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + public static function unquotedStringWithTrailingComment() + { + return [ + 'comment after comma' => [ + <<<'YAML' + { + foo: 3, # comment + bar: 3 + } + YAML, + ['foo' => 3, 'bar' => 3], + ], + 'comment after space' => [ + <<<'YAML' + { + foo: 3 # comment + } + YAML, + ['foo' => 3], + ], + 'comment after space, but missing space after #' => [ + <<<'YAML' + { + foo: 3 #comment + } + YAML, + ['foo' => 3], + ], + 'comment after tab' => [ + << 3], + ], + 'comment after tab, but missing space after #' => [ + << 3], + ], + '# in mapping value' => [ + <<<'YAML' + { + foo: example.com/#about + } + YAML, + ['foo' => 'example.com/#about'], + ], + ]; + } + /** * @dataProvider escapedQuotationCharactersInQuotedStrings */ @@ -2150,6 +2241,19 @@ public static function inlineNotationSpanningMultipleLinesProvider(): array << [ + [ + 'map' => [ + 'key' => 'value', + 'a' => 'b', + ], + 'param' => 'some', + ], + << [ @@ -2243,6 +2347,30 @@ public function testRootLevelInlineMappingFollowedByMoreContentIsInvalid() $this->parser->parse($yaml); } + public function testInlineMappingFollowedByMoreContentIsInvalid() + { + $this->expectException(ParseException::class); + $this->expectExceptionMessage('Unexpected token "baz" at line 1 (near "{ foo: bar } baz").'); + + $yaml = <<parser->parse($yaml); + } + + public function testInlineSequenceFollowedByMoreContentIsInvalid() + { + $this->expectException(ParseException::class); + $this->expectExceptionMessage('Unexpected token ",bar," at line 1 (near "[\'foo\'],bar,").'); + + $yaml = <<parser->parse($yaml); + } + public function testTaggedInlineMapping() { $this->assertSameData(new TaggedValue('foo', ['foo' => 'bar']), $this->parser->parse('!foo {foo: bar}', Yaml::PARSE_CUSTOM_TAGS)); diff --git a/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php b/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php index a75001785ae2d..399f8bdde17b6 100644 --- a/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php +++ b/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php @@ -42,6 +42,7 @@ exit; case '/head': + header('X-Request-Vars: '.json_encode($vars, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); header('Content-Length: '.strlen($json), true); break; @@ -198,6 +199,16 @@ ]); exit; + + case '/custom': + if (isset($_GET['status'])) { + http_response_code((int) $_GET['status']); + } + if (isset($_GET['headers']) && is_array($_GET['headers'])) { + foreach ($_GET['headers'] as $header) { + header($header); + } + } } header('Content-Type: application/json', true); diff --git a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php index 31164f8142314..9a528f6982920 100644 --- a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php +++ b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php @@ -37,7 +37,6 @@ public static function tearDownAfterClass(): void { TestHttpServer::stop(8067); TestHttpServer::stop(8077); - TestHttpServer::stop(8087); } abstract protected function getHttpClient(string $testCase): HttpClientInterface; diff --git a/src/Symfony/Contracts/Service/ServiceMethodsSubscriberTrait.php b/src/Symfony/Contracts/Service/ServiceMethodsSubscriberTrait.php index 2c4c274f725d9..844be8907744b 100644 --- a/src/Symfony/Contracts/Service/ServiceMethodsSubscriberTrait.php +++ b/src/Symfony/Contracts/Service/ServiceMethodsSubscriberTrait.php @@ -53,7 +53,7 @@ public static function getSubscribedServices(): array $attribute = $attribute->newInstance(); $attribute->key ??= self::class.'::'.$method->name; $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; - $attribute->nullable = $returnType->allowsNull(); + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; diff --git a/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php b/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php index f22a303b163d5..ed4cec044a831 100644 --- a/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php +++ b/src/Symfony/Contracts/Service/ServiceSubscriberTrait.php @@ -57,7 +57,7 @@ public static function getSubscribedServices(): array $attribute = $attribute->newInstance(); $attribute->key ??= self::class.'::'.$method->name; $attribute->type ??= $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; - $attribute->nullable = $returnType->allowsNull(); + $attribute->nullable = $attribute->nullable ?: $returnType->allowsNull(); if ($attribute->attributes) { $services[] = $attribute; diff --git a/src/Symfony/Contracts/Tests/Service/LegacyTestService.php b/src/Symfony/Contracts/Tests/Service/LegacyTestService.php index 760c8efec849f..471e186f41641 100644 --- a/src/Symfony/Contracts/Tests/Service/LegacyTestService.php +++ b/src/Symfony/Contracts/Tests/Service/LegacyTestService.php @@ -41,8 +41,18 @@ public function aService(): Service2 return $this->container->get(__METHOD__); } + #[SubscribedService(nullable: true)] + public function nullableInAttribute(): Service2 + { + if (!$this->container->has(__METHOD__)) { + throw new \LogicException(); + } + + return $this->container->get(__METHOD__); + } + #[SubscribedService] - public function nullableService(): ?Service2 + public function nullableReturnType(): ?Service2 { return $this->container->get(__METHOD__); } diff --git a/src/Symfony/Contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php b/src/Symfony/Contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php index 246cb6194bcec..4d67a84457c0e 100644 --- a/src/Symfony/Contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php +++ b/src/Symfony/Contracts/Tests/Service/ServiceMethodsSubscriberTraitTest.php @@ -25,7 +25,8 @@ public function testMethodsOnParentsAndChildrenAreIgnoredInGetSubscribedServices { $expected = [ TestService::class.'::aService' => Service2::class, - TestService::class.'::nullableService' => '?'.Service2::class, + TestService::class.'::nullableInAttribute' => '?'.Service2::class, + TestService::class.'::nullableReturnType' => '?'.Service2::class, new SubscribedService(TestService::class.'::withAttribute', Service2::class, true, new Required()), ]; @@ -104,8 +105,18 @@ public function aService(): Service2 return $this->container->get(__METHOD__); } + #[SubscribedService(nullable: true)] + public function nullableInAttribute(): Service2 + { + if (!$this->container->has(__METHOD__)) { + throw new \LogicException(); + } + + return $this->container->get(__METHOD__); + } + #[SubscribedService] - public function nullableService(): ?Service2 + public function nullableReturnType(): ?Service2 { return $this->container->get(__METHOD__); } diff --git a/src/Symfony/Contracts/Tests/Service/ServiceSubscriberTraitTest.php b/src/Symfony/Contracts/Tests/Service/ServiceSubscriberTraitTest.php index 739d693562d14..bf0db2c1e158a 100644 --- a/src/Symfony/Contracts/Tests/Service/ServiceSubscriberTraitTest.php +++ b/src/Symfony/Contracts/Tests/Service/ServiceSubscriberTraitTest.php @@ -33,7 +33,8 @@ public function testMethodsOnParentsAndChildrenAreIgnoredInGetSubscribedServices { $expected = [ LegacyTestService::class.'::aService' => Service2::class, - LegacyTestService::class.'::nullableService' => '?'.Service2::class, + LegacyTestService::class.'::nullableInAttribute' => '?'.Service2::class, + LegacyTestService::class.'::nullableReturnType' => '?'.Service2::class, new SubscribedService(LegacyTestService::class.'::withAttribute', Service2::class, true, new Required()), ]; @@ -54,7 +55,7 @@ public function testParentNotCalledIfHasMagicCall() $container = new class([]) implements ContainerInterface { use ServiceLocatorTrait; }; - $service = new class extends ParentWithMagicCall { + $service = new class extends LegacyParentWithMagicCall { use ServiceSubscriberTrait; private $container; 0